Esempio n. 1
0
// 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);
	}
}
Esempio n. 2
0
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
}