[rygel-gst-0-10-plugins/wip/tracking] Add code for tracking changes in some places.
- From: Krzesimir Nowak <krnowak src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [rygel-gst-0-10-plugins/wip/tracking] Add code for tracking changes in some places.
- Date: Wed, 20 Feb 2013 15:44:18 +0000 (UTC)
commit d1d895f752d1893d3da3e497ba8f10eb525f5a91
Author: Krzesimir Nowak <krnowak openismus com>
Date: Wed Feb 20 16:43:33 2013 +0100
Add code for tracking changes in some places.
.../rygel-media-export-dummy-container.c | 17 ++
src/media-export/rygel-media-export-harvester.c | 16 +-
.../rygel-media-export-harvesting-task.c | 22 +-
src/media-export/rygel-media-export-music-item.c | 20 ++-
.../rygel-media-export-object-factory.c | 3 +-
src/media-export/rygel-media-export-photo-item.c | 20 ++-
.../rygel-media-export-root-container.c | 274 ++++++++++++--------
.../rygel-media-export-root-container.h | 6 +-
src/media-export/rygel-media-export-video-item.c | 20 +-
.../rygel-media-export-writable-db-container.c | 49 ++--
.../rygel-media-export-writable-db-container.h | 6 +-
11 files changed, 282 insertions(+), 171 deletions(-)
---
diff --git a/src/media-export/rygel-media-export-dummy-container.c
b/src/media-export/rygel-media-export-dummy-container.c
index 085523b..591951d 100644
--- a/src/media-export/rygel-media-export-dummy-container.c
+++ b/src/media-export/rygel-media-export-dummy-container.c
@@ -131,13 +131,30 @@ rygel_media_export_dummy_container_constructed (GObject *object)
{
RygelMediaExportDummyContainer *dummy = RYGEL_MEDIA_EXPORT_DUMMY_CONTAINER (object);
RygelMediaObject *media_object = RYGEL_MEDIA_OBJECT (object);
+ RygelMediaContainer *media_container = RYGEL_MEDIA_CONTAINER (object);
GeeAbstractCollection *uris;
gchar *uri = g_file_get_uri (dummy->priv->file);
+ RygelMediaExportMediaCache *media_db;
+ guint32 object_update_id = 0;
+ guint32 container_update_id = 0;
+ guint32 total_deleted_child_count = 0;
G_OBJECT_CLASS (rygel_media_export_dummy_container_parent_class)->constructed (object);
uris = GEE_ABSTRACT_COLLECTION (media_object->uris);
gee_abstract_collection_add (uris, uri);
g_free (uri);
+
+ media_db = rygel_media_export_media_cache_get_default ();
+ rygel_media_export_media_cache_get_track_properties (media_db,
+ rygel_media_object_get_id (media_object),
+ &object_update_id,
+ &container_update_id,
+ &total_deleted_child_count);
+ g_object_unref (media_db);
+
+ rygel_media_object_set_object_update_id (media_object, object_update_id);
+ media_container->update_id = container_update_id;
+ media_container->total_deleted_child_count = total_deleted_child_count;
}
static void
diff --git a/src/media-export/rygel-media-export-harvester.c b/src/media-export/rygel-media-export-harvester.c
index e63e97a..cf47c86 100644
--- a/src/media-export/rygel-media-export-harvester.c
+++ b/src/media-export/rygel-media-export-harvester.c
@@ -154,7 +154,8 @@ rygel_media_export_harvester_on_file_added (RygelMediaExportHarvester *self,
current = parent;
}
g_object_unref (parent);
- if (gee_abstract_collection_contains (abstract_locations, current)) {
+ if (!parent_container &&
+ gee_abstract_collection_contains (abstract_locations, current)) {
RygelMediaObject* another_object = rygel_media_export_media_cache_get_object (cache,
RYGEL_MEDIA_EXPORT_ROOT_CONTAINER_FILESYSTEM_FOLDER_ID,
&error);
@@ -296,17 +297,8 @@ rygel_media_export_harvester_on_file_removed (RygelMediaExportHarvester *self,
g_object_unref (parent);
}
parent = tmp_parent;
- rygel_media_export_media_cache_remove_object (cache, object, &inner_error);
- if (inner_error) {
- if (parent) {
- g_object_unref (parent);
- }
- g_object_unref (object);
- g_warning (_("Error removing object from database: %s"),
- inner_error->message);
- g_error_free (inner_error);
-
- goto out;
+ if (RYGEL_IS_TRACKABLE_CONTAINER (parent)) {
+ rygel_trackable_container_remove_child_tracked (RYGEL_TRACKABLE_CONTAINER (parent), object, NULL,
NULL);
}
if (!parent) {
break;
diff --git a/src/media-export/rygel-media-export-harvesting-task.c
b/src/media-export/rygel-media-export-harvesting-task.c
index 52c19a5..3ff6aed 100644
--- a/src/media-export/rygel-media-export-harvesting-task.c
+++ b/src/media-export/rygel-media-export-harvesting-task.c
@@ -445,13 +445,13 @@ rygel_media_export_harvesting_task_do_update (RygelMediaExportHarvestingTask *se
if (error) {
goto out;
}
- if (size > 0) {
- rygel_media_container_updated (container, RYGEL_MEDIA_OBJECT (container),
RYGEL_OBJECT_EVENT_TYPE_MODIFIED, FALSE);
- } else {
- rygel_media_export_media_cache_remove_by_id (priv->cache, rygel_media_object_get_id
(RYGEL_MEDIA_OBJECT (container)), &error);
- if (error) {
- goto out;
- }
+ if (size == 0) {
+ RygelTrackableContainer *trackable = RYGEL_TRACKABLE_CONTAINER (rygel_media_object_get_parent
(RYGEL_MEDIA_OBJECT (container)));
+
+ rygel_trackable_container_remove_child_tracked (trackable,
+ RYGEL_MEDIA_OBJECT (container),
+ NULL,
+ NULL);
}
out:
if (error) {
@@ -508,8 +508,12 @@ rygel_media_export_harvesting_task_on_extracted_cb (RygelMediaExportHarvestingTa
file_info);
}
if (item) {
- rygel_media_object_set_parent_ref (RYGEL_MEDIA_OBJECT (item), container);
- rygel_media_export_media_cache_save_item (priv->cache, item, NULL);
+ RygelTrackableContainer *trackable;
+ RygelMediaObject *object = RYGEL_MEDIA_OBJECT (item);
+
+ rygel_media_object_set_parent_ref (object, container);
+ trackable = RYGEL_TRACKABLE_CONTAINER (rygel_media_object_get_parent (object));
+ rygel_trackable_container_add_child_tracked (trackable, object, NULL, NULL);
g_object_unref (item);
}
top_file = G_FILE (gee_queue_poll (priv->files));
diff --git a/src/media-export/rygel-media-export-music-item.c
b/src/media-export/rygel-media-export-music-item.c
index 3b974b5..0d65a85 100644
--- a/src/media-export/rygel-media-export-music-item.c
+++ b/src/media-export/rygel-media-export-music-item.c
@@ -24,10 +24,19 @@
#include "rygel-media-export-music-item.h"
#include "rygel-media-export-media-cache.h"
-static void rygel_media_export_music_item_rygel_updatable_object_interface_init (RygelUpdatableObjectIface
*iface);
+static void
+rygel_media_export_music_item_rygel_updatable_object_interface_init (RygelUpdatableObjectIface *iface);
+
+static void
+rygel_media_export_music_item_rygel_trackable_item_interface_init (RygelTrackableItemIface *iface);
-G_DEFINE_TYPE_WITH_CODE (RygelMediaExportMusicItem, rygel_media_export_music_item, RYGEL_TYPE_MUSIC_ITEM,
- G_IMPLEMENT_INTERFACE (RYGEL_TYPE_UPDATABLE_OBJECT,
rygel_media_export_music_item_rygel_updatable_object_interface_init))
+G_DEFINE_TYPE_WITH_CODE (RygelMediaExportMusicItem,
+ rygel_media_export_music_item,
+ RYGEL_TYPE_MUSIC_ITEM,
+ G_IMPLEMENT_INTERFACE (RYGEL_TYPE_UPDATABLE_OBJECT,
+
rygel_media_export_music_item_rygel_updatable_object_interface_init)
+ G_IMPLEMENT_INTERFACE (RYGEL_TYPE_TRACKABLE_ITEM,
+
rygel_media_export_music_item_rygel_trackable_item_interface_init))
static void rygel_media_export_music_item_real_commit (RygelUpdatableObject *base, GAsyncReadyCallback
callback_, gpointer user_data);
@@ -53,6 +62,7 @@ rygel_media_export_music_item_real_commit (RygelUpdatableObject *base, GAsyncRea
g_return_if_fail (self);
g_return_if_fail (callback);
+ rygel_trackable_item_changed (RYGEL_TRACKABLE_ITEM (self));
/* Setup the async result.
*/
GSimpleAsyncResult *async_result =
@@ -99,5 +109,9 @@ rygel_media_export_music_item_rygel_updatable_object_interface_init (RygelUpdata
}
static void
+rygel_media_export_music_item_rygel_trackable_item_interface_init (RygelTrackableItemIface *iface
G_GNUC_UNUSED) {
+}
+
+static void
rygel_media_export_music_item_init (RygelMediaExportMusicItem *self G_GNUC_UNUSED) {
}
diff --git a/src/media-export/rygel-media-export-object-factory.c
b/src/media-export/rygel-media-export-object-factory.c
index 8575a22..614fe9d 100644
--- a/src/media-export/rygel-media-export-object-factory.c
+++ b/src/media-export/rygel-media-export-object-factory.c
@@ -28,6 +28,7 @@
#include "rygel-media-export-query-container.h"
#include "rygel-media-export-root-container.h"
#include "rygel-media-export-object-factory.h"
+#include "rygel-media-export-trackable-db-container.h"
#include "rygel-media-export-video-item.h"
#include "rygel-media-export-writable-db-container.h"
@@ -73,7 +74,7 @@ rygel_media_export_object_factory_real_get_container (RygelMediaExportObjectFact
}
if (!uri) {
- return rygel_media_export_db_container_new (id, title);
+ return RYGEL_MEDIA_EXPORT_DB_CONTAINER (rygel_media_export_trackable_db_container_new (id, title));
}
return RYGEL_MEDIA_EXPORT_DB_CONTAINER (rygel_media_export_writable_db_container_new (id, title));
diff --git a/src/media-export/rygel-media-export-photo-item.c
b/src/media-export/rygel-media-export-photo-item.c
index cf56fc4..8b2fc40 100644
--- a/src/media-export/rygel-media-export-photo-item.c
+++ b/src/media-export/rygel-media-export-photo-item.c
@@ -23,10 +23,19 @@
#include "rygel-media-export-photo-item.h"
#include "rygel-media-export-media-cache.h"
-static void rygel_media_export_photo_item_rygel_updatable_object_interface_init (RygelUpdatableObjectIface
*iface);
+static void
+rygel_media_export_photo_item_rygel_updatable_object_interface_init (RygelUpdatableObjectIface *iface);
+
+static void
+rygel_media_export_photo_item_rygel_trackable_item_interface_init (RygelTrackableItemIface *iface);
-G_DEFINE_TYPE_WITH_CODE (RygelMediaExportPhotoItem, rygel_media_export_photo_item, RYGEL_TYPE_PHOTO_ITEM,
- G_IMPLEMENT_INTERFACE (RYGEL_TYPE_UPDATABLE_OBJECT,
rygel_media_export_photo_item_rygel_updatable_object_interface_init))
+G_DEFINE_TYPE_WITH_CODE (RygelMediaExportPhotoItem,
+ rygel_media_export_photo_item,
+ RYGEL_TYPE_PHOTO_ITEM,
+ G_IMPLEMENT_INTERFACE (RYGEL_TYPE_UPDATABLE_OBJECT,
+
rygel_media_export_photo_item_rygel_updatable_object_interface_init)
+ G_IMPLEMENT_INTERFACE (RYGEL_TYPE_TRACKABLE_ITEM,
+
rygel_media_export_photo_item_rygel_trackable_item_interface_init))
RygelMediaExportPhotoItem *rygel_media_export_photo_item_construct (GType object_type, const gchar *id,
RygelMediaContainer *parent, const gchar *title, const gchar *upnp_class);
static void rygel_media_export_photo_item_real_commit (RygelUpdatableObject *base, GAsyncReadyCallback
callback, gpointer user_data);
@@ -53,6 +62,7 @@ static void rygel_media_export_photo_item_real_commit (RygelUpdatableObject *bas
g_return_if_fail (self);
g_return_if_fail (callback);
+ rygel_trackable_item_changed (RYGEL_TRACKABLE_ITEM (self));
/* Setup the async result.
*/
GSimpleAsyncResult *async_result =
@@ -99,5 +109,9 @@ rygel_media_export_photo_item_rygel_updatable_object_interface_init (RygelUpdata
}
static void
+rygel_media_export_photo_item_rygel_trackable_item_interface_init (RygelTrackableItemIface *iface
G_GNUC_UNUSED) {
+}
+
+static void
rygel_media_export_photo_item_init (RygelMediaExportPhotoItem *self G_GNUC_UNUSED) {
}
diff --git a/src/media-export/rygel-media-export-root-container.c
b/src/media-export/rygel-media-export-root-container.c
index 531409e..196360b 100644
--- a/src/media-export/rygel-media-export-root-container.c
+++ b/src/media-export/rygel-media-export-root-container.c
@@ -36,11 +36,16 @@
static void
rygel_media_export_root_container_rygel_searchable_container_interface_init (RygelSearchableContainerIface
*iface);
+static void
+rygel_media_export_root_container_rygel_trackable_container_interface_init (RygelTrackableContainerIface
*iface);
+
G_DEFINE_TYPE_WITH_CODE (RygelMediaExportRootContainer,
rygel_media_export_root_container,
- RYGEL_MEDIA_EXPORT_TYPE_DB_CONTAINER,
+ RYGEL_MEDIA_EXPORT_TYPE_TRACKABLE_DB_CONTAINER,
G_IMPLEMENT_INTERFACE (RYGEL_TYPE_SEARCHABLE_CONTAINER,
-
rygel_media_export_root_container_rygel_searchable_container_interface_init))
+
rygel_media_export_root_container_rygel_searchable_container_interface_init)
+ G_IMPLEMENT_INTERFACE (RYGEL_TYPE_TRACKABLE_CONTAINER,
+
rygel_media_export_root_container_rygel_trackable_container_interface_init))
typedef struct _RygelMediaExportFolderDefinition RygelMediaExportFolderDefinition;
typedef struct _RygelMediaExportRootContainerFindObjectData RygelMediaExportRootContainerFindObjectData;
@@ -56,6 +61,7 @@ struct _RygelMediaExportRootContainerPrivate {
GCancellable *cancellable;
RygelMediaContainer *filesystem_container;
gulong harvester_signal_id;
+ gboolean initialized;
};
struct _RygelMediaExportRootContainerFindObjectData {
@@ -74,6 +80,7 @@ struct _RygelMediaExportRootContainerSearchData {
static RygelMediaContainer *rygel_media_export_root_container_instance = NULL;
static RygelSearchableContainerIface *parent_searchable_container_iface = NULL;
+static RygelTrackableContainerIface *parent_trackable_container_iface = NULL;
#define RYGEL_MEDIA_EXPORT_ROOT_CONTAINER_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE ((o), \
@@ -519,6 +526,142 @@ rygel_media_export_root_container_real_search_finish (RygelSearchableContainer
}
static void
+rygel_media_export_root_container_updated (RygelMediaExportRootContainer *self) {
+ RygelMediaContainer *media_container = RYGEL_MEDIA_CONTAINER (self);
+ RygelMediaExportMediaCache *media_db = rygel_media_export_db_container_get_media_db
(RYGEL_MEDIA_EXPORT_DB_CONTAINER (self));
+
+ rygel_media_container_updated (media_container,
+ NULL,
+ RYGEL_OBJECT_EVENT_TYPE_MODIFIED,
+ FALSE);
+ rygel_media_export_media_cache_save_container (media_db, media_container, NULL);
+}
+
+static GeeArrayList *
+rygel_media_export_root_container_get_shared_uris (RygelMediaExportRootContainer *self);
+
+static void
+rygel_media_export_root_container_on_initial_harvesting_done_rygel_media_export_harvester_done
(RygelMediaExportHarvester *sender G_GNUC_UNUSED,
+ gpointer
self);
+
+static gboolean
+rygel_media_export_root_container_late_init (gpointer user_data) {
+ RygelMediaExportRootContainer *self = RYGEL_MEDIA_EXPORT_ROOT_CONTAINER (user_data);
+ RygelMediaExportRootContainerPrivate *priv = self->priv;
+ RygelMediaExportMediaCache* db;
+ GError *error = NULL;
+ GeeArrayList* ids;
+ GeeAbstractCollection *abstract_ids;
+ GeeAbstractList *abstract_list_ids;
+ RygelMediaContainer *media_container = RYGEL_MEDIA_CONTAINER (self);
+ GeeArrayList *shared_uris;
+ GeeArrayList *locations;
+ GeeAbstractList *abstract_locations;
+ gint iter;
+ gint size;
+
+ if (self->priv->initialized) {
+ return FALSE;
+ }
+
+ priv->cancellable = g_cancellable_new ();
+ db = rygel_media_export_db_container_get_media_db (RYGEL_MEDIA_EXPORT_DB_CONTAINER (self));
+ rygel_media_export_media_cache_save_container (db, media_container, &error);
+ if (error) {
+ g_warning ("Failed to save root container into db: %s",
+ error->message);
+ g_error_free (error);
+ error = NULL;
+ }
+
+ priv->filesystem_container = RYGEL_MEDIA_CONTAINER (rygel_media_export_trackable_db_container_new
(RYGEL_MEDIA_EXPORT_ROOT_CONTAINER_FILESYSTEM_FOLDER_ID,
+
_(RYGEL_MEDIA_EXPORT_ROOT_CONTAINER_FILESYSTEM_FOLDER_NAME)));
+ rygel_media_object_set_parent (RYGEL_MEDIA_OBJECT (priv->filesystem_container),
+ media_container);
+ rygel_media_export_media_cache_save_container (db, RYGEL_MEDIA_CONTAINER (priv->filesystem_container),
&error);
+ if (error) {
+ g_warning ("Failed to save filesystem container into db: %s",
+ error->message);
+ g_error_free (error);
+ error = NULL;
+ }
+
+ ids = rygel_media_export_media_cache_get_child_ids (db,
RYGEL_MEDIA_EXPORT_ROOT_CONTAINER_FILESYSTEM_FOLDER_ID, &error);
+ if (error) {
+ g_warning ("Failed to get child ids of %s from db: %s",
+ RYGEL_MEDIA_EXPORT_ROOT_CONTAINER_FILESYSTEM_FOLDER_ID,
+ error->message);
+ g_error_free (error);
+ error = NULL;
+ ids = gee_array_list_new (G_TYPE_STRING, (GBoxedCopyFunc) g_strdup, g_free, NULL, NULL, NULL);
+ }
+ abstract_ids = GEE_ABSTRACT_COLLECTION (ids);
+
+ shared_uris = rygel_media_export_root_container_get_shared_uris (self);
+ priv->harvester = rygel_media_export_harvester_new (priv->cancellable, shared_uris);
+ if (shared_uris) {
+ g_object_unref (shared_uris);
+ }
+ priv->harvester_signal_id = g_signal_connect_object (priv->harvester,
+ "done",
+ G_CALLBACK
(rygel_media_export_root_container_on_initial_harvesting_done_rygel_media_export_harvester_done),
+ self,
+ 0);
+
+ locations = rygel_media_export_harvester_get_locations (priv->harvester);
+ abstract_locations = GEE_ABSTRACT_LIST (locations);
+ size = gee_abstract_collection_get_size (GEE_ABSTRACT_COLLECTION (locations));
+
+ for (iter = 0; iter < size; ++iter) {
+ GFile *file = gee_abstract_list_get (abstract_locations, iter);
+ gchar *file_id = rygel_media_export_media_cache_get_id (file);
+
+ gee_abstract_collection_remove (abstract_ids, file_id);
+ rygel_media_export_harvester_schedule (priv->harvester,
+ file,
+ priv->filesystem_container,
+ NULL);
+ g_free (file_id);
+ g_object_unref (file);
+ }
+
+ size = gee_abstract_collection_get_size (abstract_ids);
+ abstract_list_ids = GEE_ABSTRACT_LIST (ids);
+ for (iter = 0; iter < size; ++iter) {
+ gchar *id = gee_abstract_list_get (abstract_list_ids, iter);
+
+ g_debug ("ID %s no longer in config; deleting...", id);
+ rygel_media_export_media_cache_remove_by_id (db, id, &error);
+ if (error) {
+ g_warning ("Failed to remove entry %s: %s",
+ id,
+ error->message);
+ g_error_free (error);
+ error = NULL;
+ }
+ g_free (id);
+ }
+ if (!gee_collection_get_is_empty (GEE_COLLECTION (ids))) {
+ rygel_media_export_root_container_updated (self);
+ }
+ g_object_unref (ids);
+
+ return FALSE;
+}
+
+static guint32
+rygel_media_export_root_container_real_get_system_update_id (RygelTrackableContainer *base) {
+ guint32 id = parent_trackable_container_iface->get_system_update_id (base);
+ RygelMediaExportRootContainer *self = RYGEL_MEDIA_EXPORT_ROOT_CONTAINER (base);
+
+ if (!self->priv->initialized) {
+ g_idle_add (rygel_media_export_root_container_late_init, self);
+ }
+
+ return id;
+}
+
+static void
replace_in_string (gchar **self,
const gchar *old_part,
const gchar *new_part)
@@ -787,7 +930,7 @@ on_filesystem_container_updated (RygelMediaContainer *sender G_GNUC_UNUSED,
RygelMediaExportRootContainer *self = RYGEL_MEDIA_EXPORT_ROOT_CONTAINER (user_data);
rygel_media_export_root_container_add_default_virtual_folders (self);
- rygel_media_container_updated (RYGEL_MEDIA_CONTAINER (self), NULL, RYGEL_OBJECT_EVENT_TYPE_MODIFIED,
FALSE);
+ rygel_media_export_root_container_updated (self);
}
static void
@@ -795,9 +938,10 @@ rygel_media_export_root_container_on_initial_harvesting_done (RygelMediaExportRo
g_return_if_fail (self != NULL);
g_signal_handler_disconnect (G_OBJECT (self->priv->harvester), self->priv->harvester_signal_id);
+ self->priv->harvester_signal_id = 0;
rygel_media_export_media_cache_debug_statistics (rygel_media_export_db_container_get_media_db
(RYGEL_MEDIA_EXPORT_DB_CONTAINER (self)));
rygel_media_export_root_container_add_default_virtual_folders (self);
- rygel_media_container_updated (RYGEL_MEDIA_CONTAINER (self), NULL, RYGEL_OBJECT_EVENT_TYPE_MODIFIED,
FALSE);
+ rygel_media_export_root_container_updated (self);
g_signal_connect_object (self->priv->filesystem_container,
"container-updated",
G_CALLBACK (on_filesystem_container_updated),
@@ -807,113 +951,11 @@ rygel_media_export_root_container_on_initial_harvesting_done (RygelMediaExportRo
static void
rygel_media_export_root_container_on_initial_harvesting_done_rygel_media_export_harvester_done
(RygelMediaExportHarvester *sender G_GNUC_UNUSED,
- gpointer
self) {
+ gpointer
self) {
rygel_media_export_root_container_on_initial_harvesting_done (self);
}
static void
-rygel_media_export_root_container_constructed (GObject *object) {
- RygelMediaExportRootContainer *self = RYGEL_MEDIA_EXPORT_ROOT_CONTAINER (object);
- RygelMediaExportRootContainerPrivate *priv = self->priv;
- RygelMediaExportMediaCache* db;
- GError *error = NULL;
- GeeArrayList* ids;
- GeeAbstractCollection *abstract_ids;
- GeeAbstractList *abstract_list_ids;
- RygelMediaContainer *media_container = RYGEL_MEDIA_CONTAINER (self);
- GeeArrayList *shared_uris;
- GeeArrayList *locations;
- GeeAbstractList *abstract_locations;
- gint iter;
- gint size;
-
- G_OBJECT_CLASS (rygel_media_export_root_container_parent_class)->constructed (object);
-
- priv->cancellable = g_cancellable_new ();
- db = rygel_media_export_db_container_get_media_db (RYGEL_MEDIA_EXPORT_DB_CONTAINER (self));
- rygel_media_export_media_cache_save_container (db, media_container, &error);
- if (error) {
- g_warning ("Failed to save root container into db: %s",
- error->message);
- g_error_free (error);
- error = NULL;
- }
-
- priv->filesystem_container = RYGEL_MEDIA_CONTAINER (rygel_media_export_db_container_new
(RYGEL_MEDIA_EXPORT_ROOT_CONTAINER_FILESYSTEM_FOLDER_ID,
-
_(RYGEL_MEDIA_EXPORT_ROOT_CONTAINER_FILESYSTEM_FOLDER_NAME)));
- rygel_media_object_set_parent (RYGEL_MEDIA_OBJECT (priv->filesystem_container),
- media_container);
- rygel_media_export_media_cache_save_container (db, RYGEL_MEDIA_CONTAINER (priv->filesystem_container),
&error);
- if (error) {
- g_warning ("Failed to save filesystem container into db: %s",
- error->message);
- g_error_free (error);
- error = NULL;
- }
-
- ids = rygel_media_export_media_cache_get_child_ids (db,
RYGEL_MEDIA_EXPORT_ROOT_CONTAINER_FILESYSTEM_FOLDER_ID, &error);
- if (error) {
- g_warning ("Failed to get child ids of %s from db: %s",
- RYGEL_MEDIA_EXPORT_ROOT_CONTAINER_FILESYSTEM_FOLDER_ID,
- error->message);
- g_error_free (error);
- error = NULL;
- ids = gee_array_list_new (G_TYPE_STRING, (GBoxedCopyFunc) g_strdup, g_free, NULL, NULL, NULL);
- }
- abstract_ids = GEE_ABSTRACT_COLLECTION (ids);
-
- shared_uris = rygel_media_export_root_container_get_shared_uris (self);
- priv->harvester = rygel_media_export_harvester_new (priv->cancellable, shared_uris);
- if (shared_uris) {
- g_object_unref (shared_uris);
- }
- priv->harvester_signal_id = g_signal_connect_object (priv->harvester,
- "done",
- G_CALLBACK
(rygel_media_export_root_container_on_initial_harvesting_done_rygel_media_export_harvester_done),
- self,
- 0);
-
- locations = rygel_media_export_harvester_get_locations (priv->harvester);
- abstract_locations = GEE_ABSTRACT_LIST (locations);
- size = gee_abstract_collection_get_size (GEE_ABSTRACT_COLLECTION (locations));
-
- for (iter = 0; iter < size; ++iter) {
- GFile *file = gee_abstract_list_get (abstract_locations, iter);
- gchar *file_id = rygel_media_export_media_cache_get_id (file);
-
- gee_abstract_collection_remove (abstract_ids, file_id);
- rygel_media_export_harvester_schedule (priv->harvester,
- file,
- priv->filesystem_container,
- NULL);
- g_free (file_id);
- g_object_unref (file);
- }
-
- size = gee_abstract_collection_get_size (abstract_ids);
- abstract_list_ids = GEE_ABSTRACT_LIST (ids);
- for (iter = 0; iter < size; ++iter) {
- gchar *id = gee_abstract_list_get (abstract_list_ids, iter);
-
- g_debug ("ID %s no longer in config; deleting...", id);
- rygel_media_export_media_cache_remove_by_id (db, id, &error);
- if (error) {
- g_warning ("Failed to remove entry %s: %s",
- id,
- error->message);
- g_error_free (error);
- error = NULL;
- }
- g_free (id);
- }
- rygel_media_container_updated (media_container,
- NULL,
- RYGEL_OBJECT_EVENT_TYPE_MODIFIED,
- FALSE);
- g_object_unref (ids);
-}
-
-static void
rygel_media_export_root_container_dispose (GObject *object) {
RygelMediaExportRootContainer *self = RYGEL_MEDIA_EXPORT_ROOT_CONTAINER (object);
RygelMediaExportRootContainerPrivate *priv = self->priv;
@@ -947,7 +989,6 @@ rygel_media_export_root_container_class_init (RygelMediaExportRootContainerClass
container_class->find_object = rygel_media_export_root_container_real_find_object;
container_class->find_object_finish = rygel_media_export_root_container_real_find_object_finish;
- object_class->constructed = rygel_media_export_root_container_constructed;
object_class->dispose = rygel_media_export_root_container_dispose;
g_type_class_add_private (root_class, sizeof (RygelMediaExportRootContainerPrivate));
@@ -970,3 +1011,20 @@ rygel_media_export_root_container_rygel_searchable_container_interface_init (Ryg
* iface->set_search_classes = parent_searchable_container_iface->set_search_classes;
*/
}
+
+static void
+rygel_media_export_root_container_rygel_trackable_container_interface_init (RygelTrackableContainerIface
*iface)
+{
+ parent_trackable_container_iface = g_type_interface_peek_parent (iface);
+ iface->get_system_update_id = rygel_media_export_root_container_real_get_system_update_id;
+ /* iface should be a copy of parent_trackable_container_iface, so
+ * we don't have to override the rest of functions.
+ *
+ * iface->add_child = parent_trackable_container_iface->add_child;
+ * iface->add_child_finish = parent_trackable_container_iface->add_child_finish;
+ * iface->remove_child = parent_trackable_container_iface->remove_child;
+ * iface->remove_child_finish = parent_trackable_container_iface->remove_child_finish;
+ * iface->get_service_reset_token = parent_trackable_container_iface->get_service_reset_token;
+ * iface->set_service_reset_token = parent_trackable_container_iface->set_service_reset_token;
+ */
+}
diff --git a/src/media-export/rygel-media-export-root-container.h
b/src/media-export/rygel-media-export-root-container.h
index 166c006..d0e4eff 100644
--- a/src/media-export/rygel-media-export-root-container.h
+++ b/src/media-export/rygel-media-export-root-container.h
@@ -24,7 +24,7 @@
#include <glib.h>
#include <glib-object.h>
-#include "rygel-media-export-db-container.h"
+#include "rygel-media-export-trackable-db-container.h"
G_BEGIN_DECLS
@@ -43,12 +43,12 @@ typedef struct _RygelMediaExportRootContainerClass RygelMediaExportRootContainer
typedef struct _RygelMediaExportRootContainerPrivate RygelMediaExportRootContainerPrivate;
struct _RygelMediaExportRootContainer {
- RygelMediaExportDBContainer parent_instance;
+ RygelMediaExportTrackableDbContainer parent_instance;
RygelMediaExportRootContainerPrivate *priv;
};
struct _RygelMediaExportRootContainerClass {
- RygelMediaExportDBContainerClass parent_class;
+ RygelMediaExportTrackableDbContainerClass parent_class;
};
GType
diff --git a/src/media-export/rygel-media-export-video-item.c
b/src/media-export/rygel-media-export-video-item.c
index a60ea23..c11b8e7 100644
--- a/src/media-export/rygel-media-export-video-item.c
+++ b/src/media-export/rygel-media-export-video-item.c
@@ -23,12 +23,19 @@
#include "rygel-media-export-video-item.h"
#include "rygel-media-export-media-cache.h"
-static void rygel_media_export_video_item_rygel_trackable_item_interface_init (RygelTrackableItemIface
*iface);
-static void rygel_media_export_video_item_rygel_updatable_object_interface_init (RygelUpdatableObjectIface
*iface);
+static void
+rygel_media_export_video_item_rygel_updatable_object_interface_init (RygelUpdatableObjectIface *iface);
+
+static void
+rygel_media_export_video_item_rygel_trackable_item_interface_init (RygelTrackableItemIface *iface);
-G_DEFINE_TYPE_WITH_CODE (RygelMediaExportVideoItem, rygel_media_export_video_item, RYGEL_TYPE_VIDEO_ITEM,
- G_IMPLEMENT_INTERFACE (RYGEL_TYPE_TRACKABLE_ITEM,
rygel_media_export_video_item_rygel_trackable_item_interface_init)
- G_IMPLEMENT_INTERFACE (RYGEL_TYPE_UPDATABLE_OBJECT,
rygel_media_export_video_item_rygel_updatable_object_interface_init))
+G_DEFINE_TYPE_WITH_CODE (RygelMediaExportVideoItem,
+ rygel_media_export_video_item,
+ RYGEL_TYPE_VIDEO_ITEM,
+ G_IMPLEMENT_INTERFACE (RYGEL_TYPE_UPDATABLE_OBJECT,
+
rygel_media_export_video_item_rygel_updatable_object_interface_init)
+ G_IMPLEMENT_INTERFACE (RYGEL_TYPE_TRACKABLE_ITEM,
+
rygel_media_export_video_item_rygel_trackable_item_interface_init))
static void rygel_media_export_video_item_real_commit (RygelUpdatableObject *base, GAsyncReadyCallback
_callback_, gpointer _user_data_);
@@ -54,7 +61,8 @@ static void rygel_media_export_video_item_real_commit (RygelUpdatableObject *bas
g_return_if_fail (self);
g_return_if_fail (callback);
- /* Setup the async result.
+ rygel_trackable_item_changed (RYGEL_TRACKABLE_ITEM (self));
+ /* Setup the async result.
*/
GSimpleAsyncResult *async_result =
g_simple_async_result_new (G_OBJECT (self), callback, user_data,
diff --git a/src/media-export/rygel-media-export-writable-db-container.c
b/src/media-export/rygel-media-export-writable-db-container.c
index 6a560c2..5504673 100644
--- a/src/media-export/rygel-media-export-writable-db-container.c
+++ b/src/media-export/rygel-media-export-writable-db-container.c
@@ -28,7 +28,7 @@ rygel_media_export_writable_db_container_rygel_writable_container_interface_init
G_DEFINE_TYPE_WITH_CODE (RygelMediaExportWritableDbContainer,
rygel_media_export_writable_db_container,
- RYGEL_MEDIA_EXPORT_TYPE_DB_CONTAINER,
+ RYGEL_MEDIA_EXPORT_TYPE_TRACKABLE_DB_CONTAINER,
G_IMPLEMENT_INTERFACE (RYGEL_TYPE_WRITABLE_CONTAINER,
rygel_media_export_writable_db_container_rygel_writable_container_interface_init));
@@ -61,6 +61,16 @@ rygel_media_export_writable_db_container_new (const gchar *id,
}
static void
+tracked_action_ready (GObject *source_object G_GNUC_UNUSED,
+ GAsyncResult *res G_GNUC_UNUSED,
+ gpointer user_data) {
+ GSimpleAsyncResult *result = G_SIMPLE_ASYNC_RESULT (user_data);
+
+ g_simple_async_result_complete (result);
+ g_object_unref (result);
+}
+
+static void
rygel_media_export_writable_db_container_real_add_item (RygelWritableContainer *base,
RygelMediaItem *item,
GCancellable *cancellable G_GNUC_UNUSED,
@@ -70,9 +80,10 @@ rygel_media_export_writable_db_container_real_add_item (RygelWritableContainer *
gchar *uri;
GFile *file;
gchar *id;
- RygelMediaExportMediaCache *cache;
- GError *error = NULL;
- GSimpleAsyncResult *simple;
+ GSimpleAsyncResult *simple = g_simple_async_result_new (G_OBJECT (base),
+ callback,
+ user_data,
+
rygel_media_export_writable_db_container_real_add_item);
rygel_media_object_set_parent (object, RYGEL_MEDIA_CONTAINER (base));
uri = gee_abstract_list_get (GEE_ABSTRACT_LIST (object->uris), 0);
@@ -85,22 +96,11 @@ rygel_media_export_writable_db_container_real_add_item (RygelWritableContainer *
g_object_unref (file);
rygel_media_object_set_id (object, id);
g_free (id);
- cache = rygel_media_export_db_container_get_media_db (RYGEL_MEDIA_EXPORT_DB_CONTAINER (base));
- rygel_media_export_media_cache_save_item (cache, item, &error);
- if (error) {
- simple = g_simple_async_result_new_take_error (G_OBJECT (base),
- callback,
- user_data,
- error);
- } else {
- simple = g_simple_async_result_new (G_OBJECT (base),
- callback,
- user_data,
- rygel_media_export_writable_db_container_real_add_item);
- }
- g_simple_async_result_complete_in_idle (simple);
- g_object_unref (simple);
+ rygel_trackable_container_add_child_tracked (RYGEL_TRACKABLE_CONTAINER (base),
+ object,
+ tracked_action_ready,
+ simple);
}
static void
@@ -120,22 +120,25 @@ rygel_media_export_writable_db_container_real_remove_item (RygelWritableContaine
RygelMediaExportMediaCache *cache = rygel_media_export_db_container_get_media_db (db_container);
GError *error = NULL;
GSimpleAsyncResult *simple;
-
- rygel_media_export_media_cache_remove_by_id (cache, id, &error);
+ RygelMediaObject *object = rygel_media_export_media_cache_get_object (cache, id, &error);
if (error) {
simple = g_simple_async_result_new_take_error (G_OBJECT (base),
callback,
user_data,
error);
+ g_simple_async_result_complete_in_idle (simple);
+ g_object_unref (simple);
} else {
simple = g_simple_async_result_new (G_OBJECT (base),
callback,
user_data,
rygel_media_export_writable_db_container_real_remove_item);
+ rygel_trackable_container_remove_child_tracked (RYGEL_TRACKABLE_CONTAINER (base),
+ object,
+ tracked_action_ready,
+ simple);
}
- g_simple_async_result_complete_in_idle (simple);
- g_object_unref (simple);
}
static void
diff --git a/src/media-export/rygel-media-export-writable-db-container.h
b/src/media-export/rygel-media-export-writable-db-container.h
index bb257b2..6acc5ae 100644
--- a/src/media-export/rygel-media-export-writable-db-container.h
+++ b/src/media-export/rygel-media-export-writable-db-container.h
@@ -27,7 +27,7 @@
#include <glib.h>
#include <glib-object.h>
-#include "rygel-media-export-db-container.h"
+#include "rygel-media-export-trackable-db-container.h"
G_BEGIN_DECLS
@@ -43,12 +43,12 @@ typedef struct _RygelMediaExportWritableDbContainerClass RygelMediaExportWritabl
typedef struct _RygelMediaExportWritableDbContainerPrivate RygelMediaExportWritableDbContainerPrivate;
struct _RygelMediaExportWritableDbContainer {
- RygelMediaExportDBContainer parent_instance;
+ RygelMediaExportTrackableDbContainer parent_instance;
RygelMediaExportWritableDbContainerPrivate *priv;
};
struct _RygelMediaExportWritableDbContainerClass {
- RygelMediaExportDBContainerClass parent_class;
+ RygelMediaExportTrackableDbContainerClass parent_class;
};
GType
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]