[libdmapsharing/gobject-introspection] Move some code to new DMAPMdnsService class



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]