21 static const char configKeyDefaultIdentity[] =
"Default Identity";
23 #include "identitymanager.h"
26 #include <kpimutils/email.h>
28 #include <kemailsettings.h>
34 #include <kconfiggroup.h>
38 #include <QtDBus/QtDBus>
43 #include "identitymanageradaptor.h"
45 using namespace KPIMIdentities;
47 static QString newDBusObjectName()
49 static int s_count = 0;
50 QString name(
"/KPIMIDENTITIES_IdentityManager" );
53 name += QString::number( s_count );
62 setObjectName( name );
63 KGlobal::locale()->insertCatalog(
"libkpimidentities" );
64 new IdentityManagerAdaptor(
this );
65 QDBusConnection dbus = QDBusConnection::sessionBus();
66 const QString dbusPath = newDBusObjectName();
67 setProperty(
"uniqueDBusPath", dbusPath );
68 const QString dbusInterface =
"org.kde.pim.IdentityManager";
69 dbus.registerObject( dbusPath,
this );
70 dbus.connect( QString(), QString(), dbusInterface,
"identitiesChanged",
this,
71 SLOT(slotIdentitiesChanged(QString)) );
74 mConfig =
new KConfig(
"emailidentities" );
75 readConfig( mConfig );
77 kDebug( 5325 ) <<
"emailidentities is empty -> convert from kmailrc";
81 KConfig kmailConf(
"kmailrc" );
82 readConfig( &kmailConf );
86 kDebug( 5325 ) <<
"IdentityManager: No identity found. Creating default.";
91 if ( KEMailSettings().getSetting( KEMailSettings::EmailAddress ).isEmpty() ) {
96 IdentityManager::~IdentityManager()
99 <<
"IdentityManager: There were uncommitted changes!";
106 QString result = name;
108 result = i18nc(
"%1: name; %2: number appended to it to make it unique "
109 "among a list of names",
"%1 #%2",
128 QList<uint> seenUOIDs;
129 QList<Identity>::ConstIterator end =
mIdentities.constEnd();
130 for ( QList<Identity>::ConstIterator it =
mIdentities.constBegin();
132 seenUOIDs << (*it).uoid();
135 QList<uint> changedUOIDs;
139 int index = seenUOIDs.indexOf( (*it).uoid() );
141 uint uoid = seenUOIDs.at( index );
145 kDebug( 5325 ) <<
"emitting changed() for identity" << uoid;
147 changedUOIDs << uoid;
149 seenUOIDs.removeAll( uoid );
152 kDebug( 5325 ) <<
"emitting added() for identity" << (*it).uoid();
158 for ( QList<uint>::ConstIterator it = seenUOIDs.constBegin();
159 it != seenUOIDs.constEnd(); ++it ) {
160 kDebug( 5325 ) <<
"emitting deleted() for identity" << (*it);
170 QList<uint>::ConstIterator changedEnd( changedUOIDs.constEnd() );
171 for ( QList<uint>::ConstIterator it = changedUOIDs.constBegin();
172 it != changedEnd; ++it )
178 const QString ourIdentifier = QString::fromLatin1(
"%1/%2" ).
179 arg( QDBusConnection::sessionBus().baseService() ).
180 arg( property(
"uniqueDBusPath" ).toString() );
181 emit identitiesChanged( ourIdentifier );
200 result << (*it).identityName();
210 result << (*it).identityName();
219 void IdentityManager::writeConfig()
const
221 const QStringList
identities = groupList( mConfig );
222 QStringList::const_iterator groupEnd = identities.constEnd();
223 for ( QStringList::const_iterator group = identities.constBegin();
224 group != groupEnd; ++group )
225 mConfig->deleteGroup( *group );
229 it != end; ++it, ++i ) {
230 KConfigGroup cg( mConfig, QString::fromLatin1(
"Identity #%1" ).arg( i ) );
231 (*it).writeConfig( cg );
232 if ( (*it).isDefault() ) {
234 KConfigGroup general( mConfig,
"General" );
235 general.writeEntry( configKeyDefaultIdentity, (*it).uoid() );
239 es.setSetting( KEMailSettings::RealName, (*it).fullName() );
240 es.setSetting( KEMailSettings::EmailAddress, (*it).primaryEmailAddress() );
241 es.setSetting( KEMailSettings::Organization, (*it).organization() );
242 es.setSetting( KEMailSettings::ReplyToAddress, (*it).replyToAddr() );
249 void IdentityManager::readConfig( KConfig *config )
253 const QStringList identities = groupList( config );
254 if ( identities.isEmpty() ) {
258 KConfigGroup general( config,
"General" );
259 uint
defaultIdentity = general.readEntry( configKeyDefaultIdentity, 0 );
260 bool haveDefault =
false;
261 QStringList::const_iterator groupEnd = identities.constEnd();
262 for ( QStringList::const_iterator group = identities.constBegin();
263 group != groupEnd; ++group ) {
264 KConfigGroup configGroup( config, *group );
273 if ( !haveDefault ) {
274 kWarning( 5325 ) <<
"IdentityManager: There was no default identity."
275 <<
"Marking first one as default.";
283 QStringList IdentityManager::groupList( KConfig *config )
const
285 return config->groupList().filter( QRegExp(
"^Identity #\\d+$" ) );
288 IdentityManager::ConstIterator IdentityManager::begin()
const
293 IdentityManager::ConstIterator IdentityManager::end()
const
303 IdentityManager::Iterator IdentityManager::modifyEnd()
310 for ( ConstIterator it = begin(); it != end(); ++it ) {
311 if ( (*it).uoid() == uoid ) {
315 return Identity::null();
329 const QString &addresses )
const
331 const QStringList addressList = KPIMUtils::splitAddressList( addresses );
332 foreach (
const QString &fullAddress, addressList ) {
333 const QString addrSpec = KPIMUtils::extractEmailAddress( fullAddress ).toLower();
334 for ( ConstIterator it = begin(); it != end(); ++it ) {
341 return Identity::null();
351 for ( Iterator it =
modifyBegin(); it != modifyEnd(); ++it ) {
352 if ( (*it).identityName() == name ) {
357 kWarning( 5325 ) <<
"IdentityManager::modifyIdentityForName() used as"
358 <<
"newFromScratch() replacement!"
359 << endl <<
" name == \"" << name <<
"\"";
360 return newFromScratch( name );
365 for ( Iterator it =
modifyBegin(); it != modifyEnd(); ++it ) {
366 if ( (*it).uoid() == uoid ) {
371 kWarning( 5325 ) <<
"IdentityManager::identityForUoid() used as"
372 <<
"newFromScratch() replacement!"
373 << endl <<
" uoid == \"" << uoid <<
"\"";
374 return newFromScratch( i18n(
"Unnamed" ) );
379 for ( ConstIterator it = begin(); it != end(); ++it ) {
380 if ( (*it).isDefault() ) {
386 kFatal( 5325 ) <<
"IdentityManager: No default identity found!";
388 kWarning( 5325 ) <<
"IdentityManager: No default identity found!";
399 if ( (*it).uoid() == uoid ) {
409 for ( Iterator it =
modifyBegin(); it != modifyEnd(); ++it ) {
410 (*it).setIsDefault( (*it).uoid() == uoid );
424 for ( Iterator it =
modifyBegin(); it != modifyEnd(); ++it ) {
425 if ( (*it).identityName() == name ) {
426 bool removedWasDefault = (*it).isDefault();
439 for ( Iterator it =
modifyBegin(); it != modifyEnd(); ++it ) {
440 if ( (*it).identityName() == name ) {
441 bool removedWasDefault = (*it).isDefault();
452 Identity &IdentityManager::newFromScratch(
const QString &name )
454 return newFromExisting(
Identity( name ) );
457 Identity &IdentityManager::newFromControlCenter(
const QString &name )
460 es.setProfile( es.defaultProfileName() );
464 es.getSetting( KEMailSettings::RealName ),
465 es.getSetting( KEMailSettings::EmailAddress ),
466 es.getSetting( KEMailSettings::Organization ),
467 es.getSetting( KEMailSettings::ReplyToAddress ) ) );
470 Identity &IdentityManager::newFromExisting(
const Identity &other,
const QString &name )
476 if ( !name.isNull() ) {
482 void IdentityManager::createDefaultIdentity()
484 QString fullName, emailAddress;
491 if ( fullName.isEmpty() && emailAddress.isEmpty() ) {
492 KEMailSettings emailSettings;
493 fullName = emailSettings.getSetting( KEMailSettings::RealName );
494 emailAddress = emailSettings.getSetting( KEMailSettings::EmailAddress );
496 if ( !fullName.isEmpty() && !emailAddress.isEmpty() ) {
497 newFromControlCenter( i18nc(
"use default address from control center",
503 if ( fullName.isEmpty() ) {
504 fullName = user.property( KUser::FullName ).toString();
506 if ( emailAddress.isEmpty() ) {
507 emailAddress = user.loginName();
508 if ( !emailAddress.isEmpty() ) {
509 KConfigGroup general( mConfig,
"General" );
510 QString defaultdomain = general.readEntry(
"Default domain" );
511 if ( !defaultdomain.isEmpty() ) {
512 emailAddress +=
'@' + defaultdomain;
514 emailAddress.clear();
523 QString name( i18nc(
"Default name for new email accounts/identities.",
"Unnamed" ) );
525 if ( !emailAddress.isEmpty() ) {
527 QString idName = emailAddress;
528 int pos = idName.indexOf(
'@' );
530 name = idName.mid( pos + 1, -1 );
534 name.replace(
'.',
' ' );
535 pos = name.indexOf(
' ' );
537 name[pos + 1] = name[pos + 1].toUpper();
539 name[0] = name[0].toUpper();
540 }
else if ( !fullName.isEmpty() ) {
554 int IdentityManager::newUoid()
559 QList<uint> usedUOIDs;
560 QList<Identity>::ConstIterator end(
mIdentities.constEnd());
561 for ( QList<Identity>::ConstIterator it =
mIdentities.constBegin();
563 usedUOIDs << (*it).uoid();
570 it != endShadow; ++it ) {
571 usedUOIDs << (*it).uoid();
579 uoid = KRandom::random();
580 }
while ( usedUOIDs.indexOf( uoid ) != -1 );
588 for ( ConstIterator it = begin(); it != end(); ++it ) {
589 lst << (*it).primaryEmailAddress();
590 if ( !(*it).emailAliases().isEmpty() ) {
591 lst << (*it).emailAliases();
597 void KPIMIdentities::IdentityManager::slotRollback()
602 void KPIMIdentities::IdentityManager::slotIdentitiesChanged(
const QString &
id )
604 kDebug( 5325 ) <<
" KPIMIdentities::IdentityManager::slotIdentitiesChanged :" << id;
605 const QString ourIdentifier = QString::fromLatin1(
"%1/%2" ).
606 arg( QDBusConnection::sessionBus().baseService() ).
607 arg( property(
"uniqueDBusPath" ).toString() );
608 if (
id != ourIdentifier ) {
609 mConfig->reparseConfiguration();
610 Q_ASSERT( !hasPendingChanges() );
611 readConfig( mConfig );
616 #include "identitymanager.moc"