예제 #1
0
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;
}
예제 #2
0
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)