Files
Work/browse/HOLD/MEDIAPAK.CPP
2024-08-07 09:12:07 -04:00

162 lines
4.8 KiB
C++

#include <browse/mediapak.hpp>
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,BOOL creationFlag)
{
DWORD magic;
mPakFile.close();
mEntries=0;
if(creationFlag)
{
mPakFile.open(pathFileName,FileHandle::ReadWrite,FileHandle::ShareRead,FileHandle::Overwrite);
magic=HeaderMagic;
mEntries=0;
mPakFile.write((unsigned char*)&magic,sizeof(magic));
mOffsetEntries=mPakFile.tell();
mPakFile.write((unsigned char*)&mEntries,sizeof(mEntries));
}
else
{
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));
}
return TRUE;
}
void MediaPak::close(void)
{
if(!mPakFile.isOkay())return;
mPakFile.close();
}
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;index++)
{
mPakFile.read((unsigned char*)&entryLength,sizeof(entryLength));
mPakFile.seek(entryLength,FileHandle::SeekCurrent);
}
entryLength=sizeof(int)+sizeof(int)+sizeof(int)+sizeof(int)+pakEntry.name().length()+((PakEntry&)pakEntry).rawData().size(); // sizeof(int)+
mPakFile.write((unsigned char*)&entryLength,sizeof(entryLength));
mPakFile.write((DWORD)pakEntry.type());
mPakFile.write((DWORD)pakEntry.id());
mPakFile.write((DWORD)pakEntry.name().length());
mPakFile.write((unsigned char*)(char*)pakEntry.name(),pakEntry.name().length());
mPakFile.write(((PakEntry&)pakEntry).rawData().size());
mPakFile.write((unsigned char*)(BYTE*)&(((PakEntry&)pakEntry).rawData()[0]),((PakEntry&)pakEntry).rawData().size());
mEntries++;
mPakFile.seek(mOffsetEntries,FileHandle::SeekBegin);
mPakFile.write(mEntries);
return TRUE;
}
DWORD MediaPak::entries(void)const
{
return mEntries;
}
BOOL MediaPak::getEntry(PakEntry &pakEntry,DWORD entryIndex)
{
String entryName;
int entryLength;
int workData;
if(!mPakFile.isOkay())return FALSE;
mPakFile.seek(mOffsetEntries,FileHandle::SeekBegin);
mPakFile.read((unsigned char*)&mEntries,sizeof(mEntries));
if(entryIndex>=mEntries)return FALSE;
for(int index=0;index<entryIndex;index++)
{
mPakFile.read((unsigned char*)&entryLength,sizeof(entryLength));
mPakFile.seek(entryLength,FileHandle::SeekCurrent);
}
if(!mEntries)return FALSE;
mPakFile.read((unsigned char*)&entryLength,sizeof(entryLength));
mPakFile.read((unsigned char*)&workData,sizeof(workData));
pakEntry.type(PakEntry::EntryType(workData));
mPakFile.read((unsigned char*)&workData,sizeof(workData));
pakEntry.id(workData);
mPakFile.read((unsigned char*)&workData,sizeof(workData));
entryName.reserve(workData+1);
mPakFile.read((unsigned char *)(char*)entryName,workData);
pakEntry.name(entryName);
mPakFile.read((unsigned char*)&workData,sizeof(workData));
pakEntry.rawData().size(workData);
mPakFile.read((unsigned char*)(BYTE*)&(pakEntry.rawData()[0]),workData);
return TRUE;
}
BOOL MediaPak::getEntry(WaveForm &waveForm,DWORD entryIndex)
{
PakEntry pakEntry;
String entryName;
int entryLength;
int workData;
if(!mPakFile.isOkay())return FALSE;
mPakFile.seek(mOffsetEntries,FileHandle::SeekBegin);
mPakFile.read((unsigned char*)&mEntries,sizeof(mEntries));
if(entryIndex>=mEntries)return FALSE;
for(int index=0;index<entryIndex;index++)
{
mPakFile.read((unsigned char*)&entryLength,sizeof(entryLength));
mPakFile.seek(entryLength,FileHandle::SeekCurrent);
}
if(!mEntries)return FALSE;
mPakFile.read((unsigned char*)&entryLength,sizeof(entryLength));
mPakFile.read((unsigned char*)&workData,sizeof(workData));
pakEntry.type(PakEntry::EntryType(workData));
if(PakEntry::Sound!=pakEntry.type())return FALSE;
mPakFile.read((unsigned char*)&workData,sizeof(workData));
pakEntry.id(workData);
mPakFile.read((unsigned char*)&workData,sizeof(workData));
entryName.reserve(workData+1);
mPakFile.read((unsigned char *)(char*)entryName,workData);
pakEntry.name(entryName);
mPakFile.read((unsigned char*)&workData,sizeof(workData));
pakEntry.rawData().size(workData);
return waveForm<<mPakFile;
}
BOOL MediaPak::isOkay(void)const
{
return mPakFile.isOkay();
}
// "MPAK0100" 40h,50h,41h,4Bh
// ENTRIES DD
// SIZE DD { THIS IS SIZEOF(TYPE)+SIZEOF(OFFSET)+SIZEOF(NAME)+SIZEOF(DATA)
// TYPE DD {SOUND=0}
// OFFSET DD
// NAME { LENGTH DD, NAMEBYTES DB }
// DATA