author | zecke <zecke> | 2002-10-16 18:24:48 (UTC) |
---|---|---|
committer | zecke <zecke> | 2002-10-16 18:24:48 (UTC) |
commit | 9047650faad7e64e0a36553dfe04dc7ad084f095 (patch) (side-by-side diff) | |
tree | b79a65f224b329d6dcc559d8b72d564ccce4a3c8 /x11/ipc/server/ocopserver.cpp | |
parent | 1a305f211913ce4a4d73ed0b36a0be535c0e03ec (diff) | |
download | opie-9047650faad7e64e0a36553dfe04dc7ad084f095.zip opie-9047650faad7e64e0a36553dfe04dc7ad084f095.tar.gz opie-9047650faad7e64e0a36553dfe04dc7ad084f095.tar.bz2 |
More IPC integtration
OCOPClient::self() added so we keep
the connections low
Diffstat (limited to 'x11/ipc/server/ocopserver.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | x11/ipc/server/ocopserver.cpp | 27 |
1 files changed, 20 insertions, 7 deletions
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 @@ -193,78 +193,91 @@ void OCopServer::newOnClient( int fd ) { OCOPPacket packet( head.type, channel, func, data ); dispatch( packet, fd ); }else{ qWarning("magic does not match"); qWarning("magic %d", head.magic ); } } void OCopServer::registerClient( int fd ) { if (m_clients.contains(fd) ) return; QSocketNotifier* notify = new QSocketNotifier(fd, QSocketNotifier::Read, this ); connect(notify, SIGNAL(activated(int) ), this, SLOT(newOnClient(int) ) ); OCOPClient client; 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 * the package and then do the appropriate thins */ void OCopServer::dispatch( const OCOPPacket& packet, int sourceFD ) { qWarning("packet.type() == %d", packet.type() ); switch( packet.type() ) { case OCOPPacket::Register: registerClient(sourceFD ); break; case OCOPPacket::Unregister: deregisterClient(sourceFD ); break; case OCOPPacket::Call: call( packet, sourceFD ); break; /* not implemented */ case OCOPPacket::Method: |