Add API - espp_client_set_error_cb()
authorSangchul Lee <sc11.lee@samsung.com>
Mon, 15 May 2023 07:35:56 +0000 (16:35 +0900)
committer이상철/Tizen Platform Lab(SR)/삼성전자 <sc11.lee@samsung.com>
Mon, 15 May 2023 08:22:29 +0000 (17:22 +0900)
[Version] 0.1.12

Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
packaging/espp-service.spec
src/client/espp_service_client.c
src/client/espp_service_client.h
src/client/espp_service_client_event_handler.c
src/client/espp_service_client_priv.h
src/common/espp_service_ipc.c
src/common/espp_service_ipc.h
src/daemon/espp_service_handler.c

index 34f70a3c542a74235b280dcb46603e3c872330b2..53b65bf31d0dcec0f92dca7175730ba6e4ad6f85 100644 (file)
@@ -1,6 +1,6 @@
 Name:       espp-service
 Summary:    ESPP service package which contains client lib. and daemon binary
-Version:    0.1.11
+Version:    0.1.12
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index 608137f7253868800a0b0515f55379a957e0d945..73af99c4df98d79c0b0f1362f9ed4a2744fd3217 100644 (file)
@@ -192,6 +192,31 @@ int espp_client_set_resource_conflicted_cb(espp_h espp, espp_resource_conflicted
        return ESPP_CLIENT_ERROR_NONE;
 }
 
+int espp_client_set_error_cb(espp_h espp, espp_error_cb callback, void *user_data)
+{
+       espp_s *_espp = (espp_s *)espp;
+       g_autoptr(GMutexLocker) locker = NULL;
+       g_autoptr(GMutexLocker) cb_locker = NULL;
+
+       RET_VAL_IF(!espp, ESPP_CLIENT_ERROR_INVALID_PARAMETER, "espp is NULL");
+       RET_VAL_IF(!callback, ESPP_CLIENT_ERROR_INVALID_PARAMETER, "callback is NULL");
+
+       locker = g_mutex_locker_new(&_espp->mutex);
+
+       if (espp_service_client_socket_request_set_callback(_espp, ESPP_SERVICE_EVENT_CB_ERROR, (void *)callback, user_data) != 0)
+               return ESPP_CLIENT_ERROR_INVALID_OPERATION;
+
+       cb_locker = g_mutex_locker_new(&_espp->cb_mutex);
+       LOG_WARNING_IF_CALLBACK_EXISTS(_espp->error_cb);
+
+       _espp->error_cb.callback = callback;
+       _espp->error_cb.user_data = user_data;
+
+       LOG_INFO("espp[%p] callback[%p] user_data[%p]", espp, callback, user_data);
+
+       return ESPP_CLIENT_ERROR_NONE;
+}
+
 int espp_client_create(espp_h *espp)
 {
        espp_s *_espp;
index e5b61eb1cb1a6ebf09a56e424b8a0255169777ab..8cc86f9ad77ab93c7a429b9ca1d646f3031e6640 100644 (file)
@@ -259,6 +259,14 @@ typedef void (*espp_buffer_status_cb)(espp_stream_type_e stream_type, espp_buffe
  */
 typedef void (*espp_resource_conflicted_cb)(void *user_data);
 
+/**
+ * @brief Called when an error occurs.
+ * @param[in] error        The error value
+ * @param[in] user_data    The user data passed from the callback registration function
+ * @see espp_client_set_error_cb()
+ */
+typedef void (*espp_error_cb)(espp_client_error_e error, void *user_data);
+
 /**
  * @brief Sets a callback function to be invoked when the ESPP service client handle is prepared to receive ESPP packets after calling espp_client_prepare_async().
  * @param[in] espp       ESPP service client handle
@@ -352,7 +360,7 @@ int espp_client_set_eos_cb(espp_h espp, espp_eos_cb callback, void *user_data);
 int espp_client_set_buffer_status_cb(espp_h espp, espp_buffer_status_cb callback, void *user_data);
 
 /**
- * @brief Sets a callback function to be invoked when when a H/W resource of the ESPP service client handle has been conflicted.
+ * @brief Sets a callback function to be invoked when a H/W resource of the ESPP service client handle has been conflicted.
  * @param[in] espp       ESPP service client handle
  * @param[in] callback   Callback function pointer
  * @param[in] user_data  The user data to be passed to the callback function
@@ -365,6 +373,21 @@ int espp_client_set_buffer_status_cb(espp_h espp, espp_buffer_status_cb callback
  */
 int espp_client_set_resource_conflicted_cb(espp_h espp, espp_resource_conflicted_cb callback, void *user_data);
 
+/**
+ * @brief Sets a callback function to be invoked when an error occurs.
+ * @param[in] espp       ESPP service client handle
+ * @param[in] callback   Callback function pointer
+ * @param[in] user_data  The user data to be passed to the callback function
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #ESPP_CLIENT_ERROR_NONE Successful
+ * @retval #ESPP_CLIENT_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #ESPP_CLIENT_ERROR_INVALID_OPERATION Invalid operation
+ * @pre The state must be #ESPP_STATE_NONE or #ESPP_STATE_IDLE.
+ * @post espp_error_cb() will be invoked.
+ */
+int espp_client_set_error_cb(espp_h espp, espp_error_cb callback, void *user_data);
+
 /**
  * @brief Creates an instance of ESPP service client.
  * @param[out] espp    ESPP service client handle
index 8ce9ed2be15490ac869c15c5d3e0217107e7d02e..b216f69738b5f7da1402bbb9f527bfb1822f22f0 100644 (file)
@@ -187,6 +187,32 @@ static void __handle_event_cb_resource_conflicted(espp_s *espp, espp_service_dat
        result->ret = 0;
 }
 
+static void __handle_event_cb_error(espp_s *espp, espp_service_data_from_server_s *data, espp_service_data_from_client_s *result)
+{
+       int ret;
+       espp_client_error_e error;
+
+       ASSERT(espp);
+       ASSERT(data);
+       ASSERT(result);
+
+       result->ret = -1;
+
+       ret = espp_service_client_msg_parse_params(data->params, data->event, &error);
+       if (ret != 0)
+               return;
+
+       LOG_INFO("cb params[error:%d]", error);
+
+       if (espp->error_cb.callback) {
+               LOG_DEBUG(">>> callback[%p] user_data[%p]", espp->error_cb.callback, espp->error_cb.user_data);
+               ((espp_error_cb)(espp->error_cb.callback))(error, espp->error_cb.user_data);
+               LOG_DEBUG("<<< end of the callback");
+       }
+
+       result->ret = 0;
+}
+
 static func_handler handlers[] = {
        [ESPP_SERVICE_EVENT_MSG] = __handle_event_msg,
        [ESPP_SERVICE_EVENT_CB_READY_TO_PREPARE] = __handle_event_cb_ready_to_prepare,
@@ -196,6 +222,7 @@ static func_handler handlers[] = {
        [ESPP_SERVICE_EVENT_CB_EOS] = __handle_event_cb_eos,
        [ESPP_SERVICE_EVENT_CB_BUFFER_STATUS] = __handle_event_cb_buffer_status,
        [ESPP_SERVICE_EVENT_CB_RESOURCE_CONFLICTED] = __handle_event_cb_resource_conflicted,
+       [ESPP_SERVICE_EVENT_CB_ERROR] = __handle_event_cb_error,
 };
 
 static void __func_handler(espp_s *espp, espp_service_data_from_server_s *data, espp_service_data_from_client_s *result)
index 1c25a764517da35976f30a69c3fcf971808bd095..ba6645dc64071fc7790e75467a51aa7e21bd30e2 100644 (file)
@@ -64,6 +64,7 @@ typedef struct _espp_s {
        espp_callback_s eos_cb;
        espp_callback_s buffer_status_cb;
        espp_callback_s resource_conflicted_cb;
+       espp_callback_s error_cb;
 } espp_s;
 
 /* socket */
index 8cfeb8bff74a9610499c1e91d026a841cf084dd5..9dae2c539ff4e0cea058551590624af7dd799edf 100644 (file)
@@ -54,6 +54,7 @@ espp_service_ipc_data_s events[] = {
        [ESPP_SERVICE_EVENT_CB_EOS] = { "EosCB", NULL },
        [ESPP_SERVICE_EVENT_CB_BUFFER_STATUS] = { "BufferStatusCB", "ii" },
        [ESPP_SERVICE_EVENT_CB_RESOURCE_CONFLICTED] = { "PrepareAsyncDoneCB", NULL },
+       [ESPP_SERVICE_EVENT_CB_ERROR] = { "ErrorCB", "i" },
 };
 
 const char *data_type_strs[] = {
index 7ac3381df72e7c2fb2ef07e927061357a34d5a86..8044204ba7f0a2ad6d72e05721d6e9601523163b 100644 (file)
@@ -63,6 +63,7 @@ typedef enum {
        ESPP_SERVICE_EVENT_CB_EOS,
        ESPP_SERVICE_EVENT_CB_BUFFER_STATUS,
        ESPP_SERVICE_EVENT_CB_RESOURCE_CONFLICTED,
+       ESPP_SERVICE_EVENT_CB_ERROR,
 } espp_service_event_e;
 
 enum {
index 4e979e9f41fb422a09de5e187fddb079451fc03f..cb23f85ca21a13a524f3116c7ede83cf2bfccfcf 100644 (file)
@@ -808,6 +808,28 @@ static void __resource_conflicted_cb(void *user_data)
        espp_service_send_data(tbs->event_fd, &data);
 }
 
+static void __error_cb(const int error, void *user_data)
+{
+       handler_userdata_s *hdata = (handler_userdata_s *)user_data;
+       tb_data_s *tbs;
+       espp_service_data_from_server_s data;
+
+       ASSERT(hdata);
+       ASSERT(hdata->svc);
+       ASSERT(hdata->fd >= 0);
+
+       LOG_DEBUG("error[%d], fd[%d], ESPP[%p]", error, hdata->fd, hdata->espp);
+
+       RET_IF(!(tbs = g_hash_table_lookup(hdata->svc->fd_table, hdata->key)), "failed to g_hash_table_lookup(), key[%s]", hdata->key);
+
+       LOG_DEBUG("event_fd[%d], ESPP[%p]", tbs->event_fd, tbs->espp);
+
+       FILL_SOCKET_MSG_EVENT(data, ESPP_SERVICE_EVENT_CB_ERROR);
+       FILL_SOCKET_MSG_PARAMS(data, ESPP_SERVICE_EVENT_CB_ERROR, "error", error);
+
+       espp_service_send_data(tbs->event_fd, &data);
+}
+
 static cb_intf_s cb_setters[] = {
        [ESPP_SERVICE_EVENT_CB_READY_TO_PREPARE] = { (set_cb_func)esplusplayer_set_ready_to_prepare_cb, __ready_to_prepare_cb},
        [ESPP_SERVICE_EVENT_CB_PREPARE_ASYNC_DONE] = { (set_cb_func)esplusplayer_set_prepare_async_done_cb, __prepare_async_done_cb},
@@ -816,6 +838,7 @@ static cb_intf_s cb_setters[] = {
        [ESPP_SERVICE_EVENT_CB_EOS] = { (set_cb_func)esplusplayer_set_eos_cb, __eos_cb},
        [ESPP_SERVICE_EVENT_CB_BUFFER_STATUS] = { (set_cb_func)esplusplayer_set_buffer_status_cb, __buffer_status_cb},
        [ESPP_SERVICE_EVENT_CB_RESOURCE_CONFLICTED] = { (set_cb_func)esplusplayer_set_resource_conflicted_cb, __resource_conflicted_cb},
+       [ESPP_SERVICE_EVENT_CB_ERROR] = { (set_cb_func)esplusplayer_set_error_cb, __error_cb},
 };
 
 static void __handle_set_callback(handler_userdata_s *hdata, espp_service_data_from_client_s *data, espp_service_data_from_server_s *result)