summaryrefslogtreecommitdiff
path: root/libopie
authorsandman <sandman>2002-12-17 19:12:05 (UTC)
committer sandman <sandman>2002-12-17 19:12:05 (UTC)
commitb6a03145553d7f536b04fc3355718cfdd72c590d (patch) (unidiff)
treecfadab49e69801a2000001f80d57ec081b2c5ea4 /libopie
parent6bbe59222c6b439f2016d0a36a111f17d338d120 (diff)
downloadopie-b6a03145553d7f536b04fc3355718cfdd72c590d.zip
opie-b6a03145553d7f536b04fc3355718cfdd72c590d.tar.gz
opie-b6a03145553d7f536b04fc3355718cfdd72c590d.tar.bz2
- removed a the obsolete KShellProcess class
- added a few methods to OProcess to make it easier to port programs using QProcess
Diffstat (limited to 'libopie') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie/oprocess.cpp94
-rw-r--r--libopie/oprocess.h72
2 files changed, 56 insertions, 110 deletions
diff --git a/libopie/oprocess.cpp b/libopie/oprocess.cpp
index f3e52bd..5db2b6c 100644
--- a/libopie/oprocess.cpp
+++ b/libopie/oprocess.cpp
@@ -81,48 +81,68 @@
81 81
82///////////////////////////// 82/////////////////////////////
83// public member functions // 83// public member functions //
84///////////////////////////// 84/////////////////////////////
85 85
86class OProcessPrivate { 86class OProcessPrivate {
87public: 87public:
88 OProcessPrivate() : useShell(false) { } 88 OProcessPrivate() : useShell(false) { }
89 89
90 bool useShell; 90 bool useShell;
91 QMap<QString,QString> env; 91 QMap<QString,QString> env;
92 QString wd; 92 QString wd;
93 QCString shell; 93 QCString shell;
94}; 94};
95 95
96 96
97OProcess::OProcess() 97OProcess::OProcess(QObject *parent, const char *name)
98 : QObject(), 98 : QObject(parent, name)
99 run_mode(NotifyOnExit),
100 runs(false),
101 pid_(0),
102 status(0),
103 keepPrivs(false),
104 innot(0),
105 outnot(0),
106 errnot(0),
107 communication(NoCommunication),
108 input_data(0),
109 input_sent(0),
110 input_total(0),
111 d(0)
112{ 99{
100 init ( );
101}
102
103OProcess::OProcess(const QString &arg0, QObject *parent, const char *name)
104 : QObject(parent, name)
105{
106 init ( );
107 *this << arg0;
108}
109
110OProcess::OProcess(const QStringList &args, QObject *parent, const char *name)
111 : QObject(parent, name)
112{
113 init ( );
114 *this << args;
115}
116
117void OProcess::init ( )
118{
119 run_mode = NotifyOnExit;
120 runs = false;
121 pid_ = 0;
122 status = 0;
123 keepPrivs = false;
124 innot = 0;
125 outnot = 0;
126 errnot = 0;
127 communication = NoCommunication;
128 input_data = 0;
129 input_sent = 0;
130 input_total = 0;
131 d = 0;
132
113 if (0 == OProcessController::theOProcessController) { 133 if (0 == OProcessController::theOProcessController) {
114 (void) new OProcessController(); 134 (void) new OProcessController();
115 CHECK_PTR(OProcessController::theOProcessController); 135 CHECK_PTR(OProcessController::theOProcessController);
116 } 136 }
117 137
118 OProcessController::theOProcessController->addOProcess(this); 138 OProcessController::theOProcessController->addOProcess(this);
119 out[0] = out[1] = -1; 139 out[0] = out[1] = -1;
120 in[0] = in[1] = -1; 140 in[0] = in[1] = -1;
121 err[0] = err[1] = -1; 141 err[0] = err[1] = -1;
122} 142}
123 143
124void 144void
125OProcess::setEnvironment(const QString &name, const QString &value) 145OProcess::setEnvironment(const QString &name, const QString &value)
126{ 146{
127 if (!d) 147 if (!d)
128 d = new OProcessPrivate; 148 d = new OProcessPrivate;
@@ -459,32 +479,46 @@ bool OProcess::writeStdin(const char *buffer, int buflen)
459 // kprocess... 479 // kprocess...
460 if (0 != input_data) 480 if (0 != input_data)
461 return false; 481 return false;
462 482
463 if (runs && (communication & Stdin)) { 483 if (runs && (communication & Stdin)) {
464 input_data = buffer; 484 input_data = buffer;
465 input_sent = 0; 485 input_sent = 0;
466 input_total = buflen; 486 input_total = buflen;
467 slotSendData(0); 487 slotSendData(0);
468 innot->setEnabled(true); 488 innot->setEnabled(true);
469 rv = true; 489 rv = true;
470 } else 490 } else
471 rv = false; 491 rv = false;
472 return rv; 492 return rv;
473} 493}
474 494
495void OProcess::flushStdin ( )
496{
497 if ( !input_data || ( input_sent == input_total ))
498 return;
499
500 int d1, d2;
501
502 do {
503 d1 = input_total - input_sent;
504 slotSendData ( 0 );
505 d2 = input_total - input_sent;
506 } while ( d2 <= d1 );
507}
508
475void OProcess::suspend() 509void OProcess::suspend()
476{ 510{
477 if ((communication & Stdout) && outnot) 511 if ((communication & Stdout) && outnot)
478 outnot->setEnabled(false); 512 outnot->setEnabled(false);
479} 513}
480 514
481void OProcess::resume() 515void OProcess::resume()
482{ 516{
483 if ((communication & Stdout) && outnot) 517 if ((communication & Stdout) && outnot)
484 outnot->setEnabled(true); 518 outnot->setEnabled(true);
485} 519}
486 520
487bool OProcess::closeStdin() 521bool OProcess::closeStdin()
488{ 522{
489 bool rv; 523 bool rv;
490 524
@@ -875,48 +909,18 @@ bool OProcess::isExecutable(const QCString &filename)
875#ifdef S_ISSOCK 909#ifdef S_ISSOCK
876 // CC: SYSVR4 systems don't have that macro 910 // CC: SYSVR4 systems don't have that macro
877 (S_ISSOCK(fileinfo.st_mode)) || 911 (S_ISSOCK(fileinfo.st_mode)) ||
878#endif 912#endif
879 (S_ISFIFO(fileinfo.st_mode)) || 913 (S_ISFIFO(fileinfo.st_mode)) ||
880 (S_ISDIR(fileinfo.st_mode)) ) { 914 (S_ISDIR(fileinfo.st_mode)) ) {
881 return false; 915 return false;
882 } 916 }
883 917
884 // CC: now check for permission to execute the file 918 // CC: now check for permission to execute the file
885 if (access(filename.data(), X_OK) != 0) return false; 919 if (access(filename.data(), X_OK) != 0) return false;
886 920
887 // CC: we've passed all the tests... 921 // CC: we've passed all the tests...
888 return true; 922 return true;
889} 923}
890 924
891void OProcess::virtual_hook( int, void* )
892{ /*BASE::virtual_hook( id, data );*/ }
893
894
895///////////////////////////
896// CC: Class KShellProcess
897///////////////////////////
898
899KShellProcess::KShellProcess(const char *shellname):
900 OProcess()
901{
902 setUseShell(true, shellname);
903}
904
905
906KShellProcess::~KShellProcess() {
907}
908
909QString KShellProcess::quote(const QString &arg)
910{
911 return OProcess::quote(arg);
912}
913
914bool KShellProcess::start(RunMode runmode, Communication comm)
915{
916 return OProcess::start(runmode, comm);
917}
918 925
919void KShellProcess::virtual_hook( int id, void* data )
920{ OProcess::virtual_hook( id, data ); }
921 926
922//#include "kprocess.moc"
diff --git a/libopie/oprocess.h b/libopie/oprocess.h
index fd726b4..bf5fe0e 100644
--- a/libopie/oprocess.h
+++ b/libopie/oprocess.h
@@ -174,33 +174,35 @@ public:
174 * The application does not receive notifications from the subprocess when 174 * The application does not receive notifications from the subprocess when
175 * it is finished or aborted. 175 * it is finished or aborted.
176 */ 176 */
177 DontCare, 177 DontCare,
178 /** 178 /**
179 * The application is notified when the subprocess dies. 179 * The application is notified when the subprocess dies.
180 */ 180 */
181 NotifyOnExit, 181 NotifyOnExit,
182 /** 182 /**
183 * The application is suspended until the started process is finished. 183 * The application is suspended until the started process is finished.
184 */ 184 */
185 Block }; 185 Block };
186 186
187 /** 187 /**
188 * Constructor 188 * Constructor
189 */ 189 */
190 OProcess(); 190 OProcess(QObject *parent = 0, const char *name = 0);
191 OProcess(const QString &arg0, QObject *parent = 0, const char *name = 0);
192 OProcess(const QStringList &args, QObject *parent = 0, const char *name = 0);
191 193
192 /** 194 /**
193 *Destructor: 195 *Destructor:
194 * 196 *
195 * If the process is running when the destructor for this class 197 * If the process is running when the destructor for this class
196 * is called, the child process is killed with a SIGKILL, but 198 * is called, the child process is killed with a SIGKILL, but
197 * only if the run mode is not of type @p DontCare. 199 * only if the run mode is not of type @p DontCare.
198 * Processes started as @p DontCare keep running anyway. 200 * Processes started as @p DontCare keep running anyway.
199 */ 201 */
200 virtual ~OProcess(); 202 virtual ~OProcess();
201 203
202 /** 204 /**
203 @deprecated 205 @deprecated
204 206
205 The use of this function is now deprecated. -- Please use the 207 The use of this function is now deprecated. -- Please use the
206 "operator<<" instead of "setExecutable". 208 "operator<<" instead of "setExecutable".
@@ -347,32 +349,34 @@ public:
347 * @ref writeStdin() is still in progress. 349 * @ref writeStdin() is still in progress.
348 * 350 *
349 * Please note that the data is sent to the client asynchronously, 351 * Please note that the data is sent to the client asynchronously,
350 * so when this function returns, the data might not have been 352 * so when this function returns, the data might not have been
351 * processed by the child process. 353 * processed by the child process.
352 * 354 *
353 * If all the data has been sent to the client, the signal 355 * If all the data has been sent to the client, the signal
354 * @ref wroteStdin() will be emitted. 356 * @ref wroteStdin() will be emitted.
355 * 357 *
356 * Please note that you must not free "buffer" or call @ref writeStdin() 358 * Please note that you must not free "buffer" or call @ref writeStdin()
357 * again until either a @ref wroteStdin() signal indicates that the 359 * again until either a @ref wroteStdin() signal indicates that the
358 * data has been sent or a @ref processHasExited() signal shows that 360 * data has been sent or a @ref processHasExited() signal shows that
359 * the child process is no longer alive... 361 * the child process is no longer alive...
360 **/ 362 **/
361 bool writeStdin(const char *buffer, int buflen); 363 bool writeStdin(const char *buffer, int buflen);
362 364
365 void flushStdin();
366
363 /** 367 /**
364 * This causes the stdin file descriptor of the child process to be 368 * This causes the stdin file descriptor of the child process to be
365 * closed indicating an "EOF" to the child. 369 * closed indicating an "EOF" to the child.
366 * 370 *
367 * @return @p false if no communication to the process's stdin 371 * @return @p false if no communication to the process's stdin
368 * had been specified in the call to @ref start(). 372 * had been specified in the call to @ref start().
369 */ 373 */
370 bool closeStdin(); 374 bool closeStdin();
371 375
372 /** 376 /**
373 * This causes the stdout file descriptor of the child process to be 377 * This causes the stdout file descriptor of the child process to be
374 * closed. 378 * closed.
375 * 379 *
376 * @return @p false if no communication to the process's stdout 380 * @return @p false if no communication to the process's stdout
377 * had been specified in the call to @ref start(). 381 * had been specified in the call to @ref start().
378 */ 382 */
@@ -718,88 +722,26 @@ private:
718 * not listed in /etc/shells will not used. 722 * not listed in /etc/shells will not used.
719 * 723 *
720 * @li If no valid shell could be found, "/bin/sh" is used as a last resort. 724 * @li If no valid shell could be found, "/bin/sh" is used as a last resort.
721 */ 725 */
722 QCString searchShell(); 726 QCString searchShell();
723 727
724 /** 728 /**
725 * Used by @ref searchShell in order to find out whether the shell found 729 * Used by @ref searchShell in order to find out whether the shell found
726 * is actually executable at all. 730 * is actually executable at all.
727 */ 731 */
728 bool isExecutable(const QCString &filename); 732 bool isExecutable(const QCString &filename);
729 733
730 // Disallow assignment and copy-construction 734 // Disallow assignment and copy-construction
731 OProcess( const OProcess& ); 735 OProcess( const OProcess& );
732 OProcess& operator= ( const OProcess& ); 736 OProcess& operator= ( const OProcess& );
733 737
734protected:
735 virtual void virtual_hook( int id, void* data );
736private:
737 OProcessPrivate *d;
738};
739
740class KShellProcessPrivate;
741
742/**
743* @obsolete
744*
745* This class is obsolete. Use OProcess and OProcess::setUseShell(true)
746* instead.
747*
748* @short A class derived from @ref OProcess to start child
749 * processes through a shell.
750* @author Christian Czezakte <e9025461@student.tuwien.ac.at>
751* @version $Id$
752*/
753class KShellProcess: public OProcess
754{
755 Q_OBJECT
756
757public:
758
759 /**
760 * Constructor
761 *
762 * By specifying the name of a shell (like "/bin/bash") you can override
763 * the mechanism for finding a valid shell as described in OProcess::searchShell()
764 */
765 KShellProcess(const char *shellname=0);
766
767 /**
768 * Destructor.
769 */
770 ~KShellProcess();
771
772 /**
773 * Starts up the process. -- For a detailed description
774 * have a look at the "start" member function and the detailed
775 * description of @ref OProcess .
776 */
777 virtual bool start(RunMode runmode = NotifyOnExit,
778 Communication comm = NoCommunication);
779
780 /**
781 * This function can be used to quote an argument string such that
782 * the shell processes it properly. This is e. g. necessary for
783 * user-provided file names which may contain spaces or quotes.
784 * It also prevents expansion of wild cards and environment variables.
785 */
786 static QString quote(const QString &arg);
787
788private: 738private:
739 void init ( );
789 740
790 QCString shell; 741 OProcessPrivate *d;
791
792 // Disallow assignment and copy-construction
793 KShellProcess( const KShellProcess& );
794 KShellProcess& operator= ( const KShellProcess& );
795
796protected:
797 virtual void virtual_hook( int id, void* data );
798private:
799 KShellProcessPrivate *d;
800}; 742};
801 743
802 744
803 745
804#endif 746#endif
805 747