You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1490 lines
48 KiB

diff --git a/meson.build b/meson.build
index 33a6f40..8a590b9 100644
--- a/meson.build
+++ b/meson.build
@@ -62,7 +62,12 @@ gstreamer_dep = dependency('gstreamer-1.0', required: false)
gthread_dep = dependency('gthread-2.0', required: false)
json_glib_dep = dependency('json-glib-1.0', required: false)
libarchive_dep = dependency('libarchive', required: false)
-libdmapsharing_dep = dependency('libdmapsharing-3.0', version: '>= 2.9.12', required: false)
+libdmapsharing4_dep = dependency('libdmapsharing-4.0', version: '>= 3.9.4', required: false)
+if libdmapsharing4_dep.found()
+ libdmapsharing_dep = libdmapsharing4_dep
+else
+ libdmapsharing_dep = dependency('libdmapsharing-3.0', version: '>= 2.9.12', required: false)
+endif
libgdata_dep = dependency('libgdata', version: '>= 0.9.1', required: false)
libmediaart_dep = dependency('libmediaart-2.0', required: false)
libsoup_dep = dependency('libsoup-2.4', required: false)
diff --git a/src/dmap/grl-common.c b/src/dmap/grl-common.c
index 6a1da5e..74a965f 100644
--- a/src/dmap/grl-common.c
+++ b/src/dmap/grl-common.c
@@ -33,13 +33,27 @@
#include <stdlib.h>
#include <libdmapsharing/dmap.h>
+#include "grl-dmap-compat.h"
#include "grl-common.h"
gchar *
-grl_dmap_build_url (DMAPMdnsBrowserService *service)
+grl_dmap_build_url (DmapMdnsService *service)
{
- return g_strdup_printf ("%s://%s:%u",
- service->service_name,
- service->host,
- service->port);
+ gchar *url = NULL;
+ gchar *service_name, *host;
+ guint port;
+
+ service_name = grl_dmap_service_get_service_name (service);
+ host = grl_dmap_service_get_host (service);
+ port = grl_dmap_service_get_port (service);
+
+ url = g_strdup_printf ("%s://%s:%u",
+ service_name,
+ host,
+ port);
+
+ g_free (service_name);
+ g_free (host);
+
+ return url;
}
diff --git a/src/dmap/grl-common.h b/src/dmap/grl-common.h
index e9c8327..d61df63 100644
--- a/src/dmap/grl-common.h
+++ b/src/dmap/grl-common.h
@@ -24,9 +24,6 @@
#ifndef _GRL_COMMON_H_
#define _GRL_COMMON_H_
-#include <grilo.h>
-#include <libdmapsharing/dmap.h>
-
typedef struct {
GrlSourceResultCb callback;
GrlSource *source;
@@ -41,9 +38,9 @@ typedef struct {
typedef struct {
ResultCbAndArgs cb;
- DMAPDb *db;
+ DmapDb *db;
} ResultCbAndArgsAndDb;
-gchar *grl_dmap_build_url (DMAPMdnsBrowserService *service);
+gchar *grl_dmap_build_url (DmapMdnsService *service);
#endif /* _GRL_COMMON_H_ */
diff --git a/src/dmap/grl-daap-compat.h b/src/dmap/grl-daap-compat.h
new file mode 100644
index 0000000..da9025f
--- /dev/null
+++ b/src/dmap/grl-daap-compat.h
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2019 W. Michael Petullo
+ * Copyright (C) 2019 Igalia S.L.
+ *
+ * Contact: 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; 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 _GRL_DAAP_COMPAT_H_
+#define _GRL_DAAP_COMPAT_H_
+
+#include "grl-dmap-compat.h"
+
+#ifdef LIBDMAPSHARING_COMPAT
+
+DMAPRecord *grl_daap_record_factory_create (DMAPRecordFactory *factory, gpointer user_data, GError **error);
+guint grl_daap_db_add (DMAPDb *_db, DMAPRecord *_record, GError **error);
+
+/* Building against libdmapsharing 3 API. */
+
+#define dmap_av_connection_new daap_connection_new
+#define DmapAvRecord DAAPRecord
+#define DmapAvRecordInterface DAAPRecordIface
+#define DMAP_AV_RECORD DAAP_RECORD
+#define DMAP_TYPE_AV_RECORD DAAP_TYPE_RECORD
+#define IS_DMAP_AV_RECORD IS_DAAP_RECORD
+
+static inline DmapRecord *
+grl_daap_record_factory_create_compat (DmapRecordFactory *factory, gpointer user_data)
+{
+ return grl_daap_record_factory_create (factory, user_data, NULL);
+}
+
+static inline guint
+grl_daap_db_add_compat (DmapDb *_db, DmapRecord *_record)
+{
+ return grl_daap_db_add (_db, _record, NULL);
+}
+
+#else
+
+/* Building against libdmapsharing 4 API. */
+
+DmapRecord *grl_daap_record_factory_create (DmapRecordFactory *factory, gpointer user_data, GError **error);
+guint grl_daap_db_add (DmapDb *_db, DmapRecord *_record, GError **error);
+
+static inline DmapRecord *
+grl_daap_record_factory_create_compat (DmapRecordFactory *factory, gpointer user_data, GError **error)
+{
+ return grl_daap_record_factory_create (factory, user_data, error);
+}
+
+static inline guint
+grl_daap_db_add_compat (DmapDb *_db, DmapRecord *_record, GError **error)
+{
+ return grl_daap_db_add (_db, _record, error);
+}
+
+#endif
+
+#endif /* _GRL_DAAP_COMPAT_H_ */
diff --git a/src/dmap/grl-daap-db.c b/src/dmap/grl-daap-db.c
index f460113..315370e 100644
--- a/src/dmap/grl-daap-db.c
+++ b/src/dmap/grl-daap-db.c
@@ -54,8 +54,12 @@
#include <sys/stat.h>
#include <sys/types.h>
#include <glib.h>
+#include <grilo.h>
#include <string.h>
+#include <libdmapsharing/dmap.h>
+#include "grl-daap-compat.h"
+#include "grl-common.h"
#include "grl-daap-db.h"
#define ALBUMS_ID "albums"
@@ -103,23 +107,23 @@ grl_daap_db_new (void)
return db;
}
-static DMAPRecord *
-grl_daap_db_lookup_by_id (const DMAPDb *db, guint id)
+static DmapRecord *
+grl_daap_db_lookup_by_id (const DmapDb *db, guint id)
{
g_error ("Not implemented");
return NULL;
}
static void
-grl_daap_db_foreach (const DMAPDb *db,
- GHFunc func,
+grl_daap_db_foreach (const DmapDb *db,
+ DmapIdRecordFunc func,
gpointer data)
{
g_error ("Not implemented");
}
static gint64
-grl_daap_db_count (const DMAPDb *db)
+grl_daap_db_count (const DmapDb *db)
{
g_error ("Not implemented");
return 0;
@@ -150,14 +154,14 @@ set_insert (GHashTable *category, const char *category_name, char *set_name, Grl
g_object_unref (container);
}
-static guint
-grl_daap_db_add (DMAPDb *_db, DMAPRecord *_record)
+guint
+grl_daap_db_add (DmapDb *_db, DmapRecord *_record, GError **error)
{
g_assert (IS_GRL_DAAP_DB (_db));
- g_assert (IS_DAAP_RECORD (_record));
+ g_assert (IS_DMAP_AV_RECORD (_record));
GrlDAAPDb *db = GRL_DAAP_DB (_db);
- DAAPRecord *record = DAAP_RECORD (_record);
+ DmapAvRecord *record = DMAP_AV_RECORD (_record);
gint duration = 0;
gint32 bitrate = 0,
@@ -232,11 +236,11 @@ grl_daap_db_add (DMAPDb *_db, DMAPRecord *_record)
g_free (id_s);
g_object_unref (media);
- g_free(album);
- g_free(artist);
- g_free(genre);
- g_free(title);
- g_free(url);
+ g_free (album);
+ g_free (artist);
+ g_free (genre);
+ g_free (title);
+ g_free (url);
return --nextid;
}
@@ -359,11 +363,11 @@ grl_daap_db_search (GrlDAAPDb *db,
static void
dmap_db_interface_init (gpointer iface, gpointer data)
{
- DMAPDbIface *daap_db = iface;
+ DmapDbInterface *daap_db = iface;
g_assert (G_TYPE_FROM_INTERFACE (daap_db) == DMAP_TYPE_DB);
- daap_db->add = grl_daap_db_add;
+ daap_db->add = grl_daap_db_add_compat;
daap_db->lookup_by_id = grl_daap_db_lookup_by_id;
daap_db->foreach = grl_daap_db_foreach;
daap_db->count = grl_daap_db_count;
diff --git a/src/dmap/grl-daap-db.h b/src/dmap/grl-daap-db.h
index 2548c50..1a37a3a 100644
--- a/src/dmap/grl-daap-db.h
+++ b/src/dmap/grl-daap-db.h
@@ -24,6 +24,8 @@
#include <libdmapsharing/dmap.h>
#include <grilo.h>
+#include "grl-daap-compat.h"
+
G_BEGIN_DECLS
#define TYPE_GRL_DAAP_DB (grl_daap_db_get_type ())
diff --git a/src/dmap/grl-daap-record-factory.c b/src/dmap/grl-daap-record-factory.c
index 648fd85..d0c590f 100644
--- a/src/dmap/grl-daap-record-factory.c
+++ b/src/dmap/grl-daap-record-factory.c
@@ -1,5 +1,5 @@
/*
- * DAAPRecord factory class
+ * DmapAvRecord factory class
*
* Copyright (C) 2008 W. Michael Petullo <mike@flyn.org>
*
@@ -18,11 +18,16 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include <grilo.h>
+#include <libdmapsharing/dmap.h>
+
+#include "grl-daap-compat.h"
+#include "grl-common.h"
#include "grl-daap-record-factory.h"
#include "grl-daap-record.h"
-DMAPRecord *
-grl_daap_record_factory_create (DMAPRecordFactory *factory, gpointer user_data)
+DmapRecord *
+grl_daap_record_factory_create (DmapRecordFactory *factory, gpointer user_data, GError **error)
{
return DMAP_RECORD (grl_daap_record_new ());
}
@@ -40,11 +45,11 @@ grl_daap_record_factory_class_init (GrlDAAPRecordFactoryClass *klass)
static void
grl_daap_record_factory_interface_init (gpointer iface, gpointer data)
{
- DMAPRecordFactoryIface *factory = iface;
+ DmapRecordFactoryInterface *factory = iface;
g_assert (G_TYPE_FROM_INTERFACE (factory) == DMAP_TYPE_RECORD_FACTORY);
- factory->create = grl_daap_record_factory_create;
+ factory->create = grl_daap_record_factory_create_compat;
}
G_DEFINE_TYPE_WITH_CODE (GrlDAAPRecordFactory, grl_daap_record_factory, G_TYPE_OBJECT,
diff --git a/src/dmap/grl-daap-record-factory.h b/src/dmap/grl-daap-record-factory.h
index 45aa69a..f114bad 100644
--- a/src/dmap/grl-daap-record-factory.h
+++ b/src/dmap/grl-daap-record-factory.h
@@ -23,6 +23,8 @@
#include <libdmapsharing/dmap.h>
+#include "grl-daap-compat.h"
+
G_BEGIN_DECLS
#define TYPE_SIMPLE_DAAP_RECORD_FACTORY (grl_daap_record_factory_get_type ())
@@ -64,8 +66,6 @@ GType grl_daap_record_factory_get_type (void);
GrlDAAPRecordFactory *grl_daap_record_factory_new (void);
-DMAPRecord *grl_daap_record_factory_create (DMAPRecordFactory *factory, gpointer user_data);
-
#endif /* __SIMPLE_DAAP_RECORD_FACTORY */
G_END_DECLS
diff --git a/src/dmap/grl-daap-record.c b/src/dmap/grl-daap-record.c
index 82bf2f9..4fa0c54 100644
--- a/src/dmap/grl-daap-record.c
+++ b/src/dmap/grl-daap-record.c
@@ -20,6 +20,11 @@
*
*/
+#include <grilo.h>
+#include <libdmapsharing/dmap.h>
+
+#include "grl-daap-compat.h"
+#include "grl-common.h"
#include "grl-daap-record.h"
struct GrlDAAPRecordPrivate {
@@ -226,7 +231,7 @@ grl_daap_record_new (void)
}
GInputStream *
-grl_daap_record_read (DAAPRecord *record, GError **error)
+grl_daap_record_read (DmapAvRecord *record, GError **error)
{
GFile *file;
GInputStream *stream;
@@ -280,9 +285,9 @@ grl_daap_record_class_init (GrlDAAPRecordClass *klass)
static void
grl_daap_record_daap_iface_init (gpointer iface, gpointer data)
{
- DAAPRecordIface *daap_record = iface;
+ DmapAvRecordInterface *daap_record = iface;
- g_assert (G_TYPE_FROM_INTERFACE (daap_record) == DAAP_TYPE_RECORD);
+ g_assert (G_TYPE_FROM_INTERFACE (daap_record) == DMAP_TYPE_AV_RECORD);
daap_record->read = grl_daap_record_read;
}
@@ -290,7 +295,7 @@ grl_daap_record_daap_iface_init (gpointer iface, gpointer data)
static void
grl_daap_record_dmap_iface_init (gpointer iface, gpointer data)
{
- DMAPRecordIface *dmap_record = iface;
+ DmapRecordInterface *dmap_record = iface;
g_assert (G_TYPE_FROM_INTERFACE (dmap_record) == DMAP_TYPE_RECORD);
}
@@ -298,7 +303,7 @@ grl_daap_record_dmap_iface_init (gpointer iface, gpointer data)
G_DEFINE_TYPE_WITH_CODE (GrlDAAPRecord, grl_daap_record, G_TYPE_OBJECT,
G_ADD_PRIVATE (GrlDAAPRecord)
- G_IMPLEMENT_INTERFACE (DAAP_TYPE_RECORD, grl_daap_record_daap_iface_init)
+ G_IMPLEMENT_INTERFACE (DMAP_TYPE_AV_RECORD, grl_daap_record_daap_iface_init)
G_IMPLEMENT_INTERFACE (DMAP_TYPE_RECORD, grl_daap_record_dmap_iface_init))
static void
diff --git a/src/dmap/grl-daap-record.h b/src/dmap/grl-daap-record.h
index 7aae82d..42782b1 100644
--- a/src/dmap/grl-daap-record.h
+++ b/src/dmap/grl-daap-record.h
@@ -23,6 +23,8 @@
#include <libdmapsharing/dmap.h>
+#include "grl-daap-compat.h"
+
G_BEGIN_DECLS
#define TYPE_SIMPLE_DAAP_RECORD (grl_daap_record_get_type ())
@@ -69,8 +71,8 @@ typedef struct {
GType grl_daap_record_get_type (void);
GrlDAAPRecord *grl_daap_record_new (void);
-GInputStream *grl_daap_record_read (DAAPRecord *record, GError **error);
-gint grl_daap_record_get_id (DAAPRecord *record);
+GInputStream *grl_daap_record_read (DmapAvRecord *record, GError **error);
+gint grl_daap_record_get_id (DmapAvRecord *record);
#endif /* __SIMPLE_DAAP_RECORD */
diff --git a/src/dmap/grl-daap.c b/src/dmap/grl-daap.c
index f3c4115..962f2b8 100644
--- a/src/dmap/grl-daap.c
+++ b/src/dmap/grl-daap.c
@@ -33,6 +33,7 @@
#include <stdlib.h>
#include <libdmapsharing/dmap.h>
+#include "grl-daap-compat.h"
#include "grl-common.h"
#include "grl-daap.h"
#include "grl-daap-db.h"
@@ -52,12 +53,12 @@ GRL_LOG_DOMAIN_STATIC (daap_log_domain);
/* --- Grilo DAAP Private --- */
struct _GrlDaapSourcePrivate {
- DMAPMdnsBrowserService *service;
+ DmapMdnsService *service;
};
/* --- Data types --- */
-static GrlDaapSource *grl_daap_source_new (DMAPMdnsBrowserService *service);
+static GrlDaapSource *grl_daap_source_new (DmapMdnsService *service);
static void grl_daap_source_finalize (GObject *object);
@@ -74,16 +75,16 @@ static void grl_daap_source_search (GrlSource *source,
GrlSourceSearchSpec *ss);
-static void grl_daap_service_added_cb (DMAPMdnsBrowser *browser,
- DMAPMdnsBrowserService *service,
+static void grl_daap_service_added_cb (DmapMdnsBrowser *browser,
+ DmapMdnsService *service,
GrlPlugin *plugin);
-static void grl_daap_service_removed_cb (DMAPMdnsBrowser *browser,
+static void grl_daap_service_removed_cb (DmapMdnsBrowser *browser,
const gchar *service_name,
GrlPlugin *plugin);
/* ===================== Globals ======================= */
-static DMAPMdnsBrowser *browser;
+static DmapMdnsBrowser *browser;
/* Maps URIs to DBs */
static GHashTable *connections;
/* Map DAAP services to Grilo media sources */
@@ -106,7 +107,7 @@ grl_daap_plugin_init (GrlRegistry *registry,
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
- browser = dmap_mdns_browser_new (DMAP_MDNS_BROWSER_SERVICE_TYPE_DAAP);
+ browser = dmap_mdns_browser_new (DMAP_MDNS_SERVICE_TYPE_DAAP);
connections = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
sources = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
@@ -153,8 +154,10 @@ GRL_PLUGIN_DEFINE (GRL_MAJOR,
G_DEFINE_TYPE_WITH_PRIVATE (GrlDaapSource, grl_daap_source, GRL_TYPE_SOURCE)
static GrlDaapSource *
-grl_daap_source_new (DMAPMdnsBrowserService *service)
+grl_daap_source_new (DmapMdnsService *service)
{
+ gchar *name;
+ gchar *service_name;
gchar *source_desc;
gchar *source_id;
@@ -162,12 +165,15 @@ grl_daap_source_new (DMAPMdnsBrowserService *service)
GRL_DEBUG ("grl_daap_source_new");
- source_desc = g_strdup_printf (SOURCE_DESC_TEMPLATE, service->name);
- source_id = g_strdup_printf (SOURCE_ID_TEMPLATE, service->name);
+ name = grl_dmap_service_get_name (service);
+ service_name = grl_dmap_service_get_service_name (service);
+
+ source_desc = g_strdup_printf (SOURCE_DESC_TEMPLATE, name);
+ source_id = g_strdup_printf (SOURCE_ID_TEMPLATE, name);
source = g_object_new (GRL_DAAP_SOURCE_TYPE,
"source-id", source_id,
- "source-name", service->name,
+ "source-name", service_name,
"source-desc", source_desc,
"supported-media", GRL_SUPPORTED_MEDIA_AUDIO,
NULL);
@@ -176,6 +182,8 @@ grl_daap_source_new (DMAPMdnsBrowserService *service)
g_free (source_desc);
g_free (source_id);
+ g_free (service_name);
+ g_free (name);
return source;
}
@@ -209,7 +217,7 @@ grl_daap_source_finalize (GObject *object)
static void
grl_daap_do_browse (ResultCbAndArgsAndDb *cb_and_db)
{
- grl_daap_db_browse (GRL_DAAP_DB(cb_and_db->db),
+ grl_daap_db_browse (GRL_DAAP_DB (cb_and_db->db),
cb_and_db->cb.container,
cb_and_db->cb.source,
cb_and_db->cb.op_id,
@@ -236,7 +244,7 @@ grl_daap_do_search (ResultCbAndArgsAndDb *cb_and_db)
}
static void
-browse_connected_cb (DMAPConnection *connection,
+browse_connected_cb (DmapConnection *connection,
gboolean result,
const char *reason,
ResultCbAndArgsAndDb *cb_and_db)
@@ -261,7 +269,7 @@ browse_connected_cb (DMAPConnection *connection,
}
static void
-search_connected_cb (DMAPConnection *connection,
+search_connected_cb (DmapConnection *connection,
gboolean result,
const char *reason,
ResultCbAndArgsAndDb *cb_and_db)
@@ -286,8 +294,8 @@ search_connected_cb (DMAPConnection *connection,
}
static void
-grl_daap_service_added_cb (DMAPMdnsBrowser *browser,
- DMAPMdnsBrowserService *service,
+grl_daap_service_added_cb (DmapMdnsBrowser *browser,
+ DmapMdnsService *service,
GrlPlugin *plugin)
{
GrlRegistry *registry = grl_registry_get_default ();
@@ -301,13 +309,16 @@ grl_daap_service_added_cb (DMAPMdnsBrowser *browser,
GRL_SOURCE (source),
NULL);
if (source != NULL) {
- g_hash_table_insert (sources, g_strdup (service->name), g_object_ref (source));
+ gchar *name;
+ name = grl_dmap_service_get_name (service);
+ g_hash_table_insert (sources, g_strdup (name), g_object_ref (source));
g_object_remove_weak_pointer (G_OBJECT (source), (gpointer *) &source);
+ g_free (name);
}
}
static void
-grl_daap_service_removed_cb (DMAPMdnsBrowser *browser,
+grl_daap_service_removed_cb (DmapMdnsBrowser *browser,
const gchar *service_name,
GrlPlugin *plugin)
{
@@ -323,14 +334,14 @@ grl_daap_service_removed_cb (DMAPMdnsBrowser *browser,
}
static void
-grl_daap_connect (gchar *name, gchar *host, guint port, ResultCbAndArgsAndDb *cb_and_db, DMAPConnectionCallback callback)
+grl_daap_connect (gchar *name, gchar *host, guint port, ResultCbAndArgsAndDb *cb_and_db, DmapConnectionFunc callback)
{
- DMAPRecordFactory *factory;
- DMAPConnection *connection;
+ DmapRecordFactory *factory;
+ DmapConnection *connection;
factory = DMAP_RECORD_FACTORY (grl_daap_record_factory_new ());
- connection = DMAP_CONNECTION (daap_connection_new (name, host, port, DMAP_DB (cb_and_db->db), factory));
- dmap_connection_connect (connection, (DMAPConnectionCallback) callback, cb_and_db);
+ connection = DMAP_CONNECTION (dmap_av_connection_new (name, host, port, DMAP_DB (cb_and_db->db), factory));
+ dmap_connection_start (connection, (DmapConnectionFunc) callback, cb_and_db);
}
static gboolean
@@ -397,15 +408,25 @@ grl_daap_source_browse (GrlSource *source,
browse_connected_cb (NULL, TRUE, NULL, cb_and_db);
} else {
/* Connect */
+ gchar *name, *host;
+ guint port;
+
cb_and_db->db = DMAP_DB (grl_daap_db_new ());
- grl_daap_connect (dmap_source->priv->service->name,
- dmap_source->priv->service->host,
- dmap_source->priv->service->port,
+ name = grl_dmap_service_get_name (dmap_source->priv->service);
+ host = grl_dmap_service_get_host (dmap_source->priv->service);
+ port = grl_dmap_service_get_port (dmap_source->priv->service);
+
+ grl_daap_connect (name,
+ host,
+ port,
cb_and_db,
- (DMAPConnectionCallback) browse_connected_cb);
+ (DmapConnectionFunc) browse_connected_cb);
g_hash_table_insert (connections, g_strdup (url), cb_and_db->db);
+
+ g_free (name);
+ g_free (host);
}
g_free (url);
@@ -417,7 +438,7 @@ static void grl_daap_source_search (GrlSource *source,
GrlDaapSource *dmap_source = GRL_DAAP_SOURCE (source);
ResultCbAndArgsAndDb *cb_and_db;
- DMAPMdnsBrowserService *service = dmap_source->priv->service;
+ DmapMdnsService *service = dmap_source->priv->service;
gchar *url = grl_dmap_build_url (service);
cb_and_db = g_new (ResultCbAndArgsAndDb, 1);
@@ -435,9 +456,25 @@ static void grl_daap_source_search (GrlSource *source,
search_connected_cb (NULL, TRUE, NULL, cb_and_db);
} else {
/* Connect */
+ gchar *name, *host;
+ guint port;
+
cb_and_db->db = DMAP_DB (grl_daap_db_new ());
- grl_daap_connect (service->name, service->host, service->port, cb_and_db, (DMAPConnectionCallback) search_connected_cb);
+
+ name = grl_dmap_service_get_name (dmap_source->priv->service);
+ host = grl_dmap_service_get_host (dmap_source->priv->service);
+ port = grl_dmap_service_get_port (dmap_source->priv->service);
+
+ grl_daap_connect (name,
+ host,
+ port,
+ cb_and_db,
+ (DmapConnectionFunc) search_connected_cb);
+
g_hash_table_insert (connections, g_strdup (url), cb_and_db->db);
+
+ g_free (name);
+ g_free (host);
}
g_free (url);
diff --git a/src/dmap/grl-daap.h b/src/dmap/grl-daap.h
index 1119495..5271435 100644
--- a/src/dmap/grl-daap.h
+++ b/src/dmap/grl-daap.h
@@ -26,6 +26,8 @@
#include <grilo.h>
+#include "grl-daap-compat.h"
+
#define GRL_DAAP_SOURCE_TYPE (grl_daap_source_get_type ())
#define GRL_DAAP_SOURCE(obj) \
diff --git a/src/dmap/grl-dmap-compat.h b/src/dmap/grl-dmap-compat.h
new file mode 100644
index 0000000..cd1934f
--- /dev/null
+++ b/src/dmap/grl-dmap-compat.h
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2019 W. Michael Petullo
+ * Copyright (C) 2019 Igalia S.L.
+ *
+ * Contact: 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; 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 _GRL_DMAP_COMPAT_H_
+#define _GRL_DMAP_COMPAT_H_
+
+#ifdef LIBDMAPSHARING_COMPAT
+
+/* Building against libdmapsharing 3 API. */
+
+#define DmapConnection DMAPConnection
+#define DmapConnectionFunc DMAPConnectionCallback
+#define dmap_connection_start dmap_connection_connect
+#define DmapDb DMAPDb
+#define DmapDbInterface DMAPDbIface
+#define DmapIdRecordFunc GHFunc
+#define DmapMdnsBrowser DMAPMdnsBrowser
+#define DmapMdnsService DMAPMdnsBrowserService
+#define DMAP_MDNS_SERVICE_TYPE_DAAP DMAP_MDNS_BROWSER_SERVICE_TYPE_DAAP
+#define DMAP_MDNS_SERVICE_TYPE_DPAP DMAP_MDNS_BROWSER_SERVICE_TYPE_DPAP
+#define DmapRecord DMAPRecord
+#define DmapRecordFactory DMAPRecordFactory
+#define DmapRecordFactoryInterface DMAPRecordFactoryIface
+#define DmapRecordInterface DMAPRecordIface
+
+static inline gchar *
+grl_dmap_service_get_name (DmapMdnsService *service)
+{
+ return g_strdup (service->name);
+}
+
+static inline gchar *
+grl_dmap_service_get_service_name (DmapMdnsService *service)
+{
+ return g_strdup (service->service_name);
+}
+
+static inline gchar *
+grl_dmap_service_get_host (DmapMdnsService *service)
+{
+ return g_strdup (service->host);
+}
+
+static inline guint
+grl_dmap_service_get_port (DmapMdnsService *service)
+{
+ return service->port;
+}
+
+#else
+
+/* Building against libdmapsharing 4 API. */
+
+static inline gchar *
+grl_dmap_service_get_name (DmapMdnsService *service)
+{
+ gchar *name;
+ g_object_get (service, "name", &name, NULL);
+ return name;
+}
+
+static inline gchar *
+grl_dmap_service_get_service_name (DmapMdnsService *service)
+{
+ gchar *service_name;
+ g_object_get (service, "service-name", &service_name, NULL);
+ return service_name;
+}
+
+static inline gchar *
+grl_dmap_service_get_host (DmapMdnsService *service)
+{
+ gchar *host;
+ g_object_get (service, "host", &host, NULL);
+ return host;
+}
+
+static inline guint
+grl_dmap_service_get_port (DmapMdnsService *service)
+{
+ guint port;
+ g_object_get (service, "port", &port, NULL);
+ return port;
+}
+
+#endif
+
+#endif /* _GRL_DMAP_COMPAT_H_ */
diff --git a/src/dmap/grl-dpap-compat.h b/src/dmap/grl-dpap-compat.h
new file mode 100644
index 0000000..b996464
--- /dev/null
+++ b/src/dmap/grl-dpap-compat.h
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2019 W. Michael Petullo
+ * Copyright (C) 2019 Igalia S.L.
+ *
+ * Contact: 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; 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 _GRL_DPAP_COMPAT_H_
+#define _GRL_DPAP_COMPAT_H_
+
+#include "grl-dmap-compat.h"
+
+#ifdef LIBDMAPSHARING_COMPAT
+
+DMAPRecord *grl_dpap_record_factory_create (DMAPRecordFactory *factory, gpointer user_data, GError **error);
+guint grl_dpap_db_add (DMAPDb *_db, DMAPRecord *_record, GError **error);
+
+/* Building against libdmapsharing 3 API. */
+
+#define dmap_image_connection_new dpap_connection_new
+#define DmapImageRecord DPAPRecord
+#define DmapImageRecordInterface DPAPRecordIface
+#define DMAP_IMAGE_RECORD DPAP_RECORD
+#define DMAP_TYPE_IMAGE_RECORD DPAP_TYPE_RECORD
+#define IS_DMAP_IMAGE_RECORD IS_DPAP_RECORD
+
+static inline DmapRecord *
+grl_dpap_record_factory_create_compat (DmapRecordFactory *factory, gpointer user_data)
+{
+ return grl_dpap_record_factory_create (factory, user_data, NULL);
+}
+
+static inline void
+set_thumbnail (GValue *value, GByteArray *thumbnail)
+{
+ g_value_set_pointer (value, thumbnail);
+}
+
+static inline GByteArray *
+get_thumbnail (GByteArray *thumbnail, const GValue *value)
+{
+ if (thumbnail)
+ g_byte_array_unref (thumbnail);
+ return g_byte_array_ref (g_value_get_pointer (value));
+}
+
+static inline void
+unref_thumbnail (GByteArray *thumbnail)
+{
+ g_byte_array_unref (thumbnail);
+}
+
+static inline guint
+grl_dpap_db_add_compat (DMAPDb *_db, DmapRecord *_record)
+{
+ return grl_dpap_db_add (_db, _record, NULL);
+}
+
+#else
+
+/* Building against libdmapsharing 4 API. */
+
+DmapRecord *grl_dpap_record_factory_create (DmapRecordFactory *factory, gpointer user_data, GError **error);
+guint grl_dpap_db_add (DmapDb *_db, DmapRecord *_record, GError **error);
+
+static inline void
+set_thumbnail (GValue *value, GArray *thumbnail)
+{
+ g_value_set_boxed (value, thumbnail);
+}
+
+static inline GArray *
+get_thumbnail (GArray *thumbnail, const GValue *value)
+{
+ if (thumbnail)
+ g_array_unref (thumbnail);
+ return g_value_get_boxed (value);
+}
+
+static inline void
+unref_thumbnail (GArray *thumbnail)
+{
+ g_array_unref (thumbnail);
+}
+
+static inline DmapRecord *
+grl_dpap_record_factory_create_compat (DmapRecordFactory *factory, gpointer user_data, GError **error)
+{
+ return grl_dpap_record_factory_create (factory, user_data, error);
+}
+
+static inline guint
+grl_dpap_db_add_compat (DmapDb *_db, DmapRecord *_record, GError **error)
+{
+ return grl_dpap_db_add (_db, _record, error);
+}
+
+#endif
+
+#endif /* _GRL_DPAP_COMPAT_H_ */
diff --git a/src/dmap/grl-dpap-db.c b/src/dmap/grl-dpap-db.c
index 8be278b..cd647ee 100644
--- a/src/dmap/grl-dpap-db.c
+++ b/src/dmap/grl-dpap-db.c
@@ -24,12 +24,16 @@
#include "config.h"
#endif
+#include <grilo.h>
#include <glib/gi18n-lib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <glib.h>
#include <string.h>
+#include <libdmapsharing/dmap.h>
+#include "grl-dpap-compat.h"
+#include "grl-common.h"
#include "grl-dpap-db.h"
#define PHOTOS_ID "photos"
@@ -71,23 +75,23 @@ grl_dpap_db_new (void)
return db;
}
-static DMAPRecord *
-grl_dpap_db_lookup_by_id (const DMAPDb *db, guint id)
+static DmapRecord *
+grl_dpap_db_lookup_by_id (const DmapDb *db, guint id)
{
g_warning ("Not implemented");
return NULL;
}
static void
-grl_dpap_db_foreach (const DMAPDb *db,
- GHFunc func,
+grl_dpap_db_foreach (const DmapDb *db,
+ DmapIdRecordFunc func,
gpointer data)
{
g_warning ("Not implemented");
}
static gint64
-grl_dpap_db_count (const DMAPDb *db)
+grl_dpap_db_count (const DmapDb *db)
{
g_warning ("Not implemented");
return 0;
@@ -118,21 +122,21 @@ set_insert (GHashTable *category, const char *category_name, char *set_name, Grl
g_object_unref (container);
}
-static guint
-grl_dpap_db_add (DMAPDb *_db, DMAPRecord *_record)
+guint
+grl_dpap_db_add (DmapDb *_db, DmapRecord *_record, GError **error)
{
g_assert (IS_GRL_DPAP_DB (_db));
- g_assert (IS_DPAP_RECORD (_record));
+ g_assert (IS_DMAP_IMAGE_RECORD (_record));
GrlDPAPDb *db = GRL_DPAP_DB (_db);
- DPAPRecord *record = DPAP_RECORD (_record);
+ DmapImageRecord *record = DMAP_IMAGE_RECORD (_record);
gint height = 0,
width = 0,
largefilesize = 0,
creationdate = 0,
rating = 0;
- GByteArray *thumbnail = NULL;
+ GArray *thumbnail = NULL;
gchar *id_s = NULL,
*filename = NULL,
*aspectratio = NULL,
@@ -177,12 +181,12 @@ grl_dpap_db_add (DMAPDb *_db, DMAPRecord *_record)
g_free (id_s);
g_object_unref (media);
- g_free(filename);
- g_free(aspectratio);
- g_free(format);
- g_free(comments);
- g_free(url);
- g_byte_array_unref(thumbnail);
+ g_free (filename);
+ g_free (aspectratio);
+ g_free (format);
+ g_free (comments);
+ g_free (url);
+ g_array_unref (thumbnail);
return --nextid;
}
@@ -298,11 +302,11 @@ grl_dpap_db_search (GrlDPAPDb *db,
static void
dmap_db_interface_init (gpointer iface, gpointer data)
{
- DMAPDbIface *dpap_db = iface;
+ DmapDbInterface *dpap_db = iface;
g_assert (G_TYPE_FROM_INTERFACE (dpap_db) == DMAP_TYPE_DB);
- dpap_db->add = grl_dpap_db_add;
+ dpap_db->add = grl_dpap_db_add_compat;
dpap_db->lookup_by_id = grl_dpap_db_lookup_by_id;
dpap_db->foreach = grl_dpap_db_foreach;
dpap_db->count = grl_dpap_db_count;
diff --git a/src/dmap/grl-dpap-db.h b/src/dmap/grl-dpap-db.h
index d3abcba..a21ad7a 100644
--- a/src/dmap/grl-dpap-db.h
+++ b/src/dmap/grl-dpap-db.h
@@ -24,6 +24,8 @@
#include <libdmapsharing/dmap.h>
#include <grilo.h>
+#include "grl-dpap-compat.h"
+
G_BEGIN_DECLS
#define TYPE_GRL_DPAP_DB (grl_dpap_db_get_type ())
diff --git a/src/dmap/grl-dpap-record-factory.c b/src/dmap/grl-dpap-record-factory.c
index 3d0c87a..860d957 100644
--- a/src/dmap/grl-dpap-record-factory.c
+++ b/src/dmap/grl-dpap-record-factory.c
@@ -18,11 +18,18 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include <grilo.h>
+#include <libdmapsharing/dmap.h>
+
+#include "grl-dpap-compat.h"
+#include "grl-common.h"
#include "grl-dpap-record-factory.h"
#include "grl-dpap-record.h"
-DMAPRecord *
-grl_dpap_record_factory_create (DMAPRecordFactory *factory, gpointer user_data)
+DmapRecord *
+grl_dpap_record_factory_create (DmapRecordFactory *factory,
+ gpointer user_data,
+ GError **error)
{
return DMAP_RECORD (grl_dpap_record_new ());
}
@@ -40,11 +47,11 @@ grl_dpap_record_factory_class_init (GrlDPAPRecordFactoryClass *klass)
static void
grl_dpap_record_factory_interface_init (gpointer iface, gpointer data)
{
- DMAPRecordFactoryIface *factory = iface;
+ DmapRecordFactoryInterface *factory = iface;
g_assert (G_TYPE_FROM_INTERFACE (factory) == DMAP_TYPE_RECORD_FACTORY);
- factory->create = grl_dpap_record_factory_create;
+ factory->create = grl_dpap_record_factory_create_compat;
}
G_DEFINE_TYPE_WITH_CODE (GrlDPAPRecordFactory, grl_dpap_record_factory, G_TYPE_OBJECT,
diff --git a/src/dmap/grl-dpap-record-factory.h b/src/dmap/grl-dpap-record-factory.h
index 3f4ca54..899fd0a 100644
--- a/src/dmap/grl-dpap-record-factory.h
+++ b/src/dmap/grl-dpap-record-factory.h
@@ -23,6 +23,8 @@
#include <libdmapsharing/dmap.h>
+#include "grl-dpap-compat.h"
+
G_BEGIN_DECLS
#define TYPE_SIMPLE_DPAP_RECORD_FACTORY (grl_dpap_record_factory_get_type ())
@@ -64,7 +66,7 @@ GType grl_dpap_record_factory_get_type (void);
GrlDPAPRecordFactory *grl_dpap_record_factory_new (void);
-DMAPRecord *grl_dpap_record_factory_create (DMAPRecordFactory *factory, gpointer user_data);
+DmapRecord *grl_dpap_record_factory_create (DmapRecordFactory *factory, gpointer user_data, GError **error);
#endif /* __SIMPLE_DPAP_RECORD_FACTORY */
diff --git a/src/dmap/grl-dpap-record.c b/src/dmap/grl-dpap-record.c
index 14eb1de..0afb2b8 100644
--- a/src/dmap/grl-dpap-record.c
+++ b/src/dmap/grl-dpap-record.c
@@ -20,6 +20,11 @@
*
*/
+#include <grilo.h>
+#include <libdmapsharing/dmap.h>
+
+#include "grl-dpap-compat.h"
+#include "grl-common.h"
#include "grl-dpap-record.h"
struct GrlDPAPRecordPrivate {
@@ -28,7 +33,7 @@ struct GrlDPAPRecordPrivate {
gint creationdate;
gint rating;
char *filename;
- GByteArray *thumbnail;
+ void *thumbnail; /* GByteArray or GArray, depending on libdmapsharing ver. */
char *aspectratio;
gint height;
gint width;
@@ -56,7 +61,7 @@ static void grl_dpap_record_dpap_iface_init (gpointer iface, gpointer data);
G_DEFINE_TYPE_WITH_CODE (GrlDPAPRecord, grl_dpap_record, G_TYPE_OBJECT,
G_ADD_PRIVATE (GrlDPAPRecord)
- G_IMPLEMENT_INTERFACE (DPAP_TYPE_RECORD, grl_dpap_record_dpap_iface_init)
+ G_IMPLEMENT_INTERFACE (DMAP_TYPE_IMAGE_RECORD, grl_dpap_record_dpap_iface_init)
G_IMPLEMENT_INTERFACE (DMAP_TYPE_RECORD, grl_dpap_record_dmap_iface_init))
static void
@@ -104,9 +109,7 @@ grl_dpap_record_set_property (GObject *object,
record->priv->comments = g_value_dup_string (value);
break;
case PROP_THUMBNAIL:
- if (record->priv->thumbnail)
- g_byte_array_unref (record->priv->thumbnail);
- record->priv->thumbnail = g_byte_array_ref (g_value_get_pointer (value));
+ record->priv->thumbnail = get_thumbnail (record->priv->thumbnail, value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -154,7 +157,7 @@ grl_dpap_record_get_property (GObject *object,
g_value_set_static_string (value, record->priv->comments);
break;
case PROP_THUMBNAIL:
- g_value_set_pointer (value, record->priv->thumbnail);
+ set_thumbnail (value, record->priv->thumbnail);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -169,7 +172,7 @@ grl_dpap_record_new (void)
}
GInputStream *
-grl_dpap_record_read (DPAPRecord *record, GError **error)
+grl_dpap_record_read (DmapImageRecord *record, GError **error)
{
GFile *file;
GInputStream *stream;
@@ -215,9 +218,9 @@ grl_dpap_record_class_init (GrlDPAPRecordClass *klass)
static void
grl_dpap_record_dpap_iface_init (gpointer iface, gpointer data)
{
- DPAPRecordIface *dpap_record = iface;
+ DmapImageRecordInterface *dpap_record = iface;
- g_assert (G_TYPE_FROM_INTERFACE (dpap_record) == DPAP_TYPE_RECORD);
+ g_assert (G_TYPE_FROM_INTERFACE (dpap_record) == DMAP_TYPE_IMAGE_RECORD);
dpap_record->read = grl_dpap_record_read;
}
@@ -225,7 +228,7 @@ grl_dpap_record_dpap_iface_init (gpointer iface, gpointer data)
static void
grl_dpap_record_dmap_iface_init (gpointer iface, gpointer data)
{
- DMAPRecordIface *dmap_record = iface;
+ DmapRecordInterface *dmap_record = iface;
g_assert (G_TYPE_FROM_INTERFACE (dmap_record) == DMAP_TYPE_RECORD);
}
@@ -242,7 +245,7 @@ grl_dpap_record_finalize (GObject *object)
g_free (record->priv->comments);
if (record->priv->thumbnail)
- g_byte_array_unref (record->priv->thumbnail);
+ unref_thumbnail (record->priv->thumbnail);
G_OBJECT_CLASS (grl_dpap_record_parent_class)->finalize (object);
}
diff --git a/src/dmap/grl-dpap-record.h b/src/dmap/grl-dpap-record.h
index 203e57e..77eece0 100644
--- a/src/dmap/grl-dpap-record.h
+++ b/src/dmap/grl-dpap-record.h
@@ -23,6 +23,8 @@
#include <libdmapsharing/dmap.h>
+#include "grl-dpap-compat.h"
+
G_BEGIN_DECLS
#define TYPE_SIMPLE_DPAP_RECORD (grl_dpap_record_get_type ())
@@ -69,8 +71,8 @@ typedef struct {
GType grl_dpap_record_get_type (void);
GrlDPAPRecord *grl_dpap_record_new (void);
-GInputStream *grl_dpap_record_read (DPAPRecord *record, GError **error);
-gint grl_dpap_record_get_id (DPAPRecord *record);
+GInputStream *grl_dpap_record_read (DmapImageRecord *record, GError **error);
+gint grl_dpap_record_get_id (DmapImageRecord *record);
#endif /* __SIMPLE_DPAP_RECORD */
diff --git a/src/dmap/grl-dpap.c b/src/dmap/grl-dpap.c
index 9829ec2..6339654 100644
--- a/src/dmap/grl-dpap.c
+++ b/src/dmap/grl-dpap.c
@@ -33,6 +33,7 @@
#include <stdlib.h>
#include <libdmapsharing/dmap.h>
+#include "grl-dpap-compat.h"
#include "grl-common.h"
#include "grl-dpap.h"
#include "grl-dpap-db.h"
@@ -57,12 +58,12 @@ GRL_LOG_DOMAIN_STATIC (dmap_log_domain);
GrlDpapSourcePrivate))
struct _GrlDpapSourcePrivate {
- DMAPMdnsBrowserService *service;
+ DmapMdnsService *service;
};
/* --- Data types --- */
-static GrlDpapSource *grl_dpap_source_new (DMAPMdnsBrowserService *service);
+static GrlDpapSource *grl_dpap_source_new (DmapMdnsService *service);
static void grl_dpap_source_finalize (GObject *object);
@@ -79,16 +80,16 @@ static void grl_dpap_source_search (GrlSource *source,
GrlSourceSearchSpec *ss);
-static void grl_dpap_service_added_cb (DMAPMdnsBrowser *browser,
- DMAPMdnsBrowserService *service,
+static void grl_dpap_service_added_cb (DmapMdnsBrowser *browser,
+ DmapMdnsService *service,
GrlPlugin *plugin);
-static void grl_dpap_service_removed_cb (DMAPMdnsBrowser *browser,
+static void grl_dpap_service_removed_cb (DmapMdnsBrowser *browser,
const gchar *service_name,
GrlPlugin *plugin);
/* ===================== Globals ======================= */
-static DMAPMdnsBrowser *browser;
+static DmapMdnsBrowser *browser;
/* Maps URIs to DBs */
static GHashTable *connections;
/* Map DPAP services to Grilo media sources */
@@ -111,7 +112,7 @@ grl_dpap_plugin_init (GrlRegistry *registry,
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
- browser = dmap_mdns_browser_new (DMAP_MDNS_BROWSER_SERVICE_TYPE_DPAP);
+ browser = dmap_mdns_browser_new (DMAP_MDNS_SERVICE_TYPE_DPAP);
connections = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
sources = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
@@ -158,8 +159,10 @@ GRL_PLUGIN_DEFINE (GRL_MAJOR,
G_DEFINE_TYPE_WITH_PRIVATE (GrlDpapSource, grl_dpap_source, GRL_TYPE_SOURCE)
static GrlDpapSource *
-grl_dpap_source_new (DMAPMdnsBrowserService *service)
+grl_dpap_source_new (DmapMdnsService *service)
{
+ gchar *name;
+ gchar *service_name;
gchar *source_desc;
gchar *source_id;
@@ -167,12 +170,14 @@ grl_dpap_source_new (DMAPMdnsBrowserService *service)
GRL_DEBUG ("grl_dpap_source_new");
- source_desc = g_strdup_printf (SOURCE_DESC_TEMPLATE, service->name);
- source_id = g_strdup_printf (SOURCE_ID_TEMPLATE, service->name);
+ name = grl_dmap_service_get_name (service);
+ service_name = grl_dmap_service_get_service_name (service);
+ source_desc = g_strdup_printf (SOURCE_DESC_TEMPLATE, name);
+ source_id = g_strdup_printf (SOURCE_ID_TEMPLATE, name);
source = g_object_new (GRL_DPAP_SOURCE_TYPE,
"source-id", source_id,
- "source-name", service->name,
+ "source-name", service_name,
"source-desc", source_desc,
"supported-media", GRL_SUPPORTED_MEDIA_IMAGE,
NULL);
@@ -181,6 +186,8 @@ grl_dpap_source_new (DMAPMdnsBrowserService *service)
g_free (source_desc);
g_free (source_id);
+ g_free (service_name);
+ g_free (name);
return source;
}
@@ -241,7 +248,7 @@ grl_dpap_do_search (ResultCbAndArgsAndDb *cb_and_db)
}
static void
-browse_connected_cb (DMAPConnection *connection,
+browse_connected_cb (DmapConnection *connection,
gboolean result,
const char *reason,
ResultCbAndArgsAndDb *cb_and_db)
@@ -266,7 +273,7 @@ browse_connected_cb (DMAPConnection *connection,
}
static void
-search_connected_cb (DMAPConnection *connection,
+search_connected_cb (DmapConnection *connection,
gboolean result,
const char *reason,
ResultCbAndArgsAndDb *cb_and_db)
@@ -291,8 +298,8 @@ search_connected_cb (DMAPConnection *connection,
}
static void
-grl_dpap_service_added_cb (DMAPMdnsBrowser *browser,
- DMAPMdnsBrowserService *service,
+grl_dpap_service_added_cb (DmapMdnsBrowser *browser,
+ DmapMdnsService *service,
GrlPlugin *plugin)
{
GrlRegistry *registry = grl_registry_get_default ();
@@ -306,13 +313,16 @@ grl_dpap_service_added_cb (DMAPMdnsBrowser *browser,
GRL_SOURCE (source),
NULL);
if (source != NULL) {
- g_hash_table_insert (sources, g_strdup (service->name), g_object_ref (source));
+ gchar *name;
+ name = grl_dmap_service_get_name (service);
+ g_hash_table_insert (sources, g_strdup (name), g_object_ref (source));
g_object_remove_weak_pointer (G_OBJECT (source), (gpointer *) &source);
+ g_free (name);
}
}
static void
-grl_dpap_service_removed_cb (DMAPMdnsBrowser *browser,
+grl_dpap_service_removed_cb (DmapMdnsBrowser *browser,
const gchar *service_name,
GrlPlugin *plugin)
{
@@ -328,14 +338,14 @@ grl_dpap_service_removed_cb (DMAPMdnsBrowser *browser,
}
static void
-grl_dpap_connect (gchar *name, gchar *host, guint port, ResultCbAndArgsAndDb *cb_and_db, DMAPConnectionCallback callback)
+grl_dpap_connect (gchar *name, gchar *host, guint port, ResultCbAndArgsAndDb *cb_and_db, DmapConnectionFunc callback)
{
- DMAPRecordFactory *factory;
- DMAPConnection *connection;
+ DmapRecordFactory *factory;
+ DmapConnection *connection;
factory = DMAP_RECORD_FACTORY (grl_dpap_record_factory_new ());
- connection = DMAP_CONNECTION (dpap_connection_new (name, host, port, DMAP_DB (cb_and_db->db), factory));
- dmap_connection_connect (connection, (DMAPConnectionCallback) callback, cb_and_db);
+ connection = DMAP_CONNECTION (dmap_image_connection_new (name, host, port, DMAP_DB (cb_and_db->db), factory));
+ dmap_connection_start (connection, (DmapConnectionFunc) callback, cb_and_db);
}
static gboolean
@@ -396,15 +406,25 @@ grl_dpap_source_browse (GrlSource *source,
browse_connected_cb (NULL, TRUE, NULL, cb_and_db);
} else {
/* Connect */
+ gchar *name, *host;
+ guint port;
+
cb_and_db->db = DMAP_DB (grl_dpap_db_new ());
- grl_dpap_connect (dmap_source->priv->service->name,
- dmap_source->priv->service->host,
- dmap_source->priv->service->port,
+ name = grl_dmap_service_get_name (dmap_source->priv->service);
+ host = grl_dmap_service_get_host (dmap_source->priv->service);
+ port = grl_dmap_service_get_port (dmap_source->priv->service);
+
+ grl_dpap_connect (name,
+ host,
+ port,
cb_and_db,
- (DMAPConnectionCallback) browse_connected_cb);
+ (DmapConnectionFunc) browse_connected_cb);
g_hash_table_insert (connections, g_strdup (url), cb_and_db->db);
+
+ g_free (name);
+ g_free (host);
}
g_free (url);
@@ -416,7 +436,7 @@ static void grl_dpap_source_search (GrlSource *source,
GrlDpapSource *dmap_source = GRL_DPAP_SOURCE (source);
ResultCbAndArgsAndDb *cb_and_db;
- DMAPMdnsBrowserService *service = dmap_source->priv->service;
+ DmapMdnsService *service = dmap_source->priv->service;
gchar *url = grl_dmap_build_url (service);
cb_and_db = g_new (ResultCbAndArgsAndDb, 1);
@@ -434,9 +454,25 @@ static void grl_dpap_source_search (GrlSource *source,
search_connected_cb (NULL, TRUE, NULL, cb_and_db);
} else {
/* Connect */
+ gchar *name, *host;
+ guint port;
+
cb_and_db->db = DMAP_DB (grl_dpap_db_new ());
- grl_dpap_connect (service->name, service->host, service->port, cb_and_db, (DMAPConnectionCallback) search_connected_cb);
+
+ name = grl_dmap_service_get_name (dmap_source->priv->service);
+ host = grl_dmap_service_get_host (dmap_source->priv->service);
+ port = grl_dmap_service_get_port (dmap_source->priv->service);
+
+ grl_dpap_connect (name,
+ host,
+ port,
+ cb_and_db,
+ (DmapConnectionFunc) search_connected_cb);
+
g_hash_table_insert (connections, g_strdup (url), cb_and_db->db);
+
+ g_free (name);
+ g_free (host);
}
g_free (url);
diff --git a/src/dmap/grl-dpap.h b/src/dmap/grl-dpap.h
index ee596b5..30cd61e 100644
--- a/src/dmap/grl-dpap.h
+++ b/src/dmap/grl-dpap.h
@@ -26,6 +26,8 @@
#include <grilo.h>
+#include "grl-dpap-compat.h"
+
#define GRL_DPAP_SOURCE_TYPE (grl_dpap_source_get_type ())
#define GRL_DPAP_SOURCE(obj) \
diff --git a/src/dmap/meson.build b/src/dmap/meson.build
index 2907a80..817ff5d 100644
--- a/src/dmap/meson.build
+++ b/src/dmap/meson.build
@@ -31,6 +31,15 @@ dpap_sources = [
'grl-dpap.h',
]
+args = [
+ '-DG_LOG_DOMAIN="GrlDmap"',
+ '-DHAVE_CONFIG_H',
+]
+
+if not libdmapsharing4_dep.found()
+ args += '-DLIBDMAPSHARING_COMPAT'
+endif
+
configure_file(output: 'config.h',
configuration: cdata)
@@ -39,17 +48,11 @@ shared_library('grldaap',
install: true,
install_dir: pluginsdir,
dependencies: must_deps + plugins[dmap_idx][REQ_DEPS] + plugins[dmap_idx][OPT_DEPS],
- c_args: [
- '-DG_LOG_DOMAIN="GrlDmap"',
- '-DHAVE_CONFIG_H',
- ])
+ c_args: args)
shared_library('grldpap',
sources: dpap_sources,
install: true,
install_dir: pluginsdir,
dependencies: must_deps + plugins[dmap_idx][REQ_DEPS] + plugins[dmap_idx][OPT_DEPS],
- c_args: [
- '-DG_LOG_DOMAIN="GrlDmap"',
- '-DHAVE_CONFIG_H',
- ])
+ c_args: args)