From 9047650faad7e64e0a36553dfe04dc7ad084f095 Mon Sep 17 00:00:00 2001
From: zecke <zecke>
Date: Wed, 16 Oct 2002 18:24:48 +0000
Subject: More IPC integtration

OCOPClient::self() added so we keep
the connections low
---
(limited to 'x11')

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
@@ -14,6 +14,15 @@
 
 #include "ocopclient.h"
 
+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 )
     : 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
@@ -20,7 +20,11 @@ class OCOPPacket;
 class OCOPClient : public QObject{
     Q_OBJECT
 public:
-
+    /*
+     * this is  the static
+     * OCopClient
+     */
+    static OCOPClient* self();
     /**
      * Occasionally I decide to start a Server from here
      */
@@ -56,6 +60,7 @@ private:
     int m_socket;
     int m_tries;
 
+    static OCOPClient*  m_self;
 };
 
 #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
@@ -214,7 +214,7 @@ void OCopServer::registerClient( int fd ) {
 void OCopServer::deregisterClient(int fd ) {
     QMap<int, OCOPClient>::Iterator it = m_clients.find( fd );
     if (it != m_clients.end() ) {
-        OCOPClient client = (*it);
+        OCOPClient client = it.data();
         delete client.notify;
         m_clients.remove(fd );
         close(fd );
@@ -227,23 +227,36 @@ void OCopServer::deregisterClient(int fd ) {
          * if count becomes 0 remove the channel
          * otherwise replace QArray<int>
          */
-        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 ) {
             /*
              * The channel contains this 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();
 
                 /*
                  * remove channel or just replace
                  */
                 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 );
                 }
             }
         } // off all channels
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
@@ -3,40 +3,57 @@
 
 #include <qcopchannel_qws.h>
 
+QList<QCopChannel>* QCopChannel::m_list = 0;
+
 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>;
+    }
+    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&) ) );
 }
 QCString QCopChannel::channel()const {
     return m_chan;
 }
-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 );
 }
 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 );
+    }
 
     return true;
 }
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
@@ -3,6 +3,7 @@
 
 #include <qobject.h>
 #include <qcstring.h>
+#include <qlist.h>
 
 class OCOPClient;
 class QCopChannel : public QObject {
@@ -20,6 +21,7 @@ public:
                       const QByteArray& );
     static bool sendLocally( const QCString& chan, const QCString& msg,
                              const QByteArray& data );
+    void receive( const QCString& msg, const QByteArray& ar );
 
 signals:
     void received( const QCString& msg, const QByteArray& );
@@ -29,7 +31,7 @@ private slots:
 
 private:
     void init();
-    OCOPClient* m_client;
+    static QList<QCopChannel> *m_list;
     /* the channel */
     QCString m_chan;
     class Private;
--
cgit v0.9.0.2