#ifndef COMPRESSED_ARCHIVE_H
#define COMPRESSED_ARCHIVE_H

#include <QObject>

class ExtractDelegate;

class QLibrary;
#include <QString>
#include <QList>
#include <QMap>

struct SevenZipInterface;

class MyCodecs;

class CompressedArchive : public QObject
{
    Q_OBJECT
public:
    explicit CompressedArchive(const QString &filePath, QObject *parent = 0);
    ~CompressedArchive();

signals:

public slots:
    int getNumFiles();
    int getNumEntries();
    QList<QByteArray> getAllData(const QVector<quint32> &indexes, ExtractDelegate *delegate = 0);
    QByteArray getRawDataAtIndex(int index);
    QList<QString> getFileNames();
    bool isValid();
    bool toolsLoaded();

private:
    SevenZipInterface *szInterface;

    QLibrary *sevenzLib;
    bool loadFunctions();
    bool tools;
    bool valid;
    QList<QString> files;
    QList<qint32> offsets;
    QMap<qint32, qint32> indexesToPages;

    void setupFilesNames();
    QVector<quint32> translateIndexes(const QVector<quint32> &indexes);

    friend class MyCodecs;
};

#endif // COMPRESSED_ARCHIVE_H