summaryrefslogtreecommitdiff
path: root/library/global.cpp
Unidiff
Diffstat (limited to 'library/global.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--library/global.cpp24
1 files changed, 16 insertions, 8 deletions
diff --git a/library/global.cpp b/library/global.cpp
index ce39751..189b830 100644
--- a/library/global.cpp
+++ b/library/global.cpp
@@ -1,849 +1,857 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. 2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of the Qtopia Environment. 4** This file is part of the Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20#define QTOPIA_INTERNAL_LANGLIST 20#define QTOPIA_INTERNAL_LANGLIST
21#include <qpe/qpedebug.h> 21#include <qpe/qpedebug.h>
22#include <qpe/global.h> 22#include <qpe/global.h>
23#include <qpe/qdawg.h> 23#include <qpe/qdawg.h>
24#include <qpe/qpeapplication.h> 24#include <qpe/qpeapplication.h>
25#include <qpe/resource.h> 25#include <qpe/resource.h>
26#include <qpe/storage.h> 26#include <qpe/storage.h>
27#include <qpe/applnk.h> 27#include <qpe/applnk.h>
28#include <qpe/qcopenvelope_qws.h> 28#include <qpe/qcopenvelope_qws.h>
29 29
30#include <qfile.h> 30#include <qfile.h>
31#include <qlabel.h> 31#include <qlabel.h>
32#include <qtimer.h> 32#include <qtimer.h>
33#include <qmap.h> 33#include <qmap.h>
34#include <qdict.h> 34#include <qdict.h>
35#include <qdir.h> 35#include <qdir.h>
36#include <qmessagebox.h> 36#include <qmessagebox.h>
37#include <qregexp.h> 37#include <qregexp.h>
38 38
39#include <stdlib.h> 39#include <stdlib.h>
40#include <sys/stat.h> 40#include <sys/stat.h>
41#include <sys/wait.h> 41#include <sys/wait.h>
42#include <sys/types.h> 42#include <sys/types.h>
43#include <fcntl.h> 43#include <fcntl.h>
44#include <unistd.h> 44#include <unistd.h>
45#include <errno.h> 45#include <errno.h>
46 46
47#include <qwindowsystem_qws.h> // for qwsServer 47#include <qwindowsystem_qws.h> // for qwsServer
48#include <qdatetime.h> 48#include <qdatetime.h>
49 49
50#include <qfile.h> 50#include <qfile.h>
51 51
52namespace { 52namespace {
53 // checks if the storage should be searched 53 // checks if the storage should be searched
54 bool checkStorage(const QString &path ){ // this is a small Config replacement cause config is too limited -zecke 54 bool checkStorage(const QString &path ){ // this is a small Config replacement cause config is too limited -zecke
55 QFile file(path ); 55 QFile file(path );
56 if(!file.open(IO_ReadOnly ) ) 56 if(!file.open(IO_ReadOnly ) )
57 return true; 57 return true;
58 58
59 QByteArray array = file.readAll(); 59 QByteArray array = file.readAll();
60 QStringList list = QStringList::split('\n', QString( array ) ); 60 QStringList list = QStringList::split('\n', QString( array ) );
61 for(QStringList::Iterator it = list.begin(); it != list.end(); ++it ){ 61 for(QStringList::Iterator it = list.begin(); it != list.end(); ++it ){
62 if( (*it).startsWith("autocheck = 0" ) ){ 62 if( (*it).startsWith("autocheck = 0" ) ){
63 return false; 63 return false;
64 }else if( (*it).startsWith("autocheck = 1" ) ){ 64 }else if( (*it).startsWith("autocheck = 1" ) ){
65 return true; 65 return true;
66 } 66 }
67 } 67 }
68 return true; 68 return true;
69 } 69 }
70} 70}
71 71
72//#include "quickexec_p.h" 72//#include "quickexec_p.h"
73 73
74class Emitter : public QObject { 74class Emitter : public QObject {
75 Q_OBJECT 75 Q_OBJECT
76public: 76public:
77 Emitter( QWidget* receiver, const QString& document ) 77 Emitter( QWidget* receiver, const QString& document )
78 { 78 {
79 connect(this, SIGNAL(setDocument(const QString&)), 79 connect(this, SIGNAL(setDocument(const QString&)),
80 receiver, SLOT(setDocument(const QString&))); 80 receiver, SLOT(setDocument(const QString&)));
81 emit setDocument(document); 81 emit setDocument(document);
82 disconnect(this, SIGNAL(setDocument(const QString&)), 82 disconnect(this, SIGNAL(setDocument(const QString&)),
83 receiver, SLOT(setDocument(const QString&))); 83 receiver, SLOT(setDocument(const QString&)));
84 } 84 }
85 85
86signals: 86signals:
87 void setDocument(const QString&); 87 void setDocument(const QString&);
88}; 88};
89 89
90 90
91class StartingAppList : public QObject { 91class StartingAppList : public QObject {
92 Q_OBJECT 92 Q_OBJECT
93public: 93public:
94 static void add( const QString& name ); 94 static void add( const QString& name );
95 static bool isStarting( const QString name ); 95 static bool isStarting( const QString name );
96private slots: 96private slots:
97 void handleNewChannel( const QString &); 97 void handleNewChannel( const QString &);
98private: 98private:
99 StartingAppList( QObject *parent=0, const char* name=0 ) ; 99 StartingAppList( QObject *parent=0, const char* name=0 ) ;
100 100
101 QDict<QTime> dict; 101 QDict<QTime> dict;
102 static StartingAppList *appl; 102 static StartingAppList *appl;
103}; 103};
104 104
105StartingAppList* StartingAppList::appl = 0; 105StartingAppList* StartingAppList::appl = 0;
106 106
107StartingAppList::StartingAppList( QObject *parent, const char* name ) 107StartingAppList::StartingAppList( QObject *parent, const char* name )
108 :QObject( parent, name ) 108 :QObject( parent, name )
109{ 109{
110#if QT_VERSION >= 232 && defined(QWS) 110#if QT_VERSION >= 232 && defined(QWS)
111 connect( qwsServer, SIGNAL( newChannel(const QString&)), 111 connect( qwsServer, SIGNAL( newChannel(const QString&)),
112 this, SLOT( handleNewChannel(const QString&)) ); 112 this, SLOT( handleNewChannel(const QString&)) );
113#endif 113#endif
114 dict.setAutoDelete( TRUE ); 114 dict.setAutoDelete( TRUE );
115} 115}
116 116
117void StartingAppList::add( const QString& name ) 117void StartingAppList::add( const QString& name )
118{ 118{
119#if QT_VERSION >= 232 && !defined(QT_NO_COP) 119#if QT_VERSION >= 232 && !defined(QT_NO_COP)
120 if ( !appl ) 120 if ( !appl )
121 appl = new StartingAppList; 121 appl = new StartingAppList;
122 QTime *t = new QTime; 122 QTime *t = new QTime;
123 t->start(); 123 t->start();
124 appl->dict.insert( "QPE/Application/" + name, t ); 124 appl->dict.insert( "QPE/Application/" + name, t );
125#endif 125#endif
126} 126}
127 127
128bool StartingAppList::isStarting( const QString name ) 128bool StartingAppList::isStarting( const QString name )
129{ 129{
130#if QT_VERSION >= 232 && !defined(QT_NO_COP) 130#if QT_VERSION >= 232 && !defined(QT_NO_COP)
131 if ( appl ) { 131 if ( appl ) {
132 QTime *t = appl->dict.find( "QPE/Application/" + name ); 132 QTime *t = appl->dict.find( "QPE/Application/" + name );
133 if ( !t ) 133 if ( !t )
134 return FALSE; 134 return FALSE;
135 if ( t->elapsed() > 10000 ) { 135 if ( t->elapsed() > 10000 ) {
136 // timeout in case of crash or something 136 // timeout in case of crash or something
137 appl->dict.remove( "QPE/Application/" + name ); 137 appl->dict.remove( "QPE/Application/" + name );
138 return FALSE; 138 return FALSE;
139 } 139 }
140 return TRUE; 140 return TRUE;
141 } 141 }
142#endif 142#endif
143 return FALSE; 143 return FALSE;
144} 144}
145 145
146void StartingAppList::handleNewChannel( const QString & name ) 146void StartingAppList::handleNewChannel( const QString & name )
147{ 147{
148#if QT_VERSION >= 232 && !defined(QT_NO_COP) 148#if QT_VERSION >= 232 && !defined(QT_NO_COP)
149 dict.remove( name ); 149 dict.remove( name );
150#endif 150#endif
151} 151}
152 152
153static bool docDirCreated = FALSE; 153static bool docDirCreated = FALSE;
154static QDawg* fixed_dawg = 0; 154static QDawg* fixed_dawg = 0;
155static QDict<QDawg> *named_dawg = 0; 155static QDict<QDawg> *named_dawg = 0;
156 156
157static QString qpeDir() 157static QString qpeDir()
158{ 158{
159 QString dir = getenv("OPIEDIR"); 159 QString dir = getenv("OPIEDIR");
160 if ( dir.isEmpty() ) dir = ".."; 160 if ( dir.isEmpty() ) dir = "..";
161 return dir; 161 return dir;
162} 162}
163 163
164static QString dictDir() 164static QString dictDir()
165{ 165{
166 return qpeDir() + "/etc/dict"; 166 return qpeDir() + "/etc/dict";
167} 167}
168 168
169/*! 169/*!
170 \class Global global.h 170 \class Global global.h
171 \brief The Global class provides application-wide global functions. 171 \brief The Global class provides application-wide global functions.
172 172
173 The Global functions are grouped as follows: 173 The Global functions are grouped as follows:
174 \tableofcontents 174 \tableofcontents
175 175
176 \section1 User Interface 176 \section1 User Interface
177 177
178 The statusMessage() function provides short-duration messages to the 178 The statusMessage() function provides short-duration messages to the
179 user. The showInputMethod() function shows the current input method, 179 user. The showInputMethod() function shows the current input method,
180 and hideInputMethod() hides the input method. 180 and hideInputMethod() hides the input method.
181 181
182 \section1 Document related 182 \section1 Document related
183 183
184 The findDocuments() function creates a set of \link doclnk.html 184 The findDocuments() function creates a set of \link doclnk.html
185 DocLnk\endlink objects in a particular folder. 185 DocLnk\endlink objects in a particular folder.
186 186
187 \section1 Filesystem related 187 \section1 Filesystem related
188 188
189 Global provides an applicationFileName() function that returns the 189 Global provides an applicationFileName() function that returns the
190 full path of an application-specific file. 190 full path of an application-specific file.
191 191
192 The execute() function runs an application. 192 The execute() function runs an application.
193 193
194 \section1 Word list related 194 \section1 Word list related
195 195
196 A list of words relevant to the current locale is maintained by the 196 A list of words relevant to the current locale is maintained by the
197 system. The list is held in a \link qdawg.html DAWG\endlink 197 system. The list is held in a \link qdawg.html DAWG\endlink
198 (implemented by the QDawg class). This list is used, for example, by 198 (implemented by the QDawg class). This list is used, for example, by
199 the pickboard input method. 199 the pickboard input method.
200 200
201 The global QDawg is returned by fixedDawg(); this cannot be updated. 201 The global QDawg is returned by fixedDawg(); this cannot be updated.
202 An updatable copy of the global QDawg is returned by addedDawg(). 202 An updatable copy of the global QDawg is returned by addedDawg().
203 Applications may have their own word lists stored in \l{QDawg}s 203 Applications may have their own word lists stored in \l{QDawg}s
204 which are returned by dawg(). Use addWords() to add words to the 204 which are returned by dawg(). Use addWords() to add words to the
205 updateable copy of the global QDawg or to named application 205 updateable copy of the global QDawg or to named application
206 \l{QDawg}s. 206 \l{QDawg}s.
207 207
208 \section1 Quoting 208 \section1 Quoting
209 209
210 The shellQuote() function quotes a string suitable for passing to a 210 The shellQuote() function quotes a string suitable for passing to a
211 shell. The stringQuote() function backslash escapes '\' and '"' 211 shell. The stringQuote() function backslash escapes '\' and '"'
212 characters. 212 characters.
213 213
214 \section1 Hardware 214 \section1 Hardware
215 215
216 The writeHWClock() function sets the hardware clock to the system 216 The writeHWClock() function sets the hardware clock to the system
217 clock's date and time. 217 clock's date and time.
218 218
219 \ingroup qtopiaemb 219 \ingroup qtopiaemb
220*/ 220*/
221 221
222/*! 222/*!
223 \internal 223 \internal
224*/ 224*/
225Global::Global() 225Global::Global()
226{ 226{
227} 227}
228 228
229/*! 229/*!
230 Returns the unchangeable QDawg that contains general 230 Returns the unchangeable QDawg that contains general
231 words for the current locale. 231 words for the current locale.
232 232
233 \sa addedDawg() 233 \sa addedDawg()
234*/ 234*/
235const QDawg& Global::fixedDawg() 235const QDawg& Global::fixedDawg()
236{ 236{
237 if ( !fixed_dawg ) { 237 if ( !fixed_dawg ) {
238 if ( !docDirCreated ) 238 if ( !docDirCreated )
239 createDocDir(); 239 createDocDir();
240 240
241 fixed_dawg = new QDawg; 241 fixed_dawg = new QDawg;
242 QString dawgfilename = dictDir() + "/dawg"; 242 QString dawgfilename = dictDir() + "/dawg";
243 QString words_lang; 243 QString words_lang;
244 QStringList langs = Global::languageList(); 244 QStringList langs = Global::languageList();
245 for (QStringList::ConstIterator it = langs.begin(); it!=langs.end(); ++it) { 245 for (QStringList::ConstIterator it = langs.begin(); it!=langs.end(); ++it) {
246 QString lang = *it; 246 QString lang = *it;
247 words_lang = dictDir() + "/words." + lang; 247 words_lang = dictDir() + "/words." + lang;
248 QString dawgfilename_lang = dawgfilename + "." + lang; 248 QString dawgfilename_lang = dawgfilename + "." + lang;
249 if ( QFile::exists(dawgfilename_lang) || 249 if ( QFile::exists(dawgfilename_lang) ||
250 QFile::exists(words_lang) ) { 250 QFile::exists(words_lang) ) {
251 dawgfilename = dawgfilename_lang; 251 dawgfilename = dawgfilename_lang;
252 break; 252 break;
253 } 253 }
254 } 254 }
255 QFile dawgfile(dawgfilename); 255 QFile dawgfile(dawgfilename);
256 256
257 if ( !dawgfile.exists() ) { 257 if ( !dawgfile.exists() ) {
258 QString fn = dictDir() + "/words"; 258 QString fn = dictDir() + "/words";
259 if ( QFile::exists(words_lang) ) 259 if ( QFile::exists(words_lang) )
260 fn = words_lang; 260 fn = words_lang;
261 QFile in(fn); 261 QFile in(fn);
262 if ( in.open(IO_ReadOnly) ) { 262 if ( in.open(IO_ReadOnly) ) {
263 fixed_dawg->createFromWords(&in); 263 fixed_dawg->createFromWords(&in);
264 dawgfile.open(IO_WriteOnly); 264 dawgfile.open(IO_WriteOnly);
265 fixed_dawg->write(&dawgfile); 265 fixed_dawg->write(&dawgfile);
266 dawgfile.close(); 266 dawgfile.close();
267 } 267 }
268 } else { 268 } else {
269 fixed_dawg->readFile(dawgfilename); 269 fixed_dawg->readFile(dawgfilename);
270 } 270 }
271 } 271 }
272 272
273 return *fixed_dawg; 273 return *fixed_dawg;
274} 274}
275 275
276/*! 276/*!
277 Returns the changeable QDawg that contains general 277 Returns the changeable QDawg that contains general
278 words for the current locale. 278 words for the current locale.
279 279
280 \sa fixedDawg() 280 \sa fixedDawg()
281*/ 281*/
282const QDawg& Global::addedDawg() 282const QDawg& Global::addedDawg()
283{ 283{
284 return dawg("local"); 284 return dawg("local");
285} 285}
286 286
287/*! 287/*!
288 Returns the QDawg with the given \a name. 288 Returns the QDawg with the given \a name.
289 This is an application-specific word list. 289 This is an application-specific word list.
290 290
291 \a name should not contain "/". 291 \a name should not contain "/".
292*/ 292*/
293const QDawg& Global::dawg(const QString& name) 293const QDawg& Global::dawg(const QString& name)
294{ 294{
295 createDocDir(); 295 createDocDir();
296 if ( !named_dawg ) 296 if ( !named_dawg )
297 named_dawg = new QDict<QDawg>; 297 named_dawg = new QDict<QDawg>;
298 QDawg* r = named_dawg->find(name); 298 QDawg* r = named_dawg->find(name);
299 if ( !r ) { 299 if ( !r ) {
300 r = new QDawg; 300 r = new QDawg;
301 named_dawg->insert(name,r); 301 named_dawg->insert(name,r);
302 QString dawgfilename = applicationFileName("Dictionary", name ) + ".dawg"; 302 QString dawgfilename = applicationFileName("Dictionary", name ) + ".dawg";
303 QFile dawgfile(dawgfilename); 303 QFile dawgfile(dawgfilename);
304 if ( dawgfile.open(IO_ReadOnly) ) 304 if ( dawgfile.open(IO_ReadOnly) )
305 r->readFile(dawgfilename); 305 r->readFile(dawgfilename);
306 } 306 }
307 return *r; 307 return *r;
308} 308}
309 309
310/*! 310/*!
311 \overload 311 \overload
312 Adds \a wordlist to the addedDawg(). 312 Adds \a wordlist to the addedDawg().
313 313
314 Note that the addition of words persists between program executions 314 Note that the addition of words persists between program executions
315 (they are saved in the dictionary files), so you should confirm the 315 (they are saved in the dictionary files), so you should confirm the
316 words with the user before adding them. 316 words with the user before adding them.
317*/ 317*/
318void Global::addWords(const QStringList& wordlist) 318void Global::addWords(const QStringList& wordlist)
319{ 319{
320 addWords("local",wordlist); 320 addWords("local",wordlist);
321} 321}
322 322
323/*! 323/*!
324 \overload 324 \overload
325 Adds \a wordlist to the addedDawg(). 325 Adds \a wordlist to the addedDawg().
326 326
327 Note that the addition of words persists between program executions 327 Note that the addition of words persists between program executions
328 (they are saved in the dictionary files), so you should confirm the 328 (they are saved in the dictionary files), so you should confirm the
329 words with the user before adding them. 329 words with the user before adding them.
330*/ 330*/
331void Global::addWords(const QString& dictname, const QStringList& wordlist) 331void Global::addWords(const QString& dictname, const QStringList& wordlist)
332{ 332{
333 QDawg& d = (QDawg&)dawg(dictname); 333 QDawg& d = (QDawg&)dawg(dictname);
334 QStringList all = d.allWords() + wordlist; 334 QStringList all = d.allWords() + wordlist;
335 d.createFromWords(all); 335 d.createFromWords(all);
336 336
337 QString dawgfilename = applicationFileName("Dictionary", dictname) + ".dawg"; 337 QString dawgfilename = applicationFileName("Dictionary", dictname) + ".dawg";
338 QFile dawgfile(dawgfilename); 338 QFile dawgfile(dawgfilename);
339 if ( dawgfile.open(IO_WriteOnly) ) { 339 if ( dawgfile.open(IO_WriteOnly) ) {
340 d.write(&dawgfile); 340 d.write(&dawgfile);
341 dawgfile.close(); 341 dawgfile.close();
342 } 342 }
343 343
344 // #### Re-read the dawg here if we use mmap(). 344 // #### Re-read the dawg here if we use mmap().
345 345
346 // #### Signal other processes to re-read. 346 // #### Signal other processes to re-read.
347} 347}
348 348
349 349
350/*! 350/*!
351 Returns the full path for the application called \a appname, with the 351 Returns the full path for the application called \a appname, with the
352 given \a filename. Returns QString::null if there was a problem creating 352 given \a filename. Returns QString::null if there was a problem creating
353 the directory tree for \a appname. 353 the directory tree for \a appname.
354 If \a filename contains "/", it is the caller's responsibility to 354 If \a filename contains "/", it is the caller's responsibility to
355 ensure that those directories exist. 355 ensure that those directories exist.
356*/ 356*/
357QString Global::applicationFileName(const QString& appname, const QString& filename) 357QString Global::applicationFileName(const QString& appname, const QString& filename)
358{ 358{
359 QDir d; 359 QDir d;
360 QString r = getenv("HOME"); 360 QString r = getenv("HOME");
361 r += "/Applications/"; 361 r += "/Applications/";
362 if ( !QFile::exists( r ) ) 362 if ( !QFile::exists( r ) )
363 if ( d.mkdir(r) == false ) 363 if ( d.mkdir(r) == false )
364 return QString::null; 364 return QString::null;
365 r += appname; 365 r += appname;
366 if ( !QFile::exists( r ) ) 366 if ( !QFile::exists( r ) )
367 if ( d.mkdir(r) == false ) 367 if ( d.mkdir(r) == false )
368 return QString::null; 368 return QString::null;
369 r += "/"; r += filename; 369 r += "/"; r += filename;
370 return r; 370 return r;
371} 371}
372 372
373/*! 373/*!
374 \internal 374 \internal
375*/ 375*/
376void Global::createDocDir() 376void Global::createDocDir()
377{ 377{
378 if ( !docDirCreated ) { 378 if ( !docDirCreated ) {
379 docDirCreated = TRUE; 379 docDirCreated = TRUE;
380 mkdir( QPEApplication::documentDir().latin1(), 0755 ); 380 mkdir( QPEApplication::documentDir().latin1(), 0755 );
381 } 381 }
382} 382}
383 383
384 384
385/*! 385/*!
386 Displays a status \a message to the user. This usually appears 386 Displays a status \a message to the user. This usually appears
387 in the taskbar for a short amount of time, then disappears. 387 in the taskbar for a short amount of time, then disappears.
388*/ 388*/
389void Global::statusMessage(const QString& message) 389void Global::statusMessage(const QString& message)
390{ 390{
391#if !defined(QT_NO_COP) 391#if !defined(QT_NO_COP)
392 QCopEnvelope e( "QPE/TaskBar", "message(QString)" ); 392 QCopEnvelope e( "QPE/TaskBar", "message(QString)" );
393 e << message; 393 e << message;
394#endif 394#endif
395} 395}
396 396
397/*! 397/*!
398 \internal 398 \internal
399*/ 399*/
400void Global::applyStyle() 400void Global::applyStyle()
401{ 401{
402#if !defined(QT_NO_COP) 402#if !defined(QT_NO_COP)
403 QCopChannel::send( "QPE/System", "applyStyle()" ); 403 QCopChannel::send( "QPE/System", "applyStyle()" );
404#else 404#else
405 ((QPEApplication *)qApp)->applyStyle(); // apply without needing QCop for floppy version 405 ((QPEApplication *)qApp)->applyStyle(); // apply without needing QCop for floppy version
406#endif 406#endif
407} 407}
408 408
409/*! 409/*!
410 \internal 410 \internal
411*/ 411*/
412QWidget *Global::shutdown( bool ) 412QWidget *Global::shutdown( bool )
413{ 413{
414#if !defined(QT_NO_COP) 414#if !defined(QT_NO_COP)
415 QCopChannel::send( "QPE/System", "shutdown()" ); 415 QCopChannel::send( "QPE/System", "shutdown()" );
416#endif 416#endif
417 return 0; 417 return 0;
418} 418}
419 419
420/*! 420/*!
421 \internal 421 \internal
422*/ 422*/
423QWidget *Global::restart( bool ) 423QWidget *Global::restart( bool )
424{ 424{
425#if !defined(QT_NO_COP) 425#if !defined(QT_NO_COP)
426 QCopChannel::send( "QPE/System", "restart()" ); 426 QCopChannel::send( "QPE/System", "restart()" );
427#endif 427#endif
428 return 0; 428 return 0;
429} 429}
430 430
431/*! 431/*!
432 Explicitly show the current input method. 432 Explicitly show the current input method.
433 433
434 Input methods are indicated in the taskbar by a small icon. If the 434 Input methods are indicated in the taskbar by a small icon. If the
435 input method is activated (shown) then it takes up some proportion 435 input method is activated (shown) then it takes up some proportion
436 of the bottom of the screen, to allow the user to interact (input 436 of the bottom of the screen, to allow the user to interact (input
437 characters) with it. 437 characters) with it.
438 438
439 \sa hideInputMethod() 439 \sa hideInputMethod()
440*/ 440*/
441void Global::showInputMethod() 441void Global::showInputMethod()
442{ 442{
443#if !defined(QT_NO_COP) 443#if !defined(QT_NO_COP)
444 QCopChannel::send( "QPE/TaskBar", "showInputMethod()" ); 444 QCopChannel::send( "QPE/TaskBar", "showInputMethod()" );
445#endif 445#endif
446} 446}
447 447
448/*! 448/*!
449 Explicitly hide the current input method. 449 Explicitly hide the current input method.
450 450
451 The current input method is still indicated in the taskbar, but no 451 The current input method is still indicated in the taskbar, but no
452 longer takes up screen space, and can no longer be interacted with. 452 longer takes up screen space, and can no longer be interacted with.
453 453
454 \sa showInputMethod() 454 \sa showInputMethod()
455*/ 455*/
456void Global::hideInputMethod() 456void Global::hideInputMethod()
457{ 457{
458#if !defined(QT_NO_COP) 458#if !defined(QT_NO_COP)
459 QCopChannel::send( "QPE/TaskBar", "hideInputMethod()" ); 459 QCopChannel::send( "QPE/TaskBar", "hideInputMethod()" );
460#endif 460#endif
461} 461}
462 462
463 463
464/*! 464/*!
465 \internal 465 \internal
466*/ 466*/
467bool Global::isBuiltinCommand( const QString &name ) 467bool Global::isBuiltinCommand( const QString &name )
468{ 468{
469 if(!builtin) 469 if(!builtin)
470 return FALSE; // yes, it can happen 470 return FALSE; // yes, it can happen
471 for (int i = 0; builtin[i].file; i++) { 471 for (int i = 0; builtin[i].file; i++) {
472 if ( builtin[i].file == name ) { 472 if ( builtin[i].file == name ) {
473 return TRUE; 473 return TRUE;
474 } 474 }
475 } 475 }
476 return FALSE; 476 return FALSE;
477} 477}
478 478
479Global::Command* Global::builtin=0; 479Global::Command* Global::builtin=0;
480QGuardedPtr<QWidget> *Global::running=0; 480QGuardedPtr<QWidget> *Global::running=0;
481 481
482/*! 482/*!
483 \class Global::Command 483 \class Global::Command
484 \brief The Global::Command class is internal. 484 \brief The Global::Command class is internal.
485 \internal 485 \internal
486*/ 486*/
487 487
488/*! 488/*!
489 \internal 489 \internal
490*/ 490*/
491void Global::setBuiltinCommands( Command* list ) 491void Global::setBuiltinCommands( Command* list )
492{ 492{
493 if ( running ) 493 if ( running )
494 delete [] running; 494 delete [] running;
495 495
496 builtin = list; 496 builtin = list;
497 int count = 0; 497 int count = 0;
498 if (!builtin) 498 if (!builtin)
499 return; 499 return;
500 while ( builtin[count].file ) 500 while ( builtin[count].file )
501 count++; 501 count++;
502 502
503 running = new QGuardedPtr<QWidget> [ count ]; 503 running = new QGuardedPtr<QWidget> [ count ];
504} 504}
505 505
506/*! 506/*!
507 \internal 507 \internal
508*/ 508*/
509void Global::setDocument( QWidget* receiver, const QString& document ) 509void Global::setDocument( QWidget* receiver, const QString& document )
510{ 510{
511 Emitter emitter(receiver,document); 511 Emitter emitter(receiver,document);
512} 512}
513 513
514/*! 514/*!
515 \internal 515 \internal
516*/ 516*/
517bool Global::terminateBuiltin( const QString& n ) 517bool Global::terminateBuiltin( const QString& n )
518{ 518{
519 if (!builtin) 519 if (!builtin)
520 return FALSE; 520 return FALSE;
521 for (int i = 0; builtin[i].file; i++) { 521 for (int i = 0; builtin[i].file; i++) {
522 if ( builtin[i].file == n ) { 522 if ( builtin[i].file == n ) {
523 delete running[i]; 523 delete running[i];
524 return TRUE; 524 return TRUE;
525 } 525 }
526 } 526 }
527 return FALSE; 527 return FALSE;
528} 528}
529 529
530/*! 530/*!
531 \internal 531 \internal
532*/ 532*/
533void Global::terminate( const AppLnk* app ) 533void Global::terminate( const AppLnk* app )
534{ 534{
535 //if ( terminateBuiltin(app->exec()) ) return; // maybe? haven't tried this 535 //if ( terminateBuiltin(app->exec()) ) return; // maybe? haven't tried this
536 536
537#ifndef QT_NO_COP 537#ifndef QT_NO_COP
538 QCString channel = "QPE/Application/" + app->exec().utf8(); 538 QCString channel = "QPE/Application/" + app->exec().utf8();
539 if ( QCopChannel::isRegistered(channel) ) { 539 if ( QCopChannel::isRegistered(channel) ) {
540 QCopEnvelope e(channel, "quit()"); 540 QCopEnvelope e(channel, "quit()");
541 } 541 }
542#endif 542#endif
543} 543}
544 544
545/*! 545/*!
546 Low-level function to run command \a c. 546 Low-level function to run command \a c.
547 547
548 \warning Do not use this function. Use execute instead. 548 \warning Do not use this function. Use execute instead.
549 549
550 \sa execute() 550 \sa execute()
551*/ 551*/
552void Global::invoke(const QString &c) 552void Global::invoke(const QString &c)
553{ 553{
554 // Convert the command line in to a list of arguments 554 // Convert the command line in to a list of arguments
555 QStringList list = QStringList::split(QRegExp(" *"),c); 555 QStringList list = QStringList::split(QRegExp(" *"),c);
556 556
557#if !defined(QT_NO_COP) 557#if !defined(QT_NO_COP)
558 QString ap=list[0]; 558 QString ap=list[0];
559 // see if the application is already running 559 // see if the application is already running
560 // XXX should lock file /tmp/qcop-msg-ap 560 // XXX should lock file /tmp/qcop-msg-ap
561 if ( QCopChannel::isRegistered( ("QPE/Application/" + ap).latin1() ) ) { 561 if ( QCopChannel::isRegistered( ("QPE/Application/" + ap).latin1() ) ) {
562 // If the channel is already register, the app is already running, so show it. 562 // If the channel is already register, the app is already running, so show it.
563 { QCopEnvelope env( ("QPE/Application/" + ap).latin1(), "raise()" ); } 563 { QCopEnvelope env( ("QPE/Application/" + ap).latin1(), "raise()" ); }
564 564
565 QCopEnvelope e("QPE/System", "notBusy(QString)" ); 565 //QCopEnvelope e("QPE/System", "notBusy(QString)" );
566 e << ap; 566 //e << ap;
567 return; 567 return;
568 } 568 }
569 // XXX should unlock file /tmp/qcop-msg-ap 569 // XXX should unlock file /tmp/qcop-msg-ap
570 //see if it is being started 570 //see if it is being started
571 if ( StartingAppList::isStarting( ap ) ) { 571 if ( StartingAppList::isStarting( ap ) ) {
572 QCopEnvelope e("QPE/System", "notBusy(QString)" ); 572 // FIXME take it out for now, since it leads to a much to short showing of wait if
573 e << ap; 573 // some entry is clicked.
574 // Real cause is that ::execute is called twice for document tab. But it would need some larger changes
575 // to fix that, and with future syncs with qtopia 1.6 it will change anyway big time since somebody there
576 // had the idea that an apploader belongs to the launcher ...
577 //QCopEnvelope e("QPE/System", "notBusy(QString)" );
578 //e << ap;
574 return; 579 return;
575 } 580 }
576 581
577#endif 582#endif
578 583
579#ifdef QT_NO_QWS_MULTIPROCESS 584#ifdef QT_NO_QWS_MULTIPROCESS
580 QMessageBox::warning( 0, "Error", "Could not find the application " + c, "Ok", 0, 0, 0, 1 ); 585 QMessageBox::warning( 0, "Error", "Could not find the application " + c, "Ok", 0, 0, 0, 1 );
581#else 586#else
582 587
583 QStrList slist; 588 QStrList slist;
584 unsigned int j; 589 unsigned int j;
585 for ( j = 0; j < list.count(); j++ ) 590 for ( j = 0; j < list.count(); j++ )
586 slist.append( list[j].utf8() ); 591 slist.append( list[j].utf8() );
587 592
588 const char **args = new (const char *)[slist.count() + 1]; 593 const char **args = new (const char *)[slist.count() + 1];
589 for ( j = 0; j < slist.count(); j++ ) 594 for ( j = 0; j < slist.count(); j++ )
590 args[j] = slist.at(j); 595 args[j] = slist.at(j);
591 args[j] = NULL; 596 args[j] = NULL;
592 597
593#if !defined(QT_NO_COP) 598#if !defined(QT_NO_COP)
594 // an attempt to show a wait... 599 // an attempt to show a wait...
595 // more logic should be used, but this will be fine for the moment... 600 // more logic should be used, but this will be fine for the moment...
596 QCopEnvelope ( "QPE/System", "busy()" ); 601 QCopEnvelope ( "QPE/System", "busy()" );
597#endif 602#endif
598 603
599#ifdef HAVE_QUICKEXEC 604#ifdef HAVE_QUICKEXEC
600 QString libexe = qpeDir()+"/binlib/lib"+args[0] + ".so"; 605 QString libexe = qpeDir()+"/binlib/lib"+args[0] + ".so";
601 qDebug("libfile = %s", libexe.latin1() ); 606 qDebug("libfile = %s", libexe.latin1() );
602 if ( QFile::exists( libexe ) ) { 607 if ( QFile::exists( libexe ) ) {
603 qDebug("calling quickexec %s", libexe.latin1() ); 608 qDebug("calling quickexec %s", libexe.latin1() );
604 quickexecv( libexe.utf8().data(), (const char **)args ); 609 quickexecv( libexe.utf8().data(), (const char **)args );
605 } else 610 } else
606#endif 611#endif
607 { 612 {
608 bool success = false; 613 bool success = false;
609 int pfd [2]; 614 int pfd [2];
610 if ( ::pipe ( pfd ) < 0 ) 615 if ( ::pipe ( pfd ) < 0 )
611 pfd [0] = pfd [1] = -1; 616 pfd [0] = pfd [1] = -1;
612 617
613 pid_t pid = ::fork ( ); 618 pid_t pid = ::fork ( );
614 619
615 if ( pid == 0 ) { // child 620 if ( pid == 0 ) { // child
616 for ( int fd = 3; fd < 100; fd++ ) { 621 for ( int fd = 3; fd < 100; fd++ ) {
617 if ( fd != pfd [1] ) 622 if ( fd != pfd [1] )
618 ::close ( fd ); 623 ::close ( fd );
619 } 624 }
620 ::setpgid ( ::getpid ( ), ::getppid ( )); 625 ::setpgid ( ::getpid ( ), ::getppid ( ));
621 626
622 // Closing of fd[1] indicates that the execvp succeeded! 627 // Closing of fd[1] indicates that the execvp succeeded!
623 if ( pfd [1] >= 0 ) 628 if ( pfd [1] >= 0 )
624 ::fcntl ( pfd [1], F_SETFD, FD_CLOEXEC ); 629 ::fcntl ( pfd [1], F_SETFD, FD_CLOEXEC );
625 630
626 // Try bindir first, so that foo/bar works too 631 // Try bindir first, so that foo/bar works too
627 ::execv ( qpeDir ( ) + "/bin/" + args [0], (char * const *) args ); 632 ::execv ( qpeDir ( ) + "/bin/" + args [0], (char * const *) args );
628 ::execvp ( args [0], (char * const *) args ); 633 ::execvp ( args [0], (char * const *) args );
629 634
630 char resultByte = 1; 635 char resultByte = 1;
631 if ( pfd [1] >= 0 ) 636 if ( pfd [1] >= 0 )
632 ::write ( pfd [1], &resultByte, 1 ); 637 ::write ( pfd [1], &resultByte, 1 );
633 ::_exit ( -1 ); 638 ::_exit ( -1 );
634 } 639 }
635 else if ( pid > 0 ) { 640 else if ( pid > 0 ) {
636 success = true; 641 success = true;
637 642
638 if ( pfd [1] >= 0 ) 643 if ( pfd [1] >= 0 )
639 ::close ( pfd [1] ); 644 ::close ( pfd [1] );
640 if ( pfd [0] >= 0 ) { 645 if ( pfd [0] >= 0 ) {
641 while ( true ) { 646 while ( true ) {
642 char resultByte; 647 char resultByte;
643 int n = ::read ( pfd [0], &resultByte, 1 ); 648 int n = ::read ( pfd [0], &resultByte, 1 );
644 if ( n == 1 ) { 649 if ( n == 1 ) {
645 success = false; 650 success = false;
646 break; 651 break;
647 } 652 }
648 if (( n == -1 ) && (( errno == ECHILD ) || ( errno == EINTR ))) 653 if (( n == -1 ) && (( errno == ECHILD ) || ( errno == EINTR )))
649 continue; 654 continue;
650 655
651 break; // success 656 break; // success
652 } 657 }
653 ::close ( pfd [0] ); 658 ::close ( pfd [0] );
654 } 659 }
655 } 660 }
656 if ( success ) 661 if ( success )
657 StartingAppList::add( list[0] ); 662 StartingAppList::add( list[0] );
658 else 663 else
659 QMessageBox::warning( 0, "Error", "Could not start the application " + c, "Ok", 0, 0, 0, 1 ); 664 QMessageBox::warning( 0, "Error", "Could not start the application " + c, "Ok", 0, 0, 0, 1 );
660 } 665 }
661#endif //QT_NO_QWS_MULTIPROCESS 666#endif //QT_NO_QWS_MULTIPROCESS
662} 667}
663 668
664 669
665/*! 670/*!
666 Executes the application identfied by \a c, passing \a 671 Executes the application identfied by \a c, passing \a
667 document if it isn't null. 672 document if it isn't null.
668 673
669 Note that a better approach might be to send a QCop message to the 674 Note that a better approach might be to send a QCop message to the
670 application's QPE/Application/\e{appname} channel. 675 application's QPE/Application/\e{appname} channel.
671*/ 676*/
672void Global::execute( const QString &c, const QString& document ) 677void Global::execute( const QString &c, const QString& document )
673{ 678{
674 if ( qApp->type() != QApplication::GuiServer ) { 679 if ( qApp->type() != QApplication::GuiServer ) {
675 // ask the server to do the work 680 // ask the server to do the work
676#if !defined(QT_NO_COP) 681#if !defined(QT_NO_COP)
677 if ( document.isNull() ) { 682 if ( document.isNull() ) {
678 QCopEnvelope e( "QPE/System", "execute(QString)" ); 683 QCopEnvelope e( "QPE/System", "execute(QString)" );
679 e << c; 684 e << c;
680 } else { 685 } else {
681 QCopEnvelope e( "QPE/System", "execute(QString,QString)" ); 686 QCopEnvelope e( "QPE/System", "execute(QString,QString)" );
682 e << c << document; 687 e << c << document;
683 } 688 }
684#endif 689#endif
685 return; 690 return;
686 } 691 }
687 692
688 // Attempt to execute the app using a builtin class for the app first 693 // Attempt to execute the app using a builtin class for the app first
689 // else try and find it in the bin directory 694 // else try and find it in the bin directory
690 if (builtin) { 695 if (builtin) {
691 for (int i = 0; builtin[i].file; i++) { 696 for (int i = 0; builtin[i].file; i++) {
692 if ( builtin[i].file == c ) { 697 if ( builtin[i].file == c ) {
693 if ( running[i] ) { 698 if ( running[i] ) {
694 if ( !document.isNull() && builtin[i].documentary ) 699 if ( !document.isNull() && builtin[i].documentary )
695 setDocument(running[i], document); 700 setDocument(running[i], document);
696 running[i]->raise(); 701 running[i]->raise();
697 running[i]->show(); 702 running[i]->show();
698 running[i]->setActiveWindow(); 703 running[i]->setActiveWindow();
699 } else { 704 } else {
700 running[i] = builtin[i].func( builtin[i].maximized ); 705 running[i] = builtin[i].func( builtin[i].maximized );
701 } 706 }
702#ifndef QT_NO_COP 707#ifndef QT_NO_COP
703 QCopEnvelope e("QPE/System", "notBusy(QString)" ); 708 QCopEnvelope e("QPE/System", "notBusy(QString)" );
704 e << c; // that was quick ;-) 709 e << c; // that was quick ;-)
705#endif 710#endif
706 return; 711 return;
707 } 712 }
708 } 713 }
709 } 714 }
710 715
711 //Global::invoke(c, document); 716 //Global::invoke(c, document);
712 717
713 // Convert the command line in to a list of arguments 718 // Convert the command line in to a list of arguments
714 QStringList list = QStringList::split(QRegExp(" *"),c); 719 QStringList list = QStringList::split(QRegExp(" *"),c);
715 720
716#if !defined(QT_NO_COP) 721#if !defined(QT_NO_COP)
717 QString ap=list[0]; 722 QString ap=list[0];
718 723
719 qDebug("executing %s", ap.latin1() ); 724 qDebug("executing %s", ap.latin1() );
720 725
721 /* if need be, sending a qcop message will result in an invoke, see 726 /* if need be, sending a qcop message will result in an invoke, see
722 preceeding function */ 727 preceeding function */
723 invoke( ap ); 728 invoke( ap );
724 //{ QCopEnvelope env( ("QPE/Application/" + ap).latin1(), "raise()" ); } 729 //{ QCopEnvelope env( ("QPE/Application/" + ap).latin1(), "raise()" ); }
725 if ( !document.isEmpty() ) { 730 if ( !document.isEmpty() ) {
726 QCopEnvelope env( ("QPE/Application/" + ap).latin1(), "setDocument(QString)" ); 731 QCopEnvelope env( ("QPE/Application/" + ap).latin1(), "setDocument(QString)" );
727 env << document; 732 env << document;
728 } 733 }
729#endif 734#endif
730} 735}
731 736
732/*! 737/*!
733 Returns the string \a s with the characters '\', '"', and '$' quoted 738 Returns the string \a s with the characters '\', '"', and '$' quoted
734 by a preceeding '\'. 739 by a preceeding '\'.
735 740
736 \sa stringQuote() 741 \sa stringQuote()
737*/ 742*/
738QString Global::shellQuote(const QString& s) 743QString Global::shellQuote(const QString& s)
739{ 744{
740 QString r="\""; 745 QString r="\"";
741 for (int i=0; i<(int)s.length(); i++) { 746 for (int i=0; i<(int)s.length(); i++) {
742 char c = s[i].latin1(); 747 char c = s[i].latin1();
743 switch (c) { 748 switch (c) {
744 case '\\': case '"': case '$': 749 case '\\': case '"': case '$':
745 r+="\\"; 750 r+="\\";
746 } 751 }
747 r += s[i]; 752 r += s[i];
748 } 753 }
749 r += "\""; 754 r += "\"";
750 return r; 755 return r;
751} 756}
752 757
753/*! 758/*!
754 Returns the string \a s with the characters '\' and '"' quoted by a 759 Returns the string \a s with the characters '\' and '"' quoted by a
755 preceeding '\'. 760 preceeding '\'.
756 761
757 \sa shellQuote() 762 \sa shellQuote()
758*/ 763*/
759QString Global::stringQuote(const QString& s) 764QString Global::stringQuote(const QString& s)
760{ 765{
761 QString r="\""; 766 QString r="\"";
762 for (int i=0; i<(int)s.length(); i++) { 767 for (int i=0; i<(int)s.length(); i++) {
763 char c = s[i].latin1(); 768 char c = s[i].latin1();
764 switch (c) { 769 switch (c) {
765 case '\\': case '"': 770 case '\\': case '"':
766 r+="\\"; 771 r+="\\";
767 } 772 }
768 r += s[i]; 773 r += s[i];
769 } 774 }
770 r += "\""; 775 r += "\"";
771 return r; 776 return r;
772} 777}
773 778
774/*! 779/*!
775 Finds all documents on the system's document directories which 780 Finds all documents on the system's document directories which
776 match the filter \a mimefilter, and appends the resulting DocLnk 781 match the filter \a mimefilter, and appends the resulting DocLnk
777 objects to \a folder. 782 objects to \a folder.
778*/ 783*/
779void Global::findDocuments(DocLnkSet* folder, const QString &mimefilter) 784void Global::findDocuments(DocLnkSet* folder, const QString &mimefilter)
780{ 785{
781 QString homedocs = QString(getenv("HOME")) + "/Documents"; 786 QString homedocs = QString(getenv("HOME")) + "/Documents";
782 DocLnkSet d(homedocs,mimefilter); 787 DocLnkSet d(homedocs,mimefilter);
783 folder->appendFrom(d); 788 folder->appendFrom(d);
784 /** let's do intellegint way of searching these files 789 /** let's do intellegint way of searching these files
785 * a) the user don't want to check mediums global 790 * a) the user don't want to check mediums global
786 * b) the user wants to check but use the global options for it 791 * b) the user wants to check but use the global options for it
787 * c) the user wants to check it but not this medium 792 * c) the user wants to check it but not this medium
788 * d) the user wants to check and this medium as well 793 * d) the user wants to check and this medium as well
789 * 794 *
790 * In all cases we need to apply a different mimefilter to 795 * In all cases we need to apply a different mimefilter to
791 * the medium. 796 * the medium.
792 * a) mimefilter.isEmpty() we need to apply the responding filter 797 * a) mimefilter.isEmpty() we need to apply the responding filter
793 * either the global or the one on the medium 798 * either the global or the one on the medium
794 * 799 *
795 * b) mimefilter is set to an application we need to find out if the 800 * b) mimefilter is set to an application we need to find out if the
796 * mimetypes are included in the mime mask of the medium 801 * mimetypes are included in the mime mask of the medium
797 */ 802 */
798 StorageInfo storage; 803 StorageInfo storage;
799 const QList<FileSystem> &fs = storage.fileSystems(); 804 const QList<FileSystem> &fs = storage.fileSystems();
800 QListIterator<FileSystem> it ( fs ); 805 QListIterator<FileSystem> it ( fs );
801 for ( ; it.current(); ++it ) { 806 for ( ; it.current(); ++it ) {
802 if ( (*it)->isRemovable() ) { // let's find out if we should search on it 807 if ( (*it)->isRemovable() ) { // let's find out if we should search on it
803 // this is a candidate look at the cf and see if we should search on it 808 // this is a candidate look at the cf and see if we should search on it
804 QString path = (*it)->path(); 809 QString path = (*it)->path();
805 if( !checkStorage((*it)->path() + "/.opiestorage.cf" ) ) 810 if( !checkStorage((*it)->path() + "/.opiestorage.cf" ) )
806 continue; 811 continue;
807 DocLnkSet ide( path, mimefilter ); 812 DocLnkSet ide( path, mimefilter );
808 folder->appendFrom(ide); 813 folder->appendFrom(ide);
809 } else if ( (*it)->disk() == "/dev/mtdblock6" || (*it)->disk() == "tmpfs" ) { 814 } else if ( (*it)->disk() == "/dev/mtdblock6" || (*it)->disk() == "tmpfs" ) {
810 QString path = (*it)->path() + "/Documents"; 815 QString path = (*it)->path() + "/Documents";
811 DocLnkSet ide( path, mimefilter ); 816 DocLnkSet ide( path, mimefilter );
812 folder->appendFrom(ide); 817 folder->appendFrom(ide);
813 } 818 }
814 } 819 }
815} 820}
816 821
817QStringList Global::languageList() 822QStringList Global::languageList()
818{ 823{
819 QString lang = getenv("LANG"); 824 QString lang = getenv("LANG");
820 QStringList langs; 825 QStringList langs;
821 langs.append(lang); 826 langs.append(lang);
822 int i = lang.find("."); 827 int i = lang.find(".");
823 if ( i > 0 ) 828 if ( i > 0 )
824 lang = lang.left( i ); 829 lang = lang.left( i );
825 i = lang.find( "_" ); 830 i = lang.find( "_" );
826 if ( i > 0 ) 831 if ( i > 0 )
827 langs.append(lang.left(i)); 832 langs.append(lang.left(i));
828 return langs; 833 return langs;
829} 834}
830 835
831QStringList Global::helpPath() 836QStringList Global::helpPath()
832{ 837{
838 QString qpeDir = QPEApplication::qpeDir();
833 QStringList path; 839 QStringList path;
834 QStringList langs = Global::languageList(); 840 QStringList langs = Global::languageList();
835 for (QStringList::ConstIterator it = langs.fromLast(); it!=langs.end(); --it) { 841 for (QStringList::ConstIterator it = langs.fromLast(); it!=langs.end(); --it) {
836 QString lang = *it; 842 QString lang = *it;
837 if ( !lang.isEmpty() ) 843 if ( !lang.isEmpty() )
838 path += QPEApplication::qpeDir() + "/help/" + lang + "/html"; 844 path += qpeDir + "/help/" + lang + "/html";
839 } 845 }
840 path += QPEApplication::qpeDir() + "/pics"; 846 path += qpeDir + "/pics";
841 path += QPEApplication::qpeDir() + "/help/html"; 847 path += qpeDir + "/help/html";
842 path += QPEApplication::qpeDir() + "/docs"; 848 /* we even put english into the en dir so try it as fallback as well for opie */
849 path += qpeDir + "/help/en/html";
850 path += qpeDir + "/docs";
843 851
844 852
845 return path; 853 return path;
846} 854}
847 855
848 856
849#include "global.moc" 857#include "global.moc"