[libdmapsharing/gobject-introspection] Work in progress: can now browse DAAP shares with GObject introspection and Python



commit 6af36d3152fad012df00fb6015133ed46bec5eff
Author: W. Michael Petullo <mike flyn org>
Date:   Wed Jun 25 17:25:58 2014 -0400

    Work in progress: can now browse DAAP shares with GObject introspection and Python
    
    Signed-off-by: W. Michael Petullo <mike flyn org>

 libdmapsharing/Makefile.am       |    6 +++-
 libdmapsharing/daap-connection.h |   12 ++++++++
 libdmapsharing/daap-share.c      |   13 +++-----
 libdmapsharing/dmap-connection.c |   51 +++++++++++++++++++-----------------
 libdmapsharing/dmap-connection.h |   19 ++++++++++---
 libdmapsharing/dmap-db.c         |    6 ++--
 libdmapsharing/dmap-db.h         |   18 +++++++++---
 libdmapsharing/dmap-share.c      |   16 ++++-------
 libdmapsharing/dmap-share.h      |    3 +-
 libdmapsharing/dpap-share.c      |   10 +++----
 tests/dmapcopy.vala              |   12 +++-----
 tests/dpapview.vala              |   12 +++-----
 tests/test-dmap-client-python    |   54 ++++++++++++++++++++++++++-----------
 tests/test-dmap-client.c         |    2 +-
 14 files changed, 139 insertions(+), 95 deletions(-)
---
diff --git a/libdmapsharing/Makefile.am b/libdmapsharing/Makefile.am
index f30a814..296c6cb 100644
--- a/libdmapsharing/Makefile.am
+++ b/libdmapsharing/Makefile.am
@@ -6,6 +6,8 @@ libdmapsharing_3_0_la_SOURCES = \
        $(BUILT_SOURCES) \
        daap-connection.c \
        daap-record.c \
+       daap-record-simple.c \
+       daap-record-factory-simple.c \
        daap-share.c \
        dacp-connection.c \
        dacp-share.c \
@@ -76,6 +78,8 @@ libdmapsharingincludedir = \
 libdmapsharinginclude_HEADERS = \
        daap-connection.h \
        daap-record.h \
+       daap-record-simple.h \
+       daap-record-factory-simple.h \
        daap-share.h \
        dacp-connection.h \
        dacp-share.h \
@@ -157,7 +161,7 @@ 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_INCLUDES = GObject-2.0 Soup-2.4
+DAAP_3_0_gir_INCLUDES = GObject-2.0 Soup-2.4 DMAP-3.0
 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/daap-connection.h b/libdmapsharing/daap-connection.h
index ea7d743..b0620b9 100644
--- a/libdmapsharing/daap-connection.h
+++ b/libdmapsharing/daap-connection.h
@@ -85,6 +85,18 @@ typedef struct
 
 GType daap_connection_get_type (void);
 
+/**
+ * daap_connection_new:
+ * @name: The name of the share to connect to.
+ * @host: The host of the share to connect to.
+ * @port: The port of the share to connect to.
+ * @db: (transfer full): The db that will receive the records found in the share.
+ * @factory: (transfer full): A factory to create records.
+ *
+ * Create a new DAAP connection.
+ *
+ * Returns: a pointer to a DAAPConnection.
+ */
 DAAPConnection *daap_connection_new (const char *name,
                                     const char *host,
                                     guint port,
diff --git a/libdmapsharing/daap-share.c b/libdmapsharing/daap-share.c
index d9fa1a6..ce5fdc2 100644
--- a/libdmapsharing/daap-share.c
+++ b/libdmapsharing/daap-share.c
@@ -73,7 +73,7 @@ static void databases_items_xxx (DMAPShare * share,
                                 GHashTable * query,
                                 SoupClientContext * context);
 static struct DMAPMetaDataMap *get_meta_data_map (DMAPShare * share);
-static void add_entry_to_mlcl (gpointer id, DMAPRecord * record, gpointer mb);
+static void add_entry_to_mlcl (guint id, DMAPRecord * record, gpointer mb);
 
 #define DAAP_TYPE_OF_SERVICE "_daap._tcp"
 #define DAAP_PORT 3689
@@ -550,7 +550,7 @@ _error:
 }
 
 static void
-add_entry_to_mlcl (gpointer id, DMAPRecord * record, gpointer _mb)
+add_entry_to_mlcl (guint id, DMAPRecord * record, gpointer _mb)
 {
        GNode *mlit;
        gboolean has_video = 0;
@@ -563,8 +563,7 @@ add_entry_to_mlcl (gpointer id, DMAPRecord * record, gpointer _mb)
                dmap_structure_add (mlit, DMAP_CC_MIKD,
                                    (gchar) DAAP_ITEM_KIND_AUDIO);
        if (_dmap_share_client_requested (mb->bits, ITEM_ID))
-               dmap_structure_add (mlit, DMAP_CC_MIID,
-                                   GPOINTER_TO_UINT (id));
+               dmap_structure_add (mlit, DMAP_CC_MIID, id);
        if (_dmap_share_client_requested (mb->bits, ITEM_NAME)) {
                gchar *title = NULL;
 
@@ -576,11 +575,9 @@ add_entry_to_mlcl (gpointer id, DMAPRecord * record, gpointer _mb)
                        g_debug ("Title requested but not available");
        }
        if (_dmap_share_client_requested (mb->bits, PERSISTENT_ID))
-               dmap_structure_add (mlit, DMAP_CC_MPER,
-                                   GPOINTER_TO_UINT (id));
+               dmap_structure_add (mlit, DMAP_CC_MPER, id);
        if (_dmap_share_client_requested (mb->bits, CONTAINER_ITEM_ID))
-               dmap_structure_add (mlit, DMAP_CC_MCTI,
-                                   GPOINTER_TO_UINT (id));
+               dmap_structure_add (mlit, DMAP_CC_MCTI, id);
        if (_dmap_share_client_requested (mb->bits, SONG_DATA_KIND))
                dmap_structure_add (mlit, DMAP_CC_ASDK,
                                    (gchar) DAAP_SONG_DATA_KIND_NONE);
diff --git a/libdmapsharing/dmap-connection.c b/libdmapsharing/dmap-connection.c
index fbc635c..8cac2d9 100644
--- a/libdmapsharing/dmap-connection.c
+++ b/libdmapsharing/dmap-connection.c
@@ -30,6 +30,7 @@
 
 #include <libsoup/soup.h>
 
+#include "daap-record-factory-simple.h"
 #include "dmap-md5.h"
 #include "dmap-connection.h"
 #include "dmap-record-factory.h"
@@ -162,21 +163,23 @@ dmap_connection_class_init (DMAPConnectionClass * klass)
 
        g_object_class_install_property (object_class,
                                         PROP_DB,
-                                        g_param_spec_pointer ("db",
-                                                              "DMAPDb",
-                                                              "DMAPDb object",
-                                                              G_PARAM_READWRITE
-                                                              |
-                                                              G_PARAM_CONSTRUCT_ONLY));
+                                        g_param_spec_object ("db",
+                                                             "DMAPDb",
+                                                             "DMAPDb object",
+                                                             DMAP_TYPE_DB,
+                                                             G_PARAM_READWRITE
+                                                             |
+                                                             G_PARAM_CONSTRUCT_ONLY));
 
        g_object_class_install_property (object_class,
                                         PROP_FACTORY,
-                                        g_param_spec_pointer ("factory",
-                                                              "record factory",
-                                                              "record factory",
-                                                              G_PARAM_READWRITE
-                                                              |
-                                                              G_PARAM_CONSTRUCT_ONLY));
+                                        g_param_spec_object ("factory",
+                                                             "record factory",
+                                                             "record factory",
+                                                             DAAP_TYPE_RECORD_FACTORY_SIMPLE,
+                                                             G_PARAM_READWRITE
+                                                             |
+                                                             G_PARAM_CONSTRUCT_ONLY));
 
        g_object_class_install_property (object_class, PROP_NAME,
                                         g_param_spec_string ("name",
@@ -1135,7 +1138,7 @@ typedef struct
 {
        DMAPConnection *connection;
        DMAPConnectionCallback callback;
-       gpointer data;
+       DMAPDb *db;
        GDestroyNotify destroy;
 } ConnectionResponseData;
 
@@ -1168,7 +1171,7 @@ connected_cb (DMAPConnection * connection, ConnectionResponseData * rdata)
                rdata->callback (rdata->connection,
                                 result,
                                 rdata->connection->priv->last_error_message,
-                                rdata->data);
+                                rdata->db);
        }
 
        if (rdata->destroy) {
@@ -1231,8 +1234,8 @@ dmap_connection_setup (DMAPConnection * connection)
 // FIXME: it would be nice if this mirrored the use of DMAPMdnsBrowser. That is, connect callback handler to 
a signal.
 // This would allow Vala to associated a lambda function with the signal.
 void
-dmap_connection_connect (DMAPConnection * connection,
-                        DMAPConnectionCallback callback, gpointer user_data)
+dmap_connection_start (DMAPConnection * connection,
+                       DMAPConnectionCallback callback, DMAPDb *db)
 {
        ConnectionResponseData *rdata;
 
@@ -1258,7 +1261,7 @@ dmap_connection_connect (DMAPConnection * connection,
        rdata = g_new (ConnectionResponseData, 1);
        rdata->connection = g_object_ref (connection);
        rdata->callback = callback;
-       rdata->data = user_data;
+       rdata->db = db;
        rdata->destroy = connection_response_data_free;
        g_signal_connect (connection, "operation-done",
                          G_CALLBACK (connected_cb), rdata);
@@ -1291,7 +1294,7 @@ disconnected_cb (DMAPConnection * connection, ConnectionResponseData * rdata)
                rdata->callback (rdata->connection,
                                 result,
                                 rdata->connection->priv->last_error_message,
-                                rdata->data);
+                                rdata->db);
        }
 
        if (rdata->destroy) {
@@ -1314,7 +1317,7 @@ dmap_connection_finish (DMAPConnection * connection)
 void
 dmap_connection_disconnect (DMAPConnection * connection,
                            DMAPConnectionCallback callback,
-                           gpointer user_data)
+                           DMAPDb *db)
 {
        DMAPConnectionPrivate *priv = connection->priv;
        ConnectionResponseData *rdata;
@@ -1336,7 +1339,7 @@ dmap_connection_disconnect (DMAPConnection * connection,
        rdata = g_new (ConnectionResponseData, 1);
        rdata->connection = g_object_ref (connection);
        rdata->callback = callback;
-       rdata->data = user_data;
+       rdata->db = db;
        rdata->destroy = connection_response_data_free;
 
        g_signal_connect (connection, "operation-done",
@@ -1720,11 +1723,11 @@ dmap_connection_set_property (GObject * object,
                priv->name = g_value_dup_string (value);
                break;
        case PROP_DB:
-               priv->db = DMAP_DB (g_value_get_pointer (value));
+               priv->db = DMAP_DB (g_value_get_object (value));
                break;
        case PROP_FACTORY:
                priv->record_factory =
-                       DMAP_RECORD_FACTORY (g_value_get_pointer (value));
+                       DMAP_RECORD_FACTORY (g_value_get_object (value));
                break;
        case PROP_HOST:
                g_free (priv->host);
@@ -1769,10 +1772,10 @@ dmap_connection_get_property (GObject * object,
 
        switch (prop_id) {
        case PROP_DB:
-               g_value_set_pointer (value, priv->db);
+               g_value_set_object (value, priv->db);
                break;
        case PROP_FACTORY:
-               g_value_set_pointer (value, priv->record_factory);
+               g_value_set_object (value, priv->record_factory);
                break;
        case PROP_NAME:
                g_value_set_string (value, priv->name);
diff --git a/libdmapsharing/dmap-connection.h b/libdmapsharing/dmap-connection.h
index ccf6f00..de33a8a 100644
--- a/libdmapsharing/dmap-connection.h
+++ b/libdmapsharing/dmap-connection.h
@@ -138,7 +138,7 @@ typedef struct
 typedef gboolean (*DMAPConnectionCallback) (DMAPConnection * connection,
                                            gboolean result,
                                            const char *reason,
-                                           gpointer user_data);
+                                           DMAPDb *db);
 
 typedef void (*DMAPResponseHandler) (DMAPConnection * connection,
                                     guint status,
@@ -148,12 +148,21 @@ GType dmap_connection_get_type (void);
 
 gboolean dmap_connection_is_connected (DMAPConnection * connection);
 void dmap_connection_setup (DMAPConnection * connection);
-void dmap_connection_connect (DMAPConnection * connection,
-                             DMAPConnectionCallback callback,
-                             gpointer user_data);
+
+/**
+ * dmap_connection_start:
+ * @connection: The connection.
+ * @callback: (scope async): The function to call once the connection is complete.
+ * @db: The data to pass to the callback.
+ *
+ * Connect to the remote DMAP share.
+ */
+void dmap_connection_start (DMAPConnection * connection,
+                           DMAPConnectionCallback callback,
+                           DMAPDb *db);
 void dmap_connection_disconnect (DMAPConnection * connection,
                                 DMAPConnectionCallback callback,
-                                gpointer user_data);
+                                DMAPDb *db);
 
 SoupMessageHeaders *dmap_connection_get_headers (DMAPConnection * connection,
                                                 const char *uri);
diff --git a/libdmapsharing/dmap-db.c b/libdmapsharing/dmap-db.c
index e7dda13..48448ab 100644
--- a/libdmapsharing/dmap-db.c
+++ b/libdmapsharing/dmap-db.c
@@ -78,7 +78,7 @@ dmap_db_lookup_id_by_location (const DMAPDb * db, const gchar * location)
 }
 
 void
-dmap_db_foreach (const DMAPDb * db, GHFunc func, gpointer data)
+dmap_db_foreach (const DMAPDb * db, DMAPIdRecordFunc func, gpointer data)
 {
        DMAP_DB_GET_INTERFACE (db)->foreach (db, func, data);
 }
@@ -245,7 +245,7 @@ compare_record_property (DMAPRecord * record, const gchar * property_name,
 }
 
 static void
-apply_filter (gpointer id, DMAPRecord * record, gpointer data)
+apply_filter (guint id, DMAPRecord * record, gpointer data)
 {
        FilterData *fd;
        gboolean accept = FALSE;
@@ -326,7 +326,7 @@ dmap_db_apply_filter (DMAPDb * db, GSList * filter_def)
        data.filter_def = filter_def;
        data.ht = ht;
 
-       dmap_db_foreach (db, (GHFunc) apply_filter, &data);
+       dmap_db_foreach (db, (DMAPIdRecordFunc) apply_filter, &data);
 
        return data.ht;
 }
diff --git a/libdmapsharing/dmap-db.h b/libdmapsharing/dmap-db.h
index 4fd54f1..8049e8d 100644
--- a/libdmapsharing/dmap-db.h
+++ b/libdmapsharing/dmap-db.h
@@ -63,6 +63,16 @@ G_BEGIN_DECLS
 typedef struct _DMAPDb DMAPDb;
 typedef struct _DMAPDbIface DMAPDbIface;
 
+/**
+ * DMAPIdRecordFunc:
+ * @id: a DMAP record ID
+ * @record: a #DMAPRecord
+ * @user_data: (closure): user data
+ *
+ * The type of function passed to dmap_db_foreach().
+ */
+typedef void (*DMAPIdRecordFunc) (guint id, DMAPRecord *record, gpointer user_data);
+
 struct _DMAPDbIface
 {
        GTypeInterface parent;
@@ -73,12 +83,10 @@ struct _DMAPDbIface
        DMAPRecord *(*lookup_by_id) (const DMAPDb * db, guint id);
          guint (*lookup_id_by_location) (const DMAPDb * db,
                                          const gchar * location);
-       void (*foreach) (const DMAPDb * db, GHFunc func, gpointer data);
+       void (*foreach) (const DMAPDb * db, DMAPIdRecordFunc func, gpointer data);
          gint64 (*count) (const DMAPDb * db);
 };
 
-typedef const char *(*RecordGetValueFunc) (DMAPRecord * record);
-
 typedef struct DMAPDbFilterDefinition
 {
        gchar *key;
@@ -165,12 +173,12 @@ guint dmap_db_lookup_id_by_location (const DMAPDb * db,
 /**
  * dmap_db_foreach:
  * @db: A media database.
- * @func: The function to apply to each record in the database.
+ * @func: (scope call): The function to apply to each record in the database.
  * @data: User data to pass to the function.
  *
  * Apply a function to each record in a media database.
  */
-void dmap_db_foreach (const DMAPDb * db, GHFunc func, gpointer data);
+void dmap_db_foreach (const DMAPDb * db, DMAPIdRecordFunc func, gpointer data);
 
 /**
  * dmap_db_count:
diff --git a/libdmapsharing/dmap-share.c b/libdmapsharing/dmap-share.c
index a86cd04..7b1be6a 100644
--- a/libdmapsharing/dmap-share.c
+++ b/libdmapsharing/dmap-share.c
@@ -1554,11 +1554,11 @@ _dmap_share_ctrl_int (DMAPShare * share,
 }
 
 static void
-accumulate_mlcl_size_and_ids (gpointer id,
+accumulate_mlcl_size_and_ids (guint id,
                              DMAPRecord * record,
                              struct share_bitwise_t *share_bitwise)
 {
-       share_bitwise->id_list = g_slist_append (share_bitwise->id_list, id);
+       share_bitwise->id_list = g_slist_append (share_bitwise->id_list, GUINT_TO_POINTER (id));
 
        /* Make copy and set mlcl to NULL so real MLCL does not get changed */
        struct MLCL_Bits mb_copy = share_bitwise->mb;
@@ -1612,7 +1612,7 @@ write_next_mlit (SoupMessage * message, struct share_bitwise_t *share_bitwise)
                mb.share = share_bitwise->mb.share;
 
                DMAP_SHARE_GET_CLASS (share_bitwise->mb.share)->
-                       add_entry_to_mlcl (share_bitwise->id_list->data,
+                       add_entry_to_mlcl (GPOINTER_TO_UINT (share_bitwise->id_list->data),
                                           record, &mb);
                data = dmap_structure_serialize (g_node_first_child (mb.mlcl),
                                                 &length);
@@ -1871,16 +1871,14 @@ _dmap_share_databases (DMAPShare * share,
                                g_hash_table_lookup_adapter;
                        share_bitwise->destroy = (ShareBitwiseDestroyFunc) g_hash_table_destroy;
                        g_hash_table_foreach (records,
-                                             (GHFunc)
-                                             accumulate_mlcl_size_and_ids,
+                                            (GHFunc) accumulate_mlcl_size_and_ids,
                                              share_bitwise);
                } else {
                        share_bitwise->db = share->priv->db;
                        share_bitwise->lookup_by_id = (ShareBitwiseLookupByIdFunc) dmap_db_lookup_by_id;
                        share_bitwise->destroy = NULL;
                        dmap_db_foreach (share->priv->db,
-                                        (GHFunc)
-                                        accumulate_mlcl_size_and_ids,
+                                       (DMAPIdRecordFunc) accumulate_mlcl_size_and_ids,
                                         share_bitwise);
                }
 
@@ -2061,7 +2059,7 @@ _dmap_share_databases (DMAPShare * share,
                        for (id = keys; id; id = id->next) {
                                (*
                                 (DMAP_SHARE_GET_CLASS (share)->
-                                 add_entry_to_mlcl)) (id->data,
+                                 add_entry_to_mlcl)) (GPOINTER_TO_UINT (id->data),
                                                       g_hash_table_lookup
                                                       (records, id->data),
                                                       &mb);
@@ -2083,7 +2081,6 @@ _dmap_share_databases (DMAPShare * share,
                                                            DMAP_CC_MLCL);
 
                                dmap_db_foreach (share->priv->db,
-                                                (GHFunc)
                                                 DMAP_SHARE_GET_CLASS
                                                 (share)->add_entry_to_mlcl,
                                                 &mb);
@@ -2109,7 +2106,6 @@ _dmap_share_databases (DMAPShare * share,
                                                            DMAP_CC_MLCL);
 
                                dmap_db_foreach (entries,
-                                                (GHFunc)
                                                 DMAP_SHARE_GET_CLASS
                                                 (share)->add_entry_to_mlcl,
                                                 &mb);
diff --git a/libdmapsharing/dmap-share.h b/libdmapsharing/dmap-share.h
index b88eb3d..e0a5448 100644
--- a/libdmapsharing/dmap-share.h
+++ b/libdmapsharing/dmap-share.h
@@ -108,8 +108,7 @@ typedef struct
        void (*message_add_standard_headers) (DMAPShare * share,
                                              SoupMessage * msg);
        struct DMAPMetaDataMap *(*get_meta_data_map) (DMAPShare * share);
-       void (*add_entry_to_mlcl) (gpointer id,
-                                  DMAPRecord * record, gpointer mb);
+       void (*add_entry_to_mlcl) (guint id, DMAPRecord * record, gpointer mb);
        void (*databases_browse_xxx) (DMAPShare * share,
                                      SoupServer * server,
                                      SoupMessage * msg,
diff --git a/libdmapsharing/dpap-share.c b/libdmapsharing/dpap-share.c
index 827e6e8..fe02ad7 100644
--- a/libdmapsharing/dpap-share.c
+++ b/libdmapsharing/dpap-share.c
@@ -74,7 +74,7 @@ static void databases_items_xxx (DMAPShare * share,
                                 GHashTable * query,
                                 SoupClientContext * context);
 static struct DMAPMetaDataMap *get_meta_data_map (DMAPShare * share);
-static void add_entry_to_mlcl (gpointer id, DMAPRecord * record, gpointer mb);
+static void add_entry_to_mlcl (guint id, DMAPRecord * record, gpointer mb);
 
 #define DPAP_TYPE_OF_SERVICE "_dpap._tcp"
 #define DPAP_PORT 8770
@@ -348,7 +348,7 @@ file_to_mmap (const char *location)
 }
 
 static void
-add_entry_to_mlcl (gpointer id, DMAPRecord * record, gpointer _mb)
+add_entry_to_mlcl (guint id, DMAPRecord * record, gpointer _mb)
 {
        GNode *mlit;
        struct MLCL_Bits *mb = (struct MLCL_Bits *) _mb;
@@ -359,8 +359,7 @@ add_entry_to_mlcl (gpointer id, DMAPRecord * record, gpointer _mb)
                dmap_structure_add (mlit, DMAP_CC_MIKD,
                                    (gchar) DPAP_ITEM_KIND_PHOTO);
        if (_dmap_share_client_requested (mb->bits, ITEM_ID))
-               dmap_structure_add (mlit, DMAP_CC_MIID,
-                                   GPOINTER_TO_UINT (id));
+               dmap_structure_add (mlit, DMAP_CC_MIID, id);
        if (_dmap_share_client_requested (mb->bits, ITEM_NAME)) {
                gchar *filename = NULL;
 
@@ -372,8 +371,7 @@ add_entry_to_mlcl (gpointer id, DMAPRecord * record, gpointer _mb)
                        g_debug ("Filename requested but not available");
        }
        if (_dmap_share_client_requested (mb->bits, PERSISTENT_ID))
-               dmap_structure_add (mlit, DMAP_CC_MPER,
-                                   GPOINTER_TO_UINT (id));
+               dmap_structure_add (mlit, DMAP_CC_MPER, id);
        if (TRUE) {
                /* dpap-sharp claims iPhoto '08 will not show thumbnails without PASP
                 * and this does seem to be the case when testing. */
diff --git a/tests/dmapcopy.vala b/tests/dmapcopy.vala
index 190ac39..9582a7c 100644
--- a/tests/dmapcopy.vala
+++ b/tests/dmapcopy.vala
@@ -58,17 +58,15 @@ private class DPAPCopy {
                return true;
        }
 
-       private void service_added_cb (DMAP.MdnsBrowserService *service) {
-               connection = (DMAP.Connection) new DPAP.Connection (service->service_name, service->host, 
service->port, db, factory);
-               connection.connect (connected_cb);
-       }
-
        public DPAPCopy () throws GLib.Error {
                db = new ValaDMAPDb ();
                factory = new ValaDPAPRecordFactory ();
 
-               browser = new DMAP.MdnsBrowser (DMAP.MdnsBrowserServiceType.DPAP);
-               browser.service_added.connect (service_added_cb);
+               browser = new DMAP.MdnsBrowser (DMAP.MdnsServiceType.DPAP);
+               browser.service_added.connect ((browser, service) => {
+                       connection = (DMAP.Connection) new DPAP.Connection (service.service_name, 
service.host, service.port, db, factory);
+                       connection.connect (connected_cb);
+               });
                browser.start ();
        }
 }
diff --git a/tests/dpapview.vala b/tests/dpapview.vala
index b7bdad0..181f2b1 100644
--- a/tests/dpapview.vala
+++ b/tests/dpapview.vala
@@ -49,11 +49,6 @@ private class DPAPViewer {
                return true;
        }
 
-       private void service_added_cb (DMAP.MdnsBrowserService *service) {
-               connection = (DMAP.Connection) new DPAP.Connection (service->service_name, service->host, 
service->port, db, factory);
-               connection.connect (connected_cb);
-       }
-
        public DPAPViewer (Gtk.Builder builder) throws GLib.Error {
                builder.connect_signals (this);
 
@@ -68,8 +63,11 @@ private class DPAPViewer {
 
                widget.show_all ();
 
-               browser = new DMAP.MdnsBrowser (DMAP.MdnsBrowserServiceType.DPAP);
-               browser.service_added.connect (service_added_cb);
+               browser = new DMAP.MdnsBrowser (DMAP.MdnsServiceType.DPAP);
+               browser.service_added.connect ((browser, service) =>  {
+                       connection = (DMAP.Connection) new DPAP.Connection (service.service_name, 
service.host, service.port, db, factory);
+                       connection.connect (connected_cb);
+               });
                browser.start ();
        }
 }
diff --git a/tests/test-dmap-client-python b/tests/test-dmap-client-python
index 1e750d6..69e8d0d 100755
--- a/tests/test-dmap-client-python
+++ b/tests/test-dmap-client-python
@@ -1,30 +1,52 @@
 #!/usr/bin/env python
 
+# FIXME: dmap-connection.c presently has DAAP_TYPE_SIMPLE_RECORD_FACTORY hard coded.
+
+from gi.repository import GObject
 from gi.repository import GLib
 from gi.repository import DMAP
 from gi.repository import DAAP
 
-def connected_cb (self, result, reason, db):
-       print reason
+class PyDMAPDb(GObject.GObject, DMAP.Db):
+       db = {}
+       nextId = 0
+
+       def do_foreach(self, func, user_data=None):
+               for id in self.db:
+                       func (id, self.db[id])
+
+       def do_add(self, record):
+               self.db[self.nextId] = record
+               self.nextId += 1
+
+       def __init__(self):
+               super(PyDMAPDb, self).__init__()
+
+def print_record(id, record, user_data):
+       title = record.get_property("title")
+       has_video = record.get_property("has-video")
+       artist = record.get_property("songartist")
+
+       print id, artist, title, has_video
+
+def connected_cb(self, result, reason, db):
+       db.foreach(print_record, None)
+
+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")
 
-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")
+       factory = DAAP.RecordFactorySimple()
+       db = PyDMAPDb()
 
-       print service_name
-       print name
-       print host
-       print port
+       connection = DAAP.Connection.new(service_name, host, port, db, factory)
 
-       # implement a DMAP database
-       # implement a DAAP record factory
-       # daap_connection_new
-       # dmap_connection_connect
+       connection.start(connected_cb, db)
 
 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 57bc10e..427895b 100644
--- a/tests/test-dmap-client.c
+++ b/tests/test-dmap-client.c
@@ -123,7 +123,7 @@ service_added_cb (DMAPMdnsBrowser *browser,
         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);
+    dmap_connection_start (DMAP_CONNECTION (conn), (DMAPConnectionCallback) connected_cb, db);
 }
 
 int main(int argc, char **argv)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]