summaryrefslogtreecommitdiffstats
path: root/heimdall-frontend/source/GZipFile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'heimdall-frontend/source/GZipFile.cpp')
-rw-r--r--heimdall-frontend/source/GZipFile.cpp51
1 files changed, 51 insertions, 0 deletions
diff --git a/heimdall-frontend/source/GZipFile.cpp b/heimdall-frontend/source/GZipFile.cpp
new file mode 100644
index 0000000..af75f39
--- /dev/null
+++ b/heimdall-frontend/source/GZipFile.cpp
@@ -0,0 +1,51 @@
+#import "GZipFile.h"
+
+using namespace HeimdallFrontend;
+
+GZipFile::GZipFile(const QString& path) :
+ file(path),
+ gzFile(nullptr)
+{
+}
+
+GZipFile::~GZipFile()
+{
+ Close();
+
+ if (temporary)
+ {
+ file.remove();
+ }
+}
+
+bool GZipFile::Open(Mode mode)
+{
+ if (!file.isOpen() && !file.open(mode == GZipFile::ReadOnly ? QFile::ReadOnly : QFile::WriteOnly))
+ {
+ return (false);
+ }
+
+ gzFile = gzdopen(file.handle(), mode == GZipFile::ReadOnly ? "rb" : "wb");
+ return (gzFile != nullptr);
+}
+
+void GZipFile::Close()
+{
+ file.close();
+ gzclose(gzFile);
+}
+
+int GZipFile::Read(void *buffer, int length)
+{
+ return (length >= 0 && !file.isWritable() ? gzread(gzFile, buffer, length) : -1);
+}
+
+bool GZipFile::Write(void *buffer, int length)
+{
+ return (length >= 0 && gzwrite(gzFile, buffer, length) == length);
+}
+
+qint64 GZipFile::Offset() const
+{
+ return gzoffset(gzFile);
+}