summaryrefslogtreecommitdiff
authorzecke <zecke>2003-09-19 16:45:45 (UTC)
committer zecke <zecke>2003-09-19 16:45:45 (UTC)
commit0468cfef459d613ae0a32a3fa03e67726d19f6e9 (patch) (unidiff)
treea9c3a751f206b97e8eee6046057eba8d92a22d1d
parent42a5104340694255dc514514e7621ac2cee026fe (diff)
downloadopie-0468cfef459d613ae0a32a3fa03e67726d19f6e9.zip
opie-0468cfef459d613ae0a32a3fa03e67726d19f6e9.tar.gz
opie-0468cfef459d613ae0a32a3fa03e67726d19f6e9.tar.bz2
Either be compatible with Sharp( IntelliSync, KitchenSync, QtopiaDesktop)
or with the newer QtopiaDesktop or with both
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/launcher/qcopbridge.cpp99
-rw-r--r--core/launcher/qcopbridge.h3
2 files changed, 99 insertions, 3 deletions
diff --git a/core/launcher/qcopbridge.cpp b/core/launcher/qcopbridge.cpp
index f780235..9cb56ce 100644
--- a/core/launcher/qcopbridge.cpp
+++ b/core/launcher/qcopbridge.cpp
@@ -1,404 +1,497 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. 2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of the Qtopia Environment. 4** This file is part of the Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20 20
21#include "qcopbridge.h" 21#include "qcopbridge.h"
22#include "transferserver.h" 22#include "transferserver.h"
23 23
24#ifdef Q_WS_QWS 24#ifdef Q_WS_QWS
25#include <qtopia/qcopenvelope_qws.h> 25#include <qtopia/qcopenvelope_qws.h>
26#endif 26#endif
27#include <qtopia/qpeapplication.h> 27#include <qtopia/qpeapplication.h>
28#include <qtopia/global.h> 28#include <qtopia/global.h>
29#include <qtopia/version.h> 29#include <qtopia/version.h>
30#include <qtopia/config.h>
30 31
31#include <qdir.h> 32#include <qdir.h>
32#include <qfile.h> 33#include <qfile.h>
33#include <qtextstream.h> 34#include <qtextstream.h>
34#include <qdatastream.h> 35#include <qdatastream.h>
35#include <qcstring.h> 36#include <qcstring.h>
36#include <qstringlist.h> 37#include <qstringlist.h>
37#include <qfileinfo.h> 38#include <qfileinfo.h>
38#include <qregexp.h> 39#include <qregexp.h>
39#include <qtimer.h> 40#include <qtimer.h>
40#ifdef Q_WS_QWS 41#ifdef Q_WS_QWS
41#include <qcopchannel_qws.h> 42#include <qcopchannel_qws.h>
42#endif 43#endif
43 44
44#ifndef _XOPEN_SOURCE 45#ifndef _XOPEN_SOURCE
45#define _XOPEN_SOURCE 46#define _XOPEN_SOURCE
46#endif 47#endif
47#ifndef Q_OS_WIN32 48#ifndef Q_OS_WIN32
48#include <pwd.h> 49#include <pwd.h>
49#include <unistd.h> 50#include <unistd.h>
50#include <sys/types.h> 51#include <sys/types.h>
51#endif 52#endif
52 53
53#if defined(_OS_LINUX_) 54#if defined(_OS_LINUX_)
54#include <shadow.h> 55#include <shadow.h>
55#endif 56#endif
56 57
57#include "launcherglobal.h" 58#include "launcherglobal.h"
58 59
59//#define INSECURE 60//#define INSECURE
60 61
61const int block_size = 51200; 62const int block_size = 51200;
62 63
63QCopBridge::QCopBridge( Q_UINT16 port, QObject *parent, 64QCopBridge::QCopBridge( Q_UINT16 port, QObject *parent,
64 const char* name ) 65 const char* name )
65 : QServerSocket( port, 1, parent, name ), 66 : QServerSocket( port, 1, parent, name ),
66 desktopChannel( 0 ), 67 desktopChannel( 0 ),
67 cardChannel( 0 ) 68 cardChannel( 0 )
68{ 69{
69 if ( !ok() ) 70 if ( !ok() )
70 qWarning( "Failed to bind to port %d", port ); 71 qWarning( "Failed to bind to port %d", port );
71 else { 72 else {
72#ifndef QT_NO_COP 73#ifndef QT_NO_COP
73 desktopChannel = new QCopChannel( "QPE/Desktop", this ); 74 desktopChannel = new QCopChannel( "QPE/Desktop", this );
74 connect( desktopChannel, SIGNAL(received(const QCString &, const QByteArray &)), 75 connect( desktopChannel, SIGNAL(received(const QCString &, const QByteArray &)),
75 this, SLOT(desktopMessage( const QCString &, const QByteArray &)) ); 76 this, SLOT(desktopMessage( const QCString &, const QByteArray &)) );
76 cardChannel = new QCopChannel( "QPE/Card", this ); 77 cardChannel = new QCopChannel( "QPE/Card", this );
77 connect( cardChannel, SIGNAL(received(const QCString &, const QByteArray &)), 78 connect( cardChannel, SIGNAL(received(const QCString &, const QByteArray &)),
78 this, SLOT(desktopMessage( const QCString &, const QByteArray &)) ); 79 this, SLOT(desktopMessage( const QCString &, const QByteArray &)) );
79#endif 80#endif
80 } 81 }
81 sendSync = FALSE; 82 sendSync = FALSE;
82 openConnections.setAutoDelete( TRUE ); 83 openConnections.setAutoDelete( TRUE );
84 authorizeConnections();
83} 85}
84 86
85QCopBridge::~QCopBridge() 87QCopBridge::~QCopBridge()
86{ 88{
87#ifndef QT_NO_COP 89#ifndef QT_NO_COP
88 delete desktopChannel; 90 delete desktopChannel;
89#endif 91#endif
90} 92}
91 93
92void QCopBridge::authorizeConnections() 94void QCopBridge::authorizeConnections()
93{ 95{
96 Config cfg("Security");
97 cfg.setGroup("SyncMode");
98 m_mode = Mode(cfg.readNumEntry("Mode", Sharp ));
94 QListIterator<QCopBridgePI> it(openConnections); 99 QListIterator<QCopBridgePI> it(openConnections);
95 while ( it.current() ) { 100 while ( it.current() ) {
96 if ( !it.current()->verifyAuthorised() ) { 101 if ( !it.current()->verifyAuthorised() ) {
97 disconnect ( it.current(), SIGNAL( connectionClosed( QCopBridgePI *) ), this, SLOT( closed( QCopBridgePI *) ) ); 102 disconnect ( it.current(), SIGNAL( connectionClosed( QCopBridgePI *) ), this, SLOT( closed( QCopBridgePI *) ) );
98 openConnections.removeRef( it.current() ); 103 openConnections.removeRef( it.current() );
99 } else 104 } else
100 ++it; 105 ++it;
101 } 106 }
102} 107}
103 108
104void QCopBridge::newConnection( int socket ) 109void QCopBridge::newConnection( int socket )
105{ 110{
106 QCopBridgePI *pi = new QCopBridgePI( socket, this ); 111 QCopBridgePI *pi = new QCopBridgePI( socket, this );
107 openConnections.append( pi ); 112 openConnections.append( pi );
108 connect ( pi, SIGNAL( connectionClosed( QCopBridgePI *) ), this, SLOT( closed( QCopBridgePI *) ) ); 113 connect ( pi, SIGNAL( connectionClosed( QCopBridgePI *) ), this, SLOT( closed( QCopBridgePI *) ) );
109 114
110 /* ### libqtopia merge FIXME */ 115 /* ### libqtopia merge FIXME */
111#if 0 116#if 0
112 QPEApplication::setTempScreenSaverMode( QPEApplication::DisableSuspend ); 117 QPEApplication::setTempScreenSaverMode( QPEApplication::DisableSuspend );
113#endif 118#endif
114#ifndef QT_NO_COP 119#ifndef QT_NO_COP
115 QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::DisableSuspend; 120 QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::DisableSuspend;
116#endif 121#endif
117 122
118 if ( sendSync ) { 123 if ( sendSync ) {
119 pi ->startSync(); 124 pi ->startSync();
120 sendSync = FALSE; 125 sendSync = FALSE;
121 } 126 }
122} 127}
123 128
124void QCopBridge::closed( QCopBridgePI *pi ) 129void QCopBridge::closed( QCopBridgePI *pi )
125{ 130{
126 emit connectionClosed( pi->peerAddress() ); 131 emit connectionClosed( pi->peerAddress() );
127 openConnections.removeRef( pi ); 132 openConnections.removeRef( pi );
128 if ( openConnections.count() == 0 ) { 133 if ( openConnections.count() == 0 ) {
129 /* ### FIXME libqtopia merge */ 134 /* ### FIXME libqtopia merge */
130#if 0 135#if 0
131 QPEApplication::setTempScreenSaverMode( QPEApplication::Enable ); 136 QPEApplication::setTempScreenSaverMode( QPEApplication::Enable );
132#endif 137#endif
133#ifndef QT_NO_COP 138#ifndef QT_NO_COP
134 QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; 139 QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable;
135#endif 140#endif
136 } 141 }
137} 142}
138 143
139void QCopBridge::closeOpenConnections() 144void QCopBridge::closeOpenConnections()
140{ 145{
141 QCopBridgePI *pi; 146 QCopBridgePI *pi;
142 for ( pi = openConnections.first(); pi != 0; pi = openConnections.next() ) 147 for ( pi = openConnections.first(); pi != 0; pi = openConnections.next() )
143 pi->close(); 148 pi->close();
144} 149}
145 150
146 151
147void QCopBridge::desktopMessage( const QCString &command, const QByteArray &data ) 152void QCopBridge::desktopMessage( const QCString &command, const QByteArray &data )
148{ 153{
149 if ( command == "startSync()" ) { 154 if ( command == "startSync()" ) {
150 // we need to buffer it a bit 155 // we need to buffer it a bit
151 sendSync = TRUE; 156 sendSync = TRUE;
152 startTimer( 20000 ); 157 startTimer( 20000 );
153 } 158 }
154 159
160 if ( m_mode & Qtopia1_7 ) {
161 // send the command to all open connections
162 QCopBridgePI *pi;
163 for ( pi = openConnections.first(); pi != 0; pi = openConnections.next() ) {
164 pi->sendDesktopMessage( command, data );
165 }
166 }
167 if ( m_mode & Sharp )
168 sendDesktopMessageOld( command, data );
169}
170
171#ifndef OPIE_NO_OLD_SYNC_CODE
172/*
173 * Old compat mode
174 */
175void QCopBridge::sendDesktopMessageOld( const QCString& command, const QByteArray& args) {
176 command.stripWhiteSpace();
177
178 int paren = command.find( "(" );
179 if ( paren <= 0 ) {
180 qDebug("DesktopMessage: bad qcop syntax");
181 return;
182 }
183
184 QString params = command.mid( paren + 1 );
185 if ( params[params.length()-1] != ')' ) {
186 qDebug("DesktopMessage: bad qcop syntax");
187 return;
188 }
189
190 params.truncate( params.length()-1 );
191
192 QStringList paramList = QStringList::split( ",", params );
193 QString data;
194 if ( paramList.count() ) {
195 QDataStream stream( args, IO_ReadOnly );
196 for ( QStringList::Iterator it = paramList.begin(); it != paramList.end(); ++it ) {
197 QString str;
198 if ( *it == "QString" ) {
199 stream >> str;
200 } else if ( *it == "QCString" ) {
201 QCString cstr;
202 stream >> cstr;
203 str = QString::fromLocal8Bit( cstr );
204 } else if ( *it == "int" ) {
205 int i;
206 stream >> i;
207 str = QString::number( i );
208 } else if ( *it == "bool" ) {
209 int i;
210 stream >> i;
211 str = QString::number( i );
212 } else {
213 qDebug(" cannot route the argument type %s throught the qcop bridge", (*it).latin1() );
214 return;
215 }
216 QString estr;
217 for (int i=0; i<(int)str.length(); i++) {
218 QChar ch = str[i];
219 if ( ch.row() )
220 goto quick;
221 switch (ch.cell()) {
222 case '&':
223 estr.append( "&amp;" );
224 break;
225 case ' ':
226 estr.append( "&0x20;" );
227 break;
228 case '\n':
229 estr.append( "&0x0d;" );
230 break;
231 case '\r':
232 estr.append( "&0x0a;" );
233 break;
234 default: quick:
235 estr.append(ch);
236 }
237 }
238 data += " " + estr;
239 }
240 }
241 QString sendCommand = QString(command.data()) + data;
242
243
155 // send the command to all open connections 244 // send the command to all open connections
156 QCopBridgePI *pi; 245 QCopBridgePI *pi;
157 for ( pi = openConnections.first(); pi != 0; pi = openConnections.next() ) { 246 for ( pi = openConnections.first(); pi != 0; pi = openConnections.next() )
158 pi->sendDesktopMessage( command, data ); 247 pi->sendDesktopMessage( sendCommand );
159 } 248
160} 249}
250#endif
251
161 252
162void QCopBridge::timerEvent( QTimerEvent * ) 253void QCopBridge::timerEvent( QTimerEvent * )
163{ 254{
164 sendSync = FALSE; 255 sendSync = FALSE;
165 killTimers(); 256 killTimers();
166} 257}
167 258
168 259
169QCopBridgePI::QCopBridgePI( int socket, QObject *parent, const char* name ) 260QCopBridgePI::QCopBridgePI( int socket, QObject *parent, const char* name )
170 : QSocket( parent, name ) 261 : QSocket( parent, name )
171{ 262{
172 setSocket( socket ); 263 setSocket( socket );
173 264
174 peerport = peerPort(); 265 peerport = peerPort();
175 peeraddress = peerAddress(); 266 peeraddress = peerAddress();
176 267
177#ifndef INSECURE 268#ifndef INSECURE
178 if ( !SyncAuthentication::isAuthorized(peeraddress) ) { 269 if ( !SyncAuthentication::isAuthorized(peeraddress) ) {
179 state = Forbidden; 270 state = Forbidden;
180 close(); 271 close();
181 } else 272 } else
182#endif 273#endif
183 { 274 {
184 state = Connected; 275 state = Connected;
185 connect( this, SIGNAL( readyRead() ), SLOT( read() ) ); 276 connect( this, SIGNAL( readyRead() ), SLOT( read() ) );
186 QString intro="220 Qtopia "; 277 QString intro="220 Qtopia ";
187 intro += QPE_VERSION; intro += ";"; 278 intro += QPE_VERSION; intro += ";";
188 intro += "challenge="; intro += SyncAuthentication::serverId(); intro += ";"; // No tr 279 intro += "challenge="; intro += SyncAuthentication::serverId(); intro += ";"; // No tr
189 intro += "loginname="; intro += SyncAuthentication::loginName(); intro += ";"; 280 intro += "loginname="; intro += SyncAuthentication::loginName(); intro += ";";
190 intro += "displayname="; intro += SyncAuthentication::ownerName(); intro += ";"; 281 intro += "displayname="; intro += SyncAuthentication::ownerName(); intro += ";";
191 send( intro ); 282 send( intro );
192 state = Wait_USER; 283 state = Wait_USER;
193 } 284 }
194 sendSync = FALSE; 285 sendSync = FALSE;
195 connect( this, SIGNAL( connectionClosed() ), SLOT( myConnectionClosed() ) ); 286 connect( this, SIGNAL( connectionClosed() ), SLOT( myConnectionClosed() ) );
196 287
197 // idle timer to close connections when not used anymore 288 // idle timer to close connections when not used anymore
198 timer = new QTimer(this); 289 timer = new QTimer(this);
199 connect( timer, SIGNAL(timeout()), this, SLOT(myConnectionClosed()) ); 290 connect( timer, SIGNAL(timeout()), this, SLOT(myConnectionClosed()) );
200 timer->start( 300000, TRUE ); 291 timer->start( 300000, TRUE );
201} 292}
202 293
203 294
204QCopBridgePI::~QCopBridgePI() 295QCopBridgePI::~QCopBridgePI()
205{ 296{
206} 297}
207 298
208bool QCopBridgePI::verifyAuthorised() 299bool QCopBridgePI::verifyAuthorised()
209{ 300{
210 if ( !SyncAuthentication::isAuthorized(peerAddress()) ) { 301 if ( !SyncAuthentication::isAuthorized(peerAddress()) ) {
211 state = Forbidden; 302 state = Forbidden;
212 return FALSE; 303 return FALSE;
213 } 304 }
214 return TRUE; 305 return TRUE;
215} 306}
216 307
217void QCopBridgePI::myConnectionClosed() 308void QCopBridgePI::myConnectionClosed()
218{ 309{
219 emit connectionClosed( this ); 310 emit connectionClosed( this );
220} 311}
221 312
222void QCopBridgePI::sendDesktopMessage( const QString &msg ) 313void QCopBridgePI::sendDesktopMessage( const QString &msg )
223{ 314{
224 QString str = "CALL QPE/Desktop " + msg; // No tr 315 QString str = "CALL QPE/Desktop " + msg; // No tr
225 send ( str ); 316 send ( str );
226} 317}
227 318
228void QCopBridgePI::sendDesktopMessage( const QCString &msg, const QByteArray& data ) 319void QCopBridgePI::sendDesktopMessage( const QCString &msg, const QByteArray& data )
229{ 320{
230 if ( !isOpen() ) // eg. Forbidden 321 if ( !isOpen() ) // eg. Forbidden
231 return; 322 return;
323
232 const char hdr[]="CALLB QPE/Desktop "; 324 const char hdr[]="CALLB QPE/Desktop ";
233 writeBlock(hdr,sizeof(hdr)-1); 325 writeBlock(hdr,sizeof(hdr)-1);
234 writeBlock(msg,msg.length()); 326 writeBlock(msg,msg.length());
235 writeBlock(" ",1); 327 writeBlock(" ",1);
236 QByteArray b64 = Opie::Global::encodeBase64(data); 328 QByteArray b64 = Opie::Global::encodeBase64(data);
237 writeBlock(b64.data(),b64.size()); 329 writeBlock(b64.data(),b64.size());
238 writeBlock("\r\n",2); 330 writeBlock("\r\n",2);
331
239} 332}
240 333
241 334
242void QCopBridgePI::send( const QString& msg ) 335void QCopBridgePI::send( const QString& msg )
243{ 336{
244 if ( !isOpen() ) // eg. Forbidden 337 if ( !isOpen() ) // eg. Forbidden
245 return; 338 return;
246 QTextStream os( this ); 339 QTextStream os( this );
247 os << msg << endl; 340 os << msg << endl;
248 //qDebug( "sending qcop message: %s", msg.latin1() ); 341 //qDebug( "sending qcop message: %s", msg.latin1() );
249} 342}
250 343
251void QCopBridgePI::read() 344void QCopBridgePI::read()
252{ 345{
253 while ( canReadLine() ) { 346 while ( canReadLine() ) {
254 timer->start( 300000, TRUE ); 347 timer->start( 300000, TRUE );
255 process( readLine().stripWhiteSpace() ); 348 process( readLine().stripWhiteSpace() );
256 } 349 }
257} 350}
258 351
259void QCopBridgePI::process( const QString& message ) 352void QCopBridgePI::process( const QString& message )
260{ 353{
261 //qDebug( "Command: %s", message.latin1() ); 354 //qDebug( "Command: %s", message.latin1() );
262 355
263 // split message using "," as separator 356 // split message using "," as separator
264 QStringList msg = QStringList::split( " ", message ); 357 QStringList msg = QStringList::split( " ", message );
265 if ( msg.isEmpty() ) return; 358 if ( msg.isEmpty() ) return;
266 359
267 // command token 360 // command token
268 QString cmd = msg[0].upper(); 361 QString cmd = msg[0].upper();
269 362
270 // argument token 363 // argument token
271 QString arg; 364 QString arg;
272 if ( msg.count() >= 2 ) 365 if ( msg.count() >= 2 )
273 arg = msg[1]; 366 arg = msg[1];
274 367
275 // we always respond to QUIT, regardless of state 368 // we always respond to QUIT, regardless of state
276 if ( cmd == "QUIT" ) { 369 if ( cmd == "QUIT" ) {
277 send( "211 Have a nice day!" ); // No tr 370 send( "211 Have a nice day!" ); // No tr
278 close(); 371 close();
279 return; 372 return;
280 } 373 }
281 374
282 // connected to client 375 // connected to client
283 if ( Connected == state ) 376 if ( Connected == state )
284 return; 377 return;
285 378
286 // waiting for user name 379 // waiting for user name
287 if ( Wait_USER == state ) { 380 if ( Wait_USER == state ) {
288 381
289 if ( cmd != "USER" || msg.count() < 2 || !SyncAuthentication::checkUser( arg ) ) { 382 if ( cmd != "USER" || msg.count() < 2 || !SyncAuthentication::checkUser( arg ) ) {
290 send( "530 Please login with USER and PASS" ); // No tr 383 send( "530 Please login with USER and PASS" ); // No tr
291 return; 384 return;
292 } 385 }
293 send( "331 User name ok, need password" ); // No tr 386 send( "331 User name ok, need password" ); // No tr
294 state = Wait_PASS; 387 state = Wait_PASS;
295 return; 388 return;
296 } 389 }
297 390
298 // waiting for password 391 // waiting for password
299 if ( Wait_PASS == state ) { 392 if ( Wait_PASS == state ) {
300 393
301 if ( cmd != "PASS" || !SyncAuthentication::checkPassword( arg ) ) { 394 if ( cmd != "PASS" || !SyncAuthentication::checkPassword( arg ) ) {
302 send( "530 Please login with USER and PASS" ); // No tr 395 send( "530 Please login with USER and PASS" ); // No tr
303 return; 396 return;
304 } 397 }
305 send( "230 User logged in, proceed" ); // No tr 398 send( "230 User logged in, proceed" ); // No tr
306 state = Ready; 399 state = Ready;
307 if ( sendSync ) { 400 if ( sendSync ) {
308 sendDesktopMessage( "startSync()" ); 401 sendDesktopMessage( "startSync()" );
309 sendSync = FALSE; 402 sendSync = FALSE;
310 } 403 }
311 return; 404 return;
312 } 405 }
313 406
314 // noop (NOOP) 407 // noop (NOOP)
315 else if ( cmd == "NOOP" ) { 408 else if ( cmd == "NOOP" ) {
316 send( "200 Command okay" ); // No tr 409 send( "200 Command okay" ); // No tr
317 } 410 }
318 411
319 // call (CALL) 412 // call (CALL)
320 else if ( cmd == "CALL" ) { 413 else if ( cmd == "CALL" ) {
321 414
322 // example: call QPE/System execute(QString) addressbook 415 // example: call QPE/System execute(QString) addressbook
323 416
324 if ( msg.count() < 3 ) { 417 if ( msg.count() < 3 ) {
325 send( "500 Syntax error, command unrecognized" ); // No tr 418 send( "500 Syntax error, command unrecognized" ); // No tr
326 } 419 }
327 else { 420 else {
328 421
329 QString channel = msg[1]; 422 QString channel = msg[1];
330 QString command = msg[2]; 423 QString command = msg[2];
331 424
332 command.stripWhiteSpace(); 425 command.stripWhiteSpace();
333 426
334 int paren = command.find( "(" ); 427 int paren = command.find( "(" );
335 if ( paren <= 0 ) { 428 if ( paren <= 0 ) {
336 send( "500 Syntax error, command unrecognized" ); // No tr 429 send( "500 Syntax error, command unrecognized" ); // No tr
337 return; 430 return;
338 } 431 }
339 432
340 QString params = command.mid( paren + 1 ); 433 QString params = command.mid( paren + 1 );
341 if ( params[(int)params.length()-1] != ')' ) { 434 if ( params[(int)params.length()-1] != ')' ) {
342 send( "500 Syntax error, command unrecognized" ); // No tr 435 send( "500 Syntax error, command unrecognized" ); // No tr
343 return; 436 return;
344 } 437 }
345 438
346 params.truncate( params.length()-1 ); 439 params.truncate( params.length()-1 );
347 QByteArray buffer; 440 QByteArray buffer;
348 QDataStream ds( buffer, IO_WriteOnly ); 441 QDataStream ds( buffer, IO_WriteOnly );
349 442
350 int msgId = 3; 443 int msgId = 3;
351 444
352 QStringList paramList = QStringList::split( ",", params ); 445 QStringList paramList = QStringList::split( ",", params );
353 if ( paramList.count() > msg.count() - 3 ) { 446 if ( paramList.count() > msg.count() - 3 ) {
354 send( "500 Syntax error, command unrecognized" ); // No tr 447 send( "500 Syntax error, command unrecognized" ); // No tr
355 return; 448 return;
356 } 449 }
357 450
358 for ( QStringList::Iterator it = paramList.begin(); it != paramList.end(); ++it ) { 451 for ( QStringList::Iterator it = paramList.begin(); it != paramList.end(); ++it ) {
359 452
360 QString arg = msg[msgId]; 453 QString arg = msg[msgId];
361 arg.replace( QRegExp("&0x20;"), " " ); 454 arg.replace( QRegExp("&0x20;"), " " );
362 arg.replace( QRegExp("&amp;"), "&" ); 455 arg.replace( QRegExp("&amp;"), "&" );
363 arg.replace( QRegExp("&0x0d;"), "\n" ); 456 arg.replace( QRegExp("&0x0d;"), "\n" );
364 arg.replace( QRegExp("&0x0a;"), "\r" ); 457 arg.replace( QRegExp("&0x0a;"), "\r" );
365 if ( *it == "QString" ) 458 if ( *it == "QString" )
366 ds << arg; 459 ds << arg;
367 else if ( *it == "QCString" ) 460 else if ( *it == "QCString" )
368 ds << arg.local8Bit(); 461 ds << arg.local8Bit();
369 else if ( *it == "int" ) 462 else if ( *it == "int" )
370 ds << arg.toInt(); 463 ds << arg.toInt();
371 else if ( *it == "bool" ) 464 else if ( *it == "bool" )
372 ds << arg.toInt(); 465 ds << arg.toInt();
373 else { 466 else {
374 send( "500 Syntax error, command unrecognized" ); // No tr 467 send( "500 Syntax error, command unrecognized" ); // No tr
375 return; 468 return;
376 } 469 }
377 msgId++; 470 msgId++;
378 } 471 }
379 472
380#ifndef QT_NO_COP 473#ifndef QT_NO_COP
381 if ( !QCopChannel::isRegistered( channel.latin1() ) ) { 474 if ( !QCopChannel::isRegistered( channel.latin1() ) ) {
382 // send message back about it 475 // send message back about it
383 QString answer = "599 ChannelNotRegistered " + channel; 476 QString answer = "599 ChannelNotRegistered " + channel;
384 send( answer ); 477 send( answer );
385 return; 478 return;
386 } 479 }
387#endif 480#endif
388 481
389#ifndef QT_NO_COP 482#ifndef QT_NO_COP
390 if ( paramList.count() ) 483 if ( paramList.count() )
391 QCopChannel::send( channel.latin1(), command.latin1(), buffer ); 484 QCopChannel::send( channel.latin1(), command.latin1(), buffer );
392 else 485 else
393 QCopChannel::send( channel.latin1(), command.latin1() ); 486 QCopChannel::send( channel.latin1(), command.latin1() );
394 487
395 send( "200 Command okay" ); // No tr 488 send( "200 Command okay" ); // No tr
396#endif 489#endif
397 } 490 }
398 } 491 }
399 // not implemented 492 // not implemented
400 else 493 else
401 send( "502 Command not implemented" ); // No tr 494 send( "502 Command not implemented" ); // No tr
402} 495}
403 496
404 497
diff --git a/core/launcher/qcopbridge.h b/core/launcher/qcopbridge.h
index bae3f88..9483d9d 100644
--- a/core/launcher/qcopbridge.h
+++ b/core/launcher/qcopbridge.h
@@ -1,97 +1,100 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. 2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of the Qtopia Environment. 4** This file is part of the Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20#ifndef __qcopbridge_h__ 20#ifndef __qcopbridge_h__
21#define __qcopbridge_h__ 21#define __qcopbridge_h__
22 22
23#include <qtopia/global.h> 23#include <qtopia/global.h>
24#include <qserversocket.h> 24#include <qserversocket.h>
25#include <qsocket.h> 25#include <qsocket.h>
26#include <qdir.h> 26#include <qdir.h>
27#include <qfile.h> 27#include <qfile.h>
28#include <qbuffer.h> 28#include <qbuffer.h>
29 29
30class QFileInfo; 30class QFileInfo;
31class QCopBridgePI; 31class QCopBridgePI;
32class QCopChannel; 32class QCopChannel;
33class QTimer; 33class QTimer;
34 34
35class QCopBridge : public QServerSocket 35class QCopBridge : public QServerSocket
36{ 36{
37 Q_OBJECT 37 Q_OBJECT
38 38
39public: 39public:
40 enum Mode { Qtopia1_7= 0x01, Sharp = 0x02, Both = Qtopia1_7 | Sharp };
40 QCopBridge( Q_UINT16 port, QObject *parent = 0, const char* name = 0 ); 41 QCopBridge( Q_UINT16 port, QObject *parent = 0, const char* name = 0 );
41 virtual ~QCopBridge(); 42 virtual ~QCopBridge();
42 43
43 void newConnection( int socket ); 44 void newConnection( int socket );
44 void closeOpenConnections(); 45 void closeOpenConnections();
45 void authorizeConnections(); 46 void authorizeConnections();
46 47
47public slots: 48public slots:
48 void closed( QCopBridgePI *pi ); 49 void closed( QCopBridgePI *pi );
49 void desktopMessage( const QCString &call, const QByteArray & ); 50 void desktopMessage( const QCString &call, const QByteArray & );
50 51
51signals: 52signals:
52 void connectionClosed( const QHostAddress & ); 53 void connectionClosed( const QHostAddress & );
53 54
54protected: 55protected:
55 void timerEvent( QTimerEvent * ); 56 void timerEvent( QTimerEvent * );
57 void sendDesktopMessageOld( const QCString&, const QByteArray& );
56 58
57private: 59private:
58 QCopChannel *desktopChannel; 60 QCopChannel *desktopChannel;
59 QCopChannel *cardChannel; 61 QCopChannel *cardChannel;
60 QList<QCopBridgePI> openConnections; 62 QList<QCopBridgePI> openConnections;
61 bool sendSync; 63 bool sendSync;
64 Mode m_mode;
62}; 65};
63 66
64 67
65class QCopBridgePI : public QSocket 68class QCopBridgePI : public QSocket
66{ 69{
67 Q_OBJECT 70 Q_OBJECT
68 71
69 enum State { Connected, Wait_USER, Wait_PASS, Ready, Forbidden }; 72 enum State { Connected, Wait_USER, Wait_PASS, Ready, Forbidden };
70 73
71public: 74public:
72 QCopBridgePI( int socket, QObject *parent = 0, const char* name = 0 ); 75 QCopBridgePI( int socket, QObject *parent = 0, const char* name = 0 );
73 virtual ~QCopBridgePI(); 76 virtual ~QCopBridgePI();
74 77
75 void sendDesktopMessage( const QString &msg ); 78 void sendDesktopMessage( const QString &msg );
76 void sendDesktopMessage( const QCString &msg, const QByteArray& ); 79 void sendDesktopMessage( const QCString &msg, const QByteArray& );
77 void startSync() { sendSync = TRUE; } 80 void startSync() { sendSync = TRUE; }
78 bool verifyAuthorised(); 81 bool verifyAuthorised();
79 82
80signals: 83signals:
81 void connectionClosed( QCopBridgePI *); 84 void connectionClosed( QCopBridgePI *);
82 85
83protected slots: 86protected slots:
84 void read(); 87 void read();
85 void send( const QString& msg ); 88 void send( const QString& msg );
86 void process( const QString& command ); 89 void process( const QString& command );
87 void myConnectionClosed(); 90 void myConnectionClosed();
88 91
89private: 92private:
90 State state; 93 State state;
91 Q_UINT16 peerport; 94 Q_UINT16 peerport;
92 QHostAddress peeraddress; 95 QHostAddress peeraddress;
93 bool sendSync; 96 bool sendSync;
94 QTimer *timer; 97 QTimer *timer;
95}; 98};
96 99
97#endif 100#endif