2 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
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"
26 static gboolean __stc_manager_gdbus_statistics_init(stc_s *stc)
28 __STC_LOG_FUNC_ENTER__;
32 StcObjectSkeleton *object = NULL;
33 StcStatistics *statistics = NULL;
34 s = g_strdup_printf(STC_DBUS_SERVICE_STATISTICS_PATH);
36 /* Add interface to default object path */
37 object = stc_object_skeleton_new(s);
40 /* Make the newly created object export the interface
41 * net.stc.statistics (note
42 * that @object takes its own reference to @statistics).
45 statistics = stc_statistics_skeleton_new();
46 stc_object_skeleton_set_statistics(object, statistics);
47 g_object_unref(statistics);
49 /* Register for method callbacks as signal callbacks */
51 g_signal_connect(statistics, "handle-init",
52 G_CALLBACK(handle_statistics_init),
55 g_signal_connect(statistics, "handle-get",
56 G_CALLBACK(handle_statistics_get),
59 g_signal_connect(statistics, "handle-get-all",
60 G_CALLBACK(handle_statistics_get_all),
63 g_signal_connect(statistics, "handle-reset",
64 G_CALLBACK(handle_statistics_reset),
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);
72 stc->statistics_obj = (gpointer)statistics;
74 __STC_LOG_FUNC_EXIT__;
78 static gboolean __stc_manager_gdbus_restriction_init(stc_s *stc)
80 __STC_LOG_FUNC_ENTER__;
84 StcObjectSkeleton *object = NULL;
85 StcRestriction *restriction = NULL;
86 s = g_strdup_printf(STC_DBUS_SERVICE_RESTRICTION_PATH);
88 /* Add interface to default object path */
89 object = stc_object_skeleton_new(s);
92 /* Make the newly created object export the interface
93 * net.stc.restriction (note
94 * that @object takes its own reference to @restriction).
97 restriction = stc_restriction_skeleton_new();
98 stc_object_skeleton_set_restriction(object, restriction);
99 g_object_unref(restriction);
101 /* Register for method callbacks as signal callbacks */
103 g_signal_connect(restriction, "handle-set",
104 G_CALLBACK(handle_restriction_set), stc);
106 g_signal_connect(restriction, "handle-exclude",
107 G_CALLBACK(handle_restriction_exclude), stc);
109 g_signal_connect(restriction, "handle-get",
110 G_CALLBACK(handle_restriction_get), stc);
112 g_signal_connect(restriction, "handle-get-all",
113 G_CALLBACK(handle_restriction_get_all), stc);
115 g_signal_connect(restriction, "handle-get-state",
116 G_CALLBACK(handle_restriction_get_state),
119 g_signal_connect(restriction, "handle-unset",
120 G_CALLBACK(handle_restriction_unset), stc);
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);
127 stc->restriction_obj = (gpointer)restriction;
129 __STC_LOG_FUNC_EXIT__;
133 static gboolean __stc_manager_gdbus_manager_init(stc_s *stc)
135 __STC_LOG_FUNC_ENTER__;
139 StcObjectSkeleton *object = NULL;
140 StcManager *manager = NULL;
141 s = g_strdup_printf(STC_DBUS_SERVICE_MANAGER_PATH);
143 object = stc_object_skeleton_new(s);
146 manager = stc_manager_skeleton_new();
147 stc_object_skeleton_set_manager(object, manager);
148 g_object_unref(manager);
150 g_signal_connect(manager, "handle-stop",
151 G_CALLBACK(handle_manager_stop), stc);
153 g_dbus_object_manager_server_export(stc->obj_mgr,
154 G_DBUS_OBJECT_SKELETON(object));
155 g_object_unref(object);
157 stc->manager_obj = (gpointer)manager;
159 __STC_LOG_FUNC_EXIT__;
164 static void __stc_manager_gdbus_on_bus_acquired(GDBusConnection *connection,
168 __STC_LOG_FUNC_ENTER__;
169 stc_s* stc = (stc_s*)user_data;
171 stc->obj_mgr = g_dbus_object_manager_server_new("/net/stc");
173 STC_LOGD("path : %s", name);
175 stc->connection = connection;
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 */
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 */
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 */
192 g_dbus_object_manager_server_set_connection(stc->obj_mgr,
196 stc_default_connection_monitor_init(stc);
197 stc_register_state_changed_cb(stc, stc_manager_app_status_changed, NULL);
199 __STC_LOG_FUNC_EXIT__;
202 static void __stc_manager_gdbus_on_name_acquired(GDBusConnection *connection,
206 STC_LOGD("name : %s", name);
210 static void __stc_manager_gdbus_on_name_lost(GDBusConnection *connection,
214 STC_LOGD("name : %s", name);
218 void stc_manager_gdbus_init(gpointer stc_data)
220 __STC_LOG_FUNC_ENTER__;
221 stc_s *stc = (stc_s *)stc_data;
223 stc->gdbus_owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM,
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,
232 __STC_LOG_FUNC_EXIT__;
235 void stc_manager_gdbus_deinit(gpointer stc_data)
237 __STC_LOG_FUNC_ENTER__;
238 stc_s *stc = (stc_s *)stc_data;
240 stc_deregister_state_changed_cb(stc);
241 stc_default_connection_monitor_deinit(stc);
243 g_bus_unown_name(stc->gdbus_owner_id);
245 stc->statistics_obj = NULL;
246 stc->restriction_obj = NULL;
247 stc->manager_obj = NULL;
248 __STC_LOG_FUNC_EXIT__;
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)
256 GError *error = NULL;
257 GVariant *reply = NULL;
259 if (connection == NULL) {
260 STC_LOGE("Failed to get GDBusconnection"); //LCOV_EXCL_LINE
261 return reply; //LCOV_EXCL_LINE
264 reply = g_dbus_connection_call_sync(connection,
271 G_DBUS_CALL_FLAGS_NONE,
272 (5 * 1000), /* 5 seconds timeout */
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
282 STC_LOGE("g_dbus_connection_call_sync() failed"); //LCOV_EXCL_LINE
291 guint stc_manager_gdbus_subscribe_signal(GDBusConnection *connection,
293 const gchar *interface_name,
295 const gchar *object_path,
297 GDBusSignalFlags flags,
298 GDBusSignalCallback callback,
300 GDestroyNotify user_data_free_func)
302 if (connection == NULL) {
303 STC_LOGE("Failed to get GDBusconnection"); //LCOV_EXCL_LINE
304 return 0; //LCOV_EXCL_LINE
307 return g_dbus_connection_signal_subscribe(connection,
313 G_DBUS_SIGNAL_FLAGS_NONE,
316 user_data_free_func);
319 void stc_manager_gdbus_unsubscribe_signal(GDBusConnection *connection,
320 guint subscription_id)
322 if (connection == NULL) {
323 STC_LOGE("Failed to get GDBusconnection"); //LCOV_EXCL_LINE
324 return; //LCOV_EXCL_LINE
327 g_dbus_connection_signal_unsubscribe(connection, subscription_id);
330 void stc_manager_gdbus_dict_foreach(GVariantIter *iter, dbus_dict_cb cb,
333 __STC_LOG_FUNC_ENTER__;
336 GVariant *value = NULL;
339 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
340 return; //LCOV_EXCL_LINE
343 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
344 DEBUG_GDBUS_KEY_VALUE(key, value);
346 cb(key, value, user_data);
349 __STC_LOG_FUNC_EXIT__;
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)
359 GError *error = NULL;
361 if (connection == NULL) {
362 STC_LOGE("GDBusconnection is NULL"); //LCOV_EXCL_LINE
366 DEBUG_GDBUS_VARIANT("Signal params: ", parameters);
368 rv = g_dbus_connection_emit_signal(connection,
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
380 STC_LOGD("[%s] signal sent on [%s] interface", signal_name,
387 gboolean handle_manager_stop(StcManager *object,
388 GDBusMethodInvocation *invocation)
390 __STC_LOG_FUNC_ENTER__;
391 GVariant *return_parameters = NULL;
393 STC_LOGI("stc manager stop");
395 return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
397 DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
398 STC_DBUS_REPLY(invocation, return_parameters);
402 __STC_LOG_FUNC_EXIT__;