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