summaryrefslogtreecommitdiff
path: root/src/media-export/rygel-media-export-trackable-db-container.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/media-export/rygel-media-export-trackable-db-container.c')
-rw-r--r--src/media-export/rygel-media-export-trackable-db-container.c232
1 files changed, 232 insertions, 0 deletions
diff --git a/src/media-export/rygel-media-export-trackable-db-container.c b/src/media-export/rygel-media-export-trackable-db-container.c
new file mode 100644
index 0000000..19cf0bf
--- /dev/null
+++ b/src/media-export/rygel-media-export-trackable-db-container.c
@@ -0,0 +1,232 @@
+/*
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Author: Jens Georg <jensg@openismus.com>
+ *
+ * This file is part of Rygel.
+ *
+ * Rygel 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; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Rygel 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 program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "rygel-media-export-trackable-db-container.h"
+
+static void
+rygel_media_export_trackable_db_container_rygel_trackable_container_interface_init (RygelTrackableContainerIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (RygelMediaExportTrackableDbContainer,
+ rygel_media_export_trackable_db_container,
+ RYGEL_MEDIA_EXPORT_TYPE_DB_CONTAINER,
+ G_IMPLEMENT_INTERFACE (RYGEL_TYPE_TRACKABLE_CONTAINER,
+ rygel_media_export_trackable_db_container_rygel_trackable_container_interface_init))
+
+RygelMediaExportTrackableDbContainer *
+rygel_media_export_trackable_db_container_new (const gchar *id,
+ const gchar *title) {
+ g_return_val_if_fail (id != NULL, NULL);
+ g_return_val_if_fail (title != NULL, NULL);
+
+ return RYGEL_MEDIA_EXPORT_TRACKABLE_DB_CONTAINER (g_object_new (RYGEL_MEDIA_EXPORT_TYPE_TRACKABLE_DB_CONTAINER,
+ "id", id,
+ "title", title,
+ "parent", NULL,
+ "child_count", 0,
+ NULL));
+}
+
+static void
+rygel_media_export_trackable_db_container_on_child_added (RygelMediaExportTrackableDbContainer *self,
+ RygelMediaObject *object) {
+ GError *inner_error;
+ RygelMediaExportMediaCache *cache;
+
+ g_return_if_fail (RYGEL_MEDIA_EXPORT_IS_TRACKABLE_DB_CONTAINER (self));
+ g_return_if_fail (RYGEL_IS_MEDIA_OBJECT (object));
+
+ inner_error = NULL;
+ cache = rygel_media_export_db_container_get_media_db (RYGEL_MEDIA_EXPORT_DB_CONTAINER (self));
+ if (RYGEL_IS_MEDIA_ITEM (object)) {
+ rygel_media_export_media_cache_save_item (cache,
+ RYGEL_MEDIA_ITEM (object),
+ &inner_error);
+ if (inner_error) {
+ goto out;
+ }
+ } else if (RYGEL_IS_MEDIA_CONTAINER (object)) {
+ rygel_media_export_media_cache_save_container (cache,
+ RYGEL_MEDIA_CONTAINER (object),
+ &inner_error);
+ if (inner_error) {
+ goto out;
+ }
+ } else {
+ g_assert_not_reached ();
+ }
+ rygel_media_export_media_cache_save_container (cache,
+ RYGEL_MEDIA_CONTAINER (self),
+ &inner_error);
+ out:
+ if (inner_error) {
+ g_warning ("Failed to save object: %s", inner_error->message);
+ g_error_free (inner_error);
+ }
+}
+
+static void
+rygel_media_export_trackable_db_container_on_child_removed (RygelMediaExportTrackableDbContainer *self,
+ RygelMediaObject *object G_GNUC_UNUSED) {
+ GError *inner_error;
+ RygelMediaExportMediaCache *cache;
+
+ g_return_if_fail (RYGEL_MEDIA_EXPORT_IS_TRACKABLE_DB_CONTAINER (self));
+
+ inner_error = NULL;
+ cache = rygel_media_export_db_container_get_media_db (RYGEL_MEDIA_EXPORT_DB_CONTAINER (self));
+
+ rygel_media_export_media_cache_save_container (cache,
+ RYGEL_MEDIA_CONTAINER (self),
+ &inner_error);
+ if (inner_error) {
+ g_warning ("Failed to save object: %s", inner_error->message);
+ g_error_free (inner_error);
+ }
+}
+
+static void
+rygel_media_export_trackable_db_container_real_add_child (RygelTrackableContainer *base,
+ RygelMediaObject *object,
+ GAsyncReadyCallback callback,
+ gpointer user_data) {
+ RygelMediaExportDBContainer *self = RYGEL_MEDIA_EXPORT_DB_CONTAINER (base);
+ RygelMediaExportMediaCache *cache = rygel_media_export_db_container_get_media_db (self);
+ GError *inner_error = NULL;
+ GSimpleAsyncResult *async_result = g_simple_async_result_new (G_OBJECT (base),
+ callback,
+ user_data,
+ rygel_media_export_trackable_db_container_real_add_child);
+
+ if (RYGEL_IS_MEDIA_ITEM (object)) {
+ rygel_media_export_media_cache_save_item (cache,
+ RYGEL_MEDIA_ITEM (object),
+ &inner_error);
+ } else if (RYGEL_IS_MEDIA_CONTAINER (object)) {
+ rygel_media_export_media_cache_save_container (cache,
+ RYGEL_MEDIA_CONTAINER (object),
+ &inner_error);
+ } else {
+ g_assert_not_reached ();
+ }
+ if (inner_error) {
+ g_warning ("Failed to add object: %s", inner_error->message);
+ g_error_free (inner_error);
+ }
+ g_simple_async_result_complete_in_idle (async_result);
+ g_object_unref (async_result);
+}
+
+static void
+rygel_media_export_trackable_db_container_real_add_child_finish (RygelTrackableContainer *base G_GNUC_UNUSED,
+ GAsyncResult *res G_GNUC_UNUSED) {
+}
+
+static void
+rygel_media_export_trackable_db_container_real_remove_child (RygelTrackableContainer *base,
+ RygelMediaObject *object,
+ GAsyncReadyCallback callback,
+ gpointer user_data) {
+ RygelMediaExportDBContainer *self = RYGEL_MEDIA_EXPORT_DB_CONTAINER (base);
+ GError *inner_error = NULL;
+ RygelMediaExportMediaCache *cache = rygel_media_export_db_container_get_media_db (self);
+ GSimpleAsyncResult *async_result = g_simple_async_result_new (G_OBJECT (self),
+ callback,
+ user_data,
+ rygel_media_export_trackable_db_container_real_remove_child);
+
+ rygel_media_export_media_cache_remove_object (cache, object, &inner_error);
+
+ if (inner_error) {
+ g_warning ("Failed to remove object: %s", inner_error->message);
+ g_error_free (inner_error);
+ }
+
+ g_simple_async_result_complete_in_idle (async_result);
+ g_object_unref (async_result);
+}
+
+static void
+rygel_media_export_trackable_db_container_real_remove_child_finish (RygelTrackableContainer *base G_GNUC_UNUSED,
+ GAsyncResult *res G_GNUC_UNUSED) {
+}
+
+static gchar *
+rygel_media_export_trackable_db_container_real_get_service_reset_token (RygelTrackableContainer *self) {
+ RygelMediaExportMediaCache* cache = rygel_media_export_db_container_get_media_db (RYGEL_MEDIA_EXPORT_DB_CONTAINER (self));
+
+ return rygel_media_export_media_cache_get_reset_token (cache);
+}
+
+static void
+rygel_media_export_trackable_db_container_real_set_service_reset_token (RygelTrackableContainer *self,
+ const gchar *token) {
+ RygelMediaExportMediaCache *cache;
+
+ g_return_if_fail (token != NULL);
+
+ cache = rygel_media_export_db_container_get_media_db (RYGEL_MEDIA_EXPORT_DB_CONTAINER (self));
+ rygel_media_export_media_cache_save_reset_token (cache, token);
+}
+
+static guint32
+rygel_media_export_trackable_db_container_real_get_system_update_id (RygelTrackableContainer *self) {
+ RygelMediaExportMediaCache* cache = rygel_media_export_db_container_get_media_db (RYGEL_MEDIA_EXPORT_DB_CONTAINER (self));
+
+ return rygel_media_export_media_cache_get_update_id (cache);
+}
+
+static void
+rygel_media_export_trackable_db_container_real_constructed (GObject *object) {
+ RygelMediaExportTrackableDbContainer *self = RYGEL_MEDIA_EXPORT_TRACKABLE_DB_CONTAINER (object);
+
+ G_OBJECT_CLASS (rygel_media_export_trackable_db_container_parent_class)->constructed (object);
+ g_signal_connect (self,
+ "child-added",
+ G_CALLBACK (rygel_media_export_trackable_db_container_on_child_added),
+ NULL);
+ g_signal_connect (self,
+ "child-removed",
+ G_CALLBACK (rygel_media_export_trackable_db_container_on_child_removed),
+ NULL);
+}
+
+static void
+rygel_media_export_trackable_db_container_class_init (RygelMediaExportTrackableDbContainerClass *trackable_db_container_class) {
+ GObjectClass *object_class = G_OBJECT_CLASS (trackable_db_container_class);
+
+ object_class->constructed = rygel_media_export_trackable_db_container_real_constructed;
+}
+
+static void
+rygel_media_export_trackable_db_container_rygel_trackable_container_interface_init (RygelTrackableContainerIface *iface) {
+ iface->add_child = rygel_media_export_trackable_db_container_real_add_child;
+ iface->add_child_finish = rygel_media_export_trackable_db_container_real_add_child_finish;
+ iface->remove_child = rygel_media_export_trackable_db_container_real_remove_child;
+ iface->remove_child_finish = rygel_media_export_trackable_db_container_real_remove_child_finish;
+ iface->get_service_reset_token = rygel_media_export_trackable_db_container_real_get_service_reset_token;
+ iface->set_service_reset_token = rygel_media_export_trackable_db_container_real_set_service_reset_token;
+ iface->get_system_update_id = rygel_media_export_trackable_db_container_real_get_system_update_id;
+}
+
+static void
+rygel_media_export_trackable_db_container_init (RygelMediaExportTrackableDbContainer *self G_GNUC_UNUSED) {
+}