summaryrefslogtreecommitdiff
path: root/x11/ipc
Side-by-side diff
Diffstat (limited to 'x11/ipc') (more/less context) (ignore whitespace changes)
-rw-r--r--x11/ipc/client/ocopclient.cpp9
-rw-r--r--x11/ipc/client/ocopclient.h7
-rw-r--r--x11/ipc/server/ocopserver.cpp27
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
@@ -13,8 +13,17 @@
#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;
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
@@ -19,9 +19,13 @@
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);
@@ -55,7 +59,8 @@ private:
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
@@ -213,9 +213,9 @@ 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 );
/*
@@ -226,25 +226,38 @@ void OCopServer::deregisterClient(int fd ) {
* 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
}