[gnome-online-miners] media-server: Support non-searchable DLNA servers
- From: Debarshi Ray <debarshir src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-online-miners] media-server: Support non-searchable DLNA servers
- Date: Sun, 14 Feb 2016 18:54:53 +0000 (UTC)
commit 83130fc9815713e0e8300a0b270d65b6cddb5b7b
Author: Pranav Kant <pranav913 gmail com>
Date: Sun Feb 14 19:31:54 2016 +0100
media-server: Support non-searchable DLNA servers
https://bugzilla.gnome.org/show_bug.cgi?id=728912
src/gom-dlna-server.c | 103 ++++++++++++++++++++++++++++++++++++++++++++++++-
src/gom-dlna-server.h | 1 +
2 files changed, 103 insertions(+), 1 deletions(-)
---
diff --git a/src/gom-dlna-server.c b/src/gom-dlna-server.c
index 0c7e537..4ce8755 100644
--- a/src/gom-dlna-server.c
+++ b/src/gom-dlna-server.c
@@ -73,14 +73,111 @@ photo_item_new (GVariant *var)
g_variant_lookup (var, "Path", "&o", &str);
photo->path = g_strdup (str);
+ g_variant_lookup (var, "Type", "s", &str);
+ photo->type = g_strdup (str);
+
+ if (g_str_equal (photo->type, "container"))
+ {
+ photo->url = NULL;
+ goto out;
+ }
+
g_variant_lookup (var, "URLs", "@as", &tmp);
g_variant_get_child (tmp, 0, "&s", &str);
photo->url = g_strdup (str);
g_variant_unref (tmp);
+ out:
return photo;
}
+static GList *
+process_children (GVariant *children, GList **photos_list)
+{
+ GVariantIter *iter = NULL;
+ GVariant *var = NULL;
+ GList *containers = NULL;
+ GomDlnaPhotoItem *photo;
+
+ g_variant_get (children, "aa{sv}", &iter);
+ while (g_variant_iter_loop (iter, "@a{sv}", &var))
+ {
+ photo = photo_item_new (var);
+ if (g_str_equal (photo->type, "image.photo"))
+ {
+ *photos_list = g_list_prepend (*photos_list, photo);
+ }
+ else if (g_str_equal (photo->type, "container"))
+ {
+ containers = g_list_prepend (containers, g_strdup (photo->path));
+ gom_dlna_photo_item_free (photo);
+ }
+ }
+
+ return containers;
+}
+
+static void
+find_photos (const gchar *obj_path,
+ GList **photos_list)
+{
+ GError *error = NULL;
+ GList *containers = NULL;
+ GList *l;
+ GVariant *children = NULL;
+ UpnpMediaContainer2 *proxy = NULL;
+ const gchar *const filter[] = {"DisplayName","Type","Path", "URLs", "MIMEType", NULL};
+
+ proxy = upnp_media_container2_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
+ G_DBUS_PROXY_FLAGS_NONE,
+ "com.intel.dleyna-server",
+ obj_path,
+ NULL, /* GCancellable */
+ &error);
+
+ if (error != NULL)
+ {
+ g_warning ("Unable to get proxy for Upnp.MediaContainer2 : %s",
+ error->message);
+ g_error_free (error);
+ goto out;
+ }
+
+ upnp_media_container2_call_list_children_sync (proxy,
+ 0,
+ 0,
+ filter,
+ &children,
+ NULL, /* GCancellable */
+ &error);
+
+ if (error != NULL)
+ {
+ g_warning ("Unable to call ListChildren : %s",
+ error->message);
+ g_error_free (error);
+ goto out;
+ }
+
+ if (children == NULL)
+ goto out;
+
+ containers = process_children (children, photos_list);
+ if (containers == NULL)
+ goto out;
+
+ for (l = containers; l != NULL; l = l->next)
+ {
+ const gchar *obj_path = (gchar *) l->data;
+ find_photos (obj_path, photos_list);
+ }
+
+ out:
+ g_list_free_full (containers, g_free);
+ g_clear_pointer (&children, (GDestroyNotify) g_variant_unref);
+ g_clear_object (&proxy);
+}
+
static void
gom_dlna_server_dispose (GObject *object)
{
@@ -231,6 +328,7 @@ gom_dlna_photo_item_free (GomDlnaPhotoItem *photo)
g_free (photo->mimetype);
g_free (photo->path);
g_free (photo->url);
+ g_free (photo->type);
g_slice_free (GomDlnaPhotoItem, photo);
}
@@ -369,7 +467,10 @@ gom_dlna_server_get_photos (GomDlnaServer *server)
}
else
{
- /* TODO: Implement an algo here for !searchable devices. */
+ const gchar *obj_path;
+
+ obj_path = gom_dlna_server_get_object_path (server);
+ find_photos (obj_path, &photos_list);
}
return photos_list;
diff --git a/src/gom-dlna-server.h b/src/gom-dlna-server.h
index e67dacb..5c630e9 100644
--- a/src/gom-dlna-server.h
+++ b/src/gom-dlna-server.h
@@ -58,6 +58,7 @@ struct _GomDlnaPhotoItem
gchar *mimetype;
gchar *path;
gchar *url;
+ gchar *type;
};
void gom_dlna_photo_item_free (GomDlnaPhotoItem *photo);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]