void GFF4Struct::load(GFF4File &parent, const Field &genericParent) { static const uint32 kGenericSize = 8; Common::SeekableReadStream &data = parent.getStream(genericParent.offset); const uint32 genericCount = genericParent.isList ? data.readUint32LE() : 1; const uint32 genericStart = data.pos(); for (uint32 i = 0; i < genericCount; i++) { data.seek(genericStart + i * kGenericSize); const uint16 fieldType = data.readUint16LE(); const uint16 fieldFlags = data.readUint16LE(); const uint32 fieldOffset = getDataOffset(genericParent.isReference, data.pos()); if (fieldOffset == 0xFFFFFFFF) continue; // Load the field and its struct(s), if any Field &f = _fields[i] = Field(i, fieldType, fieldFlags, fieldOffset, true); if (f.type == kIFieldTypeStruct) loadStructs(parent, f); } _fieldCount = genericCount; }
void GFF3File::load(uint32 id) { try { loadHeader(id); loadStructs(); loadLists(); } catch (Common::Exception &e) { clear(); e.add("Failed reading GFF3 file"); throw; } }
void GFF4File::load(uint32 type) { try { loadHeader(type); loadStructs(); loadStrings(); } catch (Common::Exception &e) { clear(); e.add("Failed reading GFF4 file"); throw; } }
void GFF4Struct::load(GFF4File &parent, uint32 offset, const GFF4File::StructTemplate &tmplt) { for (size_t i = 0; i < tmplt.fields.size(); i++) { const GFF4File::StructTemplate::Field &field = tmplt.fields[i]; // Calculate the offset for the field data, but guard against NULL pointers uint32 fieldOffset = offset + field.offset; if ((offset == 0xFFFFFFFF) || (field.offset == 0xFFFFFFFF)) fieldOffset = 0xFFFFFFFF; // Load the field and its struct(s), if any Field &f = _fields[field.label] = Field(field.label, field.type, field.flags, fieldOffset); if (f.type == kIFieldTypeStruct) loadStructs(parent, f); if (f.type == kIFieldTypeGeneric) loadGeneric(parent, f); } _fieldCount = _fields.size(); }