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-appstatus.h"
23 #include "stc-manager-plugin-procfs.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);
198 stc_plugin_appstatus_register_state_changed_cb(stc,
199 stc_plugin_procfs_app_status_changed, NULL);
201 __STC_LOG_FUNC_EXIT__;
204 static void __stc_manager_gdbus_on_name_acquired(GDBusConnection *connection,
208 STC_LOGD("name : %s", name);
212 static void __stc_manager_gdbus_on_name_lost(GDBusConnection *connection,
216 STC_LOGD("name : %s", name);
220 void stc_manager_gdbus_init(gpointer stc_data)
222 __STC_LOG_FUNC_ENTER__;
223 stc_s *stc = (stc_s *)stc_data;
225 stc->gdbus_owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM,
227 G_BUS_NAME_OWNER_FLAGS_NONE,
228 __stc_manager_gdbus_on_bus_acquired,
229 __stc_manager_gdbus_on_name_acquired,
230 __stc_manager_gdbus_on_name_lost,
234 __STC_LOG_FUNC_EXIT__;
237 void stc_manager_gdbus_deinit(gpointer stc_data)
239 __STC_LOG_FUNC_ENTER__;
240 stc_s *stc = (stc_s *)stc_data;
242 stc_plugin_appstatus_deregister_state_changed_cb(stc);
243 stc_default_connection_monitor_deinit(stc);
245 g_bus_unown_name(stc->gdbus_owner_id);
247 stc->statistics_obj = NULL;
248 stc->restriction_obj = NULL;
249 stc->manager_obj = NULL;
250 __STC_LOG_FUNC_EXIT__;
253 GVariant *stc_manager_gdbus_call_sync(GDBusConnection *connection,
254 const char *dest, const char *path,
255 const char *interface_name,
256 const char *method, GVariant *params)
258 GError *error = NULL;
259 GVariant *reply = NULL;
261 if (connection == NULL) {
262 STC_LOGE("Failed to get GDBusconnection"); //LCOV_EXCL_LINE
263 return reply; //LCOV_EXCL_LINE
266 reply = g_dbus_connection_call_sync(connection,
273 G_DBUS_CALL_FLAGS_NONE,
274 (5 * 1000), /* 5 seconds timeout */
280 STC_LOGE("g_dbus_connection_call_sync() failed" //LCOV_EXCL_LINE
281 "error [%d: %s]", error->code, error->message);
282 g_error_free(error); //LCOV_EXCL_LINE
284 STC_LOGE("g_dbus_connection_call_sync() failed"); //LCOV_EXCL_LINE
293 guint stc_manager_gdbus_subscribe_signal(GDBusConnection *connection,
295 const gchar *interface_name,
297 const gchar *object_path,
299 GDBusSignalFlags flags,
300 GDBusSignalCallback callback,
302 GDestroyNotify user_data_free_func)
304 if (connection == NULL) {
305 STC_LOGE("Failed to get GDBusconnection"); //LCOV_EXCL_LINE
306 return 0; //LCOV_EXCL_LINE
309 return g_dbus_connection_signal_subscribe(connection,
315 G_DBUS_SIGNAL_FLAGS_NONE,
318 user_data_free_func);
321 void stc_manager_gdbus_unsubscribe_signal(GDBusConnection *connection,
322 guint subscription_id)
324 if (connection == NULL) {
325 STC_LOGE("Failed to get GDBusconnection"); //LCOV_EXCL_LINE
326 return; //LCOV_EXCL_LINE
329 g_dbus_connection_signal_unsubscribe(connection, subscription_id);
332 void stc_manager_gdbus_dict_foreach(GVariantIter *iter, dbus_dict_cb cb,
335 __STC_LOG_FUNC_ENTER__;
338 GVariant *value = NULL;
341 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
342 return; //LCOV_EXCL_LINE
345 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
346 DEBUG_GDBUS_KEY_VALUE(key, value);
348 cb(key, value, user_data);
351 __STC_LOG_FUNC_EXIT__;
354 gboolean stc_manager_dbus_emit_signal(GDBusConnection *connection,
355 const gchar *object_path,
356 const gchar *interface_name,
357 const gchar *signal_name,
358 GVariant *parameters)
361 GError *error = NULL;
363 if (connection == NULL) {
364 STC_LOGE("GDBusconnection is NULL"); //LCOV_EXCL_LINE
368 DEBUG_GDBUS_VARIANT("Signal params: ", parameters);
370 rv = g_dbus_connection_emit_signal(connection,
378 STC_LOGE("Failed to emit signal [%s] interface [%s] Error [%s]", //LCOV_EXCL_LINE
379 signal_name, interface_name, error->message);
380 g_error_free(error); //LCOV_EXCL_LINE
382 STC_LOGD("[%s] signal sent on [%s] interface", signal_name,
389 gboolean handle_manager_stop(StcManager *object,
390 GDBusMethodInvocation *invocation)
392 __STC_LOG_FUNC_ENTER__;
393 GVariant *return_parameters = NULL;
395 STC_LOGI("stc manager stop");
397 return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
399 DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
400 STC_DBUS_REPLY(invocation, return_parameters);
404 __STC_LOG_FUNC_EXIT__;