From 47425686ec4bbeb95229c131c0489dc55bc674d4 Mon Sep 17 00:00:00 2001 From: Dongwoo Lee Date: Mon, 7 Mar 2022 19:25:49 +0900 Subject: [PATCH] tmonitor: Implement additional get data functions Change-Id: I94a3cb2950a44c8c7a2039341d2795fbce89480b Signed-off-by: Dongwoo Lee --- include/util/request.h | 5 ++ lib/tmonitor/tmonitor.c | 173 ++++++++++++++++++++++++++++++++++++++- lib/tmonitor/tmonitor.h | 9 ++- src/monitor/request-handler.c | 182 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 366 insertions(+), 3 deletions(-) diff --git a/include/util/request.h b/include/util/request.h index 47b30cf..c60793c 100644 --- a/include/util/request.h +++ b/include/util/request.h @@ -31,6 +31,11 @@ enum { REQUEST_UNSET_ATTR_INTEREST, REQUEST_SET_RESOURCE_CONTROL, REQUEST_GET_VALUE_INT, + REQUEST_GET_VALUE_INT64, + REQUEST_GET_VALUE_UINT, + REQUEST_GET_VALUE_UINT64, + REQUEST_GET_VALUE_DOUBLE, + REQUEST_GET_VALUE_STRING, REQUEST_GET_RESOURCE_NUM, REQUEST_GET_AVAILABLE_ATTRS, REQUEST_MAX, diff --git a/lib/tmonitor/tmonitor.c b/lib/tmonitor/tmonitor.c index a5bde45..6e28ce6 100644 --- a/lib/tmonitor/tmonitor.c +++ b/lib/tmonitor/tmonitor.c @@ -332,7 +332,7 @@ int tmonitor_update_resource(int id, int resource_id) } EXPORT -int tmonitor_get_value_int(int id, int resource_id, u_int64_t attr_id, int *value) +int tmonitor_get_value_int(int id, int resource_id, u_int64_t attr_id, int32_t *value) { char buffer[MAX_BUF_SIZE + 1]; int buffer_len; @@ -366,6 +366,177 @@ int tmonitor_get_value_int(int id, int resource_id, u_int64_t attr_id, int *valu } EXPORT +int tmonitor_get_value_int64(int id, int resource_id, u_int64_t attr_id, int64_t *value) +{ + char buffer[MAX_BUF_SIZE + 1]; + int buffer_len; + int response_req; + int ret; + + buffer_len = sprintf(buffer, "%d:%d:%"PRIu64, + REQUEST_GET_VALUE_INT64, resource_id, attr_id); + if (send(id, buffer, buffer_len, 0) < 0) { + _E("[libpass] error occurred while sending buffer"); + return -EIO; + } + + /* wait for response */ + buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0); + if (buffer_len <= 0) { + _E("[libpass] socket disconnected"); + return -EIO; + } + + buffer[buffer_len] = '\0'; + if (sscanf(buffer, "%d:%"PRId64":%d", &response_req, value, &ret) < 3) + return -EINVAL; + + if (response_req != REQUEST_GET_VALUE_INT64) { + _E("[libpass] wrong response"); + return -EINVAL; + } + + return ret; +} + +EXPORT +int tmonitor_get_value_uint(int id, int resource_id, u_int64_t attr_id, u_int32_t *value) +{ + char buffer[MAX_BUF_SIZE + 1]; + int buffer_len; + int response_req; + int ret; + + buffer_len = sprintf(buffer, "%d:%d:%"PRIu64, + REQUEST_GET_VALUE_UINT, resource_id, attr_id); + if (send(id, buffer, buffer_len, 0) < 0) { + _E("[libpass] error occurred while sending buffer"); + return -EIO; + } + + /* wait for response */ + buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0); + if (buffer_len <= 0) { + _E("[libpass] socket disconnected"); + return -EIO; + } + + buffer[buffer_len] = '\0'; + if (sscanf(buffer, "%d:%d:%d", &response_req, value, &ret) < 3) + return -EINVAL; + + if (response_req != REQUEST_GET_VALUE_UINT) { + _E("[libpass] wrong response"); + return -EINVAL; + } + + return ret; +} + +EXPORT +int tmonitor_get_value_uint64(int id, int resource_id, u_int64_t attr_id, u_int64_t *value) +{ + char buffer[MAX_BUF_SIZE + 1]; + int buffer_len; + int response_req; + int ret; + + buffer_len = sprintf(buffer, "%d:%d:%"PRIu64, + REQUEST_GET_VALUE_UINT64, resource_id, attr_id); + if (send(id, buffer, buffer_len, 0) < 0) { + _E("[libpass] error occurred while sending buffer"); + return -EIO; + } + + /* wait for response */ + buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0); + if (buffer_len <= 0) { + _E("[libpass] socket disconnected"); + return -EIO; + } + + buffer[buffer_len] = '\0'; + if (sscanf(buffer, "%d:%"PRIu64":%d", &response_req, value, &ret) < 3) + return -EINVAL; + + if (response_req != REQUEST_GET_VALUE_UINT64) { + _E("[libpass] wrong response"); + return -EINVAL; + } + + return ret; +} + +EXPORT +int tmonitor_get_value_double(int id, int resource_id, u_int64_t attr_id, double *value) +{ + char buffer[MAX_BUF_SIZE + 1]; + int buffer_len; + int response_req; + int ret; + + buffer_len = sprintf(buffer, "%d:%d:%"PRIu64, + REQUEST_GET_VALUE_DOUBLE, resource_id, attr_id); + if (send(id, buffer, buffer_len, 0) < 0) { + _E("[libpass] error occurred while sending buffer"); + return -EIO; + } + + /* wait for response */ + buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0); + if (buffer_len <= 0) { + _E("[libpass] socket disconnected"); + return -EIO; + } + + buffer[buffer_len] = '\0'; + if (sscanf(buffer, "%d:%lf:%d", &response_req, value, &ret) < 3) + return -EINVAL; + + if (response_req != REQUEST_GET_VALUE_DOUBLE) { + _E("[libpass] wrong response"); + return -EINVAL; + } + + return ret; +} + +EXPORT +int tmonitor_get_value_string(int id, int resource_id, u_int64_t attr_id, char *value) +{ + char buffer[MAX_BUF_SIZE + 1]; + int buffer_len; + int response_req; + int ret; + + buffer_len = sprintf(buffer, "%d:%d:%"PRIu64, + REQUEST_GET_VALUE_STRING, resource_id, attr_id); + if (send(id, buffer, buffer_len, 0) < 0) { + _E("[libpass] error occurred while sending buffer"); + return -EIO; + } + + /* wait for response */ + buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0); + if (buffer_len <= 0) { + _E("[libpass] socket disconnected"); + return -EIO; + } + + buffer[buffer_len] = '\0'; + if (sscanf(buffer, "%d:%[^:]:%d", &response_req, value, &ret) < 3) + return -EINVAL; + + if (response_req != REQUEST_GET_VALUE_STRING) { + _E("[libpass] wrong response"); + return -EINVAL; + } + + return ret; +} + + +EXPORT int tmonitor_get_resource_num(int id, int resource_type) { return 0; diff --git a/lib/tmonitor/tmonitor.h b/lib/tmonitor/tmonitor.h index b3bbeca..e0d5097 100644 --- a/lib/tmonitor/tmonitor.h +++ b/lib/tmonitor/tmonitor.h @@ -193,14 +193,19 @@ int tmonitor_update(int id); int tmonitor_update_resource(int id, int resource_id); /** - * @brief Get integer value of resource attribute + * @brief Get [int/int64/uint/uint64/double/string] value of resource attribute * @param[in] Unique id of tizen monitor * @param[in] Unique id of resource * @param[in] Resoruce attribute id * @param[out] Value retrieved from resource attribute * @return @ 0 on success, otherwise a negative error value */ -int tmonitor_get_value_int(int id, int resource_id, u_int64_t attr, int *value); +int tmonitor_get_value_int(int id, int resource_id, u_int64_t attr, int32_t *value); +int tmonitor_get_value_int64(int id, int resource_id, u_int64_t attr, int64_t *value); +int tmonitor_get_value_uint(int id, int resource_id, u_int64_t attr, u_int32_t *value); +int tmonitor_get_value_uint64(int id, int resource_id, u_int64_t attr, u_int64_t *value); +int tmonitor_get_value_double(int id, int resource_id, u_int64_t attr, double *value); +int tmonitor_get_value_string(int id, int resource_id, u_int64_t attr, char *value); /** * @brief Get the supported resource number diff --git a/src/monitor/request-handler.c b/src/monitor/request-handler.c index 2fdd58a..92a5b23 100644 --- a/src/monitor/request-handler.c +++ b/src/monitor/request-handler.c @@ -188,6 +188,123 @@ static int handle_request_get_value_int(struct request_client *client, char *arg return get_resource_attr_int(res, attr_id, value); } +static int handle_request_get_value_int64(struct request_client *client, char *args, int64_t *value) +{ + struct resource *res; + int resource_id; + u_int64_t attr_id; + + if (!client || !args) + return -ENOENT; + + /** + * Format of REQUEST_GET_VALUE_INT64 args: + * - + */ + if (sscanf(args, "%d:%"PRIu64, &resource_id, &attr_id) < 2) + return -EINVAL; + + res = get_resource_by_id(client, resource_id); + if (!res) + return -EINVAL; + + return get_resource_attr_int64(res, attr_id, value); +} + +static int +handle_request_get_value_uint(struct request_client *client, char *args, u_int32_t *value) +{ + struct resource *res; + int resource_id; + u_int64_t attr_id; + + if (!client || !args) + return -ENOENT; + + /** + * Format of REQUEST_GET_VALUE_UINT args: + * - + */ + if (sscanf(args, "%d:%"PRIu64, &resource_id, &attr_id) < 2) + return -EINVAL; + + res = get_resource_by_id(client, resource_id); + if (!res) + return -EINVAL; + + return get_resource_attr_uint(res, attr_id, value); +} + +static int +handle_request_get_value_uint64(struct request_client *client, char *args, u_int64_t *value) +{ + struct resource *res; + int resource_id; + u_int64_t attr_id; + + if (!client || !args) + return -ENOENT; + + /** + * Format of REQUEST_GET_VALUE_UINT64 args: + * - + */ + if (sscanf(args, "%d:%"PRIu64, &resource_id, &attr_id) < 2) + return -EINVAL; + + res = get_resource_by_id(client, resource_id); + if (!res) + return -EINVAL; + + return get_resource_attr_uint64(res, attr_id, value); +} + +static int handle_request_get_value_double(struct request_client *client, char *args, double *value) +{ + struct resource *res; + int resource_id; + u_int64_t attr_id; + + if (!client || !args) + return -ENOENT; + + /** + * Format of REQUEST_GET_VALUE_DOUBLE args: + * - + */ + if (sscanf(args, "%d:%"PRIu64, &resource_id, &attr_id) < 2) + return -EINVAL; + + res = get_resource_by_id(client, resource_id); + if (!res) + return -EINVAL; + + return get_resource_attr_double(res, attr_id, value); +} + +static int handle_request_get_value_string(struct request_client *client, char *args, char *value) +{ + struct resource *res; + int resource_id; + u_int64_t attr_id; + + if (!client || !args) + return -ENOENT; + + /** + * Format of REQUEST_GET_VALUE_INT args: + * - + */ + if (sscanf(args, "%d:%"PRIu64, &resource_id, &attr_id) < 2) + return -EINVAL; + + res = get_resource_by_id(client, resource_id); + if (!res) + return -EINVAL; + + return get_resource_attr_string(res, attr_id, value); +} + static int split_request_type_and_args(char *buffer, char **args) { char *request_type_str; @@ -252,6 +369,71 @@ static void handle_request(struct request_client *client, char *buffer) buffer_len -= len; } break; + case REQUEST_GET_VALUE_INT64: + { + int64_t value; + + ret = handle_request_get_value_int64(client, args, &value); + if (ret < 0) + _D("failed to get value"); + + len = snprintf(response, buffer_len, "%"PRId64":", value); + response += len; + buffer_len -= len; + } + break; + case REQUEST_GET_VALUE_UINT: + { + u_int32_t value; + + ret = handle_request_get_value_uint(client, args, &value); + if (ret < 0) + _D("failed to get value"); + + len = snprintf(response, buffer_len, "%u:", value); + response += len; + buffer_len -= len; + } + break; + case REQUEST_GET_VALUE_UINT64: + { + u_int64_t value; + + ret = handle_request_get_value_uint64(client, args, &value); + if (ret < 0) + _D("failed to get value"); + + len = snprintf(response, buffer_len, "%"PRIu64":", value); + response += len; + buffer_len -= len; + } + break; + case REQUEST_GET_VALUE_DOUBLE: + { + double value; + + ret = handle_request_get_value_double(client, args, &value); + if (ret < 0) + _D("failed to get value"); + + len = snprintf(response, buffer_len, "%lf:", value); + response += len; + buffer_len -= len; + } + break; + case REQUEST_GET_VALUE_STRING: + { + char value[BUFF_MAX]; + + ret = handle_request_get_value_string(client, args, value); + if (ret < 0) + _D("failed to get value"); + + len = snprintf(response, buffer_len, "%s:", value); + response += len; + buffer_len -= len; + } + break; default: _E("Invliad request type: %d", request_type); ret = -EINVAL; -- 2.7.4