23 #include <kabc/vcardconverter.h>
26 #include <kstandarddirs.h>
28 #include "kabcresourcecached.h"
32 ResourceCached::ResourceCached(
const KConfig *config )
33 : KABC::Resource( config ), mIdMapper(
"kabc/uidmaps/" ),
34 mReloadPolicy( ReloadInterval ), mReloadInterval( 10 ),
35 mKABCReloadTimer( 0,
"mKABCReloadTimer" ), mReloaded( false ),
36 mSavePolicy( SaveDelayed ), mSaveInterval( 10 ),
37 mKABCSaveTimer( 0,
"mKABCSaveTimer" )
39 connect( &mKABCReloadTimer, TQT_SIGNAL( timeout() ), TQT_SLOT( slotKABCReload() ) );
40 connect( &mKABCSaveTimer, TQT_SIGNAL( timeout() ), TQT_SLOT( slotKABCSave() ) );
43 this->readConfig(const_cast<KConfig *>(config));
46 ResourceCached::~ResourceCached()
50 void ResourceCached::setReloadPolicy(
int i )
57 int ResourceCached::reloadPolicy()
const
62 void ResourceCached::setReloadInterval(
int minutes )
64 mReloadInterval = minutes;
67 int ResourceCached::reloadInterval()
const
69 return mReloadInterval;
72 void ResourceCached::setSavePolicy(
int i )
79 int ResourceCached::savePolicy()
const
84 void ResourceCached::setSaveInterval(
int minutes )
86 mSaveInterval = minutes;
89 int ResourceCached::saveInterval()
const
94 void ResourceCached::writeConfig( KConfig *config )
96 config->writeEntry(
"ReloadPolicy", mReloadPolicy );
97 config->writeEntry(
"ReloadInterval", mReloadInterval );
99 config->writeEntry(
"SavePolicy", mSavePolicy );
100 config->writeEntry(
"SaveInterval", mSaveInterval );
102 config->writeEntry(
"LastLoad", mLastLoad );
103 config->writeEntry(
"LastSave", mLastSave );
105 KABC::Resource::writeConfig( config );
108 void ResourceCached::readConfig( KConfig *config )
110 mReloadPolicy = config->readNumEntry(
"ReloadPolicy", ReloadNever );
111 mReloadInterval = config->readNumEntry(
"ReloadInterval", 10 );
113 mSaveInterval = config->readNumEntry(
"SaveInterval", 10 );
114 mSavePolicy = config->readNumEntry(
"SavePolicy", SaveNever );
116 mLastLoad = config->readDateTimeEntry(
"LastLoad" );
117 mLastSave = config->readDateTimeEntry(
"LastSave" );
123 void ResourceCached::setupSaveTimer()
125 if ( mSavePolicy == SaveInterval ) {
126 kdDebug(5800) <<
"ResourceCached::setSavePolicy(): start save timer (interval "
127 << mSaveInterval <<
" minutes)." << endl;
128 mKABCSaveTimer.start( mSaveInterval * 60 * 1000 );
130 mKABCSaveTimer.stop();
134 void ResourceCached::setupReloadTimer()
136 if ( mReloadPolicy == ReloadInterval ) {
137 kdDebug(5800) <<
"ResourceCached::setSavePolicy(): start reload timer "
138 "(interval " << mReloadInterval <<
" minutes)" << endl;
139 mKABCReloadTimer.start( mReloadInterval * 60 * 1000 );
141 mKABCReloadTimer.stop();
145 void ResourceCached::slotKABCReload()
147 if ( !isActive() )
return;
149 kdDebug(5800) <<
"ResourceCached::slotKABCReload()" << endl;
154 void ResourceCached::slotKABCSave()
156 if ( !isActive() )
return;
158 kdDebug(5800) <<
"ResourceCached::slotKABCSave()" << endl;
160 KABC::Ticket *ticket = requestSaveTicket();
166 void ResourceCached::insertAddressee(
const Addressee &addr )
168 if ( !mAddrMap.contains( addr.uid() ) ) {
169 if ( mDeletedAddressees.contains( addr.uid() ) ) {
171 mDeletedAddressees.remove( addr.uid() );
173 mAddrMap.insert( addr.uid(), addr );
174 mChangedAddressees.insert( addr.uid(), addr );
178 mAddrMap.insert( addr.uid(), addr );
179 mAddedAddressees.insert( addr.uid(), addr );
181 KABC::Addressee oldAddressee = mAddrMap.find( addr.uid() ).data();
182 if ( oldAddressee != addr ) {
183 mAddrMap.remove( addr.uid() );
184 mAddrMap.insert( addr.uid(), addr );
185 mChangedAddressees.insert( addr.uid(), addr );
190 void ResourceCached::removeAddressee(
const Addressee &addr )
192 if ( mAddedAddressees.contains( addr.uid() ) ) {
193 mAddedAddressees.remove( addr.uid() );
197 if ( mDeletedAddressees.find( addr.uid() ) == mDeletedAddressees.end() )
198 mDeletedAddressees.insert( addr.uid(), addr );
200 mAddrMap.remove( addr.uid() );
203 void ResourceCached::loadCache()
207 setIdMapperIdentifier();
211 TQFile file( cacheFile() );
212 if ( !file.open( IO_ReadOnly ) )
216 KABC::VCardConverter converter;
217 #if defined(KABC_VCARD_ENCODING_FIX)
218 KABC::Addressee::List list = converter.parseVCardsRaw( file.readAll().data() );
220 KABC::Addressee::List list = converter.parseVCards( TQString::fromUtf8( file.readAll() ) );
222 KABC::Addressee::List::Iterator it;
224 for ( it = list.begin(); it != list.end(); ++it ) {
225 (*it).setResource(
this );
226 (*it).setChanged(
false );
227 mAddrMap.insert( (*it).uid(), *it );
233 void ResourceCached::saveCache()
235 setIdMapperIdentifier();
239 TQFile file( cacheFile() );
240 if ( !file.open( IO_WriteOnly ) )
243 KABC::Addressee::List list = mAddrMap.values();
245 KABC::VCardConverter converter;
246 #if defined(KABC_VCARD_ENCODING_FIX)
247 TQCString vCard = converter.createVCardsRaw( list );
248 file.writeBlock( vCard, vCard.length() );
250 TQString vCard = converter.createVCards( list );
251 file.writeBlock( vCard.utf8(), vCard.utf8().length() );
256 void ResourceCached::clearCache()
262 void ResourceCached::cleanUpCache(
const KABC::Addressee::List &addrList )
265 TQFile file( cacheFile() );
266 if ( !file.open( IO_ReadOnly ) )
270 KABC::VCardConverter converter;
271 #if defined(KABC_VCARD_ENCODING_FIX)
272 KABC::Addressee::List list = converter.parseVCardsRaw( file.readAll().data() );
274 KABC::Addressee::List list = converter.parseVCards( TQString::fromUtf8( file.readAll() ) );
276 KABC::Addressee::List::Iterator cacheIt;
277 KABC::Addressee::List::ConstIterator it;
279 for ( cacheIt = list.begin(); cacheIt != list.end(); ++cacheIt ) {
281 for ( it = addrList.begin(); it != addrList.end(); ++it ) {
282 if ( (*it).uid() == (*cacheIt).uid() )
287 mIdMapper.removeRemoteId( mIdMapper.remoteId( (*cacheIt).uid() ) );
288 mAddrMap.remove( (*cacheIt).uid() );
295 KPIM::IdMapper& ResourceCached::idMapper()
300 bool ResourceCached::hasChanges()
const
302 return !( mAddedAddressees.isEmpty() &&
303 mChangedAddressees.isEmpty() &&
304 mDeletedAddressees.isEmpty() );
307 void ResourceCached::clearChanges()
309 mAddedAddressees.clear();
310 mChangedAddressees.clear();
311 mDeletedAddressees.clear();
314 void ResourceCached::clearChange(
const KABC::Addressee &addr )
316 mAddedAddressees.remove( addr.uid() );
317 mChangedAddressees.remove( addr.uid() );
318 mDeletedAddressees.remove( addr.uid() );
321 void ResourceCached::clearChange(
const TQString &uid )
323 mAddedAddressees.remove( uid );
324 mChangedAddressees.remove( uid );
325 mDeletedAddressees.remove( uid );
328 KABC::Addressee::List ResourceCached::addedAddressees()
const
330 return mAddedAddressees.values();
333 KABC::Addressee::List ResourceCached::changedAddressees()
const
335 return mChangedAddressees.values();
338 KABC::Addressee::List ResourceCached::deletedAddressees()
const
340 return mDeletedAddressees.values();
343 TQString ResourceCached::cacheFile()
const
345 return locateLocal(
"cache",
"kabc/kresources/" + identifier() );
348 TQString ResourceCached::changesCacheFile(
const TQString &type )
const
350 return locateLocal(
"cache",
"kabc/changescache/" + identifier() +
"_" + type );
353 void ResourceCached::saveChangesCache(
const TQMap<TQString, KABC::Addressee> &map,
const TQString &type )
355 TQFile file( changesCacheFile( type ) );
357 const KABC::Addressee::List list = map.values();
358 if ( list.isEmpty() ) {
361 if ( !file.open( IO_WriteOnly ) ) {
362 kdError() <<
"Can't open changes cache file '" << file.name() <<
"' for saving." << endl;
366 KABC::VCardConverter converter;
367 #if defined(KABC_VCARD_ENCODING_FIX)
368 const TQCString vCards = converter.createVCardsRaw( list );
369 file.writeBlock( vCards, vCards.length() );
371 const TQString vCards = converter.createVCards( list );
372 TQCString content = vCards.utf8();
373 file.writeBlock( content, content.length() );
378 void ResourceCached::saveChangesCache()
380 saveChangesCache( mAddedAddressees,
"added" );
381 saveChangesCache( mDeletedAddressees,
"deleted" );
382 saveChangesCache( mChangedAddressees,
"changed" );
385 void ResourceCached::loadChangesCache( TQMap<TQString, KABC::Addressee> &map,
const TQString &type )
387 TQFile file( changesCacheFile( type ) );
388 if ( !file.open( IO_ReadOnly ) )
391 KABC::VCardConverter converter;
393 #if defined(KABC_VCARD_ENCODING_FIX)
394 const KABC::Addressee::List list = converter.parseVCardsRaw( file.readAll().data() );
396 const KABC::Addressee::List list = converter.parseVCards( TQString::fromUtf8( file.readAll() ) );
398 KABC::Addressee::List::ConstIterator it;
399 for ( it = list.begin(); it != list.end(); ++it )
400 map.insert( (*it).uid(), *it );
405 void ResourceCached::loadChangesCache()
407 loadChangesCache( mAddedAddressees,
"added" );
408 loadChangesCache( mDeletedAddressees,
"deleted" );
409 loadChangesCache( mChangedAddressees,
"changed" );
412 void ResourceCached::setIdMapperIdentifier()
414 mIdMapper.setIdentifier( type() +
"_" + identifier() );
417 #include "kabcresourcecached.moc"