You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
307 lines
8.9 KiB
307 lines
8.9 KiB
// kmaddrbook.cpp |
|
// Author: Stefan Taferner <taferner@kde.org> |
|
// This code is under GPL |
|
|
|
#include <pwd.h> |
|
#include <config.h> |
|
#include "kmaddrbook.h" |
|
#include <kapplication.h> |
|
#include <kdebug.h> |
|
|
|
#include <qfile.h> |
|
#include <qregexp.h> |
|
#include <assert.h> |
|
#include <klocale.h> |
|
#include <kstandarddirs.h> |
|
#include <kmessagebox.h> |
|
|
|
#include "kmkernel.h" // for KabcBridge |
|
#include "kbusyptr.h" |
|
#include "kmmessage.h" // for KabcBridge |
|
#include "kmaddrbookdlg.h" // for kmaddrbookexternal |
|
#include <krun.h> // for kmaddrbookexternal |
|
#include <kprocess.h> |
|
#include <kabc/stdaddressbook.h> |
|
#include <kabc/distributionlist.h> |
|
|
|
void KabcBridge::addresses(QStringList* result) // includes lists |
|
{ |
|
kernel->kbp()->busy(); // loading might take a while |
|
|
|
KABC::AddressBook *addressBook = KABC::StdAddressBook::self(); |
|
KABC::AddressBook::Iterator it; |
|
for( it = addressBook->begin(); it != addressBook->end(); ++it ) { |
|
QStringList emails = (*it).emails(); |
|
QString n = (*it).prefix() + " " + |
|
(*it).givenName() + " " + |
|
(*it).additionalName() + " " + |
|
(*it).familyName() + " " + |
|
(*it).suffix(); |
|
n = n.simplifyWhiteSpace(); |
|
|
|
QRegExp needQuotes("[^ 0-9A-Za-z\\x0080-\\xFFFF]"); |
|
QString endQuote = "\" "; |
|
QString empty = ""; |
|
QStringList::ConstIterator mit; |
|
QString addr, email; |
|
|
|
for ( mit = emails.begin(); mit != emails.end(); ++mit ) { |
|
email = *mit; |
|
if (!email.isEmpty()) { |
|
if (n.isEmpty() || (email.find( '<' ) != -1)) |
|
addr = empty; |
|
else { /* do we really need quotes around this name ? */ |
|
if (n.find(needQuotes) != -1) |
|
addr = '"' + n + endQuote; |
|
else |
|
addr = n + ' '; |
|
} |
|
|
|
if (!addr.isEmpty() && (email.find( '<' ) == -1) |
|
&& (email.find( '>' ) == -1) |
|
&& (email.find( ',' ) == -1)) |
|
addr += '<' + email + '>'; |
|
else |
|
addr += email; |
|
addr = addr.stripWhiteSpace(); |
|
result->append( addr ); |
|
} |
|
} |
|
} |
|
KABC::DistributionListManager manager( addressBook ); |
|
manager.load(); |
|
|
|
QStringList names = manager.listNames(); |
|
QStringList::Iterator jt; |
|
for ( jt = names.begin(); jt != names.end(); ++jt) |
|
result->append( *jt ); |
|
result->sort(); |
|
|
|
kernel->kbp()->idle(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
QString KabcBridge::expandDistributionLists(QString recipients) |
|
{ |
|
if (recipients.isEmpty()) |
|
return ""; |
|
KABC::AddressBook *addressBook = KABC::StdAddressBook::self(); |
|
KABC::DistributionListManager manager( addressBook ); |
|
manager.load(); |
|
QStringList recpList, names = manager.listNames(); |
|
QStringList::Iterator it, jt; |
|
QString receiver, expRecipients; |
|
unsigned int begin = 0, count = 0, quoteDepth = 0; |
|
for (; begin + count < recipients.length(); ++count) { |
|
if (recipients[begin + count] == '"') |
|
++quoteDepth; |
|
if ((recipients[begin + count] == ',') && (quoteDepth % 2 == 0)) { |
|
recpList.append( recipients.mid( begin, count ) ); |
|
begin += count + 1; |
|
count = 0; |
|
} |
|
} |
|
recpList.append( recipients.mid( begin )); |
|
|
|
for ( it = recpList.begin(); it != recpList.end(); ++it ) { |
|
if (!expRecipients.isEmpty()) |
|
expRecipients += ", "; |
|
receiver = (*it).stripWhiteSpace(); |
|
for ( jt = names.begin(); jt != names.end(); ++jt) |
|
if (receiver.lower() == (*jt).lower()) { |
|
QStringList el = manager.list( receiver )->emails(); |
|
for ( QStringList::Iterator kt = el.begin(); kt != el.end(); ++kt ) { |
|
if (!expRecipients.isEmpty()) |
|
expRecipients += ", "; |
|
expRecipients += *kt; |
|
} |
|
break; |
|
} |
|
if ( jt == names.end() ) |
|
{ |
|
if (receiver.find('@') == -1) |
|
{ |
|
KConfigGroup general( kapp->config(), "General" ); |
|
QString defaultdomain = general.readEntry( "Default domain", "" ); |
|
if( !defaultdomain.isEmpty() ) |
|
{ |
|
receiver += "@" + defaultdomain; |
|
} |
|
else |
|
{ |
|
char hostname[100]; |
|
gethostname(hostname, 100); |
|
QString username = receiver; |
|
receiver += "@"; |
|
receiver += QCString(hostname, 100); |
|
|
|
passwd *pw; |
|
setpwent(); |
|
while ((pw = getpwent())) |
|
{ |
|
if (qstrcmp(pw->pw_name, username.local8Bit()) == 0) |
|
{ |
|
QString fn = QString::fromLocal8Bit(pw->pw_gecos); |
|
if (fn.find(QRegExp("[^ 0-9A-Za-z\\x0080-\\xFFFF]")) != -1) |
|
receiver = "\"" + fn + "\" <" + receiver + ">"; |
|
else |
|
receiver = fn + " <" + receiver + ">"; |
|
} |
|
} |
|
endpwent(); |
|
} |
|
expRecipients += receiver; |
|
} |
|
else |
|
{ |
|
expRecipients += receiver; |
|
} |
|
} |
|
} |
|
return expRecipients; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
void KMAddrBookExternal::openEmail( const QString &addr, QWidget *) { |
|
QString address = addr; |
|
address.replace( QRegExp("\""), "" ); |
|
if (useKAddressbook()) { |
|
KRun::runCommand( "kaddressbook -a \"" + address + "\"" ); |
|
return; |
|
} |
|
|
|
// TODO: Start a simple add-to-addressbook-dialog, or just add the address |
|
// silently to kabc. |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
void KMAddrBookExternal::addEmail( const QString &addr, QWidget *parent) { |
|
QString email; |
|
QString name; |
|
|
|
#if KDE_VERSION >= 305 |
|
KABC::Addressee::parseEmailAddress( addr, name, email ); |
|
#else |
|
parseEmailAddress( addr, name, email ); |
|
#endif |
|
|
|
KABC::AddressBook *ab = KABC::StdAddressBook::self(); |
|
|
|
KABC::Addressee::List addressees = ab->findByEmail( email ); |
|
|
|
if ( addressees.isEmpty() ) { |
|
KABC::Addressee a; |
|
a.setNameFromString( name ); |
|
a.insertEmail( email, true ); |
|
|
|
ab->insertAddressee(a); |
|
|
|
if ( !KABC::StdAddressBook::save() ) { |
|
KMessageBox::error( parent, i18n("Can't save to addressbook.") ); |
|
} else { |
|
QString text = i18n("The email address '%1' was added to your " |
|
"addressbook. You can add more information to this " |
|
"entry by opening the addressbook.").arg( addr ); |
|
KMessageBox::information( parent, text, QString::null, "addedtokabc" ); |
|
} |
|
} else { |
|
QString text = i18n("The email address '%1' is already in your " |
|
"addressbook.").arg( addr ); |
|
KMessageBox::information( parent, text ); |
|
} |
|
} |
|
|
|
void KMAddrBookExternal::launch(QWidget *) { |
|
// Reenable selection, when kab is ported to libkabc. |
|
// It might be better to remove the useK* functions and to check the config |
|
// file directly, as they aren't used anywhere else. |
|
// It might also be better to write a string for identifying the addressbook |
|
// instead of a number as it is done now. |
|
KRun::runCommand("kaddressbook"); |
|
#if 0 |
|
if ( useKab() ) { |
|
KRun::runCommand("kab"); |
|
} else if ( useKAddressbook() ) { |
|
KRun::runCommand("kaddressbook"); |
|
} else { |
|
// TODO: some default action, e.g. a simple address book dialog. |
|
} |
|
#endif |
|
} |
|
|
|
bool KMAddrBookExternal::useKab() |
|
{ |
|
KConfig *config = kapp->config(); |
|
KConfigGroupSaver saver(config, "General"); |
|
int ab = config->readNumEntry("addressbook", 1); |
|
return (ab == 0); |
|
} |
|
|
|
bool KMAddrBookExternal::useKAddressbook() |
|
{ |
|
KConfig *config = kapp->config(); |
|
KConfigGroupSaver saver(config, "General"); |
|
int ab = config->readNumEntry("addressbook", 1); |
|
return (ab == 1); |
|
} |
|
|
|
#if KDE_VERSION < 305 |
|
// FIXME: This function is duplicated from kdelibs/kabc. Remove it, when KMail |
|
// depends on the 3.1 libs. |
|
void KMAddrBookExternal::parseEmailAddress( const QString &rawEmail, |
|
QString &fullName, |
|
QString &email) |
|
{ |
|
int startPos, endPos, len; |
|
QString partA, partB, result; |
|
char endCh = '>'; |
|
|
|
startPos = rawEmail.find('<'); |
|
if (startPos < 0) |
|
{ |
|
startPos = rawEmail.find('('); |
|
endCh = ')'; |
|
} |
|
if (startPos < 0) |
|
{ |
|
// We couldn't find any separators, so we assume the whole string |
|
// is the email address |
|
email = rawEmail; |
|
fullName = ""; |
|
} |
|
else |
|
{ |
|
// We have a start position, try to find an end |
|
endPos = rawEmail.find(endCh, startPos+1); |
|
|
|
if (endPos < 0) |
|
{ |
|
// We couldn't find the end of the email address. We can only |
|
// assume the entire string is the email address. |
|
email = rawEmail; |
|
fullName = ""; |
|
} |
|
else |
|
{ |
|
// We have a start and end to the email address |
|
|
|
// Grab the name part |
|
fullName = rawEmail.left(startPos).stripWhiteSpace(); |
|
|
|
// grab the email part |
|
email = rawEmail.mid(startPos+1, endPos-startPos-1).stripWhiteSpace(); |
|
|
|
// Check that we do not have any extra characters on the end of the |
|
// strings |
|
len = fullName.length(); |
|
if (fullName[0]=='"' && fullName[len-1]=='"') |
|
fullName = fullName.mid(1, len-2); |
|
else if (fullName[0]=='<' && fullName[len-1]=='>') |
|
fullName = fullName.mid(1, len-2); |
|
else if (fullName[0]=='(' && fullName[len-1]==')') |
|
fullName = fullName.mid(1, len-2); |
|
} |
|
} |
|
} |
|
#endif |
|
|
|
|