1 #ifndef QFAT_H
2 #define QFAT_H
3 
4 #include <QtCore>
5 
6 #define FAT_FAT_TYPE quint16
7 #define FAT_FAT_TYPE_NOVALUE 0xffff
8 
9 // Big fat: max 512Mb
10 //#define FAT_CLUSTER_COUNT 65535
11 //#define FAT_CLUSTER_SIZE 8192
12 
13 //Small Fat: max 10Mb
14 //#define FAT_CLUSTER_COUNT 5120
15 //#define FAT_CLUSTER_SIZE 2048
16 
17 struct FatHeader
18 {
19     char magic[4]; // "QFAT"
20     quint16 cluster_count;
21     quint16 cluster_size;
22 };
23 
24 #define FLAG_FILE 0x20
25 #define FLAG_FOLDER 0x10
26 
27 enum FatError
28 {
29     FatNoError,
30     FatSysError,
31     FatNotFatFile,
32     FatNotOpen,
33     FatFileNotFound,
34     FatDirNotFound,
35     FatDirNotEmpty,
36     FatDirAlreadyExists,
37     FatOutOfSpace
38 };
39 
40 struct FatTocEntry
41 {
FatTocEntryFatTocEntry42     FatTocEntry() : flags(0) {}
43 
44     quint8 flags;
45     quint32 creationTimestamp;
46     quint32 modificationTimestamp;
47     quint32 size;
48     FAT_FAT_TYPE startCluster;
49     QString name;
50 };
51 
52 typedef QList<FatTocEntry> FatTocEntries;
53 
54 QDataStream &operator<<(QDataStream &ds, const FatTocEntry &toc);
55 QDataStream &operator>>(QDataStream &ds, FatTocEntry &toc);
56 
57 class QFat
58 {
59     friend class QFatEngine;
60 
61 public:
62     QFat(const QString& filename, quint16 clusterCount=5120, quint16 clusterSize=2048);
63 
64     FatError open();
65     void close();
66     FatError checkAndCreate(FAT_FAT_TYPE clusterNum);
67     bool isOpen();
68 
69     FAT_FAT_TYPE findFreeCluster();
70     void eraseData(FAT_FAT_TYPE clusterNum);
71     FAT_FAT_TYPE writeData(const QByteArray &data, FAT_FAT_TYPE cluster=FAT_FAT_TYPE_NOVALUE);
72     QByteArray readData(FAT_FAT_TYPE clusterNum, qint32 maxSize=-1);
73 
74     FatTocEntries readTocData(FAT_FAT_TYPE clusterNum);
75     FAT_FAT_TYPE writeTocData(const FatTocEntries& toc, FAT_FAT_TYPE cluster);
76 
77     FatError setCurrentTocs(const QString& path);
78     FatError getToc(const QString &path, const QString& name, FatTocEntry& toc);
79     FatError getToc(const QString& filename, FatTocEntry& toc);
80     FatError getTocEntries(const QString &repath, FatTocEntries &tocs);
81     FatError addToc(const QString &filename, const FatTocEntry& toc);
82     FatError addToc(const QString &path, const QString& name, const FatTocEntry &toc);
83     FatError deleteToc(const QString &filename);
84     FatError deleteToc(const QString &path, const QString& name);
85 
86     FatError makeDir(const QString& path);
87     FatError makeDirRecursive(const QString &reqpath);
88 
89     FatError removeDir(const QString &reqpath);
90     FatError removeDirRecursive(const QString &reqpath);
91     FatError removeFile(const QString &reqpath);
92 
93     QString status();
94     QString statusToc(const QString& path, int indent);
fileName()95     QString fileName() const { return m_filename; }
96 
97     void writeFat();
98 protected:
99     QString m_filename;
100     QFile* m_fatFile;
101     QDataStream m_ds;
102 
103     quint16 m_clusterCount;
104     quint16 m_clusterSize;
105     QList<FAT_FAT_TYPE> m_fat;
106     quint64 m_startOfData;
107 
108     FatTocEntries m_rootToc;
109     FatTocEntries m_curTocs;
110     QString m_curTocsPath;
111     FAT_FAT_TYPE m_curTocsCluster;
112 };
113 
114 #endif // QFAT_H
115