aboutsummaryrefslogtreecommitdiff
path: root/libs/esptk/src/record.cpp
blob: 7c66dc438d164591fb69112babe8b1b3175c1b1b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "record.h"
#include "espexceptions.h"
#include <cstring>

ESP::Record::Record() : m_Header(), m_FormVersion(), m_Data(), m_OblivionStyle(false) {}

bool ESP::Record::flagSet(ESP::Record::EFlag flag) const
{
  return (m_Header.flags & flag) != 0;
}

bool ESP::Record::readFrom(std::istream& stream)
{
  if (!stream.read(reinterpret_cast<char*>(&m_Header), sizeof(Header))) {
    if (stream.gcount() == 0) {
      return false;
    } else {
      throw ESP::InvalidRecordException("record incomplete");
    }
  }

  char buf[4];
  stream.read(buf, 4);
  if (memcmp(buf, "HEDR", 4) == 0) {
    m_OblivionStyle = true;
    stream.seekg(-4, std::istream::cur);
    // Oblivion-style plugins don't have a form version
  } else {
    memcpy(&m_FormVersion, buf, sizeof(uint16_t));
  }

  m_Data.resize(m_Header.dataSize);
  if (m_Header.dataSize > 0) {
    stream.read(reinterpret_cast<char*>(m_Data.data()), m_Header.dataSize);
  }
  if (!stream) {
    throw ESP::InvalidRecordException("record incomplete");
  }
  return true;
}