static GUPnPServiceInfo *prv_remove_bm_service_sub_devices( GUPnPDeviceInfo *device_info, dld_upnp_t *upnp, const gchar *ip_address) { GList *child_devices; GList *next; GUPnPDeviceInfo *child_info = NULL; GUPnPServiceInfo *service_info = NULL; DLEYNA_LOG_DEBUG("Enter"); child_devices = gupnp_device_info_list_devices(device_info); next = child_devices; while (next != NULL) { child_info = (GUPnPDeviceInfo *)next->data; service_info = gupnp_device_info_get_service(child_info, DLD_BASIC_MANAGEMENT_SERVICE_TYPE); if (service_info != NULL) prv_remove_sub_device(upnp, (GUPnPDeviceProxy *)child_info, (GUPnPServiceProxy *)service_info, ip_address); service_info = prv_remove_bm_service_sub_devices(child_info, upnp, ip_address); if (service_info != NULL) prv_remove_sub_device(upnp, (GUPnPDeviceProxy *)child_info, (GUPnPServiceProxy *)service_info, ip_address); next = g_list_next(next); } g_list_free_full(child_devices, g_object_unref); DLEYNA_LOG_DEBUG("Exit"); return service_info; }
static void append_device_tree (GUPnPDeviceInfo *info, GtkTreeModel *model, GtkTreeIter *parent_iter) { char *friendly_name; friendly_name = gupnp_device_info_get_friendly_name (info); if (friendly_name) { GtkTreeIter device_iter; GList *child; gtk_tree_store_insert_with_values (GTK_TREE_STORE (model), &device_iter, parent_iter, -1, 0, get_icon_by_id (ICON_DEVICE), 1, friendly_name, 2, info, 5, ICON_DEVICE, -1); g_free (friendly_name); schedule_icon_update (info, on_device_icon_available); /* Append the embedded devices */ child = gupnp_device_info_list_devices (info); while (child) { append_device_tree (GUPNP_DEVICE_INFO (child->data), model, &device_iter); g_object_unref (child->data); child = g_list_delete_link (child, child); } /* Append the services */ child = gupnp_device_info_list_services (info); while (child) { append_service_tree (GUPNP_SERVICE_INFO (child->data), GTK_TREE_STORE (model), &device_iter); g_object_unref (child->data); child = g_list_delete_link (child, child); } } }