X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=zigbee-daemon%2Fzigbee-interface%2Fsrc%2Fzigbee_service_dbus_interface_zcl_scene.c;h=dc57f009a1d0c0826453c71e09b560c7256117c4;hb=2885a3f487f668d3526941da7a6b07027aba204e;hp=6c242de9513c22f146c4da064bcebd2121d77b6d;hpb=3f34f77cd7023575fb803d1c25a91105e3e0f5c3;p=platform%2Fcore%2Fconnectivity%2Fzigbee-manager.git diff --git a/zigbee-daemon/zigbee-interface/src/zigbee_service_dbus_interface_zcl_scene.c b/zigbee-daemon/zigbee-interface/src/zigbee_service_dbus_interface_zcl_scene.c index 6c242de..dc57f00 100644 --- a/zigbee-daemon/zigbee-interface/src/zigbee_service_dbus_interface_zcl_scene.c +++ b/zigbee-daemon/zigbee-interface/src/zigbee_service_dbus_interface_zcl_scene.c @@ -18,10 +18,67 @@ #include "zigbee_service_interface_common.h" +#include + +static void *_service_interface_ref_zigbee_zcl_scene( + ZigBeeServiceInterface *service_interface) +{ + ZigbeeObjectSkeleton *zigbee_object = NULL; + ZigbeeCustomData_t *custom_data = NULL; + ZigbeeZcl_scene *scene_object = NULL; + + custom_data = (ZigbeeCustomData_t *)zblib_service_interface_ref_user_data(service_interface); + if (NULL == custom_data) { + Z_LOGE("D-BUS service interface custom_data is NULL!"); + return NULL; + } + + /* Get zigbee object */ + zigbee_object = g_hash_table_lookup(custom_data->objects, ZIGBEE_SERVICE_PATH); + if (NULL == zigbee_object) { + Z_LOGW("Cannot find ZigBee D-BUS interface object!", zigbee_object); + return NULL; + } + + scene_object = zigbee_object_get_zcl_scene(ZIGBEE_OBJECT(zigbee_object)); + return scene_object; +} + +static void on_zcl_scene_add_scene_resp(ZigBeeServiceInterface *service_interface, + guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data) +{ + ZigbeeServiceInterfaceRespCbData_t *cb_data = + (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data; + + ZigbeeZcl_scene *scene_object = NULL; + GDBusMethodInvocation *invocation = NULL; + + ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data; + + NOT_USED(service_interface); + NOT_USED(request_id); + + if (NULL == resp_data || 0 == resp_data_len) { + Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len); + g_free(cb_data); + return; + } + + scene_object = zigbee_service_dbus_interface_ref_interface_object(cb_data); + zblib_check_null_free_and_ret("scene_object", scene_object, cb_data); + + invocation = zigbee_service_dbus_interface_ref_invocation(cb_data); + zblib_check_null_free_and_ret("invocation", invocation, cb_data); + + zigbee_zcl_scene_complete_add_scene(scene_object, invocation, payload->result); + + g_free(cb_data); +} + static gboolean on_zcl_scene_add_scene(ZigbeeZcl_scene *zcl_scene_object, GDBusMethodInvocation *invocation, gshort node_id, - gchar dst_ep, + gchar dest_ep, gshort group_id, gchar scene_id, gshort transition_time, @@ -31,179 +88,710 @@ static gboolean on_zcl_scene_add_scene(ZigbeeZcl_scene *zcl_scene_object, gpointer user_data) { ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data; + ZigbeeZclSceneAddScene_t req; + ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL; + + GVariantIter *iter = NULL; + gint i = 0; + + gboolean ret; + + memset(&req, 0x0, sizeof(ZigbeeZclSceneAddScene_t)); + + /* Update request structure */ + req.node_id = node_id; + req.dest_ep = dest_ep; + req.group_id = group_id; + req.scene_id = scene_id; + req.transition_time = transition_time; + g_variant_get(scene_name, "a(y)", &iter); + while (g_variant_iter_loop(iter, "(y)", req.scene_name[i])) { + i++; + if (i >= ZIGBEE_ZCL_GROUP_NAME_MAX_LEN + 1) + break; + } - NOT_USED(zcl_scene_object); - NOT_USED(invocation); - NOT_USED(service_interface); - NOT_USED(node_id); - NOT_USED(dst_ep); - NOT_USED(group_id); - NOT_USED(scene_id); - NOT_USED(transition_time); - NOT_USED(ext_length); - NOT_USED(scene_name); - NOT_USED(ext_field_set); + i = 0; + req.ext_field_set_len = ext_length; + req.ext_field_set = g_malloc0(ext_length); + g_variant_get(ext_field_set, "a(y)", &iter); + while (g_variant_iter_loop(iter, "(y)", req.ext_field_set[i])) { + i++; + if (i >= ext_length) + break; + } - /* - * TODO - - * Create and send request for processing - */ + /* Allocate response callback data */ + resp_cb_data = + zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object, + invocation, NULL, 0); + if (NULL == resp_cb_data) { + Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!"); + + /* Send failure response */ + ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG); + + return TRUE; + } + + /* Dispatch request */ + ret = zigbee_service_dbus_interface_dispatch_request(service_interface, + ZBLIB_DRIVER_TYPE_ZCL_SCENE, + ZBLIB_ZCL_SCENE_OPS_ADD_SCENE, + &req, sizeof(req), + on_zcl_scene_add_scene_resp, resp_cb_data); + + /* Free resource */ + g_free(req.ext_field_set); + + if (FALSE == ret) { + Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!"); + + /* Free response callback data */ + zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data); + + /* Send failure response */ + ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG); + + return TRUE; + } return TRUE; } +static void on_zcl_scene_view_scene_resp(ZigBeeServiceInterface *service_interface, + guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data) +{ + ZigbeeServiceInterfaceRespCbData_t *cb_data = + (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data; + + ZigbeeZcl_scene *scene_object = NULL; + GDBusMethodInvocation *invocation = NULL; + + ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data; + + NOT_USED(service_interface); + NOT_USED(request_id); + + if (NULL == resp_data || 0 == resp_data_len) { + Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len); + g_free(cb_data); + return; + } + + scene_object = zigbee_service_dbus_interface_ref_interface_object(cb_data); + zblib_check_null_free_and_ret("scene_object", scene_object, cb_data); + + invocation = zigbee_service_dbus_interface_ref_invocation(cb_data); + zblib_check_null_free_and_ret("invocation", invocation, cb_data); + + zigbee_zcl_scene_complete_view_scene(scene_object, invocation, payload->result); + + g_free(cb_data); +} + static gboolean on_zcl_scene_view_scene(ZigbeeZcl_scene *zcl_scene_object, GDBusMethodInvocation *invocation, gshort node_id, - gchar dst_ep, + gchar dest_ep, gshort group_id, gchar scene_id, gpointer user_data) { ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data; + ZigbeeZclSceneViewScene_t req; + ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL; - NOT_USED(zcl_scene_object); - NOT_USED(invocation); - NOT_USED(service_interface); - NOT_USED(node_id); - NOT_USED(dst_ep); - NOT_USED(group_id); - NOT_USED(scene_id); + gboolean ret; - /* - * TODO - - * Create and send request for processing - */ + memset(&req, 0x0, sizeof(ZigbeeZclSceneViewScene_t)); + + /* Update request structure */ + req.node_id = node_id; + req.dest_ep = dest_ep; + req.group_id = group_id; + req.scene_id = scene_id; + + /* Allocate response callback data */ + resp_cb_data = + zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object, + invocation, NULL, 0); + if (NULL == resp_cb_data) { + Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!"); + + /* Send failure response */ + ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG); + + return TRUE; + } + + /* Dispatch request */ + ret = zigbee_service_dbus_interface_dispatch_request(service_interface, + ZBLIB_DRIVER_TYPE_ZCL_SCENE, + ZBLIB_ZCL_SCENE_OPS_VIEW_SCENE, + &req, sizeof(req), + on_zcl_scene_view_scene_resp, resp_cb_data); + if (FALSE == ret) { + Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!"); + + /* Free response callback data */ + zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data); + + /* Send failure response */ + ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG); + + return TRUE; + } return TRUE; } +static void on_zcl_scene_remove_scene_resp(ZigBeeServiceInterface *service_interface, + guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data) +{ + ZigbeeServiceInterfaceRespCbData_t *cb_data = + (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data; + + ZigbeeZcl_scene *scene_object = NULL; + GDBusMethodInvocation *invocation = NULL; + + ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data; + + NOT_USED(service_interface); + NOT_USED(request_id); + + if (NULL == resp_data || 0 == resp_data_len) { + Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len); + g_free(cb_data); + return; + } + + scene_object = zigbee_service_dbus_interface_ref_interface_object(cb_data); + zblib_check_null_free_and_ret("scene_object", scene_object, cb_data); + + invocation = zigbee_service_dbus_interface_ref_invocation(cb_data); + zblib_check_null_free_and_ret("invocation", invocation, cb_data); + + zigbee_zcl_scene_complete_remove_scene(scene_object, invocation, payload->result); + + g_free(cb_data); +} + static gboolean on_zcl_scene_remove_scene(ZigbeeZcl_scene *zcl_scene_object, GDBusMethodInvocation *invocation, gshort node_id, - gchar dst_ep, + gchar dest_ep, gshort group_id, gchar scene_id, gpointer user_data) { ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data; + ZigbeeZclSceneRemoveScene_t req; + ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL; - NOT_USED(zcl_scene_object); - NOT_USED(invocation); - NOT_USED(service_interface); - NOT_USED(node_id); - NOT_USED(dst_ep); - NOT_USED(group_id); - NOT_USED(scene_id); + gboolean ret; - /* - * TODO - - * Create and send request for processing - */ + memset(&req, 0x0, sizeof(ZigbeeZclSceneRemoveScene_t)); + + /* Update request structure */ + req.node_id = node_id; + req.dest_ep = dest_ep; + req.group_id = group_id; + req.scene_id = scene_id; + + /* Allocate response callback data */ + resp_cb_data = + zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object, + invocation, NULL, 0); + if (NULL == resp_cb_data) { + Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!"); + + /* Send failure response */ + ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG); + + return TRUE; + } + + /* Dispatch request */ + ret = zigbee_service_dbus_interface_dispatch_request(service_interface, + ZBLIB_DRIVER_TYPE_ZCL_SCENE, + ZBLIB_ZCL_SCENE_OPS_REMOVE_SCENE, + &req, sizeof(req), + on_zcl_scene_remove_scene_resp, resp_cb_data); + if (FALSE == ret) { + Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!"); + + /* Free response callback data */ + zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data); + + /* Send failure response */ + ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG); + + return TRUE; + } return TRUE; } +static void on_zcl_scene_store_scene_resp(ZigBeeServiceInterface *service_interface, + guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data) +{ + ZigbeeServiceInterfaceRespCbData_t *cb_data = + (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data; + + ZigbeeZcl_scene *scene_object = NULL; + GDBusMethodInvocation *invocation = NULL; + + ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data; + + NOT_USED(service_interface); + NOT_USED(request_id); + + if (NULL == resp_data || 0 == resp_data_len) { + Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len); + g_free(cb_data); + return; + } + + scene_object = zigbee_service_dbus_interface_ref_interface_object(cb_data); + zblib_check_null_free_and_ret("scene_object", scene_object, cb_data); + + invocation = zigbee_service_dbus_interface_ref_invocation(cb_data); + zblib_check_null_free_and_ret("invocation", invocation, cb_data); + + zigbee_zcl_scene_complete_store_scene(scene_object, invocation, payload->result); + + g_free(cb_data); +} + static gboolean on_zcl_scene_store_scene(ZigbeeZcl_scene *zcl_scene_object, GDBusMethodInvocation *invocation, gshort node_id, - gchar dst_ep, + gchar dest_ep, gshort group_id, gchar scene_id, gpointer user_data) { ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data; + ZigbeeZclSceneStoreScene_t req; + ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL; - NOT_USED(zcl_scene_object); - NOT_USED(invocation); - NOT_USED(service_interface); - NOT_USED(node_id); - NOT_USED(dst_ep); - NOT_USED(group_id); - NOT_USED(scene_id); + gboolean ret; - /* - * TODO - - * Create and send request for processing - */ + memset(&req, 0x0, sizeof(ZigbeeZclSceneStoreScene_t)); + + /* Update request structure */ + req.node_id = node_id; + req.dest_ep = dest_ep; + req.group_id = group_id; + req.scene_id = scene_id; + + /* Allocate response callback data */ + resp_cb_data = + zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object, + invocation, NULL, 0); + if (NULL == resp_cb_data) { + Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!"); + + /* Send failure response */ + ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG); + + return TRUE; + } + + /* Dispatch request */ + ret = zigbee_service_dbus_interface_dispatch_request(service_interface, + ZBLIB_DRIVER_TYPE_ZCL_SCENE, + ZBLIB_ZCL_SCENE_OPS_STORE_SCENE, + &req, sizeof(req), + on_zcl_scene_store_scene_resp, resp_cb_data); + if (FALSE == ret) { + Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!"); + + /* Free response callback data */ + zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data); + + /* Send failure response */ + ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG); + + return TRUE; + } return TRUE; } +static void on_zcl_scene_recall_scene_resp(ZigBeeServiceInterface *service_interface, + guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data) +{ + ZigbeeServiceInterfaceRespCbData_t *cb_data = + (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data; + + ZigbeeZcl_scene *scene_object = NULL; + GDBusMethodInvocation *invocation = NULL; + + ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data; + + NOT_USED(service_interface); + NOT_USED(request_id); + + if (NULL == resp_data || 0 == resp_data_len) { + Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len); + g_free(cb_data); + return; + } + + scene_object = zigbee_service_dbus_interface_ref_interface_object(cb_data); + zblib_check_null_free_and_ret("scene_object", scene_object, cb_data); + + invocation = zigbee_service_dbus_interface_ref_invocation(cb_data); + zblib_check_null_free_and_ret("invocation", invocation, cb_data); + + zigbee_zcl_scene_complete_recall_scene(scene_object, invocation, payload->result); + + g_free(cb_data); +} + static gboolean on_zcl_scene_recall_scene(ZigbeeZcl_scene *zcl_scene_object, GDBusMethodInvocation *invocation, gshort node_id, - gchar dst_ep, + gchar dest_ep, gshort group_id, gchar scene_id, gpointer user_data) { ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data; + ZigbeeZclSceneRecallScene_t req; + ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL; - NOT_USED(zcl_scene_object); - NOT_USED(invocation); - NOT_USED(service_interface); - NOT_USED(node_id); - NOT_USED(dst_ep); - NOT_USED(group_id); - NOT_USED(scene_id); + gboolean ret; - /* - * TODO - - * Create and send request for processing - */ + memset(&req, 0x0, sizeof(ZigbeeZclSceneRecallScene_t)); + + /* Update request structure */ + req.node_id = node_id; + req.dest_ep = dest_ep; + req.group_id = group_id; + req.scene_id = scene_id; + + /* Allocate response callback data */ + resp_cb_data = + zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object, + invocation, NULL, 0); + if (NULL == resp_cb_data) { + Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!"); + + /* Send failure response */ + ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG); + + return TRUE; + } + + /* Dispatch request */ + ret = zigbee_service_dbus_interface_dispatch_request(service_interface, + ZBLIB_DRIVER_TYPE_ZCL_SCENE, + ZBLIB_ZCL_SCENE_OPS_RECALL_SCENE, + &req, sizeof(req), + on_zcl_scene_recall_scene_resp, resp_cb_data); + if (FALSE == ret) { + Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!"); + + /* Free response callback data */ + zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data); + + /* Send failure response */ + ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG); + + return TRUE; + } return TRUE; } +static void on_zcl_scene_remove_all_scene_resp(ZigBeeServiceInterface *service_interface, + guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data) +{ + ZigbeeServiceInterfaceRespCbData_t *cb_data = + (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data; + + ZigbeeZcl_scene *scene_object = NULL; + GDBusMethodInvocation *invocation = NULL; + + ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data; + + NOT_USED(service_interface); + NOT_USED(request_id); + + if (NULL == resp_data || 0 == resp_data_len) { + Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len); + g_free(cb_data); + return; + } + + scene_object = zigbee_service_dbus_interface_ref_interface_object(cb_data); + zblib_check_null_free_and_ret("scene_object", scene_object, cb_data); + + invocation = zigbee_service_dbus_interface_ref_invocation(cb_data); + zblib_check_null_free_and_ret("invocation", invocation, cb_data); + + zigbee_zcl_scene_complete_remove_all_scene(scene_object, invocation, payload->result); + + g_free(cb_data); +} + static gboolean on_zcl_scene_remove_all_scene(ZigbeeZcl_scene *zcl_scene_object, GDBusMethodInvocation *invocation, gshort node_id, - gchar dst_ep, + gchar dest_ep, gshort group_id, gpointer user_data) { ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data; + ZigbeeZclSceneRemoveAllScene_t req; + ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL; - NOT_USED(zcl_scene_object); - NOT_USED(invocation); - NOT_USED(service_interface); - NOT_USED(node_id); - NOT_USED(dst_ep); - NOT_USED(group_id); + gboolean ret; - /* - * TODO - - * Create and send request for processing - */ + memset(&req, 0x0, sizeof(ZigbeeZclSceneRemoveAllScene_t)); + + /* Update request structure */ + req.node_id = node_id; + req.dest_ep = dest_ep; + req.group_id = group_id; + + /* Allocate response callback data */ + resp_cb_data = + zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object, + invocation, NULL, 0); + if (NULL == resp_cb_data) { + Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!"); + + /* Send failure response */ + ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG); + + return TRUE; + } + + /* Dispatch request */ + ret = zigbee_service_dbus_interface_dispatch_request(service_interface, + ZBLIB_DRIVER_TYPE_ZCL_SCENE, + ZBLIB_ZCL_SCENE_OPS_REMOVE_ALL_SCENE, + &req, sizeof(req), + on_zcl_scene_remove_all_scene_resp, resp_cb_data); + if (FALSE == ret) { + Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!"); + + /* Free response callback data */ + zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data); + + /* Send failure response */ + ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG); + + return TRUE; + } return TRUE; } +static void on_zcl_scene_get_scene_membership_resp(ZigBeeServiceInterface *service_interface, + guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data) +{ + ZigbeeServiceInterfaceRespCbData_t *cb_data = + (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data; + + ZigbeeZcl_scene *scene_object = NULL; + GDBusMethodInvocation *invocation = NULL; + + ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data; + + NOT_USED(service_interface); + NOT_USED(request_id); + + if (NULL == resp_data || 0 == resp_data_len) { + Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len); + g_free(cb_data); + return; + } + + scene_object = zigbee_service_dbus_interface_ref_interface_object(cb_data); + zblib_check_null_free_and_ret("scene_object", scene_object, cb_data); + + invocation = zigbee_service_dbus_interface_ref_invocation(cb_data); + zblib_check_null_free_and_ret("invocation", invocation, cb_data); + + zigbee_zcl_scene_complete_get_scene_membership(scene_object, invocation, payload->result); + + g_free(cb_data); +} + static gboolean on_zcl_scene_get_scene_membership(ZigbeeZcl_scene *zcl_scene_object, GDBusMethodInvocation *invocation, gshort node_id, - gchar dst_ep, + gchar dest_ep, gshort group_id, gpointer user_data) { ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data; + ZigbeeZclSceneGetSceneMembership_t req; + ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL; - NOT_USED(zcl_scene_object); - NOT_USED(invocation); - NOT_USED(service_interface); - NOT_USED(node_id); - NOT_USED(dst_ep); - NOT_USED(group_id); + gboolean ret; - /* - * TODO - - * Create and send request for processing - */ + memset(&req, 0x0, sizeof(ZigbeeZclSceneGetSceneMembership_t)); + + /* Update request structure */ + req.node_id = node_id; + req.dest_ep = dest_ep; + req.group_id = group_id; + + /* Allocate response callback data */ + resp_cb_data = + zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object, + invocation, NULL, 0); + if (NULL == resp_cb_data) { + Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!"); + + /* Send failure response */ + ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG); + + return TRUE; + } + + /* Dispatch request */ + ret = zigbee_service_dbus_interface_dispatch_request(service_interface, + ZBLIB_DRIVER_TYPE_ZCL_SCENE, + ZBLIB_ZCL_SCENE_OPS_GET_SCENE_MEMBERSHIP, + &req, sizeof(req), + on_zcl_scene_get_scene_membership_resp, resp_cb_data); + if (FALSE == ret) { + Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!"); + + /* Free response callback data */ + zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data); + + /* Send failure response */ + ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG); + + return TRUE; + } return TRUE; } +void zigbee_service_dbus_interface_zcl_scene_notification(ZigBeeServiceInterface *service_interface, + guint noti_id, gpointer noti_data, guint noti_data_len, gpointer noti_cb_data) +{ + ZigbeeZcl_scene *scene_object; + + zblib_check_null_ret("service_interface", service_interface); + + if (NULL == noti_data || 0 == noti_data_len) { + Z_LOGE("noti_data=%p or noti_data_len=%d is null", noti_data, noti_data_len); + return; + } + + scene_object = _service_interface_ref_zigbee_zcl_scene(service_interface); + zblib_check_null_ret("scene_object", scene_object); + + NOT_USED(noti_cb_data); + + switch(noti_id) { + case ZBLIB_ZCL_SCENE_NOTI_ADD_SCENE: { + ZigbeeZclSceneAddSceneResp_t *rsp = (ZigbeeZclSceneAddSceneResp_t*)noti_data; + + Z_LOGD("'add_scene_rsp' from : [0x%X]", rsp->node_id); + + zigbee_zcl_scene_emit_add_scene_rsp(scene_object, rsp->node_id, rsp->src_ep, + rsp->status, rsp->group_id, rsp->scene_id); + } + break; + case ZBLIB_ZCL_SCENE_NOTI_VIEW_SCENE: { + int i; + + GVariant* scene_name = NULL; + GVariantBuilder *attr_builder = NULL; + GVariant* ext_field_set = NULL; + GVariantBuilder *attr_builder1 = NULL; + + ZigbeeZclSceneViewSceneResp_t *rsp = (ZigbeeZclSceneViewSceneResp_t*)noti_data; + + Z_LOGD("'view_scene_rsp' from : [0x%X]", rsp->node_id); + + attr_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); + for (i = 0; rsp->scene_name[i] && i < ZIGBEE_ZCL_SCENE_NAME_MAX_LEN; i++) + g_variant_builder_add(attr_builder, "(y)", rsp->scene_name[i]); + scene_name = g_variant_builder_end(attr_builder); + g_variant_builder_unref(attr_builder); + + + attr_builder1 = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); + for (i = 0; i < rsp->ext_field_set_len; i++) + g_variant_builder_add(attr_builder1, "(y)", rsp->ext_field_set[i]); + ext_field_set = g_variant_builder_end(attr_builder1); + g_variant_builder_unref(attr_builder1); + + zigbee_zcl_scene_emit_view_scene_rsp(scene_object, rsp->node_id, rsp->src_ep, + rsp->status, rsp->group_id, rsp->scene_id, rsp->transition_time, + scene_name, rsp->ext_field_set_len, ext_field_set); + } + break; + case ZBLIB_ZCL_SCENE_NOTI_REMOVE_SCENE: { + ZigbeeZclSceneRemoveSceneResp_t *rsp = (ZigbeeZclSceneRemoveSceneResp_t*)noti_data; + + Z_LOGD("'remove_scene_rsp' from : [0x%X]", rsp->node_id); + + zigbee_zcl_scene_emit_remove_scene_rsp(scene_object, rsp->node_id, rsp->src_ep, + rsp->status, rsp->group_id, rsp->scene_id); + } + break; + case ZBLIB_ZCL_SCENE_NOTI_REMOVE_ALL_SCENE: { + ZigbeeZclSceneRemoveAllSceneResp_t *rsp = + (ZigbeeZclSceneRemoveAllSceneResp_t*)noti_data; + + Z_LOGD("'remove_all_scene_rsp' from : [0x%X]", rsp->node_id); + + zigbee_zcl_scene_emit_remove_all_scene_rsp(scene_object, rsp->node_id, rsp->src_ep, + rsp->status, rsp->group_id); + } + break; + case ZBLIB_ZCL_SCENE_NOTI_STORE_SCENE: { + ZigbeeZclSceneStoreSceneResp_t *rsp = + (ZigbeeZclSceneStoreSceneResp_t*)noti_data; + + Z_LOGD("'store_scene_rsp' from : [0x%X]", rsp->node_id); + + zigbee_zcl_scene_emit_store_scene_rsp(scene_object, rsp->node_id, rsp->src_ep, + rsp->status, rsp->group_id, rsp->scene_id); + } + break; + case ZBLIB_ZCL_SCENE_NOTI_GET_SCENE_MEMBERSHIP: { + int i; + GVariant* scene_list = NULL; + GVariantBuilder *attr_builder = NULL; + + ZigbeeZclSceneGetSceneMembershipResp_t *rsp = + (ZigbeeZclSceneGetSceneMembershipResp_t*)noti_data; + + Z_LOGD("'get_scene_rsp' from : [0x%X]", rsp->node_id); + + attr_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)")); + for (i = 0; i < rsp->scene_count; i++) + g_variant_builder_add(attr_builder, "(y)", rsp->scene_list[i]); + scene_list = g_variant_builder_end(attr_builder); + g_variant_builder_unref(attr_builder); + + zigbee_zcl_scene_emit_get_scene_membership_rsp(scene_object, rsp->node_id, rsp->src_ep, + rsp->status, rsp->capacity, rsp->group_id, rsp->scene_count, scene_list); + } + break; + default: + Z_LOGE("Unexpected notification [%x]", noti_id); + break; + } + + /* ZigbeeZcl_scene should be dereferenced */ + g_object_unref(scene_object); +} + gboolean zigbee_service_dbus_interface_zcl_scene_init(ZigBeeServiceInterface *service_interface, ZigbeeObjectSkeleton *zigbee_object) {