author | zecke <zecke> | 2004-06-20 19:03:56 (UTC) |
---|---|---|
committer | zecke <zecke> | 2004-06-20 19:03:56 (UTC) |
commit | 44d69b04b5257592639d2a494c448202c86978c2 (patch) (unidiff) | |
tree | 9d776e08f6efa53abc6e2658c94b9e0e18324692 /library/applnk.cpp | |
parent | 2055cb9e96b27f95720240a2035ade27cb7bc098 (diff) | |
download | opie-44d69b04b5257592639d2a494c448202c86978c2.zip opie-44d69b04b5257592639d2a494c448202c86978c2.tar.gz opie-44d69b04b5257592639d2a494c448202c86978c2.tar.bz2 |
Use A higher prime number in AppLnk
Somehow the Launcher triggers issues with libqpe and MimeType.
Due the mix of calling MimeType::clear, MimeType type(doclnk.linkFile()),
MimeType::clear
the registration of Application was cleared and not reentered due the
inner static variable in MimeType::init which was set.
Now make sure that if we clear that we will reenter the Application in all cases!
-rw-r--r-- | library/applnk.cpp | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/library/applnk.cpp b/library/applnk.cpp index 5f7da8e..e9d519e 100644 --- a/library/applnk.cpp +++ b/library/applnk.cpp | |||
@@ -511,986 +511,986 @@ const QPixmap& AppLnk::bigPixmap() const | |||
511 | } | 511 | } |
512 | 512 | ||
513 | /*! | 513 | /*! |
514 | Returns the type of the AppLnk. For applications, games and | 514 | Returns the type of the AppLnk. For applications, games and |
515 | settings the type is \c Application; for documents the type is the | 515 | settings the type is \c Application; for documents the type is the |
516 | document's MIME type. | 516 | document's MIME type. |
517 | */ | 517 | */ |
518 | QString AppLnk::type() const | 518 | QString AppLnk::type() const |
519 | { | 519 | { |
520 | if ( mType.isNull() ) { | 520 | if ( mType.isNull() ) { |
521 | AppLnk* that = (AppLnk*)this; | 521 | AppLnk* that = (AppLnk*)this; |
522 | QString f = file(); | 522 | QString f = file(); |
523 | if ( !f.isNull() ) { | 523 | if ( !f.isNull() ) { |
524 | MimeType mt(f); | 524 | MimeType mt(f); |
525 | that->mType = mt.id(); | 525 | that->mType = mt.id(); |
526 | return that->mType; | 526 | return that->mType; |
527 | } | 527 | } |
528 | } | 528 | } |
529 | return mType; | 529 | return mType; |
530 | } | 530 | } |
531 | 531 | ||
532 | /*! | 532 | /*! |
533 | Returns the file associated with the AppLnk. | 533 | Returns the file associated with the AppLnk. |
534 | 534 | ||
535 | \sa exec() name() | 535 | \sa exec() name() |
536 | */ | 536 | */ |
537 | QString AppLnk::file() const | 537 | QString AppLnk::file() const |
538 | { | 538 | { |
539 | if ( mExec.isEmpty ( ) && mFile.isNull() ) { | 539 | if ( mExec.isEmpty ( ) && mFile.isNull() ) { |
540 | AppLnk* that = (AppLnk*)this; | 540 | AppLnk* that = (AppLnk*)this; |
541 | QString ext = MimeType(mType).extension(); | 541 | QString ext = MimeType(mType).extension(); |
542 | if ( !ext.isEmpty() ) | 542 | if ( !ext.isEmpty() ) |
543 | ext = "." + ext; | 543 | ext = "." + ext; |
544 | if ( !mLinkFile.isEmpty() ) { | 544 | if ( !mLinkFile.isEmpty() ) { |
545 | that->mFile = | 545 | that->mFile = |
546 | mLinkFile.right(8)==".desktop" // 8 = strlen(".desktop") | 546 | mLinkFile.right(8)==".desktop" // 8 = strlen(".desktop") |
547 | ? mLinkFile.left(mLinkFile.length()-8) : mLinkFile; | 547 | ? mLinkFile.left(mLinkFile.length()-8) : mLinkFile; |
548 | qDebug("mFile now == %s", mFile.latin1()); | 548 | qDebug("mFile now == %s", mFile.latin1()); |
549 | } else if ( mType.contains('/') ) { | 549 | } else if ( mType.contains('/') ) { |
550 | that->mFile = | 550 | that->mFile = |
551 | QString(getenv("HOME"))+"/Documents/"+mType+"/"+safeFileName(that->mName); | 551 | QString(getenv("HOME"))+"/Documents/"+mType+"/"+safeFileName(that->mName); |
552 | /* | 552 | /* |
553 | * A file with the same name or a .desktop file already exists | 553 | * A file with the same name or a .desktop file already exists |
554 | */ | 554 | */ |
555 | if ( QFile::exists(that->mFile+ext) || QFile::exists(that->mFile+".desktop") ) { | 555 | if ( QFile::exists(that->mFile+ext) || QFile::exists(that->mFile+".desktop") ) { |
556 | int n=1; | 556 | int n=1; |
557 | QString nn; | 557 | QString nn; |
558 | while (QFile::exists((nn=(that->mFile+"_"+QString::number(n)))+ext) | 558 | while (QFile::exists((nn=(that->mFile+"_"+QString::number(n)))+ext) |
559 | || QFile::exists(nn+".desktop")) | 559 | || QFile::exists(nn+".desktop")) |
560 | n++; | 560 | n++; |
561 | that->mFile = nn; | 561 | that->mFile = nn; |
562 | } | 562 | } |
563 | that->mLinkFile = that->mFile+".desktop"; | 563 | that->mLinkFile = that->mFile+".desktop"; |
564 | that->mFile += ext; | 564 | that->mFile += ext; |
565 | } | 565 | } |
566 | prepareDirectories(that->mFile); | 566 | prepareDirectories(that->mFile); |
567 | if ( !that->mFile.isEmpty() ) { | 567 | if ( !that->mFile.isEmpty() ) { |
568 | QFile f(that->mFile); | 568 | QFile f(that->mFile); |
569 | if ( !f.open(IO_WriteOnly) ) | 569 | if ( !f.open(IO_WriteOnly) ) |
570 | that->mFile = QString::null; | 570 | that->mFile = QString::null; |
571 | return that->mFile; | 571 | return that->mFile; |
572 | } | 572 | } |
573 | } | 573 | } |
574 | return mFile; | 574 | return mFile; |
575 | } | 575 | } |
576 | 576 | ||
577 | /*! | 577 | /*! |
578 | Returns the desktop file corresponding to this AppLnk. | 578 | Returns the desktop file corresponding to this AppLnk. |
579 | 579 | ||
580 | \sa file() exec() name() | 580 | \sa file() exec() name() |
581 | */ | 581 | */ |
582 | QString AppLnk::linkFile() const | 582 | QString AppLnk::linkFile() const |
583 | { | 583 | { |
584 | if ( mLinkFile.isNull() ) { | 584 | if ( mLinkFile.isNull() ) { |
585 | AppLnk* that = (AppLnk*)this; | 585 | AppLnk* that = (AppLnk*)this; |
586 | if ( type().contains('/') ) { | 586 | if ( type().contains('/') ) { |
587 | StorageInfo storage; | 587 | StorageInfo storage; |
588 | const FileSystem *fs = storage.fileSystemOf( that->mFile ); | 588 | const FileSystem *fs = storage.fileSystemOf( that->mFile ); |
589 | /* tmpfs + and ramfs are available too but not removable | 589 | /* tmpfs + and ramfs are available too but not removable |
590 | * either we fix storage or add this | 590 | * either we fix storage or add this |
591 | */ | 591 | */ |
592 | if ( fs && ( fs->isRemovable() || fs->disk() == "/dev/mtdblock6" || fs->disk() == "tmpfs") ) { | 592 | if ( fs && ( fs->isRemovable() || fs->disk() == "/dev/mtdblock6" || fs->disk() == "tmpfs") ) { |
593 | that->mLinkFile = fs->path(); | 593 | that->mLinkFile = fs->path(); |
594 | } else | 594 | } else |
595 | that->mLinkFile = getenv( "HOME" ); | 595 | that->mLinkFile = getenv( "HOME" ); |
596 | that->mLinkFile += "/Documents/"+type()+"/"+safeFileName(that->mName); | 596 | that->mLinkFile += "/Documents/"+type()+"/"+safeFileName(that->mName); |
597 | 597 | ||
598 | /* the desktop file exists make sure we don't point to the same file */ | 598 | /* the desktop file exists make sure we don't point to the same file */ |
599 | if ( QFile::exists(that->mLinkFile+".desktop") ) { | 599 | if ( QFile::exists(that->mLinkFile+".desktop") ) { |
600 | AppLnk lnk( that->mLinkFile + ".desktop" ); | 600 | AppLnk lnk( that->mLinkFile + ".desktop" ); |
601 | 601 | ||
602 | /* the linked is different */ | 602 | /* the linked is different */ |
603 | if(that->file() != lnk.file() ) { | 603 | if(that->file() != lnk.file() ) { |
604 | int n = 1; | 604 | int n = 1; |
605 | QString nn; | 605 | QString nn; |
606 | while (QFile::exists((nn=that->mLinkFile+"_"+QString::number(n))+".desktop")) { | 606 | while (QFile::exists((nn=that->mLinkFile+"_"+QString::number(n))+".desktop")) { |
607 | n++; | 607 | n++; |
608 | /* just to be sure */ | 608 | /* just to be sure */ |
609 | AppLnk lnk(nn ); | 609 | AppLnk lnk(nn ); |
610 | if (lnk.file() == that->file() ) | 610 | if (lnk.file() == that->file() ) |
611 | break; | 611 | break; |
612 | } | 612 | } |
613 | that->mLinkFile = nn; | 613 | that->mLinkFile = nn; |
614 | } | 614 | } |
615 | } | 615 | } |
616 | that->mLinkFile += ".desktop"; | 616 | that->mLinkFile += ".desktop"; |
617 | storeLink(); | 617 | storeLink(); |
618 | } | 618 | } |
619 | return that->mLinkFile; | 619 | return that->mLinkFile; |
620 | } | 620 | } |
621 | return mLinkFile; | 621 | return mLinkFile; |
622 | } | 622 | } |
623 | 623 | ||
624 | /*! | 624 | /*! |
625 | Copies \a copy. | 625 | Copies \a copy. |
626 | */ | 626 | */ |
627 | AppLnk::AppLnk( const AppLnk © ) | 627 | AppLnk::AppLnk( const AppLnk © ) |
628 | { | 628 | { |
629 | mName = copy.mName; | 629 | mName = copy.mName; |
630 | mPixmap = copy.mPixmap; | 630 | mPixmap = copy.mPixmap; |
631 | mBigPixmap = copy.mBigPixmap; | 631 | mBigPixmap = copy.mBigPixmap; |
632 | mExec = copy.mExec; | 632 | mExec = copy.mExec; |
633 | mType = copy.mType; | 633 | mType = copy.mType; |
634 | mRotation = copy.mRotation; | 634 | mRotation = copy.mRotation; |
635 | mComment = copy.mComment; | 635 | mComment = copy.mComment; |
636 | mFile = copy.mFile; | 636 | mFile = copy.mFile; |
637 | mLinkFile = copy.mLinkFile; | 637 | mLinkFile = copy.mLinkFile; |
638 | mIconFile = copy.mIconFile; | 638 | mIconFile = copy.mIconFile; |
639 | mMimeTypes = copy.mMimeTypes; | 639 | mMimeTypes = copy.mMimeTypes; |
640 | mMimeTypeIcons = copy.mMimeTypeIcons; | 640 | mMimeTypeIcons = copy.mMimeTypeIcons; |
641 | mId = 0; | 641 | mId = 0; |
642 | d = new AppLnkPrivate(); | 642 | d = new AppLnkPrivate(); |
643 | d->mCat = copy.d->mCat; | 643 | d->mCat = copy.d->mCat; |
644 | d->mCatList = copy.d->mCatList; | 644 | d->mCatList = copy.d->mCatList; |
645 | d->mPixmaps = copy.d->mPixmaps; | 645 | d->mPixmaps = copy.d->mPixmaps; |
646 | } | 646 | } |
647 | 647 | ||
648 | /*! | 648 | /*! |
649 | Destroys the AppLnk. Note that if the AppLnk is currently a member | 649 | Destroys the AppLnk. Note that if the AppLnk is currently a member |
650 | of an AppLnkSet, this will produce a run-time warning. | 650 | of an AppLnkSet, this will produce a run-time warning. |
651 | 651 | ||
652 | \sa AppLnkSet::add() AppLnkSet::remove() | 652 | \sa AppLnkSet::add() AppLnkSet::remove() |
653 | */ | 653 | */ |
654 | AppLnk::~AppLnk() | 654 | AppLnk::~AppLnk() |
655 | { | 655 | { |
656 | if ( mId ) | 656 | if ( mId ) |
657 | qWarning("Deleting AppLnk that is in an AppLnkSet"); | 657 | qWarning("Deleting AppLnk that is in an AppLnkSet"); |
658 | if ( d ) | 658 | if ( d ) |
659 | delete d; | 659 | delete d; |
660 | } | 660 | } |
661 | 661 | ||
662 | /*! | 662 | /*! |
663 | \overload | 663 | \overload |
664 | Executes the application associated with this AppLnk. | 664 | Executes the application associated with this AppLnk. |
665 | 665 | ||
666 | \sa exec() | 666 | \sa exec() |
667 | */ | 667 | */ |
668 | void AppLnk::execute() const | 668 | void AppLnk::execute() const |
669 | { | 669 | { |
670 | execute( QStringList::split( ' ', property( "Arguments" ) ) ); | 670 | execute( QStringList::split( ' ', property( "Arguments" ) ) ); |
671 | } | 671 | } |
672 | 672 | ||
673 | /*! | 673 | /*! |
674 | Executes the application associated with this AppLnk, with | 674 | Executes the application associated with this AppLnk, with |
675 | \a args as arguments. | 675 | \a args as arguments. |
676 | 676 | ||
677 | \sa exec() | 677 | \sa exec() |
678 | */ | 678 | */ |
679 | void AppLnk::execute(const QStringList& args) const | 679 | void AppLnk::execute(const QStringList& args) const |
680 | { | 680 | { |
681 | #ifdef Q_WS_QWS | 681 | #ifdef Q_WS_QWS |
682 | if ( !mRotation.isEmpty() ) { | 682 | if ( !mRotation.isEmpty() ) { |
683 | // ######## this will only work in the server | 683 | // ######## this will only work in the server |
684 | int rot = QPEApplication::defaultRotation(); | 684 | int rot = QPEApplication::defaultRotation(); |
685 | rot = (rot+mRotation.toInt())%360; | 685 | rot = (rot+mRotation.toInt())%360; |
686 | QCString old = getenv("QWS_DISPLAY"); | 686 | QCString old = getenv("QWS_DISPLAY"); |
687 | setenv("QWS_DISPLAY", QString("Transformed:Rot%1:0").arg(rot), 1); | 687 | setenv("QWS_DISPLAY", QString("Transformed:Rot%1:0").arg(rot), 1); |
688 | invoke(args); | 688 | invoke(args); |
689 | setenv("QWS_DISPLAY", old.data(), 1); | 689 | setenv("QWS_DISPLAY", old.data(), 1); |
690 | } else | 690 | } else |
691 | #endif | 691 | #endif |
692 | invoke(args); | 692 | invoke(args); |
693 | } | 693 | } |
694 | 694 | ||
695 | /*! | 695 | /*! |
696 | Invokes the application associated with this AppLnk, with | 696 | Invokes the application associated with this AppLnk, with |
697 | \a args as arguments. Rotation is not taken into account by | 697 | \a args as arguments. Rotation is not taken into account by |
698 | this function, so you should not call it directly. | 698 | this function, so you should not call it directly. |
699 | 699 | ||
700 | \sa execute() | 700 | \sa execute() |
701 | */ | 701 | */ |
702 | void AppLnk::invoke(const QStringList& args) const | 702 | void AppLnk::invoke(const QStringList& args) const |
703 | { | 703 | { |
704 | if ( property( "Arguments" ).isEmpty() ) | 704 | if ( property( "Arguments" ).isEmpty() ) |
705 | Global::execute( exec(), args[0] ); | 705 | Global::execute( exec(), args[0] ); |
706 | else | 706 | else |
707 | Global::execute( exec(), args.join( " " ) ); | 707 | Global::execute( exec(), args.join( " " ) ); |
708 | } | 708 | } |
709 | 709 | ||
710 | /*! | 710 | /*! |
711 | Sets the Exec property to \a exec. | 711 | Sets the Exec property to \a exec. |
712 | 712 | ||
713 | \sa exec() name() | 713 | \sa exec() name() |
714 | */ | 714 | */ |
715 | void AppLnk::setExec( const QString& exec ) | 715 | void AppLnk::setExec( const QString& exec ) |
716 | { | 716 | { |
717 | mExec = exec; | 717 | mExec = exec; |
718 | } | 718 | } |
719 | 719 | ||
720 | #if 0 // this was inlined for better BC | 720 | #if 0 // this was inlined for better BC |
721 | /*! | 721 | /*! |
722 | Sets the Rotation property to \a rot. | 722 | Sets the Rotation property to \a rot. |
723 | 723 | ||
724 | \sa rotation() | 724 | \sa rotation() |
725 | */ | 725 | */ |
726 | void AppLnk::setRotation ( const QString &rot ) | 726 | void AppLnk::setRotation ( const QString &rot ) |
727 | { | 727 | { |
728 | mRotation = rot; | 728 | mRotation = rot; |
729 | } | 729 | } |
730 | #endif | 730 | #endif |
731 | 731 | ||
732 | /*! | 732 | /*! |
733 | Sets the Name property to \a docname. | 733 | Sets the Name property to \a docname. |
734 | 734 | ||
735 | \sa name() | 735 | \sa name() |
736 | */ | 736 | */ |
737 | void AppLnk::setName( const QString& docname ) | 737 | void AppLnk::setName( const QString& docname ) |
738 | { | 738 | { |
739 | mName = docname; | 739 | mName = docname; |
740 | } | 740 | } |
741 | 741 | ||
742 | /*! | 742 | /*! |
743 | Sets the File property to \a filename. | 743 | Sets the File property to \a filename. |
744 | 744 | ||
745 | \sa file() name() | 745 | \sa file() name() |
746 | */ | 746 | */ |
747 | void AppLnk::setFile( const QString& filename ) | 747 | void AppLnk::setFile( const QString& filename ) |
748 | { | 748 | { |
749 | mFile = filename; | 749 | mFile = filename; |
750 | } | 750 | } |
751 | 751 | ||
752 | /*! | 752 | /*! |
753 | Sets the LinkFile property to \a filename. | 753 | Sets the LinkFile property to \a filename. |
754 | 754 | ||
755 | \sa linkFile() | 755 | \sa linkFile() |
756 | */ | 756 | */ |
757 | void AppLnk::setLinkFile( const QString& filename ) | 757 | void AppLnk::setLinkFile( const QString& filename ) |
758 | { | 758 | { |
759 | mLinkFile = filename; | 759 | mLinkFile = filename; |
760 | } | 760 | } |
761 | 761 | ||
762 | /*! | 762 | /*! |
763 | Sets the Comment property to \a comment. | 763 | Sets the Comment property to \a comment. |
764 | 764 | ||
765 | This text is displayed in the 'Details Dialog', for example if the | 765 | This text is displayed in the 'Details Dialog', for example if the |
766 | user uses the 'press-and-hold' gesture. | 766 | user uses the 'press-and-hold' gesture. |
767 | 767 | ||
768 | \sa comment() | 768 | \sa comment() |
769 | */ | 769 | */ |
770 | void AppLnk::setComment( const QString& comment ) | 770 | void AppLnk::setComment( const QString& comment ) |
771 | { | 771 | { |
772 | mComment = comment; | 772 | mComment = comment; |
773 | } | 773 | } |
774 | 774 | ||
775 | /*! | 775 | /*! |
776 | Sets the Type property to \a type. | 776 | Sets the Type property to \a type. |
777 | 777 | ||
778 | For applications, games and settings the type should be \c | 778 | For applications, games and settings the type should be \c |
779 | Application; for documents the type should be the document's MIME | 779 | Application; for documents the type should be the document's MIME |
780 | type. | 780 | type. |
781 | 781 | ||
782 | \sa type() | 782 | \sa type() |
783 | */ | 783 | */ |
784 | void AppLnk::setType( const QString& type ) | 784 | void AppLnk::setType( const QString& type ) |
785 | { | 785 | { |
786 | mType = type; | 786 | mType = type; |
787 | } | 787 | } |
788 | 788 | ||
789 | /*! | 789 | /*! |
790 | \fn QString AppLnk::icon() const | 790 | \fn QString AppLnk::icon() const |
791 | 791 | ||
792 | Returns the Icon property. | 792 | Returns the Icon property. |
793 | 793 | ||
794 | \sa setIcon() | 794 | \sa setIcon() |
795 | */ | 795 | */ |
796 | 796 | ||
797 | /*! | 797 | /*! |
798 | Sets the Icon property to \a iconname. This is the filename from | 798 | Sets the Icon property to \a iconname. This is the filename from |
799 | which the pixmap() and bigPixmap() are obtained. | 799 | which the pixmap() and bigPixmap() are obtained. |
800 | 800 | ||
801 | \sa icon() setSmallIconSize() setBigIconSize() | 801 | \sa icon() setSmallIconSize() setBigIconSize() |
802 | */ | 802 | */ |
803 | void AppLnk::setIcon( const QString& iconname ) | 803 | void AppLnk::setIcon( const QString& iconname ) |
804 | { | 804 | { |
805 | mIconFile = iconname; | 805 | mIconFile = iconname; |
806 | QImage unscaledIcon = Resource::loadImage( mIconFile ); | 806 | QImage unscaledIcon = Resource::loadImage( mIconFile ); |
807 | d->mPixmaps[0].convertFromImage( unscaledIcon.smoothScale( smallSize, smallSize ) ); | 807 | d->mPixmaps[0].convertFromImage( unscaledIcon.smoothScale( smallSize, smallSize ) ); |
808 | d->mPixmaps[1].convertFromImage( unscaledIcon.smoothScale( bigSize, bigSize ) ); | 808 | d->mPixmaps[1].convertFromImage( unscaledIcon.smoothScale( bigSize, bigSize ) ); |
809 | } | 809 | } |
810 | 810 | ||
811 | /*! | 811 | /*! |
812 | Sets the Categories property to \a c. | 812 | Sets the Categories property to \a c. |
813 | 813 | ||
814 | See the CategoryWidget for more details. | 814 | See the CategoryWidget for more details. |
815 | 815 | ||
816 | \sa categories() | 816 | \sa categories() |
817 | */ | 817 | */ |
818 | void AppLnk::setCategories( const QArray<int>& c ) | 818 | void AppLnk::setCategories( const QArray<int>& c ) |
819 | { | 819 | { |
820 | d->mCat = c; | 820 | d->mCat = c; |
821 | d->updateCatListFromArray(); | 821 | d->updateCatListFromArray(); |
822 | } | 822 | } |
823 | 823 | ||
824 | /*! | 824 | /*! |
825 | \fn QStringList AppLnk::mimeTypeIcons() const | 825 | \fn QStringList AppLnk::mimeTypeIcons() const |
826 | 826 | ||
827 | Returns the MimeTypeIcons property of the AppLnk. | 827 | Returns the MimeTypeIcons property of the AppLnk. |
828 | */ | 828 | */ |
829 | 829 | ||
830 | /*! | 830 | /*! |
831 | Attempts to ensure that the link file for this AppLnk exists, | 831 | Attempts to ensure that the link file for this AppLnk exists, |
832 | including creating any required directories. Returns TRUE if | 832 | including creating any required directories. Returns TRUE if |
833 | successful; otherwise returns FALSE. | 833 | successful; otherwise returns FALSE. |
834 | 834 | ||
835 | You should not need to use this function. | 835 | You should not need to use this function. |
836 | */ | 836 | */ |
837 | bool AppLnk::ensureLinkExists() const | 837 | bool AppLnk::ensureLinkExists() const |
838 | { | 838 | { |
839 | QString lf = linkFile(); | 839 | QString lf = linkFile(); |
840 | return prepareDirectories(lf); | 840 | return prepareDirectories(lf); |
841 | } | 841 | } |
842 | 842 | ||
843 | /*! | 843 | /*! |
844 | Commits the AppLnk to disk. Returns TRUE if the operation succeeded; | 844 | Commits the AppLnk to disk. Returns TRUE if the operation succeeded; |
845 | otherwise returns FALSE. | 845 | otherwise returns FALSE. |
846 | 846 | ||
847 | In addition, the "linkChanged(QString)" message is sent to the | 847 | In addition, the "linkChanged(QString)" message is sent to the |
848 | "QPE/System" \link qcop.html QCop\endlink channel. | 848 | "QPE/System" \link qcop.html QCop\endlink channel. |
849 | */ | 849 | */ |
850 | bool AppLnk::writeLink() const | 850 | bool AppLnk::writeLink() const |
851 | { | 851 | { |
852 | // Only re-writes settable parts | 852 | // Only re-writes settable parts |
853 | QString lf = linkFile(); | 853 | QString lf = linkFile(); |
854 | if ( !ensureLinkExists() ) | 854 | if ( !ensureLinkExists() ) |
855 | return FALSE; | 855 | return FALSE; |
856 | storeLink(); | 856 | storeLink(); |
857 | return TRUE; | 857 | return TRUE; |
858 | } | 858 | } |
859 | 859 | ||
860 | /*! | 860 | /*! |
861 | \internal | 861 | \internal |
862 | */ | 862 | */ |
863 | void AppLnk::storeLink() const | 863 | void AppLnk::storeLink() const |
864 | { | 864 | { |
865 | Config config( mLinkFile, Config::File ); | 865 | Config config( mLinkFile, Config::File ); |
866 | config.setGroup("Desktop Entry"); | 866 | config.setGroup("Desktop Entry"); |
867 | config.writeEntry("Name",mName); | 867 | config.writeEntry("Name",mName); |
868 | if ( !mIconFile.isNull() ) config.writeEntry("Icon",mIconFile); | 868 | if ( !mIconFile.isNull() ) config.writeEntry("Icon",mIconFile); |
869 | config.writeEntry("Type",type()); | 869 | config.writeEntry("Type",type()); |
870 | if(!rotation().isEmpty()) | 870 | if(!rotation().isEmpty()) |
871 | config.writeEntry("Rotation",rotation()); | 871 | config.writeEntry("Rotation",rotation()); |
872 | else | 872 | else |
873 | config.removeEntry("Rotation"); | 873 | config.removeEntry("Rotation"); |
874 | if ( !mComment.isNull() ) config.writeEntry("Comment",mComment); | 874 | if ( !mComment.isNull() ) config.writeEntry("Comment",mComment); |
875 | QString f = file(); | 875 | QString f = file(); |
876 | int i = 0; | 876 | int i = 0; |
877 | while ( i < (int)f.length() && i < (int)mLinkFile.length() && f[i] == mLinkFile[i] ) | 877 | while ( i < (int)f.length() && i < (int)mLinkFile.length() && f[i] == mLinkFile[i] ) |
878 | i++; | 878 | i++; |
879 | while ( i && f[i] != '/' ) | 879 | while ( i && f[i] != '/' ) |
880 | i--; | 880 | i--; |
881 | // simple case where in the same directory | 881 | // simple case where in the same directory |
882 | if ( mLinkFile.find( '/', i + 1 ) < 0 ) | 882 | if ( mLinkFile.find( '/', i + 1 ) < 0 ) |
883 | f = f.mid(i+1); | 883 | f = f.mid(i+1); |
884 | // ### could do relative ie ../../otherDocs/file.doc | 884 | // ### could do relative ie ../../otherDocs/file.doc |
885 | config.writeEntry("File",f); | 885 | config.writeEntry("File",f); |
886 | config.writeEntry( "Categories", d->mCatList, ';' ); | 886 | config.writeEntry( "Categories", d->mCatList, ';' ); |
887 | 887 | ||
888 | #ifndef QT_NO_COP | 888 | #ifndef QT_NO_COP |
889 | QCopEnvelope e("QPE/System", "linkChanged(QString)"); | 889 | QCopEnvelope e("QPE/System", "linkChanged(QString)"); |
890 | e << mLinkFile; | 890 | e << mLinkFile; |
891 | #endif | 891 | #endif |
892 | } | 892 | } |
893 | 893 | ||
894 | /*! | 894 | /*! |
895 | Sets the property named \a key to \a value. | 895 | Sets the property named \a key to \a value. |
896 | 896 | ||
897 | \sa property() | 897 | \sa property() |
898 | */ | 898 | */ |
899 | void AppLnk::setProperty(const QString& key, const QString& value) | 899 | void AppLnk::setProperty(const QString& key, const QString& value) |
900 | { | 900 | { |
901 | if ( ensureLinkExists() ) { | 901 | if ( ensureLinkExists() ) { |
902 | Config cfg(linkFile(), Config::File); | 902 | Config cfg(linkFile(), Config::File); |
903 | cfg.writeEntry(key,value); | 903 | cfg.writeEntry(key,value); |
904 | } | 904 | } |
905 | } | 905 | } |
906 | 906 | ||
907 | /*! | 907 | /*! |
908 | Returns the property named \a key. | 908 | Returns the property named \a key. |
909 | 909 | ||
910 | \sa setProperty() | 910 | \sa setProperty() |
911 | */ | 911 | */ |
912 | QString AppLnk::property(const QString& key) const | 912 | QString AppLnk::property(const QString& key) const |
913 | { | 913 | { |
914 | QString lf = linkFile(); | 914 | QString lf = linkFile(); |
915 | if ( !QFile::exists(lf) ) | 915 | if ( !QFile::exists(lf) ) |
916 | return QString::null; | 916 | return QString::null; |
917 | Config cfg(lf, Config::File); | 917 | Config cfg(lf, Config::File); |
918 | return cfg.readEntry(key); | 918 | return cfg.readEntry(key); |
919 | } | 919 | } |
920 | 920 | ||
921 | bool AppLnk::isPreloaded() const { | 921 | bool AppLnk::isPreloaded() const { |
922 | // Preload information is stored in the Launcher config in v1.5. | 922 | // Preload information is stored in the Launcher config in v1.5. |
923 | Config cfg("Launcher"); | 923 | Config cfg("Launcher"); |
924 | cfg.setGroup("Preload"); | 924 | cfg.setGroup("Preload"); |
925 | QStringList apps = cfg.readListEntry("Apps",','); | 925 | QStringList apps = cfg.readListEntry("Apps",','); |
926 | if (apps.contains(exec())) | 926 | if (apps.contains(exec())) |
927 | return true; | 927 | return true; |
928 | return false; | 928 | return false; |
929 | } | 929 | } |
930 | 930 | ||
931 | void AppLnk::setPreloaded(bool yesNo) { | 931 | void AppLnk::setPreloaded(bool yesNo) { |
932 | // Preload information is stored in the Launcher config in v1.5. | 932 | // Preload information is stored in the Launcher config in v1.5. |
933 | Config cfg("Launcher"); | 933 | Config cfg("Launcher"); |
934 | cfg.setGroup("Preload"); | 934 | cfg.setGroup("Preload"); |
935 | QStringList apps = cfg.readListEntry("Apps", ','); | 935 | QStringList apps = cfg.readListEntry("Apps", ','); |
936 | if (apps.contains(exec()) && !yesNo) | 936 | if (apps.contains(exec()) && !yesNo) |
937 | apps.remove(exec()); | 937 | apps.remove(exec()); |
938 | else if (yesNo && !apps.contains(exec())) | 938 | else if (yesNo && !apps.contains(exec())) |
939 | apps.append(exec()); | 939 | apps.append(exec()); |
940 | cfg.writeEntry("Apps", apps, ','); | 940 | cfg.writeEntry("Apps", apps, ','); |
941 | } | 941 | } |
942 | 942 | ||
943 | 943 | ||
944 | /*! | 944 | /*! |
945 | Deletes both the linkFile() and the file() associated with this AppLnk. | 945 | Deletes both the linkFile() and the file() associated with this AppLnk. |
946 | 946 | ||
947 | \sa removeLinkFile() | 947 | \sa removeLinkFile() |
948 | */ | 948 | */ |
949 | void AppLnk::removeFiles() | 949 | void AppLnk::removeFiles() |
950 | { | 950 | { |
951 | bool valid = isValid(); | 951 | bool valid = isValid(); |
952 | if ( !valid || !linkFileKnown() || QFile::remove(linkFile()) ) { | 952 | if ( !valid || !linkFileKnown() || QFile::remove(linkFile()) ) { |
953 | if ( QFile::remove(file()) ) { | 953 | if ( QFile::remove(file()) ) { |
954 | #ifndef QT_NO_COP | 954 | #ifndef QT_NO_COP |
955 | QCopEnvelope e("QPE/System", "linkChanged(QString)"); | 955 | QCopEnvelope e("QPE/System", "linkChanged(QString)"); |
956 | if ( linkFileKnown() ) | 956 | if ( linkFileKnown() ) |
957 | e << linkFile(); | 957 | e << linkFile(); |
958 | else | 958 | else |
959 | e << file(); | 959 | e << file(); |
960 | #endif | 960 | #endif |
961 | } else if ( valid ) { | 961 | } else if ( valid ) { |
962 | // restore link | 962 | // restore link |
963 | writeLink(); | 963 | writeLink(); |
964 | } | 964 | } |
965 | } | 965 | } |
966 | } | 966 | } |
967 | 967 | ||
968 | /*! | 968 | /*! |
969 | Deletes the linkFile(), leaving any file() untouched. | 969 | Deletes the linkFile(), leaving any file() untouched. |
970 | 970 | ||
971 | \sa removeFiles() | 971 | \sa removeFiles() |
972 | */ | 972 | */ |
973 | void AppLnk::removeLinkFile() | 973 | void AppLnk::removeLinkFile() |
974 | { | 974 | { |
975 | if ( isValid() && linkFileKnown() && QFile::remove(linkFile()) ) { | 975 | if ( isValid() && linkFileKnown() && QFile::remove(linkFile()) ) { |
976 | #ifndef QT_NO_COP | 976 | #ifndef QT_NO_COP |
977 | QCopEnvelope e("QPE/System", "linkChanged(QString)"); | 977 | QCopEnvelope e("QPE/System", "linkChanged(QString)"); |
978 | e << linkFile(); | 978 | e << linkFile(); |
979 | #endif | 979 | #endif |
980 | } | 980 | } |
981 | } | 981 | } |
982 | 982 | ||
983 | class AppLnkSetPrivate { | 983 | class AppLnkSetPrivate { |
984 | public: | 984 | public: |
985 | AppLnkSetPrivate() | 985 | AppLnkSetPrivate() |
986 | { | 986 | { |
987 | typPix.setAutoDelete(TRUE); | 987 | typPix.setAutoDelete(TRUE); |
988 | typPixBig.setAutoDelete(TRUE); | 988 | typPixBig.setAutoDelete(TRUE); |
989 | typName.setAutoDelete(TRUE); | 989 | typName.setAutoDelete(TRUE); |
990 | } | 990 | } |
991 | 991 | ||
992 | QDict<QPixmap> typPix; | 992 | QDict<QPixmap> typPix; |
993 | QDict<QPixmap> typPixBig; | 993 | QDict<QPixmap> typPixBig; |
994 | QDict<QString> typName; | 994 | QDict<QString> typName; |
995 | }; | 995 | }; |
996 | 996 | ||
997 | /*! | 997 | /*! |
998 | \class AppLnkSet applnk.h | 998 | \class AppLnkSet applnk.h |
999 | \brief The AppLnkSet class is a set of AppLnk objects. | 999 | \brief The AppLnkSet class is a set of AppLnk objects. |
1000 | */ | 1000 | */ |
1001 | 1001 | ||
1002 | /*! | 1002 | /*! |
1003 | \fn QStringList AppLnkSet::types() const | 1003 | \fn QStringList AppLnkSet::types() const |
1004 | 1004 | ||
1005 | Returns the list of \link applnk.html#Types types\endlink in the set. | 1005 | Returns the list of \link applnk.html#Types types\endlink in the set. |
1006 | 1006 | ||
1007 | For applications, games and settings the type is \c Application; | 1007 | For applications, games and settings the type is \c Application; |
1008 | for documents the type is the document's MIME type. | 1008 | for documents the type is the document's MIME type. |
1009 | 1009 | ||
1010 | \sa AppLnk::type(), typeName(), typePixmap(), typeBigPixmap() | 1010 | \sa AppLnk::type(), typeName(), typePixmap(), typeBigPixmap() |
1011 | */ | 1011 | */ |
1012 | 1012 | ||
1013 | /*! | 1013 | /*! |
1014 | \fn const QList<AppLnk>& AppLnkSet::children() const | 1014 | \fn const QList<AppLnk>& AppLnkSet::children() const |
1015 | 1015 | ||
1016 | Returns the members of the set. | 1016 | Returns the members of the set. |
1017 | */ | 1017 | */ |
1018 | 1018 | ||
1019 | /*! | 1019 | /*! |
1020 | Constructs an empty AppLnkSet. | 1020 | Constructs an empty AppLnkSet. |
1021 | */ | 1021 | */ |
1022 | AppLnkSet::AppLnkSet() : | 1022 | AppLnkSet::AppLnkSet() : |
1023 | d(new AppLnkSetPrivate) | 1023 | d(new AppLnkSetPrivate) |
1024 | { | 1024 | { |
1025 | } | 1025 | } |
1026 | 1026 | ||
1027 | /*! | 1027 | /*! |
1028 | Constructs an AppLnkSet that contains AppLnk objects representing | 1028 | Constructs an AppLnkSet that contains AppLnk objects representing |
1029 | all the files in the given \a directory (and any subdirectories | 1029 | all the files in the given \a directory (and any subdirectories |
1030 | recursively). | 1030 | recursively). |
1031 | 1031 | ||
1032 | \omit | 1032 | \omit |
1033 | The directories may contain ".directory" files which override | 1033 | The directories may contain ".directory" files which override |
1034 | any AppLnk::type() values for AppLnk objects found in the directory. | 1034 | any AppLnk::type() values for AppLnk objects found in the directory. |
1035 | This allows simple localization of application types. | 1035 | This allows simple localization of application types. |
1036 | \endomit | 1036 | \endomit |
1037 | */ | 1037 | */ |
1038 | AppLnkSet::AppLnkSet( const QString &directory ) : | 1038 | AppLnkSet::AppLnkSet( const QString &directory ) : |
1039 | d(new AppLnkSetPrivate) | 1039 | d(new AppLnkSetPrivate) |
1040 | { | 1040 | { |
1041 | QDir dir( directory ); | 1041 | QDir dir( directory ); |
1042 | mFile = directory; | 1042 | mFile = directory; |
1043 | findChildren(directory,QString::null,QString::null); | 1043 | findChildren(directory,QString::null,QString::null); |
1044 | } | 1044 | } |
1045 | 1045 | ||
1046 | /*! | 1046 | /*! |
1047 | Detaches all AppLnk objects from the set. The set become empty and | 1047 | Detaches all AppLnk objects from the set. The set become empty and |
1048 | the caller becomes responsible for deleting the AppLnk objects. | 1048 | the caller becomes responsible for deleting the AppLnk objects. |
1049 | */ | 1049 | */ |
1050 | void AppLnkSet::detachChildren() | 1050 | void AppLnkSet::detachChildren() |
1051 | { | 1051 | { |
1052 | QListIterator<AppLnk> it( mApps ); | 1052 | QListIterator<AppLnk> it( mApps ); |
1053 | for ( ; it.current(); ) { | 1053 | for ( ; it.current(); ) { |
1054 | AppLnk* a = *it; | 1054 | AppLnk* a = *it; |
1055 | ++it; | 1055 | ++it; |
1056 | a->mId = 0; | 1056 | a->mId = 0; |
1057 | } | 1057 | } |
1058 | mApps.clear(); | 1058 | mApps.clear(); |
1059 | } | 1059 | } |
1060 | 1060 | ||
1061 | /*! | 1061 | /*! |
1062 | Destroys the set, deleting all the AppLnk objects it contains. | 1062 | Destroys the set, deleting all the AppLnk objects it contains. |
1063 | 1063 | ||
1064 | \sa detachChildren() | 1064 | \sa detachChildren() |
1065 | */ | 1065 | */ |
1066 | AppLnkSet::~AppLnkSet() | 1066 | AppLnkSet::~AppLnkSet() |
1067 | { | 1067 | { |
1068 | QListIterator<AppLnk> it( mApps ); | 1068 | QListIterator<AppLnk> it( mApps ); |
1069 | for ( ; it.current(); ) { | 1069 | for ( ; it.current(); ) { |
1070 | AppLnk* a = *it; | 1070 | AppLnk* a = *it; |
1071 | ++it; | 1071 | ++it; |
1072 | a->mId = 0; | 1072 | a->mId = 0; |
1073 | delete a; | 1073 | delete a; |
1074 | } | 1074 | } |
1075 | delete d; | 1075 | delete d; |
1076 | } | 1076 | } |
1077 | 1077 | ||
1078 | void AppLnkSet::findChildren(const QString &dr, const QString& typ, const QString& typName, int depth) | 1078 | void AppLnkSet::findChildren(const QString &dr, const QString& typ, const QString& typName, int depth) |
1079 | { | 1079 | { |
1080 | depth++; | 1080 | depth++; |
1081 | if ( depth > 10 ) | 1081 | if ( depth > 10 ) |
1082 | return; | 1082 | return; |
1083 | 1083 | ||
1084 | QDir dir( dr ); | 1084 | QDir dir( dr ); |
1085 | QString typNameLocal = typName; | 1085 | QString typNameLocal = typName; |
1086 | 1086 | ||
1087 | if ( dir.exists( ".directory" ) ) { | 1087 | if ( dir.exists( ".directory" ) ) { |
1088 | Config config( dr + "/.directory", Config::File ); | 1088 | Config config( dr + "/.directory", Config::File ); |
1089 | config.setGroup( "Desktop Entry" ); | 1089 | config.setGroup( "Desktop Entry" ); |
1090 | typNameLocal = config.readEntry( "Name", typNameLocal ); | 1090 | typNameLocal = config.readEntry( "Name", typNameLocal ); |
1091 | if ( !typ.isEmpty() ) { | 1091 | if ( !typ.isEmpty() ) { |
1092 | QString iconFile = config.readEntry( "Icon", "AppsIcon" ); | 1092 | QString iconFile = config.readEntry( "Icon", "AppsIcon" ); |
1093 | QImage unscaledIcon = Resource::loadImage( iconFile ); | 1093 | QImage unscaledIcon = Resource::loadImage( iconFile ); |
1094 | QPixmap pm, bpm; | 1094 | QPixmap pm, bpm; |
1095 | pm.convertFromImage( unscaledIcon.smoothScale( smallSize, smallSize ) ); | 1095 | pm.convertFromImage( unscaledIcon.smoothScale( smallSize, smallSize ) ); |
1096 | bpm.convertFromImage( unscaledIcon.smoothScale( bigSize, bigSize ) ); | 1096 | bpm.convertFromImage( unscaledIcon.smoothScale( bigSize, bigSize ) ); |
1097 | d->typPix.insert(typ, new QPixmap(pm)); | 1097 | d->typPix.insert(typ, new QPixmap(pm)); |
1098 | d->typPixBig.insert(typ, new QPixmap(bpm)); | 1098 | d->typPixBig.insert(typ, new QPixmap(bpm)); |
1099 | d->typName.insert(typ, new QString(typNameLocal)); | 1099 | d->typName.insert(typ, new QString(typNameLocal)); |
1100 | } | 1100 | } |
1101 | } | 1101 | } |
1102 | 1102 | ||
1103 | const QFileInfoList *list = dir.entryInfoList(); | 1103 | const QFileInfoList *list = dir.entryInfoList(); |
1104 | if ( list ) { | 1104 | if ( list ) { |
1105 | QFileInfo* fi; | 1105 | QFileInfo* fi; |
1106 | bool cadded=FALSE; | 1106 | bool cadded=FALSE; |
1107 | for ( QFileInfoListIterator it(*list); (fi=*it); ++it ) { | 1107 | for ( QFileInfoListIterator it(*list); (fi=*it); ++it ) { |
1108 | QString bn = fi->fileName(); | 1108 | QString bn = fi->fileName(); |
1109 | // qDebug("findChildren "+bn); | 1109 | // qDebug("findChildren "+bn); |
1110 | if ( bn[0] != '.' && bn != "CVS" ) { | 1110 | if ( bn[0] != '.' && bn != "CVS" ) { |
1111 | if ( fi->isDir() ) { | 1111 | if ( fi->isDir() ) { |
1112 | QString c = typ.isNull() ? bn : typ+"/"+bn; | 1112 | QString c = typ.isNull() ? bn : typ+"/"+bn; |
1113 | QString d = typNameLocal.isNull() ? bn : typNameLocal+"/"+bn; | 1113 | QString d = typNameLocal.isNull() ? bn : typNameLocal+"/"+bn; |
1114 | findChildren(fi->filePath(), c, d, depth ); | 1114 | findChildren(fi->filePath(), c, d, depth ); |
1115 | } else { | 1115 | } else { |
1116 | if ( fi->extension(FALSE) == "desktop" ) { | 1116 | if ( fi->extension(FALSE) == "desktop" ) { |
1117 | AppLnk* app = new AppLnk( fi->filePath() ); | 1117 | AppLnk* app = new AppLnk( fi->filePath() ); |
1118 | #ifdef QT_NO_QWS_MULTIPROCESS | 1118 | #ifdef QT_NO_QWS_MULTIPROCESS |
1119 | if ( !Global::isBuiltinCommand( app->exec() ) ) | 1119 | if ( !Global::isBuiltinCommand( app->exec() ) ) |
1120 | delete app; | 1120 | delete app; |
1121 | else | 1121 | else |
1122 | #endif | 1122 | #endif |
1123 | { | 1123 | { |
1124 | if ( !typ.isEmpty() ) { | 1124 | if ( !typ.isEmpty() ) { |
1125 | if ( !cadded ) { | 1125 | if ( !cadded ) { |
1126 | typs.append(typ); | 1126 | typs.append(typ); |
1127 | cadded = TRUE; | 1127 | cadded = TRUE; |
1128 | } | 1128 | } |
1129 | app->setType(typ); | 1129 | app->setType(typ); |
1130 | } | 1130 | } |
1131 | add(app); | 1131 | add(app); |
1132 | } | 1132 | } |
1133 | } | 1133 | } |
1134 | } | 1134 | } |
1135 | } | 1135 | } |
1136 | } | 1136 | } |
1137 | } | 1137 | } |
1138 | } | 1138 | } |
1139 | 1139 | ||
1140 | /*! | 1140 | /*! |
1141 | Adds AppLnk \a f to the set. The set takes responsibility for | 1141 | Adds AppLnk \a f to the set. The set takes responsibility for |
1142 | deleting \a f. | 1142 | deleting \a f. |
1143 | 1143 | ||
1144 | \sa remove() | 1144 | \sa remove() |
1145 | */ | 1145 | */ |
1146 | void AppLnkSet::add( AppLnk *f ) | 1146 | void AppLnkSet::add( AppLnk *f ) |
1147 | { | 1147 | { |
1148 | if ( f->mId == 0 ) { | 1148 | if ( f->mId == 0 ) { |
1149 | AppLnk::lastId++; | 1149 | AppLnk::lastId++; |
1150 | f->mId = AppLnk::lastId; | 1150 | f->mId = AppLnk::lastId; |
1151 | mApps.append( f ); | 1151 | mApps.append( f ); |
1152 | } else { | 1152 | } else { |
1153 | qWarning("Attempt to add an AppLnk twice"); | 1153 | qWarning("Attempt to add an AppLnk twice"); |
1154 | } | 1154 | } |
1155 | } | 1155 | } |
1156 | 1156 | ||
1157 | /*! | 1157 | /*! |
1158 | Removes AppLnk \a f to the set. The caller becomes responsible for | 1158 | Removes AppLnk \a f to the set. The caller becomes responsible for |
1159 | deleting \a f. Returns TRUE if \a f was in the set; otherwise | 1159 | deleting \a f. Returns TRUE if \a f was in the set; otherwise |
1160 | returns FALSE. | 1160 | returns FALSE. |
1161 | 1161 | ||
1162 | \sa add() | 1162 | \sa add() |
1163 | */ | 1163 | */ |
1164 | bool AppLnkSet::remove( AppLnk *f ) | 1164 | bool AppLnkSet::remove( AppLnk *f ) |
1165 | { | 1165 | { |
1166 | if ( mApps.remove( f ) ) { | 1166 | if ( mApps.remove( f ) ) { |
1167 | f->mId = 0; | 1167 | f->mId = 0; |
1168 | return TRUE; | 1168 | return TRUE; |
1169 | } | 1169 | } |
1170 | return FALSE; | 1170 | return FALSE; |
1171 | } | 1171 | } |
1172 | 1172 | ||
1173 | 1173 | ||
1174 | /*! | 1174 | /*! |
1175 | Returns the localized name for type \a t. | 1175 | Returns the localized name for type \a t. |
1176 | 1176 | ||
1177 | For applications, games and settings the type is \c Application; | 1177 | For applications, games and settings the type is \c Application; |
1178 | for documents the type is the document's MIME type. | 1178 | for documents the type is the document's MIME type. |
1179 | */ | 1179 | */ |
1180 | QString AppLnkSet::typeName( const QString& t ) const | 1180 | QString AppLnkSet::typeName( const QString& t ) const |
1181 | { | 1181 | { |
1182 | QString *st = d->typName.find(t); | 1182 | QString *st = d->typName.find(t); |
1183 | return st ? *st : QString::null; | 1183 | return st ? *st : QString::null; |
1184 | } | 1184 | } |
1185 | 1185 | ||
1186 | /*! | 1186 | /*! |
1187 | Returns the small pixmap associated with type \a t. | 1187 | Returns the small pixmap associated with type \a t. |
1188 | 1188 | ||
1189 | For applications, games and settings the type is \c Application; | 1189 | For applications, games and settings the type is \c Application; |
1190 | for documents the type is the document's MIME type. | 1190 | for documents the type is the document's MIME type. |
1191 | */ | 1191 | */ |
1192 | QPixmap AppLnkSet::typePixmap( const QString& t ) const | 1192 | QPixmap AppLnkSet::typePixmap( const QString& t ) const |
1193 | { | 1193 | { |
1194 | QPixmap *pm = d->typPix.find(t); | 1194 | QPixmap *pm = d->typPix.find(t); |
1195 | return pm ? *pm : QPixmap(); | 1195 | return pm ? *pm : QPixmap(); |
1196 | } | 1196 | } |
1197 | 1197 | ||
1198 | /*! | 1198 | /*! |
1199 | Returns the large pixmap associated with type \a t. | 1199 | Returns the large pixmap associated with type \a t. |
1200 | 1200 | ||
1201 | For applications, games and settings the type is \c Application; | 1201 | For applications, games and settings the type is \c Application; |
1202 | for documents the type is the document's MIME type. | 1202 | for documents the type is the document's MIME type. |
1203 | */ | 1203 | */ |
1204 | QPixmap AppLnkSet::typeBigPixmap( const QString& t ) const | 1204 | QPixmap AppLnkSet::typeBigPixmap( const QString& t ) const |
1205 | { | 1205 | { |
1206 | QPixmap *pm = d->typPixBig.find(t); | 1206 | QPixmap *pm = d->typPixBig.find(t); |
1207 | return pm ? *pm : QPixmap(); | 1207 | return pm ? *pm : QPixmap(); |
1208 | } | 1208 | } |
1209 | 1209 | ||
1210 | /*! | 1210 | /*! |
1211 | Returns the AppLnk with the given \a id. | 1211 | Returns the AppLnk with the given \a id. |
1212 | */ | 1212 | */ |
1213 | const AppLnk *AppLnkSet::find( int id ) const | 1213 | const AppLnk *AppLnkSet::find( int id ) const |
1214 | { | 1214 | { |
1215 | QListIterator<AppLnk> it( children() ); | 1215 | QListIterator<AppLnk> it( children() ); |
1216 | 1216 | ||
1217 | for ( ; it.current(); ++it ) { | 1217 | for ( ; it.current(); ++it ) { |
1218 | const AppLnk *app = it.current(); | 1218 | const AppLnk *app = it.current(); |
1219 | if ( app->id() == id ) | 1219 | if ( app->id() == id ) |
1220 | return app; | 1220 | return app; |
1221 | } | 1221 | } |
1222 | 1222 | ||
1223 | return 0; | 1223 | return 0; |
1224 | } | 1224 | } |
1225 | 1225 | ||
1226 | /*! | 1226 | /*! |
1227 | Returns the AppLnk with the given \a exec attribute. | 1227 | Returns the AppLnk with the given \a exec attribute. |
1228 | */ | 1228 | */ |
1229 | const AppLnk *AppLnkSet::findExec( const QString& exec ) const | 1229 | const AppLnk *AppLnkSet::findExec( const QString& exec ) const |
1230 | { | 1230 | { |
1231 | QListIterator<AppLnk> it( children() ); | 1231 | QListIterator<AppLnk> it( children() ); |
1232 | 1232 | ||
1233 | for ( ; it.current(); ++it ) { | 1233 | for ( ; it.current(); ++it ) { |
1234 | const AppLnk *app = it.current(); | 1234 | const AppLnk *app = it.current(); |
1235 | if ( app->exec() == exec ) | 1235 | if ( app->exec() == exec ) |
1236 | return app; | 1236 | return app; |
1237 | } | 1237 | } |
1238 | 1238 | ||
1239 | return 0; | 1239 | return 0; |
1240 | } | 1240 | } |
1241 | 1241 | ||
1242 | /*! | 1242 | /*! |
1243 | \class DocLnkSet applnk.h | 1243 | \class DocLnkSet applnk.h |
1244 | \brief The DocLnkSet class is a set of DocLnk objects. | 1244 | \brief The DocLnkSet class is a set of DocLnk objects. |
1245 | */ | 1245 | */ |
1246 | 1246 | ||
1247 | /*! | 1247 | /*! |
1248 | \fn const QList<DocLnk>& DocLnkSet::children() const | 1248 | \fn const QList<DocLnk>& DocLnkSet::children() const |
1249 | 1249 | ||
1250 | Returns the members of the set. | 1250 | Returns the members of the set. |
1251 | */ | 1251 | */ |
1252 | 1252 | ||
1253 | /*! | 1253 | /*! |
1254 | Constructs an empty DocLnkSet. | 1254 | Constructs an empty DocLnkSet. |
1255 | 1255 | ||
1256 | \sa appendFrom() | 1256 | \sa appendFrom() |
1257 | */ | 1257 | */ |
1258 | DocLnkSet::DocLnkSet() | 1258 | DocLnkSet::DocLnkSet() |
1259 | { | 1259 | { |
1260 | } | 1260 | } |
1261 | 1261 | ||
1262 | /*! | 1262 | /*! |
1263 | Constructs a DocLnkSet that contains DocLnk objects representing all | 1263 | Constructs a DocLnkSet that contains DocLnk objects representing all |
1264 | the files in the \a directory (and any subdirectories, recursively). | 1264 | the files in the \a directory (and any subdirectories, recursively). |
1265 | 1265 | ||
1266 | If \a mimefilter is not null, | 1266 | If \a mimefilter is not null, |
1267 | only documents with a MIME type matching \a mimefilter are selected. | 1267 | only documents with a MIME type matching \a mimefilter are selected. |
1268 | The value may contain multiple wild-card patterns separated by ";", | 1268 | The value may contain multiple wild-card patterns separated by ";", |
1269 | such as \c{*o/mpeg;audio/x-wav}. | 1269 | such as \c{*o/mpeg;audio/x-wav}. |
1270 | 1270 | ||
1271 | See also \link applnk.html#files-and-links Files and Links\endlink. | 1271 | See also \link applnk.html#files-and-links Files and Links\endlink. |
1272 | 1272 | ||
1273 | */ | 1273 | */ |
1274 | DocLnkSet::DocLnkSet( const QString &directory, const QString& mimefilter ) : | 1274 | DocLnkSet::DocLnkSet( const QString &directory, const QString& mimefilter ) : |
1275 | AppLnkSet() | 1275 | AppLnkSet() |
1276 | { | 1276 | { |
1277 | QDir dir( directory ); | 1277 | QDir dir( directory ); |
1278 | mFile = dir.dirName(); | 1278 | mFile = dir.dirName(); |
1279 | QDict<void> reference; | 1279 | QDict<void> reference(1021); |
1280 | 1280 | ||
1281 | QStringList subFilter = QStringList::split(";", mimefilter); | 1281 | QStringList subFilter = QStringList::split(";", mimefilter); |
1282 | QValueList<QRegExp> mimeFilters; | 1282 | QValueList<QRegExp> mimeFilters; |
1283 | for( QStringList::Iterator it = subFilter.begin(); it != subFilter.end(); ++ it ) | 1283 | for( QStringList::Iterator it = subFilter.begin(); it != subFilter.end(); ++ it ) |
1284 | mimeFilters.append( QRegExp(*it, FALSE, TRUE) ); | 1284 | mimeFilters.append( QRegExp(*it, FALSE, TRUE) ); |
1285 | 1285 | ||
1286 | findChildren(directory, mimeFilters, reference); | 1286 | findChildren(directory, mimeFilters, reference); |
1287 | 1287 | ||
1288 | const QList<DocLnk> &list = children(); | 1288 | const QList<DocLnk> &list = children(); |
1289 | for ( QListIterator<DocLnk> it( list ); it.current(); ++it ) { | 1289 | for ( QListIterator<DocLnk> it( list ); it.current(); ++it ) { |
1290 | reference.remove( (*it)->file() ); | 1290 | reference.remove( (*it)->file() ); |
1291 | } | 1291 | } |
1292 | for ( QDictIterator<void> dit(reference); dit.current(); ++dit ) { | 1292 | for ( QDictIterator<void> dit(reference); dit.current(); ++dit ) { |
1293 | if ( dit.current() == (void*)2 ) { | 1293 | if ( dit.current() == (void*)2 ) { |
1294 | // Unreferenced, make an unwritten link | 1294 | // Unreferenced, make an unwritten link |
1295 | DocLnk* dl = new DocLnk; | 1295 | DocLnk* dl = new DocLnk; |
1296 | QFileInfo fi( dit.currentKey() ); | 1296 | QFileInfo fi( dit.currentKey() ); |
1297 | dl->setFile(fi.filePath()); | 1297 | dl->setFile(fi.filePath()); |
1298 | dl->setName(fi.baseName()); | 1298 | dl->setName(fi.baseName()); |
1299 | // #### default to current path? | 1299 | // #### default to current path? |
1300 | // dl->setCategories( ... ); | 1300 | // dl->setCategories( ... ); |
1301 | bool match = mimefilter.isNull(); | 1301 | bool match = mimefilter.isNull(); |
1302 | if ( !match ) | 1302 | if ( !match ) |
1303 | for( QValueList<QRegExp>::Iterator it = mimeFilters.begin(); it != mimeFilters.end() && !match; ++ it ) | 1303 | for( QValueList<QRegExp>::Iterator it = mimeFilters.begin(); it != mimeFilters.end() && !match; ++ it ) |
1304 | if ( (*it).match(dl->type()) >= 0 ) | 1304 | if ( (*it).match(dl->type()) >= 0 ) |
1305 | match = TRUE; | 1305 | match = TRUE; |
1306 | if ( match /* && dl->type() != "application/octet-stream" */ | 1306 | if ( match /* && dl->type() != "application/octet-stream" */ |
1307 | && !!dl->exec() ) | 1307 | && !!dl->exec() ) |
1308 | add(dl); | 1308 | add(dl); |
1309 | else | 1309 | else |
1310 | delete dl; | 1310 | delete dl; |
1311 | } | 1311 | } |
1312 | } | 1312 | } |
1313 | } | 1313 | } |
1314 | 1314 | ||
1315 | // other becomes empty | 1315 | // other becomes empty |
1316 | /*! | 1316 | /*! |
1317 | Transfers all DocLnk objects from \a other to this set. \a other becomes | 1317 | Transfers all DocLnk objects from \a other to this set. \a other becomes |
1318 | empty. | 1318 | empty. |
1319 | */ | 1319 | */ |
1320 | void DocLnkSet::appendFrom( DocLnkSet& other ) | 1320 | void DocLnkSet::appendFrom( DocLnkSet& other ) |
1321 | { | 1321 | { |
1322 | if ( &other == this ) | 1322 | if ( &other == this ) |
1323 | return; | 1323 | return; |
1324 | QListIterator<AppLnk> it( other.mApps ); | 1324 | QListIterator<AppLnk> it( other.mApps ); |
1325 | for ( ; it.current(); ) { | 1325 | for ( ; it.current(); ) { |
1326 | mApps.append(*it); | 1326 | mApps.append(*it); |
1327 | ++it; | 1327 | ++it; |
1328 | } | 1328 | } |
1329 | other.mApps.clear(); | 1329 | other.mApps.clear(); |
1330 | } | 1330 | } |
1331 | 1331 | ||
1332 | void DocLnkSet::findChildren(const QString &dr, const QValueList<QRegExp> &mimeFilters, QDict<void> &reference, int depth) | 1332 | void DocLnkSet::findChildren(const QString &dr, const QValueList<QRegExp> &mimeFilters, QDict<void> &reference, int depth) |
1333 | { | 1333 | { |
1334 | depth++; | 1334 | depth++; |
1335 | if ( depth > 10 ) | 1335 | if ( depth > 10 ) |
1336 | return; | 1336 | return; |
1337 | 1337 | ||
1338 | QDir dir( dr ); | 1338 | QDir dir( dr ); |
1339 | 1339 | ||
1340 | /* Opie got a different approach | 1340 | /* Opie got a different approach |
1341 | * I guess it's geek vs. consumer | 1341 | * I guess it's geek vs. consumer |
1342 | * in this case to be discussed | 1342 | * in this case to be discussed |
1343 | */ | 1343 | */ |
1344 | if ( dir.exists( ".Qtopia-ignore" ) ) | 1344 | if ( dir.exists( ".Qtopia-ignore" ) ) |
1345 | return; | 1345 | return; |
1346 | 1346 | ||
1347 | const QFileInfoList *list = dir.entryInfoList(); | 1347 | const QFileInfoList *list = dir.entryInfoList(); |
1348 | if ( list ) { | 1348 | if ( list ) { |
1349 | QFileInfo* fi; | 1349 | QFileInfo* fi; |
1350 | for ( QFileInfoListIterator it(*list); (fi=*it); ++it ) { | 1350 | for ( QFileInfoListIterator it(*list); (fi=*it); ++it ) { |
1351 | QString bn = fi->fileName(); | 1351 | QString bn = fi->fileName(); |
1352 | if ( bn[0] != '.' ) { | 1352 | if ( bn[0] != '.' ) { |
1353 | if ( fi->isDir() ) { | 1353 | if ( fi->isDir() ) { |
1354 | if ( bn != "CVS" && bn != "Qtopia" && bn != "QtPalmtop" ) | 1354 | if ( bn != "CVS" && bn != "Qtopia" && bn != "QtPalmtop" ) |
1355 | findChildren(fi->filePath(), mimeFilters, reference, depth); | 1355 | findChildren(fi->filePath(), mimeFilters, reference, depth); |
1356 | } else { | 1356 | } else { |
1357 | if ( fi->extension(FALSE) == "desktop" ) { | 1357 | if ( fi->extension(FALSE) == "desktop" ) { |
1358 | DocLnk* dl = new DocLnk( fi->filePath() ); | 1358 | DocLnk* dl = new DocLnk( fi->filePath() ); |
1359 | QFileInfo fi2(dl->file()); | 1359 | QFileInfo fi2(dl->file()); |
1360 | bool match = FALSE; | 1360 | bool match = FALSE; |
1361 | if ( !fi2.exists() ) { | 1361 | if ( !fi2.exists() ) { |
1362 | dir.remove( dl->file() ); | 1362 | dir.remove( dl->file() ); |
1363 | } | 1363 | } |
1364 | if ( mimeFilters.count() == 0 ) { | 1364 | if ( mimeFilters.count() == 0 ) { |
1365 | add( dl ); | 1365 | add( dl ); |
1366 | match = TRUE; | 1366 | match = TRUE; |
1367 | } else { | 1367 | } else { |
1368 | for( QValueList<QRegExp>::ConstIterator it = mimeFilters.begin(); it != mimeFilters.end(); ++ it ) { | 1368 | for( QValueList<QRegExp>::ConstIterator it = mimeFilters.begin(); it != mimeFilters.end(); ++ it ) { |
1369 | if ( (*it).match(dl->type()) >= 0 ) { | 1369 | if ( (*it).match(dl->type()) >= 0 ) { |
1370 | add(dl); | 1370 | add(dl); |
1371 | match = TRUE; | 1371 | match = TRUE; |
1372 | } | 1372 | } |
1373 | } | 1373 | } |
1374 | } | 1374 | } |
1375 | if ( !match ) | 1375 | if ( !match ) |
1376 | delete dl; | 1376 | delete dl; |
1377 | } else { | 1377 | } else { |
1378 | if ( !reference.find(fi->fileName()) ) | 1378 | if ( !reference.find(fi->fileName()) ) |
1379 | reference.insert(fi->filePath(), (void*)2); | 1379 | reference.insert(fi->filePath(), (void*)2); |
1380 | } | 1380 | } |
1381 | } | 1381 | } |
1382 | } | 1382 | } |
1383 | } | 1383 | } |
1384 | } | 1384 | } |
1385 | } | 1385 | } |
1386 | 1386 | ||
1387 | /*! | 1387 | /*! |
1388 | \class DocLnk applnk.h | 1388 | \class DocLnk applnk.h |
1389 | \brief The DocLnk class represents loaded document references. | 1389 | \brief The DocLnk class represents loaded document references. |
1390 | */ | 1390 | */ |
1391 | 1391 | ||
1392 | /*! | 1392 | /*! |
1393 | \fn DocLnk::DocLnk( const DocLnk &o ) | 1393 | \fn DocLnk::DocLnk( const DocLnk &o ) |
1394 | 1394 | ||
1395 | Copies \a o. | 1395 | Copies \a o. |
1396 | */ | 1396 | */ |
1397 | 1397 | ||
1398 | /*! | 1398 | /*! |
1399 | Constructs a DocLnk from a valid .desktop \a file or a new .desktop | 1399 | Constructs a DocLnk from a valid .desktop \a file or a new .desktop |
1400 | \a file for other files. | 1400 | \a file for other files. |
1401 | */ | 1401 | */ |
1402 | DocLnk::DocLnk( const QString &file ) : | 1402 | DocLnk::DocLnk( const QString &file ) : |
1403 | AppLnk(file) | 1403 | AppLnk(file) |
1404 | { | 1404 | { |
1405 | init(file); | 1405 | init(file); |
1406 | } | 1406 | } |
1407 | 1407 | ||
1408 | /*! | 1408 | /*! |
1409 | Constructs a DocLnk from a valid .desktop \a file or a new .desktop | 1409 | Constructs a DocLnk from a valid .desktop \a file or a new .desktop |
1410 | \a file for other files. If \a may_be_desktopfile is TRUE, then an | 1410 | \a file for other files. If \a may_be_desktopfile is TRUE, then an |
1411 | attempt is made to read \a file as a .desktop file; if that fails it | 1411 | attempt is made to read \a file as a .desktop file; if that fails it |
1412 | is read as a normal file. | 1412 | is read as a normal file. |
1413 | */ | 1413 | */ |
1414 | DocLnk::DocLnk( const QString &file, bool may_be_desktopfile ) : | 1414 | DocLnk::DocLnk( const QString &file, bool may_be_desktopfile ) : |
1415 | AppLnk(may_be_desktopfile ? file : QString::null) | 1415 | AppLnk(may_be_desktopfile ? file : QString::null) |
1416 | { | 1416 | { |
1417 | init(file); | 1417 | init(file); |
1418 | } | 1418 | } |
1419 | 1419 | ||
1420 | void DocLnk::init(const QString &file) | 1420 | void DocLnk::init(const QString &file) |
1421 | { | 1421 | { |
1422 | if ( isValid() ) { | 1422 | if ( isValid() ) { |
1423 | #ifndef FORCED_DIR_STRUCTURE_WAY | 1423 | #ifndef FORCED_DIR_STRUCTURE_WAY |
1424 | if ( mType.isNull() ) | 1424 | if ( mType.isNull() ) |
1425 | // try to infer it | 1425 | // try to infer it |
1426 | #endif | 1426 | #endif |
1427 | { | 1427 | { |
1428 | int s0 = file.findRev('/'); | 1428 | int s0 = file.findRev('/'); |
1429 | if ( s0 > 0 ) { | 1429 | if ( s0 > 0 ) { |
1430 | int s1 = file.findRev('/',s0-1); | 1430 | int s1 = file.findRev('/',s0-1); |
1431 | if ( s1 > 0 ) { | 1431 | if ( s1 > 0 ) { |
1432 | int s2 = file.findRev('/',s1-1); | 1432 | int s2 = file.findRev('/',s1-1); |
1433 | if ( s2 > 0 ) { | 1433 | if ( s2 > 0 ) { |
1434 | mType = file.mid(s2+1,s0-s2-1); | 1434 | mType = file.mid(s2+1,s0-s2-1); |
1435 | } | 1435 | } |
1436 | } | 1436 | } |
1437 | } | 1437 | } |
1438 | } | 1438 | } |
1439 | } else if ( QFile::exists(file) ) { | 1439 | } else if ( QFile::exists(file) ) { |
1440 | QString n = file; | 1440 | QString n = file; |
1441 | n.replace(QRegExp(".*/"),""); | 1441 | n.replace(QRegExp(".*/"),""); |
1442 | n.replace(QRegExp("\\..*"),""); | 1442 | n.replace(QRegExp("\\..*"),""); |
1443 | setName( n ); | 1443 | setName( n ); |
1444 | setFile( file ); | 1444 | setFile( file ); |
1445 | } | 1445 | } |
1446 | MimeType mt(mType); | 1446 | MimeType mt(mType); |
1447 | if( mt.application() ) | 1447 | if( mt.application() ) |
1448 | mExec = mt.application()->exec(); | 1448 | mExec = mt.application()->exec(); |
1449 | } | 1449 | } |
1450 | 1450 | ||
1451 | /*! | 1451 | /*! |
1452 | Constructs an invalid DocLnk. | 1452 | Constructs an invalid DocLnk. |
1453 | */ | 1453 | */ |
1454 | DocLnk::DocLnk() | 1454 | DocLnk::DocLnk() |
1455 | { | 1455 | { |
1456 | } | 1456 | } |
1457 | 1457 | ||
1458 | /*! | 1458 | /*! |
1459 | Destroys the DocLnk. Just like AppLnk objects, a run-time error | 1459 | Destroys the DocLnk. Just like AppLnk objects, a run-time error |
1460 | occurs if the DocLnk is a member of a DocLnkSet (or AppLnkSet). | 1460 | occurs if the DocLnk is a member of a DocLnkSet (or AppLnkSet). |
1461 | */ | 1461 | */ |
1462 | DocLnk::~DocLnk() | 1462 | DocLnk::~DocLnk() |
1463 | { | 1463 | { |
1464 | } | 1464 | } |
1465 | 1465 | ||
1466 | /*! | 1466 | /*! |
1467 | \reimp | 1467 | \reimp |
1468 | */ | 1468 | */ |
1469 | QString DocLnk::exec() const | 1469 | QString DocLnk::exec() const |
1470 | { | 1470 | { |
1471 | MimeType mt(type()); | 1471 | MimeType mt(type()); |
1472 | const AppLnk* app = mt.application(); | 1472 | const AppLnk* app = mt.application(); |
1473 | if ( app ) | 1473 | if ( app ) |
1474 | return app->exec(); | 1474 | return app->exec(); |
1475 | else | 1475 | else |
1476 | return QString::null; | 1476 | return QString::null; |
1477 | } | 1477 | } |
1478 | 1478 | ||
1479 | /*! | 1479 | /*! |
1480 | \reimp | 1480 | \reimp |
1481 | */ | 1481 | */ |
1482 | void DocLnk::invoke(const QStringList& args) const | 1482 | void DocLnk::invoke(const QStringList& args) const |
1483 | { | 1483 | { |
1484 | MimeType mt(type()); | 1484 | MimeType mt(type()); |
1485 | const AppLnk* app = mt.application(); | 1485 | const AppLnk* app = mt.application(); |
1486 | if ( app ) { | 1486 | if ( app ) { |
1487 | QStringList a = args; | 1487 | QStringList a = args; |
1488 | if ( linkFileKnown() && QFile::exists( linkFile() ) ) | 1488 | if ( linkFileKnown() && QFile::exists( linkFile() ) ) |
1489 | a.append(linkFile()); | 1489 | a.append(linkFile()); |
1490 | else | 1490 | else |
1491 | a.append(file()); | 1491 | a.append(file()); |
1492 | app->execute(a); | 1492 | app->execute(a); |
1493 | } | 1493 | } |
1494 | } | 1494 | } |
1495 | 1495 | ||
1496 | 1496 | ||