]>
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
= (size_t)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