diff options
Diffstat (limited to 'kresources/kolab/shared')
-rw-r--r-- | kresources/kolab/shared/kmailconnection.cpp | 40 | ||||
-rw-r--r-- | kresources/kolab/shared/kolabbase.cpp | 19 | ||||
-rw-r--r-- | kresources/kolab/shared/resourcekolabbase.cpp | 38 | ||||
-rw-r--r-- | kresources/kolab/shared/resourcekolabbase.h | 12 |
4 files changed, 93 insertions, 16 deletions
diff --git a/kresources/kolab/shared/kmailconnection.cpp b/kresources/kolab/shared/kmailconnection.cpp index 9135e16db..66674abfa 100644 --- a/kresources/kolab/shared/kmailconnection.cpp +++ b/kresources/kolab/shared/kmailconnection.cpp @@ -73,16 +73,38 @@ static const TQCString dcopObjectId = "KMailICalIface"; bool KMailConnection::connectToKMail() { if ( !mKMailIcalIfaceStub ) { - TQString error; TQCString dcopService; - int result = KDCOPServiceStarter::self()-> - findServiceFor( "DCOP/ResourceBackend/IMAP", TQString::null, - TQString::null, &error, &dcopService ); - if ( result != 0 ) { - kdError(5650) << "Couldn't connect to the IMAP resource backend\n"; - // TODO: You might want to show "error" (if not empty) here, - // using e.g. KMessageBox - return false; + + // if we are kmail (and probably kontact as well) ourselves, don't try to start us again + // this prevents a DCOP deadlock when launching the kmail while kontact is the IMAP backend + // provider (and probably vice versa) + if ( kapp->instanceName() == "kmail" ) { + // someone, probably ourselves, already offers the interface, if not stop here + const QCStringList services = kapp->dcopClient()->registeredApplications(); + for ( uint i = 0; i < services.count(); ++i ) { + if ( services[i].find( "anonymous" ) == 0 ) // querying anonymous-XXXXX deadlocks as well, what are those anyway? + continue; + const QCStringList objs = kapp->dcopClient()->remoteObjects( services[i] ); + if ( objs.contains( dcopObjectId ) ) { + dcopService = services[i]; + break; + } + } + if ( dcopService.isEmpty() ) { + kdError(5650) << k_funcinfo << "Not connecting to KMail to prevent DCOP deadlock" << endl; + return false; + } + } else { + TQString error; + int result = KDCOPServiceStarter::self()-> + findServiceFor( "DCOP/ResourceBackend/IMAP", TQString::null, + TQString::null, &error, &dcopService ); + if ( result != 0 ) { + kdError(5650) << "Couldn't connect to the IMAP resource backend\n"; + // TODO: You might want to show "error" (if not empty) here, + // using e.g. KMessageBox + return false; + } } mKMailIcalIfaceStub = new KMailICalIface_stub( kapp->dcopClient(), diff --git a/kresources/kolab/shared/kolabbase.cpp b/kresources/kolab/shared/kolabbase.cpp index 9a4a17f7c..b7f502576 100644 --- a/kresources/kolab/shared/kolabbase.cpp +++ b/kresources/kolab/shared/kolabbase.cpp @@ -36,6 +36,7 @@ #include <kabc/addressee.h> #include <libkcal/journal.h> #include <libkdepim/kpimprefs.h> +#include <libemailfunctions/email.h> #include <kdebug.h> #include <tqfile.h> @@ -257,8 +258,16 @@ bool KolabBase::loadEmailAttribute( TQDomElement& element, Email& email ) TQDomElement e = n.toElement(); const TQString tagName = e.tagName(); - if ( tagName == "display-name" ) - email.displayName = e.text(); + if ( tagName == "display-name" ) { + // Quote the text in case it contains commas or other quotable chars. + TQString tusername = KPIM::quoteNameIfNecessary( e.text() ); + + TQString tname, temail; + // ignore the return value because it will always be false since + // tusername does not contain "@domain". + KPIM::getNameAndMail( tusername, tname, temail ); + email.displayName = tname; + } else if ( tagName == "smtp-address" ) email.smtpAddress = e.text(); else @@ -411,7 +420,11 @@ TQString KolabBase::dateToString( const TQDate& date ) TQDateTime KolabBase::stringToDateTime( const TQString& _date ) { TQString date( _date ); - if ( date.endsWith( "Z" ) ) + //Deal with data from some clients that always append a Z to dates. + if ( date.endsWith( "ZZ" ) ) + date.truncate( date.length() - 2 ); + //In TQt3, TQt::ISODate cannot handle a trailing Z for UTC, so remove if found. + else if ( date.endsWith( "Z" ) ) date.truncate( date.length() - 1 ); return TQDateTime::fromString( date, Qt::ISODate ); } diff --git a/kresources/kolab/shared/resourcekolabbase.cpp b/kresources/kolab/shared/resourcekolabbase.cpp index 291910fb9..2db2117db 100644 --- a/kresources/kolab/shared/resourcekolabbase.cpp +++ b/kresources/kolab/shared/resourcekolabbase.cpp @@ -210,9 +210,12 @@ bool ResourceKolabBase::kmailRemoveSubresource( const TQString& resource ) return mConnection->kmailRemoveSubresource( resource ); } -TQString ResourceKolabBase::findWritableResource( const ResourceMap& resources, +TQString ResourceKolabBase::findWritableResource( const ResourceType &type, + const ResourceMap& resources, const TQString& text ) { + mErrorCode = NoError; + // I have to use the label (shown in the dialog) as key here. But given how the // label is made up, it should be unique. If it's not, well the dialog would suck anyway... TQMap<TQString, TQString> possible; @@ -227,7 +230,33 @@ TQString ResourceKolabBase::findWritableResource( const ResourceMap& resources, if ( possible.isEmpty() ) { // None found!! kdWarning(5650) << "No writable resource found!" << endl; - KMessageBox::error( 0, i18n( "No writable resource was found, saving will not be possible. Reconfigure KMail first." ) ); + + TQString errorText; + switch( type ) { + case Events: + errorText = i18n( "You have no writable event folders so saving will not be possible.\n" + "Please create or activate at least one writable event folder and try again." ); + break; + case Tasks: + errorText = i18n( "You have no writable task folders so saving will not be possible.\n" + "Please create or activate at least one writable task folder and try again." ); + break; + case Incidences: + errorText = i18n( "You have no writable calendar folder so saving will not be possible.\n" + "Please create or activate at least one writable calendar folder and try again." ); + break; + case Notes: + errorText = i18n( "You have no writable notes folders so saving will not be possible.\n" + "Please create or activate at least one writable notes folder and try again." ); + break; + case Contacts: + errorText = i18n( "You have no writable addressbook folder so saving will not be possible.\n" + "Please create or activate at least one writable addressbook folder and try again." ); + break; + } + + KMessageBox::error( 0, errorText ); + mErrorCode = NoWritableFound; return TQString::null; } if ( possible.count() == 1 ) @@ -242,8 +271,11 @@ TQString ResourceKolabBase::findWritableResource( const ResourceMap& resources, // Several found, ask the user TQString chosenLabel = KPIM::FolderSelectDialog::getItem( i18n( "Select Resource Folder" ), t, possible.keys() ); - if ( chosenLabel.isEmpty() ) // cancelled + if ( chosenLabel.isEmpty() ) { + // cancelled + mErrorCode = UserCancel; return TQString::null; + } return possible[chosenLabel]; } diff --git a/kresources/kolab/shared/resourcekolabbase.h b/kresources/kolab/shared/resourcekolabbase.h index b2ce0501f..1bd8b9515 100644 --- a/kresources/kolab/shared/resourcekolabbase.h +++ b/kresources/kolab/shared/resourcekolabbase.h @@ -46,6 +46,8 @@ class KURL; namespace Kolab { +enum ResourceType { Tasks, Events, Incidences, Contacts, Notes }; + class KMailConnection; /** @@ -168,9 +170,17 @@ protected: TQString configFile( const TQString& type ) const; /// If only one of these is writable, return that. Otherwise return null. - TQString findWritableResource( const ResourceMap& resources, + TQString findWritableResource( const ResourceType &type, + const ResourceMap& resources, const TQString& text = TQString::null ); + enum ErrorCode { + NoError, + NoWritableFound, /**< No writable resource is available */ + UserCancel /**< User canceled the operation */ + }; + ErrorCode mErrorCode; + bool mSilent; /** |