-rw-r--r-- | kabc/plugins/sharpdtm/resourcesharpdtm.cpp | 215 |
1 files changed, 47 insertions, 168 deletions
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 | |||
@@ -64,30 +64,26 @@ extern "C" | |||
64 | } | 64 | } |
65 | 65 | ||
66 | ResourceSharpDTM::ResourceSharpDTM( const KConfig *config ) | 66 | ResourceSharpDTM::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 | ||
75 | ResourceSharpDTM::ResourceSharpDTM( const QString &fileName ) | 75 | ResourceSharpDTM::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 | ||
81 | void ResourceSharpDTM::init( const QString &fileName ) | 82 | void 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 | ||
91 | ResourceSharpDTM::~ResourceSharpDTM() | 87 | ResourceSharpDTM::~ResourceSharpDTM() |
92 | { | 88 | { |
93 | if (mConverter != 0) | 89 | if (mConverter != 0) |
@@ -101,114 +97,82 @@ void ResourceSharpDTM::writeConfig( KConfig *config ) | |||
101 | { | 97 | { |
102 | Resource::writeConfig( config ); | 98 | Resource::writeConfig( config ); |
103 | } | 99 | } |
104 | 100 | ||
105 | Ticket *ResourceSharpDTM::requestSaveTicket() | 101 | Ticket *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 | ||
123 | bool ResourceSharpDTM::doOpen() | 111 | bool 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 | ||
155 | void ResourceSharpDTM::doClose() | 140 | void 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 | ||
170 | bool ResourceSharpDTM::load() | 145 | bool 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 | ||
196 | bool ResourceSharpDTM::save( Ticket *ticket ) | 164 | bool 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() ) |
@@ -220,16 +184,13 @@ bool ResourceSharpDTM::save( Ticket *ticket ) | |||
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 |
@@ -251,17 +212,15 @@ bool ResourceSharpDTM::save( Ticket *ticket ) | |||
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 | } |
@@ -286,114 +245,34 @@ bool ResourceSharpDTM::save( Ticket *ticket ) | |||
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 | ||
302 | bool ResourceSharpDTM::lock( const QString &lockfileName ) | 256 | bool 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 | ||
355 | void ResourceSharpDTM::unlock( const QString &fileName ) | 260 | void 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 | ||
370 | void ResourceSharpDTM::setFileName( const QString &newFileName ) | 265 | void 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 | ||
382 | void ResourceSharpDTM::fileChanged() | 270 | void 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 | ||
396 | void ResourceSharpDTM::removeAddressee( const Addressee &addr ) | 275 | void ResourceSharpDTM::removeAddressee( const Addressee &addr ) |
397 | { | 276 | { |
398 | } | 277 | } |
399 | 278 | ||