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>
24 static void *_service_interface_ref_zigbee_zcl_scene(
25 ZigBeeServiceInterface *service_interface)
27 ZigbeeObjectSkeleton *zigbee_object = NULL;
28 ZigbeeCustomData_t *custom_data = NULL;
29 ZigbeeZcl_scene *scene_object = NULL;
31 custom_data = (ZigbeeCustomData_t *)zblib_service_interface_ref_user_data(service_interface);
32 if (NULL == custom_data) {
33 Z_LOGE("D-BUS service interface custom_data is NULL!");
37 /* Get zigbee object */
38 zigbee_object = g_hash_table_lookup(custom_data->objects, ZIGBEE_SERVICE_PATH);
39 if (NULL == zigbee_object) {
40 Z_LOGW("Cannot find ZigBee D-BUS interface object!", zigbee_object);
44 scene_object = zigbee_object_get_zcl_scene(ZIGBEE_OBJECT(zigbee_object));
48 static void on_zcl_scene_add_scene_resp(ZigBeeServiceInterface *service_interface,
49 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
51 ZigbeeServiceInterfaceRespCbData_t *cb_data =
52 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
54 ZigbeeZcl_scene *scene_object = NULL;
55 GDBusMethodInvocation *invocation = NULL;
57 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
59 NOT_USED(service_interface);
62 if (NULL == resp_data || 0 == resp_data_len) {
63 Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
68 scene_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
69 zblib_check_null_free_and_ret("scene_object", scene_object, cb_data);
71 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
72 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
74 zigbee_zcl_scene_complete_add_scene(scene_object, invocation, payload->result);
79 static gboolean on_zcl_scene_add_scene(ZigbeeZcl_scene *zcl_scene_object,
80 GDBusMethodInvocation *invocation,
85 gshort transition_time,
88 GVariant *ext_field_set,
91 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
92 ZigbeeZclSceneAddScene_t req;
93 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
95 GVariantIter *iter = NULL;
97 unsigned char value = 0;
101 memset(&req, 0x0, sizeof(ZigbeeZclSceneAddScene_t));
103 /* Update request structure */
104 req.node_id = node_id;
105 req.dest_ep = dest_ep;
106 req.group_id = group_id;
107 req.scene_id = scene_id;
108 req.transition_time = transition_time;
109 g_variant_get(scene_name, "a(y)", &iter);
110 while (g_variant_iter_loop(iter, "(y)", &(req.scene_name[i]))) {
112 if (i >= ZIGBEE_ZCL_GROUP_NAME_MAX_LEN + 1)
117 req.ext_field_set_len = ext_length;
118 req.ext_field_set = g_malloc0(ext_length);
119 g_variant_get(ext_field_set, "a(y)", &iter);
120 while (g_variant_iter_loop(iter, "(y)", &value)) {
121 req.ext_field_set[i] = value;
127 /* Allocate response callback data */
129 zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object,
130 invocation, NULL, 0);
131 if (NULL == resp_cb_data) {
132 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
134 /* Send failure response */
135 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
137 g_free(req.ext_field_set);
141 /* Dispatch request */
142 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
143 ZBLIB_DRIVER_TYPE_ZCL_SCENE,
144 ZBLIB_ZCL_SCENE_OPS_ADD_SCENE,
146 on_zcl_scene_add_scene_resp, resp_cb_data);
149 g_free(req.ext_field_set);
152 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
154 /* Free response callback data */
155 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
157 /* Send failure response */
158 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
166 static void on_zcl_scene_view_scene_resp(ZigBeeServiceInterface *service_interface,
167 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
169 ZigbeeServiceInterfaceRespCbData_t *cb_data =
170 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
172 ZigbeeZcl_scene *scene_object = NULL;
173 GDBusMethodInvocation *invocation = NULL;
175 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
177 NOT_USED(service_interface);
178 NOT_USED(request_id);
180 if (NULL == resp_data || 0 == resp_data_len) {
181 Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
186 scene_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
187 zblib_check_null_free_and_ret("scene_object", scene_object, cb_data);
189 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
190 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
192 zigbee_zcl_scene_complete_view_scene(scene_object, invocation, payload->result);
197 static gboolean on_zcl_scene_view_scene(ZigbeeZcl_scene *zcl_scene_object,
198 GDBusMethodInvocation *invocation,
205 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
206 ZigbeeZclSceneViewScene_t req;
207 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
211 memset(&req, 0x0, sizeof(ZigbeeZclSceneViewScene_t));
213 /* Update request structure */
214 req.node_id = node_id;
215 req.dest_ep = dest_ep;
216 req.group_id = group_id;
217 req.scene_id = scene_id;
219 /* Allocate response callback data */
221 zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object,
222 invocation, NULL, 0);
223 if (NULL == resp_cb_data) {
224 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
226 /* Send failure response */
227 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
232 /* Dispatch request */
233 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
234 ZBLIB_DRIVER_TYPE_ZCL_SCENE,
235 ZBLIB_ZCL_SCENE_OPS_VIEW_SCENE,
237 on_zcl_scene_view_scene_resp, resp_cb_data);
239 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
241 /* Free response callback data */
242 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
244 /* Send failure response */
245 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
253 static void on_zcl_scene_remove_scene_resp(ZigBeeServiceInterface *service_interface,
254 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
256 ZigbeeServiceInterfaceRespCbData_t *cb_data =
257 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
259 ZigbeeZcl_scene *scene_object = NULL;
260 GDBusMethodInvocation *invocation = NULL;
262 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
264 NOT_USED(service_interface);
265 NOT_USED(request_id);
267 if (NULL == resp_data || 0 == resp_data_len) {
268 Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
273 scene_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
274 zblib_check_null_free_and_ret("scene_object", scene_object, cb_data);
276 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
277 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
279 zigbee_zcl_scene_complete_remove_scene(scene_object, invocation, payload->result);
284 static gboolean on_zcl_scene_remove_scene(ZigbeeZcl_scene *zcl_scene_object,
285 GDBusMethodInvocation *invocation,
292 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
293 ZigbeeZclSceneRemoveScene_t req;
294 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
298 memset(&req, 0x0, sizeof(ZigbeeZclSceneRemoveScene_t));
300 /* Update request structure */
301 req.node_id = node_id;
302 req.dest_ep = dest_ep;
303 req.group_id = group_id;
304 req.scene_id = scene_id;
306 /* Allocate response callback data */
308 zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object,
309 invocation, NULL, 0);
310 if (NULL == resp_cb_data) {
311 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
313 /* Send failure response */
314 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
319 /* Dispatch request */
320 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
321 ZBLIB_DRIVER_TYPE_ZCL_SCENE,
322 ZBLIB_ZCL_SCENE_OPS_REMOVE_SCENE,
324 on_zcl_scene_remove_scene_resp, resp_cb_data);
326 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
328 /* Free response callback data */
329 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
331 /* Send failure response */
332 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
340 static void on_zcl_scene_store_scene_resp(ZigBeeServiceInterface *service_interface,
341 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
343 ZigbeeServiceInterfaceRespCbData_t *cb_data =
344 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
346 ZigbeeZcl_scene *scene_object = NULL;
347 GDBusMethodInvocation *invocation = NULL;
349 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
351 NOT_USED(service_interface);
352 NOT_USED(request_id);
354 if (NULL == resp_data || 0 == resp_data_len) {
355 Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
360 scene_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
361 zblib_check_null_free_and_ret("scene_object", scene_object, cb_data);
363 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
364 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
366 zigbee_zcl_scene_complete_store_scene(scene_object, invocation, payload->result);
371 static gboolean on_zcl_scene_store_scene(ZigbeeZcl_scene *zcl_scene_object,
372 GDBusMethodInvocation *invocation,
379 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
380 ZigbeeZclSceneStoreScene_t req;
381 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
385 memset(&req, 0x0, sizeof(ZigbeeZclSceneStoreScene_t));
387 /* Update request structure */
388 req.node_id = node_id;
389 req.dest_ep = dest_ep;
390 req.group_id = group_id;
391 req.scene_id = scene_id;
393 /* Allocate response callback data */
395 zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object,
396 invocation, NULL, 0);
397 if (NULL == resp_cb_data) {
398 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
400 /* Send failure response */
401 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
406 /* Dispatch request */
407 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
408 ZBLIB_DRIVER_TYPE_ZCL_SCENE,
409 ZBLIB_ZCL_SCENE_OPS_STORE_SCENE,
411 on_zcl_scene_store_scene_resp, resp_cb_data);
413 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
415 /* Free response callback data */
416 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
418 /* Send failure response */
419 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
427 static void on_zcl_scene_recall_scene_resp(ZigBeeServiceInterface *service_interface,
428 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
430 ZigbeeServiceInterfaceRespCbData_t *cb_data =
431 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
433 ZigbeeZcl_scene *scene_object = NULL;
434 GDBusMethodInvocation *invocation = NULL;
436 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
438 NOT_USED(service_interface);
439 NOT_USED(request_id);
441 if (NULL == resp_data || 0 == resp_data_len) {
442 Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
447 scene_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
448 zblib_check_null_free_and_ret("scene_object", scene_object, cb_data);
450 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
451 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
453 zigbee_zcl_scene_complete_recall_scene(scene_object, invocation, payload->result);
458 static gboolean on_zcl_scene_recall_scene(ZigbeeZcl_scene *zcl_scene_object,
459 GDBusMethodInvocation *invocation,
466 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
467 ZigbeeZclSceneRecallScene_t req;
468 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
472 memset(&req, 0x0, sizeof(ZigbeeZclSceneRecallScene_t));
474 /* Update request structure */
475 req.node_id = node_id;
476 req.dest_ep = dest_ep;
477 req.group_id = group_id;
478 req.scene_id = scene_id;
480 /* Allocate response callback data */
482 zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object,
483 invocation, NULL, 0);
484 if (NULL == resp_cb_data) {
485 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
487 /* Send failure response */
488 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
493 /* Dispatch request */
494 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
495 ZBLIB_DRIVER_TYPE_ZCL_SCENE,
496 ZBLIB_ZCL_SCENE_OPS_RECALL_SCENE,
498 on_zcl_scene_recall_scene_resp, resp_cb_data);
500 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
502 /* Free response callback data */
503 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
505 /* Send failure response */
506 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
514 static void on_zcl_scene_remove_all_scene_resp(ZigBeeServiceInterface *service_interface,
515 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
517 ZigbeeServiceInterfaceRespCbData_t *cb_data =
518 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
520 ZigbeeZcl_scene *scene_object = NULL;
521 GDBusMethodInvocation *invocation = NULL;
523 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
525 NOT_USED(service_interface);
526 NOT_USED(request_id);
528 if (NULL == resp_data || 0 == resp_data_len) {
529 Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
534 scene_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
535 zblib_check_null_free_and_ret("scene_object", scene_object, cb_data);
537 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
538 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
540 zigbee_zcl_scene_complete_remove_all_scene(scene_object, invocation, payload->result);
545 static gboolean on_zcl_scene_remove_all_scene(ZigbeeZcl_scene *zcl_scene_object,
546 GDBusMethodInvocation *invocation,
552 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
553 ZigbeeZclSceneRemoveAllScene_t req;
554 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
558 memset(&req, 0x0, sizeof(ZigbeeZclSceneRemoveAllScene_t));
560 /* Update request structure */
561 req.node_id = node_id;
562 req.dest_ep = dest_ep;
563 req.group_id = group_id;
565 /* Allocate response callback data */
567 zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object,
568 invocation, NULL, 0);
569 if (NULL == resp_cb_data) {
570 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
572 /* Send failure response */
573 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
578 /* Dispatch request */
579 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
580 ZBLIB_DRIVER_TYPE_ZCL_SCENE,
581 ZBLIB_ZCL_SCENE_OPS_REMOVE_ALL_SCENE,
583 on_zcl_scene_remove_all_scene_resp, resp_cb_data);
585 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
587 /* Free response callback data */
588 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
590 /* Send failure response */
591 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
599 static void on_zcl_scene_get_scene_membership_resp(ZigBeeServiceInterface *service_interface,
600 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
602 ZigbeeServiceInterfaceRespCbData_t *cb_data =
603 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
605 ZigbeeZcl_scene *scene_object = NULL;
606 GDBusMethodInvocation *invocation = NULL;
608 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
610 NOT_USED(service_interface);
611 NOT_USED(request_id);
613 if (NULL == resp_data || 0 == resp_data_len) {
614 Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
619 scene_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
620 zblib_check_null_free_and_ret("scene_object", scene_object, cb_data);
622 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
623 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
625 zigbee_zcl_scene_complete_get_scene_membership(scene_object, invocation, payload->result);
630 static gboolean on_zcl_scene_get_scene_membership(ZigbeeZcl_scene *zcl_scene_object,
631 GDBusMethodInvocation *invocation,
637 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
638 ZigbeeZclSceneGetSceneMembership_t req;
639 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
643 memset(&req, 0x0, sizeof(ZigbeeZclSceneGetSceneMembership_t));
645 /* Update request structure */
646 req.node_id = node_id;
647 req.dest_ep = dest_ep;
648 req.group_id = group_id;
650 /* Allocate response callback data */
652 zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object,
653 invocation, NULL, 0);
654 if (NULL == resp_cb_data) {
655 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
657 /* Send failure response */
658 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
663 /* Dispatch request */
664 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
665 ZBLIB_DRIVER_TYPE_ZCL_SCENE,
666 ZBLIB_ZCL_SCENE_OPS_GET_SCENE_MEMBERSHIP,
668 on_zcl_scene_get_scene_membership_resp, resp_cb_data);
670 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
672 /* Free response callback data */
673 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
675 /* Send failure response */
676 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
684 void zigbee_service_dbus_interface_zcl_scene_notification(ZigBeeServiceInterface *service_interface,
685 guint noti_id, gpointer noti_data, guint noti_data_len, gpointer noti_cb_data)
687 ZigbeeZcl_scene *scene_object;
689 zblib_check_null_ret("service_interface", service_interface);
691 if (NULL == noti_data || 0 == noti_data_len) {
692 Z_LOGE("noti_data=%p or noti_data_len=%d is null", noti_data, noti_data_len);
696 scene_object = _service_interface_ref_zigbee_zcl_scene(service_interface);
697 zblib_check_null_ret("scene_object", scene_object);
699 NOT_USED(noti_cb_data);
702 case ZBLIB_ZCL_SCENE_NOTI_ADD_SCENE: {
703 ZigbeeZclSceneAddSceneResp_t *rsp = (ZigbeeZclSceneAddSceneResp_t*)noti_data;
705 Z_LOGD("'add_scene_rsp' from : [0x%X]", rsp->node_id);
707 zigbee_zcl_scene_emit_add_scene_rsp(scene_object, rsp->node_id, rsp->src_ep,
708 rsp->status, rsp->group_id, rsp->scene_id);
711 case ZBLIB_ZCL_SCENE_NOTI_VIEW_SCENE: {
714 GVariant* scene_name = NULL;
715 GVariantBuilder *attr_builder = NULL;
716 GVariant* ext_field_set = NULL;
717 GVariantBuilder *attr_builder1 = NULL;
719 ZigbeeZclSceneViewSceneResp_t *rsp = (ZigbeeZclSceneViewSceneResp_t*)noti_data;
721 Z_LOGD("'view_scene_rsp' from : [0x%X]", rsp->node_id);
723 attr_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
724 for (i = 0; rsp->scene_name[i] && i < ZIGBEE_ZCL_SCENE_NAME_MAX_LEN; i++)
725 g_variant_builder_add(attr_builder, "(y)", rsp->scene_name[i]);
726 scene_name = g_variant_builder_end(attr_builder);
727 g_variant_builder_unref(attr_builder);
730 attr_builder1 = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
731 for (i = 0; i < rsp->ext_field_set_len; i++)
732 g_variant_builder_add(attr_builder1, "(y)", rsp->ext_field_set[i]);
733 ext_field_set = g_variant_builder_end(attr_builder1);
734 g_variant_builder_unref(attr_builder1);
736 zigbee_zcl_scene_emit_view_scene_rsp(scene_object, rsp->node_id, rsp->src_ep,
737 rsp->status, rsp->group_id, rsp->scene_id, rsp->transition_time,
738 scene_name, rsp->ext_field_set_len, ext_field_set);
741 case ZBLIB_ZCL_SCENE_NOTI_REMOVE_SCENE: {
742 ZigbeeZclSceneRemoveSceneResp_t *rsp = (ZigbeeZclSceneRemoveSceneResp_t*)noti_data;
744 Z_LOGD("'remove_scene_rsp' from : [0x%X]", rsp->node_id);
746 zigbee_zcl_scene_emit_remove_scene_rsp(scene_object, rsp->node_id, rsp->src_ep,
747 rsp->status, rsp->group_id, rsp->scene_id);
750 case ZBLIB_ZCL_SCENE_NOTI_REMOVE_ALL_SCENE: {
751 ZigbeeZclSceneRemoveAllSceneResp_t *rsp =
752 (ZigbeeZclSceneRemoveAllSceneResp_t*)noti_data;
754 Z_LOGD("'remove_all_scene_rsp' from : [0x%X]", rsp->node_id);
756 zigbee_zcl_scene_emit_remove_all_scene_rsp(scene_object, rsp->node_id, rsp->src_ep,
757 rsp->status, rsp->group_id);
760 case ZBLIB_ZCL_SCENE_NOTI_STORE_SCENE: {
761 ZigbeeZclSceneStoreSceneResp_t *rsp =
762 (ZigbeeZclSceneStoreSceneResp_t*)noti_data;
764 Z_LOGD("'store_scene_rsp' from : [0x%X]", rsp->node_id);
766 zigbee_zcl_scene_emit_store_scene_rsp(scene_object, rsp->node_id, rsp->src_ep,
767 rsp->status, rsp->group_id, rsp->scene_id);
770 case ZBLIB_ZCL_SCENE_NOTI_GET_SCENE_MEMBERSHIP: {
772 GVariant* scene_list = NULL;
773 GVariantBuilder *attr_builder = NULL;
775 ZigbeeZclSceneGetSceneMembershipResp_t *rsp =
776 (ZigbeeZclSceneGetSceneMembershipResp_t*)noti_data;
778 Z_LOGD("'get_scene_rsp' from : [0x%X]", rsp->node_id);
780 attr_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
781 for (i = 0; i < rsp->scene_count; i++)
782 g_variant_builder_add(attr_builder, "(y)", rsp->scene_list[i]);
783 scene_list = g_variant_builder_end(attr_builder);
784 g_variant_builder_unref(attr_builder);
786 zigbee_zcl_scene_emit_get_scene_membership_rsp(scene_object, rsp->node_id, rsp->src_ep,
787 rsp->status, rsp->capacity, rsp->group_id, rsp->scene_count, scene_list);
791 Z_LOGE("Unexpected notification [%x]", noti_id);
795 /* ZigbeeZcl_scene should be dereferenced */
796 g_object_unref(scene_object);
800 gboolean zigbee_service_dbus_interface_zcl_scene_init(ZigBeeServiceInterface *service_interface,
801 ZigbeeObjectSkeleton *zigbee_object)
803 ZigbeeZcl_scene *zcl_scene_object;
805 if (NULL == service_interface) {
806 /* LCOV_EXCL_START */
807 Z_LOGE("service_interface is NULL");
812 zcl_scene_object = zigbee_zcl_scene_skeleton_new();
813 zigbee_object_skeleton_set_zcl_scene(zigbee_object, zcl_scene_object);
814 g_object_unref(zcl_scene_object);
816 Z_LOGI("zcl_scene_object: [%p]", zcl_scene_object);
819 * Register signal handlers for 'zcl_scene' interface
821 g_signal_connect(zcl_scene_object,
823 G_CALLBACK(on_zcl_scene_add_scene), service_interface);
825 g_signal_connect(zcl_scene_object,
827 G_CALLBACK(on_zcl_scene_view_scene), service_interface);
829 g_signal_connect(zcl_scene_object,
830 "handle-remove-scene",
831 G_CALLBACK(on_zcl_scene_remove_scene), service_interface);
833 g_signal_connect(zcl_scene_object,
834 "handle-store-scene",
835 G_CALLBACK(on_zcl_scene_store_scene), service_interface);
837 g_signal_connect(zcl_scene_object,
838 "handle-recall-scene",
839 G_CALLBACK(on_zcl_scene_recall_scene), service_interface);
841 g_signal_connect(zcl_scene_object,
842 "handle-remove-all-scene",
843 G_CALLBACK(on_zcl_scene_remove_all_scene), service_interface);
845 g_signal_connect(zcl_scene_object,
846 "handle-get-scene-membership",
847 G_CALLBACK(on_zcl_scene_get_scene_membership), service_interface);