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 */
};
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;
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;
}
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);
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);
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;
}