Refactor gdbus functions 88/298288/3
authorSeonah Moon <seonah1.moon@samsung.com>
Mon, 4 Sep 2023 16:10:26 +0000 (01:10 +0900)
committerSeonah Moon <seonah1.moon@samsung.com>
Wed, 27 Sep 2023 04:51:57 +0000 (13:51 +0900)
Separate gdbus operation from softap.c

[ RUN      ] SoftApTest.ForeachConnectedClientsP
[       OK ] SoftApTest.ForeachConnectedClientsP (1 ms)
[----------] 60 tests from SoftApTest (85 ms total)

[----------] Global test environment tear-down
[==========] 86 tests from 3 test suites ran. (280 ms total)
[  PASSED  ] 86 tests.

Change-Id: I564ce4171145c6c1dc743472c7382585cb6a2b9e

CMakeLists.txt
include/softap_dlog.h [new file with mode: 0644]
include/softap_gdbus.h [new file with mode: 0644]
include/softap_private.h
packaging/capi-network-softap.spec
src/softap.c
src/softap_client.c
src/softap_gdbus.c [new file with mode: 0755]
src/softap_private.c

index f6612aa1308a6b2cb35055a9efd2b5f3cdd67cfd..5f01d54de0746e4d13544701998d60377d44d4c8 100755 (executable)
@@ -42,6 +42,8 @@ INSTALL(
         DIRECTORY ${INC_DIR}/ DESTINATION include/network
         FILES_MATCHING
         PATTERN "*_private.h" EXCLUDE
+        PATTERN "*_gdbus.h" EXCLUDE
+        PATTERN "*_dlog.h" EXCLUDE
         PATTERN "marshal.h" EXCLUDE
         PATTERN "softap-client-stub.h" EXCLUDE
         PATTERN "${INC_DIR}/*.h"
diff --git a/include/softap_dlog.h b/include/softap_dlog.h
new file mode 100644 (file)
index 0000000..4fa1c4c
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2023 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __SOFTAP_DLOG_H__
+#define __SOFTAP_DLOG_H__
+
+#define LOG_TAG        "CAPI_NETWORK_SOFTAP"
+
+#include <dlog.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define DBG(fmt, args...)      LOGD(fmt, ##args)
+#define WARN(fmt, args...)     LOGW(fmt, ##args)
+#define ERR(fmt, args...)      LOGE(fmt, ##args)
+#define SDBG(fmt, args...)     SECURE_LOGD(fmt, ##args)
+#define SERR(fmt, args...)     SECURE_LOGE(fmt, ##args)
+
+#define _warn_if(expr, fmt, arg...) do { \
+               if (expr) { \
+                       WARN(fmt, ##arg); \
+               } \
+       } while (0)
+
+#define _ret_if(expr) do { \
+               if (expr) { \
+                       return; \
+               } \
+       } while (0)
+
+#define _retv_if(expr, val) do { \
+               if (expr) { \
+                       return (val); \
+               } \
+       } while (0)
+
+#define _retm_if(expr, fmt, arg...) do { \
+               if (expr) { \
+                       ERR(fmt, ##arg); \
+                       return; \
+               } \
+       } while (0)
+
+#define _retvm_if(expr, val, fmt, arg...) do { \
+               if (expr) { \
+                       ERR(fmt, ##arg); \
+                       return (val); \
+               } \
+       } while (0)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __SOFTAP_DLOG_H__ */
\ No newline at end of file
diff --git a/include/softap_gdbus.h b/include/softap_gdbus.h
new file mode 100644 (file)
index 0000000..d49b60c
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2023 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __SOFTAP_GDBUS_H__
+#define __SOFTAP_GDBUS_H__
+
+#include <glib.h>
+#include <gio/gio.h>
+#include <stdbool.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define SIGNAL_NAME_SOFTAP_ON          "soft_ap_on"
+#define SIGNAL_NAME_SOFTAP_OFF         "soft_ap_off"
+#define SIGNAL_NAME_LOW_BATTERY_MODE   "low_batt_mode"
+#define SIGNAL_NAME_FLIGHT_MODE                "flight_mode"
+#define SIGNAL_NAME_SECURITY_TYPE_CHANGED      "security_type_changed"
+#define SIGNAL_NAME_SSID_VISIBILITY_CHANGED    "ssid_visibility_changed"
+#define SIGNAL_NAME_PASSPHRASE_CHANGED         "passphrase_changed"
+#define SIGNAL_NAME_DHCP_STATUS                "dhcp_status"
+
+#define SOFTAP_SIGNAL_NAME_LEN 64
+
+typedef struct {
+       GDBusConnection *client_bus;
+       GDBusProxy *client_bus_proxy;
+       GCancellable *cancellable;
+} softap_gdbus_h;
+
+typedef enum {
+       GDBUS_ERROR_NONE = 0,
+       GDBUS_ERROR_ACCESS_DENIED = -1,
+       GDBUS_ERROR_NO_REPLY = -2,
+       GDBUS_ERROR_UNKNOWN = -99,
+} softap_gdbus_error_e;
+
+typedef enum {
+       E_SIGNAL_SOFTAP_ON,
+       E_SIGNAL_SOFTAP_OFF,
+       E_SIGNAL_LOW_BATTERY_MODE,
+       E_SIGNAL_FLIGHT_MODE,
+       E_SIGNAL_SECURITY_TYPE_CHANGED,
+       E_SIGNAL_SSID_VISIBILITY_CHANGED,
+       E_SIGNAL_PASSPHRASE_CHANGED,
+       E_SIGNAL_DHCP_STATUS,
+       E_SIGNAL_MAX
+} softap_gdbus_signal_e;
+
+typedef void(*__handle_cb_t)(GDBusConnection *connection, const gchar *sender_name,
+               const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
+               GVariant *parameters, gpointer user_data);
+
+typedef struct {
+       guint sig_id;
+       char name[SOFTAP_SIGNAL_NAME_LEN];
+       __handle_cb_t cb;
+} softap_sig_t;
+
+softap_gdbus_h *softap_gdbus_create();
+void softap_gdbus_destroy(softap_gdbus_h *softap_gdbus);
+
+void softap_gdbus_connect_signals(softap_gdbus_h *softap_gdbus, softap_sig_t sigs[], void *user_data);
+void softap_gdbus_disconnect_signals(softap_gdbus_h *softap_gdbus, softap_sig_t sigs[]);
+int softap_gdbus_connect_signal(softap_gdbus_h *softap_gdbus,
+       softap_sig_t signal, void *user_data);
+void softap_gdbus_disconnect_signal(softap_gdbus_h *softap_gdbus, int sig_id);
+
+void softap_gdbus_proxy_invoke_method(softap_gdbus_h *softap_gdbus,
+               const char *method, GVariant *parameters,
+               GAsyncReadyCallback callback, void *user_data);
+GVariant *softap_gdbus_proxy_invoke_method_sync(softap_gdbus_h *softap_gdbus,
+               const char *method, GVariant *parameters, softap_gdbus_error_e *gdbus_error);
+GVariant *softap_gdbus_proxy_finish(softap_gdbus_h *softap_gdbus,
+       GAsyncResult *result, softap_gdbus_error_e *gdbus_error);
+
+void softap_gdbus_proxy_set_timeout(softap_gdbus_h *softap_gdbus);
+void softap_gdbus_proxy_reset_timeout(softap_gdbus_h *softap_gdbus);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __SOFTAP_GDBUS_H__ */
index e8d33fca1488c9d52b79c2646c54a4118a7d251a..075ae7de40e82cbdc1b970491043d6f276a333fe 100644 (file)
 #ifndef __SOFTAP_PRIVATE_H__
 #define __SOFTAP_PRIVATE_H__
 
-#define LOG_TAG        "CAPI_NETWORK_SOFTAP"
-
-#include <glib.h>
-#include <dlog.h>
-#include <gio/gio.h>
 #include "softap.h"
+#include "softap_gdbus.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -36,44 +32,6 @@ extern "C" {
 #define DEPRECATED_API __attribute__ ((deprecated))
 #endif
 
-#define DBG(fmt, args...)      LOGD(fmt, ##args)
-#define WARN(fmt, args...)     LOGW(fmt, ##args)
-#define ERR(fmt, args...)      LOGE(fmt, ##args)
-#define SDBG(fmt, args...)     SECURE_LOGD(fmt, ##args)
-#define SERR(fmt, args...)     SECURE_LOGE(fmt, ##args)
-
-#define _warn_if(expr, fmt, arg...) do { \
-               if (expr) { \
-                       WARN(fmt, ##arg); \
-               } \
-       } while (0)
-
-#define _ret_if(expr) do { \
-               if (expr) { \
-                       return; \
-               } \
-       } while (0)
-
-#define _retv_if(expr, val) do { \
-               if (expr) { \
-                       return (val); \
-               } \
-       } while (0)
-
-#define _retm_if(expr, fmt, arg...) do { \
-               if (expr) { \
-                       ERR(fmt, ##arg); \
-                       return; \
-               } \
-       } while (0)
-
-#define _retvm_if(expr, val, fmt, arg...) do { \
-               if (expr) { \
-                       ERR(fmt, ##arg); \
-                       return (val); \
-               } \
-       } while (0)
-
 typedef enum {
        SUPPORTED_FEATURE_SOFTAP = 0,
        SUPPORTED_FEATURE_SOFTAP_ACS,
@@ -156,36 +114,7 @@ typedef enum {
        MOBILE_AP_GET_DATA_PACKET_USAGE_CFM
 } mobile_ap_event_e;
 
-typedef enum {
-       E_SIGNAL_SOFTAP_ON,
-       E_SIGNAL_SOFTAP_OFF,
-       E_SIGNAL_LOW_BATTERY_MODE,
-       E_SIGNAL_FLIGHT_MODE,
-       E_SIGNAL_SECURITY_TYPE_CHANGED,
-       E_SIGNAL_SSID_VISIBILITY_CHANGED,
-       E_SIGNAL_PASSPHRASE_CHANGED,
-       E_SIGNAL_DHCP_STATUS,
-       E_SIGNAL_MAX
-} mobile_ap_sig_e;
-
-#define SOFTAP_SERVICE_OBJECT_PATH     "/MobileapAgent"
-#define SOFTAP_SERVICE_NAME            "org.tizen.MobileapAgent"
-#define SOFTAP_SERVICE_INTERFACE       "org.tizen.softap"
-
 #define SOFTAP_SIGNAL_MATCH_RULE       "type='signal',interface='org.tizen.softap'"
-#define SOFTAP_SIGNAL_NAME_LEN 64
-
-#define SIGNAL_NAME_STA_CONNECT                "sta_connected"
-#define SIGNAL_NAME_STA_DISCONNECT     "sta_disconnected"
-#define SIGNAL_NAME_SOFTAP_ON          "soft_ap_on"
-#define SIGNAL_NAME_SOFTAP_OFF         "soft_ap_off"
-#define SIGNAL_NAME_NO_DATA_TIMEOUT    "no_data_timeout"
-#define SIGNAL_NAME_LOW_BATTERY_MODE   "low_batt_mode"
-#define SIGNAL_NAME_FLIGHT_MODE                "flight_mode"
-#define SIGNAL_NAME_SECURITY_TYPE_CHANGED      "security_type_changed"
-#define SIGNAL_NAME_SSID_VISIBILITY_CHANGED    "ssid_visibility_changed"
-#define SIGNAL_NAME_PASSPHRASE_CHANGED         "passphrase_changed"
-#define SIGNAL_NAME_DHCP_STATUS                "dhcp_status"
 
 #define SIGNAL_MSG_NOT_AVAIL_INTERFACE "Interface is not available"
 #define SIGNAL_MSG_TIMEOUT             "There is no connection for a while"
@@ -224,21 +153,8 @@ typedef enum {
 #define SECURITY_TYPE_LEN      32
 #define PSK_ITERATION_COUNT    4096
 
-typedef void(*__handle_cb_t)(GDBusConnection *connection, const gchar *sender_name,
-               const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
-               GVariant *parameters, gpointer user_data);
-
-typedef struct {
-       guint sig_id;
-       char name[SOFTAP_SIGNAL_NAME_LEN];
-       __handle_cb_t cb;
-} __softap_sig_t;
-
 typedef struct {
-       /* GDBus */
-       GDBusConnection *client_bus;
-       GDBusProxy *client_bus_proxy;
-       GCancellable *cancellable;
+       softap_gdbus_h *gdbus_handle;
 
        /* Callbacks*/
        softap_enabled_cb enabled_cb;
@@ -279,6 +195,7 @@ int _softap_check_permission(void);
 void _softap_add_handle(softap_h handle);
 void _softap_remove_handle(softap_h handle);
 bool _softap_check_handle(softap_h handle);
+int _softap_convert_to_error(softap_gdbus_error_e gdbus_error);
 #ifdef __cplusplus
 }
 #endif
index 9a5fa895fd43269c3d1c3c1018cd367aa7233e9e..95a60558cc4e3731a538b450260f354109780621 100644 (file)
@@ -1,6 +1,6 @@
 Name:          capi-network-softap
 Summary:       Softap Framework
-Version:       0.1.2
+Version:       0.1.3
 Release:       1
 Group:         System/Network
 License:       Apache-2.0
index bb7b12655316a928a96e86441490bda41a3600aa..8895d8642f4171a9b03b277e41dcaa25daeb1e30 100755 (executable)
@@ -28,6 +28,8 @@
 #include <vconf.h>
 
 #include "softap_private.h"
+#include "softap_gdbus.h"
+#include "softap_dlog.h"
 
 static void __handle_softap_on(GDBusConnection *connection, const gchar *sender_name,
                        const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
@@ -61,7 +63,7 @@ static void __handle_dhcp(GDBusConnection *connection, const gchar *sender_name,
                const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
                GVariant *parameters, gpointer user_data);
 
-static __softap_sig_t sigs[] = {
+static softap_sig_t sigs[] = {
        {0, SIGNAL_NAME_SOFTAP_ON, __handle_softap_on},
        {0, SIGNAL_NAME_SOFTAP_OFF, __handle_softap_off},
        {0, SIGNAL_NAME_LOW_BATTERY_MODE, __handle_low_battery_mode},
@@ -497,9 +499,6 @@ static void __enabled_cfm_cb(GObject *source_object, GAsyncResult *res,
        }
 
        __softap_h *sa = (__softap_h *)user_data;
-       GError *g_error = NULL;
-       GVariant *g_var;
-       guint info;
        softap_error_e error;
        softap_enabled_cb ecb = sa->enabled_cb;
        void *data = sa->enabled_user_data;
@@ -510,37 +509,33 @@ static void __enabled_cfm_cb(GObject *source_object, GAsyncResult *res,
                return;
        }
 
-       g_var = g_dbus_proxy_call_finish(sa->client_bus_proxy, res, &g_error);
-       if (g_error) {
-               ERR("DBus error [%s]", g_error->message);
-               if (g_error->code == G_DBUS_ERROR_NO_REPLY &&
-                               ++retry < SOFTAP_ERROR_RECOVERY_MAX) {
-                       g_error_free(g_error);
-                       softap_enable((softap_h)sa);
-                       SOFTAP_UNLOCK;
-                       DBG("-");
-                       return;
-               }
-
-               if (g_error->code == G_DBUS_ERROR_ACCESS_DENIED)
-                       error = SOFTAP_ERROR_PERMISSION_DENIED;
-               else
-                       error = SOFTAP_ERROR_OPERATION_FAILED;
-               g_error_free(g_error);
-       } else {
+       softap_gdbus_error_e gdbus_error = GDBUS_ERROR_NONE;
+       GVariant *g_var = softap_gdbus_proxy_finish(sa->gdbus_handle,
+               res, &gdbus_error);
+       if (g_var != NULL) {
+               guint info;
                g_variant_get(g_var, "(u)", &info);
                g_variant_unref(g_var);
                error = __get_error(info);
                if (error != SOFTAP_ERROR_NONE)
                        ERR("Fail to enable Soft AP (%d)!!", error);
+       } else {
+               if (gdbus_error == GDBUS_ERROR_NO_REPLY
+                       && ++retry < SOFTAP_ERROR_RECOVERY_MAX) {
+                       softap_enable((softap_h)sa);
+                       SOFTAP_UNLOCK;
+                       DBG("-");
+                       return;
+               }
+               error = gdbus_error == GDBUS_ERROR_ACCESS_DENIED ?
+                       SOFTAP_ERROR_PERMISSION_DENIED : SOFTAP_ERROR_OPERATION_FAILED;
        }
 
        retry = 0;
-
-       sigs[E_SIGNAL_SOFTAP_ON].sig_id = g_dbus_connection_signal_subscribe(sa->client_bus,
-                       NULL, SOFTAP_SERVICE_INTERFACE, sigs[E_SIGNAL_SOFTAP_ON].name,
-                       SOFTAP_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
-                       sigs[E_SIGNAL_SOFTAP_ON].cb, (gpointer)sa, NULL);
+       int sig_id = softap_gdbus_connect_signal(sa->gdbus_handle,
+               sigs[E_SIGNAL_SOFTAP_ON], user_data);
+       if (sig_id >= 0)
+               sigs[E_SIGNAL_SOFTAP_ON].sig_id = sig_id;
 
        if (ecb)
                ecb(error, true, data);
@@ -563,9 +558,6 @@ static void __disabled_cfm_cb(GObject *source_object, GAsyncResult *res,
        }
 
        __softap_h *sa = (__softap_h *)user_data;
-       GError *g_error = NULL;
-       GVariant *g_var;
-       guint info;
        softap_error_e error;
        softap_disabled_cause_e code = SOFTAP_DISABLED_BY_REQUEST;
        softap_disabled_cb dcb = sa->disabled_cb;
@@ -577,14 +569,15 @@ static void __disabled_cfm_cb(GObject *source_object, GAsyncResult *res,
                return;
        }
 
-       g_var = g_dbus_proxy_call_finish(sa->client_bus_proxy, res, &g_error);
-       if (g_error) {
-               ERR("DBus error [%s]", g_error->message);
-               g_error_free(g_error);
+       softap_gdbus_error_e gdbus_error = GDBUS_ERROR_NONE;
+       GVariant *g_var = softap_gdbus_proxy_finish(sa->gdbus_handle,
+               res, &gdbus_error);
+       if (gdbus_error) {
                SOFTAP_UNLOCK;
                DBG("-");
                return;
        } else {
+               guint info;
                g_variant_get(g_var, "(u)", &info);
                g_variant_unref(g_var);
                error = __get_error(info);
@@ -592,10 +585,10 @@ static void __disabled_cfm_cb(GObject *source_object, GAsyncResult *res,
                        ERR("Fail to disable Soft AP (%d)!!", error);
        }
 
-       sigs[E_SIGNAL_SOFTAP_OFF].sig_id = g_dbus_connection_signal_subscribe(sa->client_bus,
-                       NULL, SOFTAP_SERVICE_INTERFACE, sigs[E_SIGNAL_SOFTAP_OFF].name,
-                       SOFTAP_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
-                       sigs[E_SIGNAL_SOFTAP_OFF].cb, (gpointer)sa, NULL);
+       int sig_id = softap_gdbus_connect_signal(sa->gdbus_handle,
+               sigs[E_SIGNAL_SOFTAP_OFF], user_data);
+       if (sig_id >= 0)
+               sigs[E_SIGNAL_SOFTAP_OFF].sig_id = sig_id;
 
        if (dcb)
                dcb(error, code, data);
@@ -605,7 +598,6 @@ static void __disabled_cfm_cb(GObject *source_object, GAsyncResult *res,
        return;
 }
 
-
 static void __settings_reloaded_cb(GObject *source_object, GAsyncResult *res,
                gpointer user_data)
 {
@@ -618,24 +610,17 @@ static void __settings_reloaded_cb(GObject *source_object, GAsyncResult *res,
                return;
        }
 
-       GError *g_error = NULL;
-       GVariant *g_var;
-       guint info;
        __softap_h *sa = (__softap_h *)user_data;
-       softap_error_e softap_error;
-
-       g_var  = g_dbus_proxy_call_finish(sa->client_bus_proxy, res, &g_error);
-       if (g_error) {
-               ERR("DBus fail [%s]\n", g_error->message);
-               if (g_error->code == G_DBUS_ERROR_ACCESS_DENIED)
-                       softap_error = SOFTAP_ERROR_PERMISSION_DENIED;
-               else
-                       softap_error = SOFTAP_ERROR_OPERATION_FAILED;
-               g_error_free(g_error);
-       } else {
+       softap_error_e error;
+       softap_gdbus_error_e gdbus_error = GDBUS_ERROR_NONE;
+       GVariant *g_var = softap_gdbus_proxy_finish(sa->gdbus_handle,
+               res, &gdbus_error);
+       error = _softap_convert_to_error(gdbus_error);
+       if (error == SOFTAP_ERROR_NONE) {
+               guint info;
                g_variant_get(g_var, "(u)", &info);
                g_variant_unref(g_var);
-               softap_error = __get_error(info);
+               error = __get_error(info);
        }
 
        if (sa->settings_reloaded_cb == NULL) {
@@ -644,7 +629,7 @@ static void __settings_reloaded_cb(GObject *source_object, GAsyncResult *res,
                return;
        }
 
-       sa->settings_reloaded_cb(softap_error,
+       sa->settings_reloaded_cb(error,
                        sa->settings_reloaded_user_data);
 
        sa->settings_reloaded_cb = NULL;
@@ -695,40 +680,6 @@ static GVariant *__prepare_softap_settings(softap_h softap)
        return params;
 }
 
-static void __connect_signals(softap_h softap)
-{
-       DBG("+");
-       _retm_if(softap == NULL, "parameter(softap) is NULL");
-
-       __softap_h *sa = (__softap_h *)softap;
-       GDBusConnection *connection = sa->client_bus;
-       int i = 0;
-
-       for (i = E_SIGNAL_SOFTAP_ON; i < E_SIGNAL_MAX; i++) {
-               sigs[i].sig_id = g_dbus_connection_signal_subscribe(connection,
-                               NULL, SOFTAP_SERVICE_INTERFACE, sigs[i].name,
-                               SOFTAP_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
-                               sigs[i].cb, softap, NULL);
-       }
-       DBG("-");
-}
-
-static void __disconnect_signals(softap_h softap)
-{
-       DBG("+");
-
-       _retm_if(softap == NULL, "parameter(softap) is NULL\n");
-
-       __softap_h *sa = (__softap_h *)softap;
-       GDBusConnection *connection = sa->client_bus;
-
-       int i = 0;
-
-       for (i = E_SIGNAL_SOFTAP_ON; i < E_SIGNAL_MAX; i++)
-               g_dbus_connection_signal_unsubscribe(connection, sigs[i].sig_id);
-       DBG("-");
-}
-
 static bool __get_ssid_from_vconf(const char *path, char *ssid, unsigned int size)
 {
        if (path == NULL || ssid == NULL || size == 0)
@@ -752,45 +703,35 @@ static bool __get_ssid_from_vconf(const char *path, char *ssid, unsigned int siz
        return true;
 }
 
-int __handle_dbus_error(GError *error)
-{
-       if (!error)
-               return SOFTAP_ERROR_NONE;
-
-       ERR("g_dbus_proxy_call_sync failed because  %s\n", error->message);
-       return (error->code == G_DBUS_ERROR_ACCESS_DENIED) ?
-               SOFTAP_ERROR_PERMISSION_DENIED : SOFTAP_ERROR_OPERATION_FAILED;
-}
-
 int _softap_enable_dhcp(softap_h softap, char *rangestart, char *rangestop)
 {
-       GVariant *parameters;
-       GError *error = NULL;
-       guint result;
-
        __softap_h *sa = (__softap_h *)softap;
-       GDBusProxy *proxy = sa->client_bus_proxy;
-
-       if (rangestart == NULL && rangestop == NULL)
-               parameters = g_dbus_proxy_call_sync(proxy, "enable_dhcp",
-                       NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
-       else
-               parameters = g_dbus_proxy_call_sync(proxy, "enable_dhcp_with_range",
-                               g_variant_new("(ss)", rangestart, rangestop),
-                               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
+       GVariant *result = NULL;
+       GVariant *parameters = NULL;
+       const char *method = NULL;
+       if (rangestart == NULL && rangestop == NULL) {
+               parameters = NULL;
+               method = "enable_dhcp";
+       } else {
+               parameters = g_variant_new("(ss)", rangestart, rangestop);
+               method = "enable_dhcp_with_range";
+       }
 
-       result = __handle_dbus_error(error);
-       if (result != SOFTAP_ERROR_NONE) {
-               g_error_free(error);
+       softap_gdbus_error_e gdbus_error = GDBUS_ERROR_NONE;
+       result = softap_gdbus_proxy_invoke_method_sync(sa->gdbus_handle,
+               method, parameters, &gdbus_error);
+       int ret = _softap_convert_to_error(gdbus_error);
+       if (ret != SOFTAP_ERROR_NONE) {
                sa->dhcp_enabled = FALSE;
-               return result;
+               return ret;
        }
 
-       g_variant_get(parameters, "(u)", &result);
-       g_variant_unref(parameters);
+       guint info;
+       g_variant_get(result, "(u)", &info);
+       g_variant_unref(result);
 
        sa->dhcp_enabled = TRUE;
-       return SOFTAP_ERROR_NONE;
+       return ret;
 }
 
 API int softap_create(softap_h *softap)
@@ -804,7 +745,6 @@ API int softap_create(softap_h *softap)
                        "parameter(softap) is NULL\n");
 
        __softap_h *sa = NULL;
-       GError *error = NULL;
        char ssid[SOFTAP_SSID_MAX_LEN + 1] = {0, };
 
        sa = (__softap_h *) calloc(1, sizeof(__softap_h));
@@ -836,41 +776,14 @@ API int softap_create(softap_h *softap)
        sa->channel = SOFTAP_DEFAULT_CHANNEL;
        sa->mode = SOFTAP_WIRELESS_MODE_G;
        sa->dhcp_enabled = FALSE;
-
-       /* GDbus Setting */
-#if !GLIB_CHECK_VERSION(2, 36, 0)
-       g_type_init();
-#endif
-       GCancellable *cancellable = g_cancellable_new();
-       sa->client_bus = g_bus_get_sync(DBUS_BUS_SYSTEM, cancellable, &error);
-       if (error) {
-               ERR("Couldn't connect to the System bus[%s]", error->message);
-               g_error_free(error);
-               g_cancellable_cancel(cancellable);
-               g_object_unref(cancellable);
-               g_free(sa->ssid);
-               free(sa);
-               return SOFTAP_ERROR_OPERATION_FAILED;
-       }
-       sa->cancellable = cancellable;
-
-       sa->client_bus_proxy = g_dbus_proxy_new_sync(sa->client_bus, G_DBUS_PROXY_FLAGS_NONE,
-                       NULL, SOFTAP_SERVICE_NAME, SOFTAP_SERVICE_OBJECT_PATH,
-                       SOFTAP_SERVICE_INTERFACE, sa->cancellable, &error);
-       if (!sa->client_bus_proxy) {
-               if (error) {
-                       ERR("Fail to create the proxy object because of %s", error->message);
-                       g_error_free(error);
-               }
-               g_cancellable_cancel(sa->cancellable);
-               g_object_unref(sa->cancellable);
+       sa->gdbus_handle = softap_gdbus_create();
+       if (sa->gdbus_handle == NULL) {
                g_free(sa->ssid);
                free(sa);
                return SOFTAP_ERROR_OPERATION_FAILED;
        }
 
-        __connect_signals((softap_h)sa);
-
+       softap_gdbus_connect_signals(sa->gdbus_handle, sigs, (softap_h)sa);
        *softap = (softap_h) sa;
 
        _softap_add_handle(sa);
@@ -892,14 +805,12 @@ API int softap_destroy(softap_h softap)
        __softap_h *sa = (__softap_h *)softap;
 
        DBG("SoftAP Handle : %p\n", sa);
-       __disconnect_signals(softap);
+       softap_gdbus_disconnect_signals(sa->gdbus_handle, sigs);
 
        if (sa->ssid)
                free(sa->ssid);
 
-       g_object_unref(sa->cancellable);
-       g_object_unref(sa->client_bus_proxy);
-       g_object_unref(sa->client_bus);
+       softap_gdbus_destroy(sa->gdbus_handle);
        memset(sa, 0x00, sizeof(__softap_h));
 
        _softap_remove_handle(sa);
@@ -915,26 +826,21 @@ API int softap_enable(softap_h softap)
 {
        DBG("+");
        CHECK_FEATURE_SUPPORTED(SUPPORTED_FEATURE_SOFTAP);
-        _retvm_if(softap == NULL, SOFTAP_ERROR_INVALID_PARAMETER,
+       _retvm_if(softap == NULL, SOFTAP_ERROR_INVALID_PARAMETER,
                         "parameter(softap) is NULL");
 
-        __softap_h *sa = (__softap_h *) softap;
-        GDBusProxy *proxy = sa->client_bus_proxy;
-        GDBusConnection *connection = sa->client_bus;
-        GVariant *settings = NULL;
-
-        g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_INFINITE);
-
-       settings = __prepare_softap_settings(softap);
+       __softap_h *sa = (__softap_h *) softap;
+       softap_gdbus_proxy_reset_timeout(sa->gdbus_handle);
+       GVariant *settings = __prepare_softap_settings(softap);
        if (!settings) {
                ERR("Fail to initialize softap settings\n");
                return SOFTAP_ERROR_OPERATION_FAILED;
        }
 
-       g_dbus_connection_signal_unsubscribe(connection, sigs[E_SIGNAL_SOFTAP_ON].sig_id);
-       g_dbus_proxy_call(proxy, "enable", settings, G_DBUS_CALL_FLAGS_NONE, -1,
-                       sa->cancellable, (GAsyncReadyCallback) __enabled_cfm_cb, (gpointer)softap);
-       g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_USE_DEFAULT);
+       softap_gdbus_disconnect_signal(sa->gdbus_handle, sigs[E_SIGNAL_SOFTAP_ON].sig_id);
+       softap_gdbus_proxy_invoke_method(sa->gdbus_handle, "enable", settings,
+               (GAsyncReadyCallback) __enabled_cfm_cb, softap);
+       softap_gdbus_proxy_set_timeout(sa->gdbus_handle);
 
        DBG("-");
        return SOFTAP_ERROR_NONE;
@@ -948,14 +854,9 @@ API int softap_disable(softap_h softap)
                        "parameter(softap) is NULL");
 
        __softap_h *sa = (__softap_h *) softap;
-       GDBusProxy *proxy = sa->client_bus_proxy;
-       GDBusConnection *connection = sa->client_bus;
-
-       g_dbus_connection_signal_unsubscribe(connection, sigs[E_SIGNAL_SOFTAP_OFF].sig_id);
-
-       g_dbus_proxy_call(proxy, "disable",
-                       NULL, G_DBUS_CALL_FLAGS_NONE, -1, sa->cancellable,
-                       (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)softap);
+       softap_gdbus_disconnect_signal(sa->gdbus_handle, sigs[E_SIGNAL_SOFTAP_OFF].sig_id);
+       softap_gdbus_proxy_invoke_method(sa->gdbus_handle,
+               "disable", NULL, (GAsyncReadyCallback) __disabled_cfm_cb, softap);
 
        DBG("-");
        return SOFTAP_ERROR_NONE;
@@ -970,28 +871,18 @@ API int softap_reload_settings(softap_h softap, softap_settings_reloaded_cb call
                        "parameter(callback) is NULL\n");
 
        __softap_h *sa = (__softap_h *)softap;
-       GDBusProxy *proxy = sa->client_bus_proxy;
-       GVariant *settings = NULL;
-
-       DBG("+");
+       _retvm_if(sa->settings_reloaded_cb, SOFTAP_ERROR_OPERATION_FAILED,
+                       "Operation in progress\n");
 
-       if (sa->settings_reloaded_cb) {
-               ERR("Operation in progress\n");
-               return SOFTAP_ERROR_OPERATION_FAILED;
-       }
-
-       settings = __prepare_softap_settings(softap);
-       if (!settings) {
-               ERR("softap settings initialization failed\n");
-               return SOFTAP_ERROR_OPERATION_FAILED;
-       }
+       GVariant *settings = __prepare_softap_settings(softap);
+       _retvm_if(settings == NULL, SOFTAP_ERROR_OPERATION_FAILED,
+                       "softap settings initialization failed\n");
 
        sa->settings_reloaded_cb = callback;
        sa->settings_reloaded_user_data = user_data;
 
-       g_dbus_proxy_call(proxy, "reload_settings", settings,
-                       G_DBUS_CALL_FLAGS_NONE, -1, sa->cancellable,
-                       (GAsyncReadyCallback) __settings_reloaded_cb, (gpointer)softap);
+       softap_gdbus_proxy_invoke_method(sa->gdbus_handle,
+               "reload_settings", settings, (GAsyncReadyCallback) __settings_reloaded_cb, (gpointer)softap);
 
        return SOFTAP_ERROR_NONE;
 }
@@ -1245,25 +1136,16 @@ API int softap_foreach_connected_clients(softap_h softap, softap_connected_clien
        gchar *mac = NULL;
        gchar *hostname = NULL;
        guint timestamp = 0;
-       GError *error = NULL;
-       GVariant *result = NULL;
        GVariantIter *outer_iter = NULL;
        GVariantIter *inner_iter = NULL;
        GVariant *station = NULL;
        GVariant *value = NULL;
        gchar *key = NULL;
        int interface = 0;
-       int ret = 0;
-
-       result = g_dbus_proxy_call_sync(sa->client_bus_proxy, "get_station_info",
-                       NULL, G_DBUS_CALL_FLAGS_NONE,
-                       -1, sa->cancellable, &error);
 
-       ret = __handle_dbus_error(error);
-       if (ret != SOFTAP_ERROR_NONE) {
-               g_error_free(error);
-               return ret;
-       }
+       softap_gdbus_error_e gdbus_error = GDBUS_ERROR_NONE;
+       GVariant *result = softap_gdbus_proxy_invoke_method_sync(sa->gdbus_handle,
+               "get_station_info", NULL, &gdbus_error);
 
        g_variant_get(result, "(a(a{sv}))", &outer_iter);
 
@@ -1716,28 +1598,16 @@ API int softap_get_passphrase(softap_h softap, char **passphrase)
                        "parameter(passphrase) is NULL\n");
 
        __softap_h *sa = (__softap_h *)softap;
-       GDBusProxy *proxy = sa->client_bus_proxy;
-       GVariant *parameters = NULL;
-       GError *error = NULL;
-       int ret = SOFTAP_ERROR_NONE;
-
-       parameters = g_dbus_proxy_call_sync(proxy, "get_passphrase",
-                       NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
-
-       ret = __handle_dbus_error(error);
-       if (ret != SOFTAP_ERROR_NONE) {
-               g_error_free(error);
+       softap_gdbus_error_e gdbus_error = GDBUS_ERROR_NONE;
+       GVariant *parameters = softap_gdbus_proxy_invoke_method_sync(sa->gdbus_handle,
+               "get_passphrase", NULL, &gdbus_error);
+       int ret = _softap_convert_to_error(gdbus_error);
+       if (ret != SOFTAP_ERROR_NONE)
                return ret;
-       }
-
-       if (parameters != NULL) {
-               g_variant_get(parameters, "(su)", passphrase, &ret);
-               g_variant_unref(parameters);
-       }
-
-       DBG("-");
 
-       return ret;
+       g_variant_get(parameters, "(su)", passphrase, &ret);
+       g_variant_unref(parameters);
+       return __get_error(ret);
 }
 
 API int softap_push_wps_button(softap_h softap)
@@ -1747,31 +1617,20 @@ API int softap_push_wps_button(softap_h softap)
                        "parameter(softap) is NULL");
 
        DBG("+");
-
        __softap_h *sa = (__softap_h *)softap;
-       GDBusProxy *proxy = sa->client_bus_proxy;
-       GVariant *parameters = NULL;
-       guint info;
-       GError *error = NULL;
-       int ret = SOFTAP_ERROR_NONE;
-
-       parameters = g_dbus_proxy_call_sync(proxy, "push_wps_button",
-                       NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
-
-       ret = __handle_dbus_error(error);
-       if (ret != SOFTAP_ERROR_NONE) {
-               g_error_free(error);
+       softap_gdbus_error_e gdbus_error = GDBUS_ERROR_NONE;
+       GVariant *parameters = softap_gdbus_proxy_invoke_method_sync(sa->gdbus_handle,
+               "push_wps_button", NULL, &gdbus_error);
+       int ret = _softap_convert_to_error(gdbus_error);
+       if (ret != SOFTAP_ERROR_NONE)
                return ret;
-       }
 
        if (parameters != NULL) {
+               guint info;
                g_variant_get(parameters, "(u)", &info);
                g_variant_unref(parameters);
-               ret = __get_error(info);
+               return __get_error(info);
        }
-
-       DBG("-");
-
        return ret;
 }
 
@@ -1786,29 +1645,19 @@ API int softap_set_wps_pin(softap_h softap, const char *wps_pin)
        DBG("+");
 
        __softap_h *sa = (__softap_h *)softap;
-       GDBusProxy *proxy = sa->client_bus_proxy;
-       GVariant *parameters = NULL;
-       guint info;
-       GError *error = NULL;
-       int ret = SOFTAP_ERROR_NONE;
-
-       parameters = g_dbus_proxy_call_sync(proxy, "set_wps_pin",
-                       g_variant_new("(s)", wps_pin), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
-
-       ret = __handle_dbus_error(error);
-       if (ret != SOFTAP_ERROR_NONE) {
-               g_error_free(error);
+       softap_gdbus_error_e gdbus_error = GDBUS_ERROR_NONE;
+       GVariant *parameters = softap_gdbus_proxy_invoke_method_sync(sa->gdbus_handle,
+               "set_wps_pin", g_variant_new("(s)", wps_pin), &gdbus_error);
+       int ret = _softap_convert_to_error(gdbus_error);
+       if (ret != SOFTAP_ERROR_NONE)
                return ret;
-       }
 
        if (parameters != NULL) {
+               guint info;
                g_variant_get(parameters, "(u)", &info);
                g_variant_unref(parameters);
-               ret = __get_error(info);
+               return __get_error(info);
        }
-
-       DBG("-");
-
        return ret;
 }
 
@@ -1884,7 +1733,6 @@ API int softap_set_channel(softap_h softap, int channel)
        return SOFTAP_ERROR_NONE;
 }
 
-
 API int softap_get_channel(softap_h softap, int *channel)
 {
        CHECK_FEATURE_SUPPORTED(SUPPORTED_FEATURE_SOFTAP);
@@ -1910,7 +1758,6 @@ API int softap_set_mode(softap_h softap, softap_wireless_mode_e mode)
 
        __softap_h *sa = (__softap_h *)softap;
        sa->mode = mode;
-
        return SOFTAP_ERROR_NONE;
 }
 
@@ -1925,10 +1772,8 @@ API int softap_get_mode(softap_h softap, softap_wireless_mode_e *mode)
        _retvm_if(mode == NULL, SOFTAP_ERROR_INVALID_PARAMETER,
                        "parameter(mode) is NULL\n");
 
-
        __softap_h *sa = (__softap_h *)softap;
        *mode = sa->mode;
-
        return __get_mode(mode);
 }
 
@@ -1947,23 +1792,15 @@ API int softap_disable_dhcp(softap_h softap)
                        "parameter(softap) is NULL\n");
 
        __softap_h *sa = (__softap_h *)softap;
-       GError *error = NULL;
-       GVariant *parameters = NULL;
-       GDBusProxy *proxy = sa->client_bus_proxy;
-       guint ret;
-
-       parameters = g_dbus_proxy_call_sync(proxy, "disable_dhcp",
-                       NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
-
-       ret = __handle_dbus_error(error);
-       if (ret != SOFTAP_ERROR_NONE) {
-               g_error_free(error);
+       softap_gdbus_error_e gdbus_error = GDBUS_ERROR_NONE;
+       GVariant *parameters = softap_gdbus_proxy_invoke_method_sync(sa->gdbus_handle,
+               "disable_dhcp", NULL, &gdbus_error);
+       int ret = _softap_convert_to_error(gdbus_error);
+       if (ret != SOFTAP_ERROR_NONE)
                return ret;
-       }
 
        g_variant_get(parameters, "(u)", &ret);
        g_variant_unref(parameters);
-
        sa->dhcp_enabled = FALSE;
 
        return SOFTAP_ERROR_NONE;
@@ -1978,20 +1815,13 @@ API int softap_is_dhcp_enabled(softap_h softap, bool *dhcp_enabled)
                        "parameter(dhcp_enabled) is NULL\n");
 
        __softap_h *sa = (__softap_h *)softap;
-       GError *error = NULL;
-       GVariant *parameters = NULL;
-       GDBusProxy *proxy = sa->client_bus_proxy;
-       int ret = SOFTAP_ERROR_NONE;
        gboolean enabled = FALSE;
+       softap_gdbus_error_e gdbus_error = GDBUS_ERROR_NONE;
+       GVariant *parameters = softap_gdbus_proxy_invoke_method_sync(sa->gdbus_handle,
+               "get_dhcp_state", NULL, &gdbus_error);
 
-       parameters = g_dbus_proxy_call_sync(proxy, "get_dhcp_state",
-                       NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
-
-       ret = __handle_dbus_error(error);
-       if (ret != SOFTAP_ERROR_NONE)
-               g_error_free(error);
-
-       if (parameters != NULL) {
+       int ret = _softap_convert_to_error(gdbus_error);
+       if (ret == SOFTAP_ERROR_NONE) {
                g_variant_get(parameters, "(b)", &enabled);
                g_variant_unref(parameters);
        }
index c0acb78868a85e11541291500b19e5cf7514dabe..900257122788f1584cc936ff9bb8f1a13de074b3 100755 (executable)
@@ -16,6 +16,8 @@
 
 #include <stdlib.h>
 #include <string.h>
+
+#include "softap_dlog.h"
 #include "softap_private.h"
 
 API int softap_client_clone(softap_client_h *dest, softap_client_h origin)
diff --git a/src/softap_gdbus.c b/src/softap_gdbus.c
new file mode 100755 (executable)
index 0000000..36427f9
--- /dev/null
@@ -0,0 +1,221 @@
+/*
+ * Copyright (c) 2023 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <glib.h>
+#include <gio/gio.h>
+#include <dbus/dbus.h>
+#include <stdlib.h>
+
+#include "softap_gdbus.h"
+#include "softap_dlog.h"
+#include "softap_private.h"
+
+#define SOFTAP_SERVICE_OBJECT_PATH     "/MobileapAgent"
+#define SOFTAP_SERVICE_NAME            "org.tizen.MobileapAgent"
+#define SOFTAP_SERVICE_INTERFACE       "org.tizen.softap"
+
+GCancellable *_create_cancellable()
+{
+       return g_cancellable_new();
+}
+
+void _destroy_cancellable(GCancellable *cancellable)
+{
+       _ret_if(cancellable == NULL);
+       g_cancellable_cancel(cancellable);
+       g_object_unref(cancellable);
+}
+
+GDBusConnection *_create_gdbus_connection(GCancellable *cancellable)
+{
+       GError *error = NULL;
+       GDBusConnection *client_bus = g_bus_get_sync(DBUS_BUS_SYSTEM, cancellable, &error);
+       if (error) {
+               ERR("Couldn't connect to the System bus[%s]", error->message);
+               g_error_free(error);
+               return NULL;
+       }
+       return client_bus;
+}
+
+GDBusProxy *_create_gdbus_proxy(GDBusConnection *client_bus, GCancellable *cancellable)
+{
+       GError *error = NULL;
+       GDBusProxy *client_bus_proxy = g_dbus_proxy_new_sync(client_bus,
+                       G_DBUS_PROXY_FLAGS_NONE,
+                       NULL, SOFTAP_SERVICE_NAME, SOFTAP_SERVICE_OBJECT_PATH,
+                       SOFTAP_SERVICE_INTERFACE, cancellable, &error);
+       if (client_bus_proxy == NULL) {
+               if (error) {
+                       ERR("Fail to create the proxy object because of %s", error->message);
+                       g_error_free(error);
+               }
+               return NULL;
+       }
+
+       return client_bus_proxy;
+}
+
+softap_gdbus_h *softap_gdbus_create()
+{
+#if !GLIB_CHECK_VERSION(2, 36, 0)
+       g_type_init();
+#endif
+       softap_gdbus_h *gdbus_handle = (softap_gdbus_h *)calloc(1, sizeof(softap_gdbus_h));
+       _retvm_if(gdbus_handle == NULL, NULL, "Out of memroy");
+
+       gdbus_handle->cancellable = _create_cancellable();
+       gdbus_handle->client_bus = _create_gdbus_connection(gdbus_handle->cancellable);
+       if (gdbus_handle->client_bus == NULL) {
+               softap_gdbus_destroy(gdbus_handle);
+               return NULL;
+       }
+
+       gdbus_handle->client_bus_proxy
+               = _create_gdbus_proxy(gdbus_handle->client_bus, gdbus_handle->cancellable);
+       if (gdbus_handle->client_bus_proxy == NULL) {
+               _destroy_cancellable(gdbus_handle->cancellable);
+               return NULL;
+       }
+
+       return gdbus_handle;
+}
+
+void softap_gdbus_destroy(softap_gdbus_h *softap_gdbus)
+{
+       _retm_if(softap_gdbus == NULL, "softap_gdbus is NULL");
+
+       g_clear_object(&softap_gdbus->cancellable);
+       g_clear_object(&softap_gdbus->client_bus_proxy);
+       g_clear_object(&softap_gdbus->client_bus);
+
+       free(softap_gdbus);
+}
+
+void softap_gdbus_connect_signals(softap_gdbus_h *softap_gdbus, softap_sig_t sigs[], void *user_data)
+{
+       DBG("+");
+       _retm_if(softap_gdbus == NULL, "softap_gdbus is NULL");
+
+       for (int i = E_SIGNAL_SOFTAP_ON; i < E_SIGNAL_MAX; i++) {
+               sigs[i].sig_id = g_dbus_connection_signal_subscribe(softap_gdbus->client_bus,
+                               NULL, SOFTAP_SERVICE_INTERFACE, sigs[i].name,
+                               SOFTAP_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
+                               sigs[i].cb, user_data, NULL);
+       }
+       DBG("-");
+}
+
+void softap_gdbus_disconnect_signals(softap_gdbus_h *softap_gdbus, softap_sig_t sigs[])
+{
+       DBG("+");
+       _retm_if(softap_gdbus == NULL, "softap_gdbus is NULL\n");
+
+       for (int i = E_SIGNAL_SOFTAP_ON; i < E_SIGNAL_MAX; i++)
+               g_dbus_connection_signal_unsubscribe(softap_gdbus->client_bus, sigs[i].sig_id);
+       DBG("-");
+}
+
+int softap_gdbus_connect_signal(softap_gdbus_h *softap_gdbus,
+       softap_sig_t signal, void *user_data)
+{
+       _retvm_if(softap_gdbus == NULL, -1, "softap_gdbus is NULL\n");
+       return g_dbus_connection_signal_subscribe(softap_gdbus->client_bus,
+                               NULL, SOFTAP_SERVICE_INTERFACE, signal.name,
+                               SOFTAP_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
+                               signal.cb, user_data, NULL);
+}
+
+void softap_gdbus_disconnect_signal(softap_gdbus_h *softap_gdbus, int sig_id)
+{
+       g_dbus_connection_signal_unsubscribe(softap_gdbus->client_bus, sig_id);
+}
+
+void softap_gdbus_proxy_invoke_method(softap_gdbus_h *softap_gdbus,
+               const char *method, GVariant *parameters,
+               GAsyncReadyCallback callback, void *user_data)
+{
+       _retm_if(softap_gdbus == NULL, "softap_gdbus is NULL");
+       _retm_if(method == NULL, "method is NULL");
+
+       g_dbus_proxy_call(softap_gdbus->client_bus_proxy,
+               method, parameters, G_DBUS_CALL_FLAGS_NONE, -1,
+               softap_gdbus->cancellable, callback, (gpointer)user_data);
+}
+
+static softap_gdbus_error_e _convert_gdbus_error(GDBusError error)
+{
+       switch (error) {
+       case G_DBUS_ERROR_NO_REPLY:
+               return GDBUS_ERROR_NO_REPLY;
+       case G_DBUS_ERROR_ACCESS_DENIED:
+               return GDBUS_ERROR_ACCESS_DENIED;
+       default:
+               return GDBUS_ERROR_UNKNOWN;
+       }
+}
+
+GVariant *softap_gdbus_proxy_invoke_method_sync(softap_gdbus_h *softap_gdbus,
+               const char *method, GVariant *parameters, softap_gdbus_error_e *gdbus_error)
+{
+       _retvm_if(softap_gdbus == NULL, NULL, "softap_gdbus is NULL");
+       _retvm_if(method == NULL, NULL, "method is NULL");
+       _retvm_if(gdbus_error == NULL, NULL, "is_denied is NULL");
+
+       GError *error = NULL;
+       GVariant *result = g_dbus_proxy_call_sync(softap_gdbus->client_bus_proxy,
+               method, parameters, G_DBUS_CALL_FLAGS_NONE, -1,
+               softap_gdbus->cancellable, &error);
+
+       if (error) {
+               ERR("DBus error [%s]", error->message);
+               *gdbus_error = _convert_gdbus_error(error->code);
+               g_error_free(error);
+       }
+       return result;
+}
+
+GVariant *softap_gdbus_proxy_finish(softap_gdbus_h *softap_gdbus,
+       GAsyncResult *async_result, softap_gdbus_error_e *gdbus_error)
+{
+       _retvm_if(softap_gdbus == NULL, NULL, "softap_gdbus is NULL");
+       _retvm_if(gdbus_error == NULL, NULL, "gdbus_error is NULL");
+
+       GError *error = NULL;
+       GVariant *result = g_dbus_proxy_call_finish(softap_gdbus->client_bus_proxy,
+               async_result, &error);
+
+       if (error) {
+               ERR("DBus error [%s]", error->message);
+               *gdbus_error = _convert_gdbus_error(error->code);
+               g_error_free(error);
+       }
+       return result;
+}
+
+void softap_gdbus_proxy_set_timeout(softap_gdbus_h *softap_gdbus)
+{
+       _retm_if(softap_gdbus == NULL, "softap_gdbus is NULL");
+       g_dbus_proxy_set_default_timeout(softap_gdbus->client_bus_proxy,
+               DBUS_TIMEOUT_USE_DEFAULT);
+}
+
+void softap_gdbus_proxy_reset_timeout(softap_gdbus_h *softap_gdbus)
+{
+       _retm_if(softap_gdbus == NULL, "softap_gdbus is NULL");
+       g_dbus_proxy_set_default_timeout(softap_gdbus->client_bus_proxy,
+               DBUS_TIMEOUT_INFINITE);
+}
index f92131066acb48c6d27b4c7e11058c6c2de501e7..8503e498f3b074e8b5e51617280f3a0eda228422 100755 (executable)
@@ -23,6 +23,7 @@
 #include <system_info.h>
 #include <cynara-client.h>
 
+#include "softap_dlog.h"
 #include "softap_private.h"
 
 #define SOFTAP_PRIVILEGE "http://tizen.org/privilege/softap"
@@ -175,3 +176,17 @@ bool _softap_check_handle(softap_h handle)
        SOFTAP_UNLOCK;
        return false;
 }
+
+int _softap_convert_to_error(softap_gdbus_error_e gdbus_error)
+{
+       switch (gdbus_error) {
+       case GDBUS_ERROR_NONE:
+               return SOFTAP_ERROR_NONE;
+       case GDBUS_ERROR_ACCESS_DENIED:
+               return SOFTAP_ERROR_PERMISSION_DENIED;
+       case GDBUS_ERROR_NO_REPLY:
+       case GDBUS_ERROR_UNKNOWN:
+       default:
+               return SOFTAP_ERROR_OPERATION_FAILED;
+       }
+}
\ No newline at end of file