Rewrite legacy app handler's command-line to use D-Bus
[profile/ivi/node-startup-controller.git] / legacy-app-handler / la-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 #ifdef HAVE_STDLIB_H
15 #include <stdlib.h>
16 #endif
17
18 #include <glib-object.h>
19 #include <gio/gio.h>
20
21 #include <dlt/dlt.h>
22
23 #include <common/watchdog-client.h>
24
25 #include <legacy-app-handler/la-handler-dbus.h>
26 #include <legacy-app-handler/la-handler-application.h>
27 #include <legacy-app-handler/la-handler-service.h>
28
29
30
31 DLT_IMPORT_CONTEXT (la_handler_context);
32
33
34
35 /* property identifiers */
36 enum
37 {
38   PROP_0,
39   PROP_LA_HANDLER_SERVICE,
40 };
41
42
43
44 static void la_handler_application_finalize     (GObject                 *object);
45 static void la_handler_application_get_property (GObject                 *object,
46                                                  guint                    prop_id,
47                                                  GValue                  *value,
48                                                  GParamSpec              *pspec);
49 static void la_handler_application_set_property (GObject                 *object,
50                                                  guint                    prop_id,
51                                                  const GValue            *value,
52                                                  GParamSpec              *pspec);
53 static void la_handler_application_startup      (GApplication            *application);
54
55
56
57 struct _LAHandlerApplicationClass
58 {
59   GApplicationClass __parent__;
60 };
61
62 struct _LAHandlerApplication
63 {
64   GApplication       __parent__;
65
66   /* systemd watchdog client that repeatedly asks systemd to update
67    * the watchdog timestamp */
68   WatchdogClient    *watchdog_client;
69
70   /* service object that implements the Legacy App Handler D-Bus interface */
71   LAHandlerService *service;
72 };
73
74
75
76 G_DEFINE_TYPE (LAHandlerApplication, la_handler_application, G_TYPE_APPLICATION);
77
78
79
80 static void
81 la_handler_application_class_init (LAHandlerApplicationClass *klass)
82 {
83   GApplicationClass *gapplication_class;
84   GObjectClass *gobject_class;
85
86   gobject_class = G_OBJECT_CLASS (klass);
87   gobject_class->finalize = la_handler_application_finalize;
88   gobject_class->get_property = la_handler_application_get_property;
89   gobject_class->set_property = la_handler_application_set_property;
90
91   gapplication_class = G_APPLICATION_CLASS (klass);
92   gapplication_class->startup = la_handler_application_startup;
93
94   g_object_class_install_property (gobject_class,
95                                    PROP_LA_HANDLER_SERVICE,
96                                    g_param_spec_object ("la-handler-service",
97                                                         "la-handler-service",
98                                                         "la-handler-service",
99                                                         LA_HANDLER_TYPE_SERVICE,
100                                                         G_PARAM_READWRITE |
101                                                         G_PARAM_CONSTRUCT_ONLY |
102                                                         G_PARAM_STATIC_STRINGS));
103 }
104
105
106
107 static void
108 la_handler_application_init (LAHandlerApplication *application)
109 {
110 }
111
112
113
114 static void
115 la_handler_application_finalize (GObject *object)
116 {
117   LAHandlerApplication *application = LA_HANDLER_APPLICATION (object);
118
119   /* release the watchdog client */
120   if (application->watchdog_client != NULL)
121     g_object_unref (application->watchdog_client);
122
123   /* release the Legacy App Handler service implementation */
124   if (application->service != NULL)
125     g_object_unref (application->service);
126
127   (*G_OBJECT_CLASS (la_handler_application_parent_class)->finalize) (object);
128 }
129
130
131
132 static void
133 la_handler_application_get_property (GObject    *object,
134                                      guint       prop_id,
135                                      GValue     *value,
136                                      GParamSpec *pspec)
137 {
138   LAHandlerApplication *application = LA_HANDLER_APPLICATION (object);
139
140   switch (prop_id)
141     {
142     case PROP_LA_HANDLER_SERVICE:
143       g_value_set_object (value, application->service);
144       break;
145     default:
146       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
147       break;
148     }
149 }
150
151
152
153 static void
154 la_handler_application_set_property (GObject      *object,
155                                      guint         prop_id,
156                                      const GValue *value,
157                                      GParamSpec   *pspec)
158 {
159   LAHandlerApplication *application = LA_HANDLER_APPLICATION (object);
160
161   switch (prop_id)
162     {
163     case PROP_LA_HANDLER_SERVICE:
164       application->service = g_value_dup_object (value);
165       break;
166     default:
167       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
168       break;
169     }
170 }
171
172
173
174 static void
175 la_handler_application_startup (GApplication *app)
176 {
177   LAHandlerApplication *application = LA_HANDLER_APPLICATION (app);
178
179   /* chain up to the parent class */
180   (*G_APPLICATION_CLASS (la_handler_application_parent_class)->startup) (app);
181
182   /* update systemd's watchdog timestamp every 120 seconds */
183   application->watchdog_client = watchdog_client_new (120);
184
185   /* the Legacy Application Handler should keep running until it is shut down by the Node
186    * State Manager. */
187   g_application_hold (app);
188 }
189
190
191
192 LAHandlerApplication *
193 la_handler_application_new (LAHandlerService *service,
194                             GApplicationFlags flags)
195 {
196   return g_object_new (LA_HANDLER_TYPE_APPLICATION,
197                        "application-id", "org.genivi.LegacyAppHandler1",
198                        "flags", flags,
199                        "la-handler-service", service,
200                        NULL);
201 }