Initial
This commit is contained in:
161
browse/HOLD/MEDIAPAK.CPP
Normal file
161
browse/HOLD/MEDIAPAK.CPP
Normal file
@@ -0,0 +1,161 @@
|
||||
#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
|
||||
37
browse/HOLD/MEDIAPAK.HPP
Normal file
37
browse/HOLD/MEDIAPAK.HPP
Normal file
@@ -0,0 +1,37 @@
|
||||
#ifndef _BROWSE_MEDIAPAK_HPP_
|
||||
#define _BROWSE_MEDIAPAK_HPP_
|
||||
#ifndef _COMMON_WINDOWS_HPP_
|
||||
#include <common/windows.hpp>
|
||||
#endif
|
||||
#ifndef _COMMON_OPENFILE_HPP_
|
||||
#include <common/openfile.hpp>
|
||||
#endif
|
||||
#ifndef _SAMPLE_WAVEFORM_HPP_
|
||||
#include <sample/wave.hpp>
|
||||
#endif
|
||||
#ifndef _BROWSE_PAKENTRY_HPP_
|
||||
#include <browse/pakentry.hpp>
|
||||
#endif
|
||||
|
||||
class MediaPak
|
||||
{
|
||||
public:
|
||||
MediaPak(void);
|
||||
virtual ~MediaPak();
|
||||
BOOL open(const String &pathFileName,BOOL creationFlag=FALSE);
|
||||
void close(void);
|
||||
BOOL add(const PakEntry &pakEntry);
|
||||
BOOL getEntry(PakEntry &pakEntry,DWORD entryIndex);
|
||||
BOOL getEntry(WaveForm &waveForm,DWORD entryIndex);
|
||||
DWORD entries(void)const;
|
||||
BOOL isOkay(void)const;
|
||||
private:
|
||||
enum {HeaderMagic=0x4050414E};
|
||||
MediaPak(const MediaPak &mediaPak);
|
||||
MediaPak &operator=(const MediaPak &mediaPak);
|
||||
|
||||
FileHandle mPakFile;
|
||||
DWORD mEntries;
|
||||
DWORD mOffsetEntries;
|
||||
};
|
||||
#endif
|
||||
117
browse/HOLD/PAKENTRY.HPP
Normal file
117
browse/HOLD/PAKENTRY.HPP
Normal file
@@ -0,0 +1,117 @@
|
||||
#ifndef _BROWSE_PAKENTRY_HPP_
|
||||
#define _BROWSE_PAKENTRY_HPP_
|
||||
#ifndef _COMMON_WINDOWS_HPP_
|
||||
#include <common/windows.hpp>
|
||||
#endif
|
||||
#ifndef _COMMON_STRING_HPP_
|
||||
#include <common/string.hpp>
|
||||
#endif
|
||||
#ifndef _COMMON_GLOBALDATA_HPP_
|
||||
#include <common/gdata.hpp>
|
||||
#endif
|
||||
|
||||
class PakEntry
|
||||
{
|
||||
public:
|
||||
enum EntryType{Sound,Bitmap,Blob};
|
||||
PakEntry(void);
|
||||
PakEntry(const PakEntry &pakEntry);
|
||||
virtual ~PakEntry();
|
||||
PakEntry &operator=(const PakEntry &pakEntry);
|
||||
BOOL operator==(const PakEntry &pakEntry)const;
|
||||
EntryType type(void)const;
|
||||
void type(EntryType entryType);
|
||||
const String &name(void)const;
|
||||
void name(const String &name);
|
||||
int id(void)const;
|
||||
void id(int id);
|
||||
GlobalData<BYTE> &rawData(void);
|
||||
void rawData(GlobalData<BYTE> &rawData);
|
||||
private:
|
||||
EntryType mEntryType;
|
||||
int mID;
|
||||
String mName;
|
||||
GlobalData<BYTE> mRawData;
|
||||
};
|
||||
|
||||
inline
|
||||
PakEntry::PakEntry(void)
|
||||
{
|
||||
}
|
||||
|
||||
inline
|
||||
PakEntry::PakEntry(const PakEntry &pakEntry)
|
||||
{
|
||||
*this=pakEntry;
|
||||
}
|
||||
|
||||
inline
|
||||
PakEntry::~PakEntry()
|
||||
{
|
||||
}
|
||||
|
||||
inline
|
||||
PakEntry &PakEntry::operator=(const PakEntry &pakEntry)
|
||||
{
|
||||
type(pakEntry.type());
|
||||
name(pakEntry.name());
|
||||
rawData(((PakEntry&)pakEntry).rawData());
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline
|
||||
BOOL PakEntry::operator==(const PakEntry &pakEntry)const
|
||||
{
|
||||
return (type()==pakEntry.type()&&
|
||||
name()==pakEntry.name()&&
|
||||
((PakEntry&)*this).rawData()==((PakEntry&)pakEntry).rawData());
|
||||
}
|
||||
|
||||
inline
|
||||
PakEntry::EntryType PakEntry::type(void)const
|
||||
{
|
||||
return mEntryType;
|
||||
}
|
||||
|
||||
inline
|
||||
void PakEntry::type(EntryType entryType)
|
||||
{
|
||||
mEntryType=entryType;
|
||||
}
|
||||
|
||||
inline
|
||||
const String &PakEntry::name(void)const
|
||||
{
|
||||
return mName;
|
||||
}
|
||||
|
||||
inline
|
||||
void PakEntry::name(const String &name)
|
||||
{
|
||||
mName=name;
|
||||
}
|
||||
|
||||
inline
|
||||
int PakEntry::id(void)const
|
||||
{
|
||||
return mID;
|
||||
}
|
||||
|
||||
inline
|
||||
void PakEntry::id(int id)
|
||||
{
|
||||
mID=id;
|
||||
}
|
||||
|
||||
inline
|
||||
GlobalData<BYTE> &PakEntry::rawData(void)
|
||||
{
|
||||
return mRawData;
|
||||
}
|
||||
|
||||
inline
|
||||
void PakEntry::rawData(GlobalData<BYTE> &rawData)
|
||||
{
|
||||
mRawData=rawData;
|
||||
}
|
||||
#endif
|
||||
Reference in New Issue
Block a user