void Block::encode() { if (hasWire()) return; OBufferStream os; Tlv::writeVarNumber(os, type()); if (hasValue()) { Tlv::writeVarNumber(os, value_size()); os.write(reinterpret_cast<const char*>(value()), value_size()); } else if (m_subBlocks.size() == 0) { Tlv::writeVarNumber(os, 0); } else { size_t valueSize = 0; for (element_const_iterator i = m_subBlocks.begin(); i != m_subBlocks.end(); ++i) { valueSize += i->size(); } Tlv::writeVarNumber(os, valueSize); for (element_const_iterator i = m_subBlocks.begin(); i != m_subBlocks.end(); ++i) { if (i->hasWire()) os.write(reinterpret_cast<const char*>(i->wire()), i->size()); else if (i->hasValue()) { Tlv::writeVarNumber(os, i->type()); Tlv::writeVarNumber(os, i->value_size()); os.write(reinterpret_cast<const char*>(i->value()), i->value_size()); } else throw Error("Underlying value buffer is empty"); } } // now assign correct block m_buffer = os.buf(); m_begin = m_buffer->begin(); m_end = m_buffer->end(); m_size = m_end - m_begin; m_value_begin = m_buffer->begin(); m_value_end = m_buffer->end(); Tlv::readType(m_value_begin, m_value_end); Tlv::readVarNumber(m_value_begin, m_value_end); }
void SegmentFetcher::finalizeFetch() { // Combine segments into final buffer OBufferStream buf; // We may have received more segments than exist in the object. BOOST_ASSERT(m_receivedSegments.size() >= static_cast<uint64_t>(m_nSegments)); for (int64_t i = 0; i < m_nSegments; i++) { buf.write(m_receivedSegments[i].get<const char>(), m_receivedSegments[i].size()); } onComplete(buf.buf()); stop(); }