+
+gint zblib_service_interface_new_request(ZigBeeServiceInterface *service_interface,
+ guint request_type,
+ gpointer request_data, guint request_data_len,
+ ZblibServiceInterfaceResponseCb_t resp_cb, gpointer resp_cb_data)
+{
+ gint request_id = 0;
+ gboolean ret;
+
+ zblib_check_null_ret_error("service_interface", service_interface, -1);
+
+ /* Create new request */
+ request_id = zblib_request_new(service_interface,
+ request_type,
+ request_data, request_data_len);
+
+ /* Set response callback */
+ ret = zblib_request_set_response_cb(service_interface,
+ request_id,
+ (gpointer)resp_cb, (gpointer)resp_cb_data);
+ if (FALSE == ret) {
+ Z_LOGE("zblib_request_set_response_cb failed!");
+
+ /* Free request_id */
+ zblib_request_free(service_interface, request_id);
+ request_id = -1;
+ }
+
+ return request_id;
+}
+
+gboolean zblib_service_interface_dispatch_request(ZigBeeServiceInterface *service_interface,
+ guint request_id)
+{
+ ZigBeeService *service = NULL;
+
+ zblib_check_null_ret_error("service_interface", service_interface, FALSE);
+
+ /* Fetch service */
+ service = service_interface->service;
+ zblib_check_null_ret_error("service", service, FALSE);
+
+ /* Dispatch request to service */
+ return zblib_service_dispatch_request(service, request_id);
+}
+
+void zblib_service_interface_send_response(ZigBeeServiceInterface *service_interface,
+ guint request_id, gpointer resp_data, guint resp_data_len)
+{
+ ZblibServiceInterfaceResponseCb_t resp_cb;
+ gpointer resp_cb_data;
+
+ zblib_check_null_ret("service_interface", service_interface);
+
+ /* Fetch response callback and response callback data from request_id */
+ resp_cb = zblib_request_ref_response_cb(service_interface,
+ request_id, &resp_cb_data);
+ zblib_check_null_ret("resp_cb", resp_cb);
+
+ /* Invoke send response function */
+ resp_cb(service_interface,
+ request_id, resp_data, resp_data_len, resp_cb_data);
+
+ /* Free request */
+ zblib_request_free(service_interface, request_id);
+}