summaryrefslogtreecommitdiff
path: root/libdleyna/server/device.c
diff options
context:
space:
mode:
authorLudovic Ferrandis <ludovic.ferrandis@intel.com>2013-03-20 16:38:53 +0100
committerMark Ryan <mark.d.ryan@intel.com>2013-05-16 11:58:53 +0200
commitd5ce99e734b9ad5ecf3f155be2bb72178870bd74 (patch)
tree516be6c8691e09b04aa06468caaa6965178b1e94 /libdleyna/server/device.c
parent8adb58d6e787482fa57beb1b28f5542270d40781 (diff)
downloaddleyna-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.c109
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");
+}
+