2 * Network Configuration Module
4 * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
27 #define DBUS_PARAM_TYPE_STRING "string"
28 #define DBUS_PARAM_TYPE_INT16 "int16"
29 #define DBUS_PARAM_TYPE_UINT16 "uint16"
30 #define DBUS_PARAM_TYPE_INT32 "int32"
31 #define DBUS_PARAM_TYPE_UINT32 "uint32"
32 #define DBUS_PARAM_TYPE_INT64 "int64"
33 #define DBUS_PARAM_TYPE_UINT64 "uint64"
34 #define DBUS_PARAM_TYPE_DOUBLE "double"
35 #define DBUS_PARAM_TYPE_BYTE "byte"
36 #define DBUS_PARAM_TYPE_BOOLEAN "boolean"
37 #define DBUS_PARAM_TYPE_OBJECT_PATH "objpath"
38 #define DBUS_PARAM_TYPE_VARIANT "variant"
39 #define DBUS_PARAM_TYPE_ARRAY "array"
41 static GDBusObjectManagerServer *manager_server_wifi = NULL;
42 static GDBusObjectManagerServer *manager_server_state = NULL;
43 static GDBusObjectManagerServer *manager_server_statistics = NULL;
44 static GDBusObjectManagerServer *manager_server_vpn = NULL;
45 static GDBusObjectManagerServer *manager_server_mptcp = NULL;
46 static GDBusObjectManagerServer *manager_server_ethernet = NULL;
47 static guint owner_id = 0;
48 static got_name_cb g_callback = NULL;
50 struct gdbus_conn_data {
51 GDBusConnection *connection;
53 GCancellable *cancellable;
56 static struct gdbus_conn_data gconn_data = {NULL, 0, NULL};
58 GDBusObjectManagerServer *netdbus_get_wifi_manager(void)
60 return manager_server_wifi;
63 GDBusObjectManagerServer *netdbus_get_state_manager(void)
65 return manager_server_state;
68 GDBusObjectManagerServer *netdbus_get_statistics_manager(void)
70 return manager_server_statistics;
73 GDBusObjectManagerServer *netdbus_get_vpn_manager(void)
75 return manager_server_vpn;
78 GDBusObjectManagerServer *netdbus_get_mptcp_manager(void)
80 return manager_server_mptcp;
83 GDBusObjectManagerServer *netdbus_get_ethernet_manager(void)
85 return manager_server_ethernet;
88 GDBusConnection *netdbus_get_connection(void)
90 return gconn_data.connection;
93 GCancellable *netdbus_get_cancellable(void)
95 return gconn_data.cancellable;
98 void netconfig_gdbus_pending_call_ref(void)
100 g_object_ref(gconn_data.connection);
102 __sync_fetch_and_add(&gconn_data.conn_ref_count, 1);
105 void netconfig_gdbus_pending_call_unref(void)
107 if (gconn_data.conn_ref_count < 1)
110 g_object_unref(gconn_data.connection);
112 if (__sync_sub_and_fetch(&gconn_data.conn_ref_count, 1) < 1) {
114 * gconn_data.connection = NULL;
119 int _create_gdbus_call(GDBusConnection *conn)
121 if (gconn_data.connection != NULL) {
122 ERR("Connection already set");
126 gconn_data.connection = conn;
127 if (gconn_data.connection == NULL) {
128 ERR("Failed to connect to the D-BUS daemon");
132 gconn_data.cancellable = g_cancellable_new();
137 gboolean netconfig_is_cellular_internet_profile(const char *profile)
139 const char internet_suffix[] = "_1";
145 if (g_str_has_prefix(profile, CONNMAN_CELLULAR_SERVICE_PROFILE_PREFIX)
147 suffix = strrchr(profile, '_');
148 if (g_strcmp0(suffix, internet_suffix) == 0)
155 gboolean netconfig_is_cellular_profile(const char *profile)
160 return g_str_has_prefix(profile, CONNMAN_CELLULAR_SERVICE_PROFILE_PREFIX);
163 gboolean netconfig_is_wifi_profile(const char *profile)
168 return g_str_has_prefix(profile, CONNMAN_WIFI_SERVICE_PROFILE_PREFIX);
171 gboolean netconfig_is_ethernet_profile(const char *profile)
176 return g_str_has_prefix(profile, CONNMAN_ETHERNET_SERVICE_PROFILE_PREFIX);
179 gboolean netconfig_is_bluetooth_profile(const char *profile)
184 return g_str_has_prefix(profile, CONNMAN_BLUETOOTH_SERVICE_PROFILE_PREFIX);
187 gboolean netconfig_invoke_dbus_method_nonblock(const char *dest, const char *path,
188 const char *interface_name, const char *method, GVariant *params,
189 GAsyncReadyCallback notify_func, void *user_data)
191 GDBusConnection *connection = NULL;
193 DBG("[GDBUS Async] %s %s %s", interface_name, method, path);
195 connection = netdbus_get_connection();
196 if (connection == NULL) {
197 ERR("Failed to get gdbus connection");
201 g_dbus_connection_call(connection,
208 G_DBUS_CALL_FLAGS_NONE,
209 NETCONFIG_DBUS_REPLY_TIMEOUT,
210 netdbus_get_cancellable(),
211 (GAsyncReadyCallback) notify_func,
214 netconfig_gdbus_pending_call_ref();
219 GVariant *netconfig_invoke_dbus_method(const char *dest, const char *path,
220 const char *interface_name, const char *method, GVariant *params)
223 GError *error = NULL;
224 GVariant *reply = NULL;
225 GDBusConnection *connection;
227 connection = netdbus_get_connection();
228 if (connection == NULL) {
229 ERR("Failed to get GDBusconnection");
233 reply = g_dbus_connection_call_sync(
241 G_DBUS_CALL_FLAGS_NONE,
242 NETCONFIG_DBUS_REPLY_TIMEOUT,
243 netdbus_get_cancellable(),
248 ERR("g_dbus_connection_call_sync() failed"
249 "error [%d: %s]", error->code, error->message);
252 ERR("g_dbus_connection_call_sync() failed");
261 gboolean netconfig_dbus_emit_signal(const gchar *destination_bus_name,
262 const gchar *object_path,
263 const gchar *interface_name,
264 const gchar *signal_name,
268 GError *Error = NULL;
269 GDBusConnection *connection;
271 connection = netdbus_get_connection();
272 if (connection == NULL) {
273 ERR("[NET_DBUS] GDBusconnection is NULL");
277 rv = g_dbus_connection_emit_signal(connection, destination_bus_name,
278 object_path, interface_name, signal_name, params, &Error);
280 ERR("[NET_DBUS] Failed to emit signal, Error: %s", Error->message);
281 g_clear_error(&Error);
285 INFO("Sent signal (%s), Interface (%s)", signal_name, interface_name);
290 static void _got_bus_cb(GDBusConnection *conn, const gchar *name,
293 _create_gdbus_call(conn);
296 static void _got_name_cb(GDBusConnection *conn, const gchar *name,
299 INFO("Got gdbus name: [%s] and gdbus connection: [%p]", name, conn);
301 if (g_callback != NULL)
305 static void _lost_name_cb(GDBusConnection *conn, const gchar *name,
308 /* May service name is already in use */
309 ERR("_lost_name_cb [%s]", name);
311 /* The result of DBus name request is only permitted,
312 * such as DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER.
317 int setup_gdbus(got_name_cb cb)
321 manager_server_wifi = g_dbus_object_manager_server_new(NETCONFIG_WIFI_PATH);
322 if (manager_server_wifi == NULL) {
323 ERR("Manager server for WIFI_PATH not created.");
327 manager_server_state = g_dbus_object_manager_server_new(NETCONFIG_NETWORK_STATE_PATH);
328 if (manager_server_state == NULL) {
329 ERR("Manager server for STATE_PATH not created.");
333 manager_server_statistics = g_dbus_object_manager_server_new(NETCONFIG_NETWORK_STATISTICS_PATH);
334 if (manager_server_statistics == NULL) {
335 ERR("Manager server for STATISTICS_PATH not created.");
339 manager_server_vpn = g_dbus_object_manager_server_new(NETCONFIG_VPNSVC_PATH);
340 if (manager_server_vpn == NULL) {
341 ERR("Manager server for VPNSVC_PATH not created.");
345 manager_server_mptcp = g_dbus_object_manager_server_new(NETCONFIG_MPTCP_PATH);
346 if (manager_server_mptcp == NULL) {
347 ERR("Manager server for MPTCP_PATH not created.");
351 manager_server_ethernet = g_dbus_object_manager_server_new(NETCONFIG_ETHERNET_PATH);
352 if (manager_server_ethernet == NULL) {
353 ERR("Manager server for NETCONFIG_ETHERNET_PATH not created.");
357 owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM, NETCONFIG_SERVICE,
358 G_BUS_NAME_OWNER_FLAGS_NONE,
359 _got_bus_cb, _got_name_cb, _lost_name_cb,
362 ERR("Could not get system bus!");
366 INFO("Got system bus!");
370 void cleanup_gdbus(void)
372 g_bus_unown_name(owner_id);
373 g_object_unref(manager_server_wifi);
374 g_object_unref(manager_server_state);
375 g_object_unref(manager_server_statistics);