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
@@ -1,40 +1,49 @@
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/un.h>
#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;
close( m_socket );
}
void OCOPClient::init() {
// failed start ther server NOW!!!
startUP();
QCString str;
init(str );
}
void OCOPClient::init( const QCString& ) {
m_tries++;
struct sockaddr_un unix_adr;
if ( (m_socket = socket(PF_UNIX, SOCK_STREAM, 0) ) < 0 ) {
qWarning("could not socket");
if ( m_tries < 8 )
QTimer::singleShot(400, this,SLOT(init() ) );
return;
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
@@ -1,61 +1,66 @@
#ifndef OPIE_OCOP_CLIENT_H
#define OPIE_OCOP_CLIENT_H
#include <qobject.h>
#include <qcstring.h>
#include <qmap.h>
#include <qsignal.h>
#include <qstring.h>
#include <qsocketnotifier.h>
/**
* This is the OCOP client
* 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 );
/**
* add a channel and does connect to a signal
* callback is the object
* slot is the SLOT()
*/
void addChannel( const QCString& channel );
void delChannel( const QCString& channel );
/* make it singleton? */
//static OCOPClient* self();
/* no direct signals due the design */
signals:
void called(const QCString&, const QCString&, const QByteArray& );
private slots:
void init();
void init(const QCString& pa);
void newData();
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
@@ -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: