kabc Library API Documentation

addressbook.cpp

00001 /* 00002 This file is part of libkabc. 00003 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 00004 00005 This library is free software; you can redistribute it and/or 00006 modify it under the terms of the GNU Library General Public 00007 License as published by the Free Software Foundation; either 00008 version 2 of the License, or (at your option) any later version. 00009 00010 This library is distributed in the hope that it will be useful, 00011 but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 Library General Public License for more details. 00014 00015 You should have received a copy of the GNU Library General Public License 00016 along with this library; see the file COPYING.LIB. If not, write to 00017 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00018 Boston, MA 02111-1307, USA. 00019 */ 00020 00021 #include <qfile.h> 00022 #include <qregexp.h> 00023 #include <qtimer.h> 00024 00025 #include <kapplication.h> 00026 #include <kdebug.h> 00027 #include <kglobal.h> 00028 #include <kinstance.h> 00029 #include <klocale.h> 00030 #include <kstandarddirs.h> 00031 00032 #include "errorhandler.h" 00033 #include "resource.h" 00034 00035 #include "addressbook.h" 00036 #include "addressbook.moc" 00037 00038 using namespace KABC; 00039 00040 struct AddressBook::AddressBookData 00041 { 00042 Field::List mAllFields; 00043 ErrorHandler *mErrorHandler; 00044 KConfig *mConfig; 00045 KRES::Manager<Resource> *mManager; 00046 QPtrList<Resource> mPendingLoadResources; 00047 QPtrList<Resource> mPendingSaveResources; 00048 Iterator end; 00049 }; 00050 00051 struct AddressBook::Iterator::IteratorData 00052 { 00053 Resource::Iterator mIt; 00054 QValueList<Resource*> mResources; 00055 int mCurrRes; 00056 }; 00057 00058 struct AddressBook::ConstIterator::ConstIteratorData 00059 { 00060 Resource::ConstIterator mIt; 00061 QValueList<Resource*> mResources; 00062 int mCurrRes; 00063 }; 00064 00065 AddressBook::Iterator::Iterator() 00066 { 00067 d = new IteratorData; 00068 } 00069 00070 AddressBook::Iterator::Iterator( const AddressBook::Iterator &i ) 00071 { 00072 d = new IteratorData; 00073 d->mIt = i.d->mIt; 00074 d->mResources = i.d->mResources; 00075 d->mCurrRes = i.d->mCurrRes; 00076 } 00077 00078 AddressBook::Iterator &AddressBook::Iterator::operator=( const AddressBook::Iterator &i ) 00079 { 00080 if( this == &i ) return *this; // guard against self assignment 00081 delete d; // delete the old data the Iterator was completely constructed before 00082 d = new IteratorData; 00083 d->mIt = i.d->mIt; 00084 d->mResources = i.d->mResources; 00085 d->mCurrRes = i.d->mCurrRes; 00086 return *this; 00087 } 00088 00089 AddressBook::Iterator::~Iterator() 00090 { 00091 delete d; 00092 } 00093 00094 const Addressee &AddressBook::Iterator::operator*() const 00095 { 00096 return *(d->mIt); 00097 } 00098 00099 Addressee &AddressBook::Iterator::operator*() 00100 { 00101 return *(d->mIt); 00102 } 00103 00104 Addressee *AddressBook::Iterator::operator->() 00105 { 00106 return &(*(d->mIt)); 00107 } 00108 00109 AddressBook::Iterator &AddressBook::Iterator::operator++() 00110 { 00111 do { 00112 bool jumped = false; 00113 while ( d->mIt == (d->mResources[ d->mCurrRes ])->end() ) { // at end of addressee list of resource 00114 if ( (uint)d->mCurrRes == d->mResources.count() - 1 ) { 00115 return *this; 00116 } 00117 00118 d->mCurrRes++; // jump to next resource 00119 00120 jumped = true; 00121 d->mIt = (d->mResources[ d->mCurrRes ])->begin(); 00122 } 00123 00124 if ( !jumped ) 00125 (d->mIt)++; 00126 00127 } while ( d->mIt == (d->mResources[ d->mCurrRes ])->end() ); 00128 00129 return *this; 00130 } 00131 00132 AddressBook::Iterator &AddressBook::Iterator::operator++( int ) 00133 { 00134 do { 00135 bool jumped = false; 00136 while ( d->mIt == (d->mResources[ d->mCurrRes ])->end() ) { // at end of addressee list of resource 00137 if ( (uint)d->mCurrRes == d->mResources.count() - 1 ) { 00138 return *this; 00139 } 00140 00141 d->mCurrRes++; // jump to next resource 00142 00143 jumped = true; 00144 d->mIt = (d->mResources[ d->mCurrRes ])->begin(); 00145 } 00146 00147 if ( !jumped ) 00148 (d->mIt)++; 00149 00150 } while ( d->mIt == (d->mResources[ d->mCurrRes ])->end() ); 00151 00152 return *this; 00153 } 00154 00155 AddressBook::Iterator &AddressBook::Iterator::operator--() 00156 { 00157 (d->mIt)--; 00158 00159 return *this; 00160 } 00161 00162 AddressBook::Iterator &AddressBook::Iterator::operator--( int ) 00163 { 00164 (d->mIt)--; 00165 00166 return *this; 00167 } 00168 00169 bool AddressBook::Iterator::operator==( const Iterator &it ) 00170 { 00171 return ( d->mIt == it.d->mIt ); 00172 } 00173 00174 bool AddressBook::Iterator::operator!=( const Iterator &it ) 00175 { 00176 return ( d->mIt != it.d->mIt ); 00177 } 00178 00179 00180 AddressBook::ConstIterator::ConstIterator() 00181 { 00182 d = new ConstIteratorData; 00183 } 00184 00185 AddressBook::ConstIterator::ConstIterator( const AddressBook::ConstIterator &i ) 00186 { 00187 d = new ConstIteratorData; 00188 d->mIt = i.d->mIt; 00189 d->mResources = i.d->mResources; 00190 d->mCurrRes = i.d->mCurrRes; 00191 } 00192 00193 AddressBook::ConstIterator::ConstIterator( const AddressBook::Iterator &i ) 00194 { 00195 d = new ConstIteratorData; 00196 d->mIt = i.d->mIt; 00197 d->mResources = i.d->mResources; 00198 d->mCurrRes = i.d->mCurrRes; 00199 } 00200 00201 AddressBook::ConstIterator &AddressBook::ConstIterator::operator=( const AddressBook::ConstIterator &i ) 00202 { 00203 if( this == &i ) return *this; // guard for self assignment 00204 delete d; // delete the old data because the Iterator was really constructed before 00205 d = new ConstIteratorData; 00206 d->mIt = i.d->mIt; 00207 d->mResources = i.d->mResources; 00208 d->mCurrRes = i.d->mCurrRes; 00209 return *this; 00210 } 00211 00212 AddressBook::ConstIterator::~ConstIterator() 00213 { 00214 delete d; 00215 } 00216 00217 const Addressee &AddressBook::ConstIterator::operator*() const 00218 { 00219 return *(d->mIt); 00220 } 00221 00222 const Addressee* AddressBook::ConstIterator::operator->() const 00223 { 00224 return &(*(d->mIt)); 00225 } 00226 00227 AddressBook::ConstIterator &AddressBook::ConstIterator::operator++() 00228 { 00229 do { 00230 bool jumped = false; 00231 while ( d->mIt == (d->mResources[ d->mCurrRes ])->end() ) { // at end of addressee list of resource 00232 if ( (uint)d->mCurrRes == d->mResources.count() - 1 ) { 00233 return *this; 00234 } 00235 00236 d->mCurrRes++; // jump to next resource 00237 00238 jumped = true; 00239 d->mIt = (d->mResources[ d->mCurrRes ])->begin(); 00240 } 00241 00242 if ( !jumped ) 00243 (d->mIt)++; 00244 00245 } while ( d->mIt == (d->mResources[ d->mCurrRes ])->end() ); 00246 00247 return *this; 00248 } 00249 00250 AddressBook::ConstIterator &AddressBook::ConstIterator::operator++(int) 00251 { 00252 do { 00253 bool jumped = false; 00254 while ( d->mIt == (d->mResources[ d->mCurrRes ])->end() ) { // at end of addressee list of resource 00255 if ( (uint)d->mCurrRes == d->mResources.count() - 1 ) { 00256 return *this; 00257 } 00258 00259 d->mCurrRes++; // jump to next resource 00260 00261 jumped = true; 00262 d->mIt = (d->mResources[ d->mCurrRes ])->begin(); 00263 } 00264 00265 if ( !jumped ) 00266 (d->mIt)++; 00267 00268 } while ( d->mIt == (d->mResources[ d->mCurrRes ])->end() ); 00269 00270 return *this; 00271 } 00272 00273 AddressBook::ConstIterator &AddressBook::ConstIterator::operator--() 00274 { 00275 (d->mIt)--; 00276 return *this; 00277 } 00278 00279 AddressBook::ConstIterator &AddressBook::ConstIterator::operator--(int) 00280 { 00281 (d->mIt)--; 00282 return *this; 00283 } 00284 00285 bool AddressBook::ConstIterator::operator==( const ConstIterator &it ) 00286 { 00287 return ( d->mIt == it.d->mIt ); 00288 } 00289 00290 bool AddressBook::ConstIterator::operator!=( const ConstIterator &it ) 00291 { 00292 return ( d->mIt != it.d->mIt ); 00293 } 00294 00295 00296 AddressBook::AddressBook() 00297 { 00298 d = new AddressBookData; 00299 d->mErrorHandler = 0; 00300 d->mConfig = 0; 00301 d->mManager = new KRES::Manager<Resource>( "contact" ); 00302 d->end.d->mResources = QValueList<Resource*>(); 00303 d->end.d->mCurrRes = -1; 00304 } 00305 00306 AddressBook::AddressBook( const QString &config ) 00307 { 00308 d = new AddressBookData; 00309 d->mErrorHandler = 0; 00310 if ( config.isEmpty() ) 00311 d->mConfig = 0; 00312 else 00313 d->mConfig = new KConfig( config ); 00314 d->mManager = new KRES::Manager<Resource>( "contact" ); 00315 d->mManager->readConfig( d->mConfig ); 00316 d->end.d->mResources = QValueList<Resource*>(); 00317 d->end.d->mCurrRes = -1; 00318 } 00319 00320 AddressBook::~AddressBook() 00321 { 00322 delete d->mManager; d->mManager = 0; 00323 delete d->mConfig; d->mConfig = 0; 00324 delete d->mErrorHandler; d->mErrorHandler = 0; 00325 delete d; d = 0; 00326 } 00327 00328 bool AddressBook::load() 00329 { 00330 kdDebug(5700) << "AddressBook::load()" << endl; 00331 00332 clear(); 00333 00334 KRES::Manager<Resource>::ActiveIterator it; 00335 bool ok = true; 00336 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) { 00337 if ( !(*it)->load() ) { 00338 error( i18n("Unable to load resource '%1'").arg( (*it)->resourceName() ) ); 00339 ok = false; 00340 } 00341 } 00342 00343 return ok; 00344 } 00345 00346 bool AddressBook::asyncLoad() 00347 { 00348 kdDebug(5700) << "AddressBook::asyncLoad()" << endl; 00349 00350 clear(); 00351 00352 KRES::Manager<Resource>::ActiveIterator it; 00353 bool ok = true; 00354 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) { 00355 d->mPendingLoadResources.append( *it ); 00356 if ( !(*it)->asyncLoad() ) { 00357 error( i18n("Unable to load resource '%1'").arg( (*it)->resourceName() ) ); 00358 ok = false; 00359 } 00360 } 00361 00362 return ok; 00363 } 00364 00365 bool AddressBook::save( Ticket *ticket ) 00366 { 00367 kdDebug(5700) << "AddressBook::save()"<< endl; 00368 00369 if ( ticket->resource() ) { 00370 deleteRemovedAddressees(); 00371 bool ok = ticket->resource()->save( ticket ); 00372 if ( ok ) ticket->resource()->releaseSaveTicket( ticket ); 00373 return ok; 00374 } 00375 00376 return false; 00377 } 00378 00379 bool AddressBook::asyncSave( Ticket *ticket ) 00380 { 00381 kdDebug(5700) << "AddressBook::asyncSave()"<< endl; 00382 00383 if ( ticket->resource() ) { 00384 d->mPendingSaveResources.append( ticket->resource() ); 00385 bool ok = ticket->resource()->asyncSave( ticket ); 00386 if ( ok ) ticket->resource()->releaseSaveTicket( ticket ); 00387 return ok; 00388 } 00389 00390 return false; 00391 } 00392 00393 AddressBook::Iterator AddressBook::begin() 00394 { 00395 QValueList<Resource*> list; 00396 KRES::Manager<Resource>::ActiveIterator resIt; 00397 for ( resIt = d->mManager->activeBegin(); resIt != d->mManager->activeEnd(); ++resIt ) 00398 list.append( *resIt ); 00399 00400 if ( list.count() == 0 ) 00401 return end(); 00402 00403 Iterator it = Iterator(); 00404 it.d->mResources = list; 00405 it.d->mCurrRes = 0; 00406 it.d->mIt = (it.d->mResources[ it.d->mCurrRes ])->begin(); 00407 00408 while ( it.d->mIt == (it.d->mResources[ it.d->mCurrRes ])->end() ) { 00409 if ( (uint)it.d->mCurrRes == it.d->mResources.count() - 1 ) 00410 return end(); 00411 00412 it.d->mCurrRes++; 00413 00414 it.d->mIt = (it.d->mResources[ it.d->mCurrRes ])->begin(); 00415 } 00416 00417 return it; 00418 } 00419 00420 AddressBook::ConstIterator AddressBook::begin() const 00421 { 00422 QValueList<Resource*> list; 00423 KRES::Manager<Resource>::ActiveIterator resIt; 00424 for ( resIt = d->mManager->activeBegin(); resIt != d->mManager->activeEnd(); ++resIt ) 00425 list.append( *resIt ); 00426 00427 if ( list.count() == 0 ) 00428 return end(); 00429 00430 Iterator it = Iterator(); 00431 it.d->mResources = list; 00432 it.d->mCurrRes = 0; 00433 it.d->mIt = (it.d->mResources[ it.d->mCurrRes ])->begin(); 00434 00435 while ( it.d->mIt == (it.d->mResources[ it.d->mCurrRes ])->end() ) { 00436 if ( (uint)it.d->mCurrRes == it.d->mResources.count() - 1 ) 00437 return end(); 00438 00439 it.d->mCurrRes++; 00440 00441 it.d->mIt = (it.d->mResources[ it.d->mCurrRes ])->begin(); 00442 } 00443 00444 return it; 00445 } 00446 00447 AddressBook::Iterator AddressBook::end() 00448 { 00449 KRES::Manager<Resource>::ActiveIterator resIt = d->mManager->activeEnd(); 00450 00451 if ( resIt == d->mManager->activeBegin() || ! *(--resIt) ) { // no resource available 00452 d->end.d->mIt = Resource::Iterator(); 00453 } else { 00454 d->end.d->mIt = (*resIt)->end(); 00455 } 00456 00457 return d->end; 00458 } 00459 00460 AddressBook::ConstIterator AddressBook::end() const 00461 { 00462 KRES::Manager<Resource>::ActiveIterator resIt = d->mManager->activeEnd(); 00463 00464 if ( resIt == d->mManager->activeBegin() || ! *(--resIt) ) { // no resource available 00465 d->end.d->mIt = Resource::Iterator(); 00466 } else { 00467 d->end.d->mIt = (*resIt)->end(); 00468 } 00469 00470 return d->end; 00471 } 00472 00473 void AddressBook::clear() 00474 { 00475 KRES::Manager<Resource>::ActiveIterator it; 00476 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) 00477 (*it)->clear(); 00478 } 00479 00480 Ticket *AddressBook::requestSaveTicket( Resource *resource ) 00481 { 00482 kdDebug(5700) << "AddressBook::requestSaveTicket()" << endl; 00483 00484 if ( !resource ) 00485 resource = standardResource(); 00486 00487 KRES::Manager<Resource>::ActiveIterator it; 00488 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) { 00489 if ( (*it) == resource ) { 00490 if ( (*it)->readOnly() || !(*it)->isOpen() ) 00491 return 0; 00492 else 00493 return (*it)->requestSaveTicket(); 00494 } 00495 } 00496 00497 return 0; 00498 } 00499 00500 void AddressBook::releaseSaveTicket( Ticket *ticket ) 00501 { 00502 if ( !ticket ) 00503 return; 00504 00505 if ( ticket->resource() ) { 00506 ticket->resource()->releaseSaveTicket( ticket ); 00507 } 00508 } 00509 00510 void AddressBook::insertAddressee( const Addressee &a ) 00511 { 00512 Resource *resource = a.resource(); 00513 if ( resource == 0 ) 00514 resource = standardResource(); 00515 00516 Resource::Iterator it; 00517 Addressee fAddr = resource->findByUid( a.uid() ); 00518 00519 Addressee addr( a ); 00520 if ( !fAddr.isEmpty() ) { 00521 if ( fAddr != a ) 00522 addr.setRevision( QDateTime::currentDateTime() ); 00523 else { 00524 if ( fAddr.resource() == 0 ) { 00525 fAddr.setResource( resource ); 00526 //NOTE: Should we have setChanged( true ) here? 00527 resource->insertAddressee( fAddr ); 00528 } 00529 return; 00530 } 00531 } 00532 00533 addr.setResource( resource ); 00534 addr.setChanged( true ); 00535 resource->insertAddressee( addr ); 00536 } 00537 00538 void AddressBook::removeAddressee( const Addressee &a ) 00539 { 00540 if ( a.resource() ) 00541 a.resource()->removeAddressee( a ); 00542 } 00543 00544 void AddressBook::removeAddressee( const Iterator &it ) 00545 { 00546 if ( (*it).resource() ) 00547 (*it).resource()->removeAddressee( *it ); 00548 } 00549 00550 AddressBook::Iterator AddressBook::find( const Addressee &a ) 00551 { 00552 Iterator it; 00553 for ( it = begin(); it != end(); ++it ) { 00554 if ( a.uid() == (*it).uid() ) 00555 return it; 00556 } 00557 00558 return end(); 00559 } 00560 00561 Addressee AddressBook::findByUid( const QString &uid ) 00562 { 00563 KRES::Manager<Resource>::ActiveIterator it; 00564 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) { 00565 Addressee addr = (*it)->findByUid( uid ); 00566 if ( !addr.isEmpty() ) 00567 return addr; 00568 } 00569 00570 return Addressee(); 00571 } 00572 00573 Addressee::List AddressBook::allAddressees() 00574 { 00575 Addressee::List list; 00576 00577 Iterator it; 00578 for ( it = begin(); it != end(); ++it ) 00579 list.append( *it ); 00580 00581 return list; 00582 } 00583 00584 Addressee::List AddressBook::findByName( const QString &name ) 00585 { 00586 Addressee::List results; 00587 00588 KRES::Manager<Resource>::ActiveIterator it; 00589 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) 00590 results += (*it)->findByName( name ); 00591 00592 return results; 00593 } 00594 00595 Addressee::List AddressBook::findByEmail( const QString &email ) 00596 { 00597 Addressee::List results; 00598 00599 KRES::Manager<Resource>::ActiveIterator it; 00600 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) 00601 results += (*it)->findByEmail( email ); 00602 00603 return results; 00604 } 00605 00606 Addressee::List AddressBook::findByCategory( const QString &category ) 00607 { 00608 Addressee::List results; 00609 00610 KRES::Manager<Resource>::ActiveIterator it; 00611 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) 00612 results += (*it)->findByCategory( category ); 00613 00614 return results; 00615 } 00616 00617 void AddressBook::dump() const 00618 { 00619 kdDebug(5700) << "AddressBook::dump() --- begin ---" << endl; 00620 00621 ConstIterator it; 00622 for( it = begin(); it != end(); ++it ) { 00623 (*it).dump(); 00624 } 00625 00626 kdDebug(5700) << "AddressBook::dump() --- end ---" << endl; 00627 } 00628 00629 QString AddressBook::identifier() 00630 { 00631 QStringList identifier; 00632 00633 00634 KRES::Manager<Resource>::ActiveIterator it; 00635 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) { 00636 if ( !(*it)->identifier().isEmpty() ) 00637 identifier.append( (*it)->identifier() ); 00638 } 00639 00640 return identifier.join( ":" ); 00641 } 00642 00643 Field::List AddressBook::fields( int category ) 00644 { 00645 if ( d->mAllFields.isEmpty() ) { 00646 d->mAllFields = Field::allFields(); 00647 } 00648 00649 if ( category == Field::All ) return d->mAllFields; 00650 00651 Field::List result; 00652 Field::List::ConstIterator it; 00653 for( it = d->mAllFields.begin(); it != d->mAllFields.end(); ++it ) { 00654 if ( (*it)->category() & category ) result.append( *it ); 00655 } 00656 00657 return result; 00658 } 00659 00660 bool AddressBook::addCustomField( const QString &label, int category, 00661 const QString &key, const QString &app ) 00662 { 00663 if ( d->mAllFields.isEmpty() ) { 00664 d->mAllFields = Field::allFields(); 00665 } 00666 00667 QString a = app.isNull() ? KGlobal::instance()->instanceName() : app; 00668 QString k = key.isNull() ? label : key; 00669 00670 Field *field = Field::createCustomField( label, category, k, a ); 00671 00672 if ( !field ) return false; 00673 00674 d->mAllFields.append( field ); 00675 00676 return true; 00677 } 00678 00679 QDataStream &KABC::operator<<( QDataStream &s, const AddressBook &ab ) 00680 { 00681 if (!ab.d) return s; 00682 00683 return s;// << ab.d->mAddressees; 00684 } 00685 00686 QDataStream &KABC::operator>>( QDataStream &s, AddressBook &ab ) 00687 { 00688 if (!ab.d) return s; 00689 00690 // s >> ab.d->mAddressees; 00691 00692 return s; 00693 } 00694 00695 bool AddressBook::addResource( Resource *resource ) 00696 { 00697 if ( !resource->open() ) { 00698 kdDebug(5700) << "AddressBook::addResource(): can't add resource" << endl; 00699 return false; 00700 } 00701 00702 d->mManager->add( resource ); 00703 resource->setAddressBook( this ); 00704 00705 connect( resource, SIGNAL( loadingFinished( Resource* ) ), 00706 this, SLOT( resourceLoadingFinished( Resource* ) ) ); 00707 connect( resource, SIGNAL( savingFinished( Resource* ) ), 00708 this, SLOT( resourceSavingFinished( Resource* ) ) ); 00709 00710 connect( resource, SIGNAL( loadingError( Resource*, const QString& ) ), 00711 this, SLOT( resourceLoadingError( Resource*, const QString& ) ) ); 00712 connect( resource, SIGNAL( savingError( Resource*, const QString& ) ), 00713 this, SLOT( resourceSavingError( Resource*, const QString& ) ) ); 00714 00715 return true; 00716 } 00717 00718 bool AddressBook::removeResource( Resource *resource ) 00719 { 00720 resource->close(); 00721 00722 if ( resource == standardResource() ) 00723 d->mManager->setStandardResource( 0 ); 00724 00725 resource->setAddressBook( 0 ); 00726 00727 d->mManager->remove( resource ); 00728 00729 disconnect( resource, SIGNAL( loadingFinished( Resource* ) ), 00730 this, SLOT( resourceLoadingFinished( Resource* ) ) ); 00731 disconnect( resource, SIGNAL( savingFinished( Resource* ) ), 00732 this, SLOT( resourceSavingFinished( Resource* ) ) ); 00733 00734 disconnect( resource, SIGNAL( loadingError( Resource*, const QString& ) ), 00735 this, SLOT( resourceLoadingError( Resource*, const QString& ) ) ); 00736 disconnect( resource, SIGNAL( savingError( Resource*, const QString& ) ), 00737 this, SLOT( resourceLoadingError( Resource*, const QString& ) ) ); 00738 00739 return true; 00740 } 00741 00742 QPtrList<Resource> AddressBook::resources() 00743 { 00744 QPtrList<Resource> list; 00745 00746 KRES::Manager<Resource>::ActiveIterator it; 00747 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) 00748 list.append( *it ); 00749 00750 return list; 00751 } 00752 00753 void AddressBook::setErrorHandler( ErrorHandler *handler ) 00754 { 00755 delete d->mErrorHandler; 00756 d->mErrorHandler = handler; 00757 } 00758 00759 void AddressBook::error( const QString& msg ) 00760 { 00761 if ( !d->mErrorHandler ) // create default error handler 00762 d->mErrorHandler = new ConsoleErrorHandler; 00763 00764 if ( d->mErrorHandler ) 00765 d->mErrorHandler->error( msg ); 00766 else 00767 kdError(5700) << "no error handler defined" << endl; 00768 } 00769 00770 void AddressBook::deleteRemovedAddressees() 00771 { 00772 // no any longer needed 00773 } 00774 00775 void AddressBook::setStandardResource( Resource *resource ) 00776 { 00777 d->mManager->setStandardResource( resource ); 00778 } 00779 00780 Resource *AddressBook::standardResource() 00781 { 00782 return d->mManager->standardResource(); 00783 } 00784 00785 KRES::Manager<Resource> *AddressBook::resourceManager() 00786 { 00787 return d->mManager; 00788 } 00789 00790 void AddressBook::cleanUp() 00791 { 00792 } 00793 00794 void AddressBook::resourceLoadingFinished( Resource *res ) 00795 { 00796 d->mPendingLoadResources.remove( res ); 00797 emit loadingFinished( res ); 00798 00799 if ( d->mPendingLoadResources.count() == 0 ) 00800 emit addressBookChanged( this ); 00801 } 00802 00803 void AddressBook::resourceSavingFinished( Resource *res ) 00804 { 00805 d->mPendingLoadResources.remove( res ); 00806 00807 emit savingFinished( res ); 00808 } 00809 00810 void AddressBook::resourceLoadingError( Resource *res, const QString &errMsg ) 00811 { 00812 error( errMsg ); 00813 00814 d->mPendingLoadResources.remove( res ); 00815 if ( d->mPendingLoadResources.count() == 0 ) 00816 emit addressBookChanged( this ); 00817 } 00818 00819 void AddressBook::resourceSavingError( Resource *res, const QString &errMsg ) 00820 { 00821 error( errMsg ); 00822 00823 d->mPendingSaveResources.remove( res ); 00824 }
KDE Logo
This file is part of the documentation for kabc Library Version 3.2.3.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Oct 8 11:15:46 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003