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);
139 /* Dispatch request */
140 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
141 ZBLIB_DRIVER_TYPE_ZCL_SCENE,
142 ZBLIB_ZCL_SCENE_OPS_ADD_SCENE,
144 on_zcl_scene_add_scene_resp, resp_cb_data);
147 g_free(req.ext_field_set);
150 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
152 /* Free response callback data */
153 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
155 /* Send failure response */
156 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
164 static void on_zcl_scene_view_scene_resp(ZigBeeServiceInterface *service_interface,
165 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
167 ZigbeeServiceInterfaceRespCbData_t *cb_data =
168 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
170 ZigbeeZcl_scene *scene_object = NULL;
171 GDBusMethodInvocation *invocation = NULL;
173 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
175 NOT_USED(service_interface);
176 NOT_USED(request_id);
178 if (NULL == resp_data || 0 == resp_data_len) {
179 Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
184 scene_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
185 zblib_check_null_free_and_ret("scene_object", scene_object, cb_data);
187 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
188 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
190 zigbee_zcl_scene_complete_view_scene(scene_object, invocation, payload->result);
195 static gboolean on_zcl_scene_view_scene(ZigbeeZcl_scene *zcl_scene_object,
196 GDBusMethodInvocation *invocation,
203 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
204 ZigbeeZclSceneViewScene_t req;
205 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
209 memset(&req, 0x0, sizeof(ZigbeeZclSceneViewScene_t));
211 /* Update request structure */
212 req.node_id = node_id;
213 req.dest_ep = dest_ep;
214 req.group_id = group_id;
215 req.scene_id = scene_id;
217 /* Allocate response callback data */
219 zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object,
220 invocation, NULL, 0);
221 if (NULL == resp_cb_data) {
222 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
224 /* Send failure response */
225 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
230 /* Dispatch request */
231 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
232 ZBLIB_DRIVER_TYPE_ZCL_SCENE,
233 ZBLIB_ZCL_SCENE_OPS_VIEW_SCENE,
235 on_zcl_scene_view_scene_resp, resp_cb_data);
237 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
239 /* Free response callback data */
240 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
242 /* Send failure response */
243 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
251 static void on_zcl_scene_remove_scene_resp(ZigBeeServiceInterface *service_interface,
252 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
254 ZigbeeServiceInterfaceRespCbData_t *cb_data =
255 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
257 ZigbeeZcl_scene *scene_object = NULL;
258 GDBusMethodInvocation *invocation = NULL;
260 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
262 NOT_USED(service_interface);
263 NOT_USED(request_id);
265 if (NULL == resp_data || 0 == resp_data_len) {
266 Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
271 scene_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
272 zblib_check_null_free_and_ret("scene_object", scene_object, cb_data);
274 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
275 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
277 zigbee_zcl_scene_complete_remove_scene(scene_object, invocation, payload->result);
282 static gboolean on_zcl_scene_remove_scene(ZigbeeZcl_scene *zcl_scene_object,
283 GDBusMethodInvocation *invocation,
290 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
291 ZigbeeZclSceneRemoveScene_t req;
292 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
296 memset(&req, 0x0, sizeof(ZigbeeZclSceneRemoveScene_t));
298 /* Update request structure */
299 req.node_id = node_id;
300 req.dest_ep = dest_ep;
301 req.group_id = group_id;
302 req.scene_id = scene_id;
304 /* Allocate response callback data */
306 zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object,
307 invocation, NULL, 0);
308 if (NULL == resp_cb_data) {
309 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
311 /* Send failure response */
312 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
317 /* Dispatch request */
318 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
319 ZBLIB_DRIVER_TYPE_ZCL_SCENE,
320 ZBLIB_ZCL_SCENE_OPS_REMOVE_SCENE,
322 on_zcl_scene_remove_scene_resp, resp_cb_data);
324 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
326 /* Free response callback data */
327 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
329 /* Send failure response */
330 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
338 static void on_zcl_scene_store_scene_resp(ZigBeeServiceInterface *service_interface,
339 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
341 ZigbeeServiceInterfaceRespCbData_t *cb_data =
342 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
344 ZigbeeZcl_scene *scene_object = NULL;
345 GDBusMethodInvocation *invocation = NULL;
347 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
349 NOT_USED(service_interface);
350 NOT_USED(request_id);
352 if (NULL == resp_data || 0 == resp_data_len) {
353 Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
358 scene_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
359 zblib_check_null_free_and_ret("scene_object", scene_object, cb_data);
361 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
362 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
364 zigbee_zcl_scene_complete_store_scene(scene_object, invocation, payload->result);
369 static gboolean on_zcl_scene_store_scene(ZigbeeZcl_scene *zcl_scene_object,
370 GDBusMethodInvocation *invocation,
377 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
378 ZigbeeZclSceneStoreScene_t req;
379 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
383 memset(&req, 0x0, sizeof(ZigbeeZclSceneStoreScene_t));
385 /* Update request structure */
386 req.node_id = node_id;
387 req.dest_ep = dest_ep;
388 req.group_id = group_id;
389 req.scene_id = scene_id;
391 /* Allocate response callback data */
393 zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object,
394 invocation, NULL, 0);
395 if (NULL == resp_cb_data) {
396 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
398 /* Send failure response */
399 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
404 /* Dispatch request */
405 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
406 ZBLIB_DRIVER_TYPE_ZCL_SCENE,
407 ZBLIB_ZCL_SCENE_OPS_STORE_SCENE,
409 on_zcl_scene_store_scene_resp, resp_cb_data);
411 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
413 /* Free response callback data */
414 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
416 /* Send failure response */
417 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
425 static void on_zcl_scene_recall_scene_resp(ZigBeeServiceInterface *service_interface,
426 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
428 ZigbeeServiceInterfaceRespCbData_t *cb_data =
429 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
431 ZigbeeZcl_scene *scene_object = NULL;
432 GDBusMethodInvocation *invocation = NULL;
434 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
436 NOT_USED(service_interface);
437 NOT_USED(request_id);
439 if (NULL == resp_data || 0 == resp_data_len) {
440 Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
445 scene_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
446 zblib_check_null_free_and_ret("scene_object", scene_object, cb_data);
448 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
449 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
451 zigbee_zcl_scene_complete_recall_scene(scene_object, invocation, payload->result);
456 static gboolean on_zcl_scene_recall_scene(ZigbeeZcl_scene *zcl_scene_object,
457 GDBusMethodInvocation *invocation,
464 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
465 ZigbeeZclSceneRecallScene_t req;
466 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
470 memset(&req, 0x0, sizeof(ZigbeeZclSceneRecallScene_t));
472 /* Update request structure */
473 req.node_id = node_id;
474 req.dest_ep = dest_ep;
475 req.group_id = group_id;
476 req.scene_id = scene_id;
478 /* Allocate response callback data */
480 zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object,
481 invocation, NULL, 0);
482 if (NULL == resp_cb_data) {
483 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
485 /* Send failure response */
486 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
491 /* Dispatch request */
492 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
493 ZBLIB_DRIVER_TYPE_ZCL_SCENE,
494 ZBLIB_ZCL_SCENE_OPS_RECALL_SCENE,
496 on_zcl_scene_recall_scene_resp, resp_cb_data);
498 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
500 /* Free response callback data */
501 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
503 /* Send failure response */
504 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
512 static void on_zcl_scene_remove_all_scene_resp(ZigBeeServiceInterface *service_interface,
513 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
515 ZigbeeServiceInterfaceRespCbData_t *cb_data =
516 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
518 ZigbeeZcl_scene *scene_object = NULL;
519 GDBusMethodInvocation *invocation = NULL;
521 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
523 NOT_USED(service_interface);
524 NOT_USED(request_id);
526 if (NULL == resp_data || 0 == resp_data_len) {
527 Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
532 scene_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
533 zblib_check_null_free_and_ret("scene_object", scene_object, cb_data);
535 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
536 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
538 zigbee_zcl_scene_complete_remove_all_scene(scene_object, invocation, payload->result);
543 static gboolean on_zcl_scene_remove_all_scene(ZigbeeZcl_scene *zcl_scene_object,
544 GDBusMethodInvocation *invocation,
550 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
551 ZigbeeZclSceneRemoveAllScene_t req;
552 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
556 memset(&req, 0x0, sizeof(ZigbeeZclSceneRemoveAllScene_t));
558 /* Update request structure */
559 req.node_id = node_id;
560 req.dest_ep = dest_ep;
561 req.group_id = group_id;
563 /* Allocate response callback data */
565 zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object,
566 invocation, NULL, 0);
567 if (NULL == resp_cb_data) {
568 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
570 /* Send failure response */
571 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
576 /* Dispatch request */
577 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
578 ZBLIB_DRIVER_TYPE_ZCL_SCENE,
579 ZBLIB_ZCL_SCENE_OPS_REMOVE_ALL_SCENE,
581 on_zcl_scene_remove_all_scene_resp, resp_cb_data);
583 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
585 /* Free response callback data */
586 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
588 /* Send failure response */
589 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
597 static void on_zcl_scene_get_scene_membership_resp(ZigBeeServiceInterface *service_interface,
598 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
600 ZigbeeServiceInterfaceRespCbData_t *cb_data =
601 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
603 ZigbeeZcl_scene *scene_object = NULL;
604 GDBusMethodInvocation *invocation = NULL;
606 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
608 NOT_USED(service_interface);
609 NOT_USED(request_id);
611 if (NULL == resp_data || 0 == resp_data_len) {
612 Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
617 scene_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
618 zblib_check_null_free_and_ret("scene_object", scene_object, cb_data);
620 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
621 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
623 zigbee_zcl_scene_complete_get_scene_membership(scene_object, invocation, payload->result);
628 static gboolean on_zcl_scene_get_scene_membership(ZigbeeZcl_scene *zcl_scene_object,
629 GDBusMethodInvocation *invocation,
635 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
636 ZigbeeZclSceneGetSceneMembership_t req;
637 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
641 memset(&req, 0x0, sizeof(ZigbeeZclSceneGetSceneMembership_t));
643 /* Update request structure */
644 req.node_id = node_id;
645 req.dest_ep = dest_ep;
646 req.group_id = group_id;
648 /* Allocate response callback data */
650 zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object,
651 invocation, NULL, 0);
652 if (NULL == resp_cb_data) {
653 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
655 /* Send failure response */
656 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
661 /* Dispatch request */
662 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
663 ZBLIB_DRIVER_TYPE_ZCL_SCENE,
664 ZBLIB_ZCL_SCENE_OPS_GET_SCENE_MEMBERSHIP,
666 on_zcl_scene_get_scene_membership_resp, resp_cb_data);
668 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
670 /* Free response callback data */
671 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
673 /* Send failure response */
674 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
682 void zigbee_service_dbus_interface_zcl_scene_notification(ZigBeeServiceInterface *service_interface,
683 guint noti_id, gpointer noti_data, guint noti_data_len, gpointer noti_cb_data)
685 ZigbeeZcl_scene *scene_object;
687 zblib_check_null_ret("service_interface", service_interface);
689 if (NULL == noti_data || 0 == noti_data_len) {
690 Z_LOGE("noti_data=%p or noti_data_len=%d is null", noti_data, noti_data_len);
694 scene_object = _service_interface_ref_zigbee_zcl_scene(service_interface);
695 zblib_check_null_ret("scene_object", scene_object);
697 NOT_USED(noti_cb_data);
700 case ZBLIB_ZCL_SCENE_NOTI_ADD_SCENE: {
701 ZigbeeZclSceneAddSceneResp_t *rsp = (ZigbeeZclSceneAddSceneResp_t*)noti_data;
703 Z_LOGD("'add_scene_rsp' from : [0x%X]", rsp->node_id);
705 zigbee_zcl_scene_emit_add_scene_rsp(scene_object, rsp->node_id, rsp->src_ep,
706 rsp->status, rsp->group_id, rsp->scene_id);
709 case ZBLIB_ZCL_SCENE_NOTI_VIEW_SCENE: {
712 GVariant* scene_name = NULL;
713 GVariantBuilder *attr_builder = NULL;
714 GVariant* ext_field_set = NULL;
715 GVariantBuilder *attr_builder1 = NULL;
717 ZigbeeZclSceneViewSceneResp_t *rsp = (ZigbeeZclSceneViewSceneResp_t*)noti_data;
719 Z_LOGD("'view_scene_rsp' from : [0x%X]", rsp->node_id);
721 attr_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
722 for (i = 0; rsp->scene_name[i] && i < ZIGBEE_ZCL_SCENE_NAME_MAX_LEN; i++)
723 g_variant_builder_add(attr_builder, "(y)", rsp->scene_name[i]);
724 scene_name = g_variant_builder_end(attr_builder);
725 g_variant_builder_unref(attr_builder);
728 attr_builder1 = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
729 for (i = 0; i < rsp->ext_field_set_len; i++)
730 g_variant_builder_add(attr_builder1, "(y)", rsp->ext_field_set[i]);
731 ext_field_set = g_variant_builder_end(attr_builder1);
732 g_variant_builder_unref(attr_builder1);
734 zigbee_zcl_scene_emit_view_scene_rsp(scene_object, rsp->node_id, rsp->src_ep,
735 rsp->status, rsp->group_id, rsp->scene_id, rsp->transition_time,
736 scene_name, rsp->ext_field_set_len, ext_field_set);
739 case ZBLIB_ZCL_SCENE_NOTI_REMOVE_SCENE: {
740 ZigbeeZclSceneRemoveSceneResp_t *rsp = (ZigbeeZclSceneRemoveSceneResp_t*)noti_data;
742 Z_LOGD("'remove_scene_rsp' from : [0x%X]", rsp->node_id);
744 zigbee_zcl_scene_emit_remove_scene_rsp(scene_object, rsp->node_id, rsp->src_ep,
745 rsp->status, rsp->group_id, rsp->scene_id);
748 case ZBLIB_ZCL_SCENE_NOTI_REMOVE_ALL_SCENE: {
749 ZigbeeZclSceneRemoveAllSceneResp_t *rsp =
750 (ZigbeeZclSceneRemoveAllSceneResp_t*)noti_data;
752 Z_LOGD("'remove_all_scene_rsp' from : [0x%X]", rsp->node_id);
754 zigbee_zcl_scene_emit_remove_all_scene_rsp(scene_object, rsp->node_id, rsp->src_ep,
755 rsp->status, rsp->group_id);
758 case ZBLIB_ZCL_SCENE_NOTI_STORE_SCENE: {
759 ZigbeeZclSceneStoreSceneResp_t *rsp =
760 (ZigbeeZclSceneStoreSceneResp_t*)noti_data;
762 Z_LOGD("'store_scene_rsp' from : [0x%X]", rsp->node_id);
764 zigbee_zcl_scene_emit_store_scene_rsp(scene_object, rsp->node_id, rsp->src_ep,
765 rsp->status, rsp->group_id, rsp->scene_id);
768 case ZBLIB_ZCL_SCENE_NOTI_GET_SCENE_MEMBERSHIP: {
770 GVariant* scene_list = NULL;
771 GVariantBuilder *attr_builder = NULL;
773 ZigbeeZclSceneGetSceneMembershipResp_t *rsp =
774 (ZigbeeZclSceneGetSceneMembershipResp_t*)noti_data;
776 Z_LOGD("'get_scene_rsp' from : [0x%X]", rsp->node_id);
778 attr_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
779 for (i = 0; i < rsp->scene_count; i++)
780 g_variant_builder_add(attr_builder, "(y)", rsp->scene_list[i]);
781 scene_list = g_variant_builder_end(attr_builder);
782 g_variant_builder_unref(attr_builder);
784 zigbee_zcl_scene_emit_get_scene_membership_rsp(scene_object, rsp->node_id, rsp->src_ep,
785 rsp->status, rsp->capacity, rsp->group_id, rsp->scene_count, scene_list);
789 Z_LOGE("Unexpected notification [%x]", noti_id);
793 /* ZigbeeZcl_scene should be dereferenced */
794 g_object_unref(scene_object);
797 gboolean zigbee_service_dbus_interface_zcl_scene_init(ZigBeeServiceInterface *service_interface,
798 ZigbeeObjectSkeleton *zigbee_object)
800 ZigbeeZcl_scene *zcl_scene_object;
802 if (NULL == service_interface) {
803 Z_LOGE("service_interface is NULL");
807 zcl_scene_object = zigbee_zcl_scene_skeleton_new();
808 zigbee_object_skeleton_set_zcl_scene(zigbee_object, zcl_scene_object);
809 g_object_unref(zcl_scene_object);
811 Z_LOGI("zcl_scene_object: [%p]", zcl_scene_object);
814 * Register signal handlers for 'zcl_scene' interface
816 g_signal_connect(zcl_scene_object,
818 G_CALLBACK(on_zcl_scene_add_scene), service_interface);
820 g_signal_connect(zcl_scene_object,
822 G_CALLBACK(on_zcl_scene_view_scene), service_interface);
824 g_signal_connect(zcl_scene_object,
825 "handle-remove-scene",
826 G_CALLBACK(on_zcl_scene_remove_scene), service_interface);
828 g_signal_connect(zcl_scene_object,
829 "handle-store-scene",
830 G_CALLBACK(on_zcl_scene_store_scene), service_interface);
832 g_signal_connect(zcl_scene_object,
833 "handle-recall-scene",
834 G_CALLBACK(on_zcl_scene_recall_scene), service_interface);
836 g_signal_connect(zcl_scene_object,
837 "handle-remove-all-scene",
838 G_CALLBACK(on_zcl_scene_remove_all_scene), service_interface);
840 g_signal_connect(zcl_scene_object,
841 "handle-get-scene-membership",
842 G_CALLBACK(on_zcl_scene_get_scene_membership), service_interface);