expose FileInfo

expose file permissions
This commit is contained in:
Glenn Maynard
2005-05-22 22:45:15 +00:00
parent ccc9aac5e1
commit e157d52a76
2 changed files with 33 additions and 15 deletions
+16 -14
View File
@@ -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 )
+17 -1
View File
@@ -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;