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 #include +#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 -#include - 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 + * + * 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 #include #include +#include #include +#include +#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 #include +#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 * @@ -18,11 +18,16 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include +#include + +#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 +#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 +#include + +#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 +#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 #include +#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 +#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 + * + * 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 + * + * 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 #include #include #include #include #include +#include +#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 #include +#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 +#include + +#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 +#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 +#include + +#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 +#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 #include +#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 +#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)