bool qws_read_command( QWSSocket *socket, char *&simpleData, int &simpleLen, char *&rawData, int &rawLen, int &bytesRead ) { if ( rawLen == -1 ) { if ( socket->size() < sizeof( rawLen ) ) return FALSE; rawLen = qws_read_uint( socket ); } if ( !bytesRead ) { if ( simpleLen ) { if ( socket->size() < uint(simpleLen) ) return FALSE; bytesRead = socket->readBlock( simpleData, simpleLen ); } else bytesRead = 1; // hack! } if ( bytesRead ) { if ( !rawLen ) return TRUE; if ( socket->size() < uint(rawLen) ) return FALSE; rawData = new char[ rawLen ]; bytesRead += socket->readBlock( rawData, rawLen ); return TRUE; } return FALSE; }
bool qws_read_command(QIODevice *socket, char *&simpleData, int &simpleLen, char *&rawData, int &rawLen, int &bytesRead) { // read rawLen if (rawLen == -1) { rawLen = qws_read_uint(socket); if (rawLen == -1) return false; } // read simpleData, assumes socket is capable of buffering all the data if (simpleLen && !rawData) { if (socket->bytesAvailable() < uint(simpleLen)) return false; int tmp = socket->read(simpleData, simpleLen); Q_ASSERT(tmp == simpleLen); Q_UNUSED(tmp); } if (rawLen > MAX_COMMAND_SIZE) { socket->close(); qWarning("qws_read_command: Won't read command of length %d, " "connection closed.", rawLen); return false; } // read rawData if (rawLen && !rawData) { rawData = new char[rawLen]; bytesRead = 0; } if (bytesRead < rawLen && socket->bytesAvailable()) bytesRead += socket->read(rawData + bytesRead, rawLen - bytesRead); return (bytesRead == rawLen); }