Пример #1
0
/**
  * Zpracuje a spravne zvoli akce podle doruceneho packetu
  */
void Thread::handleRequest()
{
    QByteArray rawdata = socket->readAll();

    Message message;
    ManipulateNet tool;
    PetriNet *petriNet = new PetriNet;
    XMLHandler xmlhandler;
    QList<PetriNet *> netList;

    xmlhandler.setMessage(&message);
    xmlhandler.setPetriNet(petriNet);
    xmlhandler.setNetList(&netList);
    xmlhandler.readMessage(QString(rawdata));
    Message resultMsg;
    XMLHandler resultXml;
    QString out;
    PetriNet *resultNet = new PetriNet;
    Simulate simulate;

    switch (message.command)
    {
    case Message::SLOGIN:
        break;
    case Message::CLOGIN:
        /* Pozadavek na prihlaseni uzivatele */
        if(!authenticate(message.user, message.password))
        {
            resultMsg.command = Message::WRONGLOGIN;
            resultXml.setMessage(&resultMsg);
        }
        else
        {
            resultMsg.command = Message::LOGGED;
            resultXml.setMessage(&resultMsg);
        }
        out = resultXml.writeMessage();
        rawdata = out.toUtf8();
        socket->write(rawdata);
        socket->flush();
        break;
    case Message::WRONGLOGIN:
        break;
    case Message::LOGGED:
        break;
    case Message::CLIST:
        /* Pozadavek na seznam siti */
        qDebug() << socketDescriptor << "Request for list of nets";
        tool.getNetList(this->getUsername(),&netList);
        if (tool.error)
        {
            /* Nastala chyba pri ukladani */
            resultMsg.command = Message::ERROR;
            resultMsg.errorText = "Error while getting list of nets";
        }
        else
        {
            resultMsg.command = Message::SLIST;
            resultXml.setNetList(&netList);
            resultXml.setMessage(&resultMsg);
        }
        resultXml.setMessage(&resultMsg);
        out = resultXml.writeMessage();
        rawdata = out.toUtf8();
        socket->write(rawdata);
        socket->flush();
        /* Dealokuju seznam siti */
        for (int i = 0; i < netList.size(); i++)
        {
            delete netList.at(i);
        }
        netList.clear();
        break;
    case Message::SLIST:
        break;
    case Message::SEND:
        break;
    case Message::ERROR:
        break;
    case Message::SAVE:
        /* Pozadavek na ulozeni site */
        qDebug() << socketDescriptor << "Request for save a net";
        tool.saveNet(petriNet->getName(),this->getUsername(),&xmlhandler);
        if (tool.error)
        {
            /* Nastala chyba pri ukladani */
            resultMsg.command = Message::ERROR;
            resultMsg.errorText = "Error while saving";
            writeLogSave(petriNet->getName(), "FAIL");
            resultXml.setMessage(&resultMsg);
            out = resultXml.writeMessage();
            rawdata = out.toUtf8();
            socket->write(rawdata);
            socket->flush();
        }
        else
        {
            writeLogSave(petriNet->getName(), "PASS");
        }

        break;
    case Message::LOAD:
        /* Pozadavek na nacteni site */
        qDebug() << socketDescriptor << "Request for load the net";

        tool.loadNet(petriNet->getName(),this->getUsername(),petriNet->getVersion(),petriNet);
        if (tool.error)
        {
            /* Nastala chyba pri cteni, sit neexistuje? */
            resultMsg.command = Message::ERROR;
            resultMsg.errorText = "Error while loading, perhaps the net does not exist";
            writeLogLoad(petriNet->getName(), "FAIL");
        }
        else
        {
            /* Sit byla uspesne otevrena */
            resultMsg.command = Message::SEND;
            resultXml.setPetriNet(petriNet);
            writeLogLoad(petriNet->getName(), "PASS");
        }

        /* At uz se stala chyba nebo ne, vse je treba zabalit a odeslat */
        resultXml.setMessage(&resultMsg);
        out = resultXml.writeMessage();
        rawdata = out.toUtf8();
        socket->write(rawdata);
        socket->flush();
        break;
    case Message::SIMULATE:
        /* Pozadavek na simulaci */
        qDebug() << socketDescriptor << "Request for the simulation";
        if (message.simulationSteps == 0)
        {
            simulate.simulateAll(petriNet);
        }
        else
        {
            if(!simulate.simulateStep(petriNet))
            {
                simulate.error = true;
            }
        }

        if (simulate.error)
        {
            /* Nastala chyba pri simulaci */
            resultMsg.command = Message::ERROR;
            resultMsg.errorText = "Error while simulation, perhaps there aren't any possible steps";
            writeLogSimulate(petriNet->getName(),petriNet->getVersion(),"FAIL");
        }
        else
        {
            /* Sit byla v poradku odsimulovana */
            resultMsg.command = Message::SEND;
            resultXml.setPetriNet(petriNet);
            writeLogSimulate(petriNet->getName(),petriNet->getVersion(),"PASS");
        }

        /* Zprava bude odeslana */
        resultXml.setMessage(&resultMsg);
        out = resultXml.writeMessage();
        rawdata = out.toUtf8();
        socket->write(rawdata);
        socket->flush();
        break;
    case Message::LOG:
        /* Klient zada o log */
        qDebug() << socketDescriptor << "Request for logs";
        resultMsg.user = getUsername();
        resultMsg.command = message.command;
        resultXml.setMessage(&resultMsg);
        out = resultXml.writeMessage();
        rawdata = out.toUtf8();
        socket->write(rawdata);
        socket->flush();
        break;
    }
    delete petriNet; // maže se opravdu vždycky?
    delete resultNet;
}