diff --git a/tools/chatgui/src/avatars/avatarmanager.cpp b/tools/chatgui/src/avatars/avatarmanager.cpp index 11ed43a4..6f6c0801 100644 --- a/tools/chatgui/src/avatars/avatarmanager.cpp +++ b/tools/chatgui/src/avatars/avatarmanager.cpp @@ -49,6 +49,7 @@ void AvatarManager::initialize() { const QString base = m_db->dbPath().isEmpty() ? QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) : m_db->dbPath(); m_directory = base + QStringLiteral("/avatar_cache/") + QString::number(m_db->myNodeId(), 16); m_defaultServer = m_db->getUiState("avatar_default_server").toULongLong(nullptr, 16); + m_defaultConfigured = m_db->getUiStateInt("avatar_default_configured", 0) != 0; const QString file = m_db->getUiState("avatar_default_file"); if (mf_avatar_file_valid(file.toLatin1().constData())) m_defaultHash = file.left(64); const QString directory = m_directory; @@ -164,9 +165,10 @@ void AvatarManager::loadCache(const QString& hash) { } void AvatarManager::saveDefault() { - const char* keys[] = {"avatar_default_server", "avatar_default_file"}; - const QString values[] = {QString::number(m_defaultServer, 16), m_defaultHash.isEmpty() ? QString() : m_defaultHash + ".png"}; - for (int i = 0; i < 2; i++) { + m_defaultConfigured = true; + const char* keys[] = {"avatar_default_server", "avatar_default_file", "avatar_default_configured"}; + const QString values[] = {QString::number(m_defaultServer, 16), m_defaultHash.isEmpty() ? QString() : m_defaultHash + ".png", "1"}; + for (int i = 0; i < 3; i++) { auto* q = (save_ui_state_arg*)u_calloc(1, sizeof(save_ui_state_arg)); if (!q) { DEBUG_ERROR(DEBUG_CATEGORY_MEDIA, "avatar: preference allocation failed"); return; } q->inst = gui_bridge_get_inst(); const QByteArray value = values[i].toLatin1(); @@ -208,7 +210,7 @@ void AvatarManager::cancelUploads() { void AvatarManager::clearDefault() { if (!m_ready || !gui_bridge_is_uasync_ready()) return; ++m_generation; cancelUploads(); m_defaultHash.clear(); m_defaultServer = 0; saveDefault(); - for (const auto& ref : m_refs) if (ref.owner == m_db->myNodeId() && ref.server) { + for (const auto& ref : m_refs) if (ref.owner == m_db->myNodeId()) { Job job; job.ref = ref; job.ref.server = 0; job.ref.hash.clear(); job.upload = true; job.generation = m_generation; enqueue(job); } @@ -216,10 +218,14 @@ void AvatarManager::clearDefault() { } void AvatarManager::scheduleOwn(quint64 group) { + const QString context = key(group, m_db->myNodeId()); + if (m_ready && m_defaultConfigured && !m_defaultServer && m_refs.value(context).server && + m_retry.value(context) <= QDateTime::currentMSecsSinceEpoch()) { + Job job; job.ref = {group, m_db->myNodeId(), 0, {}}; job.upload = true; job.generation = m_generation; enqueue(job); return; + } if (!m_ready || m_preparing || !m_defaultServer || m_defaultHash.isEmpty() || !m_servers.value(group).contains(m_defaultServer) || m_missing.contains(m_defaultHash)) return; if (!m_images.contains(m_defaultHash)) { loadCache(m_defaultHash); return; } - const QString context = key(group, m_db->myNodeId()); if (!m_refs.contains(context) || m_retry.value(context) > QDateTime::currentMSecsSinceEpoch()) return; const Ref old = m_refs.value(context); if (old.server == m_defaultServer && old.hash == m_defaultHash) return; @@ -232,7 +238,7 @@ void AvatarManager::enqueue(const Job& job) { (!job.upload && !old.upload && old.ref.hash == job.ref.hash)) return; for (const auto& old : m_queue) if ((old.ref.group == job.ref.group && old.ref.owner == job.ref.owner) || (!job.upload && !old.upload && old.ref.hash == job.ref.hash)) return; - m_queue.enqueue(job); + if (job.upload) m_queue.prepend(job); else m_queue.enqueue(job); } void AvatarManager::pump() { diff --git a/tools/chatgui/src/avatars/avatarmanager.h b/tools/chatgui/src/avatars/avatarmanager.h index ae4f3ded..bd3111b6 100644 --- a/tools/chatgui/src/avatars/avatarmanager.h +++ b/tools/chatgui/src/avatars/avatarmanager.h @@ -51,7 +51,7 @@ private: DbManager* m_db; QString m_directory, m_defaultHash; quint64 m_defaultServer = 0, m_generation = 1; - bool m_ready = false, m_preparing = false; + bool m_ready = false, m_preparing = false, m_defaultConfigured = false; QHash m_refs; QHash> m_servers; QCache m_images{32 * 1024}; diff --git a/tools/chatgui/tests/test_avatars.cpp b/tools/chatgui/tests/test_avatars.cpp index cbba7ee8..d73717b1 100644 --- a/tools/chatgui/tests/test_avatars.cpp +++ b/tools/chatgui/tests/test_avatars.cpp @@ -104,6 +104,7 @@ private slots: QVERIFY(QFile::exists(directory.path() + "/storage/" + channel.channelId + '/' + QString::number(testInstance->node_id) + "/avatars/" + member.avatar_file)); QVERIFY(!manager.image(channel.channelId, testInstance->node_id).isNull()); + QVERIFY(!manager.image("pm:test", testInstance->node_id).isNull()); cached = directory.path() + "/avatar_cache/" + QString::number(testInstance->node_id, 16) + '/' + member.avatar_file; } chat_core_update_my_name(testInstance, "quote\"\\name"); chat_core_sync_my_addresses(testInstance);