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 for ( it = list.begin(); it != list.end(); ++it ) {
85 map.insert( (*it).uid(), *it );
91 ResourceCached::ResourceCached()
92 : KABC::
Resource(), d( new Private( this ) )
96 ResourceCached::ResourceCached(
const KConfigGroup &group )
97 : KABC::
Resource( group ), d( new Private( this ) )
101 ResourceCached::~ResourceCached()
106 void ResourceCached::writeConfig( KConfigGroup &group )
111 void ResourceCached::insertAddressee(
const Addressee &addr )
113 if ( !mAddrMap.contains( addr.uid() ) ) {
114 if ( d->mDeletedAddressees.contains( addr.uid() ) ) {
116 d->mDeletedAddressees.remove( addr.uid() );
118 mAddrMap.insert( addr.uid(), addr );
119 d->mChangedAddressees.insert( addr.uid(), addr );
123 mAddrMap.insert( addr.uid(), addr );
124 d->mAddedAddressees.insert( addr.uid(), addr );
126 KABC::Addressee oldAddressee = mAddrMap.find( addr.uid() ).value();
127 if ( oldAddressee != addr ) {
128 mAddrMap.remove( addr.uid() );
129 mAddrMap.insert( addr.uid(), addr );
130 d->mChangedAddressees.insert( addr.uid(), addr );
135 void ResourceCached::removeAddressee(
const Addressee &addr )
137 if ( d->mAddedAddressees.contains( addr.uid() ) ) {
138 d->mAddedAddressees.remove( addr.uid() );
142 if ( d->mDeletedAddressees.find( addr.uid() ) == d->mDeletedAddressees.end() ) {
143 d->mDeletedAddressees.insert( addr.uid(), addr );
146 mAddrMap.remove( addr.uid() );
149 bool ResourceCached::loadFromCache()
153 setIdMapperIdentifier();
157 QFile file( cacheFile() );
158 if ( !file.open( QIODevice::ReadOnly ) ) {
163 KABC::Addressee::List list = converter.
parseVCards( file.readAll() );
164 KABC::Addressee::List::Iterator it;
166 for ( it = list.begin(); it != list.end(); ++it ) {
167 (*it).setResource(
this );
168 (*it).setChanged(
false );
169 mAddrMap.insert( (*it).uid(), *it );
176 void ResourceCached::saveToCache()
178 setIdMapperIdentifier();
182 QFile file( cacheFile() );
183 if ( !file.open( QIODevice::WriteOnly ) ) {
187 KABC::Addressee::List list = mAddrMap.values();
195 void ResourceCached::cleanUpCache(
const KABC::Addressee::List &addrList )
198 QFile file( cacheFile() );
199 if ( !file.open( QIODevice::ReadOnly ) ) {
204 KABC::Addressee::List list = converter.
parseVCards( file.readAll() );
205 KABC::Addressee::List::Iterator cacheIt;
206 KABC::Addressee::List::ConstIterator it;
208 for ( cacheIt = list.begin(); cacheIt != list.end(); ++cacheIt ) {
210 for ( it = addrList.begin(); it != addrList.end(); ++it ) {
211 if ( (*it).uid() == (*cacheIt).uid() ) {
217 d->mIdMapper.removeRemoteId( d->mIdMapper.remoteId( (*cacheIt).uid() ) );
218 mAddrMap.remove( (*cacheIt).uid() );
225 KRES::IdMapper &ResourceCached::idMapper()
230 bool ResourceCached::hasChanges()
const
232 return !( d->mAddedAddressees.isEmpty() &&
233 d->mChangedAddressees.isEmpty() &&
234 d->mDeletedAddressees.isEmpty() );
237 void ResourceCached::clearChanges()
239 d->mAddedAddressees.clear();
240 d->mChangedAddressees.clear();
241 d->mDeletedAddressees.clear();
244 void ResourceCached::clearChange(
const KABC::Addressee &addr )
246 d->mAddedAddressees.remove( addr.uid() );
247 d->mChangedAddressees.remove( addr.uid() );
248 d->mDeletedAddressees.remove( addr.uid() );
251 void ResourceCached::clearChange(
const QString &uid )
253 d->mAddedAddressees.remove( uid );
254 d->mChangedAddressees.remove( uid );
255 d->mDeletedAddressees.remove( uid );
258 KABC::Addressee::List ResourceCached::addedAddressees()
const
260 return d->mAddedAddressees.values();
263 KABC::Addressee::List ResourceCached::changedAddressees()
const
265 return d->mChangedAddressees.values();
268 KABC::Addressee::List ResourceCached::deletedAddressees()
const
270 return d->mDeletedAddressees.values();
273 QString ResourceCached::cacheFile()
const
275 return KStandardDirs::locateLocal(
"cache", QLatin1String(
"kabc/kresources/" ) + identifier() );
278 QString ResourceCached::changesCacheFile(
const QString &type )
const
280 return KStandardDirs::locateLocal(
"cache", QLatin1String(
"kabc/changescache/" ) + identifier() +
281 QLatin1Char(
'_' ) + type );
284 void ResourceCached::saveChangesCache()
286 d->saveChangesCache( d->mAddedAddressees, QLatin1String(
"added" ) );
287 d->saveChangesCache( d->mDeletedAddressees, QLatin1String(
"deleted" ) );
288 d->saveChangesCache( d->mChangedAddressees, QLatin1String(
"changed" ) );
291 void ResourceCached::loadChangesCache()
293 d->loadChangesCache( d->mAddedAddressees, QLatin1String(
"added" ) );
294 d->loadChangesCache( d->mDeletedAddressees, QLatin1String(
"deleted" ) );
295 d->loadChangesCache( d->mChangedAddressees, QLatin1String(
"changed" ) );
298 void ResourceCached::setIdMapperIdentifier()
300 d->mIdMapper.setIdentifier( type() + QLatin1Char(
'_' ) + identifier() );
303 #include "resourcecached.moc"