0
- shoes_download_handler handler;
0
-} shoes_curl_progress_data;
0
-} shoes_curl_write_data;
0
+ shoes_download_handler handler;
0
+const char *content_len_str = "Content-Length: ";
0
+shoes_curl_header_funk(void *ptr, size_t size, size_t nmemb, shoes_curl_data *data)
0
+ size_t realsize = size * nmemb;
0
+ if (strncmp(ptr, content_len_str, strlen(content_len_str)) == 0)
0
+ data->total = strtoll(ptr + strlen(content_len_str), NULL, 10);
0
+ HTTP_EVENT(data->handler, SHOES_HTTP_CONNECTED, 0, 0, data->total, data->data, return -1);
0
-shoes_curl_write_funk(void *ptr, size_t size, size_t nmemb, shoes_curl_
write_data *data)
0
+shoes_curl_write_funk(void *ptr, size_t size, size_t nmemb, shoes_curl_
data *data)
0
size_t realsize = size * nmemb;
0
@@ -39,17 +51,11 @@ shoes_curl_write_funk(void *ptr, size_t size, size_t nmemb, shoes_curl_write_dat
0
-shoes_curl_progress_funk(shoes_curl_
progress_data *data,
0
+shoes_curl_progress_funk(shoes_curl_
data *data,
0
double dltotal, double dlnow, double ultotal, double ulnow)
0
- shoes_download_event event;
0
- event.percent = dlnow * 100.0 / dltotal;
0
- event.transferred = dlnow;
0
- event.total = dltotal;
0
- if (data->handler != NULL && (data->handler(&event, data->data) & SHOES_DOWNLOAD_HALT))
0
+ HTTP_EVENT(data->handler, SHOES_HTTP_TRANSFER, dlnow * 100.0 / dltotal, dlnow,
0
+ dltotal, data->data, return 1);
0
@@ -60,40 +66,44 @@ shoes_download(char *host, int port, char *path, char *mem, char *filepath,
0
char url[SHOES_BUFSIZE], uagent[SHOES_BUFSIZE];
0
CURL *curl = curl_easy_init();
0
- shoes_curl_progress_data progress_data;
0
- shoes_curl_write_data write_data;
0
+ shoes_curl_data cdata;
0
if (curl == NULL) return;
0
sprintf(url, "http://%s:%d/%s", host, port, path);
0
sprintf(uagent, "Shoes/0.r%d (%s) %s/%d", SHOES_REVISION, SHOES_PLATFORM,
0
SHOES_RELEASE_NAME, SHOES_BUILD_DATE);
0
- progress_data.handler = handler;
0
- progress_data.data = data;
0
+ cdata.handler = handler;
0
- write_data.fp = fopen(filepath, "wb");
0
- if (write_data.fp == NULL) return;
0
+ cdata.fp = fopen(filepath, "wb");
0
+ if (cdata.fp == NULL) return;
0
curl_easy_setopt(curl, CURLOPT_URL, url);
0
+ curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, shoes_curl_header_funk);
0
+ curl_easy_setopt(curl, CURLOPT_WRITEHEADER, &cdata);
0
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, shoes_curl_write_funk);
0
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, &
write_data);
0
+ curl_easy_setopt(curl, CURLOPT_WRITEDATA, &
cdata);
0
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
0
curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, shoes_curl_progress_funk);
0
- curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, &
progress_data);
0
+ curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, &
cdata);
0
curl_easy_setopt(curl, CURLOPT_USERAGENT, uagent);
0
res = curl_easy_perform(curl);
0
- *size = write_data.size;
0
+ HTTP_EVENT(handler, SHOES_HTTP_TRANSFER, 100, cdata.total, cdata.total, data, 1);
0
+ HTTP_EVENT(handler, SHOES_HTTP_COMPLETED, 100, cdata.total, cdata.total, data, 1);
0
- if (write_data.fp != NULL)
0
- fclose(write_data.fp);
0
curl_easy_cleanup(curl);
Comments
No one has commented yet.