diff options
Diffstat (limited to 'src/media-export/rygel-media-export-writable-db-container.c')
-rw-r--r-- | src/media-export/rygel-media-export-writable-db-container.c | 283 |
1 files changed, 283 insertions, 0 deletions
diff --git a/src/media-export/rygel-media-export-writable-db-container.c b/src/media-export/rygel-media-export-writable-db-container.c new file mode 100644 index 0000000..5504673 --- /dev/null +++ b/src/media-export/rygel-media-export-writable-db-container.c @@ -0,0 +1,283 @@ +/* + * Copyright (C) 2010 Jens Georg <mail@jensge.org>. + * Copyright (C) 2013 Intel Corporation. + * + * Author: Jens Georg <mail@jensge.org> + * + * 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-writable-db-container.h" + +static void +rygel_media_export_writable_db_container_rygel_writable_container_interface_init (RygelWritableContainerIface * iface); + +G_DEFINE_TYPE_WITH_CODE (RygelMediaExportWritableDbContainer, + rygel_media_export_writable_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)); + +struct _RygelMediaExportWritableDbContainerPrivate { + GeeArrayList* create_classes; +}; + +enum { + RYGEL_MEDIA_EXPORT_WRITABLE_DB_CONTAINER_DUMMY_PROPERTY, + RYGEL_MEDIA_EXPORT_WRITABLE_DB_CONTAINER_CREATE_CLASSES +}; + +#define RYGEL_MEDIA_EXPORT_WRITABLE_DB_CONTAINER_GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), \ + RYGEL_MEDIA_EXPORT_TYPE_WRITABLE_DB_CONTAINER, \ + RygelMediaExportWritableDbContainerPrivate)) + +RygelMediaExportWritableDbContainer* +rygel_media_export_writable_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_WRITABLE_DB_CONTAINER (g_object_new (RYGEL_MEDIA_EXPORT_TYPE_WRITABLE_DB_CONTAINER, + "id", id, + "parent", NULL, + "title", title, + "child-count", 0, + NULL)); +} + +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, + GAsyncReadyCallback callback, + gpointer user_data) { + RygelMediaObject *object = RYGEL_MEDIA_OBJECT (item); + gchar *uri; + GFile *file; + gchar *id; + 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); + file = g_file_new_for_uri (uri); + g_free (uri); + if (g_file_is_native (file)) { + rygel_media_object_set_modified (object, G_MAXINT64); + } + id = rygel_media_export_media_cache_get_id (file); + g_object_unref (file); + rygel_media_object_set_id (object, id); + g_free (id); + + rygel_trackable_container_add_child_tracked (RYGEL_TRACKABLE_CONTAINER (base), + object, + tracked_action_ready, + simple); +} + +static void +rygel_media_export_writable_db_container_real_add_item_finish (RygelWritableContainer *base G_GNUC_UNUSED, + GAsyncResult *res, + GError **error) { + g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error); +} + +static void +rygel_media_export_writable_db_container_real_remove_item (RygelWritableContainer *base, + const gchar *id, + GCancellable *cancellable G_GNUC_UNUSED, + GAsyncReadyCallback callback, + gpointer user_data) { + RygelMediaExportDBContainer *db_container = RYGEL_MEDIA_EXPORT_DB_CONTAINER (base); + RygelMediaExportMediaCache *cache = rygel_media_export_db_container_get_media_db (db_container); + GError *error = NULL; + GSimpleAsyncResult *simple; + 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); + } +} + +static void +rygel_media_export_writable_db_container_real_remove_item_finish (RygelWritableContainer *base G_GNUC_UNUSED, + GAsyncResult *res, + GError **error) { + g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error); +} + +static GeeArrayList * +rygel_media_export_writable_db_container_real_get_create_classes (RygelWritableContainer *base) { + g_return_val_if_fail (RYGEL_MEDIA_EXPORT_IS_WRITABLE_DB_CONTAINER (base), NULL); + + return RYGEL_MEDIA_EXPORT_WRITABLE_DB_CONTAINER (base)->priv->create_classes; +} + +static void +rygel_media_export_writable_db_container_real_set_create_classes (RygelWritableContainer *base, + GeeArrayList *value) { + RygelMediaExportWritableDbContainer *self; + RygelMediaExportWritableDbContainerPrivate *priv; + GeeArrayList *old; + + g_return_if_fail (RYGEL_MEDIA_EXPORT_IS_WRITABLE_DB_CONTAINER (base)); + + self = RYGEL_MEDIA_EXPORT_WRITABLE_DB_CONTAINER (base); + priv = self->priv; + if (value) { + g_object_ref (value); + } + old = priv->create_classes; + priv->create_classes = value; + if (old) { + g_object_unref (old); + } + + g_object_notify (G_OBJECT (self), "create-classes"); +} + +static void +rygel_media_export_writable_db_container_dispose (GObject *object) { + RygelMediaExportWritableDbContainer *self = RYGEL_MEDIA_EXPORT_WRITABLE_DB_CONTAINER (object); + RygelMediaExportWritableDbContainerPrivate *priv = self->priv; + + if (priv->create_classes) { + GeeArrayList *list = priv->create_classes; + + priv->create_classes = NULL; + g_object_unref (list); + } + + G_OBJECT_CLASS (rygel_media_export_writable_db_container_parent_class)->dispose (object); +} + +static void +rygel_media_export_writable_db_container_constructed (GObject *object) { + GeeArrayList *create_classes; + GeeAbstractCollection *collection; + RygelWritableContainer *writable_container = RYGEL_WRITABLE_CONTAINER (object); + + G_OBJECT_CLASS (rygel_media_export_writable_db_container_parent_class)->constructed (object); + + create_classes = gee_array_list_new (G_TYPE_STRING, (GBoxedCopyFunc) g_strdup, g_free, NULL, NULL, NULL); + collection = GEE_ABSTRACT_COLLECTION (create_classes); + + rygel_writable_container_set_create_classes (writable_container, create_classes); + gee_abstract_collection_add (collection, RYGEL_IMAGE_ITEM_UPNP_CLASS); + gee_abstract_collection_add (collection, RYGEL_PHOTO_ITEM_UPNP_CLASS); + gee_abstract_collection_add (collection, RYGEL_VIDEO_ITEM_UPNP_CLASS); + gee_abstract_collection_add (collection, RYGEL_AUDIO_ITEM_UPNP_CLASS); + gee_abstract_collection_add (collection, RYGEL_MUSIC_ITEM_UPNP_CLASS); + g_object_unref (create_classes); +} + +static void +rygel_media_export_writable_db_container_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) { + RygelWritableContainer *writable = RYGEL_WRITABLE_CONTAINER (object); + + switch (property_id) { + case RYGEL_MEDIA_EXPORT_WRITABLE_DB_CONTAINER_CREATE_CLASSES: + g_value_set_object (value, + rygel_writable_container_get_create_classes (writable)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +rygel_media_export_writable_db_container_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) { + RygelWritableContainer *writable = RYGEL_WRITABLE_CONTAINER (object); + + switch (property_id) { + case RYGEL_MEDIA_EXPORT_WRITABLE_DB_CONTAINER_CREATE_CLASSES: + rygel_writable_container_set_create_classes (writable, + g_value_get_object (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +rygel_media_export_writable_db_container_class_init (RygelMediaExportWritableDbContainerClass *writable_db_container_class) { + GObjectClass *object_class = G_OBJECT_CLASS (writable_db_container_class); + + object_class->dispose = rygel_media_export_writable_db_container_dispose; + object_class->constructed = rygel_media_export_writable_db_container_constructed; + object_class->get_property = rygel_media_export_writable_db_container_get_property; + object_class->set_property = rygel_media_export_writable_db_container_set_property; + + g_object_class_override_property (object_class, + RYGEL_MEDIA_EXPORT_WRITABLE_DB_CONTAINER_CREATE_CLASSES, + "create-classes"); + g_type_class_add_private (writable_db_container_class, + sizeof (RygelMediaExportWritableDbContainerPrivate)); +} + +static void +rygel_media_export_writable_db_container_rygel_writable_container_interface_init (RygelWritableContainerIface *iface) { + iface->add_item = rygel_media_export_writable_db_container_real_add_item; + iface->add_item_finish = rygel_media_export_writable_db_container_real_add_item_finish; + iface->remove_item = rygel_media_export_writable_db_container_real_remove_item; + iface->remove_item_finish = rygel_media_export_writable_db_container_real_remove_item_finish; + iface->get_create_classes = rygel_media_export_writable_db_container_real_get_create_classes; + iface->set_create_classes = rygel_media_export_writable_db_container_real_set_create_classes; +} + +static void +rygel_media_export_writable_db_container_init (RygelMediaExportWritableDbContainer *self) { + self->priv = RYGEL_MEDIA_EXPORT_WRITABLE_DB_CONTAINER_GET_PRIVATE (self); +} |