summaryrefslogtreecommitdiff
path: root/libdleyna/server/device.c
diff options
context:
space:
mode:
Diffstat (limited to 'libdleyna/server/device.c')
-rw-r--r--libdleyna/server/device.c424
1 files changed, 0 insertions, 424 deletions
diff --git a/libdleyna/server/device.c b/libdleyna/server/device.c
index bccee4f..e275294 100644
--- a/libdleyna/server/device.c
+++ b/libdleyna/server/device.c
@@ -91,13 +91,6 @@ struct prv_new_device_ct_t_ {
GHashTable *property_map;
};
-typedef struct prv_new_playlist_ct_t_ prv_new_playlist_ct_t;
-struct prv_new_playlist_ct_t_ {
- dls_async_task_t *cb_data;
- gchar *id;
- gchar *parent_id;
-};
-
static void prv_get_child_count(dls_async_task_t *cb_data,
dls_device_count_cb_t cb, const gchar *id);
static void prv_retrieve_child_count_for_list(dls_async_task_t *cb_data);
@@ -4061,423 +4054,6 @@ void dls_device_update_object(dls_client_t *client,
DLEYNA_LOG_DEBUG("Exit");
}
-static void prv_didls_free(gpointer data)
-{
- prv_new_playlist_ct_t *priv_t = (prv_new_playlist_ct_t *)data;
-
- if (priv_t) {
- g_free(priv_t->id);
- g_free(priv_t->parent_id);
- g_free(priv_t);
- }
-}
-
-static void prv_playlist_upload_cb(GUPnPServiceProxy *proxy,
- GUPnPServiceProxyAction *action,
- gpointer user_data)
-{
- dls_async_task_t *cb_data = user_data;
- gchar *didls;
-
- didls = gupnp_media_collection_get_string(
- cb_data->ut.playlist.collection);
-
- DLEYNA_LOG_DEBUG_NL();
- DLEYNA_LOG_DEBUG("Collection: %s", didls);
- DLEYNA_LOG_DEBUG_NL();
-
- prv_generic_upload_cb(cb_data, NULL, didls, strlen(didls), "text/xml");
-}
-
-static void prv_create_didls_item_parse_object(GUPnPDIDLLiteParser *parser,
- GUPnPDIDLLiteObject *object,
- gpointer user_data)
-{
- const char *class;
- const char *title;
- const char *artist;
- const char *album;
- const char *uri = NULL;
- GList *resources;
- GUPnPDIDLLiteObject *item_obj;
- GUPnPDIDLLiteItem *item;
- GUPnPDIDLLiteResource *res;
- GUPnPMediaCollection *collection = user_data;
-
- if (GUPNP_IS_DIDL_LITE_CONTAINER(object))
- goto exit;
-
- class = gupnp_didl_lite_object_get_upnp_class(object);
- title = gupnp_didl_lite_object_get_title(object);
- artist = gupnp_didl_lite_object_get_artist(object);
- album = gupnp_didl_lite_object_get_album(object);
- resources = gupnp_didl_lite_object_get_resources(object);
-
- if (resources != NULL) {
- if (resources->data != NULL)
- uri = gupnp_didl_lite_resource_get_uri(resources->data);
-
- g_list_free_full(resources, g_object_unref);
- }
-
- DLEYNA_LOG_DEBUG("Create DIDL_S Item");
- DLEYNA_LOG_DEBUG("title: %s", title);
- DLEYNA_LOG_DEBUG("class: %s", class);
- DLEYNA_LOG_DEBUG("Artist: %s", artist);
- DLEYNA_LOG_DEBUG("album: %s", album);
- DLEYNA_LOG_DEBUG("URI: %s", uri);
- DLEYNA_LOG_DEBUG_NL();
-
- item = gupnp_media_collection_add_item(collection);
- item_obj = GUPNP_DIDL_LITE_OBJECT(item);
-
- if (title && *title)
- gupnp_didl_lite_object_set_title(item_obj, title);
-
- if (class && *class)
- gupnp_didl_lite_object_set_upnp_class(item_obj, class);
-
- if (artist && *artist)
- gupnp_didl_lite_object_set_artist(item_obj, artist);
-
- if (album && *album)
- gupnp_didl_lite_object_set_album(item_obj, album);
-
- if (uri && *uri) {
- res = gupnp_didl_lite_object_add_resource(item_obj);
- gupnp_didl_lite_resource_set_uri(res, uri);
- g_object_unref(res);
- }
-
- g_object_unref(item);
-
-exit:
- return;
-}
-
-static void prv_create_didls_item_browse_cb(GUPnPServiceProxy *proxy,
- GUPnPServiceProxyAction *action,
- gpointer user_data)
-{
- GError *error = NULL;
- prv_new_playlist_ct_t *priv_t = user_data;
- dls_async_task_t *cb_data = priv_t->cb_data;
- GUPnPDIDLLiteParser *parser = NULL;
- gchar *result = NULL;
- const gchar *message;
- gboolean end;
-
- end = gupnp_service_proxy_end_action(proxy, action, &error,
- "Result", G_TYPE_STRING,
- &result, NULL);
-
- if (!end || (result == NULL)) {
- message = (error != NULL) ? error->message : "Invalid result";
- DLEYNA_LOG_WARNING("Browse Object operation failed: %s",
- message);
- DLEYNA_LOG_DEBUG_NL();
-
- cb_data->error = g_error_new(DLEYNA_SERVER_ERROR,
- DLEYNA_ERROR_OPERATION_FAILED,
- "Browse operation failed: %s",
- message);
- goto on_exit;
- }
-
- DLEYNA_LOG_DEBUG_NL();
- DLEYNA_LOG_DEBUG("Result: %s", result);
- DLEYNA_LOG_DEBUG_NL();
-
- parser = gupnp_didl_lite_parser_new();
-
- g_signal_connect(parser, "object-available",
- G_CALLBACK(prv_create_didls_item_parse_object),
- cb_data->ut.playlist.collection);
-
- if (gupnp_didl_lite_parser_parse_didl(parser, result, &error))
- goto on_exit;
-
- if (error->code == GUPNP_XML_ERROR_EMPTY_NODE) {
- DLEYNA_LOG_WARNING("Property not defined for object");
-
- cb_data->error = g_error_new(DLEYNA_SERVER_ERROR,
- DLEYNA_ERROR_UNKNOWN_PROPERTY,
- "Property not defined for object");
- } else {
- DLEYNA_LOG_WARNING("Unable to parse results of browse: %s",
- error->message);
-
- cb_data->error = g_error_new(DLEYNA_SERVER_ERROR,
- DLEYNA_ERROR_OPERATION_FAILED,
- "Unable to parse results of browse: %s",
- error->message);
- }
-
-on_exit:
-
- if (cb_data->error != NULL)
- dleyna_task_processor_cancel_queue(
- cb_data->ut.playlist.queue_id);
-
- if (parser)
- g_object_unref(parser);
-
- if (error)
- g_error_free(error);
-
- g_free(result);
-}
-
-static GUPnPServiceProxyAction *prv_create_didls_item_browse(
- dleyna_service_task_t *task,
- GUPnPServiceProxy *proxy,
- gboolean *failed)
-{
- prv_new_playlist_ct_t *priv_t;
-
- priv_t = (prv_new_playlist_ct_t *)dleyna_service_task_get_user_data(
- task);
- *failed = FALSE;
-
- DLEYNA_LOG_DEBUG("Browse for ID: %s", priv_t->id);
-
- return gupnp_service_proxy_begin_action(
- proxy, "Browse",
- dleyna_service_task_begin_action_cb, task,
- "ObjectID", G_TYPE_STRING, priv_t->id,
- "BrowseFlag", G_TYPE_STRING, "BrowseMetadata",
- "Filter", G_TYPE_STRING, "upnp:artist,upnp:album,res",
- "StartingIndex", G_TYPE_INT, 0,
- "RequestedCount", G_TYPE_INT, 1,
- "SortCriteria", G_TYPE_STRING, "", NULL);
-}
-
-static gboolean prv_create_chain_didls_items(dls_task_t *task,
- GUPnPServiceProxy *proxy,
- dls_async_task_t *cb_data)
-{
- gchar *root_path = NULL;
- gchar *path;
- gchar *id = NULL;
- prv_new_playlist_ct_t *priv_t;
- dls_async_playlist_t *a_playlist = &cb_data->ut.playlist;
- GVariantIter iter;
-
- DLEYNA_LOG_DEBUG_NL();
-
- a_playlist->collection = gupnp_media_collection_new();
- gupnp_media_collection_set_title(a_playlist->collection,
- task->ut.playlist.title);
- gupnp_media_collection_set_author(a_playlist->collection,
- task->ut.playlist.creator);
-
- g_variant_iter_init(&iter, task->ut.playlist.item_path);
-
- while (g_variant_iter_next(&iter, "&o", &path)) {
- if (!dls_path_get_path_and_id(path, &root_path, &id, NULL)) {
- DLEYNA_LOG_DEBUG("Can't get id for path %s", path);
- cb_data->error = g_error_new(
- DLEYNA_SERVER_ERROR,
- DLEYNA_ERROR_OBJECT_NOT_FOUND,
- "Unable to find object for path: %s",
- path);
- goto on_error;
- }
-
- DLEYNA_LOG_DEBUG("Create Task: @id: %s - Root: %s",
- id, root_path);
-
- g_free(root_path);
-
- priv_t = g_new0(prv_new_playlist_ct_t, 1);
- priv_t->cb_data = cb_data;
- priv_t->id = id;
-
- dleyna_service_task_add(a_playlist->queue_id,
- prv_create_didls_item_browse,
- proxy,
- prv_create_didls_item_browse_cb,
- prv_didls_free, priv_t);
- }
-
- DLEYNA_LOG_DEBUG_NL();
- return TRUE;
-
-on_error:
-
- return FALSE;
-}
-
-static void prv_create_playlist_object(dls_task_create_playlist_t *t_playlist,
- dls_async_playlist_t *a_playlist,
- char *parent_id)
-{
- GUPnPDIDLLiteWriter *writer;
- GUPnPDIDLLiteObject *item;
- GUPnPProtocolInfo *protocol_info;
- GUPnPDIDLLiteResource *res;
- GUPnPDIDLLiteContributor *creator;
- GUPnPDIDLLiteContributor *author;
- GTimeVal time_v;
- gchar *time_c;
-
- writer = gupnp_didl_lite_writer_new(NULL);
- item = GUPNP_DIDL_LITE_OBJECT(gupnp_didl_lite_writer_add_item(writer));
-
- gupnp_didl_lite_object_set_id(item, "");
- gupnp_didl_lite_object_set_title(item, t_playlist->title);
- gupnp_didl_lite_object_set_genre(item, t_playlist->genre);
- gupnp_didl_lite_object_set_description(item, t_playlist->desc);
-
- creator = gupnp_didl_lite_object_add_creator(item);
- author = gupnp_didl_lite_object_add_author(item);
- gupnp_didl_lite_contributor_set_name(creator, t_playlist->creator);
- gupnp_didl_lite_contributor_set_name(author, t_playlist->creator);
-
- gupnp_didl_lite_object_set_parent_id(item, parent_id);
- gupnp_didl_lite_object_set_upnp_class(item, "object.item.playlistItem");
- gupnp_didl_lite_object_set_restricted(item, FALSE);
-
- protocol_info = gupnp_protocol_info_new();
- gupnp_protocol_info_set_mime_type(protocol_info, "text/xml");
- gupnp_protocol_info_set_protocol(protocol_info, "*");
- gupnp_protocol_info_set_network(protocol_info, "*");
- gupnp_protocol_info_set_dlna_profile(protocol_info, "DIDL_S");
-
- res = gupnp_didl_lite_object_add_resource(item);
- gupnp_didl_lite_resource_set_protocol_info(res, protocol_info);
-
- g_get_current_time(&time_v);
- time_c = g_time_val_to_iso8601(&time_v);
- gupnp_didl_lite_object_set_date(item, time_c);
-
- /* TODO: Need to compute DLNA Profile */
-
- a_playlist->didl = gupnp_didl_lite_writer_get_string(writer);
-
- DLEYNA_LOG_DEBUG("Playlist object %s created", t_playlist->title);
-
- g_object_unref(res);
- g_object_unref(protocol_info);
- g_object_unref(creator);
- g_object_unref(author);
- g_object_unref(item);
- g_object_unref(writer);
- g_free(time_c);
-}
-
-static void prv_create_didls_chain_end(gboolean cancelled, gpointer data)
-{
- prv_new_playlist_ct_t *priv_t = data;
- dls_async_task_t *cb_data = priv_t->cb_data;
- dls_async_playlist_t *a_playlist;
- dls_task_create_playlist_t *t_playlist;
-
- DLEYNA_LOG_DEBUG("Enter");
-
- if (cb_data->cancel_id) {
- if (!g_cancellable_is_cancelled(cb_data->cancellable))
- g_cancellable_disconnect(cb_data->cancellable,
- cb_data->cancel_id);
- cb_data->cancel_id = 0;
- }
-
- if (cancelled)
- goto on_clear;
-
- t_playlist = &cb_data->task.ut.playlist;
- a_playlist = &cb_data->ut.playlist;
- prv_create_playlist_object(t_playlist, a_playlist, priv_t->parent_id);
-
- DLEYNA_LOG_DEBUG("Creating object");
- cb_data->action = gupnp_service_proxy_begin_action(
- cb_data->proxy,
- "CreateObject",
- prv_playlist_upload_cb, cb_data,
- "ContainerID", G_TYPE_STRING, priv_t->parent_id,
- "Elements", G_TYPE_STRING, a_playlist->didl,
- NULL);
-
- cb_data->cancel_id = g_cancellable_connect(
- cb_data->cancellable,
- G_CALLBACK(dls_async_task_cancelled_cb),
- cb_data, NULL);
-on_clear:
-
- if (cancelled) {
- if (!cb_data->error)
- cb_data->error = g_error_new(DLEYNA_SERVER_ERROR,
- DLEYNA_ERROR_CANCELLED,
- "Operation cancelled.");
- (void) g_idle_add(dls_async_task_complete, cb_data);
- }
-
- prv_didls_free(priv_t);
-
- cb_data->ut.playlist.queue_id = NULL;
-
- DLEYNA_LOG_DEBUG("Exit");
-}
-
-static void prv_create_chain_cancelled(GCancellable *cancellable,
- gpointer user_data)
-{
- dls_async_task_t *cb_data = user_data;
- const dleyna_task_queue_key_t *queue_id = cb_data->ut.playlist.queue_id;
-
- DLEYNA_LOG_DEBUG("Enter");
-
- dleyna_task_processor_cancel_queue(queue_id);
-}
-
-void dls_device_playlist_upload(dls_client_t *client,
- dls_task_t *task,
- const gchar *parent_id)
-{
- dls_async_task_t *cb_data = (dls_async_task_t *)task;
- dls_device_context_t *context;
- prv_new_playlist_ct_t *priv_t;
- const dleyna_task_queue_key_t *queue_id;
-
- DLEYNA_LOG_DEBUG("Enter");
- DLEYNA_LOG_DEBUG("Uploading playlist to %s", parent_id);
-
- priv_t = g_new0(prv_new_playlist_ct_t, 1);
- priv_t->cb_data = cb_data;
- priv_t->parent_id = g_strdup(parent_id);
-
- queue_id = dleyna_task_processor_add_queue(
- dls_server_get_task_processor(),
- dleyna_service_task_create_source(),
- DLS_SERVER_SINK,
- DLEYNA_TASK_QUEUE_FLAG_AUTO_REMOVE,
- dleyna_service_task_process_cb,
- dleyna_service_task_cancel_cb,
- dleyna_service_task_delete_cb);
- dleyna_task_queue_set_finally(queue_id, prv_create_didls_chain_end);
- dleyna_task_queue_set_user_data(queue_id, priv_t);
-
- context = dls_device_get_context(task->target.device, client);
-
- cb_data->proxy = context->service_proxy;
- cb_data->ut.playlist.queue_id = queue_id;
-
- g_object_add_weak_pointer((G_OBJECT(context->service_proxy)),
- (gpointer *)&cb_data->proxy);
-
- if (prv_create_chain_didls_items(task, cb_data->proxy, cb_data)) {
- cb_data->cancel_id = g_cancellable_connect(
- cb_data->cancellable,
- G_CALLBACK(prv_create_chain_cancelled),
- cb_data, NULL);
- dleyna_task_queue_start(queue_id);
- } else {
- (void) g_idle_add(dls_async_task_complete, cb_data);
- }
-
- DLEYNA_LOG_DEBUG("Exit");
-}
-
static void prv_get_object_metadata_cb(GUPnPServiceProxy *proxy,
GUPnPServiceProxyAction *action,
gpointer user_data)