-rw-r--r-- | x11/ipc/client/ocopclient.cpp | 9 | ||||
-rw-r--r-- | x11/ipc/client/ocopclient.h | 7 | ||||
-rw-r--r-- | x11/ipc/server/ocopserver.cpp | 27 | ||||
-rw-r--r-- | x11/libqpe-x11/qt/qcopchannel_qws.cpp | 45 | ||||
-rw-r--r-- | x11/libqpe-x11/qt/qcopchannel_qws.h | 4 |
5 files changed, 69 insertions, 23 deletions
diff --git a/x11/ipc/client/ocopclient.cpp b/x11/ipc/client/ocopclient.cpp index c1def73..6085481 100644 --- a/x11/ipc/client/ocopclient.cpp +++ b/x11/ipc/client/ocopclient.cpp | |||
@@ -11,12 +11,21 @@ | |||
11 | #include <qtimer.h> | 11 | #include <qtimer.h> |
12 | 12 | ||
13 | #include "../common/ocoppacket.h" | 13 | #include "../common/ocoppacket.h" |
14 | 14 | ||
15 | #include "ocopclient.h" | 15 | #include "ocopclient.h" |
16 | 16 | ||
17 | OCOPClient* OCOPClient::m_self = 0; | ||
18 | |||
19 | OCOPClient* OCOPClient::self() { | ||
20 | if (!m_self ) { | ||
21 | m_self = new OCOPClient(); | ||
22 | } | ||
23 | return m_self; | ||
24 | } | ||
25 | |||
17 | OCOPClient::OCOPClient( const QString& path, QObject* obj ) | 26 | OCOPClient::OCOPClient( const QString& path, QObject* obj ) |
18 | : QObject( obj ) | 27 | : QObject( obj ) |
19 | { | 28 | { |
20 | m_tries = 0; | 29 | m_tries = 0; |
21 | init(QFile::encodeName(path) ); | 30 | init(QFile::encodeName(path) ); |
22 | } | 31 | } |
diff --git a/x11/ipc/client/ocopclient.h b/x11/ipc/client/ocopclient.h index 53018a5..ee2015a 100644 --- a/x11/ipc/client/ocopclient.h +++ b/x11/ipc/client/ocopclient.h | |||
@@ -17,13 +17,17 @@ | |||
17 | * calling and receiving calls | 17 | * calling and receiving calls |
18 | */ | 18 | */ |
19 | class OCOPPacket; | 19 | class OCOPPacket; |
20 | class OCOPClient : public QObject{ | 20 | class OCOPClient : public QObject{ |
21 | Q_OBJECT | 21 | Q_OBJECT |
22 | public: | 22 | public: |
23 | 23 | /* | |
24 | * this is the static | ||
25 | * OCopClient | ||
26 | */ | ||
27 | static OCOPClient* self(); | ||
24 | /** | 28 | /** |
25 | * Occasionally I decide to start a Server from here | 29 | * Occasionally I decide to start a Server from here |
26 | */ | 30 | */ |
27 | OCOPClient(const QString& pathToServer = QString::null, QObject* obj = 0l); | 31 | OCOPClient(const QString& pathToServer = QString::null, QObject* obj = 0l); |
28 | ~OCOPClient(); | 32 | ~OCOPClient(); |
29 | 33 | ||
@@ -53,9 +57,10 @@ private: | |||
53 | void call( const OCOPPacket& ); | 57 | void call( const OCOPPacket& ); |
54 | 58 | ||
55 | QSocketNotifier* m_notify; | 59 | QSocketNotifier* m_notify; |
56 | int m_socket; | 60 | int m_socket; |
57 | int m_tries; | 61 | int m_tries; |
58 | 62 | ||
63 | static OCOPClient* m_self; | ||
59 | }; | 64 | }; |
60 | 65 | ||
61 | #endif | 66 | #endif |
diff --git a/x11/ipc/server/ocopserver.cpp b/x11/ipc/server/ocopserver.cpp index 421e49c..4940cb8 100644 --- a/x11/ipc/server/ocopserver.cpp +++ b/x11/ipc/server/ocopserver.cpp | |||
@@ -211,42 +211,55 @@ void OCopServer::registerClient( int fd ) { | |||
211 | m_clients.insert( client.fd, client ); | 211 | m_clients.insert( client.fd, client ); |
212 | qWarning("clients are up to %d", m_clients.count() ); | 212 | qWarning("clients are up to %d", m_clients.count() ); |
213 | }; | 213 | }; |
214 | void OCopServer::deregisterClient(int fd ) { | 214 | void OCopServer::deregisterClient(int fd ) { |
215 | QMap<int, OCOPClient>::Iterator it = m_clients.find( fd ); | 215 | QMap<int, OCOPClient>::Iterator it = m_clients.find( fd ); |
216 | if (it != m_clients.end() ) { | 216 | if (it != m_clients.end() ) { |
217 | OCOPClient client = (*it); | 217 | OCOPClient client = it.data(); |
218 | delete client.notify; | 218 | delete client.notify; |
219 | m_clients.remove(fd ); | 219 | m_clients.remove(fd ); |
220 | close(fd ); | 220 | close(fd ); |
221 | /* | 221 | /* |
222 | * TIME_ME | 222 | * TIME_ME |
223 | * | 223 | * |
224 | * now delete from all channels | 224 | * now delete from all channels |
225 | * go through all channels | 225 | * go through all channels |
226 | * remove the fd from the list | 226 | * remove the fd from the list |
227 | * if count becomes 0 remove the channel | 227 | * if count becomes 0 remove the channel |
228 | * otherwise replace QArray<int> | 228 | * otherwise replace QArray<int> |
229 | */ | 229 | */ |
230 | QMap<QCString, QValueList<int> >::Iterator it; | 230 | QMap<QCString, QValueList<int> >::Iterator it2; |
231 | for ( it = m_channels.begin(); it != m_channels.end(); ++it ) { | 231 | repeatIt: |
232 | for ( it2 = m_channels.begin(); it2 != m_channels.end(); ++it2 ) { | ||
232 | /* | 233 | /* |
233 | * The channel contains this fd | 234 | * The channel contains this fd |
234 | */ | 235 | */ |
235 | if ( it.data().contains( fd ) ) { | 236 | qWarning("Channel %s", it2.key().data() ); |
236 | QValueList<int> array = it.data(); | 237 | if ( it2.data().contains( fd ) ) { |
238 | qWarning("contains"); | ||
239 | QValueList<int> array = it2.data(); | ||
237 | 240 | ||
238 | /* | 241 | /* |
239 | * remove channel or just replace | 242 | * remove channel or just replace |
240 | */ | 243 | */ |
241 | if ( array.count() == 1 ) { | 244 | if ( array.count() == 1 ) { |
245 | qWarning("Invalidate!"); | ||
242 | /* is the list now invalidatet? */ | 246 | /* is the list now invalidatet? */ |
243 | m_channels.remove( it ); | 247 | m_channels.remove( it2 ); |
248 | /* That is the first go to of my life | ||
249 | * but Iterator remove( Iterator ) | ||
250 | * does not exist | ||
251 | * it2 = --it2; | ||
252 | * does not work reliable too | ||
253 | * so the only way is to reiterate :( | ||
254 | */ | ||
255 | goto repeatIt; | ||
244 | }else{ | 256 | }else{ |
257 | qWarning("removing"); | ||
245 | array.remove( fd ); | 258 | array.remove( fd ); |
246 | it = m_channels.replace( it.key(), array ); | 259 | it2 = m_channels.replace( it2.key(), array ); |
247 | } | 260 | } |
248 | } | 261 | } |
249 | } // off all channels | 262 | } // off all channels |
250 | } | 263 | } |
251 | qWarning("clients are now at %d", m_clients.count() ); | 264 | qWarning("clients are now at %d", m_clients.count() ); |
252 | }; | 265 | }; |
diff --git a/x11/libqpe-x11/qt/qcopchannel_qws.cpp b/x11/libqpe-x11/qt/qcopchannel_qws.cpp index c315d66..e90f056 100644 --- a/x11/libqpe-x11/qt/qcopchannel_qws.cpp +++ b/x11/libqpe-x11/qt/qcopchannel_qws.cpp | |||
@@ -1,45 +1,62 @@ | |||
1 | 1 | ||
2 | #include "../../ipc/client/ocopclient.h" | 2 | #include "../../ipc/client/ocopclient.h" |
3 | 3 | ||
4 | #include <qcopchannel_qws.h> | 4 | #include <qcopchannel_qws.h> |
5 | 5 | ||
6 | QList<QCopChannel>* QCopChannel::m_list = 0; | ||
7 | |||
6 | QCopChannel::QCopChannel( const QCString& channel, QObject* parent, | 8 | QCopChannel::QCopChannel( const QCString& channel, QObject* parent, |
7 | const char* name ) | 9 | const char* name ) |
8 | : QObject( parent, name ),m_chan(channel) { | 10 | : QObject( parent, name ),m_chan(channel) { |
9 | init(); | 11 | init(); |
12 | if (!m_list ) { | ||
13 | m_list = new QList<QCopChannel>; | ||
14 | } | ||
15 | m_list->append(this); | ||
16 | } | ||
17 | void QCopChannel::receive( const QCString& msg, const QByteArray& ar ) { | ||
18 | emit received( msg, ar ); | ||
10 | } | 19 | } |
11 | QCopChannel::~QCopChannel() { | 20 | QCopChannel::~QCopChannel() { |
12 | m_client->delChannel( m_chan ); | 21 | m_list->remove(this); |
13 | delete m_client; | 22 | if (m_list->count() == 0 ) { |
23 | delete m_list; | ||
24 | m_list = 0; | ||
25 | } | ||
26 | OCOPClient::self()->delChannel( m_chan ); | ||
14 | } | 27 | } |
15 | void QCopChannel::init() { | 28 | void QCopChannel::init() { |
16 | m_client = new OCOPClient(QString::null, this ); | 29 | OCOPClient::self()->addChannel( m_chan ); |
17 | m_client->addChannel(m_chan ); | 30 | connect(OCOPClient::self(), SIGNAL(called(const QCString&, const QCString&, const QByteArray& ) ), |
18 | connect(m_client, SIGNAL(called(const QCString&, const QCString&, const QByteArray& ) ), | ||
19 | this, SLOT(rev(const QCString&, const QCString&, const QByteArray&) ) ); | 31 | this, SLOT(rev(const QCString&, const QCString&, const QByteArray&) ) ); |
20 | } | 32 | } |
21 | QCString QCopChannel::channel()const { | 33 | QCString QCopChannel::channel()const { |
22 | return m_chan; | 34 | return m_chan; |
23 | } | 35 | } |
24 | bool QCopChannel::isRegistered( const QCString& chan) { | 36 | bool QCopChannel::isRegistered( const QCString& chan) {; |
25 | OCOPClient client; | 37 | return OCOPClient::self()->isRegistered( chan ); |
26 | return client.isRegistered( chan ); | ||
27 | } | 38 | } |
28 | bool QCopChannel::send( const QCString& chan, const QCString& msg ) { | 39 | bool QCopChannel::send( const QCString& chan, const QCString& msg ) { |
29 | QByteArray ar(0); | 40 | QByteArray ar; |
30 | return sendLocally(chan, msg, ar ); | 41 | return send(chan, msg, ar ); |
31 | } | 42 | } |
32 | bool QCopChannel::send( const QCString& chan, const QCString& msg, | 43 | bool QCopChannel::send( const QCString& chan, const QCString& msg, |
33 | const QByteArray& ar ) { | 44 | const QByteArray& ar ) { |
34 | return sendLocally( chan, msg, ar ); | 45 | OCOPClient::self()->send( chan, msg, ar ); |
46 | return true; | ||
35 | } | 47 | } |
36 | bool QCopChannel::sendLocally( const QCString& chan, const QCString& msg, | 48 | bool QCopChannel::sendLocally( const QCString& chann, const QCString& msg, |
37 | const QByteArray& ar ) { | 49 | const QByteArray& ar ) { |
38 | OCOPClient client; | 50 | if (!m_list ) |
39 | client.send( chan, msg, ar ); | 51 | return true; |
52 | QCopChannel* chan; | ||
53 | for ( chan = m_list->first(); chan; chan = m_list->next() ) { | ||
54 | if ( chan->channel() == chann ) | ||
55 | chan->receive( msg, ar ); | ||
56 | } | ||
40 | 57 | ||
41 | return true; | 58 | return true; |
42 | } | 59 | } |
43 | void QCopChannel::rev( const QCString& chan, const QCString& msg, const QByteArray& ar ) { | 60 | void QCopChannel::rev( const QCString& chan, const QCString& msg, const QByteArray& ar ) { |
44 | if (chan == m_chan ) | 61 | if (chan == m_chan ) |
45 | emit received(msg, ar ); | 62 | emit received(msg, ar ); |
diff --git a/x11/libqpe-x11/qt/qcopchannel_qws.h b/x11/libqpe-x11/qt/qcopchannel_qws.h index b0a6ce0..94b199e 100644 --- a/x11/libqpe-x11/qt/qcopchannel_qws.h +++ b/x11/libqpe-x11/qt/qcopchannel_qws.h | |||
@@ -1,11 +1,12 @@ | |||
1 | #ifndef OPIE_QCOP_CHANNEL_QWS_H | 1 | #ifndef OPIE_QCOP_CHANNEL_QWS_H |
2 | #define OPIE_QCOP_CHANNEL_QWS_H | 2 | #define OPIE_QCOP_CHANNEL_QWS_H |
3 | 3 | ||
4 | #include <qobject.h> | 4 | #include <qobject.h> |
5 | #include <qcstring.h> | 5 | #include <qcstring.h> |
6 | #include <qlist.h> | ||
6 | 7 | ||
7 | class OCOPClient; | 8 | class OCOPClient; |
8 | class QCopChannel : public QObject { | 9 | class QCopChannel : public QObject { |
9 | Q_OBJECT | 10 | Q_OBJECT |
10 | public: | 11 | public: |
11 | QCopChannel( const QCString& channel, QObject* parent = 0, | 12 | QCopChannel( const QCString& channel, QObject* parent = 0, |
@@ -17,22 +18,23 @@ public: | |||
17 | static bool isRegistered( const QCString& channel ); | 18 | static bool isRegistered( const QCString& channel ); |
18 | static bool send( const QCString& channel, const QCString& msg ); | 19 | static bool send( const QCString& channel, const QCString& msg ); |
19 | static bool send( const QCString& channel, const QCString& msg, | 20 | static bool send( const QCString& channel, const QCString& msg, |
20 | const QByteArray& ); | 21 | const QByteArray& ); |
21 | static bool sendLocally( const QCString& chan, const QCString& msg, | 22 | static bool sendLocally( const QCString& chan, const QCString& msg, |
22 | const QByteArray& data ); | 23 | const QByteArray& data ); |
24 | void receive( const QCString& msg, const QByteArray& ar ); | ||
23 | 25 | ||
24 | signals: | 26 | signals: |
25 | void received( const QCString& msg, const QByteArray& ); | 27 | void received( const QCString& msg, const QByteArray& ); |
26 | 28 | ||
27 | private slots: | 29 | private slots: |
28 | void rev( const QCString& chan, const QCString&, const QByteArray& ); | 30 | void rev( const QCString& chan, const QCString&, const QByteArray& ); |
29 | 31 | ||
30 | private: | 32 | private: |
31 | void init(); | 33 | void init(); |
32 | OCOPClient* m_client; | 34 | static QList<QCopChannel> *m_list; |
33 | /* the channel */ | 35 | /* the channel */ |
34 | QCString m_chan; | 36 | QCString m_chan; |
35 | class Private; | 37 | class Private; |
36 | Private *d; | 38 | Private *d; |
37 | 39 | ||
38 | }; | 40 | }; |