MojErr MojSocketMessageParser::readFromSocket(MojSockT sock, MojRefCountedPtr<MojSocketMessage>& msgOut, bool& completeOut) { MojErr err = MojErrNone; MojAssert(sock != -1); completeOut = false; while (m_headerBytes < sizeof(m_header)) { MojInt32 sz = recv(sock, m_headerBuf+m_headerBytes, sizeof(m_header) - m_headerBytes, 0); MojParserRecvCheck(sz); m_headerBytes += sz; if (m_headerBytes == sizeof(m_header)) { MojDataReader reader(m_headerBuf, m_headerBytes); err = m_header.read(reader); MojErrCheck(err); m_messageData = new MojByte[m_header.messageLen()]; MojAllocCheck(m_messageData); } } while (m_messageBytesRead < m_header.messageLen()) { MojInt32 sz = recv(sock, m_messageData + m_messageBytesRead, m_header.messageLen() - m_messageBytesRead, 0); MojParserRecvCheck(sz); m_messageBytesRead += sz; } msgOut.reset(new MojSocketMessage); if (!msgOut.get()) { err = MojErrNoMem; MojErrGoto(err, done); } MojSize cbConsumed; err = msgOut->extract(m_messageData, m_header.messageLen(), cbConsumed); MojErrGoto(err, done); if (m_header.messageLen() != cbConsumed) { err = MojErrInvalidMsg; MojErrGoto(err, done); } completeOut = true; done: if (m_messageData) { delete[] m_messageData; m_messageData = NULL; } return err; }