2 * Copyright (c) 2016 Samsung Electronics Co., Ltd. All rights reserved.
4 * Contact: Suresh Kumar N (suresh.n@samsung.com)
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
19 #include "zigbee_service_interface_common.h"
21 #include <zblib_driver_zcl_scene.h>
23 static void *_service_interface_ref_zigbee_zcl_scene(
24 ZigBeeServiceInterface *service_interface)
26 ZigbeeObjectSkeleton *zigbee_object = NULL;
27 ZigbeeCustomData_t *custom_data = NULL;
28 ZigbeeZcl_scene *scene_object = NULL;
30 custom_data = (ZigbeeCustomData_t *)zblib_service_interface_ref_user_data(service_interface);
31 if (NULL == custom_data) {
32 Z_LOGE("D-BUS service interface custom_data is NULL!");
36 /* Get zigbee object */
37 zigbee_object = g_hash_table_lookup(custom_data->objects, ZIGBEE_SERVICE_PATH);
38 if (NULL == zigbee_object) {
39 Z_LOGW("Cannot find ZigBee D-BUS interface object!", zigbee_object);
43 scene_object = zigbee_object_get_zcl_scene(ZIGBEE_OBJECT(zigbee_object));
47 static void on_zcl_scene_add_scene_resp(ZigBeeServiceInterface *service_interface,
48 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
50 ZigbeeServiceInterfaceRespCbData_t *cb_data =
51 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
53 ZigbeeZcl_scene *scene_object = NULL;
54 GDBusMethodInvocation *invocation = NULL;
56 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
58 NOT_USED(service_interface);
61 if (NULL == resp_data || 0 == resp_data_len) {
62 Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
67 scene_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
68 zblib_check_null_free_and_ret("scene_object", scene_object, cb_data);
70 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
71 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
73 zigbee_zcl_scene_complete_add_scene(scene_object, invocation, payload->result);
78 static gboolean on_zcl_scene_add_scene(ZigbeeZcl_scene *zcl_scene_object,
79 GDBusMethodInvocation *invocation,
84 gshort transition_time,
87 GVariant *ext_field_set,
90 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
91 ZigbeeZclSceneAddScene_t req;
92 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
94 GVariantIter *iter = NULL;
96 unsigned char value = 0;
100 memset(&req, 0x0, sizeof(ZigbeeZclSceneAddScene_t));
102 /* Update request structure */
103 req.node_id = node_id;
104 req.dest_ep = dest_ep;
105 req.group_id = group_id;
106 req.scene_id = scene_id;
107 req.transition_time = transition_time;
108 g_variant_get(scene_name, "a(y)", &iter);
109 while (g_variant_iter_loop(iter, "(y)", &(req.scene_name[i]))) {
111 if (i >= ZIGBEE_ZCL_GROUP_NAME_MAX_LEN + 1)
116 req.ext_field_set_len = ext_length;
117 req.ext_field_set = g_malloc0(ext_length);
118 g_variant_get(ext_field_set, "a(y)", &iter);
119 while (g_variant_iter_loop(iter, "(y)", &value)) {
120 req.ext_field_set[i] = value;
126 /* Allocate response callback data */
128 zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object,
129 invocation, NULL, 0);
130 if (NULL == resp_cb_data) {
131 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
133 /* Send failure response */
134 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
136 g_free(req.ext_field_set);
140 /* Dispatch request */
141 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
142 ZBLIB_DRIVER_TYPE_ZCL_SCENE,
143 ZBLIB_ZCL_SCENE_OPS_ADD_SCENE,
145 on_zcl_scene_add_scene_resp, resp_cb_data);
148 g_free(req.ext_field_set);
151 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
153 /* Free response callback data */
154 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
156 /* Send failure response */
157 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
165 static void on_zcl_scene_view_scene_resp(ZigBeeServiceInterface *service_interface,
166 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
168 ZigbeeServiceInterfaceRespCbData_t *cb_data =
169 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
171 ZigbeeZcl_scene *scene_object = NULL;
172 GDBusMethodInvocation *invocation = NULL;
174 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
176 NOT_USED(service_interface);
177 NOT_USED(request_id);
179 if (NULL == resp_data || 0 == resp_data_len) {
180 Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
185 scene_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
186 zblib_check_null_free_and_ret("scene_object", scene_object, cb_data);
188 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
189 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
191 zigbee_zcl_scene_complete_view_scene(scene_object, invocation, payload->result);
196 static gboolean on_zcl_scene_view_scene(ZigbeeZcl_scene *zcl_scene_object,
197 GDBusMethodInvocation *invocation,
204 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
205 ZigbeeZclSceneViewScene_t req;
206 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
210 memset(&req, 0x0, sizeof(ZigbeeZclSceneViewScene_t));
212 /* Update request structure */
213 req.node_id = node_id;
214 req.dest_ep = dest_ep;
215 req.group_id = group_id;
216 req.scene_id = scene_id;
218 /* Allocate response callback data */
220 zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object,
221 invocation, NULL, 0);
222 if (NULL == resp_cb_data) {
223 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
225 /* Send failure response */
226 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
231 /* Dispatch request */
232 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
233 ZBLIB_DRIVER_TYPE_ZCL_SCENE,
234 ZBLIB_ZCL_SCENE_OPS_VIEW_SCENE,
236 on_zcl_scene_view_scene_resp, resp_cb_data);
238 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
240 /* Free response callback data */
241 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
243 /* Send failure response */
244 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
252 static void on_zcl_scene_remove_scene_resp(ZigBeeServiceInterface *service_interface,
253 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
255 ZigbeeServiceInterfaceRespCbData_t *cb_data =
256 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
258 ZigbeeZcl_scene *scene_object = NULL;
259 GDBusMethodInvocation *invocation = NULL;
261 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
263 NOT_USED(service_interface);
264 NOT_USED(request_id);
266 if (NULL == resp_data || 0 == resp_data_len) {
267 Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
272 scene_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
273 zblib_check_null_free_and_ret("scene_object", scene_object, cb_data);
275 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
276 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
278 zigbee_zcl_scene_complete_remove_scene(scene_object, invocation, payload->result);
283 static gboolean on_zcl_scene_remove_scene(ZigbeeZcl_scene *zcl_scene_object,
284 GDBusMethodInvocation *invocation,
291 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
292 ZigbeeZclSceneRemoveScene_t req;
293 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
297 memset(&req, 0x0, sizeof(ZigbeeZclSceneRemoveScene_t));
299 /* Update request structure */
300 req.node_id = node_id;
301 req.dest_ep = dest_ep;
302 req.group_id = group_id;
303 req.scene_id = scene_id;
305 /* Allocate response callback data */
307 zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object,
308 invocation, NULL, 0);
309 if (NULL == resp_cb_data) {
310 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
312 /* Send failure response */
313 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
318 /* Dispatch request */
319 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
320 ZBLIB_DRIVER_TYPE_ZCL_SCENE,
321 ZBLIB_ZCL_SCENE_OPS_REMOVE_SCENE,
323 on_zcl_scene_remove_scene_resp, resp_cb_data);
325 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
327 /* Free response callback data */
328 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
330 /* Send failure response */
331 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
339 static void on_zcl_scene_store_scene_resp(ZigBeeServiceInterface *service_interface,
340 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
342 ZigbeeServiceInterfaceRespCbData_t *cb_data =
343 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
345 ZigbeeZcl_scene *scene_object = NULL;
346 GDBusMethodInvocation *invocation = NULL;
348 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
350 NOT_USED(service_interface);
351 NOT_USED(request_id);
353 if (NULL == resp_data || 0 == resp_data_len) {
354 Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
359 scene_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
360 zblib_check_null_free_and_ret("scene_object", scene_object, cb_data);
362 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
363 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
365 zigbee_zcl_scene_complete_store_scene(scene_object, invocation, payload->result);
370 static gboolean on_zcl_scene_store_scene(ZigbeeZcl_scene *zcl_scene_object,
371 GDBusMethodInvocation *invocation,
378 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
379 ZigbeeZclSceneStoreScene_t req;
380 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
384 memset(&req, 0x0, sizeof(ZigbeeZclSceneStoreScene_t));
386 /* Update request structure */
387 req.node_id = node_id;
388 req.dest_ep = dest_ep;
389 req.group_id = group_id;
390 req.scene_id = scene_id;
392 /* Allocate response callback data */
394 zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object,
395 invocation, NULL, 0);
396 if (NULL == resp_cb_data) {
397 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
399 /* Send failure response */
400 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
405 /* Dispatch request */
406 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
407 ZBLIB_DRIVER_TYPE_ZCL_SCENE,
408 ZBLIB_ZCL_SCENE_OPS_STORE_SCENE,
410 on_zcl_scene_store_scene_resp, resp_cb_data);
412 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
414 /* Free response callback data */
415 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
417 /* Send failure response */
418 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
426 static void on_zcl_scene_recall_scene_resp(ZigBeeServiceInterface *service_interface,
427 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
429 ZigbeeServiceInterfaceRespCbData_t *cb_data =
430 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
432 ZigbeeZcl_scene *scene_object = NULL;
433 GDBusMethodInvocation *invocation = NULL;
435 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
437 NOT_USED(service_interface);
438 NOT_USED(request_id);
440 if (NULL == resp_data || 0 == resp_data_len) {
441 Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
446 scene_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
447 zblib_check_null_free_and_ret("scene_object", scene_object, cb_data);
449 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
450 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
452 zigbee_zcl_scene_complete_recall_scene(scene_object, invocation, payload->result);
457 static gboolean on_zcl_scene_recall_scene(ZigbeeZcl_scene *zcl_scene_object,
458 GDBusMethodInvocation *invocation,
465 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
466 ZigbeeZclSceneRecallScene_t req;
467 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
471 memset(&req, 0x0, sizeof(ZigbeeZclSceneRecallScene_t));
473 /* Update request structure */
474 req.node_id = node_id;
475 req.dest_ep = dest_ep;
476 req.group_id = group_id;
477 req.scene_id = scene_id;
479 /* Allocate response callback data */
481 zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object,
482 invocation, NULL, 0);
483 if (NULL == resp_cb_data) {
484 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
486 /* Send failure response */
487 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
492 /* Dispatch request */
493 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
494 ZBLIB_DRIVER_TYPE_ZCL_SCENE,
495 ZBLIB_ZCL_SCENE_OPS_RECALL_SCENE,
497 on_zcl_scene_recall_scene_resp, resp_cb_data);
499 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
501 /* Free response callback data */
502 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
504 /* Send failure response */
505 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
513 static void on_zcl_scene_remove_all_scene_resp(ZigBeeServiceInterface *service_interface,
514 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
516 ZigbeeServiceInterfaceRespCbData_t *cb_data =
517 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
519 ZigbeeZcl_scene *scene_object = NULL;
520 GDBusMethodInvocation *invocation = NULL;
522 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
524 NOT_USED(service_interface);
525 NOT_USED(request_id);
527 if (NULL == resp_data || 0 == resp_data_len) {
528 Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
533 scene_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
534 zblib_check_null_free_and_ret("scene_object", scene_object, cb_data);
536 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
537 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
539 zigbee_zcl_scene_complete_remove_all_scene(scene_object, invocation, payload->result);
544 static gboolean on_zcl_scene_remove_all_scene(ZigbeeZcl_scene *zcl_scene_object,
545 GDBusMethodInvocation *invocation,
551 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
552 ZigbeeZclSceneRemoveAllScene_t req;
553 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
557 memset(&req, 0x0, sizeof(ZigbeeZclSceneRemoveAllScene_t));
559 /* Update request structure */
560 req.node_id = node_id;
561 req.dest_ep = dest_ep;
562 req.group_id = group_id;
564 /* Allocate response callback data */
566 zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object,
567 invocation, NULL, 0);
568 if (NULL == resp_cb_data) {
569 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
571 /* Send failure response */
572 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
577 /* Dispatch request */
578 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
579 ZBLIB_DRIVER_TYPE_ZCL_SCENE,
580 ZBLIB_ZCL_SCENE_OPS_REMOVE_ALL_SCENE,
582 on_zcl_scene_remove_all_scene_resp, resp_cb_data);
584 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
586 /* Free response callback data */
587 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
589 /* Send failure response */
590 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
598 static void on_zcl_scene_get_scene_membership_resp(ZigBeeServiceInterface *service_interface,
599 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
601 ZigbeeServiceInterfaceRespCbData_t *cb_data =
602 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
604 ZigbeeZcl_scene *scene_object = NULL;
605 GDBusMethodInvocation *invocation = NULL;
607 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
609 NOT_USED(service_interface);
610 NOT_USED(request_id);
612 if (NULL == resp_data || 0 == resp_data_len) {
613 Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
618 scene_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
619 zblib_check_null_free_and_ret("scene_object", scene_object, cb_data);
621 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
622 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
624 zigbee_zcl_scene_complete_get_scene_membership(scene_object, invocation, payload->result);
629 static gboolean on_zcl_scene_get_scene_membership(ZigbeeZcl_scene *zcl_scene_object,
630 GDBusMethodInvocation *invocation,
636 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
637 ZigbeeZclSceneGetSceneMembership_t req;
638 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
642 memset(&req, 0x0, sizeof(ZigbeeZclSceneGetSceneMembership_t));
644 /* Update request structure */
645 req.node_id = node_id;
646 req.dest_ep = dest_ep;
647 req.group_id = group_id;
649 /* Allocate response callback data */
651 zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object,
652 invocation, NULL, 0);
653 if (NULL == resp_cb_data) {
654 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
656 /* Send failure response */
657 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
662 /* Dispatch request */
663 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
664 ZBLIB_DRIVER_TYPE_ZCL_SCENE,
665 ZBLIB_ZCL_SCENE_OPS_GET_SCENE_MEMBERSHIP,
667 on_zcl_scene_get_scene_membership_resp, resp_cb_data);
669 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
671 /* Free response callback data */
672 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
674 /* Send failure response */
675 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
683 void zigbee_service_dbus_interface_zcl_scene_notification(ZigBeeServiceInterface *service_interface,
684 guint noti_id, gpointer noti_data, guint noti_data_len, gpointer noti_cb_data)
686 ZigbeeZcl_scene *scene_object;
688 zblib_check_null_ret("service_interface", service_interface);
690 if (NULL == noti_data || 0 == noti_data_len) {
691 Z_LOGE("noti_data=%p or noti_data_len=%d is null", noti_data, noti_data_len);
695 scene_object = _service_interface_ref_zigbee_zcl_scene(service_interface);
696 zblib_check_null_ret("scene_object", scene_object);
698 NOT_USED(noti_cb_data);
701 case ZBLIB_ZCL_SCENE_NOTI_ADD_SCENE: {
702 ZigbeeZclSceneAddSceneResp_t *rsp = (ZigbeeZclSceneAddSceneResp_t*)noti_data;
704 Z_LOGD("'add_scene_rsp' from : [0x%X]", rsp->node_id);
706 zigbee_zcl_scene_emit_add_scene_rsp(scene_object, rsp->node_id, rsp->src_ep,
707 rsp->status, rsp->group_id, rsp->scene_id);
710 case ZBLIB_ZCL_SCENE_NOTI_VIEW_SCENE: {
713 GVariant* scene_name = NULL;
714 GVariantBuilder *attr_builder = NULL;
715 GVariant* ext_field_set = NULL;
716 GVariantBuilder *attr_builder1 = NULL;
718 ZigbeeZclSceneViewSceneResp_t *rsp = (ZigbeeZclSceneViewSceneResp_t*)noti_data;
720 Z_LOGD("'view_scene_rsp' from : [0x%X]", rsp->node_id);
722 attr_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
723 for (i = 0; rsp->scene_name[i] && i < ZIGBEE_ZCL_SCENE_NAME_MAX_LEN; i++)
724 g_variant_builder_add(attr_builder, "(y)", rsp->scene_name[i]);
725 scene_name = g_variant_builder_end(attr_builder);
726 g_variant_builder_unref(attr_builder);
729 attr_builder1 = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
730 for (i = 0; i < rsp->ext_field_set_len; i++)
731 g_variant_builder_add(attr_builder1, "(y)", rsp->ext_field_set[i]);
732 ext_field_set = g_variant_builder_end(attr_builder1);
733 g_variant_builder_unref(attr_builder1);
735 zigbee_zcl_scene_emit_view_scene_rsp(scene_object, rsp->node_id, rsp->src_ep,
736 rsp->status, rsp->group_id, rsp->scene_id, rsp->transition_time,
737 scene_name, rsp->ext_field_set_len, ext_field_set);
740 case ZBLIB_ZCL_SCENE_NOTI_REMOVE_SCENE: {
741 ZigbeeZclSceneRemoveSceneResp_t *rsp = (ZigbeeZclSceneRemoveSceneResp_t*)noti_data;
743 Z_LOGD("'remove_scene_rsp' from : [0x%X]", rsp->node_id);
745 zigbee_zcl_scene_emit_remove_scene_rsp(scene_object, rsp->node_id, rsp->src_ep,
746 rsp->status, rsp->group_id, rsp->scene_id);
749 case ZBLIB_ZCL_SCENE_NOTI_REMOVE_ALL_SCENE: {
750 ZigbeeZclSceneRemoveAllSceneResp_t *rsp =
751 (ZigbeeZclSceneRemoveAllSceneResp_t*)noti_data;
753 Z_LOGD("'remove_all_scene_rsp' from : [0x%X]", rsp->node_id);
755 zigbee_zcl_scene_emit_remove_all_scene_rsp(scene_object, rsp->node_id, rsp->src_ep,
756 rsp->status, rsp->group_id);
759 case ZBLIB_ZCL_SCENE_NOTI_STORE_SCENE: {
760 ZigbeeZclSceneStoreSceneResp_t *rsp =
761 (ZigbeeZclSceneStoreSceneResp_t*)noti_data;
763 Z_LOGD("'store_scene_rsp' from : [0x%X]", rsp->node_id);
765 zigbee_zcl_scene_emit_store_scene_rsp(scene_object, rsp->node_id, rsp->src_ep,
766 rsp->status, rsp->group_id, rsp->scene_id);
769 case ZBLIB_ZCL_SCENE_NOTI_GET_SCENE_MEMBERSHIP: {
771 GVariant* scene_list = NULL;
772 GVariantBuilder *attr_builder = NULL;
774 ZigbeeZclSceneGetSceneMembershipResp_t *rsp =
775 (ZigbeeZclSceneGetSceneMembershipResp_t*)noti_data;
777 Z_LOGD("'get_scene_rsp' from : [0x%X]", rsp->node_id);
779 attr_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
780 for (i = 0; i < rsp->scene_count; i++)
781 g_variant_builder_add(attr_builder, "(y)", rsp->scene_list[i]);
782 scene_list = g_variant_builder_end(attr_builder);
783 g_variant_builder_unref(attr_builder);
785 zigbee_zcl_scene_emit_get_scene_membership_rsp(scene_object, rsp->node_id, rsp->src_ep,
786 rsp->status, rsp->capacity, rsp->group_id, rsp->scene_count, scene_list);
790 Z_LOGE("Unexpected notification [%x]", noti_id);
794 /* ZigbeeZcl_scene should be dereferenced */
795 g_object_unref(scene_object);
798 gboolean zigbee_service_dbus_interface_zcl_scene_init(ZigBeeServiceInterface *service_interface,
799 ZigbeeObjectSkeleton *zigbee_object)
801 ZigbeeZcl_scene *zcl_scene_object;
803 if (NULL == service_interface) {
804 Z_LOGE("service_interface is NULL");
808 zcl_scene_object = zigbee_zcl_scene_skeleton_new();
809 zigbee_object_skeleton_set_zcl_scene(zigbee_object, zcl_scene_object);
810 g_object_unref(zcl_scene_object);
812 Z_LOGI("zcl_scene_object: [%p]", zcl_scene_object);
815 * Register signal handlers for 'zcl_scene' interface
817 g_signal_connect(zcl_scene_object,
819 G_CALLBACK(on_zcl_scene_add_scene), service_interface);
821 g_signal_connect(zcl_scene_object,
823 G_CALLBACK(on_zcl_scene_view_scene), service_interface);
825 g_signal_connect(zcl_scene_object,
826 "handle-remove-scene",
827 G_CALLBACK(on_zcl_scene_remove_scene), service_interface);
829 g_signal_connect(zcl_scene_object,
830 "handle-store-scene",
831 G_CALLBACK(on_zcl_scene_store_scene), service_interface);
833 g_signal_connect(zcl_scene_object,
834 "handle-recall-scene",
835 G_CALLBACK(on_zcl_scene_recall_scene), service_interface);
837 g_signal_connect(zcl_scene_object,
838 "handle-remove-all-scene",
839 G_CALLBACK(on_zcl_scene_remove_all_scene), service_interface);
841 g_signal_connect(zcl_scene_object,
842 "handle-get-scene-membership",
843 G_CALLBACK(on_zcl_scene_get_scene_membership), service_interface);