tizen 2.3.1 release
[external/gupnp.git] / examples / light-client.c
1 /*
2  * Example UPnP device/service, implementing the BinaryLight device and
3  * SwitchPower services to emulate a light switch.
4  *
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.
8  *
9  * This example code is in the public domain.
10  */
11
12 #include <libgupnp/gupnp.h>
13 #include <stdlib.h>
14
15 static GMainLoop *main_loop;
16
17 static enum {
18   OFF = 0,
19   ON = 1,
20   TOGGLE
21 } mode;
22
23 static void
24 service_proxy_available_cb (GUPnPControlPoint *cp, GUPnPServiceProxy *proxy)
25 {
26   GError *error = NULL;
27   gboolean target;
28
29   if (mode == TOGGLE) {
30     /* We're toggling, so first fetch the current status */
31     if (!gupnp_service_proxy_send_action
32         (proxy, "GetStatus", &error,
33          /* IN args */ NULL,
34          /* OUT args */ "ResultStatus", G_TYPE_BOOLEAN, &target, NULL)) {
35       goto error;
36     }
37     /* And then toggle it */
38     target = ! target;
39   } else {
40     /* Mode is a boolean, so the target is the mode thanks to our well chosen
41        enumeration values. */
42     target = mode;
43   }
44
45   /* Set the target */
46   if (!gupnp_service_proxy_send_action (proxy, "SetTarget", &error,
47                                         /* IN args */
48                                         "NewTargetValue", G_TYPE_BOOLEAN, target, NULL,
49                                         /* OUT args */
50                                         NULL)) {
51     goto error;
52   } else {
53     g_print ("Set switch to %s.\n", target ? "on" : "off");
54   }
55   
56  done:
57   /* Only manipulate the first light switch that is found */
58   g_main_loop_quit (main_loop);
59   return;
60
61  error:
62   g_printerr ("Cannot set switch: %s\n", error->message);
63   g_error_free (error);
64   goto done;
65 }
66
67 static void
68 usage (void)
69 {
70     g_printerr ("$ light-client [on|off|toggle]\n");
71 }
72
73 int
74 main (int argc, char **argv)
75 {
76   GError *error = NULL;
77   GUPnPContext *context;
78   GUPnPControlPoint *cp;
79
80   g_thread_init (NULL);
81   g_type_init ();
82
83   /* Check and parse command line arguments */
84   if (argc != 2) {
85     usage ();
86     return EXIT_FAILURE;
87   }
88   
89   if (g_str_equal (argv[1], "on")) {
90     mode = ON;
91   } else if (g_str_equal (argv[1], "off")) {
92     mode = OFF;
93   } else if (g_str_equal (argv[1], "toggle")) {
94     mode = TOGGLE;
95   } else {
96     usage ();
97     return EXIT_FAILURE;
98   }
99
100   /* Create the UPnP context */
101   context = gupnp_context_new (NULL, NULL, 0, &error);
102   if (error) {
103     g_printerr ("Error creating the GUPnP context: %s\n",
104                 error->message);
105     g_error_free (error);
106
107     return EXIT_FAILURE;
108   }
109
110   /* Create the control point, searching for SwitchPower services */
111   cp = gupnp_control_point_new (context,
112                                 "urn:schemas-upnp-org:service:SwitchPower:1");
113   
114   /* Connect to the service-found callback */
115   g_signal_connect (cp,
116                     "service-proxy-available",
117                     G_CALLBACK (service_proxy_available_cb),
118                     NULL);
119   
120   /* Start searching when the main loop runs */
121   gssdp_resource_browser_set_active (GSSDP_RESOURCE_BROWSER (cp), TRUE);
122
123   /* Run the main loop */
124   main_loop = g_main_loop_new (NULL, FALSE);
125   g_main_loop_run (main_loop);
126
127   /* Cleanup */
128   g_main_loop_unref (main_loop);
129   g_object_unref (cp);
130   g_object_unref (context);
131   
132   return EXIT_SUCCESS;
133 }