Update of /cvsroot/openmsx/openMSX/src/file In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29505/src/file Modified Files: CompressedFileAdapter.cc CompressedFileAdapter.hh File.cc File.hh FileBase.cc FileBase.hh GZFileAdapter.cc ZipFileAdapter.cc Log Message: lookup original filename inside zip/gz for filetype detection Index: CompressedFileAdapter.cc =================================================================== RCS file: /cvsroot/openmsx/openMSX/src/file/CompressedFileAdapter.cc,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- CompressedFileAdapter.cc 26 Dec 2004 12:33:13 -0000 1.13 +++ CompressedFileAdapter.cc 11 Jan 2005 20:52:45 -0000 1.14 @@ -137,6 +137,12 @@ return FileOperations::getConventionalPath(localName); } +const string CompressedFileAdapter::getOriginalName() +{ + fillBuffer(); + return originalName; +} + bool CompressedFileAdapter::isReadOnly() const { return true; Index: CompressedFileAdapter.hh =================================================================== RCS file: /cvsroot/openmsx/openMSX/src/file/CompressedFileAdapter.hh,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- CompressedFileAdapter.hh 15 Dec 2004 09:09:47 -0000 1.6 +++ CompressedFileAdapter.hh 11 Jan 2005 20:52:45 -0000 1.7 @@ -19,6 +19,7 @@ virtual void truncate(unsigned size); virtual const std::string getURL() const; virtual const std::string getLocalName(); + virtual const std::string getOriginalName(); virtual bool isReadOnly() const; virtual time_t getModificationDate(); @@ -30,6 +31,7 @@ const std::auto_ptr<FileBase> file; byte* buf; unsigned size; + std::string originalName; private: void fillBuffer(); Index: File.cc =================================================================== RCS file: /cvsroot/openmsx/openMSX/src/file/File.cc,v retrieving revision 1.26 retrieving revision 1.27 diff -u -d -r1.26 -r1.27 --- File.cc 15 Dec 2004 09:09:47 -0000 1.26 +++ File.cc 11 Jan 2005 20:52:45 -0000 1.27 @@ -103,6 +103,11 @@ return file->getLocalName(); } +const string File::getOriginalName() +{ + return file->getOriginalName(); +} + bool File::isReadOnly() const { return file->isReadOnly(); Index: File.hh =================================================================== RCS file: /cvsroot/openmsx/openMSX/src/file/File.hh,v retrieving revision 1.22 retrieving revision 1.23 diff -u -d -r1.22 -r1.23 --- File.hh 15 Dec 2004 09:09:47 -0000 1.22 +++ File.hh 11 Jan 2005 20:52:45 -0000 1.23 @@ -114,6 +114,15 @@ const std::string getLocalName() const; /** + * Get Original filename for this object. This will usually just + * return the filename portion of the URL. However for compressed + * files this will be different. + * @result Original file name + * @throws FileException + */ + const std::string getOriginalName(); + + /** * Check if this file is readonly * @result true iff file is readonly * @throws FileException Index: FileBase.cc =================================================================== RCS file: /cvsroot/openmsx/openMSX/src/file/FileBase.cc,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- FileBase.cc 29 May 2004 18:15:51 -0000 1.9 +++ FileBase.cc 11 Jan 2005 20:52:45 -0000 1.10 @@ -4,7 +4,7 @@ #include <algorithm> #include "FileBase.hh" -using std::min; +using std::string; namespace openmsx { @@ -41,7 +41,7 @@ } } - void FileBase::truncate(unsigned size) +void FileBase::truncate(unsigned size) { int grow = size - getSize(); if (grow < 0) { @@ -52,9 +52,17 @@ byte buf[BUF_SIZE]; memset(buf, 0, BUF_SIZE); while (grow > 0) { - write(buf, min(BUF_SIZE, grow)); + write(buf, std::min(BUF_SIZE, grow)); grow -= BUF_SIZE; } +} + +const string FileBase::getOriginalName() +{ + // default implementation just returns filename portion of URL + string url = getURL(); + string::size_type pos = url.find_last_of('/'); + return (pos == string::npos) ? url : url.substr(pos + 1); } } // namespace openmsx Index: FileBase.hh =================================================================== RCS file: /cvsroot/openmsx/openMSX/src/file/FileBase.hh,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- FileBase.hh 15 Dec 2004 09:09:47 -0000 1.19 +++ FileBase.hh 11 Jan 2005 20:52:45 -0000 1.20 @@ -29,6 +29,7 @@ virtual const std::string getURL() const = 0; virtual const std::string getLocalName() = 0; + virtual const std::string getOriginalName(); virtual bool isReadOnly() const = 0; virtual time_t getModificationDate() = 0; Index: GZFileAdapter.cc =================================================================== RCS file: /cvsroot/openmsx/openMSX/src/file/GZFileAdapter.cc,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- GZFileAdapter.cc 15 Dec 2004 09:09:47 -0000 1.9 +++ GZFileAdapter.cc 11 Jan 2005 20:52:45 -0000 1.10 @@ -89,7 +89,9 @@ } if ((flags & ORIG_NAME) != 0) { // skip the original file name - while (getByte(s)); + while (char c = getByte(s)) { + originalName.push_back(c); + } } if ((flags & COMMENT) != 0) { // skip the .gz file comment Index: ZipFileAdapter.cc =================================================================== RCS file: /cvsroot/openmsx/openMSX/src/file/ZipFileAdapter.cc,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- ZipFileAdapter.cc 15 Dec 2004 09:09:47 -0000 1.5 +++ ZipFileAdapter.cc 11 Jan 2005 20:52:45 -0000 1.6 @@ -56,8 +56,12 @@ word extra_field_len = *ptr++; extra_field_len += (*ptr++) << 8; - // skip "filename" and "extra field" - ptr += filename_len + extra_field_len; + // original filename + originalName.assign((char*)ptr, filename_len); + ptr += filename_len; + + // skip "extra field" + ptr += extra_field_len; z_stream s; s.zalloc = 0; |