1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include "common/mimetypes.h"
#include <QDir>
#include <QLockFile>
#include <QObject>
#include <QPersistentModelIndex>
#include <QSet>
#include <QStringList>
#include <QTimer>
#include <QVector>
class QAbstractItemModel;
struct Ext;
struct BaseNameExtensions;
#define COPYQ_MIME_PREFIX_ITEMSYNC COPYQ_MIME_PREFIX "itemsync-"
#define COPYQ_MIME_PREFIX_ITEMSYNC_PRIVATE COPYQ_MIME_PRIVATE_PREFIX "itemsync-"
extern const QLatin1String mimeExtensionMap;
extern const QLatin1String mimeBaseName;
extern const QLatin1String mimeNoSave;
extern const QLatin1String mimeSyncPath;
extern const QLatin1String mimeNoFormat;
extern const QLatin1String mimeUnknownFormats;
extern const QLatin1String mimePrivateSyncPrefix;
extern const QLatin1String mimeOldBaseName;
extern const QLatin1String mimeHashPrefix;
enum class UpdateType {
Inserted,
Changed,
};
struct FileFormat {
bool isValid() const { return !extensions.isEmpty(); }
QStringList extensions;
QString itemMime;
QString icon;
};
using BaseNameExtensionsList = QList<BaseNameExtensions>;
using Hash = QByteArray;
class SyncDataFile;
QDataStream &operator<<(QDataStream &out, SyncDataFile value);
QDataStream &operator>>(QDataStream &in, SyncDataFile &value);
void registerSyncDataFileConverter();
class FileWatcher final : public QObject {
public:
static QString getBaseName(const QModelIndex &index);
static QString getBaseName(const QVariantMap &data);
/**
* Return true only if base name is empty or it matches the internal format.
*/
static bool isOwnBaseName(const QString &baseName);
static void removeFilesForRemovedIndex(const QString &tabPath, const QModelIndex &index);
static Hash calculateHash(const QByteArray &bytes);
FileWatcher(
const QString &path,
const QStringList &paths,
QAbstractItemModel *model,
int maxItems,
const QList<FileFormat> &formatSettings,
int itemDataThreshold,
QObject *parent = nullptr
);
QString path() const { return m_dir.absolutePath(); }
bool isValid() const { return m_valid; }
bool lock();
void unlock();
QVariantMap itemDataFromFiles(const QDir &dir, const BaseNameExtensions &baseNameWithExts);
void prependItemsFromFiles(const QDir &dir, const BaseNameExtensionsList &fileList);
void insertItemsFromFiles(const QDir &dir, const BaseNameExtensionsList &fileList);
/**
* Check for new files.
*/
void updateItems();
void updateItemsIfNeeded();
void setUpdatesEnabled(bool enabled);
private:
void onRowsInserted(const QModelIndex &, int first, int last);
void onDataChanged(const QModelIndex &a, const QModelIndex &b);
void onRowsRemoved(const QModelIndex &, int first, int last);
void onRowsMoved(const QModelIndex &, int start, int end, const QModelIndex &, int destinationRow);
QString oldBaseName(const QModelIndex &index) const;
void createItems(const QVector<QVariantMap> &dataMaps, int targetRow);
void updateIndexData(const QModelIndex &index, QVariantMap *itemData);
QList<QPersistentModelIndex> indexList(int first, int last);
void saveItems(int first, int last, UpdateType updateType);
bool renameMoveCopy(
const QDir &dir, const QList<QPersistentModelIndex> &indexList, UpdateType updateType);
void updateDataAndWatchFile(
const QDir &dir, const BaseNameExtensions &baseNameWithExts,
QVariantMap *dataMap, QVariantMap *mimeToExtension);
bool copyFilesFromUriList(const QByteArray &uriData, int targetRow, const QSet<QString> &baseNames);
void updateMovedRows();
QAbstractItemModel *m_model;
QTimer m_updateTimer;
QTimer m_moveTimer;
int m_moveEnd = -1;
int m_interval = 0;
const QList<FileFormat> &m_formatSettings;
QDir m_dir;
bool m_valid;
int m_maxItems;
bool m_updatesEnabled = false;
qint64 m_lastUpdateTimeMs = 0;
QList<QPersistentModelIndex> m_batchIndexData;
BaseNameExtensionsList m_fileList;
int m_lastBatchIndex = -1;
int m_itemDataThreshold = -1;
QLockFile m_lock;
};
|