Skip to content
Snippets Groups Projects
common.c 5.16 KiB
Newer Older
  • Learn to ignore specific revisions
  • #include "common.h"
    
    int print_to_ubus(struct json_object *parsed_response, struct ubus_context *ctx, struct ubus_request_data *req)
    {
    	struct blob_buf bb;
    
    	memset(&bb, 0, sizeof(bb));
    	blob_buf_init(&bb, 0);
    
    	json_to_blob(parsed_response, &bb);
    
    	ubus_send_reply(ctx, req, bb.head);
    	blob_buf_free(&bb);
    
    	json_object_put(parsed_response);
    	return 0;
    }
    
    
    void json_to_blob(struct json_object *response, struct blob_buf *bb)
    
    {
    	void *arr, *obj;
    	int i;
    
    	json_object_object_foreach(response, key, val) {
    		int val_type = json_object_get_type(val);
    
    		switch (val_type) {
    		case json_type_int:
    
    			blobmsg_add_u32(bb, key, json_object_get_int(val));
    
    			break;
    		case json_type_double:
    
    			blobmsg_add_double(bb, key, json_object_get_double(val));
    
    			break;
    		case json_type_string:
    
    			blobmsg_add_string(bb, key, json_object_get_string(val));
    
    			break;
    		case json_type_array:
    
    			arr = blobmsg_open_array(bb, key);
    
    			for (i = 0; i < json_object_array_length(val); i++) {
    
    				// add open table?
    				json_to_blob(json_object_array_get_idx(val, i), bb);
    				// add close table?
    
    			break;
    		case json_type_object:
    
    			obj = blobmsg_open_table(bb, key);
    			json_to_blob(val, bb);
    			blobmsg_close_table(bb, obj);
    
    struct json_object *get_json_string_object_by_key(json_object *json_obj, char *string)
    
    	json_object_iter iterator;
    	json_object *string_object = NULL;
    	enum json_type type;
    
    	type = json_object_get_type(json_obj);
    	if (type == json_type_object) {
    		//search the key from the json object
    		json_object_object_foreachC(json_obj, iterator) {
    			printf("iteratorKey is :%s\n", iterator.key);
    			if (strcmp(string, (char *)iterator.key) == 0) {
    				string_object = json_object_object_get(json_obj,iterator.key);
    				printf("Input string value: %s\n", (char *)json_object_get_string(iterator.val));
    				break;
    			}
    		}
    	}
    	return string_object;
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    void xml_to_json(xmlNode *anode, json_object *jobj)
    {
    	xmlNodePtr cur_node = NULL;
    	json_object *cur_jstr = NULL;
    
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    	for (cur_node = anode; cur_node; cur_node = cur_node->next) {
    
    		//debug_print("child address: %p\n", cur_node);
    		//debug_print("next addres: %p\n", cur_node->next);
    		//debug_print("root child content: %s\n", (uint8_t *)xmlNodeGetContent(cur_node));
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    		if (cur_node->type == XML_ELEMENT_NODE) {
    			if (xmlChildElementCount(cur_node) == 0) {
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    				cur_jstr = json_object_new_string((char *)xmlNodeGetContent(cur_node));
    
    Arun Muthusamy's avatar
    Arun Muthusamy committed
    				debug_print("xmlNodeGet name: %s\n", (char *)cur_node->name);
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    				json_object_object_add(jobj, (char *)cur_node->name, cur_jstr);
    			}
    		}
    
    		xml_to_json(cur_node->children, jobj);
    	}
    }
    
    
    //free memory...
    struct json_object *xml_to_json_converter(struct write_result *result)
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    {
    	json_object *jobj;
    	xmlDocPtr doc_ptr = NULL;
    	xmlNode *origin_node = NULL;
    
    	doc_ptr = xmlParseMemory(result->data, result->pos);
    
    	if (!doc_ptr)
    		goto fail_doc_ptr;
    
    Arun Muthusamy's avatar
    Arun Muthusamy committed
    	debug_print("data from xml: %s\n", result->data);
    
    
    	origin_node = xmlDocGetRootElement(doc_ptr);
    	if (!origin_node)
    		goto fail_origin_node;
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    
    	jobj = json_object_new_object();
    	xml_to_json(origin_node, jobj);
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    
    
    Arun Muthusamy's avatar
    Arun Muthusamy committed
    	debug_print("Json object from xml: %s\n", json_object_to_json_string(jobj));
    
    
    	if (doc_ptr)
    		xmlFreeDoc(doc_ptr);
    
    	return jobj;
    
    fail_origin_node:
    	if (doc_ptr)
    		xmlFreeDoc(doc_ptr);
    fail_doc_ptr:
    	return NULL;
    
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    }
    
    	return true;
    }
    
    int validate_puk_format(char *puk)
    {
    	if (!isdigits(puk)) {
    		debug_print("Please enter digits only!\n");
    		goto fail;
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    	} else if (strlen(puk) != 8) {
    
    		debug_print("Please enter 8 digits!\n");
    		goto fail;
    	}
    
    	return 0;
    fail:
    	return -1;
    }
    
    int validate_pin_format(char *pin)
    {
    	if (!isdigits(pin)) {
    		debug_print("Please enter digits only!\n");
    		goto fail;
    	} else if (strlen(pin) > 8 || strlen(pin) < 4) {
    		debug_print("Please enter between 4 to 8 digits!\n");
    		goto fail;
    	} else if (atoi(pin) == 0) {
    		debug_print("0000 is not a valid pin! Lowest available is 0001\n");
    		goto fail;
    	}
    
    	return 0;
    fail:
    	return -1;
    }
    
    
    int pin_status(struct blob_buf *bb, struct device *dev)
    
    {
    	struct json_object *response, *rv_json;
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    	const char *rv;
    
    	response = mobile_get_pin_status(dev);
    
    	if (!response) {
    		debug_print("no response from get_pin_status!\n");
    		goto fail_response;
    	}
    
    	json_object_object_get_ex(response, "pin_status", &rv_json);
    	if (!rv_json) {
    		debug_print("no pin_status available in response!\n");
    		goto fail_result;
    	}
    
    
    	rv = json_object_get_string(rv_json);
    	if (strncmp(rv, "0", 1) == 0)
    
    		blobmsg_add_string(bb, "Failure", "Pin disabled");
    	else
    		blobmsg_add_string(bb, "Failure", "Pin enabled");
    
    
    	pin_status = atoi(rv);
    
    	json_object_put(response);
    
    	return pin_status;
    
    fail_response:
    fail_result:
    	json_object_put(response);
    	return -1;
    }
    
    int check_response(struct json_object *response)
    {
    
    	json_object_object_get_ex(response, "result", &rv_json);
    	if (!rv_json) {
    		debug_print("no result available in response!\n");
    		goto fail;
    	}
    
    	if (strncmp(json_object_get_string(rv_json), "failure", strlen("failure")) == 0)
    		goto fail;
    
    	return 0;
    fail:
    	return -1;
    
    
    void remove_newline(char *input)
    {
    	char *pos;
    
    	pos = strchr(input, '\n');
    	if (!pos)
    		return;
    
    	*pos = '\0';
    }