summaryrefslogtreecommitdiff
path: root/x11/ipc
authorzecke <zecke>2002-10-18 01:34:23 (UTC)
committer zecke <zecke>2002-10-18 01:34:23 (UTC)
commit0457c48c165abef8afa2ac73c8f66d20e289681a (patch) (side-by-side diff)
tree2c6baf363487d474df6ceeaf2ea17a351b38aa05 /x11/ipc
parente7e36afd3685c7fab146ebd0078d7f1a60f8c5e6 (diff)
downloadopie-0457c48c165abef8afa2ac73c8f66d20e289681a.zip
opie-0457c48c165abef8afa2ac73c8f66d20e289681a.tar.gz
opie-0457c48c165abef8afa2ac73c8f66d20e289681a.tar.bz2
Fix OCOPServer bugs... when removing clients
Implement the Opie side for the OK button now the awesome matchbox needs to get an update I was too excited about X11 so i did not do any PIM work yet
Diffstat (limited to 'x11/ipc') (more/less context) (show whitespace changes)
-rw-r--r--x11/ipc/server/ocopserver.cpp51
1 files changed, 31 insertions, 20 deletions
diff --git a/x11/ipc/server/ocopserver.cpp b/x11/ipc/server/ocopserver.cpp
index 4940cb8..0f818b7 100644
--- a/x11/ipc/server/ocopserver.cpp
+++ b/x11/ipc/server/ocopserver.cpp
@@ -151,49 +151,49 @@ void OCopServer::newOnClient( int fd ) {
/*
* OCOPHead
*/
//qWarning("data %s %d", &bug, rea );
/*
* Check the magic
* if chcked read till EOF if magic does not match
* otherwise do read
* channel
* func
* data into mem
* and then send the OCOPPacket
*
*/
if (head.magic == 47 ) {
- qWarning("magic match");
+// qWarning("magic match");
QCString channel( head.chlen+1 );
QCString func( head.funclen+1 );
QByteArray data ( head.datalen );
/*
* we do not check for errors
*/
- qWarning("read ");
+// qWarning("read ");
int s = read(fd, channel.data(), head.chlen );
s = read(fd, func.data(), head.funclen );
s = read(fd, data.data(), head.datalen );
- qWarning("read");
+// qWarning("read");
/* debug output */
- qWarning("channel %s %d", channel.data(), head.chlen );
- qWarning("func %s %d", func.data(), head.funclen );
+// qWarning("channel %s %d", channel.data(), head.chlen );
+// qWarning("func %s %d", func.data(), head.funclen );
/* debug end */
/*
* now that we got the complete body
* we need to make a package
* and then we need to send it to clients
* making a package is done here
* dispatching it not
*/
OCOPPacket packet( head.type, channel, func, data );
dispatch( packet, fd );
}else{
qWarning("magic does not match");
qWarning("magic %d", head.magic );
}
@@ -201,78 +201,80 @@ void OCopServer::newOnClient( int fd ) {
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.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 it2;
repeatIt:
for ( it2 = m_channels.begin(); it2 != m_channels.end(); ++it2 ) {
/*
* The channel contains this fd
*/
- qWarning("Channel %s", it2.key().data() );
+ qWarning("Channel %s %d", it2.key().data(), it2.data().count() );
if ( it2.data().contains( fd ) ) {
qWarning("contains");
QValueList<int> array = it2.data();
/*
* remove channel or just replace
*/
- if ( array.count() == 1 ) {
+ if ( array.count() == 1 || array.count() == 0) {
qWarning("Invalidate!");
/* is the list now invalidatet? */
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 );
- it2 = m_channels.replace( it2.key(), array );
+ qWarning("removing count %d %d",fd, array.count() );
+ QValueList<int>::Iterator it3 = array.find( fd );
+ it3 = array.remove( it3 );
+ QCString key = it2.key().copy();
+ it2 = m_channels.replace( key, array );
}
}
} // off all channels
+ OCOPClient client = it.data();
+ delete client.notify;
+ m_clients.remove(fd );
+ close(fd );
}
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;
@@ -314,60 +316,69 @@ QStringList OCopServer::channels() {
QStringList list;
{
QMap<QCString, QValueList<int> >::Iterator it;
for (it = m_channels.begin(); it != m_channels.end(); ++it ) {
list << it.key();
};
}
return list;
}
bool OCopServer::isChannelRegistered( const QCString& chan ) const{
return m_channels.contains( chan );
}
void OCopServer::addChannel( const QCString& channel,
int fd ) {
QMap<QCString, QValueList<int> >::Iterator it;
it = m_channels.find( channel );
-
+ if ( it != m_channels.end() ) {
/* could be empty */
QValueList<int> list = it.data();
list.append( fd );
+ qWarning("count is now in addChannel %d %s", list.count(), channel.data() );
it = m_channels.replace( channel, list );
+ }else {
+ QValueList<int> ints;
+ ints.append( fd );
+ m_channels.insert( channel, ints );
+ }
};
void OCopServer::delChannel( const QCString& channel,
int fd ) {
+ qWarning("remove %s, %d", channel.data(), fd );
if (!m_channels.contains( channel ) )
return;
QMap<QCString, QValueList<int> >::Iterator it;
it = m_channels.find( channel );
if ( it.data().contains(fd) ) {
-
QValueList<int> ints = it.data();
if ( ints.count() == 1 )
- m_channels.remove( it );
+ m_channels.remove( channel );
else{
QValueList<int> ints = it.data();
- ints.remove( fd );
- m_channels.replace( it.key(), ints );
+ QValueList<int>::Iterator rem = ints.find( fd );
+ rem = ints.remove( rem );
+ QCString str = it.key().copy();
+ m_channels.replace( str, ints );
}
+ qWarning(" channel count is now %d", ints.count() );
}
}
void OCopServer::isRegistered( const QCString& channel, int fd) {
- qWarning("isRegistered");
+// qWarning("isRegistered");
OCOPHead head;
QCString func(2);
memset(&head, 0, sizeof(head ) );
head.magic = 47;
head.type = OCOPPacket::IsRegistered;
head.chlen = channel.size();
head.funclen = func.size();
head.datalen = 0;
if ( isChannelRegistered( channel ) ) {
//is registered
func[0] = 1;
}else{
func[0] = 0;
}