diff options
author | Ludovic Ferrandis <ludovic.ferrandis@intel.com> | 2013-03-20 16:38:53 +0100 |
---|---|---|
committer | Mark Ryan <mark.d.ryan@intel.com> | 2013-05-16 11:58:53 +0200 |
commit | d5ce99e734b9ad5ecf3f155be2bb72178870bd74 (patch) | |
tree | 516be6c8691e09b04aa06468caaa6965178b1e94 /libdleyna/server/device.c | |
parent | 8adb58d6e787482fa57beb1b28f5542270d40781 (diff) | |
download | dleyna-server-d5ce99e734b9ad5ecf3f155be2bb72178870bd74.tar.gz |
[API] Add CreateReference method to org.gnome.MediaContainer2
Fix https://github.com/01org/dleyna-server/issues/7
Signed-off-by: Ludovic Ferrandis <ludovic.ferrandis@intel.com>
Diffstat (limited to 'libdleyna/server/device.c')
-rw-r--r-- | libdleyna/server/device.c | 109 |
1 files changed, 107 insertions, 2 deletions
diff --git a/libdleyna/server/device.c b/libdleyna/server/device.c index e275294..977479a 100644 --- a/libdleyna/server/device.c +++ b/libdleyna/server/device.c @@ -2846,11 +2846,13 @@ static gchar *prv_create_new_container_didl(const gchar *parent_id, gupnp_didl_lite_object_set_parent_id(item, parent_id); gupnp_didl_lite_object_set_upnp_class(item, actual_type); gupnp_didl_lite_object_set_restricted(item, FALSE); + flags = GUPNP_OCM_FLAGS_UPLOAD | GUPNP_OCM_FLAGS_CREATE_CONTAINER | GUPNP_OCM_FLAGS_DESTROYABLE | GUPNP_OCM_FLAGS_UPLOAD_DESTROYABLE | GUPNP_OCM_FLAGS_CHANGE_METADATA; + gupnp_didl_lite_object_set_dlna_managed(item, flags); g_variant_iter_init(&iter, task->ut.create_container.child_types); @@ -3362,7 +3364,6 @@ static void prv_generic_upload_cb(dls_async_task_t *cb_data, if (!gupnp_didl_lite_parser_parse_didl(parser, result, &error) && error->code != GUPNP_XML_ERROR_EMPTY_NODE) { - DLEYNA_LOG_WARNING( "Unable to parse results of CreateObject: %s", error->message); @@ -3864,7 +3865,6 @@ static void prv_get_xml_fragments(GUPnPDIDLLiteParser *parser, (void) g_variant_iter_init(&viter, task_data->to_add_update); while (g_variant_iter_next(&viter, "{&sv}", &prop, &value)) { - DLEYNA_LOG_DEBUG("to_add_update = %s", prop); prop_map = g_hash_table_lookup(cb_task_data->map, prop); @@ -4133,3 +4133,108 @@ void dls_device_get_object_metadata(dls_client_t *client, DLEYNA_LOG_DEBUG("Exit"); } + +static void prv_create_reference_cb(GUPnPServiceProxy *proxy, + GUPnPServiceProxyAction *action, + gpointer user_data) +{ + GError *error = NULL; + dls_async_task_t *cb_data = user_data; + const gchar *message; + gchar *object_id = NULL; + gchar *object_path; + gboolean end; + + DLEYNA_LOG_DEBUG("Enter"); + + end = gupnp_service_proxy_end_action(cb_data->proxy, cb_data->action, + &error, + "NewID", G_TYPE_STRING, &object_id, + NULL); + if (!end || (object_id == NULL)) { + message = (error != NULL) ? error->message : "Invalid result"; + DLEYNA_LOG_WARNING("CreateReference operation failed: %s", + message); + + cb_data->error = g_error_new(DLEYNA_SERVER_ERROR, + DLEYNA_ERROR_OPERATION_FAILED, + "Update Object operation " + " failed: %s", + message); + + goto on_error; + } + + object_path = dls_path_from_id(cb_data->task.target.root_path, + object_id); + + DLEYNA_LOG_DEBUG("Result @id: %s - Path: %s", object_id, object_path); + + cb_data->task.result = g_variant_ref_sink(g_variant_new_object_path( + object_path)); + g_free(object_path); + +on_error: + + (void) g_idle_add(dls_async_task_complete, cb_data); + g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id); + + g_free(object_id); + + if (error != NULL) + g_error_free(error); + + DLEYNA_LOG_DEBUG("Exit"); +} + +void dls_device_create_reference(dls_client_t *client, + dls_task_t *task) +{ + dls_async_task_t *cb_data = (dls_async_task_t *)task; + dls_device_context_t *context; + gchar *i_root = NULL; + gchar *i_id = NULL; + gchar *path = cb_data->task.ut.create_reference.item_path; + + DLEYNA_LOG_DEBUG("Enter"); + DLEYNA_LOG_DEBUG("Create Reference for path: %s", path); + + if (!dls_path_get_path_and_id(path, &i_root, &i_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 Reference for @id: %s", i_id); + DLEYNA_LOG_DEBUG(" In Container @id: %s", task->target.id); + + context = dls_device_get_context(task->target.device, client); + + cb_data->action = gupnp_service_proxy_begin_action( + context->service_proxy, "CreateReference", + prv_create_reference_cb, cb_data, + "ContainerID", G_TYPE_STRING, task->target.id, + "ObjectID", G_TYPE_STRING, i_id, + NULL); + + cb_data->proxy = context->service_proxy; + + g_object_add_weak_pointer((G_OBJECT(context->service_proxy)), + (gpointer *)&cb_data->proxy); + + cb_data->cancel_id = g_cancellable_connect( + cb_data->cancellable, + G_CALLBACK(dls_async_task_cancelled_cb), + cb_data, NULL); + +on_error: + + g_free(i_root); + g_free(i_id); + + DLEYNA_LOG_DEBUG("Exit"); +} + |