diff options
Diffstat (limited to 'libtdepim/kaddrbook.cpp')
-rw-r--r-- | libtdepim/kaddrbook.cpp | 285 |
1 files changed, 285 insertions, 0 deletions
diff --git a/libtdepim/kaddrbook.cpp b/libtdepim/kaddrbook.cpp new file mode 100644 index 000000000..1036a263b --- /dev/null +++ b/libtdepim/kaddrbook.cpp @@ -0,0 +1,285 @@ +// -*- mode: C++; c-file-style: "gnu" -*- +// kaddrbook.cpp +// Author: Stefan Taferner <taferner@kde.org> +// This code is under GPL + +#include <config.h> + +#include "kaddrbook.h" + +#ifdef KDEPIM_NEW_DISTRLISTS +#include "distributionlist.h" +#else +#include <kabc/distributionlist.h> +#endif + +#include <kapplication.h> +#include <kdebug.h> +#include <klocale.h> +#include <kmessagebox.h> +#include <kdeversion.h> +#include <kabc/resource.h> +#include <kabc/stdaddressbook.h> +#include <kabc/vcardconverter.h> +#include <kabc/errorhandler.h> +#include <kresources/selectdialog.h> +#include <dcopref.h> +#include <dcopclient.h> + +#include <tqeventloop.h> +#include <tqregexp.h> + +#include <unistd.h> + +//----------------------------------------------------------------------------- +void KAddrBookExternal::openEmail( const TQString &addr, TQWidget *parent ) { + TQString email; + TQString name; + + KABC::Addressee::parseEmailAddress( addr, name, email ); + + KABC::AddressBook *ab = KABC::StdAddressBook::self( true ); + + // force a reload of the address book file so that changes that were made + // by other programs are loaded + ab->asyncLoad(); + + // if we have to reload the address book then we should also wait until + // it's completely reloaded +#if KDE_IS_VERSION(3,4,89) + // This ugly hack will be removed in 4.0 + while ( !ab->loadingHasFinished() ) { + TQApplication::eventLoop()->processEvents( TQEventLoop::ExcludeUserInput ); + + // use sleep here to reduce cpu usage + usleep( 100 ); + } +#endif + + KABC::Addressee::List addressees = ab->findByEmail( email ); + + if ( addressees.count() > 0 ) { + if ( kapp->dcopClient()->isApplicationRegistered( "kaddressbook" ) ){ + //make sure kaddressbook is loaded, otherwise showContactEditor + //won't work as desired, see bug #87233 + DCOPRef call ( "kaddressbook", "kaddressbook" ); + call.send( "newInstance()" ); + } else { + kapp->startServiceByDesktopName( "kaddressbook" ); + } + + DCOPRef call( "kaddressbook", "KAddressBookIface" ); + call.send( "showContactEditor(TQString)", addressees.first().uid() ); + } else { + //TODO: Enable the better message at the next string unfreeze +#if 0 + TQString text = i18n("<qt>The email address <b>%1</b> cannot be " + "found in your addressbook.</qt>").tqarg( email ); +#else + TQString text = email + " " + i18n( "is not in address book" ); +#endif + KMessageBox::information( parent, text, TQString(), "notInAddressBook" ); + } +} + +//----------------------------------------------------------------------------- +void KAddrBookExternal::addEmail( const TQString& addr, TQWidget *parent) { + TQString email; + TQString name; + + KABC::Addressee::parseEmailAddress( addr, name, email ); + + KABC::AddressBook *ab = KABC::StdAddressBook::self( true ); + + ab->setErrorHandler( new KABC::GuiErrorHandler( parent ) ); + + // force a reload of the address book file so that changes that were made + // by other programs are loaded + ab->asyncLoad(); + + // if we have to reload the address book then we should also wait until + // it's completely reloaded +#if KDE_IS_VERSION(3,4,89) + // This ugly hack will be removed in 4.0 + while ( !ab->loadingHasFinished() ) { + TQApplication::eventLoop()->processEvents( TQEventLoop::ExcludeUserInput ); + + // use sleep here to reduce cpu usage + usleep( 100 ); + } +#endif + + KABC::Addressee::List addressees = ab->findByEmail( email ); + + if ( addressees.isEmpty() ) { + KABC::Addressee a; + a.setNameFromString( name ); + a.insertEmail( email, true ); + + { + KConfig config( "kaddressbookrc" ); + config.setGroup( "General" ); + int type = config.readNumEntry( "FormattedNameType", 1 ); + + TQString name; + switch ( type ) { + case 1: + name = a.givenName() + " " + a.familyName(); + break; + case 2: + name = a.assembledName(); + break; + case 3: + name = a.familyName() + ", " + a.givenName(); + break; + case 4: + name = a.familyName() + " " + a.givenName(); + break; + case 5: + name = a.organization(); + break; + default: + name = ""; + break; + } + name.simplifyWhiteSpace(); + + a.setFormattedName( name ); + } + + if ( KAddrBookExternal::addAddressee( a ) ) { + TQString text = i18n("<qt>The email address <b>%1</b> was added to your " + "addressbook; you can add more information to this " + "entry by opening the addressbook.</qt>").tqarg( addr ); + KMessageBox::information( parent, text, TQString(), "addedtokabc" ); + } + } else { + TQString text = i18n("<qt>The email address <b>%1</b> is already in your " + "addressbook.</qt>").tqarg( addr ); + KMessageBox::information( parent, text, TQString(), + "alreadyInAddressBook" ); + } + ab->setErrorHandler( 0 ); +} + +void KAddrBookExternal::openAddressBook(TQWidget *) { + kapp->startServiceByDesktopName( "kaddressbook" ); +} + +void KAddrBookExternal::addNewAddressee( TQWidget* ) +{ + kapp->startServiceByDesktopName("kaddressbook"); + DCOPRef call("kaddressbook", "KAddressBookIface"); + call.send("newContact()"); +} + +bool KAddrBookExternal::addVCard( const KABC::Addressee& addressee, TQWidget *parent ) +{ + KABC::AddressBook *ab = KABC::StdAddressBook::self( true ); + bool inserted = false; + + ab->setErrorHandler( new KABC::GuiErrorHandler( parent ) ); + + KABC::Addressee::List addressees = + ab->findByEmail( addressee.preferredEmail() ); + + if ( addressees.isEmpty() ) { + if ( KAddrBookExternal::addAddressee( addressee ) ) { + TQString text = i18n("The VCard was added to your addressbook; " + "you can add more information to this " + "entry by opening the addressbook."); + KMessageBox::information( parent, text, TQString(), "addedtokabc" ); + inserted = true; + } + } else { + TQString text = i18n("The VCard's primary email address is already in " + "your addressbook; however, you may save the VCard " + "into a file and import it into the addressbook " + "manually."); + KMessageBox::information( parent, text ); + inserted = true; + } + + ab->setErrorHandler( 0 ); + return inserted; +} + +bool KAddrBookExternal::addAddressee( const KABC::Addressee& addr ) +{ + KABC::AddressBook *addressBook = KABC::StdAddressBook::self( true ); + KABC::Resource *kabcResource = selectResourceForSaving( addressBook ); + if( !kabcResource ) + return false; + KABC::Ticket *ticket = addressBook->requestSaveTicket( kabcResource ); + bool saved = false; + if ( ticket ) { + KABC::Addressee addressee( addr ); + addressee.setResource( kabcResource ); + addressBook->insertAddressee( addressee ); + saved = addressBook->save( ticket ); + if ( !saved ) + addressBook->releaseSaveTicket( ticket ); + } + + addressBook->emitAddressBookChanged(); + + return saved; +} + +TQString KAddrBookExternal::expandDistributionList( const TQString& listName ) +{ + if ( listName.isEmpty() ) + return TQString(); + + const TQString lowerListName = listName.lower(); + KABC::AddressBook *addressBook = KABC::StdAddressBook::self( true ); +#ifdef KDEPIM_NEW_DISTRLISTS + KPIM::DistributionList distrList = KPIM::DistributionList::findByName( addressBook, lowerListName, false ); + if ( !distrList.isEmpty() ) { + return distrList.emails( addressBook ).join( ", " ); + } +#else + KABC::DistributionListManager manager( addressBook ); + manager.load(); + const TQStringList listNames = manager.listNames(); + + for ( TQStringList::ConstIterator it = listNames.begin(); + it != listNames.end(); ++it) { + if ( (*it).lower() == lowerListName ) { + const TQStringList addressList = manager.list( *it )->emails(); + return addressList.join( ", " ); + } + } +#endif + return TQString(); +} + +KABC::Resource* KAddrBookExternal::selectResourceForSaving( KABC::AddressBook *addressBook ) +{ +#if KDE_IS_VERSION(3,4,89) + // This ugly hack will be removed in 4.0 + while ( !addressBook->loadingHasFinished() ) { + TQApplication::eventLoop()->processEvents( TQEventLoop::ExcludeUserInput ); + + // use sleep here to reduce cpu usage + usleep( 100 ); + } +#endif + + // Select a resource + TQPtrList<KABC::Resource> kabcResources = addressBook->resources(); + + TQPtrList<KRES::Resource> kresResources; + TQPtrListIterator<KABC::Resource> resIt( kabcResources ); + KABC::Resource *kabcResource; + while ( ( kabcResource = resIt.current() ) != 0 ) { + ++resIt; + if ( !kabcResource->readOnly() ) { + KRES::Resource *res = static_cast<KRES::Resource*>( kabcResource ); + if ( res ) + kresResources.append( res ); + } + } + + return static_cast<KABC::Resource*>( KRES::SelectDialog::getResource( kresResources, 0 ) ); +} |