Skip to content
Snippets Groups Projects
libmobile.c 7.73 KiB
#include "libmobile.h"

struct string {
	char *ptr;
	size_t len;
};

void curl_cleaner(CURLcode *curl)
{
	curl_easy_cleanup(curl);
	curl_global_cleanup();
}

size_t write_func(void *buffer, size_t size, size_t nmemb, void *userp)
{
	struct string *str = (struct string *)userp;
	size_t new_len = str->len + (size * nmemb);

	str->ptr = realloc(str->ptr, new_len + 1);
	if (str->ptr == NULL) {
		printf("not enough ptr (realloc returned NULL)\n");
		return 0;
	}
	memcpy(str->ptr + str->len, buffer, size * nmemb);
	str->ptr[new_len] = '\0';
	str->len = new_len;

	return size * nmemb;
}

int apn_profile_idx(struct json_object *apn_profiles, char *name)
{
	int idx = 0;

	json_object_object_foreach(apn_profiles, key, val)
	{
		char *apn_profile = json_object_get_string(val);
		char *apn_name = strtok(apn_profile, "($)");

		if (strncmp(apn_name, name, 1024) == 0)
			return idx;
		idx++;
	}
	return -1;
}

int get_apn_profiles_len(void)
{
	char *response = mobile_get_apn_profiles();
	struct json_object *apn_profiles = json_tokener_parse(response);
	int len = 0;

	json_object_object_foreach(apn_profiles, key, val) {
		if (strlen(json_object_get_string(val)) > 0)
			len++;
		else
			goto finished;
	}

	json_object_put(apn_profiles);
	return -1;
finished:
	json_object_put(apn_profiles);
	return len;
}

char *mobile_connect_network(void)
{
	char query[1024] = {0};
	strncpy(query, "isTest=false&goformId=CONNECT_NETWORK", 1023);
	return mobile_post_request(query);
}

char *mobile_disconnect_network(void)
{
	char query[1024] = {0};
	// removed notcallback, why have it?
	strncpy(query, "isTest=false&goformId=DISCONNECT_NETWORK", 1023);
	return mobile_post_request(query);
}

char *mobile_delete_apn(char *name)
{
	char *apn_profiles = mobile_get_apn_profiles();
	struct json_object *apn_profiles_json = json_tokener_parse(apn_profiles);
	char query[1024] = {0};
	int idx = apn_profile_idx(apn_profiles_json, name);

	free(apn_profiles);
	if (idx < 0)
		goto fail;

	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(apn_profiles_json);
	return mobile_post_request(query);
fail:
	json_object_put(apn_profiles_json);
	return NULL;
}

char *mobile_enable_roaming(void)
{
	return mobile_post_request("isTest=false&goformId=SET_CONNECTION_MODE&roam_setting_option=on");
}

char *mobile_disable_roaming(void)
{
	return mobile_post_request("isTest=false&goformId=SET_CONNECTION_MODE&roam_setting_option=off");
}

char *mobile_get_roam_status(void)
{
	return mobile_get_request("roam_setting_option");
}

char *mobile_get_wan_apn(void)
{
	return mobile_get_request("wan_apn");
}

char *mobile_get_pinnumber(void)
{
	return mobile_get_request("pinnumber");
}

char *mobile_get_pin_status(void)
{
	return mobile_get_request("pin_status");
}

char *mobile_get_rssi(void)
{
	return mobile_get_request("rssi");
}

char *mobile_get_modem_state(void)
{
	return mobile_get_request("&sms_received_flag_flag=0&sts_received_flag_flag=0&cmd=modem_main_state%2Cpin_status%2Cloginfo%2Cnew_version_state%2Ccurrent_upgrade_state%2Cis_mandatory%2Csms_received_flag%2Csts_received_flag%2Csignalbar%2Cnetwork_type%2Cnetwork_provider%2Cppp_status%2CEX_SSID1%2Cex_wifi_status%2CEX_wifi_profile%2Cm_ssid_enable%2Csms_unread_num%2CRadioOff%2Csimcard_roam%2Clan_ipaddr%2Cstation_mac%2Cbattery_charging%2Cbattery_vol_percent%2Cbattery_pers%2Cspn_display_flag%2Cplmn_display_flag%2Cspn_name_data%2Cspn_b1_flag%2Cspn_b2_flag%2Crealtime_tx_bytes%2Crealtime_rx_bytes%2Crealtime_time%2Crealtime_tx_thrpt%2Crealtime_rx_thrpt%2Cmonthly_rx_bytes%2Cmonthly_tx_bytes%2Cmonthly_time%2Cdate_month%2Cdata_volume_limit_switch%2Cdata_volume_limit_size%2Cdata_volume_alert_percent%2Cdata_volume_limit_unit%2Croam_setting_option%2Cupg_roam_switch%2Chplmn");
}
char *mobile_get_apn_profiles(void)
{
	return mobile_get_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");
}

char *mobile_create_apn_profile(char *name)
{
	char query[1024] = {0};

	strncpy(query, "isTest=false&goformId=APN_PROC_EX&apn_action=save&apn_mode=manual&profile_name=", 1023);
	strncat(query + strlen(query), name, 1023);
	strncat(query + strlen(query), "&wan_dial=*99%23&apn_select=manual&pdp_type=IP&pdp_select=auto&pdp_addr=&index=", 1023);
	sprintf(query + strlen(query), "%d", get_apn_profiles_len());
	strncat(query + strlen(query), "&wan_apn=", 1023);
	strncat(query + strlen(query), name, 1023);
	strncat(query + strlen(query), "&ppp_auth_mode=none&ppp_username=&ppp_passwd=&dns_mode=auto&prefer_dns_manual=&standby_dns_manual=", 1023);
	printf("query: %s\n", query);

	return mobile_post_request(query);
}

char *mobile_set_apn_profile(char *name)
{
	char *apn_profiles = mobile_get_apn_profiles();
	struct json_object *apn_profiles_json = json_tokener_parse(apn_profiles);
	int idx = apn_profile_idx(apn_profiles_json, name);
	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);

	return mobile_post_request(query);
}


char *mobile_enable_pin(char *pin)
{
	char query[1024] = {0};

	strncpy(query, "isTest=false&goformId=ENABLE_PIN&OldPinNumber=", 1023);
	strncat(query + strlen(query), pin, 1023);
	strncat(query + strlen(query), "&pin_save_flag=0&isTest=false", 1023);

	return mobile_post_request(query);
}

char *mobile_set_pin(char *current_pin, char *new_pin)
{
	char query[1024] = {0};

	strncpy(query, "isTest=false&goformId=ENABLE_PIN&OldPinNumber=", 1023);
	strncat(query + strlen(query), current_pin, 1023);
	strncat(query + strlen(query), "&NewPinNumber=", 1023);
	strncat(query + strlen(query), new_pin, 1023);
	strncat(query + strlen(query), "&pin_save_flag=0&isTest=false", 1023);

	return mobile_post_request(query);
}

char *mobile_disable_pin(char *pin)
{
	char query[1024] = {0};

	strncpy(query, "isTest=false&goformId=DISABLE_PIN&OldPinNumber=", 1023);
	strncat(query + strlen(query), pin, 1023);
	strncat(query + strlen(query), "&pin_save_flag=0&isTest=false", 1023);
	return mobile_post_request(query);
}

char *mobile_post_request(char *query)
{
	CURL *curl;
	CURLcode res;
	struct string str;

	str.ptr = calloc(1, 1);
	str.len = 0;
	curl = curl_easy_init();

	if (curl) {
		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");
		curl_easy_setopt(curl, CURLOPT_POSTFIELDS, query);

		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_func);
		curl_easy_setopt(curl, CURLOPT_WRITEDATA, &str);
		res = curl_easy_perform(curl);
		if (res) {
			printf("errored when performing curl, %s\n", curl_easy_strerror(res));
			goto fail;
		}
	}

	curl_cleaner(curl);
	return str.ptr;
fail:
	return NULL;
}

char *mobile_get_request(char *vars)
{
	CURL *curl;
	CURLcode res;
	struct string str;
	char query[1024] = {0};

	strncpy(query, "http://192.168.0.1/goform/goform_get_cmd_process?isTest=false&cmd=", 1023);
	strncat(query + strlen(query), vars, 1023);
	strncat(query + strlen(query), "&multi_data=1", 1023);

	str.ptr = calloc(1, 1);
	str.len = 0;
	curl = curl_easy_init();
	if (curl) {
		curl_easy_setopt(curl, CURLOPT_URL, query);
		curl_easy_setopt(curl, CURLOPT_REFERER, "http://192.168.0.1/index.html");
		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_func);
		curl_easy_setopt(curl, CURLOPT_WRITEDATA, &str);
		res = curl_easy_perform(curl);
		if (res) {
			printf("errored when performing curl, %s\n", curl_easy_strerror(res));
			goto fail;
		}
	}

	curl_cleaner(curl);
	return str.ptr;
fail:
	return NULL;
}