u_int64_t attr_id;
int resource_id;
- if (!client || !args)
+ if (!client)
return -ENOENT;
/**
* - <RESOURCE_ID>
* Format of REQUEST_GET_VALUE_JSON args:
* - <RESOURCE_ID>:<ATTR_ID>
+ * Format of REQUEST_GET_RESOURCE_LIST_JSON args:
+ * - NO ARGUMENTS
*/
switch (request_type) {
case REQUEST_GET_RESOURCE_JSON:
if (sscanf(args, "%d$%"PRIu64, &resource_id, &attr_id) < 2)
return -EINVAL;
break;
+ case REQUEST_GET_RESOURCE_LIST_JSON:
+ goto skip_res;
default:
return -EINVAL;
}
if (!res)
return -EINVAL;
+skip_res:
switch (request_type) {
case REQUEST_GET_RESOURCE_JSON:
return get_resource_attrs_json(res, json_string);
case REQUEST_GET_VALUE_JSON:
return get_resource_attr_json(res, attr_id, json_string);
+ case REQUEST_GET_RESOURCE_LIST_JSON:
+ return get_resource_list_json(json_string);
default:
return -EINVAL;
}
case REQUEST_GET_RESOURCE_JSON:
case REQUEST_GET_VALUE_JSON:
case REQUEST_GET_VALUE_ARRAY:
+ case REQUEST_GET_RESOURCE_LIST_JSON:
buffer_len = HUGE_BUFF_MAX + 1;
break;
default:
break;
case REQUEST_GET_RESOURCE_JSON:
case REQUEST_GET_VALUE_JSON:
+ case REQUEST_GET_RESOURCE_LIST_JSON:
{
char *json_string;
return 0;
}
+static json_object *get_resource_driver_json(const struct resource_driver *driver)
+{
+ json_object *jobj_drv, *jobj_drv_name, *jobj_drv_type;
+ json_object *jobj_drv_attrs_array, *jobj_drv_attr, *jobj_drv_ctrls_array, *jobj_drv_ctrl;
+ json_object *jobj_drv_attr_name, *jobj_drv_attr_type, *jobj_drv_attr_id;
+ json_object *jobj_drv_ctrl_name, *jobj_drv_ctrl_id;
+ const struct resource_attribute *attr;
+ const struct resource_control *ctrl;
+ int i;
+
+ jobj_drv = json_object_new_object();
+
+ jobj_drv_name = json_object_new_string(driver->name);
+ jobj_drv_type = json_object_new_int(driver->type);
+
+ jobj_drv_attrs_array = json_object_new_array();
+
+ for (i = 0; i < driver->num_attrs; i++) {
+ attr = &driver->attrs[i];
+
+ jobj_drv_attr = json_object_new_object();
+
+ jobj_drv_attr_name = json_object_new_string(attr->name);
+ jobj_drv_attr_type = json_object_new_int(attr->type);
+ jobj_drv_attr_id = json_object_new_uint64(attr->id);
+
+ json_object_object_add(jobj_drv_attr, "name", jobj_drv_attr_name);
+ json_object_object_add(jobj_drv_attr, "type", jobj_drv_attr_type);
+ json_object_object_add(jobj_drv_attr, "id", jobj_drv_attr_id);
+
+ json_object_array_add(jobj_drv_attrs_array, jobj_drv_attr);
+ }
+
+ jobj_drv_ctrls_array = json_object_new_array();
+
+ for (i = 0; i < driver->num_ctrls; i++) {
+ ctrl = &driver->ctrls[i];
+
+ jobj_drv_ctrl = json_object_new_object();
+
+ jobj_drv_ctrl_name = json_object_new_string(ctrl->name);
+ jobj_drv_ctrl_id = json_object_new_uint64(ctrl->id);
+
+ json_object_object_add(jobj_drv_ctrl, "name", jobj_drv_ctrl_name);
+ json_object_object_add(jobj_drv_ctrl, "id", jobj_drv_ctrl_id);
+
+ json_object_array_add(jobj_drv_ctrls_array, jobj_drv_ctrl);
+ }
+
+ json_object_object_add(jobj_drv, "name", jobj_drv_name);
+ json_object_object_add(jobj_drv, "type", jobj_drv_type);
+ json_object_object_add(jobj_drv, "attrs", jobj_drv_attrs_array);
+ json_object_object_add(jobj_drv, "ctrls", jobj_drv_ctrls_array);
+
+ return jobj_drv;
+}
+
+void put_resource_driver_json(json_object *jobj_drv)
+{
+ json_object *jobj_array, *jobj_obj;
+ int i;
+
+ if (json_object_object_get_ex(jobj_drv, "ctrls", &jobj_array)) {
+ for (i = 0; i < json_object_array_length(jobj_array); i++) {
+ jobj_obj = json_object_array_get_idx(jobj_array, i);
+
+ json_object_object_del(jobj_obj, "id");
+ json_object_object_del(jobj_obj, "name");
+ }
+ json_object_array_del_idx(jobj_array, 0, json_object_array_length(jobj_array));
+ }
+
+ if (json_object_object_get_ex(jobj_drv, "attrs", &jobj_array)) {
+ for (i = 0; i < json_object_array_length(jobj_array); i++) {
+ jobj_obj = json_object_array_get_idx(jobj_array, i);
+
+ json_object_object_del(jobj_obj, "id");
+ json_object_object_del(jobj_obj, "type");
+ json_object_object_del(jobj_obj, "name");
+ }
+ json_object_array_del_idx(jobj_array, 0, json_object_array_length(jobj_array));
+ }
+
+ json_object_object_del(jobj_drv, "ctrls");
+ json_object_object_del(jobj_drv, "attrs");
+ json_object_object_del(jobj_drv, "type");
+ json_object_object_del(jobj_drv, "name");
+}
+
+int get_resource_list_json(char **json_string)
+{
+ const struct resource_driver *driver;
+ json_object *jobj_root, *jobj_drvs_array, *jobj_drv;
+ int i;
+
+ jobj_root = json_object_new_object();
+ jobj_drvs_array = json_object_new_array();
+
+ for (i = 0; i < g_list_length(g_resource_driver_head); i++) {
+ driver = g_list_nth(g_list_first(g_resource_driver_head), i)->data;
+
+ jobj_drv = get_resource_driver_json(driver);
+ json_object_array_add(jobj_drvs_array, jobj_drv);
+ }
+
+ json_object_object_add(jobj_root, "resources", jobj_drvs_array);
+
+ *json_string = strdup(json_object_to_json_string(jobj_root));
+
+ for (i = 0; i < json_object_array_length(jobj_drvs_array); i++) {
+ jobj_drv = json_object_array_get_idx(jobj_drvs_array, i);
+
+ put_resource_driver_json(jobj_drv);
+ }
+ json_object_array_del_idx(jobj_drvs_array, 0, json_object_array_length(jobj_drvs_array));
+
+ json_object_object_del(jobj_root, "resources");
+ json_object_put(jobj_root);
+
+ return 0;
+}
+
int get_resource_attr_int(struct resource *resource, u_int64_t attr_id, int32_t *data)
{
struct resource_attribute_value *attr_value = NULL;