Skip to content
Snippets Groups Projects
libmobile_hilink.c 13.08 KiB
/***************************************************************************
 *
 *	Project: dongle
 *
 *
 ***************************************************************************/

#include "libmobile_hilink.h"


//global varibales
char *home_url = "http://192.168.8.1/html/index.html";
char *sess_tok_url = "http://192.168.8.1/api/webserver/SesTokInfo";

//free mem.
char *parser(char *data, char *keyword)
{
	char *session_token;
	char *ptr = NULL;

	session_token = (char *)calloc(1024, sizeof(*session_token));
	if (!session_token)
		goto leave_token;

	//parse keyword..
	ptr = strstr(data, keyword);
	if (ptr == NULL)
	{
		goto leave_not_found;
	}

	int strl = strlen(keyword);
	ptr += strl;
	sscanf(ptr, "%[^<]", session_token);

	return session_token;

leave_not_found:
	free(session_token);
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;

	if (result->pos + 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;

	return total_size;
}



struct write_result *memalloc_write_result(void)
{
	struct write_result *wr = (struct write_result *) calloc(1, sizeof(*wr));
	if (!wr)
		goto leave;
	wr->data = calloc(BUFFER_SIZE, sizeof(wr->data));
	if (!wr->data)
		goto leave;

	wr->pos = 0;

	return wr;

leave:
	if (wr)
		free(wr);

	if (wr->data)
		free(wr->data);

	return NULL;
}


void free_write_result(struct write_result *result)
{
	if (result) {
		free(result);
	}
}



int check_cookie_status(CURLcode status, CURL *curl)
{
	long code;

	if (status != 0) {
		if (DEBUG)
			printf(": %s\n", curl_easy_strerror(status));
		return 1;
	}

	curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
	if (code != 200) {
		if (DEBUG)
			printf("error: server responded with code %ld\n", code);
		return 1;
	}

	return 0;
}


void prepare_curl_write_callback(CURL *curl, const char *url, struct write_result *result)
{
	curl_easy_setopt(curl, CURLOPT_URL, url);
	curl_easy_setopt(curl, CURLOPT_WRITEDATA, result);
	curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_response);
}



//free mem
static struct write_result *get_request(const char *url, const char *api_url)
{
	CURL *curl = NULL;
	CURLcode status;
	struct write_result *result;

	curl = curl_easy_init();
	if (!curl)
		goto leave;

	result = memalloc_write_result();
	if (!result)
		goto leave;

	prepare_curl_write_callback(curl, url, result);
	curl_easy_setopt(curl, CURLOPT_COOKIEFILE, ""); //start the cookie engine ..
	curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookies.txt"); //Save the cookie from the server to cookie.txt

	status = curl_easy_perform(curl);
	if (check_cookie_status(status, curl))
		goto leave;

	//Prepare result struct to get next http response.
	memset(result->data, 0, BUFFER_SIZE);
	result->pos = 0;

	prepare_curl_write_callback(curl, api_url, result);
	curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookies.txt"); //Read locally stored cookies

	status = curl_easy_perform(curl);
	if (check_cookie_status(status, curl))
		goto leave;


	result->data[result->pos] = '\0';
	if (DEBUG_RESULT)
		printf("Http get request data is: %s\n", result->data);

	curl_easy_cleanup(curl);

	return result;

leave:
	if (curl) {
		printf("error occured: easy cleanup curl");
		curl_easy_cleanup(curl);
	}
	if (result)
		free_write_result(result);

	return NULL;
}


//free mem
static struct write_result *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;
	CURL *curl = NULL;
	CURLcode status;

	curl = curl_easy_init();
	if (!curl)
		goto leave;

	result = memalloc_write_result();
	if (!result)
		goto leave;

	prepare_curl_write_callback(curl, url, result);

	status = curl_easy_perform(curl);
	if (check_cookie_status(status, curl))
		goto leave;

	result->data[result->pos] = '\0';


	char *session_id = parser(result->data, "SessionID=");
	if (DEBUG)
		printf("Session id is: %s\n", session_id);
	char *token_id = parser(result->data, "<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;

	//prepare http header with token & session.
	sprintf(token, "%s%s", token_text, token_id);
	sprintf(session, "%s%s", session_text, session_id);

	headers = curl_slist_append(headers, token);
	headers = curl_slist_append(headers, session);
	headers = curl_slist_append(headers, "Content-Type: application/x-www-form-urlencoded; charset=UTF-8");
	curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
	prepare_curl_write_callback(curl, api_url, result);
	curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_query);

	status = curl_easy_perform(curl);
	if (check_cookie_status(status, curl))
		goto leave;


	curl_easy_cleanup(curl);

	result->data[result->pos] = '\0';
	if (DEBUG_RESULT)
		printf("http post request data is: %s\n", result->data);

	//free the parser memeory..
	if (token_id)
	{
		free(token_id);
		token_id = NULL;
	}

	if (session_id)
	{
		free(session_id);
		session_id = NULL;
	}

	return result;

leave:
	if (curl) {
		printf("error occured: easy cleanup curl\n");
		curl_easy_cleanup(curl);
	}

	if (result)
		free_write_result(result);

	if (headers)
		curl_slist_free_all(headers);

	if (token_id)
		free(token_id);

	if (session_id)
		free(session_id);

	return NULL;
}


struct write_result *mobile_get_device_info_hilink()
{
	char *api_url = "http://192.168.8.1/api/device/information";

	return get_request(home_url, api_url);
}


struct write_result *mobile_get_monitoring_status_hilink()
{
	char *api_url = "http://192.168.8.1/api/monitoring/status";

	return get_request(home_url, api_url);
}


struct write_result *mobile_get_trafficstatistics_hilink()
{
	char *api_url = "http://192.168.8.1/api/monitoring/traffic-statistics";

	return get_request(home_url, api_url);
}


struct write_result *mobile_get_provider_hilink()
{
	char *api_url = "http://192.168.8.1/api/net/current-plmn";

	return get_request(home_url, api_url);
}


struct write_result *mobile_get_pin_status_hilink()
{
	char *api_url = "http://192.168.8.1/api/pin/status";

	return get_request(home_url, api_url);
}


struct write_result *mobile_get_connection_status_hilink()
{
	char *api_url = "http://192.168.8.1/api/dialup/connection";

	return get_request(home_url, api_url);
}


struct write_result *mobile_get_apn_profiles_hilink()
{
	char *api_url = "http://192.168.8.1/api/dialup/profiles";

	return get_request(home_url, api_url);
}


struct write_result *mobile_get_notification_hilink()
{
	char *api_url = "http://192.168.8.1/api/monitoring/check-notifications";

	return get_request(home_url, api_url);
}


struct write_result *mobile_get_sms_count_hilink()
{
	char *api_url = "http://192.168.8.1/api/sms/sms-count";

	return get_request(home_url, api_url);
}


struct write_result *mobile_get_language_hilink()
{
	char *api_url = "http://192.168.8.1/api/language/current-language";

	return get_request(home_url, api_url);
}

       /*     post calls */
struct write_result *mobile_create_apn_profile_hilink(char *name, char *apn_name, char *username, char *password)
{
	char *api_url = "http://192.168.8.1/api/dialup/profiles";
	char post_query[1024];

	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);

	return post_request(sess_tok_url, api_url, post_query);
}


struct write_result *mobile_set_apn_profile_default_hilink(char *name, char *apn_name, char *username, char *password)
{
	char *api_url = "http://192.168.8.1/api/dialup/profiles";
	char post_query[1024];

	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);

	return post_request(sess_tok_url, api_url, post_query);
}


struct write_result *mobile_delete_apn_profile_hilink(int profile_name_location)
{
	char *api_url = "http://192.168.8.1/api/dialup/profiles";
	char post_query[512];

	sprintf(post_query, "<request><Delete>%d</Delete><SetDefault>1</SetDefault><Modify>0</Modify></request>", profile_name_location);

	return post_request(sess_tok_url, api_url, post_query);
}


struct write_result *mobile_sms_read_hilink(int sms_location)
{
	char *api_url = "http://192.168.8.1/api/sms/set-read";
	char post_query[256];

	sprintf(post_query, "<request><Index>%d</Index></request>", sms_location);

	return post_request(sess_tok_url, api_url, post_query);
}


struct write_result *mobile_sms_delete_hilink(int sms_location)
{
	char *api_url = "http://192.168.8.1/api/sms/delete-sms";
	char post_query[256];

	sprintf(post_query, "<request><Index>%d</Index></request>", sms_location);

	return post_request(sess_tok_url, api_url, post_query);
}


struct write_result *mobile_reset_traffic_hilink()
{
	char *api_url = "http://192.168.8.1/api/monitoring/clear-traffic";
	char *post_query = "<request><ClearTraffic>1</ClearTraffic></request>";

	return post_request(sess_tok_url, api_url, post_query);
}

  /*   mobile_LTE_register has to be called to enbale or disable LTE   */
struct write_result *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>";

	return post_request(sess_tok_url, api_url, post_query);
}


struct write_result *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>";

	return post_request(sess_tok_url, api_url, post_query);
}


struct write_result *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>";

	return post_request(sess_tok_url, api_url, post_query);
}


/*   00 - default- 4g,   01 - 2g, 02 - 3g    */
struct write_result *mobile_set_connection_type_hilink(int connection_type)
{
	char *api_url = "http://192.168.8.1/api/dialup/connection";
	char post_query[256];

	sprintf(post_query, "<request><NetworkMode>%d</NetworkMode><NetworkBand>3FFFFFFF</NetworkBand><LTEBand>7FFFFFFFFFFFFFFF</LTEBand></request>", connection_type);

	return post_request(sess_tok_url, api_url, post_query);
}


struct write_result *data_roaming_hilink(int action)
{
	char *api_url = "http://192.168.8.1/api/dialup/connection";
	char post_query[256];

	sprintf(post_query, "<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);

	return post_request(sess_tok_url, api_url, post_query);
}


struct write_result *mobile_data_roaming_enable_hilink()
{
	return data_roaming(ENABLE);
}


struct write_result *mobile_data_roaming_disable_hilink()
{
	return data_roaming(DISABLE);
}

/* 00 -> enter pin, 01 -> activate pin, 02 ->disable pin, 03 -> change pin, 04 -> enter puk */
struct write_result *pin_action_hilink(char *type, char *current_pin, char *new_pin, char *puk)
{
	char *api_url = "http://192.168.8.1/api/pin/operate";
	char post_query[256];

	sprintf(post_query, "<request><OperateType>%s</OperateType><CurrentPin>%s</CurrentPin><NewPin>%s</NewPin><PukCode>%s</PukCode></request>", type, current_pin, new_pin, puk);

	return post_request(sess_tok_url, api_url, post_query);
}


struct write_result *mobile_pin_enable_hilink(char *current_pin)
{
	return pin_action("01", current_pin, "", "");
}


struct write_result *mobile_pin_disable_hilink(char *current_pin)
{
	return pin_action("02", current_pin, "", "");
}


struct write_result *mobile_pin_set_hilink(char *current_pin, char *new_pin)
{
	return pin_action("03", current_pin, new_pin, "");
}


struct write_result *mobile_set_language_hilink(char *language_name)
{
	char *api_url = "http://192.168.8.1/api/language/current-language";
	char post_query[128];

	snprintf(post_query, 128, "<request><CurrentLanguage>%s</CurrentLanguage></request>", language_name);

	return post_request(sess_tok_url, api_url, post_query);
}