demboyz/demboyz/demofile/demofile.cpp

108 lines
2.2 KiB
C++
Raw Normal View History

2014-10-29 05:20:24 +01:00
#include "demofile.h"
#include "demotypes.h"
#include <cassert>
#include <utility>
2014-10-29 05:20:24 +01:00
// DemoFileReader
size_t myfread ( void * ptr, size_t size, size_t count, FILE * stream )
{
size_t ret = fread(ptr, size, count, stream);
if (ret != count)
throw("fread error");
return ret;
}
DemoFileReader::DemoFileReader(FILE* fp):
m_demoFp(fp)
2014-10-29 05:20:24 +01:00
{
}
bool DemoFileReader::IsOk() const
{
return ferror(m_demoFp) == 0;
}
2015-06-14 23:05:20 +02:00
void DemoFileReader::ReadDemoHeader(demoheader_t& header)
{
myfread(&header, sizeof(demoheader_t), 1, m_demoFp);
2015-06-14 23:05:20 +02:00
}
int32_t DemoFileReader::ReadRawData(uint8_t* buffer, int32_t maxLength)
2014-10-29 05:20:24 +01:00
{
FILE* fp = m_demoFp;
2015-05-04 04:40:41 +02:00
int32_t size;
myfread(&size, sizeof(int32_t), 1, fp);
2014-10-29 05:20:24 +01:00
if (buffer && (maxLength < size))
2015-05-04 04:40:41 +02:00
{
return -1;
}
if (buffer)
{
myfread(buffer, 1, size, fp);
2015-05-04 04:40:41 +02:00
}
else
2015-05-04 04:40:41 +02:00
{
fseek(fp, size, SEEK_CUR);
2015-05-04 04:40:41 +02:00
}
return size;
2014-10-29 05:20:24 +01:00
}
Array<uint8_t> DemoFileReader::ReadRawData(int32_t maxLength)
{
FILE* fp = m_demoFp;
int32_t size;
myfread(&size, sizeof(int32_t), 1, fp);
Array<uint8_t> data;
if (maxLength < size)
{
return data;
}
data.reset(size);
myfread(data.begin(), 1, size, fp);
return data;
}
void DemoFileReader::ReadSequenceInfo(int32_t& seqNum1, int32_t& seqNum2)
2014-10-29 05:20:24 +01:00
{
FILE* fp = m_demoFp;
myfread(&seqNum1, sizeof(int32_t), 1, fp);
myfread(&seqNum2, sizeof(int32_t), 1, fp);
2014-10-29 05:20:24 +01:00
}
void DemoFileReader::ReadCmdInfo(democmdinfo_t& info)
2014-10-29 05:20:24 +01:00
{
myfread(&info, sizeof(democmdinfo_t), 1, m_demoFp);
2014-10-29 05:20:24 +01:00
}
void DemoFileReader::ReadCmdHeader(unsigned char& cmd, int32_t& tick)
2014-10-29 05:20:24 +01:00
{
FILE* fp = m_demoFp;
myfread(&cmd, 1, sizeof(unsigned char), fp);
if (cmd > dem_lastcmd)
2014-10-29 05:20:24 +01:00
{
2015-05-04 04:40:41 +02:00
cmd = dem_stop;
2014-10-29 05:20:24 +01:00
}
if (cmd != dem_stop)
myfread(&tick, 1, sizeof(int32_t), fp);
2014-10-29 05:20:24 +01:00
}
int32_t DemoFileReader::ReadUserCmd(int32_t& cmdNum, uint8_t* buffer, int32_t maxLength)
{
myfread(&cmdNum, sizeof(int32_t), 1, m_demoFp);
return ReadRawData(buffer, maxLength);
}
Array<uint8_t> DemoFileReader::ReadUserCmd(int32_t& cmdNum, int32_t maxLength)
{
myfread(&cmdNum, sizeof(int32_t), 1, m_demoFp);
return ReadRawData(maxLength);
}