Files
utun2/tools/chatgui/src/avatars/avatarmanager.h
T

89 lines
3.4 KiB
C++

/* Один менеджер на аккаунт: подписанные ссылки, общий кеш и ограниченная очередь передач. */
#pragma once
#include "avatarcache.h"
#include <QObject>
#include <QCache>
#include <QHash>
#include <QMap>
#include <QQueue>
#include <QSet>
#include <QThreadPool>
#include <QTimer>
class DbManager;
class AvatarManager : public QObject {
Q_OBJECT
public:
explicit AvatarManager(DbManager* db, QObject* parent = nullptr);
~AvatarManager() override;
static AvatarManager* instance();
void initialize();
void refreshMembers();
void onMembers(const QString& channel, int count, const uint8_t* data, int length, bool full = true);
void removeMember(const QString& channel, quint64 owner);
void onResponse(const uint8_t* data, int length);
void onTransfer(const uint8_t* data, int length);
void onPublished(const uint8_t* data, int length);
QImage image(const QString& channel, quint64 owner);
QMap<quint64, QString> servers() const;
void uploadDefault(const QString& source, quint64 server, const QRectF& crop = {});
void openGallery(const QString& channel, quint64 owner);
void closeGallery();
void retryGallery();
QStringList gallery() const { return m_gallery; }
QString galleryCurrent() const { return m_galleryRef.hash; }
QImage galleryImage(const QString& hash, bool original = false);
void clearDefault();
QImage defaultImage() const;
quint64 defaultServer() const { return m_defaultServer; }
bool ready() const { return m_ready; }
signals:
void changed(const QString& channel, quint64 owner);
void serversChanged();
void statusChanged(const QString& status);
void galleryChanged();
void galleryError(const QString& error);
private:
struct Ref { quint64 group = 0, owner = 0, server = 0; QString hash; };
struct Job {
Ref ref; quint64 id = 0, generation = 0; bool upload = false, original = false, gallery = false;
int stage = 0, object = 0; QString local, file; QStringList files;
};
static QString key(quint64 group, quint64 owner);
void loadCache(const QString& hash, bool original = false);
QImage fetch(const Ref& ref, bool original, bool gallery);
void nextUpload(Job& job);
void listGallery(quint64 cursor = 0, const QByteArray& version = {});
void notify(const QString& hash);
void scheduleOwn(quint64 group);
void enqueue(const Job& job);
void pump();
bool post(Job& job, int command);
void transfer(Job& job);
void publish(Job& job);
void finish(quint64 id, int status);
void saveDefault();
void cancelUploads();
DbManager* m_db;
QString m_directory, m_defaultHash;
quint64 m_defaultServer = 0, m_generation = 1;
bool m_ready = false, m_preparing = false, m_defaultConfigured = false;
QHash<QString, Ref> m_refs;
QHash<quint64, QMap<quint64, QString>> m_servers;
QCache<QString, QImage> m_images{32 * 1024};
QSet<QString> m_loading, m_missing, m_wanted;
QHash<QString, qint64> m_retry;
QHash<QString, unsigned> m_failures;
QQueue<Job> m_queue;
QHash<quint64, Job> m_jobs;
QHash<QString, AvatarCache::Record> m_records;
Ref m_galleryRef;
QStringList m_gallery;
QMap<QString, quint64> m_catalog;
quint64 m_listId = 0;
quint64 m_galleryEpoch = 0, m_listCursor = 0;
unsigned m_listRetries = 0;
QThreadPool m_pool;
QTimer m_timer;
};