2 * Example UPnP device/service, implementing the BinaryLight device and
3 * SwitchPower services to emulate a light switch.
5 * The user interface is as minimal as possible so that the GUPnP concepts and
6 * best practises are more apparent. For a better implementation of
7 * BinaryLight, see gupnp-tools.
9 * This example code is in the public domain.
12 #include <libgupnp/gupnp.h>
15 static GMainLoop *main_loop;
24 service_proxy_available_cb (G_GNUC_UNUSED GUPnPControlPoint *cp,
25 GUPnPServiceProxy *proxy)
31 /* We're toggling, so first fetch the current status */
32 if (!gupnp_service_proxy_send_action
33 (proxy, "GetStatus", &error,
35 /* OUT args */ "ResultStatus", G_TYPE_BOOLEAN, &target, NULL)) {
38 /* And then toggle it */
41 /* Mode is a boolean, so the target is the mode thanks to our well chosen
42 enumeration values. */
47 if (!gupnp_service_proxy_send_action (proxy, "SetTarget", &error,
49 "NewTargetValue", G_TYPE_BOOLEAN, target, NULL,
54 g_print ("Set switch to %s.\n", target ? "on" : "off");
58 /* Only manipulate the first light switch that is found */
59 g_main_loop_quit (main_loop);
63 g_printerr ("Cannot set switch: %s\n", error->message);
71 g_printerr ("$ light-client [on|off|toggle]\n");
75 main (int argc, char **argv)
78 GUPnPContext *context;
79 GUPnPControlPoint *cp;
81 #if !GLIB_CHECK_VERSION(2,35,0)
86 /* Check and parse command line arguments */
92 if (g_str_equal (argv[1], "on")) {
94 } else if (g_str_equal (argv[1], "off")) {
96 } else if (g_str_equal (argv[1], "toggle")) {
103 /* Create the UPnP context */
104 context = gupnp_context_new (NULL, NULL, 0, &error);
106 g_printerr ("Error creating the GUPnP context: %s\n",
108 g_error_free (error);
113 /* Create the control point, searching for SwitchPower services */
114 cp = gupnp_control_point_new (context,
115 "urn:schemas-upnp-org:service:SwitchPower:1");
117 /* Connect to the service-found callback */
118 g_signal_connect (cp,
119 "service-proxy-available",
120 G_CALLBACK (service_proxy_available_cb),
123 /* Start searching when the main loop runs */
124 gssdp_resource_browser_set_active (GSSDP_RESOURCE_BROWSER (cp), TRUE);
126 /* Run the main loop */
127 main_loop = g_main_loop_new (NULL, FALSE);
128 g_main_loop_run (main_loop);
131 g_main_loop_unref (main_loop);
133 g_object_unref (context);