-
Jakob Olsson authoredJakob Olsson authored
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);
}