tmonitor: Implement additional get data functions 60/272160/3
authorDongwoo Lee <dwoo08.lee@samsung.com>
Mon, 7 Mar 2022 10:25:49 +0000 (19:25 +0900)
committerDongwoo Lee <dwoo08.lee@samsung.com>
Fri, 11 Mar 2022 05:50:19 +0000 (14:50 +0900)
Change-Id: I94a3cb2950a44c8c7a2039341d2795fbce89480b
Signed-off-by: Dongwoo Lee <dwoo08.lee@samsung.com>
include/util/request.h
lib/tmonitor/tmonitor.c
lib/tmonitor/tmonitor.h
src/monitor/request-handler.c

index 47b30cf..c60793c 100644 (file)
@@ -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,
index a5bde45..6e28ce6 100644 (file)
@@ -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;
index b3bbeca..e0d5097 100644 (file)
@@ -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
index 2fdd58a..92a5b23 100644 (file)
@@ -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:
+        *  - <RESOURCE_ID:ATTR_ID>
+        */
+       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:
+        *  - <RESOURCE_ID:ATTR_ID>
+        */
+       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:
+        *  - <RESOURCE_ID:ATTR_ID>
+        */
+       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:
+        *  - <RESOURCE_ID:ATTR_ID>
+        */
+       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:
+        *  - <RESOURCE_ID:ATTR_ID>
+        */
+       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;