Browse Source

Persist the desired avatar reference atomically

master
evgeny 6 days ago
parent
commit
c0a4bc7d89
  1. 30
      tools/chatgui/src/avatars/avatarmanager.cpp

30
tools/chatgui/src/avatars/avatarmanager.cpp

@ -48,10 +48,16 @@ void AvatarManager::initialize() {
if (!m_db || !m_db->isOpen() || !m_db->myNodeId() || m_ready || !m_directory.isEmpty()) return;
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 desired = m_db->getUiState("avatar_default");
m_defaultConfigured = !desired.isEmpty();
if (desired != "-" && !desired.isEmpty()) {
const auto parts = desired.split('/');
if (parts.size() == 2 && mf_avatar_file_valid(parts[1].toLatin1().constData())) {
m_defaultServer = parts[0].toULongLong(nullptr, 16); m_defaultHash = parts[1].left(64);
} else {
DEBUG_WARN(DEBUG_CATEGORY_MEDIA, "avatar: invalid saved default reference"); m_defaultConfigured = false;
}
}
const QString directory = m_directory;
const QStringList pinned = m_defaultHash.isEmpty() ? QStringList() : QStringList{m_defaultHash};
m_pool.start(QRunnable::create([this, directory, pinned] {
@ -166,15 +172,13 @@ void AvatarManager::loadCache(const QString& hash) {
void AvatarManager::saveDefault() {
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();
memcpy(q->data, keys[i], strlen(keys[i]) + 1); memcpy(q->data + strlen(keys[i]) + 1, value.constData(), value.size());
gui_bridge_post_uasync_fn(chat_core_save_ui_state_trampoline, q);
}
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 = m_defaultServer ? (QString::number(m_defaultServer, 16) + '/' + m_defaultHash + ".png").toLatin1() : QByteArray("-");
const char name[] = "avatar_default";
memcpy(q->data, name, sizeof(name)); memcpy(q->data + sizeof(name), value.constData(), value.size());
gui_bridge_post_uasync_fn(chat_core_save_ui_state_trampoline, q);
}
void AvatarManager::uploadDefault(const QString& source, quint64 server) {

Loading…
Cancel
Save