summaryrefslogtreecommitdiff
path: root/library/global.cpp
Unidiff
Diffstat (limited to 'library/global.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--library/global.cpp165
1 files changed, 124 insertions, 41 deletions
diff --git a/library/global.cpp b/library/global.cpp
index ab27b3f..7438891 100644
--- a/library/global.cpp
+++ b/library/global.cpp
@@ -1,7 +1,7 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved. 2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of Qtopia Environment. 4** This file is part of the Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
@@ -45,7 +45,9 @@
45#include <fcntl.h> 45#include <fcntl.h>
46#include <unistd.h> 46#include <unistd.h>
47 47
48#ifdef QWS
48#include <qwindowsystem_qws.h> // for qwsServer 49#include <qwindowsystem_qws.h> // for qwsServer
50#endif
49#include <qdatetime.h> 51#include <qdatetime.h>
50 52
51#include <qfile.h> 53#include <qfile.h>
@@ -56,7 +58,7 @@ namespace {
56 QFile file(path ); 58 QFile file(path );
57 if(!file.open(IO_ReadOnly ) ) 59 if(!file.open(IO_ReadOnly ) )
58 return true; 60 return true;
59 61
60 QByteArray array = file.readAll(); 62 QByteArray array = file.readAll();
61 QStringList list = QStringList::split('\n', QString( array ) ); 63 QStringList list = QStringList::split('\n', QString( array ) );
62 for(QStringList::Iterator it = list.begin(); it != list.end(); ++it ){ 64 for(QStringList::Iterator it = list.begin(); it != list.end(); ++it ){
@@ -108,11 +110,13 @@ StartingAppList* StartingAppList::appl = 0;
108StartingAppList::StartingAppList( QObject *parent, const char* name ) 110StartingAppList::StartingAppList( QObject *parent, const char* name )
109 :QObject( parent, name ) 111 :QObject( parent, name )
110{ 112{
113#ifdef QWS
111#if QT_VERSION >= 232 && !defined(QT_NO_COP) 114#if QT_VERSION >= 232 && !defined(QT_NO_COP)
112 connect( qwsServer, SIGNAL( newChannel(const QString&)), 115 connect( qwsServer, SIGNAL( newChannel(const QString&)),
113 this, SLOT( handleNewChannel(const QString&)) ); 116 this, SLOT( handleNewChannel(const QString&)) );
114 dict.setAutoDelete( TRUE ); 117 dict.setAutoDelete( TRUE );
115#endif 118#endif
119#endif
116} 120}
117 121
118void StartingAppList::add( const QString& name ) 122void StartingAppList::add( const QString& name )
@@ -169,7 +173,55 @@ static QString dictDir()
169 173
170/*! 174/*!
171 \class Global global.h 175 \class Global global.h
172 \brief The Global class collects application-wide global functions. 176 \brief The Global class provides application-wide global functions.
177
178 The Global functions are grouped as follows:
179 \tableofcontents
180
181 \section1 User Interface
182
183 The statusMessage() function provides short-duration messages to the
184 user. The showInputMethod() function shows the current input method,
185 and hideInputMethod() hides the input method.
186
187 \section1 Document related
188
189 The findDocuments() function creates a set of \link doclnk.html
190 DocLnk\endlink objects in a particular folder.
191
192 \section1 Filesystem related
193
194 Global provides an applicationFileName() function that returns the
195 full path of an application-specific file.
196
197 The execute() function runs an application.
198
199 \section1 Word list related
200
201 A list of words relevant to the current locale is maintained by the
202 system. The list is held in a \link qdawg.html DAWG\endlink
203 (implemented by the QDawg class). This list is used, for example, by
204 the pickboard input method.
205
206 The global QDawg is returned by fixedDawg(); this cannot be updated.
207 An updatable copy of the global QDawg is returned by addedDawg().
208 Applications may have their own word lists stored in \l{QDawg}s
209 which are returned by dawg(). Use addWords() to add words to the
210 updateable copy of the global QDawg or to named application
211 \l{QDawg}s.
212
213 \section1 Quoting
214
215 The shellQuote() function quotes a string suitable for passing to a
216 shell. The stringQuote() function backslash escapes '\' and '"'
217 characters.
218
219 \section1 Hardware
220
221 The writeHWClock() function sets the hardware clock to the system
222 clock's date and time.
223
224 \ingroup qtopiaemb
173*/ 225*/
174 226
175/*! 227/*!
@@ -252,7 +304,7 @@ const QDawg& Global::dawg(const QString& name)
252 if ( !r ) { 304 if ( !r ) {
253 r = new QDawg; 305 r = new QDawg;
254 named_dawg->insert(name,r); 306 named_dawg->insert(name,r);
255 QString dawgfilename = dictDir() + "/" + name + ".dawg"; 307 QString dawgfilename = applicationFileName("Dictionary", name ) + ".dawg";
256 QFile dawgfile(dawgfilename); 308 QFile dawgfile(dawgfilename);
257 if ( dawgfile.open(IO_ReadOnly) ) 309 if ( dawgfile.open(IO_ReadOnly) )
258 r->readFile(dawgfilename); 310 r->readFile(dawgfilename);
@@ -261,7 +313,12 @@ const QDawg& Global::dawg(const QString& name)
261} 313}
262 314
263/*! 315/*!
316 \overload
264 Adds \a wordlist to the addedDawg(). 317 Adds \a wordlist to the addedDawg().
318
319 Note that the addition of words persists between program executions
320 (they are saved in the dictionary files), so you should confirm the
321 words with the user before adding them.
265*/ 322*/
266void Global::addWords(const QStringList& wordlist) 323void Global::addWords(const QStringList& wordlist)
267{ 324{
@@ -269,7 +326,12 @@ void Global::addWords(const QStringList& wordlist)
269} 326}
270 327
271/*! 328/*!
272 Adds \a wordlist to the dawg() named \a dictname. 329 \overload
330 Adds \a wordlist to the addedDawg().
331
332 Note that the addition of words persists between program executions
333 (they are saved in the dictionary files), so you should confirm the
334 words with the user before adding them.
273*/ 335*/
274void Global::addWords(const QString& dictname, const QStringList& wordlist) 336void Global::addWords(const QString& dictname, const QStringList& wordlist)
275{ 337{
@@ -277,7 +339,7 @@ void Global::addWords(const QString& dictname, const QStringList& wordlist)
277 QStringList all = d.allWords() + wordlist; 339 QStringList all = d.allWords() + wordlist;
278 d.createFromWords(all); 340 d.createFromWords(all);
279 341
280 QString dawgfilename = dictDir() + "/" + dictname + ".dawg"; 342 QString dawgfilename = applicationFileName("Dictionary", dictname) + ".dawg";
281 QFile dawgfile(dawgfilename); 343 QFile dawgfile(dawgfilename);
282 if ( dawgfile.open(IO_WriteOnly) ) { 344 if ( dawgfile.open(IO_WriteOnly) ) {
283 d.write(&dawgfile); 345 d.write(&dawgfile);
@@ -291,11 +353,11 @@ void Global::addWords(const QString& dictname, const QStringList& wordlist)
291 353
292 354
293/*! 355/*!
294 Returns a full path for the application named \a appname, with the 356 Returns the full path for the application called \a appname, with the
295 given \a filename or QString::null if there was a problem creating 357 given \a filename. Returns QString::null if there was a problem creating
296 the directory tree for \a appname. 358 the directory tree for \a appname.
297 If \a filename contains "/", it is the caller's responsibility to 359 If \a filename contains "/", it is the caller's responsibility to
298 ensure those directories exist. 360 ensure that those directories exist.
299*/ 361*/
300QString Global::applicationFileName(const QString& appname, const QString& filename) 362QString Global::applicationFileName(const QString& appname, const QString& filename)
301{ 363{
@@ -326,8 +388,8 @@ void Global::createDocDir()
326 388
327 389
328/*! 390/*!
329 Displays a status \a message to the user. This generally appears 391 Displays a status \a message to the user. This usually appears
330 in the taskbar for some amount of time, then disappears. 392 in the taskbar for a short amount of time, then disappears.
331*/ 393*/
332void Global::statusMessage(const QString& message) 394void Global::statusMessage(const QString& message)
333{ 395{
@@ -373,6 +435,13 @@ QWidget *Global::restart( bool )
373 435
374/*! 436/*!
375 Explicitly show the current input method. 437 Explicitly show the current input method.
438
439 Input methods are indicated in the taskbar by a small icon. If the
440 input method is activated (shown) then it takes up some proportion
441 of the bottom of the screen, to allow the user to interact (input
442 characters) with it.
443
444 \sa hideInputMethod()
376*/ 445*/
377void Global::showInputMethod() 446void Global::showInputMethod()
378{ 447{
@@ -383,6 +452,11 @@ void Global::showInputMethod()
383 452
384/*! 453/*!
385 Explicitly hide the current input method. 454 Explicitly hide the current input method.
455
456 The current input method is still indicated in the taskbar, but no
457 longer takes up screen space, and can no longer be interacted with.
458
459 \sa showInputMethod()
386*/ 460*/
387void Global::hideInputMethod() 461void Global::hideInputMethod()
388{ 462{
@@ -465,16 +539,22 @@ void Global::terminate( const AppLnk* app )
465{ 539{
466 //if ( terminateBuiltin(app->exec()) ) return; // maybe? haven't tried this 540 //if ( terminateBuiltin(app->exec()) ) return; // maybe? haven't tried this
467 541
542#ifndef QT_NO_COP
468 QCString channel = "QPE/Application/" + app->exec().utf8(); 543 QCString channel = "QPE/Application/" + app->exec().utf8();
469 if ( QCopChannel::isRegistered(channel) ) { 544 if ( QCopChannel::isRegistered(channel) ) {
470 QCopEnvelope e(channel, "quit()"); 545 QCopEnvelope e(channel, "quit()");
471 } 546 }
547#endif
472} 548}
473 549
474/*! 550/*!
475 Low-level function to run command \a c. Not recommended. 551 Low-level function to run command \a c.
552
553 \warning Do not use this function. Use execute instead.
554
555 \sa execute()
476*/ 556*/
477void Global::invoke(const QString &c) 557void Global::invoke(const QString &c)
478{ 558{
479 // Convert the command line in to a list of arguments 559 // Convert the command line in to a list of arguments
480 QStringList list = QStringList::split(QRegExp(" *"),c); 560 QStringList list = QStringList::split(QRegExp(" *"),c);
@@ -482,13 +562,13 @@ void Global::invoke(const QString &c)
482#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 562#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
483 QString ap=list[0]; 563 QString ap=list[0];
484 // see if the application is already running 564 // see if the application is already running
485 // XXX should lock file /tmp/qcop-msg-ap 565 // XXX should lock file /tmp/qcop-msg-ap
486 if ( QCopChannel::isRegistered( ("QPE/Application/" + ap).latin1() ) ) { 566 if ( QCopChannel::isRegistered( ("QPE/Application/" + ap).latin1() ) ) {
487 QCopEnvelope e("QPE/System", "notBusy(QString)" ); 567 QCopEnvelope e("QPE/System", "notBusy(QString)" );
488 e << ap; 568 e << ap;
489 return; 569 return;
490 } 570 }
491 // XXX should unlock file /tmp/qcop-msg-ap 571 // XXX should unlock file /tmp/qcop-msg-ap
492 //see if it is being started 572 //see if it is being started
493 if ( StartingAppList::isStarting( ap ) ) { 573 if ( StartingAppList::isStarting( ap ) ) {
494 QCopEnvelope e("QPE/System", "notBusy(QString)" ); 574 QCopEnvelope e("QPE/System", "notBusy(QString)" );
@@ -524,7 +604,7 @@ void Global::invoke(const QString &c)
524 if ( QFile::exists( libexe ) ) { 604 if ( QFile::exists( libexe ) ) {
525 qDebug("calling quickexec %s", libexe.latin1() ); 605 qDebug("calling quickexec %s", libexe.latin1() );
526 quickexecv( libexe.utf8().data(), (const char **)args ); 606 quickexecv( libexe.utf8().data(), (const char **)args );
527 } else 607 } else
528#endif 608#endif
529 { 609 {
530 if ( !::vfork() ) { 610 if ( !::vfork() ) {
@@ -541,11 +621,13 @@ void Global::invoke(const QString &c)
541#endif //QT_NO_QWS_MULTIPROCESS 621#endif //QT_NO_QWS_MULTIPROCESS
542} 622}
543 623
624
544/*! 625/*!
545 Executes application identfied by \a c, passing \a document. 626 Executes the application identfied by \a c, passing \a
627 document if it isn't null.
546 628
547 Note that you might be better off sending a QCop message to 629 Note that a better approach might be to send a QCop message to the
548 the application's QPE/Application/<i>appname</i> channel. 630 application's QPE/Application/\e{appname} channel.
549*/ 631*/
550void Global::execute( const QString &c, const QString& document ) 632void Global::execute( const QString &c, const QString& document )
551{ 633{
@@ -577,8 +659,10 @@ void Global::execute( const QString &c, const QString& document )
577 } else { 659 } else {
578 running[i] = builtin[i].func( builtin[i].maximized ); 660 running[i] = builtin[i].func( builtin[i].maximized );
579 } 661 }
662#ifndef QT_NO_COP
580 QCopEnvelope e("QPE/System", "notBusy(QString)" ); 663 QCopEnvelope e("QPE/System", "notBusy(QString)" );
581 e << c; // that was quick ;-) 664 e << c; // that was quick ;-)
665#endif
582 return; 666 return;
583 } 667 }
584 } 668 }
@@ -594,13 +678,14 @@ void Global::execute( const QString &c, const QString& document )
594 678
595 qDebug("executing %s", ap.latin1() ); 679 qDebug("executing %s", ap.latin1() );
596 if ( ap == "suspend" ) { 680 if ( ap == "suspend" ) {
597 QWSServer::sendKeyEvent( 0xffff, Qt::Key_F34, FALSE, TRUE, FALSE ); 681 QWSServer::sendKeyEvent( 0xffff, Qt::Key_F34, FALSE, TRUE, FALSE );
598 return; 682 return;
599 } 683 }
600 684
601 /* if need be, sending a qcop message will result in an invoke, see 685 /* if need be, sending a qcop message will result in an invoke, see
602 preceeding function */ 686 preceeding function */
603 { QCopEnvelope env( ("QPE/Application/" + ap).latin1(), "raise()" ); } 687 invoke( ap );
688 //{ QCopEnvelope env( ("QPE/Application/" + ap).latin1(), "raise()" ); }
604 if ( !document.isEmpty() ) { 689 if ( !document.isEmpty() ) {
605 QCopEnvelope env( ("QPE/Application/" + ap).latin1(), "setDocument(QString)" ); 690 QCopEnvelope env( ("QPE/Application/" + ap).latin1(), "setDocument(QString)" );
606 env << document; 691 env << document;
@@ -609,8 +694,10 @@ void Global::execute( const QString &c, const QString& document )
609} 694}
610 695
611/*! 696/*!
612 Returns the string \a s with the characters backslash, ", and $ 697 Returns the string \a s with the characters '\', '"', and '$' quoted
613 quoted by a preceeding backslash. 698 by a preceeding '\'.
699
700 \sa stringQuote()
614*/ 701*/
615QString Global::shellQuote(const QString& s) 702QString Global::shellQuote(const QString& s)
616{ 703{
@@ -628,8 +715,10 @@ QString Global::shellQuote(const QString& s)
628} 715}
629 716
630/*! 717/*!
631 Returns the string \a s with the characters backslash and " 718 Returns the string \a s with the characters '\' and '"' quoted by a
632 quoted by a preceeding backslash. 719 preceeding '\'.
720
721 \sa shellQuote()
633*/ 722*/
634QString Global::stringQuote(const QString& s) 723QString Global::stringQuote(const QString& s)
635{ 724{
@@ -661,8 +750,8 @@ void Global::findDocuments(DocLnkSet* folder, const QString &mimefilter)
661 * b) the user wants to check but use the global options for it 750 * b) the user wants to check but use the global options for it
662 * c) the user wants to check it but not this medium 751 * c) the user wants to check it but not this medium
663 * d) the user wants to check and this medium as well 752 * d) the user wants to check and this medium as well
664 * 753 *
665 * In all cases we need to apply a different mimefilter to 754 * In all cases we need to apply a different mimefilter to
666 * the medium. 755 * the medium.
667 * a) mimefilter.isEmpty() we need to apply the responding filter 756 * a) mimefilter.isEmpty() we need to apply the responding filter
668 * either the global or the one on the medium 757 * either the global or the one on the medium
@@ -675,7 +764,7 @@ void Global::findDocuments(DocLnkSet* folder, const QString &mimefilter)
675 QListIterator<FileSystem> it ( fs ); 764 QListIterator<FileSystem> it ( fs );
676 for ( ; it.current(); ++it ) { 765 for ( ; it.current(); ++it ) {
677 if ( (*it)->isRemovable() ) { // let's find out if we should search on it 766 if ( (*it)->isRemovable() ) { // let's find out if we should search on it
678 // this is a candidate look at the cf and see if we should search on it 767 // this is a candidate look at the cf and see if we should search on it
679 QString path = (*it)->path(); 768 QString path = (*it)->path();
680 if( !checkStorage((*it)->path() + "/.opiestorage.cf" ) ) 769 if( !checkStorage((*it)->path() + "/.opiestorage.cf" ) )
681 continue; 770 continue;
@@ -713,16 +802,10 @@ QStringList Global::helpPath()
713 path += QPEApplication::qpeDir() + "/help/" + lang + "/html"; 802 path += QPEApplication::qpeDir() + "/help/" + lang + "/html";
714 } 803 }
715 path += QPEApplication::qpeDir() + "/pics"; 804 path += QPEApplication::qpeDir() + "/pics";
716 path += QPEApplication::qpeDir() + "/help/en/html"; 805 path += QPEApplication::qpeDir() + "/help/html";
717 path += QPEApplication::qpeDir() + "/docs"; 806 path += QPEApplication::qpeDir() + "/docs";
718 QString dir = QDir::current().canonicalPath(); 807
719 if ( dir == "/" ) 808
720 dir += "/docs";
721 else {
722 path += dir + "/../pics";
723 dir += "/../docs";
724 path += dir;
725 }
726 return path; 809 return path;
727} 810}
728 811