}
 
 
-File::Offset File::currentOffset()
-{
-    return File::Offset();
-}
-
 void File::setCurrentOffset(const File::Offset &offset)
 {
 }
     gzflush(m_gzFile, Z_SYNC_FLUSH);
 }
 
+File::Offset ZLibFile::currentOffset()
+{
+    return File::Offset(gztell(m_gzFile));
+}
 
 bool ZLibFile::supportsOffsets() const
 {
 
         Write
     };
     struct Offset {
-        Offset()
-            : chunk(0),
-              offsetInChunk(0)
+        Offset(uint64_t _chunk = 0, uint32_t _offsetInChunk = 0)
+            : chunk(_chunk),
+              offsetInChunk(_offsetInChunk)
         {}
         uint64_t chunk;
         uint32_t offsetInChunk;
     int percentRead();
 
     virtual bool supportsOffsets() const = 0;
-    virtual File::Offset currentOffset();
+    virtual File::Offset currentOffset() = 0;
     virtual void setCurrentOffset(const File::Offset &offset);
 protected:
     virtual bool rawOpen(const std::string &filename, File::Mode mode) = 0;
 
 
     virtual bool supportsOffsets() const;
+    virtual File::Offset currentOffset();
 protected:
     virtual bool rawOpen(const std::string &filename, File::Mode mode);
     virtual bool rawWrite(const void *buffer, size_t length);