[Scummvm-cvs-logs] SF.net SVN: scummvm:[34899] scummvm/trunk/common
fingolfin at users.sourceforge.net
fingolfin at users.sourceforge.net
Tue Nov 4 21:04:26 CET 2008
Revision: 34899
http://scummvm.svn.sourceforge.net/scummvm/?rev=34899&view=rev
Author: fingolfin
Date: 2008-11-04 20:04:25 +0000 (Tue, 04 Nov 2008)
Log Message:
-----------
Improved ZipArchive to take arbitrary SeekableReadStream; also, the variant which is inited using a filename now uses SearchMan to lookup the filename's file
Modified Paths:
--------------
scummvm/trunk/common/unzip.cpp
scummvm/trunk/common/unzip.h
Modified: scummvm/trunk/common/unzip.cpp
===================================================================
--- scummvm/trunk/common/unzip.cpp 2008-11-04 20:03:32 UTC (rev 34898)
+++ scummvm/trunk/common/unzip.cpp 2008-11-04 20:04:25 UTC (rev 34899)
@@ -154,7 +154,6 @@
*/
-unzFile unzOpen(const char *path);
/*
Open a Zip file. path contain the full pathname (by example,
on a Windows NT computer "c:\\zlib\\zlib111.zip" or on an Unix computer
@@ -334,7 +333,7 @@
uLong crc32_wait; /* crc32 we must obtain after decompress all */
uLong rest_read_compressed; /* number of byte to be decompressed */
uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/
- Common::File *file; /* io structore of the zipfile */
+ Common::SeekableReadStream *_stream; /* io structore of the zipfile */
uLong compression_method; /* compression method (0==store) */
uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
} file_in_zip_read_info_s;
@@ -343,7 +342,7 @@
/* unz_s contain internal information about the zipfile
*/
typedef struct {
- Common::File file; /* io structore of the zipfile */
+ Common::SeekableReadStream *_stream; /* io structore of the zipfile */
unz_global_info gi; /* public global information */
uLong byte_before_the_zipfile; /* byte before the zipfile, (>0 for sfx)*/
uLong num_file; /* number of the current file in the zipfile*/
@@ -368,7 +367,7 @@
*/
-/*static int unzlocal_getByte(Common::File &fin, int *pi) {
+/*static int unzlocal_getByte(Common::SeekableReadStream &fin, int *pi) {
unsigned char c = fin.readByte();
*pi = (int)c;
return UNZ_OK;
@@ -384,14 +383,14 @@
/* ===========================================================================
Reads a long in LSB order from the given gz_stream. Sets
*/
-static int unzlocal_getShort(Common::File &fin, uLong *pX) {
- *pX = fin.readUint16LE();
- return fin.ioFailed() ? UNZ_ERRNO : UNZ_OK;
+static int unzlocal_getShort(Common::SeekableReadStream *fin, uLong *pX) {
+ *pX = fin->readUint16LE();
+ return fin->ioFailed() ? UNZ_ERRNO : UNZ_OK;
}
-static int unzlocal_getLong(Common::File &fin, uLong *pX) {
- *pX = fin.readUint32LE();
- return fin.ioFailed() ? UNZ_ERRNO : UNZ_OK;
+static int unzlocal_getLong(Common::SeekableReadStream *fin, uLong *pX) {
+ *pX = fin->readUint32LE();
+ return fin->ioFailed() ? UNZ_ERRNO : UNZ_OK;
}
@@ -426,7 +425,7 @@
Locate the Central directory of a zipfile (at the end, just before
the global comment)
*/
-static uLong unzlocal_SearchCentralDir(Common::File &fin) {
+static uLong unzlocal_SearchCentralDir(Common::SeekableReadStream &fin) {
unsigned char* buf;
uLong uSizeFile;
uLong uBackRead;
@@ -487,7 +486,10 @@
Else, the return value is a unzFile Handle, usable with other function
of this unzip package.
*/
-unzFile unzOpen(const Common::FSNode &node) {
+unzFile unzOpen(Common::SeekableReadStream *stream) {
+ if (!stream)
+ return NULL;
+
unz_s *us = new unz_s;
uLong central_pos,uL;
@@ -501,37 +503,34 @@
int err=UNZ_OK;
- if (!us->file.open(node)) {
- delete us;
- return NULL;
- }
+ us->_stream = stream;
- central_pos = unzlocal_SearchCentralDir(us->file);
+ central_pos = unzlocal_SearchCentralDir(*us->_stream);
if (central_pos==0)
err=UNZ_ERRNO;
- us->file.seek(central_pos, SEEK_SET);
- if (us->file.ioFailed())
+ us->_stream->seek(central_pos, SEEK_SET);
+ if (us->_stream->ioFailed())
err=UNZ_ERRNO;
/* the signature, already checked */
- if (unzlocal_getLong(us->file,&uL)!=UNZ_OK)
+ if (unzlocal_getLong(us->_stream,&uL)!=UNZ_OK)
err=UNZ_ERRNO;
/* number of this disk */
- if (unzlocal_getShort(us->file,&number_disk)!=UNZ_OK)
+ if (unzlocal_getShort(us->_stream,&number_disk)!=UNZ_OK)
err=UNZ_ERRNO;
/* number of the disk with the start of the central directory */
- if (unzlocal_getShort(us->file,&number_disk_with_CD)!=UNZ_OK)
+ if (unzlocal_getShort(us->_stream,&number_disk_with_CD)!=UNZ_OK)
err=UNZ_ERRNO;
/* total number of entries in the central dir on this disk */
- if (unzlocal_getShort(us->file,&us->gi.number_entry)!=UNZ_OK)
+ if (unzlocal_getShort(us->_stream,&us->gi.number_entry)!=UNZ_OK)
err=UNZ_ERRNO;
/* total number of entries in the central dir */
- if (unzlocal_getShort(us->file,&number_entry_CD)!=UNZ_OK)
+ if (unzlocal_getShort(us->_stream,&number_entry_CD)!=UNZ_OK)
err=UNZ_ERRNO;
if ((number_entry_CD!=us->gi.number_entry) ||
@@ -540,23 +539,23 @@
err=UNZ_BADZIPFILE;
/* size of the central directory */
- if (unzlocal_getLong(us->file,&us->size_central_dir)!=UNZ_OK)
+ if (unzlocal_getLong(us->_stream,&us->size_central_dir)!=UNZ_OK)
err=UNZ_ERRNO;
/* offset of start of central directory with respect to the
starting disk number */
- if (unzlocal_getLong(us->file,&us->offset_central_dir)!=UNZ_OK)
+ if (unzlocal_getLong(us->_stream,&us->offset_central_dir)!=UNZ_OK)
err=UNZ_ERRNO;
/* zipfile comment length */
- if (unzlocal_getShort(us->file,&us->gi.size_comment)!=UNZ_OK)
+ if (unzlocal_getShort(us->_stream,&us->gi.size_comment)!=UNZ_OK)
err=UNZ_ERRNO;
if ((central_pos<us->offset_central_dir+us->size_central_dir) && (err==UNZ_OK))
err=UNZ_BADZIPFILE;
if (err!=UNZ_OK) {
- us->file.close();
+ delete us->_stream;
delete us;
return NULL;
}
@@ -585,7 +584,7 @@
if (s->pfile_in_zip_read!=NULL)
unzCloseCurrentFile(file);
- s->file.close();
+ delete s->_stream;
delete s;
return UNZ_OK;
}
@@ -651,64 +650,64 @@
if (file==NULL)
return UNZ_PARAMERROR;
s=(unz_s*)file;
- s->file.seek(s->pos_in_central_dir+s->byte_before_the_zipfile, SEEK_SET);
- if (s->file.ioFailed())
+ s->_stream->seek(s->pos_in_central_dir+s->byte_before_the_zipfile, SEEK_SET);
+ if (s->_stream->ioFailed())
err=UNZ_ERRNO;
/* we check the magic */
if (err==UNZ_OK) {
- if (unzlocal_getLong(s->file,&uMagic) != UNZ_OK)
+ if (unzlocal_getLong(s->_stream,&uMagic) != UNZ_OK)
err=UNZ_ERRNO;
else if (uMagic!=0x02014b50)
err=UNZ_BADZIPFILE;
}
- if (unzlocal_getShort(s->file,&file_info.version) != UNZ_OK)
+ if (unzlocal_getShort(s->_stream,&file_info.version) != UNZ_OK)
err=UNZ_ERRNO;
- if (unzlocal_getShort(s->file,&file_info.version_needed) != UNZ_OK)
+ if (unzlocal_getShort(s->_stream,&file_info.version_needed) != UNZ_OK)
err=UNZ_ERRNO;
- if (unzlocal_getShort(s->file,&file_info.flag) != UNZ_OK)
+ if (unzlocal_getShort(s->_stream,&file_info.flag) != UNZ_OK)
err=UNZ_ERRNO;
- if (unzlocal_getShort(s->file,&file_info.compression_method) != UNZ_OK)
+ if (unzlocal_getShort(s->_stream,&file_info.compression_method) != UNZ_OK)
err=UNZ_ERRNO;
- if (unzlocal_getLong(s->file,&file_info.dosDate) != UNZ_OK)
+ if (unzlocal_getLong(s->_stream,&file_info.dosDate) != UNZ_OK)
err=UNZ_ERRNO;
unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date);
- if (unzlocal_getLong(s->file,&file_info.crc) != UNZ_OK)
+ if (unzlocal_getLong(s->_stream,&file_info.crc) != UNZ_OK)
err=UNZ_ERRNO;
- if (unzlocal_getLong(s->file,&file_info.compressed_size) != UNZ_OK)
+ if (unzlocal_getLong(s->_stream,&file_info.compressed_size) != UNZ_OK)
err=UNZ_ERRNO;
- if (unzlocal_getLong(s->file,&file_info.uncompressed_size) != UNZ_OK)
+ if (unzlocal_getLong(s->_stream,&file_info.uncompressed_size) != UNZ_OK)
err=UNZ_ERRNO;
- if (unzlocal_getShort(s->file,&file_info.size_filename) != UNZ_OK)
+ if (unzlocal_getShort(s->_stream,&file_info.size_filename) != UNZ_OK)
err=UNZ_ERRNO;
- if (unzlocal_getShort(s->file,&file_info.size_file_extra) != UNZ_OK)
+ if (unzlocal_getShort(s->_stream,&file_info.size_file_extra) != UNZ_OK)
err=UNZ_ERRNO;
- if (unzlocal_getShort(s->file,&file_info.size_file_comment) != UNZ_OK)
+ if (unzlocal_getShort(s->_stream,&file_info.size_file_comment) != UNZ_OK)
err=UNZ_ERRNO;
- if (unzlocal_getShort(s->file,&file_info.disk_num_start) != UNZ_OK)
+ if (unzlocal_getShort(s->_stream,&file_info.disk_num_start) != UNZ_OK)
err=UNZ_ERRNO;
- if (unzlocal_getShort(s->file,&file_info.internal_fa) != UNZ_OK)
+ if (unzlocal_getShort(s->_stream,&file_info.internal_fa) != UNZ_OK)
err=UNZ_ERRNO;
- if (unzlocal_getLong(s->file,&file_info.external_fa) != UNZ_OK)
+ if (unzlocal_getLong(s->_stream,&file_info.external_fa) != UNZ_OK)
err=UNZ_ERRNO;
- if (unzlocal_getLong(s->file,&file_info_internal.offset_curfile) != UNZ_OK)
+ if (unzlocal_getLong(s->_stream,&file_info_internal.offset_curfile) != UNZ_OK)
err=UNZ_ERRNO;
lSeek+=file_info.size_filename;
@@ -721,7 +720,7 @@
uSizeRead = fileNameBufferSize;
if ((file_info.size_filename>0) && (fileNameBufferSize>0))
- if (s->file.read(szFileName,(uInt)uSizeRead)!=uSizeRead)
+ if (s->_stream->read(szFileName,(uInt)uSizeRead)!=uSizeRead)
err=UNZ_ERRNO;
lSeek -= uSizeRead;
}
@@ -735,14 +734,14 @@
uSizeRead = extraFieldBufferSize;
if (lSeek!=0) {
- s->file.seek(lSeek, SEEK_CUR);
- if (s->file.ioFailed())
+ s->_stream->seek(lSeek, SEEK_CUR);
+ if (s->_stream->ioFailed())
lSeek=0;
else
err=UNZ_ERRNO;
}
if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0))
- if (s->file.read(extraField,(uInt)uSizeRead)!=uSizeRead)
+ if (s->_stream->read(extraField,(uInt)uSizeRead)!=uSizeRead)
err=UNZ_ERRNO;
lSeek += file_info.size_file_extra - uSizeRead;
}
@@ -759,14 +758,14 @@
uSizeRead = commentBufferSize;
if (lSeek!=0) {
- s->file.seek(lSeek, SEEK_CUR);
- if (s->file.ioFailed())
+ s->_stream->seek(lSeek, SEEK_CUR);
+ if (s->_stream->ioFailed())
lSeek=0;
else
err=UNZ_ERRNO;
}
if ((file_info.size_file_comment>0) && (commentBufferSize>0))
- if (s->file.read(szComment,(uInt)uSizeRead)!=uSizeRead)
+ if (s->_stream->read(szComment,(uInt)uSizeRead)!=uSizeRead)
err=UNZ_ERRNO;
lSeek+=file_info.size_file_comment - uSizeRead;
} else
@@ -916,29 +915,29 @@
*poffset_local_extrafield = 0;
*psize_local_extrafield = 0;
- s->file.seek(s->cur_file_info_internal.offset_curfile +
+ s->_stream->seek(s->cur_file_info_internal.offset_curfile +
s->byte_before_the_zipfile, SEEK_SET);
- if (s->file.ioFailed())
+ if (s->_stream->ioFailed())
return UNZ_ERRNO;
if (err==UNZ_OK) {
- if (unzlocal_getLong(s->file,&uMagic) != UNZ_OK)
+ if (unzlocal_getLong(s->_stream,&uMagic) != UNZ_OK)
err=UNZ_ERRNO;
else if (uMagic!=0x04034b50)
err=UNZ_BADZIPFILE;
}
- if (unzlocal_getShort(s->file,&uData) != UNZ_OK)
+ if (unzlocal_getShort(s->_stream,&uData) != UNZ_OK)
err=UNZ_ERRNO;
/*
else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion))
err=UNZ_BADZIPFILE;
*/
- if (unzlocal_getShort(s->file,&uFlags) != UNZ_OK)
+ if (unzlocal_getShort(s->_stream,&uFlags) != UNZ_OK)
err=UNZ_ERRNO;
- if (unzlocal_getShort(s->file,&uData) != UNZ_OK)
+ if (unzlocal_getShort(s->_stream,&uData) != UNZ_OK)
err=UNZ_ERRNO;
else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method))
err=UNZ_BADZIPFILE;
@@ -947,36 +946,36 @@
(s->cur_file_info.compression_method!=Z_DEFLATED))
err=UNZ_BADZIPFILE;
- if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* date/time */
+ if (unzlocal_getLong(s->_stream,&uData) != UNZ_OK) /* date/time */
err=UNZ_ERRNO;
- if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* crc */
+ if (unzlocal_getLong(s->_stream,&uData) != UNZ_OK) /* crc */
err=UNZ_ERRNO;
else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) &&
((uFlags & 8)==0))
err=UNZ_BADZIPFILE;
- if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* size compr */
+ if (unzlocal_getLong(s->_stream,&uData) != UNZ_OK) /* size compr */
err=UNZ_ERRNO;
else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) &&
((uFlags & 8)==0))
err=UNZ_BADZIPFILE;
- if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* size uncompr */
+ if (unzlocal_getLong(s->_stream,&uData) != UNZ_OK) /* size uncompr */
err=UNZ_ERRNO;
else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) &&
((uFlags & 8)==0))
err=UNZ_BADZIPFILE;
- if (unzlocal_getShort(s->file,&size_filename) != UNZ_OK)
+ if (unzlocal_getShort(s->_stream,&size_filename) != UNZ_OK)
err=UNZ_ERRNO;
else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename))
err=UNZ_BADZIPFILE;
*piSizeVar += (uInt)size_filename;
- if (unzlocal_getShort(s->file,&size_extra_field) != UNZ_OK)
+ if (unzlocal_getShort(s->_stream,&size_extra_field) != UNZ_OK)
err=UNZ_ERRNO;
*poffset_local_extrafield= s->cur_file_info_internal.offset_curfile +
SIZEZIPLOCALHEADER + size_filename;
@@ -1039,7 +1038,7 @@
pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc;
pfile_in_zip_read_info->crc32_data=0;
pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method;
- pfile_in_zip_read_info->file=&s->file;
+ pfile_in_zip_read_info->_stream=s->_stream;
pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile;
pfile_in_zip_read_info->stream.total_out = 0;
@@ -1120,11 +1119,11 @@
uReadThis = (uInt)pfile_in_zip_read_info->rest_read_compressed;
if (uReadThis == 0)
return UNZ_EOF;
- pfile_in_zip_read_info->file->seek(pfile_in_zip_read_info->pos_in_zipfile +
+ pfile_in_zip_read_info->_stream->seek(pfile_in_zip_read_info->pos_in_zipfile +
pfile_in_zip_read_info->byte_before_the_zipfile, SEEK_SET);
- if (pfile_in_zip_read_info->file->ioFailed())
+ if (pfile_in_zip_read_info->_stream->ioFailed())
return UNZ_ERRNO;
- if (pfile_in_zip_read_info->file->read(pfile_in_zip_read_info->read_buffer,uReadThis)!=uReadThis)
+ if (pfile_in_zip_read_info->_stream->read(pfile_in_zip_read_info->read_buffer,uReadThis)!=uReadThis)
return UNZ_ERRNO;
pfile_in_zip_read_info->pos_in_zipfile += uReadThis;
@@ -1274,12 +1273,12 @@
if (read_now==0)
return 0;
- pfile_in_zip_read_info->file->seek(pfile_in_zip_read_info->offset_local_extrafield +
+ pfile_in_zip_read_info->_stream->seek(pfile_in_zip_read_info->offset_local_extrafield +
pfile_in_zip_read_info->pos_local_extrafield,SEEK_SET);
- if (pfile_in_zip_read_info->file->ioFailed())
+ if (pfile_in_zip_read_info->_stream->ioFailed())
return UNZ_ERRNO;
- if (pfile_in_zip_read_info->file->read(buf,(uInt)size_to_read)!=size_to_read)
+ if (pfile_in_zip_read_info->_stream->read(buf,(uInt)size_to_read)!=size_to_read)
return UNZ_ERRNO;
return (int)read_now;
@@ -1339,13 +1338,13 @@
if (uReadThis>s->gi.size_comment)
uReadThis = s->gi.size_comment;
- s->file.seek(s->central_pos+22, SEEK_SET);
- if (s->file.ioFailed())
+ s->_stream->seek(s->central_pos+22, SEEK_SET);
+ if (s->_stream->ioFailed())
return UNZ_ERRNO;
if (uReadThis>0) {
*szComment='\0';
- if (s->file.read(szComment,(uInt)uReadThis)!=uReadThis)
+ if (s->_stream->read(szComment,(uInt)uReadThis)!=uReadThis)
return UNZ_ERRNO;
}
@@ -1377,13 +1376,19 @@
*/
ZipArchive::ZipArchive(const Common::String &name) {
- _zipFile = unzOpen(Common::FSNode(name));
+ SeekableReadStream *stream = SearchMan.openFile(name);
+ _zipFile = unzOpen(stream);
}
ZipArchive::ZipArchive(const Common::FSNode &node) {
- _zipFile = unzOpen(node);
+ SeekableReadStream *stream = node.openForReading();
+ _zipFile = unzOpen(stream);
}
+ZipArchive::ZipArchive(Common::SeekableReadStream *stream) {
+ _zipFile = unzOpen(stream);
+}
+
ZipArchive::~ZipArchive() {
unzClose(_zipFile);
}
Modified: scummvm/trunk/common/unzip.h
===================================================================
--- scummvm/trunk/common/unzip.h 2008-11-04 20:03:32 UTC (rev 34898)
+++ scummvm/trunk/common/unzip.h 2008-11-04 20:04:25 UTC (rev 34899)
@@ -40,6 +40,7 @@
public:
ZipArchive(const String &name);
ZipArchive(const FSNode &node);
+ ZipArchive(SeekableReadStream *stream);
~ZipArchive();
bool isOpen() const;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list