summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libdleyna/server/device.c29
-rw-r--r--libdleyna/server/props.c10
-rw-r--r--libdleyna/server/task.c3
-rw-r--r--libdleyna/server/upnp.c3
4 files changed, 40 insertions, 5 deletions
diff --git a/libdleyna/server/device.c b/libdleyna/server/device.c
index 34818a8..a83c3da 100644
--- a/libdleyna/server/device.c
+++ b/libdleyna/server/device.c
@@ -2797,11 +2797,16 @@ static gchar *prv_create_new_container_didl(const gchar *parent_id,
GUPnPDIDLLiteWriter *writer;
GUPnPDIDLLiteObject *item;
GUPnPDIDLLiteContainer *container;
- gchar *retval;
GVariantIter iter;
GVariant *child_type;
const gchar *actual_type;
GUPnPOCMFlags flags;
+ gchar *retval = NULL;
+
+ actual_type = dls_props_media_spec_to_upnp_class(
+ task->ut.create_container.type);
+ if (!actual_type)
+ goto on_error;
writer = gupnp_didl_lite_writer_new(NULL);
item = GUPNP_DIDL_LITE_OBJECT(
@@ -2813,8 +2818,6 @@ static gchar *prv_create_new_container_didl(const gchar *parent_id,
item,
task->ut.create_container.display_name);
gupnp_didl_lite_object_set_parent_id(item, parent_id);
- actual_type = dls_props_media_spec_to_upnp_class(
- task->ut.create_container.type);
gupnp_didl_lite_object_set_upnp_class(item, actual_type);
gupnp_didl_lite_object_set_restricted(item, FALSE);
flags = GUPNP_OCM_FLAGS_UPLOAD |
@@ -2839,6 +2842,8 @@ static gchar *prv_create_new_container_didl(const gchar *parent_id,
g_object_unref(item);
g_object_unref(writer);
+on_error:
+
return retval;
}
@@ -3639,6 +3644,14 @@ void dls_device_create_container(dls_client_t *client,
context = dls_device_get_context(task->target.device, client);
didl = prv_create_new_container_didl(parent_id, task);
+ if (!didl) {
+ DLEYNA_LOG_WARNING("Unable to create didl");
+
+ cb_data->error = g_error_new(DLEYNA_SERVER_ERROR,
+ DLEYNA_ERROR_OPERATION_FAILED,
+ "Unable to create didl");
+ goto on_error;
+ }
DLEYNA_LOG_DEBUG("DIDL: %s", didl);
@@ -3661,7 +3674,11 @@ void dls_device_create_container(dls_client_t *client,
g_free(didl);
+on_error:
+
DLEYNA_LOG_DEBUG("Exit");
+
+ return;
}
static void prv_update_object_update_cb(GUPnPServiceProxy *proxy,
@@ -3749,11 +3766,13 @@ static gchar *prv_get_new_xml_fragment(GUPnPDIDLLiteObject *object,
} else if (mask & DLS_UPNP_MASK_PROP_TYPE) {
upnp_class = dls_props_media_spec_to_upnp_class(
g_variant_get_string(value, NULL));
+ if (!upnp_class)
+ goto on_error;
gupnp_didl_lite_object_set_upnp_class(object, upnp_class);
retval = gupnp_didl_lite_object_get_upnp_class_xml_string(
- object);
+ object);
} else if (mask & DLS_UPNP_MASK_PROP_TRACK_NUMBER) {
gupnp_didl_lite_object_set_track_number(
object,
@@ -3776,6 +3795,8 @@ static gchar *prv_get_new_xml_fragment(GUPnPDIDLLiteObject *object,
retval = gupnp_didl_lite_object_get_artists_xml_string(object);
}
+on_error:
+
return retval;
}
diff --git a/libdleyna/server/props.c b/libdleyna/server/props.c
index 983002e..aada049 100644
--- a/libdleyna/server/props.c
+++ b/libdleyna/server/props.c
@@ -1047,6 +1047,9 @@ const gchar *dls_props_media_spec_to_upnp_class(const gchar *m2spec_class)
{
const gchar *retval = NULL;
+ if (!m2spec_class)
+ goto on_error;
+
if (!strcmp(m2spec_class, gMediaSpec2AlbumPhoto))
retval = gUPnPPhotoAlbum;
else if (!strcmp(m2spec_class, gMediaSpec2AlbumMusic))
@@ -1090,6 +1093,8 @@ const gchar *dls_props_media_spec_to_upnp_class(const gchar *m2spec_class)
else if (!strcmp(m2spec_class, gMediaSpec2Item))
retval = gUPnPItem;
+on_error:
+
return retval;
}
@@ -1098,6 +1103,9 @@ const gchar *dls_props_upnp_class_to_media_spec(const gchar *upnp_class)
const gchar *retval = NULL;
const gchar *ptr;
+ if (!upnp_class)
+ goto on_error;
+
if (!strncmp(upnp_class, gUPnPAlbum, gUPnPAlbumLen)) {
ptr = upnp_class + gUPnPAlbumLen;
if (!strcmp(ptr, ".photoAlbum"))
@@ -1159,6 +1167,8 @@ const gchar *dls_props_upnp_class_to_media_spec(const gchar *upnp_class)
retval = gMediaSpec2Item;
}
+on_error:
+
return retval;
}
diff --git a/libdleyna/server/task.c b/libdleyna/server/task.c
index 3d74c56..bed8003 100644
--- a/libdleyna/server/task.c
+++ b/libdleyna/server/task.c
@@ -91,7 +91,8 @@ static void prv_delete(dls_task_t *task)
case DLS_TASK_CREATE_CONTAINER_IN_ANY:
g_free(task->ut.create_container.display_name);
g_free(task->ut.create_container.type);
- g_variant_unref(task->ut.create_container.child_types);
+ if (task->ut.create_container.child_types)
+ g_variant_unref(task->ut.create_container.child_types);
break;
case DLS_TASK_UPDATE_OBJECT:
if (task->ut.update.to_add_update)
diff --git a/libdleyna/server/upnp.c b/libdleyna/server/upnp.c
index 073e9a2..b66be43 100644
--- a/libdleyna/server/upnp.c
+++ b/libdleyna/server/upnp.c
@@ -916,6 +916,9 @@ void dls_upnp_create_container(dls_upnp_t *upnp, dls_client_t *client,
dls_device_create_container(client, task, task->target.id);
+ if (!cb_data->action)
+ (void) g_idle_add(dls_async_task_complete, cb_data);
+
DLEYNA_LOG_DEBUG("Exit");
}