#ifdef DEBUG #ifdef ANDROID #include #else #include #endif // ANDROID #endif // DEBUG #include #include #include #include #include "rtclient.h" typedef struct rt_user rt_user; static CURL *curl = NULL; static char *server_url = NULL; bool rtclient_init(const char *url) { curl_global_init(CURL_GLOBAL_SSL); curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(curl, CURLOPT_COOKIEFILE, ""); curl_easy_setopt(curl, CURLOPT_REFERER, url); #ifdef DEBUG curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); #endif // DEBUG server_url = malloc(strlen(url) + 1); strcpy(server_url, url); } return (bool)curl; } void rtclient_login(const char *name, const char *password) { struct curl_httppost *post, *last = NULL; curl_formadd(&post, &last, CURLFORM_COPYNAME, "user", CURLFORM_PTRCONTENTS, name, CURLFORM_END); curl_formadd(&post, &last, CURLFORM_COPYNAME, "pass", CURLFORM_PTRCONTENTS, password, CURLFORM_END); last = NULL; curl_easy_setopt(curl, CURLOPT_URL, server_url); curl_easy_setopt(curl, CURLOPT_HTTPPOST, post); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL); #ifdef DEBUG CURLcode res = #endif // DEBUG curl_easy_perform(curl); #ifdef DEBUG if (res != CURLE_OK) { const char *error = curl_easy_strerror(res); #ifdef ANDROID __android_log_print(ANDROID_LOG_ERROR, "librtclient.so", "cURL perform error: %s", error); #else fprintf(stderr, "cURL perform error: %s\n", error); #endif // ANDROID } #endif // DEBUG } static size_t user_callback(void *contents, size_t size, size_t nmemb, void *writedata) { size_t realsize = size * nmemb; char response[realsize + 1]; memcpy(&response[0], contents, realsize); response[realsize] = '\0'; static const unsigned short nproperties = 24; char *lines[nproperties]; char *line = strtok(response, "\n"); if (strstr(line, "200 Ok")) { rt_user *user = (rt_user *)writedata; user = malloc(sizeof(rt_user)); line = strtok(NULL, "\n"); unsigned short i = 0; while (line && i < nproperties) { lines[i++] = line; line = strtok(NULL, "\n"); } for (unsigned short i = 0; i < nproperties; i++) { char *token = strtok(lines[i], ":"); #ifdef DEBUG #ifdef ANDROID __android_log_print(ANDROID_LOG_DEBUG, "librtclient.so" , "Key: %s", token); #else fprintf(stderr, "Key: %s\n", token); #endif // ANDROID #endif // DEBUG token = strtok(NULL, ":"); #ifdef DEBUG #ifdef ANDROID __android_log_print(ANDROID_LOG_DEBUG, "librtclient.so" , "Value: %s", ++token); #else fprintf(stderr, "Value: %s\n", ++token); #endif // ANDROID #endif // DEBUG } free(user); } return realsize; } static inline void request(const char *path, const char *suffix) { char url[strlen(server_url) + strlen(path) + strlen(suffix) + 1]; sprintf(url, "%s%s%s", server_url, path, suffix); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); curl_easy_perform(curl); } rt_user *rtclient_user(const char *name) { rt_user *user = NULL; curl_easy_setopt(curl, CURLOPT_WRITEDATA, user); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, user_callback); request("/REST/1.0/user/", name); return user; } void rtclient_search(const char *query) { request("/REST/1.0/search/ticket?query=", query); } void rtclient_cleanup() { if (curl) { free(server_url); curl_easy_cleanup(curl); } curl_global_cleanup(); }