Implement org.genivi.LUCHandler1.Deregister()
[profile/ivi/node-startup-controller.git] / luc-handler / luc-handler-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
17 #include <common/watchdog-client.h>
18
19 #include <luc-handler/luc-handler-dbus.h>
20 #include <luc-handler/luc-handler-application.h>
21 #include <luc-handler/luc-handler-service.h>
22
23
24
25 /* property identifiers */
26 enum
27 {
28   PROP_0,
29   PROP_LUC_HANDLER_SERVICE,
30 };
31
32
33
34 static void luc_handler_application_finalize     (GObject      *object);
35 static void luc_handler_application_get_property (GObject      *object,
36                                                   guint         prop_id,
37                                                   GValue       *value,
38                                                   GParamSpec   *pspec);
39 static void luc_handler_application_set_property (GObject      *object,
40                                                   guint         prop_id,
41                                                   const GValue *value,
42                                                   GParamSpec   *pspec);
43 static void luc_handler_application_startup      (GApplication *application);
44
45
46
47 struct _LUCHandlerApplicationClass
48 {
49   GApplicationClass __parent__;
50 };
51
52 struct _LUCHandlerApplication
53 {
54   GApplication       __parent__;
55
56   /* systemd watchdog client that repeatedly asks systemd to update
57    * the watchdog timestamp */
58   WatchdogClient    *watchdog_client;
59
60   /* service object that implements the LUC Handler D-Bus interface */
61   LUCHandlerService *service;
62 };
63
64
65
66 G_DEFINE_TYPE (LUCHandlerApplication, luc_handler_application, G_TYPE_APPLICATION);
67
68
69
70 static void
71 luc_handler_application_class_init (LUCHandlerApplicationClass *klass)
72 {
73   GApplicationClass *gapplication_class;
74   GObjectClass *gobject_class;
75
76   gobject_class = G_OBJECT_CLASS (klass);
77   gobject_class->finalize = luc_handler_application_finalize;
78   gobject_class->get_property = luc_handler_application_get_property;
79   gobject_class->set_property = luc_handler_application_set_property;
80
81   gapplication_class = G_APPLICATION_CLASS (klass);
82   gapplication_class->startup = luc_handler_application_startup;
83
84   g_object_class_install_property (gobject_class,
85                                    PROP_LUC_HANDLER_SERVICE,
86                                    g_param_spec_object ("luc-handler-service",
87                                                         "luc-handler-service",
88                                                         "luc-handler-service",
89                                                         LUC_HANDLER_TYPE_SERVICE,
90                                                         G_PARAM_READWRITE |
91                                                         G_PARAM_CONSTRUCT_ONLY |
92                                                         G_PARAM_STATIC_STRINGS));
93 }
94
95
96
97 static void
98 luc_handler_application_init (LUCHandlerApplication *application)
99 {
100 }
101
102
103
104 static void
105 luc_handler_application_finalize (GObject *object)
106 {
107   LUCHandlerApplication *application = LUC_HANDLER_APPLICATION (object);
108
109   /* release the watchdog client */
110   g_object_unref (application->watchdog_client);
111
112   /* release the LUC Handler service implementation */
113   if (application->service != NULL)
114     g_object_unref (application->service);
115
116   (*G_OBJECT_CLASS (luc_handler_application_parent_class)->finalize) (object);
117 }
118
119
120
121 static void
122 luc_handler_application_get_property (GObject    *object,
123                                       guint       prop_id,
124                                       GValue     *value,
125                                       GParamSpec *pspec)
126 {
127   LUCHandlerApplication *application = LUC_HANDLER_APPLICATION (object);
128
129   switch (prop_id)
130     {
131     case PROP_LUC_HANDLER_SERVICE:
132       g_value_set_object (value, application->service);
133       break;
134     default:
135       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
136       break;
137     }
138 }
139
140
141
142 static void
143 luc_handler_application_set_property (GObject      *object,
144                                       guint         prop_id,
145                                       const GValue *value,
146                                       GParamSpec   *pspec)
147 {
148   LUCHandlerApplication *application = LUC_HANDLER_APPLICATION (object);
149
150   switch (prop_id)
151     {
152     case PROP_LUC_HANDLER_SERVICE:
153       application->service = g_value_dup_object (value);
154       break;
155     default:
156       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
157       break;
158     }
159 }
160
161
162
163 static void
164 luc_handler_application_startup (GApplication *app)
165 {
166   LUCHandlerApplication *application = LUC_HANDLER_APPLICATION (app);
167
168   /* update systemd's watchdog timestamp every 120 seconds */
169   application->watchdog_client = watchdog_client_new (120);
170 }
171
172
173
174 LUCHandlerApplication *
175 luc_handler_application_new (LUCHandlerService *service)
176 {
177   return g_object_new (LUC_HANDLER_TYPE_APPLICATION,
178                        "application-id", "org.genivi.LUCHandler1",
179                        "flags", G_APPLICATION_IS_SERVICE,
180                        "luc-handler-service", service,
181                        NULL);
182 }