summaryrefslogtreecommitdiff
path: root/library/global.cpp
Unidiff
Diffstat (limited to 'library/global.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--library/global.cpp19
1 files changed, 12 insertions, 7 deletions
diff --git a/library/global.cpp b/library/global.cpp
index 6c0a66a..6182de8 100644
--- a/library/global.cpp
+++ b/library/global.cpp
@@ -264,564 +264,569 @@ const QDawg& Global::fixedDawg()
264 QFile in(fn); 264 QFile in(fn);
265 if ( in.open(IO_ReadOnly) ) { 265 if ( in.open(IO_ReadOnly) ) {
266 fixed_dawg->createFromWords(&in); 266 fixed_dawg->createFromWords(&in);
267 dawgfile.open(IO_WriteOnly); 267 dawgfile.open(IO_WriteOnly);
268 fixed_dawg->write(&dawgfile); 268 fixed_dawg->write(&dawgfile);
269 dawgfile.close(); 269 dawgfile.close();
270 } 270 }
271 } else { 271 } else {
272 fixed_dawg->readFile(dawgfilename); 272 fixed_dawg->readFile(dawgfilename);
273 } 273 }
274 } 274 }
275 275
276 return *fixed_dawg; 276 return *fixed_dawg;
277} 277}
278 278
279/*! 279/*!
280 Returns the changeable QDawg that contains general 280 Returns the changeable QDawg that contains general
281 words for the current locale. 281 words for the current locale.
282 282
283 \sa fixedDawg() 283 \sa fixedDawg()
284*/ 284*/
285const QDawg& Global::addedDawg() 285const QDawg& Global::addedDawg()
286{ 286{
287 return dawg("local"); 287 return dawg("local");
288} 288}
289 289
290/*! 290/*!
291 Returns the QDawg with the given \a name. 291 Returns the QDawg with the given \a name.
292 This is an application-specific word list. 292 This is an application-specific word list.
293 293
294 \a name should not contain "/". 294 \a name should not contain "/".
295*/ 295*/
296const QDawg& Global::dawg(const QString& name) 296const QDawg& Global::dawg(const QString& name)
297{ 297{
298 createDocDir(); 298 createDocDir();
299 if ( !named_dawg ) 299 if ( !named_dawg )
300 named_dawg = new QDict<QDawg>; 300 named_dawg = new QDict<QDawg>;
301 QDawg* r = named_dawg->find(name); 301 QDawg* r = named_dawg->find(name);
302 if ( !r ) { 302 if ( !r ) {
303 r = new QDawg; 303 r = new QDawg;
304 named_dawg->insert(name,r); 304 named_dawg->insert(name,r);
305 QString dawgfilename = applicationFileName("Dictionary", name ) + ".dawg"; 305 QString dawgfilename = applicationFileName("Dictionary", name ) + ".dawg";
306 QFile dawgfile(dawgfilename); 306 QFile dawgfile(dawgfilename);
307 if ( dawgfile.open(IO_ReadOnly) ) 307 if ( dawgfile.open(IO_ReadOnly) )
308 r->readFile(dawgfilename); 308 r->readFile(dawgfilename);
309 } 309 }
310 return *r; 310 return *r;
311} 311}
312 312
313/*! 313/*!
314 \overload 314 \overload
315 Adds \a wordlist to the addedDawg(). 315 Adds \a wordlist to the addedDawg().
316 316
317 Note that the addition of words persists between program executions 317 Note that the addition of words persists between program executions
318 (they are saved in the dictionary files), so you should confirm the 318 (they are saved in the dictionary files), so you should confirm the
319 words with the user before adding them. 319 words with the user before adding them.
320*/ 320*/
321void Global::addWords(const QStringList& wordlist) 321void Global::addWords(const QStringList& wordlist)
322{ 322{
323 addWords("local",wordlist); 323 addWords("local",wordlist);
324} 324}
325 325
326/*! 326/*!
327 \overload 327 \overload
328 Adds \a wordlist to the addedDawg(). 328 Adds \a wordlist to the addedDawg().
329 329
330 Note that the addition of words persists between program executions 330 Note that the addition of words persists between program executions
331 (they are saved in the dictionary files), so you should confirm the 331 (they are saved in the dictionary files), so you should confirm the
332 words with the user before adding them. 332 words with the user before adding them.
333*/ 333*/
334void Global::addWords(const QString& dictname, const QStringList& wordlist) 334void Global::addWords(const QString& dictname, const QStringList& wordlist)
335{ 335{
336 QDawg& d = (QDawg&)dawg(dictname); 336 QDawg& d = (QDawg&)dawg(dictname);
337 QStringList all = d.allWords() + wordlist; 337 QStringList all = d.allWords() + wordlist;
338 d.createFromWords(all); 338 d.createFromWords(all);
339 339
340 QString dawgfilename = applicationFileName("Dictionary", dictname) + ".dawg"; 340 QString dawgfilename = applicationFileName("Dictionary", dictname) + ".dawg";
341 QFile dawgfile(dawgfilename); 341 QFile dawgfile(dawgfilename);
342 if ( dawgfile.open(IO_WriteOnly) ) { 342 if ( dawgfile.open(IO_WriteOnly) ) {
343 d.write(&dawgfile); 343 d.write(&dawgfile);
344 dawgfile.close(); 344 dawgfile.close();
345 } 345 }
346 346
347 // #### Re-read the dawg here if we use mmap(). 347 // #### Re-read the dawg here if we use mmap().
348 348
349 // #### Signal other processes to re-read. 349 // #### Signal other processes to re-read.
350} 350}
351 351
352 352
353/*! 353/*!
354 Returns the full path for the application called \a appname, with the 354 Returns the full path for the application called \a appname, with the
355 given \a filename. Returns QString::null if there was a problem creating 355 given \a filename. Returns QString::null if there was a problem creating
356 the directory tree for \a appname. 356 the directory tree for \a appname.
357 If \a filename contains "/", it is the caller's responsibility to 357 If \a filename contains "/", it is the caller's responsibility to
358 ensure that those directories exist. 358 ensure that those directories exist.
359*/ 359*/
360QString Global::applicationFileName(const QString& appname, const QString& filename) 360QString Global::applicationFileName(const QString& appname, const QString& filename)
361{ 361{
362 QDir d; 362 QDir d;
363 QString r = getenv("HOME"); 363 QString r = getenv("HOME");
364 r += "/Applications/"; 364 r += "/Applications/";
365 if ( !QFile::exists( r ) ) 365 if ( !QFile::exists( r ) )
366 if ( d.mkdir(r) == false ) 366 if ( d.mkdir(r) == false )
367 return QString::null; 367 return QString::null;
368 r += appname; 368 r += appname;
369 if ( !QFile::exists( r ) ) 369 if ( !QFile::exists( r ) )
370 if ( d.mkdir(r) == false ) 370 if ( d.mkdir(r) == false )
371 return QString::null; 371 return QString::null;
372 r += "/"; r += filename; 372 r += "/"; r += filename;
373 return r; 373 return r;
374} 374}
375 375
376/*! 376/*!
377 \internal 377 \internal
378*/ 378*/
379void Global::createDocDir() 379void Global::createDocDir()
380{ 380{
381 if ( !docDirCreated ) { 381 if ( !docDirCreated ) {
382 docDirCreated = TRUE; 382 docDirCreated = TRUE;
383 mkdir( QPEApplication::documentDir().latin1(), 0755 ); 383 mkdir( QPEApplication::documentDir().latin1(), 0755 );
384 } 384 }
385} 385}
386 386
387 387
388/*! 388/*!
389 Displays a status \a message to the user. This usually appears 389 Displays a status \a message to the user. This usually appears
390 in the taskbar for a short amount of time, then disappears. 390 in the taskbar for a short amount of time, then disappears.
391*/ 391*/
392void Global::statusMessage(const QString& message) 392void Global::statusMessage(const QString& message)
393{ 393{
394#if !defined(QT_NO_COP) 394#if !defined(QT_NO_COP)
395 QCopEnvelope e( "QPE/TaskBar", "message(QString)" ); 395 QCopEnvelope e( "QPE/TaskBar", "message(QString)" );
396 e << message; 396 e << message;
397#endif 397#endif
398} 398}
399 399
400/*! 400/*!
401 \internal 401 \internal
402*/ 402*/
403void Global::applyStyle() 403void Global::applyStyle()
404{ 404{
405#if !defined(QT_NO_COP) 405#if !defined(QT_NO_COP)
406 QCopChannel::send( "QPE/System", "applyStyle()" ); 406 QCopChannel::send( "QPE/System", "applyStyle()" );
407#else 407#else
408 ((QPEApplication *)qApp)->applyStyle(); // apply without needing QCop for floppy version 408 ((QPEApplication *)qApp)->applyStyle(); // apply without needing QCop for floppy version
409#endif 409#endif
410} 410}
411 411
412/*! 412/*!
413 \internal 413 \internal
414*/ 414*/
415QWidget *Global::shutdown( bool ) 415QWidget *Global::shutdown( bool )
416{ 416{
417#if !defined(QT_NO_COP) 417#if !defined(QT_NO_COP)
418 QCopChannel::send( "QPE/System", "shutdown()" ); 418 QCopChannel::send( "QPE/System", "shutdown()" );
419#endif 419#endif
420 return 0; 420 return 0;
421} 421}
422 422
423/*! 423/*!
424 \internal 424 \internal
425*/ 425*/
426QWidget *Global::restart( bool ) 426QWidget *Global::restart( bool )
427{ 427{
428#if !defined(QT_NO_COP) 428#if !defined(QT_NO_COP)
429 QCopChannel::send( "QPE/System", "restart()" ); 429 QCopChannel::send( "QPE/System", "restart()" );
430#endif 430#endif
431 return 0; 431 return 0;
432} 432}
433 433
434/*! 434/*!
435 Explicitly show the current input method. 435 Explicitly show the current input method.
436 436
437 Input methods are indicated in the taskbar by a small icon. If the 437 Input methods are indicated in the taskbar by a small icon. If the
438 input method is activated (shown) then it takes up some proportion 438 input method is activated (shown) then it takes up some proportion
439 of the bottom of the screen, to allow the user to interact (input 439 of the bottom of the screen, to allow the user to interact (input
440 characters) with it. 440 characters) with it.
441 441
442 \sa hideInputMethod() 442 \sa hideInputMethod()
443*/ 443*/
444void Global::showInputMethod() 444void Global::showInputMethod()
445{ 445{
446#if !defined(QT_NO_COP) 446#if !defined(QT_NO_COP)
447 QCopChannel::send( "QPE/TaskBar", "showInputMethod()" ); 447 QCopChannel::send( "QPE/TaskBar", "showInputMethod()" );
448#endif 448#endif
449} 449}
450 450
451/*! 451/*!
452 Explicitly hide the current input method. 452 Explicitly hide the current input method.
453 453
454 The current input method is still indicated in the taskbar, but no 454 The current input method is still indicated in the taskbar, but no
455 longer takes up screen space, and can no longer be interacted with. 455 longer takes up screen space, and can no longer be interacted with.
456 456
457 \sa showInputMethod() 457 \sa showInputMethod()
458*/ 458*/
459void Global::hideInputMethod() 459void Global::hideInputMethod()
460{ 460{
461#if !defined(QT_NO_COP) 461#if !defined(QT_NO_COP)
462 QCopChannel::send( "QPE/TaskBar", "hideInputMethod()" ); 462 QCopChannel::send( "QPE/TaskBar", "hideInputMethod()" );
463#endif 463#endif
464} 464}
465 465
466 466
467/*! 467/*!
468 \internal 468 \internal
469*/ 469*/
470bool Global::isBuiltinCommand( const QString &name ) 470bool Global::isBuiltinCommand( const QString &name )
471{ 471{
472 if(!builtin) 472 if(!builtin)
473 return FALSE; // yes, it can happen 473 return FALSE; // yes, it can happen
474 for (int i = 0; builtin[i].file; i++) { 474 for (int i = 0; builtin[i].file; i++) {
475 if ( builtin[i].file == name ) { 475 if ( builtin[i].file == name ) {
476 return TRUE; 476 return TRUE;
477 } 477 }
478 } 478 }
479 return FALSE; 479 return FALSE;
480} 480}
481 481
482Global::Command* Global::builtin=0; 482Global::Command* Global::builtin=0;
483QGuardedPtr<QWidget> *Global::running=0; 483QGuardedPtr<QWidget> *Global::running=0;
484 484
485/*! 485/*!
486 \class Global::Command 486 \class Global::Command
487 \brief The Global::Command class is internal. 487 \brief The Global::Command class is internal.
488 \internal 488 \internal
489*/ 489*/
490 490
491/*! 491/*!
492 \internal 492 \internal
493*/ 493*/
494void Global::setBuiltinCommands( Command* list ) 494void Global::setBuiltinCommands( Command* list )
495{ 495{
496 if ( running ) 496 if ( running )
497 delete [] running; 497 delete [] running;
498 498
499 builtin = list; 499 builtin = list;
500 int count = 0; 500 int count = 0;
501 if (!builtin) 501 if (!builtin)
502 return; 502 return;
503 while ( builtin[count].file ) 503 while ( builtin[count].file )
504 count++; 504 count++;
505 505
506 running = new QGuardedPtr<QWidget> [ count ]; 506 running = new QGuardedPtr<QWidget> [ count ];
507} 507}
508 508
509/*! 509/*!
510 \internal 510 \internal
511*/ 511*/
512void Global::setDocument( QWidget* receiver, const QString& document ) 512void Global::setDocument( QWidget* receiver, const QString& document )
513{ 513{
514 Emitter emitter(receiver,document); 514 Emitter emitter(receiver,document);
515} 515}
516 516
517/*! 517/*!
518 \internal 518 \internal
519*/ 519*/
520bool Global::terminateBuiltin( const QString& n ) 520bool Global::terminateBuiltin( const QString& n )
521{ 521{
522 if (!builtin) 522 if (!builtin)
523 return FALSE; 523 return FALSE;
524 for (int i = 0; builtin[i].file; i++) { 524 for (int i = 0; builtin[i].file; i++) {
525 if ( builtin[i].file == n ) { 525 if ( builtin[i].file == n ) {
526 delete running[i]; 526 delete running[i];
527 return TRUE; 527 return TRUE;
528 } 528 }
529 } 529 }
530 return FALSE; 530 return FALSE;
531} 531}
532 532
533/*! 533/*!
534 \internal 534 \internal
535*/ 535*/
536void Global::terminate( const AppLnk* app ) 536void Global::terminate( const AppLnk* app )
537{ 537{
538 //if ( terminateBuiltin(app->exec()) ) return; // maybe? haven't tried this 538 //if ( terminateBuiltin(app->exec()) ) return; // maybe? haven't tried this
539 539
540#ifndef QT_NO_COP 540#ifndef QT_NO_COP
541 QCString channel = "QPE/Application/" + app->exec().utf8(); 541 QCString channel = "QPE/Application/" + app->exec().utf8();
542 if ( QCopChannel::isRegistered(channel) ) { 542 if ( QCopChannel::isRegistered(channel) ) {
543 QCopEnvelope e(channel, "quit()"); 543 QCopEnvelope e(channel, "quit()");
544 } 544 }
545#endif 545#endif
546} 546}
547 547
548/*! 548/*!
549 Low-level function to run command \a c. 549 Low-level function to run command \a c.
550 550
551 \warning Do not use this function. Use execute instead. 551 \warning Do not use this function. Use execute instead.
552 552
553 \sa execute() 553 \sa execute()
554*/ 554*/
555void Global::invoke(const QString &c) 555void Global::invoke(const QString &c)
556{ 556{
557 // Convert the command line in to a list of arguments 557 // Convert the command line in to a list of arguments
558 QStringList list = QStringList::split(QRegExp(" *"),c); 558 QStringList list = QStringList::split(QRegExp(" *"),c);
559 559
560#if !defined(QT_NO_COP) 560#if !defined(QT_NO_COP)
561 QString ap=list[0]; 561 QString ap=list[0];
562 // see if the application is already running 562 // see if the application is already running
563 // XXX should lock file /tmp/qcop-msg-ap 563 // XXX should lock file /tmp/qcop-msg-ap
564 if ( QCopChannel::isRegistered( ("QPE/Application/" + ap).latin1() ) ) { 564 if ( QCopChannel::isRegistered( ("QPE/Application/" + ap).latin1() ) ) {
565 // If the channel is already register, the app is already running, so show it. 565 // If the channel is already register, the app is already running, so show it.
566 { QCopEnvelope env( ("QPE/Application/" + ap).latin1(), "raise()" ); } 566 { QCopEnvelope env( ("QPE/Application/" + ap).latin1(), "raise()" ); }
567 567
568 //QCopEnvelope e("QPE/System", "notBusy(QString)" ); 568 //QCopEnvelope e("QPE/System", "notBusy(QString)" );
569 //e << ap; 569 //e << ap;
570 return; 570 return;
571 } 571 }
572 // XXX should unlock file /tmp/qcop-msg-ap 572 // XXX should unlock file /tmp/qcop-msg-ap
573 //see if it is being started 573 //see if it is being started
574 if ( StartingAppList::isStarting( ap ) ) { 574 if ( StartingAppList::isStarting( ap ) ) {
575 // FIXME take it out for now, since it leads to a much to short showing of wait if 575 // FIXME take it out for now, since it leads to a much to short showing of wait if
576 // some entry is clicked. 576 // some entry is clicked.
577 // Real cause is that ::execute is called twice for document tab. But it would need some larger changes 577 // Real cause is that ::execute is called twice for document tab. But it would need some larger changes
578 // to fix that, and with future syncs with qtopia 1.6 it will change anyway big time since somebody there 578 // to fix that, and with future syncs with qtopia 1.6 it will change anyway big time since somebody there
579 // had the idea that an apploader belongs to the launcher ... 579 // had the idea that an apploader belongs to the launcher ...
580 //QCopEnvelope e("QPE/System", "notBusy(QString)" ); 580 //QCopEnvelope e("QPE/System", "notBusy(QString)" );
581 //e << ap; 581 //e << ap;
582 return; 582 return;
583 } 583 }
584 584
585#endif 585#endif
586 586
587#ifdef QT_NO_QWS_MULTIPROCESS 587#ifdef QT_NO_QWS_MULTIPROCESS
588 QMessageBox::warning( 0, "Error", "Could not find the application " + c, "Ok", 0, 0, 0, 1 ); 588 QMessageBox::warning( 0, "Error", "Could not find the application " + c, "Ok", 0, 0, 0, 1 );
589#else 589#else
590 590
591 QStrList slist; 591 QStrList slist;
592 unsigned int j; 592 unsigned int j;
593 for ( j = 0; j < list.count(); j++ ) 593 for ( j = 0; j < list.count(); j++ )
594 slist.append( list[j].utf8() ); 594 slist.append( list[j].utf8() );
595 595
596 const char **args = new (const char *)[slist.count() + 1]; 596 const char **args = new (const char *)[slist.count() + 1];
597 for ( j = 0; j < slist.count(); j++ ) 597 for ( j = 0; j < slist.count(); j++ )
598 args[j] = slist.at(j); 598 args[j] = slist.at(j);
599 args[j] = NULL; 599 args[j] = NULL;
600 600
601#if !defined(QT_NO_COP) 601#if !defined(QT_NO_COP)
602 // an attempt to show a wait... 602 // an attempt to show a wait...
603 // more logic should be used, but this will be fine for the moment... 603 // more logic should be used, but this will be fine for the moment...
604 QCopEnvelope ( "QPE/System", "busy()" ); 604 QCopEnvelope ( "QPE/System", "busy()" );
605#endif 605#endif
606 606
607#ifdef HAVE_QUICKEXEC 607#ifdef HAVE_QUICKEXEC
608#ifdef Q_OS_MACX 608#ifdef Q_OS_MACX
609 QString libexe = qpeDir()+"/binlib/lib"+args[0] + ".dylib"; 609 QString libexe = qpeDir()+"/binlib/lib"+args[0] + ".dylib";
610#else 610#else
611 QString libexe = qpeDir()+"/binlib/lib"+args[0] + ".so"; 611 QString libexe = qpeDir()+"/binlib/lib"+args[0] + ".so";
612#endif 612#endif
613 qDebug("libfile = %s", libexe.latin1() ); 613 qDebug("libfile = %s", libexe.latin1() );
614 if ( QFile::exists( libexe ) ) { 614 if ( QFile::exists( libexe ) ) {
615 qDebug("calling quickexec %s", libexe.latin1() ); 615 qDebug("calling quickexec %s", libexe.latin1() );
616 quickexecv( libexe.utf8().data(), (const char **)args ); 616 quickexecv( libexe.utf8().data(), (const char **)args );
617 } else 617 } else
618#endif 618#endif
619 { 619 {
620 bool success = false; 620 bool success = false;
621 int pfd [2]; 621 int pfd [2];
622 if ( ::pipe ( pfd ) < 0 ) 622 if ( ::pipe ( pfd ) < 0 )
623 pfd [0] = pfd [1] = -1; 623 pfd [0] = pfd [1] = -1;
624 624
625 pid_t pid = ::fork ( ); 625 pid_t pid = ::fork ( );
626 626
627 if ( pid == 0 ) { // child 627 if ( pid == 0 ) { // child
628 for ( int fd = 3; fd < 100; fd++ ) { 628 for ( int fd = 3; fd < 100; fd++ ) {
629 if ( fd != pfd [1] ) 629 if ( fd != pfd [1] )
630 ::close ( fd ); 630 ::close ( fd );
631 } 631 }
632 ::setpgid ( ::getpid ( ), ::getppid ( )); 632 ::setpgid ( ::getpid ( ), ::getppid ( ));
633 633
634 // Closing of fd[1] indicates that the execvp succeeded! 634 // Closing of fd[1] indicates that the execvp succeeded!
635 if ( pfd [1] >= 0 ) 635 if ( pfd [1] >= 0 )
636 ::fcntl ( pfd [1], F_SETFD, FD_CLOEXEC ); 636 ::fcntl ( pfd [1], F_SETFD, FD_CLOEXEC );
637 637
638 // Try bindir first, so that foo/bar works too 638 // Try bindir first, so that foo/bar works too
639 ::execv ( qpeDir ( ) + "/bin/" + args [0], (char * const *) args ); 639 ::execv ( qpeDir ( ) + "/bin/" + args [0], (char * const *) args );
640 ::execvp ( args [0], (char * const *) args ); 640 ::execvp ( args [0], (char * const *) args );
641 641
642 char resultByte = 1; 642 char resultByte = 1;
643 if ( pfd [1] >= 0 ) 643 if ( pfd [1] >= 0 )
644 ::write ( pfd [1], &resultByte, 1 ); 644 ::write ( pfd [1], &resultByte, 1 );
645 ::_exit ( -1 ); 645 ::_exit ( -1 );
646 } 646 }
647 else if ( pid > 0 ) { 647 else if ( pid > 0 ) {
648 success = true; 648 success = true;
649 649
650 if ( pfd [1] >= 0 ) 650 if ( pfd [1] >= 0 )
651 ::close ( pfd [1] ); 651 ::close ( pfd [1] );
652 if ( pfd [0] >= 0 ) { 652 if ( pfd [0] >= 0 ) {
653 while ( true ) { 653 while ( true ) {
654 char resultByte; 654 char resultByte;
655 int n = ::read ( pfd [0], &resultByte, 1 ); 655 int n = ::read ( pfd [0], &resultByte, 1 );
656 if ( n == 1 ) { 656 if ( n == 1 ) {
657 success = false; 657 success = false;
658 break; 658 break;
659 } 659 }
660 if (( n == -1 ) && (( errno == ECHILD ) || ( errno == EINTR ))) 660 if (( n == -1 ) && (( errno == ECHILD ) || ( errno == EINTR )))
661 continue; 661 continue;
662 662
663 break; // success 663 break; // success
664 } 664 }
665 ::close ( pfd [0] ); 665 ::close ( pfd [0] );
666 } 666 }
667 } 667 }
668 if ( success ) 668 if ( success )
669 StartingAppList::add( list[0] ); 669 StartingAppList::add( list[0] );
670 else 670 else
671 QMessageBox::warning( 0, "Error", "Could not start the application " + c, "Ok", 0, 0, 0, 1 ); 671 QMessageBox::warning( 0, "Error", "Could not start the application " + c, "Ok", 0, 0, 0, 1 );
672 } 672 }
673#endif //QT_NO_QWS_MULTIPROCESS 673#endif //QT_NO_QWS_MULTIPROCESS
674} 674}
675 675
676 676
677/*! 677/*!
678 Executes the application identfied by \a c, passing \a 678 Executes the application identfied by \a c, passing \a
679 document if it isn't null. 679 document if it isn't null.
680 680
681 Note that a better approach might be to send a QCop message to the 681 Note that a better approach might be to send a QCop message to the
682 application's QPE/Application/\e{appname} channel. 682 application's QPE/Application/\e{appname} channel.
683*/ 683*/
684void Global::execute( const QString &c, const QString& document ) 684void Global::execute( const QString &c, const QString& document )
685{ 685{
686 // ask the server to do the work 686 // ask the server to do the work
687#if !defined(QT_NO_COP) 687#if !defined(QT_NO_COP)
688 if ( document.isNull() ) { 688 if ( document.isNull() ) {
689 QCopEnvelope e( "QPE/System", "execute(QString)" ); 689 QCopEnvelope e( "QPE/System", "execute(QString)" );
690 e << c; 690 e << c;
691 } else { 691 } else {
692 QCopEnvelope e( "QPE/System", "execute(QString,QString)" ); 692 QCopEnvelope e( "QPE/System", "execute(QString,QString)" );
693 e << c << document; 693 e << c << document;
694 } 694 }
695#endif 695#endif
696 return; 696 return;
697} 697}
698 698
699/*! 699/*!
700 Returns the string \a s with the characters '\', '"', and '$' quoted 700 Returns the string \a s with the characters '\', '"', and '$' quoted
701 by a preceeding '\'. 701 by a preceeding '\'.
702 702
703 \sa stringQuote() 703 \sa stringQuote()
704*/ 704*/
705QString Global::shellQuote(const QString& s) 705QString Global::shellQuote(const QString& s)
706{ 706{
707 QString r="\""; 707 QString r="\"";
708 for (int i=0; i<(int)s.length(); i++) { 708 for (int i=0; i<(int)s.length(); i++) {
709 char c = s[i].latin1(); 709 char c = s[i].latin1();
710 switch (c) { 710 switch (c) {
711 case '\\': case '"': case '$': 711 case '\\': case '"': case '$':
712 r+="\\"; 712 r+="\\";
713 } 713 }
714 r += s[i]; 714 r += s[i];
715 } 715 }
716 r += "\""; 716 r += "\"";
717 return r; 717 return r;
718} 718}
719 719
720/*! 720/*!
721 Returns the string \a s with the characters '\' and '"' quoted by a 721 Returns the string \a s with the characters '\' and '"' quoted by a
722 preceeding '\'. 722 preceeding '\'.
723 723
724 \sa shellQuote() 724 \sa shellQuote()
725*/ 725*/
726QString Global::stringQuote(const QString& s) 726QString Global::stringQuote(const QString& s)
727{ 727{
728 QString r="\""; 728 QString r="\"";
729 for (int i=0; i<(int)s.length(); i++) { 729 for (int i=0; i<(int)s.length(); i++) {
730 char c = s[i].latin1(); 730 char c = s[i].latin1();
731 switch (c) { 731 switch (c) {
732 case '\\': case '"': 732 case '\\': case '"':
733 r+="\\"; 733 r+="\\";
734 } 734 }
735 r += s[i]; 735 r += s[i];
736 } 736 }
737 r += "\""; 737 r += "\"";
738 return r; 738 return r;
739} 739}
740 740
741/*! 741/*!
742 Finds all documents on the system's document directories which 742 Finds all documents on the system's document directories which
743 match the filter \a mimefilter, and appends the resulting DocLnk 743 match the filter \a mimefilter, and appends the resulting DocLnk
744 objects to \a folder. 744 objects to \a folder.
745*/ 745*/
746void Global::findDocuments(DocLnkSet* folder, const QString &mimefilter) 746void Global::findDocuments(DocLnkSet* folder, const QString &mimefilter)
747{ 747{
748 QString homedocs = QString(getenv("HOME")) + "/Documents"; 748 QString homedocs = QString(getenv("HOME")) + "/Documents";
749 DocLnkSet d(homedocs,mimefilter); 749 DocLnkSet d(homedocs,mimefilter);
750 folder->appendFrom(d); 750 folder->appendFrom(d);
751 /** let's do intellegint way of searching these files 751 /** let's do intellegint way of searching these files
752 * a) the user don't want to check mediums global 752 * a) the user don't want to check mediums global
753 * b) the user wants to check but use the global options for it 753 * b) the user wants to check but use the global options for it
754 * c) the user wants to check it but not this medium 754 * c) the user wants to check it but not this medium
755 * d) the user wants to check and this medium as well 755 * d) the user wants to check and this medium as well
756 * 756 *
757 * In all cases we need to apply a different mimefilter to 757 * In all cases we need to apply a different mimefilter to
758 * the medium. 758 * the medium.
759 * a) mimefilter.isEmpty() we need to apply the responding filter 759 * a) mimefilter.isEmpty() we need to apply the responding filter
760 * either the global or the one on the medium 760 * either the global or the one on the medium
761 * 761 *
762 * b) mimefilter is set to an application we need to find out if the 762 * b) mimefilter is set to an application we need to find out if the
763 * mimetypes are included in the mime mask of the medium 763 * mimetypes are included in the mime mask of the medium
764 */ 764 */
765 StorageInfo storage; 765 StorageInfo storage;
766 const QList<FileSystem> &fs = storage.fileSystems(); 766 const QList<FileSystem> &fs = storage.fileSystems();
767 QListIterator<FileSystem> it ( fs ); 767 QListIterator<FileSystem> it ( fs );
768 for ( ; it.current(); ++it ) { 768 for ( ; it.current(); ++it ) {
769 if ( (*it)->isRemovable() ) { // let's find out if we should search on it 769 if ( (*it)->isRemovable() ) { // let's find out if we should search on it
770 // this is a candidate look at the cf and see if we should search on it 770 // this is a candidate look at the cf and see if we should search on it
771 QString path = (*it)->path(); 771 QString path = (*it)->path();
772 if( !checkStorage((*it)->path() + "/.opiestorage.cf" ) ) 772 if( !checkStorage((*it)->path() + "/.opiestorage.cf" ) )
773 continue; 773 continue;
774 Config conf((*it)->path() + "/.opiestorage.cf", Config::File ); 774 Config conf((*it)->path() + "/.opiestorage.cf", Config::File );
775 conf.setGroup("subdirs"); 775 conf.setGroup("subdirs");
776 QStringList subDirs = conf.readListEntry("subdirs",':'); 776 if (conf.readBoolEntry("wholemedia",true)) {
777 if (subDirs.isEmpty()) { 777 DocLnkSet ide( path,mimefilter);
778 subDirs.append("Documents"); 778 folder->appendFrom(ide);
779 } 779 } else {
780 for (unsigned c = 0; c < subDirs.count();++c) { 780 QStringList subDirs = conf.readListEntry("subdirs",':');
781 DocLnkSet ide( path+"/"+subDirs[c], mimefilter ); 781 if (subDirs.isEmpty()) {
782 folder->appendFrom(ide); 782 subDirs.append("Documents");
783 }
784 for (unsigned c = 0; c < subDirs.count();++c) {
785 DocLnkSet ide( path+"/"+subDirs[c], mimefilter );
786 folder->appendFrom(ide);
787 }
783 } 788 }
784 } else if ( (*it)->disk() == "/dev/mtdblock6" || (*it)->disk() == "tmpfs" ) { 789 } else if ( (*it)->disk() == "/dev/mtdblock6" || (*it)->disk() == "tmpfs" ) {
785 QString path = (*it)->path() + "/Documents"; 790 QString path = (*it)->path() + "/Documents";
786 DocLnkSet ide( path, mimefilter ); 791 DocLnkSet ide( path, mimefilter );
787 folder->appendFrom(ide); 792 folder->appendFrom(ide);
788 } 793 }
789 } 794 }
790} 795}
791 796
792QStringList Global::languageList() 797QStringList Global::languageList()
793{ 798{
794 QString lang = getenv("LANG"); 799 QString lang = getenv("LANG");
795 QStringList langs; 800 QStringList langs;
796 langs.append(lang); 801 langs.append(lang);
797 int i = lang.find("."); 802 int i = lang.find(".");
798 if ( i > 0 ) 803 if ( i > 0 )
799 lang = lang.left( i ); 804 lang = lang.left( i );
800 i = lang.find( "_" ); 805 i = lang.find( "_" );
801 if ( i > 0 ) 806 if ( i > 0 )
802 langs.append(lang.left(i)); 807 langs.append(lang.left(i));
803 return langs; 808 return langs;
804} 809}
805 810
806QStringList Global::helpPath() 811QStringList Global::helpPath()
807{ 812{
808 QString qpeDir = QPEApplication::qpeDir(); 813 QString qpeDir = QPEApplication::qpeDir();
809 QStringList path; 814 QStringList path;
810 QStringList langs = Global::languageList(); 815 QStringList langs = Global::languageList();
811 for (QStringList::ConstIterator it = langs.fromLast(); it!=langs.end(); --it) { 816 for (QStringList::ConstIterator it = langs.fromLast(); it!=langs.end(); --it) {
812 QString lang = *it; 817 QString lang = *it;
813 if ( !lang.isEmpty() ) 818 if ( !lang.isEmpty() )
814 path += qpeDir + "/help/" + lang + "/html"; 819 path += qpeDir + "/help/" + lang + "/html";
815 } 820 }
816 path += qpeDir + "/pics"; 821 path += qpeDir + "/pics";
817 path += qpeDir + "/help/html"; 822 path += qpeDir + "/help/html";
818 /* we even put english into the en dir so try it as fallback as well for opie */ 823 /* we even put english into the en dir so try it as fallback as well for opie */
819 path += qpeDir + "/help/en/html"; 824 path += qpeDir + "/help/en/html";
820 path += qpeDir + "/docs"; 825 path += qpeDir + "/docs";
821 826
822 827
823 return path; 828 return path;
824} 829}
825 830
826 831
827#include "global.moc" 832#include "global.moc"