Ejemplo n.º 1
0
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());
}
Ejemplo n.º 2
0
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();
}