summaryrefslogtreecommitdiffabout
path: root/kabc
Unidiff
Diffstat (limited to 'kabc') (more/less context) (ignore whitespace changes)
-rw-r--r--kabc/addressbook.cpp11
-rw-r--r--kabc/addressbook.h1
-rw-r--r--kabc/addressee.cpp2
-rw-r--r--kabc/plugins/sharpdtm/resourcesharpdtm.cpp215
-rw-r--r--kabc/tmpaddressbook.cpp9
5 files changed, 61 insertions, 177 deletions
diff --git a/kabc/addressbook.cpp b/kabc/addressbook.cpp
index 4c4ae09..8487ff3 100644
--- a/kabc/addressbook.cpp
+++ b/kabc/addressbook.cpp
@@ -1151,24 +1151,35 @@ QDataStream &KABC::operator>>( QDataStream &s, AddressBook &ab )
1151bool AddressBook::addResource( Resource *resource ) 1151bool AddressBook::addResource( Resource *resource )
1152{ 1152{
1153 if ( !resource->open() ) { 1153 if ( !resource->open() ) {
1154 kdDebug(5700) << "AddressBook::addResource(): can't add resource" << endl; 1154 kdDebug(5700) << "AddressBook::addResource(): can't add resource" << endl;
1155 return false; 1155 return false;
1156 } 1156 }
1157 1157
1158 resource->setAddressBook( this ); 1158 resource->setAddressBook( this );
1159 1159
1160 d->mManager->add( resource ); 1160 d->mManager->add( resource );
1161 return true; 1161 return true;
1162} 1162}
1163void AddressBook::removeResources()
1164{
1165 //remove all possible resources. This should cleanup the configfile.
1166 QPtrList<KABC::Resource> mResources = resources();
1167
1168 QPtrListIterator<KABC::Resource> it(mResources);
1169 for ( ; it.current(); ++it ) {
1170 KABC::Resource *res = it.current();
1171 removeResource(res);
1172 }
1173}
1163 1174
1164bool AddressBook::removeResource( Resource *resource ) 1175bool AddressBook::removeResource( Resource *resource )
1165{ 1176{
1166 resource->close(); 1177 resource->close();
1167 1178
1168 if ( resource == standardResource() ) 1179 if ( resource == standardResource() )
1169 d->mManager->setStandardResource( 0 ); 1180 d->mManager->setStandardResource( 0 );
1170 1181
1171 resource->setAddressBook( 0 ); 1182 resource->setAddressBook( 0 );
1172 1183
1173 d->mManager->remove( resource ); 1184 d->mManager->remove( resource );
1174 return true; 1185 return true;
diff --git a/kabc/addressbook.h b/kabc/addressbook.h
index 75f8b51..2351add 100644
--- a/kabc/addressbook.h
+++ b/kabc/addressbook.h
@@ -265,24 +265,25 @@ class AddressBook : public QObject
265 const QString &key = QString::null, 265 const QString &key = QString::null,
266 const QString &app = QString::null ); 266 const QString &app = QString::null );
267 267
268 268
269 /** 269 /**
270 Add address book resource. 270 Add address book resource.
271 */ 271 */
272 bool addResource( Resource * ); 272 bool addResource( Resource * );
273 273
274 /** 274 /**
275 Remove address book resource. 275 Remove address book resource.
276 */ 276 */
277 void removeResources();
277 bool removeResource( Resource * ); 278 bool removeResource( Resource * );
278 279
279 /** 280 /**
280 Return pointer list of all resources. 281 Return pointer list of all resources.
281 */ 282 */
282 QPtrList<Resource> resources(); 283 QPtrList<Resource> resources();
283 284
284 /** 285 /**
285 Set the @p ErrorHandler, that is used by @ref error() to 286 Set the @p ErrorHandler, that is used by @ref error() to
286 provide gui-independend error messages. 287 provide gui-independend error messages.
287 */ 288 */
288 void setErrorHandler( ErrorHandler * ); 289 void setErrorHandler( ErrorHandler * );
diff --git a/kabc/addressee.cpp b/kabc/addressee.cpp
index 3d4992c..028d3bb 100644
--- a/kabc/addressee.cpp
+++ b/kabc/addressee.cpp
@@ -263,25 +263,25 @@ void Addressee::computeCsum(const QString &dev)
263 l.append( t[iii] ); 263 l.append( t[iii] );
264 264
265 } 265 }
266 KABC::Address::List::Iterator addressIter; 266 KABC::Address::List::Iterator addressIter;
267 for ( addressIter = mData->addresses.begin(); addressIter != mData->addresses.end(); 267 for ( addressIter = mData->addresses.begin(); addressIter != mData->addresses.end();
268 ++addressIter ) { 268 ++addressIter ) {
269 t = (*addressIter).asList(); 269 t = (*addressIter).asList();
270 t.sort(); 270 t.sort();
271 for ( iii = 0; iii < t.count(); ++iii) 271 for ( iii = 0; iii < t.count(); ++iii)
272 l.append( t[iii] ); 272 l.append( t[iii] );
273 } 273 }
274 uint cs = getCsum4List(l); 274 uint cs = getCsum4List(l);
275#if 1 275#if 0
276 for ( iii = 0; iii < l.count(); ++iii) 276 for ( iii = 0; iii < l.count(); ++iii)
277 qDebug("%d***%s***",iii,l[iii].latin1()); 277 qDebug("%d***%s***",iii,l[iii].latin1());
278 qDebug("CSUM computed %d %s %s", cs,QString::number (cs ).latin1(), uid().latin1() ); 278 qDebug("CSUM computed %d %s %s", cs,QString::number (cs ).latin1(), uid().latin1() );
279#endif 279#endif
280 setCsum( dev, QString::number (cs )); 280 setCsum( dev, QString::number (cs ));
281} 281}
282 282
283void Addressee::mergeContact( const Addressee& ad , bool isSubSet) // = false) 283void Addressee::mergeContact( const Addressee& ad , bool isSubSet) // = false)
284{ 284{
285 285
286 detach(); 286 detach();
287 if ( mData->name.isEmpty() ) mData->name = ad.mData->name; 287 if ( mData->name.isEmpty() ) mData->name = ad.mData->name;
diff --git a/kabc/plugins/sharpdtm/resourcesharpdtm.cpp b/kabc/plugins/sharpdtm/resourcesharpdtm.cpp
index ba17c50..48b7d91 100644
--- a/kabc/plugins/sharpdtm/resourcesharpdtm.cpp
+++ b/kabc/plugins/sharpdtm/resourcesharpdtm.cpp
@@ -58,184 +58,145 @@ using namespace KABC;
58extern "C" 58extern "C"
59{ 59{
60 void *init_microkabc_sharpdtm() 60 void *init_microkabc_sharpdtm()
61 { 61 {
62 return new KRES::PluginFactory<ResourceSharpDTM,ResourceSharpDTMConfig>(); 62 return new KRES::PluginFactory<ResourceSharpDTM,ResourceSharpDTMConfig>();
63 } 63 }
64} 64}
65 65
66ResourceSharpDTM::ResourceSharpDTM( const KConfig *config ) 66ResourceSharpDTM::ResourceSharpDTM( const KConfig *config )
67 : Resource( config ), mConverter (0) 67 : Resource( config ), mConverter (0)
68{ 68{
69 // we can not choose the filename. Therefore use the default to display 69 // we can not choose the filename. Therefore use the default to display
70 70 mAccess = 0;
71 QString fileName = SlZDataBase::addressbookFileName(); 71 QString fileName = SlZDataBase::addressbookFileName();
72 init( fileName ); 72 init( fileName );
73} 73}
74 74
75ResourceSharpDTM::ResourceSharpDTM( const QString &fileName ) 75ResourceSharpDTM::ResourceSharpDTM( const QString &fileName )
76 : Resource( 0 ) 76 : Resource( 0 )
77{ 77{
78 init( fileName ); 78 mAccess = 0;
79 init( fileName );
79} 80}
80 81
81void ResourceSharpDTM::init( const QString &fileName ) 82void ResourceSharpDTM::init( const QString &fileName )
82{ 83{
83
84 connect( &mDirWatch, SIGNAL( dirty(const QString&) ), SLOT( fileChanged() ) );
85 connect( &mDirWatch, SIGNAL( created(const QString&) ), SLOT( fileChanged() ) );
86 connect( &mDirWatch, SIGNAL( deleted(const QString&) ), SLOT( fileChanged() ) );
87
88 setFileName( fileName ); 84 setFileName( fileName );
89} 85}
90 86
91ResourceSharpDTM::~ResourceSharpDTM() 87ResourceSharpDTM::~ResourceSharpDTM()
92{ 88{
93 if (mConverter != 0) 89 if (mConverter != 0)
94 delete mConverter; 90 delete mConverter;
95 91
96 if(mAccess != 0) 92 if(mAccess != 0)
97 delete mAccess; 93 delete mAccess;
98} 94}
99 95
100void ResourceSharpDTM::writeConfig( KConfig *config ) 96void ResourceSharpDTM::writeConfig( KConfig *config )
101{ 97{
102 Resource::writeConfig( config ); 98 Resource::writeConfig( config );
103} 99}
104 100
105Ticket *ResourceSharpDTM::requestSaveTicket() 101Ticket *ResourceSharpDTM::requestSaveTicket()
106{ 102{
107
108 103
109 qDebug("ResourceSharpDTM::requestSaveTicket: %s", fileName().latin1()); 104 qDebug("ResourceSharpDTM::requestSaveTicket: %s", fileName().latin1());
110 105
111 if ( !addressBook() ) return 0; 106 if ( !addressBook() ) return 0;
112
113#ifdef ALLOW_LOCKING
114 if ( !lock( fileName() ) ) {
115 qDebug("ResourceSharpDTM::requestSaveTicket(): Unable to lock file ");
116 return 0;
117 }
118#endif
119 return createTicket( this ); 107 return createTicket( this );
120} 108}
121 109
122 110
123bool ResourceSharpDTM::doOpen() 111bool ResourceSharpDTM::doOpen()
124{ 112{
125 qDebug("ResourceSharpDTM::doOpen: %s", fileName().latin1()); 113 qDebug("%xResourceSharpDTM::doOpen: %s", this,fileName().latin1());
126
127 // the last parameter in the SlZDataBase constructor means "readonly"
128 mAccess = new SlZDataBase(fileName(),
129 SlZDataBase::addressbookItems(),
130 NULL, false);
131 114
132 if ( !mAccess ) { 115 if ( ! mAccess ) {
133 qDebug("Unable to load file() %s", fileName().latin1()); 116 // the last parameter in the SlZDataBase constructor means "readonly"
134 return false; 117 mAccess = new SlZDataBase(fileName(),
135 } 118 SlZDataBase::addressbookItems(),
136 119 NULL, false);
137 if (mConverter == 0)
138 {
139 mConverter = new SharpDTMConverter();
140 bool res = mConverter->init();
141 if ( !res )
142 {
143 QString msg("Unable to initialize sharp converter. Most likely a problem with the category file");
144
145 qDebug(msg);
146 delete mAccess;
147 mAccess = 0;
148 return false;
149 } 120 }
150 } 121 if ( !mAccess ) {
151 122 qDebug("Unable to load file() %s", fileName().latin1());
152 return true; 123 return false;
124 }
125 if (mConverter == 0) {
126 mConverter = new SharpDTMConverter();
127 bool res = mConverter->init();
128 if ( !res )
129 {
130 QString msg("Unable to initialize sharp converter. Most likely a problem with the category file");
131 qDebug(msg);
132 delete mAccess;
133 mAccess = 0;
134 return false;
135 }
136 }
137 return true;
153} 138}
154 139
155void ResourceSharpDTM::doClose() 140void ResourceSharpDTM::doClose()
156{ 141{
157 qDebug("ResourceSharpDTM::doClose: %s", fileName().latin1());
158
159 if(mAccess)
160 {
161 delete mAccess;
162 mAccess = 0;
163 }
164 // it seems so, that deletion of access deletes backend as well
165 //delete backend;
166
167 return; 142 return;
168} 143}
169 144
170bool ResourceSharpDTM::load() 145bool ResourceSharpDTM::load()
171{ 146{
172 qDebug("ResourceSharpDTM::load: %s", fileName().latin1()); 147 qDebug("%xResourceSharpDTM::load: %s",this, fileName().latin1());
173 148 bool res = false;
174 bool res = false; 149 CardId id;
175 150 for (bool res=mAccess->first(); res == true; res=mAccess->next())
176 CardId id; 151 {
177 152 id = mAccess->cardId();
178 for (bool res=mAccess->first(); res == true; res=mAccess->next()) 153 KABC::Addressee addressee;
179 { 154 res = mConverter->sharpToAddressee( id, mAccess, addressee );
180 id = mAccess->cardId(); 155 if ( !addressee.isEmpty() && res )
181 156 {
182 KABC::Addressee addressee; 157 addressee.setResource( this );
183 158 addressBook()->insertAddressee( addressee );
184 res = mConverter->sharpToAddressee( id, mAccess, addressee ); 159 }
185 160 }
186 if ( !addressee.isEmpty() && res ) 161 return true;
187 {
188 addressee.setResource( this );
189 addressBook()->insertAddressee( addressee );
190 }
191 }
192
193 return true;
194} 162}
195 163
196bool ResourceSharpDTM::save( Ticket *ticket ) 164bool ResourceSharpDTM::save( Ticket *ticket )
197{ 165{
198 qDebug("ResourceSharpDTM::save: %s", fileName().latin1()); 166 qDebug("ResourceSharpDTM::save: %s", fileName().latin1());
199
200 mDirWatch.stopScan();
201
202 KABC::AddressBook::Iterator it; 167 KABC::AddressBook::Iterator it;
203 bool res; 168 bool res;
204 KABC::Addressee::List changedAddressees; 169 KABC::Addressee::List changedAddressees;
205 typedef QMap<int,QString> AddresseeMap; 170 typedef QMap<int,QString> AddresseeMap;
206 AddresseeMap map; 171 AddresseeMap map;
207 CardId id ; 172 CardId id ;
208
209 for ( it = addressBook()->begin(); it != addressBook()->end(); ++it ) { 173 for ( it = addressBook()->begin(); it != addressBook()->end(); ++it ) {
210 174
211 if ( (*it).tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { 175 if ( (*it).tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) {
212 QString uid = (*it).originalExternalUID(); 176 QString uid = (*it).originalExternalUID();
213 bool res; 177 bool res;
214 if ( uid.isEmpty() ) 178 if ( uid.isEmpty() )
215 id = 0; 179 id = 0;
216 else 180 else
217 id = uid.toUInt(); 181 id = uid.toUInt();
218 KABC::Addressee addressee = (*it); 182 KABC::Addressee addressee = (*it);
219 if ( (*it).tempSyncStat() == SYNC_TEMPSTATE_ADDED_EXTERNAL ) { 183 if ( (*it).tempSyncStat() == SYNC_TEMPSTATE_ADDED_EXTERNAL ) {
220 res = mAccess->startEditCard(id); 184 res = mAccess->startEditCard(id);
221 if (res == true) 185 if (res == true)
222 { 186 {
223 res = mConverter->addresseeToSharp( (*it), mAccess, id ); 187 res = mConverter->addresseeToSharp( (*it), mAccess, id );
224 if (res == true) 188 if (res == true)
225 { 189 {
226 res = mAccess->finishEditCard(&id); 190 res = mAccess->finishEditCard(&id);;
227 //(*it).setTempSyncStat( SYNC_TEMPSTATE_NEW_ID );
228 //(*it).setExternalUID( QString::number( id ) );
229 //(*it).setOriginalExternalUID( QString::number( id ) );
230 map.insert(id,(*it).uid()); 191 map.insert(id,(*it).uid());
231 if (res == false) 192 if (res == false)
232 qDebug("Unable to append Contact: %s", addressee.formattedName().latin1()); 193 qDebug("Unable to append Contact: %s", addressee.formattedName().latin1());
233 194
234 } 195 }
235 else 196 else
236 { 197 {
237 qDebug("Unable to convert Addressee: %s", addressee.formattedName().latin1()); 198 qDebug("Unable to convert Addressee: %s", addressee.formattedName().latin1());
238 mAccess->cancelEditCard(); 199 mAccess->cancelEditCard();
239 } 200 }
240 } 201 }
241 202
@@ -245,29 +206,27 @@ bool ResourceSharpDTM::save( Ticket *ticket )
245 qDebug("delete error "); 206 qDebug("delete error ");
246 207
247 208
248 } else if ( (*it).tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { 209 } else if ( (*it).tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) {
249 //changed 210 //changed
250 res = mAccess->startEditCard(id); 211 res = mAccess->startEditCard(id);
251 if (res == true) 212 if (res == true)
252 { 213 {
253 res = mConverter->addresseeToSharp( (*it), mAccess, id ); 214 res = mConverter->addresseeToSharp( (*it), mAccess, id );
254 if (res == true) 215 if (res == true)
255 { 216 {
256 res = mAccess->finishEditCard(&id); 217 res = mAccess->finishEditCard(&id);
257 //(*it).setTempSyncStat( SYNC_TEMPSTATE_NEW_CSUM );
258 map.insert(id,(*it).uid()); 218 map.insert(id,(*it).uid());
259 if (res == false) 219 if (res == false)
260 qDebug("Unable to append Contact: %s", addressee.formattedName().latin1()); 220 qDebug("Unable to append Contact: %s", addressee.formattedName().latin1());
261
262 } 221 }
263 else 222 else
264 { 223 {
265 qDebug("Unable to convert Addressee: %s", addressee.formattedName().latin1()); 224 qDebug("Unable to convert Addressee: %s", addressee.formattedName().latin1());
266 mAccess->cancelEditCard(); 225 mAccess->cancelEditCard();
267 } 226 }
268 } 227 }
269 } 228 }
270 } 229 }
271 230
272 } 231 }
273 AddresseeMap::Iterator itam; 232 AddresseeMap::Iterator itam;
@@ -280,126 +239,46 @@ bool ResourceSharpDTM::save( Ticket *ticket )
280 KABC::Addressee addressee; 239 KABC::Addressee addressee;
281 res = mConverter->sharpToAddressee( id, mAccess, addressee ); 240 res = mConverter->sharpToAddressee( id, mAccess, addressee );
282 241
283 if ( !addressee.isEmpty() && res ) 242 if ( !addressee.isEmpty() && res )
284 { 243 {
285 addressee.setResource( this ); 244 addressee.setResource( this );
286 addressee.setUid( itam.data() ); 245 addressee.setUid( itam.data() );
287 addressee.setTempSyncStat( SYNC_TEMPSTATE_NEW_ID ); 246 addressee.setTempSyncStat( SYNC_TEMPSTATE_NEW_ID );
288 addressBook()->insertAddressee( addressee , false ); 247 addressBook()->insertAddressee( addressee , false );
289 } 248 }
290 } 249 }
291 } 250 }
292
293 //US mAccess->save();
294
295 mDirWatch.startScan();
296 delete ticket; 251 delete ticket;
297 unlock( fileName() );
298 252
299 return true; 253 return true;
300} 254}
301 255
302bool ResourceSharpDTM::lock( const QString &lockfileName ) 256bool ResourceSharpDTM::lock( const QString &lockfileName )
303{ 257{
304#ifdef ALLOW_LOCKING
305 qDebug("ResourceSharpDTM::lock: %s", fileName().latin1());
306
307 kdDebug(5700) << "ResourceSharpDTM::lock()" << endl;
308
309 QString fn = lockfileName;
310
311 KURL url(fn);
312 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" );
313
314 kdDebug(5700) << "-- lock name: " << lockName << endl;
315
316 if (QFile::exists( lockName ))
317 {
318 qDebug("ResourceSharpDTM::lock: lockfile %s already exists. (Delete it before continuing if nobody else is accessing the resourcefile %s)", lockName.latin1(), fileName());
319 return false;
320 }
321
322
323 QString lockUniqueName;
324 lockUniqueName = fn + KApplication::randomString( 8 );
325
326 url = lockUniqueName;
327//US mLockUniqueName = locateLocal( "data", "kabc/lock/" + lockUniqueName );
328 mLockUniqueName = locateLocal( "data", "kabc/lock/" + url.fileName() );
329 kdDebug(5700) << "-- lock unique name: " << mLockUniqueName << endl;
330
331 // Create unique file
332 QFile file( mLockUniqueName );
333 file.open( IO_WriteOnly );
334 file.close();
335
336 // Create lock file
337 int result = 0;
338#ifndef _WIN32_
339 result = ::link( QFile::encodeName( mLockUniqueName ),
340 QFile::encodeName( lockName ) );
341#endif
342 if ( result == 0 ) {
343 addressBook()->emitAddressBookLocked();
344 return true;
345 }
346
347 // TODO: check stat
348
349 return false;
350#else
351 return true;
352#endif
353} 258}
354 259
355void ResourceSharpDTM::unlock( const QString &fileName ) 260void ResourceSharpDTM::unlock( const QString &fileName )
356{ 261{
357#ifdef ALLOW_LOCKING
358 qDebug("ResourceSharpDTM::unlock() %s", fileName.latin1());
359 262
360 QString fn = fileName;
361 KURL url(fn);
362 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" );
363
364 QFile::remove( lockName );
365 QFile::remove( mLockUniqueName );
366 addressBook()->emitAddressBookUnlocked();
367#endif
368} 263}
369 264
370void ResourceSharpDTM::setFileName( const QString &newFileName ) 265void ResourceSharpDTM::setFileName( const QString &newFileName )
371{ 266{
372 mDirWatch.stopScan(); 267 Resource::setFileName( newFileName );
373 mDirWatch.removeFile( fileName() );
374
375 Resource::setFileName( newFileName );
376
377 mDirWatch.addFile( fileName() );
378 mDirWatch.startScan();
379
380} 268}
381 269
382void ResourceSharpDTM::fileChanged() 270void ResourceSharpDTM::fileChanged()
383{ 271{
384 // There is a small theoretical chance that KDirWatch calls us before 272
385 // we are fully constructed
386 if (!addressBook())
387 return;
388
389 QString text( i18n( "Sharp DTM resource '%1'<br> has been changed by third party.<br>Do you want to reload?").arg( fileName() ) );
390 if ( readOnly() || KMessageBox::questionYesNo( 0, text ) == KMessageBox::Yes ) {
391 load();
392 addressBook()->emitAddressBookChanged();
393 }
394} 273}
395 274
396void ResourceSharpDTM::removeAddressee( const Addressee &addr ) 275void ResourceSharpDTM::removeAddressee( const Addressee &addr )
397{ 276{
398} 277}
399 278
400void ResourceSharpDTM::cleanUp() 279void ResourceSharpDTM::cleanUp()
401{ 280{
402 unlock( fileName() ); 281 unlock( fileName() );
403} 282}
404 283
405 284
diff --git a/kabc/tmpaddressbook.cpp b/kabc/tmpaddressbook.cpp
index 6e24302..cfa57e3 100644
--- a/kabc/tmpaddressbook.cpp
+++ b/kabc/tmpaddressbook.cpp
@@ -35,22 +35,15 @@ using namespace KABC;
35TmpAddressBook::TmpAddressBook() 35TmpAddressBook::TmpAddressBook()
36 : AddressBook(0, "tmpcontact") 36 : AddressBook(0, "tmpcontact")
37{ 37{
38} 38}
39 39
40TmpAddressBook::TmpAddressBook( const QString &config ) 40TmpAddressBook::TmpAddressBook( const QString &config )
41 : AddressBook( config, "tmpcontact" ) 41 : AddressBook( config, "tmpcontact" )
42{ 42{
43} 43}
44 44
45TmpAddressBook::~TmpAddressBook() 45TmpAddressBook::~TmpAddressBook()
46{ 46{
47 //remove all possible resources. This should cleanup the configfile. 47 removeResources();
48 QPtrList<KABC::Resource> mResources = resources();
49
50 QPtrListIterator<KABC::Resource> it(mResources);
51 for ( ; it.current(); ++it ) {
52 KABC::Resource *res = it.current();
53 removeResource(res);
54 }
55} 48}
56 49