[libdmapsharing/gobject-introspection] Move some code to new DMAPMdnsService class
- From: W. Michael Petullo <wmpetullo src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libdmapsharing/gobject-introspection] Move some code to new DMAPMdnsService class
- Date: Tue, 24 Jun 2014 04:31:07 +0000 (UTC)
commit fcdb5c803da6554fd3c560a8a7bc227f8f664341
Author: W. Michael Petullo <mike flyn org>
Date: Tue Jun 24 00:30:55 2014 -0400
Move some code to new DMAPMdnsService class
Signed-off-by: W. Michael Petullo <mike flyn org>
libdmapsharing/Makefile.am | 20 ++-
libdmapsharing/dacp-share.c | 26 ++-
libdmapsharing/dmap-mdns-browser-avahi.c | 64 +++-----
libdmapsharing/dmap-mdns-browser-dnssd.c | 14 +--
libdmapsharing/dmap-mdns-browser-howl.c | 13 +--
libdmapsharing/dmap-mdns-browser.h | 63 +-------
libdmapsharing/dmap-mdns-service.c | 254 ++++++++++++++++++++++++++++++
libdmapsharing/dmap-mdns-service.h | 131 +++++++++++++++
libdmapsharing/dmap.h | 1 +
tests/test-dmap-client-python | 20 ++-
tests/test-dmap-client.c | 25 ++--
11 files changed, 481 insertions(+), 150 deletions(-)
---
diff --git a/libdmapsharing/Makefile.am b/libdmapsharing/Makefile.am
index 2ab2f2a..f30a814 100644
--- a/libdmapsharing/Makefile.am
+++ b/libdmapsharing/Makefile.am
@@ -15,6 +15,7 @@ libdmapsharing_3_0_la_SOURCES = \
dmap-container-record.c \
dmap-db.c \
dmap-md5.c \
+ dmap-mdns-service.c \
dmap-private-utils.c \
dmap-record.c \
dmap-record-factory.c \
@@ -89,6 +90,7 @@ libdmapsharinginclude_HEADERS = \
dmap-md5.h \
dmap-mdns-browser.h \
dmap-mdns-publisher.h \
+ dmap-mdns-service.h \
dmap-record.h \
dmap-record-factory.h \
dmap-share.h \
@@ -138,23 +140,25 @@ CLEANFILES = $(BUILT_SOURCES)
if HAVE_INTROSPECTION
include $(INTROSPECTION_MAKEFILE)
+INTROSPECTION_SCANNER_ARGS = --add-include-path=$(srcdir) --warn-all
+INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir)
introspection_sources = $(libdmapsharinginclude_HEADERS) $(libdmapsharinginclude_SOURCES)
DMAP-3.0.gir: libdmapsharing-3.0.la
-DMAP_3_0_gir_INCLUDES = GObject-2.0 Soup-2.4
-DMAP_3_0_gir_CFLAGS = $(INCLUDES) $(libdmapsharing_3_0_la_CFLAGS)
+DMAP_3_0_gir_NAMESPACE = DMAP
+DMAP_3_0_gir_SCANNERFLAGS = --symbol-prefix=dmap
DMAP_3_0_gir_LIBS = libdmapsharing-3.0.la
DMAP_3_0_gir_FILES = $(introspection_sources)
-DMAP_3_0_gir_INTROSPECTION_SCANNER_ARGS = --symbol-prefix=dmap --add-include-path=$(srcdir) --warn-all
-DMAP_3_0_gir_INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir)
+DMAP_3_0_gir_INCLUDES = GObject-2.0 Soup-2.4
+DMAP_3_0_gir_CFLAGS = $(INCLUDES) $(libdmapsharing_3_0_la_CFLAGS)
DAAP-3.0.gir: libdmapsharing-3.0.la
-DAAP_3_0_gir_INCLUDES = GObject-2.0 Soup-2.4
-DAAP_3_0_gir_CFLAGS = $(INCLUDES) $(libdmapsharing_3_0_la_CFLAGS)
+DAAP_3_0_gir_NAMESPACE = DAAP
+DAAP_3_0_gir_SCANNERFLAGS = --symbol-prefix=daap
DAAP_3_0_gir_LIBS = libdmapsharing-3.0.la
DAAP_3_0_gir_FILES = $(introspection_sources)
-DAAP_3_0_gir_INTROSPECTION_SCANNER_ARGS = --symbol-prefix=dmap --add-include-path=$(srcdir) --warn-all
-DAAP_3_0_gir_INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir)
+DAAP_3_0_gir_INCLUDES = GObject-2.0 Soup-2.4
+DAAP_3_0_gir_CFLAGS = $(INCLUDES) $(libdmapsharing_3_0_la_CFLAGS)
INTROSPECTION_GIRS = DMAP-3.0.gir DAAP-3.0.gir
diff --git a/libdmapsharing/dacp-share.c b/libdmapsharing/dacp-share.c
index 906babb..c730815 100644
--- a/libdmapsharing/dacp-share.c
+++ b/libdmapsharing/dacp-share.c
@@ -384,27 +384,35 @@ dacp_share_dispose (GObject * object)
void
mdns_remote_added (DMAPMdnsBrowser * browser,
- DMAPMdnsBrowserService * service, DACPShare * share)
+ DMAPMdnsService * service, DACPShare * share)
{
+ guint port;
DACPRemoteInfo *remote_info;
+ gchar *service_name, *name, *host, *pair;
+
+ g_object_get (service, "service-name", &service_name,
+ "name", &name,
+ "host", &host,
+ "port", &port,
+ "pair", &pair, NULL);
remote_info = g_new (DACPRemoteInfo, 1);
- remote_info->host = g_strdup (service->host);
- remote_info->port = service->port;
+ remote_info->host = g_strdup (host);
+ remote_info->port = port;
remote_info->connection = NULL;
- remote_info->pair_txt = g_strdup (service->pair);
+ remote_info->pair_txt = g_strdup (pair);
g_debug ("New Remote found: %s name=%s host=%s port=%u pair=%s",
- service->service_name,
- service->name,
+ service_name,
+ name,
remote_info->host, remote_info->port, remote_info->pair_txt);
g_hash_table_insert (share->priv->remotes,
- service->service_name, remote_info);
+ service_name, remote_info);
g_signal_emit (share,
signals[REMOTE_FOUND],
- 0, service->service_name, service->name);
+ 0, service_name, name);
}
void
@@ -453,7 +461,7 @@ dacp_share_start_lookup (DACPShare * share)
}
share->priv->mdns_browser =
- dmap_mdns_browser_new (DMAP_MDNS_BROWSER_SERVICE_TYPE_DACP);
+ dmap_mdns_browser_new (DMAP_MDNS_SERVICE_TYPE_DACP);
g_signal_connect_object (share->priv->mdns_browser,
"service-added",
diff --git a/libdmapsharing/dmap-mdns-browser-avahi.c b/libdmapsharing/dmap-mdns-browser-avahi.c
index aed9aa8..f842928 100644
--- a/libdmapsharing/dmap-mdns-browser-avahi.c
+++ b/libdmapsharing/dmap-mdns-browser-avahi.c
@@ -44,7 +44,7 @@
struct _DMAPMdnsBrowserPrivate
{
- DMAPMdnsBrowserServiceType service_type;
+ DMAPMdnsServiceType service_type;
AvahiClient *client;
AvahiGLibPoll *poll;
AvahiServiceBrowser *service_browser;
@@ -100,7 +100,6 @@ static void browse_cb (AvahiServiceBrowser * service_browser,
AvahiLookupResultFlags flags,
#endif
DMAPMdnsBrowser * browser);
-static void free_service (DMAPMdnsBrowserService * service);
#define DMAP_MDNS_BROWSER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), DMAP_TYPE_MDNS_BROWSER,
DMAPMdnsBrowserPrivate))
@@ -139,7 +138,7 @@ dmap_mdns_browser_class_init (DMAPMdnsBrowserClass * klass)
G_STRUCT_OFFSET (DMAPMdnsBrowserClass,
service_added), NULL, NULL,
g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE,
- 1, G_TYPE_POINTER);
+ 1, DMAP_TYPE_MDNS_SERVICE);
dmap_mdns_browser_signals[SERVICE_REMOVED] =
g_signal_new ("service-removed",
G_TYPE_FROM_CLASS (object_class),
@@ -162,11 +161,11 @@ dmap_mdns_browser_dispose (GObject * object)
{
DMAPMdnsBrowser *browser = DMAP_MDNS_BROWSER (object);
GSList *walk;
- DMAPMdnsBrowserService *service;
+ DMAPMdnsService *service;
for (walk = browser->priv->services; walk; walk = walk->next) {
- service = (DMAPMdnsBrowserService *) walk->data;
- free_service (service);
+ service = (DMAPMdnsService *) walk->data;
+ g_object_unref (service);
}
g_slist_free (browser->priv->services);
@@ -199,12 +198,12 @@ dmap_mdns_browser_finalize (GObject * object)
}
DMAPMdnsBrowser *
-dmap_mdns_browser_new (DMAPMdnsBrowserServiceType type)
+dmap_mdns_browser_new (DMAPMdnsServiceType type)
{
DMAPMdnsBrowser *browser_object;
- g_return_val_if_fail (type >= DMAP_MDNS_BROWSER_SERVICE_TYPE_INVALID
- && type <= DMAP_MDNS_BROWSER_SERVICE_TYPE_LAST,
+ g_return_val_if_fail (type >= DMAP_MDNS_SERVICE_TYPE_INVALID
+ && type <= DMAP_MDNS_SERVICE_TYPE_LAST,
NULL);
browser_object =
@@ -285,11 +284,11 @@ dmap_mdns_browser_get_services (DMAPMdnsBrowser * browser)
return browser->priv->services;
}
-DMAPMdnsBrowserServiceType
+DMAPMdnsServiceType
dmap_mdns_browser_get_service_type (DMAPMdnsBrowser * browser)
{
g_return_val_if_fail (browser != NULL,
- DMAP_MDNS_BROWSER_SERVICE_TYPE_INVALID);
+ DMAP_MDNS_SERVICE_TYPE_INVALID);
return browser->priv->service_type;
}
@@ -360,10 +359,10 @@ resolve_cb (AvahiServiceResolver * service_resolver,
{
gchar *name = NULL;
gchar *pair = NULL; /* FIXME: extract DACP-specific items into sub-class. Ensure in Howl and
dns-sd code too. */
- DMAPMdnsBrowserTransportProtocol transport_protocol = DMAP_MDNS_BROWSER_TRANSPORT_PROTOCOL_TCP; //
FIXME: subclass
+ DMAPMdnsServiceTransportProtocol transport_protocol = DMAP_MDNS_SERVICE_TRANSPORT_PROTOCOL_TCP; //
FIXME: subclass
gchar host[AVAHI_ADDRESS_STR_MAX];
gboolean pp = FALSE;
- DMAPMdnsBrowserService *service;
+ DMAPMdnsService *service;
switch (event) {
case AVAHI_RESOLVER_FAILURE:
@@ -416,8 +415,8 @@ resolve_cb (AvahiServiceResolver * service_resolver,
} else if (strcmp (key, "tp") == 0) {
/* RAOP transport protocol */
transport_protocol = strstr (value, "UDP")
- ? DMAP_MDNS_BROWSER_TRANSPORT_PROTOCOL_UDP
- : DMAP_MDNS_BROWSER_TRANSPORT_PROTOCOL_TCP;
+ ? DMAP_MDNS_SERVICE_TRANSPORT_PROTOCOL_UDP
+ : DMAP_MDNS_SERVICE_TRANSPORT_PROTOCOL_TCP;
}
g_free (key);
@@ -425,20 +424,21 @@ resolve_cb (AvahiServiceResolver * service_resolver,
}
}
- if (name == NULL) {
- name = g_strdup (service_name);
- }
-
avahi_address_snprint (host, AVAHI_ADDRESS_STR_MAX, address);
- service = g_new (DMAPMdnsBrowserService, 1);
- service->service_name = g_strdup (service_name);
- service->name = name;
- service->host = g_strdup (host);
- service->port = port;
- service->pair = pair; // FIXME: subclass
- service->transport_protocol = transport_protocol; // FIXME: subclass
- service->password_protected = pp;
+ service = g_object_new (DMAP_TYPE_MDNS_SERVICE,
+ "service-name", service_name,
+ "name", name,
+ "host", host,
+ "port", port,
+ "pair", pair, // FIXME: subclass.
+ "transport-protocol", transport_protocol, // FIXME: subclass.
+ "password-protected", pp,
+ NULL);
+
+ g_free(name);
+ g_free(pair);
+
browser->priv->services =
g_slist_append (browser->priv->services, service);
g_signal_emit (browser,
@@ -532,13 +532,3 @@ browse_cb (AvahiServiceBrowser * service_browser,
browser_remove_service (browser, name);
}
}
-
-static void
-free_service (DMAPMdnsBrowserService * service)
-{
- g_free (service->service_name);
- g_free (service->name);
- g_free (service->host);
- g_free (service->pair);
- g_free (service);
-}
diff --git a/libdmapsharing/dmap-mdns-browser-dnssd.c b/libdmapsharing/dmap-mdns-browser-dnssd.c
index 839e646..e3f93c0 100644
--- a/libdmapsharing/dmap-mdns-browser-dnssd.c
+++ b/libdmapsharing/dmap-mdns-browser-dnssd.c
@@ -83,18 +83,6 @@ dmap_mdns_browser_init (DMAPMdnsBrowser * browser)
}
static void
-free_service (DMAPMdnsBrowserService * service)
-{
- g_debug ("free_service ()");
-
- g_free (service->service_name);
- g_free (service->name);
- g_free (service->host);
- g_free (service->pair);
- g_free (service);
-}
-
-static void
service_context_free (ServiceContext *ctx)
{
g_debug ("service_context_free ()");
@@ -331,7 +319,7 @@ dmap_mdns_browser_dispose (GObject * object)
for (walk = browser->priv->services; walk; walk = walk->next) {
service = (DMAPMdnsBrowserService *) walk->data;
- free_service (service);
+ g_object_unref (service);
}
g_slist_free (browser->priv->services);
diff --git a/libdmapsharing/dmap-mdns-browser-howl.c b/libdmapsharing/dmap-mdns-browser-howl.c
index d4cd03d..0145db2 100644
--- a/libdmapsharing/dmap-mdns-browser-howl.c
+++ b/libdmapsharing/dmap-mdns-browser-howl.c
@@ -77,8 +77,6 @@ static void dmap_mdns_browser_init (DMAPMdnsBrowser * browser);
static void dmap_mdns_browser_dispose (GObject * object);
static void dmap_mdns_browser_finalize (GObject * object);
-static void free_service (DMAPMdnsBrowserService * service);
-
#define DMAP_MDNS_BROWSER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), DMAP_TYPE_MDNS_BROWSER,
DMAPMdnsBrowserPrivate))
static guint signals[LAST_SIGNAL] = { 0, };
@@ -487,7 +485,7 @@ dmap_mdns_browser_dispose (GObject * object)
for (walk = browser->priv->services; walk; walk = walk->next) {
service = (DMAPMdnsBrowserService *) walk->data;
- free_service (service);
+ g_object_unref (service);
}
g_slist_free (browser->priv->services);
@@ -519,12 +517,3 @@ dmap_mdns_browser_finalize (GObject * object)
g_signal_handlers_destroy (object);
G_OBJECT_CLASS (dmap_mdns_browser_parent_class)->finalize (object);
}
-
-static void
-free_service (DMAPMdnsBrowserService * service)
-{
- g_free (service->service_name);
- g_free (service->name);
- g_free (service->host);
- g_free (service);
-}
diff --git a/libdmapsharing/dmap-mdns-browser.h b/libdmapsharing/dmap-mdns-browser.h
index fc1f645..3124ef2 100644
--- a/libdmapsharing/dmap-mdns-browser.h
+++ b/libdmapsharing/dmap-mdns-browser.h
@@ -25,6 +25,8 @@
#include <glib.h>
#include <glib-object.h>
+#include <libdmapsharing/dmap-mdns-service.h>
+
G_BEGIN_DECLS
/**
* DMAP_TYPE_MDNS_BROWSER:
@@ -75,46 +77,6 @@ G_BEGIN_DECLS
typedef struct _DMAPMdnsBrowser DMAPMdnsBrowser;
typedef struct _DMAPMdnsBrowserClass DMAPMdnsBrowserClass;
typedef struct _DMAPMdnsBrowserPrivate DMAPMdnsBrowserPrivate;
-typedef struct _DMAPMdnsBrowserService DMAPMdnsBrowserService;
-
-/**
- * DMAPMdnsBrowserServiceType:
- * @DMAP_MDNS_BROWSER_SERVICE_TYPE_INVALID: an invalid service type
- * @DMAP_MDNS_BROWSER_SERVICE_TYPE_DAAP: a DAAP service type
- * @DMAP_MDNS_BROWSER_SERVICE_TYPE_DPAP: a DPAP service type
- * @DMAP_MDNS_BROWSER_SERVICE_TYPE_DACP: a DACP service type
- * @DMAP_MDNS_BROWSER_SERVICE_TYPE_RAOP: a RAOP service type
- * @DMAP_MDNS_BROWSER_SERVICE_TYPE_LAST: an invalid service type
- *
- * Enum values used to specify the service type to browse.
- *
- */
-typedef enum
-{
- DMAP_MDNS_BROWSER_SERVICE_TYPE_INVALID = 0,
- DMAP_MDNS_BROWSER_SERVICE_TYPE_DAAP,
- DMAP_MDNS_BROWSER_SERVICE_TYPE_DPAP,
- DMAP_MDNS_BROWSER_SERVICE_TYPE_DACP,
- DMAP_MDNS_BROWSER_SERVICE_TYPE_RAOP,
- DMAP_MDNS_BROWSER_SERVICE_TYPE_LAST = DMAP_MDNS_BROWSER_SERVICE_TYPE_RAOP
-} DMAPMdnsBrowserServiceType;
-
-// FIXME: this is only for RAOP and corresponds to the "tp" txt record.
-// This should be in a sub-class.
-typedef enum
-{
- DMAP_MDNS_BROWSER_TRANSPORT_PROTOCOL_TCP = 0,
- DMAP_MDNS_BROWSER_TRANSPORT_PROTOCOL_UDP,
- DMAP_MDNS_BROWSER_TRANSPORT_PROTOCOL_LAST = DMAP_MDNS_BROWSER_TRANSPORT_PROTOCOL_UDP
-} DMAPMdnsBrowserTransportProtocol;
-
-static const char * const service_type_name[] = {
- NULL,
- "_daap._tcp",
- "_dpap._tcp",
- "_touch-remote._tcp",
- "_raop._tcp"
-};
typedef enum
{
@@ -122,25 +84,14 @@ typedef enum
DMAP_MDNS_BROWSER_ERROR_FAILED,
} DMAPMdnsBrowserError;
-struct _DMAPMdnsBrowserService
-{
- gchar *service_name;
- gchar *name;
- gchar *host;
- guint port;
- gboolean password_protected;
- gchar *pair; // FIXME: subclass
- DMAPMdnsBrowserTransportProtocol transport_protocol; // FIXME: subclass
-};
-
struct _DMAPMdnsBrowserClass
{
GObjectClass parent_class;
void (*service_added) (DMAPMdnsBrowser * browser,
- DMAPMdnsBrowserService * service);
+ DMAPMdnsService * service);
void (*service_removed) (DMAPMdnsBrowser * browser,
- DMAPMdnsBrowserService * service);
+ DMAPMdnsService * service);
};
struct _DMAPMdnsBrowser
@@ -164,7 +115,7 @@ GType dmap_mdns_browser_get_type (void);
*
* Returns: a pointer to a DMAPMdnsBrowser.
*/
-DMAPMdnsBrowser *dmap_mdns_browser_new (DMAPMdnsBrowserServiceType type);
+DMAPMdnsBrowser *dmap_mdns_browser_new (DMAPMdnsServiceType type);
/**
* dmap_mdns_browser_start:
@@ -190,13 +141,13 @@ gboolean dmap_mdns_browser_stop (DMAPMdnsBrowser * browser, GError ** error);
G_CONST_RETURN GSList *dmap_mdns_browser_get_services (DMAPMdnsBrowser *
browser);
-DMAPMdnsBrowserServiceType dmap_mdns_browser_get_service_type (DMAPMdnsBrowser
+DMAPMdnsServiceType dmap_mdns_browser_get_service_type (DMAPMdnsBrowser
* browser);
/**
* DMAPMdnsBrowser::service-added:
* @browser: the #DMAPMdnsBrowser which received the signal.
- * @service: #DMAPMdnsBrowserService
+ * @service: #DMAPMdnsService
*
* Emitted each time a service becomes available to @browser
*/
diff --git a/libdmapsharing/dmap-mdns-service.c b/libdmapsharing/dmap-mdns-service.c
new file mode 100644
index 0000000..5ee8205
--- /dev/null
+++ b/libdmapsharing/dmap-mdns-service.c
@@ -0,0 +1,254 @@
+/*
+ * Copyright (C) 2014 W. Michael Petullo <mike flyn org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA*
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <libdmapsharing/dmap.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <glib-object.h>
+
+struct _DMAPMdnsServicePrivate
+{
+ gchar *service_name;
+ gchar *name;
+ gchar *host;
+ guint port;
+ gboolean password_protected;
+ gchar *pair; // FIXME: subclass
+ DMAPMdnsServiceTransportProtocol transport_protocol; // FIXME: subclass
+};
+
+enum {
+ PROP_0,
+ PROP_SERVICE_NAME,
+ PROP_NAME,
+ PROP_HOST,
+ PROP_PORT,
+ PROP_PASSWORD_PROTECTED,
+ PROP_PAIR,
+ PROP_TRANSPORT_PROTOCOL
+};
+
+static void
+dmap_mdns_service_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ DMAPMdnsService *service = DMAP_MDNS_SERVICE (object);
+
+ switch (prop_id) {
+ case PROP_SERVICE_NAME:
+ g_free (service->priv->service_name);
+ service->priv->service_name = g_value_dup_string (value);
+ break;
+ case PROP_NAME:
+ g_free (service->priv->name);
+ service->priv->name = g_value_dup_string (value);
+ break;
+ case PROP_HOST:
+ g_free (service->priv->host);
+ service->priv->host = g_value_dup_string (value);
+ break;
+ case PROP_PORT:
+ service->priv->port = g_value_get_uint (value);
+ break;
+ case PROP_PASSWORD_PROTECTED:
+ service->priv->password_protected = g_value_get_boolean (value);
+ break;
+ case PROP_PAIR:
+ g_free (service->priv->pair);
+ service->priv->pair = g_value_dup_string (value);
+ break;
+ case PROP_TRANSPORT_PROTOCOL:
+ service->priv->transport_protocol = g_value_get_uint (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
+ prop_id,
+ pspec);
+ break;
+ }
+}
+
+static void
+dmap_mdns_service_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ DMAPMdnsService *service = DMAP_MDNS_SERVICE (object);
+
+ switch (prop_id) {
+ case PROP_SERVICE_NAME:
+ g_value_set_static_string (value, service->priv->service_name);
+ break;
+ case PROP_NAME:
+ g_value_set_static_string (value, service->priv->name);
+ break;
+ case PROP_HOST:
+ g_value_set_static_string (value, service->priv->host);
+ break;
+ case PROP_PORT:
+ g_value_set_uint (value, service->priv->port);
+ break;
+ case PROP_PASSWORD_PROTECTED:
+ g_value_set_boolean (value, service->priv->password_protected);
+ break;
+ case PROP_PAIR:
+ g_value_set_static_string (value, service->priv->pair);
+ break;
+ case PROP_TRANSPORT_PROTOCOL:
+ g_value_set_uint (value, service->priv->transport_protocol);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
+ prop_id,
+ pspec);
+ break;
+ }
+}
+
+static void dmap_mdns_service_class_init (DMAPMdnsServiceClass * klass);
+static void dmap_mdns_service_init (DMAPMdnsService * service);
+static void dmap_mdns_service_dispose (GObject * object);
+static void dmap_mdns_service_finalize (GObject * object);
+
+#define DMAP_MDNS_SERVICE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), DMAP_TYPE_MDNS_SERVICE,
DMAPMdnsServicePrivate))
+
+G_DEFINE_TYPE (DMAPMdnsService, dmap_mdns_service, G_TYPE_OBJECT);
+
+static void
+dmap_mdns_service_class_init (DMAPMdnsServiceClass * klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ g_type_class_add_private (klass, sizeof (DMAPMdnsServicePrivate));
+
+ object_class->dispose = dmap_mdns_service_dispose;
+ object_class->finalize = dmap_mdns_service_finalize;
+ object_class->set_property = dmap_mdns_service_set_property;
+ object_class->get_property = dmap_mdns_service_get_property;
+
+ dmap_mdns_service_parent_class = g_type_class_peek_parent (klass);
+
+ g_object_class_install_property (object_class,
+ PROP_SERVICE_NAME,
+ g_param_spec_string ("service-name",
+ "Service Name",
+ "Service Name",
+ NULL,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (object_class,
+ PROP_NAME,
+ g_param_spec_string ("name",
+ "Name",
+ "Name",
+ NULL,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (object_class,
+ PROP_HOST,
+ g_param_spec_string ("host",
+ "Host",
+ "Host",
+ NULL,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (object_class,
+ PROP_PORT,
+ g_param_spec_uint ("port",
+ "Port",
+ "Port",
+ 0,
+ G_MAXINT,
+ 0,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (object_class,
+ PROP_PASSWORD_PROTECTED,
+ g_param_spec_boolean ("password-protected",
+ "Password Protected",
+ "Password Protected",
+ FALSE,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (object_class,
+ PROP_PAIR,
+ g_param_spec_string ("pair",
+ "Pair",
+ "Pair",
+ NULL,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (object_class,
+ PROP_TRANSPORT_PROTOCOL,
+ g_param_spec_uint ("transport-protocol",
+ "Transport Protocol",
+ "Transport Protocol",
+ DMAP_MDNS_SERVICE_TRANSPORT_PROTOCOL_TCP,
+ DMAP_MDNS_SERVICE_TRANSPORT_PROTOCOL_LAST,
+ DMAP_MDNS_SERVICE_TRANSPORT_PROTOCOL_TCP,
+ G_PARAM_READWRITE));
+}
+
+static void
+dmap_mdns_service_init (DMAPMdnsService * service)
+{
+ service->priv = DMAP_MDNS_SERVICE_GET_PRIVATE (service);
+}
+
+static void
+dmap_mdns_service_dispose (GObject * object)
+{
+ DMAPMdnsService *service = DMAP_MDNS_SERVICE (object);
+
+ if (service->priv->service_name) {
+ g_free (service->priv->service_name);
+ }
+
+ if (service->priv->name) {
+ g_free (service->priv->name);
+ }
+
+ if (service->priv->host) {
+ g_free (service->priv->host);
+ }
+
+ if (service->priv->pair) {
+ g_free (service->priv->pair);
+ }
+
+ G_OBJECT_CLASS (dmap_mdns_service_parent_class)->dispose (object);
+}
+
+static void
+dmap_mdns_service_finalize (GObject * object)
+{
+ g_signal_handlers_destroy (object);
+ G_OBJECT_CLASS (dmap_mdns_service_parent_class)->finalize (object);
+}
diff --git a/libdmapsharing/dmap-mdns-service.h b/libdmapsharing/dmap-mdns-service.h
new file mode 100644
index 0000000..89a08cb
--- /dev/null
+++ b/libdmapsharing/dmap-mdns-service.h
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2014 W. Michael Petullo <mike flyn org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA*
+ */
+
+#ifndef __DMAP_MDNS_SERVICE_H__
+#define __DMAP_MDNS_SERVICE_H__
+
+#include <glib.h>
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+/**
+ * DMAP_TYPE_MDNS_SERVICE:
+ *
+ * The type for #DMAPMdnsService.
+ */
+#define DMAP_TYPE_MDNS_SERVICE (dmap_mdns_service_get_type ())
+/**
+ * DMAP_MDNS_SERVICE:
+ * @o: Object which is subject to casting.
+ *
+ * Casts a #DMAPMdnsService or derived pointer into a (DMAPMdnsService *) pointer.
+ * Depending on the current debugging level, this function may invoke
+ * certain runtime checks to identify invalid casts.
+ */
+#define DMAP_MDNS_SERVICE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), DMAP_TYPE_MDNS_SERVICE,
DMAPMdnsService))
+/**
+ * DMAP_MDNS_SERVICE_CLASS:
+ * @k: a valid #DMAPMdnsServiceClass
+ *
+ * Casts a derived #DMAPMdnsServiceClass structure into a #DMAPMdnsServiceClass structure.
+ */
+#define DMAP_MDNS_SERVICE_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), DMAP_TYPE_MDNS_SERVICE,
DMAPMdnsServiceClass))
+/**
+ * IS_DMAP_MDNS_SERVICE:
+ * @o: Instance to check for being a %DMAP_TYPE_MDNS_SERVICE.
+ *
+ * Checks whether a valid #GTypeInstance pointer is of type %DAAP_TYPE_MDNS_SERVICE.
+ */
+#define IS_DMAP_MDNS_SERVICE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), DMAP_TYPE_MDNS_SERVICE))
+/**
+ * IS_DMAP_MDNS_SERVICE_CLASS:
+ * @k: a #DMAPMdnsServiceClass
+ *
+ * Checks whether @k "is a" valid #DMAPMdnsServiceClass structure of type
+ * %DMAP_MDNS_SERVICE or derived.
+ */
+#define IS_DMAP_MDNS_SERVICE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), DMAP_TYPE_MDNS_SERVICE))
+/**
+ * DMAP_MDNS_SERVICE_GET_CLASS:
+ * @o: a #DMAPMdnsService instance.
+ *
+ * Get the class structure associated to a #DMAPMdnsService instance.
+ *
+ * Returns: pointer to object class structure.
+ */
+#define DMAP_MDNS_SERVICE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), DMAP_TYPE_MDNS_SERVICE,
DMAPMdnsServiceClass))
+typedef struct _DMAPMdnsService DMAPMdnsService;
+typedef struct _DMAPMdnsServiceClass DMAPMdnsServiceClass;
+typedef struct _DMAPMdnsServicePrivate DMAPMdnsServicePrivate;
+typedef struct _DMAPMdnsServiceService DMAPMdnsServiceService;
+
+/**
+ * DMAPMdnsServiceType:
+ * @DMAP_MDNS_SERVICE_TYPE_INVALID: an invalid service type
+ * @DMAP_MDNS_SERVICE_TYPE_DAAP: a DAAP service type
+ * @DMAP_MDNS_SERVICE_TYPE_DPAP: a DPAP service type
+ * @DMAP_MDNS_SERVICE_TYPE_DACP: a DACP service type
+ * @DMAP_MDNS_SERVICE_TYPE_RAOP: a RAOP service type
+ * @DMAP_MDNS_SERVICE_TYPE_LAST: an invalid service type
+ *
+ * Enum values used to specify the service type.
+ *
+ */
+typedef enum
+{
+ DMAP_MDNS_SERVICE_TYPE_INVALID = 0,
+ DMAP_MDNS_SERVICE_TYPE_DAAP,
+ DMAP_MDNS_SERVICE_TYPE_DPAP,
+ DMAP_MDNS_SERVICE_TYPE_DACP,
+ DMAP_MDNS_SERVICE_TYPE_RAOP,
+ DMAP_MDNS_SERVICE_TYPE_LAST = DMAP_MDNS_SERVICE_TYPE_RAOP
+} DMAPMdnsServiceType;
+
+// FIXME: this is only for RAOP and corresponds to the "tp" txt record.
+// This should be in a sub-class.
+typedef enum
+{
+ DMAP_MDNS_SERVICE_TRANSPORT_PROTOCOL_TCP = 0,
+ DMAP_MDNS_SERVICE_TRANSPORT_PROTOCOL_UDP,
+ DMAP_MDNS_SERVICE_TRANSPORT_PROTOCOL_LAST = DMAP_MDNS_SERVICE_TRANSPORT_PROTOCOL_UDP
+} DMAPMdnsServiceTransportProtocol;
+
+static const char * const service_type_name[] = {
+ NULL,
+ "_daap._tcp",
+ "_dpap._tcp",
+ "_touch-remote._tcp",
+ "_raop._tcp"
+};
+
+struct _DMAPMdnsServiceClass
+{
+ GObjectClass parent_class;
+};
+
+struct _DMAPMdnsService
+{
+ GObject object;
+
+ DMAPMdnsServicePrivate *priv;
+};
+
+GType dmap_mdns_service_get_type (void);
+
+G_END_DECLS
+#endif
diff --git a/libdmapsharing/dmap.h b/libdmapsharing/dmap.h
index 905e7a8..1a8e40e 100644
--- a/libdmapsharing/dmap.h
+++ b/libdmapsharing/dmap.h
@@ -13,6 +13,7 @@
#include <libdmapsharing/dmap-md5.h>
#include <libdmapsharing/dmap-mdns-browser.h>
#include <libdmapsharing/dmap-mdns-publisher.h>
+#include <libdmapsharing/dmap-mdns-service.h>
#include <libdmapsharing/dmap-record.h>
#include <libdmapsharing/dmap-record-factory.h>
#include <libdmapsharing/dmap-share.h>
diff --git a/tests/test-dmap-client-python b/tests/test-dmap-client-python
index 0df4f7b..1e750d6 100755
--- a/tests/test-dmap-client-python
+++ b/tests/test-dmap-client-python
@@ -7,14 +7,24 @@ from gi.repository import DAAP
def connected_cb (self, result, reason, db):
print reason
-def service_added_cb (self, service):
- print service.name
+def service_added_cb (self, service, user_data):
+ service_name = service.get_property ("service-name")
+ name = service.get_property ("name")
+ host = service.get_property ("host")
+ port = service.get_property ("port")
+ print service_name
+ print name
+ print host
+ print port
+
+ # implement a DMAP database
+ # implement a DAAP record factory
# daap_connection_new
# dmap_connection_connect
-browser = DMAP.MdnsBrowser.new(DMAP.MdnsBrowserServiceType.DAAP)
-browser.connect("service-added", service_added_cb)
+browser = DMAP.MdnsBrowser.new(DMAP.MdnsServiceType.DAAP)
+browser.connect("service-added", service_added_cb, None)
browser.start()
-GLib.MainLoop().run()
+GLib.MainLoop().run ()
diff --git a/tests/test-dmap-client.c b/tests/test-dmap-client.c
index e127bd6..57bc10e 100644
--- a/tests/test-dmap-client.c
+++ b/tests/test-dmap-client.c
@@ -86,18 +86,23 @@ authenticate_cb (DMAPConnection *connection,
static void
service_added_cb (DMAPMdnsBrowser *browser,
- DMAPMdnsBrowserService *service,
+ DMAPMdnsService *service,
gpointer user_data)
{
+ gchar *service_name, *name, *host;
+ guint port;
DMAPRecordFactory *factory;
DMAPConnection *conn;
DMAPDb *db;
- g_debug ("service added %s:%s:%s:%d",
- service->service_name,
- service->name,
- service->host,
- service->port);
+ g_object_get (service,
+ "service-name", &service_name,
+ "name", &name,
+ "host", &host,
+ "port", &port,
+ NULL);
+
+ g_debug ("service added %s:%s:%s:%d", service_name, name, host, port);
db = DMAP_DB (test_dmap_db_new ());
if (db == NULL) {
@@ -109,13 +114,13 @@ service_added_cb (DMAPMdnsBrowser *browser,
if (factory == NULL) {
g_error ("Error creating record factory");
}
- conn = DMAP_CONNECTION (daap_connection_new (service->name, service->host, service->port, db,
factory));
+ conn = DMAP_CONNECTION (daap_connection_new (name, host, port, db, factory));
} else {
factory = DMAP_RECORD_FACTORY (test_dpap_record_factory_new ());
if (factory == NULL) {
g_error ("Error creating record factory");
}
- conn = DMAP_CONNECTION (dpap_connection_new (service->name, service->host, service->port, db,
factory));
+ conn = DMAP_CONNECTION (dpap_connection_new (name, host, port, db, factory));
}
g_signal_connect (DMAP_CONNECTION (conn), "authenticate", G_CALLBACK(authenticate_cb), NULL);
dmap_connection_connect (DMAP_CONNECTION (conn), (DMAPConnectionCallback) connected_cb, db);
@@ -132,9 +137,9 @@ int main(int argc, char **argv)
loop = g_main_loop_new (NULL, FALSE);
if (conn_type == DAAP)
- browser = dmap_mdns_browser_new (DMAP_MDNS_BROWSER_SERVICE_TYPE_DAAP);
+ browser = dmap_mdns_browser_new (DMAP_MDNS_SERVICE_TYPE_DAAP);
else
- browser = dmap_mdns_browser_new (DMAP_MDNS_BROWSER_SERVICE_TYPE_DPAP);
+ browser = dmap_mdns_browser_new (DMAP_MDNS_SERVICE_TYPE_DPAP);
g_signal_connect (G_OBJECT (browser),
"service-added",
G_CALLBACK (service_added_cb),
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]