diff options
Diffstat (limited to 'imagestore.cpp')
-rw-r--r-- | imagestore.cpp | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/imagestore.cpp b/imagestore.cpp new file mode 100644 index 0000000..09bef92 --- /dev/null +++ b/imagestore.cpp | |||
@@ -0,0 +1,52 @@ | |||
1 | #include "imagestore.h" | ||
2 | |||
3 | #include <curlcpp/curl_easy.h> | ||
4 | |||
5 | #include <fstream> | ||
6 | #include <sstream> | ||
7 | |||
8 | Magick::Image imagestore::get(std::string key, std::string url) const { | ||
9 | std::string filename = path_ + "/" + key; | ||
10 | |||
11 | Magick::Image pic; | ||
12 | |||
13 | if (std::ifstream(filename)) { | ||
14 | pic.read(filename); | ||
15 | } else { | ||
16 | std::ostringstream imgbuf; | ||
17 | curl::curl_ios<std::ostringstream> imgios(imgbuf); | ||
18 | curl::curl_easy imghandle(imgios); | ||
19 | |||
20 | imghandle.add<CURLOPT_URL>(url.c_str()); | ||
21 | imghandle.add<CURLOPT_CONNECTTIMEOUT>(30); | ||
22 | imghandle.add<CURLOPT_TIMEOUT>(300); | ||
23 | |||
24 | imghandle.perform(); | ||
25 | |||
26 | if (imghandle.get_info<CURLINFO_RESPONSE_CODE>().get() != 200) { | ||
27 | throw std::runtime_error("Could not download image"); | ||
28 | } | ||
29 | |||
30 | std::string content_type = | ||
31 | imghandle.get_info<CURLINFO_CONTENT_TYPE>().get(); | ||
32 | if (content_type.substr(0, 6) != "image/") { | ||
33 | throw std::runtime_error("Could not download image"); | ||
34 | } | ||
35 | |||
36 | std::string imgstr = imgbuf.str(); | ||
37 | Magick::Blob img(imgstr.c_str(), imgstr.length()); | ||
38 | |||
39 | try { | ||
40 | pic.read(img); | ||
41 | } catch (const Magick::ErrorOption& e) { | ||
42 | // Occurs when the the data downloaded from the server is malformed | ||
43 | std::cout << "Magick: " << e.what() << std::endl; | ||
44 | |||
45 | throw std::runtime_error("Could not download image"); | ||
46 | } | ||
47 | |||
48 | pic.write(filename); | ||
49 | } | ||
50 | |||
51 | return pic; | ||
52 | } | ||