|
|
|
/*
|
|
|
|
This file is part of the KDE libraries
|
|
|
|
Copyright (c) 1999 Waldo Bastian <bastian@kde.org>
|
|
|
|
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU Library General Public
|
|
|
|
License version 2 as published by the Free Software Foundation.
|
|
|
|
|
|
|
|
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., 51 Franklin Street, Fifth Floor,
|
|
|
|
Boston, MA 02110-1301, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _KLAUNCHER_H_
|
|
|
|
#define _KLAUNCHER_H_
|
|
|
|
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <time.h>
|
|
|
|
#include <tqstring.h>
|
|
|
|
#include <tqvaluelist.h>
|
|
|
|
#include <tqsocketnotifier.h>
|
|
|
|
#include <tqptrlist.h>
|
|
|
|
#include <tqtimer.h>
|
|
|
|
|
|
|
|
#include <dcopclient.h>
|
|
|
|
#include <kio/connection.h>
|
|
|
|
#include <ksock.h>
|
|
|
|
#include <kurl.h>
|
|
|
|
#include <kuniqueapplication.h>
|
|
|
|
|
|
|
|
#include <kservice.h>
|
|
|
|
|
|
|
|
#include "autostart.h"
|
|
|
|
|
|
|
|
class IdleSlave : public TQObject
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
public:
|
|
|
|
IdleSlave(KSocket *socket);
|
|
|
|
bool match( const TQString &protocol, const TQString &host, bool connected);
|
|
|
|
void connect( const TQString &app_socket);
|
|
|
|
pid_t pid() const { return mPid;}
|
|
|
|
int age(time_t now);
|
|
|
|
void reparseConfiguration();
|
|
|
|
bool onHold(const KURL &url);
|
|
|
|
TQString protocol() const {return mProtocol;}
|
|
|
|
|
|
|
|
signals:
|
|
|
|
void statusUpdate(IdleSlave *);
|
|
|
|
|
|
|
|
protected slots:
|
|
|
|
void gotInput();
|
|
|
|
|
|
|
|
protected:
|
|
|
|
KIO::Connection mConn;
|
|
|
|
TQString mProtocol;
|
|
|
|
TQString mHost;
|
|
|
|
bool mConnected;
|
|
|
|
pid_t mPid;
|
|
|
|
time_t mBirthDate;
|
|
|
|
bool mOnHold;
|
|
|
|
KURL mUrl;
|
|
|
|
};
|
|
|
|
|
|
|
|
class SlaveWaitRequest
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
pid_t pid;
|
|
|
|
DCOPClientTransaction *transaction;
|
|
|
|
};
|
|
|
|
|
|
|
|
class KLaunchRequest
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
TQCString name;
|
|
|
|
TQValueList<TQCString> arg_list;
|
|
|
|
TQCString dcop_name;
|
|
|
|
enum status_t { Init = 0, Launching, Running, Error, Done };
|
|
|
|
pid_t pid;
|
|
|
|
status_t status;
|
|
|
|
DCOPClientTransaction *transaction;
|
|
|
|
KService::DCOPServiceType_t dcop_service_type;
|
|
|
|
bool autoStart;
|
|
|
|
TQString errorMsg;
|
|
|
|
#ifdef Q_WS_X11
|
|
|
|
TQCString startup_id; // "" is the default, "0" for none
|
|
|
|
TQCString startup_dpy; // Display to send startup notification to.
|
|
|
|
#endif
|
|
|
|
TQValueList<TQCString> envs; // env. variables to be app's environment
|
|
|
|
TQCString cwd;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct serviceResult
|
|
|
|
{
|
|
|
|
int result; // 0 means success. > 0 means error (-1 means pending)
|
|
|
|
TQCString dcopName; // Contains DCOP name on success
|
|
|
|
TQString error; // Contains error description on failure.
|
|
|
|
pid_t pid;
|
|
|
|
};
|
|
|
|
|
|
|
|
class KLauncher : public KApplication, public DCOPObject
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
public:
|
|
|
|
KLauncher(int _kdeinitSocket, bool new_startup);
|
|
|
|
|
|
|
|
~KLauncher();
|
|
|
|
|
|
|
|
void close();
|
|
|
|
static void destruct(int exit_code); // exit!
|
|
|
|
|
|
|
|
// DCOP
|
|
|
|
virtual bool process(const TQCString &fun, const TQByteArray &data,
|
|
|
|
TQCString &replyType, TQByteArray &replyData);
|
|
|
|
virtual QCStringList functions();
|
|
|
|
virtual QCStringList interfaces();
|
|
|
|
|
|
|
|
protected:
|
|
|
|
void processDied(pid_t pid, long exitStatus);
|
|
|
|
|
|
|
|
void requestStart(KLaunchRequest *request);
|
|
|
|
void requestDone(KLaunchRequest *request);
|
|
|
|
|
|
|
|
void setLaunchEnv(const TQCString &name, const TQCString &value);
|
|
|
|
void exec_blind(const TQCString &name, const TQValueList<TQCString> &arg_list,
|
|
|
|
const TQValueList<TQCString> &envs, const TQCString& startup_id = "" );
|
|
|
|
bool start_service(KService::Ptr service, const TQStringList &urls,
|
|
|
|
const TQValueList<TQCString> &envs, const TQCString& startup_id = "",
|
|
|
|
bool blind = false, bool autoStart = false );
|
|
|
|
bool start_service_by_name(const TQString &serviceName, const TQStringList &urls,
|
|
|
|
const TQValueList<TQCString> &envs, const TQCString& startup_id, bool blind);
|
|
|
|
bool start_service_by_desktop_path(const TQString &serviceName, const TQStringList &urls,
|
|
|
|
const TQValueList<TQCString> &envs, const TQCString& startup_id, bool blind);
|
|
|
|
bool start_service_by_desktop_name(const TQString &serviceName, const TQStringList &urls,
|
|
|
|
const TQValueList<TQCString> &envs, const TQCString& startup_id, bool blind);
|
|
|
|
bool kdeinit_exec(const TQString &app, const TQStringList &args,
|
|
|
|
const TQValueList<TQCString> &envs, TQCString startup_id, bool wait);
|
|
|
|
|
|
|
|
void waitForSlave(pid_t pid);
|
|
|
|
|
|
|
|
void autoStart(int phase);
|
|
|
|
|
|
|
|
void createArgs( KLaunchRequest *request, const KService::Ptr service,
|
|
|
|
const TQStringList &url);
|
|
|
|
|
|
|
|
pid_t requestHoldSlave(const KURL &url, const TQString &app_socket);
|
|
|
|
pid_t requestSlave(const TQString &protocol, const TQString &host,
|
|
|
|
const TQString &app_socket, TQString &error);
|
|
|
|
|
|
|
|
|
|
|
|
void queueRequest(KLaunchRequest *);
|
|
|
|
|
|
|
|
void send_service_startup_info( KLaunchRequest *request, KService::Ptr service, const TQCString& startup_id,
|
|
|
|
const TQValueList<TQCString> &envs );
|
|
|
|
void cancel_service_startup_info( KLaunchRequest *request, const TQCString& startup_id,
|
|
|
|
const TQValueList<TQCString> &envs );
|
|
|
|
|
|
|
|
public slots:
|
|
|
|
void slotAutoStart();
|
|
|
|
void slotDequeue();
|
|
|
|
void slotKDEInitData(int);
|
|
|
|
void slotAppRegistered(const TQCString &appId);
|
|
|
|
void slotSlaveStatus(IdleSlave *);
|
|
|
|
void acceptSlave( KSocket *);
|
|
|
|
void slotSlaveGone();
|
|
|
|
void idleTimeout();
|
|
|
|
|
|
|
|
protected:
|
|
|
|
TQPtrList<KLaunchRequest> requestList; // Requests being handled
|
|
|
|
TQPtrList<KLaunchRequest> requestQueue; // Requests waiting to being handled
|
|
|
|
int kdeinitSocket;
|
|
|
|
TQSocketNotifier *kdeinitNotifier;
|
|
|
|
serviceResult DCOPresult;
|
|
|
|
KLaunchRequest *lastRequest;
|
|
|
|
TQPtrList<SlaveWaitRequest> mSlaveWaitRequest;
|
|
|
|
TQString mPoolSocketName;
|
|
|
|
KServerSocket *mPoolSocket;
|
|
|
|
TQPtrList<IdleSlave> mSlaveList;
|
|
|
|
TQTimer mTimer;
|
|
|
|
TQTimer mAutoTimer;
|
|
|
|
bool bProcessingQueue;
|
|
|
|
AutoStart mAutoStart;
|
|
|
|
TQCString mSlaveDebug;
|
|
|
|
TQCString mSlaveValgrind;
|
|
|
|
TQCString mSlaveValgrindSkin;
|
|
|
|
bool dontBlockReading;
|
|
|
|
bool newStartup;
|
|
|
|
#ifdef Q_WS_X11
|
|
|
|
Display *mCached_dpy;
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
#endif
|