]>
git.saurik.com Git - wxWidgets.git/blob - src/common/zipstrm.cpp
   1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     input stream for ZIP archive access 
   4 // Author:      Vaclav Slavik 
   5 // Copyright:   (c) 1999 Vaclav Slavik 
   6 // Licence:     wxWindows Licence 
   7 ///////////////////////////////////////////////////////////////////////////// 
  10 #pragma implementation "zipstrm.h" 
  13 // For compilers that support precompilation, includes "wx.h". 
  14 #include "wx/wxprec.h" 
  20 #if wxUSE_STREAMS && wxUSE_ZIPSTREAM && wxUSE_ZLIB 
  24 #include "wx/stream.h" 
  25 #include "wx/wfstream.h" 
  26 #include "wx/zipstrm.h" 
  28 /* Not the right solution (paths in makefiles) but... */ 
  30 #include "../common/unzip.h" 
  36 wxZipInputStream::wxZipInputStream(const wxString
& archive
, const wxString
& file
) : wxInputStream() 
  42     m_Archive 
= (void*) unzOpen(archive
.fn_str()); 
  43     if (m_Archive 
== NULL
) 
  45         m_lasterror 
= wxStream_READ_ERR
; 
  48     if (unzLocateFile((unzFile
)m_Archive
, file
.fn_str(), 0) != UNZ_OK
) 
  50         m_lasterror 
= wxStream_READ_ERR
; 
  54     unzGetCurrentFileInfo((unzFile
)m_Archive
, &zinfo
, (char*) NULL
, 0, (void*) NULL
, 0, (char*) NULL
, 0); 
  56     if (unzOpenCurrentFile((unzFile
)m_Archive
) != UNZ_OK
) 
  58         m_lasterror 
= wxStream_READ_ERR
; 
  61     m_Size 
= zinfo
.uncompressed_size
; 
  66 wxZipInputStream::~wxZipInputStream() 
  71             unzCloseCurrentFile((unzFile
)m_Archive
); 
  72         unzClose((unzFile
)m_Archive
); 
  78 size_t wxZipInputStream::OnSysRead(void *buffer
, size_t bufsize
) 
  80     if (m_Pos 
+ bufsize 
> m_Size
) bufsize 
= m_Size 
- m_Pos
; 
  81     unzReadCurrentFile((unzFile
)m_Archive
, buffer
, bufsize
); 
  88 off_t 
wxZipInputStream::OnSysSeek(off_t seek
, wxSeekMode mode
) 
  95         case wxFromCurrent 
: nextpos 
= seek 
+ m_Pos
; break; 
  96         case wxFromStart 
: nextpos 
= seek
; break; 
  97         case wxFromEnd 
: nextpos 
= m_Size 
- 1 + seek
; break; 
  98         default : nextpos 
= m_Pos
; break; /* just to fool compiler, never happens */ 
 104         buf 
= malloc(nextpos 
- m_Pos
); 
 105         unzReadCurrentFile((unzFile
)m_Archive
, buf
, nextpos 
-  m_Pos
); 
 108     else if (nextpos 
< m_Pos
) { 
 109         unzCloseCurrentFile((unzFile
)m_Archive
); 
 110         if (unzOpenCurrentFile((unzFile
)m_Archive
) != UNZ_OK
) 
 112             m_lasterror 
= wxStream_READ_ERR
; 
 115         buf 
= malloc(nextpos
); 
 116         unzReadCurrentFile((unzFile
)m_Archive
, buf
, nextpos
); 
 125   // wxUSE_STREAMS && wxUSE_ZIPSTREAM && wxUSE_ZLIB