1 //========================================================================
5 // This file is licensed under the GPLv2 or later
7 // Copyright 2009 Stefan Thomas <thomas@eload24.com>
8 // Copyright 2010, 2011 Hib Eris <hib@hiberis.nl>
9 // Copyright 2010 Albert Astals Cid <aacid@kde.org>
11 //========================================================================
15 #include "CurlCachedFile.h"
17 #include "goo/GooString.h"
19 //------------------------------------------------------------------------
21 CurlCachedFileLoader::CurlCachedFileLoader()
28 CurlCachedFileLoader::~CurlCachedFileLoader() {
29 curl_easy_cleanup(curl
);
33 noop_cb(char *ptr
, size_t size
, size_t nmemb
, void *ptr2
)
39 CurlCachedFileLoader::init(GooString
*urlA
, CachedFile
*cachedFileA
)
41 double contentLength
= -1;
46 cachedFile
= cachedFileA
;
47 curl
= curl_easy_init();
49 curl_easy_setopt(curl
, CURLOPT_URL
, url
->getCString());
50 curl_easy_setopt(curl
, CURLOPT_HEADER
, 1);
51 curl_easy_setopt(curl
, CURLOPT_NOBODY
, 1);
52 curl_easy_setopt(curl
, CURLOPT_WRITEFUNCTION
, &noop_cb
);
53 curl_easy_perform(curl
);
54 curl_easy_getinfo(curl
, CURLINFO_RESPONSE_CODE
, &code
);
56 curl_easy_getinfo(curl
, CURLINFO_CONTENT_LENGTH_DOWNLOAD
, &contentLength
);
59 error(errInternal
, -1, "Failed to get size of '{0:t}'.", url
);
62 curl_easy_reset(curl
);
68 size_t load_cb(const char *ptr
, size_t size
, size_t nmemb
, void *data
)
70 CachedFileWriter
*writer
= (CachedFileWriter
*) data
;
71 return (writer
->write
) (ptr
, size
*nmemb
);
74 int CurlCachedFileLoader::load(const std::vector
<ByteRange
> &ranges
, CachedFileWriter
*writer
)
76 CURLcode r
= CURLE_OK
;
77 size_t fromByte
, toByte
;
78 for (size_t i
= 0; i
< ranges
.size(); i
++) {
80 fromByte
= ranges
[i
].offset
;
81 toByte
= fromByte
+ ranges
[i
].length
- 1;
82 GooString
*range
= GooString::format("{0:ud}-{1:ud}", fromByte
, toByte
);
84 curl_easy_setopt(curl
, CURLOPT_URL
, url
->getCString());
85 curl_easy_setopt(curl
, CURLOPT_WRITEFUNCTION
, load_cb
);
86 curl_easy_setopt(curl
, CURLOPT_WRITEDATA
, writer
);
87 curl_easy_setopt(curl
, CURLOPT_RANGE
, range
->getCString());
88 r
= curl_easy_perform(curl
);
89 curl_easy_reset(curl
);
93 if (r
!= CURLE_OK
) break;
98 //------------------------------------------------------------------------