CNodeLiveWriterRef CNodeLiveWriter::AddChildNode( const char* pChildName ) { assert( !m_done && m_valid ); m_totalAmountChildren++; // only 1 child can be not done at any time if (!m_children.empty()) { CNodeLiveWriter* pPreviousChild = m_Writer.GetNodeLive( m_children.back()); if (!pPreviousChild->IsDone()) pPreviousChild->Done(); } assert( m_children.size() <= CHILDREN_PER_BLOCK ); if (m_children.size() == CHILDREN_PER_BLOCK) CompactPendingChildren(); // CNodeLiveWriter* pChild = m_Writer.CreateAndAddLiveNode( pChildName ); m_children.push_back( pChild->GetID()); pChild->SetParent( GetID()); return CNodeLiveWriterRef( m_Writer, pChild->GetID()); }
void CNodeLiveWriter::Done() { assert( !m_done && m_valid ); m_done = true; int numChildren = m_children.size(); for (int i = 0; i < numChildren; ++i) { CNodeLiveWriter* pChild = m_Writer.GetNodeLive( m_children[i] ); if (!pChild->IsDone()) pChild->Done(); } if (!m_childrenAreCompacted) { CompactPendingChildren(); m_childrenAreCompacted = true; } if (m_IDParent != XMLCPB_INVALID_ID) { CNodeLiveWriter* pParent = m_Writer.GetNodeLive( m_IDParent ); pParent->ChildIsDone(); } else { Compact(); } }
void CWriter::Done() { CNodeLiveWriter* pRoot = GetNodeLive( XMLCPB_ROOTNODE_ID ); if (!pRoot->IsDone()) pRoot->Done(); }