aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input/archive/archiveinputdevice.cpp
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2016-09-17 18:57:40 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2016-09-17 18:57:40 +0000
commit477788d7dd83ecac5485f3d7c927229a9885ec27 (patch)
tree583f16900e2c1afa6fd60f9212c7a97e980721a0 /src/plugins/Input/archive/archiveinputdevice.cpp
parentb7b22bfdf2fbc820f0d07a74c4bc0929fe990848 (diff)
downloadqmmp-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.cpp51
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)