nxcl  @VERSION@
notQt.h
Go to the documentation of this file.
00001 /* -*-c++-*- */
00002 /***************************************************************************
00003            notQt.h: A set of Qt like functionality, especially related
00004                        to the starting of processes.
00005                              -------------------
00006     begin                : June 2007
00007     copyright            : (C) 2007 Embedded Software Foundry Ltd. (U.K.)
00008                          :     Author: Sebastian James
00009     email                : seb@esfnet.co.uk
00010  ***************************************************************************/
00011 
00012 /***************************************************************************
00013  *                                                                         *
00014  *   This program is free software; you can redistribute it and/or modify  *
00015  *   it under the terms of the GNU General Public License as published by  *
00016  *   the Free Software Foundation; either version 2 of the License, or     *
00017  *   (at your option) any later version.                                   *
00018  *                                                                         *
00019  ***************************************************************************/
00020 
00028 #ifndef _NOTQT_H_
00029 #define _NOTQT_H_
00030 
00031 #include <list>
00032 #include <vector>
00033 #include <string>
00034 #include <fstream>
00035 extern "C" {
00036 #include <sys/poll.h>
00037 }
00038 #define NOTQTPROCESS_MAIN_APP 0
00039 #define NOTQTPROCESS_FAILURE -1
00040 
00041 // Possible errors to be generated
00042 #define NOTQPROCNOERROR       0
00043 #define NOTQPROCFAILEDTOSTART 1
00044 #define NOTQPROCCRASHED       2
00045 #define NOTQPROCTIMEDOUT      3
00046 #define NOTQPROCWRITEERR      4
00047 #define NOTQPROCREADERR       5
00048 #define NOTQPROCUNKNOWN       6
00049 
00050 using namespace std;
00051 
00052 #ifdef DEBUG
00053 extern ofstream debugLogFile;
00054 # define dbgln(msg)  debugLogFile << __FUNCTION__ << ": " << msg << endl;
00055 # define dbglln(msg) debugLogFile << __PRETTY_FUNCTION__ << ": " << msg << endl;
00056 # define dbg(msg)    debugLogFile << msg;
00057 #else
00058 # define dbgln(msg)
00059 # define dbglln(msg)
00060 # define dbg(msg)
00061 #endif
00062 
00063 namespace nxcl {
00064 
00070         class notQProcessCallbacks
00071         {
00072         public:
00073                 notQProcessCallbacks() {}
00074                 virtual ~notQProcessCallbacks() {}
00075                 virtual void startedSignal (string) {}
00076                 virtual void errorSignal (int) {}
00077                 virtual void processFinishedSignal (string) {}
00078                 virtual void readyReadStandardOutputSignal (void) {}
00079                 virtual void readyReadStandardErrorSignal (void) {}
00080         };
00081 
00085         class notQProcess
00086         {
00087         public:
00088                 notQProcess();
00089                 ~notQProcess();
00093                 void writeIn (string& input);
00097                 int start (const string& program, const list<string>& args);
00101                 void terminate (void);
00102 
00111                 void probeProcess (void);
00112 
00117                 pid_t getPid (void) { return this->pid; }
00118                 int getError (void) { return this->error; }
00119                 void setError (int e) { this->error = e; }
00120                 
00121                 int getParentFD() 
00122                 { 
00123                         this->parentFD = this->parentToChild[1];
00124                         close(this->childToParent[0]);
00125 
00126                         // Create new pipes
00127                         pipe(this->parentToChild);
00128                         pipe(this->childToParent);
00129 
00130                         return this->parentFD;
00131                 }
00132 
00136                 void setCallbacks (notQProcessCallbacks * cb) { this->callbacks = cb; }
00138 
00143                 string readAllStandardOutput (void);
00144                 string readAllStandardError (void);
00150                 bool waitForStarted (void);
00152         private:
00156                 string progName;
00160                 list<string> environment;
00164                 int error;
00168                 pid_t pid;
00174                 bool signalledStart;
00178                 int parentToChild[2];
00182                 int childToParent[2];
00186                 int childErrToParent[2];
00190                 struct pollfd * p;
00194                 notQProcessCallbacks * callbacks;
00195 
00199                 int parentFD;
00200         };
00201 
00205         class notQTemporaryFile
00206         {
00207         public:
00208                 notQTemporaryFile();
00209                 ~notQTemporaryFile();
00215                 void open (void);
00219                 void write (string input);
00223                 void close (void);
00227                 string fileName (void);
00231                 void remove (void);
00232 
00233         private:
00237                 string theFileName;
00241                 fstream f;
00242         };
00243 
00247         class notQtUtilities
00248         {
00249         public:
00250                 notQtUtilities();
00251                 ~notQtUtilities();
00252 
00254                 static string simplify (string& input);
00258                 static void splitString (string& line, char token, vector<string>& rtn);
00262                 static void splitString (string& line, char token, list<string>& rtn);
00266                 static int ensureUnixNewlines (std::string& input);
00267         };
00268 
00269 } // namespace
00270 #endif