void ArchiveXML::DeserializeArray( ArrayPusher& push, uint32_t flags ) { if ( m_Iterator.GetCurrent()->GetFirstChild() ) { // advance to the first child (the first array element) m_Iterator.Advance(); #ifdef REFLECT_ARCHIVE_VERBOSE m_Indent.Get(stdout); Log::Print(TXT("Deserializing objects\n")); m_Indent.Push(); #endif for ( XMLElement* sibling = m_Iterator.GetCurrent(); sibling != NULL; sibling = sibling->GetNextSibling() ) { HELIUM_ASSERT( m_Iterator.GetCurrent() == sibling ); ObjectPtr object; DeserializeInstance(object); if (object.ReferencesObject()) { if ( object->IsClass( m_SearchClass ) ) { m_Skip = true; } if ( flags & ArchiveFlags::Status ) { ArchiveStatus info( *this, ArchiveStates::ObjectProcessed ); #pragma TODO("Update progress value for inter-array processing") //info.m_Progress = (int)(((float)(current - start_offset) / (float)m_Size) * 100.0f); e_Status.Raise( info ); m_Abort |= info.m_Abort; } } push( object ); } } else { // advance to the next element m_Iterator.Advance(); } #ifdef REFLECT_ARCHIVE_VERBOSE m_Indent.Pop(); #endif if ( flags & ArchiveFlags::Status ) { ArchiveStatus info( *this, ArchiveStates::ObjectProcessed ); info.m_Progress = 100; e_Status.Raise( info ); } }
void ArchiveBinary::DeserializeArray( ArrayPusher& push, uint32_t flags ) { uint32_t start_offset = (uint32_t)m_Stream->TellRead(); int32_t element_count = -1; m_Stream->Read(&element_count); #ifdef REFLECT_ARCHIVE_VERBOSE m_Indent.Get(stdout); Log::Debug(TXT("Deserializing %d objects\n"), element_count); m_Indent.Push(); #endif if (element_count > 0) { for (int i=0; i<element_count && !m_Abort; i++) { ObjectPtr object; DeserializeInstance(object); if (object.ReferencesObject()) { if ( object->IsClass( m_SearchClass ) ) { m_Skip = true; } if ( flags & ArchiveFlags::Status ) { uint32_t current = (uint32_t)m_Stream->TellRead(); ArchiveStatus info( *this, ArchiveStates::ObjectProcessed ); info.m_Progress = (int)(((float)(current - start_offset) / (float)m_Size) * 100.0f); e_Status.Raise( info ); m_Abort |= info.m_Abort; } } push( object ); } } #ifdef REFLECT_ARCHIVE_VERBOSE m_Indent.Pop(); #endif if (!m_Abort) { int32_t terminator = -1; m_Stream->Read(&terminator); if (terminator != -1) { throw Reflect::DataFormatException( TXT( "Unterminated object array block (%s)" ), m_Path.c_str() ); } } if ( flags & ArchiveFlags::Status ) { ArchiveStatus info( *this, ArchiveStates::ObjectProcessed ); info.m_Progress = 100; e_Status.Raise( info ); } }