diff --git a/libmobile_hilink.c b/libmobile_hilink.c index 93d797d3884abe2cae53c7452de274856c5bf3ff..285ef52fd9750aee69fe110edbdc1a961953cefb 100644 --- a/libmobile_hilink.c +++ b/libmobile_hilink.c @@ -7,6 +7,63 @@ #include "libmobile_hilink.h" +void xml_to_json(xmlNode *anode, json_object *jobj) +{ + xmlNodePtr cur_node = NULL; + json_object *cur_jstr = NULL; + + 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)); + + if (cur_node->type == XML_ELEMENT_NODE) + { + if (xmlChildElementCount(cur_node) == 0) + { + cur_jstr = json_object_new_string((char *)xmlNodeGetContent(cur_node)); + //debug_print("xmlNodeGet name: %s\n", (char *)cur_node->name); + 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 string *result) +{ + json_object *jobj; + xmlDocPtr doc_ptr = NULL; + xmlNode *origin_node = NULL; + + doc_ptr = xmlParseMemory(result->ptr, result->len); + if (!doc_ptr) + goto fail_doc_ptr; + //debug_print("data from xml: %s\n", result->ptr); + + origin_node = xmlDocGetRootElement(doc_ptr); + if (!origin_node) + goto fail_origin_node; + + jobj = json_object_new_object(); + xml_to_json(origin_node, jobj); + + //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; +} //global varibales char *home_url = "http://192.168.8.1/html/index.html"; @@ -42,37 +99,37 @@ leave_token: return NULL; } - +/* static size_t write_response(void *ptr, size_t size, size_t nmemb, void *stream) { size_t total_size = size * nmemb; - struct write_result *result = (struct write_result *)stream; + struct string *result = (struct string *)stream; - if (result->pos + total_size >= BUFFER_SIZE - 1) { + if (result->len + total_size >= BUFFER_SIZE - 1) { fprintf(stderr, "error: too small buffer\n"); return 0; } - memcpy(result->data + result->pos, ptr, total_size); - result->pos += total_size; + memcpy(result->ptr + result->len, ptr, total_size); + result->len += total_size; return total_size; } +*/ - -struct write_result *memalloc_write_result(void) +struct string *memalloc_write_result(void) { - struct write_result *wr = (struct write_result *) calloc(1, sizeof(*wr)); + struct string *wr = (struct string *) calloc(1, sizeof(*wr)); if (!wr) goto leave; - wr->data = calloc(BUFFER_SIZE, sizeof(wr->data)); - if (!wr->data) + wr->ptr = calloc(BUFFER_SIZE, sizeof(wr->ptr)); + if (!wr->ptr) goto leave; - wr->pos = 0; + wr->len = 0; return wr; @@ -80,14 +137,14 @@ leave: if (wr) free(wr); - if (wr->data) - free(wr->data); + if (wr->ptr) + free(wr->ptr); return NULL; } -void free_write_result(struct write_result *result) +void free_write_result(struct string *result) { if (result) { free(result); @@ -117,21 +174,21 @@ int check_cookie_status(CURLcode status, CURL *curl) } -void prepare_curl_write_callback(CURL *curl, const char *url, struct write_result *result) +void prepare_curl_write_callback(CURL *curl, const char *url, struct string *result) { curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_WRITEDATA, result); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_response); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_func); } //free mem -static struct write_result *get_request(const char *url, const char *api_url) +static struct string *get_request(const char *url, const char *api_url) { CURL *curl = NULL; CURLcode status; - struct write_result *result; + struct string *result; curl = curl_easy_init(); if (!curl) @@ -150,8 +207,8 @@ static struct write_result *get_request(const char *url, const char *api_url) goto leave; //Prepare result struct to get next http response. - memset(result->data, 0, BUFFER_SIZE); - result->pos = 0; + memset(result->ptr, 0, BUFFER_SIZE); + result->len = 0; prepare_curl_write_callback(curl, api_url, result); curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookies.txt"); //Read locally stored cookies @@ -161,9 +218,9 @@ static struct write_result *get_request(const char *url, const char *api_url) goto leave; - result->data[result->pos] = '\0'; + result->ptr[result->len] = '\0'; if (DEBUG_RESULT) - printf("Http get request data is: %s\n", result->data); + printf("Http get request data is: %s\n", result->ptr); curl_easy_cleanup(curl); @@ -182,14 +239,14 @@ leave: //free mem -static struct write_result *post_request(const char *url, const char *api_url, char *post_query) +static struct string *post_request(const char *url, const char *api_url, char *post_query) { char token[1024] = {0}; char session[1024] = {0}; char *token_text = "__RequestVerificationToken:"; char *session_text = "Cookie:SessionID="; struct curl_slist *headers = NULL; - struct write_result *result; + struct string *result; CURL *curl = NULL; CURLcode status; @@ -207,20 +264,20 @@ static struct write_result *post_request(const char *url, const char *api_url, c if (check_cookie_status(status, curl)) goto leave; - result->data[result->pos] = '\0'; + result->ptr[result->len] = '\0'; - char *session_id = parser(result->data, "SessionID="); + char *session_id = parser(result->ptr, "SessionID="); if (DEBUG) printf("Session id is: %s\n", session_id); - char *token_id = parser(result->data, "<TokInfo>"); + char *token_id = parser(result->ptr, "<TokInfo>"); if (DEBUG) printf("Token is: %s\n", token_id); //clean the memory to prepare write operation for next http response.. - memset(result->data, 0, BUFFER_SIZE); - result->pos = 0; + memset(result->ptr, 0, BUFFER_SIZE); + result->len = 0; //prepare http header with token & session. sprintf(token, "%s%s", token_text, token_id); @@ -240,9 +297,9 @@ static struct write_result *post_request(const char *url, const char *api_url, c curl_easy_cleanup(curl); - result->data[result->pos] = '\0'; + result->ptr[result->len] = '\0'; if (DEBUG_RESULT) - printf("http post request data is: %s\n", result->data); + printf("http post request data is: %s\n", result->ptr); //free the parser memeory.. if (token_id) @@ -284,14 +341,14 @@ leave: struct json_object *mobile_get_device_signal_hilink() { char *api_url = "http://192.168.8.1/api/device/signal"; - struct write_result *result; + struct string *result; struct json_object *result_json; result = get_request(home_url, api_url); if (!result) goto fail_result; - debug_print("Json object inside library: %s\n", json_object_to_json_string(xml_to_json_converter(result))); + //debug_print("Json object inside library: %s\n", json_object_to_json_string(xml_to_json_converter(result))); result_json = xml_to_json_converter(result); if(!result_json) goto fail_converter; @@ -310,14 +367,14 @@ fail_result: struct json_object *mobile_get_device_info_hilink() { char *api_url = "http://192.168.8.1/api/device/information"; - struct write_result *result; + struct string *result; struct json_object *result_json; result = get_request(home_url, api_url); if (!result) goto fail_result; - debug_print("Json object inside library: %s\n", json_object_to_json_string(xml_to_json_converter(result))); + //debug_print("Json object inside library: %s\n", json_object_to_json_string(xml_to_json_converter(result))); result_json = xml_to_json_converter(result); if(!result_json) goto fail_converter; @@ -337,14 +394,14 @@ fail_result: struct json_object *mobile_get_monitoring_status_hilink() { char *api_url = "http://192.168.8.1/api/monitoring/status"; - struct write_result *result; + struct string *result; struct json_object *result_json; result = get_request(home_url, api_url); if (!result) goto fail_result; - debug_print("Json object inside library: %s\n", json_object_to_json_string(xml_to_json_converter(result))); + //debug_print("Json object inside library: %s\n", json_object_to_json_string(xml_to_json_converter(result))); result_json = xml_to_json_converter(result); if(!result_json) goto fail_converter; @@ -364,14 +421,14 @@ fail_result: struct json_object *mobile_get_trafficstatistics_hilink() { char *api_url = "http://192.168.8.1/api/monitoring/traffic-statistics"; - struct write_result *result; + struct string *result; struct json_object *result_json; result = get_request(home_url, api_url); if (!result) goto fail_result; - debug_print("Json object inside library: %s\n", json_object_to_json_string(xml_to_json_converter(result))); + //debug_print("Json object inside library: %s\n", json_object_to_json_string(xml_to_json_converter(result))); result_json = xml_to_json_converter(result); if(!result_json) goto fail_converter; @@ -391,14 +448,14 @@ fail_result: struct json_object *mobile_get_provider_hilink() { char *api_url = "http://192.168.8.1/api/net/current-plmn"; - struct write_result *result; + struct string *result; struct json_object *result_json; result = get_request(home_url, api_url); if (!result) goto fail_result; - debug_print("Json object inside library: %s\n", json_object_to_json_string(xml_to_json_converter(result))); + //debug_print("Json object inside library: %s\n", json_object_to_json_string(xml_to_json_converter(result))); result_json = xml_to_json_converter(result); if(!result_json) goto fail_converter; @@ -418,14 +475,14 @@ fail_result: struct json_object *mobile_get_pin_status_hilink() { char *api_url = "http://192.168.8.1/api/pin/status"; - struct write_result *result; + struct string *result; struct json_object *result_json; result = get_request(home_url, api_url); if (!result) goto fail_result; - debug_print("Json object inside library: %s\n", json_object_to_json_string(xml_to_json_converter(result))); + //debug_print("Json object inside library: %s\n", json_object_to_json_string(xml_to_json_converter(result))); result_json = xml_to_json_converter(result); if(!result_json) goto fail_converter; @@ -445,14 +502,14 @@ fail_result: struct json_object *mobile_get_connection_status_hilink() { char *api_url = "http://192.168.8.1/api/dialup/connection"; - struct write_result *result; + struct string *result; struct json_object *result_json; result = get_request(home_url, api_url); if (!result) goto fail_result; - debug_print("Json object inside library: %s\n", json_object_to_json_string(xml_to_json_converter(result))); + //debug_print("Json object inside library: %s\n", json_object_to_json_string(xml_to_json_converter(result))); result_json = xml_to_json_converter(result); if(!result_json) goto fail_converter; @@ -472,14 +529,14 @@ fail_result: struct json_object *mobile_get_apn_profiles_hilink() { char *api_url = "http://192.168.8.1/api/dialup/profiles"; - struct write_result *result; + struct string *result; struct json_object *result_json; result = get_request(home_url, api_url); if (!result) goto fail_result; - debug_print("Json object inside library: %s\n", json_object_to_json_string(xml_to_json_converter(result))); + //debug_print("Json object inside library: %s\n", json_object_to_json_string(xml_to_json_converter(result))); result_json = xml_to_json_converter(result); if(!result_json) goto fail_converter; @@ -499,14 +556,14 @@ fail_result: struct json_object *mobile_get_notification_hilink() { char *api_url = "http://192.168.8.1/api/monitoring/check-notifications"; - struct write_result *result; + struct string *result; struct json_object *result_json; result = get_request(home_url, api_url); if (!result) goto fail_result; - debug_print("Json object inside library: %s\n", json_object_to_json_string(xml_to_json_converter(result))); + //debug_print("Json object inside library: %s\n", json_object_to_json_string(xml_to_json_converter(result))); result_json = xml_to_json_converter(result); if(!result_json) goto fail_converter; @@ -526,14 +583,14 @@ fail_result: struct json_object *mobile_get_sms_count_hilink() { char *api_url = "http://192.168.8.1/api/sms/sms-count"; - struct write_result *result; + struct string *result; struct json_object *result_json; result = get_request(home_url, api_url); if (!result) goto fail_result; - debug_print("Json object inside library: %s\n", json_object_to_json_string(xml_to_json_converter(result))); + //debug_print("Json object inside library: %s\n", json_object_to_json_string(xml_to_json_converter(result))); result_json = xml_to_json_converter(result); if(!result_json) goto fail_converter; @@ -553,14 +610,14 @@ fail_result: struct json_object *mobile_get_language_hilink() { char *api_url = "http://192.168.8.1/api/language/current-language"; - struct write_result *result; + struct string *result; struct json_object *result_json; result = get_request(home_url, api_url); if (!result) goto fail_result; - debug_print("Json object inside library: %s\n", json_object_to_json_string(xml_to_json_converter(result))); + //debug_print("Json object inside library: %s\n", json_object_to_json_string(xml_to_json_converter(result))); result_json = xml_to_json_converter(result); if(!result_json) goto fail_converter; @@ -581,7 +638,7 @@ struct json_object *mobile_create_apn_profile_hilink(char *name, char *apn_name, { char *api_url = "http://192.168.8.1/api/dialup/profiles"; char post_query[1024]; - struct write_result *result; + struct string *result; struct json_object *result_json; snprintf(post_query, 1023, "<request><Delete>0</Delete><SetDefault>0</SetDefault><Modify>1</Modify><Profile><Index></Index><IsValid>1</IsValid><Name>%s</Name><ApnIsStatic>1</ApnIsStatic><ApnName>%s</ApnName><DialupNum>*99#</DialupNum><Username>%s</Username><Password>%s</Password><AuthMode>0</AuthMode><IpIsStatic></IpIsStatic><IpAddress></IpAddress><DnsIsStatic></DnsIsStatic><PrimaryDns></PrimaryDns><SecondaryDns></SecondaryDns><ReadOnly>0</ReadOnly><iptype>2</iptype></Profile></request>", name, apn_name, username, password); @@ -610,7 +667,7 @@ struct json_object *mobile_set_apn_profile_hilink(char *name, char *apn_name, ch { char *api_url = "http://192.168.8.1/api/dialup/profiles"; char post_query[1024]; - struct write_result *result; + struct string *result; struct json_object *result_json; snprintf(post_query, 1023, "<request><Delete>0</Delete><SetDefault>3</SetDefault><Modify>2</Modify><Profile><Index>3</Index><IsValid>1</IsValid><Name>%s</Name><ApnIsStatic>1</ApnIsStatic><ApnName>%s</ApnName><DialupNum>*99#</DialupNum><Username>%s</Username><Password>%s</Password><AuthMode>0</AuthMode><IpIsStatic>0</IpIsStatic><IpAddress></IpAddress><DnsIsStatic>0</DnsIsStatic><PrimaryDns></PrimaryDns><SecondaryDns></SecondaryDns><ReadOnly>0</ReadOnly><iptype>0</iptype></Profile></request>", name, apn_name, username, password); @@ -634,12 +691,11 @@ fail_result: return NULL; } - struct json_object *mobile_delete_apn_profile_hilink(int profile_name_location) { char *api_url = "http://192.168.8.1/api/dialup/profiles"; char post_query[512]; - struct write_result *result; + struct string *result; struct json_object *result_json; snprintf(post_query, 512, "<request><Delete>%d</Delete><SetDefault>1</SetDefault><Modify>0</Modify></request>", profile_name_location); @@ -668,7 +724,7 @@ struct json_object *mobile_sms_read_hilink(int sms_location) { char *api_url = "http://192.168.8.1/api/sms/set-read"; char post_query[256]; - struct write_result *result; + struct string *result; struct json_object *result_json; snprintf(post_query, 256, "<request><Index>%d</Index></request>", sms_location); @@ -697,7 +753,7 @@ struct json_object *mobile_sms_delete_hilink(int sms_location) { char *api_url = "http://192.168.8.1/api/sms/delete-sms"; char post_query[256]; - struct write_result *result; + struct string *result; struct json_object *result_json; snprintf(post_query, 256, "<request><Index>%d</Index></request>", sms_location); @@ -726,7 +782,7 @@ struct json_object *mobile_reset_traffic_hilink() { char *api_url = "http://192.168.8.1/api/monitoring/clear-traffic"; char *post_query = "<request><ClearTraffic>1</ClearTraffic></request>"; - struct write_result *result; + struct string *result; struct json_object *result_json; result = post_request(sess_tok_url, api_url, post_query); @@ -753,7 +809,7 @@ struct json_object *mobile_LTE_register_hilink() { char *api_url = "http://192.168.8.1/api/net/register"; char *post_query = "<request><Mode>0</Mode><Plmn></Plmn><Rat></Rat></request>"; - struct write_result *result; + struct string *result; struct json_object *result_json; result = post_request(sess_tok_url, api_url, post_query); @@ -780,7 +836,7 @@ struct json_object *mobile_LTE_enable_hilink() { char *api_url = "http://192.168.8.1/api/net/net-mode"; char *post_query = "<request><NetworkMode>00</NetworkMode><NetworkBand>3FFFFFFF</NetworkBand><LTEBand>7FFFFFFFFFFFFFFF</LTEBand></request>"; - struct write_result *result; + struct string *result; struct json_object *result_json; result = post_request(sess_tok_url, api_url, post_query); @@ -807,7 +863,7 @@ struct json_object *mobile_LTE_disable_hilink() { char *api_url = "http://192.168.8.1/api/net/net-mode"; char *post_query = "<NetworkMode>0201</NetworkMode><NetworkBand>3FFFFFFF</NetworkBand><LTEBand>7FFFFFFFFFFFFFFF</LTEBand></request>"; - struct write_result *result; + struct string *result; struct json_object *result_json; result = post_request(sess_tok_url, api_url, post_query); @@ -835,7 +891,7 @@ struct json_object *mobile_set_connection_type_hilink(int connection_type) { char *api_url = "http://192.168.8.1/api/dialup/connection"; char post_query[256]; - struct write_result *result; + struct string *result; struct json_object *result_json; snprintf(post_query, 256, "<request><NetworkMode>%d</NetworkMode><NetworkBand>3FFFFFFF</NetworkBand><LTEBand>7FFFFFFFFFFFFFFF</LTEBand></request>", connection_type); @@ -864,7 +920,7 @@ struct json_object *data_roaming(int action) { char *api_url = "http://192.168.8.1/api/dialup/connection"; char post_query[256]; - struct write_result *result; + struct string *result; struct json_object *result_json; snprintf(post_query, 256, "<request><RoamAutoConnectEnable>%d</RoamAutoConnectEnable><MaxIdelTime>600</MaxIdelTime><ConnectMode>0</ConnectMode><MTU>1500</MTU><auto_dial_switch>1</auto_dial_switch><pdp_always_on>0</pdp_always_on></request>", action); @@ -905,10 +961,10 @@ struct json_object *pin_action(char *type, char *current_pin, char *new_pin, cha { char *api_url = "http://192.168.8.1/api/pin/operate"; char post_query[256]; - struct write_result *result; + struct string *result; struct json_object *result_json; - sprintf(post_query, 256, "<request><OperateType>%s</OperateType><CurrentPin>%s</CurrentPin><NewPin>%s</NewPin><PukCode>%s</PukCode></request>", type, current_pin, new_pin, puk); + snprintf(post_query, 256, "<request><OperateType>%s</OperateType><CurrentPin>%s</CurrentPin><NewPin>%s</NewPin><PukCode>%s</PukCode></request>", type, current_pin, new_pin, puk); result = post_request(sess_tok_url, api_url, post_query); if (!result) @@ -947,13 +1003,17 @@ struct json_object *mobile_set_pin_hilink(char *current_pin, char *new_pin) return pin_action("03", current_pin, new_pin, ""); } +struct json_object *mobile_unlock_sim_hilink(char *pin, char *puk) +{ + return pin_action("4", pin, pin, puk); +} struct json_object *mobile_set_language_hilink(char *language_name) { char *api_url = "http://192.168.8.1/api/language/current-language"; char post_query[128]; - struct write_result *result; - struct json_object *result_json; + struct string *result; + struct json_object *result_json = NULL; snprintf(post_query, 128, "<request><CurrentLanguage>%s</CurrentLanguage></request>", language_name); @@ -961,27 +1021,19 @@ struct json_object *mobile_set_language_hilink(char *language_name) if (!result) goto fail_result; - debug_print("Json object inside library: %s\n", json_object_to_json_string(xml_to_json_converter(result))); + //debug_print("Json object inside library: %s\n", json_object_to_json_string(xml_to_json_converter(result))); result_json = xml_to_json_converter(result); - if(!result_json) - goto fail_converter; - if (result) - free(result); - - return result_json; - -fail_converter: free(result); fail_result: - return NULL; + return result_json; } struct json_object *network_action(int action) { char *api_url = "http://192.168.8.1/api/dialup/dial"; char post_query[128]; - struct write_result *result; + struct string *result; struct json_object *result_json; snprintf(post_query, 128, "<request><Action>%d</Action></request>", action); diff --git a/libmobile_hilink.h b/libmobile_hilink.h index 8e77d4e142e1cb3ea433b2ed8cb5bb22cce9345b..06e0e071f67582a3771d9b2bad653a3623853772 100644 --- a/libmobile_hilink.h +++ b/libmobile_hilink.h @@ -7,23 +7,25 @@ #include <string.h> #include <stdlib.h> #include <unistd.h> -#include "common.h" +#include <json-c/json.h> +#include <libxml2/libxml/parser.h> +#include <libxml/xpath.h> +#include <libxml/xpathInternals.h> +#include "lib_commons.h" #define BUFFER_SIZE (256 * 1024) //256kb -//#define TAG_CONTENT_SIZE 100 +#define TAG_CONTENT_SIZE 100 #define DEBUG 1 #define DEBUG_RESULT 0 #define ENABLE 1 #define DISABLE 0 -/* -struct write_result { - char *data; - int pos; -}; -*/ + + +char *xml_parser(struct string *result, char *tag); +struct json_object *xml_to_json_converter(struct string *result); //pci, sc, cell_id, rsrq, rsrp, rssi, sinr, rscp, ecio, mode.. @@ -70,6 +72,8 @@ struct json_object *mobile_create_apn_profile_hilink(char *name, char *apn_name, struct json_object *mobile_set_apn_profile_hilink(char *name, char *apn_name, char *username, char *password); +struct json_object *mobile_unlock_sim_hilink(char *pin, char *puk); + struct json_object *mobile_delete_apn_profile_hilink(int profile_name_location); struct json_object *mobile_sms_read_hilink(int sms_location);