author | zecke <zecke> | 2003-02-05 08:54:58 (UTC) |
---|---|---|
committer | zecke <zecke> | 2003-02-05 08:54:58 (UTC) |
commit | bbb3690f12191763a407e6a0edd521113b3c25ac (patch) (side-by-side diff) | |
tree | 39f90d71c7f085f5722382db4a5577bbda2e1618 /x11/libqpe-x11/qt/qcopchannel_qws.cpp | |
parent | 97b96e141fca844317e59ca5b99c1bf5fa52b1f0 (diff) | |
download | opie-bbb3690f12191763a407e6a0edd521113b3c25ac.zip opie-bbb3690f12191763a407e6a0edd521113b3c25ac.tar.gz opie-bbb3690f12191763a407e6a0edd521113b3c25ac.tar.bz2 |
Fix the IPC server and client
registering channel is done locally with refcounts
if the channel is already registered globally
Fix some sizes to allow proper communication..
Diffstat (limited to 'x11/libqpe-x11/qt/qcopchannel_qws.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | x11/libqpe-x11/qt/qcopchannel_qws.cpp | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/x11/libqpe-x11/qt/qcopchannel_qws.cpp b/x11/libqpe-x11/qt/qcopchannel_qws.cpp index e90f056..1cea80c 100644 --- a/x11/libqpe-x11/qt/qcopchannel_qws.cpp +++ b/x11/libqpe-x11/qt/qcopchannel_qws.cpp @@ -3,33 +3,45 @@ #include <qcopchannel_qws.h> QList<QCopChannel>* QCopChannel::m_list = 0; +QMap<QCString, int> QCopChannel::m_refCount; QCopChannel::QCopChannel( const QCString& channel, QObject* parent, const char* name ) : QObject( parent, name ),m_chan(channel) { - init(); if (!m_list ) { m_list = new QList<QCopChannel>; + /* only connect once */ + connect(OCOPClient::self(), SIGNAL(called(const QCString&, const QCString&, const QByteArray& ) ), + this, SLOT(rev(const QCString&, const QCString&, const QByteArray&) ) ); } + /* first registration or ref count is 0 for m_chan*/ + if (!m_refCount.contains( m_chan ) || !m_refCount[m_chan] ) { + m_refCount[m_chan] = 1; + OCOPClient::self()->addChannel( m_chan ); + }else + m_refCount[m_chan]++; + m_list->append(this); } void QCopChannel::receive( const QCString& msg, const QByteArray& ar ) { emit received( msg, ar ); } QCopChannel::~QCopChannel() { + if (m_refCount[m_chan] == 1 ) { + OCOPClient::self()->delChannel( m_chan ); + m_refCount[m_chan] = 0; + }else + m_refCount[m_chan]--; + + m_list->remove(this); if (m_list->count() == 0 ) { delete m_list; m_list = 0; } - OCOPClient::self()->delChannel( m_chan ); -} -void QCopChannel::init() { - 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&) ) ); + } QCString QCopChannel::channel()const { return m_chan; } @@ -46,18 +58,19 @@ bool QCopChannel::send( const QCString& chan, const QCString& msg, return true; } bool QCopChannel::sendLocally( const QCString& chann, const QCString& msg, const QByteArray& ar ) { + qWarning("Client:sendLocally %s %s", chann.data(), msg.data() ); 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 ); } return true; } void QCopChannel::rev( const QCString& chan, const QCString& msg, const QByteArray& ar ) { - if (chan == m_chan ) - emit received(msg, ar ); + sendLocally( chan, msg, ar ); } |