From: saerome.kim Date: Fri, 20 Jul 2018 00:06:58 +0000 (+0900) Subject: Fixed build error X-Git-Tag: submit/tizen/20180720.041524^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=15b2e4773f1d6f3d64f3ecd04ffb620e6c20a9fe;p=platform%2Fcore%2Fapi%2Fzigbee.git Fixed build error - GBS system in TestHub seems not to recognize PATTERN matching in CMakeFiles.txt so, removing filtering PATTERN. Change-Id: I4a7c9786c32e5aebf4a75a8ca424a36fd139b937 Signed-off-by: saerome.kim --- diff --git a/CMakeLists.txt b/CMakeLists.txt index c3e97a5..d7f9185 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,23 +1,125 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6) -PROJECT(capi-network-zigbee C) +SET(fw_name "capi-network-zigbee") -INCLUDE(FindPkgConfig) +PROJECT(${fw_name}) + +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) + +SET(LIB ${LIB_PATH}) +SET(LIBDIR ${PREFIX}/${LIB_PATH}) + +SET(INC_DIR include) +INCLUDE_DIRECTORIES(${INC_DIR}) +INCLUDE_DIRECTORIES(common) -#SET(EXTRA_CFLAGS "-Wall -Werror-implicit-function-declaration -fvisibility=hidden -fsanitize=address") -SET(EXTRA_CFLAGS "-Wall -Werror-implicit-function-declaration -fvisibility=hidden") -SET(CMAKE_C_FLAGS ${CMAKE_CFALGS} ${EXTRA_CFLAGS}) +SET(dependents "dlog capi-system-info glib-2.0 gio-2.0") +SET(pc_dependents "") SET(CAPI_NETWORK_ZIGBEE "capi-network-zigbee") SET(CLIENT ${PROJECT_NAME}) + +# for D-Bus SET(DBUS_INTERFACE "org.tizen.zigbee") SET(DBUS_OBJECT_PATH "/org/tizen/zigbee") +ADD_DEFINITIONS("-DZIGBEE_DBUS_INTERFACE=\"${DBUS_INTERFACE}\"") +ADD_DEFINITIONS("-DZIGBEE_DBUS_OBJPATH=\"${DBUS_OBJECT_PATH}\"") # enable client log ADD_DEFINITIONS("-DZB_ENABLE_CLIENT_LOG") + +# Enable Global Command Response Async. IF(ZB_FEATURE_GLOBAL_RSP_SYNC) -ADD_DEFINITIONS("-DZB_FEATURE_GLOBAL_RSP_SYNC") + ADD_DEFINITIONS("-DZB_FEATURE_GLOBAL_RSP_SYNC") ENDIF(ZB_FEATURE_GLOBAL_RSP_SYNC) -ADD_SUBDIRECTORY(common) -ADD_SUBDIRECTORY(lib) +INCLUDE(FindPkgConfig) +pkg_check_modules(${fw_name} REQUIRED ${dependents} ${APPFW_REQUIRED_PKGS}) +FOREACH(flag ${${fw_name}_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +IF(BUILD_GCOV) + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIC -Wall -Werror-implicit-function-declaration -Werror -g -fvisibility=hidden -fprofile-arcs -ftest-coverage") + +ELSE(BUILD_GCOV) + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIC -Wall -Werror-implicit-function-declaration -Werror -g -fvisibility=hidden") + +ENDIF(BUILD_GCOV) + +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIC -Wall -Werror-implicit-function-declaration -Werror -g -fvisibility=hidden") + +SET(CMAKE_C_FLAGS_DEBUG "-O0 -g") + +IF("${ARCH}" STREQUAL "arm") + ADD_DEFINITIONS("-DTARGET") +ENDIF("${ARCH}" STREQUAL "arm") + +ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"") +ADD_DEFINITIONS("-DTIZEN_DEBUG") + +SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -Wl,--rpath=${LIBDIR}") + +aux_source_directory(common COMMON_SOURCES) +aux_source_directory(src SOURCES) +ADD_LIBRARY(${fw_name} SHARED ${COMMON_SOURCES} ${SOURCES}) + +TARGET_LINK_LIBRARIES(${fw_name} ${${fw_name}_LDFLAGS}) + +SET_TARGET_PROPERTIES(${fw_name} + PROPERTIES + VERSION ${FULLVER} + SOVERSION ${MAJORVER} + CLEAN_DIRECT_OUTPUT 1 +) + +INSTALL(TARGETS ${fw_name} DESTINATION ${LIB}) +INSTALL( + DIRECTORY ${INC_DIR}/ DESTINATION include/network + FILES_MATCHING + PATTERN "_private.h" EXCLUDE + PATTERN "${INC_DIR}/*.h" + ) + +SET(PC_NAME ${fw_name}) +SET(PC_REQUIRED ${pc_dependents}) +SET(PC_LDFLAGS -l${fw_name}) + +CONFIGURE_FILE( + ${fw_name}.pc.in + ${CMAKE_CURRENT_SOURCE_DIR}/${fw_name}.pc + @ONLY +) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${fw_name}.pc DESTINATION ${LIB}/pkgconfig) + ADD_SUBDIRECTORY(test) + +IF(UNIX) + +ADD_CUSTOM_TARGET (distclean @echo cleaning for source distribution) +ADD_CUSTOM_COMMAND( + DEPENDS clean + COMMENT "distribution clean" + COMMAND find + ARGS . + -not -name config.cmake -and \( + -name tester.c -or + -name Testing -or + -name CMakeFiles -or + -name cmake.depends -or + -name cmake.check_depends -or + -name CMakeCache.txt -or + -name cmake.check_cache -or + -name *.cmake -or + -name Makefile -or + -name core -or + -name core.* -or + -name gmon.out -or + -name install_manifest.txt -or + -name *.pc -or + -name *~ \) + | grep -v TC | xargs rm -rf + TARGET distclean + VERBATIM +) + +ENDIF(UNIX) diff --git a/capi-network-zigbee.pc.in b/capi-network-zigbee.pc.in new file mode 100644 index 0000000..b4937b7 --- /dev/null +++ b/capi-network-zigbee.pc.in @@ -0,0 +1,13 @@ +# Package Information for pkg-config + +prefix=@PREFIX@ +exec_prefix=${prefix}/bin +libdir=@LIB_INSTALL_DIR@ +includedir=@INCLUDE_INSTALL_DIR@/network + +Name: @PC_NAME@ +Description: @PACKAGE_DESCRIPTION@ +Version: @FULLVER@ +Requires: @PC_REQUIRED@ +Libs: -L${libdir} @PC_LDFLAGS@ +Cflags: -I${includedir} -I${includedir}/network diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt deleted file mode 100644 index 7837c17..0000000 --- a/common/CMakeLists.txt +++ /dev/null @@ -1,14 +0,0 @@ -#FIND_PROGRAM(GDBUS_CODEGEN NAMES gdbus-codegen) - -#MESSAGE("${GDBUS_CODEGEN}") -#ADD_CUSTOM_COMMAND( -# OUTPUT dbus -# COMMAND ${GDBUS_CODEGEN} --generate-c-code ${ZB_DBUS} -# --interface-prefix org.tizen.zigbee. -# --c-namespace zb -# ${ZB_DBUS}.xml -# DEPENDS ${ZB_DBUS}.xml) - -#ADD_CUSTOM_TARGET(GENERATED_DBUS_CODE DEPENDS dbus) - -#MESSAGE("${dbus}") diff --git a/include/zigbee-zcl_private.h b/include/zigbee-zcl_private.h index ff0b359..b337f65 100644 --- a/include/zigbee-zcl_private.h +++ b/include/zigbee-zcl_private.h @@ -253,6 +253,36 @@ int zb_report_config_response_record_set_status( zb_zcl_report_config_response_record_h handle, zb_zcl_status_e status); +/** + * @ingroup CAPI_NETWORK_ZIGBEE_ZCL_REPORTING_CONFIG_RESPONSE_RECORD_MODULE + * @brief Sets the attribute identifier to a reporting configuration response record. + * @details The attribute identifier field is 16 bits in length and shall contain the + * identifier of the attribute that the reporting configuration details apply to. + * + * @since_tizen 4.0 + * + * @param[in] handle The handle of write attribute status record + * @param[out] id Attribute identifier + * + * @return 0 on success, otherwise a negative error value. + * @retval #ZIGBEE_ERROR_NONE Successful + * @retval #ZIGBEE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #ZIGBEE_ERROR_NOT_SUPPORTED Not supported + * + * @see zb_zcl_global_config_report_write_cb() + * @see zb_report_config_response_record_clone() + * @see zb_report_config_response_record_destroy() + * @see zb_report_config_response_record_get_status() + * @see zb_report_config_response_record_get_dir() + * @see zb_report_config_response_record_get_id() + * @see zb_report_config_response_record_set_status() + * @see zb_report_config_response_record_set_dir() + * @see zb_report_config_response_record_set_id() + */ +int zb_report_config_response_record_set_id( + zb_zcl_report_config_response_record_h handle, + zb_attribute_id id); + /** * @brief Sets direction to reporting configuration response record. * @details The direction field specifies whether values of the attribute are reported @@ -293,53 +323,6 @@ int zb_report_config_response_record_set_dir( zb_zcl_report_config_response_record_h handle, zb_zcl_fc_direction_e dir); -/** - * @brief Gets change from reporting configuration record (type 5). - * @details The reportable change field shall contain the minimum change to the attribute - * that will result in a report being issued. This field is of variable length. - * - * For attributes with 'analog' data type the field has the same data type as the attribute. - * - * The sign (if any) of the reportable change field is ignored. - * For attributes of 'discrete' data type - * this field is omitted. - * - * @since_tizen 4.0 - * - * @param[in] handle The handle of write attribute status record - * @param[out] type attribute type - * @param[out] value attribute data (only analog data type is allowed) - * @param[out] size attribute data size - * - * @return 0 on success, otherwise a negative error value. - * @retval #ZIGBEE_ERROR_NONE Successful - * @retval #ZIGBEE_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #ZIGBEE_ERROR_NOT_SUPPORTED Not supported - * - * @see zb_zcl_global_read_report_config_cb() - * @see zb_report_config_record_create() - * @see zb_report_config_record_clone() - * @see zb_report_config_record_destroy() - * @see zb_report_config_record_get_id() - * @see zb_report_config_record_set_id() - * @see zb_report_config_record_get_dir() - * @see zb_report_config_record_set_dir() - * @see zb_report_config_record_get_type() - * @see zb_report_config_record_get_min_interval() - * @see zb_report_config_record_set_min_interval() - * @see zb_report_config_record_get_max_interval() - * @see zb_report_config_record_set_max_interval() - * @see zb_report_config_record_get_change() - * @see zb_report_config_record_set_change() - * @see zb_report_config_record_get_timeout() - * @see zb_report_config_record_set_timeout() - */ -int zb_report_config_record_get_change_3( - zb_zcl_reporting_config_record_h handle, - zb_zcl_data_type_e *type, - unsigned char *value, - int *size); - /** * @brief Gets direction from read reporting configuration record. * @details The direction field specifies whether values of the attribute are reported diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt deleted file mode 100644 index ce45060..0000000 --- a/lib/CMakeLists.txt +++ /dev/null @@ -1,31 +0,0 @@ -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/common/) -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include) - -SET(CLIENT_PKG_CONF_FILE "capi-network-zigbee") - -FILE(GLOB CLIENT_SRCS *.c ${CMAKE_SOURCE_DIR}/common/*.c) -#SET(CLIENT_SRCS ${CLIENT_SRCS} ${CMAKE_SOURCE_DIR}/common/${ZB_DBUS}.c) -#SET_SOURCE_FILES_PROPERTIES(${CMAKE_SOURCE_DIR}/common/${ZB_DBUS}.c -# PROPERTIES GENERATED TRUE) - -pkg_check_modules(client_pkgs REQUIRED glib-2.0 gio-2.0 gio-unix-2.0 dlog capi-base-common capi-system-info) -INCLUDE_DIRECTORIES(${client_pkgs_INCLUDE_DIRS}) - -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -Wall -Werror -pthread") -SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -O0 -g") - -ADD_DEFINITIONS("-DZIGBEE_DBUS_INTERFACE=\"${DBUS_INTERFACE}\"") -ADD_DEFINITIONS("-DZIGBEE_DBUS_OBJPATH=\"${DBUS_OBJECT_PATH}\"") - -ADD_LIBRARY(${CLIENT} SHARED ${CLIENT_SRCS}) -#ADD_DEPENDENCIES(${CLIENT} GENERATED_DBUS_CODE) -TARGET_LINK_LIBRARIES(${CLIENT} ${client_pkgs_LIBRARIES}) -SET_TARGET_PROPERTIES(${CLIENT} PROPERTIES VERSION ${FULLVER} SUBVERSION ${MAJORVER}) -INSTALL(TARGETS ${CLIENT} DESTINATION ${LIB_INSTALL_DIR}) - -CONFIGURE_FILE(${CLIENT_PKG_CONF_FILE}.pc.in ${CLIENT_PKG_CONF_FILE}.pc @ONLY) -INSTALL(FILES ${CLIENT_PKG_CONF_FILE}.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) - -FILE(GLOB CLIENT_HEADER ${CMAKE_SOURCE_DIR}/include/*.h) -list(FILTER CLIENT_HEADER EXCLUDE REGEX ".*_private.h$") -INSTALL(FILES ${CLIENT_HEADER} DESTINATION ${INCLUDE_INSTALL_DIR}/network) diff --git a/lib/capi-network-zigbee.pc.in b/lib/capi-network-zigbee.pc.in deleted file mode 100644 index 7aa7398..0000000 --- a/lib/capi-network-zigbee.pc.in +++ /dev/null @@ -1,11 +0,0 @@ -prefix=@CMAKE_INSTALL_PREFIX@ -exec_prefix=${prefix}/bin -libdir=@LIB_INSTALL_DIR@ -includedir=@INCLUDE_INSTALL_DIR@/network - -Name: @CLIENT@ -Description: Network/Wireless zigbee -Version: @FULLVER@ -Requires: -Libs: -L${libdir} -l@CLIENT@ -Cflags: -I${includedir} diff --git a/lib/zbl-custom.c b/lib/zbl-custom.c deleted file mode 100644 index 891f0fc..0000000 --- a/lib/zbl-custom.c +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2016 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 -#include -#include -#include -#include -#include - -#include "zbl.h" -#include "zbl-dbus.h" -#include "zigbee.h" - -API int zb_aps_send(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char aps_fc, - unsigned char src_ep, unsigned char dst_ep, unsigned short clusterid, - unsigned short profileid, unsigned char zcl_fc, unsigned short mfg_code, - unsigned char cmd_id, unsigned short payload_len, unsigned char *payload, - zb_aps_send_cb cb, void *user_data) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - int ret = ZIGBEE_ERROR_NONE; - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - ret = zbl_aps_send(addr16, aps_fc, src_ep, dst_ep, clusterid, profileid, - zcl_fc, mfg_code, cmd_id, payload_len, payload, cb, user_data); - DBG("zbl_aps_send()=0x%X", ret); - return ret; -} - -API int zb_zcl_send(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char src_ep, - unsigned char dst_ep, zb_cluster_id clusterid, unsigned char zcl_fc, - unsigned char cmd, unsigned short payload_len, unsigned char *payload, - zb_zcl_send_cb cb, void *user_data) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - int ret = ZIGBEE_ERROR_NONE; - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - ret = zbl_zcl_send(addr16, src_ep, dst_ep, clusterid, zcl_fc, - cmd, payload_len, payload, cb, user_data); - DBG("zbl_zcl_send()=0x%X", ret); - return ret; -} - -API int zb_send_to_local(zb_zigbee_h handle, unsigned short length, - unsigned char *data, zb_send_to_local_cb cb, void *user_data) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - int ret = ZIGBEE_ERROR_NONE; - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - ret = zbl_send_to_local(length, data, cb, user_data); - DBG("zbl_send_to_local()=0x%X", ret); - return ret; -} diff --git a/lib/zbl-dbus.c b/lib/zbl-dbus.c deleted file mode 100644 index f040020..0000000 --- a/lib/zbl-dbus.c +++ /dev/null @@ -1,8988 +0,0 @@ -/* - * Copyright (c) 2015 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 -#include -#include -#include -#include - -#include "zbl.h" -#include "zbl-dbus.h" -#include "zb-common.h" - -#define USE_ASYNC_DBUS_CALL - -static int zbl_ref_count; - -static GDBusConnection *gdbus_conn = NULL; -static GDBusProxy *service_gproxy = NULL; -static GDBusProxy *on_off_gproxy = NULL; -static GDBusProxy *door_lock_gproxy = NULL; -static GDBusProxy *level_control_gproxy = NULL; -static GDBusProxy *thermostat_gproxy = NULL; -static GDBusProxy *alarm_gproxy = NULL; -static GDBusProxy *fan_control_gproxy = NULL; -static GDBusProxy *mfglib_gproxy = NULL; -static GDBusProxy *zcl_global_proxy = NULL; -static GDBusProxy *zdo_dev_proxy = NULL; -static GDBusProxy *zcl_basic_proxy = NULL; -static GDBusProxy *zcl_identify_proxy = NULL; -static GDBusProxy *zcl_ias_zone_proxy = NULL; -static GDBusProxy *zcl_poll_control_proxy = NULL; -static GDBusProxy *zcl_group_proxy = NULL; -static GDBusProxy *zcl_scene_proxy = NULL; -static GDBusProxy *zdo_bind_proxy = NULL; -static GDBusProxy *zcl_color_control_proxy = NULL; -static GDBusProxy *custom_gproxy = NULL; - -/* command id */ -typedef enum { - /* Service */ - ZBL_SERVICE_FORM_NETWORK = 0, - ZBL_SERVICE_DISABLE_NETWORK, - /* ZDO except Bind */ - ZBL_ZDO_NWK_ADDR_REQ, - ZBL_ZDO_NWK_ADDR_EXT_REQ, - ZBL_ZDO_ACTIVE_EP_REQ, - ZBL_ZDO_SIMPLE_DESC_REQ, - ZBL_ZDO_MATCHED_DESCRIPTOR_REQ, - ZBL_ZDO_COMPLEX_DESC_REQ, - ZBL_ZDO_MGMT_BIND_REQ, - ZBL_ZDO_MGMT_LQI_REQ, - ZBL_ZDO_MGMT_RTG_REQ, - ZBL_ZDO_MGMT_NWK_DISC_REQ, - ZBL_ZDO_MGMT_PERMIT_JOIN_REQ, - ZBL_ZDO_MGMT_LEAVE_REQ, - ZBL_ZDO_NODE_DESC_REQ, - ZBL_ZDO_POWER_DESC_REQ, - ZBL_ZDO_USER_DESC_REQ, - ZBL_ZDO_USER_DESC_SET_REQ, - /* ZDP Bind */ - ZBL_ZDO_BIND_REQ, - ZBL_ZDO_UNBIND_REQ, - /* ZCL Global */ - ZBL_ZCL_GLOBAL_READ_ATTRIBUTE_REQ, - ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_REQ, - ZBL_ZCL_GLOBAL_WRITE_CONFIGURE_REPORTING_REQ, - ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_REQ, - ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_STRUCTURED_REQ, - ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_RECEIVED_REQ, - ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_GENERATED_REQ, - ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_EXTENDED_REQ, - ZBL_ZCL_GLOBAL_READ_CONFIGURE_REPORTING_REQ, - /* Custom */ - ZBL_CUSTOM_APS_SEND_REQ, - ZBL_CUSTOM_ZCL_SEND_REQ, - ZBL_CUSTOM_LOCAL_SEND_REQ, - /* ZCL Alarm */ - ZBL_ZCL_ALARM_GET_ALARM_REQ, - /* ZCL Doorlock */ - ZBL_ZCL_DOORLOCK_LOCK_STATE, - /* ZCL Fanmode */ - ZBL_ZCL_FANMODE_FAN_MODE_STATE, - /* ZCL Group */ - ZBL_ZCL_GROUP_ADD_GROUP_REQ, - ZBL_ZCL_GROUP_VIEW_GROUP_REQ, - ZBL_ZCL_GROUP_GET_GROUP_MEMBERSHIP_REQ, - ZBL_ZCL_GROUP_REMOVE_GROUP_REQ, - /* ZCL Identify */ - ZBL_ZCL_IDENTIFY_QUERY_REQ, - /* ZCL On/Off */ - ZBL_ZCL_ON_OFF_GET_ON_OFF_STATE, - /* ZCL Pollcontrol */ - ZBL_ZCL_POLLCONTROL_SET_POLL_INTERVAL_REQ, - /* ZCL Scene */ - ZBL_ZCL_SCENE_ADD_SCENE_REQ, - ZBL_ZCL_SCENE_VIEW_SCENE_REQ, - ZBL_ZCL_SCENE_REMOVE_SCENE_REQ, - ZBL_ZCL_SCENE_STORE_SCENE_REQ, - ZBL_ZCL_SCENE_REMOVE_ALL_SCENE_REQ, - ZBL_ZCL_SCENE_GET_SCENE_MEMBERSHIP_REQ, - /* ZCL Thermostat */ - ZBL_ZCL_THERMOSTAT_GET_LOCAL_TEMP, -} zbl_command_id_e; - -typedef struct { - bool found; - void *cb; - void *userdata; - unsigned int sid; - int tid; -#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC - void *global_cmd; - void *handle; -#endif - zbl_command_id_e cid; -} zbl_req_cb_s; - -#define ZCL_REPORTING_DIRECTION_REPORTED 0x00 -#define ZCL_REPORTING_DIRECTION_RECEIVED 0x01 - -static GDBusProxy *_zbl_get_service_proxy(void) -{ - GDBusProxy *proxy = NULL; - RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); - - if (NULL == service_gproxy) { - proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, - ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_SERVICE_INTERFACE, - NULL, NULL); - } else - proxy = service_gproxy; - - return proxy; -} - -static GDBusProxy *_zbl_get_on_off_proxy(void) -{ - GDBusProxy *proxy = NULL; - RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); - - if (NULL == on_off_gproxy) { - proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, - ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, - ZIGBEE_ZCL_ON_OFF_INTERFACE, NULL, NULL); - } else - proxy = on_off_gproxy; - - return proxy; -} - -static GDBusProxy *_zbl_get_door_lock_proxy(void) -{ - GDBusProxy *proxy = NULL; - RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); - - if (NULL == door_lock_gproxy) { - proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, - ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, - ZIGBEE_ZCL_DOOR_LOCK_INTERFACE, NULL, NULL); - } else - proxy = door_lock_gproxy; - - return proxy; -} - -static GDBusProxy *_zbl_get_level_control_proxy(void) -{ - GDBusProxy *proxy = NULL; - RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); - - if (NULL == level_control_gproxy) { - proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, - ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, - ZIGBEE_ZCL_LEVEL_CONTROL_INTERFACE, NULL, NULL); - } else - proxy = level_control_gproxy; - - return proxy; -} - -static GDBusProxy *_zbl_get_thermostat_proxy(void) -{ - GDBusProxy *proxy = NULL; - RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); - - if (NULL == thermostat_gproxy) { - proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, - ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, - ZIGBEE_ZCL_THERMOSTAT_INTERFACE, NULL, NULL); - } else - proxy = thermostat_gproxy; - - return proxy; -} - -static GDBusProxy *_zbl_get_alarm_proxy(void) -{ - GDBusProxy *proxy = NULL; - RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); - - if (NULL == alarm_gproxy) { - proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, - ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_ZCL_ALARM_INTERFACE, - NULL, NULL); - } else - proxy = alarm_gproxy; - - return proxy; -} - -static GDBusProxy *_zbl_get_fan_control_proxy(void) -{ - GDBusProxy *proxy = NULL; - RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); - - if (NULL == fan_control_gproxy) { - proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, - ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, - ZIGBEE_ZCL_FAN_CONTROL_INTERFACE, NULL, NULL); - } else - proxy = fan_control_gproxy; - - return proxy; -} - -static GDBusProxy *_zbl_get_mfglib_proxy(void) -{ - GDBusProxy *proxy = NULL; - RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); - - if (NULL == mfglib_gproxy) { - proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, - ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, - ZIGBEE_MFGLIB_CONTROL_INTERFACE, NULL, NULL); - } else - proxy = mfglib_gproxy; - - return proxy; -} - -static GDBusProxy *_zbl_get_zcl_global_proxy(void) -{ - GDBusProxy *proxy = NULL; - RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); - - if (NULL == zcl_global_proxy) { - proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, - ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, - ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, NULL, NULL); - } else - proxy = zcl_global_proxy; - - return proxy; -} - -static GDBusProxy *_zbl_get_zdo_dev_proxy(void) -{ - GDBusProxy *proxy = NULL; - RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); - - if (NULL == zdo_dev_proxy) { - proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, - ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, - ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, NULL, NULL); - } else - proxy = zdo_dev_proxy; - - return proxy; -} - -static GDBusProxy *_zbl_get_basic_proxy(void) -{ - GDBusProxy *proxy = NULL; - RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); - - if (NULL == zcl_basic_proxy) { - proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, - ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_ZCL_BASIC_INTERFACE, - NULL, NULL); - } else - proxy = zcl_basic_proxy; - - return proxy; -} - -static GDBusProxy *_zbl_get_identify_proxy(void) -{ - GDBusProxy *proxy = NULL; - RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); - - if (NULL == zcl_identify_proxy) { - proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, - ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, - ZIGBEE_ZCL_IDENTIFY_INTERFACE, NULL, NULL); - } else - proxy = zcl_identify_proxy; - - return proxy; -} - -static GDBusProxy *_zbl_get_ias_zone_proxy(void) -{ - GDBusProxy *proxy = NULL; - RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); - - if (NULL == zcl_ias_zone_proxy) { - proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, - ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, - ZIGBEE_ZCL_IAS_ZONE_INTERFACE, NULL, NULL); - } else - proxy = zcl_ias_zone_proxy; - - return proxy; -} - -static GDBusProxy *_zbl_get_poll_control_proxy(void) -{ - GDBusProxy *proxy = NULL; - RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); - - if (NULL == zcl_poll_control_proxy) { - proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, - ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, - ZIGBEE_ZCL_POLL_CONTROL_INTERFACE, NULL, NULL); - } else - proxy = zcl_poll_control_proxy; - - return proxy; -} - -static GDBusProxy *_zbl_get_group_proxy(void) -{ - GDBusProxy *proxy = NULL; - RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); - - if (NULL == zcl_group_proxy) { - proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, - ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_ZCL_GROUP_INTERFACE, - NULL, NULL); - } else - proxy = zcl_group_proxy; - - return proxy; -} - -static GDBusProxy *_zbl_get_scene_proxy(void) -{ - GDBusProxy *proxy = NULL; - RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); - - if (NULL == zcl_scene_proxy) { - proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, - ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_ZCL_SCENE_INTERFACE, - NULL, NULL); - } else - proxy = zcl_scene_proxy; - - return proxy; -} - -static GDBusProxy *_zbl_get_zdo_bind_proxy(void) -{ - GDBusProxy *proxy = NULL; - RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); - - if (NULL == zdo_bind_proxy) { - proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, - ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_ZDO_BIND_INTERFACE, - NULL, NULL); - } else - proxy = zdo_bind_proxy; - - return proxy; -} - -static GDBusProxy *_zbl_get_color_control_proxy(void) -{ - GDBusProxy *proxy = NULL; - RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); - - if (NULL == zcl_color_control_proxy) { - proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, - ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, - ZIGBEE_ZCL_COLOR_CONTROL_INTERFACE, NULL, NULL); - } else - proxy = zcl_color_control_proxy; - - return proxy; -} - -static GDBusProxy *_zbl_get_custom_gproxy(void) -{ - GDBusProxy *proxy = NULL; - RETVM_IF(NULL == gdbus_conn, NULL, "Custom Object is invalid"); - - if (NULL == custom_gproxy) { - proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, - ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_CUSTOM_INTERFACE, - NULL, NULL); - } else - proxy = custom_gproxy; - - return proxy; -} - -#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC -static gint _global_compare_func(gconstpointer a, gconstpointer b) -{ - const zbl_req_cb_s *left = (const zbl_req_cb_s*)a; - const zbl_req_cb_s *right = (const zbl_req_cb_s*)b; - zb_event_global_default_rsp_s *left_data = NULL; - zb_event_global_default_rsp_s *right_data = NULL; - - if (NULL == left || NULL == left->global_cmd) - return -1; - if (NULL == right || NULL == right->global_cmd) - return 1; - - left_data = left->global_cmd; - right_data = right->global_cmd; - - if (left_data->ep > right_data->ep) - return 1; - else if (left_data->ep < right_data->ep) - return -1; - - if (left_data->clusterid > right_data->clusterid) - return 1; - else if (left_data->clusterid < right_data->clusterid) - return -1; - - if (left_data->commandid > right_data->commandid) - return 1; - else if (left_data->commandid < right_data->commandid) - return -1; - - /* endpoint, clusterid and commandid are equal */ - return 0; -} - -static void _zbl_register_global_req(zb_zigbee_h handle, zbl_req_cb_s *container) -{ - GList *list = NULL; - GList *item = NULL; - - struct zbl_zigbee_s* h = handle; - - if (NULL == handle || NULL == container) - return; - - list = h->global_cmd_req; - - /* Insert item if not exists */ - DBG("Insert global cmd info"); - if (list) { - item = g_list_find_custom(list, container, _global_compare_func); - if (NULL != item) - h->global_cmd_req = g_list_append(list, container); - } else - h->global_cmd_req = g_list_append(list, container); -} - -static void _zbl_deregister_global_req(zb_zigbee_h handle, zbl_req_cb_s *container) -{ - GList *list = NULL; - GList *item = NULL; - - struct zbl_zigbee_s* h = handle; - - if (NULL == handle || NULL == container) - return; - - list = h->global_cmd_req; - if (NULL == list) - return; - - /* Remove item if exists */ - DBG("Remove global cmd info"); - item = g_list_find_custom(list, container, _global_compare_func); - if (NULL != item) - h->global_cmd_req = g_list_remove(list, container); -} - -static void _zbl_remove_global_req(zb_zigbee_h handle, unsigned char ep, - unsigned short clusterid, unsigned char commandid) -{ - GList *head = NULL; - GList *iter = NULL; - zbl_req_cb_s *ret = NULL; - - struct zbl_zigbee_s* h = handle; - - if (NULL == handle) - return; - - head = h->global_cmd_req; - iter = head; - - while (NULL != iter) { - GList *next = iter->next; - zbl_req_cb_s *container = iter->data; - if (container && container->global_cmd) { - zb_event_global_default_rsp_s *data = container->global_cmd; - - if (data && data->ep == ep && data->clusterid == clusterid - && data->commandid == commandid) { - DBG(" Found: ep[%d] cluster_id[%X] commandid[%X] / sid[%d]", - ep, clusterid, commandid, container->sid); - ret = container; - break; - } - } - iter = next; - } - - if (ret) { - if (ret->sid) - g_dbus_connection_signal_unsubscribe(gdbus_conn, ret->sid); - - if (ret->tid) { - g_source_remove(ret->tid); - DBG("tid=%d removed"); - ret->tid = 0; - } - - _zbl_deregister_global_req(h, ret); - } - -} -#endif /* ZB_FEATURE_GLOBAL_RSP_SYNC */ - -static void _zbl_signal_handler(GDBusConnection *connection, - const gchar *sender_name, const gchar *object_path, const gchar *interface_name, - const gchar *signal_name, GVariant *parameters, gpointer user_data) -{ - zb_event_data_s *ev = NULL; - struct zbl_zigbee_s* container = user_data; - - DBG("%s signal received", signal_name); - - RET_IF(NULL == container); - RET_IF(NULL == container->event_handler); - - ev = calloc(1, sizeof(zb_event_data_s)); - RETM_IF(NULL == ev, "Failed to memory allocation !"); - - if (g_strcmp0(signal_name, "zigbee_state") == 0) { - gboolean enabled; - g_variant_get(parameters, "(b)", &enabled); - - ev->data.enable = calloc(1, sizeof(zb_event_enable_s)); - if (!ev->data.enable) { - ERR("Failed to memory allocation !"); - goto EXIT_EVENT_HANDLER; - } - - ev->data.enable->status = (unsigned char)enabled; - - container->event_handler(0, NULL, ZB_ZDP_ENABLE_EVENT, ev, container->user_data); - - if (ev->data.enable) { - free(ev->data.enable); - ev->data.enable = NULL; - } - - } else if (g_strcmp0(signal_name, "form_network_done") == 0) { - zb_nwk_addr pan_id; - g_variant_get(parameters, "(q)", &pan_id); - - ev->data.form_network = calloc(1, sizeof(zb_event_form_network_s)); - if (!ev->data.form_network) { - ERR("Failed to memory allocation !"); - goto EXIT_EVENT_HANDLER; - } - - memcpy(&ev->data.form_network->pan_id, &pan_id, sizeof(zb_nwk_addr)); - - container->event_handler(pan_id, NULL, ZB_ZDP_FORM_NETWORK_DONE, ev, - container->user_data); - - if (ev->data.form_network) { - free(ev->data.form_network); - ev->data.form_network = NULL; - } - } else if (g_strcmp0(signal_name, "child_joined") == 0) { - zb_nwk_addr addr16; - zb_ieee_addr addr64; - unsigned char count; - unsigned char ep[10]; - unsigned char value; - - int j = 0; - GVariantIter *iter1 = NULL; - GVariantIter *iter2 = NULL; - - g_variant_get(parameters, "(a(y)ya(y)q)", &iter1, &count, &iter2, &addr16); - if (!iter1 || !iter2) { - ERR("Invalid parameter !"); - goto EXIT_EVENT_HANDLER; - } - - while (g_variant_iter_loop(iter1, "(y)", &value)) { - addr64[j] = value; j++; - } - g_variant_iter_free(iter1); - - j = 0; - while (g_variant_iter_loop(iter2, "(y)", &value)) { - ep[j] = value; j++; - } - g_variant_iter_free(iter2); - - ev->data.join = calloc(1, sizeof(zb_event_join_s)); - if (!ev->data.join) { - ERR("Failed to memory allocation !"); - goto EXIT_EVENT_HANDLER; - } - - ev->data.join->count = count; - memcpy(ev->data.join->ep, ep, count); - - container->event_handler(addr16, addr64, ZB_ZDP_JOIN_EVENT, ev, - container->user_data); - - if (ev->data.join) { - free(ev->data.join); - ev->data.join = NULL; - } - - } else if (g_strcmp0(signal_name, "child_rejoined") == 0) { - zb_ieee_addr addr64; - unsigned char value; - - int j = 0; - GVariantIter *iter = NULL; - - g_variant_get(parameters, "(a(y))", &iter); - if (!iter) { - ERR("Invalid parameter !"); - goto EXIT_EVENT_HANDLER; - } - - while (g_variant_iter_loop(iter, "(y)", &value)) { - addr64[j] = value; j++; - } - g_variant_iter_free(iter); - - container->event_handler(0, addr64, ZB_ZDP_REJOIN_EVENT, ev, - container->user_data); - - } else if (g_strcmp0(signal_name, "child_left") == 0) { - int j = 0; - zb_ieee_addr addr64; - GVariantIter *iter = NULL; - unsigned char value, status; - - g_variant_get(parameters, "(a(y)y)", &iter, &status); - if (!iter) { - ERR("Invalid parameter !"); - goto EXIT_EVENT_HANDLER; - } - - while (g_variant_iter_loop(iter, "(y)", &value)) { - addr64[j] = value; - j++; - } - g_variant_iter_free(iter); - - ev->data.child_left = calloc(1, sizeof(zb_event_child_left_s)); - if (!ev->data.child_left) { - ERR("Failed to memory allocation !"); - goto EXIT_EVENT_HANDLER; - } - - ev->data.child_left->status = status; - - container->event_handler(0, addr64, ZB_ZDP_CHILD_LEFT, ev, - container->user_data); - - if (ev->data.child_left) { - free(ev->data.child_left); - ev->data.child_left = NULL; - } - - } else if (g_strcmp0(signal_name, "leave_network_done") == 0) { - - zb_nwk_addr addr16; - g_variant_get(parameters, "(q)", &addr16); - - container->event_handler(addr16, NULL, ZB_ZDP_LEAVE_DONE_EVENT, ev, - container->user_data); - - } else if (!g_strcmp0(signal_name, "zcl_global_default_response")) { - zb_nwk_addr addr16; - unsigned char ep; - unsigned short clusterid; - unsigned char commandid; - unsigned char status; - - g_variant_get(parameters, "(qyqyy)", - &addr16, &ep, &clusterid, &commandid, &status); - - ev->data.global_default_rsp = calloc(1, sizeof(zb_event_global_default_rsp_s)); - if (!ev->data.global_default_rsp) { - ERR("Failed to memory allocation !"); - goto EXIT_EVENT_HANDLER; - } - - ev->data.global_default_rsp->ep = ep; - ev->data.global_default_rsp->clusterid = clusterid; - ev->data.global_default_rsp->commandid = commandid; - ev->data.global_default_rsp->status = status; - -#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC - /* If there is global request already, remove that. */ - if (0x00 != status) - _zbl_remove_global_req(container, ep, clusterid, commandid); -#endif - - container->event_handler(addr16, NULL, ZB_ZCL_GLOBAL_DEFAULT_RSP_EVENT, ev, - container->user_data); - - if (ev->data.global_default_rsp) { - free(ev->data.global_default_rsp); - ev->data.global_default_rsp = NULL; - } - - } else if (!g_strcmp0(signal_name, "alarm_count")) { - unsigned short alarm_count; - g_variant_get(parameters, "(q)", &alarm_count); - - ev->data.alarm = calloc(1, sizeof(zb_event_alarm_s)); - if (!ev->data.global_default_rsp) { - ERR("Failed to memory allocation !"); - goto EXIT_EVENT_HANDLER; - } - - ev->data.alarm->count = alarm_count; - - container->event_handler(0, NULL, ZB_ZCL_ALARM_EVENT, ev, container->user_data); - - if (ev->data.alarm) { - free(ev->data.alarm); - ev->data.alarm = NULL; - } - - } else if (!g_strcmp0(signal_name, "report_attr_handler_cb")) { - zb_nwk_addr addr16; - unsigned char ep; - unsigned char value; - unsigned short attrData; - unsigned short clusterid; - unsigned char dataType; - int data_size; - int dsizeIndex = 0; - char dSize[3] = {'\0', '\0'}; - int i = 0, j = 0, count; - GVariantIter *attr_iter = NULL; - GVariantIter *dataType_iter = NULL; - GVariantIter *data_iter = NULL; - - struct attribute_report_s **records = NULL; - - g_variant_get(parameters, "(qyqaqa(y)a(y)i)", &addr16, &ep, - &clusterid, &attr_iter, &dataType_iter, &data_iter, &count); - - if (!attr_iter || !dataType_iter || !data_iter) { - ERR("Invalid parameter !"); - goto EXIT_EVENT_HANDLER; - } - - records = calloc(count, sizeof(struct attribute_report_s*)); - if (!records) { - ERR("calloc() Fail(%d)", errno); - goto EXIT_EVENT_HANDLER; - } - - for (j = 0; j < count; j++) { - records[j] = calloc(1, sizeof(struct attribute_report_s)); - if (NULL == records[j]) { - for (i = 0; i < j; i++) { - free(records[i]); - records[i] = NULL; - } - free(records); - records = NULL; - - g_variant_iter_free(attr_iter); - g_variant_iter_free(dataType_iter); - g_variant_iter_free(data_iter); - - ERR("calloc() Fail(%d)", errno); - goto EXIT_EVENT_HANDLER; - } - } - DBG("record_length %d", count); - - j = 0; - while (g_variant_iter_loop(attr_iter, "q", &attrData) - && g_variant_iter_loop(dataType_iter, "(y)", &dataType)) { - records[j]->id = attrData; - records[j]->type = dataType; - DBG("dataType 0x%02x", records[j]->type); - DBG("AttributeId 0x%04x", records[j]->id); - j++; - } - g_variant_iter_free(attr_iter); - g_variant_iter_free(dataType_iter); - - j = 0; - while (j < count) { - switch (records[j]->type) { - /* String */ - case ZB_ZCL_OCTET_STRING: - case ZB_ZCL_CHARACTER_STRING: - g_variant_iter_loop(data_iter, "(y)", &value); - data_size = value + 1; - records[j]->value = calloc(data_size, sizeof(unsigned char)); - if (NULL == records[j]->value) { - for (i = 0; i < j; i++) { - free(records[i]->value); - records[i]->value = NULL; - } - for (i = 0; i < count; i++) { - free(records[i]); - records[i] = NULL; - } - free(records); - records = NULL; - - ERR("calloc() Fail(%d)", errno); - goto EXIT_EVENT_HANDLER; - } - records[j]->value[dsizeIndex] = value; - dsizeIndex++; - for (i = dsizeIndex; i < data_size - 2; i++) { - g_variant_iter_loop(data_iter, "(y)", &value); - records[j]->value[i] = value; - } - g_variant_iter_free(data_iter); - break; - case ZB_ZCL_LONG_OCTET_STRING: - case ZB_ZCL_LONG_CHARACTER_STRING: - g_variant_iter_loop(data_iter, "(y)", &value); - dSize[0] = value; - g_variant_iter_loop(data_iter, "(y)", &value); - dSize[1] = value; - data_size = dSize[1]; - data_size = (data_size << 8) | dSize[0]; - data_size += 2; - records[j]->value = calloc(data_size, sizeof(unsigned char)); - if (NULL == records[j]->value) { - for (i = 0; i < j; i++) { - free(records[i]->value); - records[i]->value = NULL; - } - for (i = 0; i < count; i++) { - free(records[i]); - records[i] = NULL; - } - free(records); - records = NULL; - - ERR("calloc() Fail(%d)", errno); - goto EXIT_EVENT_HANDLER; - } - records[j]->value[dsizeIndex] = dSize[dsizeIndex]; - dsizeIndex++; - records[j]->value[dsizeIndex] = dSize[dsizeIndex]; - dsizeIndex++; - - for (i = dsizeIndex; i < data_size - 2; i++) { - g_variant_iter_loop(data_iter, "(y)", &value); - records[j]->value[i] = value; - } - g_variant_iter_free(data_iter); - break; - /* Array, set and bag */ - case ZB_ZCL_ARRAY: - case ZB_ZCL_SET: - case ZB_ZCL_BAG: - /* structure */ - case ZB_ZCL_STRUCTURE: - ERR("Not supported type = %d", records[i]->type); - continue; - default: - data_size = zb_zcl_get_data_size(records[j]->type); - if (data_size < 0) { - for (i = 0; i < j; i++) { - free(records[i]->value); - records[i]->value = NULL; - } - for (i = 0; i < count; i++) { - free(records[i]); - records[i] = NULL; - } - free(records); - records = NULL; - - ERR("zb_zcl_get_data_size() Fail(%d)", data_size); - goto EXIT_EVENT_HANDLER; - } - records[j]->value = calloc(data_size, sizeof(unsigned char)); - if (NULL == records[j]->value) { - for (i = 0; i < j; i++) { - free(records[i]->value); - records[i]->value = NULL; - } - for (i = 0; i < count; i++) { - free(records[i]); - records[i] = NULL; - } - free(records); - records = NULL; - - ERR("calloc() Fail(%d)", errno); - goto EXIT_EVENT_HANDLER; - } - if (data_size != 0xFF) { - for (i = 0; i < data_size; i++) { - if (g_variant_iter_loop(data_iter, "(y)", &value)) { - records[j]->value[i] = value; - DBG("value[%d] 0x%02X", i, records[j]->value[i]); - } - } - } - g_variant_iter_free(data_iter); - } - DBG("DataType = 0x%02X Data Size = %d", records[j]->type, data_size); - j++; - } - - ev->data.global_attr_report = calloc(1, sizeof(zb_event_global_attr_report_s)); - if (NULL == ev->data.global_attr_report) { - ERR("Failed to memory allocation !"); - for (j = 0; j < count; j++) { - free(records[j]->value); - records[j]->value = NULL; - if (records[j]) { - free(records[j]); - records[j] = NULL; - } - } - if (records) { - free(records); - records = NULL; - } - goto EXIT_EVENT_HANDLER; - } - - ev->data.global_attr_report->records = records; - ev->data.global_attr_report->count = count; - - container->event_handler(addr16, NULL, ZB_ZCL_GLOBAL_ATTRIBUTE_REPORT_EVENT, ev, - container->user_data); - for (j = 0; j < count; j++) { - if (records[j]->value) { - free(records[j]->value); - records[j]->value = NULL; - } - if (records[j]) { - free(records[j]); - records[j] = NULL; - } - } - if (records) { - free(records); - records = NULL; - } - if (ev->data.global_attr_report) { - free(ev->data.global_attr_report); - ev->data.global_attr_report = NULL; - } - - } else if (!g_strcmp0(signal_name, "status_change_rpt")) { - - zb_nwk_addr addr16; - unsigned char src_ep; - unsigned char status; - unsigned short zone_status; - unsigned short delay; - unsigned char zone_id; - - g_variant_get(parameters, "(qyqyyq)", &addr16, &src_ep, &zone_status, - &status, &zone_id, &delay); - if (0xff == zone_id) { - - ev->data.ias_noti = calloc(1, sizeof(zb_event_ias_noti_s)); - if (!ev->data.ias_noti) { - ERR("Failed to memory allocation !"); - goto EXIT_EVENT_HANDLER; - } - - ev->data.ias_noti->src_ep = src_ep; - ev->data.ias_noti->zone_status = zone_status; - - container->event_handler(addr16, NULL, - ZB_ZCL_IAS_ZONE_STATUS_CHANGE_NOTIFICATION_EVENT, ev, - container->user_data); - - if (ev->data.ias_noti) { - free(ev->data.ias_noti); - ev->data.ias_noti = NULL; - } - - } else { - - ev->data.ias_extended_noti = calloc(1, sizeof(zb_event_ias_extended_noti_s)); - if (!ev->data.ias_extended_noti) { - ERR("Failed to memory allocation !"); - goto EXIT_EVENT_HANDLER; - } - - ev->data.ias_extended_noti->src_ep = src_ep; - ev->data.ias_extended_noti->zone_status = zone_status; - ev->data.ias_extended_noti->status = status; - ev->data.ias_extended_noti->zone_id = zone_id; - ev->data.ias_extended_noti->delay = delay; - - container->event_handler(addr16, NULL, - ZB_ZCL_IAS_ZONE_STATUS_CHANGE_EXTENDED_NOTIFICATION_EVENT, ev, - container->user_data); - - if (ev->data.ias_extended_noti) { - free(ev->data.ias_extended_noti); - ev->data.ias_extended_noti = NULL; - } - - } - } else if (!g_strcmp0(signal_name, "enroll_request")) { - zb_nwk_addr addr16; - unsigned char src_ep; - unsigned short zone_type; - unsigned char mfg_code; - - ev->data.ias_enroll_request = calloc(1, sizeof(zb_event_ias_enroll_request_s)); - if (!ev->data.ias_enroll_request) { - ERR("Failed to memory allocation !"); - goto EXIT_EVENT_HANDLER; - } - - g_variant_get(parameters, "(qyqy)", &addr16, &src_ep, &zone_type, &mfg_code); - ev->data.ias_enroll_request->src_ep = src_ep; - ev->data.ias_enroll_request->zone_type = zone_type; - ev->data.ias_enroll_request->mfg_code = mfg_code; - - container->event_handler(addr16, NULL, ZB_ZCL_IAS_ZONE_ENROLL_REQUEST_EVENT, ev, - container->user_data); - - if (ev->data.ias_enroll_request) { - free(ev->data.ias_enroll_request); - ev->data.ias_enroll_request = NULL; - } - } else - ERR("Can't handle this signal=%s", signal_name); - -EXIT_EVENT_HANDLER: - if (ev) { - free(ev); - ev = NULL; - } - return; -} - -static void _zbl_dbus_unsubscribe_signal(GList *sub_ids) -{ - RET_IF(NULL == gdbus_conn); - RET_IF(NULL == sub_ids); - - while (sub_ids) { - g_dbus_connection_signal_unsubscribe(gdbus_conn, GPOINTER_TO_UINT(sub_ids->data)); - sub_ids = g_list_remove(sub_ids, sub_ids->data); - } - g_list_free(sub_ids); -} - -static int _zbl_dbus_subscribe_signal(zb_zigbee_h handle) -{ - unsigned int id; - struct zbl_zigbee_s* h = handle; - - /* Section 0. Subscribe Manager signal */ - id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_MANAGER_INTERFACE, - "zigbee_state", ZIGBEE_DBUS_OBJPATH, NULL, G_DBUS_CALL_FLAGS_NONE, - _zbl_signal_handler, handle, NULL); - if (0 == id) { - ERR("g_dbus_connection_signal_subscribe(zigbee_state) Fail(%d)", errno); - return ZIGBEE_ERROR_IO_ERROR; - } - h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); - DBG("subscribed for service_enabled signal %d", id); - - /* Section 1. Subscribe ZDO signal */ - id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_SERVICE_INTERFACE, - "child_joined", ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE, - _zbl_signal_handler, h, NULL); - if (0 == id) { - ERR("g_dbus_connection_signal_subscribe(child_rejoined) Fail(%d)\n", errno); - _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids); - h->dbus_sub_ids = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); - DBG("subscribed for child_joined signal %d", id); - - id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_SERVICE_INTERFACE, - "child_rejoined", ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE, - _zbl_signal_handler, h, NULL); - if (0 == id) { - ERR("g_dbus_connection_signal_subscribe(child_rejoined) Fail(%d)\n", errno); - _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids); - h->dbus_sub_ids = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); - DBG("subscribed for child_rejoined signal %d", id); - - id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_SERVICE_INTERFACE, - "child_left", ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE, - _zbl_signal_handler, h, NULL); - if (0 == id) { - ERR("g_dbus_connection_signal_subscribe(child_left) Fail(%d)\n", errno); - _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids); - h->dbus_sub_ids = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); - DBG("subscribed for child_left signal %d", id); - - id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_SERVICE_INTERFACE, - "leave_network_done", ZIGBEE_CONTROL_OBJECT_PATH, NULL, - G_DBUS_CALL_FLAGS_NONE, _zbl_signal_handler, h, NULL); - if (0 == id) { - ERR("g_dbus_connection_signal_subscribe(leave_network_done) Fail(%d)\n", errno); - _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids); - h->dbus_sub_ids = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); - DBG("subscribed for leave_network_done signal %d", id); - - id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_SERVICE_INTERFACE, - "form_network_done", ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE, - _zbl_signal_handler, h, NULL); - if (0 == id) { - ERR("g_dbus_connection_signal_subscribe(form_network_done) Fail(%d)\n", errno); - _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids); - h->dbus_sub_ids = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); - DBG("subscribed for form_network_done signal %d", id); - - /* Section 3. Subscribe ZCL global command */ - id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, - ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "zcl_global_default_response", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE, - _zbl_signal_handler, h, NULL); - if (0 == id) { - ERR("g_dbus_connection_signal_subscribe(zcl_global_default_response) Fail(%d)\n", - errno); - _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids); - h->dbus_sub_ids = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); - DBG("subscribed for zcl_global_default_response signal %d", id); - - id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, - ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "report_attr_handler_rsp", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE, - _zbl_signal_handler, h, NULL); - if (0 == id) { - ERR("g_dbus_connection_signal_subscribe(report_attr_handler_rsp) Fail(%d)\n", - errno); - _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids); - h->dbus_sub_ids = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); - DBG("subscribed for report_attr_handler_rsp signal %d", id); - - /* Section 2. Subscribe ZCL alarm cluster signal */ - id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_ZCL_ALARM_INTERFACE, - "alarm_count", ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE, - _zbl_signal_handler, h, NULL); - if (0 == id) { - ERR("g_dbus_connection_signal_subscribe(alarm_count) Fail(%d)\n", errno); - _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids); - h->dbus_sub_ids = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); - DBG("subscribed for alarm_count signal %d", id); - - /* Section 3. Subscribe ZCL IAS cluster signal */ - id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, - ZIGBEE_ZCL_IAS_ZONE_INTERFACE, "status_change_rpt", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE, - _zbl_signal_handler, h, NULL); - if (0 == id) { - ERR("g_dbus_connection_signal_subscribe(status_change_rpt) Fail(%d)\n", errno); - _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids); - h->dbus_sub_ids = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); - DBG("subscribed for status_change_rpt signal %d", id); - - id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, - ZIGBEE_ZCL_IAS_ZONE_INTERFACE, "enroll_request", ZIGBEE_CONTROL_OBJECT_PATH, NULL, - G_DBUS_CALL_FLAGS_NONE, _zbl_signal_handler, h, NULL); - if (0 == id) { - ERR("g_dbus_connection_signal_subscribe(enroll_request) Fail(%d)\n", errno); - _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids); - h->dbus_sub_ids = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); - DBG("subscribed for enroll_request signal %d", id); - - return ZIGBEE_ERROR_NONE; -} - -static void _zbl_dbus_name_owner_notify(GObject *object, GParamSpec *pspec, - gpointer *user_data) -{ - GDBusProxy *proxy = G_DBUS_PROXY(object); - gchar *name_owner = g_dbus_proxy_get_name_owner(proxy); - zb_zigbee_h handle = (zb_zigbee_h)user_data; - - DBG("Name owner notify [%s]", name_owner); - - if (NULL == name_owner) - zbl_dbus_stop(handle); - - g_free(name_owner); -} - -static void _zbl_request_cleanup(gpointer data) -{ - zbl_req_cb_s *container = data; - RET_IF(NULL == container); - - if (container->tid) { - g_source_remove(container->tid); - DBG("tid=%d removed"); - container->tid = 0; - } - -#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC - _zbl_deregister_global_req(container->handle, container); - if (container->global_cmd) { - free(container->global_cmd); - container->global_cmd = NULL; - } -#endif - - free(container); - container = NULL; -} - -static gboolean _zbl_timeout_cb(gpointer p) -{ - zbl_req_cb_s *container = (zbl_req_cb_s *)p; - - RETVM_IF(NULL == gdbus_conn, G_SOURCE_REMOVE, "gdbus_conn is NULL"); - RETVM_IF(NULL == p, G_SOURCE_REMOVE, "container is NULL"); - RETVM_IF(NULL == container->cb, G_SOURCE_REMOVE, "cb is NULL"); - RETVM_IF(true == container->found, G_SOURCE_REMOVE, "cb was alreay handled"); - - switch (container->cid) { - /* Service */ - case ZBL_SERVICE_FORM_NETWORK: { - zb_form_network_cb cb = container->cb; - cb(0x0000, container->userdata); - } - break; - case ZBL_SERVICE_DISABLE_NETWORK: { - zb_disable_network_cb cb = container->cb; - cb(0x0000, container->userdata); - cb(ZB_ZDP_STATUS_TIMEOUT, container->userdata); - } - break; - /* ZDO except Bind */ - case ZBL_ZDO_NWK_ADDR_REQ: { - zb_zdo_addr_cb cb = container->cb; - cb(ZB_ZDP_STATUS_TIMEOUT, NULL, 0, 0, 0, NULL, container->userdata); - } - break; - case ZBL_ZDO_NWK_ADDR_EXT_REQ: { - zb_zdo_addr_cb cb = container->cb; - cb(ZB_ZDP_STATUS_TIMEOUT, NULL, 0, 0, 0, NULL, container->userdata); - } - break; - case ZBL_ZDO_ACTIVE_EP_REQ: { - zb_zdo_active_ep_cb cb = container->cb; - cb(ZB_ZDP_STATUS_TIMEOUT, 0, 0, NULL, container->userdata); - } - break; - case ZBL_ZDO_SIMPLE_DESC_REQ: { - zb_zdo_simple_desc_cb cb = container->cb; - cb(0, 0, NULL, container->userdata); - } - break; - case ZBL_ZDO_MATCHED_DESCRIPTOR_REQ: { - zb_zdo_match_desc_cb cb = container->cb; - cb(ZB_ZDP_STATUS_TIMEOUT, 0, 0, NULL, container->userdata); - } - break; - case ZBL_ZDO_COMPLEX_DESC_REQ: { - zb_zdo_complex_desc_cb cb = container->cb; - cb(ZB_ZDP_STATUS_TIMEOUT, 0, 0, NULL, container->userdata); - } - break; - case ZBL_ZDO_MGMT_BIND_REQ: { - zb_zdo_mgmt_bind_cb cb = container->cb; - struct zb_zdo_binding_table_s **records = NULL; - - records = calloc(1, sizeof(zb_zdo_binding_table_h)); - if (records) - records[0] = calloc(1, sizeof(struct zb_zdo_binding_table_s)); - - cb(ZB_ZDP_STATUS_TIMEOUT, 0, 0, 0, (void **)records, container->userdata); - - if (records && records[0]) { - free(records[0]); - records[0] = NULL; - } - if (records) { - free(records); - records = NULL; - } - } - break; - case ZBL_ZDO_MGMT_LQI_REQ: { - zb_zdo_mgmt_lqi_cb cb = container->cb; - struct zb_zdo_neighbor_table_desc_s **records = NULL; - - records = calloc(1, sizeof(zb_zdo_neighbor_table_desc_h)); - if (records) - records[0] = calloc(1, sizeof(struct zb_zdo_neighbor_table_desc_s)); - - cb(ZB_ZDP_STATUS_TIMEOUT, 0, 0, 0, (void **)records, container->userdata); - - if (records && records[0]) { - free(records[0]); - records[0] = NULL; - } - if (records) { - free(records); - records = NULL; - } - } - break; - case ZBL_ZDO_MGMT_RTG_REQ: { - zb_zdo_mgmt_rtg_cb cb = container->cb; - struct zb_zdo_routing_table_s **records = NULL; - - records = calloc(1, sizeof(zb_zdo_routing_table_h)); - if (records) - records[0] = calloc(1, sizeof(struct zb_zdo_routing_table_s)); - - cb(ZB_ZDP_STATUS_TIMEOUT, 0, 0, 0, (void **)records, container->userdata); - - if (records && records[0]) { - free(records[0]); - records[0] = NULL; - } - if (records) { - free(records); - records = NULL; - } - } - break; - case ZBL_ZDO_MGMT_NWK_DISC_REQ: { - zb_zdo_mgmt_nwk_disc_cb cb = container->cb; - struct zb_zdo_network_list_record_s **records = NULL; - records = calloc(1, sizeof(zb_zdo_network_list_record_h)); - if (records) - records[0] = calloc(1, sizeof(struct zb_zdo_network_list_record_s)); - - cb(0, 0, 0, 0, (void **)records, container->userdata); - - if (records && records[0]) { - free(records[0]); - records[0] = NULL; - } - if (records) { - free(records); - records = NULL; - } - } - break; - case ZBL_ZDO_MGMT_PERMIT_JOIN_REQ: { - zb_zdo_mgmt_permit_joining_cb cb = container->cb; - cb(ZB_ZDP_STATUS_TIMEOUT, container->userdata); - } - break; - case ZBL_ZDO_MGMT_LEAVE_REQ: { - zb_zdo_mgmt_leave_cb cb = container->cb; - cb(ZB_ZDP_STATUS_TIMEOUT, container->userdata); - } - break; - case ZBL_ZDO_NODE_DESC_REQ: { - zb_zdo_node_desc_cb cb = container->cb; - cb(ZB_ZDP_STATUS_TIMEOUT, 0, NULL, container->userdata); - } - break; - case ZBL_ZDO_POWER_DESC_REQ: { - zb_zdo_power_desc_cb cb = container->cb; - cb(0, 0, NULL, container->userdata); - } - break; - case ZBL_ZDO_USER_DESC_REQ: { - zb_zdo_user_desc_cb cb = container->cb; - cb(ZB_ZDP_STATUS_TIMEOUT, 0, 0, NULL, container->userdata); - break; - } - case ZBL_ZDO_USER_DESC_SET_REQ: { - zb_zdo_user_desc_conf_cb cb = container->cb; - cb(ZB_ZDP_STATUS_TIMEOUT, container->userdata); - } - break; - /* ZDO Bind */ - case ZBL_ZDO_BIND_REQ: { - zb_zdo_bind_cb cb = container->cb; - cb(ZB_ZDP_STATUS_TIMEOUT, container->userdata); - } - break; - case ZBL_ZDO_UNBIND_REQ: { - zb_zdo_unbind_cb cb = container->cb; - cb(ZB_ZDP_STATUS_TIMEOUT, container->userdata); - } - break; - /* Custom */ - case ZBL_CUSTOM_APS_SEND_REQ: { - zb_aps_send_cb cb = container->cb; - cb(0, 0, 0, 0, 0, 0, NULL, container->userdata); - } break; - case ZBL_CUSTOM_ZCL_SEND_REQ: { - zb_zcl_send_cb cb = container->cb; - cb(0, 0, 0, 0, 0, 0, NULL, container->userdata); - } - break; - case ZBL_CUSTOM_LOCAL_SEND_REQ: { - zb_send_to_local_cb cb = container->cb; - cb(0, NULL, container->userdata); - } - break; - /* ZCL Global */ - case ZBL_ZCL_GLOBAL_READ_ATTRIBUTE_REQ: { - zb_zcl_global_attr_read_cb cb = container->cb; - cb(0, 0, 0, NULL, 0, container->userdata); - } - break; - case ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_REQ: { - zb_zcl_global_attr_write_cb cb = container->cb; - cb(0, 0, 0, NULL, 0, container->userdata); - } - break; - case ZBL_ZCL_GLOBAL_WRITE_CONFIGURE_REPORTING_REQ: { - zb_zcl_global_config_report_write_cb cb = container->cb; - cb(0, 0, 0, NULL, 0, container->userdata); - } - break; - case ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_REQ: { - zb_zcl_global_attr_discover_cb cb = container->cb; - cb(0, 0, 0, 0, NULL, 0, container->userdata); - } - break; - case ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_STRUCTURED_REQ: { - zb_zcl_global_attr_write_cb cb = container->cb; - cb(0, 0, 0, NULL, 0, container->userdata); - } - break; - case ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_RECEIVED_REQ: { - zb_zcl_global_discover_cmds_cb cb = container->cb; - cb(0, 0, 0, 0, NULL, 0, container->userdata); - } - break; - case ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_GENERATED_REQ: { - zb_zcl_global_discover_cmds_cb cb = container->cb; - cb(0, 0, 0, 0, NULL, 0, container->userdata); - } - break; - case ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_EXTENDED_REQ: { - zb_zcl_global_attr_extended_discover_cb cb = container->cb; - cb(0, 0, 0, 0, NULL, 0, container->userdata); - } - break; - case ZBL_ZCL_GLOBAL_READ_CONFIGURE_REPORTING_REQ: { - zb_zcl_global_config_report_read_cb cb = container->cb; - cb(0, 0, 0, NULL, 0, container->userdata); - } - break; - /* ZCL Alarm */ - case ZBL_ZCL_ALARM_GET_ALARM_REQ: { - zb_zcl_alarm_get_alarm_cb cb = container->cb; - cb(ZB_ZCL_STATUS_TIMEOUT, 0, ZB_ZCL_STATUS_UNSUP_CLUSTER_COMMAND, - 0, 0, 0, container->userdata); - } - break; - /* ZCL Doorlock */ - case ZBL_ZCL_DOORLOCK_LOCK_STATE: { - zb_form_network_cb cb = container->cb; - cb(0x0000, container->userdata); - } - break; - /* ZCL Fanmode */ - case ZBL_ZCL_FANMODE_FAN_MODE_STATE: { - zb_form_network_cb cb = container->cb; - cb(0x0000, container->userdata); - } - break; - /* ZCL Group */ - case ZBL_ZCL_GROUP_ADD_GROUP_REQ: { - zb_zcl_group_add_group_cb cb = container->cb; - cb(0, 0, 0, 0, container->userdata); - } - break; - case ZBL_ZCL_GROUP_VIEW_GROUP_REQ: { - zb_zcl_group_view_group_cb cb = container->cb; - cb(0, 0, 0, 0, NULL, container->userdata); - } - break; - case ZBL_ZCL_GROUP_GET_GROUP_MEMBERSHIP_REQ: { - zb_zcl_group_get_group_membership_cb cb = container->cb; - cb(0, 0, 0, 0, NULL, container->userdata); - } - break; - case ZBL_ZCL_GROUP_REMOVE_GROUP_REQ: { - zb_zcl_group_remove_group_cb cb = container->cb; - cb(0, 0, 0, 0, container->userdata); - } - break; - /* ZCL Identify */ - case ZBL_ZCL_IDENTIFY_QUERY_REQ: { - zb_zcl_identify_query_cb cb = container->cb; - cb(0, 0, container->userdata); - } - break; - /* ZCL On/Off */ - case ZBL_ZCL_ON_OFF_GET_ON_OFF_STATE: { - zb_form_network_cb cb = container->cb; - cb(0x0000, container->userdata); - } - break; - /* ZCL Pollcontrol */ - case ZBL_ZCL_POLLCONTROL_SET_POLL_INTERVAL_REQ: { - zb_zcl_pollctrl_check_in_cb cb = container->cb; - cb(0, 0, container->userdata); - } - break; - /* ZCL Scene */ - case ZBL_ZCL_SCENE_ADD_SCENE_REQ: { - zb_zcl_scene_add_scene_cb cb = container->cb; - cb(0, 0, 0, 0, 0, container->userdata); - } - break; - case ZBL_ZCL_SCENE_VIEW_SCENE_REQ: { - zb_zcl_scene_view_scene_cb cb = container->cb; - cb(0, 0, 0, 0, 0, 0, NULL, NULL, 0, container->userdata); - } - break; - case ZBL_ZCL_SCENE_REMOVE_SCENE_REQ: { - zb_zcl_scene_remove_scene_cb cb = container->cb; - cb(0, 0, 0, 0, 0, container->userdata); - } - break; - case ZBL_ZCL_SCENE_STORE_SCENE_REQ: { - zb_zcl_scene_store_scene_cb cb = container->cb; - cb(0, 0, 0, 0, 0, container->userdata); - } - break; - case ZBL_ZCL_SCENE_REMOVE_ALL_SCENE_REQ: { - zb_zcl_scene_remove_all_scene_cb cb = container->cb; - cb(0, 0, 0, 0, container->userdata); - } - break; - case ZBL_ZCL_SCENE_GET_SCENE_MEMBERSHIP_REQ: { - zb_zcl_scene_get_scene_membership_cb cb = container->cb; - cb(0, 0, 0, 0, 0, 0, NULL, container->userdata); - } - break; - /* ZCL Thermostat */ - case ZBL_ZCL_THERMOSTAT_GET_LOCAL_TEMP: { - zb_form_network_cb cb = container->cb; - cb(0x0000, container->userdata); - } - break; - default: - ERR("Unhandled cid = %d", container->cid); - } - - container->tid = 0; - g_dbus_connection_signal_unsubscribe(gdbus_conn, container->sid); - container->sid = 0; - - return G_SOURCE_REMOVE; -} - -static void _zbl_response_cb(GDBusConnection *connection, - const gchar *sender_name, const gchar *object_path, const gchar *interface_name, - const gchar *signal_name, GVariant *parameters, gpointer user_data) -{ - zbl_req_cb_s *container = user_data; - RETM_IF(NULL == container, "container is null"); - RETM_IF(NULL == container->cb, "cb is NULL"); - - container->found = true; - g_dbus_connection_signal_unsubscribe(gdbus_conn, container->sid); - - switch (container->cid) { - /* Service */ - case ZBL_SERVICE_FORM_NETWORK: { - zb_form_network_cb cb = container->cb; - zb_nwk_addr panid; - g_variant_get(parameters, "(q)", &panid); - cb(panid, container->userdata); - } - break; - case ZBL_SERVICE_DISABLE_NETWORK: { - zb_disable_network_cb cb = container->cb; - unsigned char ret = ZB_ZDP_STATUS_SUCCESS; - g_variant_get(parameters, "(y)", &ret); - cb(ret, container->userdata); - } - break; - /* ZDO except Bind */ - case ZBL_ZDO_NWK_ADDR_REQ: { - zb_zdo_addr_cb cb = container->cb; - - int j = 0; - zb_nwk_addr addr16; - zb_ieee_addr addr64; - unsigned char status; - unsigned char num; - unsigned char start_idx; - unsigned char value; - GVariantIter *mac_iter = NULL; - - g_variant_get(parameters, "(ya(y)qyy)", &status, &mac_iter, &addr16, &num, &start_idx); - RETM_IF(NULL == mac_iter, "Invalid parameter !"); - - while (g_variant_iter_loop(mac_iter, "(y)", &value)) { - addr64[j] = value; - j++; - } - g_variant_iter_free(mac_iter); - - cb(status, addr64, addr16, num, start_idx, NULL, container->userdata); - } - break; - case ZBL_ZDO_NWK_ADDR_EXT_REQ: { - zb_zdo_addr_cb cb = container->cb; - - int j = 0; - zb_nwk_addr addr16; - zb_ieee_addr addr64; - unsigned char status; - unsigned char num; - unsigned char start_idx; - unsigned char value; - GVariantIter *mac_iter = NULL; - GVariantIter *assoc_iter = NULL; - - g_variant_get(parameters, "(ya(y)qyyaq)", &status, &mac_iter, - &addr16, &num, &start_idx, &assoc_iter); - RETM_IF(NULL == mac_iter, "Invalid parameter !"); - - while (g_variant_iter_loop(mac_iter, "(y)", &value)) { - addr64[j] = value; - j++; - } - g_variant_iter_free(mac_iter); - if (NULL != assoc_iter) - g_variant_iter_free(assoc_iter); - - cb(status, addr64, addr16, num, start_idx, NULL, container->userdata); - } - break; - case ZBL_ZDO_ACTIVE_EP_REQ: { - zb_zdo_active_ep_cb cb = container->cb; - - int j = 0; - zb_nwk_addr addr16; - unsigned char status; - unsigned char count; - unsigned char value; - GVariantIter *ep_iter = NULL; - unsigned char *ep_list; - - g_variant_get(parameters, "(yqa(y)y)", &status, &addr16, &ep_iter, &count); - RETM_IF(NULL == ep_iter, "Invalid parameter !"); - - ep_list = calloc(count+1, sizeof(unsigned char)); - RETM_IF(NULL == ep_list, "calloc() Fail(%d)", errno); - - while (g_variant_iter_loop(ep_iter, "(y)", &value)) { - ep_list[j] = value; - j++; - } - g_variant_iter_free(ep_iter); - - cb(status, addr16, count, ep_list, container->userdata); - - if (ep_list) { - free(ep_list); - ep_list = NULL; - } - } - break; - case ZBL_ZDO_SIMPLE_DESC_REQ: { - zb_zdo_simple_desc_cb cb = container->cb; - - int j = 0; - int count; - unsigned short addr16; - unsigned short value; - GVariantIter *in_iter = NULL; - GVariantIter *out_iter = NULL; - struct zb_zdo_simple_desc_s * records; - - records = calloc(1, sizeof(struct zb_zdo_simple_desc_s)); - RETM_IF(NULL == records, "calloc() Fail(%d)", errno); - - container->found = true; - - g_variant_get(parameters, "(qiyyqqyyaqaq)", &addr16, &count, - &records->device_ver, - &records->ep, &records->profileid, &records->deviceid, - &records->num_of_in_clusters, &records->num_of_out_clusters, - &in_iter, &out_iter); - if (NULL == in_iter || NULL == out_iter) { - ERR("Invalid parameter !"); - free(records); - return; - } -#if 0 - records->in_clusters = calloc(records->num_of_in_clusters, sizeof(unsigned short)); - if (NULL == records->in_clusters) { - ERR("calloc() Fail(%d)", errno); - g_variant_iter_free(in_iter); - g_variant_iter_free(out_iter); - return; - } - records->out_clusters = calloc(records->num_of_out_clusters, sizeof(unsigned short)); - if (NULL == records->out_clusters) { - ERR("calloc() Fail(%d)", errno); - free(records->in_clusters); - g_variant_iter_free(in_iter); - g_variant_iter_free(out_iter); - return; - } -#endif - while (g_variant_iter_loop(in_iter, "q", &value)) { - records->in_clusters[j] = value; - j++; - } - g_variant_iter_free(in_iter); - - j = 0; - while (g_variant_iter_loop(out_iter, "q", &value)) { - records->out_clusters[j] = value; - j++; - } - g_variant_iter_free(out_iter); - - DBG("addr16=0x%x, count=%d, records->ep=%d, records->deviceid=0x%x", - addr16, count, records->ep, records->deviceid); - for (j = 0; j < records->num_of_in_clusters; j++) - DBG("in_clusters[%d] = 0x%x", j, records->in_clusters[j]); - for (j = 0; j < records->num_of_out_clusters; j++) - DBG("out_clusters[%d] = 0x%x", j, records->out_clusters[j]); - - cb(addr16, count, records, container->userdata); - - if (records) { - free(records); - records = NULL; - } - } - break; - case ZBL_ZDO_MATCHED_DESCRIPTOR_REQ: { - zb_zdo_match_desc_cb cb = container->cb; - - int j = 0; - int match_len; - zb_nwk_addr addr16; - unsigned char value; - unsigned char status; - GVariantIter *ml_iter = NULL; - unsigned char *match_list = NULL; - g_variant_get(parameters, "(yqya(y))", &status, &addr16, &value, &ml_iter); - match_len = value; - - RETM_IF(NULL == ml_iter, "Invalid parameter !"); - - if (match_len > 0) { - match_list = calloc(match_len+1, sizeof(unsigned char)); - RETM_IF(NULL == match_list, "calloc() Fail(%d)", errno); - while (g_variant_iter_loop(ml_iter, "(y)", &value)) { - match_list[j] = value; - DBG("match_list[i]=%d", j, match_list[j]); - j++; - } - } - - DBG("Match count : [%d]", match_len); - DBG("Match list : [%p]", match_list); - - cb(status, addr16, match_len, match_list, container->userdata); - - if (match_list) { - free(match_list); - match_list = NULL; - } - } - break; - case ZBL_ZDO_NODE_DESC_REQ: { - zb_zdo_node_desc_cb cb = container->cb; - - zb_nwk_addr addr16; - unsigned char status; - struct zb_zdo_node_descriptor_s *desc; - - desc = calloc(1, sizeof(struct zb_zdo_node_descriptor_s)); - RETM_IF(NULL == desc, "calloc() Fail(%d)", errno); - - container->found = true; - - g_variant_get(parameters, "(yqyyyyyyqyqqqy)", &status, &addr16, - &desc->logical_type, &desc->complex_desciptor_available, - &desc->user_descriptor_available, &desc->aps_flags, &desc->frequency_band, - &desc->mac_capability_flags, &desc->manufacturer_code, &desc->maximum_buffer_size, - &desc->maximum_incoming_transfer_size, &desc->server_mask, - &desc->maximum_outgoing_transfer_size, &desc->descriptor_capability_field); - - cb(status, addr16, desc, container->userdata); - - if (desc) { - free(desc); - desc = NULL; - } - - } - break; - case ZBL_ZDO_POWER_DESC_REQ: { - zb_zdo_power_desc_cb cb = container->cb; - - zb_nwk_addr addr16; - unsigned char status; - struct zb_zdo_node_power_descriptor_s *desc; - - desc = calloc(1, sizeof(struct zb_zdo_node_power_descriptor_s)); - RETM_IF(NULL == desc, "calloc() Fail(%d)", errno); - - g_variant_get(parameters, "(yqyyyy)", &status, &addr16, - &desc->current_power_mode, &desc->available_power_sources, - &desc->current_power_source, &desc->current_power_source_level); - - cb(status, addr16, desc, container->userdata); - - if (desc) { - free(desc); - desc = NULL; - } - } - break; - case ZBL_ZDO_COMPLEX_DESC_REQ: { - zb_zdo_complex_desc_cb cb = container->cb; - - int length; - zb_nwk_addr addr16; - unsigned char j = 0; - unsigned char value; - unsigned char status; - GVariantIter *comp_iter = NULL; - unsigned char *complex_desc = NULL; - - g_variant_get(parameters, "(yqya(y))", &status, &addr16, &length, &comp_iter); - RETM_IF(NULL == comp_iter, "Invalid parameter !"); - - if (length > 0) { - complex_desc = calloc(length, sizeof(char)); - if (NULL == complex_desc) { - g_variant_iter_free(comp_iter); - ERR("calloc() Fail(%d)", errno); - return; - } - - while (g_variant_iter_loop(comp_iter, "(y)", &value)) { - complex_desc[j] = value; - j++; - } - g_variant_iter_free(comp_iter); - } - - cb(status, addr16, length, complex_desc, container->userdata); - - if (complex_desc) { - free(complex_desc); - complex_desc = NULL; - } - } - break; - case ZBL_ZDO_USER_DESC_REQ: { - zb_zdo_user_desc_cb cb = container->cb; - - int length; - zb_nwk_addr addr16; - unsigned char j = 0; - unsigned char value; - unsigned char status; - GVariantIter *comp_iter = NULL; - unsigned char *complex_desc = NULL; - - g_variant_get(parameters, "(yqya(y))", &status, &addr16, &length, &comp_iter); - RETM_IF(NULL == comp_iter, "Invalid parameter !"); - - if (length > 0) { - complex_desc = calloc(length, sizeof(char)); - if (NULL == complex_desc) { - g_variant_iter_free(comp_iter); - ERR("calloc() Fail(%d)", errno); - return; - } - - while (g_variant_iter_loop(comp_iter, "(y)", &value)) { - complex_desc[j] = value; - j++; - } - g_variant_iter_free(comp_iter); - } - - cb(status, addr16, length, complex_desc, container->userdata); - - if (complex_desc) { - free(complex_desc); - complex_desc = NULL; - } - break; - } - case ZBL_ZDO_USER_DESC_SET_REQ: { - zb_zdo_user_desc_conf_cb cb = container->cb; - unsigned char status; - g_variant_get(parameters, "(y)", &status); - cb(status, container->userdata); - } - break; - case ZBL_ZDO_MGMT_BIND_REQ: { - zb_zdo_mgmt_bind_cb cb = container->cb; - - unsigned char status; - unsigned char value; - - int i = 0; - int j = 0; - unsigned char binding_table_enteries; - unsigned char binding_table_list_count; - unsigned char start_index; - unsigned short dst_addr16 = 0; - unsigned char dst_ep = 0; - - GVariantIter *mac_iter = NULL; - GVariantIter *rsp_iter = NULL; - GVariantIter *destep_iter = NULL; - struct zb_zdo_binding_table_s **records = NULL; - - g_variant_get(parameters, "(yyyya(ayyqyqayy))", &status, - &binding_table_enteries, &start_index, - &binding_table_list_count, &rsp_iter); - RETM_IF(NULL == rsp_iter, "Invalid parameter !"); - - if (binding_table_list_count > 0) { - records = calloc(binding_table_list_count, sizeof(zb_zdo_binding_table_h)); - RETM_IF(NULL == records, "calloc() Fail(%d)", errno); - for (i = 0; i < binding_table_list_count; i++) { - records[i] = calloc(binding_table_list_count, sizeof(struct zb_zdo_binding_table_s)); - if (NULL == records[i]) { - g_variant_iter_free(rsp_iter); - ERR("calloc() Fail(%d)", errno); - goto MGMT_NWK_BIND_REQ_OUT; - } - } - } - - for (i = 0; i < binding_table_list_count; i++) { - g_variant_iter_loop(rsp_iter, "(ayyqyqayy)", &mac_iter, - &records[i]->src_ep, &records[i]->clusterid, - &records[i]->dst_addr_mode, &dst_addr16, - &destep_iter, &dst_ep); - if (NULL == mac_iter) { - ERR("Invalid parameter !"); - goto MGMT_NWK_BIND_REQ_OUT; - } - if (NULL == destep_iter) { - ERR("Invalid parameter !"); - goto MGMT_NWK_BIND_REQ_OUT; - } - - for (j = 0; j < 8; j++) { - g_variant_iter_loop(mac_iter, "y", &value); - records[i]->src_addr64[j] = value; - } - g_variant_iter_free(mac_iter); - - if (0x03 == records[i]->dst_addr_mode) { - for (j = 0; j < 8; j++) { - g_variant_iter_loop(destep_iter, "y", &value); - records[i]->dst_addr64[j] = value; - } - g_variant_iter_free(destep_iter); - - records[i]->dst_ep = dst_ep; - DBG("Destination MAC Addr : %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", - records[i]->dst_addr64[7], records[i]->dst_addr64[6], - records[i]->dst_addr64[5], records[i]->dst_addr64[4], - records[i]->dst_addr64[3], records[i]->dst_addr64[2], - records[i]->dst_addr64[1], records[i]->dst_addr64[0]); - - } else if (0x01 == records[i]->dst_addr_mode) { - records[i]->dst_addr16 = dst_addr16; - } - } - g_variant_iter_free(rsp_iter); - - cb(status, binding_table_enteries, start_index, binding_table_list_count, - (void **)records, container->userdata); - -MGMT_NWK_BIND_REQ_OUT: - for (i = 0; i < binding_table_list_count; i++) { - if (records[i]) { - free(records[i]); - records[i] = NULL; - } - } - free(records); - records = NULL; - } - break; - case ZBL_ZDO_MGMT_LQI_REQ: { - zb_zdo_mgmt_lqi_cb cb = container->cb; - - int i = 0; - int j = 0; - unsigned char value; - unsigned char status; - unsigned char start_index; - unsigned char neighbor_table_enteries; - unsigned char neighbor_table_list_count; - - GVariantIter *resp_iter = NULL; - GVariantIter *mac_iter = NULL; - GVariantIter *mac_iter1 = NULL; - struct zb_zdo_neighbor_table_desc_s **records = NULL; - - g_variant_get(parameters, "(yyyya(ayayyqyyyyy))", &status, &neighbor_table_enteries, - &start_index, &neighbor_table_list_count, &resp_iter); - RETM_IF(NULL == resp_iter, "Invalid parameter !"); - - if (neighbor_table_list_count > 0) { - records = calloc(neighbor_table_list_count, sizeof(zb_zdo_neighbor_table_desc_h)); - RETM_IF(NULL == records, "calloc() Fail(%d)", errno); - for (i = 0; i < neighbor_table_list_count; i++) { - records[i] = calloc(1, sizeof(struct zb_zdo_neighbor_table_desc_s)); - if (NULL == records[i]) { - ERR("calloc() Fail(%d)", errno); - goto MGMT_LQI_REQ_OUT; - } - } - } - for (i = 0; i < neighbor_table_list_count; i++) { - g_variant_iter_loop(resp_iter, "(ayayyqyyyyy)", - &mac_iter, &mac_iter1, - &records[i]->device_type, &records[i]->addr16, - &records[i]->rx_on_when_idle, &records[i]->relationship, - &records[i]->permit_joining, &records[i]->depth, - &records[i]->lqi); - if (NULL == mac_iter || NULL == mac_iter1) { - ERR("Invalid parameter !"); - goto MGMT_LQI_REQ_OUT; - } - - for (j = 0; j < 8; j++) { - g_variant_iter_loop(mac_iter, "y", &value); - records[i]->extended_pan_id[j] = value; - g_variant_iter_loop(mac_iter1, "y", &value); - records[i]->addr64[j] = value; - } - g_variant_iter_free(mac_iter); - g_variant_iter_free(mac_iter1); - - DBG("ext PAN ID = %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", - records[i]->extended_pan_id[0], records[i]->extended_pan_id[1], - records[i]->extended_pan_id[2], records[i]->extended_pan_id[3], - records[i]->extended_pan_id[4], records[i]->extended_pan_id[5], - records[i]->extended_pan_id[6], records[i]->extended_pan_id[7]); - - DBG("IEEE address = %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", - records[i]->addr64[0], records[i]->addr64[1], records[i]->addr64[2], - records[i]->addr64[3], records[i]->addr64[4], records[i]->addr64[5], - records[i]->addr64[6], records[i]->addr64[7]); - } - g_variant_iter_free(resp_iter); - - cb(status, neighbor_table_enteries, start_index, neighbor_table_list_count, - (void **)records, container->userdata); - -MGMT_LQI_REQ_OUT: - if (records) { - for (i = 0; i < neighbor_table_list_count; i++) { - if (records[i]) { - free(records[i]); - records[i] = NULL; - } - } - free(records); - records = NULL; - } - } - break; - case ZBL_ZDO_MGMT_RTG_REQ: { - zb_zdo_mgmt_rtg_cb cb = container->cb; - - int i; - unsigned char status; - unsigned char start_index; - unsigned char routing_table_enteries; - unsigned char routing_table_list_count; - - GVariantIter *rsp_iter = NULL; - struct zb_zdo_routing_table_s **records = NULL; - - g_variant_get(parameters, "(yyyya(qyyyyq))", &status, &routing_table_enteries, - &start_index, &routing_table_list_count, &rsp_iter); - RETM_IF(NULL == rsp_iter, "Invalid parameter !"); - - if (routing_table_list_count > 0) { - records = calloc(routing_table_list_count, sizeof(zb_zdo_routing_table_h)); - RETM_IF(NULL == records, "calloc() Fail(%d)", errno); - for (i = 0; i < routing_table_list_count; i++) { - records[i] = calloc(1, sizeof(struct zb_zdo_routing_table_s)); - if (NULL == records[i]) { - ERR("calloc() Fail(%d)", errno); - goto MGMT_NWK_RTG_REQ_OUT; - } - } - } - - for (i = 0; i < routing_table_list_count; i++) { - g_variant_iter_loop(rsp_iter, "(qyyyyq)", &records[i]->dst_addr, - &records[i]->status, &records[i]->memory_constrained, - &records[i]->route_record_required, - &records[i]->many_to_one, &records[i]->next_hop_addr); - } - g_variant_iter_free(rsp_iter); - - cb(status, routing_table_enteries, start_index, routing_table_list_count, - (void **)records, container->userdata); - -MGMT_NWK_RTG_REQ_OUT: - for (i = 0; i < routing_table_list_count; i++) { - if (records[i]) { - free(records[i]); - records[i] = NULL; - } - } - free(records); - records = NULL; - } - break; - case ZBL_ZDO_MGMT_NWK_DISC_REQ: { - zb_zdo_mgmt_nwk_disc_cb cb = container->cb; - int i = 0; - int j = 0; - unsigned char value; - unsigned char status = 0; - unsigned char nwk_count = 0; - unsigned char start_index = 0; - unsigned char nwk_list_count = 0; - - GVariantIter *mac_iter = NULL; - GVariantIter *resp_iter = NULL; - - DBG("_zbl_mgmt_nwk_disc_req_cb()"); - - g_variant_get(parameters, "(yyyya(ayyyyyyy))", &status, &nwk_count, - &start_index, &nwk_list_count, &resp_iter); - RETM_IF(NULL == resp_iter, "Invalid parameter !"); - - struct zb_zdo_network_list_record_s **records = NULL; - - if (!status) { - if (nwk_list_count > 0) { - records = calloc(nwk_list_count, sizeof(zb_zdo_network_list_record_h)); - RETM_IF(NULL == records, "calloc() Fail(%d)", errno); - for (i = 0; i < nwk_list_count; i++) { - records[i] = calloc(1, sizeof(struct zb_zdo_network_list_record_s)); - if (NULL == records[i]) { - ERR("calloc() Fail(%d)", errno); - goto MGMT_NWK_DISC_REQ_OUT; - } - } - } - for (i = 0; i < nwk_list_count; i++) { - g_variant_iter_loop(resp_iter, "(ayyyyyyy)", - &mac_iter, &records[i]->logical_channel, - &records[i]->stack_profile, &records[i]->zigbee_version, - &records[i]->beacon_order, - &records[i]->superframe_order, &records[i]->permit_joining); - if (NULL == mac_iter) { - ERR("Invalid parameter !"); - goto MGMT_NWK_DISC_REQ_OUT; - } - - for (j = 0; j < 8; j++) { - g_variant_iter_loop(mac_iter, "y", &value); - records[i]->extended_pan_id[j] = value; - } - g_variant_iter_free(mac_iter); - } - g_variant_iter_free(resp_iter); - } - - cb(status, nwk_count, start_index, nwk_list_count, - (void **)records, container->userdata); - -MGMT_NWK_DISC_REQ_OUT: - if (records) { - for (i = 0; i < nwk_list_count; i++) { - if (records[i]) { - free(records[i]); - records[i] = NULL; - } - } - free(records); - records = NULL; - } - } - break; - case ZBL_ZDO_MGMT_PERMIT_JOIN_REQ: { - zb_zdo_mgmt_permit_joining_cb cb = container->cb; - unsigned char status; - g_variant_get(parameters, "(y)", &status); - cb(status, container->userdata); - } - break; - case ZBL_ZDO_MGMT_LEAVE_REQ: { - zb_zdo_mgmt_leave_cb cb = container->cb; - unsigned char status; - g_variant_get(parameters, "(y)", &status); - cb(status, container->userdata); - } - break; - /* ZDO Bind */ - case ZBL_ZDO_BIND_REQ: { - zb_zdo_bind_cb cb = container->cb; - unsigned char status; - g_variant_get(parameters, "(y)", &status); - cb(status, container->userdata); - } - break; - case ZBL_ZDO_UNBIND_REQ: { - zb_zdo_unbind_cb cb = container->cb; - unsigned char status; - g_variant_get(parameters, "(y)", &status); - cb(status, container->userdata); - } - break; - /* Custom */ - case ZBL_CUSTOM_APS_SEND_REQ: { - zb_aps_send_cb cb = container->cb; - - unsigned short addr16; - unsigned char src_ep; - unsigned char dst_ep; - unsigned short clusterid; - unsigned short profileid; - unsigned short payload_len = 0; - unsigned char *payload = NULL; - - unsigned char value; - GVariantIter *payload_iter = NULL; - int i = 0; - - g_variant_get(parameters, "(qyyqqqa(y))", &addr16, &src_ep, &dst_ep, - &clusterid, &profileid, &payload_len, &payload_iter); - RETM_IF(NULL == payload_iter, "Invalid parameter !"); - - if (payload_len > 0) { - payload = calloc(payload_len+1, sizeof(unsigned char)); - if (!payload) { - ERR("calloc() Fail(%d)", errno); - goto ZBL_CUSTOM_APS_SEND_REQ_OUT; - } - while (g_variant_iter_loop(payload_iter, "(y)", &value)) - payload[i++] = value; - } - - cb(addr16, src_ep, dst_ep, clusterid, profileid, payload_len, payload, - container->userdata); -ZBL_CUSTOM_APS_SEND_REQ_OUT: - g_variant_iter_free(payload_iter); - if (payload) { - free(payload); - payload = NULL; - } - } - break; - case ZBL_CUSTOM_ZCL_SEND_REQ: { - zb_zcl_send_cb cb = container->cb; - - unsigned short addr16; - unsigned char src_ep; - unsigned char dst_ep; - unsigned short clusterid; - unsigned short profileid; - unsigned short payload_len = 0; - unsigned char *payload = NULL; - - unsigned char value; - GVariantIter *payload_iter = NULL; - int i = 0; - - g_variant_get(parameters, "(qyyqqqa(y))", &addr16, &src_ep, &dst_ep, - &clusterid, &profileid, &payload_len, &payload_iter); - RETM_IF(NULL == payload_iter, "Invalid parameter !"); - - if (payload_len > 0) { - payload = calloc(payload_len + 1, sizeof(unsigned char)); - if (!payload) { - ERR("calloc() Fail(%d)", errno); - goto ZBL_CUSTOM_ZCL_SEND_REQ_OUT; - } - while (g_variant_iter_loop(payload_iter, "(y)", &value)) - payload[i++] = value; - } - - cb(addr16, src_ep, dst_ep, clusterid, profileid, payload_len, payload, - container->userdata); -ZBL_CUSTOM_ZCL_SEND_REQ_OUT: - g_variant_iter_free(payload_iter); - if (payload) { - free(payload); - payload = NULL; - } - } - break; - case ZBL_CUSTOM_LOCAL_SEND_REQ: { - zb_send_to_local_cb cb = container->cb; - - unsigned char *data = NULL; - unsigned short length = 0; - unsigned char value; - GVariantIter *payload_iter = NULL; - int i = 0; - - g_variant_get(parameters, "(qa(y))", &length, &payload_iter); - RETM_IF(NULL == payload_iter, "Invalid parameter !"); - - if (length > 0) { - data = calloc(length, sizeof(unsigned char)); - if (!data) { - ERR("calloc() Fail(%d)", errno); - goto ZBL_CUSTOM_LOCAL_SEND_REQ_OUT; - } - - while (g_variant_iter_loop(payload_iter, "(y)", &value)) - data[i++] = value; - } - - cb(length, data, container->userdata); -ZBL_CUSTOM_LOCAL_SEND_REQ_OUT: - g_variant_iter_free(payload_iter); - if (data) { - free(data); - data = NULL; - } - } - break; - /* ZCL Global */ - case ZBL_ZCL_GLOBAL_READ_ATTRIBUTE_REQ: { - zb_zcl_global_attr_read_cb cb = container->cb; - - int j = 0; - int isString; - unsigned char value; - - zb_nwk_addr addr16; - unsigned char ep; - unsigned short attr_id; - unsigned short clusterid; - unsigned char status; - unsigned char type; - unsigned short count; - unsigned char attr_value[128]; - - GVariantIter *iter = NULL; - struct read_attribute_status_record_s *records = NULL; - - g_variant_get(parameters, "(qya(y)qqyyqi)", - &addr16, &ep, &iter, &attr_id, &clusterid, &status, &type, &count, &isString); - RETM_IF(NULL == iter, "Invalid parameter !"); - - if (!isString) { - while (g_variant_iter_loop(iter, "(y)", &value)) { - attr_value[j] = value; - DBG("attr_value[%d] = 0x%02X", j, value); - j++; - } - g_variant_iter_free(iter); - } else { - while (g_variant_iter_loop(iter, "(y)", &value)) { - if (j == 0) - count = value; - attr_value[j] = value; - DBG("attr_value[%d] = 0x%02X", j, value); - j++; - } - g_variant_iter_free(iter); - } - - records = calloc(1, sizeof(struct read_attribute_status_record_s)); - - if (!records) { - ERR("calloc() Fail(%d)", errno); - goto GLOBAL_READ_ATTRIBUTE_REQ_OUT; - } - - records->id = attr_id; - records->status = status; - records->type = type; - records->value = attr_value; - - cb(addr16, ep, clusterid, (void **)&records, count, container->userdata); - -GLOBAL_READ_ATTRIBUTE_REQ_OUT: - if (records) { - free(records); - records = NULL; - } - - } - break; - case ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_REQ: { - zb_zcl_global_attr_write_cb cb = container->cb; - - int i = 0; - zb_nwk_addr addr16; - unsigned char ep; - unsigned short clusterid; - unsigned short attributeid; - int count; - unsigned char value; - - GVariantIter *stat_iter = NULL; - GVariantIter *attr_iter = NULL; - struct write_attribute_status_record_s *records = NULL; - - g_variant_get(parameters, "(qya(y)aqqi)", - &addr16, &ep, &stat_iter, &attr_iter, &clusterid, &count); - RETM_IF(NULL == stat_iter, "Invalid parameter !"); - RETM_IF(NULL == attr_iter, "Invalid parameter !"); - - records = calloc(count, - sizeof(struct write_attribute_status_record_s)); - if (!records) { - g_variant_iter_free(stat_iter); - g_variant_iter_free(attr_iter); - ERR("calloc() Fail(%d)", errno); - goto GLOBAL_WRITE_ATTRIBUTE_REQ_OUT; - } - - while (g_variant_iter_loop(stat_iter, "(y)", &value)) { - records[i].status = value; - i++; - } - g_variant_iter_free(stat_iter); - - i = 0; - while (g_variant_iter_loop(attr_iter, "q", &attributeid)) { - records[i].id = attributeid; - DBG("Attribute Id 0x%04X", attributeid); - i++; - } - g_variant_iter_free(attr_iter); - - cb(addr16, ep, clusterid, (void **)&records, count, container->userdata); - -GLOBAL_WRITE_ATTRIBUTE_REQ_OUT: - if (records) { - free(records); - records = NULL; - } - } - break; - case ZBL_ZCL_GLOBAL_WRITE_CONFIGURE_REPORTING_REQ: { - int j = 0; - int l = 0; - int k = 0; - int rec_len; - - unsigned char ep; - unsigned short clusterid; - unsigned short attIdVal; - unsigned char value; - - GVariantIter *stat_iter = NULL; - GVariantIter *attr_iter = NULL; - GVariantIter *dir_iter = NULL; - - zb_nwk_addr addr16; - zb_zcl_global_config_report_write_cb cb = container->cb; - struct reporting_configuration_response_record_s *records = NULL; - - g_variant_get(parameters, "(a(y)aqa(y)qiqy)", - &stat_iter, &attr_iter, &dir_iter, &clusterid, &rec_len, &addr16, &ep); - RETM_IF(NULL == stat_iter, "Invalid parameter !"); - RETM_IF(NULL == attr_iter, "Invalid parameter !"); - RETM_IF(NULL == dir_iter, "Invalid parameter !"); - - records = calloc(rec_len, - sizeof(struct reporting_configuration_response_record_s)); - if (!records) { - g_variant_iter_free(stat_iter); - g_variant_iter_free(attr_iter); - g_variant_iter_free(dir_iter); - ERR("calloc() Fail(%d)", errno); - goto GLOBAL_CONFIGURE_REPORTING_REQ_OUT; - } - - while (g_variant_iter_loop(stat_iter, "(y)", &value)) { - DBG("Value 0x%02X", value); - records[j].status = value; - j++; - } - g_variant_iter_free(stat_iter); - - while (g_variant_iter_loop(attr_iter, "q", &attIdVal)) { - if (records[l].status != ZB_ZCL_STATUS_SUCCESS) - records[l].id = attIdVal; - l++; - } - g_variant_iter_free(attr_iter); - - while (g_variant_iter_loop(dir_iter, "(y)", &value)) { - if (records[k].status != ZB_ZCL_STATUS_SUCCESS) - records[k].dir = value; - k++; - } - g_variant_iter_free(dir_iter); - - cb(addr16, ep, clusterid, (void **)&records, rec_len, container->userdata); - -GLOBAL_CONFIGURE_REPORTING_REQ_OUT: - if (records) { - free(records); - records = NULL; - } - } - break; - case ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_REQ: { - - int j = 0; - int l = 0; - int count; - unsigned short clusterid; - unsigned short attributeid; - unsigned char value; - int discovery_complete; - - GVariantIter *stat_iter = NULL; - GVariantIter *attr_iter = NULL; - - zb_nwk_addr addr16; - unsigned char ep; - - zb_zcl_global_attr_discover_cb cb = container->cb; - struct discover_attribute_info_record_s **records = NULL; - - g_variant_get(parameters, "(qya(y)aqqii)", &addr16, &ep, &stat_iter, - &attr_iter, &clusterid, &count, &discovery_complete); - RETM_IF(NULL == stat_iter, "Invalid parameter !"); - RETM_IF(NULL == attr_iter, "Invalid parameter !"); - - records = calloc(count, sizeof(zb_zcl_discover_attr_info_record_h)); - RETM_IF(NULL == records, "calloc() Fail(%d)", errno); - for (j = 0; j < count; j++) { - records[j] = calloc(1, sizeof(struct discover_attribute_info_record_s)); - if (NULL == records[j]) { - ERR("calloc() Fail(%d)", errno); - for (l = 0; l < j; l++) { - free(records[l]); - records[l] = NULL; - } - free(records); - records = NULL; - - g_variant_iter_free(stat_iter); - g_variant_iter_free(attr_iter); - return; - } - } - - j = 0; - while (g_variant_iter_loop(stat_iter, "(y)", &value)) { - records[j]->type = value; - DBG("Attribute Type 0x%02X", value); - j++; - } - g_variant_iter_free(stat_iter); - - while (g_variant_iter_loop(attr_iter, "q", &attributeid)) { - records[l]->id = attributeid; - DBG("Attribute Id 0x%04X", attributeid); - l++; - } - g_variant_iter_free(attr_iter); - - cb(addr16, ep, clusterid, discovery_complete, (void *)records, count, - container->userdata); - - for (j = 0; j < count; j++) { - if (records[j]) { - free(records[j]); - records[j] = NULL; - } - } - if (records) { - free(records); - records = NULL; - } - } - break; - case ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_STRUCTURED_REQ: { - /* CAUTION: Currently we don't support this command */ - zb_zcl_global_attr_write_cb cb = container->cb; - cb(0, 0, 0, NULL, 0, container->userdata); - } - break; - /* GLOBAL_DISCOVER_COMMAND_RECEIVED and GLOBAL_DISCOVER_COMMAND_GENERATED should be handled as same way */ - case ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_RECEIVED_REQ: - case ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_GENERATED_REQ: { - - int j = 0; - char value; - unsigned short clusterid; - unsigned short cmd_len; - unsigned char *cmd_data; - unsigned char discoveryComplete; - - GVariantIter *cmd_iter = NULL; - - unsigned char ep; - zb_nwk_addr addr16; - zb_zcl_global_discover_cmds_cb cb = container->cb; - - g_variant_get(parameters, "(a(y)qqqyy)", &cmd_iter, &clusterid, &cmd_len, - &addr16, &ep, &discoveryComplete); - RETM_IF(NULL == cmd_iter, "Invalid parameter !"); - - cmd_data = calloc(cmd_len+1, sizeof(char)); - if (NULL == cmd_data) { - ERR("calloc() Fail(%d)", errno); - g_variant_iter_free(cmd_iter); - return; - } - - while (g_variant_iter_loop(cmd_iter, "(y)", &value)) { - DBG("Value 0x%02X", value); - cmd_data[j] = value; - j++; - } - g_variant_iter_free(cmd_iter); - - cb(addr16, ep, clusterid, discoveryComplete, cmd_data, cmd_len, - container->userdata); - if (cmd_data) { - free(cmd_data); - cmd_data = NULL; - } - } - break; - case ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_EXTENDED_REQ: { - - int i = 0; - int j = 0; - unsigned short clusterid; - unsigned char t_value; - unsigned char ac_value; - - unsigned short rec_len; - unsigned short attr_data; - unsigned char discoveryComplete; - GVariantIter *attr_iter = NULL; - GVariantIter *type_iter = NULL; - GVariantIter *ac_iter = NULL; - - unsigned char ep; - zb_nwk_addr addr16; - struct extended_attribute_infomation_s **records = NULL; - zb_zcl_global_attr_extended_discover_cb cb = container->cb; - - DBG("Will get the value now"); - - g_variant_get(parameters, "(aqa(y)a(y)qqqyy)", &attr_iter, &type_iter, &ac_iter, - &clusterid, &rec_len, &addr16, &ep, &discoveryComplete); - RETM_IF(NULL == attr_iter, "Invalid parameter !"); - RETM_IF(NULL == type_iter, "Invalid parameter !"); - RETM_IF(NULL == ac_iter, "Invalid parameter !"); - - DBG("records length 0x%04X", rec_len); - - records = calloc(rec_len, sizeof(zb_zcl_extended_attr_info_h)); - RETM_IF(NULL == records, "calloc() Fail(%d)", errno); - for (j = 0; j < rec_len; j++) { - records[j] = calloc(1, sizeof(struct extended_attribute_infomation_s)); - if (NULL == records[j]) { - for (i = 0; i < j; i++) { - free(records[i]); - records[i] = NULL; - } - free(records); - records = NULL; - - g_variant_iter_free(attr_iter); - g_variant_iter_free(type_iter); - g_variant_iter_free(ac_iter); - - ERR("calloc() Fail(%d)", errno); - return; - } - } - - j = 0; - while (g_variant_iter_loop(attr_iter, "q", &attr_data) - && g_variant_iter_loop(type_iter, "(y)", &t_value) - && g_variant_iter_loop(ac_iter, "(y)", &ac_value)) { - DBG("attrData 0x%04X", attr_data); - DBG("t_value 0x%02X", t_value); - DBG("ac_value 0x%02X", ac_value); - records[j]->id = attr_data; - records[j]->type = t_value; - records[j]->acl = ac_value; - j++; - } - g_variant_iter_free(attr_iter); - g_variant_iter_free(type_iter); - g_variant_iter_free(ac_iter); - - cb(addr16, ep, clusterid, discoveryComplete, (void *)records, rec_len, - container->userdata); - - for (j = 0; j < rec_len; j++) { - if (records[j]) { - free(records[j]); - records[j] = NULL; - } - } - if (records) { - free(records); - records = NULL; - } - } - break; - case ZBL_ZCL_GLOBAL_READ_CONFIGURE_REPORTING_REQ: { - - int i = 0; - int j = 0; - char value; - unsigned char *status = NULL; - unsigned char *data_size = NULL; - unsigned char *change = NULL; - unsigned short record_length; - - GVariantIter *resp_iter = NULL; - GVariantIter *data_iter = NULL; - - zb_nwk_addr addr16; - unsigned char ep; - unsigned short clusterid; - zb_zcl_global_attr_read_cb cb = container->cb; - - struct reporting_configuration_record_s **records = NULL; - - g_variant_get(parameters, "(qyqqa(yyqyqqayq))", - &addr16, &ep, &clusterid, &record_length, &resp_iter); - RETM_IF(NULL == resp_iter, "Invalid parameter !"); - - records = calloc(record_length, sizeof(zb_zcl_reporting_config_record_h)); - RETM_IF(NULL == records, "calloc() Fail(%d)", errno); - - for (i = 0; i < record_length; i++) { - records[i] = calloc(1, sizeof(struct reporting_configuration_record_s)); - if (NULL == records[i]) { - ERR("calloc() Fail(%d)", errno); - goto GLOBAL_READ_CONFIGURE_REPORTING_REQ_OUT; - } - } - if (!records) { - ERR("calloc() Fail(%d)", errno); - goto GLOBAL_READ_CONFIGURE_REPORTING_REQ_OUT; - } - - DBG("record_length %d", record_length); - status = calloc(record_length, sizeof(unsigned char)); - data_size = calloc(record_length, sizeof(unsigned char)); - if (!status || !data_size) { - ERR("Couldn't allocate the memory (%s)", errno); - goto GLOBAL_READ_CONFIGURE_REPORTING_REQ_OUT; - } - - for (i = 0; i < record_length; i++) { - g_variant_iter_loop(resp_iter, "(yyqyqqayq)", &status[i], &records[i]->dir, - &records[i]->id, &records[i]->type, &records[i]->max_i, &records[i]->min_i, - &data_iter, &records[i]->to); - if (NULL == data_iter) { - ERR("Invalid parameter !"); - goto GLOBAL_READ_CONFIGURE_REPORTING_REQ_OUT; - } - - if (records[i]->dir != ZCL_REPORTING_DIRECTION_REPORTED && - (zb_zcl_get_analog_or_discret(records[i]->type) == ZB_ZCL_DATA_TYPE_ANALOG)) { - data_size[i] = zb_zcl_get_data_size(records[j]->type); - j = 0; - if (data_size[i] != 0xff) { - change = calloc(data_size[i]+1, sizeof(unsigned char)); - if (!change) { - ERR("calloc() Fail(%d)", errno); - records[i]->change = NULL; - g_variant_iter_free(data_iter); - goto GLOBAL_READ_CONFIGURE_REPORTING_REQ_OUT; - } - - while (g_variant_iter_loop(data_iter, "y", &value)) { - change[j] = value; - j++; - } - g_variant_iter_free(data_iter); - records[i]->change = change; - } else - records[i]->change = NULL; - } else - records[i]->change = NULL; - } - g_variant_iter_free(resp_iter); - - cb(addr16, ep, clusterid, (void **)records, record_length, container->userdata); - -GLOBAL_READ_CONFIGURE_REPORTING_REQ_OUT: - if (data_size) { - free(data_size); - data_size = NULL; - } - if (status) { - free(status); - status = NULL; - } - - for (i = 0; i < record_length; i++) { - if (records[i] && records[i]->change) { - free(records[i]->change); - records[i]->change = NULL; - } - if (records[i]) { - free(records[i]); - records[i] = NULL; - } - } - if (records) { - free(records); - records = NULL; - } - } - break; - /* ZCL Alarm */ - case ZBL_ZCL_ALARM_GET_ALARM_REQ: { - - zb_nwk_addr addr16 = 0; - unsigned char ep = 0; - unsigned char status = 0; - unsigned char alarm_code = 0; - unsigned short clusterid = 0; - unsigned int time_stamp = 0; - - zb_zcl_alarm_get_alarm_cb cb = container->cb; - - g_variant_get(parameters, "(qyyyqu)", &addr16, &ep, &status, &alarm_code, - &clusterid, &time_stamp); - cb(addr16, ep, status, alarm_code, clusterid, time_stamp, container->userdata); - } - break; - /* ZCL Doorlock */ - case ZBL_ZCL_DOORLOCK_LOCK_STATE: { - ERR("Unhandled cid = %d", container->cid); - } - break; - /* ZCL Fanmode */ - case ZBL_ZCL_FANMODE_FAN_MODE_STATE: { - ERR("Unhandled cid = %d", container->cid); - } - break; - /* ZCL Group */ - case ZBL_ZCL_GROUP_ADD_GROUP_REQ: { - zb_zcl_group_add_group_cb cb = container->cb; - - zb_nwk_addr addr16; - unsigned char ep; - unsigned char status; - unsigned short group_id; - - g_variant_get(parameters, "(qyyq)", &addr16, &ep, &status, &group_id); - cb(addr16, ep, status, group_id, container->userdata); - } - break; - case ZBL_ZCL_GROUP_VIEW_GROUP_REQ: { - zb_zcl_group_view_group_cb cb = container->cb; - - int j = 0; - zb_nwk_addr addr16; - unsigned char ep; - unsigned char value; - unsigned char status; - unsigned short group_id; - char *group_name = NULL; - GVariantIter *grpNameiter = NULL; - - g_variant_get(parameters, "(qyyqay)", &addr16, &ep, &status, &group_id, &grpNameiter); - if (NULL == grpNameiter) { - ERR("Invalid grpNameiter"); - goto GROUP_VIEW_GROUP_REQ_OUT; - } - - g_variant_iter_loop(grpNameiter, "y", &value); - /* first byte indicates the length of the string */ - if ((value - '0') > 0) { - DBG("Value %d ", (value - '0')); - group_name = calloc((value - '0') + 1, sizeof(char)); - if (NULL == group_name) { - g_variant_iter_free(grpNameiter); - ERR("calloc() Fail(%d)", errno); - goto GROUP_VIEW_GROUP_REQ_OUT; - } - group_name[j] = value; - j++; - while (g_variant_iter_loop(grpNameiter, "y", &value) && (j <= (value - '0'))) { - group_name[j] = value; - DBG("Name %c", group_name[j]); - j++; - } - g_variant_iter_free(grpNameiter); - } else { - group_name = calloc(2, sizeof(char)); - if (NULL == group_name) { - g_variant_iter_free(grpNameiter); - ERR("calloc() Fail(%d)", errno); - goto GROUP_VIEW_GROUP_REQ_OUT; - } - group_name[j++] = value; - group_name[j++] = '\0'; - } - - DBG("GroupName = %s", group_name); - cb(addr16, ep, status, group_id, group_name, container->userdata); - -GROUP_VIEW_GROUP_REQ_OUT: - if (group_name) { - free(group_name); - group_name = NULL; - } - } - break; - case ZBL_ZCL_GROUP_GET_GROUP_MEMBERSHIP_REQ: { - zb_zcl_group_get_group_membership_cb cb = container->cb; - - int j = 0; - zb_nwk_addr addr16; - unsigned char ep; - unsigned short gl_value; - unsigned char capacity; - unsigned char group_count; - unsigned short *grouplist = NULL; - GVariantIter *grpListiter = NULL; - - g_variant_get(parameters, "(qyyyaq)", &addr16, &ep, &capacity, &group_count, &grpListiter); - RETM_IF(NULL == grpListiter, "Invalid parameter !"); - - if (group_count > 0) { - grouplist = calloc(group_count+1, sizeof(unsigned short)); - if (NULL == grouplist) { - g_variant_iter_free(grpListiter); - ERR("calloc() Fail(%d)", errno); - return; - } - RETM_IF(NULL == grouplist, "calloc() Fail(%d)", errno); - - while (g_variant_iter_loop(grpListiter, "q", &gl_value)) { - grouplist[j] = gl_value; - j++; - } - g_variant_iter_free(grpListiter); - } - - cb(addr16, ep, capacity, group_count, grouplist, container->userdata); - - if (grouplist) { - free(grouplist); - grouplist = NULL; - } - } - break; - case ZBL_ZCL_GROUP_REMOVE_GROUP_REQ: { - zb_zcl_group_remove_group_cb cb = container->cb; - - zb_nwk_addr addr16; - unsigned char ep; - unsigned char status; - unsigned short group_id; - - g_variant_get(parameters, "(qyyq)", &addr16, &ep, &status, &group_id); - - cb(addr16, ep, status, group_id, container->userdata); - } - break; - /* ZCL Identify */ - case ZBL_ZCL_IDENTIFY_QUERY_REQ: { - zb_zcl_identify_query_cb cb = container->cb; - - zb_nwk_addr addr16 = 0; - unsigned short identify_time = 0; - g_variant_get(parameters, "(qq)", &addr16, &identify_time); - - cb(addr16, identify_time, container->userdata); - } - break; - /* ZCL On/Off */ - case ZBL_ZCL_ON_OFF_GET_ON_OFF_STATE: { - ERR("Unhandled cid = %d", container->cid); - } - break; - /* ZCL Pollcontrol */ - case ZBL_ZCL_POLLCONTROL_SET_POLL_INTERVAL_REQ: { - zb_zcl_pollctrl_check_in_cb cb = container->cb; - - zb_nwk_addr addr16 = 0; - unsigned char ep = 0; - - g_variant_get(parameters, "(qy)", &addr16, &ep); - cb(addr16, ep, container->userdata); - } - break; - /* ZCL Scene */ - case ZBL_ZCL_SCENE_ADD_SCENE_REQ: { - zb_zcl_scene_add_scene_cb cb = container->cb; - - zb_nwk_addr addr16 = 0; - unsigned char ep; - unsigned char status; - unsigned short group_id; - unsigned char scene_id; - - g_variant_get(parameters, "(qyyqy)", &addr16, &ep, &status, &group_id, &scene_id); - cb(addr16, ep, status, group_id, scene_id, container->userdata); - } - break; - case ZBL_ZCL_SCENE_VIEW_SCENE_REQ: { - zb_zcl_scene_view_scene_cb cb = container->cb; - - int j = 0; - int len; - zb_nwk_addr addr16 = 0; - unsigned char ep; - unsigned char status; - unsigned short group_id; - unsigned char scene_id; - unsigned short transition_time = 0; - unsigned char value; - unsigned short ext_len = 0; - char *scene_name = NULL; - char *extendedFieldSets = NULL; - GVariantIter *sceneNameIter = NULL; - GVariantIter *extendedSetIter = NULL; - - g_variant_get(parameters, "(qyyqyqa(y)ya(y))", &addr16, &ep, &status, &group_id, &scene_id, - &transition_time, &sceneNameIter, &ext_len, &extendedSetIter); - - if (!g_variant_iter_loop(sceneNameIter, "(y)", &value)) { - ERR("There is no scene data"); - return; - } - - /** first byte indicates the length of the string */ - len = value -'0'; - if (0 < len) { - scene_name = calloc(len + 1, sizeof(char)); - if (NULL == scene_name) { - ERR("calloc() Fail(%d)", errno); - goto SCENE_VIEW_SCENE_REQ_OUT; - } - scene_name[j] = value; - j++; - while (g_variant_iter_loop(sceneNameIter, "(y)", &value)) { - scene_name[j] = value; - j++; - } - } else { - scene_name = calloc(1 + 1, sizeof(char)); - if (NULL == scene_name) { - ERR("calloc() Fail(%d)", errno); - goto SCENE_VIEW_SCENE_REQ_OUT; - } - scene_name[j] = value; - } - - j = 0; - if (0 < ext_len) { - extendedFieldSets = calloc(ext_len + 1, sizeof(char)); - if (NULL == extendedFieldSets) { - ERR("calloc() Fail(%d)", errno); - goto SCENE_VIEW_SCENE_REQ_OUT; - } - while (g_variant_iter_loop(extendedSetIter, "(y)", &value)) { - extendedFieldSets[j] = value; - j++; - } - } - - cb(addr16, ep, status, group_id, scene_id, transition_time, scene_name, - extendedFieldSets, ext_len, container->userdata); - -SCENE_VIEW_SCENE_REQ_OUT: - if (scene_name) { - free(scene_name); - scene_name = NULL; - } - - if (extendedFieldSets) { - free(extendedFieldSets); - extendedFieldSets = NULL; - } - } - break; - case ZBL_ZCL_SCENE_REMOVE_SCENE_REQ: { - zb_zcl_scene_remove_scene_cb cb = container->cb; - - zb_nwk_addr addr16 = 0; - unsigned char ep; - unsigned char status; - unsigned short group_id; - unsigned char scene_id; - - g_variant_get(parameters, "(qyyqy)", &addr16, &ep, &status, &group_id, &scene_id); - cb(addr16, ep, status, group_id, scene_id, container->userdata); - } - break; - case ZBL_ZCL_SCENE_STORE_SCENE_REQ: { - zb_zcl_scene_store_scene_cb cb = container->cb; - - zb_nwk_addr addr16 = 0; - unsigned char ep; - unsigned char status; - unsigned short group_id; - unsigned char scene_id; - - g_variant_get(parameters, "(qyyqy)", &addr16, &ep, &status, &group_id, &scene_id); - cb(addr16, ep, status, group_id, scene_id, container->userdata); - } - break; - case ZBL_ZCL_SCENE_REMOVE_ALL_SCENE_REQ: { - zb_zcl_scene_remove_all_scene_cb cb = container->cb; - - zb_nwk_addr addr16 = 0; - unsigned char ep; - unsigned char status; - unsigned short group_id; - - g_variant_get(parameters, "(qyyq)", &addr16, &ep, &status, &group_id); - cb(addr16, ep, status, group_id, container->userdata); - } - break; - case ZBL_ZCL_SCENE_GET_SCENE_MEMBERSHIP_REQ: { - zb_zcl_scene_get_scene_membership_cb cb = container->cb; - - int j = 0; - zb_nwk_addr addr16 = 0; - unsigned char ep; - unsigned char status; - unsigned short group_id; - unsigned char capacity; - unsigned char value; - unsigned char scene_count = 0; - unsigned char *scene_list = NULL; - GVariantIter *sceneListIter = NULL; - - g_variant_get(parameters, "(qyyyqya(y))", &addr16, &ep, &status, &capacity, &group_id, - &scene_count, &sceneListIter); - - if (0 < scene_count) { - scene_list = calloc(scene_count+1, sizeof(char)); - if (NULL == scene_list) { - ERR("calloc() Fail(%d)", errno); - goto SCENE_GET_SCENE_MEMBERSHIP_REQ_OUT; - } - while (g_variant_iter_loop(sceneListIter, "(y)", &value)) { - scene_list[j] = value; - DBG("Scene_List 0x%02X", scene_list[j]); - j++; - } - } - - cb(addr16, ep, status, capacity, group_id, scene_count, scene_list, container->userdata); -SCENE_GET_SCENE_MEMBERSHIP_REQ_OUT: - if (scene_list) { - free(scene_list); - scene_list = NULL; - } - } - break; - /* ZCL Thermostat */ - case ZBL_ZCL_THERMOSTAT_GET_LOCAL_TEMP: { - ERR("Unhandled cid = %d", container->cid); - } - break; - default: - ERR("Unhandled cid = %d", container->cid); - } -} - -static int _check_zigbee_privilege() -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - DBG("_check_zigbee_privilege()"); - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(service_gproxy, "check_privilege", - NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - if (!variant) { - ERR("Failed to check_zigbee_privilege [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - } - g_variant_unref(variant); - - return result; -} - -int zbl_set_event_cb(zb_zigbee_h handle, zb_event_cb event_handler) -{ - struct zbl_zigbee_s *h = handle; - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - h->event_handler = event_handler; - return ZIGBEE_ERROR_NONE; -} - -int zbl_enable(zb_zigbee_h handle) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_enable()"); - - variant = g_dbus_connection_call_sync(gdbus_conn, - ZIGBEE_MANAGER_INTERFACE, - ZIGBEE_DBUS_OBJPATH, - ZIGBEE_MANAGER_INTERFACE, - "enable", - NULL, NULL, - G_DBUS_CALL_FLAGS_NONE, - -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'enable' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - g_variant_unref(variant); - - return result; -} - -int zbl_disable(void) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_disable()"); - - variant = g_dbus_connection_call_sync(gdbus_conn, - ZIGBEE_MANAGER_INTERFACE, - ZIGBEE_DBUS_OBJPATH, - ZIGBEE_MANAGER_INTERFACE, - "disable", - NULL, NULL, - G_DBUS_CALL_FLAGS_NONE, - -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'disable' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_hw_reset(void) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(service_gproxy, "zb_hw_reset", NULL, - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'zb_hw_reset' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_get_network_info(zb_ieee_addr addr64, zb_nwk_addr *nodeid, zb_nwk_addr *panid, - unsigned char *channel, unsigned char *tx_power) -{ - GVariant *variant = NULL; - GVariantIter *iter = NULL; - GError *dbus_err = NULL; - int result = ZIGBEE_ERROR_NONE; - - zb_nwk_addr _nodeid; - zb_nwk_addr _panid; - unsigned char _radio_channel; - unsigned char _radio_tx_power; - unsigned char value; - int i = 0; - - DBG("zbl_get_network_info()"); - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(service_gproxy, "get_network_info", - NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to 'get_network_info' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(ia(y)qqyy)", &result, &iter, - &_nodeid, &_panid, &_radio_channel, &_radio_tx_power); - RETVM_IF(NULL == iter, ZIGBEE_ERROR_IO_ERROR, "Invalid parameter !"); - - /* Get EUI */ - i = 0; - while (g_variant_iter_loop(iter, "(y)", &value)) { - addr64[i] = value; - i++; - } - g_variant_iter_free(iter); - - DBG(" Result: [%X]", result); - DBG(" EUI(%d) : %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", i, - addr64[0], addr64[1], addr64[2], addr64[3], - addr64[4], addr64[5], addr64[6], addr64[7]); - DBG(" nodeID [0x%04X]", _nodeid); - DBG(" PanID [0x%04X]", _panid); - DBG(" Channel [%d] Tx Power [%d]", _radio_channel, _radio_tx_power); - - if (nodeid) - *nodeid = _nodeid; - if (panid) - *panid = _panid; - if (channel) - *channel = _radio_channel; - if (tx_power) - *tx_power = _radio_tx_power; - - g_variant_unref(variant); - - return result; -} - -int zbl_get_controller_mac_address(zb_ieee_addr addr64) -{ - GVariant *variant = NULL; - GVariantIter *iter = NULL; - GError *dbus_err = NULL; - - char value; - int j = 0; - int result = ZIGBEE_ERROR_NONE; - - DBG("zbl_get_controller_mac_address()"); - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(service_gproxy, "get_mac", - NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get_mac [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - g_variant_get(variant, "(ia(y))", &result, &iter); - RETVM_IF(NULL == iter, ZIGBEE_ERROR_IO_ERROR, "Invalid parameter !"); - - while (g_variant_iter_loop(iter, "(y)", &value)) { - addr64[j] = value; - j++; - } - g_variant_iter_free(iter); - - DBG("IEEE ADDR 0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X, Ret=%d ", - addr64[0], addr64[1], addr64[2], addr64[3], addr64[4], addr64[5], - addr64[6], addr64[7], result); - - g_variant_unref(variant); - - return result; -} - -int zbl_get_cluster_list(zb_ieee_addr eui64, unsigned char endpoint, - unsigned char *in_cluster_count, unsigned short in_cluster_list[], - unsigned char *out_cluster_count, unsigned short out_cluster_list[]) -{ - GVariant *variant = NULL; - GVariantBuilder *mac_builder = NULL; - GVariant *mac_variant = NULL; - GVariantIter *in_cluster_iter = NULL; - GVariantIter *out_cluster_iter = NULL; - GError *dbus_err = NULL; - unsigned short cluster = 0; - int i = 0; - int result = 0; - int ret = ZIGBEE_ERROR_NONE; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); - - mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); - g_variant_builder_add(mac_builder, "(y)", eui64[7]); - g_variant_builder_add(mac_builder, "(y)", eui64[6]); - g_variant_builder_add(mac_builder, "(y)", eui64[5]); - g_variant_builder_add(mac_builder, "(y)", eui64[4]); - g_variant_builder_add(mac_builder, "(y)", eui64[3]); - g_variant_builder_add(mac_builder, "(y)", eui64[2]); - g_variant_builder_add(mac_builder, "(y)", eui64[1]); - g_variant_builder_add(mac_builder, "(y)", eui64[0]); - mac_variant = g_variant_builder_end(mac_builder); - g_variant_builder_unref(mac_builder); - - variant = g_dbus_proxy_call_sync(service_gproxy, "get_cluster_list", - g_variant_new("(@a(y)y)", mac_variant, endpoint), G_DBUS_CALL_FLAGS_NONE, - -1, NULL, &dbus_err); - - if (variant) { - g_variant_get(variant, "(iaqaq)", &result, &in_cluster_iter, &out_cluster_iter); - RETVM_IF(NULL == in_cluster_iter, ZIGBEE_ERROR_IO_ERROR, "Invalid parameter !"); - RETVM_IF(NULL == out_cluster_iter, ZIGBEE_ERROR_IO_ERROR, "Invalid parameter !"); - - DBG("ret = [0x%x]", result); - - /* In clusters */ - while (g_variant_iter_loop(in_cluster_iter, "q", &cluster)) { - DBG("In Cluster 0x%04X", cluster); - in_cluster_list[i++] = cluster; - } - g_variant_iter_free(in_cluster_iter); - *in_cluster_count = i; - if (0 == i) - ERR("No In Clusters for Endpoint %0X", endpoint); - - /* Out clusters */ - i = 0; - while (g_variant_iter_loop(out_cluster_iter, "q", &cluster)) { - DBG("Out Cluster 0x%04X", cluster); - out_cluster_list[i++] = cluster; - } - g_variant_iter_free(out_cluster_iter); - *out_cluster_count = i; - if (0 == i) - ERR("No Out Clusters for Endpoint %0X", endpoint); - - g_variant_unref(variant); - } else { - ERR("No In/Out Clusters for Endpoint %0X [%s]", endpoint, dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - ret = ZIGBEE_ERROR_PERMISSION_DENIED; - else - ret = ZIGBEE_ERROR_NONE; - - g_error_free(dbus_err); - - *in_cluster_count = 0; - *out_cluster_count = 0; - } - - return ret; -} - -int zbl_get_endpoint_list(zb_ieee_addr eui64, unsigned char *count, unsigned char list[]) -{ - GVariant *variant = NULL; - GVariantBuilder *mac_builder = NULL; - GVariant *mac_variant = NULL; - GVariantIter *iter = NULL; - GError *dbus_err = NULL; - unsigned char endpoint; - int i = 0; - int result = 0; - int ret = ZIGBEE_ERROR_NONE; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); - - mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); - g_variant_builder_add(mac_builder, "(y)", eui64[7]); - g_variant_builder_add(mac_builder, "(y)", eui64[6]); - g_variant_builder_add(mac_builder, "(y)", eui64[5]); - g_variant_builder_add(mac_builder, "(y)", eui64[4]); - g_variant_builder_add(mac_builder, "(y)", eui64[3]); - g_variant_builder_add(mac_builder, "(y)", eui64[2]); - g_variant_builder_add(mac_builder, "(y)", eui64[1]); - g_variant_builder_add(mac_builder, "(y)", eui64[0]); - mac_variant = g_variant_builder_end(mac_builder); - g_variant_builder_unref(mac_builder); - - variant = g_dbus_proxy_call_sync(service_gproxy, "get_endpoint_list", - g_variant_new("(@a(y))", mac_variant), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (variant) { - g_variant_get(variant, "(ia(y))", &result, &iter); - RETVM_IF(NULL == iter, ZIGBEE_ERROR_IO_ERROR, "Invalid parameter !"); - - DBG("ret = [0x%x]", result); - - while (g_variant_iter_loop(iter, "(y)", &endpoint)) { - DBG("Endpoint 0x%X", endpoint); - list[i++] = endpoint; - } - g_variant_iter_free(iter); - - if (i > 0) { - *count = i; - DBG("Endpoint Count %d", i); - } else { - ERR("No Endpoints"); - *count = 0; - } - g_variant_unref(variant); - - } else { - ERR("NULL Variant"); - ERR("No Endpoints"); - ERR("[%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - ret = ZIGBEE_ERROR_PERMISSION_DENIED; - - g_error_free(dbus_err); - *count = 0; - } - - return ret; -} - -int zbl_api_get_node_type(zb_ieee_addr eui64, unsigned char *node_type) -{ - GVariant *variant = NULL; - GVariantBuilder *mac_builder = NULL; - int result = ZIGBEE_ERROR_NONE; - GVariant *mac_variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); - - mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); - g_variant_builder_add(mac_builder, "(y)", eui64[7]); - g_variant_builder_add(mac_builder, "(y)", eui64[6]); - g_variant_builder_add(mac_builder, "(y)", eui64[5]); - g_variant_builder_add(mac_builder, "(y)", eui64[4]); - g_variant_builder_add(mac_builder, "(y)", eui64[3]); - g_variant_builder_add(mac_builder, "(y)", eui64[2]); - g_variant_builder_add(mac_builder, "(y)", eui64[1]); - g_variant_builder_add(mac_builder, "(y)", eui64[0]); - mac_variant = g_variant_builder_end(mac_builder); - g_variant_builder_unref(mac_builder); - - variant = g_dbus_proxy_call_sync(service_gproxy, "get_node_type", - g_variant_new("(@a(y))", mac_variant), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'get_node_type' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_get_all_device_info(zb_end_dev_info_h **dev_list, unsigned char* num) -{ - int i = 0; - int j = 0; - int k = 0; - struct zb_end_device_info_s **list; - GVariant *variant = NULL; - GVariantIter *iter = NULL; - GVariantIter *mac_iter = NULL; - GVariantIter *endpoint_iter = NULL; - GError *dbus_err = NULL; - int result = 0; - int ret = ZIGBEE_ERROR_NONE; - unsigned short node_id; - unsigned char node_type; - unsigned char node_mac_address[8] = {0x00}; - unsigned char endpoint_cnt = 0; - unsigned char value; - unsigned char value_endpoint; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); - - /* check the format string when there are no input args */ - variant = g_dbus_proxy_call_sync(service_gproxy, "get_device_info", - NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (variant) { - g_variant_get(variant, "(ia(qyayyay))", &result, &iter); - RETVM_IF(NULL == iter, ZIGBEE_ERROR_IO_ERROR, "Invalid parameter !"); - - DBG("ret = [0x%x]", result); - - list = calloc(MAX_DEVICE_LIST+1, sizeof(zb_end_dev_info_h)); - RETV_IF(NULL == list, ZIGBEE_ERROR_OUT_OF_MEMORY); - for (i = 0; i < MAX_DEVICE_LIST && list; i++) { - list[i] = calloc(1, sizeof(struct zb_end_device_info_s)); - if (NULL == list[i]) { - for (j = 0; j < i; j++) { - if (list[j]) { - free(list[j]); - list[j] = NULL; - } - } - if (list) { - free(list); - list = NULL; - } - g_variant_unref(variant); - return ZIGBEE_ERROR_OUT_OF_MEMORY; - } - } - - i = 0; - while (g_variant_iter_loop(iter, "(qyayyay)", &node_id, &node_type, &mac_iter, - &endpoint_cnt, &endpoint_iter)) { - if (NULL == mac_iter || NULL == endpoint_iter) { - ERR("Invalid parameter !"); - for (j = 0; j <= MAX_DEVICE_LIST; j++) { - if (list[j]) { - free(list[j]); - list[j] = NULL; - } - } - if (list) { - free(list); - list = NULL; - } - g_variant_iter_free(iter); - if (NULL != mac_iter) - g_variant_iter_free(mac_iter); - if (NULL != endpoint_iter) - g_variant_iter_free(endpoint_iter); - g_variant_unref(variant); - return ZIGBEE_ERROR_IO_ERROR; - } - - j = 0; - k = 0; - /* Get Network Address */ - list[i]->addr16 = node_id; - DBG("Node ID: 0x%04X", node_id); - /* Get Node Type */ - list[i]->node_type = node_type; - DBG("Node Type : 0x%02X", node_type); - /* Get End-Point count */ - list[i]->num_of_ep = endpoint_cnt; - DBG("Endpoint Count: 0x%X", endpoint_cnt); - - /* Get End-Point list */ - list[i]->num_of_ep = endpoint_cnt; - while (g_variant_iter_loop(endpoint_iter, "y", &value_endpoint)) { - list[i]->ep[k] = value_endpoint; - DBG("Endpoint : %d", value_endpoint); - k++; - } - g_variant_iter_free(endpoint_iter); - - /* Get IEEE address */ - while (g_variant_iter_loop(mac_iter, "y", &value)) { - node_mac_address[j] = value; - j++; - } - g_variant_iter_free(mac_iter); - - memcpy(list[i]->addr64, node_mac_address, sizeof(zb_ieee_addr)); - DBG("Node MAC Addr : %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", - node_mac_address[0], node_mac_address[1], node_mac_address[2], - node_mac_address[3], node_mac_address[4], node_mac_address[5], - node_mac_address[6], node_mac_address[7]); - i++; - } - if (0 == i) - ERR("No attached nodes"); - - *num = i; - *dev_list = (void **)list; - - g_variant_iter_free(iter); - g_variant_unref(variant); - } else { - ERR("NULL Variant [%s]", dbus_err->message); - ERR("No attached nodes"); - if (strstr(dbus_err->message, "AccessDenied")) - ret = ZIGBEE_ERROR_PERMISSION_DENIED; - - g_error_free(dbus_err); - *num = 0; - } - - return ret; -} - -int zbl_coex_start(unsigned char channel) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(service_gproxy, "coex_start", g_variant_new("(y)", channel), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'coex_start' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_coex_stop(void) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - DBG("zbl_coex_stop()"); - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(service_gproxy, "coex_stop", NULL, - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'coex_stop' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_form_network(zb_zigbee_h handle, zb_form_network_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(service_gproxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_SERVICE_INTERFACE, "form_network_done", ZIGBEE_SERVICE_OBJECT_PATH, NULL, 0, - _zbl_response_cb, container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - free(container); - container = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_SERVICE_FORM_NETWORK; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - variant = g_dbus_proxy_call_sync(service_gproxy, "form_network", NULL, - G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'form_network' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_disable_network(zb_zigbee_h handle, zb_disable_network_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_disable_network()"); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(service_gproxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_SERVICE_INTERFACE, "disable_network_done", ZIGBEE_SERVICE_OBJECT_PATH, NULL, 0, - _zbl_response_cb, container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - free(container); - container = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_SERVICE_DISABLE_NETWORK; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - variant = g_dbus_proxy_call_sync(service_gproxy, "leave_network", NULL, - G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'leave_network' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_leave_device(zb_ieee_addr addr64, bool remove_children, bool rejoin) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - GVariantBuilder *mac_builder = NULL; - GVariant* mac_variant = NULL; - unsigned char _remove_children = (remove_children) ? 1 : 0; - unsigned char _rejoin = (rejoin) ? 1 : 0; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("IEEE Address = %X:%X:%X:%X:%X:%X:%X:%X", - addr64[0], addr64[1], addr64[2], addr64[3], - addr64[4], addr64[5], addr64[6], addr64[7]); - - mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); - g_variant_builder_add(mac_builder, "(y)", addr64[7]); - g_variant_builder_add(mac_builder, "(y)", addr64[6]); - g_variant_builder_add(mac_builder, "(y)", addr64[5]); - g_variant_builder_add(mac_builder, "(y)", addr64[4]); - g_variant_builder_add(mac_builder, "(y)", addr64[3]); - g_variant_builder_add(mac_builder, "(y)", addr64[2]); - g_variant_builder_add(mac_builder, "(y)", addr64[1]); - g_variant_builder_add(mac_builder, "(y)", addr64[0]); - mac_variant = g_variant_builder_end(mac_builder); - g_variant_builder_unref(mac_builder); - - variant = g_dbus_proxy_call_sync(service_gproxy, "leave_request", - g_variant_new("(@a(y)yy)", mac_variant, _remove_children, _rejoin), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'leave_request' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_permit_join(unsigned char duration, bool broadcast) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(service_gproxy, "permit_join", - g_variant_new("(ib)", duration, broadcast), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'permit_join' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_nwk_addr_req(zb_zigbee_h handle, zb_ieee_addr addr64, unsigned char request_type, - unsigned char start_idx, zb_zdo_addr_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - GVariantBuilder *mac_builder = NULL; - GVariant* mac_variant = NULL; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG(" zbl_nwk_addr_req()"); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zdo_dev_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "nwk_addr_rsp", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container, - _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - free(container); - container = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZDO_NWK_ADDR_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); - g_variant_builder_add(mac_builder, "(y)", addr64[7]); - g_variant_builder_add(mac_builder, "(y)", addr64[6]); - g_variant_builder_add(mac_builder, "(y)", addr64[5]); - g_variant_builder_add(mac_builder, "(y)", addr64[4]); - g_variant_builder_add(mac_builder, "(y)", addr64[3]); - g_variant_builder_add(mac_builder, "(y)", addr64[2]); - g_variant_builder_add(mac_builder, "(y)", addr64[1]); - g_variant_builder_add(mac_builder, "(y)", addr64[0]); - mac_variant = g_variant_builder_end(mac_builder); - g_variant_builder_unref(mac_builder); - - variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "nwk_addr_req", - g_variant_new("(@a(y)yy)", mac_variant, request_type, start_idx), - G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'nwk_addr_req' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_ieee_addr_req(zb_zigbee_h handle, zb_nwk_addr addr16, zb_zdo_addr_cb cb, - void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_ieee_addr_req()"); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zdo_dev_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "nwk_addr_rsp", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, - _zbl_response_cb, container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - free(container); - container = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZDO_NWK_ADDR_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "ieee_addr_req", g_variant_new("(q)", addr16), - G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'ieee_addr_req' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_active_ep(zb_zigbee_h handle, zb_nwk_addr addr16, zb_zdo_active_ep_cb cb, - void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_active_ep()"); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zdo_dev_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "active_ep_rsp", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, - _zbl_response_cb, container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - free(container); - container = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZDO_ACTIVE_EP_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "active_ep_req", - g_variant_new("(q)", addr16), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'active_ep_req' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_simple_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep, - zb_zdo_simple_desc_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_simple_desc_req() : [%X]", addr16); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zdo_dev_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "simple_desc_rsp", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, - _zbl_response_cb, container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - free(container); - container = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZDO_SIMPLE_DESC_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "simple_desc_req", - g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'simple_desc_req' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_extended_simple_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char start_idx, zb_zdo_extended_simple_desc_cb cb, void *user_data) -{ - return ZIGBEE_ERROR_NOT_SUPPORTED; -} - -int zbl_match_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned short profileid, unsigned char num_in_clusters, - unsigned short *in_clusters, unsigned char num_out_clusters, - unsigned short *out_clusters, zb_zdo_match_desc_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - int i; - GVariantBuilder *incl_builder = NULL; - GVariant* incl_variant = NULL; - GVariantBuilder *outcl_builder = NULL; - GVariant* outcl_variant = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_match_desc_req()"); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zdo_dev_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "matched_descriptor_rsp", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, - _zbl_response_cb, container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - free(container); - container = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZDO_MATCHED_DESCRIPTOR_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - incl_builder = g_variant_builder_new(G_VARIANT_TYPE("aq")); - for (i = 0; i < num_in_clusters; i++) - g_variant_builder_add(incl_builder, "q", in_clusters[i]); - - outcl_builder = g_variant_builder_new(G_VARIANT_TYPE("aq")); - for (i = 0; i < num_out_clusters; i++) - g_variant_builder_add(outcl_builder, "q", out_clusters[i]); - - incl_variant = g_variant_builder_end(incl_builder); - outcl_variant = g_variant_builder_end(outcl_builder); - g_variant_builder_unref(incl_builder); - g_variant_builder_unref(outcl_builder); - - variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "matched_descriptor_req", - g_variant_new("(qqy@aqy@aq)", addr16, profileid, num_in_clusters, - incl_variant, num_out_clusters, outcl_variant), - G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'matched_descriptor_req' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_node_desc_req(zb_nwk_addr addr16, zb_zdo_node_desc_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_node_desc_req()"); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zdo_dev_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "node_desc_rsp", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, - _zbl_response_cb, container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - free(container); - container = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZDO_NODE_DESC_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "node_desc_req", - g_variant_new("(q)", addr16), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'node_desc_req' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_power_desc_req(zb_nwk_addr addr16, zb_zdo_power_desc_cb cb, - void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zdo_dev_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "power_desc_rsp", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, - _zbl_response_cb, container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - free(container); - container = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZDO_POWER_DESC_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "power_desc_req", - g_variant_new("(q)", addr16), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'power_desc_req' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_complex_desc_req(zb_nwk_addr addr16, zb_zdo_complex_desc_cb cb, - void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zdo_dev_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "complex_desc_rsp", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, - _zbl_response_cb, container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - free(container); - container = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZDO_COMPLEX_DESC_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "complex_desc_req", - g_variant_new("(q)", addr16), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'complex_desc_req' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_user_desc_req(zb_nwk_addr addr16, zb_zdo_user_desc_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zdo_dev_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "user_desc_rsp", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, - _zbl_response_cb, container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - free(container); - container = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZDO_USER_DESC_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "user_desc_req", - g_variant_new("(q)", addr16), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'user_desc_req' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -#define MAX_USER_DESC_SIZE 0x10 -#define USER_DESC_COMMAND_SIZE 20 - -int zbl_user_desc_set(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char len, - unsigned char *user_desc, zb_zdo_user_desc_conf_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - unsigned char j = 0x00; - GVariantBuilder *user_desc_builder = NULL; - GVariant *user_desc_variant = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); - RETVM_IF(len > MAX_USER_DESC_SIZE, ZIGBEE_ERROR_INVALID_PARAMETER, - "invalid length=%d", len); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zdo_dev_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "user_desc_confirm", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, - _zbl_response_cb, container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - free(container); - container = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZDO_USER_DESC_SET_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - user_desc_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); - for (j = 0; j < len; j++) - g_variant_builder_add(user_desc_builder, "(y)", user_desc[j]); - - user_desc_variant = g_variant_builder_end(user_desc_builder); - g_variant_builder_unref(user_desc_builder); - - variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "user_desc_set_req", - g_variant_new("(qy@a(y))", addr16, len, user_desc_variant), - G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'user_desc_set_req' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_device_annce(zb_zigbee_h handle, zb_nwk_addr addr16, zb_ieee_addr addr64, - unsigned char capability) -{ - int result = ZIGBEE_ERROR_NONE; - GError *dbus_err = NULL; - GVariant *variant = NULL; - - GVariantBuilder *mac_builder = NULL; - GVariant* mac_variant = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); - - mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); - g_variant_builder_add(mac_builder, "(y)", addr64[7]); - g_variant_builder_add(mac_builder, "(y)", addr64[6]); - g_variant_builder_add(mac_builder, "(y)", addr64[5]); - g_variant_builder_add(mac_builder, "(y)", addr64[4]); - g_variant_builder_add(mac_builder, "(y)", addr64[3]); - g_variant_builder_add(mac_builder, "(y)", addr64[2]); - g_variant_builder_add(mac_builder, "(y)", addr64[1]); - g_variant_builder_add(mac_builder, "(y)", addr64[0]); - mac_variant = g_variant_builder_end(mac_builder); - g_variant_builder_unref(mac_builder); - - variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "device_announce", - g_variant_new("(q@a(y)y)", addr16, mac_variant, capability), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'device_announce' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_bind_req(zb_nwk_addr dst_addr16, zb_ieee_addr src_addr64, - unsigned char src_ep, unsigned short clusterid, zb_ieee_addr dst_addr64, - unsigned char type, zb_nwk_addr group_addr, unsigned char dst_ep, - zb_zdo_bind_cb cb, void *user_data) -{ - int i; - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GError *dbus_err = NULL; - GVariant *variant = NULL; - - GVariantBuilder *src_addr64_builder = NULL; - GVariant* src_addr64_variant = NULL; - GVariantBuilder *dst_addr64_builder = NULL; - GVariant* dst_addr64_variant = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zdo_bind_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_zdo_bind_req()"); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zdo_bind_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZDO_BIND_INTERFACE, "bind_rsp", ZIGBEE_CONTROL_OBJECT_PATH, - NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup); - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - free(container); - container = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZDO_BIND_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - src_addr64_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); - - if (src_addr64) { - for (i = sizeof(zb_ieee_addr) - 1 ; i >= 0; i--) - g_variant_builder_add(src_addr64_builder, "(y)", src_addr64[i]); - } - src_addr64_variant = g_variant_builder_end(src_addr64_builder); - g_variant_builder_unref(src_addr64_builder); - - dst_addr64_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); - if (dst_addr64) { - for (i = sizeof(zb_ieee_addr) - 1 ; i >= 0; i--) - g_variant_builder_add(dst_addr64_builder, "(y)", dst_addr64[i]); - } - dst_addr64_variant = g_variant_builder_end(dst_addr64_builder); - g_variant_builder_unref(dst_addr64_builder); - - variant = g_dbus_proxy_call_sync(zdo_bind_proxy, "bind_req", - g_variant_new("(q@a(y)yq@a(y)yqy)", dst_addr16, src_addr64_variant, src_ep, - clusterid, dst_addr64_variant, type, group_addr, dst_ep), - G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'bind_req' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_unbind_req(zb_nwk_addr dst_addr16, - zb_ieee_addr src_addr64, unsigned char src_ep, unsigned short clusterid, - zb_ieee_addr dst_addr64, unsigned char type, zb_nwk_addr group_addr, - unsigned char dst_ep, zb_zdo_unbind_cb cb, void *user_data) -{ - int i; - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GError *dbus_err = NULL; - GVariant *variant = NULL; - - GVariantBuilder *src_addr64_builder = NULL; - GVariant* src_addr64_variant = NULL; - GVariantBuilder *dst_addr64_builder = NULL; - GVariant* dst_addr64_variant = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zdo_bind_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_zdo_unbind_req()"); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zdo_bind_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZDO_BIND_INTERFACE, "unbind_rsp", ZIGBEE_CONTROL_OBJECT_PATH, - NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup); - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - free(container); - container = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZDO_UNBIND_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - src_addr64_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); - if (src_addr64) { - for (i = sizeof(zb_ieee_addr) - 1 ; i >= 0; i--) - g_variant_builder_add(src_addr64_builder, "(y)", src_addr64[i]); - } - src_addr64_variant = g_variant_builder_end(src_addr64_builder); - g_variant_builder_unref(src_addr64_builder); - - dst_addr64_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); - if (dst_addr64) { - for (i = sizeof(zb_ieee_addr) - 1 ; i >= 0; i--) - g_variant_builder_add(dst_addr64_builder, "(y)", dst_addr64[i]); - } - dst_addr64_variant = g_variant_builder_end(dst_addr64_builder); - g_variant_builder_unref(dst_addr64_builder); - - variant = g_dbus_proxy_call_sync(zdo_bind_proxy, "unbind_req", - g_variant_new("(q@a(y)yq@a(y)yqy)", dst_addr16, src_addr64_variant, src_ep, - clusterid, dst_addr64_variant, type, group_addr, dst_ep), - G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'unbind_req' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_mgmt_nwk_disc_req(zb_nwk_addr addr16, unsigned int scan_channels, - unsigned char scan_duration, unsigned char scan_count, unsigned char start_idx, - zb_zdo_mgmt_nwk_disc_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_mgmt_nwk_disc_req()"); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zdo_dev_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "mgmt_nwk_disc_rsp", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, - container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - free(container); - container = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZDO_MGMT_NWK_DISC_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_nwk_disc_req", - g_variant_new("(quyqy)", addr16, scan_channels, scan_duration, scan_count, start_idx), - G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'mgmt_nwk_disc_req' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_mgmt_nwk_update_req(unsigned int scan_channels, unsigned char scan_duration, - unsigned char scan_count, unsigned char nwk_update_id, zb_nwk_addr nwk_manager_addr) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_mgmt_nwk_update_req()"); - - variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_nwk_update_req", - g_variant_new("(quyyy)", nwk_manager_addr, scan_channels, scan_duration, - scan_count, nwk_update_id), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'mgmt_nwk_update_req' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_mgmt_lqi_req(zb_nwk_addr addr16, unsigned char start_idx, - zb_zdo_mgmt_lqi_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_mgmt_lqi_req()"); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zdo_dev_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "mgmt_lqi_rsp", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container, - _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - free(container); - container = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZDO_MGMT_LQI_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_lqi_req", - g_variant_new("(qy)", addr16, start_idx), - G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'mgmt_lqi_req' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_mgmt_rtg_req(zb_nwk_addr addr16, unsigned char start_idx, - zb_zdo_mgmt_rtg_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_mgmt_rtg_req()"); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zdo_dev_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "mgmt_rtg_rsp", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container, - _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - free(container); - container = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZDO_MGMT_RTG_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_rtg_req", - g_variant_new("(qy)", addr16, start_idx), - G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'mgmt_rtg_req' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_mgmt_bind_req(zb_nwk_addr addr16, unsigned char start_idx, - zb_zdo_mgmt_bind_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_mgmt_bind_req()"); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zdo_dev_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "mgmt_bind_rsp", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container, - _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - free(container); - container = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZDO_MGMT_BIND_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_bind_req", - g_variant_new("(qy)", addr16, start_idx), - G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'mgmt_bind_req' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_mgmt_leave_device(zb_ieee_addr addr64, unsigned char remove_children, - unsigned rejoin, zb_zdo_mgmt_leave_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - GVariantBuilder *mac_builder = NULL; - GVariant* mac_variant = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zdo_dev_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "mgmt_leave_rsp", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container, - _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - free(container); - container = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZDO_MGMT_LEAVE_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); - g_variant_builder_add(mac_builder, "(y)", addr64[7]); - g_variant_builder_add(mac_builder, "(y)", addr64[6]); - g_variant_builder_add(mac_builder, "(y)", addr64[5]); - g_variant_builder_add(mac_builder, "(y)", addr64[4]); - g_variant_builder_add(mac_builder, "(y)", addr64[3]); - g_variant_builder_add(mac_builder, "(y)", addr64[2]); - g_variant_builder_add(mac_builder, "(y)", addr64[1]); - g_variant_builder_add(mac_builder, "(y)", addr64[0]); - mac_variant = g_variant_builder_end(mac_builder); - g_variant_builder_unref(mac_builder); - - variant = g_dbus_proxy_call_sync(service_gproxy, "leave_request", - g_variant_new("(@a(y)yy)", mac_variant, remove_children, rejoin), - G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'leave_request' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_mgmt_permit_joining_req(zb_nwk_addr addr16, unsigned char duration, - unsigned char tc_significance, zb_zdo_mgmt_permit_joining_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zdo_dev_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "mgmt_permit_join_rsp", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, - container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - free(container); - container = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZDO_MGMT_PERMIT_JOIN_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_permit_join_req", - g_variant_new("(qyy)", addr16, duration, tc_significance), - G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'mgmt_permit_join_req' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_aps_send(zb_nwk_addr addr16, unsigned char aps_fc, - unsigned char src_ep, unsigned char dst_ep, unsigned short clusterid, - unsigned short profileid, unsigned char zcl_fc, unsigned short mfg_code, - unsigned char cmd_id, unsigned short payload_len, unsigned char *payload, - zb_aps_send_cb cb, void *user_data) -{ - int sub_id, to, i; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - GVariantBuilder *payload_builder = NULL; - GVariant *payload_variant = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == custom_gproxy, ZIGBEE_ERROR_IO_ERROR); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(custom_gproxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_CUSTOM_INTERFACE, "aps_send_rsp", ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, - _zbl_response_cb, container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - free(container); - container = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_CUSTOM_APS_SEND_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - payload_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); - if (payload_len > 0) { - for (i = payload_len - 1; i >= 0 ; i--) - g_variant_builder_add(payload_builder, "(y)", payload[i]); - } - payload_variant = g_variant_builder_end(payload_builder); - g_variant_builder_unref(payload_builder); - - variant = g_dbus_proxy_call_sync(custom_gproxy, "aps_send", - g_variant_new("(qyyyqqyqyq@a(y))", addr16, aps_fc, src_ep, dst_ep, - clusterid, profileid, zcl_fc, mfg_code, cmd_id, payload_len, - payload_variant), - G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'aps_send' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_zcl_send(zb_nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep, - unsigned short clusterid, unsigned char zcl_fc, unsigned char cmd, - unsigned short payload_len, unsigned char *payload, - zb_zcl_send_cb cb, void *user_data) -{ - int sub_id, to, i; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - GVariantBuilder *payload_builder = NULL; - GVariant *payload_variant = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == custom_gproxy, ZIGBEE_ERROR_IO_ERROR); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(custom_gproxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_CUSTOM_INTERFACE, "zcl_send_rsp", ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, - _zbl_response_cb, container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - free(container); - container = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_CUSTOM_ZCL_SEND_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - payload_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); - if (payload_len > 0) { - for (i = payload_len - 1; i >= 0 ; i--) - g_variant_builder_add(payload_builder, "(y)", payload[i]); - } - payload_variant = g_variant_builder_end(payload_builder); - g_variant_builder_unref(payload_builder); - - variant = g_dbus_proxy_call_sync(custom_gproxy, "zcl_send", - g_variant_new("(qyyqyyq@a(y))", addr16, src_ep, dst_ep, clusterid, zcl_fc, - cmd, payload_len, payload_variant), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'zcl_send' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_send_to_local(unsigned short length, unsigned char *data, - zb_send_to_local_cb cb, void *user_data) -{ - int sub_id, to, i; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - GVariantBuilder *payload_builder = NULL; - GVariant *payload_variant = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == custom_gproxy, ZIGBEE_ERROR_IO_ERROR); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(custom_gproxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_CUSTOM_INTERFACE, "send_to_local_rsp", ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, - _zbl_response_cb, container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - free(container); - container = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_CUSTOM_LOCAL_SEND_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - payload_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); - if (length > 0) { - for (i = length - 1; i >= 0 ; i--) - g_variant_builder_add(payload_builder, "(y)", data[i]); - } - payload_variant = g_variant_builder_end(payload_builder); - g_variant_builder_unref(payload_builder); - - variant = g_dbus_proxy_call_sync(custom_gproxy, "send_to_local", - g_variant_new("(q@a(y))", length, payload_variant), - G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'send_to_local' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_read_attr_req(zb_zigbee_h handle, unsigned short addr16, unsigned char dest_ep, - unsigned char zcl_fc, unsigned short clusterid, unsigned short *attribute_ids, - int attribute_ids_len, zb_zcl_global_attr_read_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - -#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC - zb_event_global_default_rsp_s *global_req = NULL; -#endif - - int i = 0; - unsigned char *t; - GVariant *attr_variant = NULL; - GVariantBuilder *attr_builder = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_read_attr_req()"); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zcl_global_proxy); - sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, - ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "read_attributes_rsp", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, - _zbl_response_cb, container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - free(container); - container = NULL; - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZCL_GLOBAL_READ_ATTRIBUTE_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; -#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC - global_req = calloc(1, sizeof(zb_event_global_default_rsp_s)); - if (NULL == global_req) { - g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id); - g_source_remove(container->tid); - container->tid = 0; - free(container); - container = NULL; - ERR("calloc() Fail(%d)", errno); - return ZIGBEE_ERROR_OUT_OF_MEMORY; - } - global_req->ep = dest_ep; - global_req->clusterid = clusterid; - global_req->commandid = ZB_ZCL_CMD_READ_ATTRIBUTES; - - container->global_cmd = global_req; - container->handle = handle; - - /* Register global request information into handle */ - _zbl_register_global_req(handle, container); -#endif - - t = (unsigned char *)attribute_ids; - attr_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); - for (i = 0; i < attribute_ids_len*sizeof(unsigned short); i++) - g_variant_builder_add(attr_builder, "(y)", t[i]); - attr_variant = g_variant_builder_end(attr_builder); - g_variant_builder_unref(attr_builder); - - variant = g_dbus_proxy_call_sync(zcl_global_proxy, "read_attributes_req", - g_variant_new("(@a(y)iqqyy)", attr_variant, attribute_ids_len, - addr16, clusterid, zcl_fc, dest_ep), G_DBUS_CALL_FLAGS_NONE, to, - NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'read_attributes_req' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_write_attr_req(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char src_ep, - unsigned char dst_ep, unsigned char zcl_fc, unsigned short clusterid, - void **data, int count, zb_zcl_global_attr_write_cb cb, - void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - struct write_attribute_record_s **records = (struct write_attribute_record_s **)data; - -#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC - zb_event_global_default_rsp_s *global_req = NULL; -#endif - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_write_attr_req()"); - - GVariantBuilder *rec_builder = NULL; - GVariant *rec_variant = NULL; - - int i = 0; - int j = 0; - - char dSize[3] = {'\0', '\0'}; - int writeAttributeIndex = 0; - int size_of_allo = 0; - - unsigned char *isString = NULL; - unsigned short *dataSize = NULL; - unsigned char *writeAttribute = NULL; - - isString = calloc(count + 1, sizeof(unsigned char)); - RETVM_IF(NULL == isString, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - dataSize = calloc(count + 1, sizeof(unsigned short)); - if (NULL == dataSize) { - ERR("calloc() Fail(%d)", errno); - if (isString) { - free(isString); - isString = NULL; - } - return ZIGBEE_ERROR_OUT_OF_MEMORY; - } - - DBG("Records Length %d", count); - - while (j < count) { - dataSize[j] = zb_zcl_get_data_size((*records)[j].type); - - if (0xff != dataSize[j]) { - - isString[j] = 0; - size_of_allo = size_of_allo + (dataSize[j] + 3); - - } else { - if ((*records)[j].value) { - if ((*records)[j].type == ZB_ZCL_CHARACTER_STRING - || (*records)[j].type == ZB_ZCL_OCTET_STRING) { - - isString[j] = 1; - dataSize[j] = (*records)[j].value[0]; - size_of_allo = size_of_allo + (dataSize[j] + 3 + 1); - - } else if ((*records)[j].type == ZB_ZCL_LONG_OCTET_STRING - || (*records)[j].type == ZB_ZCL_LONG_CHARACTER_STRING) { - - isString[j] = 2; - dSize[0] = (*records)[j].value[0]; - dSize[1] = (*records)[j].value[1]; - dataSize[j] = dSize[1]; - dataSize[j] = (dataSize[j] << 8) | dSize[0]; - size_of_allo = size_of_allo + (dataSize[j] + 3 + 2); - } - } else - ERR("Data is not present"); - } - j++; - } - DBG("size_of_allo Length %d", size_of_allo); - - writeAttribute = calloc(size_of_allo + 1, sizeof(unsigned char)); - if (NULL == writeAttribute) { - ERR("Couldn't Allocate Memory"); - if (isString) { - free(isString); - isString = NULL; - } - if (dataSize) { - free(dataSize); - dataSize = NULL; - } - return ZIGBEE_ERROR_OUT_OF_MEMORY; - } - - j = 0; - while (j < count && writeAttributeIndex < size_of_allo) { - writeAttribute[writeAttributeIndex++] = ((*records)[j].id) & 0xff; - writeAttribute[writeAttributeIndex++] = (((*records)[j].id) >> 8) & 0xff; - writeAttribute[writeAttributeIndex++] = (*records)[j].type; - for (i = 0; i < (dataSize[j] + isString[j]); i++) { - writeAttribute[writeAttributeIndex++] = (*records)[j].value[i]; - DBG("0x%02X", (*records)[j].value[i]); - } - j++; - } - - rec_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); - DBG(" "); - for (i = 0; i < writeAttributeIndex ; i++) { - DBG("0x%02X", writeAttribute[i]); - g_variant_builder_add(rec_builder, "(y)", writeAttribute[i]); - } - - rec_variant = g_variant_builder_end(rec_builder); - g_variant_builder_unref(rec_builder); - - container = calloc(1, sizeof(zbl_req_cb_s)); - if (NULL == container) { - ERR("calloc() Fail(%d)", errno); - if (isString) { - free(isString); - isString = NULL; - } - if (dataSize) { - free(dataSize); - dataSize = NULL; - } - if (writeAttribute) { - free(writeAttribute); - writeAttribute = NULL; - } - return ZIGBEE_ERROR_OUT_OF_MEMORY; - } - - to = zbl_dbus_get_timeout(zcl_global_proxy); - sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, - ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "write_attributes_rsp", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, - container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - if (isString) { - free(isString); - isString = NULL; - } - if (dataSize) { - free(dataSize); - dataSize = NULL; - } - if (writeAttribute) { - free(writeAttribute); - writeAttribute = NULL; - } - if (container) { - free(container); - container = NULL; - } - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; -#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC - global_req = calloc(1, sizeof(zb_event_global_default_rsp_s)); - if (NULL == global_req) { - g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id); - g_source_remove(container->tid); - container->tid = 0; - if (isString) { - free(isString); - isString = NULL; - } - if (dataSize) { - free(dataSize); - dataSize = NULL; - } - if (writeAttribute) { - free(writeAttribute); - writeAttribute = NULL; - } - if (container) { - free(container); - container = NULL; - } - ERR("calloc() Fail(%d)", errno); - return ZIGBEE_ERROR_OUT_OF_MEMORY; - } - global_req->ep = dst_ep; - global_req->clusterid = clusterid; - global_req->commandid = ZB_ZCL_CMD_WRITE_ATTRIBUTES; - - container->global_cmd = global_req; - container->handle = handle; - - /* Register global request information into handle */ - _zbl_register_global_req(handle, container); -#endif - - variant = g_dbus_proxy_call_sync(zcl_global_proxy, "write_attributes_req", - g_variant_new("(@a(y)iqqyyy)", rec_variant, writeAttributeIndex, addr16, - clusterid, zcl_fc, src_ep, dst_ep), G_DBUS_CALL_FLAGS_NONE, - to, NULL, &dbus_err); - - if (isString) { - free(isString); - isString = NULL; - } - if (dataSize) { - free(dataSize); - dataSize = NULL; - } - if (writeAttribute) { - free(writeAttribute); - writeAttribute = NULL; - } - - if (!variant) { - ERR("Failed to get 'write_attributes_req' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_wattr_undivided_req(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, - unsigned short clusterid, void **data, int count, - zb_zcl_global_attr_write_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - struct write_attribute_record_s **records = (struct write_attribute_record_s **)data; - -#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC - zb_event_global_default_rsp_s *global_req = NULL; -#endif - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_wattr_undivided_req()"); - - GVariantBuilder *rec_builder = NULL; - GVariant *rec_variant = NULL; - - int i = 0; - int j = 0; - - char dSize[3] = {'\0', '\0'}; - int writeAttributeIndex = 0; - int size_of_allo = 0; - - unsigned char *isString = NULL; - unsigned short *dataSize = NULL; - unsigned char *writeAttribute = NULL; - - isString = calloc(count + 1, sizeof(unsigned char)); - RETVM_IF(NULL == isString, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - dataSize = calloc(count + 1, sizeof(unsigned short)); - if (NULL == dataSize) { - ERR("calloc() Fail(%d)", errno); - free(isString); - return ZIGBEE_ERROR_OUT_OF_MEMORY; - } - - DBG("Records Length %d", count); - - while (j < count) { - dataSize[j] = zb_zcl_get_data_size((*records)[j].type); - if (0xff != dataSize[j]) { - isString[j] = 0; - size_of_allo = size_of_allo + (dataSize[j] + 3); - } else { - if ((*records)[j].value) { - if ((*records)[j].type == ZB_ZCL_CHARACTER_STRING - || (*records)[j].type == ZB_ZCL_OCTET_STRING) { - isString[j] = 1; - dataSize[j] = (*records)[j].value[0]; - size_of_allo = size_of_allo + (dataSize[j] + 3 + 1); - } else if ((*records)[j].type == ZB_ZCL_LONG_OCTET_STRING - || (*records)[j].type == ZB_ZCL_LONG_CHARACTER_STRING) { - isString[j] = 2; - dSize[0] = (*records)[j].value[0]; - dSize[1] = (*records)[j].value[1]; - dataSize[j] = dSize[1]; - dataSize[j] = (dataSize[j] << 8) | dSize[0]; - size_of_allo = size_of_allo + (dataSize[j] + 3 + 2); - } - } else - ERR("Data is not present"); - } - j++; - } - DBG("size_of_allo Length %d", size_of_allo); - - writeAttribute = calloc(size_of_allo + 1, sizeof(unsigned char)); - if (NULL == writeAttribute) { - ERR("Couldn't Allocate Memory"); - if (isString) { - free(isString); - isString = NULL; - } - if (dataSize) { - free(dataSize); - dataSize = NULL; - } - return ZIGBEE_ERROR_OUT_OF_MEMORY; - } - - j = 0; - while (j < count && writeAttributeIndex < size_of_allo) { - writeAttribute[writeAttributeIndex++] = ((*records)[j].id) & 0xff; - writeAttribute[writeAttributeIndex++] = (((*records)[j].id) >> 8) & 0xff; - writeAttribute[writeAttributeIndex++] = (*records)[j].type; - for (i = 0; i < (dataSize[j] + isString[j]); i++) { - writeAttribute[writeAttributeIndex++] = (*records)[j].value[i]; - DBG("0x%02X", (*records)[j].value[i]); - } - j++; - } - - rec_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); - DBG(" "); - for (i = 0; i < writeAttributeIndex ; i++) { - DBG("0x%02X", writeAttribute[i]); - g_variant_builder_add(rec_builder, "(y)", writeAttribute[i]); - } - - rec_variant = g_variant_builder_end(rec_builder); - g_variant_builder_unref(rec_builder); - - container = calloc(1, sizeof(zbl_req_cb_s)); - if (NULL == container) { - ERR("calloc() Fail(%d)", errno); - if (isString) { - free(isString); - isString = NULL; - } - if (dataSize) { - free(dataSize); - dataSize = NULL; - } - if (writeAttribute) { - free(writeAttribute); - writeAttribute = NULL; - } - return ZIGBEE_ERROR_OUT_OF_MEMORY; - } - - to = zbl_dbus_get_timeout(zcl_global_proxy); - sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, - ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "write_attributes_rsp", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, - container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - if (isString) { - free(isString); - isString = NULL; - } - if (dataSize) { - free(dataSize); - dataSize = NULL; - } - if (writeAttribute) { - free(writeAttribute); - writeAttribute = NULL; - } - if (container) { - free(container); - container = NULL; - } - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; -#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC - global_req = calloc(1, sizeof(zb_event_global_default_rsp_s)); - if (NULL == global_req) { - g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id); - g_source_remove(container->tid); - container->tid = 0; - if (isString) { - free(isString); - isString = NULL; - } - if (dataSize) { - free(dataSize); - dataSize = NULL; - } - if (writeAttribute) { - free(writeAttribute); - writeAttribute = NULL; - } - if (container) { - free(container); - container = NULL; - } - ERR("calloc() Fail(%d)", errno); - return ZIGBEE_ERROR_OUT_OF_MEMORY; - } - global_req->ep = dst_ep; - global_req->clusterid = clusterid; - global_req->commandid = ZB_ZCL_CMD_WRITE_ATTRIBUTES_UNDIVIDED; - - container->global_cmd = global_req; - container->handle = handle; - - /* Register global request information into handle */ - _zbl_register_global_req(handle, container); -#endif - - variant = g_dbus_proxy_call_sync(zcl_global_proxy, "write_attributes_undivided_req", - g_variant_new("(@a(y)iqqyyy)", rec_variant, writeAttributeIndex, addr16, - clusterid, zcl_fc, src_ep, dst_ep), G_DBUS_CALL_FLAGS_NONE, - to, NULL, &dbus_err); - - if (isString) { - free(isString); - isString = NULL; - } - if (dataSize) { - free(dataSize); - dataSize = NULL; - } - if (writeAttribute) { - free(writeAttribute); - writeAttribute = NULL; - } - - if (!variant) { - ERR("Failed to get 'write_attributes_undivided_req' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_wattr_req_no_cb(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char src_ep, - unsigned char dst_ep, unsigned char zcl_fc, unsigned short clusterid, - void **data, int count) -{ - int result = ZIGBEE_ERROR_NONE; - GError *dbus_err = NULL; - GVariant *variant = NULL; - - struct write_attribute_record_s **records = (struct write_attribute_record_s **)data; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_wattr_req_no_cb()"); - - GVariantBuilder *rec_builder = NULL; - GVariant *rec_variant = NULL; - - int i = 0; - int j = 0; - - char dSize[3] = {'\0', '\0'}; - int writeAttributeIndex = 0; - int size_of_allo = 0; - - unsigned char *isString = NULL; - unsigned short *dataSize = NULL; - unsigned char *writeAttribute = NULL; - - isString = calloc(count + 1, sizeof(unsigned char)); - RETVM_IF(NULL == isString, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - dataSize = calloc(count + 1, sizeof(unsigned short)); - if (NULL == dataSize) { - ERR("calloc() Fail(%d)", errno); - if (isString) { - free(isString); - isString = NULL; - } - return ZIGBEE_ERROR_OUT_OF_MEMORY; - } - - DBG("Records Length %d", count); - - while (j < count) { - dataSize[j] = zb_zcl_get_data_size((*records)[j].type); - if (0xff != dataSize[j]) { - isString[j] = 0; - size_of_allo = size_of_allo + (dataSize[j] + 3); - } else { - if ((*records)[j].value) { - if ((*records)[j].type == ZB_ZCL_CHARACTER_STRING - || (*records)[j].type == ZB_ZCL_OCTET_STRING) { - isString[j] = 1; - dataSize[j] = (*records)[j].value[0]; - size_of_allo = size_of_allo + (dataSize[j] + 3 + 1); - } else if ((*records)[j].type == ZB_ZCL_LONG_OCTET_STRING - || (*records)[j].type == ZB_ZCL_LONG_CHARACTER_STRING) { - isString[j] = 2; - dSize[0] = (*records)[j].value[0]; - dSize[1] = (*records)[j].value[1]; - dataSize[j] = dSize[1]; - dataSize[j] = (dataSize[j] << 8) | dSize[0]; - size_of_allo = size_of_allo + (dataSize[j] + 3 + 2); - } - } else - ERR("Data is not present"); - } - j++; - } - DBG("size_of_allo Length %d", size_of_allo); - - writeAttribute = calloc(size_of_allo + 1, sizeof(unsigned char)); - if (NULL == writeAttribute) { - ERR("Couldn't Allocate Memory"); - if (isString) { - free(isString); - isString = NULL; - } - if (dataSize) { - free(dataSize); - dataSize = NULL; - } - return ZIGBEE_ERROR_OUT_OF_MEMORY; - } - - j = 0; - while (j < count && writeAttributeIndex < size_of_allo) { - writeAttribute[writeAttributeIndex++] = ((*records)[j].id) & 0xff; - writeAttribute[writeAttributeIndex++] = (((*records)[j].id) >> 8) & 0xff; - writeAttribute[writeAttributeIndex++] = (*records)[j].type; - for (i = 0; i < (dataSize[j] + isString[j]); i++) { - writeAttribute[writeAttributeIndex++] = (*records)[j].value[i]; - DBG("0x%02X", (*records)[j].value[i]); - } - j++; - } - - rec_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); - DBG(" "); - for (i = 0; i < writeAttributeIndex ; i++) { - DBG("0x%02X", writeAttribute[i]); - g_variant_builder_add(rec_builder, "(y)", writeAttribute[i]); - } - - rec_variant = g_variant_builder_end(rec_builder); - g_variant_builder_unref(rec_builder); - - variant = g_dbus_proxy_call_sync(zcl_global_proxy, "write_attributes_no_resp", - g_variant_new("(@a(y)iqqyyy)", rec_variant, writeAttributeIndex, addr16, - clusterid, zcl_fc, src_ep, dst_ep), G_DBUS_CALL_FLAGS_NONE, - -1, NULL, &dbus_err); - - if (isString) { - free(isString); - isString = NULL; - } - if (dataSize) { - free(dataSize); - dataSize = NULL; - } - if (writeAttribute) { - free(writeAttribute); - writeAttribute = NULL; - } - if (!variant) { - ERR("Failed to get 'write_attributes_no_rep' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_write_config_report(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, - unsigned short clusterid, void **data, int count, - zb_zcl_global_config_report_write_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - struct reporting_configuration_record_s **records = - (struct reporting_configuration_record_s **)data; - -#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC - zb_event_global_default_rsp_s *global_req = NULL; -#endif - - int i = 0; - int j = 0; - int len = 0; - int payload_len = 0; - - GVariantBuilder *rec_builder = NULL; - GVariant *rec_variant = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_write_config_report()"); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zcl_global_proxy); - sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, - ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "configure_reporting_rsp", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, - container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - if (container) { - free(container); - container = NULL; - } - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZCL_GLOBAL_WRITE_CONFIGURE_REPORTING_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; -#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC - global_req = calloc(1, sizeof(zb_event_global_default_rsp_s)); - if (NULL == global_req) { - g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id); - g_source_remove(container->tid); - container->tid = 0; - if (container) { - free(container); - container = NULL; - } - ERR("calloc() Fail(%d)", errno); - return ZIGBEE_ERROR_OUT_OF_MEMORY; - } - global_req->ep = dst_ep; - global_req->clusterid = clusterid; - global_req->commandid = ZB_ZCL_CMD_CONFIGURE_REPORTING; - - container->global_cmd = global_req; - container->handle = handle; - - /* Register global request information into handle */ - _zbl_register_global_req(handle, container); -#endif - - rec_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); - for (i = 0; i < count; i++) { - g_variant_builder_add(rec_builder, "(y)", (*records)[i].dir); - DBG("dir = 0x%02X", (*records)[i].dir); - payload_len += sizeof((*records)[i].dir); - g_variant_builder_add(rec_builder, "(y)", (*records)[i].id & 0xff); - g_variant_builder_add(rec_builder, "(y)", ((*records)[i].id >> 8) & 0xff); - DBG("id = 0x%04X", (*records)[i].id); - payload_len += sizeof((*records)[i].id); - g_variant_builder_add(rec_builder, "(y)", (*records)[i].type); - payload_len += sizeof((*records)[i].type); - DBG("type = 0x%04X", (*records)[i].type); - g_variant_builder_add(rec_builder, "(y)", (*records)[i].min_i & 0xff); - g_variant_builder_add(rec_builder, "(y)", ((*records)[i].min_i >> 8) & 0xff); - DBG("min_i = 0x%04X", (*records)[i].min_i); - payload_len += sizeof((*records)[i].min_i); - g_variant_builder_add(rec_builder, "(y)", (*records)[i].max_i & 0xff); - g_variant_builder_add(rec_builder, "(y)", ((*records)[i].max_i >> 8) & 0xff); - DBG("max_i = 0x%04X", (*records)[i].max_i); - payload_len += sizeof((*records)[i].max_i); - - len = zb_zcl_get_data_size((*records)[i].type); - payload_len += len; - DBG("change length = %d", len); - DBG("payload length = %d", payload_len); - - for (j = 0; j < len && (*records)[i].change+j; j++) { - DBG("records[%d]->change[%d] = %d", i, j, (*records)[i].change[j]); - g_variant_builder_add(rec_builder, "(y)", (*records)[i].change[j]); - } - - } - rec_variant = g_variant_builder_end(rec_builder); - g_variant_builder_unref(rec_builder); - - variant = g_dbus_proxy_call_sync(zcl_global_proxy, "configure_reporting_req", - g_variant_new("(@a(y)qqqyyy)", rec_variant, count, addr16, clusterid, - zcl_fc, src_ep, dst_ep), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'configure_reporting_req' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_read_config_report(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, - unsigned short clusterid, void **data, int count, - zb_zcl_global_config_report_read_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - struct read_reporting_configuration_record_s **records = - (struct read_reporting_configuration_record_s **)data; - -#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC - zb_event_global_default_rsp_s *global_req = NULL; -#endif - - int i = 0; - int j = 0; - int size_of_allo = 0; - unsigned short idx = 0; - GVariantBuilder *rec_builder = NULL; - GVariant *rec_variant = NULL; - unsigned char *read_attributes; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_config_report_read()"); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zcl_global_proxy); - sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, - ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "read_configure_reporting_rsp", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, - container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - if (container) { - free(container); - container = NULL; - } - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZCL_GLOBAL_READ_CONFIGURE_REPORTING_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; -#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC - global_req = calloc(1, sizeof(zb_event_global_default_rsp_s)); - if (NULL == global_req) { - g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id); - g_source_remove(container->tid); - container->tid = 0; - if (container) { - free(container); - container = NULL; - } - ERR("calloc() Fail(%d)", errno); - return ZIGBEE_ERROR_OUT_OF_MEMORY; - } - global_req->ep = dst_ep; - global_req->clusterid = clusterid; - global_req->commandid = ZB_ZCL_CMD_READ_REPORTING_CONFIGURATION; - - container->global_cmd = global_req; - container->handle = handle; - - /* Register global request information into handle */ - _zbl_register_global_req(handle, container); -#endif - - DBG("Records Length %d", count); - /** - * According to zcl spec - * Memory needed for the read_reporting_configured_frame. - * 1 byte(direction) + 2 bytes(AttributeId) - * = 3 bytes/variable - */ - while (j < count) { - size_of_allo = size_of_allo + 3; - j++; - } - DBG("size_of_allo Length %d", size_of_allo); - - read_attributes = calloc(size_of_allo, sizeof(unsigned char)); - if (NULL == read_attributes) { - ERR("Couldn't Allocate Memory"); - g_dbus_connection_signal_unsubscribe(gdbus_conn, container->sid); - g_source_remove(container->tid); - container->tid = 0; - if (container) { - free(container); - container = NULL; - } - return ZIGBEE_ERROR_OUT_OF_MEMORY; - } - j = 0; - while (j < count && idx < size_of_allo) { - read_attributes[idx++] = (*records)[j].dir; - read_attributes[idx++] = (*records)[j].id & 0xff; - read_attributes[idx++] = (*records)[j].id >> 8 & 0xff; - DBG("Id copied \n"); - j++; - } - - rec_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); - - for (i = 0; i < idx ; i++) { - DBG("0x%02X", read_attributes[i]); - g_variant_builder_add(rec_builder, "(y)", read_attributes[i]); - } - - rec_variant = g_variant_builder_end(rec_builder); - g_variant_builder_unref(rec_builder); - - variant = g_dbus_proxy_call_sync(zcl_global_proxy, "read_configure_reporting", - g_variant_new("(@a(y)qqqyyy)", rec_variant, idx, addr16, clusterid, zcl_fc, - src_ep, dst_ep), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (read_attributes) { - free(read_attributes); - read_attributes = NULL; - } - - if (!variant) { - ERR("Failed to get 'read_configure_reporting' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_discover_attr_req(zb_zigbee_h handle, unsigned short addr16, unsigned char src_ep, - unsigned char dest_ep, unsigned char zcl_fc, unsigned short clusterid, - unsigned short start_id, unsigned char max_attribute_ids, - zb_zcl_global_attr_discover_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - -#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC - zb_event_global_default_rsp_s *global_req = NULL; -#endif - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_discover_attr_req()"); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zcl_global_proxy); - sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, - ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "discover_attribute_rsp", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, - _zbl_response_cb, container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - if (container) { - free(container); - container = NULL; - } - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; -#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC - global_req = calloc(1, sizeof(zb_event_global_default_rsp_s)); - if (NULL == global_req) { - g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id); - g_source_remove(container->tid); - container->tid = 0; - if (container) { - free(container); - container = NULL; - } - ERR("calloc() Fail(%d)", errno); - return ZIGBEE_ERROR_OUT_OF_MEMORY; - } - global_req->ep = dest_ep; - global_req->clusterid = clusterid; - global_req->commandid = ZB_ZCL_CMD_DISCOVER_ATTRIBUTES; - - container->global_cmd = global_req; - container->handle = handle; - - /* Register global request information into handle */ - _zbl_register_global_req(handle, container); -#endif - - variant = g_dbus_proxy_call_sync(zcl_global_proxy, "discover_attributes", - g_variant_new("(qyyqqy)", - addr16, dest_ep, zcl_fc, clusterid, start_id, max_attribute_ids), - G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'discover_attributes' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_discover_cmds_gen(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char src_ep, - unsigned char dst_ep, unsigned char zcl_fc, unsigned short clusterid, - unsigned char start_command_id, unsigned char max_command_ids, - zb_zcl_global_discover_cmds_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - -#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC - zb_event_global_default_rsp_s *global_req = NULL; -#endif - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_discover_attr_gen()"); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zcl_global_proxy); - sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, - ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "discover_commands_generated_rsp", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container, - _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - if (container) { - free(container); - container = NULL; - } - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_GENERATED_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; -#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC - global_req = calloc(1, sizeof(zb_event_global_default_rsp_s)); - if (NULL == global_req) { - g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id); - g_source_remove(container->tid); - container->tid = 0; - if (container) { - free(container); - container = NULL; - } - ERR("calloc() Fail(%d)", errno); - return ZIGBEE_ERROR_OUT_OF_MEMORY; - } - global_req->ep = dst_ep; - global_req->clusterid = clusterid; - global_req->commandid = ZB_ZCL_CMD_DISCOVER_COMMANDS_GENERATED; - - container->global_cmd = global_req; - container->handle = handle; - - /* Register global request information into handle */ - _zbl_register_global_req(handle, container); -#endif - - variant = g_dbus_proxy_call_sync(zcl_global_proxy, "discover_commands_generated", - g_variant_new("(qyyqqy)", addr16, dst_ep, zcl_fc, clusterid, - start_command_id, max_command_ids), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'discover_commands_received' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_discover_cmds_recv(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, - unsigned short clusterid, unsigned char start_command_id, - unsigned char max_command_ids, zb_zcl_global_discover_cmds_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - -#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC - zb_event_global_default_rsp_s *global_req = NULL; -#endif - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_discover_cmds_recv()"); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zcl_global_proxy); - sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, - ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "discover_commands_received_rsp", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container, - _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - if (container) { - free(container); - container = NULL; - } - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_RECEIVED_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; -#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC - global_req = calloc(1, sizeof(zb_event_global_default_rsp_s)); - if (NULL == global_req) { - g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id); - g_source_remove(container->tid); - container->tid = 0; - if (container) { - free(container); - container = NULL; - } - ERR("calloc() Fail(%d)", errno); - return ZIGBEE_ERROR_OUT_OF_MEMORY; - } - global_req->ep = dst_ep; - global_req->clusterid = clusterid; - global_req->commandid = ZB_ZCL_CMD_DISCOVER_COMMANDS_RECEIVED; - - container->global_cmd = global_req; - container->handle = handle; - - /* Register global request information into handle */ - _zbl_register_global_req(handle, container); -#endif - - variant = g_dbus_proxy_call_sync(zcl_global_proxy, "discover_commands_received", - g_variant_new("(qyyqqy)", addr16, dst_ep, zcl_fc, clusterid, - start_command_id, max_command_ids), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'discover_commands_received' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_discover_attr_ext(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char src_ep, - unsigned char dst_ep, unsigned char zcl_fc, unsigned short clusterid, - unsigned short start_id, unsigned char max_attribute_ids, - zb_zcl_global_attr_extended_discover_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - -#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC - zb_event_global_default_rsp_s *global_req = NULL; -#endif - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_discover_attr_ext()"); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zcl_global_proxy); - sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, - ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "discover_attributes_extended_rsp", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container, - _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - if (container) { - free(container); - container = NULL; - } - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_EXTENDED_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; -#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC - global_req = calloc(1, sizeof(zb_event_global_default_rsp_s)); - if (NULL == global_req) { - g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id); - g_source_remove(container->tid); - container->tid = 0; - if (container) { - free(container); - container = NULL; - } - ERR("calloc() Fail(%d)", errno); - return ZIGBEE_ERROR_OUT_OF_MEMORY; - } - global_req->ep = dst_ep; - global_req->clusterid = clusterid; - global_req->commandid = ZB_ZCL_CMD_DISCOVER_ATTRIBUTES_EXTENDED; - - container->global_cmd = global_req; - container->handle = handle; - - /* Register global request information into handle */ - _zbl_register_global_req(handle, container); -#endif - - variant = g_dbus_proxy_call_sync(zcl_global_proxy, "discover_attributes_extended", - g_variant_new("(qyyqqy)", addr16, dst_ep, zcl_fc, clusterid, start_id, - max_attribute_ids), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'discover_attributes_extended' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_reset_alarm(zb_nwk_addr addr16, unsigned char ep, unsigned char alarm_code, - unsigned short clusterid) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == alarm_gproxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(alarm_gproxy, "reset_alarm", - g_variant_new("(qyyq)", addr16, ep, alarm_code, clusterid), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'reset_alarm' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_reset_all_alarm(zb_nwk_addr addr16, unsigned char ep) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == alarm_gproxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(alarm_gproxy, "reset_all_alarm", - g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'reset_all_alarm' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_get_alarm(zb_nwk_addr addr16, unsigned char ep, zb_zcl_alarm_get_alarm_cb cb, - void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == alarm_gproxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_get_alarm()"); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(alarm_gproxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZCL_ALARM_INTERFACE, "get_alarm_rsp", ZIGBEE_CONTROL_OBJECT_PATH, - NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - if (container) { - free(container); - container = NULL; - } - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZCL_ALARM_GET_ALARM_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - variant = g_dbus_proxy_call_sync(alarm_gproxy, "get_alarm", - g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'get_alarm' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_reset_all_alarm_log(zb_nwk_addr addr16, unsigned char ep) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == alarm_gproxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(alarm_gproxy, "reset_alarm_log", - g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'reset_alarm_log' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_ccontrol_move_to_hue(zb_nwk_addr addr16, unsigned char ep, - unsigned char hue, unsigned char direction, - unsigned short transition_time) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_to_hue", - g_variant_new("(qyyyq)", addr16, ep, hue, direction, transition_time), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'move_to_hue' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - - -int zbl_ccontrol_move_hue(zb_nwk_addr addr16, unsigned char ep, - unsigned char move_mode, unsigned char rate) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_hue", - g_variant_new("(qyyy)", addr16, ep, move_mode, rate), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'move_hue' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_ccontrol_step_hue(zb_nwk_addr addr16, unsigned char ep, - unsigned char step_mode, unsigned char step_size, - unsigned char transition_time) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "step_hue", - g_variant_new("(qyyyy)", addr16, ep, step_mode, step_size, transition_time), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'step_hue' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_ccontrol_move_to_saturation(zb_nwk_addr addr16, unsigned char ep, - unsigned char saturation, unsigned short transition_time) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_to_saturation", - g_variant_new("(qyyq)", addr16, ep, saturation, transition_time), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'move_to_saturation' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_ccontrol_move_saturation(zb_nwk_addr addr16, unsigned char ep, - unsigned char move_mode, unsigned char rate) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_saturation", - g_variant_new("(qyyy)", addr16, ep, move_mode, rate), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'move_saturation' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_ccontrol_step_saturation(zb_nwk_addr addr16, unsigned char ep, - unsigned char step_mode, unsigned char step_size, - unsigned char transition_time) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "step_saturation", - g_variant_new("(qyyyy)", addr16, ep, step_mode, step_size, transition_time), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'step_saturation' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_ccontrol_move_to_hue_and_saturation(zb_nwk_addr addr16, unsigned char ep, - unsigned char hue, unsigned char saturation, - unsigned short transition_time) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_to_hue_and_saturation", - g_variant_new("(qyyyq)", addr16, ep, hue, saturation, transition_time), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'move_to_hue_and_saturation' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_ccontrol_move_to_color(zb_nwk_addr addr16, unsigned char ep, - unsigned short color_x, unsigned short color_y, - unsigned short transition_time) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_to_color", - g_variant_new("(qyqqq)", addr16, ep, color_x, color_y, transition_time), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'move_to_color' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_ccontrol_move_color(zb_nwk_addr addr16, unsigned char ep, - unsigned short rate_x, unsigned short rate_y) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_color", - g_variant_new("(qyqq)", addr16, ep, rate_x, rate_y), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'move_color' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_ccontrol_step_color(zb_nwk_addr addr16, unsigned char ep, - unsigned short step_x, unsigned short step_y, - unsigned short transition_time) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "step_color", - g_variant_new("(qyqqq)", addr16, ep, step_x, step_y, transition_time), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'step_color' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_ccontrol_move_to_color_temperature(zb_nwk_addr addr16, unsigned char ep, - unsigned short color_temperature, - unsigned short transition_time) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_color_temperature", - g_variant_new("(qyqq)", addr16, ep, color_temperature, transition_time), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'move_color_temperature' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_reset_factory_default(zb_nwk_addr addr16, unsigned char ep) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_basic_proxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(zcl_basic_proxy, "reset_factory_default", - g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'reset_factory_default' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_identify(zb_nwk_addr addr16, unsigned char dst_ep, unsigned short identify_time) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_identify_proxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(zcl_identify_proxy, "identify", - g_variant_new("(qyq)", addr16, dst_ep, identify_time), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'identify' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_identify_query(zb_nwk_addr addr16, unsigned char dst_ep, - zb_zcl_identify_query_cb cb, void *user_data) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - int sub_id, to; - zbl_req_cb_s *container; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_identify_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_identify_query()"); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zcl_identify_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZCL_IDENTIFY_INTERFACE, "query_rsp", ZIGBEE_CONTROL_OBJECT_PATH, - NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - if (container) { - free(container); - container = NULL; - } - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZCL_IDENTIFY_QUERY_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - variant = g_dbus_proxy_call_sync(zcl_identify_proxy, "query", - g_variant_new("(qy)", addr16, dst_ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'query' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_add_group(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id, - const char *group_name, zb_zcl_group_add_group_cb cb, void *user_data) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - int sub_id, to; - zbl_req_cb_s *container; - - int j = 0; - GVariant *groupname_variant = NULL; - GVariantBuilder *groupname_builder = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_add_group()"); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zcl_group_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZCL_GROUP_INTERFACE, "add_group_rsp", ZIGBEE_CONTROL_OBJECT_PATH, - NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - if (container) { - free(container); - container = NULL; - } - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZCL_GROUP_ADD_GROUP_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - groupname_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); - while (group_name[j] != '\0') { - g_variant_builder_add(groupname_builder, "(y)", (group_name[j])); - j++; - } - groupname_variant = g_variant_builder_end(groupname_builder); - g_variant_builder_unref(groupname_builder); - - variant = g_dbus_proxy_call_sync(zcl_group_proxy, "add_group", - g_variant_new("(qyq@a(y))", addr16, ep, group_id, groupname_variant), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'add_group' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_view_group(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id, - zb_zcl_group_view_group_cb cb, void *user_data) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - int sub_id, to; - zbl_req_cb_s *container; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_view_group()"); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zcl_group_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZCL_GROUP_INTERFACE, "view_group_rsp", ZIGBEE_CONTROL_OBJECT_PATH, - NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - if (container) { - free(container); - container = NULL; - } - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZCL_GROUP_VIEW_GROUP_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - variant = g_dbus_proxy_call_sync(zcl_group_proxy, "view_group", - g_variant_new("(qyq)", addr16, ep, group_id), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'view_group' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_group_get_group_membership(zb_nwk_addr addr16, unsigned char ep, - unsigned char group_count, unsigned short *group_list, - zb_zcl_group_get_group_membership_cb cb, void *user_data) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - int sub_id, to; - zbl_req_cb_s *container; - - int j = 0; - GVariant *grouplist_variant = NULL; - GVariantBuilder *grouplist_builder = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_group_get_group_membership()"); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zcl_group_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZCL_GROUP_INTERFACE, "get_group_membership_rsp", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, - container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - if (container) { - free(container); - container = NULL; - } - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZCL_GROUP_GET_GROUP_MEMBERSHIP_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - grouplist_builder = g_variant_builder_new(G_VARIANT_TYPE("aq")); - while (j < group_count) { - g_variant_builder_add(grouplist_builder, "q", group_list[j]); - j++; - } - grouplist_variant = g_variant_builder_end(grouplist_builder); - g_variant_builder_unref(grouplist_builder); - - variant = g_dbus_proxy_call_sync(zcl_group_proxy, "get_group_membership", - g_variant_new("(qyy@aq)", addr16, ep, group_count, grouplist_variant), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'get_group_membership' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_remove_group(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id, - zb_zcl_group_remove_group_cb cb, void *user_data) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - int sub_id, to; - zbl_req_cb_s *container; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_group_remove_group()"); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zcl_group_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZCL_GROUP_INTERFACE, "remove_group_rsp", ZIGBEE_CONTROL_OBJECT_PATH, - NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - if (container) { - free(container); - container = NULL; - } - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZCL_GROUP_REMOVE_GROUP_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - variant = g_dbus_proxy_call_sync(zcl_group_proxy, "remove_group", g_variant_new("(qyq)", - addr16, ep, group_id), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'remove_group' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_remove_all_group(zb_nwk_addr addr16, unsigned char ep) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_group_remove_all_group()"); - - variant = g_dbus_proxy_call_sync(zcl_group_proxy, "remove_all_group", - g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'remove_all_group' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_add_group_if_identifying(zb_nwk_addr addr16, unsigned char ep, - unsigned short group_id, const char *group_name) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - int j = 0; - GVariant *groupname_variant = NULL; - GVariantBuilder *groupname_builder = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR); - - groupname_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); - while (group_name[j] != '\0') { - g_variant_builder_add(groupname_builder, "(y)", group_name[j]); - j++; - } - groupname_variant = g_variant_builder_end(groupname_builder); - g_variant_builder_unref(groupname_builder); - - variant = g_dbus_proxy_call_sync(zcl_group_proxy, "add_group_if_identifying", - g_variant_new("(qyq@a(y))", addr16, ep, group_id, groupname_variant), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'add_group_if_identifying' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_level_control_move_to_level(zb_nwk_addr addr16, unsigned char ep, - unsigned char level, unsigned short transition_time) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_level_control_move_to_level()"); - - variant = g_dbus_proxy_call_sync(level_control_gproxy, "move_to_level", - g_variant_new("(qyyq)", addr16, ep, level, transition_time), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'move_to_level' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_level_control_move(zb_nwk_addr addr16, unsigned char ep, - unsigned char move_mode, unsigned char rate) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_level_control_move()"); - - variant = g_dbus_proxy_call_sync(level_control_gproxy, "move", - g_variant_new("(qyyy)", addr16, ep, move_mode, rate), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'move' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_level_control_step(zb_nwk_addr addr16, unsigned char ep, - unsigned char step_mode, unsigned char step_size, - unsigned short transition_time) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_level_control_step()"); - - variant = g_dbus_proxy_call_sync(level_control_gproxy, "step", - g_variant_new("(qyyyq)", addr16, ep, step_mode, step_size, transition_time), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'step' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_level_control_stop(zb_nwk_addr addr16, unsigned char ep) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_level_control_stop()"); - - variant = g_dbus_proxy_call_sync(level_control_gproxy, "stop", - g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'stop' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_level_control_move_to_level_with_on_off(zb_nwk_addr addr16, - unsigned char ep, unsigned char level, unsigned short transition_time) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_level_control_move_to_level_with_on_off()"); - - variant = g_dbus_proxy_call_sync(level_control_gproxy, "move_to_level_with_on_off", - g_variant_new("(qyyq)", addr16, ep, level, transition_time), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'move_to_level_with_on_off' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_level_control_move_with_on_off(zb_nwk_addr addr16, unsigned char ep, - unsigned char move_mode, unsigned char rate) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_level_control_move_with_on_off()"); - - variant = g_dbus_proxy_call_sync(level_control_gproxy, "move_with_on_off", - g_variant_new("(qyyy)", addr16, ep, move_mode, rate), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'move_with_on_off' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_level_control_step_with_on_off(zb_nwk_addr addr16, unsigned char ep, - unsigned char step_mode, unsigned char step_size, - unsigned short transition_time) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_level_control_step_with_on_off()"); - - variant = g_dbus_proxy_call_sync(level_control_gproxy, "step_with_on_off", - g_variant_new("(qyyyq)", addr16, ep, step_mode, step_size, transition_time), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'step_with_on_off' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_onoff_set(zb_nwk_addr addr16, unsigned char ep, unsigned char on_off_type) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == on_off_gproxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(on_off_gproxy, "set_on_off", - g_variant_new("(qyy)", addr16, ep, on_off_type), G_DBUS_CALL_FLAGS_NONE, - -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'set_on_off' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_zone_enroll_response(zb_nwk_addr addr16, unsigned char dst_ep, - unsigned char enroll_response_code, unsigned char zone_id) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_ias_zone_proxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(zcl_ias_zone_proxy, "enroll_response", - g_variant_new("(qyyy)", addr16, dst_ep, enroll_response_code, zone_id), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'enroll_response' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_pollcontrol_check_in_response(zb_nwk_addr addr16, unsigned char ep, - unsigned char start_fast_polling, unsigned short fast_poll_timeout) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_poll_control_proxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(zcl_poll_control_proxy, "check_in_response", - g_variant_new("(qyyq)", addr16, ep, start_fast_polling, fast_poll_timeout), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'check_in_response' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_pollcontrol_fast_poll_stop(zb_nwk_addr addr16, unsigned char ep) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_poll_control_proxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(zcl_poll_control_proxy, "fast_poll_stop", - g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'fast_poll_stop' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_pollcontrol_set_long_poll_interval(zb_nwk_addr addr16, unsigned char ep, - unsigned int new_long_poll_interval, zb_zcl_pollctrl_check_in_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_poll_control_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_pollcontrol_set_long_poll_interval()"); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zcl_poll_control_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZCL_POLL_CONTROL_INTERFACE, "checkin_response", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, - _zbl_response_cb, container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - if (container) { - free(container); - container = NULL; - } - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZCL_POLLCONTROL_SET_POLL_INTERVAL_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - variant = g_dbus_proxy_call_sync(zcl_poll_control_proxy, "set_long_poll_interval", - g_variant_new("(qyu)", addr16, ep, new_long_poll_interval), - G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'set_long_poll_interval' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_pollcontrol_set_short_poll_interval(zb_nwk_addr addr16, unsigned char ep, - unsigned int new_short_poll_interval, zb_zcl_pollctrl_check_in_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_poll_control_proxy, ZIGBEE_ERROR_IO_ERROR); - - DBG("zbl_pollcontrol_set_short_poll_interval()"); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zcl_poll_control_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZCL_POLL_CONTROL_INTERFACE, "checkin_response", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, - _zbl_response_cb, container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - if (container) { - free(container); - container = NULL; - } - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZCL_POLLCONTROL_SET_POLL_INTERVAL_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - variant = g_dbus_proxy_call_sync(zcl_poll_control_proxy, "set_short_poll_interval", - g_variant_new("(qyu)", addr16, ep, new_short_poll_interval), - G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'set_short_poll_interval' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_add_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id, - unsigned char scene_id, unsigned short transition_time, const char *scene_name, - unsigned short ext_field_len, const char *extension_field_sets, - zb_zcl_scene_add_scene_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - int j = 0; - int index = 0; - GVariant *scenename_variant = NULL; - GVariantBuilder *scenename_builder = NULL; - GVariant *extensionfieldSet_variant = NULL; - GVariantBuilder *extensionfieldSet_builder = NULL; - - DBG("zbl_add_scene()"); - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zcl_scene_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZCL_SCENE_INTERFACE, "add_scene_rsp", ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, - _zbl_response_cb, container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - if (container) { - free(container); - container = NULL; - } - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZCL_SCENE_ADD_SCENE_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - scenename_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); - while ('\0' != scene_name[j]) { - g_variant_builder_add(scenename_builder, "(y)", scene_name[j]); - j++; - } - scenename_variant = g_variant_builder_end(scenename_builder); - g_variant_builder_unref(scenename_builder); - - extensionfieldSet_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); - - while (index < ext_field_len) { - INFO("Ext contents 0x%02X", extension_field_sets[index]); - g_variant_builder_add(extensionfieldSet_builder, "(y)", extension_field_sets[index]); - index++; - } - extensionfieldSet_variant = g_variant_builder_end(extensionfieldSet_builder); - g_variant_builder_unref(extensionfieldSet_builder); - - variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "add_scene", - g_variant_new("(qyqyqq@a(y)@a(y))", addr16, ep, group_id, scene_id, transition_time, - ext_field_len, scenename_variant, extensionfieldSet_variant), G_DBUS_CALL_FLAGS_NONE, - to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'add_scene' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_view_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id, - unsigned char scene_id, zb_zcl_scene_view_scene_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - DBG("zbl_scene_view_scene()"); - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zcl_scene_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZCL_SCENE_INTERFACE, "view_scene_rsp", ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, - _zbl_response_cb, container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - if (container) { - free(container); - container = NULL; - } - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZCL_SCENE_VIEW_SCENE_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "view_scene", - g_variant_new("(qyqy)", addr16, ep, group_id, scene_id), G_DBUS_CALL_FLAGS_NONE, - to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'view_scene' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_remove_scene(zb_nwk_addr addr16, unsigned char ep, - unsigned short group_id, unsigned char scene_id, zb_zcl_scene_remove_scene_cb cb, - void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - DBG("zbl_scene_remove_scene()"); - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zcl_scene_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZCL_SCENE_INTERFACE, "remove_scene_rsp", ZIGBEE_CONTROL_OBJECT_PATH, - NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - if (container) { - free(container); - container = NULL; - } - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZCL_SCENE_REMOVE_SCENE_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "remove_scene", - g_variant_new("(qyqy)", addr16, ep, group_id, scene_id), - G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'remove_scene' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_remove_all_scene(zb_nwk_addr addr16, unsigned char ep, - unsigned short group_id, zb_zcl_scene_remove_all_scene_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - DBG("zbl_scene_remove_all_scene()"); - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zcl_scene_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZCL_SCENE_INTERFACE, "remove_all_scene_rsp", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container, - _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - if (container) { - free(container); - container = NULL; - } - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZCL_SCENE_REMOVE_ALL_SCENE_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "remove_all_scene", - g_variant_new("(qyq)", addr16, ep, group_id), - G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'remove_all_scene' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_store_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id, - unsigned char scene_id, zb_zcl_scene_store_scene_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - DBG("zbl_scene_store_scene()"); - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zcl_scene_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZCL_SCENE_INTERFACE, "store_scene_rsp", ZIGBEE_CONTROL_OBJECT_PATH, - NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - if (container) { - free(container); - container = NULL; - } - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZCL_SCENE_STORE_SCENE_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "store_scene", - g_variant_new("(qyqy)", addr16, ep, group_id, scene_id), - G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'store_scene' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_recall_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id, - unsigned char scene_id) -{ - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "recall_scene", - g_variant_new("(qyqy)", addr16, ep, group_id, scene_id), G_DBUS_CALL_FLAGS_NONE, - -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'recall_scene' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_get_scene_membership(zb_nwk_addr addr16, unsigned char ep, - unsigned short group_id, zb_zcl_scene_get_scene_membership_cb cb, void *user_data) -{ - int sub_id, to; - zbl_req_cb_s *container; - - int result = ZIGBEE_ERROR_NONE; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - DBG("zbl_scene_get_scene_membership()"); - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR); - - container = calloc(1, sizeof(zbl_req_cb_s)); - RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - to = zbl_dbus_get_timeout(zcl_scene_proxy); - sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, - ZIGBEE_ZCL_SCENE_INTERFACE, "get_scene_membership_rsp", - ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container, - _zbl_request_cleanup); - - if (0 == sub_id) { - ERR("g_dbus_connection_signal_subscribe() Fail"); - if (container) { - free(container); - container = NULL; - } - return ZIGBEE_ERROR_IO_ERROR; - } - - container->cb = cb; - container->sid = sub_id; - container->cid = ZBL_ZCL_SCENE_GET_SCENE_MEMBERSHIP_REQ; - container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); - container->userdata = user_data; - - variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "get_scene_membership", - g_variant_new("(qyq)", addr16, ep, group_id), - G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get get_scene_membership [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_thermostat_adjust_setpoint(zb_nwk_addr addr16, unsigned char ep, unsigned char mode, - unsigned char amount) -{ - int result = ZIGBEE_ERROR_IO_ERROR; - GVariant *variant = NULL; - GError *dbus_err = NULL; - - RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == thermostat_gproxy, ZIGBEE_ERROR_IO_ERROR); - - variant = g_dbus_proxy_call_sync(thermostat_gproxy, "setpoint_raise_lower", - g_variant_new("(qyyy)", addr16, ep, mode, amount), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); - - if (!variant) { - ERR("Failed to get 'setpoint_raise_lower' [%s]", dbus_err->message); - if (strstr(dbus_err->message, "AccessDenied")) - result = ZIGBEE_ERROR_PERMISSION_DENIED; - else - result = ZIGBEE_ERROR_IO_ERROR; - - g_error_free(dbus_err); - return result; - } - - g_variant_get(variant, "(i)", &result); - DBG("ret = [0x%x]", result); - g_variant_unref(variant); - - return result; -} - -int zbl_dbus_start(zb_zigbee_h handle) -{ - FN_CALL; - - GError *error = NULL; - unsigned int id; - - if (gdbus_conn) { - zbl_ref_count++; - return ZIGBEE_ERROR_NONE; - } - - gdbus_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error); - if (NULL == gdbus_conn) { - ERR("Couldn't connect to the System bus [%s]\n", error->message); - g_error_free(error); - return ZIGBEE_ERROR_IO_ERROR; - } - - id = g_signal_connect(gdbus_conn, "notify::g-name-owner", - G_CALLBACK(_zbl_dbus_name_owner_notify), handle); - if (0 == id) { - ERR("g_signal_connect() Fail\n"); - return ZIGBEE_ERROR_IO_ERROR; - } - - /* Phase 1. Subscribe signals */ - _zbl_dbus_subscribe_signal(handle); - - /* Phase 2. Make proxies */ - service_gproxy = _zbl_get_service_proxy(); - RETVM_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get service_gproxy"); - g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(service_gproxy), ZIGBEE_BROADCAST_TIMEOUT); - - on_off_gproxy = _zbl_get_on_off_proxy(); - RETVM_IF(NULL == on_off_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get on_off_gproxy"); - g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(on_off_gproxy), ZIGBEE_BROADCAST_TIMEOUT); - - door_lock_gproxy = _zbl_get_door_lock_proxy(); - RETVM_IF(NULL == door_lock_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get door_lock_gproxy"); - g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(door_lock_gproxy), ZIGBEE_BROADCAST_TIMEOUT); - - level_control_gproxy = _zbl_get_level_control_proxy(); - RETVM_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get level_control_gproxy"); - g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(level_control_gproxy), ZIGBEE_BROADCAST_TIMEOUT); - - thermostat_gproxy = _zbl_get_thermostat_proxy(); - RETVM_IF(NULL == thermostat_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get thermostat_gproxy"); - g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(thermostat_gproxy), ZIGBEE_BROADCAST_TIMEOUT); - - fan_control_gproxy = _zbl_get_fan_control_proxy(); - RETVM_IF(NULL == fan_control_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get fan_control_gproxy"); - g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(fan_control_gproxy), ZIGBEE_BROADCAST_TIMEOUT); - - alarm_gproxy = _zbl_get_alarm_proxy(); - RETVM_IF(NULL == alarm_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get alarm_gproxy"); - g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(alarm_gproxy), ZIGBEE_BROADCAST_TIMEOUT); - - mfglib_gproxy = _zbl_get_mfglib_proxy(); - RETVM_IF(NULL == mfglib_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get mfglib_gproxy"); - g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(mfglib_gproxy), ZIGBEE_BROADCAST_TIMEOUT); - - zcl_global_proxy = _zbl_get_zcl_global_proxy(); - RETVM_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_global_proxy"); - g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_global_proxy), ZIGBEE_BROADCAST_TIMEOUT); - - zdo_dev_proxy = _zbl_get_zdo_dev_proxy(); - RETVM_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zdo_dev_proxy"); - g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zdo_dev_proxy), ZIGBEE_BROADCAST_TIMEOUT); - - zcl_basic_proxy = _zbl_get_basic_proxy(); - RETVM_IF(NULL == zcl_basic_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_basic_proxy"); - g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_basic_proxy), ZIGBEE_BROADCAST_TIMEOUT); - - zcl_identify_proxy = _zbl_get_identify_proxy(); - RETVM_IF(NULL == zcl_identify_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_identify_proxy"); - g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_identify_proxy), ZIGBEE_BROADCAST_TIMEOUT); - - zcl_ias_zone_proxy = _zbl_get_ias_zone_proxy(); - RETVM_IF(NULL == zcl_ias_zone_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_ias_zone_proxy"); - g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_ias_zone_proxy), ZIGBEE_BROADCAST_TIMEOUT); - - zcl_poll_control_proxy = _zbl_get_poll_control_proxy(); - RETVM_IF(NULL == zcl_poll_control_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_poll_control_proxy"); - g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_poll_control_proxy), ZIGBEE_BROADCAST_TIMEOUT); - - zcl_group_proxy = _zbl_get_group_proxy(); - RETVM_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_group_proxy"); - g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_group_proxy), ZIGBEE_BROADCAST_TIMEOUT); - - zcl_scene_proxy = _zbl_get_scene_proxy(); - RETVM_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_scene_proxy"); - g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_scene_proxy), ZIGBEE_BROADCAST_TIMEOUT); - - zdo_bind_proxy = _zbl_get_zdo_bind_proxy(); - RETVM_IF(NULL == zdo_bind_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zdo_bind_proxy"); - g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zdo_bind_proxy), ZIGBEE_BROADCAST_TIMEOUT); - - zcl_color_control_proxy = _zbl_get_color_control_proxy(); - RETVM_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_color_control_proxy"); - g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_color_control_proxy), ZIGBEE_BROADCAST_TIMEOUT); - - custom_gproxy = _zbl_get_custom_gproxy(); - RETVM_IF(NULL == custom_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get custom_gproxy"); - g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(custom_gproxy), ZIGBEE_BROADCAST_TIMEOUT); - - zbl_ref_count++; - - return ZIGBEE_ERROR_NONE; -} - -int zbl_dbus_stop(zb_zigbee_h handle) -{ - struct zbl_zigbee_s *h = handle; - DBG("zbl_dbus_stop()"); - - if (0 >= zbl_ref_count) { - WARN("dbus does not initiaized\n"); - return ZIGBEE_ERROR_NONE; - } - - if (0 > --zbl_ref_count) { - DBG("all connections closed\n"); - zbl_ref_count = 0; - return ZIGBEE_ERROR_NONE; - } - - if (gdbus_conn) { - _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids); - h->dbus_sub_ids = NULL; - - g_object_unref(service_gproxy); - service_gproxy = NULL; - g_object_unref(on_off_gproxy); - on_off_gproxy = NULL; - g_object_unref(door_lock_gproxy); - door_lock_gproxy = NULL; - g_object_unref(level_control_gproxy); - level_control_gproxy = NULL; - g_object_unref(thermostat_gproxy); - thermostat_gproxy = NULL; - g_object_unref(alarm_gproxy); - alarm_gproxy = NULL; - g_object_unref(fan_control_gproxy); - fan_control_gproxy = NULL; - - g_object_unref(mfglib_gproxy); - mfglib_gproxy = NULL; - g_object_unref(zcl_global_proxy); - zcl_global_proxy = NULL; - g_object_unref(zcl_color_control_proxy); - zcl_color_control_proxy = NULL; - g_object_unref(custom_gproxy); - custom_gproxy = NULL; - - g_object_unref(gdbus_conn); - gdbus_conn = NULL; - - DBG("zbl_dbus_stop() finished"); - } - - return ZIGBEE_ERROR_NONE; -} - -GDBusConnection* zbl_dbus_get_object(void) -{ - return gdbus_conn; -} - -int zbl_dbus_get_timeout(GDBusProxy *proxy) -{ - gint timeout; - RETV_IF(NULL == gdbus_conn, ZIGBEE_BROADCAST_TIMEOUT); - timeout = g_dbus_proxy_get_default_timeout(proxy); - if (timeout <= 0) { - ERR("Invalid timeout (%d)", timeout); - return ZIGBEE_BROADCAST_TIMEOUT; - } - return timeout; -} - -int zbl_check_privilege() -{ - int ret = _check_zigbee_privilege(); - if (ret != ZIGBEE_ERROR_NONE) { - ERR("Failed to check privilege"); - return ret; - } - - return ZIGBEE_ERROR_NONE; -} diff --git a/lib/zbl-dbus.h b/lib/zbl-dbus.h deleted file mode 100644 index eebe438..0000000 --- a/lib/zbl-dbus.h +++ /dev/null @@ -1,261 +0,0 @@ -/* - * Copyright (c) 2015 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 __TIZEN_NETWORK_ZIGBEE_LIBRARY_DBUS_H__ -#define __TIZEN_NETWORK_ZIGBEE_LIBRARY_DBUS_H__ - -#include - -#include "zb-common.h" - -#include "zbl.h" -#include "zbl-dbus.h" - -int zbl_dbus_start(zb_zigbee_h handle); -int zbl_dbus_stop(zb_zigbee_h handle); -GDBusConnection* zbl_dbus_get_object(void); -int zbl_dbus_get_timeout(GDBusProxy *proxy); -int zbl_check_privilege(); - -int zbl_enable(zb_zigbee_h handle); -int zbl_set_event_cb(zb_zigbee_h handle, zb_event_cb event_handler); -int zbl_disable(void); -int zbl_hw_reset(void); -int zbl_coex_start(unsigned char channel); -int zbl_coex_stop(void); -int zbl_get_network_info(zb_ieee_addr addr64, zb_nwk_addr *nodeid, - zb_nwk_addr *panid, unsigned char *channel, unsigned char *tx_power); -int zbl_get_controller_mac_address(zb_ieee_addr addr64); -int zbl_get_cluster_list(zb_ieee_addr eui64, unsigned char endpoint, - unsigned char *in_cluster_count, unsigned short in_cluster_list[], - unsigned char *out_cluster_count, unsigned short out_cluster_list[]); -int zbl_get_endpoint_list(zb_ieee_addr eui64, unsigned char *count, - unsigned char list[]); -int zbl_get_all_device_info(zb_end_dev_info_h **dev_list, unsigned char* num); -int zbl_form_network(zb_zigbee_h handle, zb_form_network_cb cb, void *user_data); -int zbl_disable_network(zb_zigbee_h handle, zb_disable_network_cb cb, - void *user_data); -int zbl_leave_device(zb_ieee_addr addr64, bool remove_children, bool rejoin); -int zbl_permit_join(unsigned char duration, bool broadcast); - -int zbl_nwk_addr_req(zb_zigbee_h handle, zb_ieee_addr addr64, - unsigned char request_type, unsigned char start_idx, zb_zdo_addr_cb cb, - void *user_data); -int zbl_ieee_addr_req(zb_zigbee_h handle, zb_nwk_addr addr16, zb_zdo_addr_cb cb, - void *user_data); -int zbl_active_ep(zb_zigbee_h handle, zb_nwk_addr addr16, zb_zdo_active_ep_cb cb, - void *user_data); -int zbl_simple_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep, - zb_zdo_simple_desc_cb cb, void *user_data); -int zbl_match_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned short profileid, unsigned char num_in_clusters, - unsigned short *in_clusters, unsigned char num_out_clusters, - unsigned short *out_clusters, zb_zdo_match_desc_cb cb, void *user_data); -int zbl_device_annce(zb_zigbee_h handle, zb_nwk_addr addr16, zb_ieee_addr addr64, - unsigned char capability); - -int zbl_node_desc_req(zb_nwk_addr addr16, zb_zdo_node_desc_cb cb, void *user_data); -int zbl_power_desc_req(zb_nwk_addr addr16, zb_zdo_power_desc_cb cb, - void *user_data); -int zbl_complex_desc_req(zb_nwk_addr addr16, zb_zdo_complex_desc_cb cb, - void *user_data); -int zbl_user_desc_req(zb_nwk_addr addr16, zb_zdo_user_desc_cb cb, void *user_data); -int zbl_user_desc_set(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char len, - unsigned char *user_desc, zb_zdo_user_desc_conf_cb cb, void *user_data); -int zbl_bind_req(zb_nwk_addr dst_addr16, zb_ieee_addr src_addr64, - unsigned char src_ep, unsigned short clusterid, zb_ieee_addr dst_addr64, - unsigned char type, zb_nwk_addr group_addr, unsigned char dst_ep, zb_zdo_bind_cb cb, - void *user_data); -int zbl_unbind_req(zb_nwk_addr dst_addr16, zb_ieee_addr src_addr64, - unsigned char src_ep, unsigned short clusterid, zb_ieee_addr dst_addr64, - unsigned char type, zb_nwk_addr group_addr, unsigned char dst_ep, - zb_zdo_unbind_cb cb, void *user_data); -int zbl_mgmt_nwk_disc_req(zb_nwk_addr addr16, unsigned int scan_channels, - unsigned char scan_duration, unsigned char scan_count, unsigned char start_idx, - zb_zdo_mgmt_nwk_disc_cb cb, void *user_data); -int zbl_mgmt_nwk_update_req(unsigned int scan_channels, - unsigned char scan_duration, unsigned char scan_count, unsigned char nwk_update_id, - zb_nwk_addr nwk_manager_addr); -int zbl_mgmt_lqi_req(zb_nwk_addr addr16, unsigned char start_idx, - zb_zdo_mgmt_lqi_cb cb, void *user_data); -int zbl_mgmt_rtg_req(zb_nwk_addr addr16, unsigned char start_idx, - zb_zdo_mgmt_rtg_cb cb, void *user_data); -int zbl_mgmt_bind_req(zb_nwk_addr addr16, unsigned char start_idx, - zb_zdo_mgmt_bind_cb cb, void *user_data); -int zbl_mgmt_leave_device(zb_ieee_addr addr64, unsigned char remove_children, - unsigned rejoin, zb_zdo_mgmt_leave_cb cb, void *user_data); -int zbl_mgmt_permit_joining_req(zb_nwk_addr addr16, unsigned char duration, - unsigned char tc_significance, zb_zdo_mgmt_permit_joining_cb cb, void *user_data); - -/* Custom Commands */ -int zbl_aps_send(zb_nwk_addr addr16, unsigned char aps_fc, - unsigned char src_ep, unsigned char dst_ep, unsigned short clusterid, - unsigned short profileid, unsigned char zcl_fc, unsigned short mfg_code, - unsigned char cmd_id, unsigned short payload_len, unsigned char *payload, - zb_aps_send_cb cb, void *user_data); -int zbl_zcl_send(zb_nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep, - unsigned short clusterid, unsigned char zcl_fc, unsigned char cmd, - unsigned short payload_len, unsigned char *payload, - zb_zcl_send_cb cb, void *user_data); -int zbl_send_to_local(unsigned short length, unsigned char *data, - zb_send_to_local_cb cb, void *user_data); - -/* ZCL Global Commands */ -int zbl_read_attr_req(zb_zigbee_h handle, unsigned short addr16, unsigned char dest_ep, - unsigned char zcl_fc, unsigned short clusterid, unsigned short *attribute_ids, - int attribute_ids_len, zb_zcl_global_attr_read_cb cb, void *user_data); -int zbl_write_attr_req(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char src_ep, - unsigned char dst_ep, unsigned char zcl_fc, unsigned short clusterid, - void **records, - int count, zb_zcl_global_attr_write_cb cb, void *user_data); -int zbl_wattr_undivided_req(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, - unsigned short clusterid, void **records, int count, - zb_zcl_global_attr_write_cb cb, void *user_data); -int zbl_wattr_req_no_cb(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char src_ep, - unsigned char dst_ep, unsigned char zcl_fc, unsigned short clusterid, - void **records, int count); -int zbl_write_config_report(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, - unsigned short clusterid, void **records, int count, - zb_zcl_global_config_report_write_cb cb, void *user_data); -int zbl_read_config_report(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, - unsigned short clusterid, void **records, int count, - zb_zcl_global_config_report_read_cb cb, void *user_data); -int zbl_discover_attr_req(zb_zigbee_h handle, unsigned short addr16, - unsigned char src_ep, unsigned char dest_ep, unsigned char zcl_fc, - unsigned short clusterid, unsigned short start_id, unsigned char max_attribute_ids, - zb_zcl_global_attr_discover_cb cb, void *user_data); -int zbl_discover_cmds_gen(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, - unsigned short clusterid, unsigned char start_command_id, - unsigned char max_command_ids, zb_zcl_global_discover_cmds_cb cb, void *user_data); -int zbl_discover_cmds_recv(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, - unsigned short clusterid, unsigned char start_command_id, - unsigned char max_command_ids, zb_zcl_global_discover_cmds_cb cb, void *user_data); -int zbl_discover_attr_ext(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, - unsigned short clusterid, unsigned short start_id, unsigned char max_attribute_ids, - zb_zcl_global_attr_extended_discover_cb cb, void *user_data); - -/* ZCL Alarm Cluster */ -int zbl_reset_alarm(zb_nwk_addr addr16, unsigned char ep, unsigned char alarm_code, - unsigned short clusterid); -int zbl_reset_all_alarm(zb_nwk_addr addr16, unsigned char ep); -int zbl_get_alarm(zb_nwk_addr addr16, unsigned char ep, zb_zcl_alarm_get_alarm_cb cb, - void *user_data); -int zbl_reset_all_alarm_log(zb_nwk_addr addr16, unsigned char ep); - -/* ZCL Color Control Cluster */ -int zbl_ccontrol_move_to_hue(zb_nwk_addr addr16, unsigned char ep, - unsigned char hue, unsigned char direction, unsigned short transition_time); -int zbl_ccontrol_move_hue(zb_nwk_addr addr16, unsigned char ep, - unsigned char move_mode, unsigned char rate); -int zbl_ccontrol_step_hue(zb_nwk_addr addr16, unsigned char ep, - unsigned char step_mode, unsigned char step_size, unsigned char transition_time); -int zbl_ccontrol_move_to_saturation(zb_nwk_addr addr16, unsigned char ep, - unsigned char saturation, unsigned short transition_time); -int zbl_ccontrol_move_saturation(zb_nwk_addr addr16, unsigned char ep, - unsigned char move_mode, unsigned char rate); -int zbl_ccontrol_step_saturation(zb_nwk_addr addr16, unsigned char ep, - unsigned char step_mode, unsigned char step_size, unsigned char transition_time); -int zbl_ccontrol_move_to_hue_and_saturation(zb_nwk_addr addr16, unsigned char ep, - unsigned char hue, unsigned char saturation, unsigned short transition_time); -int zbl_ccontrol_move_to_color(zb_nwk_addr addr16, unsigned char ep, - unsigned short color_x, unsigned short color_y, unsigned short transition_time); -int zbl_ccontrol_move_color(zb_nwk_addr addr16, unsigned char ep, - unsigned short rate_x, unsigned short rate_y); -int zbl_ccontrol_step_color(zb_nwk_addr addr16, unsigned char ep, - unsigned short step_x, unsigned short step_y, unsigned short transition_time); -int zbl_ccontrol_move_to_color_temperature(zb_nwk_addr addr16, unsigned char ep, - unsigned short color_temperature, unsigned short transition_time); - -/* ZCL Basic Cluster */ -int zbl_reset_factory_default(zb_nwk_addr addr16, unsigned char ep); - -/* ZCL Identity Cluster */ -int zbl_identify(zb_nwk_addr addr16, unsigned char dst_ep, unsigned short identify_time); -int zbl_identify_query(zb_nwk_addr addr16, unsigned char dst_ep, - zb_zcl_identify_query_cb cb, void *user_data); - -/* ZCL Group Cluster */ -int zbl_add_group(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id, - const char *group_name, zb_zcl_group_add_group_cb cb, void *user_data); -int zbl_view_group(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id, - zb_zcl_group_view_group_cb cb, void *user_data); -int zbl_group_get_group_membership(zb_nwk_addr addr16, unsigned char ep, - unsigned char group_count, unsigned short *group_list, - zb_zcl_group_get_group_membership_cb cb, void *user_data); -int zbl_remove_group(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id, - zb_zcl_group_remove_group_cb cb, void *user_data); -int zbl_remove_all_group(zb_nwk_addr addr16, unsigned char ep); -int zbl_add_group_if_identifying(zb_nwk_addr addr16, unsigned char ep, - unsigned short group_id, const char *group_name); - -/* ZCL Level Control Cluster */ -int zbl_level_control_move_to_level(zb_nwk_addr addr16, unsigned char ep, - unsigned char level, unsigned short transition_time); -int zbl_level_control_move(zb_nwk_addr addr16, unsigned char ep, - unsigned char move_mode, unsigned char rate); -int zbl_level_control_step(zb_nwk_addr addr16, unsigned char ep, - unsigned char step_mode, unsigned char step_size, unsigned short transition_time); -int zbl_level_control_stop(zb_nwk_addr addr16, unsigned char ep); -int zbl_level_control_move_to_level_with_on_off(zb_nwk_addr addr16, - unsigned char ep, unsigned char level, unsigned short transition_time); -int zbl_level_control_move_with_on_off(zb_nwk_addr addr16, unsigned char ep, - unsigned char move_mode, unsigned char rate); -int zbl_level_control_step_with_on_off(zb_nwk_addr addr16, unsigned char ep, - unsigned char step_mode, unsigned char step_size, unsigned short transition_time); - -/* ZCL On/Off Cluster */ -int zbl_onoff_set(zb_nwk_addr addr16, unsigned char ep, unsigned char on_off_type); -int zbl_zone_enroll_response(zb_nwk_addr addr16, unsigned char dst_ep, - unsigned char enroll_response_code, unsigned char zone_id); - -/* Poll-control Cluster */ -int zbl_pollcontrol_check_in_response(zb_nwk_addr addr16, unsigned char ep, - unsigned char start_fast_polling, unsigned short fast_poll_timeout); -int zbl_pollcontrol_fast_poll_stop(zb_nwk_addr addr16, unsigned char ep); -int zbl_pollcontrol_set_long_poll_interval(zb_nwk_addr addr16, unsigned char ep, - unsigned int new_long_poll_interval, zb_zcl_pollctrl_check_in_cb cb, void *user_data); -int zbl_pollcontrol_set_short_poll_interval(zb_nwk_addr addr16, unsigned char ep, - unsigned int new_short_poll_interval, zb_zcl_pollctrl_check_in_cb cb, void *user_data); - -/* Scene Cluster */ -int zbl_add_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id, - unsigned char scene_id, unsigned short transition_time, const char *scene_name, - unsigned short ext_field_len, const char *extension_field_sets, - zb_zcl_scene_add_scene_cb cb, void *user_data); -int zbl_view_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id, - unsigned char scene_id, zb_zcl_scene_view_scene_cb cb, void *user_data); -int zbl_remove_scene(zb_nwk_addr addr16, unsigned char ep, - unsigned short group_id, unsigned char scene_id, zb_zcl_scene_remove_scene_cb cb, - void *user_data); -int zbl_remove_all_scene(zb_nwk_addr addr16, unsigned char ep, - unsigned short group_id, zb_zcl_scene_remove_all_scene_cb cb, void *user_data); -int zbl_store_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id, - unsigned char scene_id, zb_zcl_scene_store_scene_cb cb, void *user_data); -int zbl_recall_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id, - unsigned char scene_id); -int zbl_get_scene_membership(zb_nwk_addr addr16, unsigned char ep, - unsigned short group_id, zb_zcl_scene_get_scene_membership_cb cb, void *user_data); - -/* Thermostat Cluster */ -int zbl_thermostat_adjust_setpoint(zb_nwk_addr addr16, unsigned char ep, - unsigned char mode, unsigned char amount); - -#endif /* __TIZEN_NETWORK_ZIGBEE_LIBRARY_DBUS_H__ */ diff --git a/lib/zbl-zcl-alarm.c b/lib/zbl-zcl-alarm.c deleted file mode 100644 index 905cb42..0000000 --- a/lib/zbl-zcl-alarm.c +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2016 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 "zbl.h" -#include "zbl-dbus.h" -#include "zb-common.h" - -API int zb_zcl_alarm_reset_alarm(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep, - unsigned char alarm_code, zb_cluster_id clusterid) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - - ret = zbl_reset_alarm(addr16, ep, alarm_code, clusterid); - return ret; -} - -API int zb_zcl_alarm_reset_all_alarm(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - - ret = zbl_reset_all_alarm(addr16, ep); - return ret; -} - -API int zb_zcl_alarm_get_alarm(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep, - zb_zcl_alarm_get_alarm_cb cb, void *user_data) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - - ret = zbl_get_alarm(addr16, ep, cb, user_data); - return ret; -} - -API int zb_zcl_alarm_reset_all_alarm_log(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - - ret = zbl_reset_all_alarm_log(addr16, ep); - return ret; -} - diff --git a/lib/zbl-zcl-basic.c b/lib/zbl-zcl-basic.c deleted file mode 100644 index d46187b..0000000 --- a/lib/zbl-zcl-basic.c +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2016 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 "zbl.h" -#include "zbl-dbus.h" -#include "zb-common.h" - -API int zb_zcl_basic_reset_factory_default(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - ret = zbl_reset_factory_default(addr16, ep); - return ret; -} diff --git a/lib/zbl-zcl-color-control.c b/lib/zbl-zcl-color-control.c deleted file mode 100644 index 1668cdc..0000000 --- a/lib/zbl-zcl-color-control.c +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (c) 2016 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 "zbl.h" -#include "zbl-dbus.h" -#include "zb-common.h" - -API int zb_zcl_ccontrol_move_to_hue(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep, unsigned char hue, unsigned char direction, - unsigned short transition_time) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - - ret = zbl_ccontrol_move_to_hue(addr16, ep, hue, direction, transition_time); - return ret; -} - -API int zb_zcl_ccontrol_move_hue(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep, unsigned char move_mode, unsigned char rate) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - - ret = zbl_ccontrol_move_hue(addr16, ep, move_mode, rate); - return ret; -} - -API int zb_zcl_ccontrol_step_hue(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep, unsigned char step_mode, unsigned char step_size, - unsigned char transition_time) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - - ret = zbl_ccontrol_step_hue(addr16, ep, step_mode, step_size, transition_time); - return ret; -} - -API int zb_zcl_ccontrol_move_to_saturation(zb_zigbee_h handle, - zb_nwk_addr addr16, unsigned char ep, unsigned char saturation, - unsigned short transition_time) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - - ret = zbl_ccontrol_move_to_saturation(addr16, ep, saturation, transition_time); - return ret; -} - -API int zb_zcl_ccontrol_move_saturation(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep, unsigned char move_mode, unsigned char rate) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - - ret = zbl_ccontrol_move_saturation(addr16, ep, move_mode, rate); - return ret; -} - -API int zb_zcl_ccontrol_step_saturation(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep, unsigned char step_mode, unsigned char step_size, - unsigned char transition_time) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - - ret = zbl_ccontrol_step_saturation(addr16, ep, step_mode, step_size, transition_time); - return ret; -} - -API int zb_zcl_ccontrol_move_to_hue_and_saturation(zb_zigbee_h handle, - zb_nwk_addr addr16, unsigned char ep, unsigned char hue, unsigned char saturation, - unsigned short transition_time) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - - ret = zbl_ccontrol_move_to_hue_and_saturation(addr16, ep, hue, saturation, transition_time); - return ret; -} - -API int zb_zcl_ccontrol_move_to_color(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep, unsigned short color_x, unsigned short color_y, - unsigned short transition_time) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - - ret = zbl_ccontrol_move_to_color(addr16, ep, color_x, color_y, transition_time); - return ret; -} - -API int zb_zcl_ccontrol_move_color(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep, unsigned short rate_x, unsigned short rate_y) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - - ret = zbl_ccontrol_move_color(addr16, ep, rate_x, rate_y); - return ret; -} - -API int zb_zcl_ccontrol_step_color(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep, unsigned short step_x, unsigned short step_y, - unsigned short transition_time) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - - ret = zbl_ccontrol_step_color(addr16, ep, step_x, step_y, transition_time); - return ret; -} - -API int zb_zcl_ccontrol_move_to_color_temperature(zb_zigbee_h handle, - zb_nwk_addr addr16, unsigned char ep, unsigned short color_temperature, - unsigned short transition_time) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - - ret = zbl_ccontrol_move_to_color_temperature(addr16, ep, color_temperature, transition_time); - return ret; -} - diff --git a/lib/zbl-zcl-global-cmd.c b/lib/zbl-zcl-global-cmd.c deleted file mode 100644 index 1a57b89..0000000 --- a/lib/zbl-zcl-global-cmd.c +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Copyright (c) 2016 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 "zbl.h" -#include "zbl-dbus.h" -#include "zb-common.h" - -/* For test */ -#define ZIGBEE_SUPPORT_ORDERED_SEQUENCE_DATA 0 - -API int zb_zcl_global_attr_read(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, - unsigned short clusterid, unsigned short *attribute_ids, int attribute_ids_len, - zb_zcl_global_attr_read_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - RETV_IF(NULL == attribute_ids, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0 == attribute_ids_len, ZIGBEE_ERROR_INVALID_PARAMETER); - ret = zbl_read_attr_req(handle, addr16, dst_ep, zcl_fc, clusterid, - attribute_ids, attribute_ids_len, cb, user_data); - return ret; -} - -API int zb_zcl_global_attr_read_structured(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, - unsigned short clusterid, zb_zcl_read_structured_attr_record_h *records, - int count, zb_zcl_global_attr_read_cb cb, void *user_data) -{ -#if (0 == ZIGBEE_SUPPORT_ORDERED_SEQUENCE_DATA) - return ZIGBEE_ERROR_NOT_SUPPORTED; -#endif - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0 == count, ZIGBEE_ERROR_INVALID_PARAMETER); - - return ZIGBEE_ERROR_NONE; -} - -API int zb_zcl_global_attr_write(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, - unsigned short clusterid, zb_zcl_write_attr_record_h *records, int count, - zb_zcl_global_attr_write_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0 == count, ZIGBEE_ERROR_INVALID_PARAMETER); - ret = zbl_write_attr_req(handle, addr16, src_ep, dst_ep, zcl_fc, - clusterid, records, count, cb, user_data); - return ret; -} - -API int zb_zcl_global_attr_write_undivided(zb_zigbee_h handle, - zb_nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep, - unsigned char zcl_fc, unsigned short clusterid, - zb_zcl_write_attr_record_h *records, int count, - zb_zcl_global_attr_write_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0 == count, ZIGBEE_ERROR_INVALID_PARAMETER); - ret = zbl_wattr_undivided_req(handle, addr16, src_ep, dst_ep, zcl_fc, - clusterid, records, count, cb, user_data); - return ret; -} - -API int zb_zcl_global_attr_write_structured(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, - unsigned short clusterid, zb_zcl_write_attr_structured_record_h *records, - int count, zb_zcl_global_attr_write_cb cb, void *user_data) -{ -#if (0 == ZIGBEE_SUPPORT_ORDERED_SEQUENCE_DATA) - return ZIGBEE_ERROR_NOT_SUPPORTED; -#endif - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0 == count, ZIGBEE_ERROR_INVALID_PARAMETER); - - return ZIGBEE_ERROR_NONE; -} - -API int zb_zcl_global_attr_write_no_rsp(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, - unsigned short clusterid, zb_zcl_write_attr_record_h *records, int count) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0 == count, ZIGBEE_ERROR_INVALID_PARAMETER); - ret = zbl_wattr_req_no_cb(handle, addr16, src_ep, dst_ep, zcl_fc, - clusterid, records, count); - return ret; -} - -API int zb_zcl_global_config_report_write(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, - unsigned short clusterid, zb_zcl_reporting_config_record_h *records, int count, - zb_zcl_global_config_report_write_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0 == count, ZIGBEE_ERROR_INVALID_PARAMETER); - ret = zbl_write_config_report(handle, addr16, src_ep, dst_ep, zcl_fc, - clusterid, records, count, cb, user_data); - return ret; -} - -API int zb_zcl_global_config_report_read(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, - unsigned short clusterid, zb_zcl_read_report_config_record_h *records, - int count, zb_zcl_global_config_report_read_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0 == count, ZIGBEE_ERROR_INVALID_PARAMETER); - ret = zbl_read_config_report(handle, addr16, src_ep, dst_ep, zcl_fc, - clusterid, records, count, cb, user_data); - return ret; -} - -API int zb_zcl_global_attr_discover(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, - unsigned short clusterid, unsigned short start_id, unsigned char max_attribute_ids, - zb_zcl_global_attr_discover_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - ret = zbl_discover_attr_req(handle, addr16, src_ep, dst_ep, zcl_fc, - clusterid, start_id, max_attribute_ids, cb, user_data); - return ret; -} - -API int zb_zcl_global_discover_cmds_received(zb_zigbee_h handle, - zb_nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep, - unsigned char zcl_fc, unsigned short clusterid, unsigned char start_command_id, - unsigned char max_command_ids, zb_zcl_global_discover_cmds_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - ret = zbl_discover_cmds_recv(handle, addr16, src_ep, dst_ep, zcl_fc, - clusterid, start_command_id, max_command_ids, cb, user_data); - return ret; -} - -API int zb_zcl_global_discover_cmds_generated(zb_zigbee_h handle, - zb_nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep, - unsigned char zcl_fc, unsigned short clusterid, unsigned char start_command_id, - unsigned char max_command_ids, zb_zcl_global_discover_cmds_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - ret = zbl_discover_cmds_gen(handle, addr16, src_ep, dst_ep, zcl_fc, - clusterid, start_command_id, max_command_ids, cb, user_data); - return ret; -} - -API int zb_zcl_global_attr_extended_discover(zb_zigbee_h handle, - zb_nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep, - unsigned char zcl_fc, unsigned short clusterid, unsigned short start_id, - unsigned char max_attribute_ids, zb_zcl_global_attr_extended_discover_cb cb, - void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - ret = zbl_discover_attr_ext(handle, addr16, src_ep, dst_ep, zcl_fc, - clusterid, start_id, max_attribute_ids, cb, user_data); - return ret; -} diff --git a/lib/zbl-zcl-groups.c b/lib/zbl-zcl-groups.c deleted file mode 100644 index ae54a92..0000000 --- a/lib/zbl-zcl-groups.c +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (c) 2016 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 "zbl.h" -#include "zbl-dbus.h" -#include "zb-common.h" - -API int zb_zcl_group_add_group(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep, unsigned short group_id, char *group_name, - zb_zcl_group_add_group_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - RETV_IF(NULL == group_name, ZIGBEE_ERROR_INVALID_PARAMETER); - ret = zbl_add_group(addr16, ep, group_id, group_name, cb, user_data); - return ret; -} - -API int zb_zcl_group_view_group(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep, unsigned short group_id, zb_zcl_group_view_group_cb cb, - void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - ret = zbl_view_group(addr16, ep, group_id, cb, user_data); - return ret; -} - -API int zb_zcl_group_get_group_membership(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep, unsigned char group_count, unsigned short *group_list, - zb_zcl_group_get_group_membership_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - RETV_IF(NULL == group_list, ZIGBEE_ERROR_INVALID_PARAMETER); - ret = zbl_group_get_group_membership(addr16, ep, group_count, group_list, cb, user_data); - return ret; -} - -API int zb_zcl_group_remove_group(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep, unsigned short group_id, zb_zcl_group_remove_group_cb cb, - void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - ret = zbl_remove_group(addr16, ep, group_id, cb, user_data); - return ret; -} - -API int zb_zcl_group_remove_all_group(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - ret = zbl_remove_all_group(addr16, ep); - return ret; -} - -API int zb_zcl_group_add_group_if_identifying(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep, unsigned short group_id, const char *group_name) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - ret = zbl_add_group_if_identifying(addr16, ep, group_id, group_name); - return ret; -} diff --git a/lib/zbl-zcl-identify.c b/lib/zbl-zcl-identify.c deleted file mode 100644 index 984c725..0000000 --- a/lib/zbl-zcl-identify.c +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2016 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 "zbl.h" -#include "zbl-dbus.h" -#include "zb-common.h" - -API int zb_zcl_identify(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep, - unsigned short identify_time) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - ret = zbl_identify(addr16, ep, identify_time); - return ret; -} - -API int zb_zcl_identify_query(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep, - zb_zcl_identify_query_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - ret = zbl_identify_query(addr16, ep, cb, user_data); - return ret; -} diff --git a/lib/zbl-zcl-isa-zone.c b/lib/zbl-zcl-isa-zone.c deleted file mode 100644 index 8d8aa66..0000000 --- a/lib/zbl-zcl-isa-zone.c +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2016 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 "zbl.h" -#include "zbl-dbus.h" -#include "zb-common.h" - -API int zb_zcl_zone_enroll_response(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep, unsigned char enroll_response_code, unsigned char zone_id) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - ret = zbl_zone_enroll_response(addr16, ep, enroll_response_code, zone_id); - return ret; -} diff --git a/lib/zbl-zcl-level-control.c b/lib/zbl-zcl-level-control.c deleted file mode 100644 index 24022a9..0000000 --- a/lib/zbl-zcl-level-control.c +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (c) 2016 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 "zbl.h" -#include "zbl-dbus.h" -#include "zb-common.h" - -API int zb_zcl_levelctrl_move_to_level(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep, unsigned char level, unsigned short transition_time) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - - ret = zbl_level_control_move_to_level(addr16, ep, level, transition_time); - return ret; -} - -API int zb_zcl_levelctrl_move(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep, unsigned char move_mode, unsigned char rate) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - - ret = zbl_level_control_move(addr16, ep, move_mode, rate); - return ret; -} - -API int zb_zcl_levelctrl_step(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep, - unsigned char step_mode, unsigned char step_size, unsigned short transition_time) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - - ret = zbl_level_control_step(addr16, ep, step_mode, step_size, transition_time); - return ret; -} - -API int zb_zcl_levelctrl_stop(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - - ret = zbl_level_control_stop(addr16, ep); - return ret; -} - -API int zb_zcl_levelctrl_move_to_level_with_on_off(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep, unsigned char level, unsigned short transition_time) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - - ret = zbl_level_control_move_to_level_with_on_off(addr16, ep, level, transition_time); - return ret; -} - -API int zb_zcl_levelctrl_move_with_on_off(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep, unsigned char move_mode, unsigned char rate) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - - ret = zbl_level_control_move_with_on_off(addr16, ep, move_mode, rate); - return ret; -} - -API int zb_zcl_levelctrl_step_with_on_off(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep, unsigned char step_mode, unsigned char step_size, - unsigned short transition_time) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - - ret = zbl_level_control_step_with_on_off(addr16, ep, step_mode, step_size, transition_time); - return ret; -} - diff --git a/lib/zbl-zcl-on-off.c b/lib/zbl-zcl-on-off.c deleted file mode 100644 index 3999c56..0000000 --- a/lib/zbl-zcl-on-off.c +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2016 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 "zbl.h" -#include "zbl-dbus.h" -#include "zb-common.h" - -API int zb_zcl_on_off_control(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep, - zb_zcl_on_off_e on_off_type) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - - ret = zbl_onoff_set(addr16, ep, on_off_type); - return ret; -} diff --git a/lib/zbl-zcl-poll-control.c b/lib/zbl-zcl-poll-control.c deleted file mode 100644 index 27e634a..0000000 --- a/lib/zbl-zcl-poll-control.c +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2016 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 "zbl.h" -#include "zbl-dbus.h" -#include "zb-common.h" - -API int zb_zcl_pollctrl_check_in_response(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep, unsigned char start_fast_polling, unsigned short fast_poll_timeout) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - ret = zbl_pollcontrol_check_in_response(addr16, ep, start_fast_polling, - fast_poll_timeout); - return ret; -} - -API int zb_zcl_pollctrl_fast_poll_stop(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - ret = zbl_pollcontrol_fast_poll_stop(addr16, ep); - return ret; -} - -API int zb_zcl_pollctrl_set_long_poll_interval(zb_zigbee_h handle, - zb_nwk_addr addr16, unsigned char ep, unsigned int new_long_poll_interval, - zb_zcl_pollctrl_check_in_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - ret = zbl_pollcontrol_set_long_poll_interval(addr16, ep, new_long_poll_interval, - cb, user_data); - return ret; -} - -API int zb_zcl_pollctrl_set_short_poll_interval(zb_zigbee_h handle, - zb_nwk_addr addr16, unsigned char ep, unsigned int new_short_poll_interval, - zb_zcl_pollctrl_check_in_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - ret = zbl_pollcontrol_set_short_poll_interval(addr16, ep, new_short_poll_interval, - cb, user_data); - return ret; -} diff --git a/lib/zbl-zcl-scenes.c b/lib/zbl-zcl-scenes.c deleted file mode 100644 index 190f6df..0000000 --- a/lib/zbl-zcl-scenes.c +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (c) 2016 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 "zbl.h" -#include "zbl-dbus.h" -#include "zb-common.h" - -API int zb_zcl_scene_add_scene(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep, - unsigned short group_id, unsigned char scene_id, unsigned short transition_time, - const char *scene_name, unsigned short ext_field_len, - const char *extension_field_sets, zb_zcl_scene_add_scene_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - RETV_IF(NULL == scene_name, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == extension_field_sets, ZIGBEE_ERROR_INVALID_PARAMETER); - ret = zbl_add_scene(addr16, ep, group_id, scene_id, transition_time, scene_name, - ext_field_len, extension_field_sets, cb, user_data); - return ret; -} - -API int zb_zcl_scene_view_scene(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep, - unsigned short group_id, unsigned char scene_id, zb_zcl_scene_view_scene_cb cb, - void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - ret = zbl_view_scene(addr16, ep, group_id, scene_id, cb, user_data); - return ret; -} - -API int zb_zcl_scene_remove_scene(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep, unsigned short group_id, unsigned char scene_id, - zb_zcl_scene_remove_scene_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - ret = zbl_remove_scene(addr16, ep, group_id, scene_id, cb, user_data); - return ret; -} - -API int zb_zcl_scene_remove_all_scene(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep, unsigned short group_id, zb_zcl_scene_remove_all_scene_cb cb, - void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - ret = zbl_remove_all_scene(addr16, ep, group_id, cb, user_data); - return ret; -} - -API int zb_zcl_scene_store_scene(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep, - unsigned short group_id, unsigned char scene_id, zb_zcl_scene_store_scene_cb cb, - void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - ret = zbl_store_scene(addr16, ep, group_id, scene_id, cb, user_data); - return ret; -} - -API int zb_zcl_scene_recall_scene(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep, unsigned short group_id, unsigned char scene_id) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - ret = zbl_recall_scene(addr16, ep, group_id, scene_id); - return ret; -} - -API int zb_zcl_scene_get_scene_membership(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep, unsigned short group_id, - zb_zcl_scene_get_scene_membership_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - ret = zbl_get_scene_membership(addr16, ep, group_id, cb, user_data); - return ret; -} - diff --git a/lib/zbl-zcl-thermostat.c b/lib/zbl-zcl-thermostat.c deleted file mode 100644 index 09edcd5..0000000 --- a/lib/zbl-zcl-thermostat.c +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2016 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 "zbl.h" -#include "zbl-dbus.h" -#include "zb-common.h" - -API int zb_zcl_thermostat_adjust_setpoint(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char ep, unsigned char mode, unsigned char amount) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(0x02 < mode, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - - ret = zbl_thermostat_adjust_setpoint(addr16, ep, mode, amount); - return ret; -} - diff --git a/lib/zbl-zcl.c b/lib/zbl-zcl.c deleted file mode 100644 index 871b49f..0000000 --- a/lib/zbl-zcl.c +++ /dev/null @@ -1,1408 +0,0 @@ -/* - * Copyright (c) 2016 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 -#include -#include - -#include "zbl.h" -#include "zbl-dbus.h" -#include "zb-common.h" - -#define ZB_GUARD_CHAR 1 -#define ZB_ZCL_OCTET_SIZE 1 -#define ZB_ZCL_LONG_OCTET_SIZE 2 - -API int zb_read_attr_status_record_create( - zb_zcl_read_attr_status_record_h *handle) -{ - zb_zcl_read_attr_status_record_h simple = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - CHECK_ZIGBEE_PRIVILEGE(); - - simple = calloc(1, sizeof(struct read_attribute_status_record_s)); - RETVM_IF(NULL == simple, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - *handle = simple; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_read_attr_status_record_clone(zb_zcl_read_attr_status_record_h src, - zb_zcl_read_attr_status_record_h *dst) -{ - struct read_attribute_status_record_s *srcs = src; - struct read_attribute_status_record_s *desc = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER); - - desc = calloc(1, sizeof(struct read_attribute_status_record_s)); - RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - memcpy(desc, src, sizeof(struct read_attribute_status_record_s)); - desc->value = calloc(1, zb_zcl_get_data_size(srcs->type)); - RETVM_IF(NULL == desc->value, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - memcpy(desc->value, srcs->value, zb_zcl_get_data_size(srcs->type)); - *dst = desc; - - return ZIGBEE_ERROR_NONE; -} - - -API int zb_read_attr_status_record_destroy( - zb_zcl_read_attr_status_record_h handle) -{ - struct read_attribute_status_record_s* h = handle; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - - if (h->value) - free(h->value); - free(h); - - return ZIGBEE_ERROR_NONE; -} - -API int zb_read_attr_status_record_get_id( - zb_zcl_read_attr_status_record_h handle, unsigned short* id) -{ - struct read_attribute_status_record_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == id, ZIGBEE_ERROR_INVALID_PARAMETER); - - *id = h->id; - return ZIGBEE_ERROR_NONE; -} - -API int zb_read_attr_status_record_set_id( - zb_zcl_read_attr_status_record_h handle, unsigned short id) -{ - struct read_attribute_status_record_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - - h->id = id; - return ZIGBEE_ERROR_NONE; -} - -API int zb_read_attr_status_record_get_status( - zb_zcl_read_attr_status_record_h handle, zb_zcl_status_e* status) -{ - struct read_attribute_status_record_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER); - - *status = h->status; - return ZIGBEE_ERROR_NONE; -} - -API int zb_read_attr_status_record_set_status( - zb_zcl_read_attr_status_record_h handle, zb_zcl_status_e status) -{ - struct read_attribute_status_record_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - - h->status = status; - return ZIGBEE_ERROR_NONE; -} - -API int zb_read_attr_status_record_get_type( - zb_zcl_read_attr_status_record_h handle, zb_zcl_data_type_e *type) -{ - struct read_attribute_status_record_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == type, ZIGBEE_ERROR_INVALID_PARAMETER); - - *type = h->type; - return ZIGBEE_ERROR_NONE; -} - -API int zb_read_attr_status_record_set_type( - zb_zcl_read_attr_status_record_h handle, zb_zcl_data_type_e type) -{ - struct read_attribute_status_record_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0 >= zb_zcl_get_data_size(type), ZIGBEE_ERROR_INVALID_PARAMETER); - - h->type = type; - return ZIGBEE_ERROR_NONE; -} - -API int zb_read_attr_status_record_get_value( - zb_zcl_read_attr_status_record_h handle, zb_zcl_data_type_e* type, - unsigned char** value, int* count) -{ - int len = -1; - struct read_attribute_status_record_s* h = handle; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == value, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == h->value, ZIGBEE_ERROR_NO_DATA); - - len = zb_zcl_get_data_size(h->type); - if (0 < len) { - - *value = calloc(len + ZB_GUARD_CHAR, sizeof(char)); - RETV_IF(NULL == *value, ZIGBEE_ERROR_OUT_OF_MEMORY); - memcpy(*value, h->value, len); - *type = h->type; - *count = len; - - } else if (ZB_ZCL_OCTET_STRING == h->type || ZB_ZCL_CHARACTER_STRING == h->type) { - - len = h->value[0]; - - *value = calloc(len + ZB_GUARD_CHAR, sizeof(char)); - RETV_IF(NULL == *value, ZIGBEE_ERROR_OUT_OF_MEMORY); - memcpy(*value, h->value + ZB_ZCL_OCTET_SIZE, len); - - *type = h->type; - *count = len; - - } else if (ZB_ZCL_LONG_OCTET_STRING == h->type || ZB_ZCL_LONG_CHARACTER_STRING == h->type) { - - len = h->value[0] & 0xff; - len |= (h->value[1] << 8) & 0xff00 ; - - *value = calloc(len + ZB_GUARD_CHAR, sizeof(char)); - RETV_IF(NULL == *value, ZIGBEE_ERROR_OUT_OF_MEMORY); - memcpy(*value, h->value + ZB_ZCL_LONG_OCTET_SIZE, len); - - *type = h->type; - *count = len; - - } else { - return ZIGBEE_ERROR_NOT_SUPPORTED; - } - - return ZIGBEE_ERROR_NONE; -} - -API int zb_read_attr_status_record_set_value( - zb_zcl_read_attr_status_record_h handle, zb_zcl_data_type_e type, - unsigned char* value, int count) -{ - int len = -1; - struct read_attribute_status_record_s* h = handle; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == value, ZIGBEE_ERROR_INVALID_PARAMETER); - - len = zb_zcl_get_data_size(type); - if (0 < len) { - - h->value = calloc(len + ZB_GUARD_CHAR, sizeof(char)); - RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY); - memcpy(h->value, value, len); - h->type = type; - - } else if (ZB_ZCL_OCTET_STRING == type || ZB_ZCL_CHARACTER_STRING == type) { - - h->value = calloc(count + ZB_ZCL_OCTET_SIZE + ZB_GUARD_CHAR, sizeof(char)); - RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY); - - h->value[0] = count; - memcpy(h->value + ZB_ZCL_OCTET_SIZE, value + ZB_ZCL_OCTET_SIZE, count); - - } else if (ZB_ZCL_LONG_OCTET_STRING == type || ZB_ZCL_LONG_CHARACTER_STRING == type) { - - h->value = calloc(count + ZB_ZCL_LONG_OCTET_SIZE + ZB_GUARD_CHAR, sizeof(char)); - RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY); - - h->value[0] = count & 0xff; - h->value[1] = (count >> 8) & 0xff ; - memcpy(h->value + ZB_ZCL_LONG_OCTET_SIZE, value, len); - - } else { - return ZIGBEE_ERROR_NOT_SUPPORTED; - } - - return ZIGBEE_ERROR_NONE; -} - -API int zb_discover_attr_info_create(zb_zcl_discover_attr_info_record_h *handle) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - zb_zcl_discover_attr_info_record_h simple = NULL; - - CHECK_ZIGBEE_PRIVILEGE(); - - simple = calloc(1, sizeof(struct discover_attribute_info_record_s)); - RETVM_IF(NULL == simple, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - *handle = simple; - return ZIGBEE_ERROR_NONE; -} - -API int zb_discover_attr_info_clone(zb_zcl_discover_attr_info_record_h src, - zb_zcl_discover_attr_info_record_h *dst) -{ - struct discover_attribute_info_record_s *srcs = src; - struct discover_attribute_info_record_s *desc = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER); - - desc = calloc(1, sizeof(struct discover_attribute_info_record_s)); - RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - memcpy(desc, srcs, sizeof(struct discover_attribute_info_record_s)); - - *dst = desc; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_discover_attr_info_destroy(zb_zcl_discover_attr_info_record_h handle) -{ - struct discover_attribute_info_record_s *h = handle; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - - free(h); - - return ZIGBEE_ERROR_NONE; -} - -API int zb_discover_attr_info_get_id( - zb_zcl_discover_attr_info_record_h handle, unsigned short *id) -{ - struct discover_attribute_info_record_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == id, ZIGBEE_ERROR_INVALID_PARAMETER); - - *id = h->id; - return ZIGBEE_ERROR_NONE; -} - -API int zb_discover_attr_info_set_id( - zb_zcl_discover_attr_info_record_h handle, unsigned short id) -{ - struct discover_attribute_info_record_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - - h->id = id; - return ZIGBEE_ERROR_NONE; -} - -API int zb_discover_attr_info_get_type( - zb_zcl_discover_attr_info_record_h handle, zb_zcl_data_type_e *type) -{ - struct discover_attribute_info_record_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == type, ZIGBEE_ERROR_INVALID_PARAMETER); - - *type = h->type; - return ZIGBEE_ERROR_NONE; -} - -API int zb_discover_attr_info_set_type( - zb_zcl_discover_attr_info_record_h handle, zb_zcl_data_type_e type) -{ - struct discover_attribute_info_record_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0 >= zb_zcl_get_data_size(type), ZIGBEE_ERROR_INVALID_PARAMETER); - - h->type = type; - return ZIGBEE_ERROR_NONE; -} - -API int zb_write_attr_record_create(zb_zcl_write_attr_record_h *handle) -{ - zb_zcl_write_attr_record_h t = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - CHECK_ZIGBEE_PRIVILEGE(); - - t = calloc(1, sizeof(struct write_attribute_record_s)); - RETVM_IF(NULL == t, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - *handle = t; - return ZIGBEE_ERROR_NONE; -} - -API int zb_write_attr_record_clone(zb_zcl_write_attr_record_h src, - zb_zcl_write_attr_record_h *dst) -{ - struct write_attribute_record_s *srcs = src; - struct write_attribute_record_s *desc = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER); - - desc = calloc(1, sizeof(struct write_attribute_record_s)); - RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - memcpy(desc, src, sizeof(struct write_attribute_record_s)); - - desc->value = calloc(1, zb_zcl_get_data_size(srcs->type)); - RETVM_IF(NULL == desc->value, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - memcpy(desc->value, srcs->value, zb_zcl_get_data_size(srcs->type)); - *dst = desc; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_write_attr_record_destroy(zb_zcl_write_attr_record_h handle) -{ - struct write_attribute_record_s* h = handle; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - - if (h->value) { - free(h->value); - h->value = NULL; - } - free(h); - h = NULL; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_write_attr_record_set_id(zb_zcl_write_attr_record_h handle, - unsigned short id) -{ - struct write_attribute_record_s* h = handle; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - h->id = id; - return ZIGBEE_ERROR_NONE; -} - -API int zb_write_attr_record_set_type(zb_zcl_write_attr_record_h handle, - zb_zcl_data_type_e type) -{ - struct write_attribute_record_s* h = handle; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0 >= zb_zcl_get_data_size(type), ZIGBEE_ERROR_INVALID_PARAMETER); - - h->type = type; - return ZIGBEE_ERROR_NONE; -} - -API int zb_write_attr_record_set_value(zb_zcl_write_attr_record_h handle, - zb_zcl_data_type_e type, unsigned char* value, int count) -{ - int len = -1; - - struct write_attribute_record_s* h = handle; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == value, ZIGBEE_ERROR_INVALID_PARAMETER); - - if (h->value) { - free(h->value); - h->value = NULL; - } - - len = zb_zcl_get_data_size(type); - if (0 < len) { - - h->value = calloc(len + ZB_GUARD_CHAR , sizeof(char)); - RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY); - memcpy(h->value, value, count); - h->type = type; - - } else if (ZB_ZCL_OCTET_STRING == type || ZB_ZCL_CHARACTER_STRING == type) { - - h->value = calloc(count + ZB_ZCL_OCTET_SIZE + ZB_GUARD_CHAR, sizeof(char)); - RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY); - /* The first 1 byte indicate invalid or length of string */ - h->value[0] = value[0] & 0xff; - memcpy(h->value + ZB_ZCL_OCTET_SIZE, value, count); - - } else if (ZB_ZCL_LONG_OCTET_STRING == type || ZB_ZCL_LONG_CHARACTER_STRING == type) { - - h->value = calloc(count + ZB_ZCL_LONG_OCTET_SIZE + ZB_GUARD_CHAR, sizeof(char)); - RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY); - - /* The first 2 byte indicate invalid or length of string */ - h->value[0] = count & 0xff; - h->value[1] = (count >> 8) & 0xff ; - - memcpy(h->value + ZB_ZCL_LONG_OCTET_SIZE, value, count); - - } else { - return ZIGBEE_ERROR_NOT_SUPPORTED; - } - - return ZIGBEE_ERROR_NONE; -} - -API int zb_write_attr_status_create(zb_zcl_write_attr_status_record_h *handle) -{ - zb_zcl_write_attr_status_record_h simple = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - CHECK_ZIGBEE_PRIVILEGE(); - - simple = calloc(1, sizeof(struct write_attribute_status_record_s)); - RETVM_IF(NULL == simple, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - *handle = simple; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_write_attr_status_clone(zb_zcl_write_attr_status_record_h src, - zb_zcl_write_attr_status_record_h *dst) -{ - struct write_attribute_status_record_s *srcs = src; - struct write_attribute_status_record_s *desc = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER); - - desc = calloc(1, sizeof(struct write_attribute_status_record_s)); - RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - memcpy(desc, srcs, sizeof(struct write_attribute_status_record_s)); - - *dst = desc; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_write_attr_status_destroy(zb_zcl_write_attr_status_record_h handle) -{ - struct write_attribute_status_record_s *h = handle; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - - free(h); - return ZIGBEE_ERROR_NONE; -} - -API int zb_write_attr_status_get_status( - zb_zcl_write_attr_status_record_h handle, zb_zcl_status_e *status) -{ - struct write_attribute_status_record_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER); - - *status = h->status; - return ZIGBEE_ERROR_NONE; -} - -API int zb_write_attr_status_set_status(zb_zcl_write_attr_status_record_h handle, - zb_zcl_status_e status) -{ - struct write_attribute_status_record_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - - h->status = status; - return ZIGBEE_ERROR_NONE; -} - -API int zb_write_attr_status_get_id(zb_zcl_write_attr_status_record_h handle, - unsigned short *id) -{ - struct write_attribute_status_record_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == id, ZIGBEE_ERROR_INVALID_PARAMETER); - - *id = h->id; - return ZIGBEE_ERROR_NONE; -} - -API int zb_write_attr_status_set_id(zb_zcl_write_attr_status_record_h handle, - unsigned short id) -{ - struct write_attribute_status_record_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - - h->id = id; - return ZIGBEE_ERROR_NONE; -} - -API int zb_report_config_record_create(zb_zcl_reporting_config_record_h *handle) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - zb_zcl_reporting_config_record_h t = NULL; - - CHECK_ZIGBEE_PRIVILEGE(); - - t = calloc(1, sizeof(struct reporting_configuration_record_s)); - RETVM_IF(NULL == t, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - *handle = t; - return ZIGBEE_ERROR_NONE; -} - -API int zb_report_config_record_clone(zb_zcl_reporting_config_record_h src, - zb_zcl_reporting_config_record_h *dst) -{ - struct reporting_configuration_record_s *srcs = src; - struct reporting_configuration_record_s *desc = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER); - - desc = calloc(1, sizeof(struct reporting_configuration_record_s)); - RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - memcpy(desc, src, sizeof(struct reporting_configuration_record_s)); - - desc->change = calloc(1, zb_zcl_get_data_size(srcs->type)); - RETVM_IF(NULL == desc->change, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - memcpy(desc->change, srcs->change, zb_zcl_get_data_size(srcs->type)); - *dst = desc; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_report_config_record_destroy(zb_zcl_reporting_config_record_h handle) -{ - struct reporting_configuration_record_s *h = handle; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - - if (h->change) - free(h->change); - free(h); - - return ZIGBEE_ERROR_NONE; -} - -API int zb_report_config_record_get_dir(zb_zcl_reporting_config_record_h handle, - zb_zcl_fc_direction_e *dir) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct reporting_configuration_record_s *h = handle; - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == dir, ZIGBEE_ERROR_INVALID_PARAMETER); - *dir = h->dir; - return ZIGBEE_ERROR_NONE; -} - -API int zb_report_config_record_set_dir(zb_zcl_reporting_config_record_h handle, - zb_zcl_fc_direction_e dir) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct reporting_configuration_record_s *h = handle; - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - if (dir == ZB_ZCL_CLIENT_TO_SERVER) - h->dir = 0x00 ; - else - h->dir = 0x01; - return ZIGBEE_ERROR_NONE; -} - -API int zb_report_config_record_get_id(zb_zcl_reporting_config_record_h handle, - unsigned short *id) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct reporting_configuration_record_s *h = handle; - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == id, ZIGBEE_ERROR_INVALID_PARAMETER); - *id = h->id; - return ZIGBEE_ERROR_NONE; -} - -API int zb_report_config_record_set_id(zb_zcl_reporting_config_record_h handle, - unsigned short id) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct reporting_configuration_record_s *h = handle; - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - h->id = id ; - return ZIGBEE_ERROR_NONE; -} - - -API int zb_report_config_record_get_type( - zb_zcl_reporting_config_record_h handle, zb_zcl_data_type_e *type) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct reporting_configuration_record_s *h = handle; - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == type, ZIGBEE_ERROR_INVALID_PARAMETER); - *type = h->type; - return ZIGBEE_ERROR_NONE; -} - -API int zb_report_config_record_get_min_interval( - zb_zcl_reporting_config_record_h handle, unsigned short *min_i) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct reporting_configuration_record_s *h = handle; - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == min_i, ZIGBEE_ERROR_INVALID_PARAMETER); - *min_i = h->min_i; - return ZIGBEE_ERROR_NONE; -} - -API int zb_report_config_record_set_min_interval( - zb_zcl_reporting_config_record_h handle, unsigned short min_i) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct reporting_configuration_record_s *h = handle; - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - h->min_i = min_i; - return ZIGBEE_ERROR_NONE; -} - -API int zb_report_config_record_get_max_interval( - zb_zcl_reporting_config_record_h handle, unsigned short *max_i) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct reporting_configuration_record_s *h = handle; - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == max_i, ZIGBEE_ERROR_INVALID_PARAMETER); - *max_i = h->max_i; - return ZIGBEE_ERROR_NONE; -} - -API int zb_report_config_record_set_max_interval( - zb_zcl_reporting_config_record_h handle, unsigned short max_i) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct reporting_configuration_record_s *h = handle; - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - h->max_i = max_i; - return ZIGBEE_ERROR_NONE; -} - -API int zb_report_config_record_get_timeout( - zb_zcl_reporting_config_record_h handle, unsigned short *to) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct reporting_configuration_record_s *h = handle; - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == to, ZIGBEE_ERROR_INVALID_PARAMETER); - *to = h->to; - return ZIGBEE_ERROR_NONE; -} - -API int zb_report_config_record_set_timeout( - zb_zcl_reporting_config_record_h handle, unsigned short to) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct reporting_configuration_record_s *h = handle; - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - h->to = to; - return ZIGBEE_ERROR_NONE; -} - -API int zb_report_config_record_get_change( - zb_zcl_reporting_config_record_h handle, zb_zcl_data_type_e *type, - unsigned char **value, int *count) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - int len = -1; - unsigned char *temp = NULL; - int data_type = ZB_ZCL_DATA_TYPE_NONE; - - struct reporting_configuration_record_s *h = handle; - - NOT_USED(data_type); - - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == value, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == h->change, ZIGBEE_ERROR_NO_DATA); - - len = zb_zcl_get_data_size(h->type); - data_type = zb_zcl_get_analog_or_discret(h->type); - if (0 < len /* && ZB_ZCL_DATA_TYPE_ANALOG == data_type */) { - - temp = calloc(len, sizeof(char)); - RETV_IF(NULL == temp, ZIGBEE_ERROR_OUT_OF_MEMORY); - memcpy(temp, h->change, len); - *type = h->type; - *count = len; - *value = temp; - - } else { - return ZIGBEE_ERROR_NOT_SUPPORTED; - } - - return ZIGBEE_ERROR_NONE; -} - -API int zb_report_config_record_set_change( - zb_zcl_reporting_config_record_h handle, zb_zcl_data_type_e type, unsigned char *value) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - int len = -1; - int data_type = ZB_ZCL_DATA_TYPE_NONE; - - struct reporting_configuration_record_s *h = handle; - - NOT_USED(data_type); - - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - if (h->change) - free(h->change); - - len = zb_zcl_get_data_size(type); - data_type = zb_zcl_get_analog_or_discret(type); - - if (0 < len /* && ZB_ZCL_DATA_TYPE_ANALOG == data_type */) { - h->change = calloc(len + 1, sizeof(unsigned char)); - RETV_IF(NULL == h->change, ZIGBEE_ERROR_OUT_OF_MEMORY); - memcpy(h->change, value, len); - h->type = type; - } else { - return ZIGBEE_ERROR_NOT_SUPPORTED; - } - - return ZIGBEE_ERROR_NONE; -} - -API int zb_read_report_config_record_create( - zb_zcl_read_report_config_record_h *handle) -{ - zb_zcl_read_report_config_record_h t = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - CHECK_ZIGBEE_PRIVILEGE(); - - t = calloc(1, sizeof(struct read_reporting_configuration_record_s)); - RETVM_IF(NULL == t, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - *handle = t; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_read_report_config_record_clone( - zb_zcl_read_report_config_record_h src, zb_zcl_read_report_config_record_h *dst) -{ - struct read_reporting_configuration_record_s *srcs = src; - struct read_reporting_configuration_record_s *desc = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER); - - desc = calloc(1, sizeof(struct read_reporting_configuration_record_s)); - RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - memcpy(desc, srcs, sizeof(struct read_reporting_configuration_record_s)); - *dst = desc; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_read_report_config_record_destroy( - zb_zcl_read_report_config_record_h handle) -{ - struct read_reporting_configuration_record_s *h = handle; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - - free(h); - - return ZIGBEE_ERROR_NONE; -} - -API int zb_read_report_config_record_set_dir( - zb_zcl_read_report_config_record_h handle, zb_zcl_fc_direction_e dir) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct read_reporting_configuration_record_s *h = handle; - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - if (dir == ZB_ZCL_CLIENT_TO_SERVER) - h->dir = 0x00; - else - h->dir = 0x01; - return ZIGBEE_ERROR_NONE; -} - -API int zb_read_report_config_record_get_dir( - zb_zcl_read_report_config_record_h handle, zb_zcl_fc_direction_e *dir) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct read_reporting_configuration_record_s *h = handle; - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - *dir = h->dir; - return ZIGBEE_ERROR_NONE; -} - -API int zb_read_report_config_record_set_id( - zb_zcl_read_report_config_record_h handle, unsigned short id) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct read_reporting_configuration_record_s *h = handle; - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - - h->id = id; - return ZIGBEE_ERROR_NONE; -} - -API int zb_read_report_config_record_get_id( - zb_zcl_read_report_config_record_h handle, unsigned short *id) -{ - struct read_reporting_configuration_record_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - *id = h->id; - return ZIGBEE_ERROR_NONE; -} - -API int zb_report_config_response_record_create( - zb_zcl_report_config_response_record_h *handle) -{ - zb_zcl_report_config_response_record_h t = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - CHECK_ZIGBEE_PRIVILEGE(); - - t = calloc(1, sizeof(struct reporting_configuration_response_record_s)); - RETVM_IF(NULL == t, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - *handle = t; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_report_config_response_record_clone( - zb_zcl_report_config_response_record_h src, - zb_zcl_report_config_response_record_h *dst) -{ - struct reporting_configuration_response_record_s *srcs = src; - struct reporting_configuration_response_record_s *desc = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER); - - desc = calloc(1, sizeof(struct reporting_configuration_response_record_s)); - RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - memcpy(desc, srcs, sizeof(struct reporting_configuration_response_record_s)); - *dst = desc; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_report_config_response_record_destroy( - zb_zcl_report_config_response_record_h handle) -{ - struct reporting_configuration_response_record_s *h = handle; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - - free(h); - - return ZIGBEE_ERROR_NONE; -} - -API int zb_report_config_response_record_get_status( - zb_zcl_report_config_response_record_h handle, zb_zcl_status_e *status) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct reporting_configuration_response_record_s *h = handle; - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER); - - *status = h->status; - return ZIGBEE_ERROR_NONE; -} - -API int zb_report_config_response_record_set_status( - zb_zcl_report_config_response_record_h handle, zb_zcl_status_e status) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct reporting_configuration_response_record_s *h = handle; - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - - h->status = status; - return ZIGBEE_ERROR_NONE; -} - -API int zb_report_config_response_record_get_dir( - zb_zcl_report_config_response_record_h handle, zb_zcl_fc_direction_e *dir) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct reporting_configuration_response_record_s *h = handle; - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == dir, ZIGBEE_ERROR_INVALID_PARAMETER); - - *dir = h->dir; - return ZIGBEE_ERROR_NONE; -} - -API int zb_report_config_response_record_set_dir( - zb_zcl_report_config_response_record_h handle, zb_zcl_fc_direction_e dir) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct reporting_configuration_response_record_s *h = handle; - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - - h->dir = dir; - return ZIGBEE_ERROR_NONE; -} - -API int zb_report_config_response_record_get_id( - zb_zcl_report_config_response_record_h handle, unsigned short *id) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct reporting_configuration_response_record_s *h = handle; - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == id, ZIGBEE_ERROR_INVALID_PARAMETER); - - *id = h->id; - return ZIGBEE_ERROR_NONE; -} - -API int zb_report_config_response_record_set_id( - zb_zcl_report_config_response_record_h handle, unsigned short id) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct reporting_configuration_response_record_s *h = handle; - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - - h->id = id; - return ZIGBEE_ERROR_NONE; -} - -API int zb_attr_report_create(zb_zcl_attr_report_h *handle) -{ - zb_zcl_attr_report_h t = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - CHECK_ZIGBEE_PRIVILEGE(); - - t = calloc(1, sizeof(struct attribute_report_s)); - RETVM_IF(NULL == t, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - *handle = t; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_attr_report_clone(zb_zcl_attr_report_h src, zb_zcl_attr_report_h *dst) -{ - struct attribute_report_s *srcs = src; - struct attribute_report_s *desc = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER); - - desc = calloc(1, sizeof(struct attribute_report_s)); - RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - memcpy(desc, srcs, sizeof(struct attribute_report_s)); - - desc->value = calloc(1, zb_zcl_get_data_size(srcs->type)); - RETVM_IF(NULL == desc->value, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - memcpy(desc->value, srcs->value, zb_zcl_get_data_size(srcs->type)); - *dst = desc; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_attr_report_destroy(zb_zcl_attr_report_h handle) -{ - struct attribute_report_s *h = handle; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - - if (h->value) - free(h->value); - free(h); - - return ZIGBEE_ERROR_NONE; -} - -API int zb_attr_report_get_id(zb_zcl_attr_report_h handle, unsigned short *id) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct attribute_report_s *h = handle; - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == id, ZIGBEE_ERROR_INVALID_PARAMETER); - - *id = h->id; - return ZIGBEE_ERROR_NONE; -} - -API int zb_attr_report_set_id(zb_zcl_attr_report_h handle, unsigned short id) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct attribute_report_s *h = handle; - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - - h->id = id; - return ZIGBEE_ERROR_NONE; -} - -API int zb_attr_report_get_type(zb_zcl_attr_report_h handle, - zb_zcl_data_type_e *type) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct attribute_report_s *h = handle; - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == type, ZIGBEE_ERROR_INVALID_PARAMETER); - - *type = h->type; - return ZIGBEE_ERROR_NONE; -} - -API int zb_attr_report_set_type(zb_zcl_attr_report_h handle, - zb_zcl_data_type_e type) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct attribute_report_s *h = handle; - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - - h->type = type; - return ZIGBEE_ERROR_NONE; -} - -API int zb_attr_report_get_value(zb_zcl_attr_report_h handle, - zb_zcl_data_type_e* type, unsigned char** value, int* count) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - int len = -1; - unsigned char *temp = NULL; - struct attribute_report_s *h = handle; - - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == value, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == h->value, ZIGBEE_ERROR_NO_DATA); - - len = zb_zcl_get_data_size(h->type); - if (0 < len) { - - temp = calloc(len, sizeof(unsigned char)); - RETV_IF(NULL == temp, ZIGBEE_ERROR_OUT_OF_MEMORY); - memcpy(temp, h->value, len); - *type = h->type; - *count = len; - *value = temp; - - } else if (ZB_ZCL_OCTET_STRING == h->type || ZB_ZCL_CHARACTER_STRING == h->type) { - - len = h->value[0]; - temp = calloc(len + ZB_GUARD_CHAR, sizeof(char)); - RETV_IF(NULL == temp, ZIGBEE_ERROR_OUT_OF_MEMORY); - - memcpy(temp, h->value + ZB_ZCL_OCTET_SIZE, len); - *type = h->type; - *count = len; - *value = temp; - - } else if (ZB_ZCL_LONG_OCTET_STRING == h->type || ZB_ZCL_LONG_CHARACTER_STRING == h->type) { - - len = h->value[0] & 0xff; - len |= (h->value[1] << 8) & 0xff00 ; - - temp = calloc(len + ZB_GUARD_CHAR, sizeof(char)); - RETV_IF(NULL == temp, ZIGBEE_ERROR_OUT_OF_MEMORY); - memcpy(*value, h->value + ZB_ZCL_LONG_OCTET_SIZE, len); - - *type = h->type; - *count = len; - *value = temp; - - } else { - return ZIGBEE_ERROR_NOT_SUPPORTED; - } - - return ZIGBEE_ERROR_NONE; -} - -API int zb_attr_report_set_value(zb_zcl_attr_report_h handle, - zb_zcl_data_type_e type, unsigned char* value, int count) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - int len = -1; - struct attribute_report_s *h = handle; - - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == value, ZIGBEE_ERROR_INVALID_PARAMETER); - - if (h->value) { - free(h->value); - h->value = NULL; - } - - len = zb_zcl_get_data_size(type); - if (0 < len) { - - h->value = calloc(len + ZB_GUARD_CHAR , sizeof(char)); - RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY); - memcpy(h->value, value, count); - h->type = type; - - } else if (ZB_ZCL_OCTET_STRING == type || ZB_ZCL_CHARACTER_STRING == type) { - - h->value = calloc(count + ZB_ZCL_OCTET_SIZE + ZB_GUARD_CHAR, sizeof(char)); - RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY); - /* The first 1 byte indicate invalid or length of string */ - h->value[0] = value[0] & 0xff; - memcpy(h->value + ZB_ZCL_OCTET_SIZE, value, count); - - } else if (ZB_ZCL_LONG_OCTET_STRING == type || ZB_ZCL_LONG_CHARACTER_STRING == type) { - - h->value = calloc(count + ZB_ZCL_LONG_OCTET_SIZE + ZB_GUARD_CHAR, sizeof(char)); - RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY); - - /* The first 2 byte indicate invalid or length of string */ - h->value[0] = count & 0xff; - h->value[1] = (count >> 8) & 0xff ; - - memcpy(h->value + ZB_ZCL_LONG_OCTET_SIZE, value, count); - - } else { - return ZIGBEE_ERROR_NOT_SUPPORTED; - } - - return ZIGBEE_ERROR_NONE; -} - - -/** - * @brief Format of the Selector Field - * - * @since_tizen 4.0 - */ -struct selector_s { - unsigned char indicator; /**< number of index */ - unsigned short *index; /**< index list */ -}; - -/** - * @brief Stcuture for reading attribute - * - * @since_tizen 4.0 - */ -struct read_structured_attribute_record_s { - unsigned short id; /**< attribute identifier */ - struct selector_s *selector; /**< selector format */ -}; - -/** - * @brief Format of the Write Attribute Record Field - * - * @since_tizen 4.0 - */ -struct write_attribute_structured_status_record_s { - unsigned char status; /**< status */ - unsigned short id; /**< identifier */ - struct selector_s selector; /**< selector */ -}; - -/** - * @brief Format of the Write Attribute Record Field - * - * @since_tizen 4.0 - */ -struct write_attribute_structured_record_s { - unsigned short id; /**< attribute identifier */ - struct selector_s selector; - unsigned char type; /**< attribute data type */ - unsigned char *value; /**< data value */; /**< attribute value */ -}; - -API int zb_extended_attr_info_create(zb_zcl_extended_attr_info_h *handle) -{ - zb_zcl_extended_attr_info_h t = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - CHECK_ZIGBEE_PRIVILEGE(); - - t = calloc(1, sizeof(struct extended_attribute_infomation_s)); - RETVM_IF(NULL == t, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - *handle = t; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_extended_attr_info_clone(zb_zcl_extended_attr_info_h src, - zb_zcl_extended_attr_info_h *dst) -{ - struct extended_attribute_infomation_s *srcs = src; - struct extended_attribute_infomation_s *desc = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER); - - desc = calloc(1, sizeof(struct extended_attribute_infomation_s)); - RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - memcpy(desc, srcs, sizeof(struct extended_attribute_infomation_s)); - - *dst = desc; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_extended_attr_info_destroy(zb_zcl_extended_attr_info_h handle) -{ - struct extended_attribute_infomation_s *h = handle; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - - free(h); - - return ZIGBEE_ERROR_NONE; -} - -API int zb_extended_attr_info_get_id(zb_zcl_extended_attr_info_h handle, - unsigned short *id) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct extended_attribute_infomation_s *h = handle; - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == id, ZIGBEE_ERROR_INVALID_PARAMETER); - - *id = h->id; - return ZIGBEE_ERROR_NONE; -} - -API int zb_extended_attr_info_set_id(zb_zcl_extended_attr_info_h handle, - unsigned short id) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct extended_attribute_infomation_s *h = handle; - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - - h->id = id; - return ZIGBEE_ERROR_NONE; -} - -API int zb_extended_attr_info_get_type(zb_zcl_extended_attr_info_h handle, - zb_zcl_data_type_e *type) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct extended_attribute_infomation_s *h = handle; - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == type, ZIGBEE_ERROR_INVALID_PARAMETER); - - *type = h->type; - return ZIGBEE_ERROR_NONE; -} - -API int zb_extended_attr_info_set_type(zb_zcl_extended_attr_info_h handle, - zb_zcl_data_type_e type) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct extended_attribute_infomation_s *h = handle; - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0 >= zb_zcl_get_data_size(type), ZIGBEE_ERROR_INVALID_PARAMETER); - - h->type = type; - return ZIGBEE_ERROR_NONE; -} - -API int zb_extended_attr_info_get_acl(zb_zcl_extended_attr_info_h handle, - zb_zcl_acl_type_e *acl) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct extended_attribute_infomation_s *h = handle; - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == acl, ZIGBEE_ERROR_INVALID_PARAMETER); - - *acl = h->acl; - return ZIGBEE_ERROR_NONE; -} - -API int zb_extended_attr_info_set_acl(zb_zcl_extended_attr_info_h handle, - zb_zcl_acl_type_e acl) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - struct extended_attribute_infomation_s *h = handle; - RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); - - h->acl = acl; - return ZIGBEE_ERROR_NONE; -} - diff --git a/lib/zbl-zdo-bind-mgr.c b/lib/zbl-zdo-bind-mgr.c deleted file mode 100644 index 53f359d..0000000 --- a/lib/zbl-zdo-bind-mgr.c +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2016 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 "zbl.h" -#include "zbl-dbus.h" -#include "zb-common.h" - -API int zb_zdo_bind_req(zb_zigbee_h handle, zb_nwk_addr dst_addr16, - zb_ieee_addr src_addr64, unsigned char src_ep, zb_cluster_id clusterid, - zb_ieee_addr dst_addr64, unsigned char type, zb_nwk_addr group_addr, - unsigned char dst_ep, zb_zdo_bind_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == src_addr64, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == dst_addr64, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - ret = zbl_bind_req(dst_addr16, src_addr64, src_ep, clusterid, dst_addr64, type, - group_addr, dst_ep, cb, user_data); - return ret; -} - -API int zb_zdo_unbind_req(zb_zigbee_h handle, zb_nwk_addr dst_addr16, - zb_ieee_addr src_addr64, unsigned char src_ep, zb_cluster_id clusterid, - zb_ieee_addr dst_addr64, unsigned char type, zb_nwk_addr group_addr, - unsigned char dst_ep, zb_zdo_unbind_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == src_addr64, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == dst_addr64, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - ret = zbl_unbind_req(dst_addr16, src_addr64, src_ep, clusterid, dst_addr64, type, - group_addr, dst_ep, cb, user_data); - return ret; -} diff --git a/lib/zbl-zdo-dev-disc.c b/lib/zbl-zdo-dev-disc.c deleted file mode 100644 index 4902c81..0000000 --- a/lib/zbl-zdo-dev-disc.c +++ /dev/null @@ -1,874 +0,0 @@ -/* - * Copyright (c) 2016 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 "zbl.h" -#include "zbl-dbus.h" -#include "zb-common.h" - -API int zb_zdo_nwk_addr_req(zb_zigbee_h handle, zb_ieee_addr addr64, - zb_zdp_req_type_e request_type, unsigned char start_idx, zb_zdo_addr_cb cb, - void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0 != request_type && 1 != request_type, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER); - ret = zbl_nwk_addr_req(handle, addr64, request_type, start_idx, cb, - user_data); - return ret; -} - -API int zb_zdo_ieee_addr_req(zb_zigbee_h handle, zb_nwk_addr addr16, zb_zdo_addr_cb cb, - void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER); - ret = zbl_ieee_addr_req(handle, addr16, cb, user_data); - return ret; -} - -API int zb_zdo_active_ep(zb_zigbee_h handle, zb_nwk_addr addr16, zb_zdo_active_ep_cb cb, - void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER); - ret = zbl_active_ep(handle, addr16, cb, user_data); - return ret; -} - -API int zb_zdo_simple_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep, - zb_zdo_simple_desc_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); - RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER); - ret = zbl_simple_desc_req(handle, addr16, ep, cb, user_data); - return ret; -} - -API int zb_zdo_extended_simple_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char start_idx, zb_zdo_extended_simple_desc_cb cb, void *user_data) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER); - return ZIGBEE_ERROR_NONE; -} - -API int zb_zdo_match_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned short profileid, unsigned char num_in_clusters, - unsigned short *in_clusters, unsigned char num_out_clusters, - unsigned short *out_clusters, zb_zdo_match_desc_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(NULL == in_clusters, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == out_clusters, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0 == num_in_clusters && 0 == num_out_clusters, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER); - ret = zbl_match_desc_req(handle, addr16, profileid, num_in_clusters, - in_clusters, num_out_clusters, out_clusters, cb, user_data); - return ret; -} - -API int zb_zdo_node_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, - zb_zdo_node_desc_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER); - ret = zbl_node_desc_req(addr16, cb, user_data); - return ret; -} - -API int zb_zdo_power_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, - zb_zdo_power_desc_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER); - ret = zbl_power_desc_req(addr16, cb, user_data); - return ret; -} - -API int zb_zdo_complex_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, - zb_zdo_complex_desc_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER); - ret = zbl_complex_desc_req(addr16, cb, user_data); - return ret; -} - -API int zb_zdo_user_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, - zb_zdo_user_desc_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER); - ret = zbl_user_desc_req(addr16, cb, user_data); - return ret; -} - -API int zb_zdo_user_desc_set(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char len, - unsigned char *user_desc, zb_zdo_user_desc_conf_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(NULL == user_desc, ZIGBEE_ERROR_INVALID_PARAMETER); - ret = zbl_user_desc_set(handle, addr16, len, user_desc, cb, user_data); - return ret; -} - -API int zb_zdo_device_annce(zb_zigbee_h handle, zb_nwk_addr addr16, zb_ieee_addr addr64, - unsigned char capability) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS); - ret = zbl_device_annce(handle, addr16, addr64, capability); - return ret; -} - -API int zb_simple_desc_create(zb_zdo_simple_desc_h *handle) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - zb_zdo_simple_desc_h desc = NULL; - CHECK_ZIGBEE_PRIVILEGE(); - - desc = calloc(1, sizeof(struct zb_zdo_simple_desc_s)); - RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - *handle = desc; - return ZIGBEE_ERROR_NONE; -} - -API int zb_simple_desc_clone(zb_zdo_simple_desc_h src, zb_zdo_simple_desc_h *dst) -{ - zb_zdo_simple_desc_h desc = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER); - - desc = calloc(1, sizeof(struct zb_zdo_simple_desc_s)); - RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - memcpy(desc, src, sizeof(struct zb_zdo_simple_desc_s)); - *dst = desc; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_simple_desc_destroy(zb_zdo_simple_desc_h handle) -{ - struct zb_zdo_simple_desc_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - free(h); - return ZIGBEE_ERROR_NONE; -} - -API int zb_simple_desc_get_ep(zb_zdo_simple_desc_h handle, unsigned char *ep) -{ - struct zb_zdo_simple_desc_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == ep, ZIGBEE_ERROR_INVALID_PARAMETER); - - *ep = h->ep; - return ZIGBEE_ERROR_NONE; -} - -API int zb_simple_desc_set_ep(zb_zdo_simple_desc_h handle, unsigned char ep) -{ - struct zb_zdo_simple_desc_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - h->ep = ep; - return ZIGBEE_ERROR_NONE; -} - -API int zb_simple_desc_get_profile_id(zb_zdo_simple_desc_h handle, - unsigned short *profileid) -{ - struct zb_zdo_simple_desc_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == profileid, ZIGBEE_ERROR_INVALID_PARAMETER); - - *profileid = h->profileid; - return ZIGBEE_ERROR_NONE; -} - -API int zb_simple_desc_set_profile_id(zb_zdo_simple_desc_h handle, - unsigned short profileid) -{ - struct zb_zdo_simple_desc_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - h->profileid = profileid; - return ZIGBEE_ERROR_NONE; -} - - -API int zb_simple_desc_get_device_id(zb_zdo_simple_desc_h handle, - unsigned short *deviceid) -{ - struct zb_zdo_simple_desc_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == deviceid, ZIGBEE_ERROR_INVALID_PARAMETER); - - *deviceid = h->deviceid; - return ZIGBEE_ERROR_NONE; -} - -API int zb_simple_desc_set_device_id(zb_zdo_simple_desc_h handle, - unsigned short deviceid) -{ - struct zb_zdo_simple_desc_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - h->deviceid = deviceid; - return ZIGBEE_ERROR_NONE; -} - -API int zb_simple_desc_get_device_ver(zb_zdo_simple_desc_h handle, - unsigned short *device_ver) -{ - struct zb_zdo_simple_desc_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == device_ver, ZIGBEE_ERROR_INVALID_PARAMETER); - - *device_ver = h->device_ver; - return ZIGBEE_ERROR_NONE; -} - -API int zb_simple_desc_set_device_ver(zb_zdo_simple_desc_h handle, - unsigned short device_ver) -{ - struct zb_zdo_simple_desc_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - h->device_ver = device_ver; - return ZIGBEE_ERROR_NONE; -} - -API int zb_simple_desc_get_num_of_in_clusters(zb_zdo_simple_desc_h handle, - unsigned char *num_of_in_clusters) -{ - struct zb_zdo_simple_desc_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == num_of_in_clusters, ZIGBEE_ERROR_INVALID_PARAMETER); - - *num_of_in_clusters = h->num_of_in_clusters; - return ZIGBEE_ERROR_NONE; -} - -API int zb_simple_desc_set_num_of_in_clusters(zb_zdo_simple_desc_h handle, - unsigned char num_of_in_clusters) -{ - struct zb_zdo_simple_desc_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - h->num_of_in_clusters = num_of_in_clusters; - return ZIGBEE_ERROR_NONE; -} - -API int zb_simple_desc_get_num_of_out_clusters(zb_zdo_simple_desc_h handle, - unsigned char *num_of_out_clusters) -{ - struct zb_zdo_simple_desc_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == num_of_out_clusters, ZIGBEE_ERROR_INVALID_PARAMETER); - - *num_of_out_clusters = h->num_of_out_clusters; - return ZIGBEE_ERROR_NONE; -} - -API int zb_simple_desc_set_num_of_out_clusters(zb_zdo_simple_desc_h handle, - unsigned char num_of_out_clusters) -{ - struct zb_zdo_simple_desc_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - h->num_of_out_clusters = num_of_out_clusters; - return ZIGBEE_ERROR_NONE; -} - -API int zb_simple_desc_get_in_clusters(zb_zdo_simple_desc_h handle, - unsigned short **in_clusters) -{ - struct zb_zdo_simple_desc_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == h->in_clusters, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == in_clusters, ZIGBEE_ERROR_INVALID_PARAMETER); - - *in_clusters = h->in_clusters; - return ZIGBEE_ERROR_NONE; -} - -API int zb_simple_desc_set_in_clusters(zb_zdo_simple_desc_h handle, - unsigned short *in_clusters, int num) -{ - struct zb_zdo_simple_desc_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == in_clusters, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(num < 1 || num > MAX_ENDPOINT_CLUSTERS, ZIGBEE_ERROR_INVALID_PARAMETER); - - memcpy(h->in_clusters, in_clusters, 2 * num); - return ZIGBEE_ERROR_NONE; -} - -API int zb_simple_desc_get_out_clusters(zb_zdo_simple_desc_h handle, - unsigned short **out_clusters) -{ - struct zb_zdo_simple_desc_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == h->out_clusters, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == out_clusters, ZIGBEE_ERROR_INVALID_PARAMETER); - - *out_clusters = h->out_clusters; - return ZIGBEE_ERROR_NONE; -} - -API int zb_simple_desc_set_out_clusters(zb_zdo_simple_desc_h handle, - unsigned short *out_clusters, int num) -{ - struct zb_zdo_simple_desc_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == out_clusters, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(num < 1 || num > MAX_ENDPOINT_CLUSTERS, ZIGBEE_ERROR_INVALID_PARAMETER); - - memcpy(h->out_clusters, out_clusters, 2 * num); - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_power_desc_create(zb_zdo_node_power_descriptor_h *handle) -{ - zb_zdo_node_power_descriptor_h desc = NULL; - - CHECK_ZIGBEE_PRIVILEGE(); - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - desc = calloc(1, sizeof(struct zb_zdo_node_power_descriptor_s)); - RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - *handle = desc; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_power_desc_clone(zb_zdo_node_power_descriptor_h src, - zb_zdo_node_power_descriptor_h *dst) -{ - zb_zdo_node_power_descriptor_h desc = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER); - - desc = calloc(1, sizeof(struct zb_zdo_node_power_descriptor_s)); - RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - memcpy(desc, src, sizeof(struct zb_zdo_node_power_descriptor_s)); - *dst = desc; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_power_desc_destroy(zb_zdo_node_power_descriptor_h handle) -{ - struct zb_zdo_node_power_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - free(h); - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_power_desc_get_current_power_mode( - zb_zdo_node_power_descriptor_h handle, zb_zdp_cur_pwr_mode_e* current_power_mode) -{ - struct zb_zdo_node_power_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == current_power_mode, ZIGBEE_ERROR_INVALID_PARAMETER); - - *current_power_mode = h->current_power_mode; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_power_desc_set_current_power_mode( - zb_zdo_node_power_descriptor_h handle, zb_zdp_cur_pwr_mode_e current_power_mode) -{ - struct zb_zdo_node_power_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0b11 < current_power_mode, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE); - - h->current_power_mode = current_power_mode; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_power_desc_get_available_power_sources( - zb_zdo_node_power_descriptor_h handle, zb_zdp_pwr_src_type_e* available_power_sources) -{ - struct zb_zdo_node_power_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == available_power_sources, ZIGBEE_ERROR_INVALID_PARAMETER); - - *available_power_sources = h->available_power_sources; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_power_desc_set_available_power_sources( - zb_zdo_node_power_descriptor_h handle, zb_zdp_pwr_src_type_e available_power_sources) -{ - struct zb_zdo_node_power_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0b111 < available_power_sources, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE); - - h->available_power_sources = available_power_sources; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_power_desc_get_current_power_source( - zb_zdo_node_power_descriptor_h handle, zb_zdp_pwr_src_type_e* current_power_source) -{ - struct zb_zdo_node_power_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == current_power_source, ZIGBEE_ERROR_INVALID_PARAMETER); - - *current_power_source = h->current_power_source; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_power_desc_set_current_power_source( - zb_zdo_node_power_descriptor_h handle, zb_zdp_pwr_src_type_e current_power_source) -{ - struct zb_zdo_node_power_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0b111 < current_power_source, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE); - - h->current_power_source = current_power_source; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_power_desc_get_current_power_source_level( - zb_zdo_node_power_descriptor_h handle, zb_zdp_pwr_src_level_e* current_power_source_level) -{ - struct zb_zdo_node_power_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == current_power_source_level, ZIGBEE_ERROR_INVALID_PARAMETER); - - *current_power_source_level = h->current_power_source_level; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_power_desc_set_current_power_source_level( - zb_zdo_node_power_descriptor_h handle, zb_zdp_pwr_src_level_e current_power_source_level) -{ - struct zb_zdo_node_power_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - h->current_power_source_level = current_power_source_level; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_desc_create(zb_zdo_node_descriptor_h *handle) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - zb_zdo_node_descriptor_h desc = NULL; - - CHECK_ZIGBEE_PRIVILEGE(); - - desc = calloc(1, sizeof(struct zb_zdo_node_descriptor_s)); - RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - *handle = desc; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_desc_clone(zb_zdo_node_descriptor_h src, - zb_zdo_node_descriptor_h *dst) -{ - struct zb_zdo_node_descriptor_s* desc = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER); - - desc = calloc(1, sizeof(struct zb_zdo_node_descriptor_s)); - RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - memcpy(desc, src, sizeof(struct zb_zdo_node_descriptor_s)); - *dst = desc; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_desc_destroy(zb_zdo_node_descriptor_h handle) -{ - struct zb_zdo_node_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - free(h); - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_desc_get_logical_type(zb_zdo_node_descriptor_h handle, - unsigned char* logical_type) -{ - struct zb_zdo_node_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == logical_type, ZIGBEE_ERROR_INVALID_PARAMETER); - - *logical_type = h->logical_type; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_desc_set_logical_type(zb_zdo_node_descriptor_h handle, - unsigned char logical_type) -{ - struct zb_zdo_node_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0b11 < logical_type, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE); - - h->logical_type = logical_type; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_desc_get_complex_desciptor_available( - zb_zdo_node_descriptor_h handle, unsigned char* complex_desciptor_available) -{ - struct zb_zdo_node_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == complex_desciptor_available, ZIGBEE_ERROR_INVALID_PARAMETER); - - *complex_desciptor_available = h->complex_desciptor_available; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_desc_set_complex_descriptor_available( - zb_zdo_node_descriptor_h handle, unsigned char complex_desciptor_available) -{ - struct zb_zdo_node_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0x01 < complex_desciptor_available, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE); - - h->complex_desciptor_available = complex_desciptor_available; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_desc_get_user_descriptor_available( - zb_zdo_node_descriptor_h handle, unsigned char* user_descriptor_available) -{ - struct zb_zdo_node_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == user_descriptor_available, ZIGBEE_ERROR_INVALID_PARAMETER); - - *user_descriptor_available = h->user_descriptor_available; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_desc_set_user_descriptor_available( - zb_zdo_node_descriptor_h handle, unsigned char user_descriptor_available) -{ - struct zb_zdo_node_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0x01 < user_descriptor_available, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE); - - h->user_descriptor_available = user_descriptor_available; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_desc_get_aps_flags(zb_zdo_node_descriptor_h handle, - unsigned char* aps_flags) -{ - struct zb_zdo_node_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == aps_flags, ZIGBEE_ERROR_INVALID_PARAMETER); - - *aps_flags = h->aps_flags; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_desc_set_aps_flags(zb_zdo_node_descriptor_h handle, - unsigned char aps_flags) -{ - struct zb_zdo_node_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0b111 < aps_flags, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE); - - h->aps_flags = aps_flags; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_desc_get_frequency_band(zb_zdo_node_descriptor_h handle, - unsigned char* frequency_band) -{ - struct zb_zdo_node_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == frequency_band, ZIGBEE_ERROR_INVALID_PARAMETER); - - *frequency_band = h->frequency_band; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_desc_set_frequency_band(zb_zdo_node_descriptor_h handle, - unsigned char frequency_band) -{ - struct zb_zdo_node_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0b1111 < frequency_band, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE); - - h->frequency_band = frequency_band; - return ZIGBEE_ERROR_NONE; -} - - -API int zb_node_desc_get_mac_capability_flags(zb_zdo_node_descriptor_h handle, - unsigned char* mac_capability_flags) -{ - struct zb_zdo_node_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == mac_capability_flags, ZIGBEE_ERROR_INVALID_PARAMETER); - - *mac_capability_flags = h->mac_capability_flags; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_desc_set_mac_capability_flags(zb_zdo_node_descriptor_h handle, - unsigned char mac_capability_flags) -{ - struct zb_zdo_node_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - h->mac_capability_flags = mac_capability_flags; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_desc_get_manufacturer_code(zb_zdo_node_descriptor_h handle, - unsigned short* manufacturer_code) -{ - struct zb_zdo_node_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == manufacturer_code, ZIGBEE_ERROR_INVALID_PARAMETER); - - *manufacturer_code = h->manufacturer_code; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_desc_set_manufacturer_code(zb_zdo_node_descriptor_h handle, - unsigned short manufacturer_code) -{ - struct zb_zdo_node_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - h->manufacturer_code = manufacturer_code; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_desc_get_maximum_buffer_size(zb_zdo_node_descriptor_h handle, - unsigned char* maximum_buffer_size) -{ - struct zb_zdo_node_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == maximum_buffer_size, ZIGBEE_ERROR_INVALID_PARAMETER); - - *maximum_buffer_size = h->maximum_buffer_size; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_desc_set_maximum_buffer_size(zb_zdo_node_descriptor_h handle, - unsigned char maximum_buffer_size) -{ - struct zb_zdo_node_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0x7f < maximum_buffer_size, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE); - - h->maximum_buffer_size = maximum_buffer_size; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_desc_get_maximum_incoming_transfer_size( - zb_zdo_node_descriptor_h handle, unsigned short* maximum_incoming_transfer_size) -{ - struct zb_zdo_node_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == maximum_incoming_transfer_size, ZIGBEE_ERROR_INVALID_PARAMETER); - - *maximum_incoming_transfer_size = h->maximum_incoming_transfer_size; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_desc_set_maximum_incoming_transfer_size( - zb_zdo_node_descriptor_h handle, unsigned short maximum_incoming_transfer_size) -{ - struct zb_zdo_node_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0x7fff < maximum_incoming_transfer_size, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE); - - h->maximum_incoming_transfer_size = maximum_incoming_transfer_size; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_desc_get_server_mask(zb_zdo_node_descriptor_h handle, - unsigned short* server_mask) -{ - struct zb_zdo_node_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == server_mask, ZIGBEE_ERROR_INVALID_PARAMETER); - - *server_mask = h->server_mask; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_desc_set_server_mask(zb_zdo_node_descriptor_h handle, - unsigned short server_mask) -{ - struct zb_zdo_node_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0x7f < server_mask, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE); - - h->server_mask = server_mask; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_desc_get_maximum_outgoing_transfer_size( - zb_zdo_node_descriptor_h handle, unsigned short* maximum_outgoing_transfer_size) -{ - struct zb_zdo_node_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == maximum_outgoing_transfer_size, ZIGBEE_ERROR_INVALID_PARAMETER); - - *maximum_outgoing_transfer_size = h->maximum_outgoing_transfer_size; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_desc_set_maximum_outgoing_transfer_size( - zb_zdo_node_descriptor_h handle, unsigned short maximum_outgoing_transfer_size) -{ - struct zb_zdo_node_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0x7fff < maximum_outgoing_transfer_size, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE); - - h->maximum_outgoing_transfer_size = maximum_outgoing_transfer_size; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_desc_get_descriptor_capability_field( - zb_zdo_node_descriptor_h handle, unsigned short* descriptor_capability_field) -{ - struct zb_zdo_node_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == descriptor_capability_field, ZIGBEE_ERROR_INVALID_PARAMETER); - - *descriptor_capability_field = h->descriptor_capability_field; - return ZIGBEE_ERROR_NONE; -} - -API int zb_node_desc_set_descriptor_capability_field( - zb_zdo_node_descriptor_h handle, unsigned short descriptor_capability_field) -{ - struct zb_zdo_node_descriptor_s* h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0x11 < descriptor_capability_field, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE); - - h->descriptor_capability_field = descriptor_capability_field; - return ZIGBEE_ERROR_NONE; -} - diff --git a/lib/zbl-zdo-nwk-mgr.c b/lib/zbl-zdo-nwk-mgr.c deleted file mode 100644 index 97e323f..0000000 --- a/lib/zbl-zdo-nwk-mgr.c +++ /dev/null @@ -1,498 +0,0 @@ -/* - * Copyright (c) 2016 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 "zbl.h" -#include "zbl-dbus.h" -#include "zb-common.h" - -API int zb_zdo_mgmt_nwk_disc_req(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned int scan_channels, unsigned char scan_duration, unsigned char scan_count, - unsigned char start_idx, zb_zdo_mgmt_nwk_disc_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - ret = zbl_mgmt_nwk_disc_req(addr16, scan_channels, scan_duration, scan_count, - start_idx, cb, user_data); - return ret; -} - -API int zb_zdo_mgmt_lqi_req(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char start_idx, zb_zdo_mgmt_lqi_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - ret = zbl_mgmt_lqi_req(addr16, start_idx, cb, user_data); - return ret; -} - -API int zb_zdo_mgmt_rtg_req(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char start_idx, zb_zdo_mgmt_rtg_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - ret = zbl_mgmt_rtg_req(addr16, start_idx, cb, user_data); - return ret; -} - -API int zb_zdo_mgmt_bind_req(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char start_idx, zb_zdo_mgmt_bind_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - ret = zbl_mgmt_bind_req(addr16, start_idx, cb, user_data); - return ret; -} - -API int zb_zdo_mgmt_leave_req(zb_zigbee_h handle, zb_ieee_addr addr64, - bool remove_children, bool rejoin, zb_zdo_mgmt_leave_cb cb, - void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS); - ret = zbl_mgmt_leave_device(addr64, remove_children, rejoin, cb, user_data); - return ret; -} - -API int zb_zdo_mgmt_direct_join_req(zb_zigbee_h handle, zb_ieee_addr addr64, - unsigned char capability, zb_zdo_mgmt_direct_join_cb cb, void *user_data) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS); - return ZIGBEE_ERROR_NONE; -} - -API int zb_zdo_mgmt_permit_joining_req(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char duration, unsigned char tc_significance, - zb_zdo_mgmt_permit_joining_cb cb, void *user_data) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - ret = zbl_mgmt_permit_joining_req(addr16, duration, tc_significance, cb, user_data); - return ret; -} - -API int zb_zdo_mgmt_cache_req(zb_zigbee_h handle, zb_nwk_addr addr16, - unsigned char start_idx, zb_zdo_mgmt_cache_cb cb, void *user_data) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - return ZIGBEE_ERROR_NONE; -} - -API int zb_zdo_mgmt_nwk_update_req(zb_zigbee_h handle, unsigned int scan_channels, - unsigned char scan_duration, unsigned char scan_count, unsigned char nwk_update_id, - zb_nwk_addr nwk_manager_addr) -{ - int ret; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == nwk_manager_addr, ZIGBEE_ERROR_INVALID_ADDRESS); - ret = zbl_mgmt_nwk_update_req(scan_channels, scan_duration, scan_count, nwk_update_id, - nwk_manager_addr); - return ret; -} - -API int zb_network_list_record_get_extended_pan_id( - zb_zdo_network_list_record_h handle, zb_ieee_addr extended_pan_id) -{ - struct zb_zdo_network_list_record_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == extended_pan_id, ZIGBEE_ERROR_INVALID_PARAMETER); - - memcpy(extended_pan_id, h->extended_pan_id, sizeof(zb_ieee_addr)); - return ZIGBEE_ERROR_NONE; -} - -API int zb_network_list_record_get_logical_channel( - zb_zdo_network_list_record_h handle, unsigned char* logical_channel) -{ - struct zb_zdo_network_list_record_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == logical_channel, ZIGBEE_ERROR_INVALID_PARAMETER); - - *logical_channel = h->logical_channel; - return ZIGBEE_ERROR_NONE; -} - -API int zb_network_list_record_get_zigbee_version( - zb_zdo_network_list_record_h handle, unsigned char* zigbee_version) -{ - struct zb_zdo_network_list_record_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zigbee_version, ZIGBEE_ERROR_INVALID_PARAMETER); - - *zigbee_version = h->zigbee_version; - return ZIGBEE_ERROR_NONE; -} - -API int zb_network_list_record_get_stack_profile( - zb_zdo_network_list_record_h handle, unsigned char* stack_profile) -{ - struct zb_zdo_network_list_record_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == stack_profile, ZIGBEE_ERROR_INVALID_PARAMETER); - - *stack_profile = h->stack_profile; - return ZIGBEE_ERROR_NONE; -} - -API int zb_network_list_record_get_beacon_order( - zb_zdo_network_list_record_h handle, unsigned char* beacon_order) -{ - struct zb_zdo_network_list_record_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == beacon_order, ZIGBEE_ERROR_INVALID_PARAMETER); - - *beacon_order = h->beacon_order; - return ZIGBEE_ERROR_NONE; -} - -API int zb_network_list_record_get_superframe_order( - zb_zdo_network_list_record_h handle, unsigned char* superframe_order) -{ - struct zb_zdo_network_list_record_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == superframe_order, ZIGBEE_ERROR_INVALID_PARAMETER); - - *superframe_order = h->superframe_order; - return ZIGBEE_ERROR_NONE; -} - -API int zb_network_list_record_get_permit_joining( - zb_zdo_network_list_record_h handle, unsigned char* permit_joining) -{ - struct zb_zdo_network_list_record_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == permit_joining, ZIGBEE_ERROR_INVALID_PARAMETER); - - *permit_joining = h->permit_joining; - return ZIGBEE_ERROR_NONE; -} - -API int zb_neighbor_table_desc_get_extended_pan_id( - zb_zdo_neighbor_table_desc_h handle, zb_ieee_addr extended_pan_id) -{ - struct zb_zdo_neighbor_table_desc_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == h->extended_pan_id, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == extended_pan_id, ZIGBEE_ERROR_INVALID_PARAMETER); - - memcpy(extended_pan_id, h->extended_pan_id, sizeof(zb_ieee_addr)); - return ZIGBEE_ERROR_NONE; -} - -API int zb_neighbor_table_desc_get_ieee_addr( - zb_zdo_neighbor_table_desc_h handle, zb_ieee_addr addr64) -{ - struct zb_zdo_neighbor_table_desc_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == h->addr64, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER); - - memcpy(addr64, h->addr64, sizeof(zb_ieee_addr)); - return ZIGBEE_ERROR_NONE; -} - -API int zb_neighbor_table_desc_get_nwk_addr( - zb_zdo_neighbor_table_desc_h handle, zb_nwk_addr* addr16) -{ - struct zb_zdo_neighbor_table_desc_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == addr16, ZIGBEE_ERROR_INVALID_PARAMETER); - - *addr16 = h->addr16; - return ZIGBEE_ERROR_NONE; -} - -API int zb_neighbor_table_desc_get_device_type( - zb_zdo_neighbor_table_desc_h handle, unsigned char* device_type) -{ - struct zb_zdo_neighbor_table_desc_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == device_type, ZIGBEE_ERROR_INVALID_PARAMETER); - - *device_type = h->device_type; - return ZIGBEE_ERROR_NONE; -} - -API int zb_neighbor_table_desc_get_rx_on_when_idle( - zb_zdo_neighbor_table_desc_h handle, unsigned char* rx_on_when_idle) -{ - struct zb_zdo_neighbor_table_desc_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == rx_on_when_idle, ZIGBEE_ERROR_INVALID_PARAMETER); - - *rx_on_when_idle = h->rx_on_when_idle; - return ZIGBEE_ERROR_NONE; -} - -API int zb_neighbor_table_desc_get_relationship( - zb_zdo_neighbor_table_desc_h handle, unsigned char* releationship) -{ - struct zb_zdo_neighbor_table_desc_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == releationship, ZIGBEE_ERROR_INVALID_PARAMETER); - - *releationship = h->relationship; - return ZIGBEE_ERROR_NONE; -} - -API int zb_neighbor_table_desc_get_permit_joining( - zb_zdo_neighbor_table_desc_h handle, unsigned char* permit_joining) -{ - struct zb_zdo_neighbor_table_desc_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == permit_joining, ZIGBEE_ERROR_INVALID_PARAMETER); - - *permit_joining = h->permit_joining; - return ZIGBEE_ERROR_NONE; -} - -API int zb_neighbor_table_desc_get_depth( - zb_zdo_neighbor_table_desc_h handle, unsigned char* depth) -{ - struct zb_zdo_neighbor_table_desc_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == depth, ZIGBEE_ERROR_INVALID_PARAMETER); - - *depth = h->depth; - return ZIGBEE_ERROR_NONE; -} - -API int zb_neighbor_table_desc_get_lqi(zb_zdo_neighbor_table_desc_h handle, - unsigned char* lqi) -{ - struct zb_zdo_neighbor_table_desc_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == lqi, ZIGBEE_ERROR_INVALID_PARAMETER); - - *lqi = h->lqi; - return ZIGBEE_ERROR_NONE; -} - -API int zb_routing_table_get_dst_addr(zb_zdo_routing_table_h handle, - zb_nwk_addr* dst_addr) -{ - struct zb_zdo_routing_table_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == dst_addr, ZIGBEE_ERROR_INVALID_PARAMETER); - - *dst_addr = h->dst_addr; - return ZIGBEE_ERROR_NONE; -} - -API int zb_routing_table_get_dst_status(zb_zdo_routing_table_h handle, - zb_zdp_status_e *status) -{ - struct zb_zdo_routing_table_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER); - - *status = h->status; - return ZIGBEE_ERROR_NONE; -} - -API int zb_routing_table_get_memory_constrained( - zb_zdo_routing_table_h handle, unsigned char *memory_constrained) -{ - struct zb_zdo_routing_table_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == memory_constrained, ZIGBEE_ERROR_INVALID_PARAMETER); - - *memory_constrained = h->memory_constrained; - return ZIGBEE_ERROR_NONE; -} - -API int zb_routing_table_get_many_to_one(zb_zdo_routing_table_h handle, - unsigned char *many_to_one) -{ - struct zb_zdo_routing_table_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == many_to_one, ZIGBEE_ERROR_INVALID_PARAMETER); - - *many_to_one = h->many_to_one; - return ZIGBEE_ERROR_NONE; -} - -API int zb_routing_table_get_route_record_required( - zb_zdo_routing_table_h handle, unsigned char *route_record_required) -{ - struct zb_zdo_routing_table_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == route_record_required, ZIGBEE_ERROR_INVALID_PARAMETER); - - *route_record_required = h->route_record_required; - return ZIGBEE_ERROR_NONE; -} - -API int zb_routing_table_get_next_hop_addr( - zb_zdo_routing_table_h handle, zb_nwk_addr *next_hop_addr) -{ - struct zb_zdo_routing_table_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == next_hop_addr, ZIGBEE_ERROR_INVALID_PARAMETER); - - *next_hop_addr = h->next_hop_addr; - return ZIGBEE_ERROR_NONE; -} - -API int zb_binding_table_get_src_addr(zb_zdo_binding_table_h handle, - zb_ieee_addr src_addr) -{ - struct zb_zdo_binding_table_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == src_addr, ZIGBEE_ERROR_INVALID_PARAMETER); - - memcpy(src_addr, h->src_addr64, sizeof(zb_ieee_addr)); - return ZIGBEE_ERROR_NONE; -} - -API int zb_binding_table_get_src_ep(zb_zdo_binding_table_h handle, - unsigned char* src_ep) -{ - struct zb_zdo_binding_table_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == src_ep, ZIGBEE_ERROR_INVALID_PARAMETER); - - *src_ep = h->src_ep; - return ZIGBEE_ERROR_NONE; -} - -API int zb_binding_table_get_cluster_id(zb_zdo_binding_table_h handle, - unsigned short *clusterid) -{ - struct zb_zdo_binding_table_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == clusterid, ZIGBEE_ERROR_INVALID_PARAMETER); - - *clusterid = h->clusterid; - return ZIGBEE_ERROR_NONE; -} - -API int zb_binding_table_get_dst_addr_mode(zb_zdo_binding_table_h handle, - unsigned char* dst_addr_mode) -{ - struct zb_zdo_binding_table_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == dst_addr_mode, ZIGBEE_ERROR_INVALID_PARAMETER); - - *dst_addr_mode = h->dst_addr_mode; - return ZIGBEE_ERROR_NONE; -} - -API int zb_binding_table_get_dst_addr16(zb_zdo_binding_table_h handle, - zb_nwk_addr* addr16) -{ - struct zb_zdo_binding_table_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == addr16, ZIGBEE_ERROR_INVALID_PARAMETER); - - *addr16 = h->dst_addr16; - return ZIGBEE_ERROR_NONE; -} - -API int zb_binding_table_get_dst_addr64(zb_zdo_binding_table_h handle, - zb_ieee_addr addr64) -{ - struct zb_zdo_binding_table_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER); - - memcpy(addr64, h->dst_addr64, sizeof(zb_ieee_addr)); - return ZIGBEE_ERROR_NONE; -} - -API int zb_binding_table_get_dst_ep(zb_zdo_binding_table_h handle, - unsigned char* dst_ep) -{ - struct zb_zdo_binding_table_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == dst_ep, ZIGBEE_ERROR_INVALID_PARAMETER); - - *dst_ep = h->dst_ep; - return ZIGBEE_ERROR_NONE; -} - -API int zb_discovery_cache_get_ieee_addr(zb_zdo_discovery_cache_h handle, - zb_ieee_addr addr64) -{ - struct zb_zdo_discovery_cache_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER); - - memcpy(addr64, h->addr64, sizeof(zb_ieee_addr)); - return ZIGBEE_ERROR_NONE; -} - -API int zb_discovery_cache_get_nwk_addr(zb_zdo_discovery_cache_h handle, - zb_nwk_addr* addr16) -{ - struct zb_zdo_discovery_cache_s *h = handle; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == addr16, ZIGBEE_ERROR_INVALID_PARAMETER); - - *addr16 = h->addr16; - return ZIGBEE_ERROR_NONE; -} - - diff --git a/lib/zbl-zdo-svc-disc.c b/lib/zbl-zdo-svc-disc.c deleted file mode 100644 index 65cd5f7..0000000 --- a/lib/zbl-zdo-svc-disc.c +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (c) 2016 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 "zbl.h" -#include "zbl-dbus.h" -#include "zb-common.h" - -API int zb_zdo_system_server_discover_req(zb_zigbee_h handle, - unsigned short server_mask, zb_zdo_system_server_discover_cb cb, void *user_data) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - return ZIGBEE_ERROR_NONE; -} - -API int zb_zdo_find_node_cache_req(zb_zigbee_h handle, zb_nwk_addr addr16, - zb_ieee_addr addr64, zb_zdo_find_node_cache_cb cb, void *user_data) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS); - return ZIGBEE_ERROR_NONE; -} - -API int zb_zdo_discovery_cache_req(zb_zigbee_h handle, zb_nwk_addr addr16, - zb_ieee_addr addr64, zb_zdo_discovery_cache_cb cb, void *user_data) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS); - - return ZIGBEE_ERROR_NONE; -} - -API int zb_zdo_discovery_store_req(zb_zigbee_h handle, zb_nwk_addr addr16, - zb_ieee_addr addr64, unsigned char node_desc_size, unsigned char power_desc_size, - unsigned char active_ep_size, unsigned char simple_desc_count, - unsigned char *simple_desc_list, zb_zdo_discovery_store_cb cb, void *user_data) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(NULL == simple_desc_list, ZIGBEE_ERROR_INVALID_PARAMETER); - - return ZIGBEE_ERROR_NONE; -} - -API int zb_zdo_node_desc_store_req(zb_zigbee_h handle, zb_nwk_addr addr16, - zb_ieee_addr addr64, zb_zdo_node_descriptor_h nodedsc, zb_zdo_node_desc_store_cb cb, - void *user_data) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - return ZIGBEE_ERROR_NONE; -} - -API int zb_zdo_power_desc_store_req(zb_zigbee_h handle, zb_nwk_addr addr16, - zb_ieee_addr addr64, zb_zdo_node_power_descriptor_h powerdsc, - zb_zdo_power_desc_store_cb cb, void *user_data) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - return ZIGBEE_ERROR_NONE; -} - -API int zb_zdo_active_ep_store_req(zb_zigbee_h handle, zb_nwk_addr addr16, - zb_ieee_addr addr64, unsigned char active_ep_count, unsigned char *ep_list, - zb_zdo_active_ep_store_cb cb, void *user_data) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(NULL == ep_list, ZIGBEE_ERROR_INVALID_PARAMETER); - - return ZIGBEE_ERROR_NONE; -} - -API int zb_zdo_simple_desc_store_req(zb_zigbee_h handle, zb_nwk_addr addr16, - zb_ieee_addr addr64, zb_zdo_simple_desc_h simpledsc, zb_zdo_simple_desc_store_cb cb, - void *user_data) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - return ZIGBEE_ERROR_NONE; -} - -API int zb_zdo_remove_node_cache_req(zb_zigbee_h handle, zb_nwk_addr addr16, - zb_ieee_addr addr64, zb_zdo_remove_node_cache_cb cb, void *user_data) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); - RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS); - - return ZIGBEE_ERROR_NONE; -} - diff --git a/lib/zbl-zdo.c b/lib/zbl-zdo.c deleted file mode 100644 index e66e8a6..0000000 --- a/lib/zbl-zdo.c +++ /dev/null @@ -1,320 +0,0 @@ -/* - * Copyright (c) 2015 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 - -#include "zbl.h" -#include "zb-log.h" -#include "zbl-dbus.h" -#include "zb-common.h" - -API int zb_end_dev_info_get_list(zb_zigbee_h handle, int *count, - zb_end_dev_info_h **list) -{ - int ret; - unsigned char cnt; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == count, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == list, ZIGBEE_ERROR_INVALID_PARAMETER); - - ret = zbl_get_all_device_info(list, &cnt); - *count = cnt; - return ret; -} - -API int zb_end_dev_get_endpoint_list(zb_zigbee_h handle, zb_ieee_addr addr64, - unsigned char *count, unsigned char **ep_list) -{ - int ret; - unsigned char cnt = 0; - unsigned char eplist[MAX_ENDPOINT_CLUSTERS] = {0, }; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == count, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == ep_list, ZIGBEE_ERROR_INVALID_PARAMETER); - - ret = zbl_get_endpoint_list(addr64, &cnt, eplist); - *count = cnt; - if (cnt > 0) { - *ep_list = calloc(cnt + 1, sizeof(unsigned char)); - RETV_IF(NULL == *ep_list, ZIGBEE_ERROR_OUT_OF_MEMORY); - memcpy(*ep_list, eplist, cnt); - } - return ret; -} - -API int zb_end_dev_info_get_cluster_list(zb_zigbee_h handle, zb_ieee_addr addr64, - unsigned char ep, unsigned char *in_cluster_count, unsigned short **in_cluster_list, - unsigned char *out_cluster_count, unsigned short **out_cluster_list) -{ - int ret; - unsigned char in_cnt = 0; - unsigned char out_cnt = 0; - unsigned short in_clusters[MAX_ENDPOINT_CLUSTERS] = {0, }; - unsigned short out_clusters[MAX_ENDPOINT_CLUSTERS] = {0, }; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == in_cluster_count, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == in_cluster_list, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == out_cluster_count, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == out_cluster_list, ZIGBEE_ERROR_INVALID_PARAMETER); - - ret = zbl_get_cluster_list(addr64, ep, &in_cnt, in_clusters, - &out_cnt, out_clusters); - *in_cluster_count = in_cnt; - if (in_cnt > 0) { - *in_cluster_list = calloc(in_cnt + 1, sizeof(unsigned short)); - RETV_IF(NULL == *in_cluster_list, ZIGBEE_ERROR_OUT_OF_MEMORY); - memcpy(*in_cluster_list, in_clusters, in_cnt * sizeof(unsigned short)); - } - *out_cluster_count = out_cnt; - if (out_cnt > 0) { - *out_cluster_list = calloc(out_cnt + 1, sizeof(unsigned short)); - RETV_IF(NULL == *out_cluster_list, ZIGBEE_ERROR_OUT_OF_MEMORY); - memcpy(*out_cluster_list, out_clusters, out_cnt * sizeof(unsigned short)); - } - - return ret; -} - -API int zb_foreach_end_dev_info(zb_end_dev_info_h *list, - zb_end_dev_info_cb cb, void *user_data) -{ - int index = 0; - GList *cur = NULL; - struct zb_end_device_info_s *real = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == list, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER); - CHECK_ZIGBEE_PRIVILEGE(); - - cur = (GList *)list; - while (cur) { - GList *next = cur->next; - real = cur->data; - if (ZIGBEE_FUNC_STOP == cb(index, (zb_end_dev_info_h)real->list, user_data)) - break; - index++; - cur = next; - } - - return ZIGBEE_ERROR_NONE; - -} - -API int zb_end_dev_info_create(zb_end_dev_info_h *handle) -{ - struct zb_zdo_node_descriptor_s* h = NULL; - - CHECK_ZIGBEE_PRIVILEGE(); - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - h = calloc(1, sizeof(struct zb_end_device_info_s)); - RETVM_IF(NULL == handle, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - *handle = h; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_end_dev_info_clone(zb_end_dev_info_h src, zb_end_dev_info_h *dst) -{ - struct zb_end_device_info_s *dev = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER); - - dev = calloc(1, sizeof(struct zb_end_device_info_s)); - RETVM_IF(NULL == dev, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - memcpy(dev, src, sizeof(struct zb_zdo_node_descriptor_s)); - *dst = dev; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_end_dev_info_destroy(zb_end_dev_info_h handle) -{ - struct zb_zdo_node_descriptor_s* h = handle; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - free(h); - return ZIGBEE_ERROR_NONE; -} - -API int zb_end_dev_info_get_network_address(zb_end_dev_info_h handle, - zb_nwk_addr *addr16) -{ - struct zb_end_device_info_s *h = handle; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == addr16, ZIGBEE_ERROR_INVALID_PARAMETER); - - *addr16 = h->addr16; - return ZIGBEE_ERROR_NONE; -} - -API int zb_end_dev_info_get_ieee_address(zb_end_dev_info_h handle, - zb_ieee_addr addr64) -{ - struct zb_end_device_info_s *h = handle; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER); - - memcpy(addr64, h->addr64, sizeof(zb_ieee_addr)); - return ZIGBEE_ERROR_NONE; -} - -API int zb_end_dev_info_get_num_of_ep(zb_end_dev_info_h handle, - unsigned char *count) -{ - struct zb_end_device_info_s *h = handle; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == count, ZIGBEE_ERROR_INVALID_PARAMETER); - - *count = h->num_of_ep; - return ZIGBEE_ERROR_NONE; -} - -API int zb_end_dev_info_get_ep_list(zb_end_dev_info_h handle, unsigned char **ep_list) -{ - struct zb_end_device_info_s *h = handle; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == ep_list, ZIGBEE_ERROR_INVALID_PARAMETER); - - *ep_list = calloc(h->num_of_ep, sizeof(unsigned char)); - RETVM_IF(NULL == *ep_list, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - - memcpy(*ep_list, h->ep, h->num_of_ep); - return ZIGBEE_ERROR_NONE; -} - -API int zb_end_dev_info_get_mac_capability(zb_end_dev_info_h handle, - zb_zdp_mac_capability_field_e *capability) -{ - struct zb_end_device_info_s *h = handle; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == capability, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0 == h->capability, ZIGBEE_ERROR_NO_DATA); - - *capability = h->capability; - return ZIGBEE_ERROR_NONE; -} - -API int zb_end_dev_info_get_alternative_pan_coordinator(zb_end_dev_info_h handle, - zb_zdp_do_pan_coordinator_e *can_do_it) -{ - struct zb_end_device_info_s *h = handle; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == can_do_it, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0 == h->capability, ZIGBEE_ERROR_NO_DATA); - - *can_do_it = h->capability & ZB_ZDP_ALTERNATIVE_PAN_COORDINATOR ? 1 : 0; - return ZIGBEE_ERROR_NONE; -} - -API int zb_end_dev_info_get_device_id(zb_end_dev_info_h handle, unsigned char ep, - unsigned short *deviceid) -{ - int i; - struct zb_end_device_info_s *h = handle; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == deviceid, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == h->desc, ZIGBEE_ERROR_NO_DATA); - - for (i = 0; i < h->num_of_ep; i++) { - RETV_IF(NULL == h->desc[i], ZIGBEE_ERROR_NO_DATA); - if (h->desc[i]->ep == ep) { - *deviceid = h->desc[i]->deviceid; - return ZIGBEE_ERROR_NONE; - } - } - return ZIGBEE_ERROR_NO_DATA; -} - -API int zb_end_dev_info_get_profile_id(zb_end_dev_info_h handle, unsigned char ep, - unsigned short *profileid) -{ - int i; - struct zb_end_device_info_s *h = handle; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == profileid, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == h->desc, ZIGBEE_ERROR_NO_DATA); - - for (i = 0; i < h->num_of_ep; i++) { - RETV_IF(NULL == h->desc[i], ZIGBEE_ERROR_NO_DATA); - if (h->desc[i]->ep == ep) { - *profileid = h->desc[i]->profileid; - return ZIGBEE_ERROR_NONE; - } - } - return ZIGBEE_ERROR_NO_DATA; -} - -API int zb_end_dev_info_get_power_source(zb_end_dev_info_h handle, - zb_zdp_power_e *power_src) -{ - struct zb_end_device_info_s *h = handle; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == power_src, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0 == h->capability, ZIGBEE_ERROR_NO_DATA); - - *power_src = h->capability & ZB_ZDP_POWER_SOURCE ? 1 : 0; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_end_dev_info_get_security_capabilty(zb_end_dev_info_h handle, - zb_zdp_security_cap_e*sec_capability) -{ - struct zb_end_device_info_s *h = handle; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == sec_capability, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(0 == h->capability, ZIGBEE_ERROR_NO_DATA); - - *sec_capability = h->capability & ZB_ZDP_SECURITY_CAPABILITY ? 1 : 0; - - return ZIGBEE_ERROR_NONE; -} - diff --git a/lib/zbl.c b/lib/zbl.c deleted file mode 100644 index 099a840..0000000 --- a/lib/zbl.c +++ /dev/null @@ -1,588 +0,0 @@ -/* - * Copyright (c) 2015 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 -#include -#include -#include - -#include "zbl.h" -#include "zbl-dbus.h" -#include "zb-common.h" - -API int zb_ev_get_enable_status(zb_event_data_h ev, zb_error_e* status) -{ - zb_event_data_s *event = ev; - zb_event_enable_s *enable = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); - enable = event->data.enable; - RETV_IF(NULL == enable, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER); - - *status = enable->status; - - return ZIGBEE_ERROR_NONE; -} - - -API int zb_ev_get_form_network_panid(zb_event_data_h ev, zb_nwk_addr* pan_id) -{ - zb_event_data_s *event = ev; - zb_event_form_network_s *form_network = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); - form_network = event->data.form_network; - RETV_IF(NULL == form_network, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == pan_id, ZIGBEE_ERROR_INVALID_PARAMETER); - - *pan_id = form_network->pan_id; - - return ZIGBEE_ERROR_NONE; -} - - -API int zb_ev_get_join_count(zb_event_data_h ev, unsigned char* count) -{ - zb_event_data_s *event = ev; - zb_event_join_s *join = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); - join = event->data.join; - RETV_IF(NULL == join, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == count, ZIGBEE_ERROR_INVALID_PARAMETER); - - *count = join->count; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_ev_get_join_ep(zb_event_data_h ev, unsigned char** ep) -{ - zb_event_data_s *event = ev; - zb_event_join_s *join = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); - join = event->data.join; - RETV_IF(NULL == join, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == ep, ZIGBEE_ERROR_INVALID_PARAMETER); - - *ep = calloc(join->count, sizeof(unsigned char)); - if (NULL == *ep) { - ERR("Couldn't Allocate Memory"); - return ZIGBEE_ERROR_OUT_OF_MEMORY; - } - memcpy(*ep, join->ep, join->count); - - return ZIGBEE_ERROR_NONE; -} - -API int zb_ev_get_child_left_status(zb_event_data_h ev, zb_error_e* status) -{ - zb_event_data_s *event = ev; - zb_event_child_left_s *child_left = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); - child_left = event->data.child_left; - RETV_IF(NULL == child_left, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER); - - *status = child_left->status; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_ev_get_global_default_rsp_ep(zb_event_data_h ev, unsigned char* ep) -{ - zb_event_data_s *event = ev; - zb_event_global_default_rsp_s *global_default_rsp = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); - global_default_rsp = event->data.global_default_rsp; - RETV_IF(NULL == global_default_rsp, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == ep, ZIGBEE_ERROR_INVALID_PARAMETER); - - *ep = global_default_rsp->ep; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_ev_get_global_default_rsp_cluster_id(zb_event_data_h ev, - unsigned short* clusterid) -{ - zb_event_data_s *event = ev; - zb_event_global_default_rsp_s *global_default_rsp = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); - global_default_rsp = event->data.global_default_rsp; - RETV_IF(NULL == global_default_rsp, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == clusterid, ZIGBEE_ERROR_INVALID_PARAMETER); - - *clusterid = global_default_rsp->clusterid; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_ev_get_global_default_rsp_command_id(zb_event_data_h ev, - unsigned char* commandid) -{ - zb_event_data_s *event = ev; - zb_event_global_default_rsp_s *global_default_rsp = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); - global_default_rsp = event->data.global_default_rsp; - RETV_IF(NULL == global_default_rsp, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == commandid, ZIGBEE_ERROR_INVALID_PARAMETER); - - *commandid = global_default_rsp->commandid; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_ev_get_global_default_rsp_status(zb_event_data_h ev, - zb_zcl_status_e* status) -{ - zb_event_data_s *event = ev; - zb_event_global_default_rsp_s *global_default_rsp = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); - global_default_rsp = event->data.global_default_rsp; - RETV_IF(NULL == global_default_rsp, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER); - - *status = global_default_rsp->status; - - return ZIGBEE_ERROR_NONE; -} - -/* Need to be test, because we don't know things send this reports to coordinator */ -API int zb_ev_get_global_attr_report_records(zb_event_data_h ev, - zb_zcl_attr_report_h* records, unsigned char *count) -{ - zb_event_data_s *event = ev; - zb_event_global_attr_report_s *global_attr_repor = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); - global_attr_repor = event->data.global_attr_report; - RETV_IF(NULL == global_attr_repor, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER); - - *records = global_attr_repor->records; - *count = global_attr_repor->count; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_ev_get_alarm_count(zb_event_data_h ev, unsigned short* count) -{ - zb_event_data_s *event = ev; - zb_event_alarm_s *alarm = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); - alarm = event->data.alarm; - RETV_IF(NULL == alarm, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == count, ZIGBEE_ERROR_INVALID_PARAMETER); - - *count = alarm->count; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_ev_get_enroll_request_src_ep(zb_event_data_h ev, unsigned char* src_ep) -{ - zb_event_data_s *event = ev; - zb_event_ias_enroll_request_s* ias_enroll_request = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); - ias_enroll_request = event->data.ias_enroll_request; - RETV_IF(NULL == ias_enroll_request, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == src_ep, ZIGBEE_ERROR_INVALID_PARAMETER); - - *src_ep = ias_enroll_request->src_ep; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_ev_get_enroll_request_zone_type(zb_event_data_h ev, - zb_zcl_ias_zone_type_e * zone_type) -{ - zb_event_data_s *event = ev; - zb_event_ias_enroll_request_s* ias_enroll_request = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); - ias_enroll_request = event->data.ias_enroll_request; - RETV_IF(NULL == ias_enroll_request, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zone_type, ZIGBEE_ERROR_INVALID_PARAMETER); - - *zone_type = ias_enroll_request->zone_type; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_ev_get_enroll_request_mfg_code(zb_event_data_h ev, - unsigned char* mfg_code) -{ - zb_event_data_s *event = ev; - zb_event_ias_enroll_request_s* ias_enroll_request = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); - ias_enroll_request = event->data.ias_enroll_request; - RETV_IF(NULL == ias_enroll_request, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == mfg_code, ZIGBEE_ERROR_INVALID_PARAMETER); - - *mfg_code = ias_enroll_request->mfg_code; - - return ZIGBEE_ERROR_NONE; -} - - -API int zb_ev_get_ias_noti_src_ep(zb_event_data_h ev, unsigned char* src_ep) -{ - zb_event_data_s *event = ev; - zb_event_ias_noti_s* ias_noti = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); - ias_noti = event->data.ias_noti; - RETV_IF(NULL == ias_noti, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == src_ep, ZIGBEE_ERROR_INVALID_PARAMETER); - - *src_ep = ias_noti->src_ep; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_ev_get_ias_noti_zone_status(zb_event_data_h ev, - unsigned short* zone_status) -{ - zb_event_data_s *event = ev; - zb_event_ias_noti_s* ias_noti = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); - ias_noti = event->data.ias_noti; - RETV_IF(NULL == ias_noti, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zone_status, ZIGBEE_ERROR_INVALID_PARAMETER); - - *zone_status = ias_noti->zone_status; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_ev_get_ias_ext_noti_src_ep(zb_event_data_h ev, unsigned char* src_ep) -{ - zb_event_data_s *event = ev; - zb_event_ias_extended_noti_s* ias_extended_noti = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); - ias_extended_noti = event->data.ias_extended_noti; - RETV_IF(NULL == ias_extended_noti, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == src_ep, ZIGBEE_ERROR_INVALID_PARAMETER); - - *src_ep = ias_extended_noti->src_ep; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_ev_get_ias_ext_noti_status(zb_event_data_h ev, unsigned char* status) -{ - zb_event_data_s *event = ev; - zb_event_ias_extended_noti_s* ias_extended_noti = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); - ias_extended_noti = event->data.ias_extended_noti; - RETV_IF(NULL == ias_extended_noti, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER); - - *status = ias_extended_noti->status; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_ev_get_ias_ext_noti_zone_status(zb_event_data_h ev, - unsigned short* zone_status) -{ - zb_event_data_s *event = ev; - zb_event_ias_extended_noti_s* ias_extended_noti = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); - ias_extended_noti = event->data.ias_extended_noti; - RETV_IF(NULL == ias_extended_noti, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zone_status, ZIGBEE_ERROR_INVALID_PARAMETER); - - *zone_status = ias_extended_noti->zone_status; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_ev_get_ias_ext_noti_delay(zb_event_data_h ev, unsigned short* delay) -{ - zb_event_data_s *event = ev; - zb_event_ias_extended_noti_s* ias_extended_noti = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); - ias_extended_noti = event->data.ias_extended_noti; - RETV_IF(NULL == ias_extended_noti, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == delay, ZIGBEE_ERROR_INVALID_PARAMETER); - - *delay = ias_extended_noti->delay; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_ev_get_ias_ext_noti_zone_id(zb_event_data_h ev, unsigned char* zone_id) -{ - zb_event_data_s *event = ev; - zb_event_ias_extended_noti_s* ias_extended_noti = NULL; - - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - - RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); - ias_extended_noti = event->data.ias_extended_noti; - RETV_IF(NULL == ias_extended_noti, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == zone_id, ZIGBEE_ERROR_INVALID_PARAMETER); - - *zone_id = ias_extended_noti->zone_id; - - return ZIGBEE_ERROR_NONE; -} - -API int zb_create(zb_zigbee_h *handle) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - zb_zigbee_h h = calloc(1, sizeof(struct zbl_zigbee_s)); - RETVM_IF(NULL == h, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); - *handle = h; - -#if !GLIB_CHECK_VERSION(2, 35, 0) - g_type_init(); -#endif -#if !GLIB_CHECK_VERSION(2, 31, 0) - g_thread_init(NULL); -#endif - ret = zbl_dbus_start(*handle); - DBG("zbl_dbus_start()=0x%X", ret); - - return ret; -} - -API int zb_destroy(zb_zigbee_h handle) -{ - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - zbl_dbus_stop(handle); - return ZIGBEE_ERROR_NONE; -} - -API int zb_enable(zb_zigbee_h handle) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - ret = zbl_enable(handle); - DBG("zbl_enable()=0x%X", ret); - return ret; -} - -API int zb_set_event_cb(zb_zigbee_h handle, zb_event_cb event_handler) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - ret = zbl_set_event_cb(handle, event_handler); - DBG("zb_set_event_cb()=0x%X", ret); - return ret; -} - -API int zb_disable(zb_zigbee_h handle) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - ret = zbl_disable(); - DBG("zbl_disable()=0x%X", ret); - return ret; -} - -API int zb_hw_reset(zb_zigbee_h handle) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - ret = zbl_hw_reset(); - DBG("zbl_hw_reset()=0x%X", ret); - return ret; -} - -API int zb_coex_start(zb_zigbee_h handle, unsigned char channel) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - ret = zbl_coex_start(channel); - DBG("zbl_coex_start()=0x%X", ret); - return ret; -} - -API int zb_coex_stop(zb_zigbee_h handle) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - ret = zbl_coex_stop(); - DBG("zbl_coex_stop()=0x%X", ret); - return ret; -} - -API int zb_form_network(zb_zigbee_h handle, zb_form_network_cb cb, void *user_data) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - ret = zbl_form_network(handle, cb, user_data); - DBG("zbl_form_network()=0x%X", ret); - return ret; -} - -API int zb_disable_network(zb_zigbee_h handle, zb_disable_network_cb cb, void *user_data) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - ret = zbl_disable_network(handle, cb, user_data); - DBG("zb_disable_network()=0x%X", ret); - return ret; -} - -API int zb_leave_device(zb_zigbee_h handle, zb_ieee_addr addr, bool remove_children, bool rejoin) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == addr, ZIGBEE_ERROR_INVALID_PARAMETER); - - ret = zbl_leave_device(addr, remove_children, rejoin); - DBG("zbl_leave_device()=0x%X", ret); - return ret; -} - -API int zb_permit_join(zb_zigbee_h handle, unsigned char timeout) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - - ret = zbl_permit_join(timeout, TRUE); - DBG("zb_permit_join()=0x%X", ret); - return ret; -} - -API int zb_get_controller_mac_address(zb_zigbee_h handle, zb_ieee_addr addr64) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER); - - ret = zbl_get_controller_mac_address(addr64); - DBG("zbl_get_controller_mac_address()=0x%X", ret); - return ret; -} - -API int zb_get_network_info(zb_zigbee_h handle, zb_ieee_addr addr64, zb_nwk_addr *nodeid, - zb_nwk_addr *panid, unsigned char *channel, unsigned char *tx_power) -{ - int ret = ZIGBEE_ERROR_NONE; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); - RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER); - - ret = zbl_get_network_info(addr64, nodeid, panid, channel, tx_power); - DBG("zbl_get_network_info()=0x%X", ret); - return ret; -} - -API int zb_end_dev_info_list_free(zb_end_dev_info_h *list) -{ - int i = 0, j = 0; - struct zb_end_device_info_s **plist = (struct zb_end_device_info_s **)list; - CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); - RETV_IF(NULL == list, ZIGBEE_ERROR_INVALID_PARAMETER); - - while (plist[i]) { - j = 0; - while (plist[i]->desc && plist[i]->desc[j]) { - free(plist[i]->desc[j]); - j++; - } - if (plist[i]->desc) - free(plist[i]->desc); - free(plist[i]); - i++; - } - free(plist); - plist = NULL; - return ZIGBEE_ERROR_NONE; -} diff --git a/lib/zbl.h b/lib/zbl.h deleted file mode 100644 index a404dff..0000000 --- a/lib/zbl.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2015 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 __TIZEN_NETWORK_ZIGBEE_LIBRARY_H__ -#define __TIZEN_NETWORK_ZIGBEE_LIBRARY_H__ - -#include -#include - -#ifdef API -#undef API -#endif /* API */ - -#define API __attribute__((visibility("default"))) - -struct zbl_zigbee_s { - GList *dbus_sub_ids; /**< subsrcibed dbus signal id */ - zb_event_cb event_handler; /**< event handler */ -#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC - GList *global_cmd_req; /**< list of global command requests */ -#endif - void *user_data; /**< use data */ -}; - -#endif /* TIZEN_NETWORK_ZIGBEE_LIBRARY_H__ */ diff --git a/packaging/capi-network-zigbee.spec b/packaging/capi-network-zigbee.spec index 542b38f..d7858dc 100644 --- a/packaging/capi-network-zigbee.spec +++ b/packaging/capi-network-zigbee.spec @@ -1,6 +1,10 @@ +%define major 0 +%define minor 1 +%define patchlevel 1 + Name: capi-network-zigbee Summary: Network Zigbee Service in Tizen CAPI -Version: 0.0.1 +Version: %{major}.%{minor}.%{patchlevel} Release: 0 Group: Network & Connectivity/Other License: Apache-2.0 @@ -34,11 +38,20 @@ chmod g-w %_sourcedir/* cp %{SOURCE1001} ./%{name}.manifest %build -MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'` +%if 0%{?gcov:1} +export LDFLAGS+=" -lgcov" +%endif -%cmake . -DMAJORVER=%{MAJORVER} -DFULLVER=%{version} \ - -DBIN_INSTALL_DIR:PATH=%{_bindir} \ - -DZB_FEATURE_GLOBAL_RSP_SYNC=1 +MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'` +cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} \ + -DLIB_INSTALL_DIR=%{_libdir} \ + -DBIN_INSTALL_DIR=%{_bindir} \ + -DINCLUDE_INSTALL_DIR=%{_includedir} \ + -DLIB_PATH=%{_lib} \ + -DFULLVER=%{version} \ + -DMAJORVER=${MAJORVER} \ + -DZB_FEATURE_GLOBAL_RSP_SYNC=1 \ + -DBUILD_GCOV=%{?gcov:1}%{!?gcov:0} %install rm -rf %{buildroot}/BUILD/%{name} diff --git a/src/zbl-custom.c b/src/zbl-custom.c new file mode 100644 index 0000000..891f0fc --- /dev/null +++ b/src/zbl-custom.c @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2016 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 +#include +#include +#include +#include +#include + +#include "zbl.h" +#include "zbl-dbus.h" +#include "zigbee.h" + +API int zb_aps_send(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char aps_fc, + unsigned char src_ep, unsigned char dst_ep, unsigned short clusterid, + unsigned short profileid, unsigned char zcl_fc, unsigned short mfg_code, + unsigned char cmd_id, unsigned short payload_len, unsigned char *payload, + zb_aps_send_cb cb, void *user_data) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + int ret = ZIGBEE_ERROR_NONE; + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + ret = zbl_aps_send(addr16, aps_fc, src_ep, dst_ep, clusterid, profileid, + zcl_fc, mfg_code, cmd_id, payload_len, payload, cb, user_data); + DBG("zbl_aps_send()=0x%X", ret); + return ret; +} + +API int zb_zcl_send(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char src_ep, + unsigned char dst_ep, zb_cluster_id clusterid, unsigned char zcl_fc, + unsigned char cmd, unsigned short payload_len, unsigned char *payload, + zb_zcl_send_cb cb, void *user_data) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + int ret = ZIGBEE_ERROR_NONE; + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + ret = zbl_zcl_send(addr16, src_ep, dst_ep, clusterid, zcl_fc, + cmd, payload_len, payload, cb, user_data); + DBG("zbl_zcl_send()=0x%X", ret); + return ret; +} + +API int zb_send_to_local(zb_zigbee_h handle, unsigned short length, + unsigned char *data, zb_send_to_local_cb cb, void *user_data) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + int ret = ZIGBEE_ERROR_NONE; + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + ret = zbl_send_to_local(length, data, cb, user_data); + DBG("zbl_send_to_local()=0x%X", ret); + return ret; +} diff --git a/src/zbl-dbus.c b/src/zbl-dbus.c new file mode 100644 index 0000000..0951abe --- /dev/null +++ b/src/zbl-dbus.c @@ -0,0 +1,8984 @@ +/* + * Copyright (c) 2015 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 +#include +#include +#include +#include + +#include "zbl.h" +#include "zbl-dbus.h" +#include "zb-common.h" + +#define USE_ASYNC_DBUS_CALL + +static int zbl_ref_count; + +static GDBusConnection *gdbus_conn = NULL; +static GDBusProxy *service_gproxy = NULL; +static GDBusProxy *on_off_gproxy = NULL; +static GDBusProxy *door_lock_gproxy = NULL; +static GDBusProxy *level_control_gproxy = NULL; +static GDBusProxy *thermostat_gproxy = NULL; +static GDBusProxy *alarm_gproxy = NULL; +static GDBusProxy *fan_control_gproxy = NULL; +static GDBusProxy *mfglib_gproxy = NULL; +static GDBusProxy *zcl_global_proxy = NULL; +static GDBusProxy *zdo_dev_proxy = NULL; +static GDBusProxy *zcl_basic_proxy = NULL; +static GDBusProxy *zcl_identify_proxy = NULL; +static GDBusProxy *zcl_ias_zone_proxy = NULL; +static GDBusProxy *zcl_poll_control_proxy = NULL; +static GDBusProxy *zcl_group_proxy = NULL; +static GDBusProxy *zcl_scene_proxy = NULL; +static GDBusProxy *zdo_bind_proxy = NULL; +static GDBusProxy *zcl_color_control_proxy = NULL; +static GDBusProxy *custom_gproxy = NULL; + +/* command id */ +typedef enum { + /* Service */ + ZBL_SERVICE_FORM_NETWORK = 0, + ZBL_SERVICE_DISABLE_NETWORK, + /* ZDO except Bind */ + ZBL_ZDO_NWK_ADDR_REQ, + ZBL_ZDO_NWK_ADDR_EXT_REQ, + ZBL_ZDO_ACTIVE_EP_REQ, + ZBL_ZDO_SIMPLE_DESC_REQ, + ZBL_ZDO_MATCHED_DESCRIPTOR_REQ, + ZBL_ZDO_COMPLEX_DESC_REQ, + ZBL_ZDO_MGMT_BIND_REQ, + ZBL_ZDO_MGMT_LQI_REQ, + ZBL_ZDO_MGMT_RTG_REQ, + ZBL_ZDO_MGMT_NWK_DISC_REQ, + ZBL_ZDO_MGMT_PERMIT_JOIN_REQ, + ZBL_ZDO_MGMT_LEAVE_REQ, + ZBL_ZDO_NODE_DESC_REQ, + ZBL_ZDO_POWER_DESC_REQ, + ZBL_ZDO_USER_DESC_REQ, + ZBL_ZDO_USER_DESC_SET_REQ, + /* ZDP Bind */ + ZBL_ZDO_BIND_REQ, + ZBL_ZDO_UNBIND_REQ, + /* ZCL Global */ + ZBL_ZCL_GLOBAL_READ_ATTRIBUTE_REQ, + ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_REQ, + ZBL_ZCL_GLOBAL_WRITE_CONFIGURE_REPORTING_REQ, + ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_REQ, + ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_STRUCTURED_REQ, + ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_RECEIVED_REQ, + ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_GENERATED_REQ, + ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_EXTENDED_REQ, + ZBL_ZCL_GLOBAL_READ_CONFIGURE_REPORTING_REQ, + /* Custom */ + ZBL_CUSTOM_APS_SEND_REQ, + ZBL_CUSTOM_ZCL_SEND_REQ, + ZBL_CUSTOM_LOCAL_SEND_REQ, + /* ZCL Alarm */ + ZBL_ZCL_ALARM_GET_ALARM_REQ, + /* ZCL Doorlock */ + ZBL_ZCL_DOORLOCK_LOCK_STATE, + /* ZCL Fanmode */ + ZBL_ZCL_FANMODE_FAN_MODE_STATE, + /* ZCL Group */ + ZBL_ZCL_GROUP_ADD_GROUP_REQ, + ZBL_ZCL_GROUP_VIEW_GROUP_REQ, + ZBL_ZCL_GROUP_GET_GROUP_MEMBERSHIP_REQ, + ZBL_ZCL_GROUP_REMOVE_GROUP_REQ, + /* ZCL Identify */ + ZBL_ZCL_IDENTIFY_QUERY_REQ, + /* ZCL On/Off */ + ZBL_ZCL_ON_OFF_GET_ON_OFF_STATE, + /* ZCL Pollcontrol */ + ZBL_ZCL_POLLCONTROL_SET_POLL_INTERVAL_REQ, + /* ZCL Scene */ + ZBL_ZCL_SCENE_ADD_SCENE_REQ, + ZBL_ZCL_SCENE_VIEW_SCENE_REQ, + ZBL_ZCL_SCENE_REMOVE_SCENE_REQ, + ZBL_ZCL_SCENE_STORE_SCENE_REQ, + ZBL_ZCL_SCENE_REMOVE_ALL_SCENE_REQ, + ZBL_ZCL_SCENE_GET_SCENE_MEMBERSHIP_REQ, + /* ZCL Thermostat */ + ZBL_ZCL_THERMOSTAT_GET_LOCAL_TEMP, +} zbl_command_id_e; + +typedef struct { + bool found; + void *cb; + void *userdata; + unsigned int sid; + int tid; +#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC + void *global_cmd; + void *handle; +#endif + zbl_command_id_e cid; +} zbl_req_cb_s; + +#define ZCL_REPORTING_DIRECTION_REPORTED 0x00 +#define ZCL_REPORTING_DIRECTION_RECEIVED 0x01 + +static GDBusProxy *_zbl_get_service_proxy(void) +{ + GDBusProxy *proxy = NULL; + RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); + + if (NULL == service_gproxy) { + proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, + ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_SERVICE_INTERFACE, + NULL, NULL); + } else + proxy = service_gproxy; + + return proxy; +} + +static GDBusProxy *_zbl_get_on_off_proxy(void) +{ + GDBusProxy *proxy = NULL; + RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); + + if (NULL == on_off_gproxy) { + proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, + ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, + ZIGBEE_ZCL_ON_OFF_INTERFACE, NULL, NULL); + } else + proxy = on_off_gproxy; + + return proxy; +} + +static GDBusProxy *_zbl_get_door_lock_proxy(void) +{ + GDBusProxy *proxy = NULL; + RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); + + if (NULL == door_lock_gproxy) { + proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, + ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, + ZIGBEE_ZCL_DOOR_LOCK_INTERFACE, NULL, NULL); + } else + proxy = door_lock_gproxy; + + return proxy; +} + +static GDBusProxy *_zbl_get_level_control_proxy(void) +{ + GDBusProxy *proxy = NULL; + RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); + + if (NULL == level_control_gproxy) { + proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, + ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, + ZIGBEE_ZCL_LEVEL_CONTROL_INTERFACE, NULL, NULL); + } else + proxy = level_control_gproxy; + + return proxy; +} + +static GDBusProxy *_zbl_get_thermostat_proxy(void) +{ + GDBusProxy *proxy = NULL; + RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); + + if (NULL == thermostat_gproxy) { + proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, + ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, + ZIGBEE_ZCL_THERMOSTAT_INTERFACE, NULL, NULL); + } else + proxy = thermostat_gproxy; + + return proxy; +} + +static GDBusProxy *_zbl_get_alarm_proxy(void) +{ + GDBusProxy *proxy = NULL; + RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); + + if (NULL == alarm_gproxy) { + proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, + ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_ZCL_ALARM_INTERFACE, + NULL, NULL); + } else + proxy = alarm_gproxy; + + return proxy; +} + +static GDBusProxy *_zbl_get_fan_control_proxy(void) +{ + GDBusProxy *proxy = NULL; + RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); + + if (NULL == fan_control_gproxy) { + proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, + ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, + ZIGBEE_ZCL_FAN_CONTROL_INTERFACE, NULL, NULL); + } else + proxy = fan_control_gproxy; + + return proxy; +} + +static GDBusProxy *_zbl_get_mfglib_proxy(void) +{ + GDBusProxy *proxy = NULL; + RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); + + if (NULL == mfglib_gproxy) { + proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, + ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, + ZIGBEE_MFGLIB_CONTROL_INTERFACE, NULL, NULL); + } else + proxy = mfglib_gproxy; + + return proxy; +} + +static GDBusProxy *_zbl_get_zcl_global_proxy(void) +{ + GDBusProxy *proxy = NULL; + RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); + + if (NULL == zcl_global_proxy) { + proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, + ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, + ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, NULL, NULL); + } else + proxy = zcl_global_proxy; + + return proxy; +} + +static GDBusProxy *_zbl_get_zdo_dev_proxy(void) +{ + GDBusProxy *proxy = NULL; + RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); + + if (NULL == zdo_dev_proxy) { + proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, + ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, + ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, NULL, NULL); + } else + proxy = zdo_dev_proxy; + + return proxy; +} + +static GDBusProxy *_zbl_get_basic_proxy(void) +{ + GDBusProxy *proxy = NULL; + RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); + + if (NULL == zcl_basic_proxy) { + proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, + ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_ZCL_BASIC_INTERFACE, + NULL, NULL); + } else + proxy = zcl_basic_proxy; + + return proxy; +} + +static GDBusProxy *_zbl_get_identify_proxy(void) +{ + GDBusProxy *proxy = NULL; + RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); + + if (NULL == zcl_identify_proxy) { + proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, + ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, + ZIGBEE_ZCL_IDENTIFY_INTERFACE, NULL, NULL); + } else + proxy = zcl_identify_proxy; + + return proxy; +} + +static GDBusProxy *_zbl_get_ias_zone_proxy(void) +{ + GDBusProxy *proxy = NULL; + RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); + + if (NULL == zcl_ias_zone_proxy) { + proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, + ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, + ZIGBEE_ZCL_IAS_ZONE_INTERFACE, NULL, NULL); + } else + proxy = zcl_ias_zone_proxy; + + return proxy; +} + +static GDBusProxy *_zbl_get_poll_control_proxy(void) +{ + GDBusProxy *proxy = NULL; + RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); + + if (NULL == zcl_poll_control_proxy) { + proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, + ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, + ZIGBEE_ZCL_POLL_CONTROL_INTERFACE, NULL, NULL); + } else + proxy = zcl_poll_control_proxy; + + return proxy; +} + +static GDBusProxy *_zbl_get_group_proxy(void) +{ + GDBusProxy *proxy = NULL; + RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); + + if (NULL == zcl_group_proxy) { + proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, + ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_ZCL_GROUP_INTERFACE, + NULL, NULL); + } else + proxy = zcl_group_proxy; + + return proxy; +} + +static GDBusProxy *_zbl_get_scene_proxy(void) +{ + GDBusProxy *proxy = NULL; + RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); + + if (NULL == zcl_scene_proxy) { + proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, + ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_ZCL_SCENE_INTERFACE, + NULL, NULL); + } else + proxy = zcl_scene_proxy; + + return proxy; +} + +static GDBusProxy *_zbl_get_zdo_bind_proxy(void) +{ + GDBusProxy *proxy = NULL; + RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); + + if (NULL == zdo_bind_proxy) { + proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, + ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_ZDO_BIND_INTERFACE, + NULL, NULL); + } else + proxy = zdo_bind_proxy; + + return proxy; +} + +static GDBusProxy *_zbl_get_color_control_proxy(void) +{ + GDBusProxy *proxy = NULL; + RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid"); + + if (NULL == zcl_color_control_proxy) { + proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, + ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, + ZIGBEE_ZCL_COLOR_CONTROL_INTERFACE, NULL, NULL); + } else + proxy = zcl_color_control_proxy; + + return proxy; +} + +static GDBusProxy *_zbl_get_custom_gproxy(void) +{ + GDBusProxy *proxy = NULL; + RETVM_IF(NULL == gdbus_conn, NULL, "Custom Object is invalid"); + + if (NULL == custom_gproxy) { + proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, + ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_CUSTOM_INTERFACE, + NULL, NULL); + } else + proxy = custom_gproxy; + + return proxy; +} + +#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC +static gint _global_compare_func(gconstpointer a, gconstpointer b) +{ + const zbl_req_cb_s *left = (const zbl_req_cb_s*)a; + const zbl_req_cb_s *right = (const zbl_req_cb_s*)b; + zb_event_global_default_rsp_s *left_data = NULL; + zb_event_global_default_rsp_s *right_data = NULL; + + if (NULL == left || NULL == left->global_cmd) + return -1; + if (NULL == right || NULL == right->global_cmd) + return 1; + + left_data = left->global_cmd; + right_data = right->global_cmd; + + if (left_data->ep > right_data->ep) + return 1; + else if (left_data->ep < right_data->ep) + return -1; + + if (left_data->clusterid > right_data->clusterid) + return 1; + else if (left_data->clusterid < right_data->clusterid) + return -1; + + if (left_data->commandid > right_data->commandid) + return 1; + else if (left_data->commandid < right_data->commandid) + return -1; + + /* endpoint, clusterid and commandid are equal */ + return 0; +} + +static void _zbl_register_global_req(zb_zigbee_h handle, zbl_req_cb_s *container) +{ + GList *list = NULL; + GList *item = NULL; + + struct zbl_zigbee_s* h = handle; + + if (NULL == handle || NULL == container) + return; + + list = h->global_cmd_req; + + /* Insert item if not exists */ + DBG("Insert global cmd info"); + if (list) { + item = g_list_find_custom(list, container, _global_compare_func); + if (NULL != item) + h->global_cmd_req = g_list_append(list, container); + } else + h->global_cmd_req = g_list_append(list, container); +} + +static void _zbl_deregister_global_req(zb_zigbee_h handle, zbl_req_cb_s *container) +{ + GList *list = NULL; + GList *item = NULL; + + struct zbl_zigbee_s* h = handle; + + if (NULL == handle || NULL == container) + return; + + list = h->global_cmd_req; + if (NULL == list) + return; + + /* Remove item if exists */ + DBG("Remove global cmd info"); + item = g_list_find_custom(list, container, _global_compare_func); + if (NULL != item) + h->global_cmd_req = g_list_remove(list, container); +} + +static void _zbl_remove_global_req(zb_zigbee_h handle, unsigned char ep, + unsigned short clusterid, unsigned char commandid) +{ + GList *head = NULL; + GList *iter = NULL; + zbl_req_cb_s *ret = NULL; + + struct zbl_zigbee_s* h = handle; + + if (NULL == handle) + return; + + head = h->global_cmd_req; + iter = head; + + while (NULL != iter) { + GList *next = iter->next; + zbl_req_cb_s *container = iter->data; + if (container && container->global_cmd) { + zb_event_global_default_rsp_s *data = container->global_cmd; + + if (data && data->ep == ep && data->clusterid == clusterid + && data->commandid == commandid) { + DBG(" Found: ep[%d] cluster_id[%X] commandid[%X] / sid[%d]", + ep, clusterid, commandid, container->sid); + ret = container; + break; + } + } + iter = next; + } + + if (ret) { + if (ret->sid) + g_dbus_connection_signal_unsubscribe(gdbus_conn, ret->sid); + + if (ret->tid) { + g_source_remove(ret->tid); + DBG("tid=%d removed"); + ret->tid = 0; + } + + _zbl_deregister_global_req(h, ret); + } + +} +#endif /* ZB_FEATURE_GLOBAL_RSP_SYNC */ + +static void _zbl_signal_handler(GDBusConnection *connection, + const gchar *sender_name, const gchar *object_path, const gchar *interface_name, + const gchar *signal_name, GVariant *parameters, gpointer user_data) +{ + zb_event_data_s *ev = NULL; + struct zbl_zigbee_s* container = user_data; + + DBG("%s signal received", signal_name); + + RET_IF(NULL == container); + RET_IF(NULL == container->event_handler); + + ev = calloc(1, sizeof(zb_event_data_s)); + RETM_IF(NULL == ev, "Failed to memory allocation !"); + + if (g_strcmp0(signal_name, "zigbee_state") == 0) { + gboolean enabled; + g_variant_get(parameters, "(b)", &enabled); + + ev->data.enable = calloc(1, sizeof(zb_event_enable_s)); + if (!ev->data.enable) { + ERR("Failed to memory allocation !"); + goto EXIT_EVENT_HANDLER; + } + + ev->data.enable->status = (unsigned char)enabled; + + container->event_handler(0, NULL, ZB_ZDP_ENABLE_EVENT, ev, container->user_data); + + if (ev->data.enable) { + free(ev->data.enable); + ev->data.enable = NULL; + } + + } else if (g_strcmp0(signal_name, "form_network_done") == 0) { + zb_nwk_addr pan_id; + g_variant_get(parameters, "(q)", &pan_id); + + ev->data.form_network = calloc(1, sizeof(zb_event_form_network_s)); + if (!ev->data.form_network) { + ERR("Failed to memory allocation !"); + goto EXIT_EVENT_HANDLER; + } + + memcpy(&ev->data.form_network->pan_id, &pan_id, sizeof(zb_nwk_addr)); + + container->event_handler(pan_id, NULL, ZB_ZDP_FORM_NETWORK_DONE, ev, + container->user_data); + + if (ev->data.form_network) { + free(ev->data.form_network); + ev->data.form_network = NULL; + } + } else if (g_strcmp0(signal_name, "child_joined") == 0) { + zb_nwk_addr addr16; + zb_ieee_addr addr64; + unsigned char count; + unsigned char ep[10]; + unsigned char value; + + int j = 0; + GVariantIter *iter1 = NULL; + GVariantIter *iter2 = NULL; + + g_variant_get(parameters, "(a(y)ya(y)q)", &iter1, &count, &iter2, &addr16); + if (!iter1 || !iter2) { + ERR("Invalid parameter !"); + goto EXIT_EVENT_HANDLER; + } + + while (g_variant_iter_loop(iter1, "(y)", &value)) { + addr64[j] = value; j++; + } + g_variant_iter_free(iter1); + + j = 0; + while (g_variant_iter_loop(iter2, "(y)", &value)) { + ep[j] = value; j++; + } + g_variant_iter_free(iter2); + + ev->data.join = calloc(1, sizeof(zb_event_join_s)); + if (!ev->data.join) { + ERR("Failed to memory allocation !"); + goto EXIT_EVENT_HANDLER; + } + + ev->data.join->count = count; + memcpy(ev->data.join->ep, ep, count); + + container->event_handler(addr16, addr64, ZB_ZDP_JOIN_EVENT, ev, + container->user_data); + + if (ev->data.join) { + free(ev->data.join); + ev->data.join = NULL; + } + + } else if (g_strcmp0(signal_name, "child_rejoined") == 0) { + zb_ieee_addr addr64; + unsigned char value; + + int j = 0; + GVariantIter *iter = NULL; + + g_variant_get(parameters, "(a(y))", &iter); + if (!iter) { + ERR("Invalid parameter !"); + goto EXIT_EVENT_HANDLER; + } + + while (g_variant_iter_loop(iter, "(y)", &value)) { + addr64[j] = value; j++; + } + g_variant_iter_free(iter); + + container->event_handler(0, addr64, ZB_ZDP_REJOIN_EVENT, ev, + container->user_data); + + } else if (g_strcmp0(signal_name, "child_left") == 0) { + int j = 0; + zb_ieee_addr addr64; + GVariantIter *iter = NULL; + unsigned char value, status; + + g_variant_get(parameters, "(a(y)y)", &iter, &status); + if (!iter) { + ERR("Invalid parameter !"); + goto EXIT_EVENT_HANDLER; + } + + while (g_variant_iter_loop(iter, "(y)", &value)) { + addr64[j] = value; + j++; + } + g_variant_iter_free(iter); + + ev->data.child_left = calloc(1, sizeof(zb_event_child_left_s)); + if (!ev->data.child_left) { + ERR("Failed to memory allocation !"); + goto EXIT_EVENT_HANDLER; + } + + ev->data.child_left->status = status; + + container->event_handler(0, addr64, ZB_ZDP_CHILD_LEFT, ev, + container->user_data); + + if (ev->data.child_left) { + free(ev->data.child_left); + ev->data.child_left = NULL; + } + + } else if (g_strcmp0(signal_name, "leave_network_done") == 0) { + + zb_nwk_addr addr16; + g_variant_get(parameters, "(q)", &addr16); + + container->event_handler(addr16, NULL, ZB_ZDP_LEAVE_DONE_EVENT, ev, + container->user_data); + + } else if (!g_strcmp0(signal_name, "zcl_global_default_response")) { + zb_nwk_addr addr16; + unsigned char ep; + unsigned short clusterid; + unsigned char commandid; + unsigned char status; + + g_variant_get(parameters, "(qyqyy)", + &addr16, &ep, &clusterid, &commandid, &status); + + ev->data.global_default_rsp = calloc(1, sizeof(zb_event_global_default_rsp_s)); + if (!ev->data.global_default_rsp) { + ERR("Failed to memory allocation !"); + goto EXIT_EVENT_HANDLER; + } + + ev->data.global_default_rsp->ep = ep; + ev->data.global_default_rsp->clusterid = clusterid; + ev->data.global_default_rsp->commandid = commandid; + ev->data.global_default_rsp->status = status; + +#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC + /* If there is global request already, remove that. */ + if (0x00 != status) + _zbl_remove_global_req(container, ep, clusterid, commandid); +#endif + + container->event_handler(addr16, NULL, ZB_ZCL_GLOBAL_DEFAULT_RSP_EVENT, ev, + container->user_data); + + if (ev->data.global_default_rsp) { + free(ev->data.global_default_rsp); + ev->data.global_default_rsp = NULL; + } + + } else if (!g_strcmp0(signal_name, "alarm_count")) { + unsigned short alarm_count; + g_variant_get(parameters, "(q)", &alarm_count); + + ev->data.alarm = calloc(1, sizeof(zb_event_alarm_s)); + if (!ev->data.global_default_rsp) { + ERR("Failed to memory allocation !"); + goto EXIT_EVENT_HANDLER; + } + + ev->data.alarm->count = alarm_count; + + container->event_handler(0, NULL, ZB_ZCL_ALARM_EVENT, ev, container->user_data); + + if (ev->data.alarm) { + free(ev->data.alarm); + ev->data.alarm = NULL; + } + + } else if (!g_strcmp0(signal_name, "report_attr_handler_cb")) { + zb_nwk_addr addr16; + unsigned char ep; + unsigned char value; + unsigned short attrData; + unsigned short clusterid; + unsigned char dataType; + int data_size; + int dsizeIndex = 0; + char dSize[3] = {'\0', '\0'}; + int i = 0, j = 0, count; + GVariantIter *attr_iter = NULL; + GVariantIter *dataType_iter = NULL; + GVariantIter *data_iter = NULL; + + struct attribute_report_s **records = NULL; + + g_variant_get(parameters, "(qyqaqa(y)a(y)i)", &addr16, &ep, + &clusterid, &attr_iter, &dataType_iter, &data_iter, &count); + + if (!attr_iter || !dataType_iter || !data_iter) { + ERR("Invalid parameter !"); + goto EXIT_EVENT_HANDLER; + } + + records = calloc(count, sizeof(struct attribute_report_s*)); + if (!records) { + ERR("calloc() Fail(%d)", errno); + goto EXIT_EVENT_HANDLER; + } + + for (j = 0; j < count; j++) { + records[j] = calloc(1, sizeof(struct attribute_report_s)); + if (NULL == records[j]) { + for (i = 0; i < j; i++) { + free(records[i]); + records[i] = NULL; + } + free(records); + records = NULL; + + g_variant_iter_free(attr_iter); + g_variant_iter_free(dataType_iter); + g_variant_iter_free(data_iter); + + ERR("calloc() Fail(%d)", errno); + goto EXIT_EVENT_HANDLER; + } + } + DBG("record_length %d", count); + + j = 0; + while (g_variant_iter_loop(attr_iter, "q", &attrData) + && g_variant_iter_loop(dataType_iter, "(y)", &dataType)) { + records[j]->id = attrData; + records[j]->type = dataType; + DBG("dataType 0x%02x", records[j]->type); + DBG("AttributeId 0x%04x", records[j]->id); + j++; + } + g_variant_iter_free(attr_iter); + g_variant_iter_free(dataType_iter); + + j = 0; + while (j < count) { + switch (records[j]->type) { + /* String */ + case ZB_ZCL_OCTET_STRING: + case ZB_ZCL_CHARACTER_STRING: + g_variant_iter_loop(data_iter, "(y)", &value); + data_size = value + 1; + records[j]->value = calloc(data_size, sizeof(unsigned char)); + if (NULL == records[j]->value) { + for (i = 0; i < j; i++) { + free(records[i]->value); + records[i]->value = NULL; + } + for (i = 0; i < count; i++) { + free(records[i]); + records[i] = NULL; + } + free(records); + records = NULL; + + ERR("calloc() Fail(%d)", errno); + goto EXIT_EVENT_HANDLER; + } + records[j]->value[dsizeIndex] = value; + dsizeIndex++; + for (i = dsizeIndex; i < data_size - 2; i++) { + g_variant_iter_loop(data_iter, "(y)", &value); + records[j]->value[i] = value; + } + g_variant_iter_free(data_iter); + break; + case ZB_ZCL_LONG_OCTET_STRING: + case ZB_ZCL_LONG_CHARACTER_STRING: + g_variant_iter_loop(data_iter, "(y)", &value); + dSize[0] = value; + g_variant_iter_loop(data_iter, "(y)", &value); + dSize[1] = value; + data_size = dSize[1]; + data_size = (data_size << 8) | dSize[0]; + data_size += 2; + records[j]->value = calloc(data_size, sizeof(unsigned char)); + if (NULL == records[j]->value) { + for (i = 0; i < j; i++) { + free(records[i]->value); + records[i]->value = NULL; + } + for (i = 0; i < count; i++) { + free(records[i]); + records[i] = NULL; + } + free(records); + records = NULL; + + ERR("calloc() Fail(%d)", errno); + goto EXIT_EVENT_HANDLER; + } + records[j]->value[dsizeIndex] = dSize[dsizeIndex]; + dsizeIndex++; + records[j]->value[dsizeIndex] = dSize[dsizeIndex]; + dsizeIndex++; + + for (i = dsizeIndex; i < data_size - 2; i++) { + g_variant_iter_loop(data_iter, "(y)", &value); + records[j]->value[i] = value; + } + g_variant_iter_free(data_iter); + break; + /* Array, set and bag */ + case ZB_ZCL_ARRAY: + case ZB_ZCL_SET: + case ZB_ZCL_BAG: + /* structure */ + case ZB_ZCL_STRUCTURE: + ERR("Not supported type = %d", records[i]->type); + continue; + default: + data_size = zb_zcl_get_data_size(records[j]->type); + if (data_size < 0) { + for (i = 0; i < j; i++) { + free(records[i]->value); + records[i]->value = NULL; + } + for (i = 0; i < count; i++) { + free(records[i]); + records[i] = NULL; + } + free(records); + records = NULL; + + ERR("zb_zcl_get_data_size() Fail(%d)", data_size); + goto EXIT_EVENT_HANDLER; + } + records[j]->value = calloc(data_size, sizeof(unsigned char)); + if (NULL == records[j]->value) { + for (i = 0; i < j; i++) { + free(records[i]->value); + records[i]->value = NULL; + } + for (i = 0; i < count; i++) { + free(records[i]); + records[i] = NULL; + } + free(records); + records = NULL; + + ERR("calloc() Fail(%d)", errno); + goto EXIT_EVENT_HANDLER; + } + if (data_size != 0xFF) { + for (i = 0; i < data_size; i++) { + if (g_variant_iter_loop(data_iter, "(y)", &value)) { + records[j]->value[i] = value; + DBG("value[%d] 0x%02X", i, records[j]->value[i]); + } + } + } + g_variant_iter_free(data_iter); + } + DBG("DataType = 0x%02X Data Size = %d", records[j]->type, data_size); + j++; + } + + ev->data.global_attr_report = calloc(1, sizeof(zb_event_global_attr_report_s)); + if (NULL == ev->data.global_attr_report) { + ERR("Failed to memory allocation !"); + for (j = 0; j < count; j++) { + free(records[j]->value); + records[j]->value = NULL; + if (records[j]) { + free(records[j]); + records[j] = NULL; + } + } + if (records) { + free(records); + records = NULL; + } + goto EXIT_EVENT_HANDLER; + } + + ev->data.global_attr_report->records = records; + ev->data.global_attr_report->count = count; + + container->event_handler(addr16, NULL, ZB_ZCL_GLOBAL_ATTRIBUTE_REPORT_EVENT, ev, + container->user_data); + for (j = 0; j < count; j++) { + if (records[j]->value) { + free(records[j]->value); + records[j]->value = NULL; + } + if (records[j]) { + free(records[j]); + records[j] = NULL; + } + } + if (records) { + free(records); + records = NULL; + } + if (ev->data.global_attr_report) { + free(ev->data.global_attr_report); + ev->data.global_attr_report = NULL; + } + + } else if (!g_strcmp0(signal_name, "status_change_rpt")) { + + zb_nwk_addr addr16; + unsigned char src_ep; + unsigned char status; + unsigned short zone_status; + unsigned short delay; + unsigned char zone_id; + + g_variant_get(parameters, "(qyqyyq)", &addr16, &src_ep, &zone_status, + &status, &zone_id, &delay); + if (0xff == zone_id) { + + ev->data.ias_noti = calloc(1, sizeof(zb_event_ias_noti_s)); + if (!ev->data.ias_noti) { + ERR("Failed to memory allocation !"); + goto EXIT_EVENT_HANDLER; + } + + ev->data.ias_noti->src_ep = src_ep; + ev->data.ias_noti->zone_status = zone_status; + + container->event_handler(addr16, NULL, + ZB_ZCL_IAS_ZONE_STATUS_CHANGE_NOTIFICATION_EVENT, ev, + container->user_data); + + if (ev->data.ias_noti) { + free(ev->data.ias_noti); + ev->data.ias_noti = NULL; + } + + } else { + + ev->data.ias_extended_noti = calloc(1, sizeof(zb_event_ias_extended_noti_s)); + if (!ev->data.ias_extended_noti) { + ERR("Failed to memory allocation !"); + goto EXIT_EVENT_HANDLER; + } + + ev->data.ias_extended_noti->src_ep = src_ep; + ev->data.ias_extended_noti->zone_status = zone_status; + ev->data.ias_extended_noti->status = status; + ev->data.ias_extended_noti->zone_id = zone_id; + ev->data.ias_extended_noti->delay = delay; + + container->event_handler(addr16, NULL, + ZB_ZCL_IAS_ZONE_STATUS_CHANGE_EXTENDED_NOTIFICATION_EVENT, ev, + container->user_data); + + if (ev->data.ias_extended_noti) { + free(ev->data.ias_extended_noti); + ev->data.ias_extended_noti = NULL; + } + + } + } else if (!g_strcmp0(signal_name, "enroll_request")) { + zb_nwk_addr addr16; + unsigned char src_ep; + unsigned short zone_type; + unsigned char mfg_code; + + ev->data.ias_enroll_request = calloc(1, sizeof(zb_event_ias_enroll_request_s)); + if (!ev->data.ias_enroll_request) { + ERR("Failed to memory allocation !"); + goto EXIT_EVENT_HANDLER; + } + + g_variant_get(parameters, "(qyqy)", &addr16, &src_ep, &zone_type, &mfg_code); + ev->data.ias_enroll_request->src_ep = src_ep; + ev->data.ias_enroll_request->zone_type = zone_type; + ev->data.ias_enroll_request->mfg_code = mfg_code; + + container->event_handler(addr16, NULL, ZB_ZCL_IAS_ZONE_ENROLL_REQUEST_EVENT, ev, + container->user_data); + + if (ev->data.ias_enroll_request) { + free(ev->data.ias_enroll_request); + ev->data.ias_enroll_request = NULL; + } + } else + ERR("Can't handle this signal=%s", signal_name); + +EXIT_EVENT_HANDLER: + if (ev) { + free(ev); + ev = NULL; + } + return; +} + +static void _zbl_dbus_unsubscribe_signal(GList *sub_ids) +{ + RET_IF(NULL == gdbus_conn); + RET_IF(NULL == sub_ids); + + while (sub_ids) { + g_dbus_connection_signal_unsubscribe(gdbus_conn, GPOINTER_TO_UINT(sub_ids->data)); + sub_ids = g_list_remove(sub_ids, sub_ids->data); + } + g_list_free(sub_ids); +} + +static int _zbl_dbus_subscribe_signal(zb_zigbee_h handle) +{ + unsigned int id; + struct zbl_zigbee_s* h = handle; + + /* Section 0. Subscribe Manager signal */ + id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_MANAGER_INTERFACE, + "zigbee_state", ZIGBEE_DBUS_OBJPATH, NULL, G_DBUS_CALL_FLAGS_NONE, + _zbl_signal_handler, handle, NULL); + if (0 == id) { + ERR("g_dbus_connection_signal_subscribe(zigbee_state) Fail(%d)", errno); + return ZIGBEE_ERROR_IO_ERROR; + } + h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); + DBG("subscribed for service_enabled signal %d", id); + + /* Section 1. Subscribe ZDO signal */ + id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_SERVICE_INTERFACE, + "child_joined", ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE, + _zbl_signal_handler, h, NULL); + if (0 == id) { + ERR("g_dbus_connection_signal_subscribe(child_rejoined) Fail(%d)\n", errno); + _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids); + h->dbus_sub_ids = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); + DBG("subscribed for child_joined signal %d", id); + + id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_SERVICE_INTERFACE, + "child_rejoined", ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE, + _zbl_signal_handler, h, NULL); + if (0 == id) { + ERR("g_dbus_connection_signal_subscribe(child_rejoined) Fail(%d)\n", errno); + _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids); + h->dbus_sub_ids = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); + DBG("subscribed for child_rejoined signal %d", id); + + id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_SERVICE_INTERFACE, + "child_left", ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE, + _zbl_signal_handler, h, NULL); + if (0 == id) { + ERR("g_dbus_connection_signal_subscribe(child_left) Fail(%d)\n", errno); + _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids); + h->dbus_sub_ids = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); + DBG("subscribed for child_left signal %d", id); + + id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_SERVICE_INTERFACE, + "leave_network_done", ZIGBEE_CONTROL_OBJECT_PATH, NULL, + G_DBUS_CALL_FLAGS_NONE, _zbl_signal_handler, h, NULL); + if (0 == id) { + ERR("g_dbus_connection_signal_subscribe(leave_network_done) Fail(%d)\n", errno); + _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids); + h->dbus_sub_ids = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); + DBG("subscribed for leave_network_done signal %d", id); + + id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_SERVICE_INTERFACE, + "form_network_done", ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE, + _zbl_signal_handler, h, NULL); + if (0 == id) { + ERR("g_dbus_connection_signal_subscribe(form_network_done) Fail(%d)\n", errno); + _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids); + h->dbus_sub_ids = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); + DBG("subscribed for form_network_done signal %d", id); + + /* Section 3. Subscribe ZCL global command */ + id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, + ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "zcl_global_default_response", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE, + _zbl_signal_handler, h, NULL); + if (0 == id) { + ERR("g_dbus_connection_signal_subscribe(zcl_global_default_response) Fail(%d)\n", + errno); + _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids); + h->dbus_sub_ids = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); + DBG("subscribed for zcl_global_default_response signal %d", id); + + id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, + ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "report_attr_handler_rsp", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE, + _zbl_signal_handler, h, NULL); + if (0 == id) { + ERR("g_dbus_connection_signal_subscribe(report_attr_handler_rsp) Fail(%d)\n", + errno); + _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids); + h->dbus_sub_ids = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); + DBG("subscribed for report_attr_handler_rsp signal %d", id); + + /* Section 2. Subscribe ZCL alarm cluster signal */ + id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_ZCL_ALARM_INTERFACE, + "alarm_count", ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE, + _zbl_signal_handler, h, NULL); + if (0 == id) { + ERR("g_dbus_connection_signal_subscribe(alarm_count) Fail(%d)\n", errno); + _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids); + h->dbus_sub_ids = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); + DBG("subscribed for alarm_count signal %d", id); + + /* Section 3. Subscribe ZCL IAS cluster signal */ + id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, + ZIGBEE_ZCL_IAS_ZONE_INTERFACE, "status_change_rpt", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE, + _zbl_signal_handler, h, NULL); + if (0 == id) { + ERR("g_dbus_connection_signal_subscribe(status_change_rpt) Fail(%d)\n", errno); + _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids); + h->dbus_sub_ids = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); + DBG("subscribed for status_change_rpt signal %d", id); + + id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, + ZIGBEE_ZCL_IAS_ZONE_INTERFACE, "enroll_request", ZIGBEE_CONTROL_OBJECT_PATH, NULL, + G_DBUS_CALL_FLAGS_NONE, _zbl_signal_handler, h, NULL); + if (0 == id) { + ERR("g_dbus_connection_signal_subscribe(enroll_request) Fail(%d)\n", errno); + _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids); + h->dbus_sub_ids = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); + DBG("subscribed for enroll_request signal %d", id); + + return ZIGBEE_ERROR_NONE; +} + +static void _zbl_dbus_name_owner_notify(GObject *object, GParamSpec *pspec, + gpointer *user_data) +{ + GDBusProxy *proxy = G_DBUS_PROXY(object); + gchar *name_owner = g_dbus_proxy_get_name_owner(proxy); + zb_zigbee_h handle = (zb_zigbee_h)user_data; + + DBG("Name owner notify [%s]", name_owner); + + if (NULL == name_owner) + zbl_dbus_stop(handle); + + g_free(name_owner); +} + +static void _zbl_request_cleanup(gpointer data) +{ + zbl_req_cb_s *container = data; + RET_IF(NULL == container); + + if (container->tid) { + g_source_remove(container->tid); + DBG("tid=%d removed"); + container->tid = 0; + } + +#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC + _zbl_deregister_global_req(container->handle, container); + if (container->global_cmd) { + free(container->global_cmd); + container->global_cmd = NULL; + } +#endif + + free(container); + container = NULL; +} + +static gboolean _zbl_timeout_cb(gpointer p) +{ + zbl_req_cb_s *container = (zbl_req_cb_s *)p; + + RETVM_IF(NULL == gdbus_conn, G_SOURCE_REMOVE, "gdbus_conn is NULL"); + RETVM_IF(NULL == p, G_SOURCE_REMOVE, "container is NULL"); + RETVM_IF(NULL == container->cb, G_SOURCE_REMOVE, "cb is NULL"); + RETVM_IF(true == container->found, G_SOURCE_REMOVE, "cb was alreay handled"); + + switch (container->cid) { + /* Service */ + case ZBL_SERVICE_FORM_NETWORK: { + zb_form_network_cb cb = container->cb; + cb(0x0000, container->userdata); + } + break; + case ZBL_SERVICE_DISABLE_NETWORK: { + zb_disable_network_cb cb = container->cb; + cb(0x0000, container->userdata); + cb(ZB_ZDP_STATUS_TIMEOUT, container->userdata); + } + break; + /* ZDO except Bind */ + case ZBL_ZDO_NWK_ADDR_REQ: { + zb_zdo_addr_cb cb = container->cb; + cb(ZB_ZDP_STATUS_TIMEOUT, NULL, 0, 0, 0, NULL, container->userdata); + } + break; + case ZBL_ZDO_NWK_ADDR_EXT_REQ: { + zb_zdo_addr_cb cb = container->cb; + cb(ZB_ZDP_STATUS_TIMEOUT, NULL, 0, 0, 0, NULL, container->userdata); + } + break; + case ZBL_ZDO_ACTIVE_EP_REQ: { + zb_zdo_active_ep_cb cb = container->cb; + cb(ZB_ZDP_STATUS_TIMEOUT, 0, 0, NULL, container->userdata); + } + break; + case ZBL_ZDO_SIMPLE_DESC_REQ: { + zb_zdo_simple_desc_cb cb = container->cb; + cb(0, 0, NULL, container->userdata); + } + break; + case ZBL_ZDO_MATCHED_DESCRIPTOR_REQ: { + zb_zdo_match_desc_cb cb = container->cb; + cb(ZB_ZDP_STATUS_TIMEOUT, 0, 0, NULL, container->userdata); + } + break; + case ZBL_ZDO_COMPLEX_DESC_REQ: { + zb_zdo_complex_desc_cb cb = container->cb; + cb(ZB_ZDP_STATUS_TIMEOUT, 0, 0, NULL, container->userdata); + } + break; + case ZBL_ZDO_MGMT_BIND_REQ: { + zb_zdo_mgmt_bind_cb cb = container->cb; + struct zb_zdo_binding_table_s **records = NULL; + + records = calloc(1, sizeof(zb_zdo_binding_table_h)); + if (records) + records[0] = calloc(1, sizeof(struct zb_zdo_binding_table_s)); + + cb(ZB_ZDP_STATUS_TIMEOUT, 0, 0, 0, (void **)records, container->userdata); + + if (records && records[0]) { + free(records[0]); + records[0] = NULL; + } + if (records) { + free(records); + records = NULL; + } + } + break; + case ZBL_ZDO_MGMT_LQI_REQ: { + zb_zdo_mgmt_lqi_cb cb = container->cb; + struct zb_zdo_neighbor_table_desc_s **records = NULL; + + records = calloc(1, sizeof(zb_zdo_neighbor_table_desc_h)); + if (records) + records[0] = calloc(1, sizeof(struct zb_zdo_neighbor_table_desc_s)); + + cb(ZB_ZDP_STATUS_TIMEOUT, 0, 0, 0, (void **)records, container->userdata); + + if (records && records[0]) { + free(records[0]); + records[0] = NULL; + } + if (records) { + free(records); + records = NULL; + } + } + break; + case ZBL_ZDO_MGMT_RTG_REQ: { + zb_zdo_mgmt_rtg_cb cb = container->cb; + struct zb_zdo_routing_table_s **records = NULL; + + records = calloc(1, sizeof(zb_zdo_routing_table_h)); + if (records) + records[0] = calloc(1, sizeof(struct zb_zdo_routing_table_s)); + + cb(ZB_ZDP_STATUS_TIMEOUT, 0, 0, 0, (void **)records, container->userdata); + + if (records && records[0]) { + free(records[0]); + records[0] = NULL; + } + if (records) { + free(records); + records = NULL; + } + } + break; + case ZBL_ZDO_MGMT_NWK_DISC_REQ: { + zb_zdo_mgmt_nwk_disc_cb cb = container->cb; + struct zb_zdo_network_list_record_s **records = NULL; + records = calloc(1, sizeof(zb_zdo_network_list_record_h)); + if (records) + records[0] = calloc(1, sizeof(struct zb_zdo_network_list_record_s)); + + cb(0, 0, 0, 0, (void **)records, container->userdata); + + if (records && records[0]) { + free(records[0]); + records[0] = NULL; + } + if (records) { + free(records); + records = NULL; + } + } + break; + case ZBL_ZDO_MGMT_PERMIT_JOIN_REQ: { + zb_zdo_mgmt_permit_joining_cb cb = container->cb; + cb(ZB_ZDP_STATUS_TIMEOUT, container->userdata); + } + break; + case ZBL_ZDO_MGMT_LEAVE_REQ: { + zb_zdo_mgmt_leave_cb cb = container->cb; + cb(ZB_ZDP_STATUS_TIMEOUT, container->userdata); + } + break; + case ZBL_ZDO_NODE_DESC_REQ: { + zb_zdo_node_desc_cb cb = container->cb; + cb(ZB_ZDP_STATUS_TIMEOUT, 0, NULL, container->userdata); + } + break; + case ZBL_ZDO_POWER_DESC_REQ: { + zb_zdo_power_desc_cb cb = container->cb; + cb(0, 0, NULL, container->userdata); + } + break; + case ZBL_ZDO_USER_DESC_REQ: { + zb_zdo_user_desc_cb cb = container->cb; + cb(ZB_ZDP_STATUS_TIMEOUT, 0, 0, NULL, container->userdata); + break; + } + case ZBL_ZDO_USER_DESC_SET_REQ: { + zb_zdo_user_desc_conf_cb cb = container->cb; + cb(ZB_ZDP_STATUS_TIMEOUT, container->userdata); + } + break; + /* ZDO Bind */ + case ZBL_ZDO_BIND_REQ: { + zb_zdo_bind_cb cb = container->cb; + cb(ZB_ZDP_STATUS_TIMEOUT, container->userdata); + } + break; + case ZBL_ZDO_UNBIND_REQ: { + zb_zdo_unbind_cb cb = container->cb; + cb(ZB_ZDP_STATUS_TIMEOUT, container->userdata); + } + break; + /* Custom */ + case ZBL_CUSTOM_APS_SEND_REQ: { + zb_aps_send_cb cb = container->cb; + cb(0, 0, 0, 0, 0, 0, NULL, container->userdata); + } break; + case ZBL_CUSTOM_ZCL_SEND_REQ: { + zb_zcl_send_cb cb = container->cb; + cb(0, 0, 0, 0, 0, 0, NULL, container->userdata); + } + break; + case ZBL_CUSTOM_LOCAL_SEND_REQ: { + zb_send_to_local_cb cb = container->cb; + cb(0, NULL, container->userdata); + } + break; + /* ZCL Global */ + case ZBL_ZCL_GLOBAL_READ_ATTRIBUTE_REQ: { + zb_zcl_global_attr_read_cb cb = container->cb; + cb(0, 0, 0, NULL, 0, container->userdata); + } + break; + case ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_REQ: { + zb_zcl_global_attr_write_cb cb = container->cb; + cb(0, 0, 0, NULL, 0, container->userdata); + } + break; + case ZBL_ZCL_GLOBAL_WRITE_CONFIGURE_REPORTING_REQ: { + zb_zcl_global_config_report_write_cb cb = container->cb; + cb(0, 0, 0, NULL, 0, container->userdata); + } + break; + case ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_REQ: { + zb_zcl_global_attr_discover_cb cb = container->cb; + cb(0, 0, 0, 0, NULL, 0, container->userdata); + } + break; + case ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_STRUCTURED_REQ: { + zb_zcl_global_attr_write_cb cb = container->cb; + cb(0, 0, 0, NULL, 0, container->userdata); + } + break; + case ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_RECEIVED_REQ: { + zb_zcl_global_discover_cmds_cb cb = container->cb; + cb(0, 0, 0, 0, NULL, 0, container->userdata); + } + break; + case ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_GENERATED_REQ: { + zb_zcl_global_discover_cmds_cb cb = container->cb; + cb(0, 0, 0, 0, NULL, 0, container->userdata); + } + break; + case ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_EXTENDED_REQ: { + zb_zcl_global_attr_extended_discover_cb cb = container->cb; + cb(0, 0, 0, 0, NULL, 0, container->userdata); + } + break; + case ZBL_ZCL_GLOBAL_READ_CONFIGURE_REPORTING_REQ: { + zb_zcl_global_config_report_read_cb cb = container->cb; + cb(0, 0, 0, NULL, 0, container->userdata); + } + break; + /* ZCL Alarm */ + case ZBL_ZCL_ALARM_GET_ALARM_REQ: { + zb_zcl_alarm_get_alarm_cb cb = container->cb; + cb(ZB_ZCL_STATUS_TIMEOUT, 0, ZB_ZCL_STATUS_UNSUP_CLUSTER_COMMAND, + 0, 0, 0, container->userdata); + } + break; + /* ZCL Doorlock */ + case ZBL_ZCL_DOORLOCK_LOCK_STATE: { + zb_form_network_cb cb = container->cb; + cb(0x0000, container->userdata); + } + break; + /* ZCL Fanmode */ + case ZBL_ZCL_FANMODE_FAN_MODE_STATE: { + zb_form_network_cb cb = container->cb; + cb(0x0000, container->userdata); + } + break; + /* ZCL Group */ + case ZBL_ZCL_GROUP_ADD_GROUP_REQ: { + zb_zcl_group_add_group_cb cb = container->cb; + cb(0, 0, 0, 0, container->userdata); + } + break; + case ZBL_ZCL_GROUP_VIEW_GROUP_REQ: { + zb_zcl_group_view_group_cb cb = container->cb; + cb(0, 0, 0, 0, NULL, container->userdata); + } + break; + case ZBL_ZCL_GROUP_GET_GROUP_MEMBERSHIP_REQ: { + zb_zcl_group_get_group_membership_cb cb = container->cb; + cb(0, 0, 0, 0, NULL, container->userdata); + } + break; + case ZBL_ZCL_GROUP_REMOVE_GROUP_REQ: { + zb_zcl_group_remove_group_cb cb = container->cb; + cb(0, 0, 0, 0, container->userdata); + } + break; + /* ZCL Identify */ + case ZBL_ZCL_IDENTIFY_QUERY_REQ: { + zb_zcl_identify_query_cb cb = container->cb; + cb(0, 0, container->userdata); + } + break; + /* ZCL On/Off */ + case ZBL_ZCL_ON_OFF_GET_ON_OFF_STATE: { + zb_form_network_cb cb = container->cb; + cb(0x0000, container->userdata); + } + break; + /* ZCL Pollcontrol */ + case ZBL_ZCL_POLLCONTROL_SET_POLL_INTERVAL_REQ: { + zb_zcl_pollctrl_check_in_cb cb = container->cb; + cb(0, 0, container->userdata); + } + break; + /* ZCL Scene */ + case ZBL_ZCL_SCENE_ADD_SCENE_REQ: { + zb_zcl_scene_add_scene_cb cb = container->cb; + cb(0, 0, 0, 0, 0, container->userdata); + } + break; + case ZBL_ZCL_SCENE_VIEW_SCENE_REQ: { + zb_zcl_scene_view_scene_cb cb = container->cb; + cb(0, 0, 0, 0, 0, 0, NULL, NULL, 0, container->userdata); + } + break; + case ZBL_ZCL_SCENE_REMOVE_SCENE_REQ: { + zb_zcl_scene_remove_scene_cb cb = container->cb; + cb(0, 0, 0, 0, 0, container->userdata); + } + break; + case ZBL_ZCL_SCENE_STORE_SCENE_REQ: { + zb_zcl_scene_store_scene_cb cb = container->cb; + cb(0, 0, 0, 0, 0, container->userdata); + } + break; + case ZBL_ZCL_SCENE_REMOVE_ALL_SCENE_REQ: { + zb_zcl_scene_remove_all_scene_cb cb = container->cb; + cb(0, 0, 0, 0, container->userdata); + } + break; + case ZBL_ZCL_SCENE_GET_SCENE_MEMBERSHIP_REQ: { + zb_zcl_scene_get_scene_membership_cb cb = container->cb; + cb(0, 0, 0, 0, 0, 0, NULL, container->userdata); + } + break; + /* ZCL Thermostat */ + case ZBL_ZCL_THERMOSTAT_GET_LOCAL_TEMP: { + zb_form_network_cb cb = container->cb; + cb(0x0000, container->userdata); + } + break; + default: + ERR("Unhandled cid = %d", container->cid); + } + + container->tid = 0; + g_dbus_connection_signal_unsubscribe(gdbus_conn, container->sid); + container->sid = 0; + + return G_SOURCE_REMOVE; +} + +static void _zbl_response_cb(GDBusConnection *connection, + const gchar *sender_name, const gchar *object_path, const gchar *interface_name, + const gchar *signal_name, GVariant *parameters, gpointer user_data) +{ + zbl_req_cb_s *container = user_data; + RETM_IF(NULL == container, "container is null"); + RETM_IF(NULL == container->cb, "cb is NULL"); + + container->found = true; + g_dbus_connection_signal_unsubscribe(gdbus_conn, container->sid); + + switch (container->cid) { + /* Service */ + case ZBL_SERVICE_FORM_NETWORK: { + zb_form_network_cb cb = container->cb; + zb_nwk_addr panid; + g_variant_get(parameters, "(q)", &panid); + cb(panid, container->userdata); + } + break; + case ZBL_SERVICE_DISABLE_NETWORK: { + zb_disable_network_cb cb = container->cb; + unsigned char ret = ZB_ZDP_STATUS_SUCCESS; + g_variant_get(parameters, "(y)", &ret); + cb(ret, container->userdata); + } + break; + /* ZDO except Bind */ + case ZBL_ZDO_NWK_ADDR_REQ: { + zb_zdo_addr_cb cb = container->cb; + + int j = 0; + zb_nwk_addr addr16; + zb_ieee_addr addr64; + unsigned char status; + unsigned char num; + unsigned char start_idx; + unsigned char value; + GVariantIter *mac_iter = NULL; + + g_variant_get(parameters, "(ya(y)qyy)", &status, &mac_iter, &addr16, &num, &start_idx); + RETM_IF(NULL == mac_iter, "Invalid parameter !"); + + while (g_variant_iter_loop(mac_iter, "(y)", &value)) { + addr64[j] = value; + j++; + } + g_variant_iter_free(mac_iter); + + cb(status, addr64, addr16, num, start_idx, NULL, container->userdata); + } + break; + case ZBL_ZDO_NWK_ADDR_EXT_REQ: { + zb_zdo_addr_cb cb = container->cb; + + int j = 0; + zb_nwk_addr addr16; + zb_ieee_addr addr64; + unsigned char status; + unsigned char num; + unsigned char start_idx; + unsigned char value; + GVariantIter *mac_iter = NULL; + GVariantIter *assoc_iter = NULL; + + g_variant_get(parameters, "(ya(y)qyyaq)", &status, &mac_iter, + &addr16, &num, &start_idx, &assoc_iter); + RETM_IF(NULL == mac_iter, "Invalid parameter !"); + + while (g_variant_iter_loop(mac_iter, "(y)", &value)) { + addr64[j] = value; + j++; + } + g_variant_iter_free(mac_iter); + if (NULL != assoc_iter) + g_variant_iter_free(assoc_iter); + + cb(status, addr64, addr16, num, start_idx, NULL, container->userdata); + } + break; + case ZBL_ZDO_ACTIVE_EP_REQ: { + zb_zdo_active_ep_cb cb = container->cb; + + int j = 0; + zb_nwk_addr addr16; + unsigned char status; + unsigned char count; + unsigned char value; + GVariantIter *ep_iter = NULL; + unsigned char *ep_list; + + g_variant_get(parameters, "(yqa(y)y)", &status, &addr16, &ep_iter, &count); + RETM_IF(NULL == ep_iter, "Invalid parameter !"); + + ep_list = calloc(count+1, sizeof(unsigned char)); + RETM_IF(NULL == ep_list, "calloc() Fail(%d)", errno); + + while (g_variant_iter_loop(ep_iter, "(y)", &value)) { + ep_list[j] = value; + j++; + } + g_variant_iter_free(ep_iter); + + cb(status, addr16, count, ep_list, container->userdata); + + if (ep_list) { + free(ep_list); + ep_list = NULL; + } + } + break; + case ZBL_ZDO_SIMPLE_DESC_REQ: { + zb_zdo_simple_desc_cb cb = container->cb; + + int j = 0; + int count; + unsigned short addr16; + unsigned short value; + GVariantIter *in_iter = NULL; + GVariantIter *out_iter = NULL; + struct zb_zdo_simple_desc_s * records; + + records = calloc(1, sizeof(struct zb_zdo_simple_desc_s)); + RETM_IF(NULL == records, "calloc() Fail(%d)", errno); + + container->found = true; + + g_variant_get(parameters, "(qiyyqqyyaqaq)", &addr16, &count, + &records->device_ver, + &records->ep, &records->profileid, &records->deviceid, + &records->num_of_in_clusters, &records->num_of_out_clusters, + &in_iter, &out_iter); + if (NULL == in_iter || NULL == out_iter) { + ERR("Invalid parameter !"); + free(records); + return; + } +#if 0 + records->in_clusters = calloc(records->num_of_in_clusters, sizeof(unsigned short)); + if (NULL == records->in_clusters) { + ERR("calloc() Fail(%d)", errno); + g_variant_iter_free(in_iter); + g_variant_iter_free(out_iter); + return; + } + records->out_clusters = calloc(records->num_of_out_clusters, sizeof(unsigned short)); + if (NULL == records->out_clusters) { + ERR("calloc() Fail(%d)", errno); + free(records->in_clusters); + g_variant_iter_free(in_iter); + g_variant_iter_free(out_iter); + return; + } +#endif + while (g_variant_iter_loop(in_iter, "q", &value)) { + records->in_clusters[j] = value; + j++; + } + g_variant_iter_free(in_iter); + + j = 0; + while (g_variant_iter_loop(out_iter, "q", &value)) { + records->out_clusters[j] = value; + j++; + } + g_variant_iter_free(out_iter); + + DBG("addr16=0x%x, count=%d, records->ep=%d, records->deviceid=0x%x", + addr16, count, records->ep, records->deviceid); + for (j = 0; j < records->num_of_in_clusters; j++) + DBG("in_clusters[%d] = 0x%x", j, records->in_clusters[j]); + for (j = 0; j < records->num_of_out_clusters; j++) + DBG("out_clusters[%d] = 0x%x", j, records->out_clusters[j]); + + cb(addr16, count, records, container->userdata); + + if (records) { + free(records); + records = NULL; + } + } + break; + case ZBL_ZDO_MATCHED_DESCRIPTOR_REQ: { + zb_zdo_match_desc_cb cb = container->cb; + + int j = 0; + int match_len; + zb_nwk_addr addr16; + unsigned char value; + unsigned char status; + GVariantIter *ml_iter = NULL; + unsigned char *match_list = NULL; + g_variant_get(parameters, "(yqya(y))", &status, &addr16, &value, &ml_iter); + match_len = value; + + RETM_IF(NULL == ml_iter, "Invalid parameter !"); + + if (match_len > 0) { + match_list = calloc(match_len+1, sizeof(unsigned char)); + RETM_IF(NULL == match_list, "calloc() Fail(%d)", errno); + while (g_variant_iter_loop(ml_iter, "(y)", &value)) { + match_list[j] = value; + DBG("match_list[i]=%d", j, match_list[j]); + j++; + } + } + + DBG("Match count : [%d]", match_len); + DBG("Match list : [%p]", match_list); + + cb(status, addr16, match_len, match_list, container->userdata); + + if (match_list) { + free(match_list); + match_list = NULL; + } + } + break; + case ZBL_ZDO_NODE_DESC_REQ: { + zb_zdo_node_desc_cb cb = container->cb; + + zb_nwk_addr addr16; + unsigned char status; + struct zb_zdo_node_descriptor_s *desc; + + desc = calloc(1, sizeof(struct zb_zdo_node_descriptor_s)); + RETM_IF(NULL == desc, "calloc() Fail(%d)", errno); + + container->found = true; + + g_variant_get(parameters, "(yqyyyyyyqyqqqy)", &status, &addr16, + &desc->logical_type, &desc->complex_desciptor_available, + &desc->user_descriptor_available, &desc->aps_flags, &desc->frequency_band, + &desc->mac_capability_flags, &desc->manufacturer_code, &desc->maximum_buffer_size, + &desc->maximum_incoming_transfer_size, &desc->server_mask, + &desc->maximum_outgoing_transfer_size, &desc->descriptor_capability_field); + + cb(status, addr16, desc, container->userdata); + + if (desc) { + free(desc); + desc = NULL; + } + + } + break; + case ZBL_ZDO_POWER_DESC_REQ: { + zb_zdo_power_desc_cb cb = container->cb; + + zb_nwk_addr addr16; + unsigned char status; + struct zb_zdo_node_power_descriptor_s *desc; + + desc = calloc(1, sizeof(struct zb_zdo_node_power_descriptor_s)); + RETM_IF(NULL == desc, "calloc() Fail(%d)", errno); + + g_variant_get(parameters, "(yqyyyy)", &status, &addr16, + &desc->current_power_mode, &desc->available_power_sources, + &desc->current_power_source, &desc->current_power_source_level); + + cb(status, addr16, desc, container->userdata); + + if (desc) { + free(desc); + desc = NULL; + } + } + break; + case ZBL_ZDO_COMPLEX_DESC_REQ: { + zb_zdo_complex_desc_cb cb = container->cb; + + int length; + zb_nwk_addr addr16; + unsigned char j = 0; + unsigned char value; + unsigned char status; + GVariantIter *comp_iter = NULL; + unsigned char *complex_desc = NULL; + + g_variant_get(parameters, "(yqya(y))", &status, &addr16, &length, &comp_iter); + RETM_IF(NULL == comp_iter, "Invalid parameter !"); + + if (length > 0) { + complex_desc = calloc(length, sizeof(char)); + if (NULL == complex_desc) { + g_variant_iter_free(comp_iter); + ERR("calloc() Fail(%d)", errno); + return; + } + + while (g_variant_iter_loop(comp_iter, "(y)", &value)) { + complex_desc[j] = value; + j++; + } + g_variant_iter_free(comp_iter); + } + + cb(status, addr16, length, complex_desc, container->userdata); + + if (complex_desc) { + free(complex_desc); + complex_desc = NULL; + } + } + break; + case ZBL_ZDO_USER_DESC_REQ: { + zb_zdo_user_desc_cb cb = container->cb; + + int length; + zb_nwk_addr addr16; + unsigned char j = 0; + unsigned char value; + unsigned char status; + GVariantIter *comp_iter = NULL; + unsigned char *complex_desc = NULL; + + g_variant_get(parameters, "(yqya(y))", &status, &addr16, &length, &comp_iter); + RETM_IF(NULL == comp_iter, "Invalid parameter !"); + + if (length > 0) { + complex_desc = calloc(length, sizeof(char)); + if (NULL == complex_desc) { + g_variant_iter_free(comp_iter); + ERR("calloc() Fail(%d)", errno); + return; + } + + while (g_variant_iter_loop(comp_iter, "(y)", &value)) { + complex_desc[j] = value; + j++; + } + g_variant_iter_free(comp_iter); + } + + cb(status, addr16, length, complex_desc, container->userdata); + + if (complex_desc) { + free(complex_desc); + complex_desc = NULL; + } + break; + } + case ZBL_ZDO_USER_DESC_SET_REQ: { + zb_zdo_user_desc_conf_cb cb = container->cb; + unsigned char status; + g_variant_get(parameters, "(y)", &status); + cb(status, container->userdata); + } + break; + case ZBL_ZDO_MGMT_BIND_REQ: { + zb_zdo_mgmt_bind_cb cb = container->cb; + + unsigned char status; + unsigned char value; + + int i = 0; + int j = 0; + unsigned char binding_table_enteries; + unsigned char binding_table_list_count; + unsigned char start_index; + unsigned short dst_addr16 = 0; + unsigned char dst_ep = 0; + + GVariantIter *mac_iter = NULL; + GVariantIter *rsp_iter = NULL; + GVariantIter *destep_iter = NULL; + struct zb_zdo_binding_table_s **records = NULL; + + g_variant_get(parameters, "(yyyya(ayyqyqayy))", &status, + &binding_table_enteries, &start_index, + &binding_table_list_count, &rsp_iter); + RETM_IF(NULL == rsp_iter, "Invalid parameter !"); + + if (binding_table_list_count > 0) { + records = calloc(binding_table_list_count, sizeof(zb_zdo_binding_table_h)); + RETM_IF(NULL == records, "calloc() Fail(%d)", errno); + for (i = 0; i < binding_table_list_count; i++) { + records[i] = calloc(binding_table_list_count, sizeof(struct zb_zdo_binding_table_s)); + if (NULL == records[i]) { + g_variant_iter_free(rsp_iter); + ERR("calloc() Fail(%d)", errno); + goto MGMT_NWK_BIND_REQ_OUT; + } + } + } + + for (i = 0; i < binding_table_list_count; i++) { + g_variant_iter_loop(rsp_iter, "(ayyqyqayy)", &mac_iter, + &records[i]->src_ep, &records[i]->clusterid, + &records[i]->dst_addr_mode, &dst_addr16, + &destep_iter, &dst_ep); + if (NULL == mac_iter) { + ERR("Invalid parameter !"); + goto MGMT_NWK_BIND_REQ_OUT; + } + if (NULL == destep_iter) { + ERR("Invalid parameter !"); + goto MGMT_NWK_BIND_REQ_OUT; + } + + for (j = 0; j < 8; j++) { + g_variant_iter_loop(mac_iter, "y", &value); + records[i]->src_addr64[j] = value; + } + g_variant_iter_free(mac_iter); + + if (0x03 == records[i]->dst_addr_mode) { + for (j = 0; j < 8; j++) { + g_variant_iter_loop(destep_iter, "y", &value); + records[i]->dst_addr64[j] = value; + } + g_variant_iter_free(destep_iter); + + records[i]->dst_ep = dst_ep; + DBG("Destination MAC Addr : %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", + records[i]->dst_addr64[7], records[i]->dst_addr64[6], + records[i]->dst_addr64[5], records[i]->dst_addr64[4], + records[i]->dst_addr64[3], records[i]->dst_addr64[2], + records[i]->dst_addr64[1], records[i]->dst_addr64[0]); + + } else if (0x01 == records[i]->dst_addr_mode) { + records[i]->dst_addr16 = dst_addr16; + } + } + g_variant_iter_free(rsp_iter); + + cb(status, binding_table_enteries, start_index, binding_table_list_count, + (void **)records, container->userdata); + +MGMT_NWK_BIND_REQ_OUT: + for (i = 0; i < binding_table_list_count; i++) { + if (records[i]) { + free(records[i]); + records[i] = NULL; + } + } + free(records); + records = NULL; + } + break; + case ZBL_ZDO_MGMT_LQI_REQ: { + zb_zdo_mgmt_lqi_cb cb = container->cb; + + int i = 0; + int j = 0; + unsigned char value; + unsigned char status; + unsigned char start_index; + unsigned char neighbor_table_enteries; + unsigned char neighbor_table_list_count; + + GVariantIter *resp_iter = NULL; + GVariantIter *mac_iter = NULL; + GVariantIter *mac_iter1 = NULL; + struct zb_zdo_neighbor_table_desc_s **records = NULL; + + g_variant_get(parameters, "(yyyya(ayayyqyyyyy))", &status, &neighbor_table_enteries, + &start_index, &neighbor_table_list_count, &resp_iter); + RETM_IF(NULL == resp_iter, "Invalid parameter !"); + + if (neighbor_table_list_count > 0) { + records = calloc(neighbor_table_list_count, sizeof(zb_zdo_neighbor_table_desc_h)); + RETM_IF(NULL == records, "calloc() Fail(%d)", errno); + for (i = 0; i < neighbor_table_list_count; i++) { + records[i] = calloc(1, sizeof(struct zb_zdo_neighbor_table_desc_s)); + if (NULL == records[i]) { + ERR("calloc() Fail(%d)", errno); + goto MGMT_LQI_REQ_OUT; + } + } + } + for (i = 0; i < neighbor_table_list_count; i++) { + g_variant_iter_loop(resp_iter, "(ayayyqyyyyy)", + &mac_iter, &mac_iter1, + &records[i]->device_type, &records[i]->addr16, + &records[i]->rx_on_when_idle, &records[i]->relationship, + &records[i]->permit_joining, &records[i]->depth, + &records[i]->lqi); + if (NULL == mac_iter || NULL == mac_iter1) { + ERR("Invalid parameter !"); + goto MGMT_LQI_REQ_OUT; + } + + for (j = 0; j < 8; j++) { + g_variant_iter_loop(mac_iter, "y", &value); + records[i]->extended_pan_id[j] = value; + g_variant_iter_loop(mac_iter1, "y", &value); + records[i]->addr64[j] = value; + } + g_variant_iter_free(mac_iter); + g_variant_iter_free(mac_iter1); + + DBG("ext PAN ID = %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", + records[i]->extended_pan_id[0], records[i]->extended_pan_id[1], + records[i]->extended_pan_id[2], records[i]->extended_pan_id[3], + records[i]->extended_pan_id[4], records[i]->extended_pan_id[5], + records[i]->extended_pan_id[6], records[i]->extended_pan_id[7]); + + DBG("IEEE address = %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", + records[i]->addr64[0], records[i]->addr64[1], records[i]->addr64[2], + records[i]->addr64[3], records[i]->addr64[4], records[i]->addr64[5], + records[i]->addr64[6], records[i]->addr64[7]); + } + g_variant_iter_free(resp_iter); + + cb(status, neighbor_table_enteries, start_index, neighbor_table_list_count, + (void **)records, container->userdata); + +MGMT_LQI_REQ_OUT: + if (records) { + for (i = 0; i < neighbor_table_list_count; i++) { + if (records[i]) { + free(records[i]); + records[i] = NULL; + } + } + free(records); + records = NULL; + } + } + break; + case ZBL_ZDO_MGMT_RTG_REQ: { + zb_zdo_mgmt_rtg_cb cb = container->cb; + + int i; + unsigned char status; + unsigned char start_index; + unsigned char routing_table_enteries; + unsigned char routing_table_list_count; + + GVariantIter *rsp_iter = NULL; + struct zb_zdo_routing_table_s **records = NULL; + + g_variant_get(parameters, "(yyyya(qyyyyq))", &status, &routing_table_enteries, + &start_index, &routing_table_list_count, &rsp_iter); + RETM_IF(NULL == rsp_iter, "Invalid parameter !"); + + if (routing_table_list_count > 0) { + records = calloc(routing_table_list_count, sizeof(zb_zdo_routing_table_h)); + RETM_IF(NULL == records, "calloc() Fail(%d)", errno); + for (i = 0; i < routing_table_list_count; i++) { + records[i] = calloc(1, sizeof(struct zb_zdo_routing_table_s)); + if (NULL == records[i]) { + ERR("calloc() Fail(%d)", errno); + goto MGMT_NWK_RTG_REQ_OUT; + } + } + } + + for (i = 0; i < routing_table_list_count; i++) { + g_variant_iter_loop(rsp_iter, "(qyyyyq)", &records[i]->dst_addr, + &records[i]->status, &records[i]->memory_constrained, + &records[i]->route_record_required, + &records[i]->many_to_one, &records[i]->next_hop_addr); + } + g_variant_iter_free(rsp_iter); + + cb(status, routing_table_enteries, start_index, routing_table_list_count, + (void **)records, container->userdata); + +MGMT_NWK_RTG_REQ_OUT: + for (i = 0; i < routing_table_list_count; i++) { + if (records[i]) { + free(records[i]); + records[i] = NULL; + } + } + free(records); + records = NULL; + } + break; + case ZBL_ZDO_MGMT_NWK_DISC_REQ: { + zb_zdo_mgmt_nwk_disc_cb cb = container->cb; + int i = 0; + int j = 0; + unsigned char value; + unsigned char status = 0; + unsigned char nwk_count = 0; + unsigned char start_index = 0; + unsigned char nwk_list_count = 0; + + GVariantIter *mac_iter = NULL; + GVariantIter *resp_iter = NULL; + + DBG("_zbl_mgmt_nwk_disc_req_cb()"); + + g_variant_get(parameters, "(yyyya(ayyyyyyy))", &status, &nwk_count, + &start_index, &nwk_list_count, &resp_iter); + RETM_IF(NULL == resp_iter, "Invalid parameter !"); + + struct zb_zdo_network_list_record_s **records = NULL; + + if (!status) { + if (nwk_list_count > 0) { + records = calloc(nwk_list_count, sizeof(zb_zdo_network_list_record_h)); + RETM_IF(NULL == records, "calloc() Fail(%d)", errno); + for (i = 0; i < nwk_list_count; i++) { + records[i] = calloc(1, sizeof(struct zb_zdo_network_list_record_s)); + if (NULL == records[i]) { + ERR("calloc() Fail(%d)", errno); + goto MGMT_NWK_DISC_REQ_OUT; + } + } + } + for (i = 0; i < nwk_list_count; i++) { + g_variant_iter_loop(resp_iter, "(ayyyyyyy)", + &mac_iter, &records[i]->logical_channel, + &records[i]->stack_profile, &records[i]->zigbee_version, + &records[i]->beacon_order, + &records[i]->superframe_order, &records[i]->permit_joining); + if (NULL == mac_iter) { + ERR("Invalid parameter !"); + goto MGMT_NWK_DISC_REQ_OUT; + } + + for (j = 0; j < 8; j++) { + g_variant_iter_loop(mac_iter, "y", &value); + records[i]->extended_pan_id[j] = value; + } + g_variant_iter_free(mac_iter); + } + g_variant_iter_free(resp_iter); + } + + cb(status, nwk_count, start_index, nwk_list_count, + (void **)records, container->userdata); + +MGMT_NWK_DISC_REQ_OUT: + if (records) { + for (i = 0; i < nwk_list_count; i++) { + if (records[i]) { + free(records[i]); + records[i] = NULL; + } + } + free(records); + records = NULL; + } + } + break; + case ZBL_ZDO_MGMT_PERMIT_JOIN_REQ: { + zb_zdo_mgmt_permit_joining_cb cb = container->cb; + unsigned char status; + g_variant_get(parameters, "(y)", &status); + cb(status, container->userdata); + } + break; + case ZBL_ZDO_MGMT_LEAVE_REQ: { + zb_zdo_mgmt_leave_cb cb = container->cb; + unsigned char status; + g_variant_get(parameters, "(y)", &status); + cb(status, container->userdata); + } + break; + /* ZDO Bind */ + case ZBL_ZDO_BIND_REQ: { + zb_zdo_bind_cb cb = container->cb; + unsigned char status; + g_variant_get(parameters, "(y)", &status); + cb(status, container->userdata); + } + break; + case ZBL_ZDO_UNBIND_REQ: { + zb_zdo_unbind_cb cb = container->cb; + unsigned char status; + g_variant_get(parameters, "(y)", &status); + cb(status, container->userdata); + } + break; + /* Custom */ + case ZBL_CUSTOM_APS_SEND_REQ: { + zb_aps_send_cb cb = container->cb; + + unsigned short addr16; + unsigned char src_ep; + unsigned char dst_ep; + unsigned short clusterid; + unsigned short profileid; + unsigned short payload_len = 0; + unsigned char *payload = NULL; + + unsigned char value; + GVariantIter *payload_iter = NULL; + int i = 0; + + g_variant_get(parameters, "(qyyqqqa(y))", &addr16, &src_ep, &dst_ep, + &clusterid, &profileid, &payload_len, &payload_iter); + RETM_IF(NULL == payload_iter, "Invalid parameter !"); + + if (payload_len > 0) { + payload = calloc(payload_len+1, sizeof(unsigned char)); + if (!payload) { + ERR("calloc() Fail(%d)", errno); + goto ZBL_CUSTOM_APS_SEND_REQ_OUT; + } + while (g_variant_iter_loop(payload_iter, "(y)", &value)) + payload[i++] = value; + } + + cb(addr16, src_ep, dst_ep, clusterid, profileid, payload_len, payload, + container->userdata); +ZBL_CUSTOM_APS_SEND_REQ_OUT: + g_variant_iter_free(payload_iter); + if (payload) { + free(payload); + payload = NULL; + } + } + break; + case ZBL_CUSTOM_ZCL_SEND_REQ: { + zb_zcl_send_cb cb = container->cb; + + unsigned short addr16; + unsigned char src_ep; + unsigned char dst_ep; + unsigned short clusterid; + unsigned short profileid; + unsigned short payload_len = 0; + unsigned char *payload = NULL; + + unsigned char value; + GVariantIter *payload_iter = NULL; + int i = 0; + + g_variant_get(parameters, "(qyyqqqa(y))", &addr16, &src_ep, &dst_ep, + &clusterid, &profileid, &payload_len, &payload_iter); + RETM_IF(NULL == payload_iter, "Invalid parameter !"); + + if (payload_len > 0) { + payload = calloc(payload_len + 1, sizeof(unsigned char)); + if (!payload) { + ERR("calloc() Fail(%d)", errno); + goto ZBL_CUSTOM_ZCL_SEND_REQ_OUT; + } + while (g_variant_iter_loop(payload_iter, "(y)", &value)) + payload[i++] = value; + } + + cb(addr16, src_ep, dst_ep, clusterid, profileid, payload_len, payload, + container->userdata); +ZBL_CUSTOM_ZCL_SEND_REQ_OUT: + g_variant_iter_free(payload_iter); + if (payload) { + free(payload); + payload = NULL; + } + } + break; + case ZBL_CUSTOM_LOCAL_SEND_REQ: { + zb_send_to_local_cb cb = container->cb; + + unsigned char *data = NULL; + unsigned short length = 0; + unsigned char value; + GVariantIter *payload_iter = NULL; + int i = 0; + + g_variant_get(parameters, "(qa(y))", &length, &payload_iter); + RETM_IF(NULL == payload_iter, "Invalid parameter !"); + + if (length > 0) { + data = calloc(length, sizeof(unsigned char)); + if (!data) { + ERR("calloc() Fail(%d)", errno); + goto ZBL_CUSTOM_LOCAL_SEND_REQ_OUT; + } + + while (g_variant_iter_loop(payload_iter, "(y)", &value)) + data[i++] = value; + } + + cb(length, data, container->userdata); +ZBL_CUSTOM_LOCAL_SEND_REQ_OUT: + g_variant_iter_free(payload_iter); + if (data) { + free(data); + data = NULL; + } + } + break; + /* ZCL Global */ + case ZBL_ZCL_GLOBAL_READ_ATTRIBUTE_REQ: { + zb_zcl_global_attr_read_cb cb = container->cb; + + int j = 0; + int isString; + unsigned char value; + + zb_nwk_addr addr16; + unsigned char ep; + unsigned short attr_id; + unsigned short clusterid; + unsigned char status; + unsigned char type; + unsigned short count; + unsigned char attr_value[128]; + + GVariantIter *iter = NULL; + struct read_attribute_status_record_s *records = NULL; + + g_variant_get(parameters, "(qya(y)qqyyqi)", + &addr16, &ep, &iter, &attr_id, &clusterid, &status, &type, &count, &isString); + RETM_IF(NULL == iter, "Invalid parameter !"); + + if (!isString) { + while (g_variant_iter_loop(iter, "(y)", &value)) { + attr_value[j] = value; + DBG("attr_value[%d] = 0x%02X", j, value); + j++; + } + g_variant_iter_free(iter); + } else { + while (g_variant_iter_loop(iter, "(y)", &value)) { + if (j == 0) + count = value; + attr_value[j] = value; + DBG("attr_value[%d] = 0x%02X", j, value); + j++; + } + g_variant_iter_free(iter); + } + + records = calloc(1, sizeof(struct read_attribute_status_record_s)); + + if (!records) { + ERR("calloc() Fail(%d)", errno); + goto GLOBAL_READ_ATTRIBUTE_REQ_OUT; + } + + records->id = attr_id; + records->status = status; + records->type = type; + records->value = attr_value; + + cb(addr16, ep, clusterid, (void **)&records, count, container->userdata); + +GLOBAL_READ_ATTRIBUTE_REQ_OUT: + if (records) { + free(records); + records = NULL; + } + + } + break; + case ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_REQ: { + zb_zcl_global_attr_write_cb cb = container->cb; + + int i = 0; + zb_nwk_addr addr16; + unsigned char ep; + unsigned short clusterid; + unsigned short attributeid; + int count; + unsigned char value; + + GVariantIter *stat_iter = NULL; + GVariantIter *attr_iter = NULL; + struct write_attribute_status_record_s *records = NULL; + + g_variant_get(parameters, "(qya(y)aqqi)", + &addr16, &ep, &stat_iter, &attr_iter, &clusterid, &count); + RETM_IF(NULL == stat_iter, "Invalid parameter !"); + RETM_IF(NULL == attr_iter, "Invalid parameter !"); + + records = calloc(count, + sizeof(struct write_attribute_status_record_s)); + if (!records) { + g_variant_iter_free(stat_iter); + g_variant_iter_free(attr_iter); + ERR("calloc() Fail(%d)", errno); + goto GLOBAL_WRITE_ATTRIBUTE_REQ_OUT; + } + + while (g_variant_iter_loop(stat_iter, "(y)", &value)) { + records[i].status = value; + i++; + } + g_variant_iter_free(stat_iter); + + i = 0; + while (g_variant_iter_loop(attr_iter, "q", &attributeid)) { + records[i].id = attributeid; + DBG("Attribute Id 0x%04X", attributeid); + i++; + } + g_variant_iter_free(attr_iter); + + cb(addr16, ep, clusterid, (void **)&records, count, container->userdata); + +GLOBAL_WRITE_ATTRIBUTE_REQ_OUT: + if (records) { + free(records); + records = NULL; + } + } + break; + case ZBL_ZCL_GLOBAL_WRITE_CONFIGURE_REPORTING_REQ: { + int j = 0; + int l = 0; + int k = 0; + int rec_len; + + unsigned char ep; + unsigned short clusterid; + unsigned short attIdVal; + unsigned char value; + + GVariantIter *stat_iter = NULL; + GVariantIter *attr_iter = NULL; + GVariantIter *dir_iter = NULL; + + zb_nwk_addr addr16; + zb_zcl_global_config_report_write_cb cb = container->cb; + struct reporting_configuration_response_record_s *records = NULL; + + g_variant_get(parameters, "(a(y)aqa(y)qiqy)", + &stat_iter, &attr_iter, &dir_iter, &clusterid, &rec_len, &addr16, &ep); + RETM_IF(NULL == stat_iter, "Invalid parameter !"); + RETM_IF(NULL == attr_iter, "Invalid parameter !"); + RETM_IF(NULL == dir_iter, "Invalid parameter !"); + + records = calloc(rec_len, + sizeof(struct reporting_configuration_response_record_s)); + if (!records) { + g_variant_iter_free(stat_iter); + g_variant_iter_free(attr_iter); + g_variant_iter_free(dir_iter); + ERR("calloc() Fail(%d)", errno); + goto GLOBAL_CONFIGURE_REPORTING_REQ_OUT; + } + + while (g_variant_iter_loop(stat_iter, "(y)", &value)) { + DBG("Value 0x%02X", value); + records[j].status = value; + j++; + } + g_variant_iter_free(stat_iter); + + while (g_variant_iter_loop(attr_iter, "q", &attIdVal)) { + if (records[l].status != ZB_ZCL_STATUS_SUCCESS) + records[l].id = attIdVal; + l++; + } + g_variant_iter_free(attr_iter); + + while (g_variant_iter_loop(dir_iter, "(y)", &value)) { + if (records[k].status != ZB_ZCL_STATUS_SUCCESS) + records[k].dir = value; + k++; + } + g_variant_iter_free(dir_iter); + + cb(addr16, ep, clusterid, (void **)&records, rec_len, container->userdata); + +GLOBAL_CONFIGURE_REPORTING_REQ_OUT: + if (records) { + free(records); + records = NULL; + } + } + break; + case ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_REQ: { + + int j = 0; + int l = 0; + int count; + unsigned short clusterid; + unsigned short attributeid; + unsigned char value; + int discovery_complete; + + GVariantIter *stat_iter = NULL; + GVariantIter *attr_iter = NULL; + + zb_nwk_addr addr16; + unsigned char ep; + + zb_zcl_global_attr_discover_cb cb = container->cb; + struct discover_attribute_info_record_s **records = NULL; + + g_variant_get(parameters, "(qya(y)aqqii)", &addr16, &ep, &stat_iter, + &attr_iter, &clusterid, &count, &discovery_complete); + RETM_IF(NULL == stat_iter, "Invalid parameter !"); + RETM_IF(NULL == attr_iter, "Invalid parameter !"); + + records = calloc(count, sizeof(zb_zcl_discover_attr_info_record_h)); + RETM_IF(NULL == records, "calloc() Fail(%d)", errno); + for (j = 0; j < count; j++) { + records[j] = calloc(1, sizeof(struct discover_attribute_info_record_s)); + if (NULL == records[j]) { + ERR("calloc() Fail(%d)", errno); + for (l = 0; l < j; l++) { + free(records[l]); + records[l] = NULL; + } + free(records); + records = NULL; + + g_variant_iter_free(stat_iter); + g_variant_iter_free(attr_iter); + return; + } + } + + j = 0; + while (g_variant_iter_loop(stat_iter, "(y)", &value)) { + records[j]->type = value; + DBG("Attribute Type 0x%02X", value); + j++; + } + g_variant_iter_free(stat_iter); + + while (g_variant_iter_loop(attr_iter, "q", &attributeid)) { + records[l]->id = attributeid; + DBG("Attribute Id 0x%04X", attributeid); + l++; + } + g_variant_iter_free(attr_iter); + + cb(addr16, ep, clusterid, discovery_complete, (void *)records, count, + container->userdata); + + for (j = 0; j < count; j++) { + if (records[j]) { + free(records[j]); + records[j] = NULL; + } + } + if (records) { + free(records); + records = NULL; + } + } + break; + case ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_STRUCTURED_REQ: { + /* CAUTION: Currently we don't support this command */ + zb_zcl_global_attr_write_cb cb = container->cb; + cb(0, 0, 0, NULL, 0, container->userdata); + } + break; + /* GLOBAL_DISCOVER_COMMAND_RECEIVED and GLOBAL_DISCOVER_COMMAND_GENERATED should be handled as same way */ + case ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_RECEIVED_REQ: + case ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_GENERATED_REQ: { + + int j = 0; + char value; + unsigned short clusterid; + unsigned short cmd_len; + unsigned char *cmd_data; + unsigned char discoveryComplete; + + GVariantIter *cmd_iter = NULL; + + unsigned char ep; + zb_nwk_addr addr16; + zb_zcl_global_discover_cmds_cb cb = container->cb; + + g_variant_get(parameters, "(a(y)qqqyy)", &cmd_iter, &clusterid, &cmd_len, + &addr16, &ep, &discoveryComplete); + RETM_IF(NULL == cmd_iter, "Invalid parameter !"); + + cmd_data = calloc(cmd_len+1, sizeof(char)); + if (NULL == cmd_data) { + ERR("calloc() Fail(%d)", errno); + g_variant_iter_free(cmd_iter); + return; + } + + while (g_variant_iter_loop(cmd_iter, "(y)", &value)) { + DBG("Value 0x%02X", value); + cmd_data[j] = value; + j++; + } + g_variant_iter_free(cmd_iter); + + cb(addr16, ep, clusterid, discoveryComplete, cmd_data, cmd_len, + container->userdata); + if (cmd_data) { + free(cmd_data); + cmd_data = NULL; + } + } + break; + case ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_EXTENDED_REQ: { + + int i = 0; + int j = 0; + unsigned short clusterid; + unsigned char t_value; + unsigned char ac_value; + + unsigned short rec_len; + unsigned short attr_data; + unsigned char discoveryComplete; + GVariantIter *attr_iter = NULL; + GVariantIter *type_iter = NULL; + GVariantIter *ac_iter = NULL; + + unsigned char ep; + zb_nwk_addr addr16; + struct extended_attribute_infomation_s **records = NULL; + zb_zcl_global_attr_extended_discover_cb cb = container->cb; + + DBG("Will get the value now"); + + g_variant_get(parameters, "(aqa(y)a(y)qqqyy)", &attr_iter, &type_iter, &ac_iter, + &clusterid, &rec_len, &addr16, &ep, &discoveryComplete); + RETM_IF(NULL == attr_iter, "Invalid parameter !"); + RETM_IF(NULL == type_iter, "Invalid parameter !"); + RETM_IF(NULL == ac_iter, "Invalid parameter !"); + + DBG("records length 0x%04X", rec_len); + + records = calloc(rec_len, sizeof(zb_zcl_extended_attr_info_h)); + RETM_IF(NULL == records, "calloc() Fail(%d)", errno); + for (j = 0; j < rec_len; j++) { + records[j] = calloc(1, sizeof(struct extended_attribute_infomation_s)); + if (NULL == records[j]) { + for (i = 0; i < j; i++) { + free(records[i]); + records[i] = NULL; + } + free(records); + records = NULL; + + g_variant_iter_free(attr_iter); + g_variant_iter_free(type_iter); + g_variant_iter_free(ac_iter); + + ERR("calloc() Fail(%d)", errno); + return; + } + } + + j = 0; + while (g_variant_iter_loop(attr_iter, "q", &attr_data) + && g_variant_iter_loop(type_iter, "(y)", &t_value) + && g_variant_iter_loop(ac_iter, "(y)", &ac_value)) { + DBG("attrData 0x%04X", attr_data); + DBG("t_value 0x%02X", t_value); + DBG("ac_value 0x%02X", ac_value); + records[j]->id = attr_data; + records[j]->type = t_value; + records[j]->acl = ac_value; + j++; + } + g_variant_iter_free(attr_iter); + g_variant_iter_free(type_iter); + g_variant_iter_free(ac_iter); + + cb(addr16, ep, clusterid, discoveryComplete, (void *)records, rec_len, + container->userdata); + + for (j = 0; j < rec_len; j++) { + if (records[j]) { + free(records[j]); + records[j] = NULL; + } + } + if (records) { + free(records); + records = NULL; + } + } + break; + case ZBL_ZCL_GLOBAL_READ_CONFIGURE_REPORTING_REQ: { + + int i = 0; + int j = 0; + char value; + unsigned char *status = NULL; + unsigned char *data_size = NULL; + unsigned char *change = NULL; + unsigned short record_length; + + GVariantIter *resp_iter = NULL; + GVariantIter *data_iter = NULL; + + zb_nwk_addr addr16; + unsigned char ep; + unsigned short clusterid; + zb_zcl_global_attr_read_cb cb = container->cb; + + struct reporting_configuration_record_s **records = NULL; + + g_variant_get(parameters, "(qyqqa(yyqyqqayq))", + &addr16, &ep, &clusterid, &record_length, &resp_iter); + RETM_IF(NULL == resp_iter, "Invalid parameter !"); + + records = calloc(record_length, sizeof(zb_zcl_reporting_config_record_h)); + RETM_IF(NULL == records, "calloc() Fail(%d)", errno); + + for (i = 0; i < record_length; i++) { + records[i] = calloc(1, sizeof(struct reporting_configuration_record_s)); + if (NULL == records[i]) { + ERR("calloc() Fail(%d)", errno); + goto GLOBAL_READ_CONFIGURE_REPORTING_REQ_OUT; + } + } + + DBG("record_length %d", record_length); + status = calloc(record_length, sizeof(unsigned char)); + data_size = calloc(record_length, sizeof(unsigned char)); + if (!status || !data_size) { + ERR("Couldn't allocate the memory (%s)", errno); + goto GLOBAL_READ_CONFIGURE_REPORTING_REQ_OUT; + } + + for (i = 0; i < record_length; i++) { + g_variant_iter_loop(resp_iter, "(yyqyqqayq)", &status[i], &records[i]->dir, + &records[i]->id, &records[i]->type, &records[i]->max_i, &records[i]->min_i, + &data_iter, &records[i]->to); + if (NULL == data_iter) { + ERR("Invalid parameter !"); + goto GLOBAL_READ_CONFIGURE_REPORTING_REQ_OUT; + } + + if (records[i]->dir != ZCL_REPORTING_DIRECTION_REPORTED && + (zb_zcl_get_analog_or_discret(records[i]->type) == ZB_ZCL_DATA_TYPE_ANALOG)) { + data_size[i] = zb_zcl_get_data_size(records[j]->type); + j = 0; + if (data_size[i] != 0xff) { + change = calloc(data_size[i]+1, sizeof(unsigned char)); + if (!change) { + ERR("calloc() Fail(%d)", errno); + records[i]->change = NULL; + g_variant_iter_free(data_iter); + goto GLOBAL_READ_CONFIGURE_REPORTING_REQ_OUT; + } + + while (g_variant_iter_loop(data_iter, "y", &value)) { + change[j] = value; + j++; + } + g_variant_iter_free(data_iter); + records[i]->change = change; + } else + records[i]->change = NULL; + } else + records[i]->change = NULL; + } + g_variant_iter_free(resp_iter); + + cb(addr16, ep, clusterid, (void **)records, record_length, container->userdata); + +GLOBAL_READ_CONFIGURE_REPORTING_REQ_OUT: + if (data_size) { + free(data_size); + data_size = NULL; + } + if (status) { + free(status); + status = NULL; + } + + for (i = 0; i < record_length; i++) { + if (records[i] && records[i]->change) { + free(records[i]->change); + records[i]->change = NULL; + } + if (records[i]) { + free(records[i]); + records[i] = NULL; + } + } + if (records) { + free(records); + records = NULL; + } + } + break; + /* ZCL Alarm */ + case ZBL_ZCL_ALARM_GET_ALARM_REQ: { + + zb_nwk_addr addr16 = 0; + unsigned char ep = 0; + unsigned char status = 0; + unsigned char alarm_code = 0; + unsigned short clusterid = 0; + unsigned int time_stamp = 0; + + zb_zcl_alarm_get_alarm_cb cb = container->cb; + + g_variant_get(parameters, "(qyyyqu)", &addr16, &ep, &status, &alarm_code, + &clusterid, &time_stamp); + cb(addr16, ep, status, alarm_code, clusterid, time_stamp, container->userdata); + } + break; + /* ZCL Doorlock */ + case ZBL_ZCL_DOORLOCK_LOCK_STATE: { + ERR("Unhandled cid = %d", container->cid); + } + break; + /* ZCL Fanmode */ + case ZBL_ZCL_FANMODE_FAN_MODE_STATE: { + ERR("Unhandled cid = %d", container->cid); + } + break; + /* ZCL Group */ + case ZBL_ZCL_GROUP_ADD_GROUP_REQ: { + zb_zcl_group_add_group_cb cb = container->cb; + + zb_nwk_addr addr16; + unsigned char ep; + unsigned char status; + unsigned short group_id; + + g_variant_get(parameters, "(qyyq)", &addr16, &ep, &status, &group_id); + cb(addr16, ep, status, group_id, container->userdata); + } + break; + case ZBL_ZCL_GROUP_VIEW_GROUP_REQ: { + zb_zcl_group_view_group_cb cb = container->cb; + + int j = 0; + zb_nwk_addr addr16; + unsigned char ep; + unsigned char value; + unsigned char status; + unsigned short group_id; + char *group_name = NULL; + GVariantIter *grpNameiter = NULL; + + g_variant_get(parameters, "(qyyqay)", &addr16, &ep, &status, &group_id, &grpNameiter); + if (NULL == grpNameiter) { + ERR("Invalid grpNameiter"); + goto GROUP_VIEW_GROUP_REQ_OUT; + } + + g_variant_iter_loop(grpNameiter, "y", &value); + /* first byte indicates the length of the string */ + if ((value - '0') > 0) { + DBG("Value %d ", (value - '0')); + group_name = calloc((value - '0') + 1, sizeof(char)); + if (NULL == group_name) { + g_variant_iter_free(grpNameiter); + ERR("calloc() Fail(%d)", errno); + goto GROUP_VIEW_GROUP_REQ_OUT; + } + group_name[j] = value; + j++; + while (g_variant_iter_loop(grpNameiter, "y", &value) && (j <= (value - '0'))) { + group_name[j] = value; + DBG("Name %c", group_name[j]); + j++; + } + g_variant_iter_free(grpNameiter); + } else { + group_name = calloc(2, sizeof(char)); + if (NULL == group_name) { + g_variant_iter_free(grpNameiter); + ERR("calloc() Fail(%d)", errno); + goto GROUP_VIEW_GROUP_REQ_OUT; + } + group_name[j++] = value; + group_name[j++] = '\0'; + } + + DBG("GroupName = %s", group_name); + cb(addr16, ep, status, group_id, group_name, container->userdata); + +GROUP_VIEW_GROUP_REQ_OUT: + if (group_name) { + free(group_name); + group_name = NULL; + } + } + break; + case ZBL_ZCL_GROUP_GET_GROUP_MEMBERSHIP_REQ: { + zb_zcl_group_get_group_membership_cb cb = container->cb; + + int j = 0; + zb_nwk_addr addr16; + unsigned char ep; + unsigned short gl_value; + unsigned char capacity; + unsigned char group_count; + unsigned short *grouplist = NULL; + GVariantIter *grpListiter = NULL; + + g_variant_get(parameters, "(qyyyaq)", &addr16, &ep, &capacity, &group_count, &grpListiter); + RETM_IF(NULL == grpListiter, "Invalid parameter !"); + + if (group_count > 0) { + grouplist = calloc(group_count+1, sizeof(unsigned short)); + if (NULL == grouplist) { + g_variant_iter_free(grpListiter); + ERR("calloc() Fail(%d)", errno); + return; + } + RETM_IF(NULL == grouplist, "calloc() Fail(%d)", errno); + + while (g_variant_iter_loop(grpListiter, "q", &gl_value)) { + grouplist[j] = gl_value; + j++; + } + g_variant_iter_free(grpListiter); + } + + cb(addr16, ep, capacity, group_count, grouplist, container->userdata); + + if (grouplist) { + free(grouplist); + grouplist = NULL; + } + } + break; + case ZBL_ZCL_GROUP_REMOVE_GROUP_REQ: { + zb_zcl_group_remove_group_cb cb = container->cb; + + zb_nwk_addr addr16; + unsigned char ep; + unsigned char status; + unsigned short group_id; + + g_variant_get(parameters, "(qyyq)", &addr16, &ep, &status, &group_id); + + cb(addr16, ep, status, group_id, container->userdata); + } + break; + /* ZCL Identify */ + case ZBL_ZCL_IDENTIFY_QUERY_REQ: { + zb_zcl_identify_query_cb cb = container->cb; + + zb_nwk_addr addr16 = 0; + unsigned short identify_time = 0; + g_variant_get(parameters, "(qq)", &addr16, &identify_time); + + cb(addr16, identify_time, container->userdata); + } + break; + /* ZCL On/Off */ + case ZBL_ZCL_ON_OFF_GET_ON_OFF_STATE: { + ERR("Unhandled cid = %d", container->cid); + } + break; + /* ZCL Pollcontrol */ + case ZBL_ZCL_POLLCONTROL_SET_POLL_INTERVAL_REQ: { + zb_zcl_pollctrl_check_in_cb cb = container->cb; + + zb_nwk_addr addr16 = 0; + unsigned char ep = 0; + + g_variant_get(parameters, "(qy)", &addr16, &ep); + cb(addr16, ep, container->userdata); + } + break; + /* ZCL Scene */ + case ZBL_ZCL_SCENE_ADD_SCENE_REQ: { + zb_zcl_scene_add_scene_cb cb = container->cb; + + zb_nwk_addr addr16 = 0; + unsigned char ep; + unsigned char status; + unsigned short group_id; + unsigned char scene_id; + + g_variant_get(parameters, "(qyyqy)", &addr16, &ep, &status, &group_id, &scene_id); + cb(addr16, ep, status, group_id, scene_id, container->userdata); + } + break; + case ZBL_ZCL_SCENE_VIEW_SCENE_REQ: { + zb_zcl_scene_view_scene_cb cb = container->cb; + + int j = 0; + int len; + zb_nwk_addr addr16 = 0; + unsigned char ep; + unsigned char status; + unsigned short group_id; + unsigned char scene_id; + unsigned short transition_time = 0; + unsigned char value; + unsigned short ext_len = 0; + char *scene_name = NULL; + char *extendedFieldSets = NULL; + GVariantIter *sceneNameIter = NULL; + GVariantIter *extendedSetIter = NULL; + + g_variant_get(parameters, "(qyyqyqa(y)ya(y))", &addr16, &ep, &status, &group_id, &scene_id, + &transition_time, &sceneNameIter, &ext_len, &extendedSetIter); + + if (!g_variant_iter_loop(sceneNameIter, "(y)", &value)) { + ERR("There is no scene data"); + return; + } + + /** first byte indicates the length of the string */ + len = value -'0'; + if (0 < len) { + scene_name = calloc(len + 1, sizeof(char)); + if (NULL == scene_name) { + ERR("calloc() Fail(%d)", errno); + goto SCENE_VIEW_SCENE_REQ_OUT; + } + scene_name[j] = value; + j++; + while (g_variant_iter_loop(sceneNameIter, "(y)", &value)) { + scene_name[j] = value; + j++; + } + } else { + scene_name = calloc(1 + 1, sizeof(char)); + if (NULL == scene_name) { + ERR("calloc() Fail(%d)", errno); + goto SCENE_VIEW_SCENE_REQ_OUT; + } + scene_name[j] = value; + } + + j = 0; + if (0 < ext_len) { + extendedFieldSets = calloc(ext_len + 1, sizeof(char)); + if (NULL == extendedFieldSets) { + ERR("calloc() Fail(%d)", errno); + goto SCENE_VIEW_SCENE_REQ_OUT; + } + while (g_variant_iter_loop(extendedSetIter, "(y)", &value)) { + extendedFieldSets[j] = value; + j++; + } + } + + cb(addr16, ep, status, group_id, scene_id, transition_time, scene_name, + extendedFieldSets, ext_len, container->userdata); + +SCENE_VIEW_SCENE_REQ_OUT: + if (scene_name) { + free(scene_name); + scene_name = NULL; + } + + if (extendedFieldSets) { + free(extendedFieldSets); + extendedFieldSets = NULL; + } + } + break; + case ZBL_ZCL_SCENE_REMOVE_SCENE_REQ: { + zb_zcl_scene_remove_scene_cb cb = container->cb; + + zb_nwk_addr addr16 = 0; + unsigned char ep; + unsigned char status; + unsigned short group_id; + unsigned char scene_id; + + g_variant_get(parameters, "(qyyqy)", &addr16, &ep, &status, &group_id, &scene_id); + cb(addr16, ep, status, group_id, scene_id, container->userdata); + } + break; + case ZBL_ZCL_SCENE_STORE_SCENE_REQ: { + zb_zcl_scene_store_scene_cb cb = container->cb; + + zb_nwk_addr addr16 = 0; + unsigned char ep; + unsigned char status; + unsigned short group_id; + unsigned char scene_id; + + g_variant_get(parameters, "(qyyqy)", &addr16, &ep, &status, &group_id, &scene_id); + cb(addr16, ep, status, group_id, scene_id, container->userdata); + } + break; + case ZBL_ZCL_SCENE_REMOVE_ALL_SCENE_REQ: { + zb_zcl_scene_remove_all_scene_cb cb = container->cb; + + zb_nwk_addr addr16 = 0; + unsigned char ep; + unsigned char status; + unsigned short group_id; + + g_variant_get(parameters, "(qyyq)", &addr16, &ep, &status, &group_id); + cb(addr16, ep, status, group_id, container->userdata); + } + break; + case ZBL_ZCL_SCENE_GET_SCENE_MEMBERSHIP_REQ: { + zb_zcl_scene_get_scene_membership_cb cb = container->cb; + + int j = 0; + zb_nwk_addr addr16 = 0; + unsigned char ep; + unsigned char status; + unsigned short group_id; + unsigned char capacity; + unsigned char value; + unsigned char scene_count = 0; + unsigned char *scene_list = NULL; + GVariantIter *sceneListIter = NULL; + + g_variant_get(parameters, "(qyyyqya(y))", &addr16, &ep, &status, &capacity, &group_id, + &scene_count, &sceneListIter); + + if (0 < scene_count) { + scene_list = calloc(scene_count+1, sizeof(char)); + if (NULL == scene_list) { + ERR("calloc() Fail(%d)", errno); + goto SCENE_GET_SCENE_MEMBERSHIP_REQ_OUT; + } + while (g_variant_iter_loop(sceneListIter, "(y)", &value)) { + scene_list[j] = value; + DBG("Scene_List 0x%02X", scene_list[j]); + j++; + } + } + + cb(addr16, ep, status, capacity, group_id, scene_count, scene_list, container->userdata); +SCENE_GET_SCENE_MEMBERSHIP_REQ_OUT: + if (scene_list) { + free(scene_list); + scene_list = NULL; + } + } + break; + /* ZCL Thermostat */ + case ZBL_ZCL_THERMOSTAT_GET_LOCAL_TEMP: { + ERR("Unhandled cid = %d", container->cid); + } + break; + default: + ERR("Unhandled cid = %d", container->cid); + } +} + +static int _check_zigbee_privilege() +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + DBG("_check_zigbee_privilege()"); + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(service_gproxy, "check_privilege", + NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + if (!variant) { + ERR("Failed to check_zigbee_privilege [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + } + g_variant_unref(variant); + + return result; +} + +int zbl_set_event_cb(zb_zigbee_h handle, zb_event_cb event_handler) +{ + struct zbl_zigbee_s *h = handle; + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + h->event_handler = event_handler; + return ZIGBEE_ERROR_NONE; +} + +int zbl_enable(zb_zigbee_h handle) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_enable()"); + + variant = g_dbus_connection_call_sync(gdbus_conn, + ZIGBEE_MANAGER_INTERFACE, + ZIGBEE_DBUS_OBJPATH, + ZIGBEE_MANAGER_INTERFACE, + "enable", + NULL, NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'enable' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + g_variant_unref(variant); + + return result; +} + +int zbl_disable(void) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_disable()"); + + variant = g_dbus_connection_call_sync(gdbus_conn, + ZIGBEE_MANAGER_INTERFACE, + ZIGBEE_DBUS_OBJPATH, + ZIGBEE_MANAGER_INTERFACE, + "disable", + NULL, NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'disable' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_hw_reset(void) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(service_gproxy, "zb_hw_reset", NULL, + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'zb_hw_reset' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_get_network_info(zb_ieee_addr addr64, zb_nwk_addr *nodeid, zb_nwk_addr *panid, + unsigned char *channel, unsigned char *tx_power) +{ + GVariant *variant = NULL; + GVariantIter *iter = NULL; + GError *dbus_err = NULL; + int result = ZIGBEE_ERROR_NONE; + + zb_nwk_addr _nodeid; + zb_nwk_addr _panid; + unsigned char _radio_channel; + unsigned char _radio_tx_power; + unsigned char value; + int i = 0; + + DBG("zbl_get_network_info()"); + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(service_gproxy, "get_network_info", + NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to 'get_network_info' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(ia(y)qqyy)", &result, &iter, + &_nodeid, &_panid, &_radio_channel, &_radio_tx_power); + RETVM_IF(NULL == iter, ZIGBEE_ERROR_IO_ERROR, "Invalid parameter !"); + + /* Get EUI */ + i = 0; + while (g_variant_iter_loop(iter, "(y)", &value)) { + addr64[i] = value; + i++; + } + g_variant_iter_free(iter); + + DBG(" Result: [%X]", result); + DBG(" EUI(%d) : %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", i, + addr64[0], addr64[1], addr64[2], addr64[3], + addr64[4], addr64[5], addr64[6], addr64[7]); + DBG(" nodeID [0x%04X]", _nodeid); + DBG(" PanID [0x%04X]", _panid); + DBG(" Channel [%d] Tx Power [%d]", _radio_channel, _radio_tx_power); + + if (nodeid) + *nodeid = _nodeid; + if (panid) + *panid = _panid; + if (channel) + *channel = _radio_channel; + if (tx_power) + *tx_power = _radio_tx_power; + + g_variant_unref(variant); + + return result; +} + +int zbl_get_controller_mac_address(zb_ieee_addr addr64) +{ + GVariant *variant = NULL; + GVariantIter *iter = NULL; + GError *dbus_err = NULL; + + char value; + int j = 0; + int result = ZIGBEE_ERROR_NONE; + + DBG("zbl_get_controller_mac_address()"); + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(service_gproxy, "get_mac", + NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get_mac [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + g_variant_get(variant, "(ia(y))", &result, &iter); + RETVM_IF(NULL == iter, ZIGBEE_ERROR_IO_ERROR, "Invalid parameter !"); + + while (g_variant_iter_loop(iter, "(y)", &value)) { + addr64[j] = value; + j++; + } + g_variant_iter_free(iter); + + DBG("IEEE ADDR 0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X, Ret=%d ", + addr64[0], addr64[1], addr64[2], addr64[3], addr64[4], addr64[5], + addr64[6], addr64[7], result); + + g_variant_unref(variant); + + return result; +} + +int zbl_get_cluster_list(zb_ieee_addr eui64, unsigned char endpoint, + unsigned char *in_cluster_count, unsigned short in_cluster_list[], + unsigned char *out_cluster_count, unsigned short out_cluster_list[]) +{ + GVariant *variant = NULL; + GVariantBuilder *mac_builder = NULL; + GVariant *mac_variant = NULL; + GVariantIter *in_cluster_iter = NULL; + GVariantIter *out_cluster_iter = NULL; + GError *dbus_err = NULL; + unsigned short cluster = 0; + int i = 0; + int result = 0; + int ret = ZIGBEE_ERROR_NONE; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); + + mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); + g_variant_builder_add(mac_builder, "(y)", eui64[7]); + g_variant_builder_add(mac_builder, "(y)", eui64[6]); + g_variant_builder_add(mac_builder, "(y)", eui64[5]); + g_variant_builder_add(mac_builder, "(y)", eui64[4]); + g_variant_builder_add(mac_builder, "(y)", eui64[3]); + g_variant_builder_add(mac_builder, "(y)", eui64[2]); + g_variant_builder_add(mac_builder, "(y)", eui64[1]); + g_variant_builder_add(mac_builder, "(y)", eui64[0]); + mac_variant = g_variant_builder_end(mac_builder); + g_variant_builder_unref(mac_builder); + + variant = g_dbus_proxy_call_sync(service_gproxy, "get_cluster_list", + g_variant_new("(@a(y)y)", mac_variant, endpoint), G_DBUS_CALL_FLAGS_NONE, + -1, NULL, &dbus_err); + + if (variant) { + g_variant_get(variant, "(iaqaq)", &result, &in_cluster_iter, &out_cluster_iter); + RETVM_IF(NULL == in_cluster_iter, ZIGBEE_ERROR_IO_ERROR, "Invalid parameter !"); + RETVM_IF(NULL == out_cluster_iter, ZIGBEE_ERROR_IO_ERROR, "Invalid parameter !"); + + DBG("ret = [0x%x]", result); + + /* In clusters */ + while (g_variant_iter_loop(in_cluster_iter, "q", &cluster)) { + DBG("In Cluster 0x%04X", cluster); + in_cluster_list[i++] = cluster; + } + g_variant_iter_free(in_cluster_iter); + *in_cluster_count = i; + if (0 == i) + ERR("No In Clusters for Endpoint %0X", endpoint); + + /* Out clusters */ + i = 0; + while (g_variant_iter_loop(out_cluster_iter, "q", &cluster)) { + DBG("Out Cluster 0x%04X", cluster); + out_cluster_list[i++] = cluster; + } + g_variant_iter_free(out_cluster_iter); + *out_cluster_count = i; + if (0 == i) + ERR("No Out Clusters for Endpoint %0X", endpoint); + + g_variant_unref(variant); + } else { + ERR("No In/Out Clusters for Endpoint %0X [%s]", endpoint, dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + ret = ZIGBEE_ERROR_PERMISSION_DENIED; + else + ret = ZIGBEE_ERROR_NONE; + + g_error_free(dbus_err); + + *in_cluster_count = 0; + *out_cluster_count = 0; + } + + return ret; +} + +int zbl_get_endpoint_list(zb_ieee_addr eui64, unsigned char *count, unsigned char list[]) +{ + GVariant *variant = NULL; + GVariantBuilder *mac_builder = NULL; + GVariant *mac_variant = NULL; + GVariantIter *iter = NULL; + GError *dbus_err = NULL; + unsigned char endpoint; + int i = 0; + int result = 0; + int ret = ZIGBEE_ERROR_NONE; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); + + mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); + g_variant_builder_add(mac_builder, "(y)", eui64[7]); + g_variant_builder_add(mac_builder, "(y)", eui64[6]); + g_variant_builder_add(mac_builder, "(y)", eui64[5]); + g_variant_builder_add(mac_builder, "(y)", eui64[4]); + g_variant_builder_add(mac_builder, "(y)", eui64[3]); + g_variant_builder_add(mac_builder, "(y)", eui64[2]); + g_variant_builder_add(mac_builder, "(y)", eui64[1]); + g_variant_builder_add(mac_builder, "(y)", eui64[0]); + mac_variant = g_variant_builder_end(mac_builder); + g_variant_builder_unref(mac_builder); + + variant = g_dbus_proxy_call_sync(service_gproxy, "get_endpoint_list", + g_variant_new("(@a(y))", mac_variant), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (variant) { + g_variant_get(variant, "(ia(y))", &result, &iter); + RETVM_IF(NULL == iter, ZIGBEE_ERROR_IO_ERROR, "Invalid parameter !"); + + DBG("ret = [0x%x]", result); + + while (g_variant_iter_loop(iter, "(y)", &endpoint)) { + DBG("Endpoint 0x%X", endpoint); + list[i++] = endpoint; + } + g_variant_iter_free(iter); + + if (i > 0) { + *count = i; + DBG("Endpoint Count %d", i); + } else { + ERR("No Endpoints"); + *count = 0; + } + g_variant_unref(variant); + + } else { + ERR("NULL Variant"); + ERR("No Endpoints"); + ERR("[%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + ret = ZIGBEE_ERROR_PERMISSION_DENIED; + + g_error_free(dbus_err); + *count = 0; + } + + return ret; +} + +int zbl_api_get_node_type(zb_ieee_addr eui64, unsigned char *node_type) +{ + GVariant *variant = NULL; + GVariantBuilder *mac_builder = NULL; + int result = ZIGBEE_ERROR_NONE; + GVariant *mac_variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); + + mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); + g_variant_builder_add(mac_builder, "(y)", eui64[7]); + g_variant_builder_add(mac_builder, "(y)", eui64[6]); + g_variant_builder_add(mac_builder, "(y)", eui64[5]); + g_variant_builder_add(mac_builder, "(y)", eui64[4]); + g_variant_builder_add(mac_builder, "(y)", eui64[3]); + g_variant_builder_add(mac_builder, "(y)", eui64[2]); + g_variant_builder_add(mac_builder, "(y)", eui64[1]); + g_variant_builder_add(mac_builder, "(y)", eui64[0]); + mac_variant = g_variant_builder_end(mac_builder); + g_variant_builder_unref(mac_builder); + + variant = g_dbus_proxy_call_sync(service_gproxy, "get_node_type", + g_variant_new("(@a(y))", mac_variant), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'get_node_type' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_get_all_device_info(zb_end_dev_info_h **dev_list, unsigned char* num) +{ + int i = 0; + int j = 0; + int k = 0; + struct zb_end_device_info_s **list; + GVariant *variant = NULL; + GVariantIter *iter = NULL; + GVariantIter *mac_iter = NULL; + GVariantIter *endpoint_iter = NULL; + GError *dbus_err = NULL; + int result = 0; + int ret = ZIGBEE_ERROR_NONE; + unsigned short node_id; + unsigned char node_type; + unsigned char node_mac_address[8] = {0x00}; + unsigned char endpoint_cnt = 0; + unsigned char value; + unsigned char value_endpoint; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); + + /* check the format string when there are no input args */ + variant = g_dbus_proxy_call_sync(service_gproxy, "get_device_info", + NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (variant) { + g_variant_get(variant, "(ia(qyayyay))", &result, &iter); + RETVM_IF(NULL == iter, ZIGBEE_ERROR_IO_ERROR, "Invalid parameter !"); + + DBG("ret = [0x%x]", result); + + list = calloc(MAX_DEVICE_LIST+1, sizeof(zb_end_dev_info_h)); + RETV_IF(NULL == list, ZIGBEE_ERROR_OUT_OF_MEMORY); + for (i = 0; i < MAX_DEVICE_LIST && list; i++) { + list[i] = calloc(1, sizeof(struct zb_end_device_info_s)); + if (NULL == list[i]) { + for (j = 0; j < i; j++) { + if (list[j]) { + free(list[j]); + list[j] = NULL; + } + } + if (list) { + free(list); + list = NULL; + } + g_variant_unref(variant); + return ZIGBEE_ERROR_OUT_OF_MEMORY; + } + } + + i = 0; + while (g_variant_iter_loop(iter, "(qyayyay)", &node_id, &node_type, &mac_iter, + &endpoint_cnt, &endpoint_iter)) { + if (NULL == mac_iter || NULL == endpoint_iter) { + ERR("Invalid parameter !"); + for (j = 0; j <= MAX_DEVICE_LIST; j++) { + if (list[j]) { + free(list[j]); + list[j] = NULL; + } + } + if (list) { + free(list); + list = NULL; + } + g_variant_iter_free(iter); + if (NULL != mac_iter) + g_variant_iter_free(mac_iter); + if (NULL != endpoint_iter) + g_variant_iter_free(endpoint_iter); + g_variant_unref(variant); + return ZIGBEE_ERROR_IO_ERROR; + } + + j = 0; + k = 0; + /* Get Network Address */ + list[i]->addr16 = node_id; + DBG("Node ID: 0x%04X", node_id); + /* Get Node Type */ + list[i]->node_type = node_type; + DBG("Node Type : 0x%02X", node_type); + /* Get End-Point count */ + list[i]->num_of_ep = endpoint_cnt; + DBG("Endpoint Count: 0x%X", endpoint_cnt); + + /* Get End-Point list */ + list[i]->num_of_ep = endpoint_cnt; + while (g_variant_iter_loop(endpoint_iter, "y", &value_endpoint)) { + list[i]->ep[k] = value_endpoint; + DBG("Endpoint : %d", value_endpoint); + k++; + } + g_variant_iter_free(endpoint_iter); + + /* Get IEEE address */ + while (g_variant_iter_loop(mac_iter, "y", &value)) { + node_mac_address[j] = value; + j++; + } + g_variant_iter_free(mac_iter); + + memcpy(list[i]->addr64, node_mac_address, sizeof(zb_ieee_addr)); + DBG("Node MAC Addr : %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", + node_mac_address[0], node_mac_address[1], node_mac_address[2], + node_mac_address[3], node_mac_address[4], node_mac_address[5], + node_mac_address[6], node_mac_address[7]); + i++; + } + if (0 == i) + ERR("No attached nodes"); + + *num = i; + *dev_list = (void **)list; + + g_variant_iter_free(iter); + g_variant_unref(variant); + } else { + ERR("NULL Variant [%s]", dbus_err->message); + ERR("No attached nodes"); + if (strstr(dbus_err->message, "AccessDenied")) + ret = ZIGBEE_ERROR_PERMISSION_DENIED; + + g_error_free(dbus_err); + *num = 0; + } + + return ret; +} + +int zbl_coex_start(unsigned char channel) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(service_gproxy, "coex_start", g_variant_new("(y)", channel), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'coex_start' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_coex_stop(void) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + DBG("zbl_coex_stop()"); + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(service_gproxy, "coex_stop", NULL, + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'coex_stop' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_form_network(zb_zigbee_h handle, zb_form_network_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(service_gproxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_SERVICE_INTERFACE, "form_network_done", ZIGBEE_SERVICE_OBJECT_PATH, NULL, 0, + _zbl_response_cb, container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + free(container); + container = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_SERVICE_FORM_NETWORK; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + variant = g_dbus_proxy_call_sync(service_gproxy, "form_network", NULL, + G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'form_network' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_disable_network(zb_zigbee_h handle, zb_disable_network_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_disable_network()"); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(service_gproxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_SERVICE_INTERFACE, "disable_network_done", ZIGBEE_SERVICE_OBJECT_PATH, NULL, 0, + _zbl_response_cb, container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + free(container); + container = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_SERVICE_DISABLE_NETWORK; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + variant = g_dbus_proxy_call_sync(service_gproxy, "leave_network", NULL, + G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'leave_network' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_leave_device(zb_ieee_addr addr64, bool remove_children, bool rejoin) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + GVariantBuilder *mac_builder = NULL; + GVariant* mac_variant = NULL; + unsigned char _remove_children = (remove_children) ? 1 : 0; + unsigned char _rejoin = (rejoin) ? 1 : 0; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("IEEE Address = %X:%X:%X:%X:%X:%X:%X:%X", + addr64[0], addr64[1], addr64[2], addr64[3], + addr64[4], addr64[5], addr64[6], addr64[7]); + + mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); + g_variant_builder_add(mac_builder, "(y)", addr64[7]); + g_variant_builder_add(mac_builder, "(y)", addr64[6]); + g_variant_builder_add(mac_builder, "(y)", addr64[5]); + g_variant_builder_add(mac_builder, "(y)", addr64[4]); + g_variant_builder_add(mac_builder, "(y)", addr64[3]); + g_variant_builder_add(mac_builder, "(y)", addr64[2]); + g_variant_builder_add(mac_builder, "(y)", addr64[1]); + g_variant_builder_add(mac_builder, "(y)", addr64[0]); + mac_variant = g_variant_builder_end(mac_builder); + g_variant_builder_unref(mac_builder); + + variant = g_dbus_proxy_call_sync(service_gproxy, "leave_request", + g_variant_new("(@a(y)yy)", mac_variant, _remove_children, _rejoin), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'leave_request' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_permit_join(unsigned char duration, bool broadcast) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(service_gproxy, "permit_join", + g_variant_new("(ib)", duration, broadcast), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'permit_join' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_nwk_addr_req(zb_zigbee_h handle, zb_ieee_addr addr64, unsigned char request_type, + unsigned char start_idx, zb_zdo_addr_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + GVariantBuilder *mac_builder = NULL; + GVariant* mac_variant = NULL; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG(" zbl_nwk_addr_req()"); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zdo_dev_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "nwk_addr_rsp", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container, + _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + free(container); + container = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZDO_NWK_ADDR_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); + g_variant_builder_add(mac_builder, "(y)", addr64[7]); + g_variant_builder_add(mac_builder, "(y)", addr64[6]); + g_variant_builder_add(mac_builder, "(y)", addr64[5]); + g_variant_builder_add(mac_builder, "(y)", addr64[4]); + g_variant_builder_add(mac_builder, "(y)", addr64[3]); + g_variant_builder_add(mac_builder, "(y)", addr64[2]); + g_variant_builder_add(mac_builder, "(y)", addr64[1]); + g_variant_builder_add(mac_builder, "(y)", addr64[0]); + mac_variant = g_variant_builder_end(mac_builder); + g_variant_builder_unref(mac_builder); + + variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "nwk_addr_req", + g_variant_new("(@a(y)yy)", mac_variant, request_type, start_idx), + G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'nwk_addr_req' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_ieee_addr_req(zb_zigbee_h handle, zb_nwk_addr addr16, zb_zdo_addr_cb cb, + void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_ieee_addr_req()"); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zdo_dev_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "nwk_addr_rsp", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, + _zbl_response_cb, container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + free(container); + container = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZDO_NWK_ADDR_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "ieee_addr_req", g_variant_new("(q)", addr16), + G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'ieee_addr_req' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_active_ep(zb_zigbee_h handle, zb_nwk_addr addr16, zb_zdo_active_ep_cb cb, + void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_active_ep()"); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zdo_dev_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "active_ep_rsp", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, + _zbl_response_cb, container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + free(container); + container = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZDO_ACTIVE_EP_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "active_ep_req", + g_variant_new("(q)", addr16), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'active_ep_req' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_simple_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep, + zb_zdo_simple_desc_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_simple_desc_req() : [%X]", addr16); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zdo_dev_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "simple_desc_rsp", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, + _zbl_response_cb, container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + free(container); + container = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZDO_SIMPLE_DESC_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "simple_desc_req", + g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'simple_desc_req' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_extended_simple_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char start_idx, zb_zdo_extended_simple_desc_cb cb, void *user_data) +{ + return ZIGBEE_ERROR_NOT_SUPPORTED; +} + +int zbl_match_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned short profileid, unsigned char num_in_clusters, + unsigned short *in_clusters, unsigned char num_out_clusters, + unsigned short *out_clusters, zb_zdo_match_desc_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + int i; + GVariantBuilder *incl_builder = NULL; + GVariant* incl_variant = NULL; + GVariantBuilder *outcl_builder = NULL; + GVariant* outcl_variant = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_match_desc_req()"); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zdo_dev_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "matched_descriptor_rsp", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, + _zbl_response_cb, container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + free(container); + container = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZDO_MATCHED_DESCRIPTOR_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + incl_builder = g_variant_builder_new(G_VARIANT_TYPE("aq")); + for (i = 0; i < num_in_clusters; i++) + g_variant_builder_add(incl_builder, "q", in_clusters[i]); + + outcl_builder = g_variant_builder_new(G_VARIANT_TYPE("aq")); + for (i = 0; i < num_out_clusters; i++) + g_variant_builder_add(outcl_builder, "q", out_clusters[i]); + + incl_variant = g_variant_builder_end(incl_builder); + outcl_variant = g_variant_builder_end(outcl_builder); + g_variant_builder_unref(incl_builder); + g_variant_builder_unref(outcl_builder); + + variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "matched_descriptor_req", + g_variant_new("(qqy@aqy@aq)", addr16, profileid, num_in_clusters, + incl_variant, num_out_clusters, outcl_variant), + G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'matched_descriptor_req' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_node_desc_req(zb_nwk_addr addr16, zb_zdo_node_desc_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_node_desc_req()"); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zdo_dev_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "node_desc_rsp", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, + _zbl_response_cb, container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + free(container); + container = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZDO_NODE_DESC_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "node_desc_req", + g_variant_new("(q)", addr16), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'node_desc_req' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_power_desc_req(zb_nwk_addr addr16, zb_zdo_power_desc_cb cb, + void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zdo_dev_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "power_desc_rsp", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, + _zbl_response_cb, container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + free(container); + container = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZDO_POWER_DESC_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "power_desc_req", + g_variant_new("(q)", addr16), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'power_desc_req' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_complex_desc_req(zb_nwk_addr addr16, zb_zdo_complex_desc_cb cb, + void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zdo_dev_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "complex_desc_rsp", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, + _zbl_response_cb, container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + free(container); + container = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZDO_COMPLEX_DESC_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "complex_desc_req", + g_variant_new("(q)", addr16), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'complex_desc_req' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_user_desc_req(zb_nwk_addr addr16, zb_zdo_user_desc_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zdo_dev_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "user_desc_rsp", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, + _zbl_response_cb, container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + free(container); + container = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZDO_USER_DESC_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "user_desc_req", + g_variant_new("(q)", addr16), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'user_desc_req' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +#define MAX_USER_DESC_SIZE 0x10 +#define USER_DESC_COMMAND_SIZE 20 + +int zbl_user_desc_set(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char len, + unsigned char *user_desc, zb_zdo_user_desc_conf_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + unsigned char j = 0x00; + GVariantBuilder *user_desc_builder = NULL; + GVariant *user_desc_variant = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); + RETVM_IF(len > MAX_USER_DESC_SIZE, ZIGBEE_ERROR_INVALID_PARAMETER, + "invalid length=%d", len); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zdo_dev_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "user_desc_confirm", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, + _zbl_response_cb, container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + free(container); + container = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZDO_USER_DESC_SET_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + user_desc_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); + for (j = 0; j < len; j++) + g_variant_builder_add(user_desc_builder, "(y)", user_desc[j]); + + user_desc_variant = g_variant_builder_end(user_desc_builder); + g_variant_builder_unref(user_desc_builder); + + variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "user_desc_set_req", + g_variant_new("(qy@a(y))", addr16, len, user_desc_variant), + G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'user_desc_set_req' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_device_annce(zb_zigbee_h handle, zb_nwk_addr addr16, zb_ieee_addr addr64, + unsigned char capability) +{ + int result = ZIGBEE_ERROR_NONE; + GError *dbus_err = NULL; + GVariant *variant = NULL; + + GVariantBuilder *mac_builder = NULL; + GVariant* mac_variant = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); + + mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); + g_variant_builder_add(mac_builder, "(y)", addr64[7]); + g_variant_builder_add(mac_builder, "(y)", addr64[6]); + g_variant_builder_add(mac_builder, "(y)", addr64[5]); + g_variant_builder_add(mac_builder, "(y)", addr64[4]); + g_variant_builder_add(mac_builder, "(y)", addr64[3]); + g_variant_builder_add(mac_builder, "(y)", addr64[2]); + g_variant_builder_add(mac_builder, "(y)", addr64[1]); + g_variant_builder_add(mac_builder, "(y)", addr64[0]); + mac_variant = g_variant_builder_end(mac_builder); + g_variant_builder_unref(mac_builder); + + variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "device_announce", + g_variant_new("(q@a(y)y)", addr16, mac_variant, capability), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'device_announce' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_bind_req(zb_nwk_addr dst_addr16, zb_ieee_addr src_addr64, + unsigned char src_ep, unsigned short clusterid, zb_ieee_addr dst_addr64, + unsigned char type, zb_nwk_addr group_addr, unsigned char dst_ep, + zb_zdo_bind_cb cb, void *user_data) +{ + int i; + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GError *dbus_err = NULL; + GVariant *variant = NULL; + + GVariantBuilder *src_addr64_builder = NULL; + GVariant* src_addr64_variant = NULL; + GVariantBuilder *dst_addr64_builder = NULL; + GVariant* dst_addr64_variant = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zdo_bind_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_zdo_bind_req()"); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zdo_bind_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZDO_BIND_INTERFACE, "bind_rsp", ZIGBEE_CONTROL_OBJECT_PATH, + NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup); + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + free(container); + container = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZDO_BIND_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + src_addr64_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); + + if (src_addr64) { + for (i = sizeof(zb_ieee_addr) - 1 ; i >= 0; i--) + g_variant_builder_add(src_addr64_builder, "(y)", src_addr64[i]); + } + src_addr64_variant = g_variant_builder_end(src_addr64_builder); + g_variant_builder_unref(src_addr64_builder); + + dst_addr64_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); + if (dst_addr64) { + for (i = sizeof(zb_ieee_addr) - 1 ; i >= 0; i--) + g_variant_builder_add(dst_addr64_builder, "(y)", dst_addr64[i]); + } + dst_addr64_variant = g_variant_builder_end(dst_addr64_builder); + g_variant_builder_unref(dst_addr64_builder); + + variant = g_dbus_proxy_call_sync(zdo_bind_proxy, "bind_req", + g_variant_new("(q@a(y)yq@a(y)yqy)", dst_addr16, src_addr64_variant, src_ep, + clusterid, dst_addr64_variant, type, group_addr, dst_ep), + G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'bind_req' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_unbind_req(zb_nwk_addr dst_addr16, + zb_ieee_addr src_addr64, unsigned char src_ep, unsigned short clusterid, + zb_ieee_addr dst_addr64, unsigned char type, zb_nwk_addr group_addr, + unsigned char dst_ep, zb_zdo_unbind_cb cb, void *user_data) +{ + int i; + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GError *dbus_err = NULL; + GVariant *variant = NULL; + + GVariantBuilder *src_addr64_builder = NULL; + GVariant* src_addr64_variant = NULL; + GVariantBuilder *dst_addr64_builder = NULL; + GVariant* dst_addr64_variant = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zdo_bind_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_zdo_unbind_req()"); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zdo_bind_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZDO_BIND_INTERFACE, "unbind_rsp", ZIGBEE_CONTROL_OBJECT_PATH, + NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup); + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + free(container); + container = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZDO_UNBIND_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + src_addr64_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); + if (src_addr64) { + for (i = sizeof(zb_ieee_addr) - 1 ; i >= 0; i--) + g_variant_builder_add(src_addr64_builder, "(y)", src_addr64[i]); + } + src_addr64_variant = g_variant_builder_end(src_addr64_builder); + g_variant_builder_unref(src_addr64_builder); + + dst_addr64_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); + if (dst_addr64) { + for (i = sizeof(zb_ieee_addr) - 1 ; i >= 0; i--) + g_variant_builder_add(dst_addr64_builder, "(y)", dst_addr64[i]); + } + dst_addr64_variant = g_variant_builder_end(dst_addr64_builder); + g_variant_builder_unref(dst_addr64_builder); + + variant = g_dbus_proxy_call_sync(zdo_bind_proxy, "unbind_req", + g_variant_new("(q@a(y)yq@a(y)yqy)", dst_addr16, src_addr64_variant, src_ep, + clusterid, dst_addr64_variant, type, group_addr, dst_ep), + G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'unbind_req' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_mgmt_nwk_disc_req(zb_nwk_addr addr16, unsigned int scan_channels, + unsigned char scan_duration, unsigned char scan_count, unsigned char start_idx, + zb_zdo_mgmt_nwk_disc_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_mgmt_nwk_disc_req()"); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zdo_dev_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "mgmt_nwk_disc_rsp", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, + container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + free(container); + container = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZDO_MGMT_NWK_DISC_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_nwk_disc_req", + g_variant_new("(quyqy)", addr16, scan_channels, scan_duration, scan_count, start_idx), + G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'mgmt_nwk_disc_req' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_mgmt_nwk_update_req(unsigned int scan_channels, unsigned char scan_duration, + unsigned char scan_count, unsigned char nwk_update_id, zb_nwk_addr nwk_manager_addr) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_mgmt_nwk_update_req()"); + + variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_nwk_update_req", + g_variant_new("(quyyy)", nwk_manager_addr, scan_channels, scan_duration, + scan_count, nwk_update_id), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'mgmt_nwk_update_req' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_mgmt_lqi_req(zb_nwk_addr addr16, unsigned char start_idx, + zb_zdo_mgmt_lqi_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_mgmt_lqi_req()"); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zdo_dev_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "mgmt_lqi_rsp", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container, + _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + free(container); + container = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZDO_MGMT_LQI_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_lqi_req", + g_variant_new("(qy)", addr16, start_idx), + G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'mgmt_lqi_req' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_mgmt_rtg_req(zb_nwk_addr addr16, unsigned char start_idx, + zb_zdo_mgmt_rtg_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_mgmt_rtg_req()"); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zdo_dev_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "mgmt_rtg_rsp", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container, + _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + free(container); + container = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZDO_MGMT_RTG_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_rtg_req", + g_variant_new("(qy)", addr16, start_idx), + G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'mgmt_rtg_req' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_mgmt_bind_req(zb_nwk_addr addr16, unsigned char start_idx, + zb_zdo_mgmt_bind_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_mgmt_bind_req()"); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zdo_dev_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "mgmt_bind_rsp", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container, + _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + free(container); + container = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZDO_MGMT_BIND_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_bind_req", + g_variant_new("(qy)", addr16, start_idx), + G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'mgmt_bind_req' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_mgmt_leave_device(zb_ieee_addr addr64, unsigned char remove_children, + unsigned rejoin, zb_zdo_mgmt_leave_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + GVariantBuilder *mac_builder = NULL; + GVariant* mac_variant = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zdo_dev_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "mgmt_leave_rsp", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container, + _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + free(container); + container = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZDO_MGMT_LEAVE_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); + g_variant_builder_add(mac_builder, "(y)", addr64[7]); + g_variant_builder_add(mac_builder, "(y)", addr64[6]); + g_variant_builder_add(mac_builder, "(y)", addr64[5]); + g_variant_builder_add(mac_builder, "(y)", addr64[4]); + g_variant_builder_add(mac_builder, "(y)", addr64[3]); + g_variant_builder_add(mac_builder, "(y)", addr64[2]); + g_variant_builder_add(mac_builder, "(y)", addr64[1]); + g_variant_builder_add(mac_builder, "(y)", addr64[0]); + mac_variant = g_variant_builder_end(mac_builder); + g_variant_builder_unref(mac_builder); + + variant = g_dbus_proxy_call_sync(service_gproxy, "leave_request", + g_variant_new("(@a(y)yy)", mac_variant, remove_children, rejoin), + G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'leave_request' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_mgmt_permit_joining_req(zb_nwk_addr addr16, unsigned char duration, + unsigned char tc_significance, zb_zdo_mgmt_permit_joining_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zdo_dev_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "mgmt_permit_join_rsp", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, + container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + free(container); + container = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZDO_MGMT_PERMIT_JOIN_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_permit_join_req", + g_variant_new("(qyy)", addr16, duration, tc_significance), + G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'mgmt_permit_join_req' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_aps_send(zb_nwk_addr addr16, unsigned char aps_fc, + unsigned char src_ep, unsigned char dst_ep, unsigned short clusterid, + unsigned short profileid, unsigned char zcl_fc, unsigned short mfg_code, + unsigned char cmd_id, unsigned short payload_len, unsigned char *payload, + zb_aps_send_cb cb, void *user_data) +{ + int sub_id, to, i; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + GVariantBuilder *payload_builder = NULL; + GVariant *payload_variant = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == custom_gproxy, ZIGBEE_ERROR_IO_ERROR); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(custom_gproxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_CUSTOM_INTERFACE, "aps_send_rsp", ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, + _zbl_response_cb, container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + free(container); + container = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_CUSTOM_APS_SEND_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + payload_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); + if (payload_len > 0) { + for (i = payload_len - 1; i >= 0 ; i--) + g_variant_builder_add(payload_builder, "(y)", payload[i]); + } + payload_variant = g_variant_builder_end(payload_builder); + g_variant_builder_unref(payload_builder); + + variant = g_dbus_proxy_call_sync(custom_gproxy, "aps_send", + g_variant_new("(qyyyqqyqyq@a(y))", addr16, aps_fc, src_ep, dst_ep, + clusterid, profileid, zcl_fc, mfg_code, cmd_id, payload_len, + payload_variant), + G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'aps_send' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_zcl_send(zb_nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep, + unsigned short clusterid, unsigned char zcl_fc, unsigned char cmd, + unsigned short payload_len, unsigned char *payload, + zb_zcl_send_cb cb, void *user_data) +{ + int sub_id, to, i; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + GVariantBuilder *payload_builder = NULL; + GVariant *payload_variant = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == custom_gproxy, ZIGBEE_ERROR_IO_ERROR); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(custom_gproxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_CUSTOM_INTERFACE, "zcl_send_rsp", ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, + _zbl_response_cb, container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + free(container); + container = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_CUSTOM_ZCL_SEND_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + payload_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); + if (payload_len > 0) { + for (i = payload_len - 1; i >= 0 ; i--) + g_variant_builder_add(payload_builder, "(y)", payload[i]); + } + payload_variant = g_variant_builder_end(payload_builder); + g_variant_builder_unref(payload_builder); + + variant = g_dbus_proxy_call_sync(custom_gproxy, "zcl_send", + g_variant_new("(qyyqyyq@a(y))", addr16, src_ep, dst_ep, clusterid, zcl_fc, + cmd, payload_len, payload_variant), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'zcl_send' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_send_to_local(unsigned short length, unsigned char *data, + zb_send_to_local_cb cb, void *user_data) +{ + int sub_id, to, i; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + GVariantBuilder *payload_builder = NULL; + GVariant *payload_variant = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == custom_gproxy, ZIGBEE_ERROR_IO_ERROR); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(custom_gproxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_CUSTOM_INTERFACE, "send_to_local_rsp", ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, + _zbl_response_cb, container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + free(container); + container = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_CUSTOM_LOCAL_SEND_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + payload_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); + if (length > 0) { + for (i = length - 1; i >= 0 ; i--) + g_variant_builder_add(payload_builder, "(y)", data[i]); + } + payload_variant = g_variant_builder_end(payload_builder); + g_variant_builder_unref(payload_builder); + + variant = g_dbus_proxy_call_sync(custom_gproxy, "send_to_local", + g_variant_new("(q@a(y))", length, payload_variant), + G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'send_to_local' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_read_attr_req(zb_zigbee_h handle, unsigned short addr16, unsigned char dest_ep, + unsigned char zcl_fc, unsigned short clusterid, unsigned short *attribute_ids, + int attribute_ids_len, zb_zcl_global_attr_read_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + +#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC + zb_event_global_default_rsp_s *global_req = NULL; +#endif + + int i = 0; + unsigned char *t; + GVariant *attr_variant = NULL; + GVariantBuilder *attr_builder = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_read_attr_req()"); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zcl_global_proxy); + sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, + ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "read_attributes_rsp", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, + _zbl_response_cb, container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + free(container); + container = NULL; + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZCL_GLOBAL_READ_ATTRIBUTE_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; +#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC + global_req = calloc(1, sizeof(zb_event_global_default_rsp_s)); + if (NULL == global_req) { + g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id); + g_source_remove(container->tid); + container->tid = 0; + free(container); + container = NULL; + ERR("calloc() Fail(%d)", errno); + return ZIGBEE_ERROR_OUT_OF_MEMORY; + } + global_req->ep = dest_ep; + global_req->clusterid = clusterid; + global_req->commandid = ZB_ZCL_CMD_READ_ATTRIBUTES; + + container->global_cmd = global_req; + container->handle = handle; + + /* Register global request information into handle */ + _zbl_register_global_req(handle, container); +#endif + + t = (unsigned char *)attribute_ids; + attr_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); + for (i = 0; i < attribute_ids_len*sizeof(unsigned short); i++) + g_variant_builder_add(attr_builder, "(y)", t[i]); + attr_variant = g_variant_builder_end(attr_builder); + g_variant_builder_unref(attr_builder); + + variant = g_dbus_proxy_call_sync(zcl_global_proxy, "read_attributes_req", + g_variant_new("(@a(y)iqqyy)", attr_variant, attribute_ids_len, + addr16, clusterid, zcl_fc, dest_ep), G_DBUS_CALL_FLAGS_NONE, to, + NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'read_attributes_req' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_write_attr_req(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char src_ep, + unsigned char dst_ep, unsigned char zcl_fc, unsigned short clusterid, + void **data, int count, zb_zcl_global_attr_write_cb cb, + void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + struct write_attribute_record_s **records = (struct write_attribute_record_s **)data; + +#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC + zb_event_global_default_rsp_s *global_req = NULL; +#endif + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_write_attr_req()"); + + GVariantBuilder *rec_builder = NULL; + GVariant *rec_variant = NULL; + + int i = 0; + int j = 0; + + char dSize[3] = {'\0', '\0'}; + int writeAttributeIndex = 0; + int size_of_allo = 0; + + unsigned char *isString = NULL; + unsigned short *dataSize = NULL; + unsigned char *writeAttribute = NULL; + + isString = calloc(count + 1, sizeof(unsigned char)); + RETVM_IF(NULL == isString, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + dataSize = calloc(count + 1, sizeof(unsigned short)); + if (NULL == dataSize) { + ERR("calloc() Fail(%d)", errno); + if (isString) { + free(isString); + isString = NULL; + } + return ZIGBEE_ERROR_OUT_OF_MEMORY; + } + + DBG("Records Length %d", count); + + while (j < count) { + dataSize[j] = zb_zcl_get_data_size((*records)[j].type); + + if (0xff != dataSize[j]) { + + isString[j] = 0; + size_of_allo = size_of_allo + (dataSize[j] + 3); + + } else { + if ((*records)[j].value) { + if ((*records)[j].type == ZB_ZCL_CHARACTER_STRING + || (*records)[j].type == ZB_ZCL_OCTET_STRING) { + + isString[j] = 1; + dataSize[j] = (*records)[j].value[0]; + size_of_allo = size_of_allo + (dataSize[j] + 3 + 1); + + } else if ((*records)[j].type == ZB_ZCL_LONG_OCTET_STRING + || (*records)[j].type == ZB_ZCL_LONG_CHARACTER_STRING) { + + isString[j] = 2; + dSize[0] = (*records)[j].value[0]; + dSize[1] = (*records)[j].value[1]; + dataSize[j] = dSize[1]; + dataSize[j] = (dataSize[j] << 8) | dSize[0]; + size_of_allo = size_of_allo + (dataSize[j] + 3 + 2); + } + } else + ERR("Data is not present"); + } + j++; + } + DBG("size_of_allo Length %d", size_of_allo); + + writeAttribute = calloc(size_of_allo + 1, sizeof(unsigned char)); + if (NULL == writeAttribute) { + ERR("Couldn't Allocate Memory"); + if (isString) { + free(isString); + isString = NULL; + } + if (dataSize) { + free(dataSize); + dataSize = NULL; + } + return ZIGBEE_ERROR_OUT_OF_MEMORY; + } + + j = 0; + while (j < count && writeAttributeIndex < size_of_allo) { + writeAttribute[writeAttributeIndex++] = ((*records)[j].id) & 0xff; + writeAttribute[writeAttributeIndex++] = (((*records)[j].id) >> 8) & 0xff; + writeAttribute[writeAttributeIndex++] = (*records)[j].type; + for (i = 0; i < (dataSize[j] + isString[j]); i++) { + writeAttribute[writeAttributeIndex++] = (*records)[j].value[i]; + DBG("0x%02X", (*records)[j].value[i]); + } + j++; + } + + rec_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); + DBG(" "); + for (i = 0; i < writeAttributeIndex ; i++) { + DBG("0x%02X", writeAttribute[i]); + g_variant_builder_add(rec_builder, "(y)", writeAttribute[i]); + } + + rec_variant = g_variant_builder_end(rec_builder); + g_variant_builder_unref(rec_builder); + + container = calloc(1, sizeof(zbl_req_cb_s)); + if (NULL == container) { + ERR("calloc() Fail(%d)", errno); + if (isString) { + free(isString); + isString = NULL; + } + if (dataSize) { + free(dataSize); + dataSize = NULL; + } + if (writeAttribute) { + free(writeAttribute); + writeAttribute = NULL; + } + return ZIGBEE_ERROR_OUT_OF_MEMORY; + } + + to = zbl_dbus_get_timeout(zcl_global_proxy); + sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, + ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "write_attributes_rsp", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, + container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + if (isString) { + free(isString); + isString = NULL; + } + if (dataSize) { + free(dataSize); + dataSize = NULL; + } + if (writeAttribute) { + free(writeAttribute); + writeAttribute = NULL; + } + if (container) { + free(container); + container = NULL; + } + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; +#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC + global_req = calloc(1, sizeof(zb_event_global_default_rsp_s)); + if (NULL == global_req) { + g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id); + g_source_remove(container->tid); + container->tid = 0; + if (isString) { + free(isString); + isString = NULL; + } + if (dataSize) { + free(dataSize); + dataSize = NULL; + } + if (writeAttribute) { + free(writeAttribute); + writeAttribute = NULL; + } + if (container) { + free(container); + container = NULL; + } + ERR("calloc() Fail(%d)", errno); + return ZIGBEE_ERROR_OUT_OF_MEMORY; + } + global_req->ep = dst_ep; + global_req->clusterid = clusterid; + global_req->commandid = ZB_ZCL_CMD_WRITE_ATTRIBUTES; + + container->global_cmd = global_req; + container->handle = handle; + + /* Register global request information into handle */ + _zbl_register_global_req(handle, container); +#endif + + variant = g_dbus_proxy_call_sync(zcl_global_proxy, "write_attributes_req", + g_variant_new("(@a(y)iqqyyy)", rec_variant, writeAttributeIndex, addr16, + clusterid, zcl_fc, src_ep, dst_ep), G_DBUS_CALL_FLAGS_NONE, + to, NULL, &dbus_err); + + if (isString) { + free(isString); + isString = NULL; + } + if (dataSize) { + free(dataSize); + dataSize = NULL; + } + if (writeAttribute) { + free(writeAttribute); + writeAttribute = NULL; + } + + if (!variant) { + ERR("Failed to get 'write_attributes_req' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_wattr_undivided_req(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, + unsigned short clusterid, void **data, int count, + zb_zcl_global_attr_write_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + struct write_attribute_record_s **records = (struct write_attribute_record_s **)data; + +#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC + zb_event_global_default_rsp_s *global_req = NULL; +#endif + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_wattr_undivided_req()"); + + GVariantBuilder *rec_builder = NULL; + GVariant *rec_variant = NULL; + + int i = 0; + int j = 0; + + char dSize[3] = {'\0', '\0'}; + int writeAttributeIndex = 0; + int size_of_allo = 0; + + unsigned char *isString = NULL; + unsigned short *dataSize = NULL; + unsigned char *writeAttribute = NULL; + + isString = calloc(count + 1, sizeof(unsigned char)); + RETVM_IF(NULL == isString, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + dataSize = calloc(count + 1, sizeof(unsigned short)); + if (NULL == dataSize) { + ERR("calloc() Fail(%d)", errno); + free(isString); + return ZIGBEE_ERROR_OUT_OF_MEMORY; + } + + DBG("Records Length %d", count); + + while (j < count) { + dataSize[j] = zb_zcl_get_data_size((*records)[j].type); + if (0xff != dataSize[j]) { + isString[j] = 0; + size_of_allo = size_of_allo + (dataSize[j] + 3); + } else { + if ((*records)[j].value) { + if ((*records)[j].type == ZB_ZCL_CHARACTER_STRING + || (*records)[j].type == ZB_ZCL_OCTET_STRING) { + isString[j] = 1; + dataSize[j] = (*records)[j].value[0]; + size_of_allo = size_of_allo + (dataSize[j] + 3 + 1); + } else if ((*records)[j].type == ZB_ZCL_LONG_OCTET_STRING + || (*records)[j].type == ZB_ZCL_LONG_CHARACTER_STRING) { + isString[j] = 2; + dSize[0] = (*records)[j].value[0]; + dSize[1] = (*records)[j].value[1]; + dataSize[j] = dSize[1]; + dataSize[j] = (dataSize[j] << 8) | dSize[0]; + size_of_allo = size_of_allo + (dataSize[j] + 3 + 2); + } + } else + ERR("Data is not present"); + } + j++; + } + DBG("size_of_allo Length %d", size_of_allo); + + writeAttribute = calloc(size_of_allo + 1, sizeof(unsigned char)); + if (NULL == writeAttribute) { + ERR("Couldn't Allocate Memory"); + if (isString) { + free(isString); + isString = NULL; + } + if (dataSize) { + free(dataSize); + dataSize = NULL; + } + return ZIGBEE_ERROR_OUT_OF_MEMORY; + } + + j = 0; + while (j < count && writeAttributeIndex < size_of_allo) { + writeAttribute[writeAttributeIndex++] = ((*records)[j].id) & 0xff; + writeAttribute[writeAttributeIndex++] = (((*records)[j].id) >> 8) & 0xff; + writeAttribute[writeAttributeIndex++] = (*records)[j].type; + for (i = 0; i < (dataSize[j] + isString[j]); i++) { + writeAttribute[writeAttributeIndex++] = (*records)[j].value[i]; + DBG("0x%02X", (*records)[j].value[i]); + } + j++; + } + + rec_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); + DBG(" "); + for (i = 0; i < writeAttributeIndex ; i++) { + DBG("0x%02X", writeAttribute[i]); + g_variant_builder_add(rec_builder, "(y)", writeAttribute[i]); + } + + rec_variant = g_variant_builder_end(rec_builder); + g_variant_builder_unref(rec_builder); + + container = calloc(1, sizeof(zbl_req_cb_s)); + if (NULL == container) { + ERR("calloc() Fail(%d)", errno); + if (isString) { + free(isString); + isString = NULL; + } + if (dataSize) { + free(dataSize); + dataSize = NULL; + } + if (writeAttribute) { + free(writeAttribute); + writeAttribute = NULL; + } + return ZIGBEE_ERROR_OUT_OF_MEMORY; + } + + to = zbl_dbus_get_timeout(zcl_global_proxy); + sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, + ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "write_attributes_rsp", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, + container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + if (isString) { + free(isString); + isString = NULL; + } + if (dataSize) { + free(dataSize); + dataSize = NULL; + } + if (writeAttribute) { + free(writeAttribute); + writeAttribute = NULL; + } + if (container) { + free(container); + container = NULL; + } + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; +#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC + global_req = calloc(1, sizeof(zb_event_global_default_rsp_s)); + if (NULL == global_req) { + g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id); + g_source_remove(container->tid); + container->tid = 0; + if (isString) { + free(isString); + isString = NULL; + } + if (dataSize) { + free(dataSize); + dataSize = NULL; + } + if (writeAttribute) { + free(writeAttribute); + writeAttribute = NULL; + } + if (container) { + free(container); + container = NULL; + } + ERR("calloc() Fail(%d)", errno); + return ZIGBEE_ERROR_OUT_OF_MEMORY; + } + global_req->ep = dst_ep; + global_req->clusterid = clusterid; + global_req->commandid = ZB_ZCL_CMD_WRITE_ATTRIBUTES_UNDIVIDED; + + container->global_cmd = global_req; + container->handle = handle; + + /* Register global request information into handle */ + _zbl_register_global_req(handle, container); +#endif + + variant = g_dbus_proxy_call_sync(zcl_global_proxy, "write_attributes_undivided_req", + g_variant_new("(@a(y)iqqyyy)", rec_variant, writeAttributeIndex, addr16, + clusterid, zcl_fc, src_ep, dst_ep), G_DBUS_CALL_FLAGS_NONE, + to, NULL, &dbus_err); + + if (isString) { + free(isString); + isString = NULL; + } + if (dataSize) { + free(dataSize); + dataSize = NULL; + } + if (writeAttribute) { + free(writeAttribute); + writeAttribute = NULL; + } + + if (!variant) { + ERR("Failed to get 'write_attributes_undivided_req' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_wattr_req_no_cb(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char src_ep, + unsigned char dst_ep, unsigned char zcl_fc, unsigned short clusterid, + void **data, int count) +{ + int result = ZIGBEE_ERROR_NONE; + GError *dbus_err = NULL; + GVariant *variant = NULL; + + struct write_attribute_record_s **records = (struct write_attribute_record_s **)data; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_wattr_req_no_cb()"); + + GVariantBuilder *rec_builder = NULL; + GVariant *rec_variant = NULL; + + int i = 0; + int j = 0; + + char dSize[3] = {'\0', '\0'}; + int writeAttributeIndex = 0; + int size_of_allo = 0; + + unsigned char *isString = NULL; + unsigned short *dataSize = NULL; + unsigned char *writeAttribute = NULL; + + isString = calloc(count + 1, sizeof(unsigned char)); + RETVM_IF(NULL == isString, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + dataSize = calloc(count + 1, sizeof(unsigned short)); + if (NULL == dataSize) { + ERR("calloc() Fail(%d)", errno); + if (isString) { + free(isString); + isString = NULL; + } + return ZIGBEE_ERROR_OUT_OF_MEMORY; + } + + DBG("Records Length %d", count); + + while (j < count) { + dataSize[j] = zb_zcl_get_data_size((*records)[j].type); + if (0xff != dataSize[j]) { + isString[j] = 0; + size_of_allo = size_of_allo + (dataSize[j] + 3); + } else { + if ((*records)[j].value) { + if ((*records)[j].type == ZB_ZCL_CHARACTER_STRING + || (*records)[j].type == ZB_ZCL_OCTET_STRING) { + isString[j] = 1; + dataSize[j] = (*records)[j].value[0]; + size_of_allo = size_of_allo + (dataSize[j] + 3 + 1); + } else if ((*records)[j].type == ZB_ZCL_LONG_OCTET_STRING + || (*records)[j].type == ZB_ZCL_LONG_CHARACTER_STRING) { + isString[j] = 2; + dSize[0] = (*records)[j].value[0]; + dSize[1] = (*records)[j].value[1]; + dataSize[j] = dSize[1]; + dataSize[j] = (dataSize[j] << 8) | dSize[0]; + size_of_allo = size_of_allo + (dataSize[j] + 3 + 2); + } + } else + ERR("Data is not present"); + } + j++; + } + DBG("size_of_allo Length %d", size_of_allo); + + writeAttribute = calloc(size_of_allo + 1, sizeof(unsigned char)); + if (NULL == writeAttribute) { + ERR("Couldn't Allocate Memory"); + if (isString) { + free(isString); + isString = NULL; + } + if (dataSize) { + free(dataSize); + dataSize = NULL; + } + return ZIGBEE_ERROR_OUT_OF_MEMORY; + } + + j = 0; + while (j < count && writeAttributeIndex < size_of_allo) { + writeAttribute[writeAttributeIndex++] = ((*records)[j].id) & 0xff; + writeAttribute[writeAttributeIndex++] = (((*records)[j].id) >> 8) & 0xff; + writeAttribute[writeAttributeIndex++] = (*records)[j].type; + for (i = 0; i < (dataSize[j] + isString[j]); i++) { + writeAttribute[writeAttributeIndex++] = (*records)[j].value[i]; + DBG("0x%02X", (*records)[j].value[i]); + } + j++; + } + + rec_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); + DBG(" "); + for (i = 0; i < writeAttributeIndex ; i++) { + DBG("0x%02X", writeAttribute[i]); + g_variant_builder_add(rec_builder, "(y)", writeAttribute[i]); + } + + rec_variant = g_variant_builder_end(rec_builder); + g_variant_builder_unref(rec_builder); + + variant = g_dbus_proxy_call_sync(zcl_global_proxy, "write_attributes_no_resp", + g_variant_new("(@a(y)iqqyyy)", rec_variant, writeAttributeIndex, addr16, + clusterid, zcl_fc, src_ep, dst_ep), G_DBUS_CALL_FLAGS_NONE, + -1, NULL, &dbus_err); + + if (isString) { + free(isString); + isString = NULL; + } + if (dataSize) { + free(dataSize); + dataSize = NULL; + } + if (writeAttribute) { + free(writeAttribute); + writeAttribute = NULL; + } + if (!variant) { + ERR("Failed to get 'write_attributes_no_rep' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_write_config_report(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, + unsigned short clusterid, void **data, int count, + zb_zcl_global_config_report_write_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + struct reporting_configuration_record_s **records = + (struct reporting_configuration_record_s **)data; + +#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC + zb_event_global_default_rsp_s *global_req = NULL; +#endif + + int i = 0; + int j = 0; + int len = 0; + int payload_len = 0; + + GVariantBuilder *rec_builder = NULL; + GVariant *rec_variant = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_write_config_report()"); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zcl_global_proxy); + sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, + ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "configure_reporting_rsp", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, + container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + if (container) { + free(container); + container = NULL; + } + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZCL_GLOBAL_WRITE_CONFIGURE_REPORTING_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; +#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC + global_req = calloc(1, sizeof(zb_event_global_default_rsp_s)); + if (NULL == global_req) { + g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id); + g_source_remove(container->tid); + container->tid = 0; + if (container) { + free(container); + container = NULL; + } + ERR("calloc() Fail(%d)", errno); + return ZIGBEE_ERROR_OUT_OF_MEMORY; + } + global_req->ep = dst_ep; + global_req->clusterid = clusterid; + global_req->commandid = ZB_ZCL_CMD_CONFIGURE_REPORTING; + + container->global_cmd = global_req; + container->handle = handle; + + /* Register global request information into handle */ + _zbl_register_global_req(handle, container); +#endif + + rec_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); + for (i = 0; i < count; i++) { + g_variant_builder_add(rec_builder, "(y)", (*records)[i].dir); + DBG("dir = 0x%02X", (*records)[i].dir); + payload_len += sizeof((*records)[i].dir); + g_variant_builder_add(rec_builder, "(y)", (*records)[i].id & 0xff); + g_variant_builder_add(rec_builder, "(y)", ((*records)[i].id >> 8) & 0xff); + DBG("id = 0x%04X", (*records)[i].id); + payload_len += sizeof((*records)[i].id); + g_variant_builder_add(rec_builder, "(y)", (*records)[i].type); + payload_len += sizeof((*records)[i].type); + DBG("type = 0x%04X", (*records)[i].type); + g_variant_builder_add(rec_builder, "(y)", (*records)[i].min_i & 0xff); + g_variant_builder_add(rec_builder, "(y)", ((*records)[i].min_i >> 8) & 0xff); + DBG("min_i = 0x%04X", (*records)[i].min_i); + payload_len += sizeof((*records)[i].min_i); + g_variant_builder_add(rec_builder, "(y)", (*records)[i].max_i & 0xff); + g_variant_builder_add(rec_builder, "(y)", ((*records)[i].max_i >> 8) & 0xff); + DBG("max_i = 0x%04X", (*records)[i].max_i); + payload_len += sizeof((*records)[i].max_i); + + len = zb_zcl_get_data_size((*records)[i].type); + payload_len += len; + DBG("change length = %d", len); + DBG("payload length = %d", payload_len); + + for (j = 0; j < len && (*records)[i].change+j; j++) { + DBG("records[%d]->change[%d] = %d", i, j, (*records)[i].change[j]); + g_variant_builder_add(rec_builder, "(y)", (*records)[i].change[j]); + } + + } + rec_variant = g_variant_builder_end(rec_builder); + g_variant_builder_unref(rec_builder); + + variant = g_dbus_proxy_call_sync(zcl_global_proxy, "configure_reporting_req", + g_variant_new("(@a(y)qqqyyy)", rec_variant, count, addr16, clusterid, + zcl_fc, src_ep, dst_ep), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'configure_reporting_req' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_read_config_report(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, + unsigned short clusterid, void **data, int count, + zb_zcl_global_config_report_read_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + struct read_reporting_configuration_record_s **records = + (struct read_reporting_configuration_record_s **)data; + +#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC + zb_event_global_default_rsp_s *global_req = NULL; +#endif + + int i = 0; + int j = 0; + int size_of_allo = 0; + unsigned short idx = 0; + GVariantBuilder *rec_builder = NULL; + GVariant *rec_variant = NULL; + unsigned char *read_attributes; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_config_report_read()"); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zcl_global_proxy); + sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, + ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "read_configure_reporting_rsp", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, + container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + if (container) { + free(container); + container = NULL; + } + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZCL_GLOBAL_READ_CONFIGURE_REPORTING_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; +#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC + global_req = calloc(1, sizeof(zb_event_global_default_rsp_s)); + if (NULL == global_req) { + g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id); + g_source_remove(container->tid); + container->tid = 0; + if (container) { + free(container); + container = NULL; + } + ERR("calloc() Fail(%d)", errno); + return ZIGBEE_ERROR_OUT_OF_MEMORY; + } + global_req->ep = dst_ep; + global_req->clusterid = clusterid; + global_req->commandid = ZB_ZCL_CMD_READ_REPORTING_CONFIGURATION; + + container->global_cmd = global_req; + container->handle = handle; + + /* Register global request information into handle */ + _zbl_register_global_req(handle, container); +#endif + + DBG("Records Length %d", count); + /** + * According to zcl spec + * Memory needed for the read_reporting_configured_frame. + * 1 byte(direction) + 2 bytes(AttributeId) + * = 3 bytes/variable + */ + while (j < count) { + size_of_allo = size_of_allo + 3; + j++; + } + DBG("size_of_allo Length %d", size_of_allo); + + read_attributes = calloc(size_of_allo, sizeof(unsigned char)); + if (NULL == read_attributes) { + ERR("Couldn't Allocate Memory"); + g_dbus_connection_signal_unsubscribe(gdbus_conn, container->sid); + g_source_remove(container->tid); + container->tid = 0; + if (container) { + free(container); + container = NULL; + } + return ZIGBEE_ERROR_OUT_OF_MEMORY; + } + j = 0; + while (j < count && idx < size_of_allo) { + read_attributes[idx++] = (*records)[j].dir; + read_attributes[idx++] = (*records)[j].id & 0xff; + read_attributes[idx++] = (*records)[j].id >> 8 & 0xff; + DBG("Id copied \n"); + j++; + } + + rec_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); + + for (i = 0; i < idx ; i++) { + DBG("0x%02X", read_attributes[i]); + g_variant_builder_add(rec_builder, "(y)", read_attributes[i]); + } + + rec_variant = g_variant_builder_end(rec_builder); + g_variant_builder_unref(rec_builder); + + variant = g_dbus_proxy_call_sync(zcl_global_proxy, "read_configure_reporting", + g_variant_new("(@a(y)qqqyyy)", rec_variant, idx, addr16, clusterid, zcl_fc, + src_ep, dst_ep), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (read_attributes) { + free(read_attributes); + read_attributes = NULL; + } + + if (!variant) { + ERR("Failed to get 'read_configure_reporting' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_discover_attr_req(zb_zigbee_h handle, unsigned short addr16, unsigned char src_ep, + unsigned char dest_ep, unsigned char zcl_fc, unsigned short clusterid, + unsigned short start_id, unsigned char max_attribute_ids, + zb_zcl_global_attr_discover_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + +#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC + zb_event_global_default_rsp_s *global_req = NULL; +#endif + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_discover_attr_req()"); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zcl_global_proxy); + sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, + ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "discover_attribute_rsp", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, + _zbl_response_cb, container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + if (container) { + free(container); + container = NULL; + } + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; +#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC + global_req = calloc(1, sizeof(zb_event_global_default_rsp_s)); + if (NULL == global_req) { + g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id); + g_source_remove(container->tid); + container->tid = 0; + if (container) { + free(container); + container = NULL; + } + ERR("calloc() Fail(%d)", errno); + return ZIGBEE_ERROR_OUT_OF_MEMORY; + } + global_req->ep = dest_ep; + global_req->clusterid = clusterid; + global_req->commandid = ZB_ZCL_CMD_DISCOVER_ATTRIBUTES; + + container->global_cmd = global_req; + container->handle = handle; + + /* Register global request information into handle */ + _zbl_register_global_req(handle, container); +#endif + + variant = g_dbus_proxy_call_sync(zcl_global_proxy, "discover_attributes", + g_variant_new("(qyyqqy)", + addr16, dest_ep, zcl_fc, clusterid, start_id, max_attribute_ids), + G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'discover_attributes' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_discover_cmds_gen(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char src_ep, + unsigned char dst_ep, unsigned char zcl_fc, unsigned short clusterid, + unsigned char start_command_id, unsigned char max_command_ids, + zb_zcl_global_discover_cmds_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + +#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC + zb_event_global_default_rsp_s *global_req = NULL; +#endif + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_discover_attr_gen()"); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zcl_global_proxy); + sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, + ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "discover_commands_generated_rsp", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container, + _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + if (container) { + free(container); + container = NULL; + } + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_GENERATED_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; +#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC + global_req = calloc(1, sizeof(zb_event_global_default_rsp_s)); + if (NULL == global_req) { + g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id); + g_source_remove(container->tid); + container->tid = 0; + if (container) { + free(container); + container = NULL; + } + ERR("calloc() Fail(%d)", errno); + return ZIGBEE_ERROR_OUT_OF_MEMORY; + } + global_req->ep = dst_ep; + global_req->clusterid = clusterid; + global_req->commandid = ZB_ZCL_CMD_DISCOVER_COMMANDS_GENERATED; + + container->global_cmd = global_req; + container->handle = handle; + + /* Register global request information into handle */ + _zbl_register_global_req(handle, container); +#endif + + variant = g_dbus_proxy_call_sync(zcl_global_proxy, "discover_commands_generated", + g_variant_new("(qyyqqy)", addr16, dst_ep, zcl_fc, clusterid, + start_command_id, max_command_ids), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'discover_commands_received' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_discover_cmds_recv(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, + unsigned short clusterid, unsigned char start_command_id, + unsigned char max_command_ids, zb_zcl_global_discover_cmds_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + +#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC + zb_event_global_default_rsp_s *global_req = NULL; +#endif + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_discover_cmds_recv()"); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zcl_global_proxy); + sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, + ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "discover_commands_received_rsp", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container, + _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + if (container) { + free(container); + container = NULL; + } + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_RECEIVED_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; +#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC + global_req = calloc(1, sizeof(zb_event_global_default_rsp_s)); + if (NULL == global_req) { + g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id); + g_source_remove(container->tid); + container->tid = 0; + if (container) { + free(container); + container = NULL; + } + ERR("calloc() Fail(%d)", errno); + return ZIGBEE_ERROR_OUT_OF_MEMORY; + } + global_req->ep = dst_ep; + global_req->clusterid = clusterid; + global_req->commandid = ZB_ZCL_CMD_DISCOVER_COMMANDS_RECEIVED; + + container->global_cmd = global_req; + container->handle = handle; + + /* Register global request information into handle */ + _zbl_register_global_req(handle, container); +#endif + + variant = g_dbus_proxy_call_sync(zcl_global_proxy, "discover_commands_received", + g_variant_new("(qyyqqy)", addr16, dst_ep, zcl_fc, clusterid, + start_command_id, max_command_ids), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'discover_commands_received' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_discover_attr_ext(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char src_ep, + unsigned char dst_ep, unsigned char zcl_fc, unsigned short clusterid, + unsigned short start_id, unsigned char max_attribute_ids, + zb_zcl_global_attr_extended_discover_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + +#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC + zb_event_global_default_rsp_s *global_req = NULL; +#endif + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_discover_attr_ext()"); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zcl_global_proxy); + sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, + ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "discover_attributes_extended_rsp", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container, + _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + if (container) { + free(container); + container = NULL; + } + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_EXTENDED_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; +#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC + global_req = calloc(1, sizeof(zb_event_global_default_rsp_s)); + if (NULL == global_req) { + g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id); + g_source_remove(container->tid); + container->tid = 0; + if (container) { + free(container); + container = NULL; + } + ERR("calloc() Fail(%d)", errno); + return ZIGBEE_ERROR_OUT_OF_MEMORY; + } + global_req->ep = dst_ep; + global_req->clusterid = clusterid; + global_req->commandid = ZB_ZCL_CMD_DISCOVER_ATTRIBUTES_EXTENDED; + + container->global_cmd = global_req; + container->handle = handle; + + /* Register global request information into handle */ + _zbl_register_global_req(handle, container); +#endif + + variant = g_dbus_proxy_call_sync(zcl_global_proxy, "discover_attributes_extended", + g_variant_new("(qyyqqy)", addr16, dst_ep, zcl_fc, clusterid, start_id, + max_attribute_ids), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'discover_attributes_extended' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_reset_alarm(zb_nwk_addr addr16, unsigned char ep, unsigned char alarm_code, + unsigned short clusterid) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == alarm_gproxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(alarm_gproxy, "reset_alarm", + g_variant_new("(qyyq)", addr16, ep, alarm_code, clusterid), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'reset_alarm' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_reset_all_alarm(zb_nwk_addr addr16, unsigned char ep) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == alarm_gproxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(alarm_gproxy, "reset_all_alarm", + g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'reset_all_alarm' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_get_alarm(zb_nwk_addr addr16, unsigned char ep, zb_zcl_alarm_get_alarm_cb cb, + void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == alarm_gproxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_get_alarm()"); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(alarm_gproxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZCL_ALARM_INTERFACE, "get_alarm_rsp", ZIGBEE_CONTROL_OBJECT_PATH, + NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + if (container) { + free(container); + container = NULL; + } + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZCL_ALARM_GET_ALARM_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + variant = g_dbus_proxy_call_sync(alarm_gproxy, "get_alarm", + g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'get_alarm' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_reset_all_alarm_log(zb_nwk_addr addr16, unsigned char ep) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == alarm_gproxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(alarm_gproxy, "reset_alarm_log", + g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'reset_alarm_log' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_ccontrol_move_to_hue(zb_nwk_addr addr16, unsigned char ep, + unsigned char hue, unsigned char direction, + unsigned short transition_time) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_to_hue", + g_variant_new("(qyyyq)", addr16, ep, hue, direction, transition_time), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'move_to_hue' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + + +int zbl_ccontrol_move_hue(zb_nwk_addr addr16, unsigned char ep, + unsigned char move_mode, unsigned char rate) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_hue", + g_variant_new("(qyyy)", addr16, ep, move_mode, rate), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'move_hue' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_ccontrol_step_hue(zb_nwk_addr addr16, unsigned char ep, + unsigned char step_mode, unsigned char step_size, + unsigned char transition_time) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "step_hue", + g_variant_new("(qyyyy)", addr16, ep, step_mode, step_size, transition_time), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'step_hue' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_ccontrol_move_to_saturation(zb_nwk_addr addr16, unsigned char ep, + unsigned char saturation, unsigned short transition_time) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_to_saturation", + g_variant_new("(qyyq)", addr16, ep, saturation, transition_time), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'move_to_saturation' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_ccontrol_move_saturation(zb_nwk_addr addr16, unsigned char ep, + unsigned char move_mode, unsigned char rate) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_saturation", + g_variant_new("(qyyy)", addr16, ep, move_mode, rate), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'move_saturation' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_ccontrol_step_saturation(zb_nwk_addr addr16, unsigned char ep, + unsigned char step_mode, unsigned char step_size, + unsigned char transition_time) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "step_saturation", + g_variant_new("(qyyyy)", addr16, ep, step_mode, step_size, transition_time), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'step_saturation' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_ccontrol_move_to_hue_and_saturation(zb_nwk_addr addr16, unsigned char ep, + unsigned char hue, unsigned char saturation, + unsigned short transition_time) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_to_hue_and_saturation", + g_variant_new("(qyyyq)", addr16, ep, hue, saturation, transition_time), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'move_to_hue_and_saturation' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_ccontrol_move_to_color(zb_nwk_addr addr16, unsigned char ep, + unsigned short color_x, unsigned short color_y, + unsigned short transition_time) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_to_color", + g_variant_new("(qyqqq)", addr16, ep, color_x, color_y, transition_time), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'move_to_color' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_ccontrol_move_color(zb_nwk_addr addr16, unsigned char ep, + unsigned short rate_x, unsigned short rate_y) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_color", + g_variant_new("(qyqq)", addr16, ep, rate_x, rate_y), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'move_color' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_ccontrol_step_color(zb_nwk_addr addr16, unsigned char ep, + unsigned short step_x, unsigned short step_y, + unsigned short transition_time) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "step_color", + g_variant_new("(qyqqq)", addr16, ep, step_x, step_y, transition_time), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'step_color' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_ccontrol_move_to_color_temperature(zb_nwk_addr addr16, unsigned char ep, + unsigned short color_temperature, + unsigned short transition_time) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_color_temperature", + g_variant_new("(qyqq)", addr16, ep, color_temperature, transition_time), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'move_color_temperature' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_reset_factory_default(zb_nwk_addr addr16, unsigned char ep) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_basic_proxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(zcl_basic_proxy, "reset_factory_default", + g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'reset_factory_default' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_identify(zb_nwk_addr addr16, unsigned char dst_ep, unsigned short identify_time) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_identify_proxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(zcl_identify_proxy, "identify", + g_variant_new("(qyq)", addr16, dst_ep, identify_time), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'identify' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_identify_query(zb_nwk_addr addr16, unsigned char dst_ep, + zb_zcl_identify_query_cb cb, void *user_data) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + int sub_id, to; + zbl_req_cb_s *container; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_identify_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_identify_query()"); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zcl_identify_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZCL_IDENTIFY_INTERFACE, "query_rsp", ZIGBEE_CONTROL_OBJECT_PATH, + NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + if (container) { + free(container); + container = NULL; + } + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZCL_IDENTIFY_QUERY_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + variant = g_dbus_proxy_call_sync(zcl_identify_proxy, "query", + g_variant_new("(qy)", addr16, dst_ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'query' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_add_group(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id, + const char *group_name, zb_zcl_group_add_group_cb cb, void *user_data) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + int sub_id, to; + zbl_req_cb_s *container; + + int j = 0; + GVariant *groupname_variant = NULL; + GVariantBuilder *groupname_builder = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_add_group()"); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zcl_group_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZCL_GROUP_INTERFACE, "add_group_rsp", ZIGBEE_CONTROL_OBJECT_PATH, + NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + if (container) { + free(container); + container = NULL; + } + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZCL_GROUP_ADD_GROUP_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + groupname_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); + while (group_name[j] != '\0') { + g_variant_builder_add(groupname_builder, "(y)", (group_name[j])); + j++; + } + groupname_variant = g_variant_builder_end(groupname_builder); + g_variant_builder_unref(groupname_builder); + + variant = g_dbus_proxy_call_sync(zcl_group_proxy, "add_group", + g_variant_new("(qyq@a(y))", addr16, ep, group_id, groupname_variant), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'add_group' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_view_group(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id, + zb_zcl_group_view_group_cb cb, void *user_data) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + int sub_id, to; + zbl_req_cb_s *container; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_view_group()"); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zcl_group_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZCL_GROUP_INTERFACE, "view_group_rsp", ZIGBEE_CONTROL_OBJECT_PATH, + NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + if (container) { + free(container); + container = NULL; + } + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZCL_GROUP_VIEW_GROUP_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + variant = g_dbus_proxy_call_sync(zcl_group_proxy, "view_group", + g_variant_new("(qyq)", addr16, ep, group_id), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'view_group' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_group_get_group_membership(zb_nwk_addr addr16, unsigned char ep, + unsigned char group_count, unsigned short *group_list, + zb_zcl_group_get_group_membership_cb cb, void *user_data) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + int sub_id, to; + zbl_req_cb_s *container; + + int j = 0; + GVariant *grouplist_variant = NULL; + GVariantBuilder *grouplist_builder = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_group_get_group_membership()"); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zcl_group_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZCL_GROUP_INTERFACE, "get_group_membership_rsp", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, + container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + if (container) { + free(container); + container = NULL; + } + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZCL_GROUP_GET_GROUP_MEMBERSHIP_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + grouplist_builder = g_variant_builder_new(G_VARIANT_TYPE("aq")); + while (j < group_count) { + g_variant_builder_add(grouplist_builder, "q", group_list[j]); + j++; + } + grouplist_variant = g_variant_builder_end(grouplist_builder); + g_variant_builder_unref(grouplist_builder); + + variant = g_dbus_proxy_call_sync(zcl_group_proxy, "get_group_membership", + g_variant_new("(qyy@aq)", addr16, ep, group_count, grouplist_variant), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'get_group_membership' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_remove_group(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id, + zb_zcl_group_remove_group_cb cb, void *user_data) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + int sub_id, to; + zbl_req_cb_s *container; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_group_remove_group()"); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zcl_group_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZCL_GROUP_INTERFACE, "remove_group_rsp", ZIGBEE_CONTROL_OBJECT_PATH, + NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + if (container) { + free(container); + container = NULL; + } + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZCL_GROUP_REMOVE_GROUP_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + variant = g_dbus_proxy_call_sync(zcl_group_proxy, "remove_group", g_variant_new("(qyq)", + addr16, ep, group_id), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'remove_group' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_remove_all_group(zb_nwk_addr addr16, unsigned char ep) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_group_remove_all_group()"); + + variant = g_dbus_proxy_call_sync(zcl_group_proxy, "remove_all_group", + g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'remove_all_group' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_add_group_if_identifying(zb_nwk_addr addr16, unsigned char ep, + unsigned short group_id, const char *group_name) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + int j = 0; + GVariant *groupname_variant = NULL; + GVariantBuilder *groupname_builder = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR); + + groupname_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); + while (group_name[j] != '\0') { + g_variant_builder_add(groupname_builder, "(y)", group_name[j]); + j++; + } + groupname_variant = g_variant_builder_end(groupname_builder); + g_variant_builder_unref(groupname_builder); + + variant = g_dbus_proxy_call_sync(zcl_group_proxy, "add_group_if_identifying", + g_variant_new("(qyq@a(y))", addr16, ep, group_id, groupname_variant), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'add_group_if_identifying' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_level_control_move_to_level(zb_nwk_addr addr16, unsigned char ep, + unsigned char level, unsigned short transition_time) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_level_control_move_to_level()"); + + variant = g_dbus_proxy_call_sync(level_control_gproxy, "move_to_level", + g_variant_new("(qyyq)", addr16, ep, level, transition_time), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'move_to_level' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_level_control_move(zb_nwk_addr addr16, unsigned char ep, + unsigned char move_mode, unsigned char rate) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_level_control_move()"); + + variant = g_dbus_proxy_call_sync(level_control_gproxy, "move", + g_variant_new("(qyyy)", addr16, ep, move_mode, rate), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'move' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_level_control_step(zb_nwk_addr addr16, unsigned char ep, + unsigned char step_mode, unsigned char step_size, + unsigned short transition_time) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_level_control_step()"); + + variant = g_dbus_proxy_call_sync(level_control_gproxy, "step", + g_variant_new("(qyyyq)", addr16, ep, step_mode, step_size, transition_time), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'step' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_level_control_stop(zb_nwk_addr addr16, unsigned char ep) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_level_control_stop()"); + + variant = g_dbus_proxy_call_sync(level_control_gproxy, "stop", + g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'stop' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_level_control_move_to_level_with_on_off(zb_nwk_addr addr16, + unsigned char ep, unsigned char level, unsigned short transition_time) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_level_control_move_to_level_with_on_off()"); + + variant = g_dbus_proxy_call_sync(level_control_gproxy, "move_to_level_with_on_off", + g_variant_new("(qyyq)", addr16, ep, level, transition_time), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'move_to_level_with_on_off' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_level_control_move_with_on_off(zb_nwk_addr addr16, unsigned char ep, + unsigned char move_mode, unsigned char rate) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_level_control_move_with_on_off()"); + + variant = g_dbus_proxy_call_sync(level_control_gproxy, "move_with_on_off", + g_variant_new("(qyyy)", addr16, ep, move_mode, rate), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'move_with_on_off' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_level_control_step_with_on_off(zb_nwk_addr addr16, unsigned char ep, + unsigned char step_mode, unsigned char step_size, + unsigned short transition_time) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_level_control_step_with_on_off()"); + + variant = g_dbus_proxy_call_sync(level_control_gproxy, "step_with_on_off", + g_variant_new("(qyyyq)", addr16, ep, step_mode, step_size, transition_time), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'step_with_on_off' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_onoff_set(zb_nwk_addr addr16, unsigned char ep, unsigned char on_off_type) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == on_off_gproxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(on_off_gproxy, "set_on_off", + g_variant_new("(qyy)", addr16, ep, on_off_type), G_DBUS_CALL_FLAGS_NONE, + -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'set_on_off' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_zone_enroll_response(zb_nwk_addr addr16, unsigned char dst_ep, + unsigned char enroll_response_code, unsigned char zone_id) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_ias_zone_proxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(zcl_ias_zone_proxy, "enroll_response", + g_variant_new("(qyyy)", addr16, dst_ep, enroll_response_code, zone_id), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'enroll_response' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_pollcontrol_check_in_response(zb_nwk_addr addr16, unsigned char ep, + unsigned char start_fast_polling, unsigned short fast_poll_timeout) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_poll_control_proxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(zcl_poll_control_proxy, "check_in_response", + g_variant_new("(qyyq)", addr16, ep, start_fast_polling, fast_poll_timeout), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'check_in_response' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_pollcontrol_fast_poll_stop(zb_nwk_addr addr16, unsigned char ep) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_poll_control_proxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(zcl_poll_control_proxy, "fast_poll_stop", + g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'fast_poll_stop' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_pollcontrol_set_long_poll_interval(zb_nwk_addr addr16, unsigned char ep, + unsigned int new_long_poll_interval, zb_zcl_pollctrl_check_in_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_poll_control_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_pollcontrol_set_long_poll_interval()"); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zcl_poll_control_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZCL_POLL_CONTROL_INTERFACE, "checkin_response", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, + _zbl_response_cb, container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + if (container) { + free(container); + container = NULL; + } + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZCL_POLLCONTROL_SET_POLL_INTERVAL_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + variant = g_dbus_proxy_call_sync(zcl_poll_control_proxy, "set_long_poll_interval", + g_variant_new("(qyu)", addr16, ep, new_long_poll_interval), + G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'set_long_poll_interval' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_pollcontrol_set_short_poll_interval(zb_nwk_addr addr16, unsigned char ep, + unsigned int new_short_poll_interval, zb_zcl_pollctrl_check_in_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_poll_control_proxy, ZIGBEE_ERROR_IO_ERROR); + + DBG("zbl_pollcontrol_set_short_poll_interval()"); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zcl_poll_control_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZCL_POLL_CONTROL_INTERFACE, "checkin_response", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, + _zbl_response_cb, container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + if (container) { + free(container); + container = NULL; + } + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZCL_POLLCONTROL_SET_POLL_INTERVAL_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + variant = g_dbus_proxy_call_sync(zcl_poll_control_proxy, "set_short_poll_interval", + g_variant_new("(qyu)", addr16, ep, new_short_poll_interval), + G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'set_short_poll_interval' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_add_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id, + unsigned char scene_id, unsigned short transition_time, const char *scene_name, + unsigned short ext_field_len, const char *extension_field_sets, + zb_zcl_scene_add_scene_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + int j = 0; + int index = 0; + GVariant *scenename_variant = NULL; + GVariantBuilder *scenename_builder = NULL; + GVariant *extensionfieldSet_variant = NULL; + GVariantBuilder *extensionfieldSet_builder = NULL; + + DBG("zbl_add_scene()"); + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zcl_scene_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZCL_SCENE_INTERFACE, "add_scene_rsp", ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, + _zbl_response_cb, container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + if (container) { + free(container); + container = NULL; + } + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZCL_SCENE_ADD_SCENE_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + scenename_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); + while ('\0' != scene_name[j]) { + g_variant_builder_add(scenename_builder, "(y)", scene_name[j]); + j++; + } + scenename_variant = g_variant_builder_end(scenename_builder); + g_variant_builder_unref(scenename_builder); + + extensionfieldSet_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); + + while (index < ext_field_len) { + INFO("Ext contents 0x%02X", extension_field_sets[index]); + g_variant_builder_add(extensionfieldSet_builder, "(y)", extension_field_sets[index]); + index++; + } + extensionfieldSet_variant = g_variant_builder_end(extensionfieldSet_builder); + g_variant_builder_unref(extensionfieldSet_builder); + + variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "add_scene", + g_variant_new("(qyqyqq@a(y)@a(y))", addr16, ep, group_id, scene_id, transition_time, + ext_field_len, scenename_variant, extensionfieldSet_variant), G_DBUS_CALL_FLAGS_NONE, + to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'add_scene' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_view_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id, + unsigned char scene_id, zb_zcl_scene_view_scene_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + DBG("zbl_scene_view_scene()"); + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zcl_scene_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZCL_SCENE_INTERFACE, "view_scene_rsp", ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, + _zbl_response_cb, container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + if (container) { + free(container); + container = NULL; + } + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZCL_SCENE_VIEW_SCENE_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "view_scene", + g_variant_new("(qyqy)", addr16, ep, group_id, scene_id), G_DBUS_CALL_FLAGS_NONE, + to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'view_scene' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_remove_scene(zb_nwk_addr addr16, unsigned char ep, + unsigned short group_id, unsigned char scene_id, zb_zcl_scene_remove_scene_cb cb, + void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + DBG("zbl_scene_remove_scene()"); + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zcl_scene_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZCL_SCENE_INTERFACE, "remove_scene_rsp", ZIGBEE_CONTROL_OBJECT_PATH, + NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + if (container) { + free(container); + container = NULL; + } + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZCL_SCENE_REMOVE_SCENE_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "remove_scene", + g_variant_new("(qyqy)", addr16, ep, group_id, scene_id), + G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'remove_scene' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_remove_all_scene(zb_nwk_addr addr16, unsigned char ep, + unsigned short group_id, zb_zcl_scene_remove_all_scene_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + DBG("zbl_scene_remove_all_scene()"); + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zcl_scene_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZCL_SCENE_INTERFACE, "remove_all_scene_rsp", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container, + _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + if (container) { + free(container); + container = NULL; + } + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZCL_SCENE_REMOVE_ALL_SCENE_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "remove_all_scene", + g_variant_new("(qyq)", addr16, ep, group_id), + G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'remove_all_scene' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_store_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id, + unsigned char scene_id, zb_zcl_scene_store_scene_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + DBG("zbl_scene_store_scene()"); + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zcl_scene_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZCL_SCENE_INTERFACE, "store_scene_rsp", ZIGBEE_CONTROL_OBJECT_PATH, + NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + if (container) { + free(container); + container = NULL; + } + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZCL_SCENE_STORE_SCENE_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "store_scene", + g_variant_new("(qyqy)", addr16, ep, group_id, scene_id), + G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'store_scene' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_recall_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id, + unsigned char scene_id) +{ + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "recall_scene", + g_variant_new("(qyqy)", addr16, ep, group_id, scene_id), G_DBUS_CALL_FLAGS_NONE, + -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'recall_scene' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_get_scene_membership(zb_nwk_addr addr16, unsigned char ep, + unsigned short group_id, zb_zcl_scene_get_scene_membership_cb cb, void *user_data) +{ + int sub_id, to; + zbl_req_cb_s *container; + + int result = ZIGBEE_ERROR_NONE; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + DBG("zbl_scene_get_scene_membership()"); + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR); + + container = calloc(1, sizeof(zbl_req_cb_s)); + RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + to = zbl_dbus_get_timeout(zcl_scene_proxy); + sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL, + ZIGBEE_ZCL_SCENE_INTERFACE, "get_scene_membership_rsp", + ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container, + _zbl_request_cleanup); + + if (0 == sub_id) { + ERR("g_dbus_connection_signal_subscribe() Fail"); + if (container) { + free(container); + container = NULL; + } + return ZIGBEE_ERROR_IO_ERROR; + } + + container->cb = cb; + container->sid = sub_id; + container->cid = ZBL_ZCL_SCENE_GET_SCENE_MEMBERSHIP_REQ; + container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container); + container->userdata = user_data; + + variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "get_scene_membership", + g_variant_new("(qyq)", addr16, ep, group_id), + G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get get_scene_membership [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_thermostat_adjust_setpoint(zb_nwk_addr addr16, unsigned char ep, unsigned char mode, + unsigned char amount) +{ + int result = ZIGBEE_ERROR_IO_ERROR; + GVariant *variant = NULL; + GError *dbus_err = NULL; + + RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == thermostat_gproxy, ZIGBEE_ERROR_IO_ERROR); + + variant = g_dbus_proxy_call_sync(thermostat_gproxy, "setpoint_raise_lower", + g_variant_new("(qyyy)", addr16, ep, mode, amount), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err); + + if (!variant) { + ERR("Failed to get 'setpoint_raise_lower' [%s]", dbus_err->message); + if (strstr(dbus_err->message, "AccessDenied")) + result = ZIGBEE_ERROR_PERMISSION_DENIED; + else + result = ZIGBEE_ERROR_IO_ERROR; + + g_error_free(dbus_err); + return result; + } + + g_variant_get(variant, "(i)", &result); + DBG("ret = [0x%x]", result); + g_variant_unref(variant); + + return result; +} + +int zbl_dbus_start(zb_zigbee_h handle) +{ + FN_CALL; + + GError *error = NULL; + unsigned int id; + + if (gdbus_conn) { + zbl_ref_count++; + return ZIGBEE_ERROR_NONE; + } + + gdbus_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error); + if (NULL == gdbus_conn) { + ERR("Couldn't connect to the System bus [%s]\n", error->message); + g_error_free(error); + return ZIGBEE_ERROR_IO_ERROR; + } + + id = g_signal_connect(gdbus_conn, "notify::g-name-owner", + G_CALLBACK(_zbl_dbus_name_owner_notify), handle); + if (0 == id) { + ERR("g_signal_connect() Fail\n"); + return ZIGBEE_ERROR_IO_ERROR; + } + + /* Phase 1. Subscribe signals */ + _zbl_dbus_subscribe_signal(handle); + + /* Phase 2. Make proxies */ + service_gproxy = _zbl_get_service_proxy(); + RETVM_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get service_gproxy"); + g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(service_gproxy), ZIGBEE_BROADCAST_TIMEOUT); + + on_off_gproxy = _zbl_get_on_off_proxy(); + RETVM_IF(NULL == on_off_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get on_off_gproxy"); + g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(on_off_gproxy), ZIGBEE_BROADCAST_TIMEOUT); + + door_lock_gproxy = _zbl_get_door_lock_proxy(); + RETVM_IF(NULL == door_lock_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get door_lock_gproxy"); + g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(door_lock_gproxy), ZIGBEE_BROADCAST_TIMEOUT); + + level_control_gproxy = _zbl_get_level_control_proxy(); + RETVM_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get level_control_gproxy"); + g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(level_control_gproxy), ZIGBEE_BROADCAST_TIMEOUT); + + thermostat_gproxy = _zbl_get_thermostat_proxy(); + RETVM_IF(NULL == thermostat_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get thermostat_gproxy"); + g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(thermostat_gproxy), ZIGBEE_BROADCAST_TIMEOUT); + + fan_control_gproxy = _zbl_get_fan_control_proxy(); + RETVM_IF(NULL == fan_control_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get fan_control_gproxy"); + g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(fan_control_gproxy), ZIGBEE_BROADCAST_TIMEOUT); + + alarm_gproxy = _zbl_get_alarm_proxy(); + RETVM_IF(NULL == alarm_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get alarm_gproxy"); + g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(alarm_gproxy), ZIGBEE_BROADCAST_TIMEOUT); + + mfglib_gproxy = _zbl_get_mfglib_proxy(); + RETVM_IF(NULL == mfglib_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get mfglib_gproxy"); + g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(mfglib_gproxy), ZIGBEE_BROADCAST_TIMEOUT); + + zcl_global_proxy = _zbl_get_zcl_global_proxy(); + RETVM_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_global_proxy"); + g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_global_proxy), ZIGBEE_BROADCAST_TIMEOUT); + + zdo_dev_proxy = _zbl_get_zdo_dev_proxy(); + RETVM_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zdo_dev_proxy"); + g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zdo_dev_proxy), ZIGBEE_BROADCAST_TIMEOUT); + + zcl_basic_proxy = _zbl_get_basic_proxy(); + RETVM_IF(NULL == zcl_basic_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_basic_proxy"); + g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_basic_proxy), ZIGBEE_BROADCAST_TIMEOUT); + + zcl_identify_proxy = _zbl_get_identify_proxy(); + RETVM_IF(NULL == zcl_identify_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_identify_proxy"); + g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_identify_proxy), ZIGBEE_BROADCAST_TIMEOUT); + + zcl_ias_zone_proxy = _zbl_get_ias_zone_proxy(); + RETVM_IF(NULL == zcl_ias_zone_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_ias_zone_proxy"); + g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_ias_zone_proxy), ZIGBEE_BROADCAST_TIMEOUT); + + zcl_poll_control_proxy = _zbl_get_poll_control_proxy(); + RETVM_IF(NULL == zcl_poll_control_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_poll_control_proxy"); + g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_poll_control_proxy), ZIGBEE_BROADCAST_TIMEOUT); + + zcl_group_proxy = _zbl_get_group_proxy(); + RETVM_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_group_proxy"); + g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_group_proxy), ZIGBEE_BROADCAST_TIMEOUT); + + zcl_scene_proxy = _zbl_get_scene_proxy(); + RETVM_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_scene_proxy"); + g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_scene_proxy), ZIGBEE_BROADCAST_TIMEOUT); + + zdo_bind_proxy = _zbl_get_zdo_bind_proxy(); + RETVM_IF(NULL == zdo_bind_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zdo_bind_proxy"); + g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zdo_bind_proxy), ZIGBEE_BROADCAST_TIMEOUT); + + zcl_color_control_proxy = _zbl_get_color_control_proxy(); + RETVM_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_color_control_proxy"); + g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_color_control_proxy), ZIGBEE_BROADCAST_TIMEOUT); + + custom_gproxy = _zbl_get_custom_gproxy(); + RETVM_IF(NULL == custom_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get custom_gproxy"); + g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(custom_gproxy), ZIGBEE_BROADCAST_TIMEOUT); + + zbl_ref_count++; + + return ZIGBEE_ERROR_NONE; +} + +int zbl_dbus_stop(zb_zigbee_h handle) +{ + struct zbl_zigbee_s *h = handle; + DBG("zbl_dbus_stop()"); + + if (0 >= zbl_ref_count) { + WARN("dbus does not initiaized\n"); + return ZIGBEE_ERROR_NONE; + } + + if (0 > --zbl_ref_count) { + DBG("all connections closed\n"); + zbl_ref_count = 0; + return ZIGBEE_ERROR_NONE; + } + + if (gdbus_conn) { + _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids); + h->dbus_sub_ids = NULL; + + g_object_unref(service_gproxy); + service_gproxy = NULL; + g_object_unref(on_off_gproxy); + on_off_gproxy = NULL; + g_object_unref(door_lock_gproxy); + door_lock_gproxy = NULL; + g_object_unref(level_control_gproxy); + level_control_gproxy = NULL; + g_object_unref(thermostat_gproxy); + thermostat_gproxy = NULL; + g_object_unref(alarm_gproxy); + alarm_gproxy = NULL; + g_object_unref(fan_control_gproxy); + fan_control_gproxy = NULL; + + g_object_unref(mfglib_gproxy); + mfglib_gproxy = NULL; + g_object_unref(zcl_global_proxy); + zcl_global_proxy = NULL; + g_object_unref(zcl_color_control_proxy); + zcl_color_control_proxy = NULL; + g_object_unref(custom_gproxy); + custom_gproxy = NULL; + + g_object_unref(gdbus_conn); + gdbus_conn = NULL; + + DBG("zbl_dbus_stop() finished"); + } + + return ZIGBEE_ERROR_NONE; +} + +GDBusConnection* zbl_dbus_get_object(void) +{ + return gdbus_conn; +} + +int zbl_dbus_get_timeout(GDBusProxy *proxy) +{ + gint timeout; + RETV_IF(NULL == gdbus_conn, ZIGBEE_BROADCAST_TIMEOUT); + timeout = g_dbus_proxy_get_default_timeout(proxy); + if (timeout <= 0) { + ERR("Invalid timeout (%d)", timeout); + return ZIGBEE_BROADCAST_TIMEOUT; + } + return timeout; +} + +int zbl_check_privilege() +{ + int ret = _check_zigbee_privilege(); + if (ret != ZIGBEE_ERROR_NONE) { + ERR("Failed to check privilege"); + return ret; + } + + return ZIGBEE_ERROR_NONE; +} diff --git a/src/zbl-dbus.h b/src/zbl-dbus.h new file mode 100644 index 0000000..eebe438 --- /dev/null +++ b/src/zbl-dbus.h @@ -0,0 +1,261 @@ +/* + * Copyright (c) 2015 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 __TIZEN_NETWORK_ZIGBEE_LIBRARY_DBUS_H__ +#define __TIZEN_NETWORK_ZIGBEE_LIBRARY_DBUS_H__ + +#include + +#include "zb-common.h" + +#include "zbl.h" +#include "zbl-dbus.h" + +int zbl_dbus_start(zb_zigbee_h handle); +int zbl_dbus_stop(zb_zigbee_h handle); +GDBusConnection* zbl_dbus_get_object(void); +int zbl_dbus_get_timeout(GDBusProxy *proxy); +int zbl_check_privilege(); + +int zbl_enable(zb_zigbee_h handle); +int zbl_set_event_cb(zb_zigbee_h handle, zb_event_cb event_handler); +int zbl_disable(void); +int zbl_hw_reset(void); +int zbl_coex_start(unsigned char channel); +int zbl_coex_stop(void); +int zbl_get_network_info(zb_ieee_addr addr64, zb_nwk_addr *nodeid, + zb_nwk_addr *panid, unsigned char *channel, unsigned char *tx_power); +int zbl_get_controller_mac_address(zb_ieee_addr addr64); +int zbl_get_cluster_list(zb_ieee_addr eui64, unsigned char endpoint, + unsigned char *in_cluster_count, unsigned short in_cluster_list[], + unsigned char *out_cluster_count, unsigned short out_cluster_list[]); +int zbl_get_endpoint_list(zb_ieee_addr eui64, unsigned char *count, + unsigned char list[]); +int zbl_get_all_device_info(zb_end_dev_info_h **dev_list, unsigned char* num); +int zbl_form_network(zb_zigbee_h handle, zb_form_network_cb cb, void *user_data); +int zbl_disable_network(zb_zigbee_h handle, zb_disable_network_cb cb, + void *user_data); +int zbl_leave_device(zb_ieee_addr addr64, bool remove_children, bool rejoin); +int zbl_permit_join(unsigned char duration, bool broadcast); + +int zbl_nwk_addr_req(zb_zigbee_h handle, zb_ieee_addr addr64, + unsigned char request_type, unsigned char start_idx, zb_zdo_addr_cb cb, + void *user_data); +int zbl_ieee_addr_req(zb_zigbee_h handle, zb_nwk_addr addr16, zb_zdo_addr_cb cb, + void *user_data); +int zbl_active_ep(zb_zigbee_h handle, zb_nwk_addr addr16, zb_zdo_active_ep_cb cb, + void *user_data); +int zbl_simple_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep, + zb_zdo_simple_desc_cb cb, void *user_data); +int zbl_match_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned short profileid, unsigned char num_in_clusters, + unsigned short *in_clusters, unsigned char num_out_clusters, + unsigned short *out_clusters, zb_zdo_match_desc_cb cb, void *user_data); +int zbl_device_annce(zb_zigbee_h handle, zb_nwk_addr addr16, zb_ieee_addr addr64, + unsigned char capability); + +int zbl_node_desc_req(zb_nwk_addr addr16, zb_zdo_node_desc_cb cb, void *user_data); +int zbl_power_desc_req(zb_nwk_addr addr16, zb_zdo_power_desc_cb cb, + void *user_data); +int zbl_complex_desc_req(zb_nwk_addr addr16, zb_zdo_complex_desc_cb cb, + void *user_data); +int zbl_user_desc_req(zb_nwk_addr addr16, zb_zdo_user_desc_cb cb, void *user_data); +int zbl_user_desc_set(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char len, + unsigned char *user_desc, zb_zdo_user_desc_conf_cb cb, void *user_data); +int zbl_bind_req(zb_nwk_addr dst_addr16, zb_ieee_addr src_addr64, + unsigned char src_ep, unsigned short clusterid, zb_ieee_addr dst_addr64, + unsigned char type, zb_nwk_addr group_addr, unsigned char dst_ep, zb_zdo_bind_cb cb, + void *user_data); +int zbl_unbind_req(zb_nwk_addr dst_addr16, zb_ieee_addr src_addr64, + unsigned char src_ep, unsigned short clusterid, zb_ieee_addr dst_addr64, + unsigned char type, zb_nwk_addr group_addr, unsigned char dst_ep, + zb_zdo_unbind_cb cb, void *user_data); +int zbl_mgmt_nwk_disc_req(zb_nwk_addr addr16, unsigned int scan_channels, + unsigned char scan_duration, unsigned char scan_count, unsigned char start_idx, + zb_zdo_mgmt_nwk_disc_cb cb, void *user_data); +int zbl_mgmt_nwk_update_req(unsigned int scan_channels, + unsigned char scan_duration, unsigned char scan_count, unsigned char nwk_update_id, + zb_nwk_addr nwk_manager_addr); +int zbl_mgmt_lqi_req(zb_nwk_addr addr16, unsigned char start_idx, + zb_zdo_mgmt_lqi_cb cb, void *user_data); +int zbl_mgmt_rtg_req(zb_nwk_addr addr16, unsigned char start_idx, + zb_zdo_mgmt_rtg_cb cb, void *user_data); +int zbl_mgmt_bind_req(zb_nwk_addr addr16, unsigned char start_idx, + zb_zdo_mgmt_bind_cb cb, void *user_data); +int zbl_mgmt_leave_device(zb_ieee_addr addr64, unsigned char remove_children, + unsigned rejoin, zb_zdo_mgmt_leave_cb cb, void *user_data); +int zbl_mgmt_permit_joining_req(zb_nwk_addr addr16, unsigned char duration, + unsigned char tc_significance, zb_zdo_mgmt_permit_joining_cb cb, void *user_data); + +/* Custom Commands */ +int zbl_aps_send(zb_nwk_addr addr16, unsigned char aps_fc, + unsigned char src_ep, unsigned char dst_ep, unsigned short clusterid, + unsigned short profileid, unsigned char zcl_fc, unsigned short mfg_code, + unsigned char cmd_id, unsigned short payload_len, unsigned char *payload, + zb_aps_send_cb cb, void *user_data); +int zbl_zcl_send(zb_nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep, + unsigned short clusterid, unsigned char zcl_fc, unsigned char cmd, + unsigned short payload_len, unsigned char *payload, + zb_zcl_send_cb cb, void *user_data); +int zbl_send_to_local(unsigned short length, unsigned char *data, + zb_send_to_local_cb cb, void *user_data); + +/* ZCL Global Commands */ +int zbl_read_attr_req(zb_zigbee_h handle, unsigned short addr16, unsigned char dest_ep, + unsigned char zcl_fc, unsigned short clusterid, unsigned short *attribute_ids, + int attribute_ids_len, zb_zcl_global_attr_read_cb cb, void *user_data); +int zbl_write_attr_req(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char src_ep, + unsigned char dst_ep, unsigned char zcl_fc, unsigned short clusterid, + void **records, + int count, zb_zcl_global_attr_write_cb cb, void *user_data); +int zbl_wattr_undivided_req(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, + unsigned short clusterid, void **records, int count, + zb_zcl_global_attr_write_cb cb, void *user_data); +int zbl_wattr_req_no_cb(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char src_ep, + unsigned char dst_ep, unsigned char zcl_fc, unsigned short clusterid, + void **records, int count); +int zbl_write_config_report(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, + unsigned short clusterid, void **records, int count, + zb_zcl_global_config_report_write_cb cb, void *user_data); +int zbl_read_config_report(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, + unsigned short clusterid, void **records, int count, + zb_zcl_global_config_report_read_cb cb, void *user_data); +int zbl_discover_attr_req(zb_zigbee_h handle, unsigned short addr16, + unsigned char src_ep, unsigned char dest_ep, unsigned char zcl_fc, + unsigned short clusterid, unsigned short start_id, unsigned char max_attribute_ids, + zb_zcl_global_attr_discover_cb cb, void *user_data); +int zbl_discover_cmds_gen(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, + unsigned short clusterid, unsigned char start_command_id, + unsigned char max_command_ids, zb_zcl_global_discover_cmds_cb cb, void *user_data); +int zbl_discover_cmds_recv(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, + unsigned short clusterid, unsigned char start_command_id, + unsigned char max_command_ids, zb_zcl_global_discover_cmds_cb cb, void *user_data); +int zbl_discover_attr_ext(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, + unsigned short clusterid, unsigned short start_id, unsigned char max_attribute_ids, + zb_zcl_global_attr_extended_discover_cb cb, void *user_data); + +/* ZCL Alarm Cluster */ +int zbl_reset_alarm(zb_nwk_addr addr16, unsigned char ep, unsigned char alarm_code, + unsigned short clusterid); +int zbl_reset_all_alarm(zb_nwk_addr addr16, unsigned char ep); +int zbl_get_alarm(zb_nwk_addr addr16, unsigned char ep, zb_zcl_alarm_get_alarm_cb cb, + void *user_data); +int zbl_reset_all_alarm_log(zb_nwk_addr addr16, unsigned char ep); + +/* ZCL Color Control Cluster */ +int zbl_ccontrol_move_to_hue(zb_nwk_addr addr16, unsigned char ep, + unsigned char hue, unsigned char direction, unsigned short transition_time); +int zbl_ccontrol_move_hue(zb_nwk_addr addr16, unsigned char ep, + unsigned char move_mode, unsigned char rate); +int zbl_ccontrol_step_hue(zb_nwk_addr addr16, unsigned char ep, + unsigned char step_mode, unsigned char step_size, unsigned char transition_time); +int zbl_ccontrol_move_to_saturation(zb_nwk_addr addr16, unsigned char ep, + unsigned char saturation, unsigned short transition_time); +int zbl_ccontrol_move_saturation(zb_nwk_addr addr16, unsigned char ep, + unsigned char move_mode, unsigned char rate); +int zbl_ccontrol_step_saturation(zb_nwk_addr addr16, unsigned char ep, + unsigned char step_mode, unsigned char step_size, unsigned char transition_time); +int zbl_ccontrol_move_to_hue_and_saturation(zb_nwk_addr addr16, unsigned char ep, + unsigned char hue, unsigned char saturation, unsigned short transition_time); +int zbl_ccontrol_move_to_color(zb_nwk_addr addr16, unsigned char ep, + unsigned short color_x, unsigned short color_y, unsigned short transition_time); +int zbl_ccontrol_move_color(zb_nwk_addr addr16, unsigned char ep, + unsigned short rate_x, unsigned short rate_y); +int zbl_ccontrol_step_color(zb_nwk_addr addr16, unsigned char ep, + unsigned short step_x, unsigned short step_y, unsigned short transition_time); +int zbl_ccontrol_move_to_color_temperature(zb_nwk_addr addr16, unsigned char ep, + unsigned short color_temperature, unsigned short transition_time); + +/* ZCL Basic Cluster */ +int zbl_reset_factory_default(zb_nwk_addr addr16, unsigned char ep); + +/* ZCL Identity Cluster */ +int zbl_identify(zb_nwk_addr addr16, unsigned char dst_ep, unsigned short identify_time); +int zbl_identify_query(zb_nwk_addr addr16, unsigned char dst_ep, + zb_zcl_identify_query_cb cb, void *user_data); + +/* ZCL Group Cluster */ +int zbl_add_group(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id, + const char *group_name, zb_zcl_group_add_group_cb cb, void *user_data); +int zbl_view_group(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id, + zb_zcl_group_view_group_cb cb, void *user_data); +int zbl_group_get_group_membership(zb_nwk_addr addr16, unsigned char ep, + unsigned char group_count, unsigned short *group_list, + zb_zcl_group_get_group_membership_cb cb, void *user_data); +int zbl_remove_group(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id, + zb_zcl_group_remove_group_cb cb, void *user_data); +int zbl_remove_all_group(zb_nwk_addr addr16, unsigned char ep); +int zbl_add_group_if_identifying(zb_nwk_addr addr16, unsigned char ep, + unsigned short group_id, const char *group_name); + +/* ZCL Level Control Cluster */ +int zbl_level_control_move_to_level(zb_nwk_addr addr16, unsigned char ep, + unsigned char level, unsigned short transition_time); +int zbl_level_control_move(zb_nwk_addr addr16, unsigned char ep, + unsigned char move_mode, unsigned char rate); +int zbl_level_control_step(zb_nwk_addr addr16, unsigned char ep, + unsigned char step_mode, unsigned char step_size, unsigned short transition_time); +int zbl_level_control_stop(zb_nwk_addr addr16, unsigned char ep); +int zbl_level_control_move_to_level_with_on_off(zb_nwk_addr addr16, + unsigned char ep, unsigned char level, unsigned short transition_time); +int zbl_level_control_move_with_on_off(zb_nwk_addr addr16, unsigned char ep, + unsigned char move_mode, unsigned char rate); +int zbl_level_control_step_with_on_off(zb_nwk_addr addr16, unsigned char ep, + unsigned char step_mode, unsigned char step_size, unsigned short transition_time); + +/* ZCL On/Off Cluster */ +int zbl_onoff_set(zb_nwk_addr addr16, unsigned char ep, unsigned char on_off_type); +int zbl_zone_enroll_response(zb_nwk_addr addr16, unsigned char dst_ep, + unsigned char enroll_response_code, unsigned char zone_id); + +/* Poll-control Cluster */ +int zbl_pollcontrol_check_in_response(zb_nwk_addr addr16, unsigned char ep, + unsigned char start_fast_polling, unsigned short fast_poll_timeout); +int zbl_pollcontrol_fast_poll_stop(zb_nwk_addr addr16, unsigned char ep); +int zbl_pollcontrol_set_long_poll_interval(zb_nwk_addr addr16, unsigned char ep, + unsigned int new_long_poll_interval, zb_zcl_pollctrl_check_in_cb cb, void *user_data); +int zbl_pollcontrol_set_short_poll_interval(zb_nwk_addr addr16, unsigned char ep, + unsigned int new_short_poll_interval, zb_zcl_pollctrl_check_in_cb cb, void *user_data); + +/* Scene Cluster */ +int zbl_add_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id, + unsigned char scene_id, unsigned short transition_time, const char *scene_name, + unsigned short ext_field_len, const char *extension_field_sets, + zb_zcl_scene_add_scene_cb cb, void *user_data); +int zbl_view_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id, + unsigned char scene_id, zb_zcl_scene_view_scene_cb cb, void *user_data); +int zbl_remove_scene(zb_nwk_addr addr16, unsigned char ep, + unsigned short group_id, unsigned char scene_id, zb_zcl_scene_remove_scene_cb cb, + void *user_data); +int zbl_remove_all_scene(zb_nwk_addr addr16, unsigned char ep, + unsigned short group_id, zb_zcl_scene_remove_all_scene_cb cb, void *user_data); +int zbl_store_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id, + unsigned char scene_id, zb_zcl_scene_store_scene_cb cb, void *user_data); +int zbl_recall_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id, + unsigned char scene_id); +int zbl_get_scene_membership(zb_nwk_addr addr16, unsigned char ep, + unsigned short group_id, zb_zcl_scene_get_scene_membership_cb cb, void *user_data); + +/* Thermostat Cluster */ +int zbl_thermostat_adjust_setpoint(zb_nwk_addr addr16, unsigned char ep, + unsigned char mode, unsigned char amount); + +#endif /* __TIZEN_NETWORK_ZIGBEE_LIBRARY_DBUS_H__ */ diff --git a/src/zbl-zcl-alarm.c b/src/zbl-zcl-alarm.c new file mode 100644 index 0000000..905cb42 --- /dev/null +++ b/src/zbl-zcl-alarm.c @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2016 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 "zbl.h" +#include "zbl-dbus.h" +#include "zb-common.h" + +API int zb_zcl_alarm_reset_alarm(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep, + unsigned char alarm_code, zb_cluster_id clusterid) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + + ret = zbl_reset_alarm(addr16, ep, alarm_code, clusterid); + return ret; +} + +API int zb_zcl_alarm_reset_all_alarm(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + + ret = zbl_reset_all_alarm(addr16, ep); + return ret; +} + +API int zb_zcl_alarm_get_alarm(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep, + zb_zcl_alarm_get_alarm_cb cb, void *user_data) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + + ret = zbl_get_alarm(addr16, ep, cb, user_data); + return ret; +} + +API int zb_zcl_alarm_reset_all_alarm_log(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + + ret = zbl_reset_all_alarm_log(addr16, ep); + return ret; +} + diff --git a/src/zbl-zcl-basic.c b/src/zbl-zcl-basic.c new file mode 100644 index 0000000..d46187b --- /dev/null +++ b/src/zbl-zcl-basic.c @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2016 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 "zbl.h" +#include "zbl-dbus.h" +#include "zb-common.h" + +API int zb_zcl_basic_reset_factory_default(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + ret = zbl_reset_factory_default(addr16, ep); + return ret; +} diff --git a/src/zbl-zcl-color-control.c b/src/zbl-zcl-color-control.c new file mode 100644 index 0000000..1668cdc --- /dev/null +++ b/src/zbl-zcl-color-control.c @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2016 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 "zbl.h" +#include "zbl-dbus.h" +#include "zb-common.h" + +API int zb_zcl_ccontrol_move_to_hue(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep, unsigned char hue, unsigned char direction, + unsigned short transition_time) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + + ret = zbl_ccontrol_move_to_hue(addr16, ep, hue, direction, transition_time); + return ret; +} + +API int zb_zcl_ccontrol_move_hue(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep, unsigned char move_mode, unsigned char rate) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + + ret = zbl_ccontrol_move_hue(addr16, ep, move_mode, rate); + return ret; +} + +API int zb_zcl_ccontrol_step_hue(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep, unsigned char step_mode, unsigned char step_size, + unsigned char transition_time) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + + ret = zbl_ccontrol_step_hue(addr16, ep, step_mode, step_size, transition_time); + return ret; +} + +API int zb_zcl_ccontrol_move_to_saturation(zb_zigbee_h handle, + zb_nwk_addr addr16, unsigned char ep, unsigned char saturation, + unsigned short transition_time) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + + ret = zbl_ccontrol_move_to_saturation(addr16, ep, saturation, transition_time); + return ret; +} + +API int zb_zcl_ccontrol_move_saturation(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep, unsigned char move_mode, unsigned char rate) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + + ret = zbl_ccontrol_move_saturation(addr16, ep, move_mode, rate); + return ret; +} + +API int zb_zcl_ccontrol_step_saturation(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep, unsigned char step_mode, unsigned char step_size, + unsigned char transition_time) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + + ret = zbl_ccontrol_step_saturation(addr16, ep, step_mode, step_size, transition_time); + return ret; +} + +API int zb_zcl_ccontrol_move_to_hue_and_saturation(zb_zigbee_h handle, + zb_nwk_addr addr16, unsigned char ep, unsigned char hue, unsigned char saturation, + unsigned short transition_time) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + + ret = zbl_ccontrol_move_to_hue_and_saturation(addr16, ep, hue, saturation, transition_time); + return ret; +} + +API int zb_zcl_ccontrol_move_to_color(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep, unsigned short color_x, unsigned short color_y, + unsigned short transition_time) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + + ret = zbl_ccontrol_move_to_color(addr16, ep, color_x, color_y, transition_time); + return ret; +} + +API int zb_zcl_ccontrol_move_color(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep, unsigned short rate_x, unsigned short rate_y) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + + ret = zbl_ccontrol_move_color(addr16, ep, rate_x, rate_y); + return ret; +} + +API int zb_zcl_ccontrol_step_color(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep, unsigned short step_x, unsigned short step_y, + unsigned short transition_time) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + + ret = zbl_ccontrol_step_color(addr16, ep, step_x, step_y, transition_time); + return ret; +} + +API int zb_zcl_ccontrol_move_to_color_temperature(zb_zigbee_h handle, + zb_nwk_addr addr16, unsigned char ep, unsigned short color_temperature, + unsigned short transition_time) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + + ret = zbl_ccontrol_move_to_color_temperature(addr16, ep, color_temperature, transition_time); + return ret; +} + diff --git a/src/zbl-zcl-global-cmd.c b/src/zbl-zcl-global-cmd.c new file mode 100644 index 0000000..1a57b89 --- /dev/null +++ b/src/zbl-zcl-global-cmd.c @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2016 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 "zbl.h" +#include "zbl-dbus.h" +#include "zb-common.h" + +/* For test */ +#define ZIGBEE_SUPPORT_ORDERED_SEQUENCE_DATA 0 + +API int zb_zcl_global_attr_read(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, + unsigned short clusterid, unsigned short *attribute_ids, int attribute_ids_len, + zb_zcl_global_attr_read_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + RETV_IF(NULL == attribute_ids, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0 == attribute_ids_len, ZIGBEE_ERROR_INVALID_PARAMETER); + ret = zbl_read_attr_req(handle, addr16, dst_ep, zcl_fc, clusterid, + attribute_ids, attribute_ids_len, cb, user_data); + return ret; +} + +API int zb_zcl_global_attr_read_structured(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, + unsigned short clusterid, zb_zcl_read_structured_attr_record_h *records, + int count, zb_zcl_global_attr_read_cb cb, void *user_data) +{ +#if (0 == ZIGBEE_SUPPORT_ORDERED_SEQUENCE_DATA) + return ZIGBEE_ERROR_NOT_SUPPORTED; +#endif + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0 == count, ZIGBEE_ERROR_INVALID_PARAMETER); + + return ZIGBEE_ERROR_NONE; +} + +API int zb_zcl_global_attr_write(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, + unsigned short clusterid, zb_zcl_write_attr_record_h *records, int count, + zb_zcl_global_attr_write_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0 == count, ZIGBEE_ERROR_INVALID_PARAMETER); + ret = zbl_write_attr_req(handle, addr16, src_ep, dst_ep, zcl_fc, + clusterid, records, count, cb, user_data); + return ret; +} + +API int zb_zcl_global_attr_write_undivided(zb_zigbee_h handle, + zb_nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep, + unsigned char zcl_fc, unsigned short clusterid, + zb_zcl_write_attr_record_h *records, int count, + zb_zcl_global_attr_write_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0 == count, ZIGBEE_ERROR_INVALID_PARAMETER); + ret = zbl_wattr_undivided_req(handle, addr16, src_ep, dst_ep, zcl_fc, + clusterid, records, count, cb, user_data); + return ret; +} + +API int zb_zcl_global_attr_write_structured(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, + unsigned short clusterid, zb_zcl_write_attr_structured_record_h *records, + int count, zb_zcl_global_attr_write_cb cb, void *user_data) +{ +#if (0 == ZIGBEE_SUPPORT_ORDERED_SEQUENCE_DATA) + return ZIGBEE_ERROR_NOT_SUPPORTED; +#endif + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0 == count, ZIGBEE_ERROR_INVALID_PARAMETER); + + return ZIGBEE_ERROR_NONE; +} + +API int zb_zcl_global_attr_write_no_rsp(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, + unsigned short clusterid, zb_zcl_write_attr_record_h *records, int count) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0 == count, ZIGBEE_ERROR_INVALID_PARAMETER); + ret = zbl_wattr_req_no_cb(handle, addr16, src_ep, dst_ep, zcl_fc, + clusterid, records, count); + return ret; +} + +API int zb_zcl_global_config_report_write(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, + unsigned short clusterid, zb_zcl_reporting_config_record_h *records, int count, + zb_zcl_global_config_report_write_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0 == count, ZIGBEE_ERROR_INVALID_PARAMETER); + ret = zbl_write_config_report(handle, addr16, src_ep, dst_ep, zcl_fc, + clusterid, records, count, cb, user_data); + return ret; +} + +API int zb_zcl_global_config_report_read(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, + unsigned short clusterid, zb_zcl_read_report_config_record_h *records, + int count, zb_zcl_global_config_report_read_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0 == count, ZIGBEE_ERROR_INVALID_PARAMETER); + ret = zbl_read_config_report(handle, addr16, src_ep, dst_ep, zcl_fc, + clusterid, records, count, cb, user_data); + return ret; +} + +API int zb_zcl_global_attr_discover(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc, + unsigned short clusterid, unsigned short start_id, unsigned char max_attribute_ids, + zb_zcl_global_attr_discover_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + ret = zbl_discover_attr_req(handle, addr16, src_ep, dst_ep, zcl_fc, + clusterid, start_id, max_attribute_ids, cb, user_data); + return ret; +} + +API int zb_zcl_global_discover_cmds_received(zb_zigbee_h handle, + zb_nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep, + unsigned char zcl_fc, unsigned short clusterid, unsigned char start_command_id, + unsigned char max_command_ids, zb_zcl_global_discover_cmds_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + ret = zbl_discover_cmds_recv(handle, addr16, src_ep, dst_ep, zcl_fc, + clusterid, start_command_id, max_command_ids, cb, user_data); + return ret; +} + +API int zb_zcl_global_discover_cmds_generated(zb_zigbee_h handle, + zb_nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep, + unsigned char zcl_fc, unsigned short clusterid, unsigned char start_command_id, + unsigned char max_command_ids, zb_zcl_global_discover_cmds_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + ret = zbl_discover_cmds_gen(handle, addr16, src_ep, dst_ep, zcl_fc, + clusterid, start_command_id, max_command_ids, cb, user_data); + return ret; +} + +API int zb_zcl_global_attr_extended_discover(zb_zigbee_h handle, + zb_nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep, + unsigned char zcl_fc, unsigned short clusterid, unsigned short start_id, + unsigned char max_attribute_ids, zb_zcl_global_attr_extended_discover_cb cb, + void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + ret = zbl_discover_attr_ext(handle, addr16, src_ep, dst_ep, zcl_fc, + clusterid, start_id, max_attribute_ids, cb, user_data); + return ret; +} diff --git a/src/zbl-zcl-groups.c b/src/zbl-zcl-groups.c new file mode 100644 index 0000000..ae54a92 --- /dev/null +++ b/src/zbl-zcl-groups.c @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2016 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 "zbl.h" +#include "zbl-dbus.h" +#include "zb-common.h" + +API int zb_zcl_group_add_group(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep, unsigned short group_id, char *group_name, + zb_zcl_group_add_group_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + RETV_IF(NULL == group_name, ZIGBEE_ERROR_INVALID_PARAMETER); + ret = zbl_add_group(addr16, ep, group_id, group_name, cb, user_data); + return ret; +} + +API int zb_zcl_group_view_group(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep, unsigned short group_id, zb_zcl_group_view_group_cb cb, + void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + ret = zbl_view_group(addr16, ep, group_id, cb, user_data); + return ret; +} + +API int zb_zcl_group_get_group_membership(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep, unsigned char group_count, unsigned short *group_list, + zb_zcl_group_get_group_membership_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + RETV_IF(NULL == group_list, ZIGBEE_ERROR_INVALID_PARAMETER); + ret = zbl_group_get_group_membership(addr16, ep, group_count, group_list, cb, user_data); + return ret; +} + +API int zb_zcl_group_remove_group(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep, unsigned short group_id, zb_zcl_group_remove_group_cb cb, + void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + ret = zbl_remove_group(addr16, ep, group_id, cb, user_data); + return ret; +} + +API int zb_zcl_group_remove_all_group(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + ret = zbl_remove_all_group(addr16, ep); + return ret; +} + +API int zb_zcl_group_add_group_if_identifying(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep, unsigned short group_id, const char *group_name) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + ret = zbl_add_group_if_identifying(addr16, ep, group_id, group_name); + return ret; +} diff --git a/src/zbl-zcl-identify.c b/src/zbl-zcl-identify.c new file mode 100644 index 0000000..984c725 --- /dev/null +++ b/src/zbl-zcl-identify.c @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2016 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 "zbl.h" +#include "zbl-dbus.h" +#include "zb-common.h" + +API int zb_zcl_identify(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep, + unsigned short identify_time) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + ret = zbl_identify(addr16, ep, identify_time); + return ret; +} + +API int zb_zcl_identify_query(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep, + zb_zcl_identify_query_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + ret = zbl_identify_query(addr16, ep, cb, user_data); + return ret; +} diff --git a/src/zbl-zcl-isa-zone.c b/src/zbl-zcl-isa-zone.c new file mode 100644 index 0000000..8d8aa66 --- /dev/null +++ b/src/zbl-zcl-isa-zone.c @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2016 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 "zbl.h" +#include "zbl-dbus.h" +#include "zb-common.h" + +API int zb_zcl_zone_enroll_response(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep, unsigned char enroll_response_code, unsigned char zone_id) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + ret = zbl_zone_enroll_response(addr16, ep, enroll_response_code, zone_id); + return ret; +} diff --git a/src/zbl-zcl-level-control.c b/src/zbl-zcl-level-control.c new file mode 100644 index 0000000..24022a9 --- /dev/null +++ b/src/zbl-zcl-level-control.c @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2016 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 "zbl.h" +#include "zbl-dbus.h" +#include "zb-common.h" + +API int zb_zcl_levelctrl_move_to_level(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep, unsigned char level, unsigned short transition_time) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + + ret = zbl_level_control_move_to_level(addr16, ep, level, transition_time); + return ret; +} + +API int zb_zcl_levelctrl_move(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep, unsigned char move_mode, unsigned char rate) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + + ret = zbl_level_control_move(addr16, ep, move_mode, rate); + return ret; +} + +API int zb_zcl_levelctrl_step(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep, + unsigned char step_mode, unsigned char step_size, unsigned short transition_time) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + + ret = zbl_level_control_step(addr16, ep, step_mode, step_size, transition_time); + return ret; +} + +API int zb_zcl_levelctrl_stop(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + + ret = zbl_level_control_stop(addr16, ep); + return ret; +} + +API int zb_zcl_levelctrl_move_to_level_with_on_off(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep, unsigned char level, unsigned short transition_time) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + + ret = zbl_level_control_move_to_level_with_on_off(addr16, ep, level, transition_time); + return ret; +} + +API int zb_zcl_levelctrl_move_with_on_off(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep, unsigned char move_mode, unsigned char rate) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + + ret = zbl_level_control_move_with_on_off(addr16, ep, move_mode, rate); + return ret; +} + +API int zb_zcl_levelctrl_step_with_on_off(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep, unsigned char step_mode, unsigned char step_size, + unsigned short transition_time) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + + ret = zbl_level_control_step_with_on_off(addr16, ep, step_mode, step_size, transition_time); + return ret; +} + diff --git a/src/zbl-zcl-on-off.c b/src/zbl-zcl-on-off.c new file mode 100644 index 0000000..3999c56 --- /dev/null +++ b/src/zbl-zcl-on-off.c @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2016 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 "zbl.h" +#include "zbl-dbus.h" +#include "zb-common.h" + +API int zb_zcl_on_off_control(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep, + zb_zcl_on_off_e on_off_type) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + + ret = zbl_onoff_set(addr16, ep, on_off_type); + return ret; +} diff --git a/src/zbl-zcl-poll-control.c b/src/zbl-zcl-poll-control.c new file mode 100644 index 0000000..27e634a --- /dev/null +++ b/src/zbl-zcl-poll-control.c @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2016 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 "zbl.h" +#include "zbl-dbus.h" +#include "zb-common.h" + +API int zb_zcl_pollctrl_check_in_response(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep, unsigned char start_fast_polling, unsigned short fast_poll_timeout) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + ret = zbl_pollcontrol_check_in_response(addr16, ep, start_fast_polling, + fast_poll_timeout); + return ret; +} + +API int zb_zcl_pollctrl_fast_poll_stop(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + ret = zbl_pollcontrol_fast_poll_stop(addr16, ep); + return ret; +} + +API int zb_zcl_pollctrl_set_long_poll_interval(zb_zigbee_h handle, + zb_nwk_addr addr16, unsigned char ep, unsigned int new_long_poll_interval, + zb_zcl_pollctrl_check_in_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + ret = zbl_pollcontrol_set_long_poll_interval(addr16, ep, new_long_poll_interval, + cb, user_data); + return ret; +} + +API int zb_zcl_pollctrl_set_short_poll_interval(zb_zigbee_h handle, + zb_nwk_addr addr16, unsigned char ep, unsigned int new_short_poll_interval, + zb_zcl_pollctrl_check_in_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + ret = zbl_pollcontrol_set_short_poll_interval(addr16, ep, new_short_poll_interval, + cb, user_data); + return ret; +} diff --git a/src/zbl-zcl-scenes.c b/src/zbl-zcl-scenes.c new file mode 100644 index 0000000..190f6df --- /dev/null +++ b/src/zbl-zcl-scenes.c @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2016 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 "zbl.h" +#include "zbl-dbus.h" +#include "zb-common.h" + +API int zb_zcl_scene_add_scene(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep, + unsigned short group_id, unsigned char scene_id, unsigned short transition_time, + const char *scene_name, unsigned short ext_field_len, + const char *extension_field_sets, zb_zcl_scene_add_scene_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + RETV_IF(NULL == scene_name, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == extension_field_sets, ZIGBEE_ERROR_INVALID_PARAMETER); + ret = zbl_add_scene(addr16, ep, group_id, scene_id, transition_time, scene_name, + ext_field_len, extension_field_sets, cb, user_data); + return ret; +} + +API int zb_zcl_scene_view_scene(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep, + unsigned short group_id, unsigned char scene_id, zb_zcl_scene_view_scene_cb cb, + void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + ret = zbl_view_scene(addr16, ep, group_id, scene_id, cb, user_data); + return ret; +} + +API int zb_zcl_scene_remove_scene(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep, unsigned short group_id, unsigned char scene_id, + zb_zcl_scene_remove_scene_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + ret = zbl_remove_scene(addr16, ep, group_id, scene_id, cb, user_data); + return ret; +} + +API int zb_zcl_scene_remove_all_scene(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep, unsigned short group_id, zb_zcl_scene_remove_all_scene_cb cb, + void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + ret = zbl_remove_all_scene(addr16, ep, group_id, cb, user_data); + return ret; +} + +API int zb_zcl_scene_store_scene(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep, + unsigned short group_id, unsigned char scene_id, zb_zcl_scene_store_scene_cb cb, + void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + ret = zbl_store_scene(addr16, ep, group_id, scene_id, cb, user_data); + return ret; +} + +API int zb_zcl_scene_recall_scene(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep, unsigned short group_id, unsigned char scene_id) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + ret = zbl_recall_scene(addr16, ep, group_id, scene_id); + return ret; +} + +API int zb_zcl_scene_get_scene_membership(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep, unsigned short group_id, + zb_zcl_scene_get_scene_membership_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + ret = zbl_get_scene_membership(addr16, ep, group_id, cb, user_data); + return ret; +} + diff --git a/src/zbl-zcl-thermostat.c b/src/zbl-zcl-thermostat.c new file mode 100644 index 0000000..09edcd5 --- /dev/null +++ b/src/zbl-zcl-thermostat.c @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2016 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 "zbl.h" +#include "zbl-dbus.h" +#include "zb-common.h" + +API int zb_zcl_thermostat_adjust_setpoint(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char ep, unsigned char mode, unsigned char amount) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(0x02 < mode, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + + ret = zbl_thermostat_adjust_setpoint(addr16, ep, mode, amount); + return ret; +} + diff --git a/src/zbl-zcl.c b/src/zbl-zcl.c new file mode 100644 index 0000000..871b49f --- /dev/null +++ b/src/zbl-zcl.c @@ -0,0 +1,1408 @@ +/* + * Copyright (c) 2016 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 +#include +#include + +#include "zbl.h" +#include "zbl-dbus.h" +#include "zb-common.h" + +#define ZB_GUARD_CHAR 1 +#define ZB_ZCL_OCTET_SIZE 1 +#define ZB_ZCL_LONG_OCTET_SIZE 2 + +API int zb_read_attr_status_record_create( + zb_zcl_read_attr_status_record_h *handle) +{ + zb_zcl_read_attr_status_record_h simple = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + CHECK_ZIGBEE_PRIVILEGE(); + + simple = calloc(1, sizeof(struct read_attribute_status_record_s)); + RETVM_IF(NULL == simple, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + *handle = simple; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_read_attr_status_record_clone(zb_zcl_read_attr_status_record_h src, + zb_zcl_read_attr_status_record_h *dst) +{ + struct read_attribute_status_record_s *srcs = src; + struct read_attribute_status_record_s *desc = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER); + + desc = calloc(1, sizeof(struct read_attribute_status_record_s)); + RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + memcpy(desc, src, sizeof(struct read_attribute_status_record_s)); + desc->value = calloc(1, zb_zcl_get_data_size(srcs->type)); + RETVM_IF(NULL == desc->value, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + memcpy(desc->value, srcs->value, zb_zcl_get_data_size(srcs->type)); + *dst = desc; + + return ZIGBEE_ERROR_NONE; +} + + +API int zb_read_attr_status_record_destroy( + zb_zcl_read_attr_status_record_h handle) +{ + struct read_attribute_status_record_s* h = handle; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + + if (h->value) + free(h->value); + free(h); + + return ZIGBEE_ERROR_NONE; +} + +API int zb_read_attr_status_record_get_id( + zb_zcl_read_attr_status_record_h handle, unsigned short* id) +{ + struct read_attribute_status_record_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == id, ZIGBEE_ERROR_INVALID_PARAMETER); + + *id = h->id; + return ZIGBEE_ERROR_NONE; +} + +API int zb_read_attr_status_record_set_id( + zb_zcl_read_attr_status_record_h handle, unsigned short id) +{ + struct read_attribute_status_record_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + + h->id = id; + return ZIGBEE_ERROR_NONE; +} + +API int zb_read_attr_status_record_get_status( + zb_zcl_read_attr_status_record_h handle, zb_zcl_status_e* status) +{ + struct read_attribute_status_record_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER); + + *status = h->status; + return ZIGBEE_ERROR_NONE; +} + +API int zb_read_attr_status_record_set_status( + zb_zcl_read_attr_status_record_h handle, zb_zcl_status_e status) +{ + struct read_attribute_status_record_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + + h->status = status; + return ZIGBEE_ERROR_NONE; +} + +API int zb_read_attr_status_record_get_type( + zb_zcl_read_attr_status_record_h handle, zb_zcl_data_type_e *type) +{ + struct read_attribute_status_record_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == type, ZIGBEE_ERROR_INVALID_PARAMETER); + + *type = h->type; + return ZIGBEE_ERROR_NONE; +} + +API int zb_read_attr_status_record_set_type( + zb_zcl_read_attr_status_record_h handle, zb_zcl_data_type_e type) +{ + struct read_attribute_status_record_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0 >= zb_zcl_get_data_size(type), ZIGBEE_ERROR_INVALID_PARAMETER); + + h->type = type; + return ZIGBEE_ERROR_NONE; +} + +API int zb_read_attr_status_record_get_value( + zb_zcl_read_attr_status_record_h handle, zb_zcl_data_type_e* type, + unsigned char** value, int* count) +{ + int len = -1; + struct read_attribute_status_record_s* h = handle; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == value, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == h->value, ZIGBEE_ERROR_NO_DATA); + + len = zb_zcl_get_data_size(h->type); + if (0 < len) { + + *value = calloc(len + ZB_GUARD_CHAR, sizeof(char)); + RETV_IF(NULL == *value, ZIGBEE_ERROR_OUT_OF_MEMORY); + memcpy(*value, h->value, len); + *type = h->type; + *count = len; + + } else if (ZB_ZCL_OCTET_STRING == h->type || ZB_ZCL_CHARACTER_STRING == h->type) { + + len = h->value[0]; + + *value = calloc(len + ZB_GUARD_CHAR, sizeof(char)); + RETV_IF(NULL == *value, ZIGBEE_ERROR_OUT_OF_MEMORY); + memcpy(*value, h->value + ZB_ZCL_OCTET_SIZE, len); + + *type = h->type; + *count = len; + + } else if (ZB_ZCL_LONG_OCTET_STRING == h->type || ZB_ZCL_LONG_CHARACTER_STRING == h->type) { + + len = h->value[0] & 0xff; + len |= (h->value[1] << 8) & 0xff00 ; + + *value = calloc(len + ZB_GUARD_CHAR, sizeof(char)); + RETV_IF(NULL == *value, ZIGBEE_ERROR_OUT_OF_MEMORY); + memcpy(*value, h->value + ZB_ZCL_LONG_OCTET_SIZE, len); + + *type = h->type; + *count = len; + + } else { + return ZIGBEE_ERROR_NOT_SUPPORTED; + } + + return ZIGBEE_ERROR_NONE; +} + +API int zb_read_attr_status_record_set_value( + zb_zcl_read_attr_status_record_h handle, zb_zcl_data_type_e type, + unsigned char* value, int count) +{ + int len = -1; + struct read_attribute_status_record_s* h = handle; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == value, ZIGBEE_ERROR_INVALID_PARAMETER); + + len = zb_zcl_get_data_size(type); + if (0 < len) { + + h->value = calloc(len + ZB_GUARD_CHAR, sizeof(char)); + RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY); + memcpy(h->value, value, len); + h->type = type; + + } else if (ZB_ZCL_OCTET_STRING == type || ZB_ZCL_CHARACTER_STRING == type) { + + h->value = calloc(count + ZB_ZCL_OCTET_SIZE + ZB_GUARD_CHAR, sizeof(char)); + RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY); + + h->value[0] = count; + memcpy(h->value + ZB_ZCL_OCTET_SIZE, value + ZB_ZCL_OCTET_SIZE, count); + + } else if (ZB_ZCL_LONG_OCTET_STRING == type || ZB_ZCL_LONG_CHARACTER_STRING == type) { + + h->value = calloc(count + ZB_ZCL_LONG_OCTET_SIZE + ZB_GUARD_CHAR, sizeof(char)); + RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY); + + h->value[0] = count & 0xff; + h->value[1] = (count >> 8) & 0xff ; + memcpy(h->value + ZB_ZCL_LONG_OCTET_SIZE, value, len); + + } else { + return ZIGBEE_ERROR_NOT_SUPPORTED; + } + + return ZIGBEE_ERROR_NONE; +} + +API int zb_discover_attr_info_create(zb_zcl_discover_attr_info_record_h *handle) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + zb_zcl_discover_attr_info_record_h simple = NULL; + + CHECK_ZIGBEE_PRIVILEGE(); + + simple = calloc(1, sizeof(struct discover_attribute_info_record_s)); + RETVM_IF(NULL == simple, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + *handle = simple; + return ZIGBEE_ERROR_NONE; +} + +API int zb_discover_attr_info_clone(zb_zcl_discover_attr_info_record_h src, + zb_zcl_discover_attr_info_record_h *dst) +{ + struct discover_attribute_info_record_s *srcs = src; + struct discover_attribute_info_record_s *desc = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER); + + desc = calloc(1, sizeof(struct discover_attribute_info_record_s)); + RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + memcpy(desc, srcs, sizeof(struct discover_attribute_info_record_s)); + + *dst = desc; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_discover_attr_info_destroy(zb_zcl_discover_attr_info_record_h handle) +{ + struct discover_attribute_info_record_s *h = handle; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + + free(h); + + return ZIGBEE_ERROR_NONE; +} + +API int zb_discover_attr_info_get_id( + zb_zcl_discover_attr_info_record_h handle, unsigned short *id) +{ + struct discover_attribute_info_record_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == id, ZIGBEE_ERROR_INVALID_PARAMETER); + + *id = h->id; + return ZIGBEE_ERROR_NONE; +} + +API int zb_discover_attr_info_set_id( + zb_zcl_discover_attr_info_record_h handle, unsigned short id) +{ + struct discover_attribute_info_record_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + + h->id = id; + return ZIGBEE_ERROR_NONE; +} + +API int zb_discover_attr_info_get_type( + zb_zcl_discover_attr_info_record_h handle, zb_zcl_data_type_e *type) +{ + struct discover_attribute_info_record_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == type, ZIGBEE_ERROR_INVALID_PARAMETER); + + *type = h->type; + return ZIGBEE_ERROR_NONE; +} + +API int zb_discover_attr_info_set_type( + zb_zcl_discover_attr_info_record_h handle, zb_zcl_data_type_e type) +{ + struct discover_attribute_info_record_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0 >= zb_zcl_get_data_size(type), ZIGBEE_ERROR_INVALID_PARAMETER); + + h->type = type; + return ZIGBEE_ERROR_NONE; +} + +API int zb_write_attr_record_create(zb_zcl_write_attr_record_h *handle) +{ + zb_zcl_write_attr_record_h t = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + CHECK_ZIGBEE_PRIVILEGE(); + + t = calloc(1, sizeof(struct write_attribute_record_s)); + RETVM_IF(NULL == t, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + *handle = t; + return ZIGBEE_ERROR_NONE; +} + +API int zb_write_attr_record_clone(zb_zcl_write_attr_record_h src, + zb_zcl_write_attr_record_h *dst) +{ + struct write_attribute_record_s *srcs = src; + struct write_attribute_record_s *desc = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER); + + desc = calloc(1, sizeof(struct write_attribute_record_s)); + RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + memcpy(desc, src, sizeof(struct write_attribute_record_s)); + + desc->value = calloc(1, zb_zcl_get_data_size(srcs->type)); + RETVM_IF(NULL == desc->value, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + memcpy(desc->value, srcs->value, zb_zcl_get_data_size(srcs->type)); + *dst = desc; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_write_attr_record_destroy(zb_zcl_write_attr_record_h handle) +{ + struct write_attribute_record_s* h = handle; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + + if (h->value) { + free(h->value); + h->value = NULL; + } + free(h); + h = NULL; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_write_attr_record_set_id(zb_zcl_write_attr_record_h handle, + unsigned short id) +{ + struct write_attribute_record_s* h = handle; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + h->id = id; + return ZIGBEE_ERROR_NONE; +} + +API int zb_write_attr_record_set_type(zb_zcl_write_attr_record_h handle, + zb_zcl_data_type_e type) +{ + struct write_attribute_record_s* h = handle; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0 >= zb_zcl_get_data_size(type), ZIGBEE_ERROR_INVALID_PARAMETER); + + h->type = type; + return ZIGBEE_ERROR_NONE; +} + +API int zb_write_attr_record_set_value(zb_zcl_write_attr_record_h handle, + zb_zcl_data_type_e type, unsigned char* value, int count) +{ + int len = -1; + + struct write_attribute_record_s* h = handle; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == value, ZIGBEE_ERROR_INVALID_PARAMETER); + + if (h->value) { + free(h->value); + h->value = NULL; + } + + len = zb_zcl_get_data_size(type); + if (0 < len) { + + h->value = calloc(len + ZB_GUARD_CHAR , sizeof(char)); + RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY); + memcpy(h->value, value, count); + h->type = type; + + } else if (ZB_ZCL_OCTET_STRING == type || ZB_ZCL_CHARACTER_STRING == type) { + + h->value = calloc(count + ZB_ZCL_OCTET_SIZE + ZB_GUARD_CHAR, sizeof(char)); + RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY); + /* The first 1 byte indicate invalid or length of string */ + h->value[0] = value[0] & 0xff; + memcpy(h->value + ZB_ZCL_OCTET_SIZE, value, count); + + } else if (ZB_ZCL_LONG_OCTET_STRING == type || ZB_ZCL_LONG_CHARACTER_STRING == type) { + + h->value = calloc(count + ZB_ZCL_LONG_OCTET_SIZE + ZB_GUARD_CHAR, sizeof(char)); + RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY); + + /* The first 2 byte indicate invalid or length of string */ + h->value[0] = count & 0xff; + h->value[1] = (count >> 8) & 0xff ; + + memcpy(h->value + ZB_ZCL_LONG_OCTET_SIZE, value, count); + + } else { + return ZIGBEE_ERROR_NOT_SUPPORTED; + } + + return ZIGBEE_ERROR_NONE; +} + +API int zb_write_attr_status_create(zb_zcl_write_attr_status_record_h *handle) +{ + zb_zcl_write_attr_status_record_h simple = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + CHECK_ZIGBEE_PRIVILEGE(); + + simple = calloc(1, sizeof(struct write_attribute_status_record_s)); + RETVM_IF(NULL == simple, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + *handle = simple; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_write_attr_status_clone(zb_zcl_write_attr_status_record_h src, + zb_zcl_write_attr_status_record_h *dst) +{ + struct write_attribute_status_record_s *srcs = src; + struct write_attribute_status_record_s *desc = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER); + + desc = calloc(1, sizeof(struct write_attribute_status_record_s)); + RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + memcpy(desc, srcs, sizeof(struct write_attribute_status_record_s)); + + *dst = desc; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_write_attr_status_destroy(zb_zcl_write_attr_status_record_h handle) +{ + struct write_attribute_status_record_s *h = handle; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + + free(h); + return ZIGBEE_ERROR_NONE; +} + +API int zb_write_attr_status_get_status( + zb_zcl_write_attr_status_record_h handle, zb_zcl_status_e *status) +{ + struct write_attribute_status_record_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER); + + *status = h->status; + return ZIGBEE_ERROR_NONE; +} + +API int zb_write_attr_status_set_status(zb_zcl_write_attr_status_record_h handle, + zb_zcl_status_e status) +{ + struct write_attribute_status_record_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + + h->status = status; + return ZIGBEE_ERROR_NONE; +} + +API int zb_write_attr_status_get_id(zb_zcl_write_attr_status_record_h handle, + unsigned short *id) +{ + struct write_attribute_status_record_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == id, ZIGBEE_ERROR_INVALID_PARAMETER); + + *id = h->id; + return ZIGBEE_ERROR_NONE; +} + +API int zb_write_attr_status_set_id(zb_zcl_write_attr_status_record_h handle, + unsigned short id) +{ + struct write_attribute_status_record_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + + h->id = id; + return ZIGBEE_ERROR_NONE; +} + +API int zb_report_config_record_create(zb_zcl_reporting_config_record_h *handle) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + zb_zcl_reporting_config_record_h t = NULL; + + CHECK_ZIGBEE_PRIVILEGE(); + + t = calloc(1, sizeof(struct reporting_configuration_record_s)); + RETVM_IF(NULL == t, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + *handle = t; + return ZIGBEE_ERROR_NONE; +} + +API int zb_report_config_record_clone(zb_zcl_reporting_config_record_h src, + zb_zcl_reporting_config_record_h *dst) +{ + struct reporting_configuration_record_s *srcs = src; + struct reporting_configuration_record_s *desc = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER); + + desc = calloc(1, sizeof(struct reporting_configuration_record_s)); + RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + memcpy(desc, src, sizeof(struct reporting_configuration_record_s)); + + desc->change = calloc(1, zb_zcl_get_data_size(srcs->type)); + RETVM_IF(NULL == desc->change, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + memcpy(desc->change, srcs->change, zb_zcl_get_data_size(srcs->type)); + *dst = desc; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_report_config_record_destroy(zb_zcl_reporting_config_record_h handle) +{ + struct reporting_configuration_record_s *h = handle; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + + if (h->change) + free(h->change); + free(h); + + return ZIGBEE_ERROR_NONE; +} + +API int zb_report_config_record_get_dir(zb_zcl_reporting_config_record_h handle, + zb_zcl_fc_direction_e *dir) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct reporting_configuration_record_s *h = handle; + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == dir, ZIGBEE_ERROR_INVALID_PARAMETER); + *dir = h->dir; + return ZIGBEE_ERROR_NONE; +} + +API int zb_report_config_record_set_dir(zb_zcl_reporting_config_record_h handle, + zb_zcl_fc_direction_e dir) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct reporting_configuration_record_s *h = handle; + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + if (dir == ZB_ZCL_CLIENT_TO_SERVER) + h->dir = 0x00 ; + else + h->dir = 0x01; + return ZIGBEE_ERROR_NONE; +} + +API int zb_report_config_record_get_id(zb_zcl_reporting_config_record_h handle, + unsigned short *id) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct reporting_configuration_record_s *h = handle; + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == id, ZIGBEE_ERROR_INVALID_PARAMETER); + *id = h->id; + return ZIGBEE_ERROR_NONE; +} + +API int zb_report_config_record_set_id(zb_zcl_reporting_config_record_h handle, + unsigned short id) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct reporting_configuration_record_s *h = handle; + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + h->id = id ; + return ZIGBEE_ERROR_NONE; +} + + +API int zb_report_config_record_get_type( + zb_zcl_reporting_config_record_h handle, zb_zcl_data_type_e *type) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct reporting_configuration_record_s *h = handle; + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == type, ZIGBEE_ERROR_INVALID_PARAMETER); + *type = h->type; + return ZIGBEE_ERROR_NONE; +} + +API int zb_report_config_record_get_min_interval( + zb_zcl_reporting_config_record_h handle, unsigned short *min_i) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct reporting_configuration_record_s *h = handle; + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == min_i, ZIGBEE_ERROR_INVALID_PARAMETER); + *min_i = h->min_i; + return ZIGBEE_ERROR_NONE; +} + +API int zb_report_config_record_set_min_interval( + zb_zcl_reporting_config_record_h handle, unsigned short min_i) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct reporting_configuration_record_s *h = handle; + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + h->min_i = min_i; + return ZIGBEE_ERROR_NONE; +} + +API int zb_report_config_record_get_max_interval( + zb_zcl_reporting_config_record_h handle, unsigned short *max_i) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct reporting_configuration_record_s *h = handle; + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == max_i, ZIGBEE_ERROR_INVALID_PARAMETER); + *max_i = h->max_i; + return ZIGBEE_ERROR_NONE; +} + +API int zb_report_config_record_set_max_interval( + zb_zcl_reporting_config_record_h handle, unsigned short max_i) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct reporting_configuration_record_s *h = handle; + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + h->max_i = max_i; + return ZIGBEE_ERROR_NONE; +} + +API int zb_report_config_record_get_timeout( + zb_zcl_reporting_config_record_h handle, unsigned short *to) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct reporting_configuration_record_s *h = handle; + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == to, ZIGBEE_ERROR_INVALID_PARAMETER); + *to = h->to; + return ZIGBEE_ERROR_NONE; +} + +API int zb_report_config_record_set_timeout( + zb_zcl_reporting_config_record_h handle, unsigned short to) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct reporting_configuration_record_s *h = handle; + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + h->to = to; + return ZIGBEE_ERROR_NONE; +} + +API int zb_report_config_record_get_change( + zb_zcl_reporting_config_record_h handle, zb_zcl_data_type_e *type, + unsigned char **value, int *count) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + int len = -1; + unsigned char *temp = NULL; + int data_type = ZB_ZCL_DATA_TYPE_NONE; + + struct reporting_configuration_record_s *h = handle; + + NOT_USED(data_type); + + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == value, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == h->change, ZIGBEE_ERROR_NO_DATA); + + len = zb_zcl_get_data_size(h->type); + data_type = zb_zcl_get_analog_or_discret(h->type); + if (0 < len /* && ZB_ZCL_DATA_TYPE_ANALOG == data_type */) { + + temp = calloc(len, sizeof(char)); + RETV_IF(NULL == temp, ZIGBEE_ERROR_OUT_OF_MEMORY); + memcpy(temp, h->change, len); + *type = h->type; + *count = len; + *value = temp; + + } else { + return ZIGBEE_ERROR_NOT_SUPPORTED; + } + + return ZIGBEE_ERROR_NONE; +} + +API int zb_report_config_record_set_change( + zb_zcl_reporting_config_record_h handle, zb_zcl_data_type_e type, unsigned char *value) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + int len = -1; + int data_type = ZB_ZCL_DATA_TYPE_NONE; + + struct reporting_configuration_record_s *h = handle; + + NOT_USED(data_type); + + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + if (h->change) + free(h->change); + + len = zb_zcl_get_data_size(type); + data_type = zb_zcl_get_analog_or_discret(type); + + if (0 < len /* && ZB_ZCL_DATA_TYPE_ANALOG == data_type */) { + h->change = calloc(len + 1, sizeof(unsigned char)); + RETV_IF(NULL == h->change, ZIGBEE_ERROR_OUT_OF_MEMORY); + memcpy(h->change, value, len); + h->type = type; + } else { + return ZIGBEE_ERROR_NOT_SUPPORTED; + } + + return ZIGBEE_ERROR_NONE; +} + +API int zb_read_report_config_record_create( + zb_zcl_read_report_config_record_h *handle) +{ + zb_zcl_read_report_config_record_h t = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + CHECK_ZIGBEE_PRIVILEGE(); + + t = calloc(1, sizeof(struct read_reporting_configuration_record_s)); + RETVM_IF(NULL == t, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + *handle = t; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_read_report_config_record_clone( + zb_zcl_read_report_config_record_h src, zb_zcl_read_report_config_record_h *dst) +{ + struct read_reporting_configuration_record_s *srcs = src; + struct read_reporting_configuration_record_s *desc = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER); + + desc = calloc(1, sizeof(struct read_reporting_configuration_record_s)); + RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + memcpy(desc, srcs, sizeof(struct read_reporting_configuration_record_s)); + *dst = desc; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_read_report_config_record_destroy( + zb_zcl_read_report_config_record_h handle) +{ + struct read_reporting_configuration_record_s *h = handle; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + + free(h); + + return ZIGBEE_ERROR_NONE; +} + +API int zb_read_report_config_record_set_dir( + zb_zcl_read_report_config_record_h handle, zb_zcl_fc_direction_e dir) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct read_reporting_configuration_record_s *h = handle; + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + if (dir == ZB_ZCL_CLIENT_TO_SERVER) + h->dir = 0x00; + else + h->dir = 0x01; + return ZIGBEE_ERROR_NONE; +} + +API int zb_read_report_config_record_get_dir( + zb_zcl_read_report_config_record_h handle, zb_zcl_fc_direction_e *dir) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct read_reporting_configuration_record_s *h = handle; + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + *dir = h->dir; + return ZIGBEE_ERROR_NONE; +} + +API int zb_read_report_config_record_set_id( + zb_zcl_read_report_config_record_h handle, unsigned short id) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct read_reporting_configuration_record_s *h = handle; + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + + h->id = id; + return ZIGBEE_ERROR_NONE; +} + +API int zb_read_report_config_record_get_id( + zb_zcl_read_report_config_record_h handle, unsigned short *id) +{ + struct read_reporting_configuration_record_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + *id = h->id; + return ZIGBEE_ERROR_NONE; +} + +API int zb_report_config_response_record_create( + zb_zcl_report_config_response_record_h *handle) +{ + zb_zcl_report_config_response_record_h t = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + CHECK_ZIGBEE_PRIVILEGE(); + + t = calloc(1, sizeof(struct reporting_configuration_response_record_s)); + RETVM_IF(NULL == t, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + *handle = t; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_report_config_response_record_clone( + zb_zcl_report_config_response_record_h src, + zb_zcl_report_config_response_record_h *dst) +{ + struct reporting_configuration_response_record_s *srcs = src; + struct reporting_configuration_response_record_s *desc = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER); + + desc = calloc(1, sizeof(struct reporting_configuration_response_record_s)); + RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + memcpy(desc, srcs, sizeof(struct reporting_configuration_response_record_s)); + *dst = desc; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_report_config_response_record_destroy( + zb_zcl_report_config_response_record_h handle) +{ + struct reporting_configuration_response_record_s *h = handle; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + + free(h); + + return ZIGBEE_ERROR_NONE; +} + +API int zb_report_config_response_record_get_status( + zb_zcl_report_config_response_record_h handle, zb_zcl_status_e *status) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct reporting_configuration_response_record_s *h = handle; + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER); + + *status = h->status; + return ZIGBEE_ERROR_NONE; +} + +API int zb_report_config_response_record_set_status( + zb_zcl_report_config_response_record_h handle, zb_zcl_status_e status) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct reporting_configuration_response_record_s *h = handle; + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + + h->status = status; + return ZIGBEE_ERROR_NONE; +} + +API int zb_report_config_response_record_get_dir( + zb_zcl_report_config_response_record_h handle, zb_zcl_fc_direction_e *dir) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct reporting_configuration_response_record_s *h = handle; + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == dir, ZIGBEE_ERROR_INVALID_PARAMETER); + + *dir = h->dir; + return ZIGBEE_ERROR_NONE; +} + +API int zb_report_config_response_record_set_dir( + zb_zcl_report_config_response_record_h handle, zb_zcl_fc_direction_e dir) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct reporting_configuration_response_record_s *h = handle; + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + + h->dir = dir; + return ZIGBEE_ERROR_NONE; +} + +API int zb_report_config_response_record_get_id( + zb_zcl_report_config_response_record_h handle, unsigned short *id) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct reporting_configuration_response_record_s *h = handle; + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == id, ZIGBEE_ERROR_INVALID_PARAMETER); + + *id = h->id; + return ZIGBEE_ERROR_NONE; +} + +API int zb_report_config_response_record_set_id( + zb_zcl_report_config_response_record_h handle, unsigned short id) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct reporting_configuration_response_record_s *h = handle; + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + + h->id = id; + return ZIGBEE_ERROR_NONE; +} + +API int zb_attr_report_create(zb_zcl_attr_report_h *handle) +{ + zb_zcl_attr_report_h t = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + CHECK_ZIGBEE_PRIVILEGE(); + + t = calloc(1, sizeof(struct attribute_report_s)); + RETVM_IF(NULL == t, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + *handle = t; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_attr_report_clone(zb_zcl_attr_report_h src, zb_zcl_attr_report_h *dst) +{ + struct attribute_report_s *srcs = src; + struct attribute_report_s *desc = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER); + + desc = calloc(1, sizeof(struct attribute_report_s)); + RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + memcpy(desc, srcs, sizeof(struct attribute_report_s)); + + desc->value = calloc(1, zb_zcl_get_data_size(srcs->type)); + RETVM_IF(NULL == desc->value, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + memcpy(desc->value, srcs->value, zb_zcl_get_data_size(srcs->type)); + *dst = desc; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_attr_report_destroy(zb_zcl_attr_report_h handle) +{ + struct attribute_report_s *h = handle; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + + if (h->value) + free(h->value); + free(h); + + return ZIGBEE_ERROR_NONE; +} + +API int zb_attr_report_get_id(zb_zcl_attr_report_h handle, unsigned short *id) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct attribute_report_s *h = handle; + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == id, ZIGBEE_ERROR_INVALID_PARAMETER); + + *id = h->id; + return ZIGBEE_ERROR_NONE; +} + +API int zb_attr_report_set_id(zb_zcl_attr_report_h handle, unsigned short id) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct attribute_report_s *h = handle; + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + + h->id = id; + return ZIGBEE_ERROR_NONE; +} + +API int zb_attr_report_get_type(zb_zcl_attr_report_h handle, + zb_zcl_data_type_e *type) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct attribute_report_s *h = handle; + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == type, ZIGBEE_ERROR_INVALID_PARAMETER); + + *type = h->type; + return ZIGBEE_ERROR_NONE; +} + +API int zb_attr_report_set_type(zb_zcl_attr_report_h handle, + zb_zcl_data_type_e type) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct attribute_report_s *h = handle; + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + + h->type = type; + return ZIGBEE_ERROR_NONE; +} + +API int zb_attr_report_get_value(zb_zcl_attr_report_h handle, + zb_zcl_data_type_e* type, unsigned char** value, int* count) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + int len = -1; + unsigned char *temp = NULL; + struct attribute_report_s *h = handle; + + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == value, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == h->value, ZIGBEE_ERROR_NO_DATA); + + len = zb_zcl_get_data_size(h->type); + if (0 < len) { + + temp = calloc(len, sizeof(unsigned char)); + RETV_IF(NULL == temp, ZIGBEE_ERROR_OUT_OF_MEMORY); + memcpy(temp, h->value, len); + *type = h->type; + *count = len; + *value = temp; + + } else if (ZB_ZCL_OCTET_STRING == h->type || ZB_ZCL_CHARACTER_STRING == h->type) { + + len = h->value[0]; + temp = calloc(len + ZB_GUARD_CHAR, sizeof(char)); + RETV_IF(NULL == temp, ZIGBEE_ERROR_OUT_OF_MEMORY); + + memcpy(temp, h->value + ZB_ZCL_OCTET_SIZE, len); + *type = h->type; + *count = len; + *value = temp; + + } else if (ZB_ZCL_LONG_OCTET_STRING == h->type || ZB_ZCL_LONG_CHARACTER_STRING == h->type) { + + len = h->value[0] & 0xff; + len |= (h->value[1] << 8) & 0xff00 ; + + temp = calloc(len + ZB_GUARD_CHAR, sizeof(char)); + RETV_IF(NULL == temp, ZIGBEE_ERROR_OUT_OF_MEMORY); + memcpy(*value, h->value + ZB_ZCL_LONG_OCTET_SIZE, len); + + *type = h->type; + *count = len; + *value = temp; + + } else { + return ZIGBEE_ERROR_NOT_SUPPORTED; + } + + return ZIGBEE_ERROR_NONE; +} + +API int zb_attr_report_set_value(zb_zcl_attr_report_h handle, + zb_zcl_data_type_e type, unsigned char* value, int count) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + int len = -1; + struct attribute_report_s *h = handle; + + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == value, ZIGBEE_ERROR_INVALID_PARAMETER); + + if (h->value) { + free(h->value); + h->value = NULL; + } + + len = zb_zcl_get_data_size(type); + if (0 < len) { + + h->value = calloc(len + ZB_GUARD_CHAR , sizeof(char)); + RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY); + memcpy(h->value, value, count); + h->type = type; + + } else if (ZB_ZCL_OCTET_STRING == type || ZB_ZCL_CHARACTER_STRING == type) { + + h->value = calloc(count + ZB_ZCL_OCTET_SIZE + ZB_GUARD_CHAR, sizeof(char)); + RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY); + /* The first 1 byte indicate invalid or length of string */ + h->value[0] = value[0] & 0xff; + memcpy(h->value + ZB_ZCL_OCTET_SIZE, value, count); + + } else if (ZB_ZCL_LONG_OCTET_STRING == type || ZB_ZCL_LONG_CHARACTER_STRING == type) { + + h->value = calloc(count + ZB_ZCL_LONG_OCTET_SIZE + ZB_GUARD_CHAR, sizeof(char)); + RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY); + + /* The first 2 byte indicate invalid or length of string */ + h->value[0] = count & 0xff; + h->value[1] = (count >> 8) & 0xff ; + + memcpy(h->value + ZB_ZCL_LONG_OCTET_SIZE, value, count); + + } else { + return ZIGBEE_ERROR_NOT_SUPPORTED; + } + + return ZIGBEE_ERROR_NONE; +} + + +/** + * @brief Format of the Selector Field + * + * @since_tizen 4.0 + */ +struct selector_s { + unsigned char indicator; /**< number of index */ + unsigned short *index; /**< index list */ +}; + +/** + * @brief Stcuture for reading attribute + * + * @since_tizen 4.0 + */ +struct read_structured_attribute_record_s { + unsigned short id; /**< attribute identifier */ + struct selector_s *selector; /**< selector format */ +}; + +/** + * @brief Format of the Write Attribute Record Field + * + * @since_tizen 4.0 + */ +struct write_attribute_structured_status_record_s { + unsigned char status; /**< status */ + unsigned short id; /**< identifier */ + struct selector_s selector; /**< selector */ +}; + +/** + * @brief Format of the Write Attribute Record Field + * + * @since_tizen 4.0 + */ +struct write_attribute_structured_record_s { + unsigned short id; /**< attribute identifier */ + struct selector_s selector; + unsigned char type; /**< attribute data type */ + unsigned char *value; /**< data value */; /**< attribute value */ +}; + +API int zb_extended_attr_info_create(zb_zcl_extended_attr_info_h *handle) +{ + zb_zcl_extended_attr_info_h t = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + CHECK_ZIGBEE_PRIVILEGE(); + + t = calloc(1, sizeof(struct extended_attribute_infomation_s)); + RETVM_IF(NULL == t, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + *handle = t; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_extended_attr_info_clone(zb_zcl_extended_attr_info_h src, + zb_zcl_extended_attr_info_h *dst) +{ + struct extended_attribute_infomation_s *srcs = src; + struct extended_attribute_infomation_s *desc = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER); + + desc = calloc(1, sizeof(struct extended_attribute_infomation_s)); + RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + memcpy(desc, srcs, sizeof(struct extended_attribute_infomation_s)); + + *dst = desc; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_extended_attr_info_destroy(zb_zcl_extended_attr_info_h handle) +{ + struct extended_attribute_infomation_s *h = handle; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + + free(h); + + return ZIGBEE_ERROR_NONE; +} + +API int zb_extended_attr_info_get_id(zb_zcl_extended_attr_info_h handle, + unsigned short *id) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct extended_attribute_infomation_s *h = handle; + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == id, ZIGBEE_ERROR_INVALID_PARAMETER); + + *id = h->id; + return ZIGBEE_ERROR_NONE; +} + +API int zb_extended_attr_info_set_id(zb_zcl_extended_attr_info_h handle, + unsigned short id) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct extended_attribute_infomation_s *h = handle; + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + + h->id = id; + return ZIGBEE_ERROR_NONE; +} + +API int zb_extended_attr_info_get_type(zb_zcl_extended_attr_info_h handle, + zb_zcl_data_type_e *type) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct extended_attribute_infomation_s *h = handle; + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == type, ZIGBEE_ERROR_INVALID_PARAMETER); + + *type = h->type; + return ZIGBEE_ERROR_NONE; +} + +API int zb_extended_attr_info_set_type(zb_zcl_extended_attr_info_h handle, + zb_zcl_data_type_e type) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct extended_attribute_infomation_s *h = handle; + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0 >= zb_zcl_get_data_size(type), ZIGBEE_ERROR_INVALID_PARAMETER); + + h->type = type; + return ZIGBEE_ERROR_NONE; +} + +API int zb_extended_attr_info_get_acl(zb_zcl_extended_attr_info_h handle, + zb_zcl_acl_type_e *acl) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct extended_attribute_infomation_s *h = handle; + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == acl, ZIGBEE_ERROR_INVALID_PARAMETER); + + *acl = h->acl; + return ZIGBEE_ERROR_NONE; +} + +API int zb_extended_attr_info_set_acl(zb_zcl_extended_attr_info_h handle, + zb_zcl_acl_type_e acl) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + struct extended_attribute_infomation_s *h = handle; + RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER); + + h->acl = acl; + return ZIGBEE_ERROR_NONE; +} + diff --git a/src/zbl-zdo-bind-mgr.c b/src/zbl-zdo-bind-mgr.c new file mode 100644 index 0000000..53f359d --- /dev/null +++ b/src/zbl-zdo-bind-mgr.c @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2016 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 "zbl.h" +#include "zbl-dbus.h" +#include "zb-common.h" + +API int zb_zdo_bind_req(zb_zigbee_h handle, zb_nwk_addr dst_addr16, + zb_ieee_addr src_addr64, unsigned char src_ep, zb_cluster_id clusterid, + zb_ieee_addr dst_addr64, unsigned char type, zb_nwk_addr group_addr, + unsigned char dst_ep, zb_zdo_bind_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == src_addr64, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == dst_addr64, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + ret = zbl_bind_req(dst_addr16, src_addr64, src_ep, clusterid, dst_addr64, type, + group_addr, dst_ep, cb, user_data); + return ret; +} + +API int zb_zdo_unbind_req(zb_zigbee_h handle, zb_nwk_addr dst_addr16, + zb_ieee_addr src_addr64, unsigned char src_ep, zb_cluster_id clusterid, + zb_ieee_addr dst_addr64, unsigned char type, zb_nwk_addr group_addr, + unsigned char dst_ep, zb_zdo_unbind_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == src_addr64, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == dst_addr64, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + ret = zbl_unbind_req(dst_addr16, src_addr64, src_ep, clusterid, dst_addr64, type, + group_addr, dst_ep, cb, user_data); + return ret; +} diff --git a/src/zbl-zdo-dev-disc.c b/src/zbl-zdo-dev-disc.c new file mode 100644 index 0000000..4902c81 --- /dev/null +++ b/src/zbl-zdo-dev-disc.c @@ -0,0 +1,874 @@ +/* + * Copyright (c) 2016 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 "zbl.h" +#include "zbl-dbus.h" +#include "zb-common.h" + +API int zb_zdo_nwk_addr_req(zb_zigbee_h handle, zb_ieee_addr addr64, + zb_zdp_req_type_e request_type, unsigned char start_idx, zb_zdo_addr_cb cb, + void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0 != request_type && 1 != request_type, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER); + ret = zbl_nwk_addr_req(handle, addr64, request_type, start_idx, cb, + user_data); + return ret; +} + +API int zb_zdo_ieee_addr_req(zb_zigbee_h handle, zb_nwk_addr addr16, zb_zdo_addr_cb cb, + void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER); + ret = zbl_ieee_addr_req(handle, addr16, cb, user_data); + return ret; +} + +API int zb_zdo_active_ep(zb_zigbee_h handle, zb_nwk_addr addr16, zb_zdo_active_ep_cb cb, + void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER); + ret = zbl_active_ep(handle, addr16, cb, user_data); + return ret; +} + +API int zb_zdo_simple_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep, + zb_zdo_simple_desc_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT); + RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER); + ret = zbl_simple_desc_req(handle, addr16, ep, cb, user_data); + return ret; +} + +API int zb_zdo_extended_simple_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char start_idx, zb_zdo_extended_simple_desc_cb cb, void *user_data) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER); + return ZIGBEE_ERROR_NONE; +} + +API int zb_zdo_match_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned short profileid, unsigned char num_in_clusters, + unsigned short *in_clusters, unsigned char num_out_clusters, + unsigned short *out_clusters, zb_zdo_match_desc_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(NULL == in_clusters, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == out_clusters, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0 == num_in_clusters && 0 == num_out_clusters, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER); + ret = zbl_match_desc_req(handle, addr16, profileid, num_in_clusters, + in_clusters, num_out_clusters, out_clusters, cb, user_data); + return ret; +} + +API int zb_zdo_node_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, + zb_zdo_node_desc_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER); + ret = zbl_node_desc_req(addr16, cb, user_data); + return ret; +} + +API int zb_zdo_power_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, + zb_zdo_power_desc_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER); + ret = zbl_power_desc_req(addr16, cb, user_data); + return ret; +} + +API int zb_zdo_complex_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, + zb_zdo_complex_desc_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER); + ret = zbl_complex_desc_req(addr16, cb, user_data); + return ret; +} + +API int zb_zdo_user_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, + zb_zdo_user_desc_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER); + ret = zbl_user_desc_req(addr16, cb, user_data); + return ret; +} + +API int zb_zdo_user_desc_set(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char len, + unsigned char *user_desc, zb_zdo_user_desc_conf_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(NULL == user_desc, ZIGBEE_ERROR_INVALID_PARAMETER); + ret = zbl_user_desc_set(handle, addr16, len, user_desc, cb, user_data); + return ret; +} + +API int zb_zdo_device_annce(zb_zigbee_h handle, zb_nwk_addr addr16, zb_ieee_addr addr64, + unsigned char capability) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS); + ret = zbl_device_annce(handle, addr16, addr64, capability); + return ret; +} + +API int zb_simple_desc_create(zb_zdo_simple_desc_h *handle) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + zb_zdo_simple_desc_h desc = NULL; + CHECK_ZIGBEE_PRIVILEGE(); + + desc = calloc(1, sizeof(struct zb_zdo_simple_desc_s)); + RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + *handle = desc; + return ZIGBEE_ERROR_NONE; +} + +API int zb_simple_desc_clone(zb_zdo_simple_desc_h src, zb_zdo_simple_desc_h *dst) +{ + zb_zdo_simple_desc_h desc = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER); + + desc = calloc(1, sizeof(struct zb_zdo_simple_desc_s)); + RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + memcpy(desc, src, sizeof(struct zb_zdo_simple_desc_s)); + *dst = desc; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_simple_desc_destroy(zb_zdo_simple_desc_h handle) +{ + struct zb_zdo_simple_desc_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + free(h); + return ZIGBEE_ERROR_NONE; +} + +API int zb_simple_desc_get_ep(zb_zdo_simple_desc_h handle, unsigned char *ep) +{ + struct zb_zdo_simple_desc_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == ep, ZIGBEE_ERROR_INVALID_PARAMETER); + + *ep = h->ep; + return ZIGBEE_ERROR_NONE; +} + +API int zb_simple_desc_set_ep(zb_zdo_simple_desc_h handle, unsigned char ep) +{ + struct zb_zdo_simple_desc_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + h->ep = ep; + return ZIGBEE_ERROR_NONE; +} + +API int zb_simple_desc_get_profile_id(zb_zdo_simple_desc_h handle, + unsigned short *profileid) +{ + struct zb_zdo_simple_desc_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == profileid, ZIGBEE_ERROR_INVALID_PARAMETER); + + *profileid = h->profileid; + return ZIGBEE_ERROR_NONE; +} + +API int zb_simple_desc_set_profile_id(zb_zdo_simple_desc_h handle, + unsigned short profileid) +{ + struct zb_zdo_simple_desc_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + h->profileid = profileid; + return ZIGBEE_ERROR_NONE; +} + + +API int zb_simple_desc_get_device_id(zb_zdo_simple_desc_h handle, + unsigned short *deviceid) +{ + struct zb_zdo_simple_desc_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == deviceid, ZIGBEE_ERROR_INVALID_PARAMETER); + + *deviceid = h->deviceid; + return ZIGBEE_ERROR_NONE; +} + +API int zb_simple_desc_set_device_id(zb_zdo_simple_desc_h handle, + unsigned short deviceid) +{ + struct zb_zdo_simple_desc_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + h->deviceid = deviceid; + return ZIGBEE_ERROR_NONE; +} + +API int zb_simple_desc_get_device_ver(zb_zdo_simple_desc_h handle, + unsigned short *device_ver) +{ + struct zb_zdo_simple_desc_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == device_ver, ZIGBEE_ERROR_INVALID_PARAMETER); + + *device_ver = h->device_ver; + return ZIGBEE_ERROR_NONE; +} + +API int zb_simple_desc_set_device_ver(zb_zdo_simple_desc_h handle, + unsigned short device_ver) +{ + struct zb_zdo_simple_desc_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + h->device_ver = device_ver; + return ZIGBEE_ERROR_NONE; +} + +API int zb_simple_desc_get_num_of_in_clusters(zb_zdo_simple_desc_h handle, + unsigned char *num_of_in_clusters) +{ + struct zb_zdo_simple_desc_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == num_of_in_clusters, ZIGBEE_ERROR_INVALID_PARAMETER); + + *num_of_in_clusters = h->num_of_in_clusters; + return ZIGBEE_ERROR_NONE; +} + +API int zb_simple_desc_set_num_of_in_clusters(zb_zdo_simple_desc_h handle, + unsigned char num_of_in_clusters) +{ + struct zb_zdo_simple_desc_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + h->num_of_in_clusters = num_of_in_clusters; + return ZIGBEE_ERROR_NONE; +} + +API int zb_simple_desc_get_num_of_out_clusters(zb_zdo_simple_desc_h handle, + unsigned char *num_of_out_clusters) +{ + struct zb_zdo_simple_desc_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == num_of_out_clusters, ZIGBEE_ERROR_INVALID_PARAMETER); + + *num_of_out_clusters = h->num_of_out_clusters; + return ZIGBEE_ERROR_NONE; +} + +API int zb_simple_desc_set_num_of_out_clusters(zb_zdo_simple_desc_h handle, + unsigned char num_of_out_clusters) +{ + struct zb_zdo_simple_desc_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + h->num_of_out_clusters = num_of_out_clusters; + return ZIGBEE_ERROR_NONE; +} + +API int zb_simple_desc_get_in_clusters(zb_zdo_simple_desc_h handle, + unsigned short **in_clusters) +{ + struct zb_zdo_simple_desc_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == h->in_clusters, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == in_clusters, ZIGBEE_ERROR_INVALID_PARAMETER); + + *in_clusters = h->in_clusters; + return ZIGBEE_ERROR_NONE; +} + +API int zb_simple_desc_set_in_clusters(zb_zdo_simple_desc_h handle, + unsigned short *in_clusters, int num) +{ + struct zb_zdo_simple_desc_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == in_clusters, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(num < 1 || num > MAX_ENDPOINT_CLUSTERS, ZIGBEE_ERROR_INVALID_PARAMETER); + + memcpy(h->in_clusters, in_clusters, 2 * num); + return ZIGBEE_ERROR_NONE; +} + +API int zb_simple_desc_get_out_clusters(zb_zdo_simple_desc_h handle, + unsigned short **out_clusters) +{ + struct zb_zdo_simple_desc_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == h->out_clusters, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == out_clusters, ZIGBEE_ERROR_INVALID_PARAMETER); + + *out_clusters = h->out_clusters; + return ZIGBEE_ERROR_NONE; +} + +API int zb_simple_desc_set_out_clusters(zb_zdo_simple_desc_h handle, + unsigned short *out_clusters, int num) +{ + struct zb_zdo_simple_desc_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == out_clusters, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(num < 1 || num > MAX_ENDPOINT_CLUSTERS, ZIGBEE_ERROR_INVALID_PARAMETER); + + memcpy(h->out_clusters, out_clusters, 2 * num); + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_power_desc_create(zb_zdo_node_power_descriptor_h *handle) +{ + zb_zdo_node_power_descriptor_h desc = NULL; + + CHECK_ZIGBEE_PRIVILEGE(); + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + desc = calloc(1, sizeof(struct zb_zdo_node_power_descriptor_s)); + RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + *handle = desc; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_power_desc_clone(zb_zdo_node_power_descriptor_h src, + zb_zdo_node_power_descriptor_h *dst) +{ + zb_zdo_node_power_descriptor_h desc = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER); + + desc = calloc(1, sizeof(struct zb_zdo_node_power_descriptor_s)); + RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + memcpy(desc, src, sizeof(struct zb_zdo_node_power_descriptor_s)); + *dst = desc; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_power_desc_destroy(zb_zdo_node_power_descriptor_h handle) +{ + struct zb_zdo_node_power_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + free(h); + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_power_desc_get_current_power_mode( + zb_zdo_node_power_descriptor_h handle, zb_zdp_cur_pwr_mode_e* current_power_mode) +{ + struct zb_zdo_node_power_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == current_power_mode, ZIGBEE_ERROR_INVALID_PARAMETER); + + *current_power_mode = h->current_power_mode; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_power_desc_set_current_power_mode( + zb_zdo_node_power_descriptor_h handle, zb_zdp_cur_pwr_mode_e current_power_mode) +{ + struct zb_zdo_node_power_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0b11 < current_power_mode, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE); + + h->current_power_mode = current_power_mode; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_power_desc_get_available_power_sources( + zb_zdo_node_power_descriptor_h handle, zb_zdp_pwr_src_type_e* available_power_sources) +{ + struct zb_zdo_node_power_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == available_power_sources, ZIGBEE_ERROR_INVALID_PARAMETER); + + *available_power_sources = h->available_power_sources; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_power_desc_set_available_power_sources( + zb_zdo_node_power_descriptor_h handle, zb_zdp_pwr_src_type_e available_power_sources) +{ + struct zb_zdo_node_power_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0b111 < available_power_sources, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE); + + h->available_power_sources = available_power_sources; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_power_desc_get_current_power_source( + zb_zdo_node_power_descriptor_h handle, zb_zdp_pwr_src_type_e* current_power_source) +{ + struct zb_zdo_node_power_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == current_power_source, ZIGBEE_ERROR_INVALID_PARAMETER); + + *current_power_source = h->current_power_source; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_power_desc_set_current_power_source( + zb_zdo_node_power_descriptor_h handle, zb_zdp_pwr_src_type_e current_power_source) +{ + struct zb_zdo_node_power_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0b111 < current_power_source, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE); + + h->current_power_source = current_power_source; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_power_desc_get_current_power_source_level( + zb_zdo_node_power_descriptor_h handle, zb_zdp_pwr_src_level_e* current_power_source_level) +{ + struct zb_zdo_node_power_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == current_power_source_level, ZIGBEE_ERROR_INVALID_PARAMETER); + + *current_power_source_level = h->current_power_source_level; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_power_desc_set_current_power_source_level( + zb_zdo_node_power_descriptor_h handle, zb_zdp_pwr_src_level_e current_power_source_level) +{ + struct zb_zdo_node_power_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + h->current_power_source_level = current_power_source_level; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_desc_create(zb_zdo_node_descriptor_h *handle) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + zb_zdo_node_descriptor_h desc = NULL; + + CHECK_ZIGBEE_PRIVILEGE(); + + desc = calloc(1, sizeof(struct zb_zdo_node_descriptor_s)); + RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + *handle = desc; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_desc_clone(zb_zdo_node_descriptor_h src, + zb_zdo_node_descriptor_h *dst) +{ + struct zb_zdo_node_descriptor_s* desc = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER); + + desc = calloc(1, sizeof(struct zb_zdo_node_descriptor_s)); + RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + memcpy(desc, src, sizeof(struct zb_zdo_node_descriptor_s)); + *dst = desc; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_desc_destroy(zb_zdo_node_descriptor_h handle) +{ + struct zb_zdo_node_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + free(h); + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_desc_get_logical_type(zb_zdo_node_descriptor_h handle, + unsigned char* logical_type) +{ + struct zb_zdo_node_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == logical_type, ZIGBEE_ERROR_INVALID_PARAMETER); + + *logical_type = h->logical_type; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_desc_set_logical_type(zb_zdo_node_descriptor_h handle, + unsigned char logical_type) +{ + struct zb_zdo_node_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0b11 < logical_type, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE); + + h->logical_type = logical_type; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_desc_get_complex_desciptor_available( + zb_zdo_node_descriptor_h handle, unsigned char* complex_desciptor_available) +{ + struct zb_zdo_node_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == complex_desciptor_available, ZIGBEE_ERROR_INVALID_PARAMETER); + + *complex_desciptor_available = h->complex_desciptor_available; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_desc_set_complex_descriptor_available( + zb_zdo_node_descriptor_h handle, unsigned char complex_desciptor_available) +{ + struct zb_zdo_node_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0x01 < complex_desciptor_available, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE); + + h->complex_desciptor_available = complex_desciptor_available; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_desc_get_user_descriptor_available( + zb_zdo_node_descriptor_h handle, unsigned char* user_descriptor_available) +{ + struct zb_zdo_node_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == user_descriptor_available, ZIGBEE_ERROR_INVALID_PARAMETER); + + *user_descriptor_available = h->user_descriptor_available; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_desc_set_user_descriptor_available( + zb_zdo_node_descriptor_h handle, unsigned char user_descriptor_available) +{ + struct zb_zdo_node_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0x01 < user_descriptor_available, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE); + + h->user_descriptor_available = user_descriptor_available; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_desc_get_aps_flags(zb_zdo_node_descriptor_h handle, + unsigned char* aps_flags) +{ + struct zb_zdo_node_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == aps_flags, ZIGBEE_ERROR_INVALID_PARAMETER); + + *aps_flags = h->aps_flags; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_desc_set_aps_flags(zb_zdo_node_descriptor_h handle, + unsigned char aps_flags) +{ + struct zb_zdo_node_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0b111 < aps_flags, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE); + + h->aps_flags = aps_flags; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_desc_get_frequency_band(zb_zdo_node_descriptor_h handle, + unsigned char* frequency_band) +{ + struct zb_zdo_node_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == frequency_band, ZIGBEE_ERROR_INVALID_PARAMETER); + + *frequency_band = h->frequency_band; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_desc_set_frequency_band(zb_zdo_node_descriptor_h handle, + unsigned char frequency_band) +{ + struct zb_zdo_node_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0b1111 < frequency_band, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE); + + h->frequency_band = frequency_band; + return ZIGBEE_ERROR_NONE; +} + + +API int zb_node_desc_get_mac_capability_flags(zb_zdo_node_descriptor_h handle, + unsigned char* mac_capability_flags) +{ + struct zb_zdo_node_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == mac_capability_flags, ZIGBEE_ERROR_INVALID_PARAMETER); + + *mac_capability_flags = h->mac_capability_flags; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_desc_set_mac_capability_flags(zb_zdo_node_descriptor_h handle, + unsigned char mac_capability_flags) +{ + struct zb_zdo_node_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + h->mac_capability_flags = mac_capability_flags; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_desc_get_manufacturer_code(zb_zdo_node_descriptor_h handle, + unsigned short* manufacturer_code) +{ + struct zb_zdo_node_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == manufacturer_code, ZIGBEE_ERROR_INVALID_PARAMETER); + + *manufacturer_code = h->manufacturer_code; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_desc_set_manufacturer_code(zb_zdo_node_descriptor_h handle, + unsigned short manufacturer_code) +{ + struct zb_zdo_node_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + h->manufacturer_code = manufacturer_code; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_desc_get_maximum_buffer_size(zb_zdo_node_descriptor_h handle, + unsigned char* maximum_buffer_size) +{ + struct zb_zdo_node_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == maximum_buffer_size, ZIGBEE_ERROR_INVALID_PARAMETER); + + *maximum_buffer_size = h->maximum_buffer_size; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_desc_set_maximum_buffer_size(zb_zdo_node_descriptor_h handle, + unsigned char maximum_buffer_size) +{ + struct zb_zdo_node_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0x7f < maximum_buffer_size, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE); + + h->maximum_buffer_size = maximum_buffer_size; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_desc_get_maximum_incoming_transfer_size( + zb_zdo_node_descriptor_h handle, unsigned short* maximum_incoming_transfer_size) +{ + struct zb_zdo_node_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == maximum_incoming_transfer_size, ZIGBEE_ERROR_INVALID_PARAMETER); + + *maximum_incoming_transfer_size = h->maximum_incoming_transfer_size; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_desc_set_maximum_incoming_transfer_size( + zb_zdo_node_descriptor_h handle, unsigned short maximum_incoming_transfer_size) +{ + struct zb_zdo_node_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0x7fff < maximum_incoming_transfer_size, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE); + + h->maximum_incoming_transfer_size = maximum_incoming_transfer_size; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_desc_get_server_mask(zb_zdo_node_descriptor_h handle, + unsigned short* server_mask) +{ + struct zb_zdo_node_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == server_mask, ZIGBEE_ERROR_INVALID_PARAMETER); + + *server_mask = h->server_mask; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_desc_set_server_mask(zb_zdo_node_descriptor_h handle, + unsigned short server_mask) +{ + struct zb_zdo_node_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0x7f < server_mask, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE); + + h->server_mask = server_mask; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_desc_get_maximum_outgoing_transfer_size( + zb_zdo_node_descriptor_h handle, unsigned short* maximum_outgoing_transfer_size) +{ + struct zb_zdo_node_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == maximum_outgoing_transfer_size, ZIGBEE_ERROR_INVALID_PARAMETER); + + *maximum_outgoing_transfer_size = h->maximum_outgoing_transfer_size; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_desc_set_maximum_outgoing_transfer_size( + zb_zdo_node_descriptor_h handle, unsigned short maximum_outgoing_transfer_size) +{ + struct zb_zdo_node_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0x7fff < maximum_outgoing_transfer_size, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE); + + h->maximum_outgoing_transfer_size = maximum_outgoing_transfer_size; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_desc_get_descriptor_capability_field( + zb_zdo_node_descriptor_h handle, unsigned short* descriptor_capability_field) +{ + struct zb_zdo_node_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == descriptor_capability_field, ZIGBEE_ERROR_INVALID_PARAMETER); + + *descriptor_capability_field = h->descriptor_capability_field; + return ZIGBEE_ERROR_NONE; +} + +API int zb_node_desc_set_descriptor_capability_field( + zb_zdo_node_descriptor_h handle, unsigned short descriptor_capability_field) +{ + struct zb_zdo_node_descriptor_s* h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0x11 < descriptor_capability_field, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE); + + h->descriptor_capability_field = descriptor_capability_field; + return ZIGBEE_ERROR_NONE; +} + diff --git a/src/zbl-zdo-nwk-mgr.c b/src/zbl-zdo-nwk-mgr.c new file mode 100644 index 0000000..97e323f --- /dev/null +++ b/src/zbl-zdo-nwk-mgr.c @@ -0,0 +1,498 @@ +/* + * Copyright (c) 2016 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 "zbl.h" +#include "zbl-dbus.h" +#include "zb-common.h" + +API int zb_zdo_mgmt_nwk_disc_req(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned int scan_channels, unsigned char scan_duration, unsigned char scan_count, + unsigned char start_idx, zb_zdo_mgmt_nwk_disc_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + ret = zbl_mgmt_nwk_disc_req(addr16, scan_channels, scan_duration, scan_count, + start_idx, cb, user_data); + return ret; +} + +API int zb_zdo_mgmt_lqi_req(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char start_idx, zb_zdo_mgmt_lqi_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + ret = zbl_mgmt_lqi_req(addr16, start_idx, cb, user_data); + return ret; +} + +API int zb_zdo_mgmt_rtg_req(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char start_idx, zb_zdo_mgmt_rtg_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + ret = zbl_mgmt_rtg_req(addr16, start_idx, cb, user_data); + return ret; +} + +API int zb_zdo_mgmt_bind_req(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char start_idx, zb_zdo_mgmt_bind_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + ret = zbl_mgmt_bind_req(addr16, start_idx, cb, user_data); + return ret; +} + +API int zb_zdo_mgmt_leave_req(zb_zigbee_h handle, zb_ieee_addr addr64, + bool remove_children, bool rejoin, zb_zdo_mgmt_leave_cb cb, + void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS); + ret = zbl_mgmt_leave_device(addr64, remove_children, rejoin, cb, user_data); + return ret; +} + +API int zb_zdo_mgmt_direct_join_req(zb_zigbee_h handle, zb_ieee_addr addr64, + unsigned char capability, zb_zdo_mgmt_direct_join_cb cb, void *user_data) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS); + return ZIGBEE_ERROR_NONE; +} + +API int zb_zdo_mgmt_permit_joining_req(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char duration, unsigned char tc_significance, + zb_zdo_mgmt_permit_joining_cb cb, void *user_data) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + ret = zbl_mgmt_permit_joining_req(addr16, duration, tc_significance, cb, user_data); + return ret; +} + +API int zb_zdo_mgmt_cache_req(zb_zigbee_h handle, zb_nwk_addr addr16, + unsigned char start_idx, zb_zdo_mgmt_cache_cb cb, void *user_data) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + return ZIGBEE_ERROR_NONE; +} + +API int zb_zdo_mgmt_nwk_update_req(zb_zigbee_h handle, unsigned int scan_channels, + unsigned char scan_duration, unsigned char scan_count, unsigned char nwk_update_id, + zb_nwk_addr nwk_manager_addr) +{ + int ret; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == nwk_manager_addr, ZIGBEE_ERROR_INVALID_ADDRESS); + ret = zbl_mgmt_nwk_update_req(scan_channels, scan_duration, scan_count, nwk_update_id, + nwk_manager_addr); + return ret; +} + +API int zb_network_list_record_get_extended_pan_id( + zb_zdo_network_list_record_h handle, zb_ieee_addr extended_pan_id) +{ + struct zb_zdo_network_list_record_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == extended_pan_id, ZIGBEE_ERROR_INVALID_PARAMETER); + + memcpy(extended_pan_id, h->extended_pan_id, sizeof(zb_ieee_addr)); + return ZIGBEE_ERROR_NONE; +} + +API int zb_network_list_record_get_logical_channel( + zb_zdo_network_list_record_h handle, unsigned char* logical_channel) +{ + struct zb_zdo_network_list_record_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == logical_channel, ZIGBEE_ERROR_INVALID_PARAMETER); + + *logical_channel = h->logical_channel; + return ZIGBEE_ERROR_NONE; +} + +API int zb_network_list_record_get_zigbee_version( + zb_zdo_network_list_record_h handle, unsigned char* zigbee_version) +{ + struct zb_zdo_network_list_record_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zigbee_version, ZIGBEE_ERROR_INVALID_PARAMETER); + + *zigbee_version = h->zigbee_version; + return ZIGBEE_ERROR_NONE; +} + +API int zb_network_list_record_get_stack_profile( + zb_zdo_network_list_record_h handle, unsigned char* stack_profile) +{ + struct zb_zdo_network_list_record_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == stack_profile, ZIGBEE_ERROR_INVALID_PARAMETER); + + *stack_profile = h->stack_profile; + return ZIGBEE_ERROR_NONE; +} + +API int zb_network_list_record_get_beacon_order( + zb_zdo_network_list_record_h handle, unsigned char* beacon_order) +{ + struct zb_zdo_network_list_record_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == beacon_order, ZIGBEE_ERROR_INVALID_PARAMETER); + + *beacon_order = h->beacon_order; + return ZIGBEE_ERROR_NONE; +} + +API int zb_network_list_record_get_superframe_order( + zb_zdo_network_list_record_h handle, unsigned char* superframe_order) +{ + struct zb_zdo_network_list_record_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == superframe_order, ZIGBEE_ERROR_INVALID_PARAMETER); + + *superframe_order = h->superframe_order; + return ZIGBEE_ERROR_NONE; +} + +API int zb_network_list_record_get_permit_joining( + zb_zdo_network_list_record_h handle, unsigned char* permit_joining) +{ + struct zb_zdo_network_list_record_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == permit_joining, ZIGBEE_ERROR_INVALID_PARAMETER); + + *permit_joining = h->permit_joining; + return ZIGBEE_ERROR_NONE; +} + +API int zb_neighbor_table_desc_get_extended_pan_id( + zb_zdo_neighbor_table_desc_h handle, zb_ieee_addr extended_pan_id) +{ + struct zb_zdo_neighbor_table_desc_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == h->extended_pan_id, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == extended_pan_id, ZIGBEE_ERROR_INVALID_PARAMETER); + + memcpy(extended_pan_id, h->extended_pan_id, sizeof(zb_ieee_addr)); + return ZIGBEE_ERROR_NONE; +} + +API int zb_neighbor_table_desc_get_ieee_addr( + zb_zdo_neighbor_table_desc_h handle, zb_ieee_addr addr64) +{ + struct zb_zdo_neighbor_table_desc_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == h->addr64, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER); + + memcpy(addr64, h->addr64, sizeof(zb_ieee_addr)); + return ZIGBEE_ERROR_NONE; +} + +API int zb_neighbor_table_desc_get_nwk_addr( + zb_zdo_neighbor_table_desc_h handle, zb_nwk_addr* addr16) +{ + struct zb_zdo_neighbor_table_desc_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == addr16, ZIGBEE_ERROR_INVALID_PARAMETER); + + *addr16 = h->addr16; + return ZIGBEE_ERROR_NONE; +} + +API int zb_neighbor_table_desc_get_device_type( + zb_zdo_neighbor_table_desc_h handle, unsigned char* device_type) +{ + struct zb_zdo_neighbor_table_desc_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == device_type, ZIGBEE_ERROR_INVALID_PARAMETER); + + *device_type = h->device_type; + return ZIGBEE_ERROR_NONE; +} + +API int zb_neighbor_table_desc_get_rx_on_when_idle( + zb_zdo_neighbor_table_desc_h handle, unsigned char* rx_on_when_idle) +{ + struct zb_zdo_neighbor_table_desc_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == rx_on_when_idle, ZIGBEE_ERROR_INVALID_PARAMETER); + + *rx_on_when_idle = h->rx_on_when_idle; + return ZIGBEE_ERROR_NONE; +} + +API int zb_neighbor_table_desc_get_relationship( + zb_zdo_neighbor_table_desc_h handle, unsigned char* releationship) +{ + struct zb_zdo_neighbor_table_desc_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == releationship, ZIGBEE_ERROR_INVALID_PARAMETER); + + *releationship = h->relationship; + return ZIGBEE_ERROR_NONE; +} + +API int zb_neighbor_table_desc_get_permit_joining( + zb_zdo_neighbor_table_desc_h handle, unsigned char* permit_joining) +{ + struct zb_zdo_neighbor_table_desc_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == permit_joining, ZIGBEE_ERROR_INVALID_PARAMETER); + + *permit_joining = h->permit_joining; + return ZIGBEE_ERROR_NONE; +} + +API int zb_neighbor_table_desc_get_depth( + zb_zdo_neighbor_table_desc_h handle, unsigned char* depth) +{ + struct zb_zdo_neighbor_table_desc_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == depth, ZIGBEE_ERROR_INVALID_PARAMETER); + + *depth = h->depth; + return ZIGBEE_ERROR_NONE; +} + +API int zb_neighbor_table_desc_get_lqi(zb_zdo_neighbor_table_desc_h handle, + unsigned char* lqi) +{ + struct zb_zdo_neighbor_table_desc_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == lqi, ZIGBEE_ERROR_INVALID_PARAMETER); + + *lqi = h->lqi; + return ZIGBEE_ERROR_NONE; +} + +API int zb_routing_table_get_dst_addr(zb_zdo_routing_table_h handle, + zb_nwk_addr* dst_addr) +{ + struct zb_zdo_routing_table_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == dst_addr, ZIGBEE_ERROR_INVALID_PARAMETER); + + *dst_addr = h->dst_addr; + return ZIGBEE_ERROR_NONE; +} + +API int zb_routing_table_get_dst_status(zb_zdo_routing_table_h handle, + zb_zdp_status_e *status) +{ + struct zb_zdo_routing_table_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER); + + *status = h->status; + return ZIGBEE_ERROR_NONE; +} + +API int zb_routing_table_get_memory_constrained( + zb_zdo_routing_table_h handle, unsigned char *memory_constrained) +{ + struct zb_zdo_routing_table_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == memory_constrained, ZIGBEE_ERROR_INVALID_PARAMETER); + + *memory_constrained = h->memory_constrained; + return ZIGBEE_ERROR_NONE; +} + +API int zb_routing_table_get_many_to_one(zb_zdo_routing_table_h handle, + unsigned char *many_to_one) +{ + struct zb_zdo_routing_table_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == many_to_one, ZIGBEE_ERROR_INVALID_PARAMETER); + + *many_to_one = h->many_to_one; + return ZIGBEE_ERROR_NONE; +} + +API int zb_routing_table_get_route_record_required( + zb_zdo_routing_table_h handle, unsigned char *route_record_required) +{ + struct zb_zdo_routing_table_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == route_record_required, ZIGBEE_ERROR_INVALID_PARAMETER); + + *route_record_required = h->route_record_required; + return ZIGBEE_ERROR_NONE; +} + +API int zb_routing_table_get_next_hop_addr( + zb_zdo_routing_table_h handle, zb_nwk_addr *next_hop_addr) +{ + struct zb_zdo_routing_table_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == next_hop_addr, ZIGBEE_ERROR_INVALID_PARAMETER); + + *next_hop_addr = h->next_hop_addr; + return ZIGBEE_ERROR_NONE; +} + +API int zb_binding_table_get_src_addr(zb_zdo_binding_table_h handle, + zb_ieee_addr src_addr) +{ + struct zb_zdo_binding_table_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == src_addr, ZIGBEE_ERROR_INVALID_PARAMETER); + + memcpy(src_addr, h->src_addr64, sizeof(zb_ieee_addr)); + return ZIGBEE_ERROR_NONE; +} + +API int zb_binding_table_get_src_ep(zb_zdo_binding_table_h handle, + unsigned char* src_ep) +{ + struct zb_zdo_binding_table_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == src_ep, ZIGBEE_ERROR_INVALID_PARAMETER); + + *src_ep = h->src_ep; + return ZIGBEE_ERROR_NONE; +} + +API int zb_binding_table_get_cluster_id(zb_zdo_binding_table_h handle, + unsigned short *clusterid) +{ + struct zb_zdo_binding_table_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == clusterid, ZIGBEE_ERROR_INVALID_PARAMETER); + + *clusterid = h->clusterid; + return ZIGBEE_ERROR_NONE; +} + +API int zb_binding_table_get_dst_addr_mode(zb_zdo_binding_table_h handle, + unsigned char* dst_addr_mode) +{ + struct zb_zdo_binding_table_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == dst_addr_mode, ZIGBEE_ERROR_INVALID_PARAMETER); + + *dst_addr_mode = h->dst_addr_mode; + return ZIGBEE_ERROR_NONE; +} + +API int zb_binding_table_get_dst_addr16(zb_zdo_binding_table_h handle, + zb_nwk_addr* addr16) +{ + struct zb_zdo_binding_table_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == addr16, ZIGBEE_ERROR_INVALID_PARAMETER); + + *addr16 = h->dst_addr16; + return ZIGBEE_ERROR_NONE; +} + +API int zb_binding_table_get_dst_addr64(zb_zdo_binding_table_h handle, + zb_ieee_addr addr64) +{ + struct zb_zdo_binding_table_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER); + + memcpy(addr64, h->dst_addr64, sizeof(zb_ieee_addr)); + return ZIGBEE_ERROR_NONE; +} + +API int zb_binding_table_get_dst_ep(zb_zdo_binding_table_h handle, + unsigned char* dst_ep) +{ + struct zb_zdo_binding_table_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == dst_ep, ZIGBEE_ERROR_INVALID_PARAMETER); + + *dst_ep = h->dst_ep; + return ZIGBEE_ERROR_NONE; +} + +API int zb_discovery_cache_get_ieee_addr(zb_zdo_discovery_cache_h handle, + zb_ieee_addr addr64) +{ + struct zb_zdo_discovery_cache_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER); + + memcpy(addr64, h->addr64, sizeof(zb_ieee_addr)); + return ZIGBEE_ERROR_NONE; +} + +API int zb_discovery_cache_get_nwk_addr(zb_zdo_discovery_cache_h handle, + zb_nwk_addr* addr16) +{ + struct zb_zdo_discovery_cache_s *h = handle; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == addr16, ZIGBEE_ERROR_INVALID_PARAMETER); + + *addr16 = h->addr16; + return ZIGBEE_ERROR_NONE; +} + + diff --git a/src/zbl-zdo-svc-disc.c b/src/zbl-zdo-svc-disc.c new file mode 100644 index 0000000..65cd5f7 --- /dev/null +++ b/src/zbl-zdo-svc-disc.c @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2016 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 "zbl.h" +#include "zbl-dbus.h" +#include "zb-common.h" + +API int zb_zdo_system_server_discover_req(zb_zigbee_h handle, + unsigned short server_mask, zb_zdo_system_server_discover_cb cb, void *user_data) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + return ZIGBEE_ERROR_NONE; +} + +API int zb_zdo_find_node_cache_req(zb_zigbee_h handle, zb_nwk_addr addr16, + zb_ieee_addr addr64, zb_zdo_find_node_cache_cb cb, void *user_data) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS); + return ZIGBEE_ERROR_NONE; +} + +API int zb_zdo_discovery_cache_req(zb_zigbee_h handle, zb_nwk_addr addr16, + zb_ieee_addr addr64, zb_zdo_discovery_cache_cb cb, void *user_data) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS); + + return ZIGBEE_ERROR_NONE; +} + +API int zb_zdo_discovery_store_req(zb_zigbee_h handle, zb_nwk_addr addr16, + zb_ieee_addr addr64, unsigned char node_desc_size, unsigned char power_desc_size, + unsigned char active_ep_size, unsigned char simple_desc_count, + unsigned char *simple_desc_list, zb_zdo_discovery_store_cb cb, void *user_data) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(NULL == simple_desc_list, ZIGBEE_ERROR_INVALID_PARAMETER); + + return ZIGBEE_ERROR_NONE; +} + +API int zb_zdo_node_desc_store_req(zb_zigbee_h handle, zb_nwk_addr addr16, + zb_ieee_addr addr64, zb_zdo_node_descriptor_h nodedsc, zb_zdo_node_desc_store_cb cb, + void *user_data) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + return ZIGBEE_ERROR_NONE; +} + +API int zb_zdo_power_desc_store_req(zb_zigbee_h handle, zb_nwk_addr addr16, + zb_ieee_addr addr64, zb_zdo_node_power_descriptor_h powerdsc, + zb_zdo_power_desc_store_cb cb, void *user_data) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + return ZIGBEE_ERROR_NONE; +} + +API int zb_zdo_active_ep_store_req(zb_zigbee_h handle, zb_nwk_addr addr16, + zb_ieee_addr addr64, unsigned char active_ep_count, unsigned char *ep_list, + zb_zdo_active_ep_store_cb cb, void *user_data) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(NULL == ep_list, ZIGBEE_ERROR_INVALID_PARAMETER); + + return ZIGBEE_ERROR_NONE; +} + +API int zb_zdo_simple_desc_store_req(zb_zigbee_h handle, zb_nwk_addr addr16, + zb_ieee_addr addr64, zb_zdo_simple_desc_h simpledsc, zb_zdo_simple_desc_store_cb cb, + void *user_data) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + return ZIGBEE_ERROR_NONE; +} + +API int zb_zdo_remove_node_cache_req(zb_zigbee_h handle, zb_nwk_addr addr16, + zb_ieee_addr addr64, zb_zdo_remove_node_cache_cb cb, void *user_data) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR); + RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS); + + return ZIGBEE_ERROR_NONE; +} + diff --git a/src/zbl-zdo.c b/src/zbl-zdo.c new file mode 100644 index 0000000..e66e8a6 --- /dev/null +++ b/src/zbl-zdo.c @@ -0,0 +1,320 @@ +/* + * Copyright (c) 2015 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 + +#include "zbl.h" +#include "zb-log.h" +#include "zbl-dbus.h" +#include "zb-common.h" + +API int zb_end_dev_info_get_list(zb_zigbee_h handle, int *count, + zb_end_dev_info_h **list) +{ + int ret; + unsigned char cnt; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == count, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == list, ZIGBEE_ERROR_INVALID_PARAMETER); + + ret = zbl_get_all_device_info(list, &cnt); + *count = cnt; + return ret; +} + +API int zb_end_dev_get_endpoint_list(zb_zigbee_h handle, zb_ieee_addr addr64, + unsigned char *count, unsigned char **ep_list) +{ + int ret; + unsigned char cnt = 0; + unsigned char eplist[MAX_ENDPOINT_CLUSTERS] = {0, }; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == count, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == ep_list, ZIGBEE_ERROR_INVALID_PARAMETER); + + ret = zbl_get_endpoint_list(addr64, &cnt, eplist); + *count = cnt; + if (cnt > 0) { + *ep_list = calloc(cnt + 1, sizeof(unsigned char)); + RETV_IF(NULL == *ep_list, ZIGBEE_ERROR_OUT_OF_MEMORY); + memcpy(*ep_list, eplist, cnt); + } + return ret; +} + +API int zb_end_dev_info_get_cluster_list(zb_zigbee_h handle, zb_ieee_addr addr64, + unsigned char ep, unsigned char *in_cluster_count, unsigned short **in_cluster_list, + unsigned char *out_cluster_count, unsigned short **out_cluster_list) +{ + int ret; + unsigned char in_cnt = 0; + unsigned char out_cnt = 0; + unsigned short in_clusters[MAX_ENDPOINT_CLUSTERS] = {0, }; + unsigned short out_clusters[MAX_ENDPOINT_CLUSTERS] = {0, }; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == in_cluster_count, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == in_cluster_list, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == out_cluster_count, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == out_cluster_list, ZIGBEE_ERROR_INVALID_PARAMETER); + + ret = zbl_get_cluster_list(addr64, ep, &in_cnt, in_clusters, + &out_cnt, out_clusters); + *in_cluster_count = in_cnt; + if (in_cnt > 0) { + *in_cluster_list = calloc(in_cnt + 1, sizeof(unsigned short)); + RETV_IF(NULL == *in_cluster_list, ZIGBEE_ERROR_OUT_OF_MEMORY); + memcpy(*in_cluster_list, in_clusters, in_cnt * sizeof(unsigned short)); + } + *out_cluster_count = out_cnt; + if (out_cnt > 0) { + *out_cluster_list = calloc(out_cnt + 1, sizeof(unsigned short)); + RETV_IF(NULL == *out_cluster_list, ZIGBEE_ERROR_OUT_OF_MEMORY); + memcpy(*out_cluster_list, out_clusters, out_cnt * sizeof(unsigned short)); + } + + return ret; +} + +API int zb_foreach_end_dev_info(zb_end_dev_info_h *list, + zb_end_dev_info_cb cb, void *user_data) +{ + int index = 0; + GList *cur = NULL; + struct zb_end_device_info_s *real = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == list, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER); + CHECK_ZIGBEE_PRIVILEGE(); + + cur = (GList *)list; + while (cur) { + GList *next = cur->next; + real = cur->data; + if (ZIGBEE_FUNC_STOP == cb(index, (zb_end_dev_info_h)real->list, user_data)) + break; + index++; + cur = next; + } + + return ZIGBEE_ERROR_NONE; + +} + +API int zb_end_dev_info_create(zb_end_dev_info_h *handle) +{ + struct zb_zdo_node_descriptor_s* h = NULL; + + CHECK_ZIGBEE_PRIVILEGE(); + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + h = calloc(1, sizeof(struct zb_end_device_info_s)); + RETVM_IF(NULL == handle, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + *handle = h; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_end_dev_info_clone(zb_end_dev_info_h src, zb_end_dev_info_h *dst) +{ + struct zb_end_device_info_s *dev = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER); + + dev = calloc(1, sizeof(struct zb_end_device_info_s)); + RETVM_IF(NULL == dev, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + memcpy(dev, src, sizeof(struct zb_zdo_node_descriptor_s)); + *dst = dev; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_end_dev_info_destroy(zb_end_dev_info_h handle) +{ + struct zb_zdo_node_descriptor_s* h = handle; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + free(h); + return ZIGBEE_ERROR_NONE; +} + +API int zb_end_dev_info_get_network_address(zb_end_dev_info_h handle, + zb_nwk_addr *addr16) +{ + struct zb_end_device_info_s *h = handle; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == addr16, ZIGBEE_ERROR_INVALID_PARAMETER); + + *addr16 = h->addr16; + return ZIGBEE_ERROR_NONE; +} + +API int zb_end_dev_info_get_ieee_address(zb_end_dev_info_h handle, + zb_ieee_addr addr64) +{ + struct zb_end_device_info_s *h = handle; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER); + + memcpy(addr64, h->addr64, sizeof(zb_ieee_addr)); + return ZIGBEE_ERROR_NONE; +} + +API int zb_end_dev_info_get_num_of_ep(zb_end_dev_info_h handle, + unsigned char *count) +{ + struct zb_end_device_info_s *h = handle; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == count, ZIGBEE_ERROR_INVALID_PARAMETER); + + *count = h->num_of_ep; + return ZIGBEE_ERROR_NONE; +} + +API int zb_end_dev_info_get_ep_list(zb_end_dev_info_h handle, unsigned char **ep_list) +{ + struct zb_end_device_info_s *h = handle; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == ep_list, ZIGBEE_ERROR_INVALID_PARAMETER); + + *ep_list = calloc(h->num_of_ep, sizeof(unsigned char)); + RETVM_IF(NULL == *ep_list, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + + memcpy(*ep_list, h->ep, h->num_of_ep); + return ZIGBEE_ERROR_NONE; +} + +API int zb_end_dev_info_get_mac_capability(zb_end_dev_info_h handle, + zb_zdp_mac_capability_field_e *capability) +{ + struct zb_end_device_info_s *h = handle; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == capability, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0 == h->capability, ZIGBEE_ERROR_NO_DATA); + + *capability = h->capability; + return ZIGBEE_ERROR_NONE; +} + +API int zb_end_dev_info_get_alternative_pan_coordinator(zb_end_dev_info_h handle, + zb_zdp_do_pan_coordinator_e *can_do_it) +{ + struct zb_end_device_info_s *h = handle; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == can_do_it, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0 == h->capability, ZIGBEE_ERROR_NO_DATA); + + *can_do_it = h->capability & ZB_ZDP_ALTERNATIVE_PAN_COORDINATOR ? 1 : 0; + return ZIGBEE_ERROR_NONE; +} + +API int zb_end_dev_info_get_device_id(zb_end_dev_info_h handle, unsigned char ep, + unsigned short *deviceid) +{ + int i; + struct zb_end_device_info_s *h = handle; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == deviceid, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == h->desc, ZIGBEE_ERROR_NO_DATA); + + for (i = 0; i < h->num_of_ep; i++) { + RETV_IF(NULL == h->desc[i], ZIGBEE_ERROR_NO_DATA); + if (h->desc[i]->ep == ep) { + *deviceid = h->desc[i]->deviceid; + return ZIGBEE_ERROR_NONE; + } + } + return ZIGBEE_ERROR_NO_DATA; +} + +API int zb_end_dev_info_get_profile_id(zb_end_dev_info_h handle, unsigned char ep, + unsigned short *profileid) +{ + int i; + struct zb_end_device_info_s *h = handle; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == profileid, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == h->desc, ZIGBEE_ERROR_NO_DATA); + + for (i = 0; i < h->num_of_ep; i++) { + RETV_IF(NULL == h->desc[i], ZIGBEE_ERROR_NO_DATA); + if (h->desc[i]->ep == ep) { + *profileid = h->desc[i]->profileid; + return ZIGBEE_ERROR_NONE; + } + } + return ZIGBEE_ERROR_NO_DATA; +} + +API int zb_end_dev_info_get_power_source(zb_end_dev_info_h handle, + zb_zdp_power_e *power_src) +{ + struct zb_end_device_info_s *h = handle; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == power_src, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0 == h->capability, ZIGBEE_ERROR_NO_DATA); + + *power_src = h->capability & ZB_ZDP_POWER_SOURCE ? 1 : 0; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_end_dev_info_get_security_capabilty(zb_end_dev_info_h handle, + zb_zdp_security_cap_e*sec_capability) +{ + struct zb_end_device_info_s *h = handle; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == sec_capability, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(0 == h->capability, ZIGBEE_ERROR_NO_DATA); + + *sec_capability = h->capability & ZB_ZDP_SECURITY_CAPABILITY ? 1 : 0; + + return ZIGBEE_ERROR_NONE; +} + diff --git a/src/zbl.c b/src/zbl.c new file mode 100644 index 0000000..099a840 --- /dev/null +++ b/src/zbl.c @@ -0,0 +1,588 @@ +/* + * Copyright (c) 2015 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 +#include +#include +#include + +#include "zbl.h" +#include "zbl-dbus.h" +#include "zb-common.h" + +API int zb_ev_get_enable_status(zb_event_data_h ev, zb_error_e* status) +{ + zb_event_data_s *event = ev; + zb_event_enable_s *enable = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); + enable = event->data.enable; + RETV_IF(NULL == enable, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER); + + *status = enable->status; + + return ZIGBEE_ERROR_NONE; +} + + +API int zb_ev_get_form_network_panid(zb_event_data_h ev, zb_nwk_addr* pan_id) +{ + zb_event_data_s *event = ev; + zb_event_form_network_s *form_network = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); + form_network = event->data.form_network; + RETV_IF(NULL == form_network, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == pan_id, ZIGBEE_ERROR_INVALID_PARAMETER); + + *pan_id = form_network->pan_id; + + return ZIGBEE_ERROR_NONE; +} + + +API int zb_ev_get_join_count(zb_event_data_h ev, unsigned char* count) +{ + zb_event_data_s *event = ev; + zb_event_join_s *join = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); + join = event->data.join; + RETV_IF(NULL == join, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == count, ZIGBEE_ERROR_INVALID_PARAMETER); + + *count = join->count; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_ev_get_join_ep(zb_event_data_h ev, unsigned char** ep) +{ + zb_event_data_s *event = ev; + zb_event_join_s *join = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); + join = event->data.join; + RETV_IF(NULL == join, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == ep, ZIGBEE_ERROR_INVALID_PARAMETER); + + *ep = calloc(join->count, sizeof(unsigned char)); + if (NULL == *ep) { + ERR("Couldn't Allocate Memory"); + return ZIGBEE_ERROR_OUT_OF_MEMORY; + } + memcpy(*ep, join->ep, join->count); + + return ZIGBEE_ERROR_NONE; +} + +API int zb_ev_get_child_left_status(zb_event_data_h ev, zb_error_e* status) +{ + zb_event_data_s *event = ev; + zb_event_child_left_s *child_left = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); + child_left = event->data.child_left; + RETV_IF(NULL == child_left, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER); + + *status = child_left->status; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_ev_get_global_default_rsp_ep(zb_event_data_h ev, unsigned char* ep) +{ + zb_event_data_s *event = ev; + zb_event_global_default_rsp_s *global_default_rsp = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); + global_default_rsp = event->data.global_default_rsp; + RETV_IF(NULL == global_default_rsp, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == ep, ZIGBEE_ERROR_INVALID_PARAMETER); + + *ep = global_default_rsp->ep; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_ev_get_global_default_rsp_cluster_id(zb_event_data_h ev, + unsigned short* clusterid) +{ + zb_event_data_s *event = ev; + zb_event_global_default_rsp_s *global_default_rsp = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); + global_default_rsp = event->data.global_default_rsp; + RETV_IF(NULL == global_default_rsp, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == clusterid, ZIGBEE_ERROR_INVALID_PARAMETER); + + *clusterid = global_default_rsp->clusterid; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_ev_get_global_default_rsp_command_id(zb_event_data_h ev, + unsigned char* commandid) +{ + zb_event_data_s *event = ev; + zb_event_global_default_rsp_s *global_default_rsp = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); + global_default_rsp = event->data.global_default_rsp; + RETV_IF(NULL == global_default_rsp, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == commandid, ZIGBEE_ERROR_INVALID_PARAMETER); + + *commandid = global_default_rsp->commandid; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_ev_get_global_default_rsp_status(zb_event_data_h ev, + zb_zcl_status_e* status) +{ + zb_event_data_s *event = ev; + zb_event_global_default_rsp_s *global_default_rsp = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); + global_default_rsp = event->data.global_default_rsp; + RETV_IF(NULL == global_default_rsp, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER); + + *status = global_default_rsp->status; + + return ZIGBEE_ERROR_NONE; +} + +/* Need to be test, because we don't know things send this reports to coordinator */ +API int zb_ev_get_global_attr_report_records(zb_event_data_h ev, + zb_zcl_attr_report_h* records, unsigned char *count) +{ + zb_event_data_s *event = ev; + zb_event_global_attr_report_s *global_attr_repor = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); + global_attr_repor = event->data.global_attr_report; + RETV_IF(NULL == global_attr_repor, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER); + + *records = global_attr_repor->records; + *count = global_attr_repor->count; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_ev_get_alarm_count(zb_event_data_h ev, unsigned short* count) +{ + zb_event_data_s *event = ev; + zb_event_alarm_s *alarm = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); + alarm = event->data.alarm; + RETV_IF(NULL == alarm, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == count, ZIGBEE_ERROR_INVALID_PARAMETER); + + *count = alarm->count; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_ev_get_enroll_request_src_ep(zb_event_data_h ev, unsigned char* src_ep) +{ + zb_event_data_s *event = ev; + zb_event_ias_enroll_request_s* ias_enroll_request = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); + ias_enroll_request = event->data.ias_enroll_request; + RETV_IF(NULL == ias_enroll_request, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == src_ep, ZIGBEE_ERROR_INVALID_PARAMETER); + + *src_ep = ias_enroll_request->src_ep; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_ev_get_enroll_request_zone_type(zb_event_data_h ev, + zb_zcl_ias_zone_type_e * zone_type) +{ + zb_event_data_s *event = ev; + zb_event_ias_enroll_request_s* ias_enroll_request = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); + ias_enroll_request = event->data.ias_enroll_request; + RETV_IF(NULL == ias_enroll_request, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zone_type, ZIGBEE_ERROR_INVALID_PARAMETER); + + *zone_type = ias_enroll_request->zone_type; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_ev_get_enroll_request_mfg_code(zb_event_data_h ev, + unsigned char* mfg_code) +{ + zb_event_data_s *event = ev; + zb_event_ias_enroll_request_s* ias_enroll_request = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); + ias_enroll_request = event->data.ias_enroll_request; + RETV_IF(NULL == ias_enroll_request, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == mfg_code, ZIGBEE_ERROR_INVALID_PARAMETER); + + *mfg_code = ias_enroll_request->mfg_code; + + return ZIGBEE_ERROR_NONE; +} + + +API int zb_ev_get_ias_noti_src_ep(zb_event_data_h ev, unsigned char* src_ep) +{ + zb_event_data_s *event = ev; + zb_event_ias_noti_s* ias_noti = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); + ias_noti = event->data.ias_noti; + RETV_IF(NULL == ias_noti, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == src_ep, ZIGBEE_ERROR_INVALID_PARAMETER); + + *src_ep = ias_noti->src_ep; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_ev_get_ias_noti_zone_status(zb_event_data_h ev, + unsigned short* zone_status) +{ + zb_event_data_s *event = ev; + zb_event_ias_noti_s* ias_noti = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); + ias_noti = event->data.ias_noti; + RETV_IF(NULL == ias_noti, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zone_status, ZIGBEE_ERROR_INVALID_PARAMETER); + + *zone_status = ias_noti->zone_status; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_ev_get_ias_ext_noti_src_ep(zb_event_data_h ev, unsigned char* src_ep) +{ + zb_event_data_s *event = ev; + zb_event_ias_extended_noti_s* ias_extended_noti = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); + ias_extended_noti = event->data.ias_extended_noti; + RETV_IF(NULL == ias_extended_noti, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == src_ep, ZIGBEE_ERROR_INVALID_PARAMETER); + + *src_ep = ias_extended_noti->src_ep; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_ev_get_ias_ext_noti_status(zb_event_data_h ev, unsigned char* status) +{ + zb_event_data_s *event = ev; + zb_event_ias_extended_noti_s* ias_extended_noti = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); + ias_extended_noti = event->data.ias_extended_noti; + RETV_IF(NULL == ias_extended_noti, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER); + + *status = ias_extended_noti->status; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_ev_get_ias_ext_noti_zone_status(zb_event_data_h ev, + unsigned short* zone_status) +{ + zb_event_data_s *event = ev; + zb_event_ias_extended_noti_s* ias_extended_noti = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); + ias_extended_noti = event->data.ias_extended_noti; + RETV_IF(NULL == ias_extended_noti, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zone_status, ZIGBEE_ERROR_INVALID_PARAMETER); + + *zone_status = ias_extended_noti->zone_status; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_ev_get_ias_ext_noti_delay(zb_event_data_h ev, unsigned short* delay) +{ + zb_event_data_s *event = ev; + zb_event_ias_extended_noti_s* ias_extended_noti = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); + ias_extended_noti = event->data.ias_extended_noti; + RETV_IF(NULL == ias_extended_noti, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == delay, ZIGBEE_ERROR_INVALID_PARAMETER); + + *delay = ias_extended_noti->delay; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_ev_get_ias_ext_noti_zone_id(zb_event_data_h ev, unsigned char* zone_id) +{ + zb_event_data_s *event = ev; + zb_event_ias_extended_noti_s* ias_extended_noti = NULL; + + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + + RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER); + ias_extended_noti = event->data.ias_extended_noti; + RETV_IF(NULL == ias_extended_noti, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == zone_id, ZIGBEE_ERROR_INVALID_PARAMETER); + + *zone_id = ias_extended_noti->zone_id; + + return ZIGBEE_ERROR_NONE; +} + +API int zb_create(zb_zigbee_h *handle) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + zb_zigbee_h h = calloc(1, sizeof(struct zbl_zigbee_s)); + RETVM_IF(NULL == h, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno); + *handle = h; + +#if !GLIB_CHECK_VERSION(2, 35, 0) + g_type_init(); +#endif +#if !GLIB_CHECK_VERSION(2, 31, 0) + g_thread_init(NULL); +#endif + ret = zbl_dbus_start(*handle); + DBG("zbl_dbus_start()=0x%X", ret); + + return ret; +} + +API int zb_destroy(zb_zigbee_h handle) +{ + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + zbl_dbus_stop(handle); + return ZIGBEE_ERROR_NONE; +} + +API int zb_enable(zb_zigbee_h handle) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + ret = zbl_enable(handle); + DBG("zbl_enable()=0x%X", ret); + return ret; +} + +API int zb_set_event_cb(zb_zigbee_h handle, zb_event_cb event_handler) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + ret = zbl_set_event_cb(handle, event_handler); + DBG("zb_set_event_cb()=0x%X", ret); + return ret; +} + +API int zb_disable(zb_zigbee_h handle) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + ret = zbl_disable(); + DBG("zbl_disable()=0x%X", ret); + return ret; +} + +API int zb_hw_reset(zb_zigbee_h handle) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + ret = zbl_hw_reset(); + DBG("zbl_hw_reset()=0x%X", ret); + return ret; +} + +API int zb_coex_start(zb_zigbee_h handle, unsigned char channel) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + ret = zbl_coex_start(channel); + DBG("zbl_coex_start()=0x%X", ret); + return ret; +} + +API int zb_coex_stop(zb_zigbee_h handle) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + ret = zbl_coex_stop(); + DBG("zbl_coex_stop()=0x%X", ret); + return ret; +} + +API int zb_form_network(zb_zigbee_h handle, zb_form_network_cb cb, void *user_data) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + ret = zbl_form_network(handle, cb, user_data); + DBG("zbl_form_network()=0x%X", ret); + return ret; +} + +API int zb_disable_network(zb_zigbee_h handle, zb_disable_network_cb cb, void *user_data) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + ret = zbl_disable_network(handle, cb, user_data); + DBG("zb_disable_network()=0x%X", ret); + return ret; +} + +API int zb_leave_device(zb_zigbee_h handle, zb_ieee_addr addr, bool remove_children, bool rejoin) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == addr, ZIGBEE_ERROR_INVALID_PARAMETER); + + ret = zbl_leave_device(addr, remove_children, rejoin); + DBG("zbl_leave_device()=0x%X", ret); + return ret; +} + +API int zb_permit_join(zb_zigbee_h handle, unsigned char timeout) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + + ret = zbl_permit_join(timeout, TRUE); + DBG("zb_permit_join()=0x%X", ret); + return ret; +} + +API int zb_get_controller_mac_address(zb_zigbee_h handle, zb_ieee_addr addr64) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER); + + ret = zbl_get_controller_mac_address(addr64); + DBG("zbl_get_controller_mac_address()=0x%X", ret); + return ret; +} + +API int zb_get_network_info(zb_zigbee_h handle, zb_ieee_addr addr64, zb_nwk_addr *nodeid, + zb_nwk_addr *panid, unsigned char *channel, unsigned char *tx_power) +{ + int ret = ZIGBEE_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER); + + ret = zbl_get_network_info(addr64, nodeid, panid, channel, tx_power); + DBG("zbl_get_network_info()=0x%X", ret); + return ret; +} + +API int zb_end_dev_info_list_free(zb_end_dev_info_h *list) +{ + int i = 0, j = 0; + struct zb_end_device_info_s **plist = (struct zb_end_device_info_s **)list; + CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE); + RETV_IF(NULL == list, ZIGBEE_ERROR_INVALID_PARAMETER); + + while (plist[i]) { + j = 0; + while (plist[i]->desc && plist[i]->desc[j]) { + free(plist[i]->desc[j]); + j++; + } + if (plist[i]->desc) + free(plist[i]->desc); + free(plist[i]); + i++; + } + free(plist); + plist = NULL; + return ZIGBEE_ERROR_NONE; +} diff --git a/src/zbl.h b/src/zbl.h new file mode 100644 index 0000000..a404dff --- /dev/null +++ b/src/zbl.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2015 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 __TIZEN_NETWORK_ZIGBEE_LIBRARY_H__ +#define __TIZEN_NETWORK_ZIGBEE_LIBRARY_H__ + +#include +#include + +#ifdef API +#undef API +#endif /* API */ + +#define API __attribute__((visibility("default"))) + +struct zbl_zigbee_s { + GList *dbus_sub_ids; /**< subsrcibed dbus signal id */ + zb_event_cb event_handler; /**< event handler */ +#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC + GList *global_cmd_req; /**< list of global command requests */ +#endif + void *user_data; /**< use data */ +}; + +#endif /* TIZEN_NETWORK_ZIGBEE_LIBRARY_H__ */ diff --git a/test/main.c b/test/main.c index e0ed940..ab28b6a 100644 --- a/test/main.c +++ b/test/main.c @@ -431,13 +431,13 @@ static void _zb_event_cb(zb_nwk_addr addr16, zb_ieee_addr addr64, zb_event_e e, &type ); msg(" type = [0x%02X][%s]", type, zb_zcl_get_data_type_str(type)); - zb_attr_report_get_value( + ret = zb_attr_report_get_value( records[j], &type, &buf, &count ); - if (ZIGBEE_ERROR_NONE == ret) { + if (0 < count && ZIGBEE_ERROR_NONE == ret) { for (i = 0; i < count; i++) msg(" 0x%02X ", buf[i]); }