Fix running of GRAPH module
[vlp.git] / src / kernel / kernel.cpp
index 21a72c6430449c27e649b6933a786224066ff0e0..72900280de4a2c02d0ad207e5452def81c26658d 100644 (file)
@@ -7,7 +7,7 @@
  as published by the Free Software Foundation; either version 2
  of the License, or (at your option) any later version.
 
- This program is distributed in the hope that it will be useful,
+ This program is distributed in the hope that it will be useful, 
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.
 
 ************************************************************/
 
-
-#include <qpixmap.h>
-//#include <qwindow.h>
-#include <qapp.h>
-#include <qframe.h>
-#include <qmlined.h>
-#include <qpainter.h>
-#include <qcolor.h>
-#include <qbrush.h>
-#include <qmenubar.h>
-#include <qpopmenu.h>
-#include <qfont.h>
-#include <qmsgbox.h>
-#include <qfiledlg.h>
-#include <qtabdlg.h>
-#include <qstring.h>
-#include <qrect.h>
-#include <qdialog.h>
-#include <qbttngrp.h>
-#include <qlabel.h>
-#include <qlined.h>
-#include <qlistbox.h>
-#include <qpushbt.h>
-#include <qradiobt.h>
-#include <qlist.h>
+#include <QtGui/QApplication>
+#include <QtGui/QMainWindow>
+#include <QtGui/QTextEdit>
+#include <QtGui/QMenuBar>
+#include <QtGui/QMessageBox>
+#include <QtGui/QFileDialog>
+#include <QtGui/QDialog>
+#include <QtCore/QString>
+#include <QtGui/QLabel>
+#include <QtGui/QLineEdit>
+#include <QtGui/QPushButton>
+#include <QtGui/QRadioButton>
+#include <QtGui/QGroupBox>
+#include <QtGui/QVBoxLayout>
+#include <QtCore/QList>
+#include <QtGui/QListWidget>
 #include <qfile.h>
 #include <qcursor.h>
-#include <qcombo.h>
-#include <qsocknot.h>
-#include <qdir.h>
-#include <qwindowsstyle.h>
+#include <QtCore/QSocketNotifier>
+#include <QtGui/QCloseEvent>
+#include <QtCore/QDir>
+#include <QtCore/QProcess>
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <fcntl.h>
 
 #include "genint1.h"
-#include "comm.h"
 #include "socu.h"
 #include <netinet/in.h>
 
 #include <libconfig.h>
+#include <X11/Xlib.h>
+
+#include "kernel.h"
+#include "ui/KernelWindow.h"
+#include "ConnectDialog.h"
+#include "KillDialog.h"
+#include "LockDialog.h"
+#include "OptionsDialog.h"
+#include "MessageDialog.h"
+
+#include "vlp/config.h"
+#include "vlp/QtConfigurationFinder.h"
+#include "vlp/exception/ConfigFileNotFound.h"
+
+#include <sys/prctl.h>
+/* File resides in top directory (where are Makefiles)*/
+#include "../../config.h"
 
-#define GPATH "loggr"
-#define IPATH "logi"
-#define NPATH "logn"
-#define REMOTE_PATH "REMOTE"
-#define MAXINTERP 20
-#define MAXINSTANCES 256 
-
-
-#define MESG_COL       0
-#define WARN_COL       1
-#define NORM_COL       2
-
-
-char CharLine[25]="________________________";
-char myargs[5][255];
-
-
-/* --------------- interpreter slot -----------------*/
-class InterpEntry {
-public:
-       int ID;                                // INT identifier
-       bool remote;                           // Am I remote ?
-       char fullname[255],shortname[255];     // Program name
-       int sock;                              // Socket 
-       QSocketNotifier *notify;             
-       int RInstances[MAXINSTANCES];          // IDs of my remote INT modules
-       ctx_struct p_ctx;                      // parent INT info
-};
-/*++++++++++++++++++++++++++++++++++++++++++*/
-
-/*----------------- 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,*p1,*p2;
-       char progdir[256];                              
-       int NodeNumber,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<InterpEntry> Interpreters;         
-       QList<ConnectEntry> ConnectList;
-       QListBox *connections;
-       int Tasks;                            // number of working interpreters
-       int ActiveConnections;                // number of connected VLPs
-       bool LOCKED,synchro,wait_for_info;
-       char LockPasswd[25];
-       int lockid,unlockid,qid,cwid,
-       optid,prid,mid,msgid,toolsid,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 )
+
+namespace loglan {
+namespace vlp {
+
+char CharLine[25] = "________________________";
+
+/**
+ * Event invoked on program close.
+ * Closes application. Displays additional window to confirm exit.
+ */
+void QKernel::closeEvent(QCloseEvent * e)
 {
        e->ignore();
+
+       if (!LOCKED) {
+               on_actionQuit_triggered();
+       }
+}
+
+void QKernel::setLocked(bool locked)
+{
+       LOCKED = locked;
+
+       actionQuit->setDisabled(locked);
+
+       actionExecute->setDisabled(locked);
+       actionKill->setDisabled(locked);
+       actionMessage->setDisabled(locked);
+       actionConnect->setDisabled(locked);
+       actionDisconnect->setDisabled(locked);
+       actionInfo->setDisabled(locked);
+
+
+       /* Enable only menu entry for unlocking */
+       actionEditor->setDisabled(locked);
+       actionOptions->setDisabled(locked);
+       actionLock_console->setDisabled(locked);
+       actionUnlock_console->setDisabled(!locked);
 }
 
-QKernel::QKernel()
+/**
+ * Kernel program constructor.
+ * Prepares everything to work.
+ */
+QKernel::QKernel(int argc, char **argv)
 {
-       QFont f("Helvetica",10,QFont::Bold);
-       QFont f1("Helvetica",10,QFont::Normal);
-       QFont f2("Times Roman",10,QFont::Normal);
-       QDir q(REMOTE_PATH);
-       char ss[255];
+       setupUi(this);
+
+       int i;
+       for(i = 0; (i < 5) && (i < argc-1); i++) {
+               strcpy(myargs[i], "");
+               if (i < argc) {
+                       strcpy(myargs[i], argv[i+1]);
+               }
+       }
+
+       loglan::vlp::QtConfigurationFinder configFinder;
+       configFinder.initSearchDirs();
+
+       QDir q(getRemoteDir());
 
        if (!q.exists()) {
-               sprintf(ss,"mkdir %s",REMOTE_PATH);
-               system(ss);
-       } 
-
-       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);
+               q.mkpath(getRemoteDir());
+       }
 
-       qid = bar->insertItem("&Quit",this,SLOT(QuitProc()));
-       p->setFont(f);
+       info_messages = actionInfo_messages->isChecked();
+       wait_for_info = FALSE;
 
-       desktop = new QMultiLineEdit(this,"desktop");
-       desktop->setAutoUpdate(TRUE);
-       desktop->setReadOnly(TRUE);
-       desktop->setFont(f1);
+       setWindowTitle(PACKAGE_NAME);
+
+       LOCKED = FALSE;
 
-       resize(400,200);
        Tasks = 0;
        freeINTid = 1;
        ActiveConnections = 0;
-       strcpy(LockPasswd,"");
-       LoadConfig("vlp.cfg");
+       strcpy(LockPasswd, "");
+
+       loadConfig(configFinder.findConfig().c_str());
+
        RunNetModule();
 
-       Net_Notify = new QSocketNotifier(net_sock,QSocketNotifier::Read,this);
-       connect(Net_Notify,SIGNAL(activated(int)),this,SLOT(NetMessage()));
+       Net_Notify = new QSocketNotifier(net_sock, QSocketNotifier::Read, this);
+       connect(Net_Notify, SIGNAL(activated(int)), this, SLOT(NetMessage()));
+
+       WriteMessage("\n " PACKAGE_STRING ": READY \n");
 }
 
-void QKernel::resizeEvent( QResizeEvent *ev )
+QString QKernel::getConfigFilePath()
 {
-       QFrame::resizeEvent(ev);
-       if ( desktop )
-               desktop->setGeometry(0, bar->height(), width(),  height() - bar->height());
+       return homeDir.absoluteFilePath("vlp.cfg");
 }
 
-void QKernel::n_impl()
+const char * QKernel::getHomeDir()
 {
QMessageBox::information(this,"Function info","This function is not implemented yet...","Ok");
      return homeDir.absolutePath().toStdString().c_str();
 }
 
+const char * QKernel::getRemoteDir()
+{
+       return homeDir.absoluteFilePath(REMOTE_PATH).toStdString().c_str();
+}
 
-/* ###########     load configuration from file  ############# */
+const char * QKernel::getNetModuleSocket()
+{
+       return homeDir.absoluteFilePath(NPATH).toStdString().c_str();
+}
 
-void QKernel::LoadConfig(char * fname)
+const char * QKernel::getGraphModuleSocket()
 {
-       config_t cfg;
-       config_setting_t *setting;
-       const char *str;
-
-       /* Hack for checking if file exists without using external libs.*/
-       FILE * file = fopen(fname, "rt");
-       if (!file) {
-               fprintf(stderr, "Error: Cannot load configuration file %s!\n", fname);
-               exit(3);
-       }
-       /* File exists, so file has been locked. Release it. */
-
-       config_init(&cfg);
-
-       /* Read the file. If there is an error, report it and exit. */
-       if(!config_read(&cfg, file)) {
-               fprintf(stderr, "%s! In file %s, line %d\n",
-                       config_error_text(&cfg),
-                       config_error_file(&cfg),
-                       config_error_line(&cfg));
-               config_destroy(&cfg);
-               fclose(file);
-               exit(3);/* from original code. */
-       }
+       return homeDir.absoluteFilePath(GPATH).toStdString().c_str();
+}
 
-       setting = config_lookup(&cfg, "node_number");
-       if(setting) {
-               NodeNumber = config_setting_get_int(setting);
-       } else {
-               fprintf(stderr, "%s! In file %s, '%s' was not found.\n",
-                       "Warning",
-                       fname,
-                       "node_number");
-               config_destroy(&cfg);
-               fclose(file);
-               exit(3);
-       }
+void QKernel::loadConfig(const QString & fname)
+{
+       loadConfig(fname.toStdString().c_str());
+}
+/**
+ * Loads configuration from the given file.
+ * @param fname Filename of the configuration file.
+ */
+void QKernel::loadConfig(const char * fname)
+{
+       loglan::vlp::Config config;
+       if(config.load(fname)) {
+               NodeNumber = config.getNodeNumber();
+               ConType = config.getConnectionType();
 
-       setting = config_lookup(&cfg, "type");
-       if(setting) {
-               ConType = (strcmp(config_setting_get_string(setting), "explicit") == 0) ? 1 : 2;
-       } else {
-               fprintf(stderr, "%s! In file %s, '%s' was not found.\n",
-                       "Warning",
-                       fname,
-                       "type");
-       }
 
-       setting = config_lookup(&cfg, "host");
-       if(setting) {
-               switch(config_setting_type(setting)) {
-               case CONFIG_TYPE_STRING:/* TODO: Deprecated. Made for back compatibility. */
-                       ConnectList.append(new ConnectEntry((char*)config_setting_get_string(setting)));
-                       break;
-               case CONFIG_TYPE_ARRAY:
-                       for (int i = 0; i < config_setting_length(setting); i++) {
-                               ConnectList.append(new ConnectEntry((char*)config_setting_get_string_elem(setting, i)));
-                       }
-                       break;
-               default:
-                       fprintf(stderr, "%s! In file %s, bad entry type for %s. Will not be read.\n",
-                               "Error",
-                               fname,
-                               "host");
+               std::vector<std::string> hosts = config.getHosts();
+               for (unsigned int i = 0; i < hosts.size(); i++) {
+                       ConnectList.append(new ConnectEntry(hosts[i].c_str()));
                }
-       } else {
-               fprintf(stderr, "%s! In file %s, '%s' was not found.\n",
-                       "Warning",
-                       fname,
-                       "host");
-       }
 
-       setting = config_lookup(&cfg, "progdir");
-       if(setting){
-               strncpy(progdir, config_setting_get_string(setting), 256);
-       } else {
-               fprintf(stderr, "%s! In file %s, '%s' was not found.\n",
-                       "Warning",
-                       fname,
-                       "progdir");
-       }
+               strncpy(progdir, config.getProgramDir(), 256);
 
-       setting = config_lookup(&cfg, "homedir");
-       if(setting) {
-               strncpy(HomeDir, config_setting_get_string(setting), 255);
-       } else {
-               fprintf(stderr, "%s! In file %s, '%s' was not found.\n",
-                       "Warning",
-                       fname,
-                       "homedir");
+               homeDir = QDir(QCoreApplication::applicationDirPath());
        }
-
-       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));
-       
-       if ( !s.isNull()) {
-               i = s.find(".log");
-               
-               if (i>0)
-                       s.remove(i,4);
-                       
-               RunIntModule((char*)s.ascii(),0);
+       QString s = QFileDialog::getOpenFileName(this, "Execute", progdir, "*.log");
+
+       if (!s.isNull()) {
+               int i = s.indexOf(".log");
+
+               if (i > 0)
+                       s.remove(i, 4);
+
+               // @TODO: if no interpreter is running will result in killing app
+               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,
-       myargs[0],myargs[1],myargs[2],myargs[3],myargs[4]);
-       system(cmd);
+       QString program = getHomeDir();
+       program += "/modules/logedit";
+
+       fprintf(stderr, "Run EDIT Module: %s, %s\n", program.toStdString().c_str(), getHomeDir());
+       pid_t pid = fork();
+       if (pid == 0) {
+               if (execl(program.toStdString().c_str(),
+                       "logedit",
+                       getHomeDir(),
+                       myargs[0],
+                       myargs[1],
+                       myargs[2],
+                       myargs[3],
+                       myargs[4],
+                       NULL
+               ) == -1) {
+                       WriteMessage("Executing logedit failed!");
+               }
+       }
+       else if (pid < 0) {
+               WriteMessage("fork(logedit) failed!");
+               WriteMessage("Exiting...");
+               sleep(2);
+               on_actionQuit_triggered();
+               exit(3);
+       }
 }
 
-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, HomeDir,
-       myargs[0],myargs[1],myargs[2],myargs[3],myargs[4]);
-       system(cmd);
+       QString program = getHomeDir();
+       program += "/modules/loghelp";
+       
+       QString docDir = getHomeDir();
+       docDir += "/doc";
+
+       fprintf(stderr, "Run HELP Module: %s, %s\n", program.toStdString().c_str(), docDir.toStdString().c_str());
+
+       pid_t pid = fork();
+       if (pid == 0) {
+               if (execl(program.toStdString().c_str(),
+                       "loghelp",
+                       docDir.toStdString().c_str(),
+                       myargs[0],
+                       myargs[1],
+                       myargs[2],
+                       myargs[3],
+                       myargs[4],
+                       NULL
+               ) == -1) {
+
+                       WriteMessage("Executing loghelp failed!");
+               }
+       }
+       else if (pid < 0) {
+               WriteMessage("fork(loghelp) failed!");
+               WriteMessage("Exiting...");
+               sleep(2);
+               on_actionQuit_triggered();
+               exit(3);
+       }
 }
 
-
+/**
+ * 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," &");
-
-       if (system(cmd)!=0)
-               WriteMessage("Cannot connect GRAPH resources");
+       QString program = getHomeDir();
+       program += "/modules/loggraph";
+
+       fprintf(stderr, "Run GRAPH Module: %s, %s\n", program.toStdString().c_str(), sk);
+
+       pid_t pid = fork();
+       if (pid == 0) {
+               if (execl(program.toStdString().c_str(),
+                       "loggraph",
+                       sk,
+                       myargs[0],
+                       myargs[1],
+                       myargs[2],
+                       myargs[3],
+                       myargs[4],
+                       NULL
+               ) == -1) {
+
+                       WriteMessage("Executing loggraph failed!");
+                       WriteMessage("Exiting...");
+                       sleep(2);
+                       on_actionQuit_triggered();
+               }
+       }
+       else if (pid < 0) {
+               WriteMessage("fork(loggraph) failed!");
+               WriteMessage("Exiting...");
+               sleep(2);
+               on_actionQuit_triggered();
+               exit(3);
+       }
 }
 
-
-
+/**
+ * Invokes net module
+ */
 void QKernel::RunNetModule()
 {
+
        struct sockaddr_un svr;
-       int len,on;
+       int len;
+       int 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," &");
 
-       /* -------- socket for NET module -------- */
-       unlink(NPATH);
-       sock = socket(AF_UNIX,SOCK_STREAM,0);
-       bzero(&svr,sizeof(svr));
-       svr.sun_family = AF_UNIX;
-       strcpy(svr.sun_path,NPATH);
-       len = strlen(svr.sun_path)+sizeof(svr.sun_family);
-       bind(sock,(struct sockaddr*)&svr, len);      
-       listen(sock,5);
-
-       if(system(cmd) == 0) {
-               net_sock = accept(sock,(struct sockaddr*)0,(unsigned int*)0);
-               // close(sock); 
-               if (net_sock != 0) {
-                       WriteMessage("NETWORK successfully connected");
-                       fcntl(net_sock,F_SETFL, O_NONBLOCK|fcntl(net_sock,F_GETFL,0));
-                       on=1;
-                       setsockopt(net_sock,IPPROTO_TCP,TCP_NODELAY,(char*)&on,sizeof(on)); 
-               } else {
-                       WriteMessage("Cannot connect NETWORK resources");
+       QString program = getHomeDir();
+       program += "/modules/lognet";
+
+       fprintf(stderr, "Run NET Module: %s, %s %s\n", program.toStdString().c_str(), getNetModuleSocket(), getConfigFilePath().toStdString().c_str());
+       pid_t pid = fork();
+       if (pid == 0) {
+               if (execl(program.toStdString().c_str(),
+                       "lognet",
+                       getNetModuleSocket(),
+                       getConfigFilePath().toStdString().c_str(),
+                       myargs[0],
+                       myargs[1],
+                       myargs[2],
+                       myargs[3],
+                       myargs[4],
+                       NULL
+               ) == -1) {
+
+                       WriteMessage("Executing lognet failed!");
                        WriteMessage("Exiting...");
                        sleep(2);
-                       QuitProc(); 
+                       on_actionQuit_triggered();
                }
-       /* system OK */
+       }
+       else if (pid < 0) {
+               WriteMessage("fork(lognet) failed!");
+               WriteMessage("Exiting...");
+               sleep(2);
+               on_actionQuit_triggered();
+               exit(3);
+       }
+
+       /* -------- socket for NET module -------- */
+       unlink(getNetModuleSocket());
+       sock = socket(AF_UNIX, SOCK_STREAM, 0);
+       bzero(&svr, sizeof(svr));
+       svr.sun_family = AF_UNIX;
+       strcpy(svr.sun_path, getNetModuleSocket());
+       len = strlen(svr.sun_path) + sizeof(svr.sun_family);
+       bind(sock, (struct sockaddr*)&svr, len);
+       listen(sock, 5);
+
+       net_sock = accept(sock, (struct sockaddr*)0, (unsigned int*)0);
+       // close(sock); 
+       if (net_sock != 0) {
+               WriteMessage("NETWORK successfully connected");
+               fcntl(net_sock, F_SETFL, O_NONBLOCK|fcntl(net_sock, F_GETFL, 0));
+               on = 1;
+               setsockopt(net_sock, IPPROTO_TCP, TCP_NODELAY, (char*)&on, sizeof(on));
        } else {
                WriteMessage("Cannot connect NETWORK resources");
                WriteMessage("Exiting...");
                sleep(2);
-               QuitProc(); 
+               on_actionQuit_triggered();
        }
 }
 
-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,""),cb(&d,"");
        MESSAGE m;
 
-       d.setFont(QFont("Helvetica",12,QFont::Bold)); 
-       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()) {
+       dialog::ConnectDialog dialog(this);
+
+       if (dialog.exec()) {
                m.msg_type = MSG_NET;
                m.param.pword[0] = NET_CONNECT_TO;
-               strcpy(m.param.pstr,ed.text());
-               write(net_sock,&m,sizeof(MESSAGE)); 
+               strcpy(m.param.pstr, dialog.getAddress().toStdString().c_str());
+               write(net_sock, &m, sizeof(MESSAGE));
        }
 }
 
-void QKernel::Disconnect()
+/**
+ * Disconnects from virtual machine
+ */
+void QKernel::on_actionDisconnect_triggered()
 {
        MESSAGE msg;
 
@@ -505,153 +448,82 @@ void QKernel::Disconnect()
        write(net_sock, &msg, sizeof(MESSAGE));
 }
 
-void QKernel::QuitProc()
+/**
+ * Quits process. Closes VLP. Shows additional window to confirm exit. 
+ */
+void QKernel::on_actionQuit_triggered()
 {
        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 = 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,""),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;
+       dialog::MessageDialog dialog(this);
        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");
-
-       if (dlg->exec()) {
+       if (dialog.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] = dialog.getNodeNumber();
                m.param.pword[6] = VLP_WRITE;
-               strcpy(m.param.pstr, msg->text());
+               strcpy(m.param.pstr, dialog.getMessage().toStdString().c_str());
                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;
+       dialog::KillInterpreterDialog dialog(this);
 
-       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()) {
+       if (dialog.exec()) {
+               MESSAGE m;
                m.msg_type = MSG_INT;
                m.param.pword[0] = INT_KILL;
-               pom = findINTbyID(atoi(nodenr->text()));
-               if(pom != NULL) {
-                       if (!(pom->remote))
-                               write(pom->sock,&m,sizeof(MESSAGE));
-                       else WriteMessage("This is a remote instance of a program!");
+               
+               InterpEntry *interpreter;
+               interpreter = findINTbyID(dialog.getInterpreterId());
+
+               if (interpreter != NULL) {
+                       if (!(interpreter->remote)) {
+                               write(interpreter->sock, &m, sizeof(MESSAGE));
+                       }
+                       else {
+                               WriteMessage("This is a remote instance of a program!");
+                       }
                }
                else {
                        WriteMessage("Interpreter not found");
@@ -659,17 +531,23 @@ void QKernel::KillInterpreter()
        }
 }
 
-
-
+/**
+ * Sends message to the net module.
+ *
+ * \todo method needs to be refactored
+ */
 void QKernel::NetMessage()
 {
+       
+       /* TODO: It has to be rewritten */
        MESSAGE msg;
        int cnt;
-       char ss[255];
        InterpEntry *pom;
 
        cnt = read(net_sock, &msg, sizeof(MESSAGE));
-       if((cnt > 0) && (msg.msg_type == MSG_NET)) {
+       if ((cnt > 0) && (msg.msg_type == MSG_NET)) {
+               char ss[255];
+
                switch(msg.param.pword[0]) {
                case NET_CSWRITELN:
                        WriteMessage(msg.param.pstr);
@@ -679,29 +557,35 @@ 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;   
-                               send_int(pom,&msg);*/
+                               msg.param.pword[0] = NET_PROPAGATE;
+                               send_int(pom, &msg);*/
                                break;
                        case MSG_VLP:
                                switch(msg.param.pword[6]) {
                                case VLP_WRITE:
                                        QApplication::beep();
                                        WriteMessage(CharLine);
-                                       WriteMessage("### Incoming Messsage ###");  
-                                       sprintf(ss,"Mesg from Node %d: %s",msg.param.pword[2],msg.param.pstr);
+                                       WriteMessage("### Incoming Messsage ###");
+                                       sprintf(ss,
+                                               "Mesg from Node %d: %s",
+                                               msg.param.pword[2],
+                                               msg.param.pstr
+                                       );
                                        WriteMessage(ss);
                                        WriteMessage(CharLine);
                                        break;
                                case VLP_REMOTE_INSTANCE:
-                                       sprintf(ss,"%s/%s",REMOTE_PATH,msg.param.pstr); 
+                                       sprintf(ss, "%s/%s", getRemoteDir(), msg.param.pstr);
+
                                        if (info_messages) { 
                                                WriteMessage("Running program:");
                                                WriteMessage(ss);
                                        }
-                                       pom = RunIntModule(ss,1);
-                                       if (pom!=NULL) {
+                                       pom = RunIntModule(ss, 1);
+                                       if (pom != NULL) {
                                                pom->p_ctx.node = msg.param.pword[2];
-                                               pom->p_ctx.program_id = msg.param.pword[7];
+                                               pom->p_ctx.program_id = 
+                                                       msg.param.pword[7];
                                                pom->RInstances[msg.param.pword[2]] = msg.param.pword[7];
                                        }
                                        break;
@@ -709,39 +593,43 @@ void QKernel::NetMessage()
                                        msg.msg_type = MSG_INT;
                                        msg.param.pword[0] = INT_CLOSE_INSTANCE;
                                        pom = findINTbyID(msg.param.pword[7]);
-                                       if (pom!=NULL) {
-                                               write(pom->sock,&msg,sizeof(MESSAGE));
+                                       if (pom != NULL) {
+                                               write(pom->sock, &msg,
+                                                       sizeof(MESSAGE));
                                                MESSAGE m1;
                                                m1.msg_type = MSG_VLP;
                                                m1.param.pword[0] = VLP_INTERPRETER_DOWN;
                                                m1.param.pword[1] = pom->ID;
-                                               write(net_sock,&m1,sizeof(MESSAGE));
+                                               write(net_sock, &m1,
+                                                       sizeof(MESSAGE));
                                        } else {
                                                WriteMessage("Instance not found"); 
                                        }
                                        break; 
-                               } /* VLP switch */        
+                               } /* VLP switch */
                        }/* switch */
                        break;
-               case NET_CONNECTIONS: ActiveConnections = msg.param.pword[1];
+               case NET_CONNECTIONS:
+                       ActiveConnections = msg.param.pword[1];
                        WriteMessage(msg.param.pstr);
                        if (!synchro) 
-                               synchro=TRUE;
+                               synchro = TRUE;
                        break;
                case NET_INFO:
+                       /* TODO: It has to be rewritten */
                        if (wait_for_info) {
-                               QString poms,poms1,poms2;
-                               poms.sprintf("%s",msg.param.pstr);
-                               while (poms.length()>0) {
-                                       cnt=poms.find(';');
+                               QString poms, poms1, poms2;
+                               poms.sprintf("%s", msg.param.pstr);
+                               while (poms.length() > 0) {
+                                       cnt = poms.indexOf(';');
                                        if (cnt!=-1) {
-                                               poms1=poms.left(cnt);
-                                               poms=poms.right(poms.length()-cnt-1);
-                                               cnt=poms1.find('=');
-                                               if (cnt!=-1) {
-                                                       poms2=poms1.left(cnt);
-                                                       poms1=poms1.right(poms1.length()-cnt-1);
-                                                       sprintf(ss,"Node: %s Addr: %s",poms2.data(),poms1.data());
+                                               poms1 = poms.left(cnt);
+                                               poms = poms.right(poms.length() - cnt - 1);
+                                               cnt = poms1.indexOf('=');
+                                               if (cnt != -1) {
+                                                       poms2 = poms1.left(cnt);
+                                                       poms1 = poms1.right(poms1.length() - cnt - 1);
+                                                       sprintf(ss, "Node: %s Addr: %s", poms2.toStdString().c_str(), poms1.toStdString().c_str());
                                                        WriteMessage(ss); 
                                                }
                                        } 
@@ -749,25 +637,30 @@ void QKernel::NetMessage()
                        } 
                        break;
                case NET_INFO_END:
-                       wait_for_info=FALSE;
+                       wait_for_info = FALSE;
                        WriteMessage(CharLine);
                        break;
                } /* switch */
        }
 }
 
+/**
+ * Sends message to the interpreter program.
+ * @param sock Interpreter socket to whom the message will be send.
+ */
 void QKernel::IntMessage(int sock)
 {
        MESSAGE msg;
        int cnt;
        InterpEntry *e;
 
-       cnt = read(sock,&msg,sizeof(MESSAGE));
+       cnt = read(sock, &msg, sizeof(MESSAGE));
        e = findINTbySocket(sock);
        if ((cnt > 0) && (e != NULL)) {
                switch (msg.msg_type) { 
                case MSG_GRAPH:
                        if (msg.param.pword[0] == GRAPH_ALLOCATE) {
+                               fprintf(stderr, "Running graph module with arg: %s\n", msg.param.pstr);
                                RunGraphModule(msg.param.pstr);
                        }
                        break;
@@ -777,28 +670,30 @@ void QKernel::IntMessage(int sock)
                case MSG_VLP:
                        switch(msg.param.pword[0]) {
                        case VLP_REMOTE_INSTANCE_PLEASE:
-                               RemoteInstance(e,msg.param.pword[2]);
+                               RemoteInstance(e, msg.param.pword[2]);
                                break;
                        }/* switch */
                        break;
                case MSG_INT:
                        switch(msg.param.pword[0]) {
                        case INT_EXITING:
-                               char ss[255];
-
                                MESSAGE m;
                                m.msg_type = MSG_VLP;
                                m.param.pword[0] = VLP_INTERPRETER_DOWN;
                                m.param.pword[1] = e->ID;
-                               write(net_sock,&m,sizeof(MESSAGE));
-                               if(e->remote == 0)
+                               write(net_sock, &m, sizeof(MESSAGE));
+                               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) {
-                                       sprintf(ss,"%s : End of program execution",msg.param.pstr);
+                                       char ss[255];
+                                       sprintf(ss, "%s : End of program "
+                                               "execution", msg.param.pstr);
                                        WriteMessage(ss);
                                }
                                break;
@@ -809,477 +704,363 @@ void QKernel::IntMessage(int sock)
                                msg.param.pword[2] = e->ID;
                                if (e->remote) {
                                        msg.param.pword[3] = e->p_ctx.node;
-                                       msg.param.pword[4] = e->p_ctx.program_id;
+                                       msg.param.pword[4] = 
+                                                       e->p_ctx.program_id;
                                }
                                write(sock, &msg, sizeof(MESSAGE)); 
                                break;
                        };
-                       break; /* switch param.pword[0] */
-               } /* switch type */
-       } /* if */
+                       break;
+               }
+       }
 }
 
-void QKernel::WriteMessage(char *msg)
+/**
+ * Writes message to kernel logger.
+ * @parame msg String with message to log
+ */
+void QKernel::WriteMessage(const char *msg)
 {
        int x;
-       int y;
+//     int y;
+       x = desktop->textCursor().blockNumber();
+//     y = desktop->textCursor().columnNumber();
 
-       desktop->getCursorPosition(&x,&y);
-       if(x > 100) {
+       if (x > 100) {
                desktop->clear();
        }
        
        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 (toolsMenu != NULL) {
+               info_messages = actionInfo_messages->isChecked();
+               actionInfo_messages->setChecked(info_messages);
+       }
 }
 
-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);
-       ConnectEntry *e;
-       unsigned int i;
+       dialog::OptionsDialog optionsDialog(getConfigFilePath(), this);
+       if (optionsDialog.exec()) {
+               optionsDialog.saveConfig(getConfigFilePath());
 
-       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();
-       }
-
-       tmpQLabel = new QLabel( &dlg, "Label_5" );
-       tmpQLabel->setGeometry( 170, 110, 100, 30 );
-       tmpQLabel->setText( "Connection list:" );
-
-       QPushButton* addbtn,*delbtn,*okbtn,*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()) {
-               config_t cfg;
-               config_setting_t *root, *setting;
-               config_init(&cfg);
-
-               root = config_root_setting(&cfg);
-
-               setting = config_setting_add(root, "progdir", CONFIG_TYPE_STRING);
-               config_setting_set_string(setting, progs->text().ascii());
-               strcpy(progdir,progs->text());
-
-               setting = config_setting_add(root, "node_number", CONFIG_TYPE_INT);
-               config_setting_set_int(setting, atoi(nn->text()));
-
-               setting = config_setting_add(root, "homedir", CONFIG_TYPE_STRING);
-               config_setting_set_string(setting, HomeDir);
-
-               setting = config_setting_add(root, "type", CONFIG_TYPE_STRING);
-               if (exp->isChecked()) {
-                       config_setting_set_string(setting, "explicit");
-
-                       config_setting_t *hosts = NULL;
-                       hosts = config_setting_add(root, "host", CONFIG_TYPE_ARRAY);
-                       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());
-                       }
-               } else {
-                       config_setting_set_string(setting, "register");
-               }
-
-               if(!config_write_file(&cfg, "vlp.cfg")) {
-                       fprintf(stderr, "Error while writing to file: %s.\n", "vlp.cfg");
-               }
-               config_destroy(&cfg);
+               loadConfig(getConfigFilePath());
        }
 }
 
-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,""),cb(&d,"");
-
-       d.setCaption("Lock console"); 
-       ob.setGeometry( 30, 60, 80, 30 );
-       ob.setText( "Ok" );
-       ob.setDefault(TRUE);
-       lab.setGeometry( 10, 10, 60, 30 );
-       lab.setText( "Password:" );
-       ed.setGeometry( 70, 10, 140, 30 );
-       ed.setEchoMode(QLineEdit::Password);
-       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) {
-                       strcpy(LockPasswd,ed.text());
-                       lab.setText("Retype:");
-                       ed.setText("");
-                       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();
+       dialog::LockDialog lockDialog(this);
+
+       if (lockDialog.exec()) {
+               QString password = lockDialog.getPassword();
+               if (lockDialog.getPassword().size() > 0) {
+                       strcpy(LockPasswd, password.toStdString().c_str());
+                       lockDialog.retype();
+
+                       if (lockDialog.exec()) {
+                               password = lockDialog.getPassword();
+                               if (password == LockPasswd) {
+                                       setLocked(TRUE);
                                        WriteMessage("CONSOLE LOCKED");
-                                       LOCKED = TRUE;
                                } else {
                                        QMessageBox msg(this);
                                        msg.setText("Not matching!");
-                                       msg.setButtonText(0,"Close");
+                                       msg.setButtonText(0, "Close");
                                        msg.show();
-                               }   
+                                       strcpy(LockPasswd, "");
+                               }
                        } else {
-                               strcpy(LockPasswd,"");
+                               strcpy(LockPasswd, "");
                        }
                }
        }
 }
 
-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,""),cb(&d,"");
-
-       ob.setGeometry( 30, 60, 80, 30 );
-       ob.setText( "Ok" );
-       ob.setDefault(TRUE);
-       lab.setGeometry( 10, 10, 60, 30 );
-       lab.setText( "Password:" );
-       ed.setGeometry( 70, 10, 140, 30 );
-       ed.setEchoMode(QLineEdit::Password);
-       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(), 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();
+       dialog::LockDialog lockDialog(this);
+
+       if (lockDialog.exec()) {
+               QString password = lockDialog.getPassword();
+               if (strcmp(password.toStdString().c_str(), LockPasswd) == 0) {
+                       setLocked(FALSE);
                        WriteMessage("CONSOLE UNLOCKED");
-                       LOCKED = FALSE;         
                } else {
                        QMessageBox msg(this);
                        msg.setText("Wrong password!");
-                       msg.setButtonText(0,"Close");
+                       msg.setButtonText(0, "Close");
                        msg.show();
-               }      
+               }
        }
 }
 
-void QKernel::InitMessage()
-{
-       WriteMessage("\n Virtual LOGLAN Processor - ver 1.9: 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 (auto interpreter : Interpreters) {
+               if (interpreter->sock == _id) {
+                       pom = interpreter;
                        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 (auto interpreter : Interpreters) {
+               if (interpreter->ID == _id) {
+                       pom = interpreter;
                        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];
- struct sockaddr_un svr;
- int len,sock,i,on;
- int newint=-1;
- char cmd[255];
- FILE *cf;
- MESSAGE msg;
- InterpEntry *newINT;
+       fprintf(stderr, "Run INT Module: %s, %d\n", ss, r);
+       char a[256], b[255];
+       struct sockaddr_un svr;
+       int len, sock, on;
+       unsigned int i;
+       int newint=-1;
+       char cmd[255];
+       FILE *cf;
+       MESSAGE msg;
+       InterpEntry *newINT = NULL;
+
+       strcpy(a, ss);
+       strcat(a, ".ccd");
+       cf = fopen(a, "r");
+       if (cf == NULL) {
+               WriteMessage("File not found: no .ccd file");
+               return NULL;
+       }
+       fclose(cf);
+
+       strcpy(a, ss);
+       strcat(a, ".pcd");
+       cf = fopen(a, "r");
+       if (cf == NULL) {
+               WriteMessage("File not found: no .pcd file");
+               return NULL;
+       }
+       fclose(cf);
+
+       newINT = new InterpEntry;
+       for(i = 0; i < MAXINSTANCES; i++) 
+               newINT->RInstances[i] =- 1;
+
+       strcpy(b, rindex(ss, '/'));
+       for(i = 0; i < strlen(b); i++)
+               b[i] = b[i+1];
+       if (info_messages) {
+               sprintf(a, "%s : Start execution", b);
+               WriteMessage(a); 
+       }
 
+       newint = freeINTid;
+       freeINTid++;
+       newINT->ID = newint;
+       strcpy(newINT->shortname, b);
+       strcpy(newINT->fullname, ss);
+
+       sprintf(a, "%s%d", homeDir.absoluteFilePath(IPATH).toStdString().c_str(), newint);
+       sprintf(cmd, "%s/modules/logint %s %s",
+               getHomeDir(),
+               a,
+               ss);
+       if (r) {
+               strcat(cmd, " r");
+       }
+//     sprintf(b, " %s %s %s %s %s",
+//             myargs[0], myargs[1], myargs[2], myargs[3], myargs[4]);
+//     sprintf(cmd, "%s %s", cmd, b);
+//     strcat(cmd, b);
+       fprintf(stderr, "%s\n", cmd);
+       strcat(cmd, " &");
+
+       sock = socket(AF_UNIX, SOCK_STREAM, 0);
+       unlink(a);
+       bzero(&svr, sizeof(svr));
+       svr.sun_family = AF_UNIX;
+       strcpy(svr.sun_path, a);
+       len = strlen(svr.sun_path)+sizeof(svr.sun_family);
+       bind(sock, (struct sockaddr*)&svr, len);
+       listen(sock, 5);
+       system(cmd);
+       newINT->sock = accept(sock, (struct sockaddr*)0, (unsigned int *)0);
+       //::close(sock);
+
+       if (newINT->sock > 0) { 
+               fcntl(newINT->sock, F_SETFL, 
+                               O_NONBLOCK|fcntl(newINT->sock, F_GETFL, 0));
+               on=1; 
+               setsockopt(newINT->sock, IPPROTO_TCP, TCP_NODELAY, (char*)&on,
+                                                               sizeof(on));
+               if (r)
+                       newINT->remote = 1;
+               else 
+                       newINT->remote = 0;
+
+               bzero(&msg, sizeof(MESSAGE));
+               msg.msg_type = MSG_VLP;
+               msg.param.pword[0] = VLP_REGINT;
+               msg.param.pword[1] = newINT->ID;
+               sprintf(msg.param.pstr, "logi%d.net", newint);
+               write(net_sock, &msg, sizeof(MESSAGE)); 
+
+               Interpreters.append(newINT);
+               newINT->notify = new QSocketNotifier(newINT->sock,
+                                                       QSocketNotifier::Read);
+               connect(newINT->notify, SIGNAL(activated(int)), this,
+                                                       SLOT(IntMessage(int)));
+               if (info_messages)
+                       WriteMessage("INTERPRETER successfully connected");
+       } else {
+               WriteMessage("Cannot connect interpreter");
+       }
 
- newINT = NULL;
- strcpy(a,ss);
- strcat(a,".ccd");
- cf = fopen(a,"r");
- if (cf == NULL) {WriteMessage("File not found: no .ccd file");return(NULL);}
- fclose(cf);
- strcpy(a,ss);
- strcat(a,".pcd");
- cf = fopen(a,"r");
- if (cf == NULL) {WriteMessage("File not found: no .pcd file");return(NULL);}
- fclose(cf);
- newINT = new InterpEntry;
- for(i=0;i<MAXINSTANCES;i++) newINT->RInstances[i]=-1;
-
- strcpy(b,rindex(ss,'/'));
- for(i=0;i<strlen(b);i++) 
-      b[i] = b[i+1];
- if (info_messages)
- {
- sprintf(a,"%s : Start execution",b);
- WriteMessage(a); 
- }
-
- newint = freeINTid; freeINTid++;
- newINT->ID = newint;
- strcpy(newINT->shortname,b);
- strcpy(newINT->fullname,ss);
-    
- sprintf(a,"%s%d",IPATH,newint);
- sprintf(cmd,"%s/modules/logint %s %s",HomeDir,a,ss);
- if (r) strcat(cmd," r");
- sprintf(b," %s %s %s %s %s",myargs[0],myargs[1],myargs[2],myargs[3],myargs[4]);
- strcat(cmd,b);
- strcat(cmd," &");
-  
-
-    sock = socket(AF_UNIX,SOCK_STREAM,0);
-    unlink(a);
-    bzero(&svr, sizeof(svr));
-    svr.sun_family = AF_UNIX;
-    strcpy(svr.sun_path,a);
-    len = strlen(svr.sun_path)+sizeof(svr.sun_family);
-    bind(sock,(struct sockaddr*)&svr, len);
-    listen(sock,5);
-    system(cmd); 
-    newINT->sock = accept(sock,(struct sockaddr*)0,(unsigned int *)0);
-    //::close(sock);
-
-         
- if (newINT->sock>0) 
+       return newINT;
+}
+
+/**
+ * Allocates remote instance of interpreter
+ * @param interp Interpreter slot 
+ * @param on Node Number
+ */
+void QKernel::RemoteInstance(InterpEntry *interp, int on)
 {
+       MESSAGE m;
 
-   fcntl(newINT->sock,F_SETFL,
-      O_NONBLOCK|fcntl(newINT->sock,F_GETFL,0));
-   on=1; 
-   setsockopt(newINT->sock,IPPROTO_TCP,TCP_NODELAY,(char*)&on,sizeof(on)); 
-   if (r) newINT->remote = 1;else newINT->remote=0; 
-  
-   bzero(&msg,sizeof(MESSAGE));
-   msg.msg_type = MSG_VLP;
-   msg.param.pword[0] = VLP_REGINT;
-   msg.param.pword[1] = newINT->ID;
-   sprintf(msg.param.pstr,"logi%d.net",newint);
-   write(net_sock,&msg,sizeof(MESSAGE)); 
-   Interpreters.append(newINT);
-   newINT->notify = new QSocketNotifier(newINT->sock,QSocketNotifier::Read);
-   connect(newINT->notify,SIGNAL(activated(int)),this,SLOT(IntMessage(int)));
-   if (info_messages) WriteMessage("INTERPRETER successfully connected");  
-   
-}
- else WriteMessage("Cannot connect interpreter");
- return(newINT);    
+       m.msg_type = MSG_NET;
+       m.param.pword[0] = NET_NODE_EXIST;
+       m.param.pword[1] = on;
+       m.param.pword[2] = interp->ID;
+       write(net_sock, &m, sizeof(MESSAGE));
+       bzero(&m, sizeof(MESSAGE));
+       while((m.msg_type!=MSG_NET) && (m.param.pword[0]!=NET_NODE_EXIST))
+               read(net_sock, &m, sizeof(MESSAGE));
 
-}
+        /* means node exists */
+       if (m.param.pword[1] == 1) {
+               m.msg_type = MSG_NET;
+               m.param.pword[0] = NET_TRANSMIT_CODE;
+               m.param.pword[1] = interp->ID;
+               m.param.pword[2] = on;
+               strcpy(m.param.pstr, interp->fullname);
+               write(net_sock, &m, sizeof(MESSAGE));
 
-/* ---------------------------------------------------------*/
-/*            Allocate remote instance                      */
+               Net_Notify->setEnabled(FALSE);
+               while ((m.msg_type != MSG_NET) ||
+                       (m.param.pword[0] != NET_TRANSMITTED))
+                       read(net_sock, &m, sizeof(MESSAGE));
 
-void QKernel::RemoteInstance(InterpEntry *interp, int on)
-{
- MESSAGE m;
- char s[255];
- m.msg_type = MSG_NET;
- m.param.pword[0] = NET_NODE_EXIST;
- m.param.pword[1] = on;
- m.param.pword[2] = interp->ID;
- write(net_sock,&m,sizeof(MESSAGE));
- bzero(&m,sizeof(MESSAGE));
- while( (m.msg_type!=MSG_NET) && (m.param.pword[0]!=NET_NODE_EXIST) )
-  read(net_sock,&m,sizeof(MESSAGE));
-if (m.param.pword[1]==1) /* means node exists */
-{
- m.msg_type = MSG_NET;
- m.param.pword[0] = NET_TRANSMIT_CODE;
- m.param.pword[1] = interp->ID;
- m.param.pword[2] = on;
- strcpy(m.param.pstr,interp->fullname);
- write(net_sock,&m,sizeof(MESSAGE));
- Net_Notify->setEnabled(FALSE);
- while ( (m.msg_type != MSG_NET) || (m.param.pword[0]!=NET_TRANSMITTED) )
- read(net_sock,&m,sizeof(MESSAGE));
-
-
- 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[3] = 0;
- m.param.pword[4] = on;
- m.param.pword[5] = 0;
- m.param.pword[6] = VLP_REMOTE_INSTANCE;
- m.param.pword[7] = interp->ID;
- strcpy(m.param.pstr,interp->shortname);
- write(net_sock,&m,sizeof(MESSAGE));
- read(net_sock,&m,sizeof(MESSAGE));
- while (1)
- {
-   if ( (m.param.pword[0]==NET_PROPAGATE) && (m.param.pword[6] == VLP_REMOTE_INSTANCE_OK))
-   {
-    interp->RInstances[on] = m.param.pword[7];
-    break;
-   }  
-  read(net_sock,&m,sizeof(MESSAGE));  
- }
-
- Net_Notify->setEnabled(TRUE);
-
- /*bzero(&m,sizeof(MESSAGE));*/
- m.msg_type = MSG_VLP;
- m.param.pword[0] = VLP_REMOTE_INSTANCE_HERE;
- m.param.pword[1] = interp->RInstances[on];
- write(interp->sock,&m,sizeof(MESSAGE));
-}
- else /* There is no such a node! */
-{
- sprintf(s,"Warning: Node number %d not found!",on); 
- WriteMessage(s);
- WriteMessage("Allocating O-process on the local node");
- bzero(&m,sizeof(MESSAGE));
- m.msg_type = MSG_VLP;
- m.param.pword[0] = VLP_REMOTE_INSTANCE_HERE;
- m.param.pword[1] = interp->ID;
- write(interp->sock,&m,sizeof(MESSAGE));
-}
-}
+               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[3] = 0;
+               m.param.pword[4] = on;
+               m.param.pword[5] = 0;
+               m.param.pword[6] = VLP_REMOTE_INSTANCE;
+               m.param.pword[7] = interp->ID;
+               strcpy(m.param.pstr, interp->shortname);
+               write(net_sock, &m, sizeof(MESSAGE));
 
+               read(net_sock, &m, sizeof(MESSAGE));
+               while (1) {
+                       if ((m.param.pword[0] == NET_PROPAGATE) &&
+                               (m.param.pword[6] == VLP_REMOTE_INSTANCE_OK)) {
+                               interp->RInstances[on] = m.param.pword[7];
+                               break;
+                       }
+                       read(net_sock, &m, sizeof(MESSAGE));
+               }
 
-/*-----------------------------------------------*/
-/*           Close all remote instances         */
+               Net_Notify->setEnabled(TRUE);
+
+               /*bzero(&m, sizeof(MESSAGE));*/
+               m.msg_type = MSG_VLP;
+               m.param.pword[0] = VLP_REMOTE_INSTANCE_HERE;
+               m.param.pword[1] = interp->RInstances[on];
+               write(interp->sock, &m, sizeof(MESSAGE));
+       } else { /* There is no such a node! */
+               char s[255];
+               sprintf(s, "Warning: Node number %d not found!", on); 
+               WriteMessage(s);
+               WriteMessage("Allocating O-process on the local node");
+               bzero(&m, sizeof(MESSAGE));
+               m.msg_type = MSG_VLP;
+               m.param.pword[0] = VLP_REMOTE_INSTANCE_HERE;
+               m.param.pword[1] = interp->ID;
+               write(interp->sock, &m, sizeof(MESSAGE));
+       }
+}
 
+/**
+ * Closes all remote instances
+ */
 void QKernel::CloseInstances(InterpEntry *e)
 {
        MESSAGE msg;
@@ -1297,12 +1078,14 @@ void QKernel::CloseInstances(InterpEntry *e)
                        msg.param.pword[4] = i;
                        msg.param.pword[6] = VLP_CLOSE_INSTANCE;
                        msg.param.pword[7] = e->RInstances[i];
-                       write(net_sock,&msg,sizeof(MESSAGE));
+                       write(net_sock, &msg, sizeof(MESSAGE));
                }
 }
 
-
-void QKernel::Info()
+/**
+ * Displays information about virtual machine
+ */
+void QKernel::on_actionInfo_triggered()
 {
        MESSAGE m;
 
@@ -1314,23 +1097,23 @@ void QKernel::Info()
        wait_for_info = TRUE;
 }
 
-#include "kernel.moc"
+}
+}
 
-int main( int argc, char **argv )
+/**
+ * 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++) {
-               strcpy(myargs[i],"");
-       }
-       for(i=1; i < argc; i++) {
-               strcpy(myargs[i-1],argv[i]);
-       }
+       XInitThreads();
 
-       app = new QApplication(argc, argv);
-       app->setStyle(new QWindowsStyle());
-       QKernel kernel;
-       app->setMainWidget(&kernel);
-       draw.show();
-       draw.InitMessage();
+       QApplication * app = new QApplication(argc, argv);
+       loglan::vlp::QKernel kernel(argc, argv);
+       kernel.show();
+       
        return app->exec();
-}
+}
\ No newline at end of file