diff --git a/stepmania/src/RageFileDriverZip.cpp b/stepmania/src/RageFileDriverZip.cpp index 62a4722e3a..556edc27c3 100644 --- a/stepmania/src/RageFileDriverZip.cpp +++ b/stepmania/src/RageFileDriverZip.cpp @@ -17,18 +17,6 @@ static struct FileDriverEntry_ZIP: public FileDriverEntry RageFileDriver *Create( CString Root ) const { return new RageFileDriverZip( Root ); } } const g_RegisterDriver; -enum ZipCompressionMethod { STORED = 0, DEFLATED = 8 }; - -struct FileInfo -{ - CString m_sName; - int m_iOffset; - int m_iDataOffset; - - ZipCompressionMethod m_iCompressionMethod; - int m_iCRC32; - int m_iCompressedSize, m_iUncompressedSize; -}; RageFileDriverZip::RageFileDriverZip(): RageFileDriver( new NullFilenameDB ), @@ -195,7 +183,7 @@ int RageFileDriverZip::ProcessCdirFileHdr( FileInfo &info ) return -1; } - FileReading::read_16_le( *m_pZip, sError ); /* skip version made by */ + int iMadeBy = FileReading::read_16_le( *m_pZip, sError ); /* skip version made by */ FileReading::read_16_le( *m_pZip, sError ); /* skip version needed to extract */ int iGeneralPurpose = FileReading::read_16_le( *m_pZip, sError ); info.m_iCompressionMethod = (ZipCompressionMethod) FileReading::read_16_le( *m_pZip, sError ); @@ -209,7 +197,7 @@ int RageFileDriverZip::ProcessCdirFileHdr( FileInfo &info ) int iFileCommentLength = FileReading::read_16_le( *m_pZip, sError ); FileReading::read_16_le( *m_pZip, sError ); /* relative offset of local header */ FileReading::read_16_le( *m_pZip, sError ); /* skip internal file attributes */ - int iExternalFileAttributes = FileReading::read_32_le( *m_pZip, sError ); + unsigned iExternalFileAttributes = FileReading::read_32_le( *m_pZip, sError ); info.m_iOffset = FileReading::read_32_le( *m_pZip, sError ); /* Check for errors before reading variable-length fields. */ @@ -241,6 +229,15 @@ int RageFileDriverZip::ProcessCdirFileHdr( FileInfo &info ) if( iExternalFileAttributes & (1<<4) ) return 0; + info.m_iFilePermissions = 0; + enum { MADE_BY_UNIX = 3 }; + switch( iMadeBy ) + { + case MADE_BY_UNIX: + info.m_iFilePermissions = iExternalFileAttributes >> 16; + break; + } + if( info.m_iCompressionMethod != STORED && info.m_iCompressionMethod != DEFLATED ) { LOG->Warn( "File \"%s\" in \"%s\" uses unsupported compression method %i", @@ -296,6 +293,11 @@ RageFileDriverZip::~RageFileDriverZip() delete m_pZip; } +const RageFileDriverZip::FileInfo *RageFileDriverZip::GetFileInfo( const CString &sPath ) const +{ + return (const FileInfo *) FDB->GetFilePriv( sPath ); +} + RageFileBasic *RageFileDriverZip::Open( const CString &sPath, int iMode, int &iErr ) { if( iMode & RageFile::WRITE ) diff --git a/stepmania/src/RageFileDriverZip.h b/stepmania/src/RageFileDriverZip.h index dba526e342..4989044a37 100644 --- a/stepmania/src/RageFileDriverZip.h +++ b/stepmania/src/RageFileDriverZip.h @@ -6,7 +6,6 @@ #include "RageFileDriver.h" #include "RageThreads.h" -struct FileInfo; struct end_central_dir_record; class RageFileDriverZip: public RageFileDriver { @@ -24,6 +23,23 @@ public: void DeleteFileWhenFinished() { m_bFileOwned = true; } + /* Lower-level access: */ + enum ZipCompressionMethod { STORED = 0, DEFLATED = 8 }; + struct FileInfo + { + CString m_sName; + int m_iOffset; + int m_iDataOffset; + + ZipCompressionMethod m_iCompressionMethod; + int m_iCRC32; + int m_iCompressedSize, m_iUncompressedSize; + + /* If 0, unknown. */ + int m_iFilePermissions; + }; + const FileInfo *GetFileInfo( const CString &sPath ) const; + private: bool m_bFileOwned;