Continue the work with URLLoader and cURL

- Fixed PUT and POST
- Fixes CURLOPT_READFUNCTION
- Added CURLOPT_PROGRESSFUNCTION
This commit is contained in:
MrCdK
2014-08-26 07:46:43 +02:00
parent 0fef12abba
commit bdf8d1f2f1
2 changed files with 96 additions and 26 deletions

View File

@@ -1,5 +1,6 @@
#include <curl/curl.h>
#include <hx/CFFI.h>
#include <string.h>
namespace lime {
@@ -157,7 +158,7 @@ namespace lime {
}
static size_t rw_callback (void *ptr, size_t size, size_t nmemb, void *userp) {
static size_t write_callback (void *ptr, size_t size, size_t nmemb, void *userp) {
AutoGCRoot* callback = (AutoGCRoot*)userp;
@@ -171,6 +172,37 @@ namespace lime {
return val_int (val_call3 (callback->get (), str, alloc_int (size), alloc_int (nmemb)));
}
static size_t read_callback (void *buffer, size_t size, size_t nmemb, void *userp) {
AutoGCRoot* callback = (AutoGCRoot*)userp;
size_t bytes = size * nmemb;
const char *input = val_string (val_call1 (callback->get (), alloc_int (bytes)));
size_t length = strlen(input);
if(length <= bytes) bytes = length;
memcpy(buffer, input, bytes);
return bytes;
}
static size_t progress_callback (void *userp, double dltotal, double dlnow, double ultotal, double ulnow) {
AutoGCRoot* callback = (AutoGCRoot*)userp;
value vals[] = {
alloc_float(dltotal),
alloc_float(dlnow),
alloc_float(ultotal),
alloc_float(ulnow),
};
return val_int (val_callN (callback->get (), vals, 4));
}
value lime_curl_easy_setopt (value handle, value option, value parameter) {
@@ -366,12 +398,8 @@ namespace lime {
case CURLOPT_OPENSOCKETDATA:
case CURLOPT_CLOSESOCKETFUNCTION:
case CURLOPT_CLOSESOCKETDATA:
case CURLOPT_PROGRESSFUNCTION:
case CURLOPT_PROGRESSDATA:
case CURLOPT_XFERINFOFUNCTION:
//case CURLOPT_XFERINFODATA:
case CURLOPT_HEADERFUNCTION:
case CURLOPT_HEADERDATA:
case CURLOPT_DEBUGFUNCTION:
case CURLOPT_DEBUGDATA:
case CURLOPT_SSL_CTX_FUNCTION:
@@ -406,13 +434,36 @@ namespace lime {
//case CURLOPT_READDATA:
//case CURLOPT_WRITEDATA:
//case CURLOPT_HEADERDATA:
//case CURLOPT_PROGRESSDATA:
case CURLOPT_READFUNCTION:
{
AutoGCRoot* callback = new AutoGCRoot (parameter);
code = curl_easy_setopt (curl, type, read_callback);
curl_easy_setopt (curl, CURLOPT_READDATA, callback);
break;
}
case CURLOPT_WRITEFUNCTION:
{
AutoGCRoot* callback = new AutoGCRoot (parameter);
code = curl_easy_setopt (curl, type, rw_callback);
curl_easy_setopt (curl, type == CURLOPT_READFUNCTION ? CURLOPT_READDATA : CURLOPT_WRITEDATA, callback);
code = curl_easy_setopt (curl, type, write_callback);
curl_easy_setopt (curl, CURLOPT_WRITEDATA, callback);
break;
}
case CURLOPT_HEADERFUNCTION:
{
AutoGCRoot* callback = new AutoGCRoot (parameter);
code = curl_easy_setopt (curl, type, write_callback);
curl_easy_setopt (curl, CURLOPT_HEADERDATA, callback);
break;
}
case CURLOPT_PROGRESSFUNCTION:
{
AutoGCRoot* callback = new AutoGCRoot (parameter);
code = curl_easy_setopt (curl, type, progress_callback);
curl_easy_setopt (curl, CURLOPT_PROGRESSDATA, callback);
curl_easy_setopt (curl, CURLOPT_NOPROGRESS, false);
break;
}