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-statistics.h"
19 #include "stc-restriction.h"
20 #include "stc-default-connection.h"
21 #include "stc-manager-plugin.h"
22 #include "stc-app-lifecycle.h"
23 #include "helper-iptables.h"
25 static gboolean __stc_manager_gdbus_statistics_init(stc_s *stc)
27 __STC_LOG_FUNC_ENTER__;
31 StcObjectSkeleton *object = NULL;
32 StcStatistics *statistics = NULL;
33 s = g_strdup_printf(STC_DBUS_SERVICE_STATISTICS_PATH);
35 /* Add interface to default object path */
36 object = stc_object_skeleton_new(s);
39 /* Make the newly created object export the interface
40 * net.stc.statistics (note
41 * that @object takes its own reference to @statistics).
44 statistics = stc_statistics_skeleton_new();
45 stc_object_skeleton_set_statistics(object, statistics);
46 g_object_unref(statistics);
48 /* Register for method callbacks as signal callbacks */
50 g_signal_connect(statistics, "handle-init",
51 G_CALLBACK(handle_statistics_init),
54 g_signal_connect(statistics, "handle-get",
55 G_CALLBACK(handle_statistics_get),
58 g_signal_connect(statistics, "handle-get-all",
59 G_CALLBACK(handle_statistics_get_all),
62 g_signal_connect(statistics, "handle-reset",
63 G_CALLBACK(handle_statistics_reset),
66 /* Export the object (@manager takes its own reference to @object) */
67 g_dbus_object_manager_server_export(stc->obj_mgr,
68 G_DBUS_OBJECT_SKELETON(object));
69 g_object_unref(object);
71 stc->statistics_obj = (gpointer)statistics;
73 __STC_LOG_FUNC_EXIT__;
77 static gboolean __stc_manager_gdbus_restriction_init(stc_s *stc)
79 __STC_LOG_FUNC_ENTER__;
83 StcObjectSkeleton *object = NULL;
84 StcRestriction *restriction = NULL;
85 s = g_strdup_printf(STC_DBUS_SERVICE_RESTRICTION_PATH);
87 /* Add interface to default object path */
88 object = stc_object_skeleton_new(s);
91 /* Make the newly created object export the interface
92 * net.stc.restriction (note
93 * that @object takes its own reference to @restriction).
96 restriction = stc_restriction_skeleton_new();
97 stc_object_skeleton_set_restriction(object, restriction);
98 g_object_unref(restriction);
100 /* Register for method callbacks as signal callbacks */
102 g_signal_connect(restriction, "handle-set",
103 G_CALLBACK(handle_restriction_set), stc);
105 g_signal_connect(restriction, "handle-exclude",
106 G_CALLBACK(handle_restriction_exclude), stc);
108 g_signal_connect(restriction, "handle-get",
109 G_CALLBACK(handle_restriction_get), stc);
111 g_signal_connect(restriction, "handle-get-all",
112 G_CALLBACK(handle_restriction_get_all), stc);
114 g_signal_connect(restriction, "handle-get-state",
115 G_CALLBACK(handle_restriction_get_state),
118 g_signal_connect(restriction, "handle-unset",
119 G_CALLBACK(handle_restriction_unset), stc);
121 /* Export the object (@manager takes its own reference to @object) */
122 g_dbus_object_manager_server_export(stc->obj_mgr,
123 G_DBUS_OBJECT_SKELETON(object));
124 g_object_unref(object);
126 stc->restriction_obj = (gpointer)restriction;
128 __STC_LOG_FUNC_EXIT__;
132 static void __stc_manager_gdbus_on_bus_acquired(GDBusConnection *connection,
136 __STC_LOG_FUNC_ENTER__;
137 stc_s* stc = (stc_s*)user_data;
139 stc->obj_mgr = g_dbus_object_manager_server_new("/net/stc");
141 STC_LOGD("path : %s", name);
143 stc->connection = connection;
145 if (__stc_manager_gdbus_statistics_init(stc) == FALSE) {
146 STC_LOGE("Can not signal connect to statistics");
147 /* Deinitialize and quit manager */
150 if (__stc_manager_gdbus_restriction_init(stc) == FALSE) {
151 STC_LOGE("Cannot signal connect to restriction");
152 /* Deinitialize and quit manager */
155 g_dbus_object_manager_server_set_connection(stc->obj_mgr,
159 stc_default_connection_monitor_init(stc);
160 stc_register_state_changed_cb(stc, stc_manager_app_status_changed, NULL);
162 __STC_LOG_FUNC_EXIT__;
165 static void __stc_manager_gdbus_on_name_acquired(GDBusConnection *connection,
169 STC_LOGD("name : %s", name);
172 static void __stc_manager_gdbus_on_name_lost(GDBusConnection *connection,
176 STC_LOGD("name : %s", name);
179 void stc_manager_gdbus_init(gpointer stc_data)
181 __STC_LOG_FUNC_ENTER__;
182 stc_s *stc = (stc_s *)stc_data;
184 stc->gdbus_owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM,
186 G_BUS_NAME_OWNER_FLAGS_NONE,
187 __stc_manager_gdbus_on_bus_acquired,
188 __stc_manager_gdbus_on_name_acquired,
189 __stc_manager_gdbus_on_name_lost,
193 __STC_LOG_FUNC_EXIT__;
196 void stc_manager_gdbus_deinit(gpointer stc_data)
198 __STC_LOG_FUNC_ENTER__;
199 stc_s *stc = (stc_s *)stc_data;
201 stc_deregister_state_changed_cb(stc);
202 stc_default_connection_monitor_deinit(stc);
204 g_bus_unown_name(stc->gdbus_owner_id);
206 stc->statistics_obj = NULL;
207 stc->restriction_obj = NULL;
208 __STC_LOG_FUNC_EXIT__;
211 GVariant *stc_manager_gdbus_call_sync(GDBusConnection *connection,
212 const char *dest, const char *path,
213 const char *interface_name,
214 const char *method, GVariant *params)
216 GError *error = NULL;
217 GVariant *reply = NULL;
219 if (connection == NULL) {
220 STC_LOGE("Failed to get GDBusconnection");
224 reply = g_dbus_connection_call_sync(connection,
231 G_DBUS_CALL_FLAGS_NONE,
232 (5 * 1000), /* 5 seconds timeout */
238 STC_LOGE("g_dbus_connection_call_sync() failed"
239 "error [%d: %s]", error->code, error->message);
242 STC_LOGE("g_dbus_connection_call_sync() failed");
251 guint stc_manager_gdbus_subscribe_signal(GDBusConnection *connection,
253 const gchar *interface_name,
255 const gchar *object_path,
257 GDBusSignalFlags flags,
258 GDBusSignalCallback callback,
260 GDestroyNotify user_data_free_func)
262 if (connection == NULL) {
263 STC_LOGE("Failed to get GDBusconnection");
267 return g_dbus_connection_signal_subscribe(connection,
273 G_DBUS_SIGNAL_FLAGS_NONE,
276 user_data_free_func);
279 void stc_manager_gdbus_unsubscribe_signal(GDBusConnection *connection,
280 guint subscription_id)
282 if (connection == NULL) {
283 STC_LOGE("Failed to get GDBusconnection");
287 g_dbus_connection_signal_unsubscribe(connection, subscription_id);
290 void stc_manager_gdbus_dict_foreach(GVariantIter *iter, dbus_dict_cb cb,
293 __STC_LOG_FUNC_ENTER__;
296 GVariant *value = NULL;
299 __STC_LOG_FUNC_EXIT__;
303 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
304 DEBUG_GDBUS_KEY_VALUE(key, value);
306 cb(key, value, user_data);
309 __STC_LOG_FUNC_EXIT__;
312 gboolean stc_manager_dbus_emit_signal(GDBusConnection *connection,
313 const gchar *object_path,
314 const gchar *interface_name,
315 const gchar *signal_name,
316 GVariant *parameters)
319 GError *error = NULL;
321 if (connection == NULL) {
322 STC_LOGE("GDBusconnection is NULL");
326 DEBUG_GDBUS_VARIANT("Signal params: ", parameters);
328 rv = g_dbus_connection_emit_signal(connection,
336 STC_LOGE("Failed to emit signal [%s] interface [%s] Error [%s]",
337 signal_name, interface_name, error->message);
340 STC_LOGD("[%s] signal sent on [%s] interface", signal_name,