author | zecke <zecke> | 2002-10-16 18:24:48 (UTC) |
---|---|---|
committer | zecke <zecke> | 2002-10-16 18:24:48 (UTC) |
commit | 9047650faad7e64e0a36553dfe04dc7ad084f095 (patch) (side-by-side diff) | |
tree | b79a65f224b329d6dcc559d8b72d564ccce4a3c8 /x11 | |
parent | 1a305f211913ce4a4d73ed0b36a0be535c0e03ec (diff) | |
download | opie-9047650faad7e64e0a36553dfe04dc7ad084f095.zip opie-9047650faad7e64e0a36553dfe04dc7ad084f095.tar.gz opie-9047650faad7e64e0a36553dfe04dc7ad084f095.tar.bz2 |
More IPC integtration
OCOPClient::self() added so we keep
the connections low
-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 @@ -16,2 +16,11 @@ +OCOPClient* OCOPClient::m_self = 0; + +OCOPClient* OCOPClient::self() { + if (!m_self ) { + m_self = new OCOPClient(); + } + return m_self; +} + OCOPClient::OCOPClient( const QString& path, QObject* obj ) 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 @@ -22,3 +22,7 @@ class OCOPClient : public QObject{ public: - + /* + * this is the static + * OCopClient + */ + static OCOPClient* self(); /** @@ -58,2 +62,3 @@ private: + static OCOPClient* m_self; }; 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 @@ -216,3 +216,3 @@ void OCopServer::deregisterClient(int fd ) { if (it != m_clients.end() ) { - OCOPClient client = (*it); + OCOPClient client = it.data(); delete client.notify; @@ -229,4 +229,5 @@ void OCopServer::deregisterClient(int fd ) { */ - QMap<QCString, QValueList<int> >::Iterator it; - for ( it = m_channels.begin(); it != m_channels.end(); ++it ) { + QMap<QCString, QValueList<int> >::Iterator it2; + repeatIt: + for ( it2 = m_channels.begin(); it2 != m_channels.end(); ++it2 ) { /* @@ -234,4 +235,6 @@ void OCopServer::deregisterClient(int fd ) { */ - if ( it.data().contains( fd ) ) { - QValueList<int> array = it.data(); + qWarning("Channel %s", it2.key().data() ); + if ( it2.data().contains( fd ) ) { + qWarning("contains"); + QValueList<int> array = it2.data(); @@ -241,7 +244,17 @@ void OCopServer::deregisterClient(int fd ) { if ( array.count() == 1 ) { + qWarning("Invalidate!"); /* is the list now invalidatet? */ - m_channels.remove( it ); + m_channels.remove( it2 ); + /* That is the first go to of my life + * but Iterator remove( Iterator ) + * does not exist + * it2 = --it2; + * does not work reliable too + * so the only way is to reiterate :( + */ + goto repeatIt; }else{ + qWarning("removing"); array.remove( fd ); - it = m_channels.replace( it.key(), array ); + it2 = m_channels.replace( it2.key(), array ); } 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 @@ -5,2 +5,4 @@ +QList<QCopChannel>* QCopChannel::m_list = 0; + QCopChannel::QCopChannel( const QCString& channel, QObject* parent, @@ -9,11 +11,21 @@ QCopChannel::QCopChannel( const QCString& channel, QObject* parent, init(); + if (!m_list ) { + m_list = new QList<QCopChannel>; + } + m_list->append(this); +} +void QCopChannel::receive( const QCString& msg, const QByteArray& ar ) { + emit received( msg, ar ); } QCopChannel::~QCopChannel() { - m_client->delChannel( m_chan ); - delete m_client; + m_list->remove(this); + if (m_list->count() == 0 ) { + delete m_list; + m_list = 0; + } + OCOPClient::self()->delChannel( m_chan ); } void QCopChannel::init() { - m_client = new OCOPClient(QString::null, this ); - m_client->addChannel(m_chan ); - connect(m_client, SIGNAL(called(const QCString&, const QCString&, const QByteArray& ) ), + OCOPClient::self()->addChannel( m_chan ); + connect(OCOPClient::self(), SIGNAL(called(const QCString&, const QCString&, const QByteArray& ) ), this, SLOT(rev(const QCString&, const QCString&, const QByteArray&) ) ); @@ -23,9 +35,8 @@ QCString QCopChannel::channel()const { } -bool QCopChannel::isRegistered( const QCString& chan) { - OCOPClient client; - return client.isRegistered( chan ); +bool QCopChannel::isRegistered( const QCString& chan) {; + return OCOPClient::self()->isRegistered( chan ); } bool QCopChannel::send( const QCString& chan, const QCString& msg ) { - QByteArray ar(0); - return sendLocally(chan, msg, ar ); + QByteArray ar; + return send(chan, msg, ar ); } @@ -33,8 +44,14 @@ bool QCopChannel::send( const QCString& chan, const QCString& msg, const QByteArray& ar ) { - return sendLocally( chan, msg, ar ); + OCOPClient::self()->send( chan, msg, ar ); + return true; } -bool QCopChannel::sendLocally( const QCString& chan, const QCString& msg, +bool QCopChannel::sendLocally( const QCString& chann, const QCString& msg, const QByteArray& ar ) { - OCOPClient client; - client.send( chan, msg, ar ); + if (!m_list ) + return true; + QCopChannel* chan; + for ( chan = m_list->first(); chan; chan = m_list->next() ) { + if ( chan->channel() == chann ) + chan->receive( 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 @@ -5,2 +5,3 @@ #include <qcstring.h> +#include <qlist.h> @@ -22,2 +23,3 @@ public: const QByteArray& data ); + void receive( const QCString& msg, const QByteArray& ar ); @@ -31,3 +33,3 @@ private: void init(); - OCOPClient* m_client; + static QList<QCopChannel> *m_list; /* the channel */ |