HttpConnection::ProcessResult HttpConnection::process() { ProcessResult result = PROCESS_RESULT_NOT_FOUND; switch (mState) { case STATE_PRE_METHOD: if (eatSpaces()) return PROCESS_RESULT_NOT_FOUND; mState = STATE_METHOD; // No break. case STATE_METHOD: { result = locateRegion(' ', '\r', &mMethod); if (result == PROCESS_RESULT_FOUND) mState = STATE_PRE_URI; } break; case STATE_PRE_URI: if (eatSpaces()) return PROCESS_RESULT_NOT_FOUND; mState = STATE_URI; // No break; case STATE_URI: { result = locateRegion(' ', '\r', &mUri); if (result == PROCESS_RESULT_FOUND) mState = STATE_PRE_VERSION; } break; case STATE_PRE_VERSION: if (eatSpaces()) return PROCESS_RESULT_NOT_FOUND; mState = STATE_VERSION; // No break; case STATE_VERSION: { WriteBuffer *version; result = locateRegion('\r', ' ', &version); if (result == PROCESS_RESULT_FOUND) { if (!handleVersion(version)) return PROCESS_RESULT_ERROR; HttpRequest::Embryo embryo(this, mMethod, mUri, version); mHttpRequest = mHttpServer->instantiateHttpRequest(&embryo); if (!mHttpRequest) mHttpRequest = new SimpleHttpRequest(&embryo, "501 Not Implemented"); delete mMethod; delete mUri; delete version; mState = STATE_REQUEST_LINE_EOL; } } break; case STATE_REQUEST_LINE_EOL: { if (mInputBuffer.pop() != '\n') return PROCESS_RESULT_ERROR; result = PROCESS_RESULT_FOUND; mState = STATE_PRE_KEY; } break; case STATE_PRE_KEY: if (eatSpaces()) return PROCESS_RESULT_NOT_FOUND; if (mInputBuffer.charAt(0) == '\r') { mInputBuffer.pop(); result = PROCESS_RESULT_FOUND; mState = STATE_HEADERS_END_EOL; break; } mState = STATE_KEY; // No break. case STATE_KEY: { result = locateRegion(':', '\r', &mMethod); if (result == PROCESS_RESULT_FOUND) mState = STATE_PRE_VALUE; } break; case STATE_PRE_VALUE: if (eatSpaces()) return PROCESS_RESULT_NOT_FOUND; mState = STATE_VALUE; // No break; case STATE_VALUE: { result = locateRegion('\r', '\n', &mUri); if (result == PROCESS_RESULT_FOUND) { handleHeader(mMethod, mUri); mHttpRequest->receiveHeader(mMethod, mUri); delete mMethod; delete mUri; mState = STATE_HEADER_EOL; } } break; case STATE_HEADER_EOL: { if (mInputBuffer.pop() != '\n') return PROCESS_RESULT_ERROR; result = PROCESS_RESULT_FOUND; mState = STATE_PRE_KEY; } break; case STATE_HEADERS_END_EOL: { if (mInputBuffer.pop() != '\n') return PROCESS_RESULT_ERROR; result = PROCESS_RESULT_FOUND; if (mHttpRequest->mDataLeft == 0) { mHttpRequest->receiveEnd(); mHttpRequest = 0; result = PROCESS_RESULT_REQUEST_END; } else { mState = STATE_DATA; } } break; case STATE_DATA: { if (mInputBuffer.length() > mHttpRequest->mDataLeft) { WriteBuffer *buffer = mInputBuffer.region(0, mHttpRequest->mDataLeft); mInputBuffer.popped(mHttpRequest->mDataLeft); mHttpRequest->mDataLeft = 0; mHttpRequest->receiveData(buffer); delete buffer; } else { mHttpRequest->receiveData(&mInputBuffer); mHttpRequest->mDataLeft -= mInputBuffer.length(); mInputBuffer.poppedAll(); } if (mHttpRequest->mDataLeft == 0) { mHttpRequest->receiveEnd(); mHttpRequest = 0; result = PROCESS_RESULT_REQUEST_END; } } break; } return result; }
void MainWindow::connectPixy(bool state) { if (state) // connect { try { if (m_pixyDFUConnected) // we're in programming mode { m_flash = new Flash(); if (m_argvFirmwareFile!="") program(m_argvFirmwareFile); else if (m_firmwareFile!="") { program(m_firmwareFile); m_firmwareFile = ""; } else { QString dir; QFileDialog fd(this); dir = m_settings->value("fw_dialog").toString(); fd.setWindowTitle("Select a Firmware File"); fd.setDirectory(QDir(dir)); fd.setNameFilter("Firmware (*.hex)"); if (fd.exec()) { QStringList slist = fd.selectedFiles(); if (slist.size()==1 && m_flash) { program(slist.at(0)); } } dir = fd.directory().absolutePath(); m_settings->setValue("fw_dialog", QVariant(dir)); } } else if (m_interpreter==NULL) { m_console->print("Pixy detected.\n"); clearActions(); m_interpreter = new Interpreter(m_console, m_video, &m_parameters, m_initScript); connect(m_interpreter, SIGNAL(runState(int)), this, SLOT(handleRunState(int))); connect(m_interpreter, SIGNAL(finished()), this, SLOT(interpreterFinished())); // thread will send finished event when it exits connect(m_interpreter, SIGNAL(connected(Device,bool)), this, SLOT(handleConnected(Device,bool))); connect(m_interpreter, SIGNAL(actionScriptlet(QString,QStringList)), this, SLOT(handleActionScriptlet(QString,QStringList))); connect(m_interpreter, SIGNAL(paramLoaded()), this, SLOT(handleLoadParams())); connect(m_interpreter, SIGNAL(version(ushort,ushort,ushort)), this, SLOT(handleVersion(ushort,ushort,ushort))); m_interpreter->start(); } m_pixyConnected = true; } catch (std::runtime_error &exception)