diff options
Diffstat (limited to 'libdleyna/server/task.c')
-rw-r--r-- | libdleyna/server/task.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/libdleyna/server/task.c b/libdleyna/server/task.c index 312efc0..ec63d8e 100644 --- a/libdleyna/server/task.c +++ b/libdleyna/server/task.c @@ -222,6 +222,24 @@ static gboolean prv_set_task_target_info(dls_task_t *task, const gchar *path, &task->target.device, error); } +static gboolean prv_is_task_allowed(dls_task_t *task, GError **error) +{ + if (dls_server_is_device_sleeping(task->target.device)) { + if (task->type != DLS_TASK_WAKE && + task->type != DLS_TASK_GET_PROP) + goto on_error; + } + + return TRUE; + +on_error: + *error = g_error_new(DLEYNA_SERVER_ERROR, + DLEYNA_ERROR_OPERATION_FAILED, + "Target device is sleeping"); + + return FALSE; +} + static dls_task_t *prv_m2spec_task_new(dls_task_type_t type, dleyna_connector_msg_id_t invocation, const gchar *path, @@ -238,14 +256,16 @@ static dls_task_t *prv_m2spec_task_new(dls_task_type_t type, task = (dls_task_t *)g_new0(dls_async_task_t, 1); } - if (!prv_set_task_target_info(task, path, error)) { + task->type = type; + + if (!prv_set_task_target_info(task, path, error) || + !prv_is_task_allowed(task, error)) { prv_delete(task); task = NULL; goto finished; } - task->type = type; task->invocation = invocation; task->result_format = result_format; |