diff options
Diffstat (limited to 'libdleyna/server/device.c')
-rw-r--r-- | libdleyna/server/device.c | 424 |
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) |