00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
#ifndef DCOPSERVER_H
00023
#define DCOPSERVER_H "$Id: dcopserver.h,v 1.35 2003/03/19 16:26:40 waba Exp $"
00024
00025
#include <qobject.h>
00026
#include <qstring.h>
00027
#include <qsocketnotifier.h>
00028
#include <qptrlist.h>
00029
#include <qvaluelist.h>
00030
#include <qcstring.h>
00031
#include <qdict.h>
00032
#include <qptrdict.h>
00033
#include <qintdict.h>
00034
#include <qapplication.h>
00035
00036
#define INT32 QINT32
00037
#ifdef Q_WS_X11
00038
#include <X11/Xlib.h>
00039
#include <X11/Xmd.h>
00040
#endif
00041
#include <KDE-ICE/ICElib.h>
00042
extern "C" {
00043
#include <KDE-ICE/ICEutil.h>
00044
#include <KDE-ICE/ICEmsg.h>
00045
#include <KDE-ICE/ICEproto.h>
00046 }
00047
00048
class DCOPConnection;
00049
class DCOPListener;
00050
class DCOPSignalConnectionList;
00051
class DCOPSignals;
00052
class QTimer;
00053
00054
typedef QValueList<QCString> QCStringList;
00055
00059
class DCOPConnection :
public QSocketNotifier
00060 {
00061
public:
00062 DCOPConnection( IceConn conn );
00063 ~DCOPConnection();
00064
00065 DCOPSignalConnectionList *signalConnectionList();
00066
00067
00068
00069
void waitForOutputReady(
const QByteArray &_data,
int start);
00070
00071
00072
00073
void slotOutputReady();
00074
00075
QCString appId;
00076
QCString plainAppId;
00077 IceConn iceConn;
00078
int notifyRegister;
00090 QPtrList <_IceConn> waitingOnReply;
00091 QPtrList <_IceConn> waitingForReply;
00092 QPtrList <_IceConn> waitingForDelayedReply;
00093 DCOPSignalConnectionList *_signalConnectionList;
00094
bool daemon;
00095
bool outputBlocked;
00096 QValueList <QByteArray> outputBuffer;
00097
unsigned long outputBufferStart;
00098
QSocketNotifier *outputBufferNotifier;
00099 };
00100
00101
00105
class DCOPServer :
public QObject
00106 {
00107 Q_OBJECT
00108
public:
00109 DCOPServer(
bool _suicide);
00110 ~DCOPServer();
00111
00112
void* watchConnection( IceConn iceConn );
00113
void removeConnection(
void* data );
00114
void processMessage( IceConn iceConn,
int opcode,
unsigned long length, Bool swap);
00115
void ioError( IceConn iceConn );
00116
00117
bool receive(
const QCString &app,
const QCString &obj,
00118
const QCString &fun,
const QByteArray& data,
00119
QCString& replyType,
QByteArray &replyData, IceConn iceConn);
00120
00121 DCOPConnection *findApp(
const QCString &appId);
00122 DCOPConnection *findConn(IceConn iceConn)
00123 {
return clients.find(iceConn); }
00124
00125
void sendMessage(DCOPConnection *conn,
const QCString &sApp,
00126
const QCString &rApp,
const QCString &rObj,
00127
const QCString &rFun,
const QByteArray &data);
00128
00129
private slots:
00130
void newClient(
int socket );
00131
void processData(
int socket );
00132
void slotTerminate();
00133
void slotSuicide();
00134
void slotCleanDeadConnections();
00135
void slotOutputReady(
int socket );
00136
00137
private:
00138
void broadcastApplicationRegistration( DCOPConnection* conn,
const QCString type,
00139
const QString& data );
00140
bool suicide;
00141
int majorOpcode;
00142
int currentClientNumber;
00143 CARD32 serverKey;
00144 DCOPSignals *dcopSignals;
00145
QTimer *m_timer;
00146
QTimer *m_deadConnectionTimer;
00147
QPtrList<DCOPListener> listener;
00148
QAsciiDict<DCOPConnection> appIds;
00149
QPtrDict<DCOPConnection> clients;
00150
QIntDict<DCOPConnection> fd_clients;
00151
QPtrList<_IceConn> deadConnections;
00152 };
00153
00154
extern DCOPServer* the_server;
00155
#endif