Implementing request & response logic
[platform/core/connectivity/zigbee-manager.git] / zigbee-daemon / zigbee-lib / src / zblib_request.c
index be1039a..06e6592 100644 (file)
@@ -49,6 +49,8 @@ struct zblib_request_type {
        guint ref_count; /* Reference count */
 
        gpointer request_data; /**< Request data */
+       gpointer resp_cb; /**< Response callback */
+       gpointer resp_cb_data; /**< Response callback data */
 
        ZigBeeServiceInterface *service_interface; /* Service interface */
 };
@@ -71,7 +73,7 @@ static ZblibDriverType_e __zblib_request_get_ops_id(guint request_type)
        return ops_id;
 }
 
-static gint __zblib_request_ref_request_type_by_request_id(ZigBeeService *service,
+static ZigBeeRequest *__zblib_request_ref_request_by_by_request_id(ZigBeeService *service,
        guint request_id)
 {
        ZigBeeRequest *request = NULL;
@@ -81,13 +83,28 @@ static gint __zblib_request_ref_request_type_by_request_id(ZigBeeService *servic
        request_table = zblib_service_ref_request_hash_table(service);
        if (NULL == request_table) {
                Z_LOGE("zblib_service_ref_request_hash_table failed!");
-               return -1;
+               return NULL;
        }
 
        /* Look-up requets_id in request hash table */
        request = (ZigBeeRequest *)g_hash_table_lookup(request_table, (gconstpointer)request_id);
-       if (NULL == request_table) {
-               Z_LOGE("No request availabel for request_id: [%d]", request_id);
+       if (NULL == request) {
+               Z_LOGE("No request available for request_id: [%d]", request_id);
+               return NULL;
+       }
+
+       return request;
+}
+
+static gint __zblib_request_ref_request_type_by_request_id(ZigBeeService *service,
+       guint request_id)
+{
+       ZigBeeRequest *request = NULL;
+
+       /* Fetch request based on request_id */
+       request = __zblib_request_ref_request_by_by_request_id(service, request_id);
+       if (NULL == request) {
+               Z_LOGE("No request available for request_id: [%d]", request_id);
                return -1;
        }
 
@@ -4686,9 +4703,11 @@ void zblib_request_free(ZigBeeServiceInterface *service_interface,
 
        zblib_check_null_ret("service_interface", service_interface);
 
+       /* Fetch service */
        service = zblib_service_interface_ref_service(service_interface);
        zblib_check_null_ret("service", service);
 
+       /* Fetch request based on request_id */
        request = __zblib_request_ref_request_by_request_id(service, request_id);
        zblib_check_null_ret("request", request);
 
@@ -4697,6 +4716,59 @@ void zblib_request_free(ZigBeeServiceInterface *service_interface,
        g_free(request);
 }
 
+gboolean zblib_request_set_response_cb(ZigBeeServiceInterface *service_interface,
+       guint request_id,
+       gpointer resp_cb, gpointer resp_cb_data)
+{
+       ZigBeeService *service = NULL;
+       ZigBeeRequest *request = NULL;
+
+       zblib_check_null_ret_error("request", request, FALSE);
+
+       /* Fetch service */
+       service = zblib_service_interface_ref_service(service_interface);
+       zblib_check_null_ret_error("service", service, FALSE);
+
+       /* Fetch request based on request_id */
+       request = __zblib_request_ref_request_by_by_request_id(service, request_id);
+       if (NULL == request) {
+               Z_LOGE("No request available for request_id: [%d]", request_id);
+               return FALSE;
+       }
+
+       /* Update response callback and response callback data */
+       request->resp_cb = resp_cb;
+       request->resp_cb_data = resp_cb_data;
+
+       return TRUE;
+}
+
+gpointer zblib_request_ref_response_cb(ZigBeeServiceInterface *service_interface,
+       guint request_id, gpointer *resp_cb_data)
+{
+       ZigBeeService *service = NULL;
+       ZigBeeRequest *request = NULL;
+
+       zblib_check_null_ret_error("request", request, NULL);
+
+       /* Fetch service */
+       service = zblib_service_interface_ref_service(service_interface);
+       zblib_check_null_ret_error("service", service, NULL);
+
+       /* Fetch request based on request_id */
+       request = __zblib_request_ref_request_by_by_request_id(service, request_id);
+       if (NULL == request) {
+               Z_LOGE("No request available for request_id: [%d]", request_id);
+               return NULL;
+       }
+
+       /* Response callback data */
+       *resp_cb_data = request->resp_cb_data;
+
+       /* Return response callback */
+       return request->resp_cb;
+}
+
 ZigBeeRequest *zblib_request_ref(ZigBeeRequest *request)
 {
        zblib_check_null_ret_error("request", request, NULL);
@@ -4727,19 +4799,26 @@ guint zblib_request_ref_request_type(ZigBeeRequest *request)
        return request->request_type;
 }
 
-ZigBeeServiceInterface *zblib_request_ref_service_interface(ZigBeeRequest *request)
+ZigBeeServiceInterface *zblib_request_ref_service_interface(ZigBeeService *service,
+       guint request_id)
 {
-       zblib_check_null_ret_error("request", request, NULL);
+       ZigBeeRequest *request = NULL;
+
+       zblib_check_null_ret_error("service", service, NULL);
+
+       /* Fetch request based on request_id */
+       request = __zblib_request_ref_request_by_by_request_id(service, request_id);
+       if (NULL == request) {
+               Z_LOGE("No request available for request_id: [%d]", request_id);
+               return NULL;
+       }
 
        return request->service_interface;
 }
 
 gpointer zblib_request_ref_request_data(ZigBeeRequest *request)
 {
-       if (NULL == request) {
-               Z_LOGE("request is NULL");
-               return NULL;
-       }
+       zblib_check_null_ret_error("request", request, NULL);
 
        return request->request_data;
 }