File: filewatcher.h

package info (click to toggle)
copyq 13.0.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 12,964 kB
  • sloc: cpp: 63,306; sh: 992; xml: 452; python: 293; ruby: 152; makefile: 27; javascript: 25
file content (151 lines) | stat: -rw-r--r-- 4,208 bytes parent folder | download
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;
};