|
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 |
} |