summaryrefslogtreecommitdiff
authorzecke <zecke>2002-10-16 18:24:48 (UTC)
committer zecke <zecke>2002-10-16 18:24:48 (UTC)
commit9047650faad7e64e0a36553dfe04dc7ad084f095 (patch) (side-by-side diff)
treeb79a65f224b329d6dcc559d8b72d564ccce4a3c8
parent1a305f211913ce4a4d73ed0b36a0be535c0e03ec (diff)
downloadopie-9047650faad7e64e0a36553dfe04dc7ad084f095.zip
opie-9047650faad7e64e0a36553dfe04dc7ad084f095.tar.gz
opie-9047650faad7e64e0a36553dfe04dc7ad084f095.tar.bz2
More IPC integtration
OCOPClient::self() added so we keep the connections low
Diffstat (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
-rw-r--r--x11/libqpe-x11/qt/qcopchannel_qws.cpp45
-rw-r--r--x11/libqpe-x11/qt/qcopchannel_qws.h4
5 files changed, 69 insertions, 23 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,64 +1,73 @@
#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;
}
memset(&unix_adr, 0, sizeof(unix_adr ) );
unix_adr.sun_family = AF_UNIX;
sprintf(unix_adr.sun_path,"%s/.opie.cop", getenv("HOME") );
int length = sizeof(unix_adr.sun_family) + strlen(unix_adr.sun_path);
if ( ::connect(m_socket, (struct sockaddr*)&unix_adr, length ) < 0 ) {
qWarning("could not connect %d", errno );
close( m_socket );
if ( m_tries < 8 )
QTimer::singleShot(400, this, SLOT(init() ) );
return;
}
m_notify = new QSocketNotifier(m_socket, QSocketNotifier::Read, this );
connect( m_notify, SIGNAL(activated(int) ),
this, SLOT(newData() ) );
}
/**
* new data
* read the header check magic number
* and maybe read body
*/
void OCOPClient::newData() {
OCOPPacket pack = packet();
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
@@ -169,126 +169,139 @@ void OCopServer::newOnClient( int fd ) {
QCString func( head.funclen+1 );
QByteArray data ( head.datalen );
/*
* we do not check for errors
*/
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");
/* debug output */
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 );
}
}
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:
break;
/* nit implemented */
case OCOPPacket::Reply:
break;
case OCOPPacket::RegisterChannel:
addChannel( packet.channel() , sourceFD );
break;
case OCOPPacket::UnregisterChannel:
delChannel( packet.channel(), sourceFD );
break;
/* not implemented */
case OCOPPacket::Return:
break;
/* not implemented :( */
case OCOPPacket::Signal:
break;
case OCOPPacket::IsRegistered:
qWarning("IsRegistered");
isRegistered( packet.channel(), sourceFD );
break;
};
}
void OCopServer::errorOnServer() {
/*
diff --git a/x11/libqpe-x11/qt/qcopchannel_qws.cpp b/x11/libqpe-x11/qt/qcopchannel_qws.cpp
index c315d66..e90f056 100644
--- a/x11/libqpe-x11/qt/qcopchannel_qws.cpp
+++ b/x11/libqpe-x11/qt/qcopchannel_qws.cpp
@@ -1,46 +1,63 @@
#include "../../ipc/client/ocopclient.h"
#include <qcopchannel_qws.h>
+QList<QCopChannel>* QCopChannel::m_list = 0;
+
QCopChannel::QCopChannel( const QCString& channel, QObject* parent,
const char* name )
: QObject( parent, name ),m_chan(channel) {
init();
+ if (!m_list ) {
+ m_list = new QList<QCopChannel>;
+ }
+ m_list->append(this);
+}
+void QCopChannel::receive( const QCString& msg, const QByteArray& ar ) {
+ emit received( msg, ar );
}
QCopChannel::~QCopChannel() {
- m_client->delChannel( m_chan );
- delete m_client;
+ m_list->remove(this);
+ if (m_list->count() == 0 ) {
+ delete m_list;
+ m_list = 0;
+ }
+ OCOPClient::self()->delChannel( m_chan );
}
void QCopChannel::init() {
- m_client = new OCOPClient(QString::null, this );
- m_client->addChannel(m_chan );
- connect(m_client, SIGNAL(called(const QCString&, const QCString&, const QByteArray& ) ),
+ OCOPClient::self()->addChannel( m_chan );
+ connect(OCOPClient::self(), SIGNAL(called(const QCString&, const QCString&, const QByteArray& ) ),
this, SLOT(rev(const QCString&, const QCString&, const QByteArray&) ) );
}
QCString QCopChannel::channel()const {
return m_chan;
}
-bool QCopChannel::isRegistered( const QCString& chan) {
- OCOPClient client;
- return client.isRegistered( chan );
+bool QCopChannel::isRegistered( const QCString& chan) {;
+ return OCOPClient::self()->isRegistered( chan );
}
bool QCopChannel::send( const QCString& chan, const QCString& msg ) {
- QByteArray ar(0);
- return sendLocally(chan, msg, ar );
+ QByteArray ar;
+ return send(chan, msg, ar );
}
bool QCopChannel::send( const QCString& chan, const QCString& msg,
const QByteArray& ar ) {
- return sendLocally( chan, msg, ar );
+ OCOPClient::self()->send( chan, msg, ar );
+ return true;
}
-bool QCopChannel::sendLocally( const QCString& chan, const QCString& msg,
+bool QCopChannel::sendLocally( const QCString& chann, const QCString& msg,
const QByteArray& ar ) {
- OCOPClient client;
- client.send( chan, msg, ar );
+ if (!m_list )
+ return true;
+ QCopChannel* chan;
+ for ( chan = m_list->first(); chan; chan = m_list->next() ) {
+ if ( chan->channel() == chann )
+ chan->receive( msg, ar );
+ }
return true;
}
void QCopChannel::rev( const QCString& chan, const QCString& msg, const QByteArray& ar ) {
if (chan == m_chan )
emit received(msg, ar );
}
diff --git a/x11/libqpe-x11/qt/qcopchannel_qws.h b/x11/libqpe-x11/qt/qcopchannel_qws.h
index b0a6ce0..94b199e 100644
--- a/x11/libqpe-x11/qt/qcopchannel_qws.h
+++ b/x11/libqpe-x11/qt/qcopchannel_qws.h
@@ -1,40 +1,42 @@
#ifndef OPIE_QCOP_CHANNEL_QWS_H
#define OPIE_QCOP_CHANNEL_QWS_H
#include <qobject.h>
#include <qcstring.h>
+#include <qlist.h>
class OCOPClient;
class QCopChannel : public QObject {
Q_OBJECT
public:
QCopChannel( const QCString& channel, QObject* parent = 0,
const char* name = 0);
virtual ~QCopChannel();
QCString channel()const;
static bool isRegistered( const QCString& channel );
static bool send( const QCString& channel, const QCString& msg );
static bool send( const QCString& channel, const QCString& msg,
const QByteArray& );
static bool sendLocally( const QCString& chan, const QCString& msg,
const QByteArray& data );
+ void receive( const QCString& msg, const QByteArray& ar );
signals:
void received( const QCString& msg, const QByteArray& );
private slots:
void rev( const QCString& chan, const QCString&, const QByteArray& );
private:
void init();
- OCOPClient* m_client;
+ static QList<QCopChannel> *m_list;
/* the channel */
QCString m_chan;
class Private;
Private *d;
};
#endif