diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2016-09-17 18:57:40 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2016-09-17 18:57:40 +0000 |
| commit | 477788d7dd83ecac5485f3d7c927229a9885ec27 (patch) | |
| tree | 583f16900e2c1afa6fd60f9212c7a97e980721a0 /src/plugins/Input/archive/archiveinputdevice.cpp | |
| parent | b7b22bfdf2fbc820f0d07a74c4bc0929fe990848 (diff) | |
| download | qmmp-477788d7dd83ecac5485f3d7c927229a9885ec27.tar.gz qmmp-477788d7dd83ecac5485f3d7c927229a9885ec27.tar.bz2 qmmp-477788d7dd83ecac5485f3d7c927229a9885ec27.zip | |
archive plugin: added metadata model
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@6731 90c681e8-e032-0410-971d-27865f9a5e38
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) |
