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