#include #include #include #include MediaPak::MediaPak(void) : mEntries(0), mOffsetEntries(0) { } MediaPak::MediaPak(const MediaPak &mediaPak) { *this=mediaPak; } MediaPak::~MediaPak() { close(); } MediaPak &MediaPak::operator=(const MediaPak &/*mediaPak*/) { // private implementation return *this; } BOOL MediaPak::open(const String &pathFileName,Mode openMode) { DWORD magic; mPakFile.close(); mEntries=0; if(CreateAlways==openMode) { mPakFile.open(pathFileName,FileHandle::ReadWrite,FileHandle::ShareRead,FileHandle::Overwrite); if(!mPakFile.isOkay())return FALSE; magic=HeaderMagic; mEntries=0; mPakFile.write((unsigned char*)&magic,sizeof(magic)); mOffsetEntries=mPakFile.tell(); mPakFile.write((unsigned char*)&mEntries,sizeof(mEntries)); } else if(OpenExisting==openMode) { mPakFile.open(pathFileName,FileHandle::ReadWrite,FileHandle::ShareRead,FileHandle::Open); if(!mPakFile.isOkay())return FALSE; mPakFile.read((unsigned char*)&magic,sizeof(magic)); mOffsetEntries=mPakFile.tell(); if(magic!=HeaderMagic){mPakFile.close();return FALSE;} mPakFile.read((unsigned char*)&mEntries,sizeof(mEntries)); } else // OpenAlways { if(mPakFile.open(pathFileName,FileHandle::ReadWrite,FileHandle::ShareRead,FileHandle::Open)) { if(!mPakFile.isOkay())return FALSE; mPakFile.read((unsigned char*)&magic,sizeof(magic)); mOffsetEntries=mPakFile.tell(); if(magic!=HeaderMagic){mPakFile.close();return FALSE;} mPakFile.read((unsigned char*)&mEntries,sizeof(mEntries)); } else { mPakFile.open(pathFileName,FileHandle::ReadWrite,FileHandle::ShareRead,FileHandle::Mode(FileHandle::Create)); if(!mPakFile.isOkay())return FALSE; magic=HeaderMagic; mEntries=0; mPakFile.write((unsigned char*)&magic,sizeof(magic)); mOffsetEntries=mPakFile.tell(); mPakFile.write((unsigned char*)&mEntries,sizeof(mEntries)); } } return TRUE; } void MediaPak::close(void) { if(!mPakFile.isOkay())return; mPakFile.close(); } BOOL MediaPak::add(const String &strPathFileName) { PakEntry::EntryType entryType; PakEntry pakEntry; String strExtension; String strName; FileHandle inFile; Profile iniProfile; if(!isOkay()||strPathFileName.isNull())return FALSE; strExtension=strPathFileName.betweenString('.',0); if(strExtension.isNull())return FALSE; inFile.open(strPathFileName); if(!inFile.isOkay())return FALSE; strExtension.upper(); if(strExtension==String("BMP"))pakEntry.type(PakEntry::Bitmap); else if(strExtension==String("WAV"))pakEntry.type(PakEntry::Sound); else pakEntry.type(PakEntry::Blob); strName=strPathFileName; iniProfile.makeFileName(strName); pakEntry.name(strName); pakEntry.id(entries()+1); pakEntry.rawData().size(inFile.size()); inFile.read((BYTE*)&(pakEntry.rawData()[0]),pakEntry.rawData().size()); inFile.close(); return add(pakEntry); } BOOL MediaPak::add(const PakEntry &pakEntry) { DWORD entryLength; if(!isOkay())return FALSE; mPakFile.seek(mOffsetEntries,FileHandle::SeekBegin); mPakFile.read((unsigned char*)&mEntries,sizeof(mEntries)); for(int index=0;index=mEntries)return FALSE; for(int index=0;index=mEntries)return FALSE; for(int index=0;index=mEntries)return FALSE; for(int index=0;index &entryInfoArray) { String entryName; int entryLength; int workData; if(!mPakFile.isOkay())return FALSE; mPakFile.seek(mOffsetEntries,FileHandle::SeekBegin); mPakFile.read((unsigned char*)&mEntries,sizeof(mEntries)); if(!mEntries)return FALSE; entryInfoArray.size(mEntries); for(int index=0;index