예제 #1
0
static void prv_renderer_device_method_call(
					dleyna_connector_id_t conn,
					const gchar *sender,
					const gchar *object,
					const gchar *interface,
					const gchar *method,
					GVariant *parameters,
					dleyna_connector_msg_id_t invocation)
{
	const gchar *device_id = NULL;
	GError *error = NULL;
	const dleyna_task_queue_key_t *queue_id;

	device_id = prv_get_device_id(object, &error);
	if (!device_id) {
		g_context.connector->return_error(invocation, error);
		g_error_free(error);

		goto finished;
	}

	if (!strcmp(method, DLR_INTERFACE_CANCEL)) {
		queue_id = dleyna_task_processor_lookup_queue(
							g_context.processor,
							sender, device_id);
		if (queue_id)
			dleyna_task_processor_cancel_queue(queue_id);

		g_context.connector->return_response(invocation, NULL);
	}

finished:

		return;
}
예제 #2
0
static void prv_add_task(dls_task_t *task, const gchar *source,
			 const gchar *sink)
{
	dls_client_t *client;
	const dleyna_task_queue_key_t *queue_id;

	if (!g_hash_table_lookup(g_context.watchers, source)) {
		client = g_new0(dls_client_t, 1);
		client->prefer_local_addresses = TRUE;
		g_context.connector->watch_client(source);
		g_hash_table_insert(g_context.watchers, g_strdup(source),
				    client);
	}

	queue_id = dleyna_task_processor_lookup_queue(g_context.processor,
						      source, sink);
	if (!queue_id)
		queue_id = dleyna_task_processor_add_queue(
					g_context.processor,
					source,
					sink,
					DLEYNA_TASK_QUEUE_FLAG_AUTO_START,
					prv_process_task,
					prv_cancel_task,
					prv_delete_task);

	dleyna_task_queue_add_task(queue_id, &task->atom);
}
예제 #3
0
static void prv_add_task(dlr_task_t *task, const gchar *source,
			 const gchar *sink)
{
	const dleyna_task_queue_key_t *queue_id;

	if (g_context.connector->watch_client(source))
		g_context.watchers++;

	queue_id = dleyna_task_processor_lookup_queue(g_context.processor,
						      source, sink);
	if (!queue_id)
		queue_id = dleyna_task_processor_add_queue(
					g_context.processor,
					source,
					sink,
					DLEYNA_TASK_QUEUE_FLAG_AUTO_START,
					prv_process_task,
					prv_cancel_task,
					prv_delete_task);

	dleyna_task_queue_add_task(queue_id, &task->atom);
}
예제 #4
0
static void prv_device_method_call(dleyna_connector_id_t conn,
				   const gchar *sender,
				   const gchar *object,
				   const gchar *interface,
				   const gchar *method,
				   GVariant *parameters,
				   dleyna_connector_msg_id_t invocation)
{
	dld_task_t *task;
	const gchar *device_id = NULL;
	GError *error = NULL;
	const dleyna_task_queue_key_t *queue_id;

	device_id = prv_get_device_id(object, &error);
	if (!device_id) {
		g_context.connector->return_error(invocation, error);
		g_error_free(error);

		goto finished;
	}

	if (!strcmp(method, DLD_INTERFACE_CANCEL)) {
		queue_id = dleyna_task_processor_lookup_queue(
							g_context.processor,
							sender, device_id);
		if (queue_id)
			dleyna_task_processor_cancel_queue(queue_id);

		g_context.connector->return_response(invocation, NULL);
	} else if (!strcmp(method, DLD_INTERFACE_GET_ICON)) {
		task = dld_task_get_icon_new(invocation, object, parameters);
		prv_add_task(task, sender, device_id);
	} else if (!strcmp(method, DLD_INTERFACE_GET_TEST_INFO)) {
		task = dld_task_get_test_info_new(invocation, object,
						  parameters);
		prv_add_task(task, sender, device_id);
	} else if (!strcmp(method, DLD_INTERFACE_CANCEL_TEST)) {
		task = dld_task_cancel_test_new(invocation, object,
						parameters);
		prv_add_task(task, sender, device_id);
	} else if (!strcmp(method, DLD_INTERFACE_PING)) {
		task = dld_task_ping_new(invocation, object, parameters);
		prv_add_task(task, sender, device_id);
	} else if (!strcmp(method, DLD_INTERFACE_GET_PING_RESULT)) {
		task = dld_task_get_ping_result_new(invocation, object,
						    parameters);
		prv_add_task(task, sender, device_id);
	} else if (!strcmp(method, DLD_INTERFACE_NSLOOKUP)) {
		task = dld_task_nslookup_new(invocation, object, parameters);
		prv_add_task(task, sender, device_id);
	} else if (!strcmp(method, DLD_INTERFACE_GET_NSLOOKUP_RESULT)) {
		task = dld_task_get_nslookup_result_new(invocation, object,
							parameters);
		prv_add_task(task, sender, device_id);
	} else if (!strcmp(method, DLD_INTERFACE_TRACEROUTE)) {
		task = dld_task_traceroute_new(invocation, object, parameters);
		prv_add_task(task, sender, device_id);
	} else if (!strcmp(method, DLD_INTERFACE_GET_TRACEROUTE_RESULT)) {
		task = dld_task_get_traceroute_result_new(invocation, object,
							  parameters);
		prv_add_task(task, sender, device_id);
	}

finished:

	return;
}
예제 #5
0
static void prv_device_method_call(dleyna_connector_id_t conn,
				   const gchar *sender,
				   const gchar *object,
				   const gchar *interface,
				   const gchar *method,
				   GVariant *parameters,
				   dleyna_connector_msg_id_t invocation)
{
	dls_task_t *task;
	GError *error = NULL;
	const gchar *device_id;
	const dleyna_task_queue_key_t *queue_id;

	if (!strcmp(method, DLS_INTERFACE_UPLOAD_TO_ANY)) {
		task = dls_task_upload_to_any_new(invocation,
						  object, parameters, &error);
	} else if (!strcmp(method, DLS_INTERFACE_CREATE_CONTAINER_IN_ANY)) {
		task = dls_task_create_container_new_generic(
					invocation,
					DLS_TASK_CREATE_CONTAINER_IN_ANY,
					object, parameters, &error);
	} else if (!strcmp(method, DLS_INTERFACE_GET_UPLOAD_STATUS)) {
		task = dls_task_get_upload_status_new(invocation,
						      object, parameters,
						      &error);
	} else if (!strcmp(method, DLS_INTERFACE_GET_UPLOAD_IDS)) {
		task = dls_task_get_upload_ids_new(invocation, object,
						   &error);
	} else if (!strcmp(method, DLS_INTERFACE_CANCEL_UPLOAD)) {
		task = dls_task_cancel_upload_new(invocation, object,
						  parameters, &error);
	} else if (!strcmp(method, DLS_INTERFACE_GET_ICON)) {
		task = dls_task_get_icon_new(invocation, object, parameters,
					     &error);
	} else if (!strcmp(method, DLS_INTERFACE_BROWSE_OBJECTS)) {
		task = dls_task_browse_objects_new(invocation, object,
						   parameters, &error);
	} else if (!strcmp(method, DLS_INTERFACE_WAKE)) {
		task = dls_task_wake_new(invocation, object, &error);
	} else if (!strcmp(method, DLS_INTERFACE_CANCEL)) {
		task = NULL;

		device_id = prv_get_device_id(object, &error);
		if (!device_id)
			goto on_error;

		queue_id = dleyna_task_processor_lookup_queue(
							g_context.processor,
							sender,
							device_id);
		if (queue_id)
			dleyna_task_processor_cancel_queue(queue_id);

		g_context.connector->return_response(invocation, NULL);

		goto finished;
	} else {
		goto finished;
	}

on_error:

	if (!task) {
		g_context.connector->return_error(invocation, error);
		g_error_free(error);

		goto finished;
	}

	prv_add_task(task, sender, task->target.device->path);

finished:

	return;
}