// Read all the Continue records that follow the record void BiffRecordContinued::readFollowingContinue(CFStreamCacheReader& reader) { CFRecordType::TypeId type; while(CFRecordType::isContinue(type = reader.getNextRecordType())) { CFRecordPtr record = reader.getNextRecord(rt_ANY_TYPE, false); if(!record) { return; } continue_records[type].push_back(record); } }
const bool BiffRecord::read(CFStreamCacheReader& reader, BaseObject* parent, const bool is_mandatory) { parent_ = parent; // Find and read the required record CFRecordPtr record = reader.getNextRecord(getTypeId(), is_mandatory); if(!record) { return false; // Required record hasn't been found } readFollowingContinue(reader); if(storeRecordAndDecideProceeding(record)) { // Read fields data readFields(*record); // defined in derived classes size_t dataSize = record->getDataSize(); size_t rdPtr = record->getRdPtr(); size_t typeId = getTypeId(); if(record->getDataSize() != record->getRdPtr() && getTypeId() != rt_ANY_TYPE) { Log::warning(STR::int2str(record->getDataSize() - record->getRdPtr(), 10) + " unsigned chars were not processed while reading from " + record->getTypeString()); } parent->add_child(this->clone()); } return true; // Record reading OK }