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_service.h>
23 static void *_service_interface_ref_zigbee_service(ZigBeeServiceInterface *service_interface)
25 ZigbeeObjectSkeleton *zigbee_object = NULL;
26 ZigbeeCustomData_t *custom_data = NULL;
27 ZigbeeService *service = NULL;
29 custom_data = (ZigbeeCustomData_t *)zblib_service_interface_ref_user_data(service_interface);
30 if (NULL == custom_data) {
31 Z_LOGE("D-BUS service interface custom_data is NULL!");
35 /* Get zigbee object */
36 zigbee_object = g_hash_table_lookup(custom_data->objects, ZIGBEE_SERVICE_PATH);
37 if (NULL == zigbee_object) {
38 Z_LOGW("Cannot find ZigBee D-BUS interface object!", zigbee_object);
42 service = zigbee_object_get_service(ZIGBEE_OBJECT(zigbee_object));
46 static void on_service_enable_resp(ZigBeeServiceInterface *service_interface,
47 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
49 ZigbeeServiceInterfaceRespCbData_t *cb_data =
50 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
52 ZigbeeService *service_object;
53 GDBusMethodInvocation *invocation;
54 ZigbeeServiceServiceState_t *payload =
55 (ZigbeeServiceServiceState_t*)resp_data;
57 NOT_USED(service_interface);
60 if (NULL == resp_data || 0 == resp_data_len) {
61 Z_LOGE("resp_data is null");
65 service_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
66 zblib_check_null_ret("service_object", service_object);
68 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
69 zblib_check_null_ret("invocation", invocation);
71 zigbee_service_complete_enable(service_object, invocation,
72 payload->result, payload->enabled);
77 static gboolean on_service_enable(ZigbeeService *service_object,
78 GDBusMethodInvocation *invocation,
81 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
82 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
88 /* Allocate response callback data */
90 zigbee_service_dbus_interface_create_resp_cb_data(service_object,
92 if (NULL == resp_cb_data) {
93 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
95 /* Send failure response */
96 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
101 /* Dispatch request */
102 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
103 ZBLIB_DRIVER_TYPE_SERVICE,
104 ZBLIB_SERVICE_OPS_ENABLE,
106 on_service_enable_resp, resp_cb_data);
108 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
110 /* Free response callback data */
111 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
113 /* Send failure response */
114 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
122 static void on_service_disable_resp(ZigBeeServiceInterface *service_interface,
123 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
125 ZigbeeServiceInterfaceRespCbData_t *cb_data =
126 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
128 ZigbeeService *service_object;
129 GDBusMethodInvocation *invocation;
130 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t*)resp_data;
132 NOT_USED(service_interface);
133 NOT_USED(request_id);
135 if (NULL == resp_data || 0 == resp_data_len) {
136 Z_LOGE("resp_data is null");
140 service_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
141 zblib_check_null_ret("service_object", service_object);
143 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
144 zblib_check_null_ret("invocation", invocation);
146 zigbee_service_complete_disable(service_object, invocation, payload->result);
151 static gboolean on_service_disable(ZigbeeService *service_object,
152 GDBusMethodInvocation *invocation,
155 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
156 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
160 /* Allocate response callback data */
162 zigbee_service_dbus_interface_create_resp_cb_data(service_object,
163 invocation, NULL, 0);
164 if (NULL == resp_cb_data) {
165 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
167 /* Send failure response */
168 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
173 /* Dispatch request */
174 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
175 ZBLIB_DRIVER_TYPE_SERVICE,
176 ZBLIB_SERVICE_OPS_DISABLE,
178 on_service_disable_resp, resp_cb_data);
180 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
182 /* Free response callback data */
183 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
185 /* Send failure response */
186 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
194 static void on_service_zb_hw_reset_resp(ZigBeeServiceInterface *service_interface,
195 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
197 ZigbeeServiceInterfaceRespCbData_t *cb_data =
198 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
200 ZigbeeService *service_object;
201 GDBusMethodInvocation *invocation;
202 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t*)resp_data;
204 NOT_USED(service_interface);
205 NOT_USED(request_id);
207 if (NULL == resp_data || 0 == resp_data_len) {
208 Z_LOGE("resp_data is null");
212 service_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
213 zblib_check_null_ret("service_object", service_object);
215 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
216 zblib_check_null_ret("invocation", invocation);
218 zigbee_service_complete_zb_hw_reset(service_object, invocation, payload->result);
223 static gboolean on_service_zb_hw_reset(ZigbeeService *service_object,
224 GDBusMethodInvocation *invocation,
227 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
228 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
232 /* Allocate response callback data */
234 zigbee_service_dbus_interface_create_resp_cb_data(service_object,
235 invocation, NULL, 0);
236 if (NULL == resp_cb_data) {
237 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
239 /* Send failure response */
240 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
245 /* Dispatch request */
246 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
247 ZBLIB_DRIVER_TYPE_SERVICE,
248 ZBLIB_SERVICE_OPS_ZB_HW_RESET,
250 on_service_zb_hw_reset_resp, resp_cb_data);
252 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
254 /* Free response callback data */
255 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
257 /* Send failure response */
258 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
266 static void on_service_form_network_resp(ZigBeeServiceInterface *service_interface,
267 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
269 ZigbeeServiceInterfaceRespCbData_t *cb_data =
270 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
272 ZigbeeService *service_object;
273 GDBusMethodInvocation *invocation;
274 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t*)resp_data;
276 NOT_USED(service_interface);
277 NOT_USED(request_id);
279 if (NULL == resp_data || 0 == resp_data_len) {
280 Z_LOGE("resp_data is null");
284 service_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
285 zblib_check_null_ret("service_object", service_object);
287 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
288 zblib_check_null_ret("invocation", invocation);
290 zigbee_service_complete_form_network(service_object, invocation, payload->result);
295 static gboolean on_service_form_network(ZigbeeService *service_object,
296 GDBusMethodInvocation *invocation,
299 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
300 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
304 /* Allocate response callback data */
306 zigbee_service_dbus_interface_create_resp_cb_data(service_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_SERVICE,
320 ZBLIB_SERVICE_OPS_FORM_NETWORK,
322 on_service_form_network_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_service_coex_start_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 ZigbeeService *service_object;
345 GDBusMethodInvocation *invocation;
346 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t*)resp_data;
348 NOT_USED(service_interface);
349 NOT_USED(request_id);
351 if (NULL == resp_data || 0 == resp_data_len) {
352 Z_LOGE("resp_data is null");
356 service_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
357 zblib_check_null_ret("service_object", service_object);
359 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
360 zblib_check_null_ret("invocation", invocation);
362 zigbee_service_complete_coex_start(service_object, invocation, payload->result);
367 static gboolean on_service_coex_start(ZigbeeService *service_object,
368 GDBusMethodInvocation *invocation,
372 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
373 ZigbeeServiceCoexStart_t req;
374 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
378 memset(&req, 0x0, sizeof(ZigbeeServiceCoexStart_t));
380 /* Update request structure */
381 req.channel = channel;
383 /* Allocate response callback data */
385 zigbee_service_dbus_interface_create_resp_cb_data(service_object,
386 invocation, NULL, 0);
387 if (NULL == resp_cb_data) {
388 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
390 /* Send failure response */
391 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
396 /* Dispatch request */
397 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
398 ZBLIB_DRIVER_TYPE_SERVICE,
399 ZBLIB_SERVICE_OPS_COEX_START,
401 on_service_coex_start_resp, resp_cb_data);
403 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
405 /* Free response callback data */
406 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
408 /* Send failure response */
409 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
417 static void on_service_coex_stop_resp(ZigBeeServiceInterface *service_interface,
418 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
420 ZigbeeServiceInterfaceRespCbData_t *cb_data =
421 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
423 ZigbeeService *service_object;
424 GDBusMethodInvocation *invocation;
425 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t*)resp_data;
427 NOT_USED(service_interface);
428 NOT_USED(request_id);
430 if (NULL == resp_data || 0 == resp_data_len) {
431 Z_LOGE("resp_data is null");
435 service_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
436 zblib_check_null_ret("service_object", service_object);
438 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
439 zblib_check_null_ret("invocation", invocation);
441 zigbee_service_complete_coex_stop(service_object, invocation, payload->result);
446 static gboolean on_service_coex_stop(ZigbeeService *service_object,
447 GDBusMethodInvocation *invocation,
450 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
451 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
455 /* Allocate response callback data */
457 zigbee_service_dbus_interface_create_resp_cb_data(service_object,
458 invocation, NULL, 0);
459 if (NULL == resp_cb_data) {
460 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
462 /* Send failure response */
463 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
468 /* Dispatch request */
469 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
470 ZBLIB_DRIVER_TYPE_SERVICE,
471 ZBLIB_SERVICE_OPS_COEX_STOP,
473 on_service_coex_stop_resp, resp_cb_data);
475 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
477 /* Free response callback data */
478 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
480 /* Send failure response */
481 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
489 static void on_service_leave_network_resp(ZigBeeServiceInterface *service_interface,
490 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
492 ZigbeeServiceInterfaceRespCbData_t *cb_data =
493 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
495 ZigbeeService *service_object;
496 GDBusMethodInvocation *invocation;
497 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t*)resp_data;
499 NOT_USED(service_interface);
500 NOT_USED(request_id);
502 if (NULL == resp_data || 0 == resp_data_len) {
503 Z_LOGE("resp_data is null");
507 service_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
508 zblib_check_null_ret("service_object", service_object);
510 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
511 zblib_check_null_ret("invocation", invocation);
513 zigbee_service_complete_leave_network(service_object, invocation, payload->result);
518 static gboolean on_service_leave_network(ZigbeeService *service_object,
519 GDBusMethodInvocation *invocation,
522 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
523 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
527 /* Allocate response callback data */
529 zigbee_service_dbus_interface_create_resp_cb_data(service_object,
530 invocation, NULL, 0);
531 if (NULL == resp_cb_data) {
532 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
534 /* Send failure response */
535 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
540 /* Dispatch request */
541 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
542 ZBLIB_DRIVER_TYPE_SERVICE,
543 ZBLIB_SERVICE_OPS_LEAVE_NETWORK,
545 on_service_leave_network_resp, resp_cb_data);
547 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
549 /* Free response callback data */
550 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
552 /* Send failure response */
553 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
561 static void on_service_get_network_info_resp(ZigBeeServiceInterface *service_interface,
562 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
564 ZigbeeServiceInterfaceRespCbData_t *cb_data =
565 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
567 ZigbeeService *service_object;
568 GDBusMethodInvocation *invocation;
570 ZigbeeServiceGetNetworkInfo_t *payload =
571 (ZigbeeServiceGetNetworkInfo_t*)resp_data;
575 NOT_USED(service_interface);
576 NOT_USED(request_id);
578 if (NULL == resp_data || 0 == resp_data_len) {
579 Z_LOGE("resp_data is null");
583 service_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
584 zblib_check_null_ret("service_object", service_object);
586 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
587 zblib_check_null_ret("invocation", invocation);
589 v_eui64 = g_variant_new_from_data(G_VARIANT_TYPE("a(y)"),
590 payload->eui64, ZIGBEE_EUI64_SIZE, TRUE, NULL, NULL);
592 zigbee_service_complete_get_network_info(service_object, invocation,
593 payload->result, v_eui64, payload->node_id,
594 payload->pan_id, payload->channel, payload->radio_tx_power);
599 static gboolean on_service_get_network_info(ZigbeeService *service_object,
600 GDBusMethodInvocation *invocation,
603 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
604 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
608 /* Allocate response callback data */
610 zigbee_service_dbus_interface_create_resp_cb_data(service_object,
611 invocation, NULL, 0);
612 if (NULL == resp_cb_data) {
613 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
615 /* Send failure response */
616 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
621 /* Dispatch request */
622 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
623 ZBLIB_DRIVER_TYPE_SERVICE,
624 ZBLIB_SERVICE_OPS_GET_NETWORK_INFO,
626 on_service_get_network_info_resp, resp_cb_data);
628 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
630 /* Free response callback data */
631 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
633 /* Send failure response */
634 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
642 static void on_service_permit_join_resp(ZigBeeServiceInterface *service_interface,
643 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
645 ZigbeeServiceInterfaceRespCbData_t *cb_data =
646 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
648 ZigbeeService *service_object;
649 GDBusMethodInvocation *invocation;
650 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t*)resp_data;
652 NOT_USED(service_interface);
653 NOT_USED(request_id);
655 if (NULL == resp_data || 0 == resp_data_len) {
656 Z_LOGE("resp_data is null");
660 service_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
661 zblib_check_null_ret("service_object", service_object);
663 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
664 zblib_check_null_ret("invocation", invocation);
666 zigbee_service_complete_permit_join(service_object, invocation, payload->result);
671 static gboolean on_service_permit_join(ZigbeeService *service_object,
672 GDBusMethodInvocation *invocation,
674 gboolean permit_join,
677 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
678 ZigbeeServicePermitJoin_t req;
679 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
683 memset(&req, 0x0, sizeof(ZigbeeServicePermitJoin_t));
685 /* Update request structure */
686 req.duration = duration;
687 req.permit_join = permit_join;
689 /* Allocate response callback data */
691 zigbee_service_dbus_interface_create_resp_cb_data(service_object,
692 invocation, NULL, 0);
693 if (NULL == resp_cb_data) {
694 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
696 /* Send failure response */
697 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
702 /* Dispatch request */
703 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
704 ZBLIB_DRIVER_TYPE_SERVICE,
705 ZBLIB_SERVICE_OPS_PERMIT_JOIN,
707 on_service_permit_join_resp, resp_cb_data);
709 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
711 /* Free response callback data */
712 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
714 /* Send failure response */
715 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
723 static void on_service_leave_request_resp(ZigBeeServiceInterface *service_interface,
724 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
726 ZigbeeServiceInterfaceRespCbData_t *cb_data =
727 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
729 ZigbeeService *service_object;
730 GDBusMethodInvocation *invocation;
731 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t*)resp_data;
733 NOT_USED(service_interface);
734 NOT_USED(request_id);
736 if (NULL == resp_data || 0 == resp_data_len) {
737 Z_LOGE("resp_data is null");
741 service_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
742 zblib_check_null_ret("service_object", service_object);
744 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
745 zblib_check_null_ret("invocation", invocation);
747 zigbee_service_complete_leave_request(service_object, invocation, payload->result);
752 static gboolean on_service_leave_request(ZigbeeService *service_object,
753 GDBusMethodInvocation *invocation,
759 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
760 ZigbeeServiceLeaveRequest_t req;
761 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
763 GVariantIter *iter = NULL;
768 memset(&req, 0x0, sizeof(ZigbeeServiceLeaveRequest_t));
770 /* Update request structure */
771 g_variant_get(eui64, "ay", &iter);
772 while (g_variant_iter_loop(iter, "y", req.eui64[i])) {
774 if (i >= ZIGBEE_EUI64_SIZE)
777 req.remove_child = remove_child;
780 /* Allocate response callback data */
782 zigbee_service_dbus_interface_create_resp_cb_data(service_object,
783 invocation, NULL, 0);
784 if (NULL == resp_cb_data) {
785 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
787 /* Send failure response */
788 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
793 /* Dispatch request */
794 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
795 ZBLIB_DRIVER_TYPE_SERVICE,
796 ZBLIB_SERVICE_OPS_LEAVE_REQUEST,
798 on_service_leave_request_resp, resp_cb_data);
800 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
802 /* Free response callback data */
803 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
805 /* Send failure response */
806 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
814 static void on_service_get_device_list_resp(ZigBeeServiceInterface *service_interface,
815 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
817 ZigbeeServiceInterfaceRespCbData_t *cb_data =
818 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
820 ZigbeeService *service_object;
821 GDBusMethodInvocation *invocation;
823 NOT_USED(service_interface);
824 NOT_USED(request_id);
826 if (NULL == resp_data || 0 == resp_data_len) {
827 Z_LOGE("resp_data is null");
832 service_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
833 zblib_check_null_ret("service_object", service_object);
835 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
836 zblib_check_null_ret("invocation", invocation);
838 /* To-To : zigbee_service_complete_get_device_list */
839 //zigbee_service_complete_get_device_list(service_object, invocation, resp_data);
844 static gboolean on_service_get_device_list(ZigbeeService *service_object,
845 GDBusMethodInvocation *invocation,
848 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
849 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
853 /* Allocate response callback data */
855 zigbee_service_dbus_interface_create_resp_cb_data(service_object,
856 invocation, NULL, 0);
857 if (NULL == resp_cb_data) {
858 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
860 /* Send failure response */
861 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
866 /* Dispatch request */
867 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
868 ZBLIB_DRIVER_TYPE_SERVICE,
869 ZBLIB_SERVICE_OPS_GET_DEVICE_LIST,
871 on_service_get_device_list_resp, resp_cb_data);
873 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
875 /* Free response callback data */
876 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
878 /* Send failure response */
879 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
887 static void on_service_get_mac_resp(ZigBeeServiceInterface *service_interface,
888 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
890 ZigbeeServiceInterfaceRespCbData_t *cb_data =
891 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
893 ZigbeeService *service_object;
894 GDBusMethodInvocation *invocation;
897 NOT_USED(service_interface);
898 NOT_USED(request_id);
900 if (NULL == resp_data || 0 == resp_data_len) {
901 Z_LOGE("resp_data is null");
906 service_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
907 zblib_check_null_ret("service_object", service_object);
909 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
910 zblib_check_null_ret("invocation", invocation);
912 /* Todo : plugin must load resp_data as char pointer */
913 //zigbee_service_complete_get_mac(service_object, invocation, resp_data);
919 static gboolean on_service_get_mac(ZigbeeService *service_object,
920 GDBusMethodInvocation *invocation,
923 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
924 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
928 /* Allocate response callback data */
930 zigbee_service_dbus_interface_create_resp_cb_data(service_object,
931 invocation, NULL, 0);
932 if (NULL == resp_cb_data) {
933 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
935 /* Send failure response */
936 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
941 /* Dispatch request */
942 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
943 ZBLIB_DRIVER_TYPE_SERVICE,
944 ZBLIB_SERVICE_OPS_GET_MAC,
946 on_service_get_mac_resp, resp_cb_data);
948 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
950 /* Free response callback data */
951 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
953 /* Send failure response */
954 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
962 static void on_service_get_device_info_resp(ZigBeeServiceInterface *service_interface,
963 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
965 ZigbeeServiceInterfaceRespCbData_t *cb_data =
966 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
968 ZigbeeService *service_object;
969 GDBusMethodInvocation *invocation;
972 NOT_USED(service_interface);
973 NOT_USED(request_id);
975 if (NULL == resp_data || 0 == resp_data_len) {
976 Z_LOGE("resp_data is null");
981 service_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
982 zblib_check_null_ret("service_object", service_object);
984 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
985 zblib_check_null_ret("invocation", invocation);
987 /* To-Do : zigbee_service_complete_get_device_list */
988 //zigbee_service_complete_get_device_info(service_object, invocation, resp_data);
993 static gboolean on_service_get_device_info(ZigbeeService *service_object,
994 GDBusMethodInvocation *invocation,
997 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
998 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
1002 /* Allocate response callback data */
1004 zigbee_service_dbus_interface_create_resp_cb_data(service_object,
1005 invocation, NULL, 0);
1006 if (NULL == resp_cb_data) {
1007 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
1009 /* Send failure response */
1010 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
1015 /* Dispatch request */
1016 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
1017 ZBLIB_DRIVER_TYPE_SERVICE,
1018 ZBLIB_SERVICE_OPS_GET_DEVICE_INFO,
1020 on_service_get_device_info_resp, resp_cb_data);
1022 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
1024 /* Free response callback data */
1025 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
1027 /* Send failure response */
1028 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
1036 static void on_service_get_endpoint_list_resp(ZigBeeServiceInterface *service_interface,
1037 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
1039 ZigbeeServiceInterfaceRespCbData_t *cb_data =
1040 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
1042 ZigbeeService *service_object;
1043 GDBusMethodInvocation *invocation;
1046 NOT_USED(service_interface);
1047 NOT_USED(request_id);
1049 if (NULL == resp_data || 0 == resp_data_len) {
1050 Z_LOGE("resp_data is null");
1055 service_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
1056 zblib_check_null_ret("service_object", service_object);
1058 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
1059 zblib_check_null_ret("invocation", invocation);
1061 /* To fix : end-points must be changed gchar* -> GVariant ay */
1062 //zigbee_service_complete_get_endpoint_list(service_object, invocation, resp_data);
1067 static gboolean on_service_get_endpoint_list(ZigbeeService *service_object,
1068 GDBusMethodInvocation *invocation,
1072 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
1073 ZigbeeServiceGetEndpointList_t req;
1074 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
1076 GVariantIter *iter = NULL;
1081 memset(&req, 0x0, sizeof(ZigbeeServiceGetEndpointList_t));
1083 /* Update request structure */
1084 g_variant_get(eui64, "ay", &iter);
1085 while (g_variant_iter_loop(iter, "y", req.eui64[i])) {
1087 if (i >= ZIGBEE_EUI64_SIZE)
1091 /* Allocate response callback data */
1093 zigbee_service_dbus_interface_create_resp_cb_data(service_object,
1094 invocation, NULL, 0);
1095 if (NULL == resp_cb_data) {
1096 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
1098 /* Send failure response */
1099 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
1104 /* Dispatch request */
1105 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
1106 ZBLIB_DRIVER_TYPE_SERVICE,
1107 ZBLIB_SERVICE_OPS_GET_ENDPOINT_LIST,
1109 on_service_get_endpoint_list_resp, resp_cb_data);
1111 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
1113 /* Free response callback data */
1114 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
1116 /* Send failure response */
1117 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
1125 static void on_service_get_cluster_list_resp(ZigBeeServiceInterface *service_interface,
1126 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
1128 ZigbeeServiceInterfaceRespCbData_t *cb_data =
1129 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
1131 ZigbeeService *service_object;
1132 GDBusMethodInvocation *invocation;
1135 NOT_USED(service_interface);
1136 NOT_USED(request_id);
1138 if (NULL == resp_data || 0 == resp_data_len) {
1139 Z_LOGE("resp_data is null");
1144 service_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
1145 zblib_check_null_ret("service_object", service_object);
1147 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
1148 zblib_check_null_ret("invocation", invocation);
1150 /* To-Do : zigbee_service_complete_get_cluster_list */
1151 //zigbee_service_complete_get_cluster_list(service_object, invocation, resp_data);
1156 static gboolean on_service_get_cluster_list(ZigbeeService *service_object,
1157 GDBusMethodInvocation *invocation,
1162 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
1163 ZigbeeServiceGetClusterList_t req;
1164 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
1166 GVariantIter *iter = NULL;
1171 memset(&req, 0x0, sizeof(ZigbeeServiceGetClusterList_t));
1173 /* Update request structure */
1174 g_variant_get(eui64, "ay", &iter);
1175 while (g_variant_iter_loop(iter, "y", req.eui64[i])) {
1177 if (i >= ZIGBEE_EUI64_SIZE)
1180 req.endpoint = endpoint;
1182 /* Allocate response callback data */
1184 zigbee_service_dbus_interface_create_resp_cb_data(service_object,
1185 invocation, NULL, 0);
1186 if (NULL == resp_cb_data) {
1187 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
1189 /* Send failure response */
1190 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
1195 /* Dispatch request */
1196 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
1197 ZBLIB_DRIVER_TYPE_SERVICE,
1198 ZBLIB_SERVICE_OPS_GET_CLUSTER_LIST,
1200 on_service_get_cluster_list_resp, resp_cb_data);
1202 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
1204 /* Free response callback data */
1205 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
1207 /* Send failure response */
1208 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
1216 static void on_service_get_node_type_resp(ZigBeeServiceInterface *service_interface,
1217 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
1219 ZigbeeServiceInterfaceRespCbData_t *cb_data =
1220 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
1222 ZigbeeService *service_object;
1223 GDBusMethodInvocation *invocation;
1224 ZigbeeServiceServiceNodeType_t *payload =
1225 (ZigbeeServiceServiceNodeType_t *)resp_data;
1228 NOT_USED(service_interface);
1229 NOT_USED(request_id);
1231 if (NULL == resp_data || 0 == resp_data_len) {
1232 Z_LOGE("resp_data is null");
1237 service_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
1238 zblib_check_null_ret("service_object", service_object);
1240 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
1241 zblib_check_null_ret("invocation", invocation);
1243 zigbee_service_complete_get_node_type(service_object, invocation,
1244 payload->result, payload->node_type);
1249 static gboolean on_service_get_node_type(ZigbeeService *service_object,
1250 GDBusMethodInvocation *invocation,
1254 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
1255 ZigbeeServiceGetNodeType_t req;
1256 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
1258 GVariantIter *iter = NULL;
1263 memset(&req, 0x0, sizeof(ZigbeeServiceGetNodeType_t));
1265 /* Update request structure */
1266 g_variant_get(eui64, "ay", &iter);
1267 while (g_variant_iter_loop(iter, "y", req.eui64[i])) {
1269 if (i >= ZIGBEE_EUI64_SIZE)
1273 /* Allocate response callback data */
1275 zigbee_service_dbus_interface_create_resp_cb_data(service_object,
1276 invocation, NULL, 0);
1277 if (NULL == resp_cb_data) {
1278 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
1280 /* Send failure response */
1281 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
1286 /* Dispatch request */
1287 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
1288 ZBLIB_DRIVER_TYPE_SERVICE,
1289 ZBLIB_SERVICE_OPS_GET_NODE_TYPE,
1291 on_service_get_node_type_resp, resp_cb_data);
1293 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
1295 /* Free response callback data */
1296 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
1298 /* Send failure response */
1299 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
1307 void zigbee_service_dbus_interface_service_notification(ZigBeeServiceInterface *service_interface,
1308 guint noti_id, gpointer noti_data, guint noti_data_len, gpointer noti_cb_data)
1310 ZigbeeService *service_object;
1312 zblib_check_null_ret("service_interface", service_interface);
1314 if (NULL == noti_data || 0 == noti_data_len) {
1315 Z_LOGE("noti_data is NULL");
1319 service_object = _service_interface_ref_zigbee_service(service_interface);
1320 zblib_check_null_ret("service_object", service_object);
1322 NOT_USED(noti_cb_data);
1325 case ZBLIB_SERVICE_NOTI_FORM_NETWORK_DONE: {
1326 ZigbeeServiceServiceFormNetworkDone_t *panid_t =
1327 (ZigbeeServiceServiceFormNetworkDone_t*)noti_data;
1329 Z_LOGD("form_network_done : [0x%X]", panid_t->pan_id);
1331 zigbee_service_emit_form_network_done(service_object, panid_t->pan_id);
1334 case ZBLIB_SERVICE_NOTI_CHILD_JOINED: {
1335 zigbee_service_emit_child_joined(service_object, (GVariant *)noti_data);
1338 case ZBLIB_SERVICE_NOTI_CHILD_REJOINED: {
1339 ZigbeeServiceServiceChildRejoined_t ieee_addr_t;
1340 memcpy(&ieee_addr_t, noti_data, noti_data_len);
1341 zigbee_service_emit_child_rejoined(service_object, ieee_addr_t.eui64);
1344 case ZBLIB_SERVICE_NOTI_CHILD_LEFT: {
1345 ZigbeeServiceServiceChildLeft_t child_left_t;
1346 memcpy(&child_left_t, noti_data, noti_data_len);
1347 zigbee_service_emit_child_left(service_object, child_left_t.eui64, child_left_t.status);
1350 case ZBLIB_SERVICE_NOTI_LEAVE_NETWORK_DONE: {
1351 ZigbeeServiceServiceLeaveNetworkDone_t leave_net_t;
1352 memcpy(&leave_net_t, noti_data, noti_data_len);
1353 zigbee_service_emit_leave_network_done(service_object, leave_net_t.pan_id);
1357 Z_LOGE("Unexpected notification [%x]", noti_id);
1361 /* ZigbeeService should be dereferenced */
1362 g_object_unref(service_object);
1365 gboolean zigbee_service_dbus_interface_service_init(ZigBeeServiceInterface *service_interface,
1366 ZigbeeObjectSkeleton *zigbee_object)
1368 ZigbeeService *service_object;
1370 if (NULL == service_interface) {
1371 Z_LOGE("service_interface is NULL");
1375 service_object = zigbee_service_skeleton_new();
1376 zigbee_object_skeleton_set_service(zigbee_object, service_object);
1377 g_object_unref(service_object);
1379 Z_LOGI("service_object: [%p]", service_object);
1382 * Register signal handlers for 'service' interface
1384 g_signal_connect(service_object,
1386 G_CALLBACK(on_service_enable), service_interface);
1388 g_signal_connect(service_object,
1390 G_CALLBACK(on_service_disable), service_interface);
1392 g_signal_connect(service_object,
1393 "handle-zb-hw-reset",
1394 G_CALLBACK(on_service_zb_hw_reset), service_interface);
1396 g_signal_connect(service_object,
1397 "handle-form-network",
1398 G_CALLBACK(on_service_form_network), service_interface);
1400 g_signal_connect(service_object,
1401 "handle-coex-start",
1402 G_CALLBACK(on_service_coex_start), service_interface);
1404 g_signal_connect(service_object,
1406 G_CALLBACK(on_service_coex_stop), service_interface);
1408 g_signal_connect(service_object,
1409 "handle-leave-network",
1410 G_CALLBACK(on_service_leave_network), service_interface);
1412 g_signal_connect(service_object,
1413 "handle-get-network-info",
1414 G_CALLBACK(on_service_get_network_info), service_interface);
1416 g_signal_connect(service_object,
1417 "handle-permit-join",
1418 G_CALLBACK(on_service_permit_join), service_interface);
1420 g_signal_connect(service_object,
1421 "handle-leave-request",
1422 G_CALLBACK(on_service_leave_request), service_interface);
1424 g_signal_connect(service_object,
1425 "handle-get-device-list",
1426 G_CALLBACK(on_service_get_device_list), service_interface);
1428 g_signal_connect(service_object,
1430 G_CALLBACK(on_service_get_mac), service_interface);
1432 g_signal_connect(service_object,
1433 "handle-get-device-info",
1434 G_CALLBACK(on_service_get_device_info), service_interface);
1436 g_signal_connect(service_object,
1437 "handle-get-endpoint-list",
1438 G_CALLBACK(on_service_get_endpoint_list), service_interface);
1440 g_signal_connect(service_object,
1441 "handle-get-cluster-list",
1442 G_CALLBACK(on_service_get_cluster_list), service_interface);
1444 g_signal_connect(service_object,
1445 "handle-get-node-type",
1446 G_CALLBACK(on_service_get_node_type), service_interface);