aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input/archive/archiveinputdevice.cpp
diff options
context:
space:
mode:
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;
+}