Add initial source codes for gtest
[platform/core/connectivity/stc-manager.git] / src / stc-manager-gdbus.c
1 /*
2  * Copyright (c) 2016 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include "stc-manager-gdbus.h"
18 #include "stc-manager.h"
19 #include "stc-statistics.h"
20 #include "stc-restriction.h"
21 #include "stc-default-connection.h"
22 #include "stc-manager-plugin.h"
23 #include "stc-app-lifecycle.h"
24 #include "helper-iptables.h"
25
26 static gboolean __stc_manager_gdbus_statistics_init(stc_s *stc)
27 {
28         __STC_LOG_FUNC_ENTER__;
29         gboolean ret = TRUE;
30         gchar *s = NULL;
31
32         StcObjectSkeleton *object = NULL;
33         StcStatistics *statistics = NULL;
34         s = g_strdup_printf(STC_DBUS_SERVICE_STATISTICS_PATH);
35
36         /* Add interface to default object path */
37         object = stc_object_skeleton_new(s);
38         g_free(s);
39
40         /* Make the newly created object export the interface
41          * net.stc.statistics (note
42          * that @object takes its own reference to @statistics).
43          */
44
45         statistics = stc_statistics_skeleton_new();
46         stc_object_skeleton_set_statistics(object, statistics);
47         g_object_unref(statistics);
48
49         /* Register for method callbacks as signal callbacks */
50
51         g_signal_connect(statistics, "handle-init",
52                          G_CALLBACK(handle_statistics_init),
53                          stc);
54
55         g_signal_connect(statistics, "handle-get",
56                          G_CALLBACK(handle_statistics_get),
57                          stc);
58
59         g_signal_connect(statistics, "handle-get-all",
60                          G_CALLBACK(handle_statistics_get_all),
61                          stc);
62
63         g_signal_connect(statistics, "handle-reset",
64                          G_CALLBACK(handle_statistics_reset),
65                          stc);
66
67         /* Export the object (@manager takes its own reference to @object) */
68         g_dbus_object_manager_server_export(stc->obj_mgr,
69                                             G_DBUS_OBJECT_SKELETON(object));
70         g_object_unref(object);
71
72         stc->statistics_obj = (gpointer)statistics;
73
74         __STC_LOG_FUNC_EXIT__;
75         return ret;
76 }
77
78 static gboolean __stc_manager_gdbus_restriction_init(stc_s *stc)
79 {
80         __STC_LOG_FUNC_ENTER__;
81         gboolean ret = TRUE;
82         gchar *s = NULL;
83
84         StcObjectSkeleton *object = NULL;
85         StcRestriction *restriction = NULL;
86         s = g_strdup_printf(STC_DBUS_SERVICE_RESTRICTION_PATH);
87
88         /* Add interface to default object path */
89         object = stc_object_skeleton_new(s);
90         g_free(s);
91
92         /* Make the newly created object export the interface
93          * net.stc.restriction (note
94          * that @object takes its own reference to @restriction).
95          */
96
97         restriction = stc_restriction_skeleton_new();
98         stc_object_skeleton_set_restriction(object, restriction);
99         g_object_unref(restriction);
100
101         /* Register for method callbacks as signal callbacks */
102
103         g_signal_connect(restriction, "handle-set",
104                          G_CALLBACK(handle_restriction_set), stc);
105
106         g_signal_connect(restriction, "handle-exclude",
107                          G_CALLBACK(handle_restriction_exclude), stc);
108
109         g_signal_connect(restriction, "handle-get",
110                          G_CALLBACK(handle_restriction_get), stc);
111
112         g_signal_connect(restriction, "handle-get-all",
113                          G_CALLBACK(handle_restriction_get_all), stc);
114
115         g_signal_connect(restriction, "handle-get-state",
116                          G_CALLBACK(handle_restriction_get_state),
117                          stc);
118
119         g_signal_connect(restriction, "handle-unset",
120                          G_CALLBACK(handle_restriction_unset), stc);
121
122         /* Export the object (@manager takes its own reference to @object) */
123         g_dbus_object_manager_server_export(stc->obj_mgr,
124                                             G_DBUS_OBJECT_SKELETON(object));
125         g_object_unref(object);
126
127         stc->restriction_obj = (gpointer)restriction;
128
129         __STC_LOG_FUNC_EXIT__;
130         return ret;
131 }
132
133 static gboolean __stc_manager_gdbus_manager_init(stc_s *stc)
134 {
135         __STC_LOG_FUNC_ENTER__;
136         gboolean ret = TRUE;
137         gchar *s = NULL;
138
139         StcObjectSkeleton *object = NULL;
140         StcManager *manager = NULL;
141         s = g_strdup_printf(STC_DBUS_SERVICE_MANAGER_PATH);
142
143         object = stc_object_skeleton_new(s);
144         g_free(s);
145
146         manager = stc_manager_skeleton_new();
147         stc_object_skeleton_set_manager(object, manager);
148         g_object_unref(manager);
149
150         g_signal_connect(manager, "handle-stop",
151                          G_CALLBACK(handle_manager_stop), stc);
152
153         g_dbus_object_manager_server_export(stc->obj_mgr,
154                                             G_DBUS_OBJECT_SKELETON(object));
155         g_object_unref(object);
156
157         stc->manager_obj = (gpointer)manager;
158
159         __STC_LOG_FUNC_EXIT__;
160         return ret;
161 }
162
163
164 static void __stc_manager_gdbus_on_bus_acquired(GDBusConnection *connection,
165                                                 const gchar *name,
166                                                 gpointer user_data)
167 {
168         __STC_LOG_FUNC_ENTER__;
169         stc_s* stc = (stc_s*)user_data;
170
171         stc->obj_mgr = g_dbus_object_manager_server_new("/net/stc");
172
173         STC_LOGD("path : %s", name);
174
175         stc->connection = connection;
176
177         if (__stc_manager_gdbus_statistics_init(stc) == FALSE) {
178                 STC_LOGE("Can not signal connect to statistics"); //LCOV_EXCL_LINE
179                 /* Deinitialize and quit manager */
180         }
181
182         if (__stc_manager_gdbus_restriction_init(stc) == FALSE) {
183                 STC_LOGE("Cannot signal connect to restriction"); //LCOV_EXCL_LINE
184                 /* Deinitialize and quit manager */
185         }
186
187         if (__stc_manager_gdbus_manager_init(stc) == FALSE) {
188                 STC_LOGE("Cannot signal connect to manager"); //LCOV_EXCL_LINE
189                 /* Deinitialize and quit manager */
190         }
191
192         g_dbus_object_manager_server_set_connection(stc->obj_mgr,
193                                                     stc->connection);
194
195         iptables_init();
196         stc_default_connection_monitor_init(stc);
197         stc_register_state_changed_cb(stc, stc_manager_app_status_changed, NULL);
198
199         __STC_LOG_FUNC_EXIT__;
200 }
201
202 static void __stc_manager_gdbus_on_name_acquired(GDBusConnection *connection,
203                                                  const gchar *name,
204                                                  gpointer user_data)
205 {
206         STC_LOGD("name : %s", name);
207 }
208
209 //LCOV_EXCL_START
210 static void __stc_manager_gdbus_on_name_lost(GDBusConnection *connection,
211                                              const gchar *name,
212                                              gpointer user_data)
213 {
214         STC_LOGD("name : %s", name);
215 }
216 //LCOV_EXCL_STOP
217
218 void stc_manager_gdbus_init(gpointer stc_data)
219 {
220         __STC_LOG_FUNC_ENTER__;
221         stc_s *stc = (stc_s *)stc_data;
222
223         stc->gdbus_owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM,
224                                              STC_DBUS_SERVICE,
225                                              G_BUS_NAME_OWNER_FLAGS_NONE,
226                                              __stc_manager_gdbus_on_bus_acquired,
227                                              __stc_manager_gdbus_on_name_acquired,
228                                              __stc_manager_gdbus_on_name_lost,
229                                              stc,
230                                              NULL);
231
232         __STC_LOG_FUNC_EXIT__;
233 }
234
235 void stc_manager_gdbus_deinit(gpointer stc_data)
236 {
237         __STC_LOG_FUNC_ENTER__;
238         stc_s *stc = (stc_s *)stc_data;
239
240         stc_deregister_state_changed_cb(stc);
241         stc_default_connection_monitor_deinit(stc);
242
243         g_bus_unown_name(stc->gdbus_owner_id);
244
245         stc->statistics_obj = NULL;
246         stc->restriction_obj = NULL;
247         stc->manager_obj = NULL;
248         __STC_LOG_FUNC_EXIT__;
249 }
250
251 GVariant *stc_manager_gdbus_call_sync(GDBusConnection *connection,
252                                       const char *dest, const char *path,
253                                       const char *interface_name,
254                                       const char *method, GVariant *params)
255 {
256         GError *error = NULL;
257         GVariant *reply = NULL;
258
259         if (connection == NULL) {
260                 STC_LOGE("Failed to get GDBusconnection"); //LCOV_EXCL_LINE
261                 return reply; //LCOV_EXCL_LINE
262         }
263
264         reply = g_dbus_connection_call_sync(connection,
265                                             dest,
266                                             path,
267                                             interface_name,
268                                             method,
269                                             params,
270                                             NULL,
271                                             G_DBUS_CALL_FLAGS_NONE,
272                                             (5 * 1000),  /* 5 seconds timeout */
273                                             NULL,
274                                             &error);
275
276         if (reply == NULL) {
277                 if (error != NULL) {
278                         STC_LOGE("g_dbus_connection_call_sync() failed" //LCOV_EXCL_LINE
279                                  "error [%d: %s]", error->code, error->message);
280                         g_error_free(error); //LCOV_EXCL_LINE
281                 } else {
282                         STC_LOGE("g_dbus_connection_call_sync() failed"); //LCOV_EXCL_LINE
283                 }
284
285                 return NULL;
286         }
287
288         return reply;
289 }
290
291 guint stc_manager_gdbus_subscribe_signal(GDBusConnection *connection,
292                                          const gchar *sender,
293                                          const gchar *interface_name,
294                                          const gchar *member,
295                                          const gchar *object_path,
296                                          const gchar *arg0,
297                                          GDBusSignalFlags flags,
298                                          GDBusSignalCallback callback,
299                                          gpointer user_data,
300                                          GDestroyNotify user_data_free_func)
301 {
302         if (connection == NULL) {
303                 STC_LOGE("Failed to get GDBusconnection"); //LCOV_EXCL_LINE
304                 return 0; //LCOV_EXCL_LINE
305         }
306
307         return g_dbus_connection_signal_subscribe(connection,
308                                                   sender,
309                                                   interface_name,
310                                                   member,
311                                                   object_path,
312                                                   NULL,
313                                                   G_DBUS_SIGNAL_FLAGS_NONE,
314                                                   callback,
315                                                   user_data,
316                                                   user_data_free_func);
317 }
318
319 void stc_manager_gdbus_unsubscribe_signal(GDBusConnection *connection,
320                                           guint subscription_id)
321 {
322         if (connection == NULL) {
323                 STC_LOGE("Failed to get GDBusconnection"); //LCOV_EXCL_LINE
324                 return; //LCOV_EXCL_LINE
325         }
326
327         g_dbus_connection_signal_unsubscribe(connection, subscription_id);
328 }
329
330 void stc_manager_gdbus_dict_foreach(GVariantIter *iter, dbus_dict_cb cb,
331                                     void *user_data)
332 {
333         __STC_LOG_FUNC_ENTER__;
334
335         gchar *key = NULL;
336         GVariant *value = NULL;
337
338         if (!cb) {
339                 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
340                 return; //LCOV_EXCL_LINE
341         }
342
343         while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
344                 DEBUG_GDBUS_KEY_VALUE(key, value);
345                 if (key && cb)
346                         cb(key, value, user_data);
347         }
348
349         __STC_LOG_FUNC_EXIT__;
350 }
351
352 gboolean stc_manager_dbus_emit_signal(GDBusConnection *connection,
353                                       const gchar *object_path,
354                                       const gchar *interface_name,
355                                       const gchar *signal_name,
356                                       GVariant *parameters)
357 {
358         gboolean rv = FALSE;
359         GError *error = NULL;
360
361         if (connection == NULL) {
362                 STC_LOGE("GDBusconnection is NULL"); //LCOV_EXCL_LINE
363                 return 0;
364         }
365
366         DEBUG_GDBUS_VARIANT("Signal params: ", parameters);
367
368         rv = g_dbus_connection_emit_signal(connection,
369                                            NULL,
370                                            object_path,
371                                            interface_name,
372                                            signal_name,
373                                            parameters,
374                                            &error);
375         if (rv != TRUE) {
376                 STC_LOGE("Failed to emit signal [%s] interface [%s] Error [%s]", //LCOV_EXCL_LINE
377                          signal_name, interface_name, error->message);
378                 g_error_free(error); //LCOV_EXCL_LINE
379         } else {
380                 STC_LOGD("[%s] signal sent on [%s] interface", signal_name,
381                          interface_name);
382         }
383
384         return rv;
385 }
386
387 gboolean handle_manager_stop(StcManager *object,
388                                GDBusMethodInvocation *invocation)
389 {
390         __STC_LOG_FUNC_ENTER__;
391         GVariant *return_parameters = NULL;
392
393         STC_LOGI("stc manager stop");
394
395         return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
396
397         DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
398         STC_DBUS_REPLY(invocation, return_parameters);
399
400         stc_stop_manager();
401
402         __STC_LOG_FUNC_EXIT__;
403         return TRUE;
404 }