89 lines
3.4 KiB
C++
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;
|
|
};
|