#include "object.h" namespace si { Object::Object() { } bool Object::Parse(Chunk *chunk) { type_ = static_cast(chunk->data("Type").toU16()); presenter_ = chunk->data("Presenter").toString(); unknown1_ = chunk->data("Unknown1"); name_ = chunk->data("Name").toString(); id_ = chunk->data("ID"); flags_ = chunk->data("Flags"); unknown4_ = chunk->data("Unknown4"); duration_ = chunk->data("Duration"); loops_ = chunk->data("Loops"); position_ = chunk->data("Position"); direction_ = chunk->data("Direction"); up_ = chunk->data("Up"); extra_ = chunk->data("ExtraData"); filename_ = chunk->data("FileName").toString(); unknown26_ = chunk->data("Unknown26"); unknown27_ = chunk->data("Unknown27"); unknown28_ = chunk->data("Unknown28"); filetype_ = static_cast(chunk->data("FileType").toU32()); unknown29_ = chunk->data("Unknown29"); unknown30_ = chunk->data("Unknown30"); unknown31_ = chunk->data("Unknown31"); if (chunk->HasChildren()) { Chunk *child = static_cast(chunk->GetChildAt(0)); if (child->id() == Chunk::TYPE_LIST) { for (Core *entry : child->GetChildren()) { Object *o = new Object(); if (!o->Parse(static_cast(entry))) { return false; } AppendChild(o); } } } return true; } bytearray Object::GetNormalizedData() const { return ToPackedData(filetype(), data_); } void Object::SetNormalizedData(const bytearray &d) { SetChunkedData(ToChunkedData(filetype(), d)); } bytearray Object::ToPackedData(MxOb::FileType filetype, const ChunkedData &chunks) { bytearray data; switch (filetype) { case MxOb::WAV: { // Make space for WAVE header data.resize(0x2C); // Merge all chunks after the first one for (size_t i=1; i(data.data()); header[0] = Chunk::TYPE_RIFF; // "RIFF" header[1] = data.size() - 8; // Size of total file header[2] = 0x45564157; // "WAVE" header[3] = 0x20746D66; // "fmt " header[4] = 16; // Size of fmt chunk header[9] = 0x61746164; // "data" header[10] = data.size() - 0x2C; // Size of data chunk // Copy fmt header from chunk 1 memcpy(&header[5], chunks[0].data(), 16); break; } case MxOb::STL: { // Make space for BMP header data.resize(14); // Merge all chunks after the first one for (size_t i=0; iid() == id) { return this; } for (Core *child : GetChildren()) { if (Object *o = static_cast(child)->FindSubObjectWithID(id)) { return o; } } return NULL; } }