summaryrefslogtreecommitdiffabout
path: root/microkde
Side-by-side diff
Diffstat (limited to 'microkde') (more/less context) (ignore whitespace changes)
-rw-r--r--microkde/oprocctrl.cpp285
-rw-r--r--microkde/oprocctrl.h129
-rw-r--r--microkde/oprocess.cpp952
-rw-r--r--microkde/oprocess.h761
-rw-r--r--microkde/words.sort.txt549
5 files changed, 0 insertions, 2676 deletions
diff --git a/microkde/oprocctrl.cpp b/microkde/oprocctrl.cpp
deleted file mode 100644
index 404e0b3..0000000
--- a/microkde/oprocctrl.cpp
+++ b/dev/null
@@ -1,285 +0,0 @@
-/* This file is part of the KDE libraries
- Copyright (C) 1997 Christian Czezakte (e9025461@student.tuwien.ac.at)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
-*/
-//
-// KPROCESSCONTROLLER -- A helper class for KProcess
-//
-// version 0.3.1, Jan, 8th 1997
-//
-// (C) Christian Czezatke
-// e9025461@student.tuwien.ac.at
-// Ported by Holger Freyther
-//
-
-//#include <config.h>
-
-#include <sys/types.h>
-#include <sys/socket.h>
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <assert.h>
-
-#include <qsocketnotifier.h>
-#include "oprocctrl.h"
-
-using namespace Opie::Core::Internal;
-
-OProcessController *OProcessController::theOProcessController = 0;
-
-struct sigaction OProcessController::oldChildHandlerData;
-bool OProcessController::handlerSet = false;
-
-OProcessController::OProcessController()
-{
- assert( theOProcessController == 0 );
-
- if (0 > pipe(fd))
- printf(strerror(errno));
-
- notifier = new QSocketNotifier(fd[0], QSocketNotifier::Read);
- notifier->setEnabled(true);
- QObject::connect(notifier, SIGNAL(activated(int)),
- this, SLOT(slotDoHousekeeping(int)));
- connect( &delayedChildrenCleanupTimer, SIGNAL( timeout()),
- SLOT( delayedChildrenCleanup()));
-
- theOProcessController = this;
-
- setupHandlers();
-}
-
-
-void OProcessController::setupHandlers()
-{
- if( handlerSet )
- return;
- struct sigaction act;
- act.sa_handler=theSigCHLDHandler;
- sigemptyset(&(act.sa_mask));
- sigaddset(&(act.sa_mask), SIGCHLD);
- // Make sure we don't block this signal. gdb tends to do that :-(
- sigprocmask(SIG_UNBLOCK, &(act.sa_mask), 0);
-
- act.sa_flags = SA_NOCLDSTOP;
-
- // CC: take care of SunOS which automatically restarts interrupted system
- // calls (and thus does not have SA_RESTART)
-
-#ifdef SA_RESTART
- act.sa_flags |= SA_RESTART;
-#endif
-
- sigaction( SIGCHLD, &act, &oldChildHandlerData );
-
- act.sa_handler=SIG_IGN;
- sigemptyset(&(act.sa_mask));
- sigaddset(&(act.sa_mask), SIGPIPE);
- act.sa_flags = 0;
- sigaction( SIGPIPE, &act, 0L);
- handlerSet = true;
-}
-
-void OProcessController::resetHandlers()
-{
- if( !handlerSet )
- return;
- sigaction( SIGCHLD, &oldChildHandlerData, 0 );
- // there should be no problem with SIGPIPE staying SIG_IGN
- handlerSet = false;
-}
-
-// block SIGCHLD handler, because it accesses processList
-void OProcessController::addOProcess( OProcess* p )
-{
- sigset_t newset, oldset;
- sigemptyset( &newset );
- sigaddset( &newset, SIGCHLD );
- sigprocmask( SIG_BLOCK, &newset, &oldset );
- processList.append( p );
- sigprocmask( SIG_SETMASK, &oldset, 0 );
-}
-
-void OProcessController::removeOProcess( OProcess* p )
-{
- sigset_t newset, oldset;
- sigemptyset( &newset );
- sigaddset( &newset, SIGCHLD );
- sigprocmask( SIG_BLOCK, &newset, &oldset );
- processList.remove( p );
- sigprocmask( SIG_SETMASK, &oldset, 0 );
-}
-
-//using a struct which contains both the pid and the status makes it easier to write
-//and read the data into the pipe
-//especially this solves a problem which appeared on my box where slotDoHouseKeeping() received
-//only 4 bytes (with some debug output around the write()'s it received all 8 bytes)
-//don't know why this happened, but when writing all 8 bytes at once it works here, aleXXX
-struct waitdata
-{
- pid_t pid;
- int status;
-};
-
-void OProcessController::theSigCHLDHandler(int arg)
-{
- struct waitdata wd;
- // int status;
- // pid_t this_pid;
- int saved_errno;
-
- saved_errno = errno;
- // since waitpid and write change errno, we have to save it and restore it
- // (Richard Stevens, Advanced programming in the Unix Environment)
-
- bool found = false;
- if( theOProcessController != 0 )
- {
- // iterating the list doesn't perform any system call
- for( QValueList<OProcess*>::ConstIterator it = theOProcessController->processList.begin();
- it != theOProcessController->processList.end();
- ++it )
- {
- if( !(*it)->isRunning())
- continue;
- wd.pid = waitpid( (*it)->pid(), &wd.status, WNOHANG );
- if ( wd.pid > 0 )
- {
- ::write(theOProcessController->fd[1], &wd, sizeof(wd));
- found = true;
- }
- }
- }
- if( !found && oldChildHandlerData.sa_handler != SIG_IGN
- && oldChildHandlerData.sa_handler != SIG_DFL )
- oldChildHandlerData.sa_handler( arg ); // call the old handler
- // handle the rest
- if( theOProcessController != 0 )
- {
- static const struct waitdata dwd = { 0, 0 }
- ; // delayed waitpid()
- ::write(theOProcessController->fd[1], &dwd, sizeof(dwd));
- }
- else
- {
- int dummy;
- while( waitpid( -1, &dummy, WNOHANG ) > 0 )
- ;
- }
-
- errno = saved_errno;
-}
-
-
-
-void OProcessController::slotDoHousekeeping(int )
-{
- unsigned int bytes_read = 0;
- unsigned int errcnt=0;
- // read pid and status from the pipe.
- struct waitdata wd;
- while ((bytes_read < sizeof(wd)) && (errcnt < 50))
- {
- int r = ::read(fd[0], ((char *)&wd) + bytes_read, sizeof(wd) - bytes_read);
- if (r > 0) bytes_read += r;
- else if (r < 0) errcnt++;
- }
- if (errcnt >= 50)
- {
- fprintf(stderr,
- "Error: Max. error count for pipe read "
- "exceeded in OProcessController::slotDoHousekeeping\n");
- return; // it makes no sense to continue here!
- }
- if (bytes_read != sizeof(wd))
- {
- fprintf(stderr,
- "Error: Could not read info from signal handler %d <> %d!\n",
- bytes_read, sizeof(wd));
- return; // it makes no sense to continue here!
- }
- if (wd.pid==0)
- { // special case, see delayedChildrenCleanup()
- delayedChildrenCleanupTimer.start( 1000, true );
- return;
- }
-
- for( QValueList<OProcess*>::ConstIterator it = processList.begin();
- it != processList.end();
- ++it )
- {
- OProcess* proc = *it;
- if (proc->pid() == wd.pid)
- {
- // process has exited, so do emit the respective events
- if (proc->run_mode == OProcess::Block)
- {
- // If the reads are done blocking then set the status in proc
- // but do nothing else because OProcess will perform the other
- // actions of processHasExited.
- proc->status = wd.status;
- proc->runs = false;
- }
- else
- {
- proc->processHasExited(wd.status);
- }
- return;
- }
- }
-}
-
-// this is needed e.g. for popen(), which calls waitpid() checking
-// for its forked child, if we did waitpid() directly in the SIGCHLD
-// handler, popen()'s waitpid() call would fail
-void OProcessController::delayedChildrenCleanup()
-{
- struct waitdata wd;
- while(( wd.pid = waitpid( -1, &wd.status, WNOHANG ) ) > 0 )
- {
- for( QValueList<OProcess*>::ConstIterator it = processList.begin();
- it != processList.end();
- ++it )
- {
- if( !(*it)->isRunning() || (*it)->pid() != wd.pid )
- continue;
- // it's OProcess, handle it
- ::write(fd[1], &wd, sizeof(wd));
- break;
- }
- }
-}
-
-OProcessController::~OProcessController()
-{
- assert( theOProcessController == this );
- resetHandlers();
-
- notifier->setEnabled(false);
-
- close(fd[0]);
- close(fd[1]);
-
- delete notifier;
- theOProcessController = 0;
-}
-
-//#include "kprocctrl.moc"
diff --git a/microkde/oprocctrl.h b/microkde/oprocctrl.h
deleted file mode 100644
index ea00859..0000000
--- a/microkde/oprocctrl.h
+++ b/dev/null
@@ -1,129 +0,0 @@
-/* This file is part of the KDE libraries
- Copyright (C) 1997 Christian Czezakte (e9025461@student.tuwien.ac.at)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
-*/
-//
-// KPROCESSCONTROLLER -- A helper class for KProcess
-//
-// version 0.3.1, Jan 8th 1997
-//
-// (C) Christian Czezatke
-// e9025461@student.tuwien.ac.at
-// Ported by Holger Freyther
-//
-
-#ifndef __KPROCCTRL_H__
-#define __KPROCCTRL_H__
-
-#include <qvaluelist.h>
-#include <qtimer.h>
-
-#include "oprocess.h"
-
-class QSocketNotifier;
-
-
-namespace Opie {
-namespace Core {
-namespace Internal {
-class OProcessControllerPrivate;
-
-/**
- * @short Used internally by @ref OProcess
- * @internal
- * @author Christian Czezakte <e9025461@student.tuwien.ac.at>
- *
- * A class for internal use by OProcess only. -- Exactly one instance
- * of this class is generated by the first instance of OProcess that is
- * created (a pointer to it gets stored in @ref theOProcessController ).
- *
- * This class takes care of the actual (UN*X) signal handling.
-*/
-class OProcessController : public QObject
-{
- Q_OBJECT
-
-public:
- OProcessController();
- ~OProcessController();
- //CC: WARNING! Destructor Not virtual (but you don't derive classes from this anyhow...)
-
-public:
-
- /**
- * Only a single instance of this class is allowed at a time,
- * and this static variable is used to track the one instance.
- */
- static OProcessController *theOProcessController;
-
- /**
- * Automatically called upon SIGCHLD.
- *
- * Normally you do not need to do anything with this function but
- * if your application needs to disable SIGCHLD for some time for
- * reasons beyond your control, you should call this function afterwards
- * to make sure that no SIGCHLDs where missed.
- */
- static void theSigCHLDHandler(int signal);
- // handler for sigchld
-
- /**
- * @internal
- */
- static void setupHandlers();
- /**
- * @internal
- */
- static void resetHandlers();
- /**
- * @internal
- */
- void addOProcess( OProcess* );
- /**
- * @internal
- */
- void removeOProcess( OProcess* );
-public slots:
- /**
- * @internal
- */
- void slotDoHousekeeping(int socket);
-
-private slots:
- void delayedChildrenCleanup();
-private:
- int fd[2];
- QSocketNotifier *notifier;
- static struct sigaction oldChildHandlerData;
- static bool handlerSet;
- QValueList<OProcess*> processList;
- QTimer delayedChildrenCleanupTimer;
-
- // Disallow assignment and copy-construction
- OProcessController( const OProcessController& );
- OProcessController& operator= ( const OProcessController& );
-
- OProcessControllerPrivate *d;
-};
-
-}
-}
-}
-
-
-#endif
-
diff --git a/microkde/oprocess.cpp b/microkde/oprocess.cpp
deleted file mode 100644
index a935792..0000000
--- a/microkde/oprocess.cpp
+++ b/dev/null
@@ -1,952 +0,0 @@
-/*
-                This file is part of the Opie Project
-             Copyright (C) 2002-2004 Holger Freyther <zecke@handhelds.org>
- and The Opie Team <opie-devel@handhelds.org>
- =. Based on KProcess (C) 1997 Christian Czezatke (e9025461@student.tuwien.ac.at)
- .=l.
-          .>+-=
-_;:,     .>    :=|. This program is free software; you can
-.> <`_,   >  .   <= redistribute it and/or modify it under
-:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
-.="- .-=="i,     .._ License as published by the Free Software
-- .   .-<_>     .<> Foundation; either version 2 of the License,
-    ._= =}       : or (at your option) any later version.
-   .%`+i>       _;_.
-   .i_,=:_.      -<s. 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
-..}^=.=       =       ; Library General Public License for more
-++=   -.     .`     .: details.
-:     =  ...= . :.=-
--.   .:....=;==+<; You should have received a copy of the GNU
- -_. . .   )=.  = Library General Public License along with
-   --        :-=` this library; see the file COPYING.LIB.
- If not, write to the Free Software Foundation,
- Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
-*/
-
-#include "oprocctrl.h"
-
-/* OPIE */
-#include <oprocess.h>
-
-/* QT */
-
-#include <qapplication.h>
-#include <qdir.h>
-#include <qmap.h>
-#include <qregexp.h>
-#include <qsocketnotifier.h>
-#include <qtextstream.h>
-
-/* STD */
-#include <errno.h>
-#include <fcntl.h>
-#include <pwd.h>
-#include <stdlib.h>
-#include <signal.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/socket.h>
-#include <unistd.h>
-#ifdef HAVE_SYS_SELECT_H
-#include <sys/select.h>
-#endif
-#ifdef HAVE_INITGROUPS
-#include <grp.h>
-#endif
-
-using namespace Opie::Core::Internal;
-
-namespace Opie {
-namespace Core {
-namespace Internal {
-class OProcessPrivate
-{
-public:
- OProcessPrivate() : useShell( false )
- { }
-
- bool useShell;
- QMap<QString, QString> env;
- QString wd;
- QCString shell;
-};
-}
-
-OProcess::OProcess( QObject *parent, const char *name )
- : QObject( parent, name )
-{
- init ( );
-}
-
-OProcess::OProcess( const QString &arg0, QObject *parent, const char *name )
- : QObject( parent, name )
-{
- init ( );
- *this << arg0;
-}
-
-OProcess::OProcess( const QStringList &args, QObject *parent, const char *name )
- : QObject( parent, name )
-{
- init ( );
- *this << args;
-}
-
-void OProcess::init ( )
-{
- run_mode = NotifyOnExit;
- runs = false;
- pid_ = 0;
- status = 0;
- keepPrivs = false;
- innot = 0;
- outnot = 0;
- errnot = 0;
- communication = NoCommunication;
- input_data = 0;
- input_sent = 0;
- input_total = 0;
- d = 0;
-
- if ( 0 == OProcessController::theOProcessController )
- {
- ( void ) new OProcessController();
- CHECK_PTR( OProcessController::theOProcessController );
- }
-
- OProcessController::theOProcessController->addOProcess( this );
- out[ 0 ] = out[ 1 ] = -1;
- in[ 0 ] = in[ 1 ] = -1;
- err[ 0 ] = err[ 1 ] = -1;
-}
-
-void OProcess::setEnvironment( const QString &name, const QString &value )
-{
- if ( !d )
- d = new OProcessPrivate;
- d->env.insert( name, value );
-}
-
-void OProcess::setWorkingDirectory( const QString &dir )
-{
- if ( !d )
- d = new OProcessPrivate;
- d->wd = dir;
-}
-
-void OProcess::setupEnvironment()
-{
- if ( d )
- {
- QMap<QString, QString>::Iterator it;
- for ( it = d->env.begin(); it != d->env.end(); ++it )
- setenv( QFile::encodeName( it.key() ).data(),
- QFile::encodeName( it.data() ).data(), 1 );
- if ( !d->wd.isEmpty() )
- chdir( QFile::encodeName( d->wd ).data() );
- }
-}
-
-void OProcess::setRunPrivileged( bool keepPrivileges )
-{
- keepPrivs = keepPrivileges;
-}
-
-bool OProcess::runPrivileged() const
-{
- return keepPrivs;
-}
-
-OProcess::~OProcess()
-{
- // destroying the OProcess instance sends a SIGKILL to the
- // child process (if it is running) after removing it from the
- // list of valid processes (if the process is not started as
- // "DontCare")
-
- OProcessController::theOProcessController->removeOProcess( this );
- // this must happen before we kill the child
- // TODO: block the signal while removing the current process from the process list
-
- if ( runs && ( run_mode != DontCare ) )
- kill( SIGKILL );
-
- // Clean up open fd's and socket notifiers.
- closeStdin();
- closeStdout();
- closeStderr();
-
- // TODO: restore SIGCHLD and SIGPIPE handler if this is the last OProcess
- delete d;
-}
-
-void OProcess::detach()
-{
- OProcessController::theOProcessController->removeOProcess( this );
-
- runs = false;
- pid_ = 0;
-
- // Clean up open fd's and socket notifiers.
- closeStdin();
- closeStdout();
- closeStderr();
-}
-
-bool OProcess::setExecutable( const QString& proc )
-{
- if ( runs )
- return false;
-
- if ( proc.isEmpty() )
- return false;
-
- if ( !arguments.isEmpty() )
- arguments.remove( arguments.begin() );
- arguments.prepend( QFile::encodeName( proc ) );
-
- return true;
-}
-
-OProcess &OProcess::operator<<( const QStringList& args )
-{
- QStringList::ConstIterator it = args.begin();
- for ( ; it != args.end() ; ++it )
- arguments.append( QFile::encodeName( *it ) );
- return *this;
-}
-
-OProcess &OProcess::operator<<( const QCString& arg )
-{
- return operator<< ( arg.data() );
-}
-
-OProcess &OProcess::operator<<( const char* arg )
-{
- arguments.append( arg );
- return *this;
-}
-
-OProcess &OProcess::operator<<( const QString& arg )
-{
- arguments.append( QFile::encodeName( arg ) );
- return *this;
-}
-
-void OProcess::clearArguments()
-{
- arguments.clear();
-}
-
-bool OProcess::start( RunMode runmode, Communication comm )
-{
- uint i;
- uint n = arguments.count();
- char **arglist;
-
- if ( runs || ( 0 == n ) )
- {
- return false; // cannot start a process that is already running
- // or if no executable has been assigned
- }
- run_mode = runmode;
- status = 0;
-
- QCString shellCmd;
- if ( d && d->useShell )
- {
- if ( d->shell.isEmpty() )
- {
- qWarning( "Could not find a valid shell" );
- return false;
- }
-
- arglist = static_cast<char **>( malloc( ( 4 ) * sizeof( char * ) ) );
- for ( i = 0; i < n; i++ )
- {
- shellCmd += arguments[ i ];
- shellCmd += " "; // CC: to separate the arguments
- }
-
- arglist[ 0 ] = d->shell.data();
- arglist[ 1 ] = ( char * ) "-c";
- arglist[ 2 ] = shellCmd.data();
- arglist[ 3 ] = 0;
- }
- else
- {
- arglist = static_cast<char **>( malloc( ( n + 1 ) * sizeof( char * ) ) );
- for ( i = 0; i < n; i++ )
- arglist[ i ] = arguments[ i ].data();
- arglist[ n ] = 0;
- }
-
- if ( !setupCommunication( comm ) )
- qWarning( "Could not setup Communication!" );
-
- // We do this in the parent because if we do it in the child process
- // gdb gets confused when the application runs from gdb.
- uid_t uid = getuid();
- gid_t gid = getgid();
-#ifdef HAVE_INITGROUPS
-
- struct passwd *pw = getpwuid( uid );
-#endif
-
- int fd[ 2 ];
- if ( 0 > pipe( fd ) )
- {
- fd[ 0 ] = fd[ 1 ] = 0; // Pipe failed.. continue
- }
-
- runs = true;
-
- QApplication::flushX();
-
- // WABA: Note that we use fork() and not vfork() because
- // vfork() has unclear semantics and is not standardized.
- pid_ = fork();
-
- if ( 0 == pid_ )
- {
- if ( fd[ 0 ] )
- close( fd[ 0 ] );
- if ( !runPrivileged() )
- {
- setgid( gid );
-#if defined( HAVE_INITGROUPS)
-
- if ( pw )
- initgroups( pw->pw_name, pw->pw_gid );
-#endif
-
- setuid( uid );
- }
- // The child process
- if ( !commSetupDoneC() )
- qWarning( "Could not finish comm setup in child!" );
-
- setupEnvironment();
-
- // Matthias
- if ( run_mode == DontCare )
- setpgid( 0, 0 );
- // restore default SIGPIPE handler (Harri)
- struct sigaction act;
- sigemptyset( &( act.sa_mask ) );
- sigaddset( &( act.sa_mask ), SIGPIPE );
- act.sa_handler = SIG_DFL;
- act.sa_flags = 0;
- sigaction( SIGPIPE, &act, 0L );
-
- // We set the close on exec flag.
- // Closing of fd[1] indicates that the execvp succeeded!
- if ( fd[ 1 ] )
- fcntl( fd[ 1 ], F_SETFD, FD_CLOEXEC );
- execvp( arglist[ 0 ], arglist );
- char resultByte = 1;
- if ( fd[ 1 ] )
- write( fd[ 1 ], &resultByte, 1 );
- _exit( -1 );
- }
- else if ( -1 == pid_ )
- {
- // forking failed
-
- runs = false;
- free( arglist );
- return false;
- }
- else
- {
- if ( fd[ 1 ] )
- close( fd[ 1 ] );
- // the parent continues here
-
- // Discard any data for stdin that might still be there
- input_data = 0;
-
- // Check whether client could be started.
- if ( fd[ 0 ] )
- for ( ;; )
- {
- char resultByte;
- int n = ::read( fd[ 0 ], &resultByte, 1 );
- if ( n == 1 )
- {
- // Error
- runs = false;
- close( fd[ 0 ] );
- free( arglist );
- pid_ = 0;
- return false;
- }
- if ( n == -1 )
- {
- if ( ( errno == ECHILD ) || ( errno == EINTR ) )
- continue; // Ignore
- }
- break; // success
- }
- if ( fd[ 0 ] )
- close( fd[ 0 ] );
-
- if ( !commSetupDoneP() ) // finish communication socket setup for the parent
- qWarning( "Could not finish comm setup in parent!" );
-
- if ( run_mode == Block )
- {
- commClose();
-
- // The SIGCHLD handler of the process controller will catch
- // the exit and set the status
- while ( runs )
- {
- OProcessController::theOProcessController->
- slotDoHousekeeping( 0 );
- }
- runs = FALSE;
- emit processExited( this );
- }
- }
- free( arglist );
- return true;
-}
-
-
-
-bool OProcess::kill( int signo )
-{
- bool rv = false;
-
- if ( 0 != pid_ )
- rv = ( -1 != ::kill( pid_, signo ) );
- // probably store errno somewhere...
- return rv;
-}
-
-bool OProcess::isRunning() const
-{
- return runs;
-}
-
-pid_t OProcess::pid() const
-{
- return pid_;
-}
-
-bool OProcess::normalExit() const
-{
- int _status = status;
- return ( pid_ != 0 ) && ( !runs ) && ( WIFEXITED( ( _status ) ) );
-}
-
-int OProcess::exitStatus() const
-{
- int _status = status;
- return WEXITSTATUS( ( _status ) );
-}
-
-bool OProcess::writeStdin( const char *buffer, int buflen )
-{
- bool rv;
-
- // if there is still data pending, writing new data
- // to stdout is not allowed (since it could also confuse
- // kprocess...
- if ( 0 != input_data )
- return false;
-
- if ( runs && ( communication & Stdin ) )
- {
- input_data = buffer;
- input_sent = 0;
- input_total = buflen;
- slotSendData( 0 );
- innot->setEnabled( true );
- rv = true;
- }
- else
- rv = false;
- return rv;
-}
-
-void OProcess::flushStdin ( )
-{
- if ( !input_data || ( input_sent == input_total ) )
- return ;
-
- int d1, d2;
-
- do
- {
- d1 = input_total - input_sent;
- slotSendData ( 0 );
- d2 = input_total - input_sent;
- }
- while ( d2 <= d1 );
-}
-
-void OProcess::suspend()
-{
- if ( ( communication & Stdout ) && outnot )
- outnot->setEnabled( false );
-}
-
-void OProcess::resume()
-{
- if ( ( communication & Stdout ) && outnot )
- outnot->setEnabled( true );
-}
-
-bool OProcess::closeStdin()
-{
- bool rv;
-
- if ( communication & Stdin )
- {
- communication = ( Communication ) ( communication & ~Stdin );
- delete innot;
- innot = 0;
- close( in[ 1 ] );
- rv = true;
- }
- else
- rv = false;
- return rv;
-}
-
-bool OProcess::closeStdout()
-{
- bool rv;
-
- if ( communication & Stdout )
- {
- communication = ( Communication ) ( communication & ~Stdout );
- delete outnot;
- outnot = 0;
- close( out[ 0 ] );
- rv = true;
- }
- else
- rv = false;
- return rv;
-}
-
-bool OProcess::closeStderr()
-{
- bool rv;
-
- if ( communication & Stderr )
- {
- communication = static_cast<Communication>( communication & ~Stderr );
- delete errnot;
- errnot = 0;
- close( err[ 0 ] );
- rv = true;
- }
- else
- rv = false;
- return rv;
-}
-
-void OProcess::slotChildOutput( int fdno )
-{
- if ( !childOutput( fdno ) )
- closeStdout();
-}
-
-void OProcess::slotChildError( int fdno )
-{
- if ( !childError( fdno ) )
- closeStderr();
-}
-
-void OProcess::slotSendData( int )
-{
- if ( input_sent == input_total )
- {
- innot->setEnabled( false );
- input_data = 0;
- emit wroteStdin( this );
- }
- else
- input_sent += ::write( in[ 1 ], input_data + input_sent, input_total - input_sent );
-}
-
-void OProcess::processHasExited( int state )
-{
- if ( runs )
- {
- runs = false;
- status = state;
-
- commClose(); // cleanup communication sockets
-
- // also emit a signal if the process was run Blocking
- if ( DontCare != run_mode )
- {
- emit processExited( this );
- }
- }
-}
-
-int OProcess::childOutput( int fdno )
-{
- if ( communication & NoRead )
- {
- int len = -1;
- emit receivedStdout( fdno, len );
- errno = 0; // Make sure errno doesn't read "EAGAIN"
- return len;
- }
- else
- {
- char buffer[ 1024 ];
- int len;
-
- len = ::read( fdno, buffer, 1024 );
-
- if ( 0 < len )
- {
- emit receivedStdout( this, buffer, len );
- }
- return len;
- }
-}
-
-int OProcess::childError( int fdno )
-{
- char buffer[ 1024 ];
- int len;
-
- len = ::read( fdno, buffer, 1024 );
-
- if ( 0 < len )
- emit receivedStderr( this, buffer, len );
- return len;
-}
-
-int OProcess::setupCommunication( Communication comm )
-{
- int ok;
-
- communication = comm;
-
- ok = 1;
- if ( comm & Stdin )
- ok &= socketpair( AF_UNIX, SOCK_STREAM, 0, in ) >= 0;
-
- if ( comm & Stdout )
- ok &= socketpair( AF_UNIX, SOCK_STREAM, 0, out ) >= 0;
-
- if ( comm & Stderr )
- ok &= socketpair( AF_UNIX, SOCK_STREAM, 0, err ) >= 0;
-
- return ok;
-}
-
-int OProcess::commSetupDoneP()
-{
- int ok = 1;
-
- if ( communication != NoCommunication )
- {
- if ( communication & Stdin )
- close( in[ 0 ] );
- if ( communication & Stdout )
- close( out[ 1 ] );
- if ( communication & Stderr )
- close( err[ 1 ] );
-
- // Don't create socket notifiers and set the sockets non-blocking if
- // blocking is requested.
- if ( run_mode == Block )
- return ok;
-
- if ( communication & Stdin )
- {
- // ok &= (-1 != fcntl(in[1], F_SETFL, O_NONBLOCK));
- innot = new QSocketNotifier( in[ 1 ], QSocketNotifier::Write, this );
- CHECK_PTR( innot );
- innot->setEnabled( false ); // will be enabled when data has to be sent
- QObject::connect( innot, SIGNAL( activated(int) ),
- this, SLOT( slotSendData(int) ) );
- }
-
- if ( communication & Stdout )
- {
- // ok &= (-1 != fcntl(out[0], F_SETFL, O_NONBLOCK));
- outnot = new QSocketNotifier( out[ 0 ], QSocketNotifier::Read, this );
- CHECK_PTR( outnot );
- QObject::connect( outnot, SIGNAL( activated(int) ),
- this, SLOT( slotChildOutput(int) ) );
- if ( communication & NoRead )
- suspend();
- }
-
- if ( communication & Stderr )
- {
- // ok &= (-1 != fcntl(err[0], F_SETFL, O_NONBLOCK));
- errnot = new QSocketNotifier( err[ 0 ], QSocketNotifier::Read, this );
- CHECK_PTR( errnot );
- QObject::connect( errnot, SIGNAL( activated(int) ),
- this, SLOT( slotChildError(int) ) );
- }
- }
- return ok;
-}
-
-int OProcess::commSetupDoneC()
-{
- int ok = 1;
- struct linger so;
- memset( &so, 0, sizeof( so ) );
-
- if ( communication & Stdin )
- close( in[ 1 ] );
- if ( communication & Stdout )
- close( out[ 0 ] );
- if ( communication & Stderr )
- close( err[ 0 ] );
-
- if ( communication & Stdin )
- ok &= dup2( in[ 0 ], STDIN_FILENO ) != -1;
- else
- {
- int null_fd = open( "/dev/null", O_RDONLY );
- ok &= dup2( null_fd, STDIN_FILENO ) != -1;
- close( null_fd );
- }
- if ( communication & Stdout )
- {
- ok &= dup2( out[ 1 ], STDOUT_FILENO ) != -1;
- ok &= !setsockopt( out[ 1 ], SOL_SOCKET, SO_LINGER, ( char* ) & so, sizeof( so ) );
- }
- else
- {
- int null_fd = open( "/dev/null", O_WRONLY );
- ok &= dup2( null_fd, STDOUT_FILENO ) != -1;
- close( null_fd );
- }
- if ( communication & Stderr )
- {
- ok &= dup2( err[ 1 ], STDERR_FILENO ) != -1;
- ok &= !setsockopt( err[ 1 ], SOL_SOCKET, SO_LINGER, reinterpret_cast<char *>( &so ), sizeof( so ) );
- }
- else
- {
- int null_fd = open( "/dev/null", O_WRONLY );
- ok &= dup2( null_fd, STDERR_FILENO ) != -1;
- close( null_fd );
- }
- return ok;
-}
-
-void OProcess::commClose()
-{
- if ( NoCommunication != communication )
- {
- bool b_in = ( communication & Stdin );
- bool b_out = ( communication & Stdout );
- bool b_err = ( communication & Stderr );
- if ( b_in )
- delete innot;
-
- if ( b_out || b_err )
- {
- // If both channels are being read we need to make sure that one socket buffer
- // doesn't fill up whilst we are waiting for data on the other (causing a deadlock).
- // Hence we need to use select.
-
- // Once one or other of the channels has reached EOF (or given an error) go back
- // to the usual mechanism.
-
- int fds_ready = 1;
- fd_set rfds;
-
- int max_fd = 0;
- if ( b_out )
- {
- fcntl( out[ 0 ], F_SETFL, O_NONBLOCK );
- if ( out[ 0 ] > max_fd )
- max_fd = out[ 0 ];
- delete outnot;
- outnot = 0;
- }
- if ( b_err )
- {
- fcntl( err[ 0 ], F_SETFL, O_NONBLOCK );
- if ( err[ 0 ] > max_fd )
- max_fd = err[ 0 ];
- delete errnot;
- errnot = 0;
- }
-
-
- while ( b_out || b_err )
- {
- // * If the process is still running we block until we
- // receive data. (p_timeout = 0, no timeout)
- // * If the process has already exited, we only check
- // the available data, we don't wait for more.
- // (p_timeout = &timeout, timeout immediately)
- struct timeval timeout;
- timeout.tv_sec = 0;
- timeout.tv_usec = 0;
- struct timeval *p_timeout = runs ? 0 : &timeout;
-
- FD_ZERO( &rfds );
- if ( b_out )
- FD_SET( out[ 0 ], &rfds );
-
- if ( b_err )
- FD_SET( err[ 0 ], &rfds );
-
- fds_ready = select( max_fd + 1, &rfds, 0, 0, p_timeout );
- if ( fds_ready <= 0 )
- break;
-
- if ( b_out && FD_ISSET( out[ 0 ], &rfds ) )
- {
- int ret = 1;
- while ( ret > 0 )
- ret = childOutput( out[ 0 ] );
- if ( ( ret == -1 && errno != EAGAIN ) || ret == 0 )
- b_out = false;
- }
-
- if ( b_err && FD_ISSET( err[ 0 ], &rfds ) )
- {
- int ret = 1;
- while ( ret > 0 )
- ret = childError( err[ 0 ] );
- if ( ( ret == -1 && errno != EAGAIN ) || ret == 0 )
- b_err = false;
- }
- }
- }
-
- if ( b_in )
- {
- communication = ( Communication ) ( communication & ~Stdin );
- close( in[ 1 ] );
- }
- if ( b_out )
- {
- communication = ( Communication ) ( communication & ~Stdout );
- close( out[ 0 ] );
- }
- if ( b_err )
- {
- communication = ( Communication ) ( communication & ~Stderr );
- close( err[ 0 ] );
- }
- }
-}
-
-void OProcess::setUseShell( bool useShell, const char *shell )
-{
- if ( !d )
- d = new OProcessPrivate;
- d->useShell = useShell;
- d->shell = shell;
- if ( d->shell.isEmpty() )
- d->shell = searchShell();
-}
-
-QString OProcess::quote( const QString &arg )
-{
- QString res = arg;
- res.replace( QRegExp( QString::fromLatin1( "\'" ) ),
- QString::fromLatin1( "'\"'\"'" ) );
- res.prepend( '\'' );
- res.append( '\'' );
- return res;
-}
-
-QCString OProcess::searchShell()
-{
- QCString tmpShell = QCString( getenv( "SHELL" ) ).stripWhiteSpace();
- if ( !isExecutable( tmpShell ) )
- {
- tmpShell = "/bin/sh";
- }
-
- return tmpShell;
-}
-
-bool OProcess::isExecutable( const QCString &filename )
-{
- struct stat fileinfo;
-
- if ( filename.isEmpty() )
- return false;
-
- // CC: we've got a valid filename, now let's see whether we can execute that file
-
- if ( -1 == stat( filename.data(), &fileinfo ) )
- return false;
- // CC: return false if the file does not exist
-
- // CC: anyway, we cannot execute directories, block/character devices, fifos or sockets
- if ( ( S_ISDIR( fileinfo.st_mode ) ) ||
- ( S_ISCHR( fileinfo.st_mode ) ) ||
- ( S_ISBLK( fileinfo.st_mode ) ) ||
-#ifdef S_ISSOCK
- // CC: SYSVR4 systems don't have that macro
- ( S_ISSOCK( fileinfo.st_mode ) ) ||
-#endif
- ( S_ISFIFO( fileinfo.st_mode ) ) ||
- ( S_ISDIR( fileinfo.st_mode ) ) )
- {
- return false;
- }
-
- // CC: now check for permission to execute the file
- if ( access( filename.data(), X_OK ) != 0 )
- return false;
-
- // CC: we've passed all the tests...
- return true;
-}
-
-int OProcess::processPID( const QString& process )
-{
- QString line;
- QDir d = QDir( "/proc" );
- QStringList dirs = d.entryList( QDir::Dirs );
- QStringList::Iterator it;
- for ( it = dirs.begin(); it != dirs.end(); ++it )
- {
- //qDebug( "next entry: %s", (const char*) *it );
- QFile file( "/proc/"+*it+"/cmdline" );
- file.open( IO_ReadOnly );
- if ( !file.isOpen() ) continue;
- QTextStream t( &file );
- line = t.readLine();
- //qDebug( "cmdline = %s", (const char*) line );
- if ( line.contains( process ) ) break; //FIXME: That may find also other process, if the name is not long enough ;)
- }
- if ( line.contains( process ) )
- {
- //qDebug( "found process id #%d", (*it).toInt() );
- return (*it).toInt();
- }
- else
- {
- //qDebug( "process '%s' not found", (const char*) process );
- return 0;
- }
-}
-
-}
-}
diff --git a/microkde/oprocess.h b/microkde/oprocess.h
deleted file mode 100644
index be1436c..0000000
--- a/microkde/oprocess.h
+++ b/dev/null
@@ -1,761 +0,0 @@
-/*
-                This file is part of the Opie Project
-             Copyright (C) 2003-2004 Holger Freyther <zecke@handhelds.org>
- Copyright (C) The Opie Team <opie-devel@handhelds.org>
- =. Based on KProcess (C) 1997 Christian Czezatke (e9025461@student.tuwien.ac.at)
- .=l.
-          .>+-=
-_;:,     .>    :=|. This program is free software; you can
-.> <`_,   >  .   <= redistribute it and/or modify it under
-:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
-.="- .-=="i,     .._ License as published by the Free Software
-- .   .-<_>     .<> Foundation; either version 2 of the License,
-    ._= =}       : or (at your option) any later version.
-   .%`+i>       _;_.
-   .i_,=:_.      -<s. 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
-..}^=.=       =       ; Library General Public License for more
-++=   -.     .`     .: details.
-:     =  ...= . :.=-
--.   .:....=;==+<; You should have received a copy of the GNU
- -_. . .   )=.  = Library General Public License along with
-   --        :-=` this library; see the file COPYING.LIB.
- If not, write to the Free Software Foundation,
- Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
-*/
-
-#ifndef OPROCESS_H
-#define OPROCESS_H
-
-/* QT */
-#include <qcstring.h>
-#include <qobject.h>
-#include <qvaluelist.h>
-
-/* STD */
-#include <sys/types.h> // for pid_t
-#include <sys/wait.h>
-#include <signal.h>
-#include <unistd.h>
-
-class QSocketNotifier;
-
-namespace Opie {
-namespace Core {
-namespace Internal {
-class OProcessController;
-class OProcessPrivate;
-}
-
-/**
- * Child process invocation, monitoring and control.
- *
- * @sect General usage and features
- *
- *This class allows a KDE and OPIE application to start child processes without having
- *to worry about UN*X signal handling issues and zombie process reaping.
- *
- *@see KProcIO
- *
- *Basically, this class distinguishes three different ways of running
- *child processes:
- *
- *@li OProcess::DontCare -- The child process is invoked and both the child
- *process and the parent process continue concurrently.
- *
- *Starting a DontCare child process means that the application is
- *not interested in any notification to determine whether the
- *child process has already exited or not.
- *
- *@li OProcess::NotifyOnExit -- The child process is invoked and both the
- *child and the parent process run concurrently.
- *
- *When the child process exits, the OProcess instance
- *corresponding to it emits the Qt signal @ref processExited().
- *
- *Since this signal is @em not emitted from within a UN*X
- *signal handler, arbitrary function calls can be made.
- *
- *Be aware: When the OProcess objects gets destructed, the child
- *process will be killed if it is still running!
- *This means in particular, that you cannot use a OProcess on the stack
- *with OProcess::NotifyOnExit.
- *
- *@li OProcess::Block -- The child process starts and the parent process
- *is suspended until the child process exits. (@em Really not recommended
- *for programs with a GUI.)
- *
- *OProcess also provides several functions for determining the exit status
- *and the pid of the child process it represents.
- *
- *Furthermore it is possible to supply command-line arguments to the process
- *in a clean fashion (no null -- terminated stringlists and such...)
- *
- *A small usage example:
- *<pre>
- *OProcess *proc = new OProcess;
- *
- **proc << "my_executable";
- **proc << "These" << "are" << "the" << "command" << "line" << "args";
- *QApplication::connect(proc, SIGNAL(processExited(Opie::Core::OProcess *)),
- * pointer_to_my_object, SLOT(my_objects_slot(Opie::Core::OProcess *)));
- *proc->start();
- *</pre>
- *
- *This will start "my_executable" with the commandline arguments "These"...
- *
- *When the child process exits, the respective Qt signal will be emitted.
- *
- *@sect Communication with the child process
- *
- *OProcess supports communication with the child process through
- *stdin/stdout/stderr.
- *
- *The following functions are provided for getting data from the child
- *process or sending data to the child's stdin (For more information,
- *have a look at the documentation of each function):
- *
- *@li bool @ref writeStdin(char *buffer, int buflen);
- *@li -- Transmit data to the child process's stdin.
- *
- *@li bool @ref closeStdin();
- *@li -- Closes the child process's stdin (which causes it to see an feof(stdin)).
- *Returns false if you try to close stdin for a process that has been started
- *without a communication channel to stdin.
- *
- *@li bool @ref closeStdout();
- *@li -- Closes the child process's stdout.
- *Returns false if you try to close stdout for a process that has been started
- *without a communication channel to stdout.
- *
- *@li bool @ref closeStderr();
- *@li -- Closes the child process's stderr.
- *Returns false if you try to close stderr for a process that has been started
- *without a communication channel to stderr.
- *
- *
- *@sect QT signals:
- *
- *@li void @ref receivedStdout(OProcess *proc, char *buffer, int buflen);
- *@li void @ref receivedStderr(OProcess *proc, char *buffer, int buflen);
- *@li -- Indicates that new data has arrived from either the
- *child process's stdout or stderr.
- *
- *@li void @ref wroteStdin(OProcess *proc);
- *@li -- Indicates that all data that has been sent to the child process
- *by a prior call to @ref writeStdin() has actually been transmitted to the
- *client .
- *
- *@author Christian Czezakte e9025461@student.tuwien.ac.at
- *@author Holger Freyther (Opie Port)
- *
- **/
-class OProcess : public QObject
-{
- Q_OBJECT
-
-public:
-
- /**
- * Modes in which the communication channel can be opened.
- *
- * If communication for more than one channel is required,
- * the values have to be or'ed together, for example to get
- * communication with stdout as well as with stdin, you would
- * specify @p Stdin @p | @p Stdout
- *
- * If @p NoRead is specified in conjunction with @p Stdout,
- * no data is actually read from @p Stdout but only
- * the signal @ref childOutput(int fd) is emitted.
- */
- enum Communication { NoCommunication = 0, Stdin = 1, Stdout = 2, Stderr = 4,
- AllOutput = 6, All = 7,
- NoRead };
-
- /**
- * Run-modes for a child process.
- */
- enum RunMode {
- /**
- * The application does not receive notifications from the subprocess when
- * it is finished or aborted.
- */
- DontCare,
- /**
- * The application is notified when the subprocess dies.
- */
- NotifyOnExit,
- /**
- * The application is suspended until the started process is finished.
- */
- Block };
-
- /**
- * Constructor
- */
- OProcess( QObject *parent = 0, const char *name = 0 );
- /**
- * Constructor
- */
- OProcess( const QString &arg0, QObject *parent = 0, const char *name = 0 );
- /**
- * Constructor
- */
- OProcess( const QStringList &args, QObject *parent = 0, const char *name = 0 );
-
- /**
- *Destructor:
- *
- * If the process is running when the destructor for this class
- * is called, the child process is killed with a SIGKILL, but
- * only if the run mode is not of type @p DontCare.
- * Processes started as @p DontCare keep running anyway.
- */
- virtual ~OProcess();
-
- /**
- @deprecated
-
- The use of this function is now deprecated. -- Please use the
- "operator<<" instead of "setExecutable".
-
- Sets the executable to be started with this OProcess object.
- Returns false if the process is currently running (in that
- case the executable remains unchanged.)
-
- @see operator<<
-
- */
- bool setExecutable( const QString& proc );
-
-
- /**
- * Sets the executable and the command line argument list for this process.
- *
- * For example, doing an "ls -l /usr/local/bin" can be achieved by:
- * <pre>
- * OProcess p;
- * ...
- * p << "ls" << "-l" << "/usr/local/bin"
- * </pre>
- *
- **/
- OProcess &operator<<( const QString& arg );
- /**
- * Similar to previous method, takes a char *, supposed to be in locale 8 bit already.
- */
- OProcess &operator<<( const char * arg );
- /**
- * Similar to previous method, takes a QCString, supposed to be in locale 8 bit already.
- */
- OProcess &operator<<( const QCString & arg );
-
- /**
- * Sets the executable and the command line argument list for this process,
- * in a single method call, or add a list of arguments.
- **/
- OProcess &operator<<( const QStringList& args );
-
- /**
- * Clear a command line argument list that has been set by using
- * the "operator<<".
- */
- void clearArguments();
-
- /**
- * Starts the process.
- * For a detailed description of the
- * various run modes and communication semantics, have a look at the
- * general description of the OProcess class.
- *
- * The following problems could cause this function to
- * return false:
- *
- * @li The process is already running.
- * @li The command line argument list is empty.
- * @li The starting of the process failed (could not fork).
- * @li The executable was not found.
- *
- * @param comm Specifies which communication links should be
- * established to the child process (stdin/stdout/stderr). By default,
- * no communication takes place and the respective communication
- * signals will never get emitted.
- *
- * @return true on success, false on error
- * (see above for error conditions)
- **/
- virtual bool start( RunMode runmode = NotifyOnExit,
- Communication comm = NoCommunication );
-
- /**
- * Stop the process (by sending it a signal).
- *
- * @param signo The signal to send. The default is SIGTERM.
- * @return @p true if the signal was delivered successfully.
- */
- virtual bool kill( int signo = SIGTERM );
-
- /**
- @return @p true if the process is (still) considered to be running
- */
- bool isRunning() const;
-
- /** Returns the process id of the process.
- *
- * If it is called after
- * the process has exited, it returns the process id of the last
- * child process that was created by this instance of OProcess.
- *
- * Calling it before any child process has been started by this
- * OProcess instance causes pid() to return 0.
- **/
- pid_t pid() const;
-
- /**
- * Suspend processing of data from stdout of the child process.
- */
- void suspend();
-
- /**
- * Resume processing of data from stdout of the child process.
- */
- void resume();
-
- /**
- * @return @p true if the process has already finished and has exited
- * "voluntarily", ie: it has not been killed by a signal.
- *
- * Note that you should check @ref OProcess::exitStatus() to determine
- * whether the process completed its task successful or not.
- */
- bool normalExit() const;
-
- /**
- * Returns the exit status of the process.
- *
- * Please use
- * @ref OProcess::normalExit() to check whether the process has exited
- * cleanly (i.e., @ref OProcess::normalExit() returns @p true) before calling
- * this function because if the process did not exit normally,
- * it does not have a valid exit status.
- */
- int exitStatus() const;
-
-
- /**
- * Transmit data to the child process's stdin.
- *
- * OProcess::writeStdin may return false in the following cases:
- *
- * @li The process is not currently running.
- *
- * @li Communication to stdin has not been requested in the @ref start() call.
- *
- * @li Transmission of data to the child process by a previous call to
- * @ref writeStdin() is still in progress.
- *
- * Please note that the data is sent to the client asynchronously,
- * so when this function returns, the data might not have been
- * processed by the child process.
- *
- * If all the data has been sent to the client, the signal
- * @ref wroteStdin() will be emitted.
- *
- * Please note that you must not free "buffer" or call @ref writeStdin()
- * again until either a @ref wroteStdin() signal indicates that the
- * data has been sent or a @ref processHasExited() signal shows that
- * the child process is no longer alive...
- **/
- bool writeStdin( const char *buffer, int buflen );
-
- void flushStdin();
-
- /**
- * This causes the stdin file descriptor of the child process to be
- * closed indicating an "EOF" to the child.
- *
- * @return @p false if no communication to the process's stdin
- * had been specified in the call to @ref start().
- */
- bool closeStdin();
-
- /**
- * This causes the stdout file descriptor of the child process to be
- * closed.
- *
- * @return @p false if no communication to the process's stdout
- * had been specified in the call to @ref start().
- */
- bool closeStdout();
-
- /**
- * This causes the stderr file descriptor of the child process to be
- * closed.
- *
- * @return @p false if no communication to the process's stderr
- * had been specified in the call to @ref start().
- */
- bool closeStderr();
-
- /**
- * Lets you see what your arguments are for debugging.
- * \todo make const
- */
-
- const QValueList<QCString> &args()
- {
- return arguments;
- }
-
- /**
- * Controls whether the started process should drop any
- * setuid/segid privileges or whether it should keep them
- *
- * The default is @p false : drop privileges
- */
- void setRunPrivileged( bool keepPrivileges );
-
- /**
- * Returns whether the started process will drop any
- * setuid/segid privileges or whether it will keep them
- */
- bool runPrivileged() const;
-
- /**
- * Modifies the environment of the process to be started.
- * This function must be called before starting the process.
- */
- void setEnvironment( const QString &name, const QString &value );
-
- /**
- * Changes the current working directory (CWD) of the process
- * to be started.
- * This function must be called before starting the process.
- */
- void setWorkingDirectory( const QString &dir );
-
- /**
- * Specify whether to start the command via a shell or directly.
- * The default is to start the command directly.
- * If @p useShell is true @p shell will be used as shell, or
- * if shell is empty, the standard shell is used.
- * @p quote A flag indicating whether to quote the arguments.
- *
- * When using a shell, the caller should make sure that all filenames etc.
- * are properly quoted when passed as argument.
- * @see quote()
- */
- void setUseShell( bool useShell, const char *shell = 0 );
-
- /**
- * This function can be used to quote an argument string such that
- * the shell processes it properly. This is e. g. necessary for
- * user-provided file names which may contain spaces or quotes.
- * It also prevents expansion of wild cards and environment variables.
- */
- static QString quote( const QString &arg );
-
- /**
- * Detaches OProcess from child process. All communication is closed.
- * No exit notification is emitted any more for the child process.
- * Deleting the OProcess will no longer kill the child process.
- * Note that the current process remains the parent process of the
- * child process.
- */
- void detach();
-
- /**
- * @return the PID of @a process, or -1 if the process is not running
- */
- static int processPID( const QString& process );
-
-signals:
-
- /**
- * Emitted after the process has terminated when
- * the process was run in the @p NotifyOnExit (==default option to
- * @ref start()) or the @ref Block mode.
- **/
- void processExited( Opie::Core::OProcess *proc );
-
-
- /**
- * Emitted, when output from the child process has
- * been received on stdout.
- *
- * To actually get
- * these signals, the respective communication link (stdout/stderr)
- * has to be turned on in @ref start().
- *
- * @param buffer The data received.
- * @param buflen The number of bytes that are available.
- *
- * You should copy the information contained in @p buffer to your private
- * data structures before returning from this slot.
- **/
- void receivedStdout( Opie::Core::OProcess *proc, char *buffer, int buflen );
-
- /**
- * Emitted when output from the child process has
- * been received on stdout.
- *
- * To actually get these signals, the respective communications link
- * (stdout/stderr) has to be turned on in @ref start() and the
- * @p NoRead flag should have been passed.
- *
- * You will need to explicitly call resume() after your call to start()
- * to begin processing data from the child process's stdout. This is
- * to ensure that this signal is not emitted when no one is connected
- * to it, otherwise this signal will not be emitted.
- *
- * The data still has to be read from file descriptor @p fd.
- **/
- void receivedStdout( int fd, int &len );
-
-
- /**
- * Emitted, when output from the child process has
- * been received on stderr.
- * To actually get
- * these signals, the respective communication link (stdout/stderr)
- * has to be turned on in @ref start().
- *
- * @param buffer The data received.
- * @param buflen The number of bytes that are available.
- *
- * You should copy the information contained in @p buffer to your private
- * data structures before returning from this slot.
- */
- void receivedStderr( Opie::Core::OProcess *proc, char *buffer, int buflen );
-
- /**
- * Emitted after all the data that has been
- * specified by a prior call to @ref writeStdin() has actually been
- * written to the child process.
- **/
- void wroteStdin( Opie::Core::OProcess *proc );
-
-protected slots:
-
- /**
- * This slot gets activated when data from the child's stdout arrives.
- * It usually calls "childOutput"
- */
- void slotChildOutput( int fdno );
-
- /**
- * This slot gets activated when data from the child's stderr arrives.
- * It usually calls "childError"
- */
- void slotChildError( int fdno );
- /*
- Slot functions for capturing stdout and stderr of the child
- */
-
- /**
- * Called when another bulk of data can be sent to the child's
- * stdin. If there is no more data to be sent to stdin currently
- * available, this function must disable the QSocketNotifier "innot".
- */
- void slotSendData( int dummy );
-
-protected:
-
- /**
- * Sets up the environment according to the data passed via
- * setEnvironment(...)
- */
- void setupEnvironment();
-
- /**
- * The list of the process' command line arguments. The first entry
- * in this list is the executable itself.
- */
- QValueList<QCString> arguments;
- /**
- * How to run the process (Block, NotifyOnExit, DontCare). You should
- * not modify this data member directly from derived classes.
- */
- RunMode run_mode;
- /**
- * true if the process is currently running. You should not
- * modify this data member directly from derived classes. For
- * reading the value of this data member, please use "isRunning()"
- * since "runs" will probably be made private in later versions
- * of OProcess.
- */
- bool runs;
-
- /**
- * The PID of the currently running process (see "getPid()").
- * You should not modify this data member in derived classes.
- * Please use "getPid()" instead of directly accessing this
- * member function since it will probably be made private in
- * later versions of OProcess.
- */
- pid_t pid_;
-
- /**
- * The process' exit status as returned by "waitpid". You should not
- * modify the value of this data member from derived classes. You should
- * rather use @ref exitStatus than accessing this data member directly
- * since it will probably be made private in further versions of
- * OProcess.
- */
- int status;
-
-
- /**
- * See setRunPrivileged()
- */
- bool keepPrivs;
-
- /*
- Functions for setting up the sockets for communication.
- setupCommunication
- -- is called from "start" before "fork"ing.
- commSetupDoneP
- -- completes communication socket setup in the parent
- commSetupDoneC
- -- completes communication setup in the child process
- commClose
- -- frees all allocated communication resources in the parent
- after the process has exited
- */
-
- /**
- * This function is called from "OProcess::start" right before a "fork" takes
- * place. According to
- * the "comm" parameter this function has to initialize the "in", "out" and
- * "err" data member of OProcess.
- *
- * This function should return 0 if setting the needed communication channels
- * was successful.
- *
- * The default implementation is to create UNIX STREAM sockets for the communication,
- * but you could overload this function and establish a TCP/IP communication for
- * network communication, for example.
- */
- virtual int setupCommunication( Communication comm );
-
- /**
- * Called right after a (successful) fork on the parent side. This function
- * will usually do some communications cleanup, like closing the reading end
- * of the "stdin" communication channel.
- *
- * Furthermore, it must also create the QSocketNotifiers "innot", "outnot" and
- * "errnot" and connect their Qt slots to the respective OProcess member functions.
- *
- * For a more detailed explanation, it is best to have a look at the default
- * implementation of "setupCommunication" in kprocess.cpp.
- */
- virtual int commSetupDoneP();
-
- /**
- * Called right after a (successful) fork, but before an "exec" on the child
- * process' side. It usually just closes the unused communication ends of
- * "in", "out" and "err" (like the writing end of the "in" communication
- * channel.
- */
- virtual int commSetupDoneC();
-
-
- /**
- * Immediately called after a process has exited. This function normally
- * calls commClose to close all open communication channels to this
- * process and emits the "processExited" signal (if the process was
- * not running in the "DontCare" mode).
- */
- virtual void processHasExited( int state );
-
- /**
- * Should clean up the communication links to the child after it has
- * exited. Should be called from "processHasExited".
- */
- virtual void commClose();
-
-
- /**
- * the socket descriptors for stdin/stdout/stderr.
- */
- int out[ 2 ];
- int in[ 2 ];
- int err[ 2 ];
-
- /**
- * The socket notifiers for the above socket descriptors.
- */
- QSocketNotifier *innot;
- QSocketNotifier *outnot;
- QSocketNotifier *errnot;
-
- /**
- * Lists the communication links that are activated for the child
- * process. Should not be modified from derived classes.
- */
- Communication communication;
-
- /**
- * Called by "slotChildOutput" this function copies data arriving from the
- * child process's stdout to the respective buffer and emits the signal
- * "@ref receivedStderr".
- */
- int childOutput( int fdno );
-
- /**
- * Called by "slotChildOutput" this function copies data arriving from the
- * child process's stdout to the respective buffer and emits the signal
- * "@ref receivedStderr"
- */
- int childError( int fdno );
-
- // information about the data that has to be sent to the child:
-
- const char *input_data; // the buffer holding the data
- int input_sent; // # of bytes already transmitted
- int input_total; // total length of input_data
-
- /**
- * @ref OProcessController is a friend of OProcess because it has to have
- * access to various data members.
- */
- friend class Internal::OProcessController;
-
-private:
- /**
- * Searches for a valid shell.
- * Here is the algorithm used for finding an executable shell:
- *
- * @li Try the executable pointed to by the "SHELL" environment
- * variable with white spaces stripped off
- *
- * @li If your process runs with uid != euid or gid != egid, a shell
- * not listed in /etc/shells will not used.
- *
- * @li If no valid shell could be found, "/bin/sh" is used as a last resort.
- */
- QCString searchShell();
-
- /**
- * Used by @ref searchShell in order to find out whether the shell found
- * is actually executable at all.
- */
- bool isExecutable( const QCString &filename );
-
- // Disallow assignment and copy-construction
- OProcess( const OProcess& );
- OProcess& operator= ( const OProcess& );
-
-private:
- void init ( );
- Internal::OProcessPrivate *d;
-};
-}
-}
-
-#endif
-
diff --git a/microkde/words.sort.txt b/microkde/words.sort.txt
deleted file mode 100644
index a477be7..0000000
--- a/microkde/words.sort.txt
+++ b/dev/null
@@ -1,549 +0,0 @@
-
-{ "10 minutes", "10 Minuten", },
-{ "10th", "10." },
-{ "11th", "11." },
-{ "12 pm Format", "12 AM/PM Format" },
-{ "12th", "12." },
-{ "13th", "13." },
-{ "14th", "14." },
-{ "15th", "15." },
-{ "16th", "16." },
-{ "17th", "17." },
-{ "18th", "18." },
-{ "19th", "19." },
-{ "1 Day", "1 Tag" },
-{ "1 h", "1 Std" },
-{ "1 (Highest)", "1 (Höchster)" },
-{ "1st", "1." },
-{ "1st", "2." },
-{ "20th", "20." },
-{ "21st", "21." },
-{ "22nd", "22." },
-{ "23rd", "23." },
-{ "24:00 Hour Format", "24:00 Stunden Format" },
-{ "24th", "24." },
-{ "25th", "25." },
-{ "26th", "26." },
-{ "27th", "27." },
-{ "28th", "28." },
-{ "29th", "29." },
-{ "2nd", "2." },
-{ "30 minutes", "30 Minuten" },
-{ "30th", "30." },
-{ "31st", "31." },
-{ "3rd", "3." },
-{ "4th", "4." },
-{ "5 (lowest)", "5 (Niedrigster)" },
-{ "5th", "5." },
-{ "6th", "6." },
-{ "7th", "7." },
-{ "8th", "8." },
-{ "9th", "9." },
-{ "&Accept", "&Akzeptieren" },
-{ "Accept", "Akzeptieren" },
-{ "Accept A&ll", "A&lles Akzepieren" },
-{ "Access:", "Zugriff:" },
-{ "A corresponding event is missing in your calendar!", "Ein zugehöriges Ereignis fehlt in ihrem Kalender!" },
-{ "Actions", "Aktionen" },
-{ "Add Filter", "Filter Hinzufügen" },
-{ "&Add", "Hinzufügen" },
-{ "Add", "Hinzufügen" },
-{ "Additional email addresses:", "Zusätzliche E-Mail Adressen:" },
-{ "Additional email address:", "Zusätzliche E-Mail Adresse:" },
-{ "&Addressbook", "&Adressbuch" },
-{ "Address &Book...", "Adress&buch..." },
-{ "Agenda Size", "Agende Größe" },
-{ "Agenda Size:", "Größe der Agenda:" },
-{ "Agenda view:", "Agenda Anzeige:" },
-{ "Agenda view background color:", "Hintergrundfarbe der Agenda Anzeige:" },
-{ "All attendees", "Alle Teilnehmer" },
-{ "AllDayAgenda Height:", "Ganztagesagenda Höhe" },
-{ "Allday", "Ganztägig" },
-{ "Anonymous", "Anonym" },
-{ "Apply", "Bestätigen" },
-//{ "Appointment Time ", "" },
-{ "Apr", "Apr" },
-{ "April", "April" },
-//"Ask for every entry on conflict", "",
-{ "Ask for preferences before syncing", "Vor dem Syncronisieren nachfragen" },
-{ "Ask for quit when closing KO/Pi", "Vor dem Beenden von KO/Pi nachfragen" },
-{ "Attendees", "Teilnehmer" },
-{ "Aug", "Aug" },
-{ "August", "August" },
-//"Auto Insert IMIP Replies"),
-//"Auto Insert IMIP Requests"),
-{ "Auto-Save", "Automatisches Abspeichern" },
-{ "Auto save delay in minutes:", "Auto Save Intervall in Minuten" },
-//"Auto Save FreeBusy Replies", ""
-//"Auto Send FreeBusy Information"),
-//"Auto Send Refresh"),
-//"<b>Due on:</b> %1", "",
-//"be added to the standard resource", "",
-//"be asked which resource to use", "",
-{ "Begin on:", "Starte mit:" },
-{ "Begins on: %1", "Starte mit: %1" },
-{ "<b>From:</b> %1 <b>To:</b> %2", "<b>Vom:</b> %1 <b>Zum:</b> %2" },
-{ "Bigger", "Größer" },
-{ "Biggest", "Am größten" },
-{ "Big", "Groß" },
-{ "<b>On:</b> %1", "<b>Am:</b> %1" },
-{ "<b>On:</b> %1 <b>From:S</b> %2 <b>To:</b> %3", "<b>Am:</b> %1 <b>Vom:S</b> %2 <b>Zum:</b> %3" },
-{ "<b>Original event:</b><p>", "<b>Original Ereignis:</b><p>" },
-{ " - both are modified after last sync", " - beide wurden nach der letzten Syncronisation verändert" },
-{ "Busy", "Belegt" },
-{ "&Cancel", "Abbre&chen" },
-{ "Cancel", "Abbrechen" },
-{ "Cannot delete To-Do\nwhich has children.", "Kann Todo nicht löschen,\n da noch Einträge vorhanden sind" },
-{ "Cannot delete To-Do which has children.", "Kann Todo nicht löschen, da noch Einträge vorhanden sind" },
-//"Cannot move To-Do to itself or a child of itself"),
-//"Cannot purge To-Do which\nhas uncompleted children."
-//"Can't generate mail:\nNo attendees defined.\n"));
-{ "Can't generate mail:\nNo event selected.", "Kann e-Mail nicht erstellen:\nKein Ereignis ausgewählt." },
-{ "Categories...", "Kategorien..." },
-{ "Categories", "Kategorien" },
-{ "Category", "Kategorie" },
-{ "Center View", "Mittenansicht" },
-{ "Change", "Verändere" },
-{ "Cinema", "Kino" },
-{ "Click to add a new Todo", "Klicken, um ein neues Todo anzulegen" },
-{ "Clone Item", "Klone Eintrag" },
-{ "&Close", "S&chließen" },
-{ "Close", "Schließen" },
-{ "Close this dialog to abort deletion!", "Zum Abbrechen des Löschvorganges Dialog schließen!" },
-{ "Colors", "Farben" },
-{ "completed", "fertiggestellt" },
-{ "completed on %1", "fertiggestellt um %1" },
-{ "Complete", "Fertigstellen" },
-//{ "concatenation of dates and time", "%1 %2" },
-{ "Confirm &deletes", "Löschvogang bestätigen" },
-//"Copying succeed. Syncing not yet implemented"
-//"Copy remote file to local machine..."
-//{ "Could not find your attendee entry.\nPlease check the emails.")) },
-{ "Couldn't load calendar\n '%1'.", "Kann Kalender\n '%1' nicht laden." },
-{ "Counter-event Viewer", "Ereigniszähler Anzeige" },
-//{ "counter proposal event","<b>Counter-event:</b><p>" },
-{ "Daily ending hour:", "Tägl. Schlusszeit:" },
-{ "Daily starting hour:", "Tägliche Anfangszeit:" },
-{ "Daily", "Täglich" },
-{ "Date Format", "Datum Format" },
-{ "DateNavigator:(nr)" , "Datums Navigator" },
-//{ "Date Range") },
-{ "Dates: ", "Datum: " },
-{ "Date && Time", "Datum && Zeit" },
-{ "Day begins at:", "Der Tag beginnt um:" },
-{ "Days in Next-X-Days:", "Tage in den Nächsten-X-Tagen:" },
-{ "Days in What's Next:", "Tage in Was-kommt-Nun:" },
-{ "day(s)", "Tag(e)" },
-{ "Days to show in Next-X-Days view:", "Welche Tage in Nächste-X-Tagen anzeigen:" },
-{ "day", "Tag" },
-{ "Dec", "Dez" },
-{ "December", "Dezember" },
-{ "Default alarm time:", "Standard Alarm Zeit:" },
-//{ "Default appointment time:") },
-//{ "Default Calendar Format") },
-//{ "Default event color:") },
-//{ "Default export file", "calendar.html")) },
-{ "Default", "Standard" },
-//{ "Def. duration of new app.:") },
-{ "Delete All", "Lösche alles" },
-{ "Delete all selected", "Lösche alle ausgewählten" },
-//{ "delete completed To-Dos","Purge Completed") },
-//{ "delete completed To-Dos","Purge Completed") },
-{ "Delete Current", "Aktuellen löschen" },
-{ "Delete Event...", "Lösche Ereignis..." },
-{ "Delete Event", "Lösche Ereignis" },
-{ "&Delete", "Löschen" },
-{ "Delete", "Löschen" },
-{ "Delete Todo...", "Lösche Todo..." },
-{ "Delete To-Do", "Lösche Todo" },
-{ "Deleting item %d ...", "Lösche Eintrag %d..." },
-{ "Descriptions", "Beschreibungen" },
-{ "Deselect All", "Alles deselektieren" },
-{ "Details", "Details" },
-{ "Dinner", "Abendessen" },
-//{ "%d item(s) found."), mMatchedEvents.count() ) },
-//{ "%d items remaining in list."), count() ) },
-{ "Do you really want\nto close KO/Pi?", "Möchten Sie wirklich\nKO/PI verlassen?" },
-//"Do you really want\nto remote sync?\n \n"
-//{ "Drop Event },
-//{ "Drop To-Do")) },
-//{ "Due Date")) },
-//{ "Due: ")+ (static_cast<Todo*>(mIncidence))->dtDueTimeStr() },
-//{ "Due Time")) },
-//{ "Due:"),timeBoxFrame) },
-{ "Duration: ", "Dauer: " },
-{ "Edit...", "Bearbeite..." },
-{ "Edit", "Bearbeite" },
-//{ "Edit Calendar Filters },
-{ "Edit Event...", "Bearbeite Ereignis..." },
-{ "Edit Event", "Bearbeite Ereignis" },
-//{ "Edit exceptions"), Ok|Cancel },
-{ "EditorBox:", "Editor Fenster:" },
-{ "Edit Recurrence Range", "Bearbeite Wiederholung" },
-//{ "&Edit..."),this,SLOT(popupEdit()))) },
-{ "Edit Todo...", "Berabeite Todo..." },
-{ "Edit To-Do", "Todo bearbeiten" },
-//{ "Email:" ) ) },
-{ "E&mail address:", "E&mail Adresse" },
-{ "(EmptyEmail)" , "(KeineEmail)" },
-{ "(EmptyName)", "(KeinName)" },
-//{ "Enable automatic saving of calendar") },
-//{ "Enable group scheduling") },
-//{ "Enable project view") },
-//{ "Enable Recurrence"), this ) },
-//{ "Enable scrollbars in month view cells") },
-//{ "Enable tooltips displaying summary of ev.") },
-//{ "End after"), rangeBox ) },
-//{ "End by:"), rangeBox ) },
-//{ "End Date")) },
-{ "End:", "Ende:" },
-//{ "End Time", "E)) },
-{ "English", "Englisch" },
-//{ "Enter filter name: },
-//{ "Error", "Fehler" },
-//{ "Error loading template file '%1'." },
-//{ "Event already exists in this calendar.") },
-{ "Event", "Ereignis" },
-{ "Event list", "Ereignis Liste" },
-//{ "Event list view uses full window") },
-//{ "Events and To-Dos that need a reply:") + "</h2>\n" },
-//{ "Events: ") + "</h2>\n" },
-//{ "Events have to be completely included"), topFrame) },
-//{ "Events"),incidenceGroup) },
-{ "Event Viewer:", "Ereignis Anzeige" },
-//{ "Event Viewer"),Ok|User1,Ok,false },
-//{ "Event will be sent to:")+"</h4>" },
-//{ "every"), this ) },
-{ "Exceptions...", "Ausnahmen..." },
-{ "Exceptions", "Ausnahmen" },
-{ "Exclude holidays", "Ohne Ferien" },
-{ "Exclude Saturdays", "Ohne Samstage" },
-//{ "Export to HTML with every save"),&(KOPrefs::instance()->mHtmlWithSave) },
-{ "Feb", "Feb" },
-{ "February", "Februar" },
-//{ "Filter disabled },
-//{ "Filter position: ") + QString::number ( mSelectionCombo->currentItem()+1 )) },
-//{ "Filter selected: },
-{ "&Find", "Finden" },
-{ "Fonts", "Zeichensätze" },
-//{ "Force take local entry always")) },
-//{ "Force take remote entry always")) },
-//{ "Form1" ) ) },
-//{ "Free Busy Object")) },
-{ "Free", "Frei" },
-{ "Friday", "Freitag" },
-{ "Fri", "Fr" },
-//{ "From: %1 To: %2 %3").arg(from).arg(to },
-//{ "From:"),rangeWidget)) },
-{ "Full &name:", "Vor- und &Nachname:" },
-//{ "Full path and file name required!"), topFrame) },
-{ "General", "Allgemein" },
-{ "German", "Deutsch" },
-{ "Gifts", "Geschenke" },
-//{ "Group Automation"),0 },
-//{ "Group Scheduling"),0 },
-{ "Help", "Hilfe" },
-{ "Hide Dates", "Daten ausblenden" },
-{ "Highlight color:" "Hervorhebungsfarbe" },
-{ "Holiday color:", "Ferien Farbe" },
-{ "hour(s)", "Stunde(n)" },
-//{ "iCalendar")) },
-//{ "If attendee is in addressbook")) },
-//{ "If organizer is in addressbook")) },
-//{ "If requested from an email in addressbook")) },
-//{ "If this counter-event is a good proposal for your event, press 'Accept'. All Attendees will then get the new version of this event },
-//{ "In %1 days: ").arg( i ) + "</font></em>"+day },
-//{ "Incomplete Todo:") + "</strong></big></big>\n" },
-{ "Information", "Information" },
-{ "Invalid search expression,\ncannot perform ", "Kann Suche nicht ausführen" },
-{ "Jan", "Jan" },
-{ "January", "Januar" },
-{ "JournalView:", "Journal Ansicht" },
-{ "Jul", "Jul" },
-{ "July", "Juli" },
-{ "Jump to date", "Springe zum Datum" },
-{ "June", "Juni" },
-{ "Jun", "Jun" },
-{ "Kids", "Kinder" },
-//{ "KMail", "KMail" },
-{ "KO/E Find ", "KO/E Suchen " },
-{ "KO/E Find: ", "KO/E Suchen: " },
-{ "KO/Pi is starting ... ", "KO/Pi startet ..." },
-{ "Language:(nyi)", "Sprache" },
-{ "Language:", "Sprache" },
-{ "Large", "Etwas mehr" },
-{ "List View:", "Listenansicht" },
-{ "Load/Save", "Laden/Speichern" },
-{ "Load Template", "Lade Vorlage" },
-{ "Locale", "Spracheinstellung" },
-{ "Local temp file:", "Lokales temp. Datei:" },
-//"Local temp file:\n "
-//"Local temp file:\n..."
-{ "Location: ", "Ort: " },
-{ "Location:", "Ort:" },
-{ "Mail client", "Mail Programm" },
-{ "Mail Client", "Mail Programm" },
-{ "March", "März" },
-{ "Mar", "Mär" },
-{ "May", "Mai" },
-{ "M. Bains line:", "M. Bains Linie:" },
-{ "Medium", "Medium" },
-{ "Method", "Methode" },
-{ "minute(s)", "Minute(n)" },
-{ "Monday", "Montag" },
-{ "Mon", "Mo" },
-{ "Monthly", "Monatlich" },
-{ "Month not long enough", "Monat ist nicht lang genug" },
-{ "month(s)", "Monat(e)" },
-{ "Month view:", "Monatsansicht" },
-{ "Month view uses category colors", "Monatsansicht benutzt die Kategorie Farben" },
-{ "Move &Down", "Nach unten verschieben" },
-{ "Move &Up", "Nach oben verschieben" },
-{ "Name:", "Name:" },
-{ "Name", "Name" },
-{ "\nAre you sure you want\nto delete this event?", "Sind Sie sicher, dass\n sie das Ereignis löschen möchten?" },
-{ "%n Days", "%n Tage" },
-{ "Never", "Nie" },
-{ "New event...", "Neues Ereignis..." },
-{ "New event", "Neues Ereignis" },
-{ "New Events/Todos should", "Meue Ereignisse/Todos sollten" },
-{ "&New", "&Neu" },
-{ "New", "Neu", },
-{ "New Sub-Todo...", "Neues Sub-Todo..." },
-{ "New Todo...", "Neues Todo..." },
-{ "New Todo", "Neues Todo" },
-{ "Next Alarm: ", "Nächster Alarm: ", },
-{ "&Next Day", "&Nächster Tag", },
-{ "Next days view uses full window", "Die Ansicht des nächsten Tages maximieren" },
-{ "Next month", "Nächster Monat" },
-{ "&Next Week", "&Nächste Woche" },
-{ "Next year", "Nächstes Jahr" },
-{ "Next Year", "Nächstes Jahr" },
-{ "%n h", "%n Std" },
-//"\n \nTry command on console to get more\ndetailed info about the reason.\n"
-//{ "nobody@nowhere", " },
-{ "No ending date", "Kein End-Datum", },
-{ "No event, nothing to do.", "Kein Ereignis, nichts zu tun.", },
-{ "No event selected.", "Kein Ereignis selektiert" },
-//{ "No event/todo were found matching\nyour search expression.\nUse the wildcard characters\n ' * ' and ' ? ' where needed."));"KO/E Find ")) },
-{ "No", "Nein" },
-{ "No program set", "Kein Programm ausgewählt", },
-{ "Normal", "Normal" },
-{ "[No selection]", "Keine Selektion", },
-{ "No sound set", "Kein Sound ausgewählt", },
-{ "no time ", "keine Zeit ", },
-{ "no time", "keine Zeit", },
-{ "No Time", "Keine Zeit" },
-{ "November", "November" },
-{ "Nov", "Nov", },
-{ "\nThis event recurs\nover multiple dates.\n", "\nDieses Ereignis wiederholt sich an mehreren Tagen.\n" },
-//{ "occurrence(s)"), rangeBox ) },
-{ "October", "Oktober" },
-{ "Oct", "Okt", },
-//{ "O-due!", " },
-//{ "Okay, another question:\n\nDo you really want\nto erase your complete disk?\nI hope, the decision is now\na little bit easier! },
-{ "&OK", "&OK" },
-{ "Ok+Show!", "Ok+Anzeigen" },
-{ "Organizer: %1","Organizer %1" },
-{ "Organizer","Organizer" },
-//{ "Overdue To-Do:") + "</h2>\n" },
-{ "Owner: ", "Besitzer: " },
-{ "Owner:", "Besitzer:" },
-{ "<p><b>Priority:</b> %2</p>", "<p><b>Priorität:</b> %2</p>" },
-//{ "Personal Travel", },
-//{ "<p><i>%1 % completed</i></p>" },
-{ "Pick a date to display", "Wähle einen Tag zum anzeigen aus" },
-//{ "Playing '%1'").arg(fileName) },
-//{ "Playing '%1'").arg(mAlarmSound) },
-//{ "Please specify a valid due date.")) },
-//{ "Please specify a valid end date, for example '%1'." },
-//{ "Please specify a valid start date.")) },
-//{ "Please specify a valid start date, for example '%1'." },
-//{ "Please specify a valid start time.")) },
-//{ "Please specify a valid start time, for example '%1'." },
-//{ "Preferences - some settings need a restart (nr)")) },
-{ "Preferences - some settings need a restart (nr)", "Einstellungen - teilweise Neustart erforderlich" },
-{ "&Previous Day", "Vorheriger Tag" },
-{ "Previous month", "Vorheriger Monat" },
-{ "Previous Month", "Vorheriger Monat" },
-{ "&Previous Week", "Vorherige Woche" },
-{ "Previous year", "Vorheriges Jahr" },
-{ "Previous Year", "Vorheriges Jahr" },
-{ "Printing", "Drucken" },
-//{ "Prio")) },
-//{ "Priority:"), h) },
-{ "Proceed", "Weiter" },
-//{ "Purge },
-//{ "read-only") + ")</em>") },
-{ "Recur every", "Wiederh. alle" },
-{ "Recur in the month of", "Wiederh. im Monat" },
-{ "Recur on the", "Wiederh. am" },
-{ "Recur on this day", "Wiederh. am diesen Tag" },
-{ "Recurrence Range...", "Wiederholungs Zeitraum..." },
-{ "Recurrence Range", "Wiederholungs Zeitraum" },
-{ "Recurrence Rule", "Wiederholungs Regel" },
-{ "Recurrence", "Wiederholung" },
-{ "Recurs", "Wiederhole" },
-"&Reject", "Abweisen",
-{ "Reminder:", "Erinnerung:" },
-//"Remote file:\n "
-//"Remote file:\n..."
-//{ "Remote file:"), topFrame) },
-//{ "Remote IP:"), topFrame) },
-//{ "Remote passwd:"), topFrame) },
-//{ "Remote syncing (via ssh/scp) network settings "), topFrame) },
-//{ "Remote user:"), topFrame) },
-{ "&Remove", "Entfe&rnen" },
-{ "Remove", "Entfernen" },
-{ "Request response", "Bemerkung anfordern" },
-//{ "Retrieve &Messages" ) ) },
-{ "Role:", "Rolle:" },
-{ "Role", "Rolle" },
-//{ "RSVP"),35) },
-//{ "Running '%1'").arg(fileName) },
-//{ "Running '%1'").arg(mAlarmProgram) },
-{ "Sat", "Sa" },
-{ "Saturday", "Samstag" },
-//{ "Save Template"), Ok | Cancel, Ok, parent, 0 },
-//{ "Scheduler - Incoming Messages" ) ) },
-//{ "Scheduler Mail Client"),&(KOPrefs::instance()->mIMIPScheduler) },
-//{ "Scheduler Mails Should Be"),&(KOPrefs::instance()->mIMIPSend) },
-//{ "Scheduler - Outgoing Messages" ) ) },
-{ "Search for:", "Suche nach:" },
-{ "Search In", "Suche in" },
-{ "Search", "Suche" },
-{ "Select Addresses", "Wähle Adressen" },
-{ "Select all", "Wähle alles" },
-{ "Select a month", "Wähle Monat" },
-//{ "Select a template to load:"), templates, 0, &ok ) },
-{ "Select a week", "Wähle Woche" },
-{ "Select a year", "Wähle Jahr" },
-//{ "selected emails")) },
-//{ "Select Template Name"), topFrame },
-//{ "Select the current day")) },
-//{ "Send copy to owner when mailing events") },
-{ "Send directly", "Sende direkt" },
-//{ "Sendmail")) },
-{ "&Send Messages", "&Sende Nachrichten", },
-//{ "Send to outbox")) },
-{ "Sep", "Sep" },
-{ "September", "September" },
-//{ "Set your status },
-//{ "Set Your Status")) },
-{ "Shopping", "Einkaufen" },
-{ "Short date in (WN/E) view", "Kurzdatum in (WN/E) Anzeige" },
-{ "Show Dates", "Zeige Daten" },
-//{ "Show events that recur daily in date nav.") },
-{ "Show Event...", "Zeige Ereignis..." },
-//{ "Show ev. that recur weekly in date nav.") },
-//{ "Show Marcus Bains line") },
-//{ "Show seconds on Marcus Bains line") },
-//{ "Show summary after syncing") },
-{ "Show time as:", "Zeige Zeit als" },
-{ "Show Todo...", "Zeige To-Do" },
-//{ "Show topmost todo prios in What's N.:") },
-//{ "Show topmost todo prios in What's Next:") },
-//{ "Show vertical screen (Needs restart)") },
-{ "&Show", "Zeige" },
-{ "Show...", "Zeige..." },
-{ "Show", "Zeige" },
-{ "Small", "Klein" },
-{ "Sorry", "Entschuldigung" },
-//"Sorry, the copy command failed!\nCommand was:\n"
-//{ "Sort Id")) },
-{ "Start:", "Anfang:" },
-{ "Start Date", "Start Datum" },
-{ "Start Time", "Start Zeit" },
-{ "Status:", "Status:" },
-{ "Status","Status:" },
-//{ "Stretched TB", "
-{ "Summaries","Zusammenfassungen" },
-{ "Summary:","Zusammenfassung:" },
-{ "Summary","Zusammenfassung" },
-{ "Sunday", "Sonntag" },
-{ "Sun", "So" },
-//{ "Sync Network"),0,0) },
-{ "Sync preferences:", "Sync Einstellungen" },
-{ "Sync Prefs", "Sync Einstellungen" },
-{ "Syncronize", "Daten abgleich" },
-//{ "Take local entry on conflict")) },
-//{ "Take newest entry on conflict")) },
-//{ "Take remote entry on conflict")) },
-//{ "Template '%1' does not contain a valid Todo." },
-//{ "Template does not contain a valid Event." },
-{ "Template...", "Vorlage..." },
-//{ "The event ends before it starts.\n },
-//{ "The event has no attendees.")) },
-//{ "The journal entries can not be\nexported to a vCalendar file.") },
-//{ "The organizer %1", " },
-//{ "The start date cannot be after the due date.")) },
-//{ " - they have the same unique ID "), topFrame) },
-{ "This day", "Dieser Tag" },
-{ "This is an experimental feature. ", "Dieses Feature ist experimentel" },
-//{ "This is a recurring event.") + "</em>") },
-{ "This item will be\npermanently deleted.", "Dieser Eintrag wird\nkomplett gelöscht." },
-{ "This item will be permanently deleted.", "Dieser Eintrag wird komplett gelöscht." },
-{ "Thu", "Do" },
-{ "Thursday", "Donnerstag" },
-{ "Time associated", "Dazugehörige Zeit" },
-{ "Time bar:", "Zeit Intervall" },
-{ "Time && Date", "Zeit und Datum" },
-{ "Time Format", "Zeit Format" },
-{ "Time Labels:", "Zeit Markierungen:" },
-{ "Time: ", "Zeit: " },
-{ "Timezone:", "Zeitzone:" },
-{ "Tiny", "Sehr klein" },
-{ "To: ", "An: " },
-{ "To:", "An:" },
-{ "Today: ", "Heute: " },
-//{ "To-Do: %1 },
-//{ "Todo due today color:") },
-//{ "To-do items:"),this) },
-//{ "Todo overdue color:") },
-//{ "Todos"),incidenceGroup) },
-{ "Todo", "Todo" },
-{ "To-do view shows completed Todos", "To-do Anzeige zeigt erledigte To-dos" },
-{ "ToDoView:", "Todo Anzeige:" },
-{ "Toggle Alarm", "Wechsle Alarm" },
-{ "Toggle Allday", "Umschalten Ganztag" },
-//{ "toggle completed To-Dos","Hide/Show Completed") },
-//{ "toggle completed To-Dos","Hide/Show Completed") },
-{ "Tomorrow: ", "Morgen: " },
-// { "Toolbar", "Zugriffsleiste" },
-{ "Tue", "Di" },
-{ "Tuesday", "Dienstag" },
-{ "Two entries are in conflict, if: ", "Zwei Einträge haben einen Konflikt, wenn:" },
-{ "Unable to find template '%1'.", "Kann Vorlage '%1' nicht finden." },
-{ "University", "Universität" },
-{ "Unknown", "Unbekannt" },
-{ "Up", "Hinauf" },
-//{ "&Use email settings from Control Center", " },
-{ "Use password (if not, ask when syncing)", "Passwort: (sonst jedesmal anfragen)" },
-{ "User defined (next page)", "Benutzer definiert (Nächste Seite)" },
-{ "User long date", "Benutz. lang. Datum" },
-{ "User short date", "Benutz. kurz. Datum" },
-//{ "vCalendar")) },
-{ "View", "Ansicht" },
-{ "View", "Anzeige" },
-{ "View Fonts", "Zeige Schriften" },
-{ "Views", "Ansichten" },
-//{ "VIP") },
-{ "Wed", "Mi" },
-{ "Wednesday", "Mittwoch" },
-{ "Week %1", "Woche %1" },
-{ "Weekly", "Wöchentlich" },
-//{ "week(s) on:"), this ) },
-{ "Week starts on Sunday", "Wochenanfang Sonntags" },
-{ "What's Next View:", "What's Next Anzeige" },
-{ "What's next ?", "Was kommt als nächstes?" },
-{ "Working Hours", "Arbeitsstunden" },
-{ "Working hours color:", "Farbe der Arbeitsstunden" },
-{ "Write back existing entries only", "Nur exisitierende Einträge zurückschreiben" },
-{ "Write back synced file", "Syncronisierte Datei zurückschreiben" },
-{ "Yearly", "Jährlich" },
-{ "year(s)", "Jahr(e)" },
-{ "Yes", "Ja" },
-{ "You have %d item(s) selected.\n", "Sie haben %d Einträge ausgewählt.\n" },
-{ "You have to restart KOrganizer for this setting to take effect.","Sie müssem Korganizer neu starten, damit diese Einstellung aktiviert wird." },
-//{ "Zoom In", "Hineinzoomen" },
-//{ "Zoom Out", "Herauszoomen" },