std::string& TCPPipe::read<std::string>( std::string& string) { /* Read the string's length: */ unsigned int length; bufferedRead(&length,sizeof(unsigned int)); if(readMustSwapEndianness) Misc::swapEndianness(length); /* Read the string in chunks (unfortunately, there is no API to read directly into the std::string): */ string.reserve(length+1); // Specification is not clear whether reserve() includes room for the terminating NUL character unsigned int lengthLeft=length; while(lengthLeft>0) { char buffer[256]; size_t readLength=lengthLeft; if(readLength>sizeof(buffer)) readLength=sizeof(buffer); bufferedRead(buffer,readLength); string.append(buffer,readLength); lengthLeft-=readLength; } return string; }
EMessage * EReader::readSingleMsg() { if (m_pClientSocket->usingV100Plus()) { int msgSize; if (!bufferedRead((char *)&msgSize, sizeof(msgSize))) return 0; msgSize = htonl(msgSize); if (msgSize <= 0 || msgSize > MAX_MSG_LEN) return 0; std::vector<char> buf = std::vector<char>(msgSize); if (!bufferedRead(buf.data(), buf.size())) return 0; return new EMessage(buf); } else { const char *pBegin = 0; const char *pEnd = 0; int msgSize = 0; while (msgSize == 0) { if (m_buf.size() >= m_nMaxBufSize * 3/4) m_nMaxBufSize *= 2; if (!processNonBlockingSelect() && !m_pClientSocket->isSocketOK()) return 0; pBegin = m_buf.data(); pEnd = pBegin + m_buf.size(); msgSize = EDecoder(m_pClientSocket->EClient::serverVersion(), &defaultWrapper).parseAndProcessMsg(pBegin, pEnd); } std::vector<char> msgData(msgSize); if (!bufferedRead(msgData.data(), msgSize)) return 0; if (m_buf.size() < IN_BUF_SIZE_DEFAULT && m_buf.capacity() > IN_BUF_SIZE_DEFAULT) { m_buf.resize(m_nMaxBufSize = IN_BUF_SIZE_DEFAULT); m_buf.shrink_to_fit(); } EMessage * msg = new EMessage(msgData); return msg; } }