summaryrefslogtreecommitdiff
authorzecke <zecke>2003-02-05 08:54:58 (UTC)
committer zecke <zecke>2003-02-05 08:54:58 (UTC)
commitbbb3690f12191763a407e6a0edd521113b3c25ac (patch) (unidiff)
tree39f90d71c7f085f5722382db4a5577bbda2e1618
parent97b96e141fca844317e59ca5b99c1bf5fa52b1f0 (diff)
downloadopie-bbb3690f12191763a407e6a0edd521113b3c25ac.zip
opie-bbb3690f12191763a407e6a0edd521113b3c25ac.tar.gz
opie-bbb3690f12191763a407e6a0edd521113b3c25ac.tar.bz2
Fix the IPC server and client
registering channel is done locally with refcounts if the channel is already registered globally Fix some sizes to allow proper communication..
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--x11/ipc/client/ocopclient.cpp8
-rw-r--r--x11/ipc/server/ocopserver.cpp9
-rw-r--r--x11/libqpe-x11/qt/qcopchannel_qws.cpp31
-rw-r--r--x11/libqpe-x11/qt/qcopchannel_qws.h4
4 files changed, 39 insertions, 13 deletions
diff --git a/x11/ipc/client/ocopclient.cpp b/x11/ipc/client/ocopclient.cpp
index 6085481..91827e7 100644
--- a/x11/ipc/client/ocopclient.cpp
+++ b/x11/ipc/client/ocopclient.cpp
@@ -94,47 +94,55 @@ void OCOPClient::newData() {
94OCOPPacket OCOPClient::packet() const{ 94OCOPPacket OCOPClient::packet() const{
95 QCString chan; 95 QCString chan;
96 QCString func; 96 QCString func;
97 QByteArray ar; 97 QByteArray ar;
98 OCOPHead head; 98 OCOPHead head;
99 memset(&head, 0, sizeof(head) ); 99 memset(&head, 0, sizeof(head) );
100 read(m_socket, &head, sizeof(head) ); 100 read(m_socket, &head, sizeof(head) );
101 if ( head.magic == 47 ) { 101 if ( head.magic == 47 ) {
102 qWarning("Client:Magic Match");
103 chan = QCString( head.chlen+1);
104 func = QCString( head.funclen+1 );
105 ar = QByteArray( head.datalen);
102 read(m_socket, chan.data(), head.chlen ); 106 read(m_socket, chan.data(), head.chlen );
103 read(m_socket, func.data(), head.funclen ); 107 read(m_socket, func.data(), head.funclen );
104 read(m_socket, ar.data(), head.datalen ); 108 read(m_socket, ar.data(), head.datalen );
109 qWarning("Client:%d %s",head.chlen,chan.data() );
105 } 110 }
106 OCOPPacket pack(head.type, chan, func, ar ); 111 OCOPPacket pack(head.type, chan, func, ar );
107 return pack; 112 return pack;
108} 113}
109/* 114/*
110 * we've blocking IO here on these sockets 115 * we've blocking IO here on these sockets
111 * so we send and go on read 116 * so we send and go on read
112 * this will be blocked 117 * this will be blocked
113 */ 118 */
114bool OCOPClient::isRegistered( const QCString& chan ) const{ 119bool OCOPClient::isRegistered( const QCString& chan ) const{
120 qWarning("OCopClient::isRegistered %s", chan.data() );
115 /* should I disconnect the socket notfier? */ 121 /* should I disconnect the socket notfier? */
116 OCOPPacket packe(OCOPPacket::IsRegistered, chan ); 122 OCOPPacket packe(OCOPPacket::IsRegistered, chan );
117 OCOPHead head = packe.head(); 123 OCOPHead head = packe.head();
118 write(m_socket, &head, sizeof(head) ); 124 write(m_socket, &head, sizeof(head) );
119 write(m_socket, chan.data(), chan.size() ); 125 write(m_socket, chan.data(), chan.size() );
120 /* block */ 126 /* block */
121 OCOPPacket pack = packet(); 127 OCOPPacket pack = packet();
128 qWarning("unblock %s %s", pack.channel().data(), chan.data() );
122 129
123 /* connect here again */ 130 /* connect here again */
124 if ( pack.channel() == chan ) { 131 if ( pack.channel() == chan ) {
125 QCString func = pack.header(); 132 QCString func = pack.header();
126 if (func[0] == 1 ) 133 if (func[0] == 1 )
127 return true; 134 return true;
128 } 135 }
129 136
130 return false; 137 return false;
131}; 138};
132void OCOPClient::send( const QCString& chan, const QCString& fu, const QByteArray& arr ) { 139void OCOPClient::send( const QCString& chan, const QCString& fu, const QByteArray& arr ) {
140 qWarning("ClientSending %s %s", chan.data(), fu.data() );
133 OCOPPacket pack(OCOPPacket::Call, chan, fu, arr ); 141 OCOPPacket pack(OCOPPacket::Call, chan, fu, arr );
134 call( pack ); 142 call( pack );
135} 143}
136void OCOPClient::addChannel(const QCString& channel) { 144void OCOPClient::addChannel(const QCString& channel) {
137 OCOPPacket pack(OCOPPacket::RegisterChannel, channel ); 145 OCOPPacket pack(OCOPPacket::RegisterChannel, channel );
138 call( pack ); 146 call( pack );
139} 147}
140void OCOPClient::delChannel(const QCString& chan ) { 148void OCOPClient::delChannel(const QCString& chan ) {
diff --git a/x11/ipc/server/ocopserver.cpp b/x11/ipc/server/ocopserver.cpp
index 0f818b7..ee5ea18 100644
--- a/x11/ipc/server/ocopserver.cpp
+++ b/x11/ipc/server/ocopserver.cpp
@@ -162,17 +162,17 @@ void OCopServer::newOnClient( int fd ) {
162 * data into mem 162 * data into mem
163 * and then send the OCOPPacket 163 * and then send the OCOPPacket
164 * 164 *
165 */ 165 */
166 if (head.magic == 47 ) { 166 if (head.magic == 47 ) {
167// qWarning("magic match"); 167// qWarning("magic match");
168 QCString channel( head.chlen+1 ); 168 QCString channel( head.chlen+1 );
169 QCString func( head.funclen+1 ); 169 QCString func( head.funclen+1 );
170 QByteArray data ( head.datalen ); 170 QByteArray data ( head.datalen+1 );
171 171
172 /* 172 /*
173 * we do not check for errors 173 * we do not check for errors
174 */ 174 */
175// qWarning("read "); 175// qWarning("read ");
176 int s = read(fd, channel.data(), head.chlen ); 176 int s = read(fd, channel.data(), head.chlen );
177 s = read(fd, func.data(), head.funclen ); 177 s = read(fd, func.data(), head.funclen );
178 s = read(fd, data.data(), head.datalen ); 178 s = read(fd, data.data(), head.datalen );
@@ -295,17 +295,17 @@ void OCopServer::dispatch( const OCOPPacket& packet, int sourceFD ) {
295 break; 295 break;
296 /* not implemented */ 296 /* not implemented */
297 case OCOPPacket::Return: 297 case OCOPPacket::Return:
298 break; 298 break;
299 /* not implemented :( */ 299 /* not implemented :( */
300 case OCOPPacket::Signal: 300 case OCOPPacket::Signal:
301 break; 301 break;
302 case OCOPPacket::IsRegistered: 302 case OCOPPacket::IsRegistered:
303 qWarning("IsRegistered"); 303 qWarning("Server:IsRegistered %s", packet.channel().data() );
304 isRegistered( packet.channel(), sourceFD ); 304 isRegistered( packet.channel(), sourceFD );
305 break; 305 break;
306 }; 306 };
307} 307}
308void OCopServer::errorOnServer() { 308void OCopServer::errorOnServer() {
309 /* 309 /*
310 * something is wrong on the server socket? 310 * something is wrong on the server socket?
311 * what should we do? 311 * what should we do?
@@ -360,32 +360,34 @@ void OCopServer::delChannel( const QCString& channel,
360 rem = ints.remove( rem ); 360 rem = ints.remove( rem );
361 QCString str = it.key().copy(); 361 QCString str = it.key().copy();
362 m_channels.replace( str, ints ); 362 m_channels.replace( str, ints );
363 } 363 }
364 qWarning(" channel count is now %d", ints.count() ); 364 qWarning(" channel count is now %d", ints.count() );
365 } 365 }
366} 366}
367void OCopServer::isRegistered( const QCString& channel, int fd) { 367void OCopServer::isRegistered( const QCString& channel, int fd) {
368// qWarning("isRegistered"); 368 qWarning("Server:isRegistered %s", channel.data() );
369 OCOPHead head; 369 OCOPHead head;
370 QCString func(2); 370 QCString func(2);
371 371
372 memset(&head, 0, sizeof(head ) ); 372 memset(&head, 0, sizeof(head ) );
373 head.magic = 47; 373 head.magic = 47;
374 head.type = OCOPPacket::IsRegistered; 374 head.type = OCOPPacket::IsRegistered;
375 head.chlen = channel.size(); 375 head.chlen = channel.size();
376 head.funclen = func.size(); 376 head.funclen = func.size();
377 head.datalen = 0; 377 head.datalen = 0;
378 378
379 if ( isChannelRegistered( channel ) ) { 379 if ( isChannelRegistered( channel ) ) {
380 //is registered 380 //is registered
381 func[0] = 1; 381 func[0] = 1;
382 qWarning("Server:Channel is Registered %d", head.chlen);
382 }else{ 383 }else{
383 func[0] = 0; 384 func[0] = 0;
385 qWarning("Server:Channel is NotRegistered");
384 } 386 }
385 387
386 /** 388 /**
387 * write the head 389 * write the head
388 * and then channel 390 * and then channel
389 * success/failure inside func 391 * success/failure inside func
390 */ 392 */
391 write(fd, &head, sizeof(head) ); 393 write(fd, &head, sizeof(head) );
@@ -396,15 +398,16 @@ QValueList<int> OCopServer::clients( const QCString& channel ) {
396 return m_channels[channel]; 398 return m_channels[channel];
397} 399}
398void OCopServer::call( const OCOPPacket& p, int ) { 400void OCopServer::call( const OCOPPacket& p, int ) {
399 QValueList<int> cli = clients( p.channel() ); 401 QValueList<int> cli = clients( p.channel() );
400 QValueList<int>::Iterator it; 402 QValueList<int>::Iterator it;
401 403
402 OCOPHead head = p.head(); 404 OCOPHead head = p.head();
403 for (it = cli.begin(); it != cli.end(); ++it ) { 405 for (it = cli.begin(); it != cli.end(); ++it ) {
406 qWarning("Server:calling %d %s %s", (*it), p.channel().data(), p.header().data() );
404 write( (*it), &head, sizeof(head ) ); 407 write( (*it), &head, sizeof(head ) );
405 /* expl. shared! */ 408 /* expl. shared! */
406 write( (*it), p.channel().data(), p.channel().size() ); 409 write( (*it), p.channel().data(), p.channel().size() );
407 write( (*it), p.header().data(), p.header().size() ); 410 write( (*it), p.header().data(), p.header().size() );
408 write( (*it), p.content().data(), p.content().size() ); 411 write( (*it), p.content().data(), p.content().size() );
409 }; 412 };
410} 413}
diff --git a/x11/libqpe-x11/qt/qcopchannel_qws.cpp b/x11/libqpe-x11/qt/qcopchannel_qws.cpp
index e90f056..1cea80c 100644
--- a/x11/libqpe-x11/qt/qcopchannel_qws.cpp
+++ b/x11/libqpe-x11/qt/qcopchannel_qws.cpp
@@ -1,39 +1,51 @@
1 1
2#include "../../ipc/client/ocopclient.h" 2#include "../../ipc/client/ocopclient.h"
3 3
4#include <qcopchannel_qws.h> 4#include <qcopchannel_qws.h>
5 5
6QList<QCopChannel>* QCopChannel::m_list = 0; 6QList<QCopChannel>* QCopChannel::m_list = 0;
7QMap<QCString, int> QCopChannel::m_refCount;
7 8
8QCopChannel::QCopChannel( const QCString& channel, QObject* parent, 9QCopChannel::QCopChannel( const QCString& channel, QObject* parent,
9 const char* name ) 10 const char* name )
10 : QObject( parent, name ),m_chan(channel) { 11 : QObject( parent, name ),m_chan(channel) {
11 init();
12 if (!m_list ) { 12 if (!m_list ) {
13 m_list = new QList<QCopChannel>; 13 m_list = new QList<QCopChannel>;
14 /* only connect once */
15 connect(OCOPClient::self(), SIGNAL(called(const QCString&, const QCString&, const QByteArray& ) ),
16 this, SLOT(rev(const QCString&, const QCString&, const QByteArray&) ) );
14 } 17 }
18 /* first registration or ref count is 0 for m_chan*/
19 if (!m_refCount.contains( m_chan ) || !m_refCount[m_chan] ) {
20 m_refCount[m_chan] = 1;
21 OCOPClient::self()->addChannel( m_chan );
22 }else
23 m_refCount[m_chan]++;
24
15 m_list->append(this); 25 m_list->append(this);
16} 26}
17void QCopChannel::receive( const QCString& msg, const QByteArray& ar ) { 27void QCopChannel::receive( const QCString& msg, const QByteArray& ar ) {
18 emit received( msg, ar ); 28 emit received( msg, ar );
19} 29}
20QCopChannel::~QCopChannel() { 30QCopChannel::~QCopChannel() {
31 if (m_refCount[m_chan] == 1 ) {
32 OCOPClient::self()->delChannel( m_chan );
33 m_refCount[m_chan] = 0;
34 }else
35 m_refCount[m_chan]--;
36
37
21 m_list->remove(this); 38 m_list->remove(this);
22 if (m_list->count() == 0 ) { 39 if (m_list->count() == 0 ) {
23 delete m_list; 40 delete m_list;
24 m_list = 0; 41 m_list = 0;
25 } 42 }
26 OCOPClient::self()->delChannel( m_chan ); 43
27}
28void QCopChannel::init() {
29 OCOPClient::self()->addChannel( m_chan );
30 connect(OCOPClient::self(), SIGNAL(called(const QCString&, const QCString&, const QByteArray& ) ),
31 this, SLOT(rev(const QCString&, const QCString&, const QByteArray&) ) );
32} 44}
33QCString QCopChannel::channel()const { 45QCString QCopChannel::channel()const {
34 return m_chan; 46 return m_chan;
35} 47}
36bool QCopChannel::isRegistered( const QCString& chan) {; 48bool QCopChannel::isRegistered( const QCString& chan) {;
37 return OCOPClient::self()->isRegistered( chan ); 49 return OCOPClient::self()->isRegistered( chan );
38} 50}
39bool QCopChannel::send( const QCString& chan, const QCString& msg ) { 51bool QCopChannel::send( const QCString& chan, const QCString& msg ) {
@@ -42,22 +54,23 @@ bool QCopChannel::send( const QCString& chan, const QCString& msg ) {
42} 54}
43bool QCopChannel::send( const QCString& chan, const QCString& msg, 55bool QCopChannel::send( const QCString& chan, const QCString& msg,
44 const QByteArray& ar ) { 56 const QByteArray& ar ) {
45 OCOPClient::self()->send( chan, msg, ar ); 57 OCOPClient::self()->send( chan, msg, ar );
46 return true; 58 return true;
47} 59}
48bool QCopChannel::sendLocally( const QCString& chann, const QCString& msg, 60bool QCopChannel::sendLocally( const QCString& chann, const QCString& msg,
49 const QByteArray& ar ) { 61 const QByteArray& ar ) {
62 qWarning("Client:sendLocally %s %s", chann.data(), msg.data() );
50 if (!m_list ) 63 if (!m_list )
51 return true; 64 return true;
52 QCopChannel* chan; 65 QCopChannel* chan;
66
53 for ( chan = m_list->first(); chan; chan = m_list->next() ) { 67 for ( chan = m_list->first(); chan; chan = m_list->next() ) {
54 if ( chan->channel() == chann ) 68 if ( chan->channel() == chann )
55 chan->receive( msg, ar ); 69 chan->receive( msg, ar );
56 } 70 }
57 71
58 return true; 72 return true;
59} 73}
60void QCopChannel::rev( const QCString& chan, const QCString& msg, const QByteArray& ar ) { 74void QCopChannel::rev( const QCString& chan, const QCString& msg, const QByteArray& ar ) {
61 if (chan == m_chan ) 75 sendLocally( chan, msg, ar );
62 emit received(msg, ar );
63} 76}
diff --git a/x11/libqpe-x11/qt/qcopchannel_qws.h b/x11/libqpe-x11/qt/qcopchannel_qws.h
index 94b199e..c1220cb 100644
--- a/x11/libqpe-x11/qt/qcopchannel_qws.h
+++ b/x11/libqpe-x11/qt/qcopchannel_qws.h
@@ -1,14 +1,15 @@
1#ifndef OPIE_QCOP_CHANNEL_QWS_H 1#ifndef OPIE_QCOP_CHANNEL_QWS_H
2#define OPIE_QCOP_CHANNEL_QWS_H 2#define OPIE_QCOP_CHANNEL_QWS_H
3 3
4#include <qobject.h> 4#include <qobject.h>
5#include <qcstring.h> 5#include <qcstring.h>
6#include <qlist.h> 6#include <qlist.h>
7#include <qmap.h>
7 8
8class OCOPClient; 9class OCOPClient;
9class QCopChannel : public QObject { 10class QCopChannel : public QObject {
10 Q_OBJECT 11 Q_OBJECT
11public: 12public:
12 QCopChannel( const QCString& channel, QObject* parent = 0, 13 QCopChannel( const QCString& channel, QObject* parent = 0,
13 const char* name = 0); 14 const char* name = 0);
14 virtual ~QCopChannel(); 15 virtual ~QCopChannel();
@@ -25,18 +26,19 @@ public:
25 26
26signals: 27signals:
27 void received( const QCString& msg, const QByteArray& ); 28 void received( const QCString& msg, const QByteArray& );
28 29
29private slots: 30private slots:
30 void rev( const QCString& chan, const QCString&, const QByteArray& ); 31 void rev( const QCString& chan, const QCString&, const QByteArray& );
31 32
32private: 33private:
33 void init(); 34 bool isRegisteredLocally( const QCString& str);
34 static QList<QCopChannel> *m_list; 35 static QList<QCopChannel> *m_list;
36 static QMap<QCString, int> m_refCount;
35 /* the channel */ 37 /* the channel */
36 QCString m_chan; 38 QCString m_chan;
37 class Private; 39 class Private;
38 Private *d; 40 Private *d;
39 41
40}; 42};
41 43
42#endif 44#endif