2007-05-07 18:33:24 +02:00
|
|
|
/**
|
|
|
|
* =========================================================================
|
|
|
|
* File : FilePacker.cpp
|
|
|
|
* Project : 0 A.D.
|
|
|
|
* Description : Resizable buffer, for writing binary files
|
|
|
|
* =========================================================================
|
|
|
|
*/
|
2004-05-29 22:48:08 +02:00
|
|
|
|
2004-06-03 20:38:14 +02:00
|
|
|
#include "precompiled.h"
|
|
|
|
|
2004-05-29 22:48:08 +02:00
|
|
|
#include "FilePacker.h"
|
2007-12-20 21:21:45 +01:00
|
|
|
#include "ps/Filesystem.h"
|
|
|
|
#include "lib/byte_order.h"
|
2004-12-15 15:22:50 +01:00
|
|
|
|
|
|
|
#include <string.h>
|
2004-05-29 22:48:08 +02:00
|
|
|
|
2007-12-20 21:21:45 +01:00
|
|
|
|
2004-05-29 22:48:08 +02:00
|
|
|
////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// CFilePacker constructor
|
2004-12-15 15:22:50 +01:00
|
|
|
// rationale for passing in version + signature here: see header
|
2007-12-20 21:21:45 +01:00
|
|
|
CFilePacker::CFilePacker(u32 version, const char magicstr[4])
|
2004-05-29 22:48:08 +02:00
|
|
|
{
|
2004-12-15 15:22:50 +01:00
|
|
|
// put header in our data array.
|
|
|
|
// (size will be updated on every Pack*() call)
|
2007-12-20 21:21:45 +01:00
|
|
|
char header[12];
|
|
|
|
strncpy(header+0, magicstr, 4); // not 0-terminated => no _s
|
|
|
|
write_le32(header+4, version);
|
|
|
|
write_le32(header+8, 0); // datasize
|
|
|
|
m_writeBuffer.Append(header, 12);
|
2004-05-29 22:48:08 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////
|
2004-12-15 15:22:50 +01:00
|
|
|
// Write: write out to file all packed data added so far
|
2008-01-07 21:03:19 +01:00
|
|
|
void CFilePacker::Write(const VfsPath& filename)
|
2004-05-29 22:48:08 +02:00
|
|
|
{
|
2007-12-20 21:21:45 +01:00
|
|
|
const u32 size_le = to_le32(u32_from_larger(m_writeBuffer.Size()));
|
|
|
|
m_writeBuffer.Overwrite(&size_le, sizeof(size_le), 8);
|
|
|
|
|
2004-12-15 15:22:50 +01:00
|
|
|
// write out all data (including header)
|
2007-12-20 21:21:45 +01:00
|
|
|
if(g_VFS->CreateFile(filename, m_writeBuffer.Data(), m_writeBuffer.Size()) < 0)
|
2006-04-04 06:14:10 +02:00
|
|
|
throw PSERROR_File_WriteFailed();
|
2004-05-29 22:48:08 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// PackRaw: pack given number of bytes onto the end of the data stream
|
2007-12-20 21:21:45 +01:00
|
|
|
void CFilePacker::PackRaw(const void* rawData, size_t rawSize)
|
2004-05-29 22:48:08 +02:00
|
|
|
{
|
2007-12-20 21:21:45 +01:00
|
|
|
m_writeBuffer.Append(rawData, rawSize);
|
2004-05-29 22:48:08 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// PackString: pack a string onto the end of the data stream
|
|
|
|
void CFilePacker::PackString(const CStr& str)
|
|
|
|
{
|
2007-12-20 21:21:45 +01:00
|
|
|
const size_t length = str.length();
|
|
|
|
const u32 length_le = to_le32(u32_from_larger(length));
|
|
|
|
PackRaw(&length_le, sizeof(length_le));
|
|
|
|
PackRaw((const char*)str, length);
|
2004-05-29 22:48:08 +02:00
|
|
|
}
|