diff --git a/libmobile.c b/libmobile.c index e856f1e58b992e4df2fe244c9af9a0f8ecaadee9..252e338c58914ad6e8df06955f57fe80e8b9a812 100644 --- a/libmobile.c +++ b/libmobile.c @@ -23,11 +23,10 @@ static int apn_profile_idx(struct json_object *apn_profiles, char *name); static int get_apn_profiles_len(void); static char *lexer(char **input, char *delimiter); static char *get_query_wrapper(char *vars); -static CURLcode *perform_post_request(curl, query, str); -static CURLcode *perform_post_request(curl, query, str); -static struct json_object *perform_post_request(char *query); -static struct json_object *perform_get_request(char *vars); -static struct json_object *parse_apn_profiles(char *apn_profiles); +static CURLcode perform_post_request(CURL *curl, char *query, struct string *str); +static CURLcode perform_get_request(CURL *curl, char *query, struct string *str); +static struct json_object *prepare_request(char *query, int option); +static struct json_object *parse_apn_profiles(struct json_object *apn_profiles); /** * Function: curl_cleaner @@ -120,36 +119,28 @@ static int apn_profile_idx(struct json_object *apn_profiles, char *name) */ static int get_apn_profiles_len(void) { - char *response = mobile_get_apn_profiles(); + struct json_object *apn_profiles = mobile_get_apn_profiles(); - if (!response) { - printf("no response!\n"); + if (!apn_profiles) { + printf("Failed to get apn profiles from server!\n"); goto fail; } - struct json_object *parsed_response = json_tokener_parse(response); - - if (!parsed_response) { - printf("no valid json to parse!"); - goto free_response; - } int len = 0; - json_object_object_foreach(parsed_response, key, val) { - if (strlen(json_object_get_string(val)) > 0) + json_object_object_foreach(apn_profiles, key, val) { + int val_type = json_object_get_type(val); + + if (val_type != json_type_string) len++; else goto success; } - json_object_put(parsed_response); -free_response: - free(response); -fail: - return -1; success: - json_object_put(parsed_response); - free(response); + json_object_put(apn_profiles); return len; +fail: + return -1; } /** @@ -233,7 +224,7 @@ static char *get_query_wrapper(char *vars) * Returns: * The CURLcode indicating the success or failure of the curl execution. */ -static CURLcode *perform_post_request(curl, query, str) +static CURLcode perform_post_request(CURL *curl, char *query, struct string *str) { curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.0.1/goform/goform_set_cmd_process"); curl_easy_setopt(curl, CURLOPT_REFERER, "http://192.168.0.1/index.html"); @@ -257,7 +248,7 @@ static CURLcode *perform_post_request(curl, query, str) * Returns: * The CURLcode indicating the success or failure of the curl execution. */ -static CURLcode *perform_get_request(CURL *curl, char *query, struct string *str) +static CURLcode perform_get_request(CURL *curl, char *query, struct string *str) { curl_easy_setopt(curl, CURLOPT_URL, query); curl_easy_setopt(curl, CURLOPT_REFERER, "http://192.168.0.1/index.html"); @@ -310,7 +301,7 @@ static struct json_object *prepare_request(char *query, int option) struct json_object *parsed_response = json_tokener_parse(str.ptr); if (!parsed_response) { - DEBUG("No valid JSON, failed parsing!\n"); + printf("No valid JSON, failed parsing!\n"); goto fail_json; } @@ -335,21 +326,20 @@ fail: * and transforms them into a more easily read and worked with JSON format. * * Parameters: - * apn_profiles - A character string containing the APN profiles. + * apn_profiles - A json_object pointer containing the original apn configuration returned by the dongle. * * Returns: - * The newly generated JSON on success. + * A json_object pointer to apn configurations in a more representative and easier to use format. * NULL on failure. */ -static struct json_object *parse_apn_profiles(json_object *apn_profiles) +static struct json_object *parse_apn_profiles(struct json_object *apn_profiles) { struct json_object *parsed_profiles = json_object_new_object(); int apn_counter = 0; char *field_names[13] = {"profile_name", "apn_name", "mode", "wan_dial", "ppp_auth_mode", "ppp_username", "ppp_passwd", "pdp", "pdpd_select", "pdp_addr", "dns_mode", "prefer_dns_manual", "standby_dns_manual"}; - int rv; - json_object_object_foreach(apn_profiles_json, key, val) { + json_object_object_foreach(apn_profiles, key, val) { char *apn_string = json_object_get_string(val); if (strlen(apn_string) <= 0) @@ -371,15 +361,9 @@ static struct json_object *parse_apn_profiles(json_object *apn_profiles) json_object_put(apn_profile); apn_counter++; } - goto finished; -free_objects: - json_object_put(apn_profiles_json); - json_object_put(parsed_profiles); -fail: - return NULL; finished: - json_object_put(apn_profiles_json); + json_object_put(apn_profiles); return parsed_profiles; } @@ -396,37 +380,28 @@ struct json_object *mobile_disconnect_network(void) struct json_object *mobile_delete_apn(char *name) { - char *response = mobile_get_apn_profiles(); + struct json_object *apn_profiles = mobile_get_apn_profiles(); - if (!response) { + if (!apn_profiles) { printf("no response!\n"); goto fail; } - struct json_object *parsed_response = json_tokener_parse(response); - - if (!parsed_response) { - printf("no valid json to parse!"); - goto free_response; - } char query[1024] = {0}; - int idx = apn_profile_idx(parsed_response, name); + int idx = apn_profile_idx(apn_profiles, name); if (idx < 0) { printf("APN not found in list!\n"); - goto free_all; + goto fail_idx; } strncpy(query, "isTest=false&apn_action=delete&apn_mode=manual&index=", 1023); sprintf(query + strlen(query), "%d", idx); strncat(query + strlen(query), "&goformId=APN_PROC_EX", 1023); - json_object_put(parsed_response); - free(response); + json_object_put(apn_profiles); return prepare_request(query, POST); -free_all: - json_object_put(parsed_response); -free_response: - free(response); +fail_idx: + json_object_put(apn_profiles); fail: return NULL; } @@ -473,13 +448,13 @@ struct json_object *mobile_get_modem_state(void) struct json_object *mobile_get_apn_profiles(void) { - struct json_object *parsed_response = prepare_request("APN_config0,APN_config1,APN_config2,APN_config3,APN_config4,APN_config5,APN_config6,APN_config7,APN_config8,APN_config9,APN_config10,APN_config11,APN_config12,APN_config13,APN_config14,APN_config15,APN_config16,APN_config17,APN_config18,APN_config19", GET); + struct json_object *apn_profiles = prepare_request("APN_config0,APN_config1,APN_config2,APN_config3,APN_config4,APN_config5,APN_config6,APN_config7,APN_config8,APN_config9,APN_config10,APN_config11,APN_config12,APN_config13,APN_config14,APN_config15,APN_config16,APN_config17,APN_config18,APN_config19", GET); - if (!parsed_response) { + if (!apn_profiles) { printf("Error getting profiles!\n"); goto fail; } - return parse_apn_profiles(parsed_response); + return parse_apn_profiles(apn_profiles); fail: return NULL; } @@ -501,37 +476,27 @@ struct json_object *mobile_create_apn_profile(char *name) struct json_object *mobile_set_apn_profile(char *name) { - char *response = mobile_get_apn_profiles(); + struct json_object *apn_profiles = mobile_get_apn_profiles(); - if (!response) { + if (!apn_profiles) { printf("no response!\n"); goto fail; } - struct json_object *parsed_response = json_tokener_parse(response); - - if (!parsed_response) { - printf("no valid json to parse!"); - goto free_response; - } - int idx = apn_profile_idx(parsed_response, name); + int idx = apn_profile_idx(apn_profiles, name); if (idx < 0) { printf("couldnt find idx, no such profile!\n"); - goto free_all; + goto free_idx; } char query[1024] = {0}; strncpy(query, "isTest=false&goformId=APN_PROC_EX&apn_mode=manual&apn_action=set_default&set_default_flag=1&pdp_type=IP&index=", 1023); sprintf(query + strlen(query), "%d", idx); - json_object_put(parsed_response); - free(response); + json_object_put(apn_profiles); return prepare_request(query, POST); - -free_all: - json_object_put(parsed_response); -free_response: - free(response); +free_idx: + json_object_put(apn_profiles); fail: return NULL; }