extensions/curl/curlapi.cpp
author Nicholas Hastings <skamonkey@gmail.com>
Wed Aug 14 14:20:57 2013 -0400 (2013-08-14)
changeset 4008 490b01aa0683
parent 3920 e4fa6b583893
permissions -rw-r--r--
Updated some CS:GO gamedata.
dvander@2519
     1
#include "curlapi.h"
dvander@2519
     2
dvander@2519
     3
Webternet g_webternet;
dvander@2519
     4
dvander@2554
     5
WebForm::WebForm() : first(NULL), last(NULL), lastError(CURL_FORMADD_OK)
dvander@2554
     6
{
dvander@2554
     7
}
dvander@2554
     8
dvander@2554
     9
bool WebForm::AddString(const char *name, const char *data)
dvander@2554
    10
{
dvander@2554
    11
	lastError = curl_formadd(&first,
dvander@2554
    12
		&last,
dvander@2554
    13
		CURLFORM_COPYNAME,
dvander@2554
    14
		name,
dvander@2554
    15
		CURLFORM_COPYCONTENTS,
dvander@2554
    16
		data,
dvander@2554
    17
		CURLFORM_END);
dvander@2554
    18
	return lastError == CURL_FORMADD_OK;
dvander@2554
    19
}
dvander@2554
    20
asherkin@3919
    21
bool WebForm::AddFile(const char *name, const char *path)
asherkin@3919
    22
{
asherkin@3919
    23
	lastError = curl_formadd(&first,
asherkin@3919
    24
		&last,
asherkin@3919
    25
		CURLFORM_COPYNAME,
asherkin@3919
    26
		name,
asherkin@3919
    27
		CURLFORM_FILE,
asherkin@3920
    28
		path,
asherkin@3919
    29
		CURLFORM_END);
asherkin@3919
    30
	return lastError == CURL_FORMADD_OK;
asherkin@3919
    31
}
asherkin@3919
    32
dvander@2554
    33
curl_httppost *WebForm::GetFormData()
dvander@2554
    34
{
dvander@2554
    35
	return first;
dvander@2554
    36
}
dvander@2554
    37
dvander@2554
    38
WebForm::~WebForm()
dvander@2554
    39
{
dvander@2554
    40
	curl_formfree(first);
dvander@2554
    41
}
dvander@2554
    42
dvander@2519
    43
WebTransfer *WebTransfer::CreateWebSession()
dvander@2519
    44
{
dvander@2519
    45
	CURL *curl;
dvander@2519
    46
dvander@2519
    47
	curl = curl_easy_init();
dvander@2519
    48
	if (curl == NULL)
dvander@2519
    49
	{
dvander@2519
    50
		return NULL;
dvander@2519
    51
	}
dvander@2519
    52
dvander@2519
    53
	WebTransfer *easy = new WebTransfer(curl);
dvander@2519
    54
	
dvander@2519
    55
	if (curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, easy->errorBuffer))
dvander@2519
    56
	{
dvander@2519
    57
		delete easy;
dvander@2519
    58
		return NULL;
dvander@2519
    59
	}
dvander@2519
    60
	curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1);
dvander@2519
    61
	curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
dvander@2519
    62
dvander@2519
    63
	return easy;
dvander@2519
    64
}
dvander@2519
    65
dvander@2519
    66
WebTransfer::WebTransfer(CURL *_curl)
dvander@2519
    67
{
dvander@2519
    68
	this->curl = _curl;
dvander@2519
    69
}
dvander@2519
    70
dvander@2519
    71
const char *WebTransfer::LastErrorMessage()
dvander@2519
    72
{
dvander@2519
    73
	return errorBuffer;
dvander@2519
    74
}
dvander@2519
    75
dvander@2519
    76
int WebTransfer::LastErrorCode()
dvander@2519
    77
{
dvander@2519
    78
	return lastError;
dvander@2519
    79
}
dvander@2519
    80
dvander@2519
    81
bool WebTransfer::SetHeaderReturn(bool recv_hdr)
dvander@2519
    82
{
dvander@2519
    83
	lastError = curl_easy_setopt(curl, CURLOPT_HEADER, recv_hdr ? 1 : 0);
dvander@2519
    84
	return lastError == 0;
dvander@2519
    85
}
dvander@2519
    86
dvander@2554
    87
bool WebTransfer::SetFailOnHTTPError(bool fail)
dvander@2554
    88
{
dvander@2554
    89
	lastError = curl_easy_setopt(curl, CURLOPT_FAILONERROR, fail ? 1 : 0);
dvander@2554
    90
	return lastError == 0;
dvander@2554
    91
}
dvander@2554
    92
dvander@2519
    93
static size_t curl_write_to_sm(void *ptr, size_t bytes, size_t nmemb, void *stream)
dvander@2519
    94
{
dvander@2519
    95
	void **userdata = (void **)stream;
dvander@2519
    96
	IWebTransfer *session = (IWebTransfer *)userdata[0];
dvander@2519
    97
	ITransferHandler *handler = (ITransferHandler *)userdata[1];
dvander@2519
    98
dvander@2519
    99
	DownloadWriteStatus status;
dvander@2519
   100
	status = handler->OnDownloadWrite(session, userdata[2], ptr, bytes, nmemb);
dvander@2519
   101
	if (status != DownloadWrite_Okay)
dvander@2519
   102
	{
dvander@2519
   103
		/* Return a differing amount */
dvander@2519
   104
		return (bytes == 0 || nmemb == 0) ? 1 : 0;
dvander@2519
   105
	}
dvander@2519
   106
dvander@2519
   107
	return bytes * nmemb;
dvander@2519
   108
}
dvander@2519
   109
dvander@2519
   110
bool WebTransfer::Download(const char *url, ITransferHandler *handler, void *data)
dvander@2519
   111
{
dvander@2519
   112
	lastError = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_write_to_sm);
dvander@2519
   113
	if (lastError)
dvander@2519
   114
	{
dvander@2519
   115
		return false;
dvander@2519
   116
	}
dvander@2519
   117
dvander@2519
   118
	void *userdata[3];
dvander@2519
   119
	userdata[0] = this;
dvander@2519
   120
	userdata[1] = handler;
dvander@2519
   121
	userdata[2] = data;
dvander@2519
   122
	lastError = curl_easy_setopt(curl, CURLOPT_WRITEDATA, userdata);
dvander@2519
   123
	if (lastError)
dvander@2519
   124
	{
dvander@2519
   125
		return false;
dvander@2519
   126
	}
dvander@2519
   127
dvander@2554
   128
	lastError = curl_easy_setopt(curl, CURLOPT_HTTPPOST, NULL);
dvander@2554
   129
	if (lastError)
dvander@2554
   130
	{
dvander@2554
   131
		return false;
dvander@2554
   132
	}
dvander@2554
   133
dvander@2519
   134
	lastError = curl_easy_setopt(curl, CURLOPT_URL, url);
dvander@2519
   135
	if (lastError)
dvander@2519
   136
	{
dvander@2519
   137
		return false;
dvander@2519
   138
	}
dvander@2519
   139
dvander@2519
   140
	lastError = curl_easy_perform(curl);
dvander@2519
   141
	
dvander@2519
   142
	return (lastError == 0);
dvander@2519
   143
}
dvander@2519
   144
dvander@2554
   145
bool WebTransfer::PostAndDownload(const char *url,
dvander@2554
   146
								  IWebForm *form,
dvander@2554
   147
								  ITransferHandler *handler,
dvander@2554
   148
								  void *data)
dvander@2554
   149
{
dvander@2554
   150
	WebForm *realform = (WebForm*)form;
dvander@2554
   151
dvander@2554
   152
	lastError = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_write_to_sm);
dvander@2554
   153
	if (lastError)
dvander@2554
   154
	{
dvander@2554
   155
		return false;
dvander@2554
   156
	}
dvander@2554
   157
dvander@2554
   158
	void *userdata[3];
dvander@2554
   159
	userdata[0] = this;
dvander@2554
   160
	userdata[1] = handler;
dvander@2554
   161
	userdata[2] = data;
dvander@2554
   162
	lastError = curl_easy_setopt(curl, CURLOPT_WRITEDATA, userdata);
dvander@2554
   163
	if (lastError)
dvander@2554
   164
	{
dvander@2554
   165
		return false;
dvander@2554
   166
	}
dvander@2554
   167
dvander@2554
   168
	lastError = curl_easy_setopt(curl, CURLOPT_HTTPPOST, realform->GetFormData());
dvander@2554
   169
	if (lastError)
dvander@2554
   170
	{
dvander@2554
   171
		return false;
dvander@2554
   172
	}
dvander@2554
   173
dvander@2554
   174
	lastError = curl_easy_setopt(curl, CURLOPT_URL, url);
dvander@2554
   175
	if (lastError)
dvander@2554
   176
	{
dvander@2554
   177
		return false;
dvander@2554
   178
	}
dvander@2554
   179
dvander@2554
   180
	lastError = curl_easy_perform(curl);
dvander@2554
   181
dvander@2554
   182
	return (lastError == 0);
dvander@2554
   183
}
dvander@2554
   184
dvander@2519
   185
WebTransfer::~WebTransfer()
dvander@2519
   186
{
dvander@2519
   187
	curl_easy_cleanup(curl);
dvander@2519
   188
}
dvander@2519
   189
dvander@2519
   190
unsigned int Webternet::GetInterfaceVersion()
dvander@2519
   191
{
dvander@2519
   192
	return SMINTERFACE_WEBTERNET_VERSION;
dvander@2519
   193
}
dvander@2519
   194
dvander@2519
   195
const char *Webternet::GetInterfaceName()
dvander@2519
   196
{
dvander@2519
   197
	return SMINTERFACE_WEBTERNET_NAME;
dvander@2519
   198
}
dvander@2519
   199
dvander@2519
   200
IWebTransfer *Webternet::CreateSession()
dvander@2519
   201
{
dvander@2519
   202
	return WebTransfer::CreateWebSession();
dvander@2519
   203
}
dvander@2519
   204
dvander@2554
   205
IWebForm *Webternet::CreateForm()
dvander@2554
   206
{
dvander@2554
   207
	return new WebForm();
dvander@2554
   208
}