#ifndef RTCLIENT_REQUEST_H #define RTCLIENT_REQUEST_H #if defined(ANDROID) && defined(DEBUG) #include #endif #include #include #include #include extern CURL *curl; extern char *server_url; inline void request(size_t (*writefunction)(void *, size_t, size_t, void *) , void *writedata, struct curl_httppost *post, char *fmt, ...) { va_list ap; char *p, *sval; unsigned int uval; size_t length = strlen(server_url) + strlen(fmt); va_start(ap, fmt); for (p = fmt; *p; p++) { if (*p != '%') continue; switch(*++p) { case 's': sval = va_arg(ap, char *); length += strlen(sval) - 2; break; case 'u': uval = va_arg(ap, unsigned int); do { length++; } while ((uval /= 10)); length -= 2; break; case 'c': length++; break; default: break; } } va_end(ap); char url[length + 1]; length = 0; strcpy(url, server_url); va_start(ap, fmt); for (p = fmt; *p; p++) { if (*p != '%') continue; switch(*++p) { case 's': sval = va_arg(ap, char *); strcat(url, sval); length = strlen(url); break; case 'u': uval = va_arg(ap, unsigned int); sprintf(url, "%s%u", url, uval); length = strlen(url); break; case 'c': url[length++] = (char)va_arg(ap, int); url[length] = '\0'; break; default: break; } } va_end(ap); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunction); if (writedata) curl_easy_setopt(curl, CURLOPT_WRITEDATA, writedata); else curl_easy_setopt(curl, CURLOPT_WRITEDATA, stdout); if (post) curl_easy_setopt(curl, CURLOPT_HTTPPOST, post); else curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); #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", "%s: %s" , __func__, error); #else fprintf(stderr, "%s: %s\n", __func__, error); #endif // ANDROID } #endif // DEBUG } #endif // RTCLIENT_REQUEST_H