summaryrefslogtreecommitdiffstats
path: root/dcop/dcopserver.h
diff options
context:
space:
mode:
Diffstat (limited to 'dcop/dcopserver.h')
-rw-r--r--dcop/dcopserver.h186
1 files changed, 186 insertions, 0 deletions
diff --git a/dcop/dcopserver.h b/dcop/dcopserver.h
new file mode 100644
index 000000000..5b7f995b6
--- /dev/null
+++ b/dcop/dcopserver.h
@@ -0,0 +1,186 @@
+/*
+Copyright (c) 1999 Preston Brown <pbrown@kde.org>
+Copyright (c) 1999 Matthias Ettrich <ettrich@kde.org>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+#ifndef DCOPSERVER_H
+#define DCOPSERVER_H "$Id$"
+
+#include <qobject.h>
+
+#include <qstring.h>
+#include <qsocketnotifier.h>
+#include <qptrlist.h>
+#include <qvaluelist.h>
+#include <qcstring.h>
+#include <qdict.h>
+#include <qptrdict.h>
+#include <qintdict.h>
+#include <qapplication.h>
+
+#define INT32 QINT32
+#ifdef Q_WS_X11
+#include <X11/Xlib.h>
+#include <X11/Xmd.h>
+#endif
+#include <KDE-ICE/ICElib.h>
+extern "C" {
+#include <KDE-ICE/ICEutil.h>
+#include <KDE-ICE/ICEmsg.h>
+#include <KDE-ICE/ICEproto.h>
+}
+
+class DCOPConnection;
+class DCOPListener;
+class DCOPSignalConnectionList;
+class DCOPSignals;
+class QTimer;
+
+// If you enable the following define DCOP will create
+// $HOME/.dcop.log file which will list all signals passing
+// through it.
+//#define DCOP_LOG
+#ifdef DCOP_LOG
+class QTextStream;
+class QFile;
+#endif
+
+typedef QValueList<QCString> QCStringList;
+
+/**
+ * @internal
+ */
+class DCOPConnection : public QSocketNotifier
+{
+public:
+ DCOPConnection( IceConn conn );
+ ~DCOPConnection();
+
+ DCOPSignalConnectionList *signalConnectionList();
+
+ // Add the data from offset @p start in @p _data to the output
+ // buffer and schedule it for later transmission.
+ void waitForOutputReady(const QByteArray &_data, int start);
+
+ // Called from DCOPServer::slotOutputReady()
+ // Flush the output buffer.
+ void slotOutputReady();
+
+ QCString appId;
+ QCString plainAppId;
+ IceConn iceConn;
+ int notifyRegister;
+ /**
+ * When client A has called client B then for the duration of the call:
+ * A->waitingOnReply contains B
+ * and either
+ * B->waitingForReply contains A
+ * or
+ * B->waitingForDelayedReply contains A
+ *
+ * This allows us to do proper bookkeeping in case client A, client B
+ * or both unregister during the call.
+ */
+ QPtrList <_IceConn> waitingOnReply;
+ QPtrList <_IceConn> waitingForReply;
+ QPtrList <_IceConn> waitingForDelayedReply;
+ DCOPSignalConnectionList *_signalConnectionList;
+ bool daemon;
+ bool outputBlocked;
+ QValueList <QByteArray> outputBuffer;
+ unsigned long outputBufferStart;
+ QSocketNotifier *outputBufferNotifier;
+};
+
+
+/**
+ * @internal
+ */
+class DCOPServer : public QObject
+{
+ Q_OBJECT
+public:
+ DCOPServer(bool _suicide);
+ ~DCOPServer();
+
+ void* watchConnection( IceConn iceConn );
+ void removeConnection( void* data );
+ void processMessage( IceConn iceConn, int opcode, unsigned long length, Bool swap);
+ void ioError( IceConn iceConn );
+
+ bool receive(const QCString &app, const QCString &obj,
+ const QCString &fun, const QByteArray& data,
+ QCString& replyType, QByteArray &replyData, IceConn iceConn);
+
+ DCOPConnection *findApp(const QCString &appId);
+ DCOPConnection *findConn(IceConn iceConn)
+ { return clients.find(iceConn); }
+
+ void sendMessage(DCOPConnection *conn, const QCString &sApp,
+ const QCString &rApp, const QCString &rObj,
+ const QCString &rFun, const QByteArray &data);
+
+private slots:
+ void newClient( int socket );
+ void processData( int socket );
+ void slotTerminate();
+ void slotSuicide();
+ void slotShutdown();
+ void slotExit();
+ void slotCleanDeadConnections();
+ void slotOutputReady(int socket );
+
+#ifdef Q_OS_WIN
+public:
+ static BOOL WINAPI dcopServerConsoleProc(DWORD dwCtrlType);
+private:
+ static DWORD WINAPI TerminatorThread(void * pParam);
+#endif
+private:
+ void broadcastApplicationRegistration( DCOPConnection* conn, const QCString type,
+ const QCString& data );
+ bool suicide;
+ bool shutdown;
+ int majorOpcode;
+ int currentClientNumber;
+ CARD32 serverKey;
+ DCOPSignals *dcopSignals;
+ QTimer *m_timer;
+ QTimer *m_deadConnectionTimer;
+ QPtrList<DCOPListener> listener;
+ QAsciiDict<DCOPConnection> appIds; // index on app id
+ QPtrDict<DCOPConnection> clients; // index on iceConn
+ QIntDict<DCOPConnection> fd_clients; // index on fd
+ QPtrList<_IceConn> deadConnections;
+
+#ifdef Q_OS_WIN
+ HANDLE m_evTerminate;
+ HANDLE m_hTerminateThread;
+ DWORD m_dwTerminateThreadId;
+#endif
+
+#ifdef DCOP_LOG
+ QTextStream *m_stream;
+ QFile *m_logger;
+#endif
+};
+
+extern DCOPServer* the_server;
+
+#endif