bool CJsonOverUTTPWriter::CompleteMessage() { while (m_CurrentOutputNode.m_Node) { switch (m_CurrentOutputNode.m_Node.GetNodeType()) { case CJsonNode::eArray: if (!m_CurrentOutputNode.m_Iterator) { x_PopNode(); if (!m_UTTPWriter.SendControlSymbol(']')) return false; } else { CJsonIterator it(m_CurrentOutputNode.m_Iterator); if (!x_SendNode(*it)) { it.Next(); return false; } it.Next(); } break; case CJsonNode::eObject: if (!m_CurrentOutputNode.m_Iterator) { // TODO surround in a loop x_PopNode(); if (!m_UTTPWriter.SendControlSymbol('}')) return false; } else { if (!m_SendHashValue) { string key(m_CurrentOutputNode.m_Iterator.GetKey()); if (!m_UTTPWriter.SendChunk( key.data(), key.length(), false)) { m_SendHashValue = true; return false; } } else m_SendHashValue = false; CJsonIterator it(m_CurrentOutputNode.m_Iterator); if (!x_SendNode(*it)) { it.Next(); return false; } it.Next(); } break; default: /* case CJsonNode::eDouble: */ x_PopNode(); if (!m_UTTPWriter.SendRawData(&m_Double, sizeof(m_Double))) return false; } } m_UTTPWriter.SendControlSymbol(EOM_MARKER); return true; }
bool CJsonOverUTTPWriter::WriteMessage(const CJsonNode& root_node) { _ASSERT(!m_CurrentOutputNode.m_Node && m_OutputStack.empty()); m_SendHashValue = false; return x_SendNode(root_node) && CompleteMessage(); }