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