Drop GApplication, fix D-Bus activation, further NSM integration work
[profile/ivi/node-startup-controller.git] / nsm-dummy / nsm-dummy-application.c
1 /* vi:set et ai sw=2 sts=2 ts=2: */
2 /* -
3  * Copyright (c) 2012 GENIVI.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  */
9
10 #ifdef HAVE_CONFIG_H
11 #include <config.h>
12 #endif
13
14 #include <glib-object.h>
15 #include <gio/gio.h>
16 #include <glib-unix.h>
17
18 #include <systemd/sd-daemon.h>
19
20 #include <common/nsm-consumer-dbus.h>
21 #include <common/nsm-lifecycle-control-dbus.h>
22 #include <common/watchdog-client.h>
23
24 #include <nsm-dummy/nsm-consumer-service.h>
25 #include <nsm-dummy/nsm-dummy-application.h>
26 #include <nsm-dummy/nsm-lifecycle-control-service.h>
27
28
29
30 /* property identifiers */
31 enum
32 {
33   PROP_0,
34   PROP_CONNECTION,
35   PROP_CONSUMER_SERVICE,
36   PROP_LIFECYCLE_CONTROL_SERVICE,
37   PROP_MAIN_LOOP,
38 };
39
40
41 static void     nsm_dummy_application_constructed  (GObject             *object);
42 static void     nsm_dummy_application_finalize     (GObject             *object);
43 static void     nsm_dummy_application_get_property (GObject             *object,
44                                                     guint                prop_id,
45                                                     GValue              *value,
46                                                     GParamSpec          *pspec);
47 static void     nsm_dummy_application_set_property (GObject             *object,
48                                                     guint                prop_id,
49                                                     const GValue        *value,
50                                                     GParamSpec          *pspec);
51 static gboolean nsm_dummy_application_int_handler  (NSMDummyApplication *application);
52
53
54
55 struct _NSMDummyApplicationClass
56 {
57   GObjectClass __parent__;
58 };
59
60 struct _NSMDummyApplication
61 {
62   GObject                     __parent__;
63
64   /* the connection to D-Bus */
65   GDBusConnection            *connection;
66
67   /* systemd watchdog client that repeatedly asks systemd to update
68    * the watchdog timestamp */
69   WatchdogClient             *watchdog_client;
70
71   /* service objects that implements the NSM Dummy D-Bus interfaces */
72   NSMLifecycleControlService *lifecycle_control_service;
73   NSMConsumerService         *consumer_service;
74
75   /* the main loop of the application */
76   GMainLoop                  *main_loop;
77
78   /* signal handler IDs */
79   guint                       sigint_id;
80
81   /* Identifier for the registered bus name */
82   guint                       bus_name_id;
83 };
84
85
86
87 G_DEFINE_TYPE (NSMDummyApplication, nsm_dummy_application, G_TYPE_OBJECT);
88
89
90
91 static void
92 nsm_dummy_application_class_init (NSMDummyApplicationClass *klass)
93 {
94   GObjectClass *gobject_class;
95
96   gobject_class = G_OBJECT_CLASS (klass);
97   gobject_class->finalize = nsm_dummy_application_finalize;
98   gobject_class->constructed = nsm_dummy_application_constructed;
99   gobject_class->get_property = nsm_dummy_application_get_property;
100   gobject_class->set_property = nsm_dummy_application_set_property;
101
102   g_object_class_install_property (gobject_class,
103                                    PROP_CONNECTION,
104                                    g_param_spec_object ("connection",
105                                                         "D-Bus Connection",
106                                                         "The connection to D-Bus",
107                                                         G_TYPE_DBUS_CONNECTION,
108                                                         G_PARAM_READWRITE |
109                                                         G_PARAM_CONSTRUCT_ONLY |
110                                                         G_PARAM_STATIC_STRINGS));
111
112   g_object_class_install_property (gobject_class,
113                                    PROP_CONSUMER_SERVICE,
114                                    g_param_spec_object ("nsm-consumer-service",
115                                                         "nsm-consumer-service",
116                                                         "nsm-consumer-service",
117                                                         NSM_CONSUMER_TYPE_SERVICE,
118                                                         G_PARAM_READWRITE |
119                                                         G_PARAM_CONSTRUCT_ONLY |
120                                                         G_PARAM_STATIC_STRINGS));
121  g_object_class_install_property (gobject_class,
122                                   PROP_LIFECYCLE_CONTROL_SERVICE,
123                                   g_param_spec_object ("nsm-lifecycle-control-service",
124                                                        "nsm-lifecycle-control-service",
125                                                        "nsm-lifecycle-control-service",
126                                                         NSM_LIFECYCLE_CONTROL_TYPE_SERVICE,
127                                                         G_PARAM_READWRITE |
128                                                         G_PARAM_CONSTRUCT_ONLY |
129                                                         G_PARAM_STATIC_STRINGS));
130
131  g_object_class_install_property (gobject_class,
132                                   PROP_MAIN_LOOP,
133                                   g_param_spec_boxed ("main-loop",
134                                                       "main-loop",
135                                                       "main-loop",
136                                                        G_TYPE_MAIN_LOOP,
137                                                        G_PARAM_READWRITE |
138                                                        G_PARAM_CONSTRUCT_ONLY |
139                                                        G_PARAM_STATIC_STRINGS));
140 }
141
142
143
144 static void
145 nsm_dummy_application_init (NSMDummyApplication *application)
146 {
147   /* update systemd's watchdog timestamp every 120 seconds */
148   application->watchdog_client = watchdog_client_new (120);
149
150   /* install the signal handler */
151   application->sigint_id =
152     g_unix_signal_add (SIGINT, (GSourceFunc) nsm_dummy_application_int_handler,
153                        application);
154 }
155
156
157
158 static void
159 nsm_dummy_application_finalize (GObject *object)
160 {
161   NSMDummyApplication *application = NSM_DUMMY_APPLICATION (object);
162
163   /* release the D-Bus connection object */
164   if (application->connection != NULL)
165     g_object_unref (application->connection);
166
167   /* release the bus name */
168   g_bus_unown_name (application->bus_name_id);
169
170   /* release the signal handler */
171   g_source_remove (application->sigint_id);
172
173   /* release the watchdog client */
174   g_object_unref (application->watchdog_client);
175
176   /* release the main loop */
177   g_main_loop_unref (application->main_loop);
178
179   /* release the NSM Dummy service implementations */
180   if (application->consumer_service != NULL)
181     g_object_unref (application->consumer_service);
182
183   if (application->lifecycle_control_service != NULL)
184     g_object_unref (application->lifecycle_control_service);
185
186   (*G_OBJECT_CLASS (nsm_dummy_application_parent_class)->finalize) (object);
187 }
188
189
190
191 static void
192 nsm_dummy_application_constructed (GObject *object)
193 {
194   NSMDummyApplication *application = NSM_DUMMY_APPLICATION (object);
195
196   /* get a bus name on the given connection */
197   application->bus_name_id =
198     g_bus_own_name_on_connection (application->connection,
199                                   "com.contiautomotive.NodeStateManager",
200                                   G_BUS_NAME_OWNER_FLAGS_NONE, NULL, NULL, NULL, NULL);
201
202   /* inform systemd that this process has started */
203   sd_notify (0, "READY=1");
204 }
205
206
207
208 static void
209 nsm_dummy_application_get_property (GObject    *object,
210                                     guint       prop_id,
211                                     GValue     *value,
212                                     GParamSpec *pspec)
213 {
214   NSMDummyApplication *application = NSM_DUMMY_APPLICATION (object);
215
216   switch (prop_id)
217     {
218     case PROP_CONNECTION:
219       g_value_set_object (value, application->connection);
220       break;
221     case PROP_CONSUMER_SERVICE:
222       g_value_set_object (value, application->consumer_service);
223       break;
224     case PROP_LIFECYCLE_CONTROL_SERVICE:
225       g_value_set_object (value, application->lifecycle_control_service);
226       break;
227     case PROP_MAIN_LOOP:
228       g_value_set_boxed (value, application->main_loop);
229       break;
230     default:
231       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
232       break;
233     }
234 }
235
236
237
238 static void
239 nsm_dummy_application_set_property (GObject      *object,
240                                     guint         prop_id,
241                                     const GValue *value,
242                                     GParamSpec   *pspec)
243 {
244   NSMDummyApplication *application = NSM_DUMMY_APPLICATION (object);
245
246   switch (prop_id)
247     {
248     case PROP_CONNECTION:
249       application->connection = g_value_dup_object (value);
250       break;
251     case PROP_CONSUMER_SERVICE:
252       application->consumer_service = g_value_dup_object (value);
253       break;
254     case PROP_LIFECYCLE_CONTROL_SERVICE:
255       application->lifecycle_control_service = g_value_dup_object (value);
256       break;
257     case PROP_MAIN_LOOP:
258       application->main_loop = g_main_loop_ref (g_value_get_boxed (value));
259       break;
260     default:
261       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
262       break;
263     }
264 }
265
266
267
268 static gboolean
269 nsm_dummy_application_int_handler (NSMDummyApplication *application)
270 {
271   /* call the shutdown consumer method */
272   nsm_consumer_service_shutdown_consumers (application->consumer_service);
273
274   /* quit the application */
275   g_main_loop_quit (application->main_loop);
276
277   return FALSE;
278 }
279
280
281
282 NSMDummyApplication *
283 nsm_dummy_application_new (GMainLoop                  *main_loop,
284                            GDBusConnection            *connection,
285                            NSMConsumerService         *consumer_service,
286                            NSMLifecycleControlService *lifecycle_control_service)
287 {
288   g_return_val_if_fail (main_loop != NULL, NULL);
289   g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), NULL);
290   g_return_val_if_fail (NSM_CONSUMER_IS_SERVICE (consumer_service), NULL);
291   g_return_val_if_fail (NSM_LIFECYCLE_CONTROL_IS_SERVICE (lifecycle_control_service), NULL);
292
293   return g_object_new (NSM_DUMMY_TYPE_APPLICATION,
294                        "main-loop", main_loop,
295                        "connection", connection,
296                        "nsm-consumer-service", consumer_service,
297                        "nsm-lifecycle-control-service", lifecycle_control_service,
298                        NULL);
299 }