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
@@ -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