diff -r 5d227a11b850 -r 45db371f78a7 extensions/curl/curlapi.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/curl/curlapi.cpp Sun Jan 11 23:48:17 2009 -0500 @@ -0,0 +1,114 @@ +#include "curlapi.h" + +Webternet g_webternet; + +WebTransfer *WebTransfer::CreateWebSession() +{ + CURL *curl; + + curl = curl_easy_init(); + if (curl == NULL) + { + return NULL; + } + + WebTransfer *easy = new WebTransfer(curl); + + if (curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, easy->errorBuffer)) + { + delete easy; + return NULL; + } + curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1); + curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); + + return easy; +} + +WebTransfer::WebTransfer(CURL *_curl) +{ + this->curl = _curl; +} + +const char *WebTransfer::LastErrorMessage() +{ + return errorBuffer; +} + +int WebTransfer::LastErrorCode() +{ + return lastError; +} + +bool WebTransfer::SetHeaderReturn(bool recv_hdr) +{ + lastError = curl_easy_setopt(curl, CURLOPT_HEADER, recv_hdr ? 1 : 0); + return lastError == 0; +} + +static size_t curl_write_to_sm(void *ptr, size_t bytes, size_t nmemb, void *stream) +{ + void **userdata = (void **)stream; + IWebTransfer *session = (IWebTransfer *)userdata[0]; + ITransferHandler *handler = (ITransferHandler *)userdata[1]; + + DownloadWriteStatus status; + status = handler->OnDownloadWrite(session, userdata[2], ptr, bytes, nmemb); + if (status != DownloadWrite_Okay) + { + /* Return a differing amount */ + return (bytes == 0 || nmemb == 0) ? 1 : 0; + } + + return bytes * nmemb; +} + +bool WebTransfer::Download(const char *url, ITransferHandler *handler, void *data) +{ + lastError = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_write_to_sm); + if (lastError) + { + return false; + } + + void *userdata[3]; + userdata[0] = this; + userdata[1] = handler; + userdata[2] = data; + lastError = curl_easy_setopt(curl, CURLOPT_WRITEDATA, userdata); + if (lastError) + { + return false; + } + + lastError = curl_easy_setopt(curl, CURLOPT_URL, url); + if (lastError) + { + return false; + } + + lastError = curl_easy_perform(curl); + + return (lastError == 0); +} + +WebTransfer::~WebTransfer() +{ + curl_easy_cleanup(curl); +} + +unsigned int Webternet::GetInterfaceVersion() +{ + return SMINTERFACE_WEBTERNET_VERSION; +} + +const char *Webternet::GetInterfaceName() +{ + return SMINTERFACE_WEBTERNET_NAME; +} + +IWebTransfer *Webternet::CreateSession() +{ + return WebTransfer::CreateWebSession(); +} +