void DataStream_SequenceBase::WriteRecordSequenceL(DataStream *target, BOOL start_after, DataStream *start_with_this, DataStream *stop_after_this) { DS_DEBUG_Start(); OP_ASSERT(target != this); int stepw = 0; DataStream *item = First(); DS_Debug_Printf0("------------ Starting to Write Record ------------\n"); if(start_with_this) { // Fast Forward while(item) { if(item == start_with_this && !start_after) break; if(item == stop_after_this) return; item = item->Suc(); stepw++; if(item && start_with_this == item->Pred()) break; } } WriteActionL(stepw++, (item && item->Pred() ? item->Pred()->GetItemID() : (uint32) DataStream_SequenceBase::STRUCTURE_START)); while(item) { if(item->GetEnabledRecord()) item->WriteRecordL(GetOutputTarget(target)); WriteActionL(stepw++, item->GetItemID()); BOOL is_last_element = (item == stop_after_this ? TRUE : FALSE); item = item->Suc(); if(item && is_last_element) { DS_Debug_Printf0("------------ Finished Writing Record (1) ------------\n"); return; } } WriteActionL(stepw++, DataStream_SequenceBase::STRUCTURE_FINISHED); DS_Debug_Printf0("------------ Finished Writing Record ------------\n"); }
void DataStream_SequenceBase::PerformActionL(DataStream::DatastreamAction action, uint32 arg1, uint32 arg2) { switch(action) { case DataStream::KResetRead: case DataStream::KResetRecord: { step = 0; current_item = NULL; DataStream *item = First(); while(item) { item->PerformActionL(action,arg1, arg2); item = item->Suc(); } } break; case DataStream::KFinishedAdding: { DataStream *item = First(); while(item) { if(item->GetEnabledRecord() && !item->Finished()) item->PerformActionL(DataStream::KFinishedAdding); item = item->Suc(); } } break; case DataStream::KWriteAction: if(arg2 == (uint32) DataStream_SequenceBase::STRUCTURE_START) { DataStream *item = First(); while(item) { item->PerformActionL(DataStream::KWriteAction, 0, (uint32) DataStream_SequenceBase::STRUCTURE_START); item = item->Suc(); } } break; } DataStream::PerformActionL(action, arg1, arg2); }
uint32 DataStream_SequenceBase::GetAttribute(DataStream::DatastreamUIntAttribute attr) { switch(attr) { case DataStream::KFinished: return !current_item; // Also returns finsihed on non-started items case DataStream::KCalculateLength: { uint32 len = 0; DataStream *item = First(); while(item) { if(item->GetEnabledRecord()) len += item->CalculateLength(); item = item->Suc(); } return len; } } return DataStream::GetAttribute(attr); }