Change 'enable' method to async operation
authorJiwan Kim <ji-wan.kim@samsung.com>
Tue, 14 Feb 2017 08:33:25 +0000 (17:33 +0900)
committersaerome.kim <saerome.kim@samsung.com>
Thu, 11 May 2017 09:10:26 +0000 (18:10 +0900)
- 'enable' method is used to execute zigbee daemon on demand.
- Its synchronous operation may cause unexpected gvariant crash,
  change this function to act asynchronously.

Change-Id: I3bd9ce51eb4c0642e7b201d58dca46416529846e
Signed-off-by: Jiwan Kim <ji-wan.kim@samsung.com>
packaging/org.tizen.zigbee.service [new file with mode: 0644]
packaging/zigbee-manager.spec
zigbee-daemon/CMakeLists.txt
zigbee-daemon/resources/zigbee-daemon.service
zigbee-daemon/zigbee-interface/introspection/manager.xml
zigbee-daemon/zigbee-interface/introspection/service.xml
zigbee-daemon/zigbee-interface/src/zigbee_service_dbus_interface.c
zigbee-daemon/zigbee-interface/src/zigbee_service_dbus_interface_service.c
zigbee-daemon/zigbee-lib/include/zblib_driver_service.h
zigbee-daemon/zigbee-lib/src/drivers/zblib_driver_service.c
zigbee-daemon/zigbee-lib/src/zblib_request.c

diff --git a/packaging/org.tizen.zigbee.service b/packaging/org.tizen.zigbee.service
new file mode 100644 (file)
index 0000000..7471288
--- /dev/null
@@ -0,0 +1,6 @@
+[D-BUS Service]
+Name=org.tizen.zigbee
+
+Exec=/bin/false
+User=system
+SystemdService=zigbee-daemon.service
index 3f04f55..2082223 100644 (file)
@@ -9,6 +9,7 @@ License:        Apache-2.0
 Summary:        ZigBee Daemon
 Group:          System/Network
 Source0:        %{name}-%{version}.tar.gz
+Source1:        org.tizen.zigbee.service
 BuildRequires:  cmake
 BuildRequires:  pkgconfig(dlog)
 BuildRequires:  pkgconfig(gio-2.0)
@@ -39,6 +40,9 @@ ZigBee library (devel)
 %prep
 %setup -q
 
+chmod 644 %{SOURCE1}
+cp -a %{SOURCE1} .
+
 %build
 cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DVERSION=%{version} \
 
@@ -48,9 +52,11 @@ make %{?_smp_mflags}
 
 %make_install
 
-# For debug, do not execute zigbee daemon automatically.
-#mkdir -p %{buildroot}%{_libdir}/systemd/system/multi-user.target.wants
-#ln -s %{_libdir}/systemd/system/zigbee-daemon.service %{buildroot}%{_libdir}/systemd/system/multi-user.target.wants/zigbee-daemon.service
+mkdir -p %{buildroot}%{_libdir}/systemd/system/multi-user.target.wants
+ln -s %{_libdir}/systemd/system/zigbee-daemon.service %{buildroot}%{_libdir}/systemd/system/multi-user.target.wants/zigbee-daemon.service
+
+mkdir -p %{buildroot}%{_datadir}/dbus-1/system-services/
+cp org.tizen.zigbee.service %{buildroot}%{_datadir}/dbus-1/system-services/org.tizen.zigbee.service
 
 %post -p /sbin/ldconfig
 
@@ -60,13 +66,12 @@ make %{?_smp_mflags}
 %manifest zigbee-daemon.manifest
 %defattr(644,system,system,-)
 %attr(755,system,system) %{_bindir}/zigbee-daemon
-# For debug, do not execute zigbee daemon automatically.
-#%{_libdir}/systemd/system/zigbee-daemon.service
-#%{_libdir}/systemd/system/multi-user.target.wants/zigbee-daemon.service
+%{_libdir}/systemd/system/zigbee-daemon.service
+%{_libdir}/systemd/system/multi-user.target.wants/zigbee-daemon.service
 %{_datadir}/license/zigbee-daemon
+%attr(644,root,root) %{_datadir}/dbus-1/system-services/*
 
 %files -n zigbee-lib
-#%manifest lib-zigbee/lib-zigbee.manifest
 %defattr(644,system,system,-)
 %{_libdir}/libzigbee-lib.so*
 %{_datadir}/license/zigbee-lib
index 9f2d703..4ac2665 100644 (file)
@@ -104,5 +104,4 @@ TARGET_LINK_LIBRARIES(${PROJECT_NAME} zigbee-service zigbee-interface ${pkgs_LDF
 INSTALL(TARGETS zigbee-lib DESTINATION lib COMPONENT Runtime)
 INSTALL(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin)
 INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE DESTINATION /usr/share/license RENAME zigbee-daemon)
-# For debug, do not execute zigbee daemon automatically.
-#INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/resources/zigbee-daemon.service DESTINATION /usr/lib/systemd/system)
+INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/resources/zigbee-daemon.service DESTINATION /usr/lib/systemd/system)
index 8e79fe2..242225d 100644 (file)
@@ -1,12 +1,16 @@
 [Unit]
 Description=ZigBee daemon
+Requires=dbus.socket
+After=dbus.socket
 
 [Service]
+Type=dbus
+BusName=org.tizen.zigbee
 User=system
 Group=system
 SmackProcessLabel=System
 ExecStart=/usr/bin/zigbee-daemon
-Restart=always
+Restart=on-failure
 RestartSec=0
 KillMode=none
 
index 30f16a1..520977a 100644 (file)
@@ -4,6 +4,11 @@
                        <arg type='i' name='result' direction='out'/>
                        <arg type='b' name='zigbee_state' direction='out'/>
                </method>
+               <method name='enable'>
+               </method>
+               <method name='disable'>
+                       <arg type='i' name='result' direction='out'/>
+               </method>
 
                <signal name='zigbee_state'>
                        <arg type='b' name='state'/>
index a5d79cf..d4c9752 100644 (file)
@@ -1,12 +1,5 @@
 <node>
        <interface name='org.tizen.zigbee.service'>
-               <method name='enable'>
-                       <arg type='i' name='result' direction='out'/>
-                       <arg type='b' name='enabled' direction='out'/>
-               </method>
-               <method name='disable'>
-                       <arg type='i' name='result' direction='out'/>
-               </method>
                <method name='zb_hw_reset'>
                        <arg type='i' name='result' direction='out'/>
                </method>
index b49633f..b7a6016 100644 (file)
 /**< ZigBee D-BUS service interface name */
 #define ZIGBEE_DBUS_SERVICE_INTERFACE_NAME "zigbee-dbus"
 
-static gboolean zigbee_on_manager_get_zigbee_state(ZigbeeManager *zigbee_mgr,
+static gboolean on_manager_enable(ZigbeeManager *zigbee_mgr,
+       GDBusMethodInvocation *invocation,
+       gpointer user_data)
+{
+       ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
+       ZigbeeCustomData_t *custom_data = zblib_service_interface_ref_user_data(service_interface);
+
+       if (NULL == custom_data) {
+               ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
+
+               return TRUE;
+       }
+
+       zigbee_manager_complete_enable(zigbee_mgr, invocation);
+
+       if (TRUE == custom_data->sevice_interface_init_complete) {
+               /* Emit zigbee_state - enabled */
+               zigbee_manager_emit_zigbee_state(zigbee_mgr, TRUE);
+       }
+
+       return TRUE;
+}
+
+static gboolean on_manager_disable(ZigbeeManager *zigbee_mgr,
+       GDBusMethodInvocation *invocation,
+       gpointer user_data)
+{
+       NOT_USED(user_data);
+
+       zigbee_manager_complete_disable(zigbee_mgr, invocation, TRUE);
+
+       return TRUE;
+}
+
+static gboolean on_manager_get_zigbee_state(ZigbeeManager *zigbee_mgr,
        GDBusMethodInvocation *invocation, gpointer user_data)
 {
+       ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
+       ZigbeeCustomData_t *custom_data = zblib_service_interface_ref_user_data(service_interface);
+
        Z_LOGI("Entered");
 
-       NOT_USED(zigbee_mgr);
-       NOT_USED(invocation);
-       NOT_USED(user_data);
+       if (NULL == custom_data) {
+               ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
 
-       /*
-        * TODO -
-        * Create and send request for processing
-        */
+               return TRUE;
+       }
+
+       zigbee_manager_complete_get_zigbee_state(zigbee_mgr, invocation,
+                       0, custom_data->sevice_interface_init_complete);
 
        return TRUE;
 }
@@ -288,7 +325,8 @@ static void zigbee_on_name_acquired(GDBusConnection *connection,
        custom_data->name_acquired = TRUE;
 
        if (TRUE == custom_data->sevice_interface_init_complete) {
-               /* TODO - Emit zigbee_state signal */
+               /* Emit zigbee_state - enabled */
+               zigbee_manager_emit_zigbee_state(custom_data->zigbee_mgr, TRUE);
        }
 }
 
@@ -330,8 +368,18 @@ static void zigbee_on_bus_acquired(GDBusConnection *connection,
         */
        g_signal_connect(custom_data->zigbee_mgr,
                        "handle-get-zigbee-state",
-                       G_CALLBACK(zigbee_on_manager_get_zigbee_state),
-                       custom_data);
+                       G_CALLBACK(on_manager_get_zigbee_state),
+                       service_interface);
+
+       g_signal_connect(custom_data->zigbee_mgr,
+                       "handle-enable",
+                       G_CALLBACK(on_manager_enable),
+                       service_interface);
+
+       g_signal_connect(custom_data->zigbee_mgr,
+                       "handle-disable",
+                       G_CALLBACK(on_manager_disable),
+                       service_interface);
 
        /*
         * Export 'manager' interface on ZigBee D-BUS
@@ -377,7 +425,7 @@ static void zigbee_on_bus_acquired(GDBusConnection *connection,
        g_dbus_object_manager_server_export(custom_data->manager,
                G_DBUS_OBJECT_SKELETON(zigbee_object));
 
-       /* Servcie interface initialization completed */
+       /* Service interface initialization completed */
        custom_data->sevice_interface_init_complete = TRUE;
 
        if (TRUE == custom_data->name_acquired) {
index 544cd83..108a923 100644 (file)
@@ -43,154 +43,6 @@ static void *_service_interface_ref_zigbee_service(ZigBeeServiceInterface *servi
        return service;
 }
 
-static void on_service_enable_resp(ZigBeeServiceInterface *service_interface,
-       guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
-{
-       ZigbeeServiceInterfaceRespCbData_t *cb_data =
-               (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
-
-       ZigbeeService *service_object;
-       GDBusMethodInvocation *invocation;
-       ZigbeeServiceServiceStateResp_t *payload =
-               (ZigbeeServiceServiceStateResp_t*)resp_data;
-
-       NOT_USED(service_interface);
-       NOT_USED(request_id);
-
-       if (NULL == resp_data || 0 == resp_data_len) {
-               Z_LOGE("resp_data is null");
-               g_free(cb_data);
-               return;
-       }
-
-       service_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
-       zblib_check_null_free_and_ret("service_object", service_object, cb_data);
-
-       invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
-       zblib_check_null_free_and_ret("invocation", invocation, cb_data);
-
-       zigbee_service_complete_enable(service_object, invocation,
-               payload->result, payload->enabled);
-
-       g_free(cb_data);
-}
-
-static gboolean on_service_enable(ZigbeeService *service_object,
-       GDBusMethodInvocation *invocation,
-       gpointer user_data)
-{
-       ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
-       ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
-
-       gboolean ret;
-
-       /* Allocate response callback data */
-       resp_cb_data =
-               zigbee_service_dbus_interface_create_resp_cb_data(service_object,
-                       invocation, NULL, 0);
-       if (NULL == resp_cb_data) {
-               Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
-
-               /* Send failure response */
-               ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
-
-               return TRUE;
-       }
-
-       /* Dispatch request */
-       ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
-               ZBLIB_DRIVER_TYPE_SERVICE,
-               ZBLIB_SERVICE_OPS_ENABLE,
-               NULL, 0,
-               on_service_enable_resp, resp_cb_data);
-       if (FALSE == ret) {
-               Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
-
-               /* Free response callback data */
-               zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
-
-               /* Send failure response */
-               ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
-
-               return TRUE;
-       }
-
-       return TRUE;
-}
-
-static void on_service_disable_resp(ZigBeeServiceInterface *service_interface,
-       guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
-{
-       ZigbeeServiceInterfaceRespCbData_t *cb_data =
-               (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
-
-       ZigbeeService *service_object;
-       GDBusMethodInvocation *invocation;
-       ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t*)resp_data;
-
-       NOT_USED(service_interface);
-       NOT_USED(request_id);
-
-       if (NULL == resp_data || 0 == resp_data_len) {
-               Z_LOGE("resp_data is null");
-               g_free(cb_data);
-               return;
-       }
-
-       service_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
-       zblib_check_null_free_and_ret("service_object", service_object, cb_data);
-
-       invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
-       zblib_check_null_free_and_ret("invocation", invocation, cb_data);
-
-       zigbee_service_complete_disable(service_object, invocation, payload->result);
-
-       g_free(cb_data);
-}
-
-static gboolean on_service_disable(ZigbeeService *service_object,
-       GDBusMethodInvocation *invocation,
-       gpointer user_data)
-{
-       ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
-       ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
-
-       gboolean ret;
-
-       /* Allocate response callback data */
-       resp_cb_data =
-               zigbee_service_dbus_interface_create_resp_cb_data(service_object,
-                       invocation, NULL, 0);
-       if (NULL == resp_cb_data) {
-               Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
-
-               /* Send failure response */
-               ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
-
-               return TRUE;
-       }
-
-       /* Dispatch request */
-       ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
-               ZBLIB_DRIVER_TYPE_SERVICE,
-               ZBLIB_SERVICE_OPS_DISABLE,
-               NULL, 0,
-               on_service_disable_resp, resp_cb_data);
-       if (FALSE == ret) {
-               Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
-
-               /* Free response callback data */
-               zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
-
-               /* Send failure response */
-               ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
-
-               return TRUE;
-       }
-
-       return TRUE;
-}
-
 static void on_service_zb_hw_reset_resp(ZigBeeServiceInterface *service_interface,
        guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
 {
@@ -1477,14 +1329,6 @@ gboolean zigbee_service_dbus_interface_service_init(ZigBeeServiceInterface *serv
         * Register signal handlers for 'service' interface
         */
        g_signal_connect(service_object,
-               "handle-enable",
-               G_CALLBACK(on_service_enable), service_interface);
-
-       g_signal_connect(service_object,
-               "handle-disable",
-               G_CALLBACK(on_service_disable), service_interface);
-
-       g_signal_connect(service_object,
                "handle-zb-hw-reset",
                G_CALLBACK(on_service_zb_hw_reset), service_interface);
 
index d5af5ef..21f31c6 100644 (file)
@@ -21,8 +21,6 @@
 
 /**< ZigBee 'service' driver operations */
 typedef struct {
-       gboolean (*enable)(ZigBeeDriver *driver, guint request_id);
-       gboolean (*disable)(ZigBeeDriver *driver, guint request_id);
        gboolean (*zb_hw_reset)(ZigBeeDriver *driver, guint request_id);
        gboolean (*form_network)(ZigBeeDriver *driver, guint request_id);
        gboolean (*coex_start)(ZigBeeDriver *driver, guint request_id);
@@ -41,9 +39,7 @@ typedef struct {
 
 /**< ZigBee 'service' ops IDs */
 typedef enum {
-       ZBLIB_SERVICE_OPS_ENABLE = 1, /**< Enable */
-       ZBLIB_SERVICE_OPS_DISABLE, /**< Disable */
-       ZBLIB_SERVICE_OPS_ZB_HW_RESET, /**< Zb hw reset */
+       ZBLIB_SERVICE_OPS_ZB_HW_RESET = 1, /**< Zb hw reset */
        ZBLIB_SERVICE_OPS_FORM_NETWORK, /**< Form network */
        ZBLIB_SERVICE_OPS_COEX_START, /**< Coex start */
        ZBLIB_SERVICE_OPS_COEX_STOP, /**< Coex stop */
index f50ba4c..1659dc2 100644 (file)
@@ -56,22 +56,6 @@ static gboolean __zblib_driver_service_dispatcher(ZigBeeDriver *driver, guint re
        /* Fetch ops ID */
        ops_id = zblib_request_get_ops_id(request_type);
        switch (ops_id) {
-       case ZBLIB_SERVICE_OPS_ENABLE: {
-               zblib_check_null_ret_error("ops->enable",
-                       ops->enable, FALSE);
-
-               ret = ops->enable(driver, request_id);
-       }
-       break;
-
-       case ZBLIB_SERVICE_OPS_DISABLE: {
-               zblib_check_null_ret_error("ops->disable",
-                       ops->disable, FALSE);
-
-               ret = ops->disable(driver, request_id);
-       }
-       break;
-
        case ZBLIB_SERVICE_OPS_ZB_HW_RESET: {
                zblib_check_null_ret_error("ops->zb_hw_reset",
                        ops->zb_hw_reset, FALSE);
index 14c05da..b3c314f 100644 (file)
@@ -1137,16 +1137,6 @@ static gpointer __zblib_request_create_service_request_data(guint request_type,
        /* Fetch ops ID */
        ops_id = __zblib_request_get_ops_id(request_type);
        switch (ops_id) {
-       case ZBLIB_SERVICE_OPS_ENABLE: {
-               service_request_data = NULL;
-       }
-       break;
-
-       case ZBLIB_SERVICE_OPS_DISABLE: {
-               service_request_data = NULL;
-       }
-       break;
-
        case ZBLIB_SERVICE_OPS_ZB_HW_RESET: {
                service_request_data = NULL;
        }
@@ -3615,14 +3605,6 @@ static void __zblib_request_free_service_request_data(ZigBeeRequest *request,
        /* Fetch ops ID */
        ops_id = __zblib_request_get_ops_id(request_type);
        switch (ops_id) {
-       case ZBLIB_SERVICE_OPS_ENABLE: {
-       }
-       break;
-
-       case ZBLIB_SERVICE_OPS_DISABLE: {
-       }
-       break;
-
        case ZBLIB_SERVICE_OPS_ZB_HW_RESET: {
        }
        break;