Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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);
}