• Skip to content
  • Skip to link menu
KDE 4.1 API Reference
  • KDE API Reference
  • KDE-PIM Libraries
  • Sitemap
  • Contact Us
 

kabc

resourcecached.cpp

00001 /*
00002     This file is part of kabc.
00003     Copyright (c) 2004 Tobias Koenig <tokoe@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., 51 Franklin Street, Fifth Floor,
00018     Boston, MA 02110-1301, USA.
00019 */
00020 
00021 #include "resourcecached.h"
00022 
00023 #include <kabc/vcardconverter.h>
00024 
00025 #include <kdebug.h>
00026 #include <klocale.h>
00027 #include <kstandarddirs.h>
00028 
00029 #include <QtCore/QFile>
00030 
00031 using namespace KABC;
00032 
00033 class ResourceCached::Private
00034 {
00035   public:
00036     Private( ResourceCached *parent )
00037       : mParent( parent ), mIdMapper( "kabc/uidmaps/" )
00038     {
00039     }
00040 
00041     void loadChangesCache( QMap<QString, KABC::Addressee> &map, const QString &type );
00042     void saveChangesCache( const QMap<QString, KABC::Addressee> &map, const QString &type );
00043 
00044     ResourceCached *mParent;
00045     KRES::IdMapper mIdMapper;
00046 
00047     QMap<QString, KABC::Addressee> mAddedAddressees;
00048     QMap<QString, KABC::Addressee> mChangedAddressees;
00049     QMap<QString, KABC::Addressee> mDeletedAddressees;
00050 };
00051 
00052 void ResourceCached::Private::saveChangesCache( const QMap<QString, KABC::Addressee> &map,
00053                                                 const QString &type )
00054 {
00055   QFile file( mParent->changesCacheFile( type ) );
00056 
00057   const KABC::Addressee::List list = map.values();
00058   if ( list.isEmpty() ) {
00059     file.remove();
00060   } else {
00061     if ( !file.open( QIODevice::WriteOnly ) ) {
00062       kError(5700) << "Can't open changes cache file '" << file.fileName() << "' for saving.";
00063       return;
00064     }
00065 
00066     KABC::VCardConverter converter;
00067     const QByteArray vCards = converter.createVCards( list );
00068     file.write( vCards );
00069   }
00070 }
00071 
00072 void ResourceCached::Private::loadChangesCache( QMap<QString, KABC::Addressee> &map,
00073                                                 const QString &type )
00074 {
00075   QFile file( mParent->changesCacheFile( type ) );
00076   if ( !file.open( QIODevice::ReadOnly ) ) {
00077     return;
00078   }
00079 
00080   KABC::VCardConverter converter;
00081 
00082   const KABC::Addressee::List list = converter.parseVCards( file.readAll() );
00083   KABC::Addressee::List::ConstIterator it;
00084   for ( it = list.begin(); it != list.end(); ++it ) {
00085     map.insert( (*it).uid(), *it );
00086   }
00087 
00088   file.close();
00089 }
00090 
00091 ResourceCached::ResourceCached()
00092   : KABC::Resource(), d( new Private( this ) )
00093 {
00094 }
00095 
00096 ResourceCached::ResourceCached( const KConfigGroup &group )
00097   : KABC::Resource( group ), d( new Private( this ) )
00098 {
00099 }
00100 
00101 ResourceCached::~ResourceCached()
00102 {
00103   delete d;
00104 }
00105 
00106 void ResourceCached::writeConfig( KConfigGroup &group )
00107 {
00108   KABC::Resource::writeConfig( group );
00109 }
00110 
00111 void ResourceCached::insertAddressee( const Addressee &addr )
00112 {
00113   if ( !mAddrMap.contains( addr.uid() ) ) { // new contact
00114     if ( d->mDeletedAddressees.contains( addr.uid() ) ) {
00115       // it was first removed, then added, so it's an update...
00116       d->mDeletedAddressees.remove( addr.uid() );
00117 
00118       mAddrMap.insert( addr.uid(), addr );
00119       d->mChangedAddressees.insert( addr.uid(), addr );
00120       return;
00121     }
00122 
00123     mAddrMap.insert( addr.uid(), addr );
00124     d->mAddedAddressees.insert( addr.uid(), addr );
00125   } else {
00126     KABC::Addressee oldAddressee = mAddrMap.find( addr.uid() ).value();
00127     if ( oldAddressee != addr ) {
00128       mAddrMap.remove( addr.uid() );
00129       mAddrMap.insert( addr.uid(), addr );
00130       d->mChangedAddressees.insert( addr.uid(), addr );
00131     }
00132   }
00133 }
00134 
00135 void ResourceCached::removeAddressee( const Addressee &addr )
00136 {
00137   if ( d->mAddedAddressees.contains( addr.uid() ) ) {
00138     d->mAddedAddressees.remove( addr.uid() );
00139     return;
00140   }
00141 
00142   if ( d->mDeletedAddressees.find( addr.uid() ) == d->mDeletedAddressees.end() ) {
00143     d->mDeletedAddressees.insert( addr.uid(), addr );
00144   }
00145 
00146   mAddrMap.remove( addr.uid() );
00147 }
00148 
00149 bool ResourceCached::loadFromCache()
00150 {
00151   mAddrMap.clear();
00152 
00153   setIdMapperIdentifier();
00154   d->mIdMapper.load();
00155 
00156   // load cache
00157   QFile file( cacheFile() );
00158   if ( !file.open( QIODevice::ReadOnly ) ) {
00159     return false;
00160   }
00161 
00162   KABC::VCardConverter converter;
00163   KABC::Addressee::List list = converter.parseVCards( file.readAll() );
00164   KABC::Addressee::List::Iterator it;
00165 
00166   for ( it = list.begin(); it != list.end(); ++it ) {
00167     (*it).setResource( this );
00168     (*it).setChanged( false );
00169     mAddrMap.insert( (*it).uid(), *it );
00170   }
00171 
00172   file.close();
00173   return true;
00174 }
00175 
00176 void ResourceCached::saveToCache()
00177 {
00178   setIdMapperIdentifier();
00179   d->mIdMapper.save();
00180 
00181   // save cache
00182   QFile file( cacheFile() );
00183   if ( !file.open( QIODevice::WriteOnly ) ) {
00184     return;
00185   }
00186 
00187   KABC::Addressee::List list = mAddrMap.values();
00188 
00189   KABC::VCardConverter converter;
00190   QByteArray vCard = converter.createVCards( list );
00191   file.write( vCard );
00192   file.close();
00193 }
00194 
00195 void ResourceCached::cleanUpCache( const KABC::Addressee::List &addrList )
00196 {
00197   // load cache
00198   QFile file( cacheFile() );
00199   if ( !file.open( QIODevice::ReadOnly ) ) {
00200     return;
00201   }
00202 
00203   KABC::VCardConverter converter;
00204   KABC::Addressee::List list = converter.parseVCards( file.readAll() );
00205   KABC::Addressee::List::Iterator cacheIt;
00206   KABC::Addressee::List::ConstIterator it;
00207 
00208   for ( cacheIt = list.begin(); cacheIt != list.end(); ++cacheIt ) {
00209     bool found = false;
00210     for ( it = addrList.begin(); it != addrList.end(); ++it ) {
00211       if ( (*it).uid() == (*cacheIt).uid() ) {
00212         found = true;
00213       }
00214     }
00215 
00216     if ( !found ) {
00217       d->mIdMapper.removeRemoteId( d->mIdMapper.remoteId( (*cacheIt).uid() ) );
00218       mAddrMap.remove( (*cacheIt).uid() );
00219     }
00220   }
00221 
00222   file.close();
00223 }
00224 
00225 KRES::IdMapper &ResourceCached::idMapper()
00226 {
00227   return d->mIdMapper;
00228 }
00229 
00230 bool ResourceCached::hasChanges() const
00231 {
00232   return !( d->mAddedAddressees.isEmpty() &&
00233             d->mChangedAddressees.isEmpty() &&
00234             d->mDeletedAddressees.isEmpty() );
00235 }
00236 
00237 void ResourceCached::clearChanges()
00238 {
00239   d->mAddedAddressees.clear();
00240   d->mChangedAddressees.clear();
00241   d->mDeletedAddressees.clear();
00242 }
00243 
00244 void ResourceCached::clearChange( const KABC::Addressee &addr )
00245 {
00246   d->mAddedAddressees.remove( addr.uid() );
00247   d->mChangedAddressees.remove( addr.uid() );
00248   d->mDeletedAddressees.remove( addr.uid() );
00249 }
00250 
00251 void ResourceCached::clearChange( const QString &uid )
00252 {
00253   d->mAddedAddressees.remove( uid );
00254   d->mChangedAddressees.remove( uid );
00255   d->mDeletedAddressees.remove( uid );
00256 }
00257 
00258 KABC::Addressee::List ResourceCached::addedAddressees() const
00259 {
00260   return d->mAddedAddressees.values();
00261 }
00262 
00263 KABC::Addressee::List ResourceCached::changedAddressees() const
00264 {
00265   return d->mChangedAddressees.values();
00266 }
00267 
00268 KABC::Addressee::List ResourceCached::deletedAddressees() const
00269 {
00270   return d->mDeletedAddressees.values();
00271 }
00272 
00273 QString ResourceCached::cacheFile() const
00274 {
00275   return KStandardDirs::locateLocal( "cache", "kabc/kresources/" + identifier() );
00276 }
00277 
00278 QString ResourceCached::changesCacheFile( const QString &type ) const
00279 {
00280   return KStandardDirs::locateLocal( "cache", "kabc/changescache/" + identifier() + '_' + type );
00281 }
00282 
00283 void ResourceCached::saveChangesCache()
00284 {
00285   d->saveChangesCache( d->mAddedAddressees, "added" );
00286   d->saveChangesCache( d->mDeletedAddressees, "deleted" );
00287   d->saveChangesCache( d->mChangedAddressees, "changed" );
00288 }
00289 
00290 void ResourceCached::loadChangesCache()
00291 {
00292   d->loadChangesCache( d->mAddedAddressees, "added" );
00293   d->loadChangesCache( d->mDeletedAddressees, "deleted" );
00294   d->loadChangesCache( d->mChangedAddressees, "changed" );
00295 }
00296 
00297 void ResourceCached::setIdMapperIdentifier()
00298 {
00299   d->mIdMapper.setIdentifier( type() + '_' + identifier() );
00300 }
00301 
00302 #include "resourcecached.moc"

kabc

Skip menu "kabc"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

KDE-PIM Libraries

Skip menu "KDE-PIM Libraries"
  • akonadi
  • kabc
  • kblog
  • kcal
  • kimap
  • kioslave
  •   imap4
  •   mbox
  • kldap
  • kmime
  • kpimidentities
  • kpimutils
  • kresources
  • ktnef
  • kxmlrpcclient
  • mailtransport
  • qgpgme
  • syndication
  •   atom
  •   rdf
  •   rss2
Generated for KDE-PIM Libraries by doxygen 1.5.7.1
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal