21 #include "resourcecached.h"
23 #include <kabc/vcardconverter.h>
27 #include <kstandarddirs.h>
29 #include <QtCore/QFile>
33 class ResourceCached::Private
36 Private( ResourceCached *parent )
37 : mParent( parent ), mIdMapper( QLatin1String(
"kabc/uidmaps/" ) )
41 void loadChangesCache( QMap<QString, KABC::Addressee> &map,
const QString &type );
42 void saveChangesCache(
const QMap<QString, KABC::Addressee> &map,
const QString &type );
44 ResourceCached *mParent;
45 KRES::IdMapper mIdMapper;
47 QMap<QString, KABC::Addressee> mAddedAddressees;
48 QMap<QString, KABC::Addressee> mChangedAddressees;
49 QMap<QString, KABC::Addressee> mDeletedAddressees;
52 void ResourceCached::Private::saveChangesCache(
const QMap<QString, KABC::Addressee> &map,
55 QFile file( mParent->changesCacheFile( type ) );
57 const KABC::Addressee::List list = map.values();
58 if ( list.isEmpty() ) {
61 if ( !file.open( QIODevice::WriteOnly ) ) {
62 kError( 5700 ) <<
"Can't open changes cache file '" << file.fileName() <<
"' for saving.";
67 const QByteArray vCards = converter.
createVCards( list );
72 void ResourceCached::Private::loadChangesCache( QMap<QString, KABC::Addressee> &map,
75 QFile file( mParent->changesCacheFile( type ) );
76 if ( !file.open( QIODevice::ReadOnly ) ) {
82 const KABC::Addressee::List list = converter.
parseVCards( file.readAll() );
83 KABC::Addressee::List::ConstIterator it;
84 KABC::Addressee::List::ConstIterator end( list.end() );
85 for ( it = list.begin(); it != end; ++it ) {
86 map.insert( ( *it ).uid(), *it );
92 ResourceCached::ResourceCached()
93 : KABC::
Resource(), d( new Private( this ) )
97 ResourceCached::ResourceCached(
const KConfigGroup &group )
98 : KABC::
Resource( group ), d( new Private( this ) )
102 ResourceCached::~ResourceCached()
107 void ResourceCached::writeConfig( KConfigGroup &group )
112 void ResourceCached::insertAddressee(
const Addressee &addr )
114 if ( !mAddrMap.contains( addr.uid() ) ) {
115 if ( d->mDeletedAddressees.contains( addr.uid() ) ) {
117 d->mDeletedAddressees.remove( addr.uid() );
119 mAddrMap.insert( addr.uid(), addr );
120 d->mChangedAddressees.insert( addr.uid(), addr );
124 mAddrMap.insert( addr.uid(), addr );
125 d->mAddedAddressees.insert( addr.uid(), addr );
127 KABC::Addressee oldAddressee = mAddrMap.find( addr.uid() ).value();
128 if ( oldAddressee != addr ) {
129 mAddrMap.remove( addr.uid() );
130 mAddrMap.insert( addr.uid(), addr );
131 d->mChangedAddressees.insert( addr.uid(), addr );
136 void ResourceCached::removeAddressee(
const Addressee &addr )
138 if ( d->mAddedAddressees.contains( addr.uid() ) ) {
139 d->mAddedAddressees.remove( addr.uid() );
143 if ( d->mDeletedAddressees.find( addr.uid() ) == d->mDeletedAddressees.end() ) {
144 d->mDeletedAddressees.insert( addr.uid(), addr );
147 mAddrMap.remove( addr.uid() );
150 bool ResourceCached::loadFromCache()
154 setIdMapperIdentifier();
158 QFile file( cacheFile() );
159 if ( !file.open( QIODevice::ReadOnly ) ) {
164 KABC::Addressee::List list = converter.
parseVCards( file.readAll() );
165 KABC::Addressee::List::Iterator it;
167 for ( it = list.begin(); it != list.end(); ++it ) {
168 ( *it ).setResource(
this );
169 ( *it ).setChanged(
false );
170 mAddrMap.insert( ( *it ).uid(), *it );
177 void ResourceCached::saveToCache()
179 setIdMapperIdentifier();
183 QFile file( cacheFile() );
184 if ( !file.open( QIODevice::WriteOnly ) ) {
188 KABC::Addressee::List list = mAddrMap.values();
196 void ResourceCached::cleanUpCache(
const KABC::Addressee::List &addrList )
199 QFile file( cacheFile() );
200 if ( !file.open( QIODevice::ReadOnly ) ) {
205 KABC::Addressee::List list = converter.
parseVCards( file.readAll() );
206 KABC::Addressee::List::Iterator cacheIt;
207 KABC::Addressee::List::ConstIterator it;
209 for ( cacheIt = list.begin(); cacheIt != list.end(); ++cacheIt ) {
211 for ( it = addrList.begin(); it != addrList.end(); ++it ) {
212 if ( ( *it ).uid() == ( *cacheIt ).uid() ) {
218 d->mIdMapper.removeRemoteId( d->mIdMapper.remoteId( ( *cacheIt ).uid() ) );
219 mAddrMap.remove( ( *cacheIt ).uid() );
226 KRES::IdMapper &ResourceCached::idMapper()
231 bool ResourceCached::hasChanges()
const
233 return !( d->mAddedAddressees.isEmpty() &&
234 d->mChangedAddressees.isEmpty() &&
235 d->mDeletedAddressees.isEmpty() );
238 void ResourceCached::clearChanges()
240 d->mAddedAddressees.clear();
241 d->mChangedAddressees.clear();
242 d->mDeletedAddressees.clear();
245 void ResourceCached::clearChange(
const KABC::Addressee &addr )
247 d->mAddedAddressees.remove( addr.uid() );
248 d->mChangedAddressees.remove( addr.uid() );
249 d->mDeletedAddressees.remove( addr.uid() );
252 void ResourceCached::clearChange(
const QString &uid )
254 d->mAddedAddressees.remove( uid );
255 d->mChangedAddressees.remove( uid );
256 d->mDeletedAddressees.remove( uid );
259 KABC::Addressee::List ResourceCached::addedAddressees()
const
261 return d->mAddedAddressees.values();
264 KABC::Addressee::List ResourceCached::changedAddressees()
const
266 return d->mChangedAddressees.values();
269 KABC::Addressee::List ResourceCached::deletedAddressees()
const
271 return d->mDeletedAddressees.values();
274 QString ResourceCached::cacheFile()
const
276 return KStandardDirs::locateLocal(
"cache", QLatin1String(
"kabc/kresources/" ) + identifier() );
279 QString ResourceCached::changesCacheFile(
const QString &type )
const
281 return KStandardDirs::locateLocal(
"cache", QLatin1String(
"kabc/changescache/" ) + identifier() +
282 QLatin1Char(
'_' ) + type );
285 void ResourceCached::saveChangesCache()
287 d->saveChangesCache( d->mAddedAddressees, QLatin1String(
"added" ) );
288 d->saveChangesCache( d->mDeletedAddressees, QLatin1String(
"deleted" ) );
289 d->saveChangesCache( d->mChangedAddressees, QLatin1String(
"changed" ) );
292 void ResourceCached::loadChangesCache()
294 d->loadChangesCache( d->mAddedAddressees, QLatin1String(
"added" ) );
295 d->loadChangesCache( d->mDeletedAddressees, QLatin1String(
"deleted" ) );
296 d->loadChangesCache( d->mChangedAddressees, QLatin1String(
"changed" ) );
299 void ResourceCached::setIdMapperIdentifier()
301 d->mIdMapper.setIdentifier( type() + QLatin1Char(
'_' ) + identifier() );