summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/launcher/applauncher.h9
-rw-r--r--core/launcher/documentlist.cpp31
-rw-r--r--core/launcher/packageslave.cpp14
-rw-r--r--core/launcher/packageslave.h2
-rw-r--r--core/launcher/qrr.cpp220
-rw-r--r--core/launcher/qrr.h66
-rw-r--r--core/launcher/server.cpp391
-rw-r--r--core/launcher/server.h12
-rw-r--r--core/launcher/server.pro5
-rw-r--r--core/launcher/serverapp.cpp7
10 files changed, 657 insertions, 100 deletions
diff --git a/core/launcher/applauncher.h b/core/launcher/applauncher.h
index 4fd5491..22a458f 100644
--- a/core/launcher/applauncher.h
+++ b/core/launcher/applauncher.h
@@ -10,73 +10,74 @@
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#ifndef APP_LAUNCHER_H 21#ifndef APP_LAUNCHER_H
22#define APP_LAUNCHER_H 22#define APP_LAUNCHER_H
23 23
24#include <qtopia/global.h> 24#include <qtopia/global.h>
25#include <qobject.h> 25#include <qobject.h>
26#include <qmap.h> 26#include <qmap.h>
27#ifdef Q_OS_WIN32 27#ifdef Q_OS_WIN32
28#include <qtopia/qprocess.h> 28#include <qtopia/qprocess.h>
29#include <qlist.h> 29#include <qlist.h>
30#endif 30#endif
31 31
32class QMessageBox; 32class QMessageBox;
33 33
34class AppLauncher : public QObject 34class AppLauncher : public QObject
35{ 35{
36 Q_OBJECT 36 Q_OBJECT
37public: 37public:
38 AppLauncher(QObject *parent = 0, const char *name = 0); 38 AppLauncher(QObject *parent = 0, const char *name = 0);
39 ~AppLauncher(); 39 ~AppLauncher();
40 40
41 bool isRunning(const QString &app); 41 bool isRunning(const QString &app);
42 const QMap<int,QString> &runningApplications() { return runningApps; }
42 43
43 static const int RAISE_TIMEOUT_MS; 44 static const int RAISE_TIMEOUT_MS;
44 45
45signals: 46signals:
46 void launched(int pid, const QString &app); 47 void launched(int pid, const QString &app);
47 void terminated(int pid, const QString &app); 48 void terminated(int pid, const QString &app);
48 void connected(const QString &app); 49 void connected(const QString &app);
49 50
50protected slots: 51protected slots:
51 void sigStopped(int sigPid, int sigStatus); 52 void sigStopped(int sigPid, int sigStatus);
52 void received(const QCString& msg, const QByteArray& data); 53 void received(const QCString& msg, const QByteArray& data);
53 void newQcopChannel(const QString& channel); 54 void newQcopChannel(const QString& channel);
54 void removedQcopChannel(const QString& channel); 55 void removedQcopChannel(const QString& channel);
55 void createQuickLauncher(); 56 void createQuickLauncher();
56 void processExited(); 57 void processExited();
57 58
58protected: 59protected:
59 bool event(QEvent *); 60 bool event(QEvent *);
60 void timerEvent( QTimerEvent * ); 61 void timerEvent( QTimerEvent * );
61 62
62private: 63private:
63 static void signalHandler(int sig); 64 static void signalHandler(int sig);
64 bool executeBuiltin(const QString &c, const QString &document); 65 bool executeBuiltin(const QString &c, const QString &document);
65 bool execute(const QString &c, const QString &document, bool noRaise = FALSE); 66 bool execute(const QString &c, const QString &document, bool noRaise = FALSE);
66 void kill( int pid ); 67 void kill( int pid );
67 int pidForName( const QString & ); 68 int pidForName( const QString & );
68 69
69private: 70private:
70 QMap<int,QString> runningApps; 71 QMap<int,QString> runningApps;
71 QMap<QString,int> waitingHeartbeat; 72 QMap<QString,int> waitingHeartbeat;
72#ifdef Q_OS_WIN32 73#ifdef Q_OS_WIN32
73 QList<QProcess> runningAppsProc; 74 QList<QProcess> runningAppsProc;
74#endif 75#endif
75 int qlPid; 76 int qlPid;
76 bool qlReady; 77 bool qlReady;
77 QMessageBox *appKillerBox; 78 QMessageBox *appKillerBox;
78 QString appKillerName; 79 QString appKillerName;
79}; 80};
80 81
81#endif 82#endif
82 83
diff --git a/core/launcher/documentlist.cpp b/core/launcher/documentlist.cpp
index 44ceb0c..d8e7a83 100644
--- a/core/launcher/documentlist.cpp
+++ b/core/launcher/documentlist.cpp
@@ -358,134 +358,145 @@ void DocumentList::DiffAppLnks()
358 odebug << "adding type " << (*ittypes) << "" << oendl; 358 odebug << "adding type " << (*ittypes) << "" << oendl;
359 359
360 // ### our current launcher expects docs tab to be last 360 // ### our current launcher expects docs tab to be last
361 d->serverGui->typeAdded( *ittypes, name.isNull() ? (*ittypes) : name, pm, bgPm ); 361 d->serverGui->typeAdded( *ittypes, name.isNull() ? (*ittypes) : name, pm, bgPm );
362 } 362 }
363 prevTypeList.remove(*ittypes); 363 prevTypeList.remove(*ittypes);
364 } 364 }
365 } 365 }
366 for ( QStringList::Iterator ittypes=prevTypeList.begin(); ittypes!=prevTypeList.end(); ++ittypes) { 366 for ( QStringList::Iterator ittypes=prevTypeList.begin(); ittypes!=prevTypeList.end(); ++ittypes) {
367 odebug << "removing type " << (*ittypes) << "" << oendl; 367 odebug << "removing type " << (*ittypes) << "" << oendl;
368 d->serverGui->typeRemoved(*ittypes); 368 d->serverGui->typeRemoved(*ittypes);
369 } 369 }
370 prevTypeList = types; 370 prevTypeList = types;
371 } 371 }
372 372
373 373
374 QListIterator<AppLnk> it1( appLnkSet->children() ); 374 QListIterator<AppLnk> it1( appLnkSet->children() );
375 QListIterator<AppLnk> it2( appLnkSet2->children() ); 375 QListIterator<AppLnk> it2( appLnkSet2->children() );
376 376
377 AppLnk *i; 377 AppLnk *i;
378 AppLnk *j; 378 AppLnk *j;
379 bool found; 379 bool found;
380 380
381 while ( (j=it2.current()) ) { 381 while ( (j=it2.current()) ) {
382 it1 = appLnkSet->children(); 382 it1 = appLnkSet->children();
383 found = false; 383 found = false;
384 while ( (i=it1.current()) ){ 384 while ( (i=it1.current()) ){
385 if (strcmp(i->name().ascii(),j->name().ascii()) == 0) 385 if (strcmp(i->name().ascii(),j->name().ascii()) == 0)
386 found = true; 386 found = true;
387 ++it1; 387 ++it1;
388 } 388 }
389 if (!found) { 389 if (!found) {
390 odebug << "Item " << j->name().ascii() << " needs to be added" << oendl; 390 odebug << "Item " << j->name().ascii() << " needs to be added" << oendl;
391 d->serverGui->applicationAdded( j->type(), *j ); 391 d->serverGui->applicationAdded( j->type(), *j );
392 } 392 }
393 ++it2; 393 ++it2;
394 } 394 }
395 395
396 it1 = appLnkSet->children(); 396 it1 = appLnkSet->children();
397 while ( (i=it1.current()) ) { 397 while ( (i=it1.current()) ) {
398 it2 = appLnkSet2->children(); 398 it2 = appLnkSet2->children();
399 found = false; 399 found = false;
400 while ( (j=it2.current()) ){ 400 while ( (j=it2.current()) ){
401 if (strcmp(i->name().ascii(),j->name().ascii()) == 0) 401 if (strcmp(i->name().ascii(),j->name().ascii()) == 0)
402 found = true; 402 found = true;
403 ++it2; 403 ++it2;
404 } 404 }
405 if (!found) { 405 if (!found) {
406 odebug << "Item " << i->name().ascii() << " needs to be removed" << oendl; 406 odebug << "Item " << i->name().ascii() << " needs to be removed" << oendl;
407 d->serverGui->applicationRemoved( i->type(), *i ); 407 d->serverGui->applicationRemoved( i->type(), *i );
408 } 408 }
409 409
410 ++it1; 410 ++it1;
411 } 411 }
412 412
413 delete appLnkSet; 413 delete appLnkSet;
414 appLnkSet = appLnkSet2; 414 appLnkSet = appLnkSet2;
415 415
416} 416}
417void DocumentList::storageChanged() 417void DocumentList::storageChanged()
418{ 418{
419 QTime t; 419 QTime t;
420 // ### can implement better 420 // ### can implement better
421 421
422 t.start(); 422 t.start();
423 DiffAppLnks(); 423 DiffAppLnks();
424// reloadAppLnks(); 424// reloadAppLnks();
425 odebug << "Reload App links took " << t.elapsed() << " ms" << oendl; 425 odebug << "Reload App links took " << t.elapsed() << " ms" << oendl;
426 reloadDocLnks(); 426 reloadDocLnks();
427// odebug << "Reload links took " << t.elapsed() << " ms " << oendl; 427// odebug << "Reload links took " << t.elapsed() << " ms " << oendl;
428 odebug << "Reload All links took " << t.elapsed() << " ms" << oendl; 428 odebug << "Reload All links took " << t.elapsed() << " ms" << oendl;
429// ### Optimization opportunity 429// ### Optimization opportunity
430 // Could be a bit more intelligent and somehow work out which 430 // Could be a bit more intelligent and somehow work out which
431 // mtab entry has changed and then only scan that and add and remove 431 // mtab entry has changed and then only scan that and add and remove
432 // links appropriately. 432 // links appropriately.
433// rescan(); 433// rescan();
434} 434}
435 435
436void DocumentList::sendAllDocLinks() 436void DocumentList::sendAllDocLinks()
437{ 437{
438 if ( d->tid != 0 ) { 438 if ( d->tid != 0 ) {
439 // We are in the middle of scanning, set a flag so 439 // We are in the middle of scanning, set a flag so
440 // we do this when we finish our scanning 440 // we do this when we finish our scanning
441 d->needToSendAllDocLinks = true; 441 d->needToSendAllDocLinks = true;
442 return; 442 return;
443 } 443 }
444 444
445 QString contents; 445 QString contents;
446 Categories cats; 446 Categories cats;
447 for ( QListIterator<DocLnk> it( d->dls.children() ); it.current(); ++it ) { 447 for ( QListIterator<DocLnk> it( d->dls.children() ); it.current(); ++it ) {
448 DocLnk *doc = it.current(); 448 DocLnk *doc = it.current();
449 QFileInfo fi( doc->file() ); 449 QFileInfo fi( doc->file() );
450 if ( !fi.exists() ) 450 if ( !fi.exists() )
451 continue; 451 continue;
452 452
453 bool fake = !doc->linkFileKnown(); 453 bool fake = !doc->linkFileKnown();
454 if ( !fake ) { 454 if ( !fake ) {
455 QFile f( doc->linkFile() ); 455 QFile f( doc->linkFile() );
456 if ( f.open( IO_ReadOnly ) ) { 456 if ( f.open( IO_ReadOnly ) ) {
457 QTextStream ts( &f ); 457 QTextStream ts( &f );
458 ts.setEncoding( QTextStream::UnicodeUTF8 ); 458 ts.setEncoding( QTextStream::UnicodeUTF8 );
459 contents += ts.read(); 459 QString docLnk = ts.read();
460 // Strip out the (stale) LinkFile entry
461 int start = docLnk.find( "\nLinkFile = " ) + 1;
462 if ( start > 0 ) {
463 int end = docLnk.find( "\n", start + 1 ) + 1;
464 contents += docLnk.left(start);
465 contents += docLnk.mid(end);
466 } else {
467 contents += docLnk;
468 }
469 contents += "LinkFile = " + doc->linkFile() + "\n";
470
460 f.close(); 471 f.close();
461 } else 472 } else
462 fake = TRUE; 473 fake = TRUE;
463 } 474 }
464 if (fake) { 475 if (fake) {
465 contents += "[Desktop Entry]\n"; // No tr 476 contents += "[Desktop Entry]\n"; // No tr
466 contents += "Categories = " + // No tr 477 contents += "Categories = " + // No tr
467 cats.labels("Document View",doc->categories()).join(";") + "\n"; // No tr 478 cats.labels("Document View",doc->categories()).join(";") + "\n"; // No tr
468 contents += "Name = "+doc->name()+"\n"; // No tr 479 contents += "Name = "+doc->name()+"\n"; // No tr
469 contents += "Type = "+doc->type()+"\n"; // No tr 480 contents += "Type = "+doc->type()+"\n"; // No tr
470 } 481 }
471 contents += "File = "+doc->file()+"\n"; // No tr // (resolves path) 482 contents += "File = "+doc->file()+"\n"; // No tr // (resolves path)
472 contents += QString("Size = %1\n").arg( fi.size() ); // No tr 483 contents += QString("Size = %1\n").arg( fi.size() ); // No tr
473 } 484 }
474 485
475 //odebug << "sending length " << contents.length() << "" << oendl; 486 //odebug << "sending length " << contents.length() << "" << oendl;
476#ifndef QT_NO_COP 487#ifndef QT_NO_COP
477 QCopEnvelope e( "QPE/Desktop", "docLinks(QString)" ); 488 QCopEnvelope e( "QPE/Desktop", "docLinks(QString)" );
478 e << contents; 489 e << contents;
479#endif 490#endif
480 //odebug << "================ \n\n" << contents << "\n\n===============" << oendl; 491 //odebug << "================ \n\n" << contents << "\n\n===============" << oendl;
481 492
482 d->needToSendAllDocLinks = false; 493 d->needToSendAllDocLinks = false;
483} 494}
484 495
485 496
486 497
487 498
488 499
489 500
490 501
491 502
diff --git a/core/launcher/packageslave.cpp b/core/launcher/packageslave.cpp
index 0461432..abbc610 100644
--- a/core/launcher/packageslave.cpp
+++ b/core/launcher/packageslave.cpp
@@ -36,102 +36,112 @@ using namespace Opie::Core;
36 36
37/* STD */ 37/* STD */
38#include <stdlib.h> 38#include <stdlib.h>
39#include <sys/stat.h> // mkdir() 39#include <sys/stat.h> // mkdir()
40#if defined(_OS_LINUX_) || defined(Q_OS_LINUX) 40#if defined(_OS_LINUX_) || defined(Q_OS_LINUX)
41#include <unistd.h> 41#include <unistd.h>
42#include <sys/vfs.h> 42#include <sys/vfs.h>
43#include <mntent.h> 43#include <mntent.h>
44#elif defined(Q_OS_MACX) 44#elif defined(Q_OS_MACX)
45#include <unistd.h> 45#include <unistd.h>
46#endif 46#endif
47 47
48 48
49PackageHandler::PackageHandler( QObject *parent, char* name ) 49PackageHandler::PackageHandler( QObject *parent, char* name )
50 : QObject( parent, name ), packageChannel( 0 ), currentProcess( 0 ), mNoSpaceLeft( FALSE ) 50 : QObject( parent, name ), packageChannel( 0 ), currentProcess( 0 ), mNoSpaceLeft( FALSE )
51{ 51{
52 // setup qcop channel 52 // setup qcop channel
53#ifndef QT_NO_COP 53#ifndef QT_NO_COP
54 packageChannel = new QCopChannel( "QPE/Package", this ); 54 packageChannel = new QCopChannel( "QPE/Package", this );
55 connect( packageChannel, SIGNAL( received(const QCString&,const QByteArray&) ), 55 connect( packageChannel, SIGNAL( received(const QCString&,const QByteArray&) ),
56 this, SLOT( qcopMessage(const QCString&,const QByteArray&) ) ); 56 this, SLOT( qcopMessage(const QCString&,const QByteArray&) ) );
57#endif 57#endif
58} 58}
59 59
60void PackageHandler::qcopMessage( const QCString &msg, const QByteArray &data ) 60void PackageHandler::qcopMessage( const QCString &msg, const QByteArray &data )
61{ 61{
62 QDataStream stream( data, IO_ReadOnly ); 62 QDataStream stream( data, IO_ReadOnly );
63 63
64 if ( msg == "installPackage(QString)" ) { 64 if ( msg == "installPackage(QString)" ) {
65 QString file; 65 QString file;
66 stream >> file; 66 stream >> file;
67 installPackage( file ); 67 installPackage( file );
68 } else if ( msg == "installPackage(QString,QString)" ) {
69 QString file, dest;
70 stream >> file >> dest;
71 installPackage( file, dest );
68 } else if ( msg == "removePackage(QString)" ) { 72 } else if ( msg == "removePackage(QString)" ) {
69 QString file; 73 QString file;
70 stream >> file; 74 stream >> file;
71 removePackage( file ); 75 removePackage( file );
72 } else if ( msg == "addPackageFiles(QString,QString)" ) { 76 } else if ( msg == "addPackageFiles(QString,QString)" ) {
73 QString location, listfile; 77 QString location, listfile;
74 stream >> location >> listfile; 78 stream >> location >> listfile;
75 addPackageFiles( location, listfile); 79 addPackageFiles( location, listfile);
76 } else if ( msg == "addPackages(QString)" ) { 80 } else if ( msg == "addPackages(QString)" ) {
77 QString location; 81 QString location;
78 stream >> location; 82 stream >> location;
79 addPackages( location ); 83 addPackages( location );
80 } else if ( msg == "cleanupPackageFiles(QString)" ) { 84 } else if ( msg == "cleanupPackageFiles(QString)" ) {
81 QString listfile; 85 QString listfile;
82 stream >> listfile; 86 stream >> listfile;
83 cleanupPackageFiles( listfile ); 87 cleanupPackageFiles( listfile );
84 } else if ( msg == "cleanupPackages(QString)" ) { 88 } else if ( msg == "cleanupPackages(QString)" ) {
85 QString location; 89 QString location;
86 stream >> location; 90 stream >> location;
87 cleanupPackages( location ); 91 cleanupPackages( location );
88 } else if ( msg == "prepareInstall(QString,QString)" ) { 92 } else if ( msg == "prepareInstall(QString,QString)" ) {
89 QString size, path; 93 QString size, path;
90 stream >> size; 94 stream >> size;
91 stream >> path; 95 stream >> path;
92 prepareInstall( size, path ); 96 prepareInstall( size, path );
93 } 97 }
94} 98}
95 99
96void PackageHandler::installPackage( const QString &package ) 100void PackageHandler::installPackage( const QString &package, const QString &dest )
97{ 101{
98 if ( mNoSpaceLeft ) { 102 if ( mNoSpaceLeft ) {
99 mNoSpaceLeft = FALSE; 103 mNoSpaceLeft = FALSE;
100 // Don't emit that for now, I still couldn't test it (Wener) 104 // Don't emit that for now, I still couldn't test it (Wener)
101 //sendReply( "installFailed(QString)", package ); 105 //sendReply( "installFailed(QString)", package );
102 //return; 106 //return;
103 } 107 }
104 108
105 currentProcess = new QProcess( QStringList() << "ipkg" << "install" << package ); // No tr 109 QStringList cmd;
110 cmd << "ipkg";
111 if ( !dest.isEmpty() ) {
112 cmd << "-d" << dest;
113 }
114 cmd << "install" << package;
115 currentProcess = new QProcess( cmd ); // No tr
106 connect( currentProcess, SIGNAL( processExited() ), SLOT( iProcessExited() ) ); 116 connect( currentProcess, SIGNAL( processExited() ), SLOT( iProcessExited() ) );
107 connect( currentProcess, SIGNAL( readyReadStdout() ), SLOT( readyReadStdout() ) ); 117 connect( currentProcess, SIGNAL( readyReadStdout() ), SLOT( readyReadStdout() ) );
108 connect( currentProcess, SIGNAL( readyReadStderr() ), SLOT( readyReadStderr() ) ); 118 connect( currentProcess, SIGNAL( readyReadStderr() ), SLOT( readyReadStderr() ) );
109 currentPackage = package; 119 currentPackage = package;
110 120
111 currentProcessError=""; 121 currentProcessError="";
112 sendReply( "installStarted(QString)", package ); 122 sendReply( "installStarted(QString)", package );
113 currentProcess->start(); 123 currentProcess->start();
114} 124}
115 125
116void PackageHandler::removePackage( const QString &package ) 126void PackageHandler::removePackage( const QString &package )
117{ 127{
118 currentProcess = new QProcess( QStringList() << "ipkg" << "remove" << package ); // No tr 128 currentProcess = new QProcess( QStringList() << "ipkg" << "remove" << package ); // No tr
119 connect( currentProcess, SIGNAL( processExited() ), SLOT( rmProcessExited() ) ); 129 connect( currentProcess, SIGNAL( processExited() ), SLOT( rmProcessExited() ) );
120 connect( currentProcess, SIGNAL( readyReadStdout() ), SLOT( readyReadStdout() ) ); 130 connect( currentProcess, SIGNAL( readyReadStdout() ), SLOT( readyReadStdout() ) );
121 connect( currentProcess, SIGNAL( readyReadStderr() ), SLOT( readyReadStderr() ) ); 131 connect( currentProcess, SIGNAL( readyReadStderr() ), SLOT( readyReadStderr() ) );
122 currentPackage = package; 132 currentPackage = package;
123 133
124 currentProcessError=""; 134 currentProcessError="";
125 sendReply( "removeStarted(QString)", package ); 135 sendReply( "removeStarted(QString)", package );
126 currentProcess->start(); 136 currentProcess->start();
127} 137}
128 138
129void PackageHandler::sendReply( const QCString& msg, const QString& arg ) 139void PackageHandler::sendReply( const QCString& msg, const QString& arg )
130{ 140{
131#ifndef QT_NO_COP 141#ifndef QT_NO_COP
132 QCopEnvelope e( "QPE/Desktop", msg ); 142 QCopEnvelope e( "QPE/Desktop", msg );
133 e << arg; 143 e << arg;
134#endif 144#endif
135} 145}
136 146
137void PackageHandler::addPackageFiles( const QString &location, 147void PackageHandler::addPackageFiles( const QString &location,
diff --git a/core/launcher/packageslave.h b/core/launcher/packageslave.h
index 878b4c3..83dfe6f 100644
--- a/core/launcher/packageslave.h
+++ b/core/launcher/packageslave.h
@@ -9,65 +9,65 @@
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#ifndef __packageslave_h__ 21#ifndef __packageslave_h__
22#define __packageslave_h__ 22#define __packageslave_h__
23 23
24#include <qtopia/global.h> 24#include <qtopia/global.h>
25#include <qobject.h> 25#include <qobject.h>
26 26
27class QCopChannel; 27class QCopChannel;
28class QProcess; 28class QProcess;
29 29
30class PackageHandler : public QObject 30class PackageHandler : public QObject
31{ 31{
32 Q_OBJECT 32 Q_OBJECT
33 33
34public: 34public:
35 PackageHandler( QObject *parent, char* name = 0 ); 35 PackageHandler( QObject *parent, char* name = 0 );
36 36
37public slots: 37public slots:
38 void redoPackages(); 38 void redoPackages();
39 39
40protected: 40protected:
41 void installPackage( const QString &package ); 41 void installPackage( const QString &package, const QString &dest = QString::null );
42 void removePackage( const QString &package ); 42 void removePackage( const QString &package );
43 43
44 void addPackageFiles( const QString &location, const QString &listfile ); 44 void addPackageFiles( const QString &location, const QString &listfile );
45 void addPackages( const QString &location ); 45 void addPackages( const QString &location );
46 46
47 void cleanupPackageFiles( const QString &listfile ); 47 void cleanupPackageFiles( const QString &listfile );
48 void cleanupPackages( const QString &location ); 48 void cleanupPackages( const QString &location );
49 49
50 void prepareInstall( const QString& size, const QString& path ); 50 void prepareInstall( const QString& size, const QString& path );
51 51
52protected slots: 52protected slots:
53 void qcopMessage( const QCString &msg, const QByteArray &data ); 53 void qcopMessage( const QCString &msg, const QByteArray &data );
54 void iProcessExited(); 54 void iProcessExited();
55 void rmProcessExited(); 55 void rmProcessExited();
56 void readyReadStdout(); 56 void readyReadStdout();
57 void readyReadStderr(); 57 void readyReadStderr();
58 58
59private: 59private:
60 void sendReply( const QCString& msg, const QString& arg ); 60 void sendReply( const QCString& msg, const QString& arg );
61 61
62private: 62private:
63 QCopChannel *packageChannel; 63 QCopChannel *packageChannel;
64 QProcess *currentProcess; 64 QProcess *currentProcess;
65 QString currentPackage; 65 QString currentPackage;
66 QString currentProcessError; 66 QString currentProcessError;
67 bool mNoSpaceLeft; 67 bool mNoSpaceLeft;
68}; 68};
69 69
70 70
71#endif // __QUICK_LAUNCHER_H__ 71#endif // __QUICK_LAUNCHER_H__
72 72
73 73
diff --git a/core/launcher/qrr.cpp b/core/launcher/qrr.cpp
new file mode 100644
index 0000000..5809ca9
--- a/dev/null
+++ b/core/launcher/qrr.cpp
@@ -0,0 +1,220 @@
1/**********************************************************************
2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
3**
4** This file is part of the Qtopia Environment.
5**
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
8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file.
10**
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.
13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15**
16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you.
18**
19**********************************************************************/
20
21#include "qrr.h"
22
23#include <qtopia/qcopenvelope_qws.h>
24#include <qfile.h>
25#include <qtimer.h>
26#include <qdialog.h>
27#include <qlayout.h>
28#include <qlabel.h>
29#include <qprogressbar.h>
30#include <qapplication.h>
31#include <qevent.h>
32
33
34class CenteringDialog : public QDialog
35{
36public:
37 CenteringDialog( QWidget *parent = 0, char *name = 0, bool modal = FALSE, WFlags f = 0 );
38 virtual ~CenteringDialog();
39
40protected:
41 void resizeEvent( QResizeEvent *e );
42};
43
44CenteringDialog::CenteringDialog( QWidget *parent, char *name, bool modal, WFlags f )
45 : QDialog( parent, name, modal, f )
46{
47}
48
49CenteringDialog::~CenteringDialog()
50{
51}
52
53void CenteringDialog::resizeEvent( QResizeEvent *e )
54{
55 int dist = -((width() - e->oldSize().width()) / 2);
56 qDebug( "move %d", dist );
57 move( pos().x() + dist, pos().y() );
58}
59
60// =====================================================================
61
62QueuedRequestRunner::QueuedRequestRunner( QFile *f, QWidget *parent )
63 : readyToDelete( FALSE ), waitingForMessages( FALSE ), file( 0 )
64{
65 file = f;
66 waitMsgs.setAutoDelete( TRUE );
67 if ( parent ) {
68 progressDialog = new CenteringDialog( parent, 0, TRUE );
69 QVBoxLayout *l = new QVBoxLayout( progressDialog );
70 l->setMargin( 6 );
71 l->setSpacing( 6 );
72 progressLabel = new QLabel( progressDialog );
73 progressLabel->setText( tr("Processing Queued Requests") );
74 progressBar = new QProgressBar( progressDialog );
75 l->addWidget( progressLabel );
76 l->addWidget( progressBar );
77 //progressDialog->setFixedSize( qApp->desktop()->width(), qApp->desktop()->height() );
78 progressDialog->show();
79 }
80 int totalSteps = countSteps();
81 if ( parent ) {
82 qDebug( "%d steps", totalSteps );
83 progressBar->setTotalSteps( totalSteps );
84 progressBar->setProgress( 0 );
85 }
86 file->open( IO_ReadOnly );
87}
88
89QueuedRequestRunner::~QueuedRequestRunner()
90{
91 delete progressDialog;
92 delete file;
93}
94
95void QueuedRequestRunner::process()
96{
97 if ( process( FALSE ) ) {
98 if ( !waitingForMessages || action == "wait" )
99 QTimer::singleShot( 100, this, SLOT(process()) );
100 } else {
101 file->remove();
102 emit finished();
103 }
104
105}
106
107int QueuedRequestRunner::countSteps()
108{
109 int totalSteps = 0;
110 bool more = TRUE;
111 file->open( IO_ReadOnly );
112 while ( more ) {
113 steps = 0;
114 more = process( TRUE );
115 totalSteps += steps;
116 }
117 file->close();
118 waitingForMessages = FALSE;
119 return totalSteps;
120}
121
122bool QueuedRequestRunner::process( bool counting )
123{
124 QDataStream stream( file );
125 stream >> action;
126 if ( action == "info" ) {
127 QString message;
128 stream >> message;
129 qDebug( "info %s", message.latin1() );
130 if ( counting ) {
131 steps++;
132 } else {
133 progressLabel->setText( message );
134 }
135 } else if ( action == "qcop" ) {
136 QCString channel;
137 QCString message;
138 int args;
139 stream >> channel >> message >> args;
140 qDebug( "qcop %s %s", channel.data(), message.data() );
141#ifndef QT_NO_COP
142 QCopEnvelope *e = 0;
143 if ( !counting ) {
144 e = new QCopEnvelope( channel, message );
145 }
146#endif
147 QCString type;
148 for ( int i = 0; i < args; ++i ) {
149 stream >> type;
150 if ( type == "QString" ) {
151 QString arg;
152 stream >> arg;
153 qDebug( " %s %s", type.data(), arg.latin1() );
154#ifndef QT_NO_COP
155 if ( !counting )
156 (*e) << arg;
157#endif
158 } else if ( type == "int" ) {
159 int arg;
160 stream >> arg;
161 qDebug( " %s %d", type.data(), arg );
162#ifndef QT_NO_COP
163 if ( !counting )
164 (*e) << arg;
165#endif
166 } else {
167 qDebug( "\tBUG unknown type '%s'!", type.data() );
168 }
169 }
170 if ( counting ) {
171 steps++;
172 } else {
173#ifndef QT_NO_COP
174 // this causes the QCop message to be sent
175 delete e;
176#endif
177 }
178 } else if ( action == "wait" ) {
179 int messageCount;
180 QCString message;
181 waitMsgs.clear();
182 stream >> messageCount;
183 for ( int i = 0; i < messageCount; ++i ) {
184 stream >> message;
185 qDebug( "wait %s", message.data() );
186 if ( !counting ) {
187 waitMsgs.append( new QCString( message ) );
188 }
189 }
190 if ( counting )
191 steps++;
192 waitingForMessages = TRUE;
193 } else {
194 qDebug( "\tBUG unknown action '%s'!", action.data() );
195 }
196
197 if ( !counting ) {
198 progressBar->setProgress( progressBar->progress() + 1 );
199 }
200
201 return !file->atEnd();
202}
203
204void QueuedRequestRunner::desktopMessage( const QCString &message, const QByteArray & )
205{
206 bool found = FALSE;
207 QCString *msg;
208 for ( QListIterator<QCString> iter( waitMsgs ); ( msg = iter.current() ) != 0; ++iter ) {
209 if ( *msg == message ) {
210 found = TRUE;
211 break;
212 }
213 }
214 if ( found ) {
215 waitMsgs.clear();
216 waitingForMessages = FALSE;
217 QTimer::singleShot( 100, this, SLOT(process()) );
218 }
219}
220
diff --git a/core/launcher/qrr.h b/core/launcher/qrr.h
new file mode 100644
index 0000000..4c0a8db
--- a/dev/null
+++ b/core/launcher/qrr.h
@@ -0,0 +1,66 @@
1/**********************************************************************
2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
3**
4** This file is part of the Qtopia Environment.
5**
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
8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file.
10**
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.
13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15**
16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you.
18**
19**********************************************************************/
20#ifndef QRR_H
21#define QRR_H
22
23#include <qobject.h>
24#include <qlist.h>
25#include <qcstring.h>
26
27class QFile;
28class QDialog;
29class QLabel;
30class QProgressBar;
31class QWidget;
32
33class QueuedRequestRunner : public QObject
34{
35 Q_OBJECT
36public:
37 QueuedRequestRunner( QFile *f, QWidget *parent );
38 virtual ~QueuedRequestRunner();
39
40 void desktopMessage( const QCString &message, const QByteArray &data );
41
42 bool readyToDelete;
43 bool waitingForMessages;
44
45signals:
46 void finished();
47
48public slots:
49 void process();
50
51private:
52 int countSteps();
53 bool process( bool counting );
54
55 QFile *file;
56 QList<QCString> waitMsgs;
57 QDialog *progressDialog;
58 QLabel *progressLabel;
59 QProgressBar *progressBar;
60 int steps;
61 QCString action;
62};
63
64
65#endif // QRR_H
66
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
@@ -6,64 +6,65 @@
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 "server.h" 21#include "server.h"
22#include "serverapp.h" 22#include "serverapp.h"
23#include "startmenu.h" 23#include "startmenu.h"
24#include "launcher.h" 24#include "launcher.h"
25#include "transferserver.h" 25#include "transferserver.h"
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>
50#include <qtopia/qcopenvelope_qws.h> 51#include <qtopia/qcopenvelope_qws.h>
51#include <qtopia/global.h> 52#include <qtopia/global.h>
52using namespace Opie::Core; 53using namespace Opie::Core;
53 54
54/* QT */ 55/* QT */
55#include <qmainwindow.h> 56#include <qmainwindow.h>
56#include <qmessagebox.h> 57#include <qmessagebox.h>
57#include <qtimer.h> 58#include <qtimer.h>
58#include <qtextstream.h> 59#include <qtextstream.h>
59#include <qwindowsystem_qws.h> 60#include <qwindowsystem_qws.h>
60#include <qgfx_qws.h> 61#include <qgfx_qws.h>
61 62
62/* STD */ 63/* STD */
63#include <unistd.h> 64#include <unistd.h>
64#include <stdlib.h> 65#include <stdlib.h>
65 66
66extern QRect qt_maxWindowRect; 67extern QRect qt_maxWindowRect;
67 68
68static QWidget *calibrate(bool) 69static QWidget *calibrate(bool)
69{ 70{
@@ -88,144 +89,181 @@ static QWidget *calibrate(bool)
88 } \ 89 } \
89 w->show(); \ 90 w->show(); \
90 return w; \ 91 return w; \
91 } 92 }
92 93
93 94
94#ifdef SINGLE_APP 95#ifdef SINGLE_APP
95#define APP(a,b,c,d) FACTORY(b) 96#define APP(a,b,c,d) FACTORY(b)
96#include "apps.h" 97#include "apps.h"
97#undef APP 98#undef APP
98#endif // SINGLE_APP 99#endif // SINGLE_APP
99 100
100static Global::Command builtins[] = { 101static Global::Command builtins[] = {
101 102
102#ifdef SINGLE_APP 103#ifdef SINGLE_APP
103#define APP(a,b,c,d) { a, new##b, c, d }, 104#define APP(a,b,c,d) { a, new##b, c, d },
104#include "apps.h" 105#include "apps.h"
105#undef APP 106#undef APP
106#endif 107#endif
107 108
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&)),
169 this, SLOT(systemMsg(const QCString&,const QByteArray&)) ); 182 this, SLOT(systemMsg(const QCString&,const QByteArray&)) );
170 183
171 QCopChannel *tbChannel = new QCopChannel( "QPE/TaskBar", this ); 184 QCopChannel *tbChannel = new QCopChannel( "QPE/TaskBar", this );
172 connect( tbChannel, SIGNAL(received(const QCString&,const QByteArray&)), 185 connect( tbChannel, SIGNAL(received(const QCString&,const QByteArray&)),
173 this, SLOT(receiveTaskBar(const QCString&,const QByteArray&)) ); 186 this, SLOT(receiveTaskBar(const QCString&,const QByteArray&)) );
174 187
175 connect( qApp, SIGNAL(prepareForRestart()), this, SLOT(terminateServers()) ); 188 connect( qApp, SIGNAL(prepareForRestart()), this, SLOT(terminateServers()) );
176 connect( qApp, SIGNAL(timeChanged()), this, SLOT(pokeTimeMonitors()) ); 189 connect( qApp, SIGNAL(timeChanged()), this, SLOT(pokeTimeMonitors()) );
177 190
178 preloadApps(); 191 preloadApps();
179} 192}
180 193
181void Server::show() 194void Server::show()
182{ 195{
183 ServerApplication::login(TRUE); 196 ServerApplication::login(TRUE);
184 QWidget::show(); 197 QWidget::show();
185} 198}
186 199
187Server::~Server() 200Server::~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();
212 250
213 // A button with no action defined, will return a null ServiceRequest. Don't attempt 251 // A button with no action defined, will return a null ServiceRequest. Don't attempt
214 // to send/do anything with this as it will crash 252 // to send/do anything with this as it will crash
215 /* ### FIXME */ 253 /* ### FIXME */
216#if 0 254#if 0
217 if ( !sr.isNull() ) { 255 if ( !sr.isNull() ) {
218 QString app = sr.app(); 256 QString app = sr.app();
219 bool vis = hasVisibleWindow(app, app != "qpe"); 257 bool vis = hasVisibleWindow(app, app != "qpe");
220 if ( sr.message() == "raise()" && vis ) { 258 if ( sr.message() == "raise()" && vis ) {
221 sr.setMessage("nextView()"); 259 sr.setMessage("nextView()");
222 } else { 260 } else {
223 // "back door" 261 // "back door"
224 sr << (int)vis; 262 sr << (int)vis;
225 } 263 }
226 264
227 sr.send(); 265 sr.send();
228 } 266 }
229#endif 267#endif
230} 268}
231 269
@@ -263,324 +301,342 @@ static const KeyOverride jp109keys[] = {
263 301
264bool Server::setKeyboardLayout( const QString &kb ) 302bool Server::setKeyboardLayout( const QString &kb )
265{ 303{
266 //quick demo version that can be extended 304 //quick demo version that can be extended
267 305
268 QIntDict<QWSServer::KeyMap> *om = 0; 306 QIntDict<QWSServer::KeyMap> *om = 0;
269 if ( kb == "us101" ) { // No tr 307 if ( kb == "us101" ) { // No tr
270 om = 0; 308 om = 0;
271 } else if ( kb == "jp109" ) { 309 } else if ( kb == "jp109" ) {
272 om = new QIntDict<QWSServer::KeyMap>(37); 310 om = new QIntDict<QWSServer::KeyMap>(37);
273 const KeyOverride *k = jp109keys; 311 const KeyOverride *k = jp109keys;
274 while ( k->scan_code ) { 312 while ( k->scan_code ) {
275 om->insert( k->scan_code, &k->map ); 313 om->insert( k->scan_code, &k->map );
276 k++; 314 k++;
277 } 315 }
278 } 316 }
279 QWSServer::setOverrideKeys( om ); 317 QWSServer::setOverrideKeys( om );
280 318
281 return TRUE; 319 return TRUE;
282} 320}
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() ) {
395 s += (*it)->name() + "=" + (*it)->path() + "/Documents " // No tr 411 s += (*it)->name() + "=" + (*it)->path() + "/Documents " // No tr
396 + QString::number( (*it)->availBlocks() * k4/4 ) 412 + QString::number( (*it)->availBlocks() * k4/4 )
397 + "K " + (*it)->options() + ";"; 413 + "K " + (*it)->options() + ";";
398 } else if ( homeDir.contains( (*it)->path() ) && 414 } else if ( homeDir.contains( (*it)->path() ) &&
399 (*it)->path().length() > homeFsPath.length() ) { 415 (*it)->path().length() > homeFsPath.length() ) {
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}
567 623
568void Server::cancelSync() 624void Server::cancelSync()
569{ 625{
570#ifndef QT_NO_COP 626#ifndef QT_NO_COP
571 QCopEnvelope e( "QPE/Desktop", "cancelSync()" ); 627 QCopEnvelope e( "QPE/Desktop", "cancelSync()" );
572#endif 628#endif
573 delete syncDialog; 629 delete syncDialog;
574 syncDialog = 0; 630 syncDialog = 0;
575} 631}
576 632
577bool Server::mkdir(const QString &localPath) 633bool Server::mkdir(const QString &localPath)
578{ 634{
579 QDir fullDir(localPath); 635 QDir fullDir(localPath);
580 if (fullDir.exists()) 636 if (fullDir.exists())
581 return true; 637 return true;
582 638
583 // at this point the directory doesn't exist 639 // at this point the directory doesn't exist
584 // go through the directory tree and start creating the direcotories 640 // go through the directory tree and start creating the direcotories
585 // that don't exist; if we can't create the directories, return false 641 // that don't exist; if we can't create the directories, return false
586 642
@@ -719,32 +775,205 @@ void Server::applicationTerminated(int pid, const QString &app)
719#if 0 775#if 0
720 tsmMonitor->applicationTerminated( pid ); 776 tsmMonitor->applicationTerminated( pid );
721#else 777#else
722 Q_UNUSED( pid ) 778 Q_UNUSED( pid )
723#endif 779#endif
724} 780}
725 781
726void Server::applicationConnected(const QString &app) 782void Server::applicationConnected(const QString &app)
727{ 783{
728 serverGui->applicationStateChanged( app, ServerInterface::Running ); 784 serverGui->applicationStateChanged( app, ServerInterface::Running );
729} 785}
730 786
731void Server::storageChanged() 787void Server::storageChanged()
732{ 788{
733 system( "opie-update-symlinks" ); 789 system( "opie-update-symlinks" );
734 serverGui->storageChanged( storage->fileSystems() ); 790 serverGui->storageChanged( storage->fileSystems() );
735 docList->storageChanged(); 791 docList->storageChanged();
736} 792}
737 793
738 794
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
diff --git a/core/launcher/server.h b/core/launcher/server.h
index 1dc5e7e..d71d68a 100644
--- a/core/launcher/server.h
+++ b/core/launcher/server.h
@@ -8,92 +8,104 @@
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 DESKTOP_H 20#ifndef DESKTOP_H
21#define DESKTOP_H 21#define DESKTOP_H
22 22
23#include <qwidget.h> 23#include <qwidget.h>
24#include <qdatetime.h> 24#include <qdatetime.h>
25 25
26//#include "qcopbridge.h" 26//#include "qcopbridge.h"
27 27
28class QCopBridge; 28class QCopBridge;
29class QHostAddress; 29class QHostAddress;
30class TransferServer; 30class TransferServer;
31class PackageHandler; 31class PackageHandler;
32class ServiceRequest; 32class ServiceRequest;
33class TempScreenSaverMonitor; 33class TempScreenSaverMonitor;
34class AppLauncher; 34class AppLauncher;
35class AppLnkSet; 35class AppLnkSet;
36class StorageInfo; 36class StorageInfo;
37class SyncDialog; 37class SyncDialog;
38class DocumentList; 38class DocumentList;
39class ServerInterface; 39class ServerInterface;
40class QueuedRequestRunner;
40namespace Opie { 41namespace Opie {
41namespace Core { 42namespace Core {
42 class ODeviceButton; 43 class ODeviceButton;
43} 44}
44} 45}
45 46
46class Server : public QWidget { 47class Server : public QWidget {
47 Q_OBJECT 48 Q_OBJECT
48public: 49public:
49 Server(); 50 Server();
50 ~Server(); 51 ~Server();
51 52
52 static bool mkdir(const QString &path); 53 static bool mkdir(const QString &path);
53 54
54 void show(); 55 void show();
55 56
56 static bool setKeyboardLayout( const QString &kb ); 57 static bool setKeyboardLayout( const QString &kb );
57 58
58public slots: 59public slots:
59 void systemMsg(const QCString &, const QByteArray &); 60 void systemMsg(const QCString &, const QByteArray &);
60 void receiveTaskBar(const QCString &msg, const QByteArray &data); 61 void receiveTaskBar(const QCString &msg, const QByteArray &data);
61 void terminateServers(); 62 void terminateServers();
62 void pokeTimeMonitors(); 63 void pokeTimeMonitors();
63 64
64private slots: 65private slots:
65 void activate(const Opie::Core::ODeviceButton*,bool); 66 void activate(const Opie::Core::ODeviceButton*,bool);
66 void syncConnectionClosed( const QHostAddress & ); 67 void syncConnectionClosed( const QHostAddress & );
67 void applicationLaunched(int pid, const QString &app); 68 void applicationLaunched(int pid, const QString &app);
68 void applicationTerminated(int pid, const QString &app); 69 void applicationTerminated(int pid, const QString &app);
69 void applicationConnected(const QString &app); 70 void applicationConnected(const QString &app);
70 void storageChanged(); 71 void storageChanged();
71 void cancelSync(); 72 void cancelSync();
73 void desktopMessage( const QCString &, const QByteArray & );
74 void runDirectAccess();
75 void finishedQueuedRequests();
72 76
73protected: 77protected:
74 void styleChange( QStyle & ); 78 void styleChange( QStyle & );
75 void timerEvent( QTimerEvent *e ); 79 void timerEvent( QTimerEvent *e );
76 80
77private: 81private:
78 void layout(); 82 void layout();
79 void startTransferServer(); 83 void startTransferServer();
80 void preloadApps(); 84 void preloadApps();
85 void prepareDirectAccess();
86 void postDirectAccess();
87 QString cardInfoString();
88 QString installLocationsString();
81 89
82 QCopBridge *qcopBridge; 90 QCopBridge *qcopBridge;
83 TransferServer *transferServer; 91 TransferServer *transferServer;
84 PackageHandler *packageHandler; 92 PackageHandler *packageHandler;
85 QDate last_today_show; 93 QDate last_today_show;
86 int tid_xfer; 94 int tid_xfer;
87 /* ### FIXME two below### */ 95 /* ### FIXME two below### */
88// int tid_today; 96// int tid_today;
89// TempScreenSaverMonitor *tsmMonitor; 97// TempScreenSaverMonitor *tsmMonitor;
90 StorageInfo *storage; 98 StorageInfo *storage;
91 SyncDialog *syncDialog; 99 SyncDialog *syncDialog;
92 AppLauncher *appLauncher; 100 AppLauncher *appLauncher;
93 DocumentList *docList; 101 DocumentList *docList;
94 ServerInterface *serverGui; 102 ServerInterface *serverGui;
103
104 int pendingFlushes;
105 bool directAccessRun;
106 QueuedRequestRunner *qrr;
95}; 107};
96 108
97 109
98#endif // DESKTOP_H 110#endif // DESKTOP_H
99 111
diff --git a/core/launcher/server.pro b/core/launcher/server.pro
index f366f54..5f2aa02 100644
--- a/core/launcher/server.pro
+++ b/core/launcher/server.pro
@@ -1,84 +1,89 @@
1 TEMPLATE= app 1 TEMPLATE= app
2 2
3 CONFIG += qt warn_on 3 CONFIG += qt warn_on
4 4
5 DESTDIR = $$(OPIEDIR)/bin 5 DESTDIR = $$(OPIEDIR)/bin
6 6
7 HEADERS += server.h \ 7 HEADERS += server.h \
8 qrr.h \
8 serverinterface.h \ 9 serverinterface.h \
9 launchertab.h \ 10 launchertab.h \
10 documentlist.h \ 11 documentlist.h \
11 appicons.h \ 12 appicons.h \
12 taskbar.h \ 13 taskbar.h \
13 runningappbar.h \ 14 runningappbar.h \
14 applauncher.h \ 15 applauncher.h \
15 stabmon.h \ 16 stabmon.h \
16 inputmethods.h \ 17 inputmethods.h \
17 systray.h \ 18 systray.h \
18 wait.h \ 19 wait.h \
19 shutdownimpl.h \ 20 shutdownimpl.h \
20 launcher.h \ 21 launcher.h \
21 launcherview.h \ 22 launcherview.h \
22 $$(OPIEDIR)/core/apps/calibrate/calibrate.h \ 23 $$(OPIEDIR)/core/apps/calibrate/calibrate.h \
23 startmenu.h \ 24 startmenu.h \
24 transferserver.h \ 25 transferserver.h \
25 qcopbridge.h \ 26 qcopbridge.h \
26 packageslave.h \ 27 packageslave.h \
27 irserver.h \ 28 irserver.h \
28 firstuse.h \ 29 firstuse.h \
29 syncdialog.h \ 30 syncdialog.h \
30 serverapp.h \ 31 serverapp.h \
31 qprocess.h \ 32 qprocess.h \
32 screensaver.h \ 33 screensaver.h \
33 $$(OPIEDIR)/noncore/settings/mediummount/mediumwidget.h \ 34 $$(OPIEDIR)/noncore/settings/mediummount/mediumwidget.h \
34 mediadlg.h 35 mediadlg.h
35 36
36 SOURCES += server.cpp \ 37 SOURCES += server.cpp \
38 qrr.cpp \
37 serverinterface.cpp \ 39 serverinterface.cpp \
38 launchertab.cpp \ 40 launchertab.cpp \
39 documentlist.cpp \ 41 documentlist.cpp \
40 appicons.cpp \ 42 appicons.cpp \
41 taskbar.cpp \ 43 taskbar.cpp \
42 runningappbar.cpp \ 44 runningappbar.cpp \
43 applauncher.cpp \ 45 applauncher.cpp \
44 stabmon.cpp \ 46 stabmon.cpp \
45 inputmethods.cpp \ 47 inputmethods.cpp \
46 systray.cpp \ 48 systray.cpp \
47 wait.cpp \ 49 wait.cpp \
48 shutdownimpl.cpp \ 50 shutdownimpl.cpp \
49 launcher.cpp \ 51 launcher.cpp \
50 launcherview.cpp \ 52 launcherview.cpp \
51 $$(OPIEDIR)/core/apps/calibrate/calibrate.cpp \ 53 $$(OPIEDIR)/core/apps/calibrate/calibrate.cpp \
52 transferserver.cpp \ 54 transferserver.cpp \
53 packageslave.cpp \ 55 packageslave.cpp \
54 irserver.cpp \ 56 irserver.cpp \
55 qcopbridge.cpp \ 57 qcopbridge.cpp \
56 startmenu.cpp \ 58 startmenu.cpp \
57 main.cpp \ 59 main.cpp \
58 firstuse.cpp \ 60 firstuse.cpp \
59 syncdialog.cpp \ 61 syncdialog.cpp \
60 serverapp.cpp \ 62 serverapp.cpp \
61 qprocess.cpp \ 63 qprocess.cpp \
62 qprocess_unix.cpp \ 64 qprocess_unix.cpp \
63 screensaver.cpp \ 65 screensaver.cpp \
64 $$(OPIEDIR)/noncore/settings/mediummount/mediumwidget.cc \ 66 $$(OPIEDIR)/noncore/settings/mediummount/mediumwidget.cc \
65 mediadlg.cpp 67 mediadlg.cpp
66 68
67 69
68INCLUDEPATH += $(OPIEDIR)/core/apps/calibrate 70INCLUDEPATH += $(OPIEDIR)/core/apps/calibrate
69 DEPENDPATH+= $(OPIEDIR)/core/apps/calibrate 71 DEPENDPATH+= $(OPIEDIR)/core/apps/calibrate
70 72
71INCLUDEPATH += $(OPIEDIR)/include $(OPIEDIR)/rsync 73INCLUDEPATH += $(OPIEDIR)/include $(OPIEDIR)/rsync
72 DEPENDPATH+= $(OPIEDIR)/rsync 74 DEPENDPATH+= $(OPIEDIR)/rsync
73 75
74INCLUDEPATH += $(OPIEDIR)/noncore/settings/mediummount 76INCLUDEPATH += $(OPIEDIR)/noncore/settings/mediummount
75DEPENDPATH += $(OPIEDIR)/noncore/settings/mediummount 77DEPENDPATH += $(OPIEDIR)/noncore/settings/mediummount
76 78
77LIBS += -lqpe -lopiecore2 -lopieui2 -lopiesecurity2 -lqrsync 79LIBS += -lqpe -lopiecore2 -lopieui2 -lopiesecurity2 -lqrsync
78TARGET = qpe 80TARGET = qpe
79 81
82## not ready for use yet
83# DEFINES += QPE_HAVE_DIRECT_ACCESS
84
80contains( $(CONFIG_TARGET_MACOSX), y ) { 85contains( $(CONFIG_TARGET_MACOSX), y ) {
81 LIBS += -lcrypt 86 LIBS += -lcrypt
82} 87}
83 88
84include ( $(OPIEDIR)/include.pro ) 89include ( $(OPIEDIR)/include.pro )
diff --git a/core/launcher/serverapp.cpp b/core/launcher/serverapp.cpp
index 66cc788..fac52a6 100644
--- a/core/launcher/serverapp.cpp
+++ b/core/launcher/serverapp.cpp
@@ -31,92 +31,94 @@
31 31
32#ifdef Q_WS_QWS 32#ifdef Q_WS_QWS
33#include <qtopia/qcopenvelope_qws.h> 33#include <qtopia/qcopenvelope_qws.h>
34#endif 34#endif
35#include <qtopia/global.h> 35#include <qtopia/global.h>
36using namespace Opie::Core; 36using namespace Opie::Core;
37 37
38/* QT */ 38/* QT */
39#ifdef Q_WS_QWS 39#ifdef Q_WS_QWS
40#include <qgfx_qws.h> 40#include <qgfx_qws.h>
41#endif 41#endif
42#include <qmessagebox.h> 42#include <qmessagebox.h>
43#include <qtimer.h> 43#include <qtimer.h>
44#include <qpainter.h> 44#include <qpainter.h>
45#include <qfile.h> 45#include <qfile.h>
46#include <qpixmapcache.h> 46#include <qpixmapcache.h>
47 47
48/* STD */ 48/* STD */
49#ifdef Q_OS_WIN32 49#ifdef Q_OS_WIN32
50#include <io.h> 50#include <io.h>
51#include <process.h> 51#include <process.h>
52#else 52#else
53#include <unistd.h> 53#include <unistd.h>
54#endif 54#endif
55#include <stdlib.h> 55#include <stdlib.h>
56 56
57static ServerApplication *serverApp = 0; 57static ServerApplication *serverApp = 0;
58static int loggedin=0; 58static int loggedin=0;
59 59
60QCopKeyRegister::QCopKeyRegister() 60QCopKeyRegister::QCopKeyRegister()
61 : m_keyCode( 0 ) 61 : m_keyCode( 0 )
62{ 62{
63odebug << "KeyRegister1 " << m_keyCode << oendl;
63} 64}
64 65
65QCopKeyRegister::QCopKeyRegister( int k, const QCString& c, const QCString& m ) 66QCopKeyRegister::QCopKeyRegister( int k, const QCString& c, const QCString& m )
66 :m_keyCode( k ), m_channel( c ), m_message( m ) 67 :m_keyCode( k ), m_channel( c ), m_message( m )
67{ 68{
69odebug << "keyRegister2 " << m_keyCode << c << m << oendl;
68} 70}
69 71
70int QCopKeyRegister::keyCode() const 72int QCopKeyRegister::keyCode() const
71{ 73{
72 return m_keyCode; 74 return m_keyCode;
73} 75}
74 76
75QCString QCopKeyRegister::channel() const 77QCString QCopKeyRegister::channel() const
76{ 78{
77 return m_channel; 79 return m_channel;
78} 80}
79 81
80QCString QCopKeyRegister::message() const 82QCString QCopKeyRegister::message() const
81{ 83{
82 return m_message; 84 return m_message;
83} 85}
84 86
85bool QCopKeyRegister::send() 87bool QCopKeyRegister::send()
86{ 88{
87 if (m_channel.isNull() ) 89 if (m_channel.isNull() )
88 return false; 90 return false;
89 91qDebug("Send Message: "+m_channel+" "+m_message);
90 QCopEnvelope( m_channel, m_message ); 92 QCopEnvelope e( m_channel, m_message );
91 93
92 return true; 94 return true;
93} 95}
94 96
95//--------------------------------------------------------------------------- 97//---------------------------------------------------------------------------
96 98
97/* 99/*
98 Priority is number of alerts that are needed to pop up 100 Priority is number of alerts that are needed to pop up
99 alert. 101 alert.
100 */ 102 */
101class DesktopPowerAlerter : public QMessageBox 103class DesktopPowerAlerter : public QMessageBox
102{ 104{
103 Q_OBJECT 105 Q_OBJECT
104public: 106public:
105 DesktopPowerAlerter( QWidget *parent, const char *name = 0 ) 107 DesktopPowerAlerter( QWidget *parent, const char *name = 0 )
106 : QMessageBox( tr("Battery Status"), tr("Low Battery"), 108 : QMessageBox( tr("Battery Status"), tr("Low Battery"),
107 QMessageBox::Critical, 109 QMessageBox::Critical,
108 QMessageBox::Ok | QMessageBox::Default, 110 QMessageBox::Ok | QMessageBox::Default,
109 QMessageBox::NoButton, QMessageBox::NoButton, 111 QMessageBox::NoButton, QMessageBox::NoButton,
110 parent, name, FALSE ) 112 parent, name, FALSE )
111 { 113 {
112 currentPriority = INT_MAX; 114 currentPriority = INT_MAX;
113 alertCount = 0; 115 alertCount = 0;
114 } 116 }
115 117
116 void alert( const QString &text, int priority ); 118 void alert( const QString &text, int priority );
117 void hideEvent( QHideEvent * ); 119 void hideEvent( QHideEvent * );
118private: 120private:
119 int currentPriority; 121 int currentPriority;
120 int alertCount; 122 int alertCount;
121}; 123};
122 124
@@ -136,64 +138,65 @@ void DesktopPowerAlerter::alert( const QString &text, int priority )
136void DesktopPowerAlerter::hideEvent( QHideEvent *e ) 138void DesktopPowerAlerter::hideEvent( QHideEvent *e )
137{ 139{
138 QMessageBox::hideEvent( e ); 140 QMessageBox::hideEvent( e );
139 alertCount = 0; 141 alertCount = 0;
140 currentPriority = INT_MAX; 142 currentPriority = INT_MAX;
141} 143}
142 144
143//--------------------------------------------------------------------------- 145//---------------------------------------------------------------------------
144 146
145KeyFilter::KeyFilter(QObject* parent) : QObject(parent), held_tid(0), heldButton(0) 147KeyFilter::KeyFilter(QObject* parent) : QObject(parent), held_tid(0), heldButton(0)
146{ 148{
147 /* We don't do this cause it would interfere with ODevice */ 149 /* We don't do this cause it would interfere with ODevice */
148#if 0 150#if 0
149 qwsServer->setKeyboardFilter(this); 151 qwsServer->setKeyboardFilter(this);
150#endif 152#endif
151} 153}
152 154
153void KeyFilter::timerEvent(QTimerEvent* e) 155void KeyFilter::timerEvent(QTimerEvent* e)
154{ 156{
155 if ( e->timerId() == held_tid ) { 157 if ( e->timerId() == held_tid ) {
156 killTimer(held_tid); 158 killTimer(held_tid);
157 // button held 159 // button held
158 if ( heldButton ) { 160 if ( heldButton ) {
159 emit activate(heldButton, TRUE); 161 emit activate(heldButton, TRUE);
160 heldButton = 0; 162 heldButton = 0;
161 } 163 }
162 held_tid = 0; 164 held_tid = 0;
163 } 165 }
164} 166}
165 167
166void KeyFilter::registerKey( const QCopKeyRegister& key ) 168void KeyFilter::registerKey( const QCopKeyRegister& key )
167{ 169{
170odebug << "KeyFilter::registerKey " << key.keyCode() << key.channel() << key.message() << oendl;
168 m_keys.insert( key.keyCode(), key ); 171 m_keys.insert( key.keyCode(), key );
169} 172}
170 173
171void KeyFilter::unregisterKey( const QCopKeyRegister& key ) 174void KeyFilter::unregisterKey( const QCopKeyRegister& key )
172{ 175{
173 m_keys.remove( key.keyCode() ); 176 m_keys.remove( key.keyCode() );
174} 177}
175 178
176bool KeyFilter::keyRegistered( int key ) 179bool KeyFilter::keyRegistered( int key )
177{ 180{
178 /* 181 /*
179 * Check if we've a key registered 182 * Check if we've a key registered
180 */ 183 */
181 if ( !m_keys[key].send()) 184 if ( !m_keys[key].send())
182 return false; 185 return false;
183 else 186 else
184 return true; 187 return true;
185} 188}
186 189
187bool KeyFilter::checkButtonAction(bool db, int keycode, int press, int autoRepeat) 190bool KeyFilter::checkButtonAction(bool db, int keycode, int press, int autoRepeat)
188{ 191{
189 if ( !loggedin 192 if ( !loggedin
190 // Permitted keys 193 // Permitted keys
191 && keycode != Key_F34 // power 194 && keycode != Key_F34 // power
192 && keycode != Key_F30 // select 195 && keycode != Key_F30 // select
193 && keycode != Key_Enter 196 && keycode != Key_Enter
194 && keycode != Key_Return 197 && keycode != Key_Return
195 && keycode != Key_Space 198 && keycode != Key_Space
196 && keycode != Key_Left 199 && keycode != Key_Left
197 && keycode != Key_Right 200 && keycode != Key_Right
198 && keycode != Key_Up 201 && keycode != Key_Up
199 && keycode != Key_Down ) 202 && keycode != Key_Down )