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)
--- /dev/null
+# 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
+++ /dev/null
-#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}")
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
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
+++ /dev/null
-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)
+++ /dev/null
-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}
+++ /dev/null
-/*
- * 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 <glib.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <zb-log.h>
-#include <zb-common.h>
-
-#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;
-}
+++ /dev/null
-/*
- * 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 <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include <glib.h>
-#include <gio/gio.h>
-
-#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;
-}
+++ /dev/null
-/*
- * 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 <gio/gio.h>
-
-#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__ */
+++ /dev/null
-/*
- * 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;
-}
-
+++ /dev/null
-/*
- * 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;
-}
+++ /dev/null
-/*
- * 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;
-}
-
+++ /dev/null
-/*
- * 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;
-}
+++ /dev/null
-/*
- * 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;
-}
+++ /dev/null
-/*
- * 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;
-}
+++ /dev/null
-/*
- * 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;
-}
+++ /dev/null
-/*
- * 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;
-}
-
+++ /dev/null
-/*
- * 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;
-}
+++ /dev/null
-/*
- * 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;
-}
+++ /dev/null
-/*
- * 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;
-}
-
+++ /dev/null
-/*
- * 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;
-}
-
+++ /dev/null
-/*
- * 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 <glib.h>
-#include <error.h>
-#include <stdlib.h>
-
-#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;
-}
-
+++ /dev/null
-/*
- * 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;
-}
+++ /dev/null
-/*
- * 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;
-}
-
+++ /dev/null
-/*
- * 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;
-}
-
-
+++ /dev/null
-/*
- * 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;
-}
-
+++ /dev/null
-/*
- * 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 <glib.h>
-
-#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;
-}
-
+++ /dev/null
-/*
- * 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 <glib.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-
-#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;
-}
+++ /dev/null
-/*
- * 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 <glib.h>
-#include <zigbee.h>
-
-#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__ */
+%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
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}
--- /dev/null
+/*
+ * 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 <glib.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <zb-log.h>
+#include <zb-common.h>
+
+#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;
+}
--- /dev/null
+/*
+ * 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 <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include <glib.h>
+#include <gio/gio.h>
+
+#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;
+}
--- /dev/null
+/*
+ * 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 <gio/gio.h>
+
+#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__ */
--- /dev/null
+/*
+ * 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;
+}
+
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+/*
+ * 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;
+}
+
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+/*
+ * 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;
+}
+
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+/*
+ * 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;
+}
+
--- /dev/null
+/*
+ * 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;
+}
+
--- /dev/null
+/*
+ * 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 <glib.h>
+#include <error.h>
+#include <stdlib.h>
+
+#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;
+}
+
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+/*
+ * 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;
+}
+
--- /dev/null
+/*
+ * 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;
+}
+
+
--- /dev/null
+/*
+ * 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;
+}
+
--- /dev/null
+/*
+ * 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 <glib.h>
+
+#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;
+}
+
--- /dev/null
+/*
+ * 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 <glib.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#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;
+}
--- /dev/null
+/*
+ * 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 <glib.h>
+#include <zigbee.h>
+
+#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__ */
&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]);
}