X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=src%2Fkernel%2Fkernel.cpp;h=0ac3ba7f21806a3a9198d38ceecc30f2b7ec47c0;hb=refs%2Ftags%2F3.1.2-a4;hp=95608909f8cac15cb4cf9b3cc3e69996bbf2d263;hpb=5555358d0a45e52323949c1afed2b6a3cdfc12d1;p=vlp.git diff --git a/src/kernel/kernel.cpp b/src/kernel/kernel.cpp index 9560890..0ac3ba7 100644 --- a/src/kernel/kernel.cpp +++ b/src/kernel/kernel.cpp @@ -30,36 +30,27 @@ ************************************************************/ -#include -//#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include -#include -#include +#include +#include #include -#include #include #include @@ -67,167 +58,65 @@ #include #include "genint1.h" -#include "comm.h" #include "socu.h" #include #include -#define GPATH "loggr" -#define IPATH "logi" -#define NPATH "logn" -#define REMOTE_PATH "REMOTE" -#define MAXINTERP 20 -#define MAXINSTANCES 256 +#include "kernel.h" +#include "send-message.h" +#include "kill-interpreter.h" +#include "options.h" - -#define MESG_COL 0 -#define WARN_COL 1 -#define NORM_COL 2 +/* File resides in top directory (where are Makefiles)*/ +#include "../../config.h" char CharLine[25] = "________________________"; char myargs[5][255]; +//QApplication *app; -/* --------------- interpreter slot -----------------*/ -class InterpEntry { -public: - /* INT identifier */ - int ID; - /* Am I remote ? */ - bool remote; - /* Program name */ - char fullname[255]; - char shortname[255]; - - /* Socket */ - int sock; - QSocketNotifier *notify; - /* IDs of my remote INT modules */ - int RInstances[MAXINSTANCES]; - /* parent INT info */ - ctx_struct p_ctx; -}; -/*++++++++++++++++++++++++++++++++++++++++++*/ - -/*----------------- connection slot -------------*/ -class ConnectEntry { -public: - char addr[256]; - - ConnectEntry(char *s) { - strcpy(addr, s); - }; -}; - -/* ++++++++++++++++++++++++++++++++++++++++++ */ - -QApplication *app; - - -/* ---------------------------------------------------------- */ -/* KERNEL CLASS DEFINITION */ -/* ---------------------------------------------------------- */ - -class QKernel : public QFrame { - Q_OBJECT -public: - QMultiLineEdit *desktop; - QMenuBar *bar; - QPopupMenu *p; - QPopupMenu *p1; - QPopupMenu *p2; - char progdir[256]; - int NodeNumber; - int ConType; - - QKernel(); - - virtual void resizeEvent(QResizeEvent *ev); - - void WriteMessage(char* msg); - void InitMessage(); - -public slots: - void n_impl(); - void Run_Prog(); - void Edit(); - void Help(); - void SetOptions(); - void AddAddress(); - void DelAddress(); - void LockConsole(); - void UnlockConsole(); - void MessageToNode(); - void QuitProc(); - void NetMessage(); - void IntMessage(int); - void KillInterpreter(); - void Disconnect(); - void SetMessages(); - void Connect(); - void Info(); - -protected: - virtual void closeEvent (QCloseEvent * e); - -private: - QList Interpreters; - QList ConnectList; - QListBox *connections; - - /** - * number of working interpreters - */ - int Tasks; - - /** - * number of connected VLPs - */ - int ActiveConnections; - bool LOCKED; - bool synchro; - bool wait_for_info; - char LockPasswd[25]; - int lockid; - int unlockid; - int qid; - int cwid; - int optid; - int prid; - int mid; - int msgid; - int toolsid; - int hid; - - int net_sock; - int freeINTid; - QSocketNotifier *Net_Notify; - char HomeDir[255]; - bool info_messages; - - void LoadConfig(char *); - void RunGraphModule(char*); - void RunNetModule(); - InterpEntry *findINTbySocket(int); - InterpEntry *findINTbyID(int); - InterpEntry *RunIntModule(char *ss, int r); - void RemoteInstance(InterpEntry*, int); - void CloseInstances(InterpEntry*); -}; -/* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ - -void QKernel::closeEvent (QCloseEvent * e) +/** + * Event invoked on program close. + * Closes application. Displays additional window to confirm exit. + */ +void QKernel::closeEvent(QCloseEvent * e) { e->ignore(); + + if (!LOCKED) { + QuitProc(); + } +} + +void QKernel::setLocked(bool locked) +{ + LOCKED = locked; + + actionExecute->setDisabled(locked); + actionKill->setDisabled(locked); + actionConnect->setDisabled(locked); + actionDisconnect->setDisabled(locked); + actionInfo_messages->setDisabled(locked); + actionMessage->setDisabled(locked); + + /* Enable only menu entry for unlocking */ + actionEditor->setDisabled(locked); + actionOptions->setDisabled(locked); + actionLock_Console->setDisabled(locked); + actionUnlock_console->setEnabled(locked); } -QKernel::QKernel() +/** + * Kernel program constructor. + * Prepares everything to work. + */ +QKernel::QKernel(QWidget *parent) + : QMainWindow(parent) { - QFont f("Helvetica", 10, QFont::Bold); - QFont f1("Helvetica", 10, QFont::Normal); - QFont f2("Times Roman", 10, QFont::Normal); + setupUi(this); + QDir q(REMOTE_PATH); char ss[255]; @@ -239,50 +128,9 @@ QKernel::QKernel() info_messages = TRUE; wait_for_info = FALSE; - setCaption("Virtual LOGLAN Processor"); - setBackgroundColor(white); - - bar = new QMenuBar(this); - bar->setFont(f); - p = new QPopupMenu(); - p->setFont(f2); - p->insertItem("Execute", this, SLOT(Run_Prog())); - p->insertItem("Kill", this, SLOT(KillInterpreter())); - prid = bar->insertItem("&Program", p); - p1 = new QPopupMenu(); - p1->insertItem("Message", this, SLOT(MessageToNode())); - p1->insertSeparator(); - p1->insertItem("Connect", this, SLOT(Connect())); - p1->insertItem("Disconnect", this, SLOT(Disconnect())); - p1->insertItem("Info", this, SLOT(Info())); - p1->setFont(f); - mid = bar->insertItem("&Machine", p1); - - p2 = new QPopupMenu(); - cwid = p2->insertItem("Editor", this, SLOT(Edit())); - hid = p2->insertItem("Help", this, SLOT(Help())); - p2->insertSeparator(); - optid = p2->insertItem("Options", this, SLOT(SetOptions())); - msgid = p2->insertItem("Info messages", this, SLOT(SetMessages())); - p2->setItemChecked(msgid, TRUE); - p2->insertSeparator(); - lockid = p2->insertItem("Lock console", this, SLOT(LockConsole())); - unlockid = p2->insertItem("Unlock console", this, - SLOT(UnlockConsole())); - p2->setItemEnabled(unlockid, FALSE); - LOCKED = FALSE; - p2->setFont(f); - toolsid = bar->insertItem("&Tools", p2); - - qid = bar->insertItem("&Quit", this, SLOT(QuitProc())); - p->setFont(f); + setWindowTitle(PACKAGE_NAME); - desktop = new QMultiLineEdit(this, "desktop"); - desktop->setAutoUpdate(TRUE); - desktop->setReadOnly(TRUE); - desktop->setFont(f1); - - resize(400, 200); + LOCKED = FALSE; Tasks = 0; freeINTid = 1; ActiveConnections = 0; @@ -294,23 +142,19 @@ QKernel::QKernel() connect(Net_Notify, SIGNAL(activated(int)), this, SLOT(NetMessage())); } -void QKernel::resizeEvent(QResizeEvent *ev) -{ - QFrame::resizeEvent(ev); - if (desktop) - desktop->setGeometry(0, bar->height(), width(), - height() - bar->height()); -} - +/** + * Displays window with information about not implemented functionality. + */ void QKernel::n_impl() { QMessageBox::information(this, "Function info", "This function is not " "implemented yet...", "Ok"); } - -/* ########### load configuration from file ############# */ - +/** + * Loads configuration from the given file. + * @param fname Filename of the configuration file. + */ void QKernel::LoadConfig(char * fname) { config_t cfg; @@ -336,7 +180,7 @@ void QKernel::LoadConfig(char * fname) config_error_line(&cfg)); config_destroy(&cfg); fclose(file); - exit(3);/* from original code. */ + exit(3); } setting = config_lookup(&cfg, "node_number"); @@ -409,24 +253,30 @@ void QKernel::LoadConfig(char * fname) config_destroy(&cfg); fclose(file); } -/* +++++++++++++++++++++++++++++++++++++++++++++++ */ -void QKernel::Run_Prog() +/** + * Executes program. + * Additional window id displayed to set which code to execute. + */ +void QKernel::on_actionExecute_triggered() { int i; - QString s(QFileDialog::getOpenFileName(progdir, "*.log", this)); - + QString s = QFileDialog::getOpenFileName(this, "Execute", progdir, "*.log"); + if (!s.isNull()) { - i = s.find(".log"); - + i = s.indexOf(".log"); + if (i > 0) s.remove(i, 4); - - RunIntModule((char*)s.ascii(), 0); + + RunIntModule((char*)s.toAscii().data(), 0); } } -void QKernel::Edit() +/** + * Invokes editor program + */ +void QKernel::on_actionEditor_triggered() { char cmd[255]; sprintf(cmd, "%s/modules/logedit %s %s %s %s %s %s &", HomeDir, HomeDir, @@ -434,38 +284,42 @@ void QKernel::Edit() system(cmd); } -void QKernel::Help() +/** + * Invokes help program + */ +void QKernel::on_actionHelp_triggered() { char cmd[255]; - sprintf(cmd, "%s/modules/loghelp %s/doc %s %s %s %s %s &", HomeDir, + sprintf(cmd, "%s/modules/loghelp %s/doc %s %s %s %s %s &", HomeDir, HomeDir, myargs[0], myargs[1], myargs[2], myargs[3], myargs[4]); system(cmd); } - +/** + * Invokes graphics module + */ void QKernel::RunGraphModule(char *sk) { char cmd[255]; - sprintf(cmd, "%s/modules/loggraph %s %s %s %s %s %s", HomeDir, sk, - myargs[0], myargs[1], myargs[2], myargs[3], myargs[4]); - strcat(cmd, " &"); + sprintf(cmd, "%s/modules/loggraph %s %s %s %s %s %s &", HomeDir, + sk, myargs[0], myargs[1], myargs[2], myargs[3], myargs[4]); if (system(cmd) != 0) WriteMessage("Cannot connect GRAPH resources"); } - - +/** + * Invokes net module + */ void QKernel::RunNetModule() { struct sockaddr_un svr; int len, on; int sock; char cmd[255]; - sprintf(cmd, "%s/modules/lognet %s %s %s %s %s %s", HomeDir, NPATH, - myargs[0], myargs[1], myargs[2], myargs[3], myargs[4]); - strcat(cmd, " &"); + sprintf(cmd, "%s/modules/lognet %s %s %s %s %s %s &", HomeDir, + NPATH, myargs[0], myargs[1], myargs[2], myargs[3], myargs[4]); /* -------- socket for NET module -------- */ unlink(NPATH); @@ -502,16 +356,19 @@ void QKernel::RunNetModule() } } -void QKernel::Connect() +/** + * Connects to the specified address + * Additional window is displayed to connect to the specified address + */ +void QKernel::on_actionConnect_triggered() { - QDialog d(this, "", TRUE); - QLabel lab(&d, "IP Address:"); - QLineEdit ed(&d, ""); - QPushButton ob(&d, ""); - QPushButton cb(&d, ""); + QDialog d(this, Qt::Dialog); + QLabel lab("IP Address:", &d); + QLineEdit ed("", &d); + QPushButton ob("", &d); + QPushButton cb("", &d); MESSAGE m; - d.setFont(QFont("Helvetica", 12, QFont::Bold)); ob.setGeometry(30, 60, 80, 30); ob.setText("Ok"); ob.setDefault(TRUE); @@ -527,12 +384,15 @@ void QKernel::Connect() if (d.exec()) { m.msg_type = MSG_NET; m.param.pword[0] = NET_CONNECT_TO; - strcpy(m.param.pstr, ed.text()); + strcpy(m.param.pstr, ed.text().toAscii().data()); write(net_sock, &m, sizeof(MESSAGE)); } } -void QKernel::Disconnect() +/** + * Disconnects from virtual machine + */ +void QKernel::on_actionDisconnect_triggered() { MESSAGE msg; @@ -544,151 +404,74 @@ void QKernel::Disconnect() write(net_sock, &msg, sizeof(MESSAGE)); } +/** + * Quits process. Closes VLP. Shows additional window to confirm exit. + */ void QKernel::QuitProc() { MESSAGE msg; - if (QMessageBox::question(this, "Close VLP", "Terminate VLP ?", - QMessageBox::Yes, QMessageBox::No, 0) == QMessageBox::No) { - return; - } - - if (!LOCKED) { - /* - msg.msg_type = MSG_NET; - msg.param.pword[0] = NET_DISCONNECT; - write(net_sock, &msg, sizeof(MESSAGE));*/ - delete Net_Notify; - - msg.msg_type = MSG_NET; - msg.param.pword[0] = NET_EXIT; - write(net_sock, &msg, sizeof(MESSAGE)); - /* ::close(net_sock);*/ - app->quit(); - } -} + QMessageBox::StandardButton response; + response = QMessageBox::question(this, "Close VLP", "Terminate VLP ?", + QMessageBox::Ok | QMessageBox::Cancel); -void QKernel::AddAddress() -{ - QDialog d(this, "", TRUE); - QLabel lab(&d, "IP Address:"); - QLineEdit ed(&d, ""); - QPushButton ob(&d, ""); - QPushButton cb(&d, ""); - - if (connections) { - ob.setGeometry(30, 60, 80, 30); - ob.setText("Ok"); - ob.setDefault(TRUE); - lab.setGeometry(10, 10, 60, 30); - lab.setText("Address"); - ed.setGeometry(70, 10, 140, 30); - cb.setGeometry(130, 60, 80, 30); - cb.setText("Cancel"); - d.resize(240, 100); - connect(&ob, SIGNAL(clicked()), &d, SLOT(accept())); - connect(&cb, SIGNAL(clicked()), &d, SLOT(reject())); - if (d.exec()) - if (strcmp(ed.text(), "") != 0) { - connections->insertItem(ed.text()); - } - } -} -void QKernel::DelAddress() -{ - if (connections) { - if (connections->currentItem() != -1) - connections->removeItem(connections->currentItem()); + if (response == QMessageBox::Cancel) { + return; } + /* + msg.msg_type = MSG_NET; + msg.param.pword[0] = NET_DISCONNECT; + write(net_sock, &msg, sizeof(MESSAGE));*/ + delete Net_Notify; + + msg.msg_type = MSG_NET; + msg.param.pword[0] = NET_EXIT; + write(net_sock, &msg, sizeof(MESSAGE)); + /* ::close(net_sock);*/ + QApplication::instance()->quit(); } -void QKernel::MessageToNode() +/** + * Sends message to node. + * Additional window is displayed to set Node Number of node where send message, + * and textfield to enter message. + */ +void QKernel::on_actionMessage_triggered() { - QDialog *dlg; - QLineEdit *nodenr; MESSAGE m; - - dlg = new QDialog(this, "Message", TRUE); - - nodenr = new QLineEdit(dlg, "number"); - nodenr->setGeometry(90, 10, 50, 30); - nodenr->setText(""); - - QLabel *tmpQLabel; - tmpQLabel = new QLabel(dlg, "Label_1"); - tmpQLabel->setGeometry(10, 10, 77, 30); - tmpQLabel->setText("Node number:"); - - tmpQLabel = new QLabel(dlg, "Label_2"); - tmpQLabel->setGeometry(10, 50, 70, 30); - tmpQLabel->setText("Message:"); - - QLineEdit *msg; - msg = new QLineEdit(dlg, "LineEdit_1"); - msg->setGeometry(80, 60, 330, 30); - msg->setText(""); - - QPushButton *ob; - ob = new QPushButton(dlg, "PushButton_1"); - ob->setGeometry(230, 10, 80, 30); - ob->setText("Send"); - ob->setDefault(TRUE); - - QPushButton *cb; - cb = new QPushButton(dlg, "PushButton_2"); - cb->setGeometry(330, 10, 80, 30); - cb->setText("Cancel"); - dlg->resize(430, 110); - connect(ob, SIGNAL(clicked()), dlg, SLOT(accept())); - connect(cb, SIGNAL(clicked()), dlg, SLOT(reject())); - dlg->setCaption("Send message to node"); + SendMessageDialog *dlg; + dlg = new SendMessageDialog(this, Qt::Dialog); if (dlg->exec()) { m.msg_type = MSG_NET; m.param.pword[0] = NET_PROPAGATE; m.param.pword[1] = MSG_VLP; m.param.pword[2] = NodeNumber; - m.param.pword[4] = atoi(nodenr->text()); + m.param.pword[4] = dlg->getNodeNumber(); m.param.pword[6] = VLP_WRITE; - strcpy(m.param.pstr, msg->text()); + strcpy(m.param.pstr, dlg->getMessage().toAscii().data()); write(net_sock, &m, sizeof(MESSAGE)); } } -void QKernel::KillInterpreter() +/** + * Kills interpreter. + * Additional window is displayed to get ID of interpreter which should be + * killed. + */ +void QKernel::on_actionKill_triggered() { - QDialog *dlg; - QLineEdit *nodenr; MESSAGE m; InterpEntry *pom; + KillInterpreterDialog *dlg; + + dlg = new KillInterpreterDialog(this, Qt::Dialog); - dlg = new QDialog(this, "Message", TRUE); - - nodenr = new QLineEdit(dlg, "number"); - nodenr->setGeometry(90, 10, 50, 30); - nodenr->setText(""); - - QLabel* tmpQLabel; - tmpQLabel = new QLabel(dlg, "Label_1"); - tmpQLabel->setGeometry(10, 10, 77, 30); - tmpQLabel->setText("Interp. ID:"); - QPushButton* ob, *cb; - ob = new QPushButton(dlg, "PushButton_1"); - ob->setGeometry( 160, 10, 80, 30); - ob->setText("Kill"); - ob->setDefault(TRUE); - cb = new QPushButton(dlg, "PushButton_2"); - cb->setGeometry(260, 10, 80, 30); - cb->setText("Cancel"); - dlg->resize(360, 50); - connect(ob, SIGNAL(clicked()), dlg, SLOT(accept())); - connect(cb, SIGNAL(clicked()), dlg, SLOT(reject())); - dlg->setCaption("Kill interpreter"); if (dlg->exec()) { m.msg_type = MSG_INT; m.param.pword[0] = INT_KILL; - pom = findINTbyID(atoi(nodenr->text())); + pom = findINTbyID(dlg->getNodeNumber()); if (pom != NULL) { if (!(pom->remote)) write(pom->sock, &m, sizeof(MESSAGE)); @@ -702,8 +485,9 @@ void QKernel::KillInterpreter() } } - - +/** + * Sends message to the net module. + */ void QKernel::NetMessage() { @@ -724,7 +508,7 @@ void QKernel::NetMessage() case MSG_INT: /* pom = find_link_by_ID(msg.param.pword[5]); msg.msg_type = MSG_NET; - msg.param.pword[0] = NET_PROPAGATE; + msg.param.pword[0] = NET_PROPAGATE; send_int(pom, &msg);*/ break; case MSG_VLP: @@ -773,7 +557,7 @@ void QKernel::NetMessage() WriteMessage("Instance not found"); } break; - } /* VLP switch */ + } /* VLP switch */ }/* switch */ break; case NET_CONNECTIONS: @@ -788,11 +572,11 @@ void QKernel::NetMessage() QString poms, poms1, poms2; poms.sprintf("%s", msg.param.pstr); while (poms.length() > 0) { - cnt = poms.find(';'); + cnt = poms.indexOf(';'); if (cnt!=-1) { poms1 = poms.left(cnt); poms = poms.right(poms.length() - cnt - 1); - cnt = poms1.find('='); + cnt = poms1.indexOf('='); if (cnt != -1) { poms2 = poms1.left(cnt); poms1 = poms1.right( @@ -813,6 +597,10 @@ void QKernel::NetMessage() } } +/** + * Sends message to the interpreter program. + * @param sock Interpreter socket to whom the message will be send. + */ void QKernel::IntMessage(int sock) { MESSAGE msg; @@ -851,8 +639,9 @@ void QKernel::IntMessage(int sock) if (e->remote == 0) CloseInstances(e); delete e->notify; - ::close(e->sock); - Interpreters.remove(e); + ::close(e->sock); + /* TODO: Check this */ + Interpreters.removeOne(e); delete e; if (info_messages) { @@ -874,17 +663,22 @@ void QKernel::IntMessage(int sock) write(sock, &msg, sizeof(MESSAGE)); break; }; - break; /* switch param.pword[0] */ - } /* switch type */ - } /* if */ + break; + } + } } +/** + * Writes message to kernel logger. + * @parame msg String with message to log + */ void QKernel::WriteMessage(char *msg) { int x; int y; + x = desktop->textCursor().blockNumber(); + y = desktop->textCursor().columnNumber(); - desktop->getCursorPosition(&x, &y); if (x > 100) { desktop->clear(); } @@ -892,120 +686,50 @@ void QKernel::WriteMessage(char *msg) desktop->setReadOnly(FALSE); desktop->append(msg); desktop->setReadOnly(TRUE); - desktop->setCursorPosition(desktop->numLines(), 1); + + QTextCursor tmpCursor = desktop->textCursor(); + tmpCursor.movePosition(QTextCursor::End, QTextCursor::MoveAnchor); + desktop->setTextCursor(tmpCursor); + desktop->repaint(); - if (desktop->numLines() > 100) { + if (desktop->document()->blockCount() > 100) { desktop->clear(); } } -void QKernel::SetMessages() +/** + * Adds checkbox to menu item. If it is checked additional info messages are + * shown. + */ +void QKernel::on_actionInfo_messages_triggered() { - if (p2 != NULL) { - if (p2->isItemChecked(msgid)) { - p2->setItemChecked(msgid, FALSE); - info_messages=FALSE; - } else { - p2->setItemChecked(msgid, TRUE); - info_messages=TRUE; - } - } /* !=NULL */ - /* bar->repaint(); */ + if (menuTools != NULL) { + info_messages = actionInfo_messages->isChecked(); + } } -void QKernel::SetOptions() +/** + * Allows to set options in GUI window. + * Additional window is displayed to set kernel options which are saved in + * vlp.cfg file in kernel executable directory. + */ +void QKernel::on_actionOptions_triggered() { - QDialog dlg(this, "Options", TRUE); + OptionsDialog * dlg = new OptionsDialog(this, Qt::Dialog); ConnectEntry *e; + QListWidget *connections; unsigned int i; - QLineEdit* progs; - progs = new QLineEdit(&dlg, "progs"); - progs->setGeometry(150, 20, 180, 30); - progs->setText(progdir); - - QLabel* tmpQLabel; - tmpQLabel = new QLabel(&dlg, "Label_1"); - tmpQLabel->setGeometry(30, 20, 120, 30); - tmpQLabel->setText("Programs directory"); - - QFrame* tmpQFrame; - tmpQFrame = new QFrame(&dlg, "Frame_2"); - tmpQFrame->setGeometry(10, 60, 380, 30); - tmpQFrame->setFrameStyle(52); - - tmpQLabel = new QLabel(&dlg, "Label_2"); - tmpQLabel->setGeometry(10, 80, 340, 30); - tmpQLabel->setText("Virtual Processor properties (activated after " - "restarting VLP):"); - - QLineEdit *nn; - char nns[256]; - nn = new QLineEdit(&dlg, "LineEdit_2"); - nn->setGeometry(110, 110, 40, 30); - sprintf(nns, "%d", NodeNumber); - nn->setText(nns); - - tmpQLabel = new QLabel(&dlg, "Label_3"); - tmpQLabel->setGeometry(20, 110, 90, 30); - tmpQLabel->setText("Node number:"); - - QRadioButton *exp, *reg; - exp = new QRadioButton(&dlg, "RadioButton_3"); - exp->setGeometry(30, 170, 100, 30); - exp->setText("Explicit"); - exp->setChecked(TRUE); - - reg = new QRadioButton(&dlg, "RadioButton_4"); - reg->setGeometry(30, 200, 100, 30); - reg->setText("Registration"); - reg->setEnabled(FALSE); - - connections = new QListBox(&dlg, "ListBox_1"); - connections->setGeometry(170, 140, 130, 100); - e = ConnectList.first(); - while(e != NULL) { - connections->insertItem(e->addr); - e = ConnectList.next(); + dlg->setDefaultNodeNumber(NodeNumber); + dlg->setDefaultProgramsDirectory(progdir); + + for (i = 0; i < ConnectList.size(); i++) { + e = ConnectList.at(i); + dlg->addConnection(e); } - tmpQLabel = new QLabel(&dlg, "Label_5"); - tmpQLabel->setGeometry(170, 110, 100, 30); - tmpQLabel->setText("Connection list:"); - - QPushButton *addbtn; - QPushButton *delbtn; - QPushButton *okbtn; - QPushButton *cancelbtn; - addbtn = new QPushButton(&dlg, "PushButton_1"); - addbtn->setGeometry(310, 150, 60, 30); - addbtn->setText("Add"); - delbtn = new QPushButton(&dlg, "PushButton_2"); - delbtn->setGeometry(310, 200, 60, 30); - delbtn->setText("Del"); - connect(addbtn, SIGNAL(clicked()), this, SLOT(AddAddress())); - connect(delbtn, SIGNAL(clicked()), this, SLOT(DelAddress())); - okbtn = new QPushButton(&dlg, "PushButton_3"); - okbtn->setGeometry(80, 260, 100, 30); - okbtn->setText("Ok"); - okbtn->setDefault(TRUE); - cancelbtn = new QPushButton(&dlg, "PushButton_4"); - cancelbtn->setGeometry(210, 260, 100, 30); - cancelbtn->setText("Cancel"); - connect(okbtn, SIGNAL(clicked()), &dlg, SLOT(accept())); - connect(cancelbtn, SIGNAL(clicked()), &dlg, SLOT(reject())); - QButtonGroup* group; - group = new QButtonGroup(&dlg, "ButtonGroup_1"); - group->setGeometry(20, 150, 120, 90); - group->setTitle("Connection type"); - group->setAlignment(1); - group->lower(); - group->insert(exp, 1); - group->insert(reg, 2); - - dlg.resize(400, 310); - if (dlg.exec()) { + if (dlg->exec()) { config_t cfg; config_setting_t *root; config_setting_t *setting; @@ -1015,12 +739,12 @@ void QKernel::SetOptions() setting = config_setting_add(root, "progdir", CONFIG_TYPE_STRING); - config_setting_set_string(setting, progs->text().ascii()); - strcpy(progdir, progs->text()); + strcpy(progdir, dlg->getProgramsDirectory().toAscii().data()); + config_setting_set_string(setting, progdir); setting = config_setting_add(root, "node_number", CONFIG_TYPE_INT); - config_setting_set_int(setting, atoi(nn->text())); + config_setting_set_int(setting, dlg->getNodeNumber()); setting = config_setting_add(root, "homedir", CONFIG_TYPE_STRING); @@ -1028,17 +752,20 @@ void QKernel::SetOptions() setting = config_setting_add(root, "type", CONFIG_TYPE_STRING); - if (exp->isChecked()) { + if (strcmp(dlg->getConnectionType().toLower().toAscii().data(), + "explicit") == 0) { config_setting_set_string(setting, "explicit"); config_setting_t *hosts = NULL; hosts = config_setting_add(root, "host", CONFIG_TYPE_ARRAY); + + connections = dlg->getConnectionList(); for(i = 0; i < connections->count(); i++) { setting = config_setting_add(hosts, NULL, CONFIG_TYPE_STRING); config_setting_set_string(setting, - connections->text(i).ascii()); + connections->item(i)->text().toAscii().data()); } } else { config_setting_set_string(setting, "register"); @@ -1052,51 +779,58 @@ void QKernel::SetOptions() } } -void QKernel::LockConsole() +/** + * Locks kernel program. + * Additional window is displayed to enter password and retype it. If both are + * same kernel window is locked. + */ +void QKernel::on_actionLock_Console_triggered() { - QDialog d(this, "Enter password", TRUE); - QLabel lab(&d, "Password"); - QLineEdit ed(&d, ""); - QPushButton ob(&d, ""); - QPushButton cb(&d, ""); + QDialog d(this, Qt::Dialog); + d.setWindowTitle("Lock console"); - d.setCaption("Lock console"); + QPushButton ob("Ok", &d); ob.setGeometry(30, 60, 80, 30); - ob.setText("Ok"); ob.setDefault(TRUE); + connect(&ob, SIGNAL(clicked()), &d, SLOT(accept())); + + QLabel lab("Password:", &d); lab.setGeometry(10, 10, 60, 30); - lab.setText("Password:"); + + QLineEdit ed("", &d); ed.setGeometry(70, 10, 140, 30); ed.setEchoMode(QLineEdit::Password); + + QPushButton cb("Cancel", &d); cb.setGeometry(130, 60, 80, 30); - cb.setText("Cancel"); - d.resize(240, 100); - connect(&ob, SIGNAL(clicked()), &d, SLOT(accept())); connect(&cb, SIGNAL(clicked()), &d, SLOT(reject())); + d.resize(240, 100); + if (d.exec()) { - if (strcmp(ed.text(), "") != 0) { - strcpy(LockPasswd, ed.text()); + if (strcmp(ed.text().toAscii().data(), "") != 0) { + strcpy(LockPasswd, ed.text().toAscii().data()); lab.setText("Retype:"); ed.setText(""); + /* + * Following exec(), could produce error: + * X Error: BadWindow (invalid Window parameter) 3 + * Major opcode: 3 (X_GetWindowAttributes) + * + * This is not error in our code. Basing on: + * https://bugreports.qt-project.org/browse/QTBUG-1782 + * this happens only on Qt 4.3 - 4.4. + */ if (d.exec()) { - if (strcmp(ed.text(), LockPasswd)==0) { - bar->setItemEnabled(qid, FALSE); - bar->setItemEnabled(prid, FALSE); - bar->setItemEnabled(mid, FALSE); - p2->setItemEnabled(unlockid, TRUE); - p2->setItemEnabled(lockid, FALSE); - p2->setItemEnabled(cwid, FALSE); - p2->setItemEnabled(optid, FALSE); - bar->repaint(); + if (strcmp(ed.text().toAscii().data(), LockPasswd) == 0) { + setLocked(TRUE); WriteMessage("CONSOLE LOCKED"); - LOCKED = TRUE; } else { QMessageBox msg(this); msg.setText("Not matching!"); msg.setButtonText(0, "Close"); msg.show(); - } + } } else { strcpy(LockPasswd, ""); } @@ -1104,82 +838,102 @@ void QKernel::LockConsole() } } -void QKernel::UnlockConsole() +/** + * Unlocks kernel program. + * Additional window is displayed to enter password. If it is correct, kernel + * window is unlocked + */ +void QKernel::on_actionUnlock_console_triggered() { - QDialog d(this, "Enter password", TRUE); - QLabel lab(&d, "Password"); - QLineEdit ed(&d, ""); - QPushButton ob(&d, ""); - QPushButton cb(&d, ""); + QDialog d(this, Qt::Dialog); + d.setWindowTitle("Enter password"); - ob.setGeometry(30, 60, 80, 30); - ob.setText("Ok"); - ob.setDefault(TRUE); + QLabel lab("Password:", &d); lab.setGeometry(10, 10, 60, 30); - lab.setText("Password:"); + + QLineEdit ed("", &d); ed.setGeometry(70, 10, 140, 30); ed.setEchoMode(QLineEdit::Password); - cb.setGeometry(130, 60, 80, 30); - cb.setText("Cancel"); - d.resize(240, 100); + + QPushButton ob("Ok", &d); + ob.setGeometry(30, 60, 80, 30); + ob.setDefault(TRUE); connect(&ob, SIGNAL(clicked()), &d, SLOT(accept())); + + QPushButton cb("Cancel", &d); + cb.setGeometry(130, 60, 80, 30); connect(&cb, SIGNAL(clicked()), &d, SLOT(reject())); + d.resize(240, 100); + if (d.exec()) { - if (strcmp(ed.text(), LockPasswd) == 0) { - bar->setItemEnabled(qid, TRUE); - bar->setItemEnabled(prid, TRUE); - bar->setItemEnabled(mid, TRUE); - p2->setItemEnabled(unlockid, FALSE); - p2->setItemEnabled(lockid, TRUE); - p2->setItemEnabled(cwid, TRUE); - p2->setItemEnabled(optid, TRUE); - bar->repaint(); + if (strcmp(ed.text().toAscii().data(), LockPasswd) == 0) { + setLocked(FALSE); WriteMessage("CONSOLE UNLOCKED"); - LOCKED = FALSE; } else { QMessageBox msg(this); msg.setText("Wrong password!"); msg.setButtonText(0, "Close"); msg.show(); - } + } } } +/** + * Writes init message in kernel + */ void QKernel::InitMessage() { - WriteMessage("\n Virtual LOGLAN Processor - ver 1.9: READY \n"); + WriteMessage("\n " PACKAGE_STRING ": READY \n"); } +/** + * Finds Interpreter by its socket + * @param _id ID of the socket + * @return returns pointer to the found interpreter slot. NULL otherwise + */ InterpEntry *QKernel::findINTbySocket(int _id) { - InterpEntry *pom; - pom = Interpreters.first(); - - while (pom != NULL) { - if (pom->sock == _id) + InterpEntry *pom = NULL; + + for (int i = 0; i < Interpreters.size(); i++) { + if (Interpreters.at(i)->sock == _id) { + pom = Interpreters.at(i); break; - - pom = Interpreters.next(); + } } - return(pom); + + return pom; } +/** + * Finds Interpreter by its ID. + * @param _id ID of the interpreter + * @return returns pointer to the found interpreter slot. NULL otherwise + */ InterpEntry *QKernel::findINTbyID(int _id) { - InterpEntry *pom; - pom = Interpreters.first(); - while (pom != NULL) { - if (pom->ID == _id) + InterpEntry *pom = NULL; + + for (int i = 0; i < Interpreters.size(); i++) { + if (Interpreters.at(i)->ID == _id) { + pom = Interpreters.at(i); break; - pom = Interpreters.next(); + } } - return(pom); -} + return pom; +} -/* ------------------ Connect INT module -----------------*/ +/** + * Connects interpreter + * @param ss full filepath with filename but without extension of the loglan + * program to run. + * @param r Interpreter execution mode. 0 if it will be local instance, 1 if + * remote + * @return Returns pointer to newly created interpreter slot, or NULL on error. + */ InterpEntry *QKernel::RunIntModule(char *ss, int r) { char a[256], b[255]; @@ -1244,7 +998,7 @@ InterpEntry *QKernel::RunIntModule(char *ss, int r) len = strlen(svr.sun_path)+sizeof(svr.sun_family); bind(sock, (struct sockaddr*)&svr, len); listen(sock, 5); - system(cmd); + system(cmd); newINT->sock = accept(sock, (struct sockaddr*)0, (unsigned int *)0); //::close(sock); @@ -1253,7 +1007,7 @@ InterpEntry *QKernel::RunIntModule(char *ss, int r) O_NONBLOCK|fcntl(newINT->sock, F_GETFL, 0)); on=1; setsockopt(newINT->sock, IPPROTO_TCP, TCP_NODELAY, (char*)&on, - sizeof(on)); + sizeof(on)); if (r) newINT->remote = 1; else @@ -1280,9 +1034,11 @@ InterpEntry *QKernel::RunIntModule(char *ss, int r) return newINT; } -/* ---------------------------------------------------------*/ -/* Allocate remote instance */ - +/** + * Allocates remote instance of interpreter + * @param interp Interpreter slot + * @param on Node Number + */ void QKernel::RemoteInstance(InterpEntry *interp, int on) { MESSAGE m; @@ -1330,7 +1086,7 @@ void QKernel::RemoteInstance(InterpEntry *interp, int on) interp->RInstances[on] = m.param.pword[7]; break; } - read(net_sock, &m, sizeof(MESSAGE)); + read(net_sock, &m, sizeof(MESSAGE)); } Net_Notify->setEnabled(TRUE); @@ -1352,10 +1108,9 @@ void QKernel::RemoteInstance(InterpEntry *interp, int on) } } - -/*-----------------------------------------------*/ -/* Close all remote instances */ - +/** + * Closes all remote instances + */ void QKernel::CloseInstances(InterpEntry *e) { MESSAGE msg; @@ -1377,8 +1132,10 @@ void QKernel::CloseInstances(InterpEntry *e) } } - -void QKernel::Info() +/** + * Displays information about virtual machine + */ +void QKernel::on_actionInfo_triggered() { MESSAGE m; @@ -1390,23 +1147,29 @@ void QKernel::Info() wait_for_info = TRUE; } -#include "kernel.moc" - +/** + * Program main function + * All program arguments but the first one (argv[0]: program name) are saved and + * passed to all dependent programs on their invocation. + * @param argc Number of program arguments + * @param argv Program arguments + */ int main(int argc, char **argv) { int i; - for(i=0; i < 5; i++) { + for(i = 0; i < 5; i++) { strcpy(myargs[i], ""); } - for(i=1; i < argc; i++) { - strcpy(myargs[i-1], argv[i]); + for(i = 1; i < argc; i++) { + strcpy(myargs[i - 1], argv[i]); } - app = new QApplication(argc, argv); - app->setStyle(new QWindowsStyle()); + QApplication * app = new QApplication(argc, argv); + QKernel kernel; - app->setMainWidget(&kernel); + kernel.show(); kernel.InitMessage(); + return app->exec(); }