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.
382 lines
9.5 KiB
382 lines
9.5 KiB
// kmaddrbook.cpp |
|
// Author: Stefan Taferner <taferner@kde.org> |
|
// This code is under GPL |
|
|
|
#include <config.h> |
|
#include "kmaddrbook.h" |
|
#include <kapp.h> |
|
#include <kconfig.h> |
|
#include <kdebug.h> |
|
|
|
#include <qfile.h> |
|
#include <qtextstream.h> |
|
#include <qregexp.h> |
|
#include <assert.h> |
|
#include <klocale.h> |
|
#include <kstddirs.h> |
|
#include <kmessagebox.h> |
|
|
|
#include "kmkernel.h" // for KabBridge |
|
#include "kmmessage.h" // for KabBridge |
|
#include "kmaddrbookdlg.h" // for kmaddrbookexternal |
|
#include <krun.h> // for kmaddrbookexternal |
|
#include "addtoaddressbook.h" |
|
|
|
//----------------------------------------------------------------------------- |
|
KMAddrBook::KMAddrBook(): KMAddrBookInherited() |
|
{ |
|
mModified = FALSE; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
KMAddrBook::~KMAddrBook() |
|
{ |
|
if (mModified) |
|
{ |
|
if(store() == IO_FatalError) |
|
{ |
|
KMessageBox::sorry(0, i18n("The addressbook could not be stored!\n")); |
|
} |
|
} |
|
writeConfig(FALSE); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMAddrBook::insert(const QString &aAddress) |
|
{ |
|
QStringList::ConstIterator it = find(aAddress); |
|
if (it == end()) |
|
{ |
|
inSort(aAddress); |
|
mModified=TRUE; |
|
} |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMAddrBook::inSort(const QString& entry) |
|
{ |
|
QStringList::Iterator it = KMAddrBookInherited::begin(); |
|
QStringList::Iterator itEnd = KMAddrBookInherited::end(); |
|
QString address = entry.lower(); |
|
for ( ; it != itEnd; ++it) { |
|
if ((*it).lower() < address) |
|
break; |
|
} |
|
if ( it == KMAddrBookInherited::begin() ) |
|
append( entry ); |
|
else |
|
KMAddrBookInherited::insert( it, entry ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
void KMAddrBook::remove(const QString &aAddress) |
|
{ |
|
remove(aAddress); |
|
mModified=TRUE; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMAddrBook::clear(void) |
|
{ |
|
KMAddrBookInherited::clear(); |
|
mModified=TRUE; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMAddrBook::writeConfig(bool aWithSync) |
|
{ |
|
KConfig* config = kapp->config(); |
|
|
|
KConfigGroupSaver saver(config, "Addressbook"); |
|
config->writeEntry("default", mDefaultFileName); |
|
|
|
if (aWithSync) config->sync(); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMAddrBook::readConfig(void) |
|
{ |
|
KConfig* config = kapp->config(); |
|
KConfigGroupSaver saver(config, "Addressbook"); |
|
|
|
mDefaultFileName = config->readEntry("default"); |
|
if (mDefaultFileName.isEmpty()) |
|
mDefaultFileName = locateLocal("appdata", "addressbook"); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
int KMAddrBook::load(const QString &aFileName) |
|
{ |
|
QString line; |
|
QString fname = aFileName.isNull() ? mDefaultFileName : aFileName; |
|
QFile file(fname); |
|
int rc; |
|
|
|
if(fname.isNull()) |
|
return IO_FatalError; |
|
|
|
if (!file.open(IO_ReadOnly)) return file.status(); |
|
clear(); |
|
|
|
QTextStream t( &file ); |
|
t.setEncoding(QTextStream::Locale); |
|
|
|
while ( !t.eof() ) |
|
{ |
|
line = t.readLine(); |
|
if (!line.isNull() && line[0]!='#') |
|
insert(line); |
|
} |
|
|
|
rc = file.status(); |
|
file.close(); |
|
|
|
mModified = FALSE; |
|
return rc; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
int KMAddrBook::store(const QString &aFileName) |
|
{ |
|
QString fname = aFileName.isNull() ? mDefaultFileName : aFileName; |
|
QFile file(fname); |
|
|
|
if(fname.isNull()) |
|
return IO_FatalError; |
|
|
|
if (!file.open(IO_ReadWrite|IO_Truncate)) return fileError(file.status()); |
|
file.resetStatus(); // Work around suspected QT pre 2.2 snapshot bug |
|
QTextStream ts( &file ); |
|
ts.setEncoding(QTextStream::Locale); |
|
|
|
ts << QString::fromLatin1( "# kmail addressbook file\n" ); |
|
if (file.status() != IO_Ok) return fileError(file.status()); |
|
|
|
QStringList::ConstIterator it = begin(); |
|
for ( ; it != end(); ++it ) |
|
{ |
|
ts << *it << "\n"; |
|
if (file.status() != IO_Ok) return fileError(file.status()); |
|
} |
|
file.close(); |
|
|
|
mModified = FALSE; |
|
return IO_Ok; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
int KMAddrBook::fileError(int status) const |
|
{ |
|
QString msg; |
|
|
|
switch(status) |
|
{ |
|
case IO_ReadError: |
|
msg = i18n("Could not read file:\n%1"); |
|
break; |
|
case IO_OpenError: |
|
msg = i18n("Could not open file:\n%1"); |
|
break; |
|
default: |
|
msg = i18n("Error while writing file:\n%1"); |
|
} |
|
|
|
QString str = msg.arg(mDefaultFileName); |
|
KMessageBox::sorry(0, str, i18n("File I/O Error")); |
|
|
|
return status; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KabBridge::addresses(QStringList* result, QValueList<KabKey> *keys) |
|
{ |
|
QString addr; |
|
QString email; |
|
KabKey key; |
|
AddressBook::Entry entry; |
|
if (keys) |
|
keys->clear(); |
|
int num = kernel->KABaddrBook()->addressbook()->noOfEntries(); |
|
|
|
for (int i = 0; i < num; ++i) { |
|
if (AddressBook::NoError != |
|
kernel->KABaddrBook()->addressbook()->getKey( i, key )) |
|
continue; |
|
if (AddressBook::NoError != |
|
kernel->KABaddrBook()->addressbook()->getEntry( key, entry )) |
|
continue; |
|
unsigned int emails_count; |
|
for( emails_count = 0; emails_count < entry.emails.count(); emails_count++ ) { |
|
if (!entry.emails[emails_count].isEmpty()) { |
|
if (entry.fn.isEmpty() || (entry.emails[0].find( "<" ) != -1)) |
|
addr = ""; |
|
else { /* do we really need quotes around this name ? */ |
|
if (entry.fn.find(QRegExp("[^ 0-9A-Za-z\\x0080-\\xFFFF]")) != -1) |
|
addr = "\"" + entry.fn + "\" "; |
|
else |
|
addr = entry.fn + " "; |
|
} |
|
email = entry.emails[emails_count]; |
|
if (!addr.isEmpty() && (email.find( "<" ) == -1) |
|
&& (email.find( ">" ) == -1) |
|
&& (email.find( "," ) == -1)) |
|
addr += "<" + email + ">"; |
|
else |
|
addr += email; |
|
addr.stripWhiteSpace(); |
|
result->append( addr ); |
|
if (keys) |
|
keys->append( key ); |
|
} |
|
} |
|
} |
|
} |
|
|
|
QString KabBridge::fn(QString address) |
|
{ |
|
return KMMessage::stripEmailAddr( address ); |
|
} |
|
|
|
QString KabBridge::email(QString address) |
|
{ |
|
int i = address.find( "<" ); |
|
if (i < 0) |
|
return ""; |
|
int j = address.find( ">", i ); |
|
if (j < 0) |
|
return ""; |
|
return address.mid( i + 1, j - i - 1 ); |
|
} |
|
|
|
bool KabBridge::add(QString address, KabKey &kabkey) |
|
{ |
|
AddressBook::Entry entry; |
|
if (entry.emails.count() < 1) |
|
entry.emails.append( "" ); |
|
entry.emails[0] = email(address); |
|
entry.fn = fn(address); |
|
|
|
if (kernel->KABaddrBook()->addressbook()->add( entry, kabkey, true ) != |
|
AddressBook::NoError) { |
|
kdDebug(5006) << "Error occurred trying to update database: operation insert.0" << endl; |
|
return false; |
|
} |
|
if (kernel->KABaddrBook()->addressbook()->save("", true) != |
|
AddressBook::NoError) { |
|
kdDebug(5006) << "Error occurred trying to update database: opeation insert.1" << endl; |
|
return false; |
|
} |
|
return true; |
|
} |
|
|
|
bool KabBridge::remove(KabKey kabKey) |
|
{ |
|
if (kernel->KABaddrBook()->addressbook()->remove( kabKey ) != |
|
AddressBook::NoError) { |
|
kdDebug(5006) << "Error occurred trying to update database: operation remove.0" << endl; |
|
return false; |
|
} |
|
|
|
if (kernel->KABaddrBook()->addressbook()->save("", true) != |
|
AddressBook::NoError) { |
|
kdDebug(5006) << "Error occurred trying to update database: operation remove.1" << endl; |
|
return false; |
|
} |
|
return true; |
|
} |
|
|
|
bool KabBridge::replace(QString address, KabKey kabKey) |
|
{ |
|
AddressBook::Entry old; |
|
if (AddressBook::NoError != |
|
kernel->KABaddrBook()->addressbook()->getEntry( kabKey, old )) { |
|
kdDebug(5006) << "Error occurred trying to update database: operation replace.0" << endl; |
|
return false; |
|
} |
|
|
|
if (old.emails.count() < 1) |
|
old.emails.append( "" ); |
|
old.emails[0] = email(address); |
|
old.fn = fn(address); |
|
|
|
if (kernel->KABaddrBook()->addressbook()->change( kabKey, old ) != |
|
AddressBook::NoError) { |
|
kdDebug(5006) << "Error occurred trying to update database: operation replace.1" << endl; |
|
return false; |
|
} |
|
|
|
if (kernel->KABaddrBook()->addressbook()->save("", true) != |
|
AddressBook::NoError) { |
|
kdDebug(5006) << "Error occurred trying to update database: operation replace.2" << endl; |
|
return false; |
|
} |
|
return true; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMAddrBookExternal::addEmail(QString addr, QWidget *parent) { |
|
KConfig *config = kapp->config(); |
|
KConfigGroupSaver saver(config, "General"); |
|
int ab = config->readNumEntry("addressbook", 3); |
|
if (ab == 3) { |
|
KRun::runCommand( "kaddressbook -a \"" + addr.replace(QRegExp("\""), "") |
|
+ "\"" ); |
|
return; |
|
} |
|
if (!KMAddrBookExternal::useKAB()) { |
|
if (addr.isEmpty()) return; |
|
kernel->addrBook()->insert(addr); |
|
// statusMsg(i18n("Address added to addressbook.")); |
|
} |
|
else { |
|
AddToKabDialog dialog(addr, kernel->KABaddrBook(), parent); |
|
dialog.exec(); |
|
} |
|
} |
|
|
|
void KMAddrBookExternal::launch(QWidget *parent) { |
|
KConfig *config = kapp->config(); |
|
KConfigGroupSaver saver(config, "General"); |
|
int ab = config->readNumEntry("addressbook", 3); |
|
switch (ab) |
|
{ |
|
case -1: |
|
case 0: |
|
case 1: |
|
{ |
|
KMAddrBookEditDlg dlg( kernel->addrBook(), parent ); |
|
dlg.exec(); |
|
break; |
|
} |
|
case 2: |
|
KRun::runCommand("kab"); |
|
break; |
|
case 3: |
|
KRun::runCommand("kaddressbook"); |
|
break; |
|
default: |
|
kdDebug(5006) << "Unknown address book type" << endl; |
|
} |
|
} |
|
|
|
bool KMAddrBookExternal::useKAB() |
|
{ |
|
KConfig *config = kapp->config(); |
|
KConfigGroupSaver saver(config, "General"); |
|
int ab = config->readNumEntry("addressbook", 3); |
|
if (ab <= 0) |
|
return false; |
|
return true; |
|
} |
|
|
|
|