aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2018-11-20 10:11:55 +0100
committerdec05eba <dec05eba@protonmail.com>2018-11-20 10:11:55 +0100
commitdf15b21559b50dbe8f7b45cb922960ac7eaf3211 (patch)
tree4a0f558fd36e0c4cc1a1905f99ec7ac5d4250663
parente9ac949e65f5ffb54614dd733da27d9dbb879792 (diff)
Add static image
-rw-r--r--include/dchat/Cache.hpp16
-rw-r--r--include/dchat/StaticImage.hpp12
-rw-r--r--src/Cache.cpp25
3 files changed, 36 insertions, 17 deletions
diff --git a/include/dchat/Cache.hpp b/include/dchat/Cache.hpp
index 62df621..4d37b54 100644
--- a/include/dchat/Cache.hpp
+++ b/include/dchat/Cache.hpp
@@ -21,6 +21,7 @@ namespace TinyProcessLib
namespace dchat
{
class Gif;
+ class StaticImage;
class WebPagePreview;
struct ContentByUrlResult
@@ -35,20 +36,20 @@ namespace dchat
enum class CachedType
{
NONE,
- TEXTURE_FILEPATH,
+ STATIC_IMAGE,
GIF,
WEB_PAGE_PREVIEW
};
- ContentByUrlResult() : textureFilePath(nullptr), type(Type::DOWNLOADING), cachedType(CachedType::NONE) {}
- ContentByUrlResult(boost::filesystem::path *_textureFilePath, Type _type) : textureFilePath(_textureFilePath), type(_type), cachedType(CachedType::TEXTURE_FILEPATH) {}
+ ContentByUrlResult() : staticImage(nullptr), type(Type::DOWNLOADING), cachedType(CachedType::NONE) {}
+ ContentByUrlResult(StaticImage *_staticImage, Type _type) : staticImage(_staticImage), type(_type), cachedType(CachedType::STATIC_IMAGE) {}
ContentByUrlResult(Gif *_gif, Type _type) : gif(_gif), type(_type), cachedType(CachedType::GIF) {}
ContentByUrlResult(WebPagePreview *_webPagePreview, Type _type) : webPagePreview(_webPagePreview), type(_type), cachedType(CachedType::WEB_PAGE_PREVIEW) {}
// @texture is null if @type is DOWNLOADING or FAILED_DOWNLOAD
union
{
- boost::filesystem::path *textureFilePath;
+ StaticImage *staticImage;
Gif *gif;
WebPagePreview *webPagePreview;
};
@@ -62,13 +63,15 @@ namespace dchat
// @fileContent contains data allocated with new[], deallocate it with delete[] fileContent.data;
// Returned gif should be allocated with @new
using CreateGifFunc = std::function<Gif*(StringView fileContent)>;
+ using CreateStaticImageFunc = std::function<StaticImage*(const boost::filesystem::path &filepath)>;
class Cache
{
DISABLE_COPY(Cache)
public:
- // @createGifFunc can't be nullptr
- Cache(CreateGifFunc createGifFunc);
+ // @createGifFunc can't be null
+ // @createStaticImageFunc can't be null
+ Cache(CreateGifFunc createGifFunc, CreateStaticImageFunc createStaticImageFunc);
~Cache();
// Creates directory if it doesn't exist (recursively). Throws boost exception on failure
@@ -100,5 +103,6 @@ namespace dchat
bool alive;
std::unordered_map<std::string, ContentByUrlResult> contentUrlCache;
CreateGifFunc createGifFunc;
+ CreateStaticImageFunc createStaticImageFunc;
};
}
diff --git a/include/dchat/StaticImage.hpp b/include/dchat/StaticImage.hpp
new file mode 100644
index 0000000..372f7ce
--- /dev/null
+++ b/include/dchat/StaticImage.hpp
@@ -0,0 +1,12 @@
+#pragma once
+
+#include <boost/filesystem/path.hpp>
+
+namespace dchat
+{
+ class StaticImage
+ {
+ public:
+ virtual ~StaticImage(){}
+ };
+} \ No newline at end of file
diff --git a/src/Cache.cpp b/src/Cache.cpp
index cf9aa8a..84bee97 100644
--- a/src/Cache.cpp
+++ b/src/Cache.cpp
@@ -159,7 +159,7 @@ namespace dchat
return success;
}
- static ContentByUrlResult loadImageFromFile(const boost::filesystem::path &filepath, bool loadFromCache, CreateGifFunc createGifFunc)
+ static ContentByUrlResult loadImageFromFile(const boost::filesystem::path &filepath, bool loadFromCache, CreateGifFunc createGifFunc, CreateStaticImageFunc createStaticImageFunc)
{
StringView fileContent;
try
@@ -186,6 +186,7 @@ namespace dchat
}
else
{
+ /*
if(!loadFromCache)
{
if(!downscaleImage(filepath, (void*)fileContent.data, fileContent.size, 100, 100))
@@ -193,12 +194,12 @@ namespace dchat
fprintf(stderr, "Failed to resize image: %s, using original file\n", filepath.c_str());
}
}
-
+ */
+ StaticImage *image = createStaticImageFunc(filepath);
delete[] fileContent.data;
fileContent.data = nullptr;
- return { new boost::filesystem::path(filepath), ContentByUrlResult::Type::CACHED };
+ return { image, ContentByUrlResult::Type::CACHED };
}
- break;
}
else if(state.step_result == PREVIEW_FOUND_TITLE)
{
@@ -225,14 +226,16 @@ namespace dchat
{
fprintf(stderr, "Failed to load image %s, reason: %s\n", filepath.string().c_str(), e.what());
}
- return { (boost::filesystem::path*)nullptr, ContentByUrlResult::Type::FAILED_DOWNLOAD };
+ return { (StaticImage*)nullptr, ContentByUrlResult::Type::FAILED_DOWNLOAD };
}
- Cache::Cache(CreateGifFunc _createGifFunc) :
+ Cache::Cache(CreateGifFunc _createGifFunc, CreateStaticImageFunc _createStaticImageFunc) :
alive(true),
- createGifFunc(_createGifFunc)
+ createGifFunc(_createGifFunc),
+ createStaticImageFunc(_createStaticImageFunc)
{
assert(createGifFunc);
+ assert(createStaticImageFunc);
downloadWaitThread = thread([this]
{
while(alive)
@@ -250,11 +253,11 @@ namespace dchat
bool failed = exitStatus != 0;
if(failed)
{
- contentByUrlResult = { (boost::filesystem::path*)nullptr, ContentByUrlResult::Type::FAILED_DOWNLOAD };
+ contentByUrlResult = { (StaticImage*)nullptr, ContentByUrlResult::Type::FAILED_DOWNLOAD };
}
else
{
- contentByUrlResult = loadImageFromFile(filepath, false, createGifFunc);
+ contentByUrlResult = loadImageFromFile(filepath, false, createGifFunc, createStaticImageFunc);
contentByUrlResult.lastAccessed = chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now().time_since_epoch()).count();
if(contentByUrlResult.type == ContentByUrlResult::Type::CACHED)
{
@@ -417,7 +420,7 @@ namespace dchat
}
// TODO: Do not load content in this thread. Return LOADING status and load it in another thread, because with a lot of images, chat can freeze
- ContentByUrlResult contentByUrlResult = loadImageFromFile(filepath, true, createGifFunc);
+ ContentByUrlResult contentByUrlResult = loadImageFromFile(filepath, true, createGifFunc, createStaticImageFunc);
if(contentByUrlResult.type == ContentByUrlResult::Type::CACHED)
{
contentByUrlResult.lastAccessed = chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now().time_since_epoch()).count();
@@ -432,7 +435,7 @@ namespace dchat
}
createFileIgnoreError(downloadingFilepath);
- ContentByUrlResult result((boost::filesystem::path*)nullptr, ContentByUrlResult::Type::DOWNLOADING);
+ ContentByUrlResult result((StaticImage*)nullptr, ContentByUrlResult::Type::DOWNLOADING);
contentUrlCache[url] = result;
string downloadLimitBytesStr = to_string(downloadLimitBytes);