[libdmapsharing] Modify API and create test-dmap-server-python



commit 9bc1688d872bf003b233b07895a03b80e289ae09
Author: W. Michael Petullo <mike flyn org>
Date:   Sat Nov 11 20:03:55 2017 -0500

    Modify API and create test-dmap-server-python
    
    Signed-off-by: W. Michael Petullo <mike flyn org>

 libdmapsharing/dmap-container-db.c     |    2 +-
 libdmapsharing/dmap-container-db.h     |   18 ++++-
 libdmapsharing/dmap-container-record.h |    2 +-
 libdmapsharing/dmap-db.h               |    2 +-
 tests/test-dmap-client-python          |   53 +---------------
 tests/test-dmap-server-python          |   53 ++++++++++++++++
 tests/testpython.py                    |  104 ++++++++++++++++++++++++++++++++
 tests/vala-dmap-container-db.c         |    2 +-
 vala/libdmapsharing-3.2.vapi           |   16 ++++-
 9 files changed, 190 insertions(+), 62 deletions(-)
---
diff --git a/libdmapsharing/dmap-container-db.c b/libdmapsharing/dmap-container-db.c
index 899827e..9677687 100644
--- a/libdmapsharing/dmap-container-db.c
+++ b/libdmapsharing/dmap-container-db.c
@@ -69,7 +69,7 @@ dmap_container_db_lookup_by_id (DMAPContainerDb * db, guint id)
 }
 
 void
-dmap_container_db_foreach (DMAPContainerDb * db, GHFunc func, gpointer data)
+dmap_container_db_foreach (DMAPContainerDb * db, DMAPIdContainerRecordFunc func, gpointer data)
 {
        DMAP_CONTAINER_DB_GET_INTERFACE (db)->foreach (db, func, data);
 }
diff --git a/libdmapsharing/dmap-container-db.h b/libdmapsharing/dmap-container-db.h
index f001a82..12b2dc8 100644
--- a/libdmapsharing/dmap-container-db.h
+++ b/libdmapsharing/dmap-container-db.h
@@ -64,6 +64,16 @@ G_BEGIN_DECLS
 typedef struct _DMAPContainerDb DMAPContainerDb;
 typedef struct _DMAPContainerDbIface DMAPContainerDbIface;
 
+/**
+ * DMAPIdContainerRecordFunc:
+ * @id: a DMAP container record ID
+ * @record: a #DMAPContainerRecord
+ * @user_data: (closure): user data
+ *
+ * The type of function passed to dmap_container_db_foreach().
+ */
+typedef void (*DMAPIdContainerRecordFunc) (guint id, DMAPContainerRecord *record, gpointer user_data);
+
 struct _DMAPContainerDbIface
 {
        GTypeInterface parent;
@@ -72,7 +82,7 @@ struct _DMAPContainerDbIface
 
        DMAPContainerRecord *(*lookup_by_id) (DMAPContainerDb * db, guint id);
 
-       void (*foreach) (DMAPContainerDb * db, GHFunc func, gpointer data);
+       void (*foreach) (DMAPContainerDb * db, DMAPIdContainerRecordFunc func, gpointer data);
 
          gint64 (*count) (DMAPContainerDb * db);
 };
@@ -94,7 +104,7 @@ void dmap_container_db_add (DMAPContainerDb * db,
  * @db: A container database.
  * @id: A record ID.
  *
- * Returns: the database record corresponding to @id. This record should
+ * Returns: (transfer full): the database record corresponding to @id. This record should
  * be unrefed when no longer required.
  */
 DMAPContainerRecord *dmap_container_db_lookup_by_id (DMAPContainerDb * db,
@@ -103,13 +113,13 @@ DMAPContainerRecord *dmap_container_db_lookup_by_id (DMAPContainerDb * db,
 /**
  * dmap_container_db_foreach:
  * @db: A container 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 container database.
  */
 void dmap_container_db_foreach (DMAPContainerDb * db,
-                               GHFunc func, gpointer data);
+                               DMAPIdContainerRecordFunc func, gpointer data);
 
 /**
  * dmap_container_db_count:
diff --git a/libdmapsharing/dmap-container-record.h b/libdmapsharing/dmap-container-record.h
index a2df44b..56d7577 100644
--- a/libdmapsharing/dmap-container-record.h
+++ b/libdmapsharing/dmap-container-record.h
@@ -111,7 +111,7 @@ guint64 dmap_container_record_get_entry_count (DMAPContainerRecord * record);
  * dmap_container_record_get_entries:
  * @record: A DMAPContainerRecord.
  *
- * Returns: A pointer to a DMAPDb containing the entries contained in record.
+ * Returns: (transfer full): A pointer to a DMAPDb containing the entries contained in record.
  */
 DMAPDb *dmap_container_record_get_entries (DMAPContainerRecord * record);
 
diff --git a/libdmapsharing/dmap-db.h b/libdmapsharing/dmap-db.h
index 8049e8d..ec7e868 100644
--- a/libdmapsharing/dmap-db.h
+++ b/libdmapsharing/dmap-db.h
@@ -143,7 +143,7 @@ guint dmap_db_add_path (DMAPDb * db, const gchar * path);
  * @db: A media database. 
  * @id: A record ID.
  *
- * Returns: the database record corresponding to @id. This record should
+ * Returns: (transfer full): the database record corresponding to @id. This record should
  * be unrefed by the calling code when no longer required.
  *
  * If you are implementing a full database using this API, then you
diff --git a/tests/test-dmap-client-python b/tests/test-dmap-client-python
index a39161c..ce0cac0 100755
--- a/tests/test-dmap-client-python
+++ b/tests/test-dmap-client-python
@@ -11,61 +11,14 @@ from gi.repository import GLib
 from gi.repository import DMAP
 from gi.repository import DAAP
 
-class PyDMAPDb(GObject.GObject, DMAP.Db):
-    db = {}
-    nextId = 0
-
-    def do_foreach(self, func, user_data=None):
-        for id in self.db.copy():
-            func (id, self.db[id])
-
-    def do_add(self, record):
-        id           = self.nextId
-        self.db[id]  = record
-        self.nextId += 1
-        return id
-
-    def __init__(self):
-        super(PyDMAPDb, self).__init__()
-
-class PyDAAPRecord(GObject.GObject, DAAP.Record, DMAP.Record):
-    location    = GObject.property(type=GObject.TYPE_STRING,  default=None)
-    title       = GObject.property(type=GObject.TYPE_STRING,  default=None)
-    songalbum   = GObject.property(type=GObject.TYPE_STRING,  default=None)
-    sort_album  = GObject.property(type=GObject.TYPE_STRING,  default=None)
-    songartist  = GObject.property(type=GObject.TYPE_STRING,  default=None)
-    sort_artist = GObject.property(type=GObject.TYPE_STRING,  default=None)
-    songgenre   = GObject.property(type=GObject.TYPE_STRING,  default=None)
-    format      = GObject.property(type=GObject.TYPE_STRING,  default=None)
-    rating      = GObject.property(type=GObject.TYPE_INT,     default=0)
-    filesize    = GObject.property(type=GObject.TYPE_UINT64,  default=0)
-    duration    = GObject.property(type=GObject.TYPE_INT,     default=0)
-    track       = GObject.property(type=GObject.TYPE_INT,     default=0)
-    year        = GObject.property(type=GObject.TYPE_INT,     default=0)
-    firstseen   = GObject.property(type=GObject.TYPE_INT,     default=0)
-    mtime       = GObject.property(type=GObject.TYPE_INT,     default=0)
-    disc        = GObject.property(type=GObject.TYPE_INT,     default=0)
-    bitrate     = GObject.property(type=GObject.TYPE_INT,     default=0)
-    has_video   = GObject.property(type=GObject.TYPE_BOOLEAN, default=0)
-    mediakind   = GObject.property(type=GObject.TYPE_INT,     default=0)
-    songalbumid = GObject.property(type=GObject.TYPE_INT64,   default=0)
-
-    def __init__(self):
-        super(PyDAAPRecord, self).__init__()
-
-class PyDAAPRecordFactory(GObject.GObject, DMAP.RecordFactory):
-    def do_create (self, user_data=None):
-        return PyDAAPRecord()
-
-    def __init__(self):
-        super(PyDAAPRecordFactory, self).__init__()
+import testpython
 
 class TestDMAPClient(GObject.GObject):
     def __init__(self):
         super(TestDMAPClient, self).__init__()
 
-        self.factory = PyDAAPRecordFactory()
-        self.db      = PyDMAPDb()
+        self.factory = testpython.PyDAAPRecordFactory()
+        self.db      = testpython.PyDMAPDb()
         self.browser = DMAP.MdnsBrowser.new(DMAP.MdnsServiceType.DAAP)
 
     def start(self):
diff --git a/tests/test-dmap-server-python b/tests/test-dmap-server-python
new file mode 100755
index 0000000..360ae9e
--- /dev/null
+++ b/tests/test-dmap-server-python
@@ -0,0 +1,53 @@
+#!/usr/bin/env python3
+
+import gi
+import sys
+
+gi.require_version('DMAP', '3.2')
+gi.require_version('DAAP', '3.2')
+
+from gi.repository import GObject
+from gi.repository import GLib
+from gi.repository import DMAP
+from gi.repository import DAAP
+
+import testpython
+
+class TestDMAPServer(GObject.GObject):
+    def __init__(self):
+        super(TestDMAPServer, self).__init__()
+
+        name = 'Python libdmapsharing test'
+
+        self.container_record = testpython.PyDMAPContainerRecord()
+        self.container_db     = testpython.PyDMAPContainerDb()
+        self.factory          = testpython.PyDAAPRecordFactory()
+        self.db               = testpython.PyDMAPDb()
+
+        record = testpython.PyDAAPRecord()
+
+        record.set_property('title', 'test-title')
+        record.set_property('songalbum', 'test-album')
+        record.set_property('sort-album', 'test-sort-album')
+        record.set_property('songartist', 'test-artist')
+        record.set_property('sort-artist', 'test-sort-artist')
+        record.set_property('songgenre', 'test-genre')
+        record.set_property('format', 'test-format')
+        record.set_property('rating', 0)
+        record.set_property('filesize', 1)
+        record.set_property('duration', 2)
+        record.set_property('track', 3)
+        record.set_property('year', 4)
+        record.set_property('firstseen', 5)
+        record.set_property('mtime', 6)
+        record.set_property('disc', 7)
+        record.set_property('bitrate', 8)
+        record.set_property('has-video', False)
+        record.set_property('mediakind', DMAP.MediaKind.MUSIC)
+
+        self.db.add(record)
+
+        self.share            = DAAP.Share.new(name, 'password', self.db, self.container_db, 'audio/mp3')
+
+server = TestDMAPServer ()
+GLib.MainLoop().run()
diff --git a/tests/testpython.py b/tests/testpython.py
new file mode 100644
index 0000000..6a89e73
--- /dev/null
+++ b/tests/testpython.py
@@ -0,0 +1,104 @@
+import gi
+
+gi.require_version('DMAP', '3.2')
+gi.require_version('DAAP', '3.2')
+
+from gi.repository import GObject
+from gi.repository import GLib
+from gi.repository import DMAP
+from gi.repository import DAAP
+
+class PyDMAPDb(GObject.GObject, DMAP.Db):
+    db = {}
+    nextId = 0
+
+    def do_foreach(self, func, user_data=None):
+        for id in self.db.copy():
+            func (id, self.db[id])
+
+    def do_add(self, record):
+        id           = self.nextId
+        self.db[id]  = record
+        self.nextId += 1
+        return id
+
+    def do_count(self):
+        return len(self.db);
+
+    def do_lookup_by_id(self, id):
+        return self.db[id]
+
+    def __init__(self):
+        super(PyDMAPDb, self).__init__()
+
+class PyDAAPRecord(GObject.GObject, DAAP.Record, DMAP.Record):
+    location    = GObject.property(type=GObject.TYPE_STRING,  default=None)
+    title       = GObject.property(type=GObject.TYPE_STRING,  default=None)
+    songalbum   = GObject.property(type=GObject.TYPE_STRING,  default=None)
+    sort_album  = GObject.property(type=GObject.TYPE_STRING,  default=None)
+    songartist  = GObject.property(type=GObject.TYPE_STRING,  default=None)
+    sort_artist = GObject.property(type=GObject.TYPE_STRING,  default=None)
+    songgenre   = GObject.property(type=GObject.TYPE_STRING,  default=None)
+    format      = GObject.property(type=GObject.TYPE_STRING,  default=None)
+    rating      = GObject.property(type=GObject.TYPE_INT,     default=0)
+    filesize    = GObject.property(type=GObject.TYPE_UINT64,  default=0)
+    duration    = GObject.property(type=GObject.TYPE_INT,     default=0)
+    track       = GObject.property(type=GObject.TYPE_INT,     default=0)
+    year        = GObject.property(type=GObject.TYPE_INT,     default=0)
+    firstseen   = GObject.property(type=GObject.TYPE_INT,     default=0)
+    mtime       = GObject.property(type=GObject.TYPE_INT,     default=0)
+    disc        = GObject.property(type=GObject.TYPE_INT,     default=0)
+    bitrate     = GObject.property(type=GObject.TYPE_INT,     default=0)
+    has_video   = GObject.property(type=GObject.TYPE_BOOLEAN, default=0)
+    mediakind   = GObject.property(type=GObject.TYPE_INT,     default=0)
+    # mediakind   = GObject.property(type=DMAP.MediaKind  ,     default=0)
+    songalbumid = GObject.property(type=GObject.TYPE_INT64,   default=0)
+    # hash        = GObject.property(type=GObject.TYPE_POINTER,   default=None)
+    hash        = GObject.property(type=GLib.ByteArray,       default=None)
+
+    def __init__(self):
+        super(PyDAAPRecord, self).__init__()
+
+class PyDAAPRecordFactory(GObject.GObject, DMAP.RecordFactory):
+    def do_create (self, user_data=None):
+        return PyDAAPRecord()
+
+    def __init__(self):
+        super(PyDAAPRecordFactory, self).__init__()
+
+class PyDMAPContainerRecord(GObject.GObject, DMAP.ContainerRecord):
+    name = GObject.property(type=GObject.TYPE_STRING, default='Test')
+    entries = PyDMAPDb()
+
+    def do_get_id(self):
+        return 2
+
+    def do_add_entry(self):
+        pass
+
+    def do_get_entry_count(self):
+        return 1
+
+    def do_get_entries(self):
+        return self.entries
+
+    def __init__(self):
+        super(PyDMAPContainerRecord, self).__init__()
+
+class PyDMAPContainerDb(GObject.GObject, DMAP.ContainerDb):
+    record = PyDMAPContainerRecord()
+
+    def do_add(self, record):
+        pass
+
+    def do_count(self):
+        return 1;
+
+    def do_foreach(self, func, user_data=None):
+        func (1, self.record)
+
+    def do_lookup_by_id(self, id):
+        return self.record
+
+    def __init__(self):
+        super(PyDMAPContainerDb, self).__init__()
diff --git a/tests/vala-dmap-container-db.c b/tests/vala-dmap-container-db.c
index c41b00b..d808964 100644
--- a/tests/vala-dmap-container-db.c
+++ b/tests/vala-dmap-container-db.c
@@ -172,7 +172,7 @@ static void vala_dmap_container_db_class_init (ValaDMAPContainerDbClass * klass)
 static void vala_dmap_container_db_dmap_container_db_interface_init (DMAPContainerDbIface * iface) {
        vala_dmap_container_db_dmap_container_db_parent_iface = g_type_interface_peek_parent (iface);
        iface->count = (gint64 (*) (DMAPContainerDb *)) vala_dmap_container_db_real_count;
-       iface->foreach = (void (*) (DMAPContainerDb *, GHFunc, void*)) vala_dmap_container_db_real_foreach;
+       iface->foreach = (void (*) (DMAPContainerDb *, DMAPIdContainerRecordFunc, void*)) 
vala_dmap_container_db_real_foreach;
        iface->lookup_by_id = (DMAPContainerRecord* (*) (DMAPContainerDb *, guint)) 
vala_dmap_container_db_real_lookup_by_id;
        iface->add = (void (*) (DMAPContainerDb *, DMAPContainerRecord*)) vala_dmap_container_db_real_add;
 }
diff --git a/vala/libdmapsharing-3.2.vapi b/vala/libdmapsharing-3.2.vapi
index f874611..ffbc637 100644
--- a/vala/libdmapsharing-3.2.vapi
+++ b/vala/libdmapsharing-3.2.vapi
@@ -269,7 +269,7 @@ namespace DAAP {
                [CCode (cname = "dmap_container_db_count")]
                public abstract int64 count (DMAP.ContainerDb db);
                [CCode (cname = "dmap_container_db_foreach")]
-               public abstract void @foreach (DMAP.ContainerDb db, GLib.HFunc func, void* data);
+               public abstract void @foreach (DMAP.ContainerDb db, DAAP.DMAPIdContainerRecordFunc func, 
void* data);
                [CCode (cname = "dmap_container_db_lookup_by_id")]
                public abstract unowned DAAP.DMAPContainerRecord lookup_by_id (DMAP.ContainerDb db, uint id);
        }
@@ -550,6 +550,8 @@ namespace DAAP {
        [CCode (cheader_filename = "libdmapsharing/dmap.h")]
        public delegate bool DMAPConnectionFunc (DAAP.DMAPConnection connection, bool result, string reason);
        [CCode (cheader_filename = "libdmapsharing/dmap.h")]
+       public delegate void DMAPIdContainerRecordFunc (uint id, DAAP.DMAPContainerRecord record);
+       [CCode (cheader_filename = "libdmapsharing/dmap.h")]
        public delegate void DMAPIdRecordFunc (uint id, DAAP.DMAPRecord record);
        [CCode (cheader_filename = "libdmapsharing/dmap.h")]
        public delegate void DMAPResponseHandler (DAAP.DMAPConnection connection, uint status, GLib.Node 
structure);
@@ -933,7 +935,7 @@ namespace DACP {
                [CCode (cname = "dmap_container_db_count")]
                public abstract int64 count (DMAP.ContainerDb db);
                [CCode (cname = "dmap_container_db_foreach")]
-               public abstract void @foreach (DMAP.ContainerDb db, GLib.HFunc func, void* data);
+               public abstract void @foreach (DMAP.ContainerDb db, DACP.DMAPIdContainerRecordFunc func, 
void* data);
                [CCode (cname = "dmap_container_db_lookup_by_id")]
                public abstract unowned DACP.DMAPContainerRecord lookup_by_id (DMAP.ContainerDb db, uint id);
        }
@@ -1229,6 +1231,8 @@ namespace DACP {
        [CCode (cheader_filename = "libdmapsharing/dmap.h")]
        public delegate bool DMAPConnectionFunc (DACP.DMAPConnection connection, bool result, string reason);
        [CCode (cheader_filename = "libdmapsharing/dmap.h")]
+       public delegate void DMAPIdContainerRecordFunc (uint id, DACP.DMAPContainerRecord record);
+       [CCode (cheader_filename = "libdmapsharing/dmap.h")]
        public delegate void DMAPIdRecordFunc (uint id, DACP.DMAPRecord record);
        [CCode (cheader_filename = "libdmapsharing/dmap.h")]
        public delegate void DMAPResponseHandler (DACP.DMAPConnection connection, uint status, GLib.Node 
structure);
@@ -1548,7 +1552,7 @@ namespace DMAP {
        public interface ContainerDb : GLib.Object {
                public abstract void add (DMAP.ContainerRecord record);
                public abstract int64 count ();
-               public abstract void @foreach (GLib.HFunc func);
+               public abstract void @foreach (DMAP.IdContainerRecordFunc func);
                public abstract unowned DMAP.ContainerRecord lookup_by_id (uint id);
        }
        [CCode (cheader_filename = "libdmapsharing/dmap.h")]
@@ -1807,6 +1811,8 @@ namespace DMAP {
        [CCode (cheader_filename = "libdmapsharing/dmap.h")]
        public delegate bool ConnectionFunc (DMAP.Connection connection, bool result, string reason);
        [CCode (cheader_filename = "libdmapsharing/dmap.h")]
+       public delegate void IdContainerRecordFunc (uint id, DMAP.ContainerRecord record);
+       [CCode (cheader_filename = "libdmapsharing/dmap.h")]
        public delegate void IdRecordFunc (uint id, DMAP.Record record);
        [CCode (cheader_filename = "libdmapsharing/dmap.h")]
        public delegate void ResponseHandler (DMAP.Connection connection, uint status, GLib.Node structure);
@@ -2158,7 +2164,7 @@ namespace DPAP {
                [CCode (cname = "dmap_container_db_count")]
                public abstract int64 count (DMAP.ContainerDb db);
                [CCode (cname = "dmap_container_db_foreach")]
-               public abstract void @foreach (DMAP.ContainerDb db, GLib.HFunc func, void* data);
+               public abstract void @foreach (DMAP.ContainerDb db, DPAP.DMAPIdContainerRecordFunc func, 
void* data);
                [CCode (cname = "dmap_container_db_lookup_by_id")]
                public abstract unowned DPAP.DMAPContainerRecord lookup_by_id (DMAP.ContainerDb db, uint id);
        }
@@ -2437,6 +2443,8 @@ namespace DPAP {
        [CCode (cheader_filename = "libdmapsharing/dmap.h")]
        public delegate bool DMAPConnectionFunc (DPAP.DMAPConnection connection, bool result, string reason);
        [CCode (cheader_filename = "libdmapsharing/dmap.h")]
+       public delegate void DMAPIdContainerRecordFunc (uint id, DPAP.DMAPContainerRecord record);
+       [CCode (cheader_filename = "libdmapsharing/dmap.h")]
        public delegate void DMAPIdRecordFunc (uint id, DPAP.DMAPRecord record);
        [CCode (cheader_filename = "libdmapsharing/dmap.h")]
        public delegate void DMAPResponseHandler (DPAP.DMAPConnection connection, uint status, GLib.Node 
structure);


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