1 /* vi:set et ai sw=2 sts=2 ts=2: */
3 * Copyright (c) 2012 GENIVI.
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/.
14 #include <glib-object.h>
16 #include <glib-unix.h>
18 #include <systemd/sd-daemon.h>
20 #include <common/nsm-consumer-dbus.h>
21 #include <common/nsm-lifecycle-control-dbus.h>
22 #include <common/watchdog-client.h>
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>
30 /* property identifiers */
35 PROP_CONSUMER_SERVICE,
36 PROP_LIFECYCLE_CONTROL_SERVICE,
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,
47 static void nsm_dummy_application_set_property (GObject *object,
51 static gboolean nsm_dummy_application_int_handler (NSMDummyApplication *application);
55 struct _NSMDummyApplicationClass
57 GObjectClass __parent__;
60 struct _NSMDummyApplication
64 /* the connection to D-Bus */
65 GDBusConnection *connection;
67 /* systemd watchdog client that repeatedly asks systemd to update
68 * the watchdog timestamp */
69 WatchdogClient *watchdog_client;
71 /* service objects that implements the NSM Dummy D-Bus interfaces */
72 NSMLifecycleControlService *lifecycle_control_service;
73 NSMConsumerService *consumer_service;
75 /* the main loop of the application */
78 /* signal handler IDs */
81 /* Identifier for the registered bus name */
87 G_DEFINE_TYPE (NSMDummyApplication, nsm_dummy_application, G_TYPE_OBJECT);
92 nsm_dummy_application_class_init (NSMDummyApplicationClass *klass)
94 GObjectClass *gobject_class;
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;
102 g_object_class_install_property (gobject_class,
104 g_param_spec_object ("connection",
106 "The connection to D-Bus",
107 G_TYPE_DBUS_CONNECTION,
109 G_PARAM_CONSTRUCT_ONLY |
110 G_PARAM_STATIC_STRINGS));
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,
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,
128 G_PARAM_CONSTRUCT_ONLY |
129 G_PARAM_STATIC_STRINGS));
131 g_object_class_install_property (gobject_class,
133 g_param_spec_boxed ("main-loop",
138 G_PARAM_CONSTRUCT_ONLY |
139 G_PARAM_STATIC_STRINGS));
145 nsm_dummy_application_init (NSMDummyApplication *application)
147 /* update systemd's watchdog timestamp every 120 seconds */
148 application->watchdog_client = watchdog_client_new (120);
150 /* install the signal handler */
151 application->sigint_id =
152 g_unix_signal_add (SIGINT, (GSourceFunc) nsm_dummy_application_int_handler,
159 nsm_dummy_application_finalize (GObject *object)
161 NSMDummyApplication *application = NSM_DUMMY_APPLICATION (object);
163 /* release the D-Bus connection object */
164 if (application->connection != NULL)
165 g_object_unref (application->connection);
167 /* release the bus name */
168 g_bus_unown_name (application->bus_name_id);
170 /* release the signal handler */
171 g_source_remove (application->sigint_id);
173 /* release the watchdog client */
174 g_object_unref (application->watchdog_client);
176 /* release the main loop */
177 g_main_loop_unref (application->main_loop);
179 /* release the NSM Dummy service implementations */
180 if (application->consumer_service != NULL)
181 g_object_unref (application->consumer_service);
183 if (application->lifecycle_control_service != NULL)
184 g_object_unref (application->lifecycle_control_service);
186 (*G_OBJECT_CLASS (nsm_dummy_application_parent_class)->finalize) (object);
192 nsm_dummy_application_constructed (GObject *object)
194 NSMDummyApplication *application = NSM_DUMMY_APPLICATION (object);
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);
202 /* inform systemd that this process has started */
203 sd_notify (0, "READY=1");
209 nsm_dummy_application_get_property (GObject *object,
214 NSMDummyApplication *application = NSM_DUMMY_APPLICATION (object);
218 case PROP_CONNECTION:
219 g_value_set_object (value, application->connection);
221 case PROP_CONSUMER_SERVICE:
222 g_value_set_object (value, application->consumer_service);
224 case PROP_LIFECYCLE_CONTROL_SERVICE:
225 g_value_set_object (value, application->lifecycle_control_service);
228 g_value_set_boxed (value, application->main_loop);
231 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
239 nsm_dummy_application_set_property (GObject *object,
244 NSMDummyApplication *application = NSM_DUMMY_APPLICATION (object);
248 case PROP_CONNECTION:
249 application->connection = g_value_dup_object (value);
251 case PROP_CONSUMER_SERVICE:
252 application->consumer_service = g_value_dup_object (value);
254 case PROP_LIFECYCLE_CONTROL_SERVICE:
255 application->lifecycle_control_service = g_value_dup_object (value);
258 application->main_loop = g_main_loop_ref (g_value_get_boxed (value));
261 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
269 nsm_dummy_application_int_handler (NSMDummyApplication *application)
271 /* call the shutdown consumer method */
272 nsm_consumer_service_shutdown_consumers (application->consumer_service);
274 /* quit the application */
275 g_main_loop_quit (application->main_loop);
282 NSMDummyApplication *
283 nsm_dummy_application_new (GMainLoop *main_loop,
284 GDBusConnection *connection,
285 NSMConsumerService *consumer_service,
286 NSMLifecycleControlService *lifecycle_control_service)
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);
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,