aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input/archive/archiveinputdevice.cpp
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2016-09-16 08:13:14 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2016-09-16 08:13:14 +0000
commit2d0439faf537a922c88f8b3436b2d91eb9f70503 (patch)
tree6aeddb430e4dc4ec5d89089e61fea583d903119d /src/plugins/Input/archive/archiveinputdevice.cpp
parent4b06a19515626c220cef3c4e48db67069303a241 (diff)
downloadqmmp-2d0439faf537a922c88f8b3436b2d91eb9f70503.tar.gz
qmmp-2d0439faf537a922c88f8b3436b2d91eb9f70503.tar.bz2
qmmp-2d0439faf537a922c88f8b3436b2d91eb9f70503.zip
added archive reader (first test implementation)
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@6727 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Input/archive/archiveinputdevice.cpp')
-rw-r--r--src/plugins/Input/archive/archiveinputdevice.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/plugins/Input/archive/archiveinputdevice.cpp b/src/plugins/Input/archive/archiveinputdevice.cpp
new file mode 100644
index 000000000..d9017ccda
--- /dev/null
+++ b/src/plugins/Input/archive/archiveinputdevice.cpp
@@ -0,0 +1,52 @@
+#include "archiveinputdevice.h"
+
+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);
+}
+
+bool ArchiveInputDevice::seek(qint64 pos)
+{
+ QIODevice::seek(pos);
+
+ if(pos > m_buffer.size())
+ {
+ char tmp[1024];
+ qint64 delta = pos - m_buffer.size();
+ while (delta > 0)
+ {
+ qint64 r = qMin(qint64(sizeof(tmp)), delta);
+ r = archive_read_data(m_archive, tmp, r);
+ m_buffer.buffer().append(tmp, r);
+ delta -= r;
+ }
+
+ }
+
+ m_buffer.seek(pos);
+ return true;
+}
+
+qint64 ArchiveInputDevice::size() const
+{
+ return archive_entry_size(m_entry);
+}
+
+qint64 ArchiveInputDevice::readData(char *data, qint64 maxSize)
+{
+ if(m_buffer.atEnd())
+ {
+ char tmp[maxSize];
+ int r = archive_read_data(m_archive, tmp, maxSize);
+ m_buffer.buffer().append(tmp, r);
+ }
+ return m_buffer.read(data, maxSize);
+}
+
+qint64 ArchiveInputDevice::writeData(const char *, qint64)
+{
+ return -1;
+}