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
@@ -86,63 +86,71 @@ void OCOPClient::newData() {
86 case OCOPPacket::IsRegistered: 86 case OCOPPacket::IsRegistered:
87 break; 87 break;
88 /* emit the signal */ 88 /* emit the signal */
89 case OCOPPacket::Call: 89 case OCOPPacket::Call:
90 emit called( pack.channel(), pack.header(), pack.content() ); 90 emit called( pack.channel(), pack.header(), pack.content() );
91 break; 91 break;
92 } 92 }
93} 93}
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 ) {
141 OCOPPacket pack(OCOPPacket::UnregisterChannel, chan ); 149 OCOPPacket pack(OCOPPacket::UnregisterChannel, chan );
142 call( pack ); 150 call( pack );
143} 151}
144void OCOPClient::call( const OCOPPacket& pack ) { 152void OCOPClient::call( const OCOPPacket& pack ) {
145 OCOPHead head = pack.head(); 153 OCOPHead head = pack.head();
146 write(m_socket, &head, sizeof(head) ); 154 write(m_socket, &head, sizeof(head) );
147 write(m_socket, pack.channel().data(), pack.channel().size() ); 155 write(m_socket, pack.channel().data(), pack.channel().size() );
148 write(m_socket, pack.header().data(), pack.header().size() ); 156 write(m_socket, pack.header().data(), pack.header().size() );
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
@@ -154,33 +154,33 @@ void OCopServer::newOnClient( int fd ) {
154 //qWarning("data %s %d", &bug, rea ); 154 //qWarning("data %s %d", &bug, rea );
155 155
156 /* 156 /*
157 * Check the magic 157 * Check the magic
158 * if chcked read till EOF if magic does not match 158 * if chcked read till EOF if magic does not match
159 * otherwise do read 159 * otherwise do read
160 * channel 160 * channel
161 * func 161 * func
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 );
179// qWarning("read"); 179// qWarning("read");
180 180
181 /* debug output */ 181 /* debug output */
182// qWarning("channel %s %d", channel.data(), head.chlen ); 182// qWarning("channel %s %d", channel.data(), head.chlen );
183// qWarning("func %s %d", func.data(), head.funclen ); 183// qWarning("func %s %d", func.data(), head.funclen );
184 /* debug end */ 184 /* debug end */
185 185
186 /* 186 /*
@@ -287,33 +287,33 @@ void OCopServer::dispatch( const OCOPPacket& packet, int sourceFD ) {
287 /* nit implemented */ 287 /* nit implemented */
288 case OCOPPacket::Reply: 288 case OCOPPacket::Reply:
289 break; 289 break;
290 case OCOPPacket::RegisterChannel: 290 case OCOPPacket::RegisterChannel:
291 addChannel( packet.channel() , sourceFD ); 291 addChannel( packet.channel() , sourceFD );
292 break; 292 break;
293 case OCOPPacket::UnregisterChannel: 293 case OCOPPacket::UnregisterChannel:
294 delChannel( packet.channel(), sourceFD ); 294 delChannel( packet.channel(), 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?
312 * FIXME 312 * FIXME
313 */ 313 */
314} 314}
315QStringList OCopServer::channels() { 315QStringList OCopServer::channels() {
316 QStringList list; 316 QStringList list;
317 { 317 {
318 QMap<QCString, QValueList<int> >::Iterator it; 318 QMap<QCString, QValueList<int> >::Iterator it;
319 for (it = m_channels.begin(); it != m_channels.end(); ++it ) { 319 for (it = m_channels.begin(); it != m_channels.end(); ++it ) {
@@ -352,59 +352,62 @@ void OCopServer::delChannel( const QCString& channel,
352 352
353 if ( it.data().contains(fd) ) { 353 if ( it.data().contains(fd) ) {
354 QValueList<int> ints = it.data(); 354 QValueList<int> ints = it.data();
355 if ( ints.count() == 1 ) 355 if ( ints.count() == 1 )
356 m_channels.remove( channel ); 356 m_channels.remove( channel );
357 else{ 357 else{
358 QValueList<int> ints = it.data(); 358 QValueList<int> ints = it.data();
359 QValueList<int>::Iterator rem = ints.find( fd ); 359 QValueList<int>::Iterator rem = ints.find( fd );
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) );
392 write(fd, channel.data(), channel.size() ); 394 write(fd, channel.data(), channel.size() );
393 write(fd, func.data(), func.size() ); 395 write(fd, func.data(), func.size() );
394} 396}
395QValueList<int> OCopServer::clients( const QCString& channel ) { 397QValueList<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,63 +1,76 @@
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 ) {
40 QByteArray ar; 52 QByteArray ar;
41 return send(chan, msg, ar ); 53 return send(chan, msg, ar );
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,42 +1,44 @@
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();
15 16
16 QCString channel()const; 17 QCString channel()const;
17 18
18 static bool isRegistered( const QCString& channel ); 19 static bool isRegistered( const QCString& channel );
19 static bool send( const QCString& channel, const QCString& msg ); 20 static bool send( const QCString& channel, const QCString& msg );
20 static bool send( const QCString& channel, const QCString& msg, 21 static bool send( const QCString& channel, const QCString& msg,
21 const QByteArray& ); 22 const QByteArray& );
22 static bool sendLocally( const QCString& chan, const QCString& msg, 23 static bool sendLocally( const QCString& chan, const QCString& msg,
23 const QByteArray& data ); 24 const QByteArray& data );
24 void receive( const QCString& msg, const QByteArray& ar ); 25 void receive( const QCString& msg, const QByteArray& ar );
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