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-firewall.h"
22 #include "stc-default-connection.h"
23 #include "stc-manager-plugin-appstatus.h"
24 #include "stc-manager-plugin-procfs.h"
25 #include "helper-iptables.h"
27 static gboolean __stc_manager_gdbus_statistics_init(stc_s *stc)
29 __STC_LOG_FUNC_ENTER__;
33 StcObjectSkeleton *object = NULL;
34 StcStatistics *statistics = NULL;
35 s = g_strdup_printf(STC_DBUS_SERVICE_STATISTICS_PATH);
37 /* Add interface to default object path */
38 object = stc_object_skeleton_new(s);
41 /* Make the newly created object export the interface
42 * net.stc.statistics (note
43 * that @object takes its own reference to @statistics).
46 statistics = stc_statistics_skeleton_new();
47 stc_object_skeleton_set_statistics(object, statistics);
48 g_object_unref(statistics);
50 /* Register for method callbacks as signal callbacks */
52 g_signal_connect(statistics, "handle-init",
53 G_CALLBACK(handle_statistics_init),
56 g_signal_connect(statistics, "handle-get",
57 G_CALLBACK(handle_statistics_get),
60 g_signal_connect(statistics, "handle-get-all",
61 G_CALLBACK(handle_statistics_get_all),
64 g_signal_connect(statistics, "handle-reset",
65 G_CALLBACK(handle_statistics_reset),
68 /* Export the object (@manager takes its own reference to @object) */
69 g_dbus_object_manager_server_export(stc->obj_mgr,
70 G_DBUS_OBJECT_SKELETON(object));
71 g_object_unref(object);
73 stc->statistics_obj = (gpointer)statistics;
75 __STC_LOG_FUNC_EXIT__;
79 static gboolean __stc_manager_gdbus_restriction_init(stc_s *stc)
81 __STC_LOG_FUNC_ENTER__;
85 StcObjectSkeleton *object = NULL;
86 StcRestriction *restriction = NULL;
87 s = g_strdup_printf(STC_DBUS_SERVICE_RESTRICTION_PATH);
89 /* Add interface to default object path */
90 object = stc_object_skeleton_new(s);
93 /* Make the newly created object export the interface
94 * net.stc.restriction (note
95 * that @object takes its own reference to @restriction).
98 restriction = stc_restriction_skeleton_new();
99 stc_object_skeleton_set_restriction(object, restriction);
100 g_object_unref(restriction);
102 /* Register for method callbacks as signal callbacks */
104 g_signal_connect(restriction, "handle-set",
105 G_CALLBACK(handle_restriction_set), stc);
107 g_signal_connect(restriction, "handle-exclude",
108 G_CALLBACK(handle_restriction_exclude), stc);
110 g_signal_connect(restriction, "handle-get",
111 G_CALLBACK(handle_restriction_get), stc);
113 g_signal_connect(restriction, "handle-get-all",
114 G_CALLBACK(handle_restriction_get_all), stc);
116 g_signal_connect(restriction, "handle-get-state",
117 G_CALLBACK(handle_restriction_get_state),
120 g_signal_connect(restriction, "handle-unset",
121 G_CALLBACK(handle_restriction_unset), stc);
123 /* Export the object (@manager takes its own reference to @object) */
124 g_dbus_object_manager_server_export(stc->obj_mgr,
125 G_DBUS_OBJECT_SKELETON(object));
126 g_object_unref(object);
128 stc->restriction_obj = (gpointer)restriction;
130 __STC_LOG_FUNC_EXIT__;
134 static gboolean __stc_manager_gdbus_firewall_init(stc_s *stc)
136 __STC_LOG_FUNC_ENTER__;
140 StcObjectSkeleton *object = NULL;
141 StcFirewall *firewall = NULL;
142 s = g_strdup_printf(STC_DBUS_SERVICE_FIREWALL_PATH);
144 /* Add interface to default object path */
145 object = stc_object_skeleton_new(s);
148 firewall = stc_firewall_skeleton_new();
149 stc_object_skeleton_set_firewall(object, firewall);
150 g_object_unref(firewall);
152 /* Register for method callbacks as signal callbacks */
154 g_signal_connect(firewall, "handle-lock",
155 G_CALLBACK(handle_firewall_lock),
158 g_signal_connect(firewall, "handle-unlock",
159 G_CALLBACK(handle_firewall_unlock),
162 g_signal_connect(firewall, "handle-get-lock",
163 G_CALLBACK(handle_firewall_get_lock),
166 g_signal_connect(firewall, "handle-add-chain",
167 G_CALLBACK(handle_firewall_add_chain),
170 g_signal_connect(firewall, "handle-remove-chain",
171 G_CALLBACK(handle_firewall_remove_chain),
174 g_signal_connect(firewall, "handle-flush-chain",
175 G_CALLBACK(handle_firewall_flush_chain),
178 g_signal_connect(firewall, "handle-get-all-chain",
179 G_CALLBACK(handle_firewall_get_all_chain),
182 g_signal_connect(firewall, "handle-set-chain",
183 G_CALLBACK(handle_firewall_set_chain),
186 g_signal_connect(firewall, "handle-unset-chain",
187 G_CALLBACK(handle_firewall_unset_chain),
190 g_signal_connect(firewall, "handle-add-rule",
191 G_CALLBACK(handle_firewall_add_rule),
194 g_signal_connect(firewall, "handle-remove-rule",
195 G_CALLBACK(handle_firewall_remove_rule),
198 g_signal_connect(firewall, "handle-update-rule",
199 G_CALLBACK(handle_firewall_update_rule),
202 g_signal_connect(firewall, "handle-get-all-rule",
203 G_CALLBACK(handle_firewall_get_all_rule),
206 /* Export the object (@manager takes its own reference to @object) */
207 g_dbus_object_manager_server_export(stc->obj_mgr,
208 G_DBUS_OBJECT_SKELETON(object));
209 g_object_unref(object);
211 stc->firewall_obj = (gpointer)firewall;
213 __STC_LOG_FUNC_EXIT__;
217 static gboolean __stc_manager_gdbus_manager_init(stc_s *stc)
219 __STC_LOG_FUNC_ENTER__;
223 StcObjectSkeleton *object = NULL;
224 StcManager *manager = NULL;
225 s = g_strdup_printf(STC_DBUS_SERVICE_MANAGER_PATH);
227 object = stc_object_skeleton_new(s);
230 manager = stc_manager_skeleton_new();
231 stc_object_skeleton_set_manager(object, manager);
232 g_object_unref(manager);
234 g_signal_connect(manager, "handle-stop",
235 G_CALLBACK(handle_manager_stop), stc);
237 g_dbus_object_manager_server_export(stc->obj_mgr,
238 G_DBUS_OBJECT_SKELETON(object));
239 g_object_unref(object);
241 stc->manager_obj = (gpointer)manager;
243 __STC_LOG_FUNC_EXIT__;
248 static void __stc_manager_gdbus_on_bus_acquired(GDBusConnection *connection,
252 __STC_LOG_FUNC_ENTER__;
253 stc_s* stc = (stc_s*)user_data;
255 stc->obj_mgr = g_dbus_object_manager_server_new("/net/stc");
257 STC_LOGD("path : %s", name);
259 stc->connection = connection;
261 if (__stc_manager_gdbus_statistics_init(stc) == FALSE) {
262 STC_LOGE("Can not signal connect to statistics"); //LCOV_EXCL_LINE
263 /* Deinitialize and quit manager */
266 if (__stc_manager_gdbus_restriction_init(stc) == FALSE) {
267 STC_LOGE("Cannot signal connect to restriction"); //LCOV_EXCL_LINE
268 /* Deinitialize and quit manager */
271 if (__stc_manager_gdbus_firewall_init(stc) == FALSE) {
272 STC_LOGE("Cannot signal connect to firewall"); //LCOV_EXCL_LINE
273 /* Deinitialize and quit manager */
276 if (__stc_manager_gdbus_manager_init(stc) == FALSE) {
277 STC_LOGE("Cannot signal connect to manager"); //LCOV_EXCL_LINE
278 /* Deinitialize and quit manager */
281 g_dbus_object_manager_server_set_connection(stc->obj_mgr,
285 stc_default_connection_monitor_init(stc);
287 stc_plugin_appstatus_register_state_changed_cb(stc,
288 stc_plugin_procfs_app_status_changed, NULL);
290 __STC_LOG_FUNC_EXIT__;
293 static void __stc_manager_gdbus_on_name_acquired(GDBusConnection *connection,
297 STC_LOGD("name : %s", name);
301 static void __stc_manager_gdbus_on_name_lost(GDBusConnection *connection,
305 STC_LOGD("name : %s", name);
309 void stc_manager_gdbus_init(gpointer stc_data)
311 __STC_LOG_FUNC_ENTER__;
312 stc_s *stc = (stc_s *)stc_data;
314 stc->gdbus_owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM,
316 G_BUS_NAME_OWNER_FLAGS_NONE,
317 __stc_manager_gdbus_on_bus_acquired,
318 __stc_manager_gdbus_on_name_acquired,
319 __stc_manager_gdbus_on_name_lost,
323 __STC_LOG_FUNC_EXIT__;
326 void stc_manager_gdbus_deinit(gpointer stc_data)
328 __STC_LOG_FUNC_ENTER__;
329 stc_s *stc = (stc_s *)stc_data;
331 stc_plugin_appstatus_deregister_state_changed_cb(stc);
332 stc_default_connection_monitor_deinit(stc);
334 g_bus_unown_name(stc->gdbus_owner_id);
336 stc->statistics_obj = NULL;
337 stc->restriction_obj = NULL;
338 stc->firewall_obj = NULL;
339 stc->manager_obj = NULL;
340 __STC_LOG_FUNC_EXIT__;
343 GVariant *stc_manager_gdbus_call_sync(GDBusConnection *connection,
344 const char *dest, const char *path,
345 const char *interface_name,
346 const char *method, GVariant *params)
348 GError *error = NULL;
349 GVariant *reply = NULL;
351 if (connection == NULL) {
352 STC_LOGE("Failed to get GDBusconnection"); //LCOV_EXCL_LINE
353 return reply; //LCOV_EXCL_LINE
356 reply = g_dbus_connection_call_sync(connection,
363 G_DBUS_CALL_FLAGS_NONE,
364 (5 * 1000), /* 5 seconds timeout */
370 STC_LOGE("g_dbus_connection_call_sync() failed" //LCOV_EXCL_LINE
371 "error [%d: %s]", error->code, error->message);
372 g_error_free(error); //LCOV_EXCL_LINE
374 STC_LOGE("g_dbus_connection_call_sync() failed"); //LCOV_EXCL_LINE
383 guint stc_manager_gdbus_subscribe_signal(GDBusConnection *connection,
385 const gchar *interface_name,
387 const gchar *object_path,
389 GDBusSignalFlags flags,
390 GDBusSignalCallback callback,
392 GDestroyNotify user_data_free_func)
394 if (connection == NULL) {
395 STC_LOGE("Failed to get GDBusconnection"); //LCOV_EXCL_LINE
396 return 0; //LCOV_EXCL_LINE
399 return g_dbus_connection_signal_subscribe(connection,
405 G_DBUS_SIGNAL_FLAGS_NONE,
408 user_data_free_func);
411 void stc_manager_gdbus_unsubscribe_signal(GDBusConnection *connection,
412 guint subscription_id)
414 if (connection == NULL) {
415 STC_LOGE("Failed to get GDBusconnection"); //LCOV_EXCL_LINE
416 return; //LCOV_EXCL_LINE
419 g_dbus_connection_signal_unsubscribe(connection, subscription_id);
422 void stc_manager_gdbus_dict_foreach(GVariantIter *iter, dbus_dict_cb cb,
425 __STC_LOG_FUNC_ENTER__;
428 GVariant *value = NULL;
431 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
432 return; //LCOV_EXCL_LINE
435 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
436 DEBUG_GDBUS_KEY_VALUE(key, value);
438 cb(key, value, user_data);
441 __STC_LOG_FUNC_EXIT__;
444 gboolean stc_manager_dbus_emit_signal(GDBusConnection *connection,
445 const gchar *object_path,
446 const gchar *interface_name,
447 const gchar *signal_name,
448 GVariant *parameters)
451 GError *error = NULL;
453 if (connection == NULL) {
454 STC_LOGE("GDBusconnection is NULL"); //LCOV_EXCL_LINE
458 DEBUG_GDBUS_VARIANT("Signal params: ", parameters);
460 rv = g_dbus_connection_emit_signal(connection,
468 STC_LOGE("Failed to emit signal [%s] interface [%s] Error [%s]", //LCOV_EXCL_LINE
469 signal_name, interface_name, error->message);
470 g_error_free(error); //LCOV_EXCL_LINE
472 STC_LOGD("[%s] signal sent on [%s] interface", signal_name,
479 gboolean handle_manager_stop(StcManager *object,
480 GDBusMethodInvocation *invocation)
482 __STC_LOG_FUNC_ENTER__;
483 GVariant *return_parameters = NULL;
485 STC_LOGI("stc manager stop");
487 return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
489 DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
490 STC_DBUS_REPLY(invocation, return_parameters);
494 __STC_LOG_FUNC_EXIT__;