GObject * start_upnp_server (void) { GUPnPContext *context; GUPnPRootDevice *dev; GUPnPServiceInfo *service; GUPnPDeviceInfo *subdev1; GUPnPDeviceInfo *subdev2; context = gupnp_context_new (NULL, NULL, 0, NULL); ts_fail_if (context == NULL, "Can't get gupnp context"); if (g_getenv ("UPNP_XML_PATH")) { gchar **paths = g_strsplit (g_getenv ("UPNP_XML_PATH"), ":", 0); gint i; for (i=0; paths[i]; i++) { gupnp_context_host_path (context, paths[i], ""); } g_strfreev (paths); } else { gupnp_context_host_path (context, "upnp/InternetGatewayDevice.xml", "/InternetGatewayDevice.xml"); gupnp_context_host_path (context, "upnp/WANIPConnection.xml", "/WANIPConnection.xml"); } dev = gupnp_root_device_new (context, "/InternetGatewayDevice.xml"); ts_fail_if (dev == NULL, "could not get root dev"); subdev1 = gupnp_device_info_get_device (GUPNP_DEVICE_INFO (dev), "urn:schemas-upnp-org:device:WANDevice:1"); ts_fail_if (subdev1 == NULL, "Could not get WANDevice"); subdev2 = gupnp_device_info_get_device (subdev1, "urn:schemas-upnp-org:device:WANConnectionDevice:1"); ts_fail_if (subdev2 == NULL, "Could not get WANConnectionDevice"); g_object_unref (subdev1); service = gupnp_device_info_get_service (subdev2, "urn:schemas-upnp-org:service:WANIPConnection:1"); ts_fail_if (service == NULL, "Could not get WANIPConnection"); g_object_unref (subdev2); g_signal_connect (service, "action-invoked::GetExternalIPAddress", G_CALLBACK (get_external_ip_address_cb), NULL); g_signal_connect (service, "action-invoked::AddPortMapping", G_CALLBACK (add_port_mapping_cb), NULL); g_signal_connect (service, "action-invoked::DeletePortMapping", G_CALLBACK (delete_port_mapping_cb), NULL); gupnp_root_device_set_available (dev, TRUE); return G_OBJECT (context); }
static GUPnPDeviceInfo *prv_lookup_dms_child_device(GUPnPDeviceInfo *proxy) { GList *child_devices; GList *next; const gchar *device_type; GUPnPDeviceInfo *info = NULL; GUPnPDeviceInfo *child_info = NULL; child_devices = gupnp_device_info_list_device_types(proxy); next = child_devices; while (next != NULL) { device_type = (gchar *)next->data; child_info = gupnp_device_info_get_device(proxy, device_type); if (g_str_has_prefix(device_type, DLS_DMS_DEVICE_TYPE)) { break; } else { info = prv_lookup_dms_child_device(child_info); g_object_unref(child_info); child_info = NULL; if (info != NULL) { child_info = info; break; } } next = g_list_next(next); } g_list_free_full(child_devices, (GDestroyNotify)g_free); return child_info; }
static void run_gupnp_simple_igd_test (GMainContext *mainctx, GUPnPSimpleIgd *igd, guint requested_port) { GUPnPContext *context; GUPnPRootDevice *dev; GUPnPDeviceInfo *subdev1; GUPnPDeviceInfo *subdev2; const gchar *xml_path = "."; if (mainctx) g_main_context_push_thread_default (mainctx); context = gupnp_context_new (NULL, NULL, 0, NULL); g_assert (context); if (g_getenv ("XML_PATH")) xml_path = g_getenv ("XML_PATH"); gupnp_context_host_path (context, xml_path, ""); /* gupnp_context_host_path (context, "InternetGatewayDevice.xml", "/InternetGatewayDevice.xml"); gupnp_context_host_path (context, "WANIPConnection.xml", "/WANIPConnection.xml"); gupnp_context_host_path (context, "WANPPPConnection.xml", "/WANPPPConnection.xml"); */ dev = gupnp_root_device_new (context, "InternetGatewayDevice.xml", xml_path); g_assert (dev); subdev1 = gupnp_device_info_get_device (GUPNP_DEVICE_INFO (dev), "urn:schemas-upnp-org:device:WANDevice:1"); g_assert (subdev1); subdev2 = gupnp_device_info_get_device (subdev1, "urn:schemas-upnp-org:device:WANConnectionDevice:1"); g_assert (subdev2); g_object_unref (subdev1); ipservice = gupnp_device_info_get_service (subdev2, "urn:schemas-upnp-org:service:WANIPConnection:1"); g_assert (ipservice); pppservice = gupnp_device_info_get_service (subdev2, "urn:schemas-upnp-org:service:WANPPPConnection:1"); g_assert (pppservice); g_object_unref (subdev2); g_signal_connect (ipservice, "action-invoked::GetExternalIPAddress", G_CALLBACK (get_external_ip_address_cb), GINT_TO_POINTER (CONNECTION_IP)); g_signal_connect (ipservice, "action-invoked::AddPortMapping", G_CALLBACK (add_port_mapping_cb), GUINT_TO_POINTER (requested_port));; g_signal_connect (ipservice, "action-invoked::DeletePortMapping", G_CALLBACK (delete_port_mapping_cb), GUINT_TO_POINTER (requested_port)); g_signal_connect (pppservice, "action-invoked::GetExternalIPAddress", G_CALLBACK (get_external_ip_address_cb), GINT_TO_POINTER (CONNECTION_PPP)); g_signal_connect (pppservice, "action-invoked::AddPortMapping", G_CALLBACK (add_port_mapping_cb), GUINT_TO_POINTER (requested_port)); g_signal_connect (pppservice, "action-invoked::DeletePortMapping", G_CALLBACK (delete_port_mapping_cb), GUINT_TO_POINTER (requested_port)); gupnp_root_device_set_available (dev, TRUE); g_signal_connect (igd, "mapped-external-port", G_CALLBACK (mapped_external_port_cb), GUINT_TO_POINTER (requested_port)); g_signal_connect (igd, "error-mapping-port", G_CALLBACK (error_mapping_port_cb), NULL); gupnp_simple_igd_add_port (igd, "UDP", requested_port, "192.168.4.22", INTERNAL_PORT, 10, "GUPnP Simple IGD test"); loop = g_main_loop_new (mainctx, FALSE); g_main_loop_run (loop); g_main_loop_unref (loop); gupnp_root_device_set_available (dev, FALSE); g_object_unref (dev); if (mainctx) g_main_context_pop_thread_default (mainctx); g_object_unref (context); }