예제 #1
0
파일: adt.cpp 프로젝트: yangjiao2/cs222
//len = len(RecordHeader + RecordContent)
//TODO: not enough length checking
RecordHeader RecordPage::allocRecordHeader(int len, int& slotID){
    slotID = -1;
    if (getFreelen() < len){
        cout<<"not enough space for RecordHeader";
        return RecordHeader();
    }
    for (int i = 0; i < get_rcdnum(); i++)
        if (isEmptyAt(i)) {
            slotID = i + 1;
            break;
        }
    if (slotID == -1){
        set_rcdnum(get_rcdnum() + 1);
        slotID = get_rcdnum();
    }
    set_offset(slotID - 1, get_freeptr());
    set_rcdlen(slotID - 1, len);
    set_freeptr(get_freeptr() + len);
    return RecordHeader(data + get_offset(slotID - 1));
}
    bool SocketManager::processRecordData()
    {
        RecordHeader header(m_recordHeader);

        if(m_socket->bytesAvailable() < header.payloadLength())
        {
            return false;
        }

        int expected = header.payloadLength();
        QByteArray data;
        while( data.size() <  expected ) {
            data.append( m_socket->read( expected - data.length() ) );
            if (m_socket->bytesAvailable() == 0 )
                m_socket->waitForReadyRead(5000);
        }

        qint64 bytesRead = data.length();

        if(bytesRead != header.payloadLength())
        {
            qFatal("Couldn't read payload - tried to read %d bytes, got %lld", header.payloadLength(), bytesRead);
        }

        switch(header.type())
        {
            case RecordHeader::BeginRequestRecord:
                beginRequest(data);
                break;
            case RecordHeader::ParametersRecord:
                if(!loadParameters(data))
                {
                    respond();
                }
                break;
            case RecordHeader::StandardInputRecord:
                readStandardInput(data);
                break;
            default:
                qFatal("Don't know how to deal with payload for type %s", ENUM_DEBUG_STRING(RecordHeader,RecordType,header.type()));
        }
        m_recordHeader = RecordHeader();
        return true;
    }
    bool SocketManager::processNewRecord()
    {
        if(m_socket->bytesAvailable() < FCGI_HEADER_LEN)
        {
            return false;
        }

        FCGI_Header fcgiHeader;
        qint64 bytesRead = m_socket->read(reinterpret_cast<char*>(&fcgiHeader), FCGI_HEADER_LEN);
        if(bytesRead != FCGI_HEADER_LEN)
        {
            qFatal("Couldn't read FCGI header - tried to read %d bytes, got %lld", FCGI_HEADER_LEN, bytesRead);
        }
        m_recordHeader = RecordHeader(fcgiHeader);
        if(m_socket->bytesAvailable() >= m_recordHeader.payloadLength())
        {
            processRecordData();
        }
        return true;
    }
    void SocketManager::respond()
    {
        const quint16 requestId = m_recordHeader.requestId();
        Stream* stream = new Stream(m_requestHeaders[requestId], requestId, m_socket, this);
        m_requestMap.insert(stream, requestId);
        m_streams[requestId] = stream;

        connect(
            stream,
            SIGNAL(destroyed(QObject*)),
            SLOT(cleanupStream(QObject*))
        );

        // in case we have more local data...
        m_recordHeader = RecordHeader();
        queueSocketCheck();


        // actually start the response
        emit newRequest(stream);
    }
예제 #5
0
파일: adt.cpp 프로젝트: yangjiao2/cs222
RecordHeader RecordPage::getRecordHeaderAt(int index){
    return RecordHeader(data + get_offset(index));
}