//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); }
RecordHeader RecordPage::getRecordHeaderAt(int index){ return RecordHeader(data + get_offset(index)); }