summaryrefslogtreecommitdiff
path: root/core/launcher/server.cpp
Unidiff
Diffstat (limited to 'core/launcher/server.cpp') (more/less context) (show whitespace changes)
-rw-r--r--core/launcher/server.cpp391
1 files changed, 310 insertions, 81 deletions
diff --git a/core/launcher/server.cpp b/core/launcher/server.cpp
index 3bef36e..524e6dd 100644
--- a/core/launcher/server.cpp
+++ b/core/launcher/server.cpp
@@ -26,24 +26,25 @@
26#include "qcopbridge.h" 26#include "qcopbridge.h"
27#include "irserver.h" 27#include "irserver.h"
28#include "packageslave.h" 28#include "packageslave.h"
29#include "calibrate.h" 29#include "calibrate.h"
30#include "qrsync.h" 30#include "qrsync.h"
31#include "syncdialog.h" 31#include "syncdialog.h"
32#include "shutdownimpl.h" 32#include "shutdownimpl.h"
33#include "applauncher.h" 33#include "applauncher.h"
34#if 0 34#if 0
35#include "suspendmonitor.h" 35#include "suspendmonitor.h"
36#endif 36#endif
37#include "documentlist.h" 37#include "documentlist.h"
38#include "qrr.h"
38 39
39/* OPIE */ 40/* OPIE */
40#include <opie2/odebug.h> 41#include <opie2/odebug.h>
41#include <opie2/odevicebutton.h> 42#include <opie2/odevicebutton.h>
42#include <opie2/odevice.h> 43#include <opie2/odevice.h>
43#include <qtopia/applnk.h> 44#include <qtopia/applnk.h>
44#include <qtopia/private/categories.h> 45#include <qtopia/private/categories.h>
45#include <qtopia/mimetype.h> 46#include <qtopia/mimetype.h>
46#include <qtopia/config.h> 47#include <qtopia/config.h>
47#include <qtopia/resource.h> 48#include <qtopia/resource.h>
48#include <qtopia/version.h> 49#include <qtopia/version.h>
49#include <qtopia/storage.h> 50#include <qtopia/storage.h>
@@ -108,61 +109,73 @@ static Global::Command builtins[] = {
108 /* FIXME defines need to be defined*/ 109 /* FIXME defines need to be defined*/
109#if !defined(OPIE_NO_BUILTIN_CALIBRATE) 110#if !defined(OPIE_NO_BUILTIN_CALIBRATE)
110 { "calibrate", calibrate, 1, 0 }, // No tr 111 { "calibrate", calibrate, 1, 0 }, // No tr
111#endif 112#endif
112#if !defined(OPIE_NO_BUILTIN_SHUTDOWN) 113#if !defined(OPIE_NO_BUILTIN_SHUTDOWN)
113 { "shutdown", Global::shutdown, 1, 0 }, // No tr 114 { "shutdown", Global::shutdown, 1, 0 }, // No tr
114// { "run", run, 1, 0 }, // No tr 115// { "run", run, 1, 0 }, // No tr
115#endif 116#endif
116 117
117 { 0, calibrate, 0, 0 }, 118 { 0, calibrate, 0, 0 },
118}; 119};
119 120
121#ifdef QPE_HAVE_DIRECT_ACCESS
122extern void readyDirectAccess(QString cardInfo, QString installLocations);
123extern const char *directAccessQueueFile();
124#endif
120 125
121//--------------------------------------------------------------------------- 126//---------------------------------------------------------------------------
122 127
123 128
124//=========================================================================== 129//===========================================================================
125 130
126Server::Server() : 131Server::Server() :
127 QWidget( 0, 0, WStyle_Tool | WStyle_Customize ), 132 QWidget( 0, 0, WStyle_Tool | WStyle_Customize ),
128 qcopBridge( 0 ), 133 qcopBridge( 0 ),
129 transferServer( 0 ), 134 transferServer( 0 ),
130 packageHandler( 0 ), 135 packageHandler( 0 ),
131 syncDialog( 0 ) 136 syncDialog( 0 )
132{ 137{
133 Global::setBuiltinCommands(builtins); 138 Global::setBuiltinCommands(builtins);
134 139
135 tid_xfer = 0; 140 tid_xfer = 0;
136 /* ### FIXME ### */ 141 /* ### FIXME ### */
137/* tid_today = startTimer(3600*2*1000);*/ 142/* tid_today = startTimer(3600*2*1000);*/
138 last_today_show = QDate::currentDate(); 143 last_today_show = QDate::currentDate();
139 144
145#warning FIXME support TempScreenSaverMode
140#if 0 146#if 0
141 tsmMonitor = new TempScreenSaverMode(); 147 tsmMonitor = new TempScreenSaverMode();
142 connect( tsmMonitor, SIGNAL(forceSuspend()), qApp, SIGNAL(power()) ); 148 connect( tsmMonitor, SIGNAL(forceSuspend()), qApp, SIGNAL(power()) );
143#endif 149#endif
144 150
145 serverGui = new Launcher; 151 serverGui = new Launcher;
146 serverGui->createGUI(); 152 serverGui->createGUI();
147 153
148 docList = new DocumentList( serverGui ); 154 docList = new DocumentList( serverGui );
149 appLauncher = new AppLauncher(this); 155 appLauncher = new AppLauncher(this);
150 connect(appLauncher, SIGNAL(launched(int,const QString&)), this, SLOT(applicationLaunched(int,const QString&)) ); 156 connect(appLauncher, SIGNAL(launched(int,const QString&)), this, SLOT(applicationLaunched(int,const QString&)) );
151 connect(appLauncher, SIGNAL(terminated(int,const QString&)), this, SLOT(applicationTerminated(int,const QString&)) ); 157 connect(appLauncher, SIGNAL(terminated(int,const QString&)), this, SLOT(applicationTerminated(int,const QString&)) );
152 connect(appLauncher, SIGNAL(connected(const QString&)), this, SLOT(applicationConnected(const QString&)) ); 158 connect(appLauncher, SIGNAL(connected(const QString&)), this, SLOT(applicationConnected(const QString&)) );
153 159
154 storage = new StorageInfo( this ); 160 storage = new StorageInfo( this );
155 connect( storage, SIGNAL(disksChanged()), this, SLOT(storageChanged()) ); 161 connect( storage, SIGNAL(disksChanged()), this, SLOT(storageChanged()) );
156 162
163
164#ifdef QPE_HAVE_DIRECT_ACCESS
165 QCopChannel *desktopChannel = new QCopChannel( "QPE/Desktop", this );
166 connect( desktopChannel, SIGNAL(received( const QCString &, const QByteArray & )),
167 this, SLOT(desktopMessage( const QCString &, const QByteArray & )) );
168#endif
169
157 // start services 170 // start services
158 startTransferServer(); 171 startTransferServer();
159 (void) new IrServer( this ); 172 (void) new IrServer( this );
160 173
161 packageHandler = new PackageHandler( this ); 174 packageHandler = new PackageHandler( this );
162 connect(qApp, SIGNAL(activate(const Opie::Core::ODeviceButton*,bool)), 175 connect(qApp, SIGNAL(activate(const Opie::Core::ODeviceButton*,bool)),
163 this,SLOT(activate(const Opie::Core::ODeviceButton*,bool))); 176 this,SLOT(activate(const Opie::Core::ODeviceButton*,bool)));
164 177
165 setGeometry( -10, -10, 9, 9 ); 178 setGeometry( -10, -10, 9, 9 );
166 179
167 QCopChannel *channel = new QCopChannel("QPE/System", this); 180 QCopChannel *channel = new QCopChannel("QPE/System", this);
168 connect(channel, SIGNAL(received(const QCString&,const QByteArray&)), 181 connect(channel, SIGNAL(received(const QCString&,const QByteArray&)),
@@ -188,24 +201,49 @@ Server::~Server()
188{ 201{
189 serverGui->destroyGUI(); 202 serverGui->destroyGUI();
190 delete docList; 203 delete docList;
191 delete qcopBridge; 204 delete qcopBridge;
192 delete transferServer; 205 delete transferServer;
193 delete serverGui; 206 delete serverGui;
194#if 0 207#if 0
195 delete tsmMonitor; 208 delete tsmMonitor;
196#endif 209#endif
197} 210}
198 211
199 212
213static bool hasVisibleWindow(const QString& clientname, bool partial)
214{
215#ifdef QWS
216 const QList<QWSWindow> &list = qwsServer->clientWindows();
217 QWSWindow* w;
218 for (QListIterator<QWSWindow> it(list); (w=it.current()); ++it) {
219 if ( w->client()->identity() == clientname ) {
220 if ( partial && !w->isFullyObscured() )
221 return TRUE;
222 if ( !partial && !w->isFullyObscured() && !w->isPartiallyObscured() ) {
223# if QT_VERSION < 0x030000
224 QRect mwr = qt_screen->mapToDevice(qt_maxWindowRect,
225 QSize(qt_screen->width(),qt_screen->height()) );
226# else
227 QRect mwr = qt_maxWindowRect;
228# endif
229 if ( mwr.contains(w->requested().boundingRect()) )
230 return TRUE;
231 }
232 }
233 }
234#endif
235 return FALSE;
236}
237
200void Server::activate(const ODeviceButton* button, bool held) 238void Server::activate(const ODeviceButton* button, bool held)
201{ 239{
202 Global::terminateBuiltin("calibrate"); // No tr 240 Global::terminateBuiltin("calibrate"); // No tr
203 OQCopMessage om; 241 OQCopMessage om;
204 if ( held ) { 242 if ( held ) {
205 om = button->heldAction(); 243 om = button->heldAction();
206 } else { 244 } else {
207 om = button->pressedAction(); 245 om = button->pressedAction();
208 } 246 }
209 247
210 if ( om.channel() != "ignore" ) 248 if ( om.channel() != "ignore" )
211 om.send(); 249 om.send();
@@ -283,112 +321,90 @@ bool Server::setKeyboardLayout( const QString &kb )
283#endif 321#endif
284 322
285void Server::systemMsg(const QCString &msg, const QByteArray &data) 323void Server::systemMsg(const QCString &msg, const QByteArray &data)
286{ 324{
287 QDataStream stream( data, IO_ReadOnly ); 325 QDataStream stream( data, IO_ReadOnly );
288 326
289 if ( msg == "securityChanged()" ) { 327 if ( msg == "securityChanged()" ) {
290 if ( transferServer ) 328 if ( transferServer )
291 transferServer->authorizeConnections(); 329 transferServer->authorizeConnections();
292 330
293 if ( qcopBridge ) 331 if ( qcopBridge )
294 qcopBridge->authorizeConnections(); 332 qcopBridge->authorizeConnections();
295 } else 333#warning FIXME support TempScreenSaverMode
296
297#if 0 334#if 0
298 /* ### FIXME support TempScreenSaverMode */ 335 } else if ( msg == "setTempScreenSaverMode(int,int)" ) {
299 if ( msg == "setTempScreenSaverMode(int,int)" ) {
300 int mode, pid; 336 int mode, pid;
301 stream >> mode >> pid; 337 stream >> mode >> pid;
302 tsmMonitor->setTempMode(mode, pid); 338 tsmMonitor->setTempMode(mode, pid);
303 } else
304#endif 339#endif
305 340 } else if ( msg == "linkChanged(QString)" ) {
306 if ( msg == "linkChanged(QString)" ) {
307 QString link; 341 QString link;
308 stream >> link; 342 stream >> link;
309 odebug << "desktop.cpp systemMsg -> linkchanged( " << link << " )" << oendl; 343 odebug << "desktop.cpp systemMsg -> linkchanged( " << link << " )" << oendl;
310 docList->linkChanged(link); 344 docList->linkChanged(link);
311 } else 345 } else if ( msg == "serviceChanged(QString)" ) {
312
313 if ( msg == "serviceChanged(QString)" ) {
314 MimeType::updateApplications(); 346 MimeType::updateApplications();
315 } else 347 } else if ( msg == "mkdir(QString)" ) {
316
317 if ( msg == "mkdir(QString)" ) {
318 QString dir; 348 QString dir;
319 stream >> dir; 349 stream >> dir;
320 if ( !dir.isEmpty() ) 350 if ( !dir.isEmpty() )
321 mkdir( dir ); 351 mkdir( dir );
322 } else 352 } else if ( msg == "rdiffGenSig(QString,QString)" ) {
323
324 if ( msg == "rdiffGenSig(QString,QString)" ) {
325 QString baseFile, sigFile; 353 QString baseFile, sigFile;
326 stream >> baseFile >> sigFile; 354 stream >> baseFile >> sigFile;
327 QRsync::generateSignature( baseFile, sigFile ); 355 QRsync::generateSignature( baseFile, sigFile );
328 } else 356 } else if ( msg == "rdiffGenDiff(QString,QString,QString)" ) {
329
330 if ( msg == "rdiffGenDiff(QString,QString,QString)" ) {
331 QString baseFile, sigFile, deltaFile; 357 QString baseFile, sigFile, deltaFile;
332 stream >> baseFile >> sigFile >> deltaFile; 358 stream >> baseFile >> sigFile >> deltaFile;
333 QRsync::generateDiff( baseFile, sigFile, deltaFile ); 359 QRsync::generateDiff( baseFile, sigFile, deltaFile );
334 } else 360 } else if ( msg == "rdiffApplyPatch(QString,QString)" ) {
335
336 if ( msg == "rdiffApplyPatch(QString,QString)" ) {
337 QString baseFile, deltaFile; 361 QString baseFile, deltaFile;
338 stream >> baseFile >> deltaFile; 362 stream >> baseFile >> deltaFile;
339 if ( !QFile::exists( baseFile ) ) { 363 if ( !QFile::exists( baseFile ) ) {
340 QFile f( baseFile ); 364 QFile f( baseFile );
341 f.open( IO_WriteOnly ); 365 f.open( IO_WriteOnly );
342 f.close(); 366 f.close();
343 } 367 }
344 QRsync::applyDiff( baseFile, deltaFile ); 368 QRsync::applyDiff( baseFile, deltaFile );
345#ifndef QT_NO_COP 369#ifndef QT_NO_COP
346 QCopEnvelope e( "QPE/Desktop", "patchApplied(QString)" ); 370 QCopEnvelope e( "QPE/Desktop", "patchApplied(QString)" );
347 e << baseFile; 371 e << baseFile;
348#endif 372#endif
349 } else 373 } else if ( msg == "rdiffCleanup()" ) {
350
351 if ( msg == "rdiffCleanup()" ) {
352 mkdir( "/tmp/rdiff" ); 374 mkdir( "/tmp/rdiff" );
353 QDir dir; 375 QDir dir;
354 dir.setPath( "/tmp/rdiff" ); 376 dir.setPath( "/tmp/rdiff" );
355 QStringList entries = dir.entryList(); 377 QStringList entries = dir.entryList();
356 for ( QStringList::Iterator it = entries.begin(); it != entries.end(); ++it ) 378 for ( QStringList::Iterator it = entries.begin(); it != entries.end(); ++it )
357 dir.remove( *it ); 379 dir.remove( *it );
358 } else 380 } else if ( msg == "sendHandshakeInfo()" ) {
359
360 if ( msg == "sendHandshakeInfo()" ) {
361 QString home = getenv( "HOME" ); 381 QString home = getenv( "HOME" );
362#ifndef QT_NO_COP 382#ifndef QT_NO_COP
363 QCopEnvelope e( "QPE/Desktop", "handshakeInfo(QString,bool)" ); 383 QCopEnvelope e( "QPE/Desktop", "handshakeInfo(QString,bool)" );
364 e << home; 384 e << home;
365 int locked = (int) ServerApplication::screenLocked(); 385 int locked = (int) ServerApplication::screenLocked();
366 e << locked; 386 e << locked;
367#endif 387#endif
368 } else 388 } else if ( msg == "sendVersionInfo()" ) {
369
370 /* 389 /*
371 * QtopiaDesktop relies on the major number 390 * QtopiaDesktop relies on the major number
372 * to start with 1. We're at 0.9 391 * to start with 1.
373 * so wee need to fake at least 1.4 to be able 392 * we need to fake at least 1.4 to be able
374 * to sync with QtopiaDesktop1.6 393 * to sync with QtopiaDesktop1.6
375 */ 394 */
376 if ( msg == "sendVersionInfo()" ) {
377 QCopEnvelope e( "QPE/Desktop", "versionInfo(QString,QString)" ); 395 QCopEnvelope e( "QPE/Desktop", "versionInfo(QString,QString)" );
378 /* ### FIXME Architecture ### */ 396 /* ### FIXME Architecture ### */
379 e << QString::fromLatin1("1.7") << "Uncustomized Device"; 397 e << QString::fromLatin1("1.7") << "Uncustomized Device";
380 } else 398 } else if ( msg == "sendCardInfo()" ) {
381
382 if ( msg == "sendCardInfo()" ) {
383#ifndef QT_NO_COP 399#ifndef QT_NO_COP
384 QCopEnvelope e( "QPE/Desktop", "cardInfo(QString)" ); 400 QCopEnvelope e( "QPE/Desktop", "cardInfo(QString)" );
385#endif 401#endif
386 storage->update(); 402 storage->update();
387 const QList<FileSystem> &fs = storage->fileSystems(); 403 const QList<FileSystem> &fs = storage->fileSystems();
388 QListIterator<FileSystem> it ( fs ); 404 QListIterator<FileSystem> it ( fs );
389 QString s; 405 QString s;
390 QString homeDir = getenv("HOME"); 406 QString homeDir = getenv("HOME");
391 QString homeFs, homeFsPath; 407 QString homeFs, homeFsPath;
392 for ( ; it.current(); ++it ) { 408 for ( ; it.current(); ++it ) {
393 int k4 = (*it)->blockSize()/256; 409 int k4 = (*it)->blockSize()/256;
394 if ( (*it)->isRemovable() ) { 410 if ( (*it)->isRemovable() ) {
@@ -400,167 +416,207 @@ void Server::systemMsg(const QCString &msg, const QByteArray &data)
400 homeFsPath = (*it)->path(); 416 homeFsPath = (*it)->path();
401 homeFs = 417 homeFs =
402 (*it)->name() + "=" + homeDir + "/Documents " // No tr 418 (*it)->name() + "=" + homeDir + "/Documents " // No tr
403 + QString::number( (*it)->availBlocks() * k4/4 ) 419 + QString::number( (*it)->availBlocks() * k4/4 )
404 + "K " + (*it)->options() + ";"; 420 + "K " + (*it)->options() + ";";
405 } 421 }
406 } 422 }
407 if ( !homeFs.isEmpty() ) 423 if ( !homeFs.isEmpty() )
408 s += homeFs; 424 s += homeFs;
409#ifndef QT_NO_COP 425#ifndef QT_NO_COP
410 e << s; 426 e << s;
411#endif 427#endif
412 } else 428 } else if ( msg == "sendInstallLocations()" ) {
413 429#ifndef QT_NO_COP
414 if ( msg == "sendSyncDate(QString)" ) { 430 QCopEnvelope e( "QPE/Desktop", "installLocations(QString)" );
431 e << installLocationsString();
432#endif
433 } else if ( msg == "sendSyncDate(QString)" ) {
415 QString app; 434 QString app;
416 stream >> app; 435 stream >> app;
417 Config cfg( "qpe" ); 436 Config cfg( "qpe" );
418 cfg.setGroup("SyncDate"); 437 cfg.setGroup("SyncDate");
419#ifndef QT_NO_COP 438#ifndef QT_NO_COP
420 QCopEnvelope e( "QPE/Desktop", "syncDate(QString,QString)" ); 439 QCopEnvelope e( "QPE/Desktop", "syncDate(QString,QString)" );
421 e << app << cfg.readEntry( app ); 440 e << app << cfg.readEntry( app );
422#endif 441#endif
423 //odebug << "QPE/System sendSyncDate for " << app.latin1() << ": response " 442 //odebug << "QPE/System sendSyncDate for " << app.latin1() << ": response "
424 // << cfg.readEntry( app ).latin1() << oendl; 443 // << cfg.readEntry( app ).latin1() << oendl;
425 } else 444 } else if ( msg == "setSyncDate(QString,QString)" ) {
426
427 if ( msg == "setSyncDate(QString,QString)" ) {
428 QString app, date; 445 QString app, date;
429 stream >> app >> date; 446 stream >> app >> date;
430 Config cfg( "qpe" ); 447 Config cfg( "qpe" );
431 cfg.setGroup("SyncDate"); 448 cfg.setGroup("SyncDate");
432 cfg.writeEntry( app, date ); 449 cfg.writeEntry( app, date );
433 //odebug << "setSyncDate(QString,QString) " << app << " " << date << "" << oendl; 450 //odebug << "setSyncDate(QString,QString) " << app << " " << date << "" << oendl;
434 } else 451 } else if ( msg == "startSync(QString)" ) {
435
436 if ( msg == "startSync(QString)" ) {
437 QString what; 452 QString what;
438 stream >> what; 453 stream >> what;
439 delete syncDialog; 454 delete syncDialog;
440 syncDialog = new SyncDialog( this, what ); 455 syncDialog = new SyncDialog( this, what );
441 syncDialog->show(); 456 syncDialog->show();
442 connect( syncDialog, SIGNAL(cancel()), SLOT(cancelSync()) ); 457 connect( syncDialog, SIGNAL(cancel()), SLOT(cancelSync()) );
443 } else 458 } else if ( msg == "stopSync()") {
444
445 if ( msg == "stopSync()") {
446 delete syncDialog; 459 delete syncDialog;
447 syncDialog = 0; 460 syncDialog = 0;
448 } else 461 } else if (msg == "restoreDone(QString)") {
449
450 if (msg == "restoreDone(QString)") {
451 docList->restoreDone(); 462 docList->restoreDone();
452 } else 463 } else if ( msg == "getAllDocLinks()" ) {
453
454 if ( msg == "getAllDocLinks()" ) {
455 docList->sendAllDocLinks(); 464 docList->sendAllDocLinks();
456 } else 465 }
457 466#ifdef QPE_HAVE_DIRECT_ACCESS
467 else if ( msg == "prepareDirectAccess()" ) {
468 prepareDirectAccess();
469 } else if ( msg == "postDirectAccess()" ) {
470 postDirectAccess();
471 }
472#endif
458#ifdef Q_WS_QWS 473#ifdef Q_WS_QWS
459 if ( msg == "setMouseProto(QString)" ) { 474
475 else if ( msg == "setMouseProto(QString)" ) {
460 QString mice; 476 QString mice;
461 stream >> mice; 477 stream >> mice;
462 setenv("QWS_MOUSE_PROTO",mice.latin1(),1); 478 setenv("QWS_MOUSE_PROTO",mice.latin1(),1);
463 qwsServer->openMouse(); 479 qwsServer->openMouse();
464 } else 480 } else if ( msg == "setKeyboard(QString)" ) {
465
466 if ( msg == "setKeyboard(QString)" ) {
467 QString kb; 481 QString kb;
468 stream >> kb; 482 stream >> kb;
469 setenv("QWS_KEYBOARD",kb.latin1(),1); 483 setenv("QWS_KEYBOARD",kb.latin1(),1);
470 qwsServer->openKeyboard(); 484 qwsServer->openKeyboard();
471 } else 485 } else if ( msg == "setKeyboardAutoRepeat(int,int)" ) {
472
473 if ( msg == "setKeyboardAutoRepeat(int,int)" ) {
474 int delay, period; 486 int delay, period;
475 stream >> delay >> period; 487 stream >> delay >> period;
476 qwsSetKeyboardAutoRepeat( delay, period ); 488 qwsSetKeyboardAutoRepeat( delay, period );
477 Config cfg( "qpe" ); 489 Config cfg( "qpe" );
478 cfg.setGroup("Keyboard"); 490 cfg.setGroup("Keyboard");
479 cfg.writeEntry( "RepeatDelay", delay ); 491 cfg.writeEntry( "RepeatDelay", delay );
480 cfg.writeEntry( "RepeatPeriod", period ); 492 cfg.writeEntry( "RepeatPeriod", period );
481 } else 493 } else if ( msg == "setKeyboardLayout(QString)" ) {
482
483 if ( msg == "setKeyboardLayout(QString)" ) {
484 QString kb; 494 QString kb;
485 stream >> kb; 495 stream >> kb;
486 setKeyboardLayout( kb ); 496 setKeyboardLayout( kb );
487 Config cfg( "qpe" ); 497 Config cfg( "qpe" );
488 cfg.setGroup("Keyboard"); 498 cfg.setGroup("Keyboard");
489 cfg.writeEntry( "Layout", kb ); 499 cfg.writeEntry( "Layout", kb );
490 } else 500 } else if ( msg == "autoStart(QString)" ) {
491
492 if ( msg == "autoStart(QString)" ) {
493 QString appName; 501 QString appName;
494 stream >> appName; 502 stream >> appName;
495 Config cfg( "autostart" ); 503 Config cfg( "autostart" );
496 cfg.setGroup( "AutoStart" ); 504 cfg.setGroup( "AutoStart" );
497 if ( appName.compare("clear") == 0){ 505 if ( appName.compare("clear") == 0){
498 cfg.writeEntry("Apps", ""); 506 cfg.writeEntry("Apps", "");
499 } 507 }
500 } else 508 } else if ( msg == "autoStart(QString,QString)" ) {
501
502 if ( msg == "autoStart(QString,QString)" ) {
503 QString modifier, appName; 509 QString modifier, appName;
504 stream >> modifier >> appName; 510 stream >> modifier >> appName;
505 Config cfg( "autostart" ); 511 Config cfg( "autostart" );
506 cfg.setGroup( "AutoStart" ); 512 cfg.setGroup( "AutoStart" );
507 if ( modifier.compare("add") == 0 ){ 513 if ( modifier.compare("add") == 0 ){
508 // only add if appname is entered 514 // only add if appname is entered
509 if (!appName.isEmpty()) { 515 if (!appName.isEmpty()) {
510 cfg.writeEntry("Apps", appName); 516 cfg.writeEntry("Apps", appName);
511 } 517 }
512 } else if (modifier.compare("remove") == 0 ) { 518 } else if (modifier.compare("remove") == 0 ) {
513 // need to change for multiple entries 519 // need to change for multiple entries
514 // actually remove is right now simular to clear, but in future there 520 // actually remove is right now simular to clear, but in future there
515 // should be multiple apps in autostart possible. 521 // should be multiple apps in autostart possible.
516 QString checkName; 522 QString checkName;
517 checkName = cfg.readEntry("Apps", ""); 523 checkName = cfg.readEntry("Apps", "");
518 if (checkName == appName) { 524 if (checkName == appName) {
519 cfg.writeEntry("Apps", ""); 525 cfg.writeEntry("Apps", "");
520 } 526 }
521 } 527 }
522 // case the autostart feature should be delayed 528 // case the autostart feature should be delayed
523 } else 529 } else if ( msg == "autoStart(QString,QString,QString)") {
524
525 if ( msg == "autoStart(QString,QString,QString)") {
526 QString modifier, appName, delay; 530 QString modifier, appName, delay;
527 stream >> modifier >> appName >> delay; 531 stream >> modifier >> appName >> delay;
528 Config cfg( "autostart" ); 532 Config cfg( "autostart" );
529 533
530 cfg.setGroup( "AutoStart" ); 534 cfg.setGroup( "AutoStart" );
531 if ( modifier.compare("add") == 0 ){ 535 if ( modifier.compare("add") == 0 ){
532 // only add it appname is entered 536 // only add it appname is entered
533 if (!appName.isEmpty()) { 537 if (!appName.isEmpty()) {
534 cfg.writeEntry("Apps", appName); 538 cfg.writeEntry("Apps", appName);
535 cfg.writeEntry("Delay", delay); 539 cfg.writeEntry("Delay", delay);
536 } 540 }
537 } 541 }
538 } 542 }
539#endif 543#endif
540} 544}
541 545
546QString Server::cardInfoString()
547{
548 storage->update();
549 const QList<FileSystem> &fs = storage->fileSystems();
550 QListIterator<FileSystem> it ( fs );
551 QString s;
552 QString homeDir = getenv("HOME");
553 QString homeFs, homeFsPath;
554 for ( ; it.current(); ++it ) {
555 int k4 = (*it)->blockSize()/256;
556 if ( (*it)->isRemovable() ) {
557 s += (*it)->name() + "=" + (*it)->path() + "/Documents " // No tr
558 + QString::number( (*it)->availBlocks() * k4/4 )
559 + "K " + (*it)->options() + ";";
560 } else if ( homeDir.contains( (*it)->path() ) &&
561 (*it)->path().length() > homeFsPath.length() ) {
562 homeFsPath = (*it)->path();
563 homeFs =
564 (*it)->name() + "=" + homeDir + "/Documents " // No tr
565 + QString::number( (*it)->availBlocks() * k4/4 )
566 + "K " + (*it)->options() + ";";
567 }
568 }
569 if ( !homeFs.isEmpty() )
570 s += homeFs;
571 return s;
572}
573
574QString Server::installLocationsString()
575{
576 storage->update();
577 const QList<FileSystem> &fs = storage->fileSystems();
578 QListIterator<FileSystem> it ( fs );
579 QString s;
580 QString homeDir = getenv("HOME");
581 QString homeFs, homeFsPath;
582 for ( ; it.current(); ++it ) {
583 int k4 = (*it)->blockSize()/256;
584 if ( (*it)->isRemovable() ) {
585 s += (*it)->name() + "=" + (*it)->path() + " " // No tr
586 + QString::number( (*it)->availBlocks() * k4/4 )
587 + "K " + (*it)->options() + ";";
588 } else if ( homeDir.contains( (*it)->path() ) &&
589 (*it)->path().length() > homeFsPath.length() ) {
590 homeFsPath = (*it)->path();
591 homeFs =
592 (*it)->name() + "=" + homeDir + " " // No tr
593 + QString::number( (*it)->availBlocks() * k4/4 )
594 + "K " + (*it)->options() + ";";
595 }
596 }
597 if ( !homeFs.isEmpty() )
598 s = homeFs + s;
599 return s;
600}
601
542void Server::receiveTaskBar(const QCString &msg, const QByteArray &data) 602void Server::receiveTaskBar(const QCString &msg, const QByteArray &data)
543{ 603{
544 QDataStream stream( data, IO_ReadOnly ); 604 QDataStream stream( data, IO_ReadOnly );
545 605
546 if ( msg == "reloadApps()" ) { 606 if ( msg == "reloadApps()" ) {
547 docList->reloadAppLnks(); 607 docList->reloadAppLnks();
548 } else 608 } else if ( msg == "soundAlarm()" ) {
549
550 if ( msg == "soundAlarm()" ) {
551 ServerApplication::soundAlarm(); 609 ServerApplication::soundAlarm();
552 } else 610 } else if ( msg == "setLed(int,bool)" ) {
553
554 if ( msg == "setLed(int,bool)" ) {
555 int led, status; 611 int led, status;
556 stream >> led >> status; 612 stream >> led >> status;
557 613
558 QValueList <OLed> ll = ODevice::inst ( )-> ledList ( ); 614 QValueList <OLed> ll = ODevice::inst ( )-> ledList ( );
559 if ( ll. count ( )) { 615 if ( ll. count ( )) {
560 OLed l = ll. contains ( Led_Mail ) ? Led_Mail : ll [0]; 616 OLed l = ll. contains ( Led_Mail ) ? Led_Mail : ll [0];
561 bool canblink = ODevice::inst ( )-> ledStateList ( l ). contains ( Led_BlinkSlow ); 617 bool canblink = ODevice::inst ( )-> ledStateList ( l ). contains ( Led_BlinkSlow );
562 618
563 ODevice::inst ( )-> setLedState ( l, status ? ( canblink ? Led_BlinkSlow : Led_On ) : Led_Off ); 619 ODevice::inst ( )-> setLedState ( l, status ? ( canblink ? Led_BlinkSlow : Led_On ) : Led_Off );
564 } 620 }
565 } 621 }
566} 622}
@@ -739,12 +795,185 @@ void Server::storageChanged()
739 795
740void Server::preloadApps() 796void Server::preloadApps()
741{ 797{
742 Config cfg("Launcher"); 798 Config cfg("Launcher");
743 cfg.setGroup("Preload"); 799 cfg.setGroup("Preload");
744 QStringList apps = cfg.readListEntry("Apps",','); 800 QStringList apps = cfg.readListEntry("Apps",',');
745 for (QStringList::ConstIterator it=apps.begin(); it!=apps.end(); ++it) { 801 for (QStringList::ConstIterator it=apps.begin(); it!=apps.end(); ++it) {
746#ifndef QT_NO_COP 802#ifndef QT_NO_COP
747 QCopEnvelope e("QPE/Application/"+(*it).local8Bit(), "enablePreload()"); 803 QCopEnvelope e("QPE/Application/"+(*it).local8Bit(), "enablePreload()");
748#endif 804#endif
749 } 805 }
750} 806}
807
808// This is only called if QPE_HAVE_DIRECT_ACCESS is defined
809void Server::prepareDirectAccess()
810{
811 qDebug( "Server::prepareDirectAccess()" );
812 // Put up a pretty dialog
813 syncDialog = new SyncDialog( this, tr("USB Lock") );
814 syncDialog->show();
815
816 // Prevent the PDA from acting as a PDA
817 terminateServers();
818
819 // suspend the mtab monitor
820#ifndef QT_NO_COP
821 {
822 QCopEnvelope e( "QPE/Stabmon", "suspendMonitor()" );
823 }
824#endif
825
826 // send out a flush message
827 // once flushes are done call runDirectAccess()
828 // We just count the number of apps and set a timer.
829 // Either the timer expires or the correct number of apps responds.
830 // Note: quicklauncher isn't in the runningApps list but it responds
831 // to the flush so we start the counter at 1
832 pendingFlushes = 1;
833 directAccessRun = FALSE;
834 for ( QMap<int,QString>::ConstIterator it =
835 appLauncher->runningApplications().begin();
836 it != appLauncher->runningApplications().end();
837 ++it ) {
838 pendingFlushes++;
839 }
840#ifndef QT_NO_COP
841 QCopEnvelope e1( "QPE/System", "flush()" );
842#endif
843 QTimer::singleShot( 10000, this, SLOT(runDirectAccess()) );
844#warning FIXME support TempScreenSaverMode
845#if 0
846 QPEApplication::setTempScreenSaverMode(QPEApplication::DisableSuspend);
847#endif
848}
849
850// This is only connected if QPE_HAVE_DIRECT_ACCESS is defined
851// It fakes the presence of Qtopia Desktop
852void Server::desktopMessage( const QCString &message, const QByteArray &data )
853{
854 QDataStream stream( data, IO_ReadOnly );
855 if ( message == "flushDone(QString)" ) {
856 QString app;
857 stream >> app;
858 qDebug( "flushDone from %s", app.latin1() );
859 if ( --pendingFlushes == 0 ) {
860 qDebug( "pendingFlushes == 0, all the apps responded" );
861 runDirectAccess();
862 }
863 } else if ( message == "installStarted(QString)" ) {
864 QString package;
865 stream >> package;
866 qDebug( "\tInstall Started for package %s", package.latin1() );
867 } else if ( message == "installStep(QString)" ) {
868 QString step;
869 stream >> step;
870 qDebug( "\tInstall Step %s", step.latin1() );
871 } else if ( message == "installDone(QString)" ) {
872 QString package;
873 stream >> package;
874 qDebug( "\tInstall Finished for package %s", package.latin1() );
875 } else if ( message == "installFailed(QString,int,QString)" ) {
876 QString package, error;
877 int status;
878 stream >> package >> status >> error;
879 qDebug( "\tInstall Failed for package %s with error code %d and error message %s",
880 package.latin1(), status, error.latin1() );
881 } else if ( message == "removeStarted(QString)" ) {
882 QString package;
883 stream >> package;
884 qDebug( "\tRemove Started for package %s", package.latin1() );
885 } else if ( message == "removeDone(QString)" ) {
886 QString package;
887 stream >> package;
888 qDebug( "\tRemove Finished for package %s", package.latin1() );
889 } else if ( message == "removeFailed(QString)" ) {
890 QString package;
891 stream >> package;
892 qDebug( "\tRemove Failed for package %s", package.latin1() );
893 }
894
895 if ( qrr && qrr->waitingForMessages )
896 qrr->desktopMessage( message, data );
897}
898
899
900// This is only connected if QPE_HAVE_DIRECT_ACCESS is defined
901void Server::runDirectAccess()
902{
903#ifdef QPE_HAVE_DIRECT_ACCESS
904 // The timer must have fired after all the apps responded
905 // with flushDone(). Just ignore it.
906 if ( directAccessRun )
907 return;
908
909 directAccessRun = TRUE;
910 ::readyDirectAccess(cardInfoString(), installLocationsString());
911#endif
912}
913
914// This is only called if QPE_HAVE_DIRECT_ACCESS is defined
915void Server::postDirectAccess()
916{
917#ifdef QPE_HAVE_DIRECT_ACCESS
918 qDebug( "Server::postDirectAccess()" );
919
920 // Categories may have changed
921 QCopEnvelope e1( "QPE/System", "categoriesChanged()" );
922 // Apps need to reload their data
923 QCopEnvelope e2( "QPE/System", "reload()" );
924 // Reload DocLinks
925 docList->storageChanged();
926 // Restart the PDA server stuff
927 startTransferServer();
928
929 // restart the mtab monitor
930#ifndef QT_NO_COP
931 {
932 QCopEnvelope e( "QPE/Stabmon", "restartMonitor()" );
933 }
934#endif
935
936 // Process queued requests
937 const char *queueFile = ::directAccessQueueFile();
938 QFile *file = new QFile( queueFile );
939 if ( !file->exists() ) {
940 delete file;
941 // Get rid of the dialog
942 if ( syncDialog ) {
943 delete syncDialog;
944 syncDialog = 0;
945 }
946#warning FIXME support TempScreenSaverMode
947#if 0
948 QPEApplication::setTempScreenSaverMode(QPEApplication::Enable);
949#endif
950 } else {
951 qrr = new QueuedRequestRunner( file, syncDialog );
952 connect( qrr, SIGNAL(finished()),
953 this, SLOT(finishedQueuedRequests()) );
954 QTimer::singleShot( 100, qrr, SLOT(process()) );
955 // qrr will remove the sync dialog later
956 }
957#endif
958}
959
960void Server::finishedQueuedRequests()
961{
962 if ( qrr->readyToDelete ) {
963 delete qrr;
964 qrr = 0;
965 // Get rid of the dialog
966 if ( syncDialog ) {
967 delete syncDialog;
968 syncDialog = 0;
969 }
970#warning FIXME support TempScreenSaverMode
971#if 0
972 QPEApplication::setTempScreenSaverMode(QPEApplication::Enable);
973#endif
974 } else {
975 qrr->readyToDelete = TRUE;
976 QTimer::singleShot( 0, this, SLOT(finishedQueuedRequests()) );
977 }
978}
979