2 * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
26 #include <zb-common.h>
27 #include <zcl/zb-zcl-type.h>
28 #include <zdo/zb-zdo-type.h>
33 #define USE_ASYNC_DBUS_CALL
35 static int zbl_ref_count;
37 static GDBusConnection *gdbus_conn = NULL;
38 static GDBusProxy *manager_gproxy = NULL;
39 static GDBusProxy *service_gproxy = NULL;
40 static GDBusProxy *on_off_gproxy = NULL;
41 static GDBusProxy *door_lock_gproxy = NULL;
42 static GDBusProxy *level_control_gproxy = NULL;
43 static GDBusProxy *thermostat_gproxy = NULL;
44 static GDBusProxy *alarm_gproxy = NULL;
45 static GDBusProxy *fan_control_gproxy = NULL;
46 static GDBusProxy *mfglib_gproxy = NULL;
47 static GDBusProxy *zcl_global_proxy = NULL;
48 static GDBusProxy *zdo_dev_proxy = NULL;
49 static GDBusProxy *zcl_basic_proxy = NULL;
50 static GDBusProxy *zcl_identify_proxy = NULL;
51 static GDBusProxy *zcl_ias_zone_proxy = NULL;
52 static GDBusProxy *zcl_poll_control_proxy = NULL;
53 static GDBusProxy *zcl_group_proxy = NULL;
54 static GDBusProxy *zcl_scene_proxy = NULL;
55 static GDBusProxy *zdo_bind_proxy = NULL;
56 static GDBusProxy *zcl_color_control_proxy = NULL;
57 static GDBusProxy *custom_gproxy = NULL;
62 ZBL_SERVICE_FORM_NETWORK = 0,
63 ZBL_SERVICE_DISABLE_NETWORK,
66 ZBL_ZDO_NWK_ADDR_EXT_REQ,
67 ZBL_ZDO_ACTIVE_EP_REQ,
68 ZBL_ZDO_SIMPLE_DESC_REQ,
69 ZBL_ZDO_MATCHED_DESCRIPTOR_REQ,
70 ZBL_ZDO_COMPLEX_DESC_REQ,
71 ZBL_ZDO_MGMT_BIND_REQ,
74 ZBL_ZDO_MGMT_NWK_DISC_REQ,
75 ZBL_ZDO_MGMT_PERMIT_JOIN_REQ,
76 ZBL_ZDO_MGMT_LEAVE_REQ,
77 ZBL_ZDO_NODE_DESC_REQ,
78 ZBL_ZDO_POWER_DESC_REQ,
79 ZBL_ZDO_USER_DESC_REQ,
80 ZBL_ZDO_USER_DESC_SET_REQ,
85 ZBL_ZCL_GLOBAL_READ_ATTRIBUTE_REQ,
86 ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_REQ,
87 ZBL_ZCL_GLOBAL_CONFIGURE_REPORTING_REQ,
88 ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_REQ,
89 ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_STRUCTURED_REQ,
90 ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_RECEIVED_REQ,
91 ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_GENERATED_REQ,
92 ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_EXTENDED_REQ,
93 ZBL_ZCL_GLOBAL_READ_CONFIGURE_REPORTING_REQ,
95 ZBL_CUSTOM_APS_SEND_REQ,
96 ZBL_CUSTOM_ZCL_SEND_REQ,
97 ZBL_CUSTOM_LOCAL_SEND_REQ,
99 ZBL_ZCL_ALARM_GET_ALARM_REQ,
101 ZBL_ZCL_DOORLOCK_LOCK_STATE,
103 ZBL_ZCL_FANMODE_FAN_MODE_STATE,
105 ZBL_ZCL_GROUP_ADD_GROUP_REQ,
106 ZBL_ZCL_GROUP_VIEW_GROUP_REQ,
107 ZBL_ZCL_GROUP_GET_GROUP_MEMBERSHIP_REQ,
108 ZBL_ZCL_GROUP_REMOVE_GROUP_REQ,
110 ZBL_ZCL_IDENTIFY_QUERY_REQ,
112 ZBL_ZCL_ON_OFF_GET_ON_OFF_STATE,
113 /* ZCL Pollcontrol */
114 ZBL_ZCL_POLLCONTROL_SET_POLL_INTERVAL_REQ,
116 ZBL_ZCL_SCENE_ADD_SCENE_REQ,
117 ZBL_ZCL_SCENE_VIEW_SCENE_REQ,
118 ZBL_ZCL_SCENE_REMOVE_SCENE_REQ,
119 ZBL_ZCL_SCENE_STORE_SCENE_REQ,
120 ZBL_ZCL_SCENE_REMOVE_ALL_SCENE_REQ,
121 ZBL_ZCL_SCENE_GET_SCENE_MEMBERSHIP_REQ,
123 ZBL_ZCL_THERMOSTAT_GET_LOCAL_TEMP,
132 #ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
136 zbl_command_id_e cid;
139 #define ZCL_REPORTING_DIRECTION_REPORTED 0x00
140 #define ZCL_REPORTING_DIRECTION_RECEIVED 0x01
142 static GDBusConnection *_zbl_get_connection(void)
144 GError *error = NULL;
146 return g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
149 static GDBusProxy *_zbl_get_manager_proxy(void)
151 GDBusProxy *proxy = NULL;
152 RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
154 if (NULL == manager_gproxy) {
155 proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
156 ZIGBEE_SERVER_NAME, ZIGBEE_DBUS_OBJPATH, ZIGBEE_MANAGER_INTERFACE,
159 proxy = manager_gproxy;
164 static GDBusProxy *_zbl_get_service_proxy(void)
166 GDBusProxy *proxy = NULL;
167 RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
169 if (NULL == service_gproxy) {
170 proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
171 ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_SERVICE_INTERFACE,
174 proxy = service_gproxy;
179 static GDBusProxy *_zbl_get_on_off_proxy(void)
181 GDBusProxy *proxy = NULL;
182 RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
184 if (NULL == on_off_gproxy) {
185 proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
186 ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
187 ZIGBEE_ZCL_ON_OFF_INTERFACE, NULL, NULL);
189 proxy = on_off_gproxy;
194 static GDBusProxy *_zbl_get_door_lock_proxy(void)
196 GDBusProxy *proxy = NULL;
197 RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
199 if (NULL == door_lock_gproxy) {
200 proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
201 ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
202 ZIGBEE_ZCL_DOOR_LOCK_INTERFACE, NULL, NULL);
204 proxy = door_lock_gproxy;
209 static GDBusProxy *_zbl_get_level_control_proxy(void)
211 GDBusProxy *proxy = NULL;
212 RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
214 if (NULL == level_control_gproxy) {
215 proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
216 ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
217 ZIGBEE_ZCL_LEVEL_CONTROL_INTERFACE, NULL, NULL);
219 proxy = level_control_gproxy;
224 static GDBusProxy *_zbl_get_thermostat_proxy(void)
226 GDBusProxy *proxy = NULL;
227 RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
229 if (NULL == thermostat_gproxy) {
230 proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
231 ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
232 ZIGBEE_ZCL_THERMOSTAT_INTERFACE, NULL, NULL);
234 proxy = thermostat_gproxy;
239 static GDBusProxy *_zbl_get_alarm_proxy(void)
241 GDBusProxy *proxy = NULL;
242 RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
244 if (NULL == alarm_gproxy) {
245 proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
246 ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_ZCL_ALARM_INTERFACE,
249 proxy = alarm_gproxy;
254 static GDBusProxy *_zbl_get_fan_control_proxy(void)
256 GDBusProxy *proxy = NULL;
257 RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
259 if (NULL == fan_control_gproxy) {
260 proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
261 ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
262 ZIGBEE_ZCL_FAN_CONTROL_INTERFACE, NULL, NULL);
264 proxy = fan_control_gproxy;
269 static GDBusProxy *_zbl_get_mfglib_proxy(void)
271 GDBusProxy *proxy = NULL;
272 RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
274 if (NULL == mfglib_gproxy) {
275 proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
276 ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
277 ZIGBEE_MFGLIB_CONTROL_INTERFACE, NULL, NULL);
279 proxy = mfglib_gproxy;
284 static GDBusProxy *_zbl_get_zcl_global_proxy(void)
286 GDBusProxy *proxy = NULL;
287 RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
289 if (NULL == zcl_global_proxy) {
290 proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
291 ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
292 ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, NULL, NULL);
294 proxy = zcl_global_proxy;
299 static GDBusProxy *_zbl_get_zdo_dev_proxy(void)
301 GDBusProxy *proxy = NULL;
302 RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
304 if (NULL == zdo_dev_proxy) {
305 proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
306 ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
307 ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, NULL, NULL);
309 proxy = zdo_dev_proxy;
314 static GDBusProxy *_zbl_get_basic_proxy(void)
316 GDBusProxy *proxy = NULL;
317 RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
319 if (NULL == zcl_basic_proxy) {
320 proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
321 ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_ZCL_BASIC_INTERFACE,
324 proxy = zcl_basic_proxy;
329 static GDBusProxy *_zbl_get_identify_proxy(void)
331 GDBusProxy *proxy = NULL;
332 RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
334 if (NULL == zcl_identify_proxy) {
335 proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
336 ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
337 ZIGBEE_ZCL_IDENTIFY_INTERFACE, NULL, NULL);
339 proxy = zcl_identify_proxy;
344 static GDBusProxy *_zbl_get_ias_zone_proxy(void)
346 GDBusProxy *proxy = NULL;
347 RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
349 if (NULL == zcl_ias_zone_proxy) {
350 proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
351 ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
352 ZIGBEE_ZCL_IAS_ZONE_INTERFACE, NULL, NULL);
354 proxy = zcl_ias_zone_proxy;
359 static GDBusProxy *_zbl_get_poll_control_proxy(void)
361 GDBusProxy *proxy = NULL;
362 RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
364 if (NULL == zcl_poll_control_proxy) {
365 proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
366 ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
367 ZIGBEE_ZCL_POLL_CONTROL_INTERFACE, NULL, NULL);
369 proxy = zcl_poll_control_proxy;
374 static GDBusProxy *_zbl_get_group_proxy(void)
376 GDBusProxy *proxy = NULL;
377 RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
379 if (NULL == zcl_group_proxy) {
380 proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
381 ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_ZCL_GROUP_INTERFACE,
384 proxy = zcl_group_proxy;
389 static GDBusProxy *_zbl_get_scene_proxy(void)
391 GDBusProxy *proxy = NULL;
392 RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
394 if (NULL == zcl_scene_proxy) {
395 proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
396 ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_ZCL_SCENE_INTERFACE,
399 proxy = zcl_scene_proxy;
404 static GDBusProxy *_zbl_get_zdo_bind_proxy(void)
406 GDBusProxy *proxy = NULL;
407 RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
409 if (NULL == zdo_bind_proxy) {
410 proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
411 ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_ZDO_BIND_INTERFACE,
414 proxy = zdo_bind_proxy;
419 static GDBusProxy *_zbl_get_color_control_proxy(void)
421 GDBusProxy *proxy = NULL;
422 RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
424 if (NULL == zcl_color_control_proxy) {
425 proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
426 ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
427 ZIGBEE_ZCL_COLOR_CONTROL_INTERFACE, NULL, NULL);
429 proxy = zcl_color_control_proxy;
434 static GDBusProxy *_zbl_get_custom_gproxy(void)
436 GDBusProxy *proxy = NULL;
437 RETVM_IF(NULL == gdbus_conn, NULL, "Custom Object is invalid");
439 if (NULL == custom_gproxy) {
440 proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
441 ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_CUSTOM_INTERFACE,
444 proxy = custom_gproxy;
449 #ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
450 static gint _global_compare_func(gconstpointer a, gconstpointer b)
452 const zbl_req_cb_s *left = (const zbl_req_cb_s*)a;
453 const zbl_req_cb_s *right = (const zbl_req_cb_s*)b;
454 zb_event_global_default_rsp_s *left_data = NULL;
455 zb_event_global_default_rsp_s *right_data = NULL;
457 if (NULL == left || NULL == left->global_cmd)
459 if (NULL == right || NULL == right->global_cmd)
462 left_data = left->global_cmd;
463 right_data = right->global_cmd;
465 if (left_data->ep > right_data->ep)
467 else if (left_data->ep < right_data->ep)
470 if (left_data->cluster_id > right_data->cluster_id)
472 else if (left_data->cluster_id < right_data->cluster_id)
475 if (left_data->command_id > right_data->command_id)
477 else if (left_data->command_id < right_data->command_id)
480 /* endpoint, cluster_id and command_id are equal */
484 static void _zbl_register_global_req(zigbee_h handle, zbl_req_cb_s *container)
489 if (NULL == handle || NULL == container)
492 list = handle->global_cmd_req;
494 /* Insert item if not exists */
495 DBG("Insert global cmd info");
497 item = g_list_find_custom(list, container, _global_compare_func);
499 handle->global_cmd_req = g_list_append(list, container);
501 handle->global_cmd_req = g_list_append(list, container);
504 static void _zbl_deregister_global_req(zigbee_h handle, zbl_req_cb_s *container)
509 if (NULL == handle || NULL == container)
512 list = handle->global_cmd_req;
516 /* Remove item if exists */
517 DBG("Remove global cmd info");
518 item = g_list_find_custom(list, container, _global_compare_func);
520 handle->global_cmd_req = g_list_remove(list, container);
523 static void _zbl_remove_global_req(zigbee_h handle, unsigned char ep,
524 unsigned short cluster_id, unsigned char command_id)
528 zbl_req_cb_s *ret = NULL;
533 head = handle->global_cmd_req;
536 while (NULL != iter) {
537 GList *next = iter->next;
538 zbl_req_cb_s *container = iter->data;
539 if (container && container->global_cmd) {
540 zb_event_global_default_rsp_s *data = container->global_cmd;
542 if (data && data->ep == ep && data->cluster_id == cluster_id
543 && data->command_id == command_id) {
544 DBG(" Found: ep[%d] cluster_id[%X] command_id[%X] / sid[%d]",
545 ep, cluster_id, command_id, container->sid);
555 g_dbus_connection_signal_unsubscribe(gdbus_conn, ret->sid);
558 g_source_remove(ret->tid);
559 DBG("tid=%d removed");
563 _zbl_deregister_global_req(handle, ret);
567 #endif /* ZB_FEATURE_GLOBAL_RSP_SYNC */
569 static void _zbl_signal_handler(GDBusConnection *connection,
570 const gchar *sender_name, const gchar *object_path, const gchar *interface_name,
571 const gchar *signal_name, GVariant *parameters, gpointer user_data)
573 zigbee_h container = (zigbee_h)user_data;
574 RETM_IF(NULL == container, "container is null");
575 RETM_IF(NULL == container->event_handler, "event_handler is null");
576 DBG("%s signal received", signal_name);
578 if (g_strcmp0(signal_name, "service_enabled") == 0) {
580 g_variant_get(parameters, "(b)", &enabled);
583 ev.data.enable = calloc(1, sizeof(zb_event_enable_s));
584 RETM_IF(NULL == ev.data.enable, "Failed to memory allocation !");
586 ev.data.enable->status = (unsigned char)enabled;
587 container->event_handler(0, NULL, ZB_ZDP_ENABLE_EVENT, ev);
588 free(ev.data.enable);
589 } else if (g_strcmp0(signal_name, "form_network_done") == 0) {
591 g_variant_get(parameters, "(q)", &pan_id);
594 ev.data.form_network = calloc(1, sizeof(zb_event_form_network_s));
595 RETM_IF(NULL == ev.data.form_network, "Failed to memory allocation !");
597 memcpy(&ev.data.form_network->pan_id, &pan_id, sizeof(nwk_addr));
598 container->event_handler(pan_id, NULL, ZB_ZDP_FORM_NETWORK_DONE, ev);
599 free(ev.data.form_network);
600 } else if (g_strcmp0(signal_name, "child_joined") == 0) {
604 unsigned char ep[10];
608 GVariantIter *iter1 = NULL;
609 GVariantIter *iter2 = NULL;
611 g_variant_get(parameters, "(a(y)ya(y)q)", &iter1, &count, &iter2, &addr16);
612 while (g_variant_iter_loop(iter1, "(y)", &value)) {
617 g_variant_iter_free(iter1);
620 while (g_variant_iter_loop(iter2, "(y)", &value)) {
625 g_variant_iter_free(iter2);
628 ev.data.join = calloc(1, sizeof(zb_event_join_s));
629 RETM_IF(NULL == ev.data.join, "Failed to memory allocation !");
631 ev.data.join->count = count;
632 memcpy(ev.data.join->ep, ep, count);
633 container->event_handler(addr16, addr64, ZB_ZDP_JOIN_EVENT, ev);
635 } else if (g_strcmp0(signal_name, "child_rejoined") == 0) {
640 GVariantIter *iter = NULL;
642 g_variant_get(parameters, "(a(y))", &iter);
643 while (g_variant_iter_loop(iter, "(y)", &value)) {
648 g_variant_iter_free(iter);
651 memset(&ev, 0, sizeof(zb_event_data_s));
652 container->event_handler(0, addr64, ZB_ZDP_REJOIN_EVENT, ev);
653 } else if (g_strcmp0(signal_name, "child_left") == 0) {
656 GVariantIter *iter = NULL;
657 unsigned char value, status;
659 g_variant_get(parameters, "(a(y)y)", &iter, &status);
660 while (g_variant_iter_loop(iter, "(y)", &value)) {
665 g_variant_iter_free(iter);
668 ev.data.child_left = calloc(1, sizeof(zb_event_child_left_s));
669 RETM_IF(NULL == ev.data.child_left, "Failed to memory allocation !");
671 ev.data.child_left->status = status;
672 container->event_handler(0, addr64, ZB_ZDP_CHILD_LEFT, ev);
673 free(ev.data.child_left);
674 } else if (g_strcmp0(signal_name, "leave_network_done") == 0) {
676 g_variant_get(parameters, "(q)", &addr16);
679 memset(&ev, 0, sizeof(zb_event_data_s));
680 container->event_handler(addr16, NULL, ZB_ZDP_LEAVE_DONE_EVENT, ev);
681 } else if (!g_strcmp0(signal_name, "zcl_global_default_response")) {
684 unsigned short cluster_id;
685 unsigned char command_id;
686 unsigned char status;
688 g_variant_get(parameters, "(qyqyy)", &addr16, &ep, &cluster_id, &command_id, &status);
691 ev.data.global_default_rsp = calloc(1, sizeof(zb_event_global_default_rsp_s));
692 RETM_IF(NULL == ev.data.global_default_rsp, "Failed to memory allocation !");
694 ev.data.global_default_rsp->ep = ep;
695 ev.data.global_default_rsp->cluster_id = cluster_id;
696 ev.data.global_default_rsp->command_id = command_id;
697 ev.data.global_default_rsp->status = status;
699 #ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
700 /* If there is global request already, remove that. */
702 _zbl_remove_global_req(container, ep, cluster_id, command_id);
705 container->event_handler(addr16, NULL, ZB_ZCL_GLOBAL_DEFAULT_RSP_EVENT, ev);
706 free(ev.data.global_default_rsp);
707 } else if (!g_strcmp0(signal_name, "alarm_count")) {
708 unsigned short alarm_count;
709 g_variant_get(parameters, "(q)", &alarm_count);
712 ev.data.alarm = calloc(1, sizeof(zb_event_alarm_s));
713 RETM_IF(NULL == ev.data.alarm, "Failed to memory allocation !");
715 ev.data.alarm->count = alarm_count;
716 container->event_handler(0, NULL, ZB_ZCL_ALARM_EVENT, ev);
718 } else if (!g_strcmp0(signal_name, "report_attr_handler_rsp")) {
722 unsigned short attrData;
723 unsigned short cluster_id;
724 unsigned char dataType;
725 unsigned short data_size;
727 char dSize[3] = {'\0', '\0'};
728 int i = 0, j = 0, records_len;
729 GVariantIter *attr_iter = NULL;
730 GVariantIter *dataType_iter = NULL;
731 GVariantIter *data_iter = NULL;
733 attr_report_h *records = NULL;
735 g_variant_get(parameters, "(qyqaqayayi)", &addr16, &ep,
736 &cluster_id, &attr_iter, &dataType_iter, &data_iter, &records_len);
738 records = calloc(records_len, sizeof(attr_report_h));
739 RETM_IF(NULL == records, "calloc() Fail(%d)", errno);
740 for (j = 0; j < records_len; j++) {
741 records[j] = calloc(1, sizeof(struct attribute_report_s));
742 if (NULL == records[j]) {
743 for (i = 0; i < j; i++)
746 if (NULL != attr_iter)
747 g_variant_iter_free(attr_iter);
748 if (NULL != dataType_iter)
749 g_variant_iter_free(dataType_iter);
750 if (NULL != data_iter)
751 g_variant_iter_free(data_iter);
753 ERR("calloc() Fail(%d)", errno);
757 DBG("record_length %d", records_len);
760 while (g_variant_iter_loop(attr_iter, "q", &attrData)
761 && g_variant_iter_loop(dataType_iter, "y", &dataType)) {
762 records[j]->id = attrData;
763 records[j]->type = dataType;
764 DBG("dataType 0x%02x", records[j]->type);
765 DBG("AttributeId 0x%04x", records[j]->id);
768 if (NULL != attr_iter)
769 g_variant_iter_free(attr_iter);
770 if (NULL != dataType_iter)
771 g_variant_iter_free(dataType_iter);
774 while (j < records_len) {
775 switch (records[j]->type) {
777 case ZB_ZCL_OCTAT_STRING:
778 case ZB_ZCL_CHRACTER_STRING:
779 g_variant_iter_loop(data_iter, "y", &value);
780 data_size = value + 1;
781 records[j]->value = calloc(data_size, sizeof(unsigned char));
782 if (NULL == records[j]->value) {
783 for (i = 0; i < j; i++)
784 free(records[i]->value);
785 for (i = 0; i < records_len; i++)
788 ERR("calloc() Fail(%d)", errno);
791 records[j]->value[dsizeIndex] = value;
793 for (i = dsizeIndex; i < data_size - 2; i++) {
794 g_variant_iter_loop(data_iter, "y", &value);
795 records[j]->value[i] = value;
797 if (NULL != data_iter)
798 g_variant_iter_free(data_iter);
800 case ZB_ZCL_LONG_OCTAT_STRING:
801 case ZB_ZCL_LONG_CHRACTER_STRING:
802 g_variant_iter_loop(data_iter, "y", &value);
804 g_variant_iter_loop(data_iter, "y", &value);
806 data_size = dSize[1];
807 data_size = (data_size << 8) | dSize[0];
809 records[j]->value = calloc(data_size, sizeof(unsigned char));
810 if (NULL == records[j]->value) {
811 for (i = 0; i < j; i++)
812 free(records[i]->value);
813 for (i = 0; i < records_len; i++)
816 ERR("calloc() Fail(%d)", errno);
819 records[j]->value[dsizeIndex] = dSize[dsizeIndex];
821 records[j]->value[dsizeIndex] = dSize[dsizeIndex];
823 for (i = dsizeIndex; i < data_size - 2; i++) {
824 g_variant_iter_loop(data_iter, "y", &value);
825 records[j]->value[i] = value;
827 if (NULL != data_iter)
828 g_variant_iter_free(data_iter);
830 /* Array, set and bag */
835 case ZB_ZCL_STRUCTURE:
836 ERR("Not supported type = %d", records[i]->type);
839 data_size = zb_get_data_size(records[j]->type);
840 records[j]->value = calloc(data_size, sizeof(unsigned char));
841 if (NULL == records[j]->value) {
842 for (i = 0; i < j; i++)
843 free(records[i]->value);
844 for (i = 0; i < records_len; i++)
847 ERR("calloc() Fail(%d)", errno);
850 if (data_size != 0xFF) {
851 for (i = 0; i < data_size; i++) {
852 g_variant_iter_loop(data_iter, "y", &value);
853 records[j]->value[i] = value;
854 DBG("value[%d] 0x%02X", i, records[j]->value[i]);
857 if (NULL != data_iter)
858 g_variant_iter_free(data_iter);
860 DBG("DataType = 0x%02X Data Size = %d", records[j]->type, data_size);
865 ev.data.global_attr_report = calloc(1, sizeof(zb_event_global_attr_report_s));
866 if (NULL == ev.data.global_attr_report) {
867 ERR("Failed to memory allocation !");
868 for (j = 0; j < records_len; j++) {
869 free(records[j]->value);
875 ev.data.global_attr_report->records = records;
876 ev.data.global_attr_report->count = records_len;
877 container->event_handler(addr16, NULL, ZB_ZCL_GLOBAL_ATTRIBUTE_REPORT_EVENT, ev);
878 for (j = 0; j < records_len; j++) {
879 free(records[j]->value);
883 free(ev.data.global_attr_report);
884 } else if (!g_strcmp0(signal_name, "status_change_rpt")) {
887 unsigned char src_ep;
888 unsigned char extended_status;
889 unsigned short zone_status;
890 unsigned short delay;
891 unsigned char zone_id;
892 g_variant_get(parameters, "(qyqyyq)", &addr16, &src_ep, &zone_status,
893 &extended_status, &zone_id, &delay);
894 if (0xff == zone_id) {
895 ev.data.ias_noti = calloc(1, sizeof(zb_event_ias_noti_s));
896 RETM_IF(NULL == ev.data.ias_noti, "Failed to memory allocation !");
898 ev.data.ias_noti->src_ep = src_ep;
899 ev.data.ias_noti->zone_status = zone_status;
900 container->event_handler(addr16, NULL,
901 ZB_ZCL_IAS_ZONE_STATUS_CHANGE_NOTIFICATION_EVENT, ev);
903 free(ev.data.ias_noti);
905 ev.data.ias_extended_noti = calloc(1, sizeof(zb_event_ias_extended_noti_s));
906 RETM_IF(NULL == ev.data.ias_extended_noti, "Failed to memory allocation !");
908 ev.data.ias_extended_noti->src_ep = src_ep;
909 ev.data.ias_extended_noti->zone_status = zone_status;
910 ev.data.ias_extended_noti->extended_status = extended_status;
911 ev.data.ias_extended_noti->zone_id = zone_id;
912 ev.data.ias_extended_noti->delay = delay;
913 container->event_handler(addr16, NULL,
914 ZB_ZCL_IAS_ZONE_STATUS_CHANGE_EXTENDED_NOTIFICATION_EVENT, ev);
916 free(ev.data.ias_extended_noti);
918 } else if (!g_strcmp0(signal_name, "enroll_request")) {
920 unsigned char src_ep;
921 unsigned short zone_type;
922 unsigned char mfg_code;
924 ev.data.ias_enroll_request = calloc(1, sizeof(zb_event_ias_enroll_request_s));
925 RETM_IF(NULL == ev.data.ias_enroll_request, "Failed to memory allocation !");
927 g_variant_get(parameters, "(qyqy)", &addr16, &src_ep, &zone_type, &mfg_code);
928 ev.data.ias_enroll_request->src_ep = src_ep;
929 ev.data.ias_enroll_request->zone_type = zone_type;
930 ev.data.ias_enroll_request->mfg_code = mfg_code;
931 container->event_handler(addr16, NULL, ZB_ZCL_IAS_ZONE_ENROLL_REQUEST_EVENT, ev);
932 free(ev.data.ias_enroll_request);
934 ERR("Can't handle this signal=%s", signal_name);
938 static void _zbl_dbus_unsubscribe_signal(GList *sub_ids)
940 GDBusConnection *conn = _zbl_get_connection();
941 if (NULL == conn || NULL == sub_ids)
945 g_dbus_connection_signal_unsubscribe(conn, GPOINTER_TO_UINT(sub_ids));
946 sub_ids = g_list_remove(sub_ids, sub_ids);
950 static int _zbl_dbus_subscribe_signal(zigbee_h handle)
954 /* Section 1. Subscribe ZDO signal */
955 id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_SERVICE_INTERFACE,
956 "service_enabled", ZIGBEE_CONTROL_OBJECT_PATH, NULL,
957 G_DBUS_CALL_FLAGS_NONE, _zbl_signal_handler, handle, NULL);
959 ERR("g_dbus_connection_signal_subscribe(service_enabled) Fail(%d)", errno);
960 return ZIGBEE_ERROR_IO_ERROR;
962 handle->dbus_sub_ids = g_list_append(handle->dbus_sub_ids, GUINT_TO_POINTER(id));
963 DBG("subscribed for service_enabled signal %d", id);
965 id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_SERVICE_INTERFACE,
966 "child_joined", ZIGBEE_CONTROL_OBJECT_PATH, NULL,
967 G_DBUS_CALL_FLAGS_NONE, _zbl_signal_handler, handle, NULL);
969 ERR("g_dbus_connection_signal_subscribe(child_rejoined) Fail(%d)\n", errno);
970 _zbl_dbus_unsubscribe_signal(handle->dbus_sub_ids);
971 return ZIGBEE_ERROR_IO_ERROR;
973 handle->dbus_sub_ids = g_list_append(handle->dbus_sub_ids, GUINT_TO_POINTER(id));
974 DBG("subscribed for child_joined signal %d", id);
976 id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_SERVICE_INTERFACE,
977 "child_rejoined", ZIGBEE_CONTROL_OBJECT_PATH, NULL,
978 G_DBUS_CALL_FLAGS_NONE, _zbl_signal_handler, handle, NULL);
980 ERR("g_dbus_connection_signal_subscribe(child_rejoined) Fail(%d)\n", errno);
981 _zbl_dbus_unsubscribe_signal(handle->dbus_sub_ids);
982 return ZIGBEE_ERROR_IO_ERROR;
984 handle->dbus_sub_ids = g_list_append(handle->dbus_sub_ids, GUINT_TO_POINTER(id));
985 DBG("subscribed for child_rejoined signal %d", id);
987 id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_SERVICE_INTERFACE,
988 "child_left", ZIGBEE_CONTROL_OBJECT_PATH, NULL,
989 G_DBUS_CALL_FLAGS_NONE, _zbl_signal_handler, handle, NULL);
991 ERR("g_dbus_connection_signal_subscribe(child_left) Fail(%d)\n", errno);
992 _zbl_dbus_unsubscribe_signal(handle->dbus_sub_ids);
993 return ZIGBEE_ERROR_IO_ERROR;
995 handle->dbus_sub_ids = g_list_append(handle->dbus_sub_ids, GUINT_TO_POINTER(id));
996 DBG("subscribed for child_left signal %d", id);
998 id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_SERVICE_INTERFACE,
999 "leave_network_done", ZIGBEE_CONTROL_OBJECT_PATH, NULL,
1000 G_DBUS_CALL_FLAGS_NONE, _zbl_signal_handler, handle, NULL);
1002 ERR("g_dbus_connection_signal_subscribe(leave_network_done) Fail(%d)\n", errno);
1003 _zbl_dbus_unsubscribe_signal(handle->dbus_sub_ids);
1004 return ZIGBEE_ERROR_IO_ERROR;
1006 handle->dbus_sub_ids = g_list_append(handle->dbus_sub_ids, GUINT_TO_POINTER(id));
1007 DBG("subscribed for leave_network_done signal %d", id);
1009 id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_SERVICE_INTERFACE,
1010 "form_network_done", ZIGBEE_CONTROL_OBJECT_PATH, NULL,
1011 G_DBUS_CALL_FLAGS_NONE, _zbl_signal_handler, handle, NULL);
1013 ERR("g_dbus_connection_signal_subscribe(form_network_done) Fail(%d)\n", errno);
1014 _zbl_dbus_unsubscribe_signal(handle->dbus_sub_ids);
1015 return ZIGBEE_ERROR_IO_ERROR;
1017 handle->dbus_sub_ids = g_list_append(handle->dbus_sub_ids, GUINT_TO_POINTER(id));
1018 DBG("subscribed for form_network_done signal %d", id);
1020 /* Section 3. Subscribe ZCL global command */
1021 id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
1022 ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "zcl_global_default_response",
1023 ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE,
1024 _zbl_signal_handler, handle, NULL);
1026 ERR("g_dbus_connection_signal_subscribe(zcl_global_default_response) Fail(%d)\n", errno);
1027 _zbl_dbus_unsubscribe_signal(handle->dbus_sub_ids);
1028 return ZIGBEE_ERROR_IO_ERROR;
1030 handle->dbus_sub_ids = g_list_append(handle->dbus_sub_ids, GUINT_TO_POINTER(id));
1031 DBG("subscribed for zcl_global_default_response signal %d", id);
1033 id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
1034 ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "report_attr_handler_rsp",
1035 ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE,
1036 _zbl_signal_handler, handle, NULL);
1038 ERR("g_dbus_connection_signal_subscribe(report_attr_handler_rsp) Fail(%d)\n", errno);
1039 _zbl_dbus_unsubscribe_signal(handle->dbus_sub_ids);
1040 return ZIGBEE_ERROR_IO_ERROR;
1042 handle->dbus_sub_ids = g_list_append(handle->dbus_sub_ids, GUINT_TO_POINTER(id));
1043 DBG("subscribed for report_attr_handler_rsp signal %d", id);
1045 /* Section 2. Subscribe ZCL alarm cluster signal */
1046 id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_ZCL_ALARM_INTERFACE,
1047 "alarm_count", ZIGBEE_CONTROL_OBJECT_PATH, NULL,
1048 G_DBUS_CALL_FLAGS_NONE, _zbl_signal_handler, handle, NULL);
1050 ERR("g_dbus_connection_signal_subscribe(alarm_count) Fail(%d)\n", errno);
1051 _zbl_dbus_unsubscribe_signal(handle->dbus_sub_ids);
1052 return ZIGBEE_ERROR_IO_ERROR;
1054 handle->dbus_sub_ids = g_list_append(handle->dbus_sub_ids, GUINT_TO_POINTER(id));
1055 DBG("subscribed for alarm_count signal %d", id);
1057 /* Section 3. Subscribe ZCL IAS cluster signal */
1058 id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_ZCL_IAS_ZONE_INTERFACE,
1059 "status_change_rpt", ZIGBEE_CONTROL_OBJECT_PATH, NULL,
1060 G_DBUS_CALL_FLAGS_NONE, _zbl_signal_handler, handle, NULL);
1062 ERR("g_dbus_connection_signal_subscribe(status_change_rpt) Fail(%d)\n", errno);
1063 _zbl_dbus_unsubscribe_signal(handle->dbus_sub_ids);
1064 return ZIGBEE_ERROR_IO_ERROR;
1066 handle->dbus_sub_ids = g_list_append(handle->dbus_sub_ids, GUINT_TO_POINTER(id));
1067 DBG("subscribed for status_change_rpt signal %d", id);
1069 id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_ZCL_IAS_ZONE_INTERFACE,
1070 "enroll_request", ZIGBEE_CONTROL_OBJECT_PATH, NULL,
1071 G_DBUS_CALL_FLAGS_NONE, _zbl_signal_handler, handle, NULL);
1073 ERR("g_dbus_connection_signal_subscribe(enroll_request) Fail(%d)\n", errno);
1074 _zbl_dbus_unsubscribe_signal(handle->dbus_sub_ids);
1075 return ZIGBEE_ERROR_IO_ERROR;
1077 handle->dbus_sub_ids = g_list_append(handle->dbus_sub_ids, GUINT_TO_POINTER(id));
1078 DBG("subscribed for enroll_request signal %d", id);
1080 return ZIGBEE_ERROR_NONE;
1083 static void _zbl_dbus_name_owner_notify(GObject *object, GParamSpec *pspec,
1084 gpointer *user_data)
1086 GDBusProxy *proxy = G_DBUS_PROXY(object);
1087 gchar *name_owner = g_dbus_proxy_get_name_owner(proxy);
1093 static void _zbl_request_cleanup(gpointer data)
1095 zbl_req_cb_s *container = data;
1096 RET_IF(NULL == container);
1098 if (container->tid) {
1099 g_source_remove(container->tid);
1100 DBG("tid=%d removed");
1104 #ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
1105 _zbl_deregister_global_req(container->handle, container);
1111 static gboolean _zbl_timeout_cb(gpointer p)
1113 zbl_req_cb_s *container = (zbl_req_cb_s *)p;
1115 RETVM_IF(NULL == gdbus_conn, G_SOURCE_REMOVE, "gdbus_conn is NULL");
1116 RETVM_IF(NULL == p, G_SOURCE_REMOVE, "container is NULL");
1117 RETVM_IF(NULL == container->cb, G_SOURCE_REMOVE, "cb is NULL");
1118 RETVM_IF(true == container->found, G_SOURCE_REMOVE, "cb was alreay handled");
1120 switch (container->cid) {
1122 case ZBL_SERVICE_FORM_NETWORK: {
1123 zb_form_network_cb cb = container->cb;
1124 cb(0x0000, container->userdata);
1127 case ZBL_SERVICE_DISABLE_NETWORK: {
1128 zb_disable_network_cb cb = container->cb;
1129 cb(0x0000, container->userdata);
1130 cb(ZB_ZDP_TIMEOUT, container->userdata);
1133 /* ZDP except Bind */
1134 case ZBL_ZDO_NWK_ADDR_REQ: {
1135 zb_zdo_addr_rsp cb = container->cb;
1136 cb(ZB_ZDP_TIMEOUT, NULL, 0, 0, 0, NULL, container->userdata);
1139 case ZBL_ZDO_NWK_ADDR_EXT_REQ: {
1140 zb_zdo_addr_rsp cb = container->cb;
1141 cb(ZB_ZDP_TIMEOUT, NULL, 0, 0, 0, NULL, container->userdata);
1144 case ZBL_ZDO_ACTIVE_EP_REQ: {
1145 zb_zdo_active_ep_rsp cb = container->cb;
1146 cb(ZB_ZDP_TIMEOUT, 0, 0, NULL, container->userdata);
1149 case ZBL_ZDO_SIMPLE_DESC_REQ: {
1150 zb_zdo_simple_desc_rsp cb = container->cb;
1151 cb(0, 0, NULL, container->userdata);
1154 case ZBL_ZDO_MATCHED_DESCRIPTOR_REQ: {
1155 zb_zdo_match_desc_rsp cb = container->cb;
1156 cb(ZB_ZDP_TIMEOUT, 0, 0, NULL, container->userdata);
1159 case ZBL_ZDO_COMPLEX_DESC_REQ: {
1160 zb_zdo_complex_desc_rsp cb = container->cb;
1161 cb(ZB_ZDP_TIMEOUT, 0, 0, NULL, container->userdata);
1164 case ZBL_ZDO_MGMT_BIND_REQ: {
1165 zb_zdo_mgmt_bind_rsp cb = container->cb;
1166 zb_zdo_binding_table_h *records = NULL;
1168 records = calloc(1, sizeof(zb_zdo_binding_table_h));
1170 records[0] = calloc(1, sizeof(struct zb_zdo_binding_table_s));
1172 cb(ZB_ZDP_TIMEOUT, 0, 0, 0, records, container->userdata);
1178 case ZBL_ZDO_MGMT_LQI_REQ: {
1179 zb_zdo_mgmt_lqi_rsp cb = container->cb;
1180 zb_zdo_neighbor_table_desc_h *records = NULL;
1182 records = calloc(1, sizeof(zb_zdo_neighbor_table_desc_h));
1184 records[0] = calloc(1, sizeof(struct zb_zdo_neighbor_table_desc_s));
1186 cb(ZB_ZDP_TIMEOUT, 0, 0, 0, records, container->userdata);
1192 case ZBL_ZDO_MGMT_RTG_REQ: {
1193 zb_zdo_mgmt_rtg_rsp cb = container->cb;
1194 zb_zdo_routing_table_h *records = NULL;
1196 records = calloc(1, sizeof(zb_zdo_routing_table_h));
1198 records[0] = calloc(1, sizeof(struct zb_zdo_routing_table_s));
1200 cb(ZB_ZDP_TIMEOUT, 0, 0, 0, records, container->userdata);
1206 case ZBL_ZDO_MGMT_NWK_DISC_REQ: {
1207 zb_zdo_mgmt_nwk_disc_rsp cb = container->cb;
1208 zb_zdo_network_list_record_h *records = NULL;
1209 records = calloc(1, sizeof(zb_zdo_network_list_record_h));
1211 records[0] = calloc(1, sizeof(struct zb_zdo_network_list_record_s));
1213 cb(0, 0, 0, 0, records, container->userdata);
1218 case ZBL_ZDO_MGMT_PERMIT_JOIN_REQ: {
1219 zb_zdo_mgmt_permit_joining_rsp cb = container->cb;
1220 cb(ZB_ZDP_TIMEOUT, container->userdata);
1223 case ZBL_ZDO_MGMT_LEAVE_REQ: {
1224 zb_zdo_mgmt_leave_rsp cb = container->cb;
1225 cb(ZB_ZDP_TIMEOUT, container->userdata);
1228 case ZBL_ZDO_NODE_DESC_REQ: {
1229 zb_zdo_node_desc_rsp cb = container->cb;
1230 cb(ZB_ZDP_TIMEOUT, 0, NULL, container->userdata);
1233 case ZBL_ZDO_POWER_DESC_REQ: {
1234 zb_zdo_power_desc_rsp cb = container->cb;
1235 cb(0, 0, NULL, container->userdata);
1238 case ZBL_ZDO_USER_DESC_REQ: {
1239 zb_zdo_user_desc_rsp cb = container->cb;
1240 cb(ZB_ZDP_TIMEOUT, 0, 0, NULL, container->userdata);
1242 case ZBL_ZDO_USER_DESC_SET_REQ: {
1243 zb_zdo_user_desc_conf cb = container->cb;
1244 cb(ZB_ZDP_TIMEOUT, container->userdata);
1248 case ZBL_ZDO_BIND_REQ: {
1249 zb_zdo_bind_rsp cb = container->cb;
1250 cb(ZB_ZDP_TIMEOUT, container->userdata);
1253 case ZBL_ZDO_UNBIND_REQ: {
1254 zb_zdo_unbind_rsp cb = container->cb;
1255 cb(ZB_ZDP_TIMEOUT, container->userdata);
1259 case ZBL_CUSTOM_APS_SEND_REQ: {
1260 zb_aps_send_rsp cb = container->cb;
1261 cb(0, 0, 0, 0, 0, 0, NULL, container->userdata);
1263 case ZBL_CUSTOM_ZCL_SEND_REQ: {
1264 zb_zcl_send_rsp cb = container->cb;
1265 cb(0, 0, 0, 0, 0, 0, NULL, container->userdata);
1268 case ZBL_CUSTOM_LOCAL_SEND_REQ: {
1269 zb_send_to_local_rsp cb = container->cb;
1270 cb(0, NULL, container->userdata);
1274 case ZBL_ZCL_GLOBAL_READ_ATTRIBUTE_REQ: {
1275 zb_zcl_global_rsp cb = container->cb;
1276 cb(0, 0, 0, NULL, 0, container->userdata);
1279 case ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_REQ: {
1280 zb_zcl_global_rsp cb = container->cb;
1281 cb(0, 0, 0, NULL, 0, container->userdata);
1284 case ZBL_ZCL_GLOBAL_CONFIGURE_REPORTING_REQ: {
1285 zb_zcl_global_rsp cb = container->cb;
1286 cb(0, 0, 0, NULL, 0, container->userdata);
1289 case ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_REQ: {
1290 zb_zcl_global_discover_attr_rsp cb = container->cb;
1291 cb(0, 0, 0, 0, NULL, 0, container->userdata);
1294 case ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_STRUCTURED_REQ: {
1295 zb_zcl_global_rsp cb = container->cb;
1296 cb(0, 0, 0, NULL, 0, container->userdata);
1299 case ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_RECEIVED_REQ: {
1300 zb_zcl_global_discover_cmds_rsp cb = container->cb;
1301 cb(0, 0, 0, 0, NULL, 0, container->userdata);
1304 case ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_GENERATED_REQ: {
1305 zb_zcl_global_discover_cmds_rsp cb = container->cb;
1306 cb(0, 0, 0, 0, NULL, 0, container->userdata);
1309 case ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_EXTENDED_REQ: {
1310 zb_zcl_global_discover_attr_extended_rsp cb = container->cb;
1311 cb(0, 0, 0, 0, NULL, 0, container->userdata);
1314 case ZBL_ZCL_GLOBAL_READ_CONFIGURE_REPORTING_REQ: {
1315 zb_zcl_global_rsp cb = container->cb;
1316 cb(0, 0, 0, NULL, 0, container->userdata);
1320 case ZBL_ZCL_ALARM_GET_ALARM_REQ: {
1321 zb_zcl_alarm_get_alarm_rsp cb = container->cb;
1322 cb(ZB_ZCL_TIMEOUT, 0, ZB_ZCL_UNSUP_CLUSTER_COMMAND, 0, 0, 0, container->userdata);
1326 case ZBL_ZCL_DOORLOCK_LOCK_STATE: {
1327 zb_form_network_cb cb = container->cb;
1328 cb(0x0000, container->userdata);
1332 case ZBL_ZCL_FANMODE_FAN_MODE_STATE: {
1333 zb_form_network_cb cb = container->cb;
1334 cb(0x0000, container->userdata);
1338 case ZBL_ZCL_GROUP_ADD_GROUP_REQ: {
1339 zb_zcl_group_add_group_rsp cb = container->cb;
1340 cb(0, 0, 0, 0, container->userdata);
1343 case ZBL_ZCL_GROUP_VIEW_GROUP_REQ: {
1344 zb_zcl_group_view_group_rsp cb = container->cb;
1345 cb(0, 0, 0, 0, NULL, container->userdata);
1348 case ZBL_ZCL_GROUP_GET_GROUP_MEMBERSHIP_REQ: {
1349 zb_zcl_group_get_group_membership_rsp cb = container->cb;
1350 cb(0, 0, 0, 0, NULL, container->userdata);
1353 case ZBL_ZCL_GROUP_REMOVE_GROUP_REQ: {
1354 zb_zcl_group_remove_group_rsp cb = container->cb;
1355 cb(0, 0, 0, 0, container->userdata);
1359 case ZBL_ZCL_IDENTIFY_QUERY_REQ: {
1360 zb_zcl_identify_query_cb cb = container->cb;
1361 cb(0, 0, container->userdata);
1365 case ZBL_ZCL_ON_OFF_GET_ON_OFF_STATE: {
1366 zb_form_network_cb cb = container->cb;
1367 cb(0x0000, container->userdata);
1370 /* ZCL Pollcontrol */
1371 case ZBL_ZCL_POLLCONTROL_SET_POLL_INTERVAL_REQ: {
1372 zb_zcl_pollctrl_check_in cb = container->cb;
1373 cb(0, 0, container->userdata);
1377 case ZBL_ZCL_SCENE_ADD_SCENE_REQ: {
1378 zb_zcl_scene_add_scene_rsp cb = container->cb;
1379 cb(0, 0, 0, 0, 0, container->userdata);
1382 case ZBL_ZCL_SCENE_VIEW_SCENE_REQ: {
1383 zb_zcl_scene_view_scene_rsp cb = container->cb;
1384 cb(0, 0, 0, 0, 0, 0, NULL, NULL, 0, container->userdata);
1387 case ZBL_ZCL_SCENE_REMOVE_SCENE_REQ: {
1388 zb_zcl_scene_remove_scene_rsp cb = container->cb;
1389 cb(0, 0, 0, 0, 0, container->userdata);
1392 case ZBL_ZCL_SCENE_STORE_SCENE_REQ: {
1393 zb_zcl_scene_store_scene_rsp cb = container->cb;
1394 cb(0, 0, 0, 0, 0, container->userdata);
1397 case ZBL_ZCL_SCENE_REMOVE_ALL_SCENE_REQ: {
1398 zb_zcl_scene_remove_all_scene_rsp cb = container->cb;
1399 cb(0, 0, 0, 0, container->userdata);
1402 case ZBL_ZCL_SCENE_GET_SCENE_MEMBERSHIP_REQ: {
1403 zb_zcl_scene_get_scene_membership_rsp cb = container->cb;
1404 cb(0, 0, 0, 0, 0, 0, NULL, container->userdata);
1407 /* ZCL Thermostat */
1408 case ZBL_ZCL_THERMOSTAT_GET_LOCAL_TEMP: {
1409 zb_form_network_cb cb = container->cb;
1410 cb(0x0000, container->userdata);
1414 ERR("Unhandled cid = %d", container->cid);
1418 g_dbus_connection_signal_unsubscribe(gdbus_conn, container->sid);
1421 return G_SOURCE_REMOVE;
1424 static void _zbl_response_cb(GDBusConnection *connection,
1425 const gchar *sender_name, const gchar *object_path, const gchar *interface_name,
1426 const gchar *signal_name, GVariant *parameters, gpointer user_data)
1428 zbl_req_cb_s *container = user_data;
1429 RETM_IF(NULL == container, "container is null");
1430 RETM_IF(NULL == container->cb, "cb is NULL");
1432 container->found = true;
1433 g_dbus_connection_signal_unsubscribe(gdbus_conn, container->sid);
1435 switch (container->cid) {
1437 case ZBL_SERVICE_FORM_NETWORK: {
1438 zb_form_network_cb cb = container->cb;
1440 g_variant_get(parameters, "(q)", &panid);
1441 cb(panid, container->userdata);
1444 case ZBL_SERVICE_DISABLE_NETWORK: {
1445 zb_disable_network_cb cb = container->cb;
1446 unsigned char ret = ZB_ZDP_SUCCESS;
1447 g_variant_get(parameters, "(y)", &ret);
1448 cb(ret, container->userdata);
1451 /* ZDP except Bind */
1452 case ZBL_ZDO_NWK_ADDR_REQ: {
1453 zb_zdo_addr_rsp cb = container->cb;
1458 unsigned char status;
1460 unsigned char start_idx;
1461 unsigned char value;
1462 GVariantIter *mac_iter = NULL;
1464 g_variant_get(parameters, "(ya(y)qyy)", &status, &mac_iter, &addr16, &num, &start_idx);
1465 while (g_variant_iter_loop(mac_iter, "(y)", &value)) {
1470 cb(status, addr64, addr16, num, start_idx, NULL, container->userdata);
1471 if (NULL != mac_iter)
1472 g_variant_iter_free(mac_iter);
1475 case ZBL_ZDO_NWK_ADDR_EXT_REQ: {
1476 zb_zdo_addr_rsp cb = container->cb;
1481 unsigned char status;
1483 unsigned char start_idx;
1484 unsigned char value;
1485 GVariantIter *mac_iter = NULL;
1486 GVariantIter *assoc_iter = NULL;
1488 g_variant_get(parameters, "(ya(y)qyyaq)", &status, &mac_iter,
1489 &addr16, &num, &start_idx, &assoc_iter);
1490 while (g_variant_iter_loop(mac_iter, "(y)", &value)) {
1494 if (NULL != mac_iter)
1495 g_variant_iter_free(mac_iter);
1496 if (NULL != assoc_iter)
1497 g_variant_iter_free(assoc_iter);
1499 cb(status, addr64, addr16, num, start_idx, NULL, container->userdata);
1502 case ZBL_ZDO_ACTIVE_EP_REQ: {
1503 zb_zdo_active_ep_rsp cb = container->cb;
1507 unsigned char status;
1508 unsigned char count;
1509 unsigned char value;
1510 GVariantIter *ep_iter = NULL;
1511 unsigned char *ep_list;
1513 g_variant_get(parameters, "(yqa(y)y)", &status, &addr16, &ep_iter, &count);
1514 ep_list = calloc(count+1, sizeof(unsigned char));
1515 RETM_IF(NULL == ep_list, "calloc() Fail(%d)", errno);
1517 while (g_variant_iter_loop(ep_iter, "(y)", &value)) {
1521 if (NULL != ep_iter)
1522 g_variant_iter_free(ep_iter);
1524 cb(status, addr16, count, ep_list, container->userdata);
1528 case ZBL_ZDO_SIMPLE_DESC_REQ: {
1529 zb_zdo_simple_desc_rsp cb = container->cb;
1533 unsigned short addr16;
1534 unsigned short value;
1535 GVariantIter *in_iter = NULL;
1536 GVariantIter *out_iter = NULL;
1537 zb_zdo_simple_desc_h records;
1539 records = calloc(1, sizeof(struct zb_zdo_simple_desc_s));
1540 RETM_IF(NULL == records, "calloc() Fail(%d)", errno);
1542 container->found = true;
1544 g_variant_get(parameters, "(qiyyqqyyaqaq)", &addr16, &count,
1545 &records->device_ver,
1546 &records->ep, &records->profile_id, &records->device_id,
1547 &records->num_of_in_clusters, &records->num_of_out_clusters,
1548 &in_iter, &out_iter);
1550 records->in_clusters = calloc(records->num_of_in_clusters, sizeof(unsigned short));
1551 if (NULL == records->in_clusters) {
1552 ERR("calloc() Fail(%d)", errno);
1553 if (NULL != in_iter)
1554 g_variant_iter_free(in_iter);
1555 if (NULL != out_iter)
1556 g_variant_iter_free(out_iter);
1559 records->out_clusters = calloc(records->num_of_out_clusters, sizeof(unsigned short));
1560 if (NULL == records->out_clusters) {
1561 ERR("calloc() Fail(%d)", errno);
1562 free(records->in_clusters);
1563 if (NULL != in_iter)
1564 g_variant_iter_free(in_iter);
1565 if (NULL != out_iter)
1566 g_variant_iter_free(out_iter);
1570 while (g_variant_iter_loop(in_iter, "q", &value)) {
1571 records->in_clusters[j] = value;
1574 if (NULL != in_iter)
1575 g_variant_iter_free(in_iter);
1578 while (g_variant_iter_loop(out_iter, "q", &value)) {
1579 records->out_clusters[j] = value;
1582 if (NULL != out_iter)
1583 g_variant_iter_free(out_iter);
1585 DBG("addr16=0x%x, count=%d, records->ep=%d, records->device_id=0x%x",
1586 addr16, count, records->ep, records->device_id);
1587 for (j = 0; j < records->num_of_in_clusters; j++)
1588 DBG("in_clusters[%d] = 0x%x", j, records->in_clusters[j]);
1589 for (j = 0; j < records->num_of_out_clusters; j++)
1590 DBG("out_clusters[%d] = 0x%x", j, records->out_clusters[j]);
1592 cb(addr16, count, records, container->userdata);
1594 free(records->in_clusters);
1595 free(records->out_clusters);
1600 case ZBL_ZDO_MATCHED_DESCRIPTOR_REQ: {
1601 zb_zdo_match_desc_rsp cb = container->cb;
1606 unsigned char value;
1607 unsigned char status;
1608 GVariantIter *ml_iter = NULL;
1609 unsigned char *match_list = NULL;
1610 g_variant_get(parameters, "(yqya(y))", &status, &addr16, &value, &ml_iter);
1613 if (match_len > 0) {
1614 match_list = calloc(match_len+1, sizeof(unsigned char));
1615 RETM_IF(NULL == match_list, "calloc() Fail(%d)", errno);
1616 while (g_variant_iter_loop(ml_iter, "(y)", &value)) {
1617 match_list[j] = value;
1618 DBG("match_list[i]=%d", j, match_list[j]);
1621 if (NULL != ml_iter)
1622 g_variant_iter_free(ml_iter);
1625 DBG("Match count : [%d]", match_len);
1626 DBG("Match list : [%p]", match_list);
1628 cb(status, addr16, match_len, match_list, container->userdata);
1634 case ZBL_ZDO_NODE_DESC_REQ: {
1635 zb_zdo_node_desc_rsp cb = container->cb;
1638 unsigned char status;
1639 zb_zdo_node_descriptor_h desc;
1641 desc = calloc(1, sizeof(struct zb_zdo_node_descriptor_s));
1642 RETM_IF(NULL == desc, "calloc() Fail(%d)", errno);
1644 container->found = true;
1646 g_variant_get(parameters, "(yqyyyyyyqyqqqy)", &status, &addr16,
1647 &desc->logical_type, &desc->complex_desciptor_available,
1648 &desc->user_descriptor_available, &desc->aps_flags, &desc->frequency_band,
1649 &desc->mac_capability_flags, &desc->manufacturer_code, &desc->maximum_buffer_size,
1650 &desc->maximum_incoming_transfer_size, &desc->server_mask,
1651 &desc->maximum_outgoing_transfer_size, &desc->descriptor_capability_field);
1653 cb(status, addr16, desc, container->userdata);
1657 case ZBL_ZDO_POWER_DESC_REQ: {
1658 zb_zdo_power_desc_rsp cb = container->cb;
1661 unsigned char status;
1662 zb_zdo_node_power_descriptor_h desc;
1664 desc = calloc(1, sizeof(struct zb_zdo_node_power_descriptor_s));
1665 RETM_IF(NULL == desc, "calloc() Fail(%d)", errno);
1667 g_variant_get(parameters, "(yqyyyy)", &status, &addr16,
1668 &desc->current_power_mode, &desc->available_power_sources,
1669 &desc->current_power_source, &desc->current_power_source_level);
1671 cb(status, addr16, desc, container->userdata);
1675 case ZBL_ZDO_COMPLEX_DESC_REQ: {
1676 zb_zdo_complex_desc_rsp cb = container->cb;
1680 unsigned char j = 0;
1681 unsigned char value;
1682 unsigned char status;
1683 GVariantIter *comp_iter = NULL;
1684 unsigned char *complex_desc = NULL;
1686 g_variant_get(parameters, "(yqya(y))", &status, &addr16, &length, &comp_iter);
1688 complex_desc = calloc(length, sizeof(char));
1689 if (NULL == complex_desc) {
1690 if (NULL != comp_iter)
1691 g_variant_iter_free(comp_iter);
1692 ERR("calloc() Fail(%d)", errno);
1696 while (g_variant_iter_loop(comp_iter, "(y)", &value)) {
1697 complex_desc[j] = value;
1700 if (NULL != comp_iter)
1701 g_variant_iter_free(comp_iter);
1704 cb(status, addr16, length, complex_desc, container->userdata);
1708 case ZBL_ZDO_USER_DESC_REQ: {
1709 zb_zdo_user_desc_rsp cb = container->cb;
1713 unsigned char j = 0;
1714 unsigned char value;
1715 unsigned char status;
1716 GVariantIter *comp_iter = NULL;
1717 unsigned char *complex_desc = NULL;
1719 g_variant_get(parameters, "(yqya(y))", &status, &addr16, &length, &comp_iter);
1721 complex_desc = calloc(length, sizeof(char));
1722 if (NULL == complex_desc) {
1723 if (NULL != comp_iter)
1724 g_variant_iter_free(comp_iter);
1725 ERR("calloc() Fail(%d)", errno);
1728 while (g_variant_iter_loop(comp_iter, "(y)", &value)) {
1729 complex_desc[j] = value;
1732 if (NULL != comp_iter)
1733 g_variant_iter_free(comp_iter);
1736 cb(status, addr16, length, complex_desc, container->userdata);
1739 case ZBL_ZDO_USER_DESC_SET_REQ: {
1740 zb_zdo_user_desc_conf cb = container->cb;
1741 unsigned char status;
1742 g_variant_get(parameters, "(y)", &status);
1743 cb(status, container->userdata);
1746 case ZBL_ZDO_MGMT_BIND_REQ: {
1747 zb_zdo_mgmt_bind_rsp cb = container->cb;
1749 unsigned char status;
1750 unsigned char value;
1754 unsigned char binding_table_enteries;
1755 unsigned char binding_table_list_count;
1756 unsigned char start_index;
1757 unsigned short dst_addr16 = 0;
1758 unsigned char dst_ep = 0;
1760 GVariantIter *mac_iter = NULL;
1761 GVariantIter *rsp_iter = NULL;
1762 GVariantIter *destep_iter = NULL;
1763 zb_zdo_binding_table_h *records = NULL;
1765 g_variant_get(parameters, "(yyyya(ayyqyqayy))", &status,
1766 &binding_table_enteries, &start_index,
1767 &binding_table_list_count, &rsp_iter);
1769 if (binding_table_list_count > 0) {
1770 records = calloc(binding_table_list_count, sizeof(zb_zdo_binding_table_h));
1771 RETM_IF(NULL == records, "calloc() Fail(%d)", errno);
1772 for (i = 0; i < binding_table_list_count; i++) {
1773 records[i] = calloc(binding_table_list_count, sizeof(struct zb_zdo_binding_table_s));
1774 if (NULL == records[i]) {
1775 if (NULL != mac_iter)
1776 g_variant_iter_free(mac_iter);
1777 if (NULL != rsp_iter)
1778 g_variant_iter_free(rsp_iter);
1779 if (NULL != destep_iter)
1780 g_variant_iter_free(destep_iter);
1781 ERR("calloc() Fail(%d)", errno);
1782 goto MGMT_NWK_BIND_REQ_OUT;
1786 for (i = 0; i < binding_table_list_count; i++) {
1787 g_variant_iter_loop(rsp_iter, "(ayyqyqayy)", &mac_iter,
1788 &records[i]->src_ep, &records[i]->cluster_id,
1789 &records[i]->dst_addr_mode, &dst_addr16,
1790 &destep_iter, &dst_ep);
1791 for (j = 0; j < 8; j++) {
1792 g_variant_iter_loop(mac_iter, "y", &value);
1793 records[i]->src_addr64[j] = value;
1795 if (NULL != mac_iter)
1796 g_variant_iter_free(mac_iter);
1798 if (0x03 == records[i]->dst_addr_mode) {
1799 for (j = 0; j < 8; j++) {
1800 g_variant_iter_loop(destep_iter, "y", &value);
1801 records[i]->dst_addr64[j] = value;
1803 records[i]->dst_ep = dst_ep;
1804 DBG("Destination MAC Addr : %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X",
1805 records[i]->dst_addr64[7], records[i]->dst_addr64[6],
1806 records[i]->dst_addr64[5], records[i]->dst_addr64[4],
1807 records[i]->dst_addr64[3], records[i]->dst_addr64[2],
1808 records[i]->dst_addr64[1], records[i]->dst_addr64[0]);
1810 } else if (0x01 == records[i]->dst_addr_mode) {
1811 records[i]->dst_addr16 = dst_addr16;
1813 if (NULL != destep_iter)
1814 g_variant_iter_free(destep_iter);
1816 if (NULL != rsp_iter)
1817 g_variant_iter_free(rsp_iter);
1819 cb(status, binding_table_enteries, start_index, binding_table_list_count,
1820 records, container->userdata);
1822 MGMT_NWK_BIND_REQ_OUT:
1823 for (i = 0; i < binding_table_list_count; i++) {
1830 case ZBL_ZDO_MGMT_LQI_REQ: {
1831 zb_zdo_mgmt_lqi_rsp cb = container->cb;
1835 unsigned char value;
1836 unsigned char status;
1837 unsigned char start_index;
1838 unsigned char neighbor_table_enteries;
1839 unsigned char neighbor_table_list_count;
1841 GVariantIter *resp_iter = NULL;
1842 GVariantIter *mac_iter = NULL;
1843 GVariantIter *mac_iter1 = NULL;
1844 zb_zdo_neighbor_table_desc_h *records = NULL;
1846 g_variant_get(parameters, "(yyyya(ayayyqyyyyy))", &status, &neighbor_table_enteries,
1847 &start_index, &neighbor_table_list_count, &resp_iter);
1849 if (neighbor_table_list_count > 0) {
1850 records = calloc(neighbor_table_list_count, sizeof(zb_zdo_neighbor_table_desc_h));
1851 RETM_IF(NULL == records, "calloc() Fail(%d)", errno);
1852 for (i = 0; i < neighbor_table_list_count; i++) {
1853 records[i] = calloc(1, sizeof(struct zb_zdo_neighbor_table_desc_s));
1854 if (NULL == records[i]) {
1855 ERR("calloc() Fail(%d)", errno);
1856 goto MGMT_LQI_REQ_OUT;
1860 for (i = 0; i < neighbor_table_list_count; i++) {
1861 g_variant_iter_loop(resp_iter, "(ayayyqyyyyy)",
1862 &mac_iter, &mac_iter1,
1863 &records[i]->device_type, &records[i]->addr16,
1864 &records[i]->rx_on_when_idle, &records[i]->relationship,
1865 &records[i]->permit_joining, &records[i]->depth,
1867 for (j = 0; j < 8; j++) {
1868 g_variant_iter_loop(mac_iter, "y", &value);
1869 records[i]->extended_pan_id[j] = value;
1870 g_variant_iter_loop(mac_iter1, "y", &value);
1871 records[i]->addr64[j] = value;
1873 if (NULL != mac_iter)
1874 g_variant_iter_free(mac_iter);
1875 if (NULL != mac_iter1)
1876 g_variant_iter_free(mac_iter1);
1878 DBG("ext PAN ID = %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X",
1879 records[i]->extended_pan_id[0], records[i]->extended_pan_id[1],
1880 records[i]->extended_pan_id[2], records[i]->extended_pan_id[3],
1881 records[i]->extended_pan_id[4], records[i]->extended_pan_id[5],
1882 records[i]->extended_pan_id[6], records[i]->extended_pan_id[7]);
1884 DBG("IEEE address = %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X",
1885 records[i]->addr64[0], records[i]->addr64[1], records[i]->addr64[2], records[i]->addr64[3],
1886 records[i]->addr64[4], records[i]->addr64[5], records[i]->addr64[6], records[i]->addr64[7]);
1888 if (NULL != resp_iter)
1889 g_variant_iter_free(resp_iter);
1891 cb(status, neighbor_table_enteries, start_index, neighbor_table_list_count,
1892 records, container->userdata);
1895 for (i = 0; i < neighbor_table_list_count; i++) {
1902 case ZBL_ZDO_MGMT_RTG_REQ: {
1903 zb_zdo_mgmt_rtg_rsp cb = container->cb;
1906 unsigned char status;
1907 unsigned char start_index;
1908 unsigned char routing_table_enteries;
1909 unsigned char routing_table_list_count;
1911 GVariantIter *rsp_iter = NULL;
1912 zb_zdo_routing_table_h *records = NULL;
1914 g_variant_get(parameters, "(yyyya(qyyyyq))", &status, &routing_table_enteries,
1915 &start_index, &routing_table_list_count, &rsp_iter);
1917 if (routing_table_list_count > 0) {
1918 records = calloc(routing_table_list_count, sizeof(zb_zdo_routing_table_h));
1919 RETM_IF(NULL == records, "calloc() Fail(%d)", errno);
1920 for (i = 0; i < routing_table_list_count; i++) {
1921 records[i] = calloc(1, sizeof(struct zb_zdo_routing_table_s));
1922 if (NULL == records[i]) {
1923 ERR("calloc() Fail(%d)", errno);
1924 goto MGMT_NWK_RTG_REQ_OUT;
1929 for (i = 0; i < routing_table_list_count; i++) {
1930 g_variant_iter_loop(rsp_iter, "(qyyyyq)", &records[i]->dst_addr,
1931 &records[i]->status, &records[i]->memory_constrained,
1932 &records[i]->route_record_required,
1933 &records[i]->many_to_one, &records[i]->next_hop_addr);
1935 if (NULL != rsp_iter)
1936 g_variant_iter_free(rsp_iter);
1938 cb(status, routing_table_enteries, start_index, routing_table_list_count,
1939 records, container->userdata);
1941 MGMT_NWK_RTG_REQ_OUT:
1942 for (i = 0; i < routing_table_list_count; i++) {
1949 case ZBL_ZDO_MGMT_NWK_DISC_REQ: {
1950 zb_zdo_mgmt_nwk_disc_rsp cb = container->cb;
1953 unsigned char value;
1954 unsigned char status = 0;
1955 unsigned char nwk_count = 0;
1956 unsigned char start_index = 0;
1957 unsigned char nwk_list_count = 0;
1959 GVariantIter *mac_iter = NULL;
1960 GVariantIter *resp_iter = NULL;
1962 DBG("_zbl_mgmt_nwk_disc_req_cb()");
1964 g_variant_get(parameters, "(yyyya(ayyyyyyy))", &status, &nwk_count,
1965 &start_index, &nwk_list_count, &resp_iter);
1967 zb_zdo_network_list_record_h *records = NULL;
1970 if (nwk_list_count > 0) {
1971 records = calloc(nwk_list_count, sizeof(zb_zdo_network_list_record_h));
1972 RETM_IF(NULL == records, "calloc() Fail(%d)", errno);
1973 for (i = 0; i < nwk_list_count; i++) {
1974 records[i] = calloc(1, sizeof(struct zb_zdo_network_list_record_s));
1975 if (NULL == records[i]) {
1976 ERR("calloc() Fail(%d)", errno);
1977 goto MGMT_NWK_DISC_REQ_OUT;
1981 for (i = 0; i < nwk_list_count; i++) {
1982 g_variant_iter_loop(resp_iter, "(ayyyyyyy)", &mac_iter, &records[i]->logical_channel,
1983 &records[i]->stack_profile, &records[i]->zigbee_version, &records[i]->beacon_order,
1984 &records[i]->superframe_order, &records[i]->permit_joining);
1985 for (j = 0; j < 8; j++) {
1986 g_variant_iter_loop(mac_iter, "y", &value);
1987 records[i]->extended_pan_id[j] = value;
1989 if (NULL != mac_iter)
1990 g_variant_iter_free(mac_iter);
1992 if (NULL != resp_iter)
1993 g_variant_iter_free(resp_iter);
1996 cb(status, nwk_count, start_index, nwk_list_count, records, container->userdata);
1998 MGMT_NWK_DISC_REQ_OUT:
1999 for (i = 0; i < nwk_list_count; i++) {
2006 case ZBL_ZDO_MGMT_PERMIT_JOIN_REQ: {
2007 zb_zdo_mgmt_permit_joining_rsp cb = container->cb;
2008 unsigned char status;
2009 g_variant_get(parameters, "(y)", &status);
2010 cb(status, container->userdata);
2013 case ZBL_ZDO_MGMT_LEAVE_REQ: {
2014 zb_zdo_mgmt_leave_rsp cb = container->cb;
2015 unsigned char status;
2016 g_variant_get(parameters, "(y)", &status);
2017 cb(status, container->userdata);
2021 case ZBL_ZDO_BIND_REQ: {
2022 zb_zdo_bind_rsp cb = container->cb;
2023 unsigned char status;
2024 g_variant_get(parameters, "(y)", &status);
2025 cb(status, container->userdata);
2028 case ZBL_ZDO_UNBIND_REQ: {
2029 zb_zdo_unbind_rsp cb = container->cb;
2030 unsigned char status;
2031 g_variant_get(parameters, "(y)", &status);
2032 cb(status, container->userdata);
2036 case ZBL_CUSTOM_APS_SEND_REQ: {
2037 zb_aps_send_rsp cb = container->cb;
2039 unsigned short addr16;
2040 unsigned char src_ep;
2041 unsigned char dst_ep;
2042 unsigned short cluster_id;
2043 unsigned short profile_id;
2044 unsigned short payload_len = 0;
2045 unsigned char *payload = NULL;
2047 unsigned char value;
2048 GVariantIter *payload_iter = NULL;
2051 g_variant_get(parameters, "(qyyqqqa(y))", &addr16, &src_ep, &dst_ep,
2052 &cluster_id, &profile_id, &payload_len, &payload_iter);
2054 if (payload_len > 0) {
2055 payload = calloc(payload_len+1, sizeof(unsigned char));
2056 while (g_variant_iter_loop(payload_iter, "(y)", &value))
2057 payload[i++] = value;
2059 if (NULL != payload_iter)
2060 g_variant_iter_free(payload_iter);
2063 cb(addr16, src_ep, dst_ep, cluster_id, profile_id, payload_len, payload,
2064 container->userdata);
2069 case ZBL_CUSTOM_ZCL_SEND_REQ: {
2070 zb_zcl_send_rsp cb = container->cb;
2072 unsigned short addr16;
2073 unsigned char src_ep;
2074 unsigned char dst_ep;
2075 unsigned short cluster_id;
2076 unsigned short profile_id;
2077 unsigned short payload_len = 0;
2078 unsigned char *payload = NULL;
2080 unsigned char value;
2081 GVariantIter *payload_iter = NULL;
2084 g_variant_get(parameters, "(qyyqqqa(y))", &addr16, &src_ep, &dst_ep,
2085 &cluster_id, &profile_id, &payload_len, &payload_iter);
2087 if (payload_len > 0) {
2088 payload = calloc(payload_len + 1, sizeof(unsigned char));
2089 while (g_variant_iter_loop(payload_iter, "(y)", &value))
2090 payload[i++] = value;
2092 if (NULL != payload_iter)
2093 g_variant_iter_free(payload_iter);
2096 cb(addr16, src_ep, dst_ep, cluster_id, profile_id, payload_len, payload,
2097 container->userdata);
2102 case ZBL_CUSTOM_LOCAL_SEND_REQ: {
2103 zb_send_to_local_rsp cb = container->cb;
2105 unsigned char *data = NULL;
2106 unsigned short length = 0;
2107 unsigned char value;
2108 GVariantIter *payload_iter = NULL;
2111 g_variant_get(parameters, "(qa(y))", &length, &payload_iter);
2114 data = calloc(length, sizeof(unsigned char));
2115 while (g_variant_iter_loop(payload_iter, "(y)", &value))
2118 if (NULL != payload_iter)
2119 g_variant_iter_free(payload_iter);
2122 cb(length, data, container->userdata);
2128 case ZBL_ZCL_GLOBAL_READ_ATTRIBUTE_REQ: {
2129 zb_zcl_global_rsp cb = container->cb;
2133 unsigned char value;
2137 unsigned short attr_id;
2138 unsigned short cluster_id;
2139 unsigned char status;
2141 unsigned short records_len;
2142 unsigned char attr_value[128];
2144 GVariantIter *iter = NULL;
2145 read_attr_status_record_h records;
2146 zb_global_record_data_s *data;
2148 data = calloc(1, sizeof(zb_global_record_data_s));
2149 records = calloc(1, sizeof(struct read_attribute_status_record_s));
2150 if (!records || !data) {
2151 ERR("calloc() Fail(%d)", errno);
2152 goto GLOBAL_READ_ATTRIBUTE_REQ_OUT;
2155 g_variant_get(parameters, "(qya(y)qqyyqi)",
2156 &addr16, &ep, &iter, &attr_id, &cluster_id, &status, &type, &records_len, &isString);
2158 while (g_variant_iter_loop(iter, "(y)", &value)) {
2159 attr_value[j] = value;
2160 DBG("attr_value[%d] = 0x%02X", j, value);
2164 g_variant_iter_free(iter);
2166 while (g_variant_iter_loop(iter, "(y)", &value)) {
2168 records_len = value;
2169 attr_value[j] = value;
2170 DBG("attr_value[%d] = 0x%02X", j, value);
2174 g_variant_iter_free(iter);
2177 records->id = attr_id;
2178 records->status = status;
2179 records->type = type;
2180 records->value = attr_value;
2181 data->type = ZB_GLOBAL_READ_ATTR;
2182 data->record.read_attr = &records;
2183 data->records_len = records_len;
2185 cb(addr16, ep, cluster_id, data, records_len, container->userdata);
2187 GLOBAL_READ_ATTRIBUTE_REQ_OUT:
2194 case ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_REQ: {
2195 zb_zcl_global_rsp cb = container->cb;
2200 unsigned short cluster_id;
2201 unsigned short attribute_id;
2203 unsigned char value;
2205 GVariantIter *stat_iter = NULL;
2206 GVariantIter *attr_iter = NULL;
2207 write_attr_status_record_h records;
2208 zb_global_record_data_s *data;
2210 g_variant_get(parameters, "(qya(y)aqqi)",
2211 &addr16, &ep, &stat_iter, &attr_iter, &cluster_id, &records_len);
2213 records = calloc(records_len, sizeof(struct write_attribute_status_record_s));
2214 data = calloc(1, sizeof(zb_global_record_data_s));
2215 if (!records || !data) {
2216 if (NULL != stat_iter)
2217 g_variant_iter_free(stat_iter);
2218 if (NULL != attr_iter)
2219 g_variant_iter_free(attr_iter);
2220 ERR("calloc() Fail(%d)", errno);
2221 goto GLOBAL_WRITE_ATTRIBUTE_REQ_OUT;
2224 while (g_variant_iter_loop(stat_iter, "(y)", &value)) {
2225 records[i].status = value;
2228 if (NULL != stat_iter)
2229 g_variant_iter_free(stat_iter);
2232 while (g_variant_iter_loop(attr_iter, "q", &attribute_id)) {
2233 records[i].id = attribute_id;
2234 DBG("Attribute Id 0x%04X", attribute_id);
2237 if (NULL != attr_iter)
2238 g_variant_iter_free(attr_iter);
2240 data->type = ZB_GLOBAL_WRITE_ATTR;
2241 data->record.write_attr = &records;
2242 data->records_len = records_len;
2244 cb(addr16, ep, cluster_id, data, records_len, container->userdata);
2246 GLOBAL_WRITE_ATTRIBUTE_REQ_OUT:
2251 case ZBL_ZCL_GLOBAL_CONFIGURE_REPORTING_REQ: {
2252 zb_zcl_global_rsp cb = container->cb;
2255 unsigned short cluster_id;
2256 unsigned short attIdVal;
2257 unsigned char value;
2258 int j = 0, l = 0, k = 0, rec_len;
2259 GVariantIter *stat_iter = NULL;
2260 GVariantIter *attr_iter = NULL;
2261 GVariantIter *dir_iter = NULL;
2262 report_config_response_record_h records;
2263 zb_global_record_data_s *data;
2265 g_variant_get(parameters, "(a(y)aqa(y)qiqy)",
2266 &stat_iter, &attr_iter, &dir_iter, &cluster_id, &rec_len, &addr16, &ep);
2268 records = calloc(rec_len, sizeof(struct reporting_configuration_response_record_s));
2269 data = calloc(1, sizeof(zb_global_record_data_s));
2270 if (!data || !records) {
2271 if (NULL != stat_iter)
2272 g_variant_iter_free(stat_iter);
2273 if (NULL != attr_iter)
2274 g_variant_iter_free(attr_iter);
2275 if (NULL != dir_iter)
2276 g_variant_iter_free(dir_iter);
2277 ERR("calloc() Fail(%d)", errno);
2278 goto GLOBAL_CONFIGURE_REPORTING_REQ_OUT;
2281 while (g_variant_iter_loop(stat_iter, "(y)", &value)) {
2282 DBG("Value 0x%02X", value);
2283 records[j].status = value;
2286 if (NULL != stat_iter)
2287 g_variant_iter_free(stat_iter);
2289 while (g_variant_iter_loop(attr_iter, "q", &attIdVal)) {
2290 if (records[l].status != ZB_ZCL_SUCCESS)
2291 records[l].id = attIdVal;
2294 if (NULL != attr_iter)
2295 g_variant_iter_free(attr_iter);
2297 while (g_variant_iter_loop(dir_iter, "(y)", &value)) {
2298 if (records[k].status != ZB_ZCL_SUCCESS)
2299 records[k].dir = value;
2302 if (NULL != dir_iter)
2303 g_variant_iter_free(dir_iter);
2305 data->type = ZB_GLOBAL_CONFIG_REPORT;
2306 data->record.report_config_rsp = &records;
2307 data->records_len = rec_len;
2309 cb(addr16, ep, cluster_id, data, rec_len, container->userdata);
2311 GLOBAL_CONFIGURE_REPORTING_REQ_OUT:
2316 case ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_REQ: {
2317 zb_zcl_global_discover_attr_rsp cb = container->cb;
2320 discover_attr_info_record_h *records;
2323 unsigned short cluster_id;
2324 unsigned short attribute_id;
2325 unsigned char value;
2327 int discovery_complete;
2328 GVariantIter *stat_iter = NULL;
2329 GVariantIter *attr_iter = NULL;
2331 g_variant_get(parameters, "(qya(y)aqqii)", &addr16, &ep, &stat_iter,
2332 &attr_iter, &cluster_id, &records_len, &discovery_complete);
2333 records = calloc(records_len, sizeof(discover_attr_info_record_h));
2334 RETM_IF(NULL == records, "calloc() Fail(%d)", errno);
2335 for (j = 0; j < records_len; j++) {
2336 records[j] = calloc(1, sizeof(struct discover_attribute_info_record_s));
2337 if (NULL == records[j]) {
2338 ERR("calloc() Fail(%d)", errno);
2339 for (l = 0; l < j; l++)
2342 if (NULL != stat_iter)
2343 g_variant_iter_free(stat_iter);
2344 if (NULL != attr_iter)
2345 g_variant_iter_free(attr_iter);
2351 while (g_variant_iter_loop(stat_iter, "(y)", &value)) {
2352 records[j]->type = value;
2353 DBG("Attribute Type 0x%02X", value);
2356 if (NULL != stat_iter)
2357 g_variant_iter_free(stat_iter);
2359 while (g_variant_iter_loop(attr_iter, "q", &attribute_id)) {
2360 records[l]->id = attribute_id;
2361 DBG("Attribute Id 0x%04X", attribute_id);
2364 if (NULL != attr_iter)
2365 g_variant_iter_free(attr_iter);
2367 cb(addr16, ep, cluster_id, discovery_complete, records, records_len,
2368 container->userdata);
2370 for (j = 0; j < records_len; j++)
2375 case ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_STRUCTURED_REQ: {
2376 zb_zcl_global_rsp cb = container->cb;
2377 cb(0, 0, 0, NULL, 0, container->userdata);
2380 /* GLOBAL_DISCOVER_COMMAND_RECEIVED and GLOBAL_DISCOVER_COMMAND_GENERATED should be handled as same way */
2381 case ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_RECEIVED_REQ:
2382 case ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_GENERATED_REQ: {
2383 zb_zcl_global_discover_cmds_rsp cb = container->cb;
2390 unsigned short cluster_id;
2391 unsigned short cmd_len;
2392 unsigned char *cmd_data;
2393 unsigned char discoveryComplete;
2394 GVariantIter *cmd_iter = NULL;
2396 g_variant_get(parameters, "(a(y)qqqyy)", &cmd_iter, &cluster_id, &cmd_len,
2397 &addr16, &ep, &discoveryComplete);
2399 cmd_data = calloc(cmd_len+1, sizeof(char));
2400 if (NULL == cmd_data) {
2401 ERR("calloc() Fail(%d)", errno);
2402 if (NULL != cmd_iter)
2403 g_variant_iter_free(cmd_iter);
2407 while (g_variant_iter_loop(cmd_iter, "(y)", &value)) {
2408 DBG("Value 0x%02X", value);
2409 cmd_data[j] = value;
2412 if (NULL != cmd_iter)
2413 g_variant_iter_free(cmd_iter);
2415 cb(addr16, ep, cluster_id, discoveryComplete, cmd_data, cmd_len, container->userdata);
2419 case ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_EXTENDED_REQ: {
2420 zb_zcl_global_discover_attr_extended_rsp cb = container->cb;
2426 unsigned short cluster_id;
2427 unsigned char t_value;
2428 unsigned char ac_value;
2430 unsigned short rec_len;
2431 unsigned short attr_data;
2432 unsigned char discoveryComplete;
2433 GVariantIter *attr_iter = NULL;
2434 GVariantIter *type_iter = NULL;
2435 GVariantIter *ac_iter = NULL;
2436 extended_attr_info_h *records;
2438 DBG("Will get the value now");
2440 g_variant_get(parameters, "(aqa(y)a(y)qqqyy)", &attr_iter, &type_iter, &ac_iter,
2441 &cluster_id, &rec_len, &addr16, &ep, &discoveryComplete);
2443 DBG("records length 0x%04X", rec_len);
2445 records = calloc(rec_len, sizeof(extended_attr_info_h));
2446 RETM_IF(NULL == records, "calloc() Fail(%d)", errno);
2447 for (j = 0; j < rec_len; j++) {
2448 records[j] = calloc(1, sizeof(struct extended_attribute_infomation_s));
2449 if (NULL == records[j]) {
2450 for (i = 0; i < j; i++)
2453 if (NULL != attr_iter)
2454 g_variant_iter_free(attr_iter);
2455 if (NULL != type_iter)
2456 g_variant_iter_free(type_iter);
2457 if (NULL != ac_iter)
2458 g_variant_iter_free(ac_iter);
2460 ERR("calloc() Fail(%d)", errno);
2466 while (g_variant_iter_loop(attr_iter, "q", &attr_data)
2467 && g_variant_iter_loop(type_iter, "(y)", &t_value)
2468 && g_variant_iter_loop(ac_iter, "(y)", &ac_value)) {
2469 DBG("attrData 0x%04X", attr_data);
2470 DBG("t_value 0x%02X", t_value);
2471 DBG("ac_value 0x%02X", ac_value);
2472 records[j]->id = attr_data;
2473 records[j]->type = t_value;
2474 records[j]->acl = ac_value;
2477 if (NULL != attr_iter)
2478 g_variant_iter_free(attr_iter);
2479 if (NULL != type_iter)
2480 g_variant_iter_free(type_iter);
2481 if (NULL != ac_iter)
2482 g_variant_iter_free(ac_iter);
2484 cb(addr16, ep, cluster_id, discoveryComplete, records, rec_len, container->userdata);
2486 for (j = 0; j < rec_len; j++)
2491 case ZBL_ZCL_GLOBAL_READ_CONFIGURE_REPORTING_REQ: {
2492 zb_zcl_global_rsp cb = container->cb;
2495 unsigned short cluster_id;
2500 unsigned char *status = NULL;
2501 unsigned char *data_size = NULL;
2502 unsigned char *change = NULL;
2503 unsigned short record_length;
2504 GVariantIter *resp_iter = NULL;
2505 GVariantIter *data_iter = NULL;
2507 report_config_record_h *records = NULL;
2508 zb_global_record_data_s *data = NULL;
2510 g_variant_get(parameters, "(qyqqa(yyqyqqayq))",
2511 &addr16, &ep, &cluster_id, &record_length, &resp_iter);
2513 records = calloc(record_length, sizeof(report_config_record_h));
2514 for (i = 0; i < record_length; i++) {
2515 records[i] = calloc(1, sizeof(struct reporting_configuration_record_s));
2516 if (NULL == records[i]) {
2517 ERR("calloc() Fail(%d)", errno);
2518 goto GLOBAL_READ_CONFIGURE_REPORTING_REQ_OUT;
2521 data = calloc(1, sizeof(zb_global_record_data_s));
2522 if (!data || !records) {
2523 ERR("calloc() Fail(%d)", errno);
2524 goto GLOBAL_READ_CONFIGURE_REPORTING_REQ_OUT;
2527 DBG("record_length %d", record_length);
2528 status = calloc(record_length, sizeof(unsigned char));
2529 data_size = calloc(record_length, sizeof(unsigned char));
2530 if (!status || !data_size) {
2531 ERR("Couldn't allocate the memory (%s)", errno);
2532 goto GLOBAL_READ_CONFIGURE_REPORTING_REQ_OUT;
2535 for (i = 0; i < record_length; i++) {
2536 g_variant_iter_loop(resp_iter, "(yyqyqqayq)", &status[i], &records[i]->dir,
2537 &records[i]->id, &records[i]->type, &records[i]->max_i, &records[i]->min_i,
2538 &data_iter, &records[i]->to);
2539 if (records[i]->dir != ZCL_REPORTING_DIRECTION_REPORTED &&
2540 (zb_get_analog_or_discret(records[i]->type) == DATA_TYPE_ANALOG)) {
2541 data_size[i] = zb_get_data_size(records[j]->type);
2543 if (data_size[i] != 0xff) {
2544 change = calloc(data_size[i]+1, sizeof(unsigned char));
2546 ERR("calloc() Fail(%d)", errno);
2547 records[i]->change = NULL;
2548 if (NULL != data_iter)
2549 g_variant_iter_free(data_iter);
2552 while (g_variant_iter_loop(data_iter, "y", &value)) {
2556 if (NULL != data_iter)
2557 g_variant_iter_free(data_iter);
2558 records[i]->change = change;
2560 records[i]->change = NULL;
2562 records[i]->change = NULL;
2564 if (NULL != resp_iter)
2565 g_variant_iter_free(resp_iter);
2567 data->type = ZB_GLOBAL_READ_REPORT_CONFIG;
2568 data->record.report_config = records;
2569 data->records_len = record_length;
2571 cb(addr16, ep, cluster_id, data, record_length, container->userdata);
2573 GLOBAL_READ_CONFIGURE_REPORTING_REQ_OUT:
2576 for (i = 0; i < record_length; i++)
2583 case ZBL_ZCL_ALARM_GET_ALARM_REQ: {
2584 zb_zcl_alarm_get_alarm_rsp cb = container->cb;
2586 nwk_addr addr16 = 0;
2587 unsigned char ep = 0;
2588 unsigned char status = 0;
2589 unsigned char alarm_code = 0;
2590 unsigned short cluster_id = 0;
2591 unsigned int time_stamp = 0;
2593 g_variant_get(parameters, "(qyyyqu)", &addr16, &ep, &status, &alarm_code,
2594 &cluster_id, &time_stamp);
2595 cb(addr16, ep, status, alarm_code, cluster_id, time_stamp, container->userdata);
2599 case ZBL_ZCL_DOORLOCK_LOCK_STATE: {
2600 ERR("Unhandled cid = %d", container->cid);
2604 case ZBL_ZCL_FANMODE_FAN_MODE_STATE: {
2605 ERR("Unhandled cid = %d", container->cid);
2609 case ZBL_ZCL_GROUP_ADD_GROUP_REQ: {
2610 zb_zcl_group_add_group_rsp cb = container->cb;
2614 unsigned char status;
2615 unsigned short group_id;
2617 g_variant_get(parameters, "(qyyq)", &addr16, &ep, &status, &group_id);
2618 cb(addr16, ep, status, group_id, container->userdata);
2621 case ZBL_ZCL_GROUP_VIEW_GROUP_REQ: {
2622 zb_zcl_group_view_group_rsp cb = container->cb;
2627 unsigned char value;
2628 unsigned char status;
2629 unsigned short group_id;
2630 char *group_name = NULL;
2631 GVariantIter *grpNameiter = NULL;
2633 g_variant_get(parameters, "(qyyqay)", &addr16, &ep, &status, &group_id, &grpNameiter);
2634 g_variant_iter_loop(grpNameiter, "y", &value);
2635 /* first byte indicates the length of the string */
2636 if ((value - '0') > 0) {
2637 DBG("Value %d ", (value - '0'));
2638 group_name = calloc((value - '0') + 1, sizeof(char));
2639 if (NULL == group_name) {
2640 if (NULL != grpNameiter)
2641 g_variant_iter_free(grpNameiter);
2642 ERR("calloc() Fail(%d)", errno);
2643 goto GROUP_VIEW_GROUP_REQ_OUT;
2645 group_name[j] = value;
2647 while (g_variant_iter_loop(grpNameiter, "y", &value) && (j <= (value - '0'))) {
2648 group_name[j] = value;
2649 DBG("Name %c", group_name[j]);
2652 if (NULL != grpNameiter)
2653 g_variant_iter_free(grpNameiter);
2655 group_name = calloc(1, sizeof(char));
2656 if (NULL == group_name) {
2657 if (NULL != grpNameiter)
2658 g_variant_iter_free(grpNameiter);
2659 ERR("calloc() Fail(%d)", errno);
2660 goto GROUP_VIEW_GROUP_REQ_OUT;
2662 group_name[j] = value;
2664 group_name[j] = '\0';
2668 DBG("GroupName = %s", group_name);
2669 cb(addr16, ep, status, group_id, group_name, container->userdata);
2670 GROUP_VIEW_GROUP_REQ_OUT:
2674 case ZBL_ZCL_GROUP_GET_GROUP_MEMBERSHIP_REQ: {
2675 zb_zcl_group_get_group_membership_rsp cb = container->cb;
2680 unsigned short gl_value;
2681 unsigned char capacity;
2682 unsigned char group_count;
2683 unsigned short *grouplist = NULL;
2684 GVariantIter *grpListiter = NULL;
2686 g_variant_get(parameters, "(qyyyaq)", &addr16, &ep, &capacity, &group_count, &grpListiter);
2688 if (group_count > 0) {
2689 grouplist = calloc(group_count+1, sizeof(unsigned short));
2690 if (NULL == grouplist) {
2691 if (NULL != grpListiter)
2692 g_variant_iter_free(grpListiter);
2693 ERR("calloc() Fail(%d)", errno);
2696 RETM_IF(NULL == grouplist, "calloc() Fail(%d)", errno);
2698 while (g_variant_iter_loop(grpListiter, "q", &gl_value)) {
2699 grouplist[j] = gl_value;
2702 if (NULL != grpListiter)
2703 g_variant_iter_free(grpListiter);
2706 cb(addr16, ep, capacity, group_count, grouplist, container->userdata);
2711 case ZBL_ZCL_GROUP_REMOVE_GROUP_REQ: {
2712 zb_zcl_group_remove_group_rsp cb = container->cb;
2716 unsigned char status;
2717 unsigned short group_id;
2719 g_variant_get(parameters, "(qyyq)", &addr16, &ep, &status, &group_id);
2721 cb(addr16, ep, status, group_id, container->userdata);
2725 case ZBL_ZCL_IDENTIFY_QUERY_REQ: {
2726 zb_zcl_identify_query_cb cb = container->cb;
2728 nwk_addr addr16 = 0;
2729 unsigned short identify_time = 0;
2730 g_variant_get(parameters, "(qq)", &addr16, &identify_time);
2732 cb(addr16, identify_time, container->userdata);
2736 case ZBL_ZCL_ON_OFF_GET_ON_OFF_STATE: {
2737 ERR("Unhandled cid = %d", container->cid);
2740 /* ZCL Pollcontrol */
2741 case ZBL_ZCL_POLLCONTROL_SET_POLL_INTERVAL_REQ: {
2742 zb_zcl_pollctrl_check_in cb = container->cb;
2744 nwk_addr addr16 = 0;
2745 unsigned char ep = 0;
2747 g_variant_get(parameters, "(qy)", &addr16, &ep);
2748 cb(addr16, ep, container->userdata);
2752 case ZBL_ZCL_SCENE_ADD_SCENE_REQ: {
2753 zb_zcl_scene_add_scene_rsp cb = container->cb;
2755 nwk_addr addr16 = 0;
2757 unsigned char status;
2758 unsigned short group_id;
2759 unsigned char scene_id;
2761 g_variant_get(parameters, "(qyyqy)", &addr16, &ep, &status, &group_id, &scene_id);
2762 cb(addr16, ep, status, group_id, scene_id, container->userdata);
2765 case ZBL_ZCL_SCENE_VIEW_SCENE_REQ: {
2766 zb_zcl_scene_view_scene_rsp cb = container->cb;
2770 nwk_addr addr16 = 0;
2772 unsigned char status;
2773 unsigned short group_id;
2774 unsigned char scene_id;
2775 unsigned short transition_time = 0;
2776 unsigned char value;
2777 unsigned short ext_len = 0;
2778 char *scene_name = NULL;
2779 char *extendedFieldSets = NULL;
2780 GVariantIter *sceneNameIter = NULL;
2781 GVariantIter *extendedSetIter = NULL;
2783 g_variant_get(parameters, "(qyyqyqa(y)ya(y))", &addr16, &ep, &status, &group_id, &scene_id,
2784 &transition_time, &sceneNameIter, &ext_len, &extendedSetIter);
2786 g_variant_iter_loop(sceneNameIter, "(y)", &value);
2788 /** first byte indicates the length of the string */
2791 scene_name = calloc(len + 1, sizeof(char));
2792 if (NULL == scene_name) {
2793 ERR("calloc() Fail(%d)", errno);
2794 goto SCENE_VIEW_SCENE_REQ_OUT;
2796 scene_name[j] = value;
2798 while (g_variant_iter_loop(sceneNameIter, "(y)", &value)) {
2799 scene_name[j] = value;
2803 scene_name = calloc(1 + 1, sizeof(char));
2804 if (NULL == scene_name) {
2805 ERR("calloc() Fail(%d)", errno);
2806 goto SCENE_VIEW_SCENE_REQ_OUT;
2808 scene_name[j] = value;
2813 extendedFieldSets = calloc(ext_len + 1, sizeof(char));
2814 if (NULL == extendedFieldSets) {
2815 ERR("calloc() Fail(%d)", errno);
2816 goto SCENE_VIEW_SCENE_REQ_OUT;
2818 while (g_variant_iter_loop(extendedSetIter, "(y)", &value)) {
2819 extendedFieldSets[j] = value;
2824 cb(addr16, ep, status, group_id, scene_id, transition_time, scene_name,
2825 extendedFieldSets, ext_len, container->userdata);
2827 SCENE_VIEW_SCENE_REQ_OUT:
2829 free(extendedFieldSets);
2832 case ZBL_ZCL_SCENE_REMOVE_SCENE_REQ: {
2833 zb_zcl_scene_remove_scene_rsp cb = container->cb;
2835 nwk_addr addr16 = 0;
2837 unsigned char status;
2838 unsigned short group_id;
2839 unsigned char scene_id;
2841 g_variant_get(parameters, "(qyyqy)", &addr16, &ep, &status, &group_id, &scene_id);
2842 cb(addr16, ep, status, group_id, scene_id, container->userdata);
2845 case ZBL_ZCL_SCENE_STORE_SCENE_REQ: {
2846 zb_zcl_scene_store_scene_rsp cb = container->cb;
2848 nwk_addr addr16 = 0;
2850 unsigned char status;
2851 unsigned short group_id;
2852 unsigned char scene_id;
2854 g_variant_get(parameters, "(qyyqy)", &addr16, &ep, &status, &group_id, &scene_id);
2855 cb(addr16, ep, status, group_id, scene_id, container->userdata);
2858 case ZBL_ZCL_SCENE_REMOVE_ALL_SCENE_REQ: {
2859 zb_zcl_scene_remove_all_scene_rsp cb = container->cb;
2861 nwk_addr addr16 = 0;
2863 unsigned char status;
2864 unsigned short group_id;
2866 g_variant_get(parameters, "(qyyq)", &addr16, &ep, &status, &group_id);
2867 cb(addr16, ep, status, group_id, container->userdata);
2870 case ZBL_ZCL_SCENE_GET_SCENE_MEMBERSHIP_REQ: {
2871 zb_zcl_scene_get_scene_membership_rsp cb = container->cb;
2874 nwk_addr addr16 = 0;
2876 unsigned char status;
2877 unsigned short group_id;
2878 unsigned char capacity;
2879 unsigned char value;
2880 unsigned char scene_count = 0;
2881 unsigned char *scene_list = NULL;
2882 GVariantIter *sceneListIter = NULL;
2884 g_variant_get(parameters, "(qyyyqya(y))", &addr16, &ep, &status, &capacity, &group_id,
2885 &scene_count, &sceneListIter);
2887 if (0 < scene_count) {
2888 scene_list = calloc(scene_count+1, sizeof(char));
2889 if (NULL == scene_list) {
2890 ERR("calloc() Fail(%d)", errno);
2891 goto SCENE_GET_SCENE_MEMBERSHIP_REQ_OUT;
2893 while (g_variant_iter_loop(sceneListIter, "(y)", &value)) {
2894 scene_list[j] = value;
2895 DBG("Scene_List 0x%02X", scene_list[j]);
2900 cb(addr16, ep, status, capacity, group_id, scene_count, scene_list, container->userdata);
2901 SCENE_GET_SCENE_MEMBERSHIP_REQ_OUT:
2905 /* ZCL Thermostat */
2906 case ZBL_ZCL_THERMOSTAT_GET_LOCAL_TEMP: {
2907 ERR("Unhandled cid = %d", container->cid);
2911 ERR("Unhandled cid = %d", container->cid);
2915 int zbl_set_event_cb(zigbee_h handle, zb_event_cb event_handler)
2917 RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
2918 handle->event_handler = event_handler;
2919 return ZIGBEE_ERROR_NONE;
2922 static gboolean _zbl_timeout_enable(gpointer p)
2924 zbl_req_cb_s *container = NULL;
2925 zb_enable_cb cb = NULL;
2927 DBG("zb_enable_cb()");
2929 RETVM_IF(NULL == gdbus_conn, G_SOURCE_REMOVE, "gdbus_conn is NULL");
2931 RETVM_IF(NULL == container, G_SOURCE_REMOVE, "cb_container is NULL");
2934 if (false == container->found && container->cb)
2935 cb(ZB_ZDP_NOT_SUPPORTED, container->userdata);
2939 g_dbus_connection_signal_unsubscribe(gdbus_conn, container->sid);
2940 DBG("container->sid=%d unsubscribed");
2943 return G_SOURCE_REMOVE;
2946 static void _zbl_enable_cb(GDBusConnection *connection,
2947 const gchar *sender_name, const gchar *object_path, const gchar *interface_name,
2948 const gchar *signal_name, GVariant *parameters, gpointer user_data)
2950 zbl_req_cb_s *container = user_data;
2951 zb_enable_cb cb = container->cb;
2953 unsigned char ret = ZB_ZDP_SUCCESS;
2954 gboolean value = TRUE;
2956 container->found = true;
2958 DBG("_zbl_enable_cb");
2960 g_variant_get(parameters, "(b)", &value);
2962 ret = ZB_ZDP_UNKNOWN;
2965 cb(ret, container->userdata);
2968 g_dbus_connection_signal_unsubscribe(gdbus_conn, container->sid);
2972 int zbl_enable(zigbee_h handle, zb_enable_cb cb, void *user_data)
2975 zbl_req_cb_s *container;
2977 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
2978 RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
2979 RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
2981 DBG("zbl_enable()");
2983 container = calloc(1, sizeof(zbl_req_cb_s));
2984 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
2986 to = zbl_dbus_get_timeout(manager_gproxy);
2987 sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
2988 ZIGBEE_MANAGER_INTERFACE, "zigbee_state", ZIGBEE_DBUS_OBJPATH,
2989 NULL, G_DBUS_SIGNAL_FLAGS_NONE,
2990 _zbl_enable_cb, container, _zbl_request_cleanup);
2993 ERR("g_dbus_connection_signal_subscribe() Fail");
2995 return ZIGBEE_ERROR_IO_ERROR;
2999 container->sid = sub_id;
3000 container->tid = g_timeout_add_seconds(to, _zbl_timeout_enable, container);
3001 container->userdata = user_data;
3003 g_dbus_proxy_call(manager_gproxy, "enable", NULL,
3004 G_DBUS_CALL_FLAGS_NONE, to,
3005 NULL, NULL, container);
3007 return ZIGBEE_ERROR_NONE;
3010 int zbl_disable(void)
3012 GVariant *variant = NULL;
3013 GError *dbus_err = NULL;
3014 int result = ZIGBEE_ERROR_NONE;
3016 DBG("zbl_disable()");
3018 if (0 >= zbl_ref_count) {
3019 WARN("dbus does not initiaized\n");
3020 return ZIGBEE_ERROR_NO_DATA;
3023 if (0 > --zbl_ref_count) {
3024 DBG("all connections closed\n");
3025 return ZIGBEE_ERROR_NONE;
3029 variant = g_dbus_connection_call_sync(gdbus_conn,
3031 ZIGBEE_DBUS_OBJPATH,
3032 ZIGBEE_DBUS_INTERFACE,
3035 G_DBUS_CALL_FLAGS_NONE,
3041 ERR("Failed to get 'disable' [%s]", dbus_err->message);
3042 g_error_free(dbus_err);
3045 g_variant_get(variant, "(i)", &result);
3046 DBG("ret = [0x%x]", result);
3047 g_variant_unref(variant);
3049 g_object_unref(manager_gproxy);
3050 manager_gproxy = NULL;
3051 g_object_unref(service_gproxy);
3052 service_gproxy = NULL;
3053 g_object_unref(on_off_gproxy);
3054 on_off_gproxy = NULL;
3055 g_object_unref(door_lock_gproxy);
3056 door_lock_gproxy = NULL;
3057 g_object_unref(level_control_gproxy);
3058 level_control_gproxy = NULL;
3059 g_object_unref(thermostat_gproxy);
3060 thermostat_gproxy = NULL;
3061 g_object_unref(alarm_gproxy);
3062 alarm_gproxy = NULL;
3063 g_object_unref(fan_control_gproxy);
3064 fan_control_gproxy = NULL;
3066 g_object_unref(mfglib_gproxy);
3067 mfglib_gproxy = NULL;
3068 g_object_unref(zcl_global_proxy);
3069 zcl_global_proxy = NULL;
3070 g_object_unref(zcl_color_control_proxy);
3071 zcl_color_control_proxy = NULL;
3072 g_object_unref(custom_gproxy);
3073 custom_gproxy = NULL;
3075 g_object_unref(gdbus_conn);
3079 return ZIGBEE_ERROR_NONE;
3082 int zbl_hw_reset(void)
3084 int result = ZIGBEE_ERROR_NONE;
3085 GVariant *variant = NULL;
3086 GError *dbus_err = NULL;
3088 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
3089 RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
3091 variant = g_dbus_proxy_call_sync(service_gproxy, "zb_hw_reset", NULL,
3092 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
3095 ERR("Failed to get 'zb_hw_reset' [%s]", dbus_err->message);
3096 g_error_free(dbus_err);
3097 return ZIGBEE_ERROR_IO_ERROR;
3100 g_variant_get(variant, "(i)", &result);
3101 DBG("ret = [0x%x]", result);
3102 g_variant_unref(variant);
3107 int zbl_get_network_info(ieee_addr addr64, nwk_addr *nodeid, nwk_addr *panid,
3108 unsigned char *channel, unsigned char *tx_power)
3110 GVariant *variant = NULL;
3111 GVariantIter *iter = NULL;
3112 GError *dbus_err = NULL;
3113 int result = ZIGBEE_ERROR_NONE;
3117 unsigned char _radio_channel;
3118 unsigned char _radio_tx_power;
3119 unsigned char value;
3122 DBG("zbl_get_network_info()");
3123 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
3124 RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
3126 variant = g_dbus_proxy_call_sync(service_gproxy, "get_network_info",
3127 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
3130 ERR("Failed to 'get_network_info' [%s]", dbus_err->message);
3131 g_error_free(dbus_err);
3132 return ZIGBEE_ERROR_IO_ERROR;
3135 g_variant_get(variant, "(ia(y)qqyy)", &result, &iter,
3136 &_nodeid, &_panid, &_radio_channel, &_radio_tx_power);
3140 while (g_variant_iter_loop(iter, "(y)", &value)) {
3145 DBG(" Result: [%X]", result);
3146 DBG(" EUI(%d) : %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", i,
3147 addr64[0], addr64[1], addr64[2], addr64[3],
3148 addr64[4], addr64[5], addr64[6], addr64[7]);
3149 DBG(" nodeID [0x%04X]", _nodeid);
3150 DBG(" PanID [0x%04X]", _panid);
3151 DBG(" Channel [%d] Tx Power [%d]", _radio_channel, _radio_tx_power);
3158 *channel = _radio_channel;
3160 *tx_power = _radio_tx_power;
3163 g_variant_iter_free(iter);
3164 g_variant_unref(variant);
3169 int zbl_get_controller_mac_address(ieee_addr addr64)
3171 GVariant *variant = NULL;
3172 GVariantIter *iter = NULL;
3173 GError *dbus_err = NULL;
3177 int result = ZIGBEE_ERROR_NONE;
3179 DBG("zbl_get_controller_mac_address()");
3180 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
3181 RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
3183 variant = g_dbus_proxy_call_sync(service_gproxy, "get_mac",
3184 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
3187 ERR("Failed to get_mac [%s]", dbus_err->message);
3188 g_error_free(dbus_err);
3189 return ZIGBEE_ERROR_IO_ERROR;
3191 g_variant_get(variant, "(ia(y))", &result, &iter);
3193 while (g_variant_iter_loop(iter, "(y)", &value)) {
3198 DBG("IEEE ADDR 0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X, Ret=%d ",
3199 addr64[0], addr64[1], addr64[2], addr64[3], addr64[4], addr64[5],
3200 addr64[6], addr64[7], result);
3203 g_variant_iter_free(iter);
3204 g_variant_unref(variant);
3209 int zbl_get_cluster_list(ieee_addr eui64, unsigned char endpoint,
3210 unsigned char *in_cluster_count, unsigned short in_cluster_list[],
3211 unsigned char *out_cluster_count, unsigned short out_cluster_list[])
3213 GVariant *variant = NULL;
3214 GVariantBuilder *mac_builder = NULL;
3215 GVariant *mac_variant = NULL;
3216 GVariantIter *in_cluster_iter = NULL;
3217 GVariantIter *out_cluster_iter = NULL;
3218 GError *dbus_err = NULL;
3219 unsigned short cluster = 0;
3223 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
3224 RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
3226 mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
3227 g_variant_builder_add(mac_builder, "(y)", eui64[7]);
3228 g_variant_builder_add(mac_builder, "(y)", eui64[6]);
3229 g_variant_builder_add(mac_builder, "(y)", eui64[5]);
3230 g_variant_builder_add(mac_builder, "(y)", eui64[4]);
3231 g_variant_builder_add(mac_builder, "(y)", eui64[3]);
3232 g_variant_builder_add(mac_builder, "(y)", eui64[2]);
3233 g_variant_builder_add(mac_builder, "(y)", eui64[1]);
3234 g_variant_builder_add(mac_builder, "(y)", eui64[0]);
3235 mac_variant = g_variant_builder_end(mac_builder);
3236 g_variant_builder_unref(mac_builder);
3238 variant = g_dbus_proxy_call_sync(service_gproxy, "get_cluster_list",
3239 g_variant_new("(@a(y)y)", mac_variant, endpoint), G_DBUS_CALL_FLAGS_NONE,
3240 -1, NULL, &dbus_err);
3243 g_variant_get(variant, "(iaqaq)", &result, &in_cluster_iter, &out_cluster_iter);
3244 DBG("ret = [0x%x]", result);
3247 while (g_variant_iter_loop(in_cluster_iter, "q", &cluster)) {
3248 DBG("In Cluster 0x%04X", cluster);
3249 in_cluster_list[i++] = cluster;
3251 *in_cluster_count = i;
3253 ERR("No In Clusters for Endpoint %0X", endpoint);
3257 while (g_variant_iter_loop(out_cluster_iter, "q", &cluster)) {
3258 DBG("Out Cluster 0x%04X", cluster);
3259 out_cluster_list[i++] = cluster;
3261 *out_cluster_count = i;
3263 ERR("No Out Clusters for Endpoint %0X", endpoint);
3265 if (NULL != in_cluster_iter)
3266 g_variant_iter_free(in_cluster_iter);
3267 if (NULL != out_cluster_iter)
3268 g_variant_iter_free(out_cluster_iter);
3269 g_variant_unref(variant);
3271 ERR("No In/Out Clusters for Endpoint %0X [%s]", endpoint, dbus_err->message);
3272 g_error_free(dbus_err);
3273 *in_cluster_count = 0;
3274 *out_cluster_count = 0;
3277 return ZIGBEE_ERROR_NONE;
3280 int zbl_get_endpoint_list(ieee_addr eui64, unsigned char *count, unsigned char list[])
3282 GVariant *variant = NULL;
3283 GVariantBuilder *mac_builder = NULL;
3284 GVariant *mac_variant = NULL;
3285 GVariantIter *iter = NULL;
3286 GError *dbus_err = NULL;
3287 unsigned char endpoint;
3289 int result = ZIGBEE_ERROR_NONE;
3291 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
3292 RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
3294 mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
3295 g_variant_builder_add(mac_builder, "(y)", eui64[7]);
3296 g_variant_builder_add(mac_builder, "(y)", eui64[6]);
3297 g_variant_builder_add(mac_builder, "(y)", eui64[5]);
3298 g_variant_builder_add(mac_builder, "(y)", eui64[4]);
3299 g_variant_builder_add(mac_builder, "(y)", eui64[3]);
3300 g_variant_builder_add(mac_builder, "(y)", eui64[2]);
3301 g_variant_builder_add(mac_builder, "(y)", eui64[1]);
3302 g_variant_builder_add(mac_builder, "(y)", eui64[0]);
3303 mac_variant = g_variant_builder_end(mac_builder);
3304 g_variant_builder_unref(mac_builder);
3306 variant = g_dbus_proxy_call_sync(service_gproxy, "get_endpoint_list",
3307 g_variant_new("(@a(y))", mac_variant),
3308 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
3311 g_variant_get(variant, "(ia(y))", &result, &iter);
3312 DBG("ret = [0x%x]", result);
3314 while (g_variant_iter_loop(iter, "(y)", &endpoint)) {
3315 DBG("Endpoint 0x%X", endpoint);
3316 list[i++] = endpoint;
3320 DBG("Endpoint Count %d", i);
3322 ERR("No Endpoints");
3326 g_variant_iter_free(iter);
3327 g_variant_unref(variant);
3330 ERR("NULL Variant");
3331 ERR("No Endpoints");
3332 ERR("[%s]", dbus_err->message);
3333 g_error_free(dbus_err);
3337 return ZIGBEE_ERROR_NONE;
3340 int zbl_api_get_node_type(ieee_addr eui64, unsigned char *node_type)
3342 GVariant *variant = NULL;
3343 GVariantBuilder *mac_builder = NULL;
3344 int result = ZIGBEE_ERROR_NONE;
3345 GVariant *mac_variant = NULL;
3346 GError *dbus_err = NULL;
3348 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
3349 RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
3351 mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
3352 g_variant_builder_add(mac_builder, "(y)", eui64[7]);
3353 g_variant_builder_add(mac_builder, "(y)", eui64[6]);
3354 g_variant_builder_add(mac_builder, "(y)", eui64[5]);
3355 g_variant_builder_add(mac_builder, "(y)", eui64[4]);
3356 g_variant_builder_add(mac_builder, "(y)", eui64[3]);
3357 g_variant_builder_add(mac_builder, "(y)", eui64[2]);
3358 g_variant_builder_add(mac_builder, "(y)", eui64[1]);
3359 g_variant_builder_add(mac_builder, "(y)", eui64[0]);
3360 mac_variant = g_variant_builder_end(mac_builder);
3361 g_variant_builder_unref(mac_builder);
3363 variant = g_dbus_proxy_call_sync(service_gproxy, "get_node_type",
3364 g_variant_new("(@a(y))", mac_variant),
3365 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
3368 ERR("Failed to get 'get_node_type' [%s]", dbus_err->message);
3369 g_error_free(dbus_err);
3370 return ZIGBEE_ERROR_IO_ERROR;
3373 g_variant_get(variant, "(i)", &result);
3374 DBG("ret = [0x%x]", result);
3375 g_variant_unref(variant);
3380 int zbl_get_all_device_info(zb_end_device_info_h **dev_list, unsigned char* num)
3385 struct zb_end_device_info_s **list;
3386 GVariant *variant = NULL;
3387 GVariantIter *iter = NULL;
3388 GVariantIter *mac_iter = NULL;
3389 GVariantIter *endpoint_iter = NULL;
3390 GError *dbus_err = NULL;
3392 unsigned short node_id;
3393 unsigned char node_type;
3394 unsigned char node_mac_address[8] = {0x00};
3395 unsigned char endpoint_cnt = 0;
3396 unsigned char value;
3397 unsigned char value_endpoint;
3399 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
3400 RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
3402 /* check the format string when there are no input args */
3403 variant = g_dbus_proxy_call_sync(service_gproxy, "get_device_info",
3404 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
3407 g_variant_get(variant, "(ia(qyayyay))", &result, &iter);
3408 DBG("ret = [0x%x]", result);
3410 list = calloc(MAX_DEVICE_LIST+1, sizeof(zb_end_device_info_h));
3411 RETV_IF(NULL == list, ZIGBEE_ERROR_OUT_OF_MEMORY);
3412 for (i = 0; i < MAX_DEVICE_LIST && list; i++) {
3413 list[i] = calloc(1, sizeof(struct zb_end_device_info_s));
3414 if (NULL == list[i]) {
3415 for (j = 0; j < i; j++)
3418 g_variant_unref(variant);
3419 return ZIGBEE_ERROR_OUT_OF_MEMORY;
3424 while (g_variant_iter_loop(iter, "(qyayyay)", &node_id, &node_type, &mac_iter,
3425 &endpoint_cnt, &endpoint_iter)) {
3428 /* Get Network Address */
3429 list[i]->addr16 = node_id;
3430 DBG("Node ID: 0x%04X", node_id);
3432 list[i]->node_type = node_type;
3433 DBG("Node Type : 0x%02X", node_type);
3434 /* Get End-Point count */
3435 list[i]->num_of_ep = endpoint_cnt;
3436 DBG("Endpoint Count: 0x%X", endpoint_cnt);
3437 /* Get End-Point list */
3438 list[i]->num_of_ep = endpoint_cnt;
3439 while (g_variant_iter_loop(endpoint_iter, "y", &value_endpoint)) {
3440 list[i]->ep[k] = value_endpoint;
3441 DBG("Endpoint : %d", value_endpoint);
3444 /* Get IEEE address */
3445 while (g_variant_iter_loop(mac_iter, "y", &value)) {
3446 node_mac_address[j] = value;
3449 memcpy(list[i]->addr64, node_mac_address, sizeof(ieee_addr));
3450 DBG("Node MAC Addr : %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X",
3451 node_mac_address[0], node_mac_address[1], node_mac_address[2],
3452 node_mac_address[3], node_mac_address[4], node_mac_address[5],
3453 node_mac_address[6], node_mac_address[7]);
3458 ERR("No attached nodes");
3463 g_variant_iter_free(iter);
3464 g_variant_unref(variant);
3466 ERR("NULL Variant [%s]", dbus_err->message);
3467 ERR("No attached nodes");
3468 g_error_free(dbus_err);
3472 return ZIGBEE_ERROR_NONE;
3475 int zbl_coex_start(unsigned char channel)
3477 int result = ZIGBEE_ERROR_NONE;
3478 GVariant *variant = NULL;
3479 GError *dbus_err = NULL;
3481 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
3482 RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
3484 variant = g_dbus_proxy_call_sync(service_gproxy, "coex_start", g_variant_new("(y)", channel),
3485 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
3488 ERR("Failed to get 'coex_start' [%s]", dbus_err->message);
3489 g_error_free(dbus_err);
3490 return ZIGBEE_ERROR_IO_ERROR;
3493 g_variant_get(variant, "(i)", &result);
3494 DBG("ret = [0x%x]", result);
3495 g_variant_unref(variant);
3500 int zbl_coex_stop(void)
3502 int result = ZIGBEE_ERROR_NONE;
3503 GVariant *variant = NULL;
3504 GError *dbus_err = NULL;
3506 DBG("zbl_coex_stop()");
3508 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
3509 RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
3511 variant = g_dbus_proxy_call_sync(service_gproxy, "coex_stop", NULL,
3512 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
3515 ERR("Failed to get 'coex_stop' [%s]", dbus_err->message);
3516 g_error_free(dbus_err);
3517 return ZIGBEE_ERROR_IO_ERROR;
3520 g_variant_get(variant, "(i)", &result);
3521 DBG("ret = [0x%x]", result);
3522 g_variant_unref(variant);
3527 int zbl_form_network(zigbee_h handle, zb_form_network_cb cb, void *user_data)
3530 zbl_req_cb_s *container;
3532 int result = ZIGBEE_ERROR_NONE;
3533 GVariant *variant = NULL;
3534 GError *dbus_err = NULL;
3536 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
3537 RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
3539 container = calloc(1, sizeof(zbl_req_cb_s));
3540 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
3542 to = zbl_dbus_get_timeout(service_gproxy);
3543 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
3544 ZIGBEE_SERVICE_INTERFACE, "form_network_done", ZIGBEE_SERVICE_OBJECT_PATH, NULL, 0,
3545 _zbl_response_cb, container, _zbl_request_cleanup);
3548 ERR("g_dbus_connection_signal_subscribe() Fail");
3550 return ZIGBEE_ERROR_IO_ERROR;
3554 container->sid = sub_id;
3555 container->cid = ZBL_SERVICE_FORM_NETWORK;
3556 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
3557 container->userdata = user_data;
3559 variant = g_dbus_proxy_call_sync(service_gproxy, "form_network", NULL,
3560 G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
3563 ERR("Failed to get 'form_network' [%s]", dbus_err->message);
3564 g_error_free(dbus_err);
3565 return ZIGBEE_ERROR_IO_ERROR;
3568 g_variant_get(variant, "(i)", &result);
3569 DBG("ret = [0x%x]", result);
3570 g_variant_unref(variant);
3575 int zbl_disable_network(zigbee_h handle, zb_disable_network_cb cb, void *user_data)
3578 zbl_req_cb_s *container;
3580 int result = ZIGBEE_ERROR_NONE;
3581 GVariant *variant = NULL;
3582 GError *dbus_err = NULL;
3584 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
3585 RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
3587 DBG("zbl_disable_network()");
3589 container = calloc(1, sizeof(zbl_req_cb_s));
3590 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
3592 to = zbl_dbus_get_timeout(service_gproxy);
3593 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
3594 ZIGBEE_SERVICE_INTERFACE, "disable_network_done", ZIGBEE_SERVICE_OBJECT_PATH, NULL, 0,
3595 _zbl_response_cb, container, _zbl_request_cleanup);
3598 ERR("g_dbus_connection_signal_subscribe() Fail");
3600 return ZIGBEE_ERROR_IO_ERROR;
3604 container->sid = sub_id;
3605 container->cid = ZBL_SERVICE_DISABLE_NETWORK;
3606 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
3607 container->userdata = user_data;
3609 variant = g_dbus_proxy_call_sync(service_gproxy, "leave_network", NULL,
3610 G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
3613 ERR("Failed to get 'leave_network' [%s]", dbus_err->message);
3614 g_error_free(dbus_err);
3615 return ZIGBEE_ERROR_IO_ERROR;
3618 g_variant_get(variant, "(i)", &result);
3619 DBG("ret = [0x%x]", result);
3620 g_variant_unref(variant);
3625 int zbl_leave_device(ieee_addr addr64, bool remove_children, bool rejoin)
3627 int result = ZIGBEE_ERROR_NONE;
3628 GVariant *variant = NULL;
3629 GError *dbus_err = NULL;
3631 GVariantBuilder *mac_builder = NULL;
3632 GVariant* mac_variant = NULL;
3633 unsigned char _remove_children = (remove_children) ? 1 : 0;
3634 unsigned char _rejoin = (rejoin) ? 1 : 0;
3636 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
3637 RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
3639 DBG("IEEE Address = %X:%X:%X:%X:%X:%X:%X:%X",
3640 addr64[0], addr64[1], addr64[2], addr64[3],
3641 addr64[4], addr64[5], addr64[6], addr64[7]);
3643 mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
3644 g_variant_builder_add(mac_builder, "(y)", addr64[7]);
3645 g_variant_builder_add(mac_builder, "(y)", addr64[6]);
3646 g_variant_builder_add(mac_builder, "(y)", addr64[5]);
3647 g_variant_builder_add(mac_builder, "(y)", addr64[4]);
3648 g_variant_builder_add(mac_builder, "(y)", addr64[3]);
3649 g_variant_builder_add(mac_builder, "(y)", addr64[2]);
3650 g_variant_builder_add(mac_builder, "(y)", addr64[1]);
3651 g_variant_builder_add(mac_builder, "(y)", addr64[0]);
3652 mac_variant = g_variant_builder_end(mac_builder);
3653 g_variant_builder_unref(mac_builder);
3655 variant = g_dbus_proxy_call_sync(service_gproxy, "leave_request",
3656 g_variant_new("(@a(y)yy)", mac_variant, _remove_children, _rejoin),
3657 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
3660 ERR("Failed to get 'leave_request' [%s]", dbus_err->message);
3661 g_error_free(dbus_err);
3662 return ZIGBEE_ERROR_IO_ERROR;
3665 g_variant_get(variant, "(i)", &result);
3666 DBG("ret = [0x%x]", result);
3667 g_variant_unref(variant);
3672 int zbl_permit_join(unsigned char duration, bool broadcast)
3674 int result = ZIGBEE_ERROR_NONE;
3675 GVariant *variant = NULL;
3676 GError *dbus_err = NULL;
3678 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
3679 RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
3681 variant = g_dbus_proxy_call_sync(service_gproxy, "permit_join",
3682 g_variant_new("(ib)", duration, broadcast), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
3685 ERR("Failed to get 'permit_join' [%s]", dbus_err->message);
3686 g_error_free(dbus_err);
3687 return ZIGBEE_ERROR_IO_ERROR;
3690 g_variant_get(variant, "(i)", &result);
3691 DBG("ret = [0x%x]", result);
3692 g_variant_unref(variant);
3697 int zbl_nwk_addr_req(zigbee_h handle, ieee_addr addr64, unsigned char request_type,
3698 unsigned char start_idx, zb_zdo_addr_rsp cb, void *user_data)
3701 zbl_req_cb_s *container;
3702 GVariantBuilder *mac_builder = NULL;
3703 GVariant* mac_variant = NULL;
3705 int result = ZIGBEE_ERROR_NONE;
3706 GVariant *variant = NULL;
3707 GError *dbus_err = NULL;
3709 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
3710 RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
3712 DBG(" zbl_nwk_addr_req()");
3714 container = calloc(1, sizeof(zbl_req_cb_s));
3715 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
3717 to = zbl_dbus_get_timeout(zdo_dev_proxy);
3718 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
3719 ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "nwk_addr_rsp",
3720 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container,
3721 _zbl_request_cleanup);
3724 ERR("g_dbus_connection_signal_subscribe() Fail");
3726 return ZIGBEE_ERROR_IO_ERROR;
3730 container->sid = sub_id;
3731 container->cid = ZBL_ZDO_NWK_ADDR_REQ;
3732 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
3733 container->userdata = user_data;
3735 mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
3736 g_variant_builder_add(mac_builder, "(y)", addr64[7]);
3737 g_variant_builder_add(mac_builder, "(y)", addr64[6]);
3738 g_variant_builder_add(mac_builder, "(y)", addr64[5]);
3739 g_variant_builder_add(mac_builder, "(y)", addr64[4]);
3740 g_variant_builder_add(mac_builder, "(y)", addr64[3]);
3741 g_variant_builder_add(mac_builder, "(y)", addr64[2]);
3742 g_variant_builder_add(mac_builder, "(y)", addr64[1]);
3743 g_variant_builder_add(mac_builder, "(y)", addr64[0]);
3744 mac_variant = g_variant_builder_end(mac_builder);
3745 g_variant_builder_unref(mac_builder);
3747 variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "nwk_addr_req",
3748 g_variant_new("(@a(y)yy)", mac_variant, request_type, start_idx),
3749 G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
3752 ERR("Failed to get 'nwk_addr_req' [%s]", dbus_err->message);
3753 g_error_free(dbus_err);
3754 return ZIGBEE_ERROR_IO_ERROR;
3757 g_variant_get(variant, "(i)", &result);
3758 DBG("ret = [0x%x]", result);
3759 g_variant_unref(variant);
3764 int zbl_ieee_addr_req(zigbee_h handle, nwk_addr addr16, zb_zdo_addr_rsp cb,
3768 zbl_req_cb_s *container;
3770 int result = ZIGBEE_ERROR_NONE;
3771 GVariant *variant = NULL;
3772 GError *dbus_err = NULL;
3774 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
3775 RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
3777 DBG("zbl_ieee_addr_req()");
3779 container = calloc(1, sizeof(zbl_req_cb_s));
3780 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
3782 to = zbl_dbus_get_timeout(zdo_dev_proxy);
3783 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
3784 ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "nwk_addr_rsp",
3785 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
3786 _zbl_response_cb, container, _zbl_request_cleanup);
3789 ERR("g_dbus_connection_signal_subscribe() Fail");
3791 return ZIGBEE_ERROR_IO_ERROR;
3795 container->sid = sub_id;
3796 container->cid = ZBL_ZDO_NWK_ADDR_REQ;
3797 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
3798 container->userdata = user_data;
3800 variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "ieee_addr_req", g_variant_new("(q)", addr16),
3801 G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
3804 ERR("Failed to get 'ieee_addr_req' [%s]", dbus_err->message);
3805 g_error_free(dbus_err);
3806 return ZIGBEE_ERROR_IO_ERROR;
3809 g_variant_get(variant, "(i)", &result);
3810 DBG("ret = [0x%x]", result);
3811 g_variant_unref(variant);
3816 int zbl_active_ep(zigbee_h handle, nwk_addr addr16, zb_zdo_active_ep_rsp cb,
3820 zbl_req_cb_s *container;
3822 int result = ZIGBEE_ERROR_NONE;
3823 GVariant *variant = NULL;
3824 GError *dbus_err = NULL;
3826 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
3827 RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
3829 DBG("zbl_active_ep()");
3831 container = calloc(1, sizeof(zbl_req_cb_s));
3832 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
3834 to = zbl_dbus_get_timeout(zdo_dev_proxy);
3835 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
3836 ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "active_ep_rsp",
3837 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
3838 _zbl_response_cb, container, _zbl_request_cleanup);
3841 ERR("g_dbus_connection_signal_subscribe() Fail");
3843 return ZIGBEE_ERROR_IO_ERROR;
3847 container->sid = sub_id;
3848 container->cid = ZBL_ZDO_ACTIVE_EP_REQ;
3849 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
3850 container->userdata = user_data;
3852 variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "active_ep_req",
3853 g_variant_new("(q)", addr16), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
3856 ERR("Failed to get 'active_ep_req' [%s]", dbus_err->message);
3857 g_error_free(dbus_err);
3858 return ZIGBEE_ERROR_IO_ERROR;
3861 g_variant_get(variant, "(i)", &result);
3862 DBG("ret = [0x%x]", result);
3863 g_variant_unref(variant);
3868 int zbl_simple_desc_req(zigbee_h handle, nwk_addr addr16, unsigned char ep,
3869 zb_zdo_simple_desc_rsp cb, void *user_data)
3872 zbl_req_cb_s *container;
3874 int result = ZIGBEE_ERROR_NONE;
3875 GVariant *variant = NULL;
3876 GError *dbus_err = NULL;
3878 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
3879 RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
3881 DBG("zbl_simple_desc_req() : [%X]", addr16);
3883 container = calloc(1, sizeof(zbl_req_cb_s));
3884 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
3886 to = zbl_dbus_get_timeout(zdo_dev_proxy);
3887 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
3888 ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "simple_desc_rsp",
3889 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
3890 _zbl_response_cb, container, _zbl_request_cleanup);
3893 ERR("g_dbus_connection_signal_subscribe() Fail");
3895 return ZIGBEE_ERROR_IO_ERROR;
3899 container->sid = sub_id;
3900 container->cid = ZBL_ZDO_SIMPLE_DESC_REQ;
3901 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
3902 container->userdata = user_data;
3904 variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "simple_desc_req",
3905 g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
3908 ERR("Failed to get 'simple_desc_req' [%s]", dbus_err->message);
3909 g_error_free(dbus_err);
3910 return ZIGBEE_ERROR_IO_ERROR;
3913 g_variant_get(variant, "(i)", &result);
3914 DBG("ret = [0x%x]", result);
3915 g_variant_unref(variant);
3920 #ifdef ZB_SUPPORT_PRIORITY_5
3921 int zbl_extended_simple_desc_req(zigbee_h handle, nwk_addr addr16,
3922 unsigned char start_idx, zb_zdo_extended_simple_desc_rsp cb, void *user_data)
3924 return ZIGBEE_ERROR_NOT_SUPPORTED;
3926 #endif /* ZB_SUPPORT_PRIORITY_5 */
3928 int zbl_match_desc_req(zigbee_h handle, nwk_addr addr16,
3929 unsigned short profile_id, unsigned char num_in_clusters,
3930 unsigned short *in_clusters, unsigned char num_out_clusters,
3931 unsigned short *out_clusters, zb_zdo_match_desc_rsp cb, void *user_data)
3934 zbl_req_cb_s *container;
3936 int result = ZIGBEE_ERROR_NONE;
3937 GVariant *variant = NULL;
3938 GError *dbus_err = NULL;
3941 GVariantBuilder *incl_builder = NULL;
3942 GVariant* incl_variant = NULL;
3943 GVariantBuilder *outcl_builder = NULL;
3944 GVariant* outcl_variant = NULL;
3946 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
3947 RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
3949 DBG("zbl_match_desc_req()");
3951 container = calloc(1, sizeof(zbl_req_cb_s));
3952 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
3954 to = zbl_dbus_get_timeout(zdo_dev_proxy);
3955 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
3956 ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "matched_descriptor_rsp",
3957 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
3958 _zbl_response_cb, container, _zbl_request_cleanup);
3961 ERR("g_dbus_connection_signal_subscribe() Fail");
3963 return ZIGBEE_ERROR_IO_ERROR;
3967 container->sid = sub_id;
3968 container->cid = ZBL_ZDO_MATCHED_DESCRIPTOR_REQ;
3969 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
3970 container->userdata = user_data;
3972 incl_builder = g_variant_builder_new(G_VARIANT_TYPE("aq"));
3973 for (i = 0; i < num_in_clusters; i++)
3974 g_variant_builder_add(incl_builder, "q", in_clusters[i]);
3976 outcl_builder = g_variant_builder_new(G_VARIANT_TYPE("aq"));
3977 for (i = 0; i < num_out_clusters; i++)
3978 g_variant_builder_add(outcl_builder, "q", out_clusters[i]);
3980 incl_variant = g_variant_builder_end(incl_builder);
3981 outcl_variant = g_variant_builder_end(outcl_builder);
3982 g_variant_builder_unref(incl_builder);
3983 g_variant_builder_unref(outcl_builder);
3985 variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "matched_descriptor_req",
3986 g_variant_new("(qqy@aqy@aq)", addr16, profile_id, num_in_clusters,
3987 incl_variant, num_out_clusters, outcl_variant),
3988 G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
3991 ERR("Failed to get 'matched_descriptor_req' [%s]", dbus_err->message);
3992 g_error_free(dbus_err);
3993 return ZIGBEE_ERROR_IO_ERROR;
3996 g_variant_get(variant, "(i)", &result);
3997 DBG("ret = [0x%x]", result);
3998 g_variant_unref(variant);
4003 int zbl_node_desc_req(nwk_addr addr16, zb_zdo_node_desc_rsp cb, void *user_data)
4006 zbl_req_cb_s *container;
4008 int result = ZIGBEE_ERROR_NONE;
4009 GVariant *variant = NULL;
4010 GError *dbus_err = NULL;
4012 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
4013 RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
4015 DBG("zbl_node_desc_req()");
4017 container = calloc(1, sizeof(zbl_req_cb_s));
4018 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
4020 to = zbl_dbus_get_timeout(zdo_dev_proxy);
4021 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
4022 ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "node_desc_rsp",
4023 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
4024 _zbl_response_cb, container, _zbl_request_cleanup);
4027 ERR("g_dbus_connection_signal_subscribe() Fail");
4029 return ZIGBEE_ERROR_IO_ERROR;
4033 container->sid = sub_id;
4034 container->cid = ZBL_ZDO_NODE_DESC_REQ;
4035 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
4036 container->userdata = user_data;
4038 variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "node_desc_req",
4039 g_variant_new("(q)", addr16), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
4042 ERR("Failed to get 'node_desc_req' [%s]", dbus_err->message);
4043 g_error_free(dbus_err);
4044 return ZIGBEE_ERROR_IO_ERROR;
4047 g_variant_get(variant, "(i)", &result);
4048 DBG("ret = [0x%x]", result);
4049 g_variant_unref(variant);
4054 int zbl_power_desc_req(nwk_addr addr16, zb_zdo_power_desc_rsp cb, void *user_data)
4057 zbl_req_cb_s *container;
4059 int result = ZIGBEE_ERROR_NONE;
4060 GVariant *variant = NULL;
4061 GError *dbus_err = NULL;
4063 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
4064 RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
4066 container = calloc(1, sizeof(zbl_req_cb_s));
4067 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
4069 to = zbl_dbus_get_timeout(zdo_dev_proxy);
4070 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
4071 ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "power_desc_rsp",
4072 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
4073 _zbl_response_cb, container, _zbl_request_cleanup);
4076 ERR("g_dbus_connection_signal_subscribe() Fail");
4078 return ZIGBEE_ERROR_IO_ERROR;
4082 container->sid = sub_id;
4083 container->cid = ZBL_ZDO_POWER_DESC_REQ;
4084 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
4085 container->userdata = user_data;
4087 variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "power_desc_req",
4088 g_variant_new("(q)", addr16), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
4091 ERR("Failed to get 'power_desc_req' [%s]", dbus_err->message);
4092 g_error_free(dbus_err);
4093 return ZIGBEE_ERROR_IO_ERROR;
4096 g_variant_get(variant, "(i)", &result);
4097 DBG("ret = [0x%x]", result);
4098 g_variant_unref(variant);
4103 int zbl_complex_desc_req(nwk_addr addr16, zb_zdo_complex_desc_rsp cb, void *user_data)
4106 zbl_req_cb_s *container;
4108 int result = ZIGBEE_ERROR_NONE;
4109 GVariant *variant = NULL;
4110 GError *dbus_err = NULL;
4112 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
4113 RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
4115 container = calloc(1, sizeof(zbl_req_cb_s));
4116 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
4118 to = zbl_dbus_get_timeout(zdo_dev_proxy);
4119 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
4120 ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "complex_desc_rsp",
4121 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
4122 _zbl_response_cb, container, _zbl_request_cleanup);
4125 ERR("g_dbus_connection_signal_subscribe() Fail");
4127 return ZIGBEE_ERROR_IO_ERROR;
4131 container->sid = sub_id;
4132 container->cid = ZBL_ZDO_COMPLEX_DESC_REQ;
4133 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
4134 container->userdata = user_data;
4136 variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "complex_desc_req",
4137 g_variant_new("(q)", addr16), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
4140 ERR("Failed to get 'complex_desc_req' [%s]", dbus_err->message);
4141 g_error_free(dbus_err);
4142 return ZIGBEE_ERROR_IO_ERROR;
4145 g_variant_get(variant, "(i)", &result);
4146 DBG("ret = [0x%x]", result);
4147 g_variant_unref(variant);
4152 int zbl_user_desc_req(nwk_addr addr16, zb_zdo_user_desc_rsp cb, void *user_data)
4155 zbl_req_cb_s *container;
4157 int result = ZIGBEE_ERROR_NONE;
4158 GVariant *variant = NULL;
4159 GError *dbus_err = NULL;
4161 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
4162 RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
4164 container = calloc(1, sizeof(zbl_req_cb_s));
4165 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
4167 to = zbl_dbus_get_timeout(zdo_dev_proxy);
4168 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
4169 ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "user_desc_rsp",
4170 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
4171 _zbl_response_cb, container, _zbl_request_cleanup);
4174 ERR("g_dbus_connection_signal_subscribe() Fail");
4176 return ZIGBEE_ERROR_IO_ERROR;
4180 container->sid = sub_id;
4181 container->cid = ZBL_ZDO_USER_DESC_REQ;
4182 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
4183 container->userdata = user_data;
4185 variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "user_desc_req",
4186 g_variant_new("(q)", addr16), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
4189 ERR("Failed to get 'user_desc_req' [%s]", dbus_err->message);
4190 g_error_free(dbus_err);
4191 return ZIGBEE_ERROR_IO_ERROR;
4194 g_variant_get(variant, "(i)", &result);
4195 DBG("ret = [0x%x]", result);
4196 g_variant_unref(variant);
4201 #define MAX_USER_DESC_SIZE 0x10
4202 #define USER_DESC_COMMAND_SIZE 20
4204 int zbl_user_desc_set(zigbee_h handle, nwk_addr addr16, unsigned char len,
4205 unsigned char *user_desc, zb_zdo_user_desc_conf cb, void *user_data)
4208 zbl_req_cb_s *container;
4210 int result = ZIGBEE_ERROR_NONE;
4211 GVariant *variant = NULL;
4212 GError *dbus_err = NULL;
4214 unsigned char j = 0x00;
4215 GVariantBuilder *user_desc_builder = NULL;
4216 GVariant *user_desc_variant = NULL;
4218 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
4219 RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
4220 RETVM_IF(len > MAX_USER_DESC_SIZE || len < 0x00, ZIGBEE_ERROR_INVALID_PARAMETER,
4221 "invalid length=%d", len);
4222 RETVM_IF(NULL == user_data, ZIGBEE_ERROR_INVALID_PARAMETER, "invalid data");
4224 container = calloc(1, sizeof(zbl_req_cb_s));
4225 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
4227 to = zbl_dbus_get_timeout(zdo_dev_proxy);
4228 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
4229 ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "user_desc_confirm",
4230 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
4231 _zbl_response_cb, container, _zbl_request_cleanup);
4234 ERR("g_dbus_connection_signal_subscribe() Fail");
4236 return ZIGBEE_ERROR_IO_ERROR;
4240 container->sid = sub_id;
4241 container->cid = ZBL_ZDO_USER_DESC_SET_REQ;
4242 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
4243 container->userdata = user_data;
4245 user_desc_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
4246 for (j = 0; j < len; j++)
4247 g_variant_builder_add(user_desc_builder, "(y)", user_desc[j]);
4249 user_desc_variant = g_variant_builder_end(user_desc_builder);
4250 g_variant_builder_unref(user_desc_builder);
4252 variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "user_desc_set_req",
4253 g_variant_new("(qy@a(y))", addr16, len, user_desc_variant),
4254 G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
4257 ERR("Failed to get 'user_desc_set_req' [%s]", dbus_err->message);
4258 g_error_free(dbus_err);
4259 return ZIGBEE_ERROR_IO_ERROR;
4262 g_variant_get(variant, "(i)", &result);
4263 DBG("ret = [0x%x]", result);
4264 g_variant_unref(variant);
4269 int zbl_device_annce(zigbee_h handle, nwk_addr addr16, ieee_addr addr64,
4270 unsigned char capability)
4272 int result = ZIGBEE_ERROR_NONE;
4273 GError *dbus_err = NULL;
4274 GVariant *variant = NULL;
4276 GVariantBuilder *mac_builder = NULL;
4277 GVariant* mac_variant = NULL;
4279 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
4280 RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
4282 mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
4283 g_variant_builder_add(mac_builder, "(y)", addr64[7]);
4284 g_variant_builder_add(mac_builder, "(y)", addr64[6]);
4285 g_variant_builder_add(mac_builder, "(y)", addr64[5]);
4286 g_variant_builder_add(mac_builder, "(y)", addr64[4]);
4287 g_variant_builder_add(mac_builder, "(y)", addr64[3]);
4288 g_variant_builder_add(mac_builder, "(y)", addr64[2]);
4289 g_variant_builder_add(mac_builder, "(y)", addr64[1]);
4290 g_variant_builder_add(mac_builder, "(y)", addr64[0]);
4291 mac_variant = g_variant_builder_end(mac_builder);
4292 g_variant_builder_unref(mac_builder);
4294 variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "device_announce",
4295 g_variant_new("(q@a(y)y)", addr16, mac_variant, capability),
4296 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
4299 ERR("Failed to get 'device_announce' [%s]", dbus_err->message);
4300 g_error_free(dbus_err);
4301 return ZIGBEE_ERROR_IO_ERROR;
4304 g_variant_get(variant, "(i)", &result);
4305 DBG("ret = [0x%x]", result);
4306 g_variant_unref(variant);
4311 int zbl_bind_req(nwk_addr dst_addr16, ieee_addr src_addr64,
4312 unsigned char src_ep, unsigned short cluster_id, ieee_addr dst_addr64,
4313 unsigned char type, nwk_addr group_addr, unsigned char dst_ep,
4314 zb_zdo_bind_rsp cb, void *user_data)
4318 zbl_req_cb_s *container;
4320 int result = ZIGBEE_ERROR_NONE;
4321 GError *dbus_err = NULL;
4322 GVariant *variant = NULL;
4324 GVariantBuilder *src_addr64_builder = NULL;
4325 GVariant* src_addr64_variant = NULL;
4326 GVariantBuilder *dst_addr64_builder = NULL;
4327 GVariant* dst_addr64_variant = NULL;
4329 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
4330 RETV_IF(NULL == zdo_bind_proxy, ZIGBEE_ERROR_IO_ERROR);
4332 DBG("zbl_zdo_bind_req()");
4334 container = calloc(1, sizeof(zbl_req_cb_s));
4335 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
4337 to = zbl_dbus_get_timeout(zdo_bind_proxy);
4338 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
4339 ZIGBEE_ZDO_BIND_INTERFACE, "bind_rsp", ZIGBEE_CONTROL_OBJECT_PATH,
4340 NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup);
4342 ERR("g_dbus_connection_signal_subscribe() Fail");
4344 return ZIGBEE_ERROR_IO_ERROR;
4348 container->sid = sub_id;
4349 container->cid = ZBL_ZDO_BIND_REQ;
4350 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
4351 container->userdata = user_data;
4353 src_addr64_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
4356 for (i = sizeof(ieee_addr) - 1 ; i >= 0; i--)
4357 g_variant_builder_add(src_addr64_builder, "(y)", src_addr64[i]);
4359 src_addr64_variant = g_variant_builder_end(src_addr64_builder);
4360 g_variant_builder_unref(src_addr64_builder);
4362 dst_addr64_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
4364 for (i = sizeof(ieee_addr) - 1 ; i >= 0; i--)
4365 g_variant_builder_add(dst_addr64_builder, "(y)", dst_addr64[i]);
4367 dst_addr64_variant = g_variant_builder_end(dst_addr64_builder);
4368 g_variant_builder_unref(dst_addr64_builder);
4370 variant = g_dbus_proxy_call_sync(zdo_bind_proxy, "bind_req",
4371 g_variant_new("(q@a(y)yq@a(y)yqy)", dst_addr16, src_addr64_variant, src_ep,
4372 cluster_id, dst_addr64_variant, type, group_addr, dst_ep),
4373 G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
4376 ERR("Failed to get 'bind_req' [%s]", dbus_err->message);
4377 g_error_free(dbus_err);
4378 return ZIGBEE_ERROR_IO_ERROR;
4381 g_variant_get(variant, "(i)", &result);
4382 DBG("ret = [0x%x]", result);
4383 g_variant_unref(variant);
4388 int zbl_unbind_req(nwk_addr dst_addr16,
4389 ieee_addr src_addr64, unsigned char src_ep, unsigned short cluster_id,
4390 ieee_addr dst_addr64, unsigned char type, nwk_addr group_addr,
4391 unsigned char dst_ep, zb_zdo_unbind_rsp cb, void *user_data)
4395 zbl_req_cb_s *container;
4397 int result = ZIGBEE_ERROR_NONE;
4398 GError *dbus_err = NULL;
4399 GVariant *variant = NULL;
4401 GVariantBuilder *src_addr64_builder = NULL;
4402 GVariant* src_addr64_variant = NULL;
4403 GVariantBuilder *dst_addr64_builder = NULL;
4404 GVariant* dst_addr64_variant = NULL;
4406 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
4407 RETV_IF(NULL == zdo_bind_proxy, ZIGBEE_ERROR_IO_ERROR);
4409 DBG("zbl_zdo_unbind_req()");
4411 container = calloc(1, sizeof(zbl_req_cb_s));
4412 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
4414 to = zbl_dbus_get_timeout(zdo_bind_proxy);
4415 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
4416 ZIGBEE_ZDO_BIND_INTERFACE, "unbind_rsp", ZIGBEE_CONTROL_OBJECT_PATH,
4417 NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup);
4419 ERR("g_dbus_connection_signal_subscribe() Fail");
4421 return ZIGBEE_ERROR_IO_ERROR;
4425 container->sid = sub_id;
4426 container->cid = ZBL_ZDO_UNBIND_REQ;
4427 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
4428 container->userdata = user_data;
4430 src_addr64_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
4432 for (i = sizeof(ieee_addr) - 1 ; i >= 0; i--)
4433 g_variant_builder_add(src_addr64_builder, "(y)", src_addr64[i]);
4435 src_addr64_variant = g_variant_builder_end(src_addr64_builder);
4436 g_variant_builder_unref(src_addr64_builder);
4438 dst_addr64_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
4440 for (i = sizeof(ieee_addr) - 1 ; i >= 0; i--)
4441 g_variant_builder_add(dst_addr64_builder, "(y)", dst_addr64[i]);
4443 dst_addr64_variant = g_variant_builder_end(dst_addr64_builder);
4444 g_variant_builder_unref(dst_addr64_builder);
4446 variant = g_dbus_proxy_call_sync(zdo_bind_proxy, "unbind_req",
4447 g_variant_new("(q@a(y)yq@a(y)yqy)", dst_addr16, src_addr64_variant, src_ep,
4448 cluster_id, dst_addr64_variant, type, group_addr, dst_ep),
4449 G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
4452 ERR("Failed to get 'unbind_req' [%s]", dbus_err->message);
4453 g_error_free(dbus_err);
4454 return ZIGBEE_ERROR_IO_ERROR;
4457 g_variant_get(variant, "(i)", &result);
4458 DBG("ret = [0x%x]", result);
4459 g_variant_unref(variant);
4464 int zbl_mgmt_nwk_disc_req(nwk_addr addr16, unsigned int scan_channels,
4465 unsigned char scan_duration, unsigned char scan_count, unsigned char start_idx,
4466 zb_zdo_mgmt_nwk_disc_rsp cb, void *user_data)
4469 zbl_req_cb_s *container;
4471 int result = ZIGBEE_ERROR_NONE;
4472 GVariant *variant = NULL;
4473 GError *dbus_err = NULL;
4475 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
4476 RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
4478 DBG("zbl_mgmt_nwk_disc_req()");
4480 container = calloc(1, sizeof(zbl_req_cb_s));
4481 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
4483 to = zbl_dbus_get_timeout(zdo_dev_proxy);
4484 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
4485 ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "mgmt_nwk_disc_rsp",
4486 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb,
4487 container, _zbl_request_cleanup);
4490 ERR("g_dbus_connection_signal_subscribe() Fail");
4492 return ZIGBEE_ERROR_IO_ERROR;
4496 container->sid = sub_id;
4497 container->cid = ZBL_ZDO_MGMT_NWK_DISC_REQ;
4498 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
4499 container->userdata = user_data;
4501 variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_nwk_disc_req",
4502 g_variant_new("(quyqy)", addr16, scan_channels, scan_duration, scan_count, start_idx),
4503 G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
4506 ERR("Failed to get 'mgmt_nwk_disc_req' [%s]", dbus_err->message);
4507 g_error_free(dbus_err);
4508 return ZIGBEE_ERROR_IO_ERROR;
4511 g_variant_get(variant, "(i)", &result);
4512 DBG("ret = [0x%x]", result);
4513 g_variant_unref(variant);
4518 int zbl_mgmt_nwk_update_req(unsigned int scan_channels, unsigned char scan_duration,
4519 unsigned char scan_count, unsigned char nwk_update_id, nwk_addr nwk_manager_addr)
4521 int result = ZIGBEE_ERROR_NONE;
4522 GVariant *variant = NULL;
4523 GError *dbus_err = NULL;
4525 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
4526 RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
4528 DBG("zbl_mgmt_nwk_update_req()");
4530 variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_nwk_update_req",
4531 g_variant_new("(quyyy)", nwk_manager_addr, scan_channels, scan_duration,
4532 scan_count, nwk_update_id), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
4535 ERR("Failed to get 'mgmt_nwk_update_req' [%s]", dbus_err->message);
4536 g_error_free(dbus_err);
4537 return ZIGBEE_ERROR_IO_ERROR;
4540 g_variant_get(variant, "(i)", &result);
4541 DBG("ret = [0x%x]", result);
4542 g_variant_unref(variant);
4547 int zbl_mgmt_lqi_req(nwk_addr addr16, unsigned char start_idx,
4548 zb_zdo_mgmt_lqi_rsp cb, void *user_data)
4551 zbl_req_cb_s *container;
4553 int result = ZIGBEE_ERROR_NONE;
4554 GVariant *variant = NULL;
4555 GError *dbus_err = NULL;
4557 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
4558 RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
4560 DBG("zbl_mgmt_lqi_req()");
4562 container = calloc(1, sizeof(zbl_req_cb_s));
4563 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
4565 to = zbl_dbus_get_timeout(zdo_dev_proxy);
4566 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
4567 ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "mgmt_lqi_rsp",
4568 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container,
4569 _zbl_request_cleanup);
4572 ERR("g_dbus_connection_signal_subscribe() Fail");
4574 return ZIGBEE_ERROR_IO_ERROR;
4578 container->sid = sub_id;
4579 container->cid = ZBL_ZDO_MGMT_LQI_REQ;
4580 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
4581 container->userdata = user_data;
4583 variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_lqi_req",
4584 g_variant_new("(qy)", addr16, start_idx),
4585 G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
4588 ERR("Failed to get 'mgmt_lqi_req' [%s]", dbus_err->message);
4589 g_error_free(dbus_err);
4590 return ZIGBEE_ERROR_IO_ERROR;
4593 g_variant_get(variant, "(i)", &result);
4594 DBG("ret = [0x%x]", result);
4595 g_variant_unref(variant);
4600 int zbl_mgmt_rtg_req(nwk_addr addr16, unsigned char start_idx,
4601 zb_zdo_mgmt_rtg_rsp cb, void *user_data)
4604 zbl_req_cb_s *container;
4606 int result = ZIGBEE_ERROR_NONE;
4607 GVariant *variant = NULL;
4608 GError *dbus_err = NULL;
4610 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
4611 RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
4613 DBG("zbl_mgmt_rtg_req()");
4615 container = calloc(1, sizeof(zbl_req_cb_s));
4616 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
4618 to = zbl_dbus_get_timeout(zdo_dev_proxy);
4619 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
4620 ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "mgmt_rtg_rsp",
4621 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container,
4622 _zbl_request_cleanup);
4625 ERR("g_dbus_connection_signal_subscribe() Fail");
4627 return ZIGBEE_ERROR_IO_ERROR;
4631 container->sid = sub_id;
4632 container->cid = ZBL_ZDO_MGMT_RTG_REQ;
4633 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
4634 container->userdata = user_data;
4636 variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_rtg_req",
4637 g_variant_new("(qy)", addr16, start_idx),
4638 G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
4641 ERR("Failed to get 'mgmt_rtg_req' [%s]", dbus_err->message);
4642 g_error_free(dbus_err);
4643 return ZIGBEE_ERROR_IO_ERROR;
4646 g_variant_get(variant, "(i)", &result);
4647 DBG("ret = [0x%x]", result);
4648 g_variant_unref(variant);
4653 int zbl_mgmt_bind_req(nwk_addr addr16, unsigned char start_idx,
4654 zb_zdo_mgmt_bind_rsp cb, void *user_data)
4657 zbl_req_cb_s *container;
4659 int result = ZIGBEE_ERROR_NONE;
4660 GVariant *variant = NULL;
4661 GError *dbus_err = NULL;
4663 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
4664 RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
4666 DBG("zbl_mgmt_bind_req()");
4668 container = calloc(1, sizeof(zbl_req_cb_s));
4669 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
4671 to = zbl_dbus_get_timeout(zdo_dev_proxy);
4672 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
4673 ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "mgmt_bind_rsp",
4674 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container,
4675 _zbl_request_cleanup);
4678 ERR("g_dbus_connection_signal_subscribe() Fail");
4680 return ZIGBEE_ERROR_IO_ERROR;
4684 container->sid = sub_id;
4685 container->cid = ZBL_ZDO_MGMT_BIND_REQ;
4686 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
4687 container->userdata = user_data;
4689 variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_bind_req",
4690 g_variant_new("(qy)", addr16, start_idx),
4691 G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
4694 ERR("Failed to get 'mgmt_bind_req' [%s]", dbus_err->message);
4695 g_error_free(dbus_err);
4696 return ZIGBEE_ERROR_IO_ERROR;
4699 g_variant_get(variant, "(i)", &result);
4700 DBG("ret = [0x%x]", result);
4701 g_variant_unref(variant);
4706 int zbl_mgmt_leave_device(ieee_addr addr64, unsigned char remove_children,
4707 unsigned rejoin, zb_zdo_mgmt_leave_rsp cb, void *user_data)
4710 zbl_req_cb_s *container;
4712 int result = ZIGBEE_ERROR_NONE;
4713 GVariant *variant = NULL;
4714 GError *dbus_err = NULL;
4716 GVariantBuilder *mac_builder = NULL;
4717 GVariant* mac_variant = NULL;
4719 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
4720 RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
4722 container = calloc(1, sizeof(zbl_req_cb_s));
4723 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
4725 to = zbl_dbus_get_timeout(zdo_dev_proxy);
4726 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
4727 ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "mgmt_leave_rsp",
4728 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container,
4729 _zbl_request_cleanup);
4732 ERR("g_dbus_connection_signal_subscribe() Fail");
4734 return ZIGBEE_ERROR_IO_ERROR;
4738 container->sid = sub_id;
4739 container->cid = ZBL_ZDO_MGMT_LEAVE_REQ;
4740 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
4741 container->userdata = user_data;
4743 mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
4744 g_variant_builder_add(mac_builder, "(y)", addr64[7]);
4745 g_variant_builder_add(mac_builder, "(y)", addr64[6]);
4746 g_variant_builder_add(mac_builder, "(y)", addr64[5]);
4747 g_variant_builder_add(mac_builder, "(y)", addr64[4]);
4748 g_variant_builder_add(mac_builder, "(y)", addr64[3]);
4749 g_variant_builder_add(mac_builder, "(y)", addr64[2]);
4750 g_variant_builder_add(mac_builder, "(y)", addr64[1]);
4751 g_variant_builder_add(mac_builder, "(y)", addr64[0]);
4752 mac_variant = g_variant_builder_end(mac_builder);
4753 g_variant_builder_unref(mac_builder);
4755 variant = g_dbus_proxy_call_sync(service_gproxy, "leave_request",
4756 g_variant_new("(@a(y)yy)", mac_variant, remove_children, rejoin),
4757 G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
4760 ERR("Failed to get 'leave_request' [%s]", dbus_err->message);
4761 g_error_free(dbus_err);
4762 return ZIGBEE_ERROR_IO_ERROR;
4765 g_variant_get(variant, "(i)", &result);
4766 DBG("ret = [0x%x]", result);
4767 g_variant_unref(variant);
4772 int zbl_mgmt_permit_joining_req(nwk_addr addr16, unsigned char duration,
4773 unsigned char tc_significance, zb_zdo_mgmt_permit_joining_rsp cb, void *user_data)
4776 zbl_req_cb_s *container;
4778 int result = ZIGBEE_ERROR_NONE;
4779 GVariant *variant = NULL;
4780 GError *dbus_err = NULL;
4782 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
4783 RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
4785 container = calloc(1, sizeof(zbl_req_cb_s));
4786 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
4788 to = zbl_dbus_get_timeout(zdo_dev_proxy);
4789 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
4790 ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, "mgmt_permit_join_rsp",
4791 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb,
4792 container, _zbl_request_cleanup);
4795 ERR("g_dbus_connection_signal_subscribe() Fail");
4797 return ZIGBEE_ERROR_IO_ERROR;
4801 container->sid = sub_id;
4802 container->cid = ZBL_ZDO_MGMT_PERMIT_JOIN_REQ;
4803 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
4804 container->userdata = user_data;
4806 variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_permit_join_req",
4807 g_variant_new("(qyy)", addr16, duration, tc_significance),
4808 G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
4811 ERR("Failed to get 'mgmt_permit_join_req' [%s]", dbus_err->message);
4812 g_error_free(dbus_err);
4813 return ZIGBEE_ERROR_IO_ERROR;
4816 g_variant_get(variant, "(i)", &result);
4817 DBG("ret = [0x%x]", result);
4818 g_variant_unref(variant);
4823 int zbl_aps_send(nwk_addr addr16, unsigned char aps_frame_ctl, unsigned char src_ep,
4824 unsigned char dst_ep, unsigned short cluster_id, unsigned short profile_id,
4825 unsigned char zcl_frame_ctl, unsigned short mfg_code, unsigned char cmd_id,
4826 unsigned short payload_len, unsigned char *payload, zb_aps_send_rsp cb, void *user_data)
4829 zbl_req_cb_s *container;
4831 int result = ZIGBEE_ERROR_NONE;
4832 GVariant *variant = NULL;
4833 GError *dbus_err = NULL;
4835 GVariantBuilder *payload_builder = NULL;
4836 GVariant *payload_variant = NULL;
4838 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
4839 RETV_IF(NULL == custom_gproxy, ZIGBEE_ERROR_IO_ERROR);
4841 container = calloc(1, sizeof(zbl_req_cb_s));
4842 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
4844 to = zbl_dbus_get_timeout(custom_gproxy);
4845 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
4846 ZIGBEE_CUSTOM_INTERFACE, "aps_send_rsp", ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
4847 _zbl_response_cb, container, _zbl_request_cleanup);
4850 ERR("g_dbus_connection_signal_subscribe() Fail");
4852 return ZIGBEE_ERROR_IO_ERROR;
4856 container->sid = sub_id;
4857 container->cid = ZBL_CUSTOM_APS_SEND_REQ;
4858 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
4859 container->userdata = user_data;
4861 payload_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
4862 if (payload_len > 0) {
4863 for (i = payload_len - 1; i >= 0 ; i--)
4864 g_variant_builder_add(payload_builder, "(y)", payload[i]);
4866 payload_variant = g_variant_builder_end(payload_builder);
4867 g_variant_builder_unref(payload_builder);
4869 variant = g_dbus_proxy_call_sync(custom_gproxy, "aps_send",
4870 g_variant_new("(qyyyqqyqyq@a(y))", addr16, aps_frame_ctl, src_ep, dst_ep, cluster_id,
4871 profile_id, zcl_frame_ctl, mfg_code, cmd_id, payload_len, payload_variant),
4872 G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
4875 ERR("Failed to get 'aps_send' [%s]", dbus_err->message);
4876 g_error_free(dbus_err);
4877 return ZIGBEE_ERROR_IO_ERROR;
4880 g_variant_get(variant, "(i)", &result);
4881 DBG("ret = [0x%x]", result);
4882 g_variant_unref(variant);
4887 int zbl_zcl_send(nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep,
4888 unsigned short cluster_id, unsigned char zcl_frame_ctl, unsigned char cmd,
4889 unsigned short payload_len, unsigned char *payload,
4890 zb_zcl_send_rsp cb, void *user_data)
4893 zbl_req_cb_s *container;
4895 int result = ZIGBEE_ERROR_NONE;
4896 GVariant *variant = NULL;
4897 GError *dbus_err = NULL;
4899 GVariantBuilder *payload_builder = NULL;
4900 GVariant *payload_variant = NULL;
4902 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
4903 RETV_IF(NULL == custom_gproxy, ZIGBEE_ERROR_IO_ERROR);
4905 container = calloc(1, sizeof(zbl_req_cb_s));
4906 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
4908 to = zbl_dbus_get_timeout(custom_gproxy);
4909 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
4910 ZIGBEE_CUSTOM_INTERFACE, "zcl_send_rsp", ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
4911 _zbl_response_cb, container, _zbl_request_cleanup);
4914 ERR("g_dbus_connection_signal_subscribe() Fail");
4916 return ZIGBEE_ERROR_IO_ERROR;
4920 container->sid = sub_id;
4921 container->cid = ZBL_CUSTOM_ZCL_SEND_REQ;
4922 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
4923 container->userdata = user_data;
4925 payload_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
4926 if (payload_len > 0) {
4927 for (i = payload_len - 1; i >= 0 ; i--)
4928 g_variant_builder_add(payload_builder, "(y)", payload[i]);
4930 payload_variant = g_variant_builder_end(payload_builder);
4931 g_variant_builder_unref(payload_builder);
4933 variant = g_dbus_proxy_call_sync(custom_gproxy, "zcl_send",
4934 g_variant_new("(qyyqyyq@a(y))", addr16, src_ep, dst_ep, cluster_id, zcl_frame_ctl,
4935 cmd, payload_len, payload_variant), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
4938 ERR("Failed to get 'zcl_send' [%s]", dbus_err->message);
4939 g_error_free(dbus_err);
4940 return ZIGBEE_ERROR_IO_ERROR;
4943 g_variant_get(variant, "(i)", &result);
4944 DBG("ret = [0x%x]", result);
4945 g_variant_unref(variant);
4950 int zbl_send_to_local(unsigned short length, unsigned char *data,
4951 zb_send_to_local_rsp cb, void *user_data)
4954 zbl_req_cb_s *container;
4956 int result = ZIGBEE_ERROR_NONE;
4957 GVariant *variant = NULL;
4958 GError *dbus_err = NULL;
4960 GVariantBuilder *payload_builder = NULL;
4961 GVariant *payload_variant = NULL;
4963 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
4964 RETV_IF(NULL == custom_gproxy, ZIGBEE_ERROR_IO_ERROR);
4966 container = calloc(1, sizeof(zbl_req_cb_s));
4967 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
4969 to = zbl_dbus_get_timeout(custom_gproxy);
4970 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
4971 ZIGBEE_CUSTOM_INTERFACE, "send_to_local_rsp", ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
4972 _zbl_response_cb, container, _zbl_request_cleanup);
4975 ERR("g_dbus_connection_signal_subscribe() Fail");
4977 return ZIGBEE_ERROR_IO_ERROR;
4981 container->sid = sub_id;
4982 container->cid = ZBL_CUSTOM_LOCAL_SEND_REQ;
4983 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
4984 container->userdata = user_data;
4986 payload_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
4988 for (i = length - 1; i >= 0 ; i--)
4989 g_variant_builder_add(payload_builder, "(y)", data[i]);
4991 payload_variant = g_variant_builder_end(payload_builder);
4992 g_variant_builder_unref(payload_builder);
4994 variant = g_dbus_proxy_call_sync(custom_gproxy, "send_to_local",
4995 g_variant_new("(q@a(y))", length, payload_variant),
4996 G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
4999 ERR("Failed to get 'send_to_local' [%s]", dbus_err->message);
5000 g_error_free(dbus_err);
5001 return ZIGBEE_ERROR_IO_ERROR;
5004 g_variant_get(variant, "(i)", &result);
5005 DBG("ret = [0x%x]", result);
5006 g_variant_unref(variant);
5011 int zbl_read_attr_req(zigbee_h handle, unsigned short addr16, unsigned char dest_ep,
5012 unsigned char zcl_frame_ctl, unsigned short cluster_id, unsigned short *attribute_ids,
5013 int attribute_ids_len, zb_zcl_global_rsp cb, void *user_data)
5016 zbl_req_cb_s *container;
5018 int result = ZIGBEE_ERROR_NONE;
5019 GVariant *variant = NULL;
5020 GError *dbus_err = NULL;
5022 #ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
5023 zb_event_global_default_rsp_s *global_req = NULL;
5028 GVariant *attr_variant = NULL;
5029 GVariantBuilder *attr_builder = NULL;
5031 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
5032 RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
5034 DBG("zbl_read_attr_req()");
5036 container = calloc(1, sizeof(zbl_req_cb_s));
5037 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
5039 to = zbl_dbus_get_timeout(zcl_global_proxy);
5040 sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
5041 ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "read_attributes_rsp",
5042 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
5043 _zbl_response_cb, container, _zbl_request_cleanup);
5046 ERR("g_dbus_connection_signal_subscribe() Fail");
5048 return ZIGBEE_ERROR_IO_ERROR;
5052 container->sid = sub_id;
5053 container->cid = ZBL_ZCL_GLOBAL_READ_ATTRIBUTE_REQ;
5054 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
5055 container->userdata = user_data;
5056 #ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
5057 global_req = calloc(1, sizeof(zb_event_global_default_rsp_s));
5058 if (NULL == global_req) {
5059 g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id);
5060 g_source_remove(container->tid);
5063 ERR("calloc() Fail(%d)", errno);
5064 return ZIGBEE_ERROR_OUT_OF_MEMORY;
5066 global_req->ep = dest_ep;
5067 global_req->cluster_id = cluster_id;
5068 global_req->command_id = ZB_ZCL_READ_ATTRIBUTES_COMMAND_ID;
5070 container->global_cmd = global_req;
5071 container->handle = handle;
5073 /* Register global request information into handle */
5074 _zbl_register_global_req(handle, container);
5077 t = (unsigned char *)attribute_ids;
5078 attr_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
5079 for (i = 0; i < attribute_ids_len*sizeof(unsigned short); i++)
5080 g_variant_builder_add(attr_builder, "(y)", t[i]);
5081 attr_variant = g_variant_builder_end(attr_builder);
5082 g_variant_builder_unref(attr_builder);
5084 variant = g_dbus_proxy_call_sync(zcl_global_proxy, "read_attributes_req",
5085 g_variant_new("(@a(y)iqqyy)", attr_variant, attribute_ids_len,
5086 addr16, cluster_id, zcl_frame_ctl, dest_ep), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
5089 ERR("Failed to get 'read_attributes_req' [%s]", dbus_err->message);
5090 g_error_free(dbus_err);
5091 return ZIGBEE_ERROR_IO_ERROR;
5094 g_variant_get(variant, "(i)", &result);
5095 DBG("ret = [0x%x]", result);
5096 g_variant_unref(variant);
5101 int zbl_write_attr_req(zigbee_h handle, nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep,
5102 unsigned char zcl_frame_ctl, unsigned short cluster_id, write_attr_record_h *records,
5103 int records_len, zb_zcl_global_rsp cb, void *user_data)
5106 zbl_req_cb_s *container;
5108 int result = ZIGBEE_ERROR_NONE;
5109 GVariant *variant = NULL;
5110 GError *dbus_err = NULL;
5112 #ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
5113 zb_event_global_default_rsp_s *global_req = NULL;
5116 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
5117 RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
5119 DBG("zbl_write_attr_req()");
5121 GVariantBuilder *rec_builder = NULL;
5122 GVariant *rec_variant = NULL;
5127 char dSize[3] = {'\0', '\0'};
5128 int writeAttributeIndex = 0;
5129 int size_of_allo = 0;
5131 unsigned char *isString = NULL;
5132 unsigned short *dataSize = NULL;
5133 unsigned char *writeAttribute = NULL;
5135 isString = calloc(records_len + 1, sizeof(unsigned char));
5136 RETVM_IF(NULL == isString, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
5138 dataSize = calloc(records_len + 1, sizeof(unsigned short));
5139 if (NULL == dataSize) {
5140 ERR("calloc() Fail(%d)", errno);
5142 return ZIGBEE_ERROR_OUT_OF_MEMORY;
5145 DBG("Records Length %d", records_len);
5147 while (j < records_len) {
5148 dataSize[j] = zb_get_data_size((*records)[j].type);
5149 if (0xff != dataSize[j]) {
5151 size_of_allo = size_of_allo + (dataSize[j] + 3);
5153 if ((*records)[j].value) {
5154 if ((*records)[j].type == ZB_ZCL_CHRACTER_STRING
5155 || (*records)[j].type == ZB_ZCL_OCTAT_STRING) {
5157 dataSize[j] = (*records)[j].value[0];
5158 size_of_allo = size_of_allo + (dataSize[j] + 3 + 1);
5159 } else if ((*records)[j].type == ZB_ZCL_LONG_OCTAT_STRING
5160 || (*records)[j].type == ZB_ZCL_LONG_CHRACTER_STRING) {
5162 dSize[0] = (*records)[j].value[0];
5163 dSize[1] = (*records)[j].value[1];
5164 dataSize[j] = dSize[1];
5165 dataSize[j] = (dataSize[j] << 8) | dSize[0];
5166 size_of_allo = size_of_allo + (dataSize[j] + 3 + 2);
5169 ERR("Data is not present");
5173 DBG("size_of_allo Length %d", size_of_allo);
5175 writeAttribute = calloc(size_of_allo + 1, sizeof(unsigned char));
5176 if (NULL == writeAttribute) {
5177 ERR("Couldn't Allocate Memory");
5180 return ZIGBEE_ERROR_OUT_OF_MEMORY;
5184 while (j < records_len && writeAttributeIndex < size_of_allo) {
5185 writeAttribute[writeAttributeIndex++] = ((*records)[j].id) & 0xff;
5186 writeAttribute[writeAttributeIndex++] = (((*records)[j].id) >> 8) & 0xff;
5187 writeAttribute[writeAttributeIndex++] = (*records)[j].type;
5188 for (i = 0; i < (dataSize[j] + isString[j]); i++) {
5189 writeAttribute[writeAttributeIndex++] = (*records)[j].value[i];
5190 DBG("0x%02X", (*records)[j].value[i]);
5195 rec_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
5197 for (i = 0; i < writeAttributeIndex ; i++) {
5198 DBG("0x%02X", writeAttribute[i]);
5199 g_variant_builder_add(rec_builder, "(y)", writeAttribute[i]);
5202 rec_variant = g_variant_builder_end(rec_builder);
5203 g_variant_builder_unref(rec_builder);
5205 container = calloc(1, sizeof(zbl_req_cb_s));
5206 if (NULL == container) {
5207 ERR("calloc() Fail(%d)", errno);
5210 free(writeAttribute);
5211 return ZIGBEE_ERROR_OUT_OF_MEMORY;
5214 to = zbl_dbus_get_timeout(zcl_global_proxy);
5215 sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
5216 ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "write_attributes_rsp",
5217 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb,
5218 container, _zbl_request_cleanup);
5221 ERR("g_dbus_connection_signal_subscribe() Fail");
5225 free(writeAttribute);
5226 return ZIGBEE_ERROR_IO_ERROR;
5230 container->sid = sub_id;
5231 container->cid = ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_REQ;
5232 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
5233 container->userdata = user_data;
5234 #ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
5235 global_req = calloc(1, sizeof(zb_event_global_default_rsp_s));
5236 if (NULL == global_req) {
5237 g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id);
5238 g_source_remove(container->tid);
5243 free(writeAttribute);
5244 ERR("calloc() Fail(%d)", errno);
5245 return ZIGBEE_ERROR_OUT_OF_MEMORY;
5247 global_req->ep = dst_ep;
5248 global_req->cluster_id = cluster_id;
5249 global_req->command_id = ZB_ZCL_WRITE_ATTRIBUTES_COMMAND_ID;
5251 container->global_cmd = global_req;
5252 container->handle = handle;
5254 /* Register global request information into handle */
5255 _zbl_register_global_req(handle, container);
5258 variant = g_dbus_proxy_call_sync(zcl_global_proxy, "write_attributes_req",
5259 g_variant_new("(@a(y)iqqyyy)", rec_variant, writeAttributeIndex, addr16,
5260 cluster_id, zcl_frame_ctl, src_ep, dst_ep), G_DBUS_CALL_FLAGS_NONE,
5261 to, NULL, &dbus_err);
5265 free(writeAttribute);
5268 ERR("Failed to get 'write_attributes_req' [%s]", dbus_err->message);
5269 g_error_free(dbus_err);
5270 return ZIGBEE_ERROR_IO_ERROR;
5273 g_variant_get(variant, "(i)", &result);
5274 DBG("ret = [0x%x]", result);
5275 g_variant_unref(variant);
5280 int zbl_wattr_undivided_req(zigbee_h handle, nwk_addr addr16, unsigned char src_ep,
5281 unsigned char dst_ep, unsigned char zcl_frame_ctl, unsigned short cluster_id,
5282 write_attr_record_h *records, int records_len,
5283 zb_zcl_global_rsp cb, void *user_data)
5286 zbl_req_cb_s *container;
5288 int result = ZIGBEE_ERROR_NONE;
5289 GVariant *variant = NULL;
5290 GError *dbus_err = NULL;
5292 #ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
5293 zb_event_global_default_rsp_s *global_req = NULL;
5296 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
5297 RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
5299 DBG("zbl_wattr_undivided_req()");
5301 GVariantBuilder *rec_builder = NULL;
5302 GVariant *rec_variant = NULL;
5307 char dSize[3] = {'\0', '\0'};
5308 int writeAttributeIndex = 0;
5309 int size_of_allo = 0;
5311 unsigned char *isString = NULL;
5312 unsigned short *dataSize = NULL;
5313 unsigned char *writeAttribute = NULL;
5315 isString = calloc(records_len + 1, sizeof(unsigned char));
5316 RETVM_IF(NULL == isString, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
5318 dataSize = calloc(records_len + 1, sizeof(unsigned short));
5319 if (NULL == dataSize) {
5320 ERR("calloc() Fail(%d)", errno);
5322 return ZIGBEE_ERROR_OUT_OF_MEMORY;
5325 DBG("Records Length %d", records_len);
5327 while (j < records_len) {
5328 dataSize[j] = zb_get_data_size((*records)[j].type);
5329 if (0xff != dataSize[j]) {
5331 size_of_allo = size_of_allo + (dataSize[j] + 3);
5333 if ((*records)[j].value) {
5334 if ((*records)[j].type == ZB_ZCL_CHRACTER_STRING
5335 || (*records)[j].type == ZB_ZCL_OCTAT_STRING) {
5337 dataSize[j] = (*records)[j].value[0];
5338 size_of_allo = size_of_allo + (dataSize[j] + 3 + 1);
5339 } else if ((*records)[j].type == ZB_ZCL_LONG_OCTAT_STRING
5340 || (*records)[j].type == ZB_ZCL_LONG_CHRACTER_STRING) {
5342 dSize[0] = (*records)[j].value[0];
5343 dSize[1] = (*records)[j].value[1];
5344 dataSize[j] = dSize[1];
5345 dataSize[j] = (dataSize[j] << 8) | dSize[0];
5346 size_of_allo = size_of_allo + (dataSize[j] + 3 + 2);
5349 ERR("Data is not present");
5353 DBG("size_of_allo Length %d", size_of_allo);
5355 writeAttribute = calloc(size_of_allo + 1, sizeof(unsigned char));
5356 if (NULL == writeAttribute) {
5357 ERR("Couldn't Allocate Memory");
5360 return ZIGBEE_ERROR_OUT_OF_MEMORY;
5364 while (j < records_len && writeAttributeIndex < size_of_allo) {
5365 writeAttribute[writeAttributeIndex++] = ((*records)[j].id) & 0xff;
5366 writeAttribute[writeAttributeIndex++] = (((*records)[j].id) >> 8) & 0xff;
5367 writeAttribute[writeAttributeIndex++] = (*records)[j].type;
5368 for (i = 0; i < (dataSize[j] + isString[j]); i++) {
5369 writeAttribute[writeAttributeIndex++] = (*records)[j].value[i];
5370 DBG("0x%02X", (*records)[j].value[i]);
5375 rec_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
5377 for (i = 0; i < writeAttributeIndex ; i++) {
5378 DBG("0x%02X", writeAttribute[i]);
5379 g_variant_builder_add(rec_builder, "(y)", writeAttribute[i]);
5382 rec_variant = g_variant_builder_end(rec_builder);
5383 g_variant_builder_unref(rec_builder);
5385 container = calloc(1, sizeof(zbl_req_cb_s));
5386 if (NULL == container) {
5387 ERR("calloc() Fail(%d)", errno);
5390 free(writeAttribute);
5391 return ZIGBEE_ERROR_OUT_OF_MEMORY;
5394 to = zbl_dbus_get_timeout(zcl_global_proxy);
5395 sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
5396 ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "write_attributes_rsp",
5397 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb,
5398 container, _zbl_request_cleanup);
5401 ERR("g_dbus_connection_signal_subscribe() Fail");
5405 free(writeAttribute);
5406 return ZIGBEE_ERROR_IO_ERROR;
5410 container->sid = sub_id;
5411 container->cid = ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_REQ;
5412 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
5413 container->userdata = user_data;
5414 #ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
5415 global_req = calloc(1, sizeof(zb_event_global_default_rsp_s));
5416 if (NULL == global_req) {
5417 g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id);
5418 g_source_remove(container->tid);
5423 free(writeAttribute);
5424 ERR("calloc() Fail(%d)", errno);
5425 return ZIGBEE_ERROR_OUT_OF_MEMORY;
5427 global_req->ep = dst_ep;
5428 global_req->cluster_id = cluster_id;
5429 global_req->command_id = ZB_ZCL_WRITE_ATTRIBUTES_UNDIVIDED_COMMAND_ID;
5431 container->global_cmd = global_req;
5432 container->handle = handle;
5434 /* Register global request information into handle */
5435 _zbl_register_global_req(handle, container);
5438 variant = g_dbus_proxy_call_sync(zcl_global_proxy, "write_attributes_undivided_req",
5439 g_variant_new("(@a(y)iqqyyy)", rec_variant, writeAttributeIndex, addr16,
5440 cluster_id, zcl_frame_ctl, src_ep, dst_ep), G_DBUS_CALL_FLAGS_NONE,
5441 to, NULL, &dbus_err);
5445 free(writeAttribute);
5448 ERR("Failed to get 'write_attributes_undivided_req' [%s]", dbus_err->message);
5449 g_error_free(dbus_err);
5450 return ZIGBEE_ERROR_IO_ERROR;
5453 g_variant_get(variant, "(i)", &result);
5454 DBG("ret = [0x%x]", result);
5455 g_variant_unref(variant);
5460 int zbl_wattr_req_no_rsp(zigbee_h handle, nwk_addr addr16, unsigned char src_ep,
5461 unsigned char dst_ep, unsigned char zcl_frame_ctl, unsigned short cluster_id,
5462 write_attr_record_h *records, int records_len)
5464 int result = ZIGBEE_ERROR_NONE;
5465 GError *dbus_err = NULL;
5466 GVariant *variant = NULL;
5468 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
5469 RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
5471 DBG("zbl_wattr_req_no_rsp()");
5473 GVariantBuilder *rec_builder = NULL;
5474 GVariant *rec_variant = NULL;
5479 char dSize[3] = {'\0', '\0'};
5480 int writeAttributeIndex = 0;
5481 int size_of_allo = 0;
5483 unsigned char *isString = NULL;
5484 unsigned short *dataSize = NULL;
5485 unsigned char *writeAttribute = NULL;
5487 isString = calloc(records_len + 1, sizeof(unsigned char));
5488 RETVM_IF(NULL == isString, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
5490 dataSize = calloc(records_len + 1, sizeof(unsigned short));
5491 if (NULL == dataSize) {
5492 ERR("calloc() Fail(%d)", errno);
5494 return ZIGBEE_ERROR_OUT_OF_MEMORY;
5497 DBG("Records Length %d", records_len);
5499 while (j < records_len) {
5500 dataSize[j] = zb_get_data_size((*records)[j].type);
5501 if (0xff != dataSize[j]) {
5503 size_of_allo = size_of_allo + (dataSize[j] + 3);
5505 if ((*records)[j].value) {
5506 if ((*records)[j].type == ZB_ZCL_CHRACTER_STRING
5507 || (*records)[j].type == ZB_ZCL_OCTAT_STRING) {
5509 dataSize[j] = (*records)[j].value[0];
5510 size_of_allo = size_of_allo + (dataSize[j] + 3 + 1);
5511 } else if ((*records)[j].type == ZB_ZCL_LONG_OCTAT_STRING
5512 || (*records)[j].type == ZB_ZCL_LONG_CHRACTER_STRING) {
5514 dSize[0] = (*records)[j].value[0];
5515 dSize[1] = (*records)[j].value[1];
5516 dataSize[j] = dSize[1];
5517 dataSize[j] = (dataSize[j] << 8) | dSize[0];
5518 size_of_allo = size_of_allo + (dataSize[j] + 3 + 2);
5521 ERR("Data is not present");
5525 DBG("size_of_allo Length %d", size_of_allo);
5527 writeAttribute = calloc(size_of_allo + 1, sizeof(unsigned char));
5528 if (NULL == writeAttribute) {
5529 ERR("Couldn't Allocate Memory");
5532 return ZIGBEE_ERROR_OUT_OF_MEMORY;
5536 while (j < records_len && writeAttributeIndex < size_of_allo) {
5537 writeAttribute[writeAttributeIndex++] = ((*records)[j].id) & 0xff;
5538 writeAttribute[writeAttributeIndex++] = (((*records)[j].id) >> 8) & 0xff;
5539 writeAttribute[writeAttributeIndex++] = (*records)[j].type;
5540 for (i = 0; i < (dataSize[j] + isString[j]); i++) {
5541 writeAttribute[writeAttributeIndex++] = (*records)[j].value[i];
5542 DBG("0x%02X", (*records)[j].value[i]);
5547 rec_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
5549 for (i = 0; i < writeAttributeIndex ; i++) {
5550 DBG("0x%02X", writeAttribute[i]);
5551 g_variant_builder_add(rec_builder, "(y)", writeAttribute[i]);
5554 rec_variant = g_variant_builder_end(rec_builder);
5555 g_variant_builder_unref(rec_builder);
5557 variant = g_dbus_proxy_call_sync(zcl_global_proxy, "write_attributes_no_resp",
5558 g_variant_new("(@a(y)iqqyyy)", rec_variant, writeAttributeIndex, addr16,
5559 cluster_id, zcl_frame_ctl, src_ep, dst_ep), G_DBUS_CALL_FLAGS_NONE,
5560 -1, NULL, &dbus_err);
5564 free(writeAttribute);
5567 ERR("Failed to get 'write_attributes_no_rep' [%s]", dbus_err->message);
5568 g_error_free(dbus_err);
5569 return ZIGBEE_ERROR_IO_ERROR;
5572 g_variant_get(variant, "(i)", &result);
5573 DBG("ret = [0x%x]", result);
5574 g_variant_unref(variant);
5579 int zbl_configure_reporting(zigbee_h handle, nwk_addr addr16, unsigned char src_ep,
5580 unsigned char dst_ep, unsigned char zcl_frame_ctl, unsigned short cluster_id,
5581 report_config_record_h *records, int records_len,
5582 zb_zcl_global_rsp cb, void *user_data)
5585 zbl_req_cb_s *container;
5587 int result = ZIGBEE_ERROR_NONE;
5588 GVariant *variant = NULL;
5589 GError *dbus_err = NULL;
5591 #ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
5592 zb_event_global_default_rsp_s *global_req = NULL;
5600 GVariantBuilder *rec_builder = NULL;
5601 GVariant *rec_variant = NULL;
5603 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
5604 RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
5606 DBG("zbl_configure_reporting()");
5608 container = calloc(1, sizeof(zbl_req_cb_s));
5609 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
5611 to = zbl_dbus_get_timeout(zcl_global_proxy);
5612 sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
5613 ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "configure_reporting_rsp",
5614 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb,
5615 container, _zbl_request_cleanup);
5618 ERR("g_dbus_connection_signal_subscribe() Fail");
5620 return ZIGBEE_ERROR_IO_ERROR;
5624 container->sid = sub_id;
5625 container->cid = ZBL_ZCL_GLOBAL_CONFIGURE_REPORTING_REQ;
5626 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
5627 container->userdata = user_data;
5628 #ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
5629 global_req = calloc(1, sizeof(zb_event_global_default_rsp_s));
5630 if (NULL == global_req) {
5631 g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id);
5632 g_source_remove(container->tid);
5635 ERR("calloc() Fail(%d)", errno);
5636 return ZIGBEE_ERROR_OUT_OF_MEMORY;
5638 global_req->ep = dst_ep;
5639 global_req->cluster_id = cluster_id;
5640 global_req->command_id = ZB_ZCL_CONFIGURE_REPORTING_COMMAND_ID;
5642 container->global_cmd = global_req;
5643 container->handle = handle;
5645 /* Register global request information into handle */
5646 _zbl_register_global_req(handle, container);
5649 rec_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
5650 for (i = 0; i < records_len; i++) {
5651 g_variant_builder_add(rec_builder, "(y)", (*records)[i].dir);
5652 DBG("dir = 0x%02X", (*records)[i].dir);
5653 count += sizeof((*records)[i].dir);
5654 g_variant_builder_add(rec_builder, "(y)", (*records)[i].id & 0xff);
5655 g_variant_builder_add(rec_builder, "(y)", ((*records)[i].id >> 8) & 0xff);
5656 DBG("id = 0x%04X", (*records)[i].id);
5657 count += sizeof((*records)[i].id);
5658 g_variant_builder_add(rec_builder, "(y)", (*records)[i].type);
5659 count += sizeof((*records)[i].type);
5660 DBG("type = 0x%04X", (*records)[i].type);
5661 g_variant_builder_add(rec_builder, "(y)", (*records)[i].min_i & 0xff);
5662 g_variant_builder_add(rec_builder, "(y)", ((*records)[i].min_i >> 8) & 0xff);
5663 DBG("min_i = 0x%04X", (*records)[i].min_i);
5664 count += sizeof((*records)[i].min_i);
5665 g_variant_builder_add(rec_builder, "(y)", (*records)[i].max_i & 0xff);
5666 g_variant_builder_add(rec_builder, "(y)", ((*records)[i].max_i >> 8) & 0xff);
5667 DBG("max_i = 0x%04X", (*records)[i].max_i);
5668 count += sizeof((*records)[i].max_i);
5670 len = zb_get_data_size((*records)[i].type);
5672 DBG("change length = %d", len);
5673 DBG("payload length = %d", count);
5675 for (j = 0; j < len && (*records)[i].change+j; j++) {
5676 DBG("records[%d]->value[%d] = %d", i, j, (*records)[i].change[j]);
5677 g_variant_builder_add(rec_builder, "(y)", (*records)[i].change[j]);
5681 rec_variant = g_variant_builder_end(rec_builder);
5682 g_variant_builder_unref(rec_builder);
5684 variant = g_dbus_proxy_call_sync(zcl_global_proxy, "configure_reporting_req",
5685 g_variant_new("(@a(y)qqqyyy)", rec_variant, count, addr16, cluster_id,
5686 zcl_frame_ctl, src_ep, dst_ep), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
5689 ERR("Failed to get 'configure_reporting_req' [%s]", dbus_err->message);
5690 g_error_free(dbus_err);
5691 return ZIGBEE_ERROR_IO_ERROR;
5694 g_variant_get(variant, "(i)", &result);
5695 DBG("ret = [0x%x]", result);
5696 g_variant_unref(variant);
5701 int zbl_read_configure_reporting(zigbee_h handle, nwk_addr addr16, unsigned char src_ep,
5702 unsigned char dst_ep, unsigned char zcl_frame_ctl, unsigned short cluster_id,
5703 read_report_config_record_h *records, int records_len,
5704 zb_zcl_global_rsp cb, void *user_data)
5707 zbl_req_cb_s *container;
5709 int result = ZIGBEE_ERROR_NONE;
5710 GVariant *variant = NULL;
5711 GError *dbus_err = NULL;
5713 #ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
5714 zb_event_global_default_rsp_s *global_req = NULL;
5719 int size_of_allo = 0;
5720 unsigned short idx = 0;
5721 GVariantBuilder *rec_builder = NULL;
5722 GVariant *rec_variant = NULL;
5723 unsigned char *read_attributes;
5725 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
5726 RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
5728 DBG("zbl_read_configure_reporting()");
5730 container = calloc(1, sizeof(zbl_req_cb_s));
5731 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
5733 to = zbl_dbus_get_timeout(zcl_global_proxy);
5734 sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
5735 ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "read_configure_reporting_rsp",
5736 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb,
5737 container, _zbl_request_cleanup);
5740 ERR("g_dbus_connection_signal_subscribe() Fail");
5742 return ZIGBEE_ERROR_IO_ERROR;
5746 container->sid = sub_id;
5747 container->cid = ZBL_ZCL_GLOBAL_READ_CONFIGURE_REPORTING_REQ;
5748 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
5749 container->userdata = user_data;
5750 #ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
5751 global_req = calloc(1, sizeof(zb_event_global_default_rsp_s));
5752 if (NULL == global_req) {
5753 g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id);
5754 g_source_remove(container->tid);
5757 ERR("calloc() Fail(%d)", errno);
5758 return ZIGBEE_ERROR_OUT_OF_MEMORY;
5760 global_req->ep = dst_ep;
5761 global_req->cluster_id = cluster_id;
5762 global_req->command_id = ZB_ZCL_READ_REPORTING_CONFIGURATION_COMMAND_ID;
5764 container->global_cmd = global_req;
5765 container->handle = handle;
5767 /* Register global request information into handle */
5768 _zbl_register_global_req(handle, container);
5771 DBG("Records Length %d", records_len);
5773 * According to zcl spec
5774 * Memory needed for the read_reporting_configured_frame.
5775 * 1 byte(direction) + 2 bytes(AttributeId)
5776 * = 3 bytes/variable
5778 while (j < records_len) {
5779 size_of_allo = size_of_allo + 3;
5782 DBG("size_of_allo Length %d", size_of_allo);
5784 read_attributes = calloc(size_of_allo, sizeof(unsigned char));
5785 if (NULL == read_attributes) {
5786 ERR("Couldn't Allocate Memory");
5787 g_dbus_connection_signal_unsubscribe(gdbus_conn, container->sid);
5788 g_source_remove(container->tid);
5791 return ZIGBEE_ERROR_OUT_OF_MEMORY;
5794 while (j < records_len && idx < size_of_allo) {
5795 read_attributes[idx++] = (*records)[j].dir;
5796 read_attributes[idx++] = (*records)[j].id & 0xff;
5797 read_attributes[idx++] = (*records)[j].id >> 8 & 0xff;
5798 DBG("Id copied \n");
5802 rec_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
5804 for (i = 0; i < idx ; i++) {
5805 DBG("0x%02X", read_attributes[i]);
5806 g_variant_builder_add(rec_builder, "(y)", read_attributes[i]);
5809 rec_variant = g_variant_builder_end(rec_builder);
5810 g_variant_builder_unref(rec_builder);
5812 variant = g_dbus_proxy_call_sync(zcl_global_proxy, "read_configure_reporting",
5813 g_variant_new("(@a(y)qqqyyy)", rec_variant, idx, addr16, cluster_id, zcl_frame_ctl,
5814 src_ep, dst_ep), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
5816 free(read_attributes);
5819 ERR("Failed to get 'read_configure_reporting' [%s]", dbus_err->message);
5820 g_error_free(dbus_err);
5821 return ZIGBEE_ERROR_IO_ERROR;
5824 g_variant_get(variant, "(i)", &result);
5825 DBG("ret = [0x%x]", result);
5826 g_variant_unref(variant);
5831 int zbl_discover_attr_req(zigbee_h handle, unsigned short addr16, unsigned char src_ep,
5832 unsigned char dest_ep, unsigned char zcl_frame_ctl, unsigned short cluster_id,
5833 unsigned short start_id, unsigned char max_attribute_ids,
5834 zb_zcl_global_discover_attr_rsp cb, void *user_data)
5837 zbl_req_cb_s *container;
5839 int result = ZIGBEE_ERROR_NONE;
5840 GVariant *variant = NULL;
5841 GError *dbus_err = NULL;
5843 #ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
5844 zb_event_global_default_rsp_s *global_req = NULL;
5847 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
5848 RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
5850 DBG("zbl_discover_attr_req()");
5852 container = calloc(1, sizeof(zbl_req_cb_s));
5853 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
5855 to = zbl_dbus_get_timeout(zcl_global_proxy);
5856 sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
5857 ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "discover_attribute_rsp",
5858 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
5859 _zbl_response_cb, container, _zbl_request_cleanup);
5862 ERR("g_dbus_connection_signal_subscribe() Fail");
5864 return ZIGBEE_ERROR_IO_ERROR;
5868 container->sid = sub_id;
5869 container->cid = ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_REQ;
5870 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
5871 container->userdata = user_data;
5872 #ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
5873 global_req = calloc(1, sizeof(zb_event_global_default_rsp_s));
5874 if (NULL == global_req) {
5875 g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id);
5876 g_source_remove(container->tid);
5879 ERR("calloc() Fail(%d)", errno);
5880 return ZIGBEE_ERROR_OUT_OF_MEMORY;
5882 global_req->ep = dest_ep;
5883 global_req->cluster_id = cluster_id;
5884 global_req->command_id = ZB_ZCL_DISCOVER_ATTRIBUTES_COMMAND_ID;
5886 container->global_cmd = global_req;
5887 container->handle = handle;
5889 /* Register global request information into handle */
5890 _zbl_register_global_req(handle, container);
5893 variant = g_dbus_proxy_call_sync(zcl_global_proxy, "discover_attributes",
5894 g_variant_new("(qyyqqy)",
5895 addr16, dest_ep, zcl_frame_ctl, cluster_id, start_id, max_attribute_ids),
5896 G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
5899 ERR("Failed to get 'discover_attributes' [%s]", dbus_err->message);
5900 g_error_free(dbus_err);
5901 return ZIGBEE_ERROR_IO_ERROR;
5904 g_variant_get(variant, "(i)", &result);
5905 DBG("ret = [0x%x]", result);
5906 g_variant_unref(variant);
5911 int zbl_discover_cmds_gen(zigbee_h handle, nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep,
5912 unsigned char zcl_frame_ctl, unsigned short cluster_id, unsigned char start_command_id,
5913 unsigned char max_command_ids, zb_zcl_global_discover_cmds_rsp cb, void *user_data)
5916 zbl_req_cb_s *container;
5918 int result = ZIGBEE_ERROR_NONE;
5919 GVariant *variant = NULL;
5920 GError *dbus_err = NULL;
5922 #ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
5923 zb_event_global_default_rsp_s *global_req = NULL;
5926 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
5927 RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
5929 DBG("zbl_discover_attr_gen()");
5931 container = calloc(1, sizeof(zbl_req_cb_s));
5932 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
5934 to = zbl_dbus_get_timeout(zcl_global_proxy);
5935 sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
5936 ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "discover_commands_generated_rsp",
5937 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container,
5938 _zbl_request_cleanup);
5941 ERR("g_dbus_connection_signal_subscribe() Fail");
5943 return ZIGBEE_ERROR_IO_ERROR;
5947 container->sid = sub_id;
5948 container->cid = ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_GENERATED_REQ;
5949 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
5950 container->userdata = user_data;
5951 #ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
5952 global_req = calloc(1, sizeof(zb_event_global_default_rsp_s));
5953 if (NULL == global_req) {
5954 g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id);
5955 g_source_remove(container->tid);
5958 ERR("calloc() Fail(%d)", errno);
5959 return ZIGBEE_ERROR_OUT_OF_MEMORY;
5961 global_req->ep = dst_ep;
5962 global_req->cluster_id = cluster_id;
5963 global_req->command_id = ZB_ZCL_DISCOVER_COMMANDS_GENERATED_COMMAND_ID;
5965 container->global_cmd = global_req;
5966 container->handle = handle;
5968 /* Register global request information into handle */
5969 _zbl_register_global_req(handle, container);
5972 variant = g_dbus_proxy_call_sync(zcl_global_proxy, "discover_commands_generated",
5973 g_variant_new("(qyyqqy)", addr16, dst_ep, zcl_frame_ctl, cluster_id,
5974 start_command_id, max_command_ids), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
5977 ERR("Failed to get 'discover_commands_received' [%s]", dbus_err->message);
5978 g_error_free(dbus_err);
5979 return ZIGBEE_ERROR_IO_ERROR;
5982 g_variant_get(variant, "(i)", &result);
5983 DBG("ret = [0x%x]", result);
5984 g_variant_unref(variant);
5989 int zbl_discover_cmds_recv(zigbee_h handle, nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep,
5990 unsigned char zcl_frame_ctl, unsigned short cluster_id, unsigned char start_command_id,
5991 unsigned char max_command_ids, zb_zcl_global_discover_cmds_rsp cb, void *user_data)
5994 zbl_req_cb_s *container;
5996 int result = ZIGBEE_ERROR_NONE;
5997 GVariant *variant = NULL;
5998 GError *dbus_err = NULL;
6000 #ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
6001 zb_event_global_default_rsp_s *global_req = NULL;
6004 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
6005 RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
6007 DBG("zbl_discover_cmds_recv()");
6009 container = calloc(1, sizeof(zbl_req_cb_s));
6010 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
6012 to = zbl_dbus_get_timeout(zcl_global_proxy);
6013 sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
6014 ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "discover_commands_received_rsp",
6015 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container,
6016 _zbl_request_cleanup);
6019 ERR("g_dbus_connection_signal_subscribe() Fail");
6021 return ZIGBEE_ERROR_IO_ERROR;
6025 container->sid = sub_id;
6026 container->cid = ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_RECEIVED_REQ;
6027 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
6028 container->userdata = user_data;
6029 #ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
6030 global_req = calloc(1, sizeof(zb_event_global_default_rsp_s));
6031 if (NULL == global_req) {
6032 g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id);
6033 g_source_remove(container->tid);
6036 ERR("calloc() Fail(%d)", errno);
6037 return ZIGBEE_ERROR_OUT_OF_MEMORY;
6039 global_req->ep = dst_ep;
6040 global_req->cluster_id = cluster_id;
6041 global_req->command_id = ZB_ZCL_DISCOVER_COMMANDS_RECEIVED_COMMAND_ID;
6043 container->global_cmd = global_req;
6044 container->handle = handle;
6046 /* Register global request information into handle */
6047 _zbl_register_global_req(handle, container);
6050 variant = g_dbus_proxy_call_sync(zcl_global_proxy, "discover_commands_received",
6051 g_variant_new("(qyyqqy)", addr16, dst_ep, zcl_frame_ctl, cluster_id,
6052 start_command_id, max_command_ids), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
6055 ERR("Failed to get 'discover_commands_received' [%s]", dbus_err->message);
6056 g_error_free(dbus_err);
6057 return ZIGBEE_ERROR_IO_ERROR;
6060 g_variant_get(variant, "(i)", &result);
6061 DBG("ret = [0x%x]", result);
6062 g_variant_unref(variant);
6067 int zbl_discover_attr_ext(zigbee_h handle, nwk_addr addr16, unsigned char src_ep,
6068 unsigned char dst_ep, unsigned char zcl_frame_ctl, unsigned short cluster_id,
6069 unsigned short start_id, unsigned char max_attribute_ids,
6070 zb_zcl_global_discover_attr_extended_rsp cb, void *user_data)
6073 zbl_req_cb_s *container;
6075 int result = ZIGBEE_ERROR_NONE;
6076 GVariant *variant = NULL;
6077 GError *dbus_err = NULL;
6079 #ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
6080 zb_event_global_default_rsp_s *global_req = NULL;
6083 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
6084 RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
6086 DBG("zbl_discover_attr_ext()");
6088 container = calloc(1, sizeof(zbl_req_cb_s));
6089 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
6091 to = zbl_dbus_get_timeout(zcl_global_proxy);
6092 sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
6093 ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "discover_attributes_extended_rsp",
6094 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container,
6095 _zbl_request_cleanup);
6098 ERR("g_dbus_connection_signal_subscribe() Fail");
6100 return ZIGBEE_ERROR_IO_ERROR;
6104 container->sid = sub_id;
6105 container->cid = ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_EXTENDED_REQ;
6106 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
6107 container->userdata = user_data;
6108 #ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
6109 global_req = calloc(1, sizeof(zb_event_global_default_rsp_s));
6110 if (NULL == global_req) {
6111 g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id);
6112 g_source_remove(container->tid);
6115 ERR("calloc() Fail(%d)", errno);
6116 return ZIGBEE_ERROR_OUT_OF_MEMORY;
6118 global_req->ep = dst_ep;
6119 global_req->cluster_id = cluster_id;
6120 global_req->command_id = ZB_ZCL_DISCOVER_ATTRIBUTES_EXTENDED_COMMAND_ID;
6122 container->global_cmd = global_req;
6123 container->handle = handle;
6125 /* Register global request information into handle */
6126 _zbl_register_global_req(handle, container);
6129 variant = g_dbus_proxy_call_sync(zcl_global_proxy, "discover_attributes_extended",
6130 g_variant_new("(qyyqqy)", addr16, dst_ep, zcl_frame_ctl, cluster_id, start_id,
6131 max_attribute_ids), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
6134 ERR("Failed to get 'discover_attributes_extended' [%s]", dbus_err->message);
6135 g_error_free(dbus_err);
6136 return ZIGBEE_ERROR_IO_ERROR;
6139 g_variant_get(variant, "(i)", &result);
6140 DBG("ret = [0x%x]", result);
6141 g_variant_unref(variant);
6146 int zbl_reset_alarm(nwk_addr addr16, unsigned char ep, unsigned char alarm_code,
6147 unsigned short cluster_id)
6149 int result = ZIGBEE_ERROR_NONE;
6150 GVariant *variant = NULL;
6151 GError *dbus_err = NULL;
6153 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
6154 RETV_IF(NULL == alarm_gproxy, ZIGBEE_ERROR_IO_ERROR);
6156 variant = g_dbus_proxy_call_sync(alarm_gproxy, "reset_alarm",
6157 g_variant_new("(qyyq)", addr16, ep, alarm_code, cluster_id),
6158 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
6161 ERR("Failed to get 'reset_alarm' [%s]", dbus_err->message);
6162 g_error_free(dbus_err);
6163 return ZIGBEE_ERROR_IO_ERROR;
6166 g_variant_get(variant, "(i)", &result);
6167 DBG("ret = [0x%x]", result);
6168 g_variant_unref(variant);
6173 int zbl_reset_all_alarm(nwk_addr addr16, unsigned char ep)
6175 int result = ZIGBEE_ERROR_NONE;
6176 GVariant *variant = NULL;
6177 GError *dbus_err = NULL;
6179 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
6180 RETV_IF(NULL == alarm_gproxy, ZIGBEE_ERROR_IO_ERROR);
6182 variant = g_dbus_proxy_call_sync(alarm_gproxy, "reset_all_alarm",
6183 g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
6186 ERR("Failed to get 'reset_all_alarm' [%s]", dbus_err->message);
6187 g_error_free(dbus_err);
6188 return ZIGBEE_ERROR_IO_ERROR;
6191 g_variant_get(variant, "(i)", &result);
6192 DBG("ret = [0x%x]", result);
6193 g_variant_unref(variant);
6198 int zbl_get_alarm(nwk_addr addr16, unsigned char ep, zb_zcl_alarm_get_alarm_rsp cb,
6202 zbl_req_cb_s *container;
6204 int result = ZIGBEE_ERROR_NONE;
6205 GVariant *variant = NULL;
6206 GError *dbus_err = NULL;
6208 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
6209 RETV_IF(NULL == alarm_gproxy, ZIGBEE_ERROR_IO_ERROR);
6211 DBG("zbl_get_alarm()");
6213 container = calloc(1, sizeof(zbl_req_cb_s));
6214 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
6216 to = zbl_dbus_get_timeout(alarm_gproxy);
6217 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
6218 ZIGBEE_ZCL_ALARM_INTERFACE, "get_alarm_rsp", ZIGBEE_CONTROL_OBJECT_PATH,
6219 NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup);
6222 ERR("g_dbus_connection_signal_subscribe() Fail");
6224 return ZIGBEE_ERROR_IO_ERROR;
6228 container->sid = sub_id;
6229 container->cid = ZBL_ZCL_ALARM_GET_ALARM_REQ;
6230 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
6231 container->userdata = user_data;
6233 variant = g_dbus_proxy_call_sync(alarm_gproxy, "get_alarm",
6234 g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
6237 ERR("Failed to get 'get_alarm' [%s]", dbus_err->message);
6238 g_error_free(dbus_err);
6239 return ZIGBEE_ERROR_IO_ERROR;
6242 g_variant_get(variant, "(i)", &result);
6243 DBG("ret = [0x%x]", result);
6244 g_variant_unref(variant);
6249 int zbl_reset_all_alarm_log(nwk_addr addr16, unsigned char ep)
6251 int result = ZIGBEE_ERROR_NONE;
6252 GVariant *variant = NULL;
6253 GError *dbus_err = NULL;
6255 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
6256 RETV_IF(NULL == alarm_gproxy, ZIGBEE_ERROR_IO_ERROR);
6258 variant = g_dbus_proxy_call_sync(alarm_gproxy, "reset_alarm_log",
6259 g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
6262 ERR("Failed to get 'reset_alarm_log' [%s]", dbus_err->message);
6263 g_error_free(dbus_err);
6264 return ZIGBEE_ERROR_IO_ERROR;
6267 g_variant_get(variant, "(i)", &result);
6268 DBG("ret = [0x%x]", result);
6269 g_variant_unref(variant);
6274 int zbl_ccontrol_move_to_hue(nwk_addr addr16, unsigned char ep,
6275 unsigned char hue, unsigned char direction,
6276 unsigned short transition_time)
6278 int result = ZIGBEE_ERROR_NONE;
6279 GVariant *variant = NULL;
6280 GError *dbus_err = NULL;
6282 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
6283 RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
6285 variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_to_hue",
6286 g_variant_new("(qyyyq)", addr16, ep, hue, direction, transition_time),
6287 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
6290 ERR("Failed to get 'move_to_hue' [%s]", dbus_err->message);
6291 g_error_free(dbus_err);
6292 return ZIGBEE_ERROR_IO_ERROR;
6295 g_variant_get(variant, "(i)", &result);
6296 DBG("ret = [0x%x]", result);
6297 g_variant_unref(variant);
6303 int zbl_ccontrol_move_hue(nwk_addr addr16, unsigned char ep,
6304 unsigned char move_mode, unsigned char rate)
6306 int result = ZIGBEE_ERROR_NONE;
6307 GVariant *variant = NULL;
6308 GError *dbus_err = NULL;
6310 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
6311 RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
6313 variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_hue",
6314 g_variant_new("(qyyy)", addr16, ep, move_mode, rate),
6315 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
6318 ERR("Failed to get 'move_hue' [%s]", dbus_err->message);
6319 g_error_free(dbus_err);
6320 return ZIGBEE_ERROR_IO_ERROR;
6323 g_variant_get(variant, "(i)", &result);
6324 DBG("ret = [0x%x]", result);
6325 g_variant_unref(variant);
6330 int zbl_ccontrol_step_hue(nwk_addr addr16, unsigned char ep,
6331 unsigned char step_mode, unsigned char step_size,
6332 unsigned char transition_time)
6334 int result = ZIGBEE_ERROR_NONE;
6335 GVariant *variant = NULL;
6336 GError *dbus_err = NULL;
6338 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
6339 RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
6341 variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "step_hue",
6342 g_variant_new("(qyyyy)", addr16, ep, step_mode, step_size, transition_time),
6343 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
6346 ERR("Failed to get 'step_hue' [%s]", dbus_err->message);
6347 g_error_free(dbus_err);
6348 return ZIGBEE_ERROR_IO_ERROR;
6351 g_variant_get(variant, "(i)", &result);
6352 DBG("ret = [0x%x]", result);
6353 g_variant_unref(variant);
6358 int zbl_ccontrol_move_to_saturation(nwk_addr addr16, unsigned char ep,
6359 unsigned char saturation, unsigned short transition_time)
6361 int result = ZIGBEE_ERROR_NONE;
6362 GVariant *variant = NULL;
6363 GError *dbus_err = NULL;
6365 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
6366 RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
6368 variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_to_saturation",
6369 g_variant_new("(qyyq)", addr16, ep, saturation, transition_time),
6370 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
6373 ERR("Failed to get 'move_to_saturation' [%s]", dbus_err->message);
6374 g_error_free(dbus_err);
6375 return ZIGBEE_ERROR_IO_ERROR;
6378 g_variant_get(variant, "(i)", &result);
6379 DBG("ret = [0x%x]", result);
6380 g_variant_unref(variant);
6385 int zbl_ccontrol_move_saturation(nwk_addr addr16, unsigned char ep,
6386 unsigned char move_mode, unsigned char rate)
6388 int result = ZIGBEE_ERROR_NONE;
6389 GVariant *variant = NULL;
6390 GError *dbus_err = NULL;
6392 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
6393 RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
6395 variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_saturation",
6396 g_variant_new("(qyyy)", addr16, ep, move_mode, rate),
6397 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
6400 ERR("Failed to get 'move_saturation' [%s]", dbus_err->message);
6401 g_error_free(dbus_err);
6402 return ZIGBEE_ERROR_IO_ERROR;
6405 g_variant_get(variant, "(i)", &result);
6406 DBG("ret = [0x%x]", result);
6407 g_variant_unref(variant);
6412 int zbl_ccontrol_step_saturation(nwk_addr addr16, unsigned char ep,
6413 unsigned char step_mode, unsigned char step_size,
6414 unsigned char transition_time)
6416 int result = ZIGBEE_ERROR_NONE;
6417 GVariant *variant = NULL;
6418 GError *dbus_err = NULL;
6420 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
6421 RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
6423 variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "step_saturation",
6424 g_variant_new("(qyyyy)", addr16, ep, step_mode, step_size, transition_time),
6425 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
6428 ERR("Failed to get 'step_saturation' [%s]", dbus_err->message);
6429 g_error_free(dbus_err);
6430 return ZIGBEE_ERROR_IO_ERROR;
6433 g_variant_get(variant, "(i)", &result);
6434 DBG("ret = [0x%x]", result);
6435 g_variant_unref(variant);
6440 int zbl_ccontrol_move_to_hue_and_saturation(nwk_addr addr16, unsigned char ep,
6441 unsigned char hue, unsigned char saturation,
6442 unsigned short transition_time)
6444 int result = ZIGBEE_ERROR_NONE;
6445 GVariant *variant = NULL;
6446 GError *dbus_err = NULL;
6448 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
6449 RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
6451 variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_to_hue_and_saturation",
6452 g_variant_new("(qyyyq)", addr16, ep, hue, saturation, transition_time),
6453 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
6456 ERR("Failed to get 'move_to_hue_and_saturation' [%s]", dbus_err->message);
6457 g_error_free(dbus_err);
6458 return ZIGBEE_ERROR_IO_ERROR;
6461 g_variant_get(variant, "(i)", &result);
6462 DBG("ret = [0x%x]", result);
6463 g_variant_unref(variant);
6468 int zbl_ccontrol_move_to_color(nwk_addr addr16, unsigned char ep,
6469 unsigned short color_x, unsigned short color_y,
6470 unsigned short transition_time)
6472 int result = ZIGBEE_ERROR_NONE;
6473 GVariant *variant = NULL;
6474 GError *dbus_err = NULL;
6476 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
6477 RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
6479 variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_to_color",
6480 g_variant_new("(qyqqq)", addr16, ep, color_x, color_y, transition_time),
6481 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
6484 ERR("Failed to get 'move_to_color' [%s]", dbus_err->message);
6485 g_error_free(dbus_err);
6486 return ZIGBEE_ERROR_IO_ERROR;
6489 g_variant_get(variant, "(i)", &result);
6490 DBG("ret = [0x%x]", result);
6491 g_variant_unref(variant);
6496 int zbl_ccontrol_move_color(nwk_addr addr16, unsigned char ep,
6497 unsigned short rate_x, unsigned short rate_y)
6499 int result = ZIGBEE_ERROR_NONE;
6500 GVariant *variant = NULL;
6501 GError *dbus_err = NULL;
6503 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
6504 RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
6506 variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_color",
6507 g_variant_new("(qyqq)", addr16, ep, rate_x, rate_y),
6508 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
6511 ERR("Failed to get 'move_color' [%s]", dbus_err->message);
6512 g_error_free(dbus_err);
6513 return ZIGBEE_ERROR_IO_ERROR;
6516 g_variant_get(variant, "(i)", &result);
6517 DBG("ret = [0x%x]", result);
6518 g_variant_unref(variant);
6523 int zbl_ccontrol_step_color(nwk_addr addr16, unsigned char ep,
6524 unsigned short step_x, unsigned short step_y,
6525 unsigned short transition_time)
6527 int result = ZIGBEE_ERROR_NONE;
6528 GVariant *variant = NULL;
6529 GError *dbus_err = NULL;
6531 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
6532 RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
6534 variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "step_color",
6535 g_variant_new("(qyqqq)", addr16, ep, step_x, step_y, transition_time),
6536 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
6539 ERR("Failed to get 'step_color' [%s]", dbus_err->message);
6540 g_error_free(dbus_err);
6541 return ZIGBEE_ERROR_IO_ERROR;
6544 g_variant_get(variant, "(i)", &result);
6545 DBG("ret = [0x%x]", result);
6546 g_variant_unref(variant);
6551 int zbl_ccontrol_move_to_color_temperature(nwk_addr addr16, unsigned char ep,
6552 unsigned short color_temperature,
6553 unsigned short transition_time)
6555 int result = ZIGBEE_ERROR_NONE;
6556 GVariant *variant = NULL;
6557 GError *dbus_err = NULL;
6559 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
6560 RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
6562 variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_color_temperature",
6563 g_variant_new("(qyqq)", addr16, ep, color_temperature, transition_time),
6564 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
6567 ERR("Failed to get 'move_color_temperature' [%s]", dbus_err->message);
6568 g_error_free(dbus_err);
6569 return ZIGBEE_ERROR_IO_ERROR;
6572 g_variant_get(variant, "(i)", &result);
6573 DBG("ret = [0x%x]", result);
6574 g_variant_unref(variant);
6579 int zbl_reset_factory_default(nwk_addr addr16, unsigned char ep)
6581 int result = ZIGBEE_ERROR_NONE;
6582 GVariant *variant = NULL;
6583 GError *dbus_err = NULL;
6585 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
6586 RETV_IF(NULL == zcl_basic_proxy, ZIGBEE_ERROR_IO_ERROR);
6588 variant = g_dbus_proxy_call_sync(zcl_basic_proxy, "reset_factory_default",
6589 g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
6592 ERR("Failed to get 'reset_factory_default' [%s]", dbus_err->message);
6593 g_error_free(dbus_err);
6594 return ZIGBEE_ERROR_IO_ERROR;
6597 g_variant_get(variant, "(i)", &result);
6598 DBG("ret = [0x%x]", result);
6599 g_variant_unref(variant);
6604 int zbl_identify(nwk_addr addr16, unsigned char dst_ep, unsigned short identify_time)
6606 int result = ZIGBEE_ERROR_NONE;
6607 GVariant *variant = NULL;
6608 GError *dbus_err = NULL;
6610 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
6611 RETV_IF(NULL == zcl_identify_proxy, ZIGBEE_ERROR_IO_ERROR);
6613 variant = g_dbus_proxy_call_sync(zcl_identify_proxy, "identify",
6614 g_variant_new("(qyq)", addr16, dst_ep, identify_time),
6615 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
6618 ERR("Failed to get 'identify' [%s]", dbus_err->message);
6619 g_error_free(dbus_err);
6620 return ZIGBEE_ERROR_IO_ERROR;
6623 g_variant_get(variant, "(i)", &result);
6624 DBG("ret = [0x%x]", result);
6625 g_variant_unref(variant);
6630 int zbl_identify_query(nwk_addr addr16, unsigned char dst_ep,
6631 zb_zcl_identify_query_cb cb, void *user_data)
6633 int result = ZIGBEE_ERROR_NONE;
6634 GVariant *variant = NULL;
6635 GError *dbus_err = NULL;
6638 zbl_req_cb_s *container;
6640 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
6641 RETV_IF(NULL == zcl_identify_proxy, ZIGBEE_ERROR_IO_ERROR);
6643 DBG("zbl_identify_query()");
6645 container = calloc(1, sizeof(zbl_req_cb_s));
6646 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
6648 to = zbl_dbus_get_timeout(zcl_identify_proxy);
6649 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
6650 ZIGBEE_ZCL_IDENTIFY_INTERFACE, "query_rsp", ZIGBEE_CONTROL_OBJECT_PATH,
6651 NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup);
6654 ERR("g_dbus_connection_signal_subscribe() Fail");
6656 return ZIGBEE_ERROR_IO_ERROR;
6660 container->sid = sub_id;
6661 container->cid = ZBL_ZCL_IDENTIFY_QUERY_REQ;
6662 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
6663 container->userdata = user_data;
6665 variant = g_dbus_proxy_call_sync(zcl_identify_proxy, "query",
6666 g_variant_new("(qy)", addr16, dst_ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
6669 ERR("Failed to get 'query' [%s]", dbus_err->message);
6670 g_error_free(dbus_err);
6671 return ZIGBEE_ERROR_IO_ERROR;
6674 g_variant_get(variant, "(i)", &result);
6675 DBG("ret = [0x%x]", result);
6676 g_variant_unref(variant);
6681 int zbl_add_group(nwk_addr addr16, unsigned char ep, unsigned short group_id,
6682 const char *group_name, zb_zcl_group_add_group_rsp cb, void *user_data)
6684 int result = ZIGBEE_ERROR_NONE;
6685 GVariant *variant = NULL;
6686 GError *dbus_err = NULL;
6689 zbl_req_cb_s *container;
6692 GVariant *groupname_variant = NULL;
6693 GVariantBuilder *groupname_builder = NULL;
6695 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
6696 RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR);
6698 DBG("zbl_add_group()");
6700 container = calloc(1, sizeof(zbl_req_cb_s));
6701 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
6703 to = zbl_dbus_get_timeout(zcl_group_proxy);
6704 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
6705 ZIGBEE_ZCL_GROUP_INTERFACE, "add_group_rsp", ZIGBEE_CONTROL_OBJECT_PATH,
6706 NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup);
6709 ERR("g_dbus_connection_signal_subscribe() Fail");
6711 return ZIGBEE_ERROR_IO_ERROR;
6715 container->sid = sub_id;
6716 container->cid = ZBL_ZCL_GROUP_ADD_GROUP_REQ;
6717 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
6718 container->userdata = user_data;
6720 groupname_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
6721 while (group_name[j] != '\0') {
6722 g_variant_builder_add(groupname_builder, "(y)", (group_name[j]));
6725 groupname_variant = g_variant_builder_end(groupname_builder);
6726 g_variant_builder_unref(groupname_builder);
6728 variant = g_dbus_proxy_call_sync(zcl_group_proxy, "add_group",
6729 g_variant_new("(qyq@a(y))", addr16, ep, group_id, groupname_variant),
6730 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
6733 ERR("Failed to get 'add_group' [%s]", dbus_err->message);
6734 g_error_free(dbus_err);
6735 return ZIGBEE_ERROR_IO_ERROR;
6738 g_variant_get(variant, "(i)", &result);
6739 DBG("ret = [0x%x]", result);
6740 g_variant_unref(variant);
6745 int zbl_view_group(nwk_addr addr16, unsigned char ep, unsigned short group_id,
6746 zb_zcl_group_view_group_rsp cb, void *user_data)
6748 int result = ZIGBEE_ERROR_NONE;
6749 GVariant *variant = NULL;
6750 GError *dbus_err = NULL;
6753 zbl_req_cb_s *container;
6755 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
6756 RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR);
6758 DBG("zbl_view_group()");
6760 container = calloc(1, sizeof(zbl_req_cb_s));
6761 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
6763 to = zbl_dbus_get_timeout(zcl_group_proxy);
6764 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
6765 ZIGBEE_ZCL_GROUP_INTERFACE, "view_group_rsp", ZIGBEE_CONTROL_OBJECT_PATH,
6766 NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup);
6769 ERR("g_dbus_connection_signal_subscribe() Fail");
6771 return ZIGBEE_ERROR_IO_ERROR;
6775 container->sid = sub_id;
6776 container->cid = ZBL_ZCL_GROUP_VIEW_GROUP_REQ;
6777 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
6778 container->userdata = user_data;
6780 variant = g_dbus_proxy_call_sync(zcl_group_proxy, "view_group",
6781 g_variant_new("(qyq)", addr16, ep, group_id),
6782 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
6785 ERR("Failed to get 'view_group' [%s]", dbus_err->message);
6786 g_error_free(dbus_err);
6787 return ZIGBEE_ERROR_IO_ERROR;
6790 g_variant_get(variant, "(i)", &result);
6791 DBG("ret = [0x%x]", result);
6792 g_variant_unref(variant);
6797 int zbl_group_get_group_membership(nwk_addr addr16, unsigned char ep,
6798 unsigned char group_count, unsigned short *group_list,
6799 zb_zcl_group_get_group_membership_rsp cb, void *user_data)
6801 int result = ZIGBEE_ERROR_NONE;
6802 GVariant *variant = NULL;
6803 GError *dbus_err = NULL;
6806 zbl_req_cb_s *container;
6809 GVariant *grouplist_variant = NULL;
6810 GVariantBuilder *grouplist_builder = NULL;
6812 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
6813 RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR);
6815 DBG("zbl_group_get_group_membership()");
6817 container = calloc(1, sizeof(zbl_req_cb_s));
6818 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
6820 to = zbl_dbus_get_timeout(zcl_group_proxy);
6821 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
6822 ZIGBEE_ZCL_GROUP_INTERFACE, "get_group_membership_rsp",
6823 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb,
6824 container, _zbl_request_cleanup);
6827 ERR("g_dbus_connection_signal_subscribe() Fail");
6829 return ZIGBEE_ERROR_IO_ERROR;
6833 container->sid = sub_id;
6834 container->cid = ZBL_ZCL_GROUP_GET_GROUP_MEMBERSHIP_REQ;
6835 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
6836 container->userdata = user_data;
6838 grouplist_builder = g_variant_builder_new(G_VARIANT_TYPE("aq"));
6839 while (j < group_count) {
6840 g_variant_builder_add(grouplist_builder, "q", group_list[j]);
6843 grouplist_variant = g_variant_builder_end(grouplist_builder);
6844 g_variant_builder_unref(grouplist_builder);
6846 variant = g_dbus_proxy_call_sync(zcl_group_proxy, "get_group_membership",
6847 g_variant_new("(qyy@aq)", addr16, ep, group_count, grouplist_variant),
6848 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
6851 ERR("Failed to get 'get_group_membership' [%s]", dbus_err->message);
6852 g_error_free(dbus_err);
6853 return ZIGBEE_ERROR_IO_ERROR;
6856 g_variant_get(variant, "(i)", &result);
6857 DBG("ret = [0x%x]", result);
6858 g_variant_unref(variant);
6863 int zbl_remove_group(nwk_addr addr16, unsigned char ep, unsigned short group_id,
6864 zb_zcl_group_remove_group_rsp cb, void *user_data)
6866 int result = ZIGBEE_ERROR_NONE;
6867 GVariant *variant = NULL;
6868 GError *dbus_err = NULL;
6871 zbl_req_cb_s *container;
6873 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
6874 RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR);
6876 DBG("zbl_group_remove_group()");
6878 container = calloc(1, sizeof(zbl_req_cb_s));
6879 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
6881 to = zbl_dbus_get_timeout(zcl_group_proxy);
6882 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
6883 ZIGBEE_ZCL_GROUP_INTERFACE, "remove_group_rsp", ZIGBEE_CONTROL_OBJECT_PATH,
6884 NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup);
6887 ERR("g_dbus_connection_signal_subscribe() Fail");
6889 return ZIGBEE_ERROR_IO_ERROR;
6893 container->sid = sub_id;
6894 container->cid = ZBL_ZCL_GROUP_REMOVE_GROUP_REQ;
6895 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
6896 container->userdata = user_data;
6898 variant = g_dbus_proxy_call_sync(zcl_group_proxy, "remove_group", g_variant_new("(qyq)",
6899 addr16, ep, group_id), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
6902 ERR("Failed to get 'remove_group' [%s]", dbus_err->message);
6903 g_error_free(dbus_err);
6904 return ZIGBEE_ERROR_IO_ERROR;
6907 g_variant_get(variant, "(i)", &result);
6908 DBG("ret = [0x%x]", result);
6909 g_variant_unref(variant);
6914 int zbl_remove_all_group(nwk_addr addr16, unsigned char ep)
6916 int result = ZIGBEE_ERROR_NONE;
6917 GVariant *variant = NULL;
6918 GError *dbus_err = NULL;
6920 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
6921 RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR);
6923 DBG("zbl_group_remove_all_group()");
6925 variant = g_dbus_proxy_call_sync(zcl_group_proxy, "remove_all_group",
6926 g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
6929 ERR("Failed to get 'remove_all_group' [%s]", dbus_err->message);
6930 g_error_free(dbus_err);
6931 return ZIGBEE_ERROR_IO_ERROR;
6934 g_variant_get(variant, "(i)", &result);
6935 DBG("ret = [0x%x]", result);
6936 g_variant_unref(variant);
6941 int zbl_add_group_if_identifying(nwk_addr addr16, unsigned char ep,
6942 unsigned short group_id, const char *group_name)
6944 int result = ZIGBEE_ERROR_NONE;
6945 GVariant *variant = NULL;
6946 GError *dbus_err = NULL;
6949 GVariant *groupname_variant = NULL;
6950 GVariantBuilder *groupname_builder = NULL;
6952 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
6953 RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR);
6955 groupname_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
6956 while (group_name[j] != '\0') {
6957 g_variant_builder_add(groupname_builder, "(y)", group_name[j]);
6960 groupname_variant = g_variant_builder_end(groupname_builder);
6961 g_variant_builder_unref(groupname_builder);
6963 variant = g_dbus_proxy_call_sync(zcl_group_proxy, "add_group_if_identifying",
6964 g_variant_new("(qyq@a(y))", addr16, ep, group_id, groupname_variant),
6965 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
6968 ERR("Failed to get 'add_group_if_identifying' [%s]", dbus_err->message);
6969 g_error_free(dbus_err);
6970 return ZIGBEE_ERROR_IO_ERROR;
6973 g_variant_get(variant, "(i)", &result);
6974 DBG("ret = [0x%x]", result);
6975 g_variant_unref(variant);
6980 int zbl_level_control_move_to_level(nwk_addr addr16, unsigned char ep,
6981 unsigned char level, unsigned short transition_time)
6983 int result = ZIGBEE_ERROR_NONE;
6984 GVariant *variant = NULL;
6985 GError *dbus_err = NULL;
6987 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
6988 RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR);
6990 DBG("zbl_level_control_move_to_level()");
6992 variant = g_dbus_proxy_call_sync(level_control_gproxy, "move_to_level",
6993 g_variant_new("(qyyq)", addr16, ep, level, transition_time),
6994 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
6997 ERR("Failed to get 'move_to_level' [%s]", dbus_err->message);
6998 g_error_free(dbus_err);
6999 return ZIGBEE_ERROR_IO_ERROR;
7002 g_variant_get(variant, "(i)", &result);
7003 DBG("ret = [0x%x]", result);
7004 g_variant_unref(variant);
7009 int zbl_level_control_move(nwk_addr addr16, unsigned char ep,
7010 unsigned char move_mode, unsigned char rate)
7012 int result = ZIGBEE_ERROR_NONE;
7013 GVariant *variant = NULL;
7014 GError *dbus_err = NULL;
7016 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
7017 RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR);
7019 DBG("zbl_level_control_move()");
7021 variant = g_dbus_proxy_call_sync(level_control_gproxy, "move",
7022 g_variant_new("(qyyy)", addr16, ep, move_mode, rate),
7023 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
7026 ERR("Failed to get 'move' [%s]", dbus_err->message);
7027 g_error_free(dbus_err);
7028 return ZIGBEE_ERROR_IO_ERROR;
7031 g_variant_get(variant, "(i)", &result);
7032 DBG("ret = [0x%x]", result);
7033 g_variant_unref(variant);
7038 int zbl_level_control_step(nwk_addr addr16, unsigned char ep,
7039 unsigned char step_mode, unsigned char step_size,
7040 unsigned short transition_time)
7042 int result = ZIGBEE_ERROR_NONE;
7043 GVariant *variant = NULL;
7044 GError *dbus_err = NULL;
7046 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
7047 RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR);
7049 DBG("zbl_level_control_step()");
7051 variant = g_dbus_proxy_call_sync(level_control_gproxy, "step",
7052 g_variant_new("(qyyyq)", addr16, ep, step_mode, step_size, transition_time),
7053 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
7056 ERR("Failed to get 'step' [%s]", dbus_err->message);
7057 g_error_free(dbus_err);
7058 return ZIGBEE_ERROR_IO_ERROR;
7061 g_variant_get(variant, "(i)", &result);
7062 DBG("ret = [0x%x]", result);
7063 g_variant_unref(variant);
7068 int zbl_level_control_stop(nwk_addr addr16, unsigned char ep)
7070 int result = ZIGBEE_ERROR_NONE;
7071 GVariant *variant = NULL;
7072 GError *dbus_err = NULL;
7074 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
7075 RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR);
7077 DBG("zbl_level_control_stop()");
7079 variant = g_dbus_proxy_call_sync(level_control_gproxy, "stop",
7080 g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
7083 ERR("Failed to get 'stop' [%s]", dbus_err->message);
7084 g_error_free(dbus_err);
7085 return ZIGBEE_ERROR_IO_ERROR;
7088 g_variant_get(variant, "(i)", &result);
7089 DBG("ret = [0x%x]", result);
7090 g_variant_unref(variant);
7095 int zbl_level_control_move_to_level_with_on_off(nwk_addr addr16,
7096 unsigned char ep, unsigned char level, unsigned short transition_time)
7098 int result = ZIGBEE_ERROR_NONE;
7099 GVariant *variant = NULL;
7100 GError *dbus_err = NULL;
7102 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
7103 RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR);
7105 DBG("zbl_level_control_move_to_level_with_on_off()");
7107 variant = g_dbus_proxy_call_sync(level_control_gproxy, "move_to_level_with_on_off",
7108 g_variant_new("(qyyq)", addr16, ep, level, transition_time),
7109 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
7112 ERR("Failed to get 'move_to_level_with_on_off' [%s]", dbus_err->message);
7113 g_error_free(dbus_err);
7114 return ZIGBEE_ERROR_IO_ERROR;
7117 g_variant_get(variant, "(i)", &result);
7118 DBG("ret = [0x%x]", result);
7119 g_variant_unref(variant);
7124 int zbl_level_control_move_with_on_off(nwk_addr addr16, unsigned char ep,
7125 unsigned char move_mode, unsigned char rate)
7127 int result = ZIGBEE_ERROR_NONE;
7128 GVariant *variant = NULL;
7129 GError *dbus_err = NULL;
7131 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
7132 RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR);
7134 DBG("zbl_level_control_move_with_on_off()");
7136 variant = g_dbus_proxy_call_sync(level_control_gproxy, "move_with_on_off",
7137 g_variant_new("(qyyy)", addr16, ep, move_mode, rate),
7138 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
7141 ERR("Failed to get 'move_with_on_off' [%s]", dbus_err->message);
7142 g_error_free(dbus_err);
7143 return ZIGBEE_ERROR_IO_ERROR;
7146 g_variant_get(variant, "(i)", &result);
7147 DBG("ret = [0x%x]", result);
7148 g_variant_unref(variant);
7153 int zbl_level_control_step_with_on_off(nwk_addr addr16, unsigned char ep,
7154 unsigned char step_mode, unsigned char step_size,
7155 unsigned short transition_time)
7157 int result = ZIGBEE_ERROR_NONE;
7158 GVariant *variant = NULL;
7159 GError *dbus_err = NULL;
7161 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
7162 RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR);
7164 DBG("zbl_level_control_step_with_on_off()");
7166 variant = g_dbus_proxy_call_sync(level_control_gproxy, "step_with_on_off",
7167 g_variant_new("(qyyyq)", addr16, ep, step_mode, step_size, transition_time),
7168 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
7171 ERR("Failed to get 'step_with_on_off' [%s]", dbus_err->message);
7172 g_error_free(dbus_err);
7173 return ZIGBEE_ERROR_IO_ERROR;
7176 g_variant_get(variant, "(i)", &result);
7177 DBG("ret = [0x%x]", result);
7178 g_variant_unref(variant);
7183 int zbl_onoff_set(nwk_addr addr16, unsigned char ep, unsigned char on_off_type)
7185 int result = ZIGBEE_ERROR_NONE;
7186 GVariant *variant = NULL;
7187 GError *dbus_err = NULL;
7189 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
7190 RETV_IF(NULL == on_off_gproxy, ZIGBEE_ERROR_IO_ERROR);
7192 variant = g_dbus_proxy_call_sync(on_off_gproxy, "set_on_off",
7193 g_variant_new("(qyy)", addr16, ep, on_off_type), G_DBUS_CALL_FLAGS_NONE,
7194 -1, NULL, &dbus_err);
7197 ERR("Failed to get 'set_on_off' [%s]", dbus_err->message);
7198 g_error_free(dbus_err);
7199 return ZIGBEE_ERROR_IO_ERROR;
7202 g_variant_get(variant, "(i)", &result);
7203 DBG("ret = [0x%x]", result);
7204 g_variant_unref(variant);
7209 int zbl_zone_enroll_response(nwk_addr addr16, unsigned char dst_ep,
7210 unsigned char enroll_response_code, unsigned char zone_id)
7212 int result = ZIGBEE_ERROR_NONE;
7213 GVariant *variant = NULL;
7214 GError *dbus_err = NULL;
7216 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
7217 RETV_IF(NULL == zcl_ias_zone_proxy, ZIGBEE_ERROR_IO_ERROR);
7219 variant = g_dbus_proxy_call_sync(zcl_ias_zone_proxy, "enroll_response",
7220 g_variant_new("(qyyy)", addr16, dst_ep, enroll_response_code, zone_id),
7221 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
7224 ERR("Failed to get 'enroll_response' [%s]", dbus_err->message);
7225 g_error_free(dbus_err);
7226 return ZIGBEE_ERROR_IO_ERROR;
7229 g_variant_get(variant, "(i)", &result);
7230 DBG("ret = [0x%x]", result);
7231 g_variant_unref(variant);
7236 int zbl_pollcontrol_check_in_response(nwk_addr addr16, unsigned char ep,
7237 unsigned char start_fast_polling, unsigned short fast_poll_timeout)
7239 int result = ZIGBEE_ERROR_NONE;
7240 GVariant *variant = NULL;
7241 GError *dbus_err = NULL;
7243 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
7244 RETV_IF(NULL == zcl_poll_control_proxy, ZIGBEE_ERROR_IO_ERROR);
7246 variant = g_dbus_proxy_call_sync(zcl_poll_control_proxy, "check_in_response",
7247 g_variant_new("(qyyq)", addr16, ep, start_fast_polling, fast_poll_timeout),
7248 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
7251 ERR("Failed to get 'check_in_response' [%s]", dbus_err->message);
7252 g_error_free(dbus_err);
7253 return ZIGBEE_ERROR_IO_ERROR;
7256 g_variant_get(variant, "(i)", &result);
7257 DBG("ret = [0x%x]", result);
7258 g_variant_unref(variant);
7263 int zbl_pollcontrol_fast_poll_stop(nwk_addr addr16, unsigned char ep)
7265 int result = ZIGBEE_ERROR_NONE;
7266 GVariant *variant = NULL;
7267 GError *dbus_err = NULL;
7269 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
7270 RETV_IF(NULL == zcl_poll_control_proxy, ZIGBEE_ERROR_IO_ERROR);
7272 variant = g_dbus_proxy_call_sync(zcl_poll_control_proxy, "fast_poll_stop",
7273 g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
7276 ERR("Failed to get 'fast_poll_stop' [%s]", dbus_err->message);
7277 g_error_free(dbus_err);
7278 return ZIGBEE_ERROR_IO_ERROR;
7281 g_variant_get(variant, "(i)", &result);
7282 DBG("ret = [0x%x]", result);
7283 g_variant_unref(variant);
7288 int zbl_pollcontrol_set_long_poll_interval(nwk_addr addr16, unsigned char ep,
7289 unsigned int new_long_poll_interval, zb_zcl_pollctrl_check_in cb, void *user_data)
7292 zbl_req_cb_s *container;
7294 int result = ZIGBEE_ERROR_NONE;
7295 GVariant *variant = NULL;
7296 GError *dbus_err = NULL;
7298 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
7299 RETV_IF(NULL == zcl_poll_control_proxy, ZIGBEE_ERROR_IO_ERROR);
7301 DBG("zbl_pollcontrol_set_long_poll_interval()");
7303 container = calloc(1, sizeof(zbl_req_cb_s));
7304 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
7306 to = zbl_dbus_get_timeout(zcl_poll_control_proxy);
7307 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
7308 ZIGBEE_ZCL_POLL_CONTROL_INTERFACE, "checkin_response",
7309 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
7310 _zbl_response_cb, container, _zbl_request_cleanup);
7313 ERR("g_dbus_connection_signal_subscribe() Fail");
7315 return ZIGBEE_ERROR_IO_ERROR;
7319 container->sid = sub_id;
7320 container->cid = ZBL_ZCL_POLLCONTROL_SET_POLL_INTERVAL_REQ;
7321 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
7322 container->userdata = user_data;
7324 variant = g_dbus_proxy_call_sync(zcl_poll_control_proxy, "set_long_poll_interval",
7325 g_variant_new("(qyu)", addr16, ep, new_long_poll_interval),
7326 G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
7329 ERR("Failed to get 'set_long_poll_interval' [%s]", dbus_err->message);
7330 g_error_free(dbus_err);
7331 return ZIGBEE_ERROR_IO_ERROR;
7334 g_variant_get(variant, "(i)", &result);
7335 DBG("ret = [0x%x]", result);
7336 g_variant_unref(variant);
7341 int zbl_pollcontrol_set_short_poll_interval(nwk_addr addr16, unsigned char ep,
7342 unsigned int new_short_poll_interval, zb_zcl_pollctrl_check_in cb, void *user_data)
7345 zbl_req_cb_s *container;
7347 int result = ZIGBEE_ERROR_NONE;
7348 GVariant *variant = NULL;
7349 GError *dbus_err = NULL;
7351 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
7352 RETV_IF(NULL == zcl_poll_control_proxy, ZIGBEE_ERROR_IO_ERROR);
7354 DBG("zbl_pollcontrol_set_short_poll_interval()");
7356 container = calloc(1, sizeof(zbl_req_cb_s));
7357 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
7359 to = zbl_dbus_get_timeout(zcl_poll_control_proxy);
7360 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
7361 ZIGBEE_ZCL_POLL_CONTROL_INTERFACE, "checkin_response",
7362 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
7363 _zbl_response_cb, container, _zbl_request_cleanup);
7366 ERR("g_dbus_connection_signal_subscribe() Fail");
7368 return ZIGBEE_ERROR_IO_ERROR;
7372 container->sid = sub_id;
7373 container->cid = ZBL_ZCL_POLLCONTROL_SET_POLL_INTERVAL_REQ;
7374 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
7375 container->userdata = user_data;
7377 variant = g_dbus_proxy_call_sync(zcl_poll_control_proxy, "set_short_poll_interval",
7378 g_variant_new("(qyu)", addr16, ep, new_short_poll_interval),
7379 G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
7382 ERR("Failed to get 'set_short_poll_interval' [%s]", dbus_err->message);
7383 g_error_free(dbus_err);
7384 return ZIGBEE_ERROR_IO_ERROR;
7387 g_variant_get(variant, "(i)", &result);
7388 DBG("ret = [0x%x]", result);
7389 g_variant_unref(variant);
7394 int zbl_add_scene(nwk_addr addr16, unsigned char ep, unsigned short group_id,
7395 unsigned char scene_id, unsigned short transition_time, const char *scene_name,
7396 unsigned short ext_field_len, const char *extension_field_sets,
7397 zb_zcl_scene_add_scene_rsp cb, void *user_data)
7400 zbl_req_cb_s *container;
7402 int result = ZIGBEE_ERROR_NONE;
7403 GVariant *variant = NULL;
7404 GError *dbus_err = NULL;
7408 GVariant *scenename_variant = NULL;
7409 GVariantBuilder *scenename_builder = NULL;
7410 GVariant *extensionfieldSet_variant = NULL;
7411 GVariantBuilder *extensionfieldSet_builder = NULL;
7413 DBG("zbl_add_scene()");
7415 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
7416 RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR);
7418 container = calloc(1, sizeof(zbl_req_cb_s));
7419 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
7421 to = zbl_dbus_get_timeout(zcl_scene_proxy);
7422 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
7423 ZIGBEE_ZCL_SCENE_INTERFACE, "add_scene_rsp", ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
7424 _zbl_response_cb, container, _zbl_request_cleanup);
7427 ERR("g_dbus_connection_signal_subscribe() Fail");
7429 return ZIGBEE_ERROR_IO_ERROR;
7433 container->sid = sub_id;
7434 container->cid = ZBL_ZCL_SCENE_ADD_SCENE_REQ;
7435 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
7436 container->userdata = user_data;
7438 scenename_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
7439 while ('\0' != scene_name[j]) {
7440 g_variant_builder_add(scenename_builder, "(y)", scene_name[j]);
7443 scenename_variant = g_variant_builder_end(scenename_builder);
7444 g_variant_builder_unref(scenename_builder);
7446 extensionfieldSet_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
7448 while (index < ext_field_len) {
7449 INFO("Ext contents 0x%02X", extension_field_sets[index]);
7450 g_variant_builder_add(extensionfieldSet_builder, "(y)", extension_field_sets[index]);
7453 extensionfieldSet_variant = g_variant_builder_end(extensionfieldSet_builder);
7454 g_variant_builder_unref(extensionfieldSet_builder);
7456 variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "add_scene",
7457 g_variant_new("(qyqyqq@a(y)@a(y))", addr16, ep, group_id, scene_id, transition_time,
7458 ext_field_len, scenename_variant, extensionfieldSet_variant), G_DBUS_CALL_FLAGS_NONE,
7459 to, NULL, &dbus_err);
7462 ERR("Failed to get 'add_scene' [%s]", dbus_err->message);
7463 g_error_free(dbus_err);
7464 return ZIGBEE_ERROR_IO_ERROR;
7467 g_variant_get(variant, "(i)", &result);
7468 DBG("ret = [0x%x]", result);
7469 g_variant_unref(variant);
7474 int zbl_view_scene(nwk_addr addr16, unsigned char ep, unsigned short group_id,
7475 unsigned char scene_id, zb_zcl_scene_view_scene_rsp cb, void *user_data)
7478 zbl_req_cb_s *container;
7480 int result = ZIGBEE_ERROR_NONE;
7481 GVariant *variant = NULL;
7482 GError *dbus_err = NULL;
7484 DBG("zbl_scene_view_scene()");
7486 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
7487 RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR);
7489 container = calloc(1, sizeof(zbl_req_cb_s));
7490 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
7492 to = zbl_dbus_get_timeout(zcl_scene_proxy);
7493 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
7494 ZIGBEE_ZCL_SCENE_INTERFACE, "view_scene_rsp", ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
7495 _zbl_response_cb, container, _zbl_request_cleanup);
7498 ERR("g_dbus_connection_signal_subscribe() Fail");
7500 return ZIGBEE_ERROR_IO_ERROR;
7504 container->sid = sub_id;
7505 container->cid = ZBL_ZCL_SCENE_VIEW_SCENE_REQ;
7506 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
7507 container->userdata = user_data;
7509 variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "view_scene",
7510 g_variant_new("(qyqy)", addr16, ep, group_id, scene_id), G_DBUS_CALL_FLAGS_NONE,
7511 to, NULL, &dbus_err);
7514 ERR("Failed to get 'view_scene' [%s]", dbus_err->message);
7515 g_error_free(dbus_err);
7516 return ZIGBEE_ERROR_IO_ERROR;
7519 g_variant_get(variant, "(i)", &result);
7520 DBG("ret = [0x%x]", result);
7521 g_variant_unref(variant);
7526 int zbl_remove_scene(nwk_addr addr16, unsigned char ep,
7527 unsigned short group_id, unsigned char scene_id, zb_zcl_scene_remove_scene_rsp cb,
7531 zbl_req_cb_s *container;
7533 int result = ZIGBEE_ERROR_NONE;
7534 GVariant *variant = NULL;
7535 GError *dbus_err = NULL;
7537 DBG("zbl_scene_remove_scene()");
7539 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
7540 RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR);
7542 container = calloc(1, sizeof(zbl_req_cb_s));
7543 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
7545 to = zbl_dbus_get_timeout(zcl_scene_proxy);
7546 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
7547 ZIGBEE_ZCL_SCENE_INTERFACE, "remove_scene_rsp", ZIGBEE_CONTROL_OBJECT_PATH,
7548 NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup);
7551 ERR("g_dbus_connection_signal_subscribe() Fail");
7553 return ZIGBEE_ERROR_IO_ERROR;
7557 container->sid = sub_id;
7558 container->cid = ZBL_ZCL_SCENE_REMOVE_SCENE_REQ;
7559 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
7560 container->userdata = user_data;
7562 variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "remove_scene",
7563 g_variant_new("(qyqy)", addr16, ep, group_id, scene_id),
7564 G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
7567 ERR("Failed to get 'remove_scene' [%s]", dbus_err->message);
7568 g_error_free(dbus_err);
7569 return ZIGBEE_ERROR_IO_ERROR;
7572 g_variant_get(variant, "(i)", &result);
7573 DBG("ret = [0x%x]", result);
7574 g_variant_unref(variant);
7579 int zbl_remove_all_scene(nwk_addr addr16, unsigned char ep,
7580 unsigned short group_id, zb_zcl_scene_remove_all_scene_rsp cb, void *user_data)
7583 zbl_req_cb_s *container;
7585 int result = ZIGBEE_ERROR_NONE;
7586 GVariant *variant = NULL;
7587 GError *dbus_err = NULL;
7589 DBG("zbl_scene_remove_all_scene()");
7591 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
7592 RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR);
7594 container = calloc(1, sizeof(zbl_req_cb_s));
7595 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
7597 to = zbl_dbus_get_timeout(zcl_scene_proxy);
7598 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
7599 ZIGBEE_ZCL_SCENE_INTERFACE, "remove_all_scene_rsp",
7600 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container,
7601 _zbl_request_cleanup);
7604 ERR("g_dbus_connection_signal_subscribe() Fail");
7606 return ZIGBEE_ERROR_IO_ERROR;
7610 container->sid = sub_id;
7611 container->cid = ZBL_ZCL_SCENE_REMOVE_ALL_SCENE_REQ;
7612 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
7613 container->userdata = user_data;
7615 variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "remove_all_scene",
7616 g_variant_new("(qyq)", addr16, ep, group_id),
7617 G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
7620 ERR("Failed to get 'remove_all_scene' [%s]", dbus_err->message);
7621 g_error_free(dbus_err);
7622 return ZIGBEE_ERROR_IO_ERROR;
7625 g_variant_get(variant, "(i)", &result);
7626 DBG("ret = [0x%x]", result);
7627 g_variant_unref(variant);
7632 int zbl_store_scene(nwk_addr addr16, unsigned char ep, unsigned short group_id,
7633 unsigned char scene_id, zb_zcl_scene_store_scene_rsp cb, void *user_data)
7636 zbl_req_cb_s *container;
7638 int result = ZIGBEE_ERROR_NONE;
7639 GVariant *variant = NULL;
7640 GError *dbus_err = NULL;
7642 DBG("zbl_scene_store_scene()");
7644 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
7645 RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR);
7647 container = calloc(1, sizeof(zbl_req_cb_s));
7648 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
7650 to = zbl_dbus_get_timeout(zcl_scene_proxy);
7651 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
7652 ZIGBEE_ZCL_SCENE_INTERFACE, "store_scene_rsp", ZIGBEE_CONTROL_OBJECT_PATH,
7653 NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup);
7656 ERR("g_dbus_connection_signal_subscribe() Fail");
7658 return ZIGBEE_ERROR_IO_ERROR;
7662 container->sid = sub_id;
7663 container->cid = ZBL_ZCL_SCENE_STORE_SCENE_REQ;
7664 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
7665 container->userdata = user_data;
7667 variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "store_scene",
7668 g_variant_new("(qyqy)", addr16, ep, group_id, scene_id),
7669 G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
7672 ERR("Failed to get 'store_scene' [%s]", dbus_err->message);
7673 g_error_free(dbus_err);
7674 return ZIGBEE_ERROR_IO_ERROR;
7677 g_variant_get(variant, "(i)", &result);
7678 DBG("ret = [0x%x]", result);
7679 g_variant_unref(variant);
7684 int zbl_recall_scene(nwk_addr addr16, unsigned char ep, unsigned short group_id,
7685 unsigned char scene_id)
7687 int result = ZIGBEE_ERROR_NONE;
7688 GVariant *variant = NULL;
7689 GError *dbus_err = NULL;
7691 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
7692 RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR);
7694 variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "recall_scene",
7695 g_variant_new("(qyqy)", addr16, ep, group_id, scene_id), G_DBUS_CALL_FLAGS_NONE,
7696 -1, NULL, &dbus_err);
7699 ERR("Failed to get 'recall_scene' [%s]", dbus_err->message);
7700 g_error_free(dbus_err);
7701 return ZIGBEE_ERROR_IO_ERROR;
7704 g_variant_get(variant, "(i)", &result);
7705 DBG("ret = [0x%x]", result);
7706 g_variant_unref(variant);
7711 int zbl_get_scene_membership(nwk_addr addr16, unsigned char ep,
7712 unsigned short group_id, zb_zcl_scene_get_scene_membership_rsp cb, void *user_data)
7715 zbl_req_cb_s *container;
7717 int result = ZIGBEE_ERROR_NONE;
7718 GVariant *variant = NULL;
7719 GError *dbus_err = NULL;
7721 DBG("zbl_scene_get_scene_membership()");
7723 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
7724 RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR);
7726 container = calloc(1, sizeof(zbl_req_cb_s));
7727 RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
7729 to = zbl_dbus_get_timeout(zcl_scene_proxy);
7730 sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
7731 ZIGBEE_ZCL_SCENE_INTERFACE, "get_scene_membership_rsp",
7732 ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container,
7733 _zbl_request_cleanup);
7736 ERR("g_dbus_connection_signal_subscribe() Fail");
7738 return ZIGBEE_ERROR_IO_ERROR;
7742 container->sid = sub_id;
7743 container->cid = ZBL_ZCL_SCENE_GET_SCENE_MEMBERSHIP_REQ;
7744 container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
7745 container->userdata = user_data;
7747 variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "get_scene_membership",
7748 g_variant_new("(qyq)", addr16, ep, group_id),
7749 G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
7752 ERR("Failed to get get_scene_membership [%s]", dbus_err->message);
7753 g_error_free(dbus_err);
7754 return ZIGBEE_ERROR_IO_ERROR;
7757 g_variant_get(variant, "(i)", &result);
7758 DBG("ret = [0x%x]", result);
7759 g_variant_unref(variant);
7764 int zbl_thermostat_adjust_setpoint(nwk_addr addr16, unsigned char ep, unsigned char mode,
7765 unsigned char amount)
7767 int result = ZIGBEE_ERROR_IO_ERROR;
7768 GVariant *variant = NULL;
7769 GError *dbus_err = NULL;
7771 RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
7772 RETV_IF(NULL == thermostat_gproxy, ZIGBEE_ERROR_IO_ERROR);
7774 variant = g_dbus_proxy_call_sync(thermostat_gproxy, "setpoint_raise_lower",
7775 g_variant_new("(qyyy)", addr16, ep, mode, amount),
7776 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
7779 ERR("Failed to get 'setpoint_raise_lower' [%s]", dbus_err->message);
7780 g_error_free(dbus_err);
7781 return ZIGBEE_ERROR_IO_ERROR;
7784 g_variant_get(variant, "(i)", &result);
7785 DBG("ret = [0x%x]", result);
7786 g_variant_unref(variant);
7791 int zbl_dbus_start(zigbee_h handle)
7799 return ZIGBEE_ERROR_NONE;
7802 gdbus_conn = _zbl_get_connection();
7804 ERR("Couldn't connect to the System bus");
7805 return ZIGBEE_ERROR_IO_ERROR;
7808 id = g_signal_connect(gdbus_conn, "notify::g-name-owner",
7809 G_CALLBACK(_zbl_dbus_name_owner_notify), NULL);
7811 ERR("g_signal_connect() Fail\n");
7812 return ZIGBEE_ERROR_IO_ERROR;
7815 /* Phase 1. Subscribe signals */
7816 _zbl_dbus_subscribe_signal(handle);
7818 /* Phase 2. Make proxies */
7819 manager_gproxy = _zbl_get_manager_proxy();
7820 RETVM_IF(NULL == manager_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get manager_gproxy");
7821 g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(manager_gproxy), ZIGBEE_BROADCAST_TIMEOUT);
7823 service_gproxy = _zbl_get_service_proxy();
7824 RETVM_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get service_gproxy");
7825 g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(service_gproxy), ZIGBEE_BROADCAST_TIMEOUT);
7827 on_off_gproxy = _zbl_get_on_off_proxy();
7828 RETVM_IF(NULL == on_off_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get on_off_gproxy");
7829 g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(on_off_gproxy), ZIGBEE_BROADCAST_TIMEOUT);
7831 door_lock_gproxy = _zbl_get_door_lock_proxy();
7832 RETVM_IF(NULL == door_lock_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get door_lock_gproxy");
7833 g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(door_lock_gproxy), ZIGBEE_BROADCAST_TIMEOUT);
7835 level_control_gproxy = _zbl_get_level_control_proxy();
7836 RETVM_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get level_control_gproxy");
7837 g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(level_control_gproxy), ZIGBEE_BROADCAST_TIMEOUT);
7839 thermostat_gproxy = _zbl_get_thermostat_proxy();
7840 RETVM_IF(NULL == thermostat_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get thermostat_gproxy");
7841 g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(thermostat_gproxy), ZIGBEE_BROADCAST_TIMEOUT);
7843 fan_control_gproxy = _zbl_get_fan_control_proxy();
7844 RETVM_IF(NULL == fan_control_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get fan_control_gproxy");
7845 g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(fan_control_gproxy), ZIGBEE_BROADCAST_TIMEOUT);
7847 alarm_gproxy = _zbl_get_alarm_proxy();
7848 RETVM_IF(NULL == alarm_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get alarm_gproxy");
7849 g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(alarm_gproxy), ZIGBEE_BROADCAST_TIMEOUT);
7851 mfglib_gproxy = _zbl_get_mfglib_proxy();
7852 RETVM_IF(NULL == mfglib_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get mfglib_gproxy");
7853 g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(mfglib_gproxy), ZIGBEE_BROADCAST_TIMEOUT);
7855 zcl_global_proxy = _zbl_get_zcl_global_proxy();
7856 RETVM_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_global_proxy");
7857 g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_global_proxy), ZIGBEE_BROADCAST_TIMEOUT);
7859 zdo_dev_proxy = _zbl_get_zdo_dev_proxy();
7860 RETVM_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zdo_dev_proxy");
7861 g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zdo_dev_proxy), ZIGBEE_BROADCAST_TIMEOUT);
7863 zcl_basic_proxy = _zbl_get_basic_proxy();
7864 RETVM_IF(NULL == zcl_basic_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_basic_proxy");
7865 g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_basic_proxy), ZIGBEE_BROADCAST_TIMEOUT);
7867 zcl_identify_proxy = _zbl_get_identify_proxy();
7868 RETVM_IF(NULL == zcl_identify_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_identify_proxy");
7869 g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_identify_proxy), ZIGBEE_BROADCAST_TIMEOUT);
7871 zcl_ias_zone_proxy = _zbl_get_ias_zone_proxy();
7872 RETVM_IF(NULL == zcl_ias_zone_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_ias_zone_proxy");
7873 g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_ias_zone_proxy), ZIGBEE_BROADCAST_TIMEOUT);
7875 zcl_poll_control_proxy = _zbl_get_poll_control_proxy();
7876 RETVM_IF(NULL == zcl_poll_control_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_poll_control_proxy");
7877 g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_poll_control_proxy), ZIGBEE_BROADCAST_TIMEOUT);
7879 zcl_group_proxy = _zbl_get_group_proxy();
7880 RETVM_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_group_proxy");
7881 g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_group_proxy), ZIGBEE_BROADCAST_TIMEOUT);
7883 zcl_scene_proxy = _zbl_get_scene_proxy();
7884 RETVM_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_scene_proxy");
7885 g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_scene_proxy), ZIGBEE_BROADCAST_TIMEOUT);
7887 zdo_bind_proxy = _zbl_get_zdo_bind_proxy();
7888 RETVM_IF(NULL == zdo_bind_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zdo_bind_proxy");
7889 g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zdo_bind_proxy), ZIGBEE_BROADCAST_TIMEOUT);
7891 zcl_color_control_proxy = _zbl_get_color_control_proxy();
7892 RETVM_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_color_control_proxy");
7893 g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_color_control_proxy), ZIGBEE_BROADCAST_TIMEOUT);
7895 custom_gproxy = _zbl_get_custom_gproxy();
7896 RETVM_IF(NULL == custom_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get custom_gproxy");
7897 g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(custom_gproxy), ZIGBEE_BROADCAST_TIMEOUT);
7901 return ZIGBEE_ERROR_NONE;
7904 void zbl_dbus_stop(void)
7906 if (0 <= zbl_ref_count) {
7907 WARN("dbus does not initiaized\n");
7910 if (0 > --zbl_ref_count)
7911 DBG("all connections closed\n");
7913 g_object_unref(gdbus_conn);
7918 GDBusConnection* zbl_dbus_get_object(void)
7923 int zbl_dbus_get_timeout(GDBusProxy *proxy)
7926 RETV_IF(NULL == gdbus_conn, ZIGBEE_BROADCAST_TIMEOUT);
7927 timeout = g_dbus_proxy_get_default_timeout(proxy);
7929 ERR("Invalid timeout (%d)", timeout);
7930 return ZIGBEE_BROADCAST_TIMEOUT;