|
|
|
|
@ -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) { |
|
|
|
|
|