1 #ifndef ARCHIVEFILE_H 2 #define ARCHIVEFILE_H 3 4 #include <QObject> 5 #include <QString> 6 #include <QList> 7 #include <QHash> 8 #include <QStringList> 9 #include <QDateTime> 10 #include <QByteArray> 11 #include <QIODevice> 12 13 #include <archive.h> 14 #include <archive_entry.h> 15 16 #include "bigbytearray.h" 17 #include "macros.h" 18 19 class ArchiveEntryMetaData 20 { 21 public: 22 explicit ArchiveEntryMetaData(QString name = QString(), quint64 size = 0, QDateTime date = QDateTime()) 23 { 24 setName(name); 25 setSize(size); 26 setDate(date); 27 } 28 setName(QString name)29 void setName(QString name) { m_name = name; } name()30 QString &name() { return m_name; } setSize(quint64 size)31 void setSize(quint64 size) { m_size = size; } size()32 quint64 size() { return m_size; } setDate(QDateTime date)33 void setDate(QDateTime date) { m_date = date; } date()34 QDateTime &date() { return m_date; } 35 36 private: 37 QString m_name; 38 quint64 m_size; 39 QDateTime m_date; 40 }; 41 42 class ArchiveFile : public QObject 43 { 44 Q_OBJECT 45 46 public: 47 explicit ArchiveFile(QString fileName = QString(), bool sequential = false, bool deflate = true, QObject *parent = 0); 48 ~ArchiveFile(); 49 fileName()50 QString fileName() { return m_fileName; } entryList()51 QList<ArchiveEntryMetaData> &entryList() { return m_entryList; } isOpen()52 bool isOpen() { return m_archive != 0; } 53 bool open(QIODevice::OpenMode openMode = QIODevice::ReadOnly, QString fileName = QString()); 54 void reopen(); 55 void close(); readMode()56 bool readMode() { return m_openMode == QIODevice::ReadOnly; } writeMode()57 bool writeMode() { return m_openMode == QIODevice::WriteOnly; } 58 bool seekNextEntry(ArchiveEntryMetaData *metaData, bool *reset = 0); 59 bool seekEntry(uint index); seekEntry(const QString & name)60 bool seekEntry(const QString &name) { int index = indexOfName(name); return index >= 0 ? seekEntry(index) : false; } hasError()61 bool hasError() { return errorCode() == ARCHIVE_FATAL; } hasWarning()62 bool hasWarning() { return errorCode() == ARCHIVE_WARN; } 63 qint64 readEntry(QByteArray &buffer); 64 bool createEntry(QString name, size_t size); writeEntryData(const QByteArray & buffer)65 qint64 writeEntryData(const QByteArray &buffer) { return archive_write_data(m_archive, buffer.constData(), buffer.size()); } 66 qint64 writeEntryDataBig(const BigByteArray &buffer); 67 void closeEntry(); errorString()68 QString errorString() { return isOpen() ? QString(archive_error_string(m_archive)) : QString(); } errorCode()69 int errorCode() { return isOpen() ? archive_errno(m_archive) : ARCHIVE_OK; } 70 void createEntryList(); 71 72 private: indexOfName(const QString & name)73 int indexOfName(const QString &name) { return m_nameToIndexCache.contains(name) ? m_nameToIndexCache.value(name) : -1; } 74 75 struct archive *m_archive; 76 struct archive_entry *m_entry; 77 QList<ArchiveEntryMetaData> m_entryList; 78 QHash<QString, int> m_nameToIndexCache; 79 QString m_fileName; 80 bool m_sequential; 81 bool m_deflate; 82 QIODevice::OpenMode m_openMode; 83 }; 84 85 #endif 86