diff options
author | Regis Merlino <regis.merlino@intel.com> | 2013-04-09 15:53:55 +0200 |
---|---|---|
committer | Mark Ryan <mark.d.ryan@intel.com> | 2013-04-18 11:40:11 +0200 |
commit | 4f1fb6e61ae3c4586dc51f0572e206923be401c5 (patch) | |
tree | 71de5ff4b915766f95a36f0eda0e3504e4a83d02 /libdleyna/renderer/device.c | |
parent | b3698c94b3a60d43ccbc8255839b7e2cdf050773 (diff) | |
download | dleyna-renderer-4f1fb6e61ae3c4586dc51f0572e206923be401c5.tar.gz |
[Device] Fix device construction
Signed-off-by: Regis Merlino <regis.merlino@intel.com>
Diffstat (limited to 'libdleyna/renderer/device.c')
-rw-r--r-- | libdleyna/renderer/device.c | 60 |
1 files changed, 43 insertions, 17 deletions
diff --git a/libdleyna/renderer/device.c b/libdleyna/renderer/device.c index 9ef9f55..62b9f25 100644 --- a/libdleyna/renderer/device.c +++ b/libdleyna/renderer/device.c @@ -653,6 +653,8 @@ static void prv_get_protocol_info_cb(GUPnPServiceProxy *proxy, DLEYNA_LOG_DEBUG("Enter"); + priv_t->dev->construct_step++; + end = gupnp_service_proxy_end_action(proxy, action, &error, "Sink", G_TYPE_STRING, &result, NULL); if (!end || (result == NULL)) { @@ -697,6 +699,7 @@ static GUPnPServiceProxyAction *prv_subscribe(dleyna_service_task_t *task, device = (dlr_device_t *)dleyna_service_task_get_user_data(task); + device->construct_step++; prv_device_subscribe_context(device); *failed = FALSE; @@ -721,6 +724,7 @@ static GUPnPServiceProxyAction *prv_declare(dleyna_service_task_t *task, priv_t = (prv_new_device_ct_t *)dleyna_service_task_get_user_data(task); device = priv_t->dev; + device->construct_step++; table = priv_t->dispatch_table; @@ -745,6 +749,43 @@ DLEYNA_LOG_DEBUG("Exit"); return NULL; } +void dlr_device_construct( + dlr_device_t *dev, + dlr_device_context_t *context, + dleyna_connector_id_t connection, + const dleyna_connector_dispatch_cb_t *dispatch_table, + const dleyna_task_queue_key_t *queue_id) +{ + prv_new_device_ct_t *priv_t; + GUPnPServiceProxy *s_proxy; + + DLEYNA_LOG_DEBUG("Current step: %d", dev->construct_step); + + priv_t = g_new0(prv_new_device_ct_t, 1); + + priv_t->dev = dev; + priv_t->dispatch_table = dispatch_table; + + s_proxy = context->service_proxies.cm_proxy; + + if (dev->construct_step < 1) + dleyna_service_task_add(queue_id, prv_get_protocol_info, + s_proxy, prv_get_protocol_info_cb, + NULL, priv_t); + + /* The following task should always be completed */ + dleyna_service_task_add(queue_id, prv_subscribe, s_proxy, + NULL, NULL, dev); + + if (dev->construct_step < 3) + dleyna_service_task_add(queue_id, prv_declare, s_proxy, + NULL, g_free, priv_t); + + dleyna_task_queue_start(queue_id); + + DLEYNA_LOG_DEBUG("Exit"); +} + dlr_device_t *dlr_device_new( dleyna_connector_id_t connection, GUPnPDeviceProxy *proxy, @@ -754,10 +795,8 @@ dlr_device_t *dlr_device_new( const dleyna_task_queue_key_t *queue_id) { dlr_device_t *dev; - prv_new_device_ct_t *priv_t; gchar *new_path; dlr_device_context_t *context; - GUPnPServiceProxy *s_proxy; DLEYNA_LOG_DEBUG("New Device on %s", ip_address); @@ -765,33 +804,20 @@ dlr_device_t *dlr_device_new( DLEYNA_LOG_DEBUG("Server Path %s", new_path); dev = g_new0(dlr_device_t, 1); - priv_t = g_new0(prv_new_device_ct_t, 1); dev->connection = connection; dev->contexts = g_ptr_array_new_with_free_func(prv_dlr_context_delete); dev->path = new_path; dev->rate = g_strdup("1"); - priv_t->dev = dev; - priv_t->dispatch_table = dispatch_table; - prv_props_init(&dev->props); prv_device_append_new_context(dev, ip_address, proxy); context = dlr_device_get_context(dev); - s_proxy = context->service_proxies.cm_proxy; - dleyna_service_task_add(queue_id, prv_get_protocol_info, s_proxy, - prv_get_protocol_info_cb, NULL, priv_t); - - dleyna_service_task_add(queue_id, prv_subscribe, s_proxy, - NULL, NULL, dev); - - dleyna_service_task_add(queue_id, prv_declare, s_proxy, - NULL, g_free, priv_t); - - dleyna_task_queue_start(queue_id); + dlr_device_construct(dev, context, connection, + dispatch_table, queue_id); DLEYNA_LOG_DEBUG("Exit"); |