diff --git a/src/persistence/smileypack.cpp b/src/persistence/smileypack.cpp index 02b0c238b..d7d0c2edb 100644 --- a/src/persistence/smileypack.cpp +++ b/src/persistence/smileypack.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #if defined(Q_OS_FREEBSD) #include @@ -58,6 +59,8 @@ static const QString RICH_TEXT_PATTERN = QStringLiteral("start(CLEANUP_TIMEOUT); +} + +SmileyPack::~SmileyPack() +{ + delete cleanupTimer; +} + +void SmileyPack::cleanup() +{ + QMutexLocker locker(&loadingMutex); + for (auto it = emoticonToIcon.begin(); it != emoticonToIcon.end();) { + std::shared_ptr& icon = it->second; + if (icon.use_count() == 1) { + it = emoticonToIcon.erase(it); + icon.reset(); + } else { + ++it; + } + } } /** @@ -242,7 +266,7 @@ QString SmileyPack::smileyfied(const QString& msg) QString key = match.captured(); int startPos = match.capturedStart(); int keyLength = key.length(); - if (emoticonToPath.contains(key)) { + if (emoticonToPath.find(key) != emoticonToPath.end()) { QString imgRichText = getAsRichText(key); result.replace(startPos + replaceDiff, keyLength, imgRichText); replaceDiff += imgRichText.length() - keyLength; @@ -269,7 +293,7 @@ QList SmileyPack::getEmoticons() const std::shared_ptr SmileyPack::getAsIcon(const QString& emoticon) { QMutexLocker locker(&loadingMutex); - if (emoticonToIcon.contains(emoticon)) + if (emoticonToIcon.find(emoticon) != emoticonToIcon.end()) return emoticonToIcon[emoticon]; const auto iconPathIt = emoticonToPath.find(emoticon); @@ -279,7 +303,7 @@ std::shared_ptr SmileyPack::getAsIcon(const QString& emoticon) const QString& iconPath = iconPathIt.value(); auto icon = std::make_shared(iconPath); - emoticonToIcon.insert(emoticon, icon); + emoticonToIcon[emoticon] = icon; return icon; } diff --git a/src/persistence/smileypack.h b/src/persistence/smileypack.h index 9591b67a2..f1cf63f4f 100644 --- a/src/persistence/smileypack.h +++ b/src/persistence/smileypack.h @@ -26,6 +26,8 @@ #include +class QTimer; + class SmileyPack : public QObject { Q_OBJECT @@ -41,18 +43,21 @@ public: private slots: void onSmileyPackChanged(); + void cleanup(); private: SmileyPack(); SmileyPack(SmileyPack&) = delete; SmileyPack& operator=(const SmileyPack&) = delete; + ~SmileyPack() override; bool load(const QString& filename); - QMap> emoticonToIcon; + std::map> emoticonToIcon; QHash emoticonToPath; QList emoticons; QString path; + QTimer* cleanupTimer; mutable QMutex loadingMutex; };