diff options
Diffstat (limited to 'src/plugins/Input/archive/archiveinputdevice.cpp')
| -rw-r--r-- | src/plugins/Input/archive/archiveinputdevice.cpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/plugins/Input/archive/archiveinputdevice.cpp b/src/plugins/Input/archive/archiveinputdevice.cpp index d03a60a3d..795766ada 100644 --- a/src/plugins/Input/archive/archiveinputdevice.cpp +++ b/src/plugins/Input/archive/archiveinputdevice.cpp @@ -17,14 +17,65 @@ * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ + +#include <QRegExp> #include "archiveinputdevice.h" +ArchiveInputDevice::ArchiveInputDevice(const QString &url, QObject *parent) : QIODevice(parent) +{ + m_archive = 0; + m_entry = 0; + QString filePath = url.section("#", -1); + QString archivePath = url; + archivePath.remove(QRegExp("^.+://")); + archivePath.remove(QRegExp("#.+$")); + + m_archive = archive_read_new(); + archive_read_support_filter_all(m_archive); + archive_read_support_format_all(m_archive); + + int r = archive_read_open_filename(m_archive, archivePath.toLocal8Bit().constData(), 10240); + if (r != ARCHIVE_OK) + { + qWarning("ArchiveInputDevice: unable to open file '%s', libarchive error: %s", + qPrintable(archivePath), archive_error_string(m_archive)); + return; + } + + while (archive_read_next_header(m_archive, &m_entry) == ARCHIVE_OK) + { + QString pathName = QString::fromLocal8Bit(archive_entry_pathname(m_entry)); + if(!pathName.startsWith("/")) + pathName.prepend("/"); + + if(archive_entry_filetype(m_entry) == AE_IFREG && filePath == pathName) + { + open(QIODevice::ReadOnly); + m_buffer.open(QBuffer::ReadWrite); + break; + } + archive_read_data_skip(m_archive); + } + m_close_libarchive = true; +} + ArchiveInputDevice::ArchiveInputDevice(archive *a, archive_entry *e, QObject *parent) : QIODevice(parent) { m_archive = a; m_entry = e; open(QIODevice::ReadOnly); m_buffer.open(QBuffer::ReadWrite); + m_close_libarchive = false; +} + +ArchiveInputDevice::~ArchiveInputDevice() +{ + if(m_close_libarchive && m_archive) + { + archive_read_close(m_archive); + archive_read_free(m_archive); + m_archive = 0; + } } bool ArchiveInputDevice::seek(qint64 pos) |
