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; }
void dleyna_service_task_process_cb(dleyna_task_atom_t *atom, gpointer user_data) { gboolean failed = FALSE; dleyna_service_task_t *task = (dleyna_service_task_t *)atom; task->p_action = task->t_action(task, task->proxy, &failed); if (failed) dleyna_task_processor_cancel_queue(task->base.queue_id); if (!task->p_action) dleyna_task_queue_task_completed(task->base.queue_id); }
static void prv_server_unavailable_cb(GUPnPControlPoint *cp, GUPnPDeviceProxy *proxy, gpointer user_data) { dls_upnp_t *upnp = user_data; const char *udn; dls_device_t *device; const gchar *ip_address; unsigned int i; dls_device_context_t *context; gboolean subscribed; gboolean construction_ctx = FALSE; gboolean under_construction = FALSE; prv_device_new_ct_t *priv_t; const dleyna_task_queue_key_t *queue_id; DLEYNA_LOG_DEBUG("Enter"); udn = gupnp_device_info_get_udn((GUPnPDeviceInfo *)proxy); ip_address = gupnp_context_get_host_ip( gupnp_control_point_get_context(cp)); if (!udn || !ip_address) goto on_error; DLEYNA_LOG_DEBUG("UDN %s", udn); DLEYNA_LOG_DEBUG("IP Address %s", ip_address); device = g_hash_table_lookup(upnp->server_udn_map, udn); if (!device) { priv_t = g_hash_table_lookup(upnp->server_uc_map, udn); if (priv_t) { device = priv_t->device; under_construction = TRUE; } } if (!device) { DLEYNA_LOG_WARNING("Device not found. Ignoring"); goto on_error; } for (i = 0; i < device->contexts->len; ++i) { context = g_ptr_array_index(device->contexts, i); if (!strcmp(context->ip_address, ip_address)) break; } if (i >= device->contexts->len) goto on_error; subscribed = context->subscribed; if (under_construction) construction_ctx = !strcmp(context->ip_address, priv_t->ip_address); (void) g_ptr_array_remove_index(device->contexts, i); if (device->contexts->len == 0) { if (!under_construction) { DLEYNA_LOG_DEBUG("Last Context lost. Delete device"); upnp->lost_server(device->path, upnp->user_data); g_hash_table_remove(upnp->server_udn_map, udn); } else { DLEYNA_LOG_WARNING( "Device under construction. Cancelling"); dleyna_task_processor_cancel_queue(priv_t->queue_id); } } else if (under_construction && construction_ctx) { DLEYNA_LOG_WARNING( "Device under construction. Switching context"); /* Cancel previous contruction task chain */ g_hash_table_remove(priv_t->upnp->server_uc_map, priv_t->udn); dleyna_task_queue_set_finally(priv_t->queue_id, prv_device_context_switch_end); dleyna_task_processor_cancel_queue(priv_t->queue_id); /* Create a new construction task chain */ context = dls_device_get_context(device, NULL); queue_id = prv_create_device_queue(&priv_t); prv_update_device_context(priv_t, upnp, udn, device, context->ip_address, queue_id); /* Start tasks from current construction step */ dls_device_construct(device, context, upnp->connection, upnp->interface_info, upnp->property_map, queue_id); } else if (subscribed && !device->timeout_id) { DLEYNA_LOG_DEBUG("Subscribe on new context"); device->timeout_id = g_timeout_add_seconds(1, prv_subscribe_to_contents_change, device); } on_error: DLEYNA_LOG_DEBUG("Exit"); DLEYNA_LOG_DEBUG_NL(); return; }
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; }
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; }
static void prv_server_unavailable_cb(GUPnPControlPoint *cp, GUPnPDeviceProxy *proxy, gpointer user_data) { dls_upnp_t *upnp = user_data; const char *udn; dls_device_t *device; const gchar *ip_address; unsigned int i; dls_device_context_t *context; gboolean subscribed; gboolean under_construction = FALSE; prv_device_new_ct_t *priv_t; DLEYNA_LOG_DEBUG("Enter"); udn = gupnp_device_info_get_udn((GUPnPDeviceInfo *)proxy); if (!udn) goto on_error; ip_address = gupnp_context_get_host_ip( gupnp_control_point_get_context(cp)); DLEYNA_LOG_DEBUG("UDN %s", udn); DLEYNA_LOG_DEBUG("IP Address %s", ip_address); device = g_hash_table_lookup(upnp->server_udn_map, udn); if (!device) { priv_t = g_hash_table_lookup(upnp->server_uc_map, udn); if (priv_t) { device = priv_t->device; under_construction = TRUE; } } if (!device) { DLEYNA_LOG_WARNING("Device not found. Ignoring"); goto on_error; } for (i = 0; i < device->contexts->len; ++i) { context = g_ptr_array_index(device->contexts, i); if (!strcmp(context->ip_address, ip_address)) break; } if (i >= device->contexts->len) goto on_error; subscribed = context->subscribed; (void) g_ptr_array_remove_index(device->contexts, i); if (device->contexts->len == 0) { if (!under_construction) { DLEYNA_LOG_DEBUG("Last Context lost. Delete device"); upnp->lost_server(device->path, upnp->user_data); g_hash_table_remove(upnp->server_udn_map, udn); } else { DLEYNA_LOG_WARNING( "Device under construction. Cancelling"); dleyna_task_processor_cancel_queue(priv_t->queue_id); } } else if (subscribed && !device->timeout_id) { DLEYNA_LOG_DEBUG("Subscribe on new context"); device->timeout_id = g_timeout_add_seconds(1, prv_subscribe_to_contents_change, device); } on_error: DLEYNA_LOG_DEBUG("Exit"); DLEYNA_LOG_DEBUG_NL(); return; }
static void prv_remove_device(dld_upnp_t *upnp, const gchar *ip_address, const char *udn) { dld_device_t *device; unsigned int i; dld_device_context_t *context; gboolean subscribed; gboolean under_construction = FALSE; prv_device_new_ct_t *priv_t; gboolean construction_ctx = FALSE; const dleyna_task_queue_key_t *queue_id; DLEYNA_LOG_DEBUG("Enter"); device = g_hash_table_lookup(upnp->device_udn_map, udn); if (!device) { priv_t = g_hash_table_lookup(upnp->device_uc_map, udn); if (priv_t) { device = priv_t->device; under_construction = TRUE; } } if (!device) { DLEYNA_LOG_WARNING("Device not found. Ignoring"); goto on_error; } for (i = 0; i < device->contexts->len; ++i) { context = g_ptr_array_index(device->contexts, i); if (!strcmp(context->ip_address, ip_address)) break; } if (i < device->contexts->len) { subscribed = (context->bms.subscribed); if (under_construction) construction_ctx = !strcmp(context->ip_address, priv_t->ip_address); (void) g_ptr_array_remove_index(device->contexts, i); if (device->contexts->len == 0) { if (!under_construction) { DLEYNA_LOG_DEBUG( "Last Context lost. Delete device"); upnp->lost_device(device->path); g_hash_table_remove(upnp->device_udn_map, udn); } else { DLEYNA_LOG_WARNING( "Device under construction. Cancelling"); dleyna_task_processor_cancel_queue( priv_t->queue_id); } } else if (under_construction && construction_ctx) { DLEYNA_LOG_WARNING( "Device under construction. Switching context"); /* Cancel previous contruction task chain */ g_hash_table_remove(priv_t->upnp->device_uc_map, priv_t->udn); dleyna_task_queue_set_finally( priv_t->queue_id, prv_device_context_switch_end); dleyna_task_processor_cancel_queue(priv_t->queue_id); /* Create a new construction task chain */ context = dld_device_get_context(device); queue_id = prv_create_device_queue(&priv_t); prv_update_device_context(priv_t, upnp, udn, device, context->ip_address, queue_id); /* Start tasks from current construction step */ dld_device_construct(device, context, upnp->connection, upnp->interface_info, queue_id); } else if (subscribed && !device->timeout_id) { DLEYNA_LOG_DEBUG("Subscribe on new context"); device->timeout_id = g_timeout_add_seconds(1, prv_subscribe_to_service_changes, device); } } on_error: DLEYNA_LOG_DEBUG("Exit"); return; }