00001
00002 #include "../../ipc/client/ocopclient.h"
00003
00004 #include <qcopchannel_qws.h>
00005
00006 QList<QCopChannel>* QCopChannel::m_list = 0;
00007 QMap<QCString, int> QCopChannel::m_refCount;
00008
00009 QCopChannel::QCopChannel( const QCString& channel, QObject* parent,
00010 const char* name )
00011 : QObject( parent, name ),m_chan(channel) {
00012 if (!m_list ) {
00013 m_list = new QList<QCopChannel>;
00014
00015 connect(OCOPClient::self(), SIGNAL(called(const QCString&,const QCString&,const QByteArray&) ),
00016 this, SLOT(rev(const QCString&,const QCString&,const QByteArray&) ) );
00017 }
00018
00019 if (!m_refCount.contains( m_chan ) || !m_refCount[m_chan] ) {
00020 qWarning("adding channel %s", m_chan.data() );
00021 m_refCount[m_chan] = 1;
00022 OCOPClient::self()->addChannel( m_chan );
00023 }else{
00024 qWarning("reffing up for %s %d", m_chan.data(), m_refCount[m_chan] );
00025 m_refCount[m_chan]++;
00026 }
00027
00028 m_list->append(this);
00029 }
00030 void QCopChannel::receive( const QCString& msg, const QByteArray& ar ) {
00031 emit received( msg, ar );
00032 }
00033 QCopChannel::~QCopChannel() {
00034 if (m_refCount[m_chan] == 1 ) {
00035 OCOPClient::self()->delChannel( m_chan );
00036 m_refCount[m_chan] = 0;
00037 }else
00038 m_refCount[m_chan]--;
00039
00040
00041 m_list->remove(this);
00042 if (m_list->count() == 0 ) {
00043 delete m_list;
00044 m_list = 0;
00045 }
00046
00047 }
00048 QCString QCopChannel::channel()const {
00049 return m_chan;
00050 }
00051 bool QCopChannel::isRegistered( const QCString& chan) {
00052 if (m_refCount.contains(chan) ) {
00053 qDebug("Client:locally contains");
00054 return true;
00055 }
00056 return OCOPClient::self()->isRegistered( chan );
00057 }
00058 bool QCopChannel::send( const QCString& chan, const QCString& msg ) {
00059 QByteArray ar;
00060 return send(chan, msg, ar );
00061 }
00062 bool QCopChannel::send( const QCString& chan, const QCString& msg,
00063 const QByteArray& ar ) {
00064 OCOPClient::self()->send( chan, msg, ar );
00065 return true;
00066 }
00067 bool QCopChannel::sendLocally( const QCString& chann, const QCString& msg,
00068 const QByteArray& ar ) {
00069 qWarning("Client:sendLocally %s %s", chann.data(), msg.data() );
00070 if (!m_list )
00071 return true;
00072 QCopChannel* chan;
00073
00074 for ( chan = m_list->first(); chan; chan = m_list->next() ) {
00075 if ( chan->channel() == chann )
00076 chan->receive( msg, ar );
00077 }
00078
00079 return true;
00080 }
00081 void QCopChannel::rev( const QCString& chan, const QCString& msg, const QByteArray& ar ) {
00082 sendLocally( chan, msg, ar );
00083 }