summaryrefslogtreecommitdiffabout
path: root/kabc/distributionlist.cpp
authorzautrix <zautrix>2004-06-26 19:01:18 (UTC)
committer zautrix <zautrix>2004-06-26 19:01:18 (UTC)
commitb9aad1f15dc600e4dbe4c62d3fcced6363188ba3 (patch) (side-by-side diff)
tree2c3d4004fb21c72cba65793859f9bcd8ffd3a49c /kabc/distributionlist.cpp
downloadkdepimpi-b9aad1f15dc600e4dbe4c62d3fcced6363188ba3.zip
kdepimpi-b9aad1f15dc600e4dbe4c62d3fcced6363188ba3.tar.gz
kdepimpi-b9aad1f15dc600e4dbe4c62d3fcced6363188ba3.tar.bz2
Initial revision
Diffstat (limited to 'kabc/distributionlist.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--kabc/distributionlist.cpp293
1 files changed, 293 insertions, 0 deletions
diff --git a/kabc/distributionlist.cpp b/kabc/distributionlist.cpp
new file mode 100644
index 0000000..aa2725d
--- a/dev/null
+++ b/kabc/distributionlist.cpp
@@ -0,0 +1,293 @@
+/*
+ This file is part of libkabc.
+ Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#include <ksimpleconfig.h>
+#include <kstandarddirs.h>
+#include <kdebug.h>
+
+#include "distributionlist.h"
+
+using namespace KABC;
+
+DistributionList::DistributionList( DistributionListManager *manager,
+ const QString &name ) :
+ mManager( manager ), mName( name )
+{
+ mManager->insert( this );
+}
+
+DistributionList::~DistributionList()
+{
+ mManager->remove( this );
+}
+
+void DistributionList::setName( const QString &name )
+{
+ mName = name;
+}
+
+QString DistributionList::name() const
+{
+ return mName;
+}
+
+void DistributionList::insertEntry( const Addressee &a, const QString &email )
+{
+ Entry e( a, email );
+
+ QValueList<Entry>::Iterator it;
+ for( it = mEntries.begin(); it != mEntries.end(); ++it ) {
+ if ( (*it).addressee.uid() == a.uid() ) {
+ /**
+ We have to check if both email addresses contains no data,
+ a simple 'email1 == email2' wont work here
+ */
+ if ( ( (*it).email.isNull() && email.isEmpty() ) ||
+ ( (*it).email.isEmpty() && email.isNull() ) ||
+ ( (*it).email == email ) ) {
+ *it = e;
+ return;
+ }
+ }
+ }
+ mEntries.append( e );
+}
+
+void DistributionList::removeEntry( const Addressee &a, const QString &email )
+{
+ QValueList<Entry>::Iterator it;
+ for( it = mEntries.begin(); it != mEntries.end(); ++it ) {
+ if ( (*it).addressee.uid() == a.uid() && (*it).email == email ) {
+ mEntries.remove( it );
+ return;
+ }
+ }
+}
+
+QStringList DistributionList::emails() const
+{
+ QStringList emails;
+
+ Entry::List::ConstIterator it;
+ for( it = mEntries.begin(); it != mEntries.end(); ++it ) {
+ Addressee a = (*it).addressee;
+ QString email = (*it).email.isEmpty() ? a.fullEmail() :
+ a.fullEmail( (*it).email );
+
+ if ( !email.isEmpty() ) {
+ emails.append( email );
+ }
+ }
+
+ return emails;
+}
+
+DistributionList::Entry::List DistributionList::entries() const
+{
+ return mEntries;
+}
+
+
+DistributionListManager::DistributionListManager( AddressBook *ab ) :
+ mAddressBook( ab )
+{
+}
+
+DistributionListManager::~DistributionListManager()
+{
+}
+
+DistributionList *DistributionListManager::list( const QString &name )
+{
+ DistributionList *list;
+ for( list = mLists.first(); list; list = mLists.next() ) {
+ if ( list->name() == name ) return list;
+ }
+
+ return 0;
+}
+
+void DistributionListManager::insert( DistributionList *l )
+{
+ DistributionList *list;
+ for( list = mLists.first(); list; list = mLists.next() ) {
+ if ( list->name() == l->name() ) {
+ mLists.remove( list );
+ break;
+ }
+ }
+ mLists.append( l );
+}
+
+void DistributionListManager::remove( DistributionList *l )
+{
+ DistributionList *list;
+ for( list = mLists.first(); list; list = mLists.next() ) {
+ if ( list->name() == l->name() ) {
+ mLists.remove( list );
+ return;
+ }
+ }
+}
+
+QStringList DistributionListManager::listNames()
+{
+ QStringList names;
+
+ DistributionList *list;
+ for( list = mLists.first(); list; list = mLists.next() ) {
+ names.append( list->name() );
+ }
+
+ return names;
+}
+
+bool DistributionListManager::load()
+{
+ KSimpleConfig cfg( locateLocal( "data", "kabc/distlists" ) );
+
+#ifndef KAB_EMBEDDED
+
+ QMap<QString,QString> entryMap = cfg.entryMap( mAddressBook->identifier() );
+ if ( entryMap.isEmpty() ) {
+ kdDebug(5700) << "No distlists for '" << mAddressBook->identifier() << "'" << endl;
+ return false;
+ }
+
+ cfg.setGroup( mAddressBook->identifier() );
+
+ QMap<QString,QString>::ConstIterator it;
+ for( it = entryMap.begin(); it != entryMap.end(); ++it ) {
+ QString name = it.key();
+
+#else //KAB_EMBEDDED
+ cfg.setGroup( mAddressBook->identifier() );
+ //US we work in microkde with a list of distributionlists
+ QStringList distlists = cfg.readListEntry( "Lists" );
+ if ( distlists.isEmpty() ) {
+ kdDebug(5700) << "No distlists for '" << mAddressBook->identifier() << "'" << endl;
+ return false;
+ }
+
+ QStringList::ConstIterator it;
+ for( it = distlists.begin(); it != distlists.end(); ++it ) {
+ QString name = *it;
+
+#endif //KAB_EMBEDDED
+
+ QStringList value = cfg.readListEntry( name );
+
+ kdDebug(5700) << "DLM::load(): " << name << ": " << value.join(",") << endl;
+
+ DistributionList *list = new DistributionList( this, name );
+
+ QStringList::ConstIterator it2 = value.begin();
+ while( it2 != value.end() ) {
+ QString id = *it2++;
+ QString email = *it2;
+
+ kdDebug(5700) << "----- Entry " << id << endl;
+
+ Addressee a = mAddressBook->findByUid( id );
+ if ( !a.isEmpty() ) {
+ list->insertEntry( a, email );
+ }
+
+ if ( it2 == value.end() ) break;
+ ++it2;
+ }
+ }
+
+ return true;
+}
+
+bool DistributionListManager::save()
+{
+ kdDebug(5700) << "DistListManager::save()" << endl;
+
+ KSimpleConfig cfg( locateLocal( "data", "kabc/distlists" ) );
+
+ cfg.deleteGroup( mAddressBook->identifier() );
+ cfg.setGroup( mAddressBook->identifier() );
+
+ DistributionList *list;
+ for( list = mLists.first(); list; list = mLists.next() ) {
+ kdDebug(5700) << " Saving '" << list->name() << "'" << endl;
+ QStringList value;
+ DistributionList::Entry::List entries = list->entries();
+ DistributionList::Entry::List::ConstIterator it;
+ for( it = entries.begin(); it != entries.end(); ++it ) {
+ value.append( (*it).addressee.uid() );
+ value.append( (*it).email );
+ }
+ cfg.writeEntry( list->name(), value );
+ }
+
+#ifdef KAB_EMBEDDED
+//US for microKDE we have not yet sophisticated methods to load maps.
+// Because of that we store also a list of all distributionlists.
+ QStringList namelist;
+ for( list = mLists.first(); list; list = mLists.next() ) {
+ namelist.append( list->name() );
+ }
+ cfg.writeEntry( "Lists", namelist );
+
+#endif //KAB_EMBEDDED
+
+ cfg.sync();
+
+ return true;
+}
+
+DistributionListWatcher* DistributionListWatcher::mSelf = 0;
+
+DistributionListWatcher::DistributionListWatcher()
+ : QObject( 0, "DistributionListWatcher" )
+{
+#ifndef KAB_EMBEDDED
+ mDirWatch = new KDirWatch;
+ mDirWatch->addFile( locateLocal( "data", "kabc/distlists" ) );
+
+ connect( mDirWatch, SIGNAL( dirty( const QString& ) ), SIGNAL( changed() ) );
+ mDirWatch->startScan();
+#endif //KAB_EMBEDDED
+}
+
+DistributionListWatcher::~DistributionListWatcher()
+{
+#ifndef KAB_EMBEDDED
+ delete mDirWatch;
+ mDirWatch = 0;
+#endif //KAB_EMBEDDED
+}
+
+DistributionListWatcher *DistributionListWatcher::self()
+{
+ if ( !mSelf )
+ mSelf = new DistributionListWatcher();
+
+ return mSelf;
+}
+
+
+#ifndef KAB_EMBEDDED
+#include "distributionlist.moc"
+#endif //KAB_EMBEDDED
+