-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 |
3 files changed, 35 insertions, 8 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 @@ -9,16 +9,25 @@ #include <qfile.h> #include <qtimer.h> #include "../common/ocoppacket.h" #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 ) { m_tries = 0; init(QFile::encodeName(path) ); } OCOPClient::~OCOPClient() { delete m_notify; 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 @@ -15,17 +15,21 @@ * It currently only supports * asking if a Channel is registered, * calling and receiving calls */ 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 */ OCOPClient(const QString& pathToServer = QString::null, QObject* obj = 0l); ~OCOPClient(); bool isRegistered( const QCString& )const; void send( const QCString& chan, const QCString&, const QByteArray& msg ); @@ -51,11 +55,12 @@ private: void startUP(); OCOPPacket packet()const; void call( const OCOPPacket& ); QSocketNotifier* m_notify; 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 @@ -209,46 +209,59 @@ void OCopServer::registerClient( int fd ) { client.fd = fd; client.notify = notify; m_clients.insert( client.fd, client ); qWarning("clients are up to %d", m_clients.count() ); }; 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 ); /* * TIME_ME * * now delete from all channels * go through all channels * remove the fd from the list * 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 } qWarning("clients are now at %d", m_clients.count() ); }; /** * this function will evaluate |