summaryrefslogtreecommitdiffabout
path: root/kabc
Unidiff
Diffstat (limited to 'kabc') (more/less context) (ignore whitespace changes)
-rw-r--r--kabc/addressbook.cpp2
-rw-r--r--kabc/kabcE.pro2
-rw-r--r--kabc/plugins/dir/resourcedir.cpp7
-rw-r--r--kabc/plugins/dir/resourcedir.h2
-rw-r--r--kabc/plugins/file/resourcefile.cpp16
-rw-r--r--kabc/plugins/file/resourcefile.h4
-rw-r--r--kabc/plugins/ldap/resourceldap.cpp7
-rw-r--r--kabc/plugins/ldap/resourceldap.h2
-rw-r--r--kabc/plugins/opie/resourceopie.cpp11
-rw-r--r--kabc/plugins/opie/resourceopie.h4
-rw-r--r--kabc/plugins/qtopia/resourceqtopia.cpp11
-rw-r--r--kabc/plugins/qtopia/resourceqtopia.h4
-rw-r--r--kabc/plugins/sharpdtm/resourcesharpdtm.cpp8
-rw-r--r--kabc/plugins/sharpdtm/resourcesharpdtm.h4
-rw-r--r--kabc/resource.cpp32
-rw-r--r--kabc/resource.h16
16 files changed, 39 insertions, 93 deletions
diff --git a/kabc/addressbook.cpp b/kabc/addressbook.cpp
index 592d78d..c584c35 100644
--- a/kabc/addressbook.cpp
+++ b/kabc/addressbook.cpp
@@ -1,1210 +1,1210 @@
1/* 1/*
2 This file is part of libkabc. 2 This file is part of libkabc.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21/* 21/*
22Enhanced Version of the file for platform independent KDE tools. 22Enhanced Version of the file for platform independent KDE tools.
23Copyright (c) 2004 Ulf Schenk 23Copyright (c) 2004 Ulf Schenk
24 24
25$Id$ 25$Id$
26*/ 26*/
27 27
28/*US 28/*US
29 29
30#include <qfile.h> 30#include <qfile.h>
31#include <qregexp.h> 31#include <qregexp.h>
32#include <qtimer.h> 32#include <qtimer.h>
33 33
34#include <kapplication.h> 34#include <kapplication.h>
35#include <kinstance.h> 35#include <kinstance.h>
36#include <kstandarddirs.h> 36#include <kstandarddirs.h>
37 37
38#include "errorhandler.h" 38#include "errorhandler.h"
39*/ 39*/
40#include <qptrlist.h> 40#include <qptrlist.h>
41#include <qtextstream.h> 41#include <qtextstream.h>
42#include <qfile.h> 42#include <qfile.h>
43#include <qregexp.h> 43#include <qregexp.h>
44 44
45#include <kglobal.h> 45#include <kglobal.h>
46#include <klocale.h> 46#include <klocale.h>
47#include <kmessagebox.h> 47#include <kmessagebox.h>
48#include <kdebug.h> 48#include <kdebug.h>
49#include <libkcal/syncdefines.h> 49#include <libkcal/syncdefines.h>
50#include <libkdepim/phoneaccess.h> 50#include <libkdepim/phoneaccess.h>
51#include "addressbook.h" 51#include "addressbook.h"
52#include "resource.h" 52#include "resource.h"
53#include "vcardconverter.h" 53#include "vcardconverter.h"
54#include "vcardparser/vcardtool.h" 54#include "vcardparser/vcardtool.h"
55 55
56//US #include "addressbook.moc" 56//US #include "addressbook.moc"
57 57
58using namespace KABC; 58using namespace KABC;
59 59
60struct AddressBook::AddressBookData 60struct AddressBook::AddressBookData
61{ 61{
62 Addressee::List mAddressees; 62 Addressee::List mAddressees;
63 Addressee::List mRemovedAddressees; 63 Addressee::List mRemovedAddressees;
64 Field::List mAllFields; 64 Field::List mAllFields;
65 KConfig *mConfig; 65 KConfig *mConfig;
66 KRES::Manager<Resource> *mManager; 66 KRES::Manager<Resource> *mManager;
67//US ErrorHandler *mErrorHandler; 67//US ErrorHandler *mErrorHandler;
68}; 68};
69 69
70struct AddressBook::Iterator::IteratorData 70struct AddressBook::Iterator::IteratorData
71{ 71{
72 Addressee::List::Iterator mIt; 72 Addressee::List::Iterator mIt;
73}; 73};
74 74
75struct AddressBook::ConstIterator::ConstIteratorData 75struct AddressBook::ConstIterator::ConstIteratorData
76{ 76{
77 Addressee::List::ConstIterator mIt; 77 Addressee::List::ConstIterator mIt;
78}; 78};
79 79
80AddressBook::Iterator::Iterator() 80AddressBook::Iterator::Iterator()
81{ 81{
82 d = new IteratorData; 82 d = new IteratorData;
83} 83}
84 84
85AddressBook::Iterator::Iterator( const AddressBook::Iterator &i ) 85AddressBook::Iterator::Iterator( const AddressBook::Iterator &i )
86{ 86{
87 d = new IteratorData; 87 d = new IteratorData;
88 d->mIt = i.d->mIt; 88 d->mIt = i.d->mIt;
89} 89}
90 90
91AddressBook::Iterator &AddressBook::Iterator::operator=( const AddressBook::Iterator &i ) 91AddressBook::Iterator &AddressBook::Iterator::operator=( const AddressBook::Iterator &i )
92{ 92{
93 if( this == &i ) return *this; // guard against self assignment 93 if( this == &i ) return *this; // guard against self assignment
94 delete d; // delete the old data the Iterator was completely constructed before 94 delete d; // delete the old data the Iterator was completely constructed before
95 d = new IteratorData; 95 d = new IteratorData;
96 d->mIt = i.d->mIt; 96 d->mIt = i.d->mIt;
97 return *this; 97 return *this;
98} 98}
99 99
100AddressBook::Iterator::~Iterator() 100AddressBook::Iterator::~Iterator()
101{ 101{
102 delete d; 102 delete d;
103} 103}
104 104
105const Addressee &AddressBook::Iterator::operator*() const 105const Addressee &AddressBook::Iterator::operator*() const
106{ 106{
107 return *(d->mIt); 107 return *(d->mIt);
108} 108}
109 109
110Addressee &AddressBook::Iterator::operator*() 110Addressee &AddressBook::Iterator::operator*()
111{ 111{
112 return *(d->mIt); 112 return *(d->mIt);
113} 113}
114 114
115Addressee *AddressBook::Iterator::operator->() 115Addressee *AddressBook::Iterator::operator->()
116{ 116{
117 return &(*(d->mIt)); 117 return &(*(d->mIt));
118} 118}
119 119
120AddressBook::Iterator &AddressBook::Iterator::operator++() 120AddressBook::Iterator &AddressBook::Iterator::operator++()
121{ 121{
122 (d->mIt)++; 122 (d->mIt)++;
123 return *this; 123 return *this;
124} 124}
125 125
126AddressBook::Iterator &AddressBook::Iterator::operator++(int) 126AddressBook::Iterator &AddressBook::Iterator::operator++(int)
127{ 127{
128 (d->mIt)++; 128 (d->mIt)++;
129 return *this; 129 return *this;
130} 130}
131 131
132AddressBook::Iterator &AddressBook::Iterator::operator--() 132AddressBook::Iterator &AddressBook::Iterator::operator--()
133{ 133{
134 (d->mIt)--; 134 (d->mIt)--;
135 return *this; 135 return *this;
136} 136}
137 137
138AddressBook::Iterator &AddressBook::Iterator::operator--(int) 138AddressBook::Iterator &AddressBook::Iterator::operator--(int)
139{ 139{
140 (d->mIt)--; 140 (d->mIt)--;
141 return *this; 141 return *this;
142} 142}
143 143
144bool AddressBook::Iterator::operator==( const Iterator &it ) 144bool AddressBook::Iterator::operator==( const Iterator &it )
145{ 145{
146 return ( d->mIt == it.d->mIt ); 146 return ( d->mIt == it.d->mIt );
147} 147}
148 148
149bool AddressBook::Iterator::operator!=( const Iterator &it ) 149bool AddressBook::Iterator::operator!=( const Iterator &it )
150{ 150{
151 return ( d->mIt != it.d->mIt ); 151 return ( d->mIt != it.d->mIt );
152} 152}
153 153
154 154
155AddressBook::ConstIterator::ConstIterator() 155AddressBook::ConstIterator::ConstIterator()
156{ 156{
157 d = new ConstIteratorData; 157 d = new ConstIteratorData;
158} 158}
159 159
160AddressBook::ConstIterator::ConstIterator( const AddressBook::ConstIterator &i ) 160AddressBook::ConstIterator::ConstIterator( const AddressBook::ConstIterator &i )
161{ 161{
162 d = new ConstIteratorData; 162 d = new ConstIteratorData;
163 d->mIt = i.d->mIt; 163 d->mIt = i.d->mIt;
164} 164}
165 165
166AddressBook::ConstIterator &AddressBook::ConstIterator::operator=( const AddressBook::ConstIterator &i ) 166AddressBook::ConstIterator &AddressBook::ConstIterator::operator=( const AddressBook::ConstIterator &i )
167{ 167{
168 if( this == &i ) return *this; // guard for self assignment 168 if( this == &i ) return *this; // guard for self assignment
169 delete d; // delete the old data because the Iterator was really constructed before 169 delete d; // delete the old data because the Iterator was really constructed before
170 d = new ConstIteratorData; 170 d = new ConstIteratorData;
171 d->mIt = i.d->mIt; 171 d->mIt = i.d->mIt;
172 return *this; 172 return *this;
173} 173}
174 174
175AddressBook::ConstIterator::~ConstIterator() 175AddressBook::ConstIterator::~ConstIterator()
176{ 176{
177 delete d; 177 delete d;
178} 178}
179 179
180const Addressee &AddressBook::ConstIterator::operator*() const 180const Addressee &AddressBook::ConstIterator::operator*() const
181{ 181{
182 return *(d->mIt); 182 return *(d->mIt);
183} 183}
184 184
185const Addressee* AddressBook::ConstIterator::operator->() const 185const Addressee* AddressBook::ConstIterator::operator->() const
186{ 186{
187 return &(*(d->mIt)); 187 return &(*(d->mIt));
188} 188}
189 189
190AddressBook::ConstIterator &AddressBook::ConstIterator::operator++() 190AddressBook::ConstIterator &AddressBook::ConstIterator::operator++()
191{ 191{
192 (d->mIt)++; 192 (d->mIt)++;
193 return *this; 193 return *this;
194} 194}
195 195
196AddressBook::ConstIterator &AddressBook::ConstIterator::operator++(int) 196AddressBook::ConstIterator &AddressBook::ConstIterator::operator++(int)
197{ 197{
198 (d->mIt)++; 198 (d->mIt)++;
199 return *this; 199 return *this;
200} 200}
201 201
202AddressBook::ConstIterator &AddressBook::ConstIterator::operator--() 202AddressBook::ConstIterator &AddressBook::ConstIterator::operator--()
203{ 203{
204 (d->mIt)--; 204 (d->mIt)--;
205 return *this; 205 return *this;
206} 206}
207 207
208AddressBook::ConstIterator &AddressBook::ConstIterator::operator--(int) 208AddressBook::ConstIterator &AddressBook::ConstIterator::operator--(int)
209{ 209{
210 (d->mIt)--; 210 (d->mIt)--;
211 return *this; 211 return *this;
212} 212}
213 213
214bool AddressBook::ConstIterator::operator==( const ConstIterator &it ) 214bool AddressBook::ConstIterator::operator==( const ConstIterator &it )
215{ 215{
216 return ( d->mIt == it.d->mIt ); 216 return ( d->mIt == it.d->mIt );
217} 217}
218 218
219bool AddressBook::ConstIterator::operator!=( const ConstIterator &it ) 219bool AddressBook::ConstIterator::operator!=( const ConstIterator &it )
220{ 220{
221 return ( d->mIt != it.d->mIt ); 221 return ( d->mIt != it.d->mIt );
222} 222}
223 223
224 224
225AddressBook::AddressBook() 225AddressBook::AddressBook()
226{ 226{
227 init(0, "contact"); 227 init(0, "contact");
228} 228}
229 229
230AddressBook::AddressBook( const QString &config ) 230AddressBook::AddressBook( const QString &config )
231{ 231{
232 init(config, "contact"); 232 init(config, "contact");
233} 233}
234 234
235AddressBook::AddressBook( const QString &config, const QString &family ) 235AddressBook::AddressBook( const QString &config, const QString &family )
236{ 236{
237 init(config, family); 237 init(config, family);
238 238
239} 239}
240 240
241// the default family is "contact" 241// the default family is "contact"
242void AddressBook::init(const QString &config, const QString &family ) 242void AddressBook::init(const QString &config, const QString &family )
243{ 243{
244 blockLSEchange = false; 244 blockLSEchange = false;
245 d = new AddressBookData; 245 d = new AddressBookData;
246 QString fami = family; 246 QString fami = family;
247 if (config != 0) { 247 if (config != 0) {
248 if ( family == "syncContact" ) { 248 if ( family == "syncContact" ) {
249 qDebug("creating sync config "); 249 qDebug("creating sync config ");
250 fami = "contact"; 250 fami = "contact";
251 KConfig* con = new KConfig( locateLocal("config", "syncContactrc") ); 251 KConfig* con = new KConfig( locateLocal("config", "syncContactrc") );
252 con->setGroup( "General" ); 252 con->setGroup( "General" );
253 con->writeEntry( "ResourceKeys", QString("sync") ); 253 con->writeEntry( "ResourceKeys", QString("sync") );
254 con->writeEntry( "Standard", QString("sync") ); 254 con->writeEntry( "Standard", QString("sync") );
255 con->setGroup( "Resource_sync" ); 255 con->setGroup( "Resource_sync" );
256 con->writeEntry( "FileName", config ); 256 con->writeEntry( "FileName", config );
257 con->writeEntry( "FileFormat", QString("vcard") ); 257 con->writeEntry( "FileFormat", QString("vcard") );
258 con->writeEntry( "ResourceIdentifier", QString("sync") ); 258 con->writeEntry( "ResourceIdentifier", QString("sync") );
259 con->writeEntry( "ResourceName", QString("sync_res") ); 259 con->writeEntry( "ResourceName", QString("sync_res") );
260 if ( config.right(4) == ".xml" ) 260 if ( config.right(4) == ".xml" )
261 con->writeEntry( "ResourceType", QString("qtopia") ); 261 con->writeEntry( "ResourceType", QString("qtopia") );
262 else if ( config == "sharp" ) { 262 else if ( config == "sharp" ) {
263 con->writeEntry( "ResourceType", QString("sharp") ); 263 con->writeEntry( "ResourceType", QString("sharp") );
264 } else { 264 } else {
265 con->writeEntry( "ResourceType", QString("file") ); 265 con->writeEntry( "ResourceType", QString("file") );
266 } 266 }
267 //con->sync(); 267 //con->sync();
268 d->mConfig = con; 268 d->mConfig = con;
269 } 269 }
270 else 270 else
271 d->mConfig = new KConfig( locateLocal("config", config) ); 271 d->mConfig = new KConfig( locateLocal("config", config) );
272// qDebug("AddressBook::init 1 config=%s",config.latin1() ); 272// qDebug("AddressBook::init 1 config=%s",config.latin1() );
273 } 273 }
274 else { 274 else {
275 d->mConfig = 0; 275 d->mConfig = 0;
276// qDebug("AddressBook::init 1 config=0"); 276// qDebug("AddressBook::init 1 config=0");
277 } 277 }
278 278
279//US d->mErrorHandler = 0; 279//US d->mErrorHandler = 0;
280 d->mManager = new KRES::Manager<Resource>( fami, false ); 280 d->mManager = new KRES::Manager<Resource>( fami );
281 d->mManager->readConfig( d->mConfig ); 281 d->mManager->readConfig( d->mConfig );
282 if ( family == "syncContact" ) { 282 if ( family == "syncContact" ) {
283 KRES::Manager<Resource> *manager = d->mManager; 283 KRES::Manager<Resource> *manager = d->mManager;
284 KRES::Manager<Resource>::ActiveIterator it; 284 KRES::Manager<Resource>::ActiveIterator it;
285 for ( it = manager->activeBegin(); it != manager->activeEnd(); ++it ) { 285 for ( it = manager->activeBegin(); it != manager->activeEnd(); ++it ) {
286 (*it)->setAddressBook( this ); 286 (*it)->setAddressBook( this );
287 if ( !(*it)->open() ) 287 if ( !(*it)->open() )
288 error( QString( "Unable to open resource '%1'!" ).arg( (*it)->resourceName() ) ); 288 error( QString( "Unable to open resource '%1'!" ).arg( (*it)->resourceName() ) );
289 } 289 }
290 Resource *res = standardResource(); 290 Resource *res = standardResource();
291 if ( !res ) { 291 if ( !res ) {
292 qDebug("ERROR: no standard resource"); 292 qDebug("ERROR: no standard resource");
293 res = manager->createResource( "file" ); 293 res = manager->createResource( "file" );
294 if ( res ) 294 if ( res )
295 { 295 {
296 addResource( res ); 296 addResource( res );
297 } 297 }
298 else 298 else
299 qDebug(" No resource available!!!"); 299 qDebug(" No resource available!!!");
300 } 300 }
301 setStandardResource( res ); 301 setStandardResource( res );
302 manager->writeConfig(); 302 manager->writeConfig();
303 } 303 }
304 addCustomField( i18n( "Department" ), KABC::Field::Organization, 304 addCustomField( i18n( "Department" ), KABC::Field::Organization,
305 "X-Department", "KADDRESSBOOK" ); 305 "X-Department", "KADDRESSBOOK" );
306 addCustomField( i18n( "Profession" ), KABC::Field::Organization, 306 addCustomField( i18n( "Profession" ), KABC::Field::Organization,
307 "X-Profession", "KADDRESSBOOK" ); 307 "X-Profession", "KADDRESSBOOK" );
308 addCustomField( i18n( "Assistant's Name" ), KABC::Field::Organization, 308 addCustomField( i18n( "Assistant's Name" ), KABC::Field::Organization,
309 "X-AssistantsName", "KADDRESSBOOK" ); 309 "X-AssistantsName", "KADDRESSBOOK" );
310 addCustomField( i18n( "Manager's Name" ), KABC::Field::Organization, 310 addCustomField( i18n( "Manager's Name" ), KABC::Field::Organization,
311 "X-ManagersName", "KADDRESSBOOK" ); 311 "X-ManagersName", "KADDRESSBOOK" );
312 addCustomField( i18n( "Spouse's Name" ), KABC::Field::Personal, 312 addCustomField( i18n( "Spouse's Name" ), KABC::Field::Personal,
313 "X-SpousesName", "KADDRESSBOOK" ); 313 "X-SpousesName", "KADDRESSBOOK" );
314 addCustomField( i18n( "Office" ), KABC::Field::Personal, 314 addCustomField( i18n( "Office" ), KABC::Field::Personal,
315 "X-Office", "KADDRESSBOOK" ); 315 "X-Office", "KADDRESSBOOK" );
316 addCustomField( i18n( "IM Address" ), KABC::Field::Personal, 316 addCustomField( i18n( "IM Address" ), KABC::Field::Personal,
317 "X-IMAddress", "KADDRESSBOOK" ); 317 "X-IMAddress", "KADDRESSBOOK" );
318 addCustomField( i18n( "Anniversary" ), KABC::Field::Personal, 318 addCustomField( i18n( "Anniversary" ), KABC::Field::Personal,
319 "X-Anniversary", "KADDRESSBOOK" ); 319 "X-Anniversary", "KADDRESSBOOK" );
320 320
321 //US added this field to become compatible with Opie/qtopia addressbook 321 //US added this field to become compatible with Opie/qtopia addressbook
322 // values can be "female" or "male" or "". An empty field represents undefined. 322 // values can be "female" or "male" or "". An empty field represents undefined.
323 addCustomField( i18n( "Gender" ), KABC::Field::Personal, 323 addCustomField( i18n( "Gender" ), KABC::Field::Personal,
324 "X-Gender", "KADDRESSBOOK" ); 324 "X-Gender", "KADDRESSBOOK" );
325 addCustomField( i18n( "Children" ), KABC::Field::Personal, 325 addCustomField( i18n( "Children" ), KABC::Field::Personal,
326 "X-Children", "KADDRESSBOOK" ); 326 "X-Children", "KADDRESSBOOK" );
327 addCustomField( i18n( "FreeBusyUrl" ), KABC::Field::Personal, 327 addCustomField( i18n( "FreeBusyUrl" ), KABC::Field::Personal,
328 "X-FreeBusyUrl", "KADDRESSBOOK" ); 328 "X-FreeBusyUrl", "KADDRESSBOOK" );
329 addCustomField( i18n( "ExternalID" ), KABC::Field::Personal, 329 addCustomField( i18n( "ExternalID" ), KABC::Field::Personal,
330 "X-ExternalID", "KADDRESSBOOK" ); 330 "X-ExternalID", "KADDRESSBOOK" );
331} 331}
332 332
333AddressBook::~AddressBook() 333AddressBook::~AddressBook()
334{ 334{
335 delete d->mConfig; d->mConfig = 0; 335 delete d->mConfig; d->mConfig = 0;
336 delete d->mManager; d->mManager = 0; 336 delete d->mManager; d->mManager = 0;
337//US delete d->mErrorHandler; d->mErrorHandler = 0; 337//US delete d->mErrorHandler; d->mErrorHandler = 0;
338 delete d; d = 0; 338 delete d; d = 0;
339} 339}
340 340
341bool AddressBook::load() 341bool AddressBook::load()
342{ 342{
343 343
344 clear(); 344 clear();
345 KRES::Manager<Resource>::ActiveIterator it; 345 KRES::Manager<Resource>::ActiveIterator it;
346 bool ok = true; 346 bool ok = true;
347 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) 347 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it )
348 if ( !(*it)->load() ) { 348 if ( !(*it)->load() ) {
349 qDebug( i18n("Unable to load resource '%1'").arg( (*it)->resourceName() ) ); 349 qDebug( i18n("Unable to load resource '%1'").arg( (*it)->resourceName() ) );
350 ok = false; 350 ok = false;
351 } else { 351 } else {
352 qDebug( i18n("Resource loaded: '%1'").arg( (*it)->resourceName() ) ); 352 qDebug( i18n("Resource loaded: '%1'").arg( (*it)->resourceName() ) );
353 } 353 }
354 // mark all addressees as unchanged 354 // mark all addressees as unchanged
355 Addressee::List::Iterator addrIt; 355 Addressee::List::Iterator addrIt;
356 for ( addrIt = d->mAddressees.begin(); addrIt != d->mAddressees.end(); ++addrIt ) { 356 for ( addrIt = d->mAddressees.begin(); addrIt != d->mAddressees.end(); ++addrIt ) {
357 (*addrIt).setChanged( false ); 357 (*addrIt).setChanged( false );
358 QString id = (*addrIt).custom( "KADDRESSBOOK", "X-ExternalID" ); 358 QString id = (*addrIt).custom( "KADDRESSBOOK", "X-ExternalID" );
359 if ( !id.isEmpty() ) { 359 if ( !id.isEmpty() ) {
360 //qDebug("setId aa %s ", id.latin1()); 360 //qDebug("setId aa %s ", id.latin1());
361 (*addrIt).setIDStr(id ); 361 (*addrIt).setIDStr(id );
362 } 362 }
363 } 363 }
364 blockLSEchange = true; 364 blockLSEchange = true;
365 return ok; 365 return ok;
366} 366}
367 367
368bool AddressBook::save( Ticket *ticket ) 368bool AddressBook::save( Ticket *ticket )
369{ 369{
370 kdDebug(5700) << "AddressBook::save()"<< endl; 370 kdDebug(5700) << "AddressBook::save()"<< endl;
371 371
372 if ( ticket->resource() ) { 372 if ( ticket->resource() ) {
373 deleteRemovedAddressees(); 373 deleteRemovedAddressees();
374 return ticket->resource()->save( ticket ); 374 return ticket->resource()->save( ticket );
375 } 375 }
376 376
377 return false; 377 return false;
378} 378}
379// exports all Addressees, which are syncable 379// exports all Addressees, which are syncable
380void AddressBook::export2File( QString fileName ) 380void AddressBook::export2File( QString fileName )
381{ 381{
382 382
383 QFile outFile( fileName ); 383 QFile outFile( fileName );
384 if ( !outFile.open( IO_WriteOnly ) ) { 384 if ( !outFile.open( IO_WriteOnly ) ) {
385 QString text = i18n( "<qt>Unable to open file <b>%1</b> for export.</qt>" ); 385 QString text = i18n( "<qt>Unable to open file <b>%1</b> for export.</qt>" );
386 KMessageBox::error( 0, text.arg( fileName ) ); 386 KMessageBox::error( 0, text.arg( fileName ) );
387 return ; 387 return ;
388 } 388 }
389 QTextStream t( &outFile ); 389 QTextStream t( &outFile );
390 t.setEncoding( QTextStream::UnicodeUTF8 ); 390 t.setEncoding( QTextStream::UnicodeUTF8 );
391 Iterator it; 391 Iterator it;
392 KABC::VCardConverter::Version version; 392 KABC::VCardConverter::Version version;
393 version = KABC::VCardConverter::v3_0; 393 version = KABC::VCardConverter::v3_0;
394 for ( it = begin(); it != end(); ++it ) { 394 for ( it = begin(); it != end(); ++it ) {
395 if ( (*it).resource() && (*it).resource()->includeInSync() ) { 395 if ( (*it).resource() && (*it).resource()->includeInSync() ) {
396 if ( !(*it).IDStr().isEmpty() ) { 396 if ( !(*it).IDStr().isEmpty() ) {
397 (*it).insertCustom( "KADDRESSBOOK", "X-ExternalID", (*it).IDStr() ); 397 (*it).insertCustom( "KADDRESSBOOK", "X-ExternalID", (*it).IDStr() );
398 } 398 }
399 KABC::VCardConverter converter; 399 KABC::VCardConverter converter;
400 QString vcard; 400 QString vcard;
401 //Resource *resource() const; 401 //Resource *resource() const;
402 converter.addresseeToVCard( *it, vcard, version ); 402 converter.addresseeToVCard( *it, vcard, version );
403 t << vcard << "\r\n"; 403 t << vcard << "\r\n";
404 } 404 }
405 } 405 }
406 t << "\r\n\r\n"; 406 t << "\r\n\r\n";
407 outFile.close(); 407 outFile.close();
408} 408}
409// if QStringList uids is empty, all are exported 409// if QStringList uids is empty, all are exported
410bool AddressBook::export2PhoneFormat( QStringList uids ,QString fileName ) 410bool AddressBook::export2PhoneFormat( QStringList uids ,QString fileName )
411{ 411{
412 KABC::VCardConverter converter; 412 KABC::VCardConverter converter;
413 QString datastream; 413 QString datastream;
414 Iterator it; 414 Iterator it;
415 bool all = uids.isEmpty(); 415 bool all = uids.isEmpty();
416 for ( it = begin(); it != end(); ++it ) { 416 for ( it = begin(); it != end(); ++it ) {
417 // for( QStringList::ConstIterator it = uids.begin(); it != uids.end(); ++it ) { 417 // for( QStringList::ConstIterator it = uids.begin(); it != uids.end(); ++it ) {
418 if ( ! all ) { 418 if ( ! all ) {
419 if ( ! ( uids.contains((*it).uid() ) )) 419 if ( ! ( uids.contains((*it).uid() ) ))
420 continue; 420 continue;
421 } 421 }
422 KABC::Addressee a = ( *it ); 422 KABC::Addressee a = ( *it );
423 if ( a.isEmpty() ) 423 if ( a.isEmpty() )
424 continue; 424 continue;
425 if ( all && a.resource() && !a.resource()->includeInSync() ) 425 if ( all && a.resource() && !a.resource()->includeInSync() )
426 continue; 426 continue;
427 a.simplifyEmails(); 427 a.simplifyEmails();
428 a.simplifyPhoneNumbers(); 428 a.simplifyPhoneNumbers();
429 a.simplifyPhoneNumberTypes(); 429 a.simplifyPhoneNumberTypes();
430 a.simplifyAddresses(); 430 a.simplifyAddresses();
431 431
432 QString vcard; 432 QString vcard;
433 QString vcardnew; 433 QString vcardnew;
434 converter.addresseeToVCard( a, vcard ); 434 converter.addresseeToVCard( a, vcard );
435 int start = 0; 435 int start = 0;
436 int next; 436 int next;
437 while ( (next = vcard.find("TYPE=", start) )>= 0 ) { 437 while ( (next = vcard.find("TYPE=", start) )>= 0 ) {
438 int semi = vcard.find(";", next); 438 int semi = vcard.find(";", next);
439 int dopp = vcard.find(":", next); 439 int dopp = vcard.find(":", next);
440 int sep; 440 int sep;
441 if ( semi < dopp && semi >= 0 ) 441 if ( semi < dopp && semi >= 0 )
442 sep = semi ; 442 sep = semi ;
443 else 443 else
444 sep = dopp; 444 sep = dopp;
445 vcardnew +=vcard.mid( start, next - start); 445 vcardnew +=vcard.mid( start, next - start);
446 vcardnew +=vcard.mid( next+5,sep -next -5 ).upper(); 446 vcardnew +=vcard.mid( next+5,sep -next -5 ).upper();
447 start = sep; 447 start = sep;
448 } 448 }
449 vcardnew += vcard.mid( start,vcard.length() ); 449 vcardnew += vcard.mid( start,vcard.length() );
450 vcard = ""; 450 vcard = "";
451 start = 0; 451 start = 0;
452 while ( (next = vcardnew.find("ADR", start) )>= 0 ) { 452 while ( (next = vcardnew.find("ADR", start) )>= 0 ) {
453 int sep = vcardnew.find(":", next); 453 int sep = vcardnew.find(":", next);
454 vcard +=vcardnew.mid( start, next - start+3); 454 vcard +=vcardnew.mid( start, next - start+3);
455 start = sep; 455 start = sep;
456 } 456 }
457 vcard += vcardnew.mid( start,vcardnew.length() ); 457 vcard += vcardnew.mid( start,vcardnew.length() );
458 vcard.replace ( QRegExp(";;;") , "" ); 458 vcard.replace ( QRegExp(";;;") , "" );
459 vcard.replace ( QRegExp(";;") , "" ); 459 vcard.replace ( QRegExp(";;") , "" );
460 datastream += vcard; 460 datastream += vcard;
461 461
462 } 462 }
463 463
464 QFile outFile(fileName); 464 QFile outFile(fileName);
465 if ( outFile.open(IO_WriteOnly) ) { 465 if ( outFile.open(IO_WriteOnly) ) {
466 datastream.replace ( QRegExp("VERSION:3.0") , "VERSION:2.1" ); 466 datastream.replace ( QRegExp("VERSION:3.0") , "VERSION:2.1" );
467 QTextStream t( &outFile ); // use a text stream 467 QTextStream t( &outFile ); // use a text stream
468 t.setEncoding( QTextStream::UnicodeUTF8 ); 468 t.setEncoding( QTextStream::UnicodeUTF8 );
469 t <<datastream; 469 t <<datastream;
470 t << "\r\n\r\n"; 470 t << "\r\n\r\n";
471 outFile.close(); 471 outFile.close();
472 472
473 } else { 473 } else {
474 qDebug("Error open temp file "); 474 qDebug("Error open temp file ");
475 return false; 475 return false;
476 } 476 }
477 return true; 477 return true;
478 478
479} 479}
480void AddressBook::importFromFile( QString fileName, bool replaceLabel, bool removeOld ) 480void AddressBook::importFromFile( QString fileName, bool replaceLabel, bool removeOld )
481{ 481{
482 482
483 if ( removeOld ) 483 if ( removeOld )
484 setUntagged( true ); 484 setUntagged( true );
485 KABC::Addressee::List list; 485 KABC::Addressee::List list;
486 QFile file( fileName ); 486 QFile file( fileName );
487 file.open( IO_ReadOnly ); 487 file.open( IO_ReadOnly );
488 QByteArray rawData = file.readAll(); 488 QByteArray rawData = file.readAll();
489 file.close(); 489 file.close();
490 QString data; 490 QString data;
491 if ( replaceLabel ) { 491 if ( replaceLabel ) {
492 data = QString::fromLatin1( rawData.data(), rawData.size() + 1 ); 492 data = QString::fromLatin1( rawData.data(), rawData.size() + 1 );
493 data.replace ( QRegExp("LABEL") , "ADR" ); 493 data.replace ( QRegExp("LABEL") , "ADR" );
494 data.replace ( QRegExp("CHARSET=ISO-8859-1") , "" ); 494 data.replace ( QRegExp("CHARSET=ISO-8859-1") , "" );
495 } else 495 } else
496 data = QString::fromUtf8( rawData.data(), rawData.size() + 1 ); 496 data = QString::fromUtf8( rawData.data(), rawData.size() + 1 );
497 KABC::VCardTool tool; 497 KABC::VCardTool tool;
498 list = tool.parseVCards( data ); 498 list = tool.parseVCards( data );
499 KABC::Addressee::List::Iterator it; 499 KABC::Addressee::List::Iterator it;
500 for ( it = list.begin(); it != list.end(); ++it ) { 500 for ( it = list.begin(); it != list.end(); ++it ) {
501 QString id = (*it).custom( "KADDRESSBOOK", "X-ExternalID" ); 501 QString id = (*it).custom( "KADDRESSBOOK", "X-ExternalID" );
502 if ( !id.isEmpty() ) 502 if ( !id.isEmpty() )
503 (*it).setIDStr(id ); 503 (*it).setIDStr(id );
504 (*it).setResource( 0 ); 504 (*it).setResource( 0 );
505 if ( replaceLabel ) 505 if ( replaceLabel )
506 (*it).removeVoice(); 506 (*it).removeVoice();
507 if ( removeOld ) 507 if ( removeOld )
508 (*it).setTagged( true ); 508 (*it).setTagged( true );
509 insertAddressee( (*it), false, true ); 509 insertAddressee( (*it), false, true );
510 } 510 }
511 if ( removeOld ) 511 if ( removeOld )
512 removeUntagged(); 512 removeUntagged();
513} 513}
514void AddressBook::setUntagged(bool setNonSyncTagged) // = false) 514void AddressBook::setUntagged(bool setNonSyncTagged) // = false)
515{ 515{
516 Iterator ait; 516 Iterator ait;
517 for ( ait = begin(); ait != end(); ++ait ) { 517 for ( ait = begin(); ait != end(); ++ait ) {
518 if ( setNonSyncTagged ) { 518 if ( setNonSyncTagged ) {
519 if ( (*ait).resource() && ! (*ait).resource()->includeInSync() ) { 519 if ( (*ait).resource() && ! (*ait).resource()->includeInSync() ) {
520 (*ait).setTagged( true ); 520 (*ait).setTagged( true );
521 } else 521 } else
522 (*ait).setTagged( false ); 522 (*ait).setTagged( false );
523 } else 523 } else
524 (*ait).setTagged( false ); 524 (*ait).setTagged( false );
525 } 525 }
526} 526}
527void AddressBook::removeUntagged() 527void AddressBook::removeUntagged()
528{ 528{
529 Iterator ait; 529 Iterator ait;
530 bool todelete = false; 530 bool todelete = false;
531 Iterator todel; 531 Iterator todel;
532 for ( ait = begin(); ait != end(); ++ait ) { 532 for ( ait = begin(); ait != end(); ++ait ) {
533 if ( todelete ) 533 if ( todelete )
534 removeAddressee( todel ); 534 removeAddressee( todel );
535 if (!(*ait).tagged()) { 535 if (!(*ait).tagged()) {
536 todelete = true; 536 todelete = true;
537 todel = ait; 537 todel = ait;
538 } else 538 } else
539 todelete = false; 539 todelete = false;
540 } 540 }
541 if ( todelete ) 541 if ( todelete )
542 removeAddressee( todel ); 542 removeAddressee( todel );
543 deleteRemovedAddressees(); 543 deleteRemovedAddressees();
544} 544}
545void AddressBook::smplifyAddressees() 545void AddressBook::smplifyAddressees()
546{ 546{
547 Iterator ait; 547 Iterator ait;
548 for ( ait = begin(); ait != end(); ++ait ) { 548 for ( ait = begin(); ait != end(); ++ait ) {
549 (*ait).simplifyEmails(); 549 (*ait).simplifyEmails();
550 (*ait).simplifyPhoneNumbers(); 550 (*ait).simplifyPhoneNumbers();
551 (*ait).simplifyPhoneNumberTypes(); 551 (*ait).simplifyPhoneNumberTypes();
552 (*ait).simplifyAddresses(); 552 (*ait).simplifyAddresses();
553 } 553 }
554} 554}
555void AddressBook::preparePhoneSync( QString currentSyncDevice, bool isPreSync ) 555void AddressBook::preparePhoneSync( QString currentSyncDevice, bool isPreSync )
556{ 556{
557 Iterator ait; 557 Iterator ait;
558 for ( ait = begin(); ait != end(); ++ait ) { 558 for ( ait = begin(); ait != end(); ++ait ) {
559 QString id = (*ait).IDStr(); 559 QString id = (*ait).IDStr();
560 (*ait).setIDStr( ":"); 560 (*ait).setIDStr( ":");
561 (*ait).setExternalUID( id ); 561 (*ait).setExternalUID( id );
562 (*ait).setOriginalExternalUID( id ); 562 (*ait).setOriginalExternalUID( id );
563 if ( isPreSync ) 563 if ( isPreSync )
564 (*ait).setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL ); 564 (*ait).setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL );
565 else { 565 else {
566 (*ait).setTempSyncStat( SYNC_TEMPSTATE_NEW_ID ); 566 (*ait).setTempSyncStat( SYNC_TEMPSTATE_NEW_ID );
567 (*ait).setID( currentSyncDevice,id ); 567 (*ait).setID( currentSyncDevice,id );
568 568
569 } 569 }
570 } 570 }
571} 571}
572void AddressBook::findNewExtIds( QString fileName, QString currentSyncDevice ) 572void AddressBook::findNewExtIds( QString fileName, QString currentSyncDevice )
573{ 573{
574 574
575 setUntagged(); 575 setUntagged();
576 KABC::Addressee::List list; 576 KABC::Addressee::List list;
577 QFile file( fileName ); 577 QFile file( fileName );
578 file.open( IO_ReadOnly ); 578 file.open( IO_ReadOnly );
579 QByteArray rawData = file.readAll(); 579 QByteArray rawData = file.readAll();
580 file.close(); 580 file.close();
581 QString data; 581 QString data;
582 582
583 data = QString::fromUtf8( rawData.data(), rawData.size() + 1 ); 583 data = QString::fromUtf8( rawData.data(), rawData.size() + 1 );
584 KABC::VCardTool tool; 584 KABC::VCardTool tool;
585 list = tool.parseVCards( data ); 585 list = tool.parseVCards( data );
586 KABC::Addressee::List::Iterator it; 586 KABC::Addressee::List::Iterator it;
587 for ( it = list.begin(); it != list.end(); ++it ) { 587 for ( it = list.begin(); it != list.end(); ++it ) {
588 Iterator ait; 588 Iterator ait;
589 for ( ait = begin(); ait != end(); ++ait ) { 589 for ( ait = begin(); ait != end(); ++ait ) {
590 if ( !(*ait).tagged() ) { 590 if ( !(*ait).tagged() ) {
591 if ( (*ait).containsAdr(*it)) { 591 if ( (*ait).containsAdr(*it)) {
592 (*ait).setTagged(true); 592 (*ait).setTagged(true);
593 QString id = (*it).custom( "KADDRESSBOOK", "X-ExternalID" ); 593 QString id = (*it).custom( "KADDRESSBOOK", "X-ExternalID" );
594 (*it).setIDStr( ":"); 594 (*it).setIDStr( ":");
595 (*it).setID( currentSyncDevice,id ); 595 (*it).setID( currentSyncDevice,id );
596 (*it).setExternalUID( id ); 596 (*it).setExternalUID( id );
597 (*it).setTempSyncStat( SYNC_TEMPSTATE_NEW_ID ); 597 (*it).setTempSyncStat( SYNC_TEMPSTATE_NEW_ID );
598 (*it).setUid( ( (*ait).uid() )); 598 (*it).setUid( ( (*ait).uid() ));
599 break; 599 break;
600 } 600 }
601 } 601 }
602 602
603 } 603 }
604 if ( ait == end() ) 604 if ( ait == end() )
605 qDebug("ERROR:: no ext ID found for uid: %s", (*it).uid().latin1()); 605 qDebug("ERROR:: no ext ID found for uid: %s", (*it).uid().latin1());
606 } 606 }
607 clear(); 607 clear();
608 for ( it = list.begin(); it != list.end(); ++it ) { 608 for ( it = list.begin(); it != list.end(); ++it ) {
609 insertAddressee( (*it) ); 609 insertAddressee( (*it) );
610 } 610 }
611} 611}
612 612
613bool AddressBook::saveABphone( QString fileName ) 613bool AddressBook::saveABphone( QString fileName )
614{ 614{
615 //smplifyAddressees(); 615 //smplifyAddressees();
616 qDebug("saveABphone:: saving AB... "); 616 qDebug("saveABphone:: saving AB... ");
617 if ( ! export2PhoneFormat( QStringList() ,fileName ) ) 617 if ( ! export2PhoneFormat( QStringList() ,fileName ) )
618 return false; 618 return false;
619 qDebug("saveABphone:: writing to phone... "); 619 qDebug("saveABphone:: writing to phone... ");
620 if ( !PhoneAccess::writeToPhone( fileName) ) { 620 if ( !PhoneAccess::writeToPhone( fileName) ) {
621 return false; 621 return false;
622 } 622 }
623 qDebug("saveABphone:: re-reading from phone... "); 623 qDebug("saveABphone:: re-reading from phone... ");
624 if ( !PhoneAccess::readFromPhone( fileName) ) { 624 if ( !PhoneAccess::readFromPhone( fileName) ) {
625 return false; 625 return false;
626 } 626 }
627 return true; 627 return true;
628} 628}
629bool AddressBook::saveAB() 629bool AddressBook::saveAB()
630{ 630{
631 bool ok = true; 631 bool ok = true;
632 632
633 deleteRemovedAddressees(); 633 deleteRemovedAddressees();
634 Iterator ait; 634 Iterator ait;
635 for ( ait = begin(); ait != end(); ++ait ) { 635 for ( ait = begin(); ait != end(); ++ait ) {
636 if ( !(*ait).IDStr().isEmpty() ) { 636 if ( !(*ait).IDStr().isEmpty() ) {
637 (*ait).insertCustom( "KADDRESSBOOK", "X-ExternalID", (*ait).IDStr() ); 637 (*ait).insertCustom( "KADDRESSBOOK", "X-ExternalID", (*ait).IDStr() );
638 } 638 }
639 } 639 }
640 KRES::Manager<Resource>::ActiveIterator it; 640 KRES::Manager<Resource>::ActiveIterator it;
641 KRES::Manager<Resource> *manager = d->mManager; 641 KRES::Manager<Resource> *manager = d->mManager;
642 qDebug("SaveAB::saving..." ); 642 qDebug("SaveAB::saving..." );
643 for ( it = manager->activeBegin(); it != manager->activeEnd(); ++it ) { 643 for ( it = manager->activeBegin(); it != manager->activeEnd(); ++it ) {
644 qDebug("SaveAB::checking resource..." ); 644 qDebug("SaveAB::checking resource..." );
645 if ( (*it)->readOnly() ) 645 if ( (*it)->readOnly() )
646 qDebug("resource is readonly." ); 646 qDebug("resource is readonly." );
647 if ( (*it)->isOpen() ) 647 if ( (*it)->isOpen() )
648 qDebug("resource is open" ); 648 qDebug("resource is open" );
649 649
650 if ( !(*it)->readOnly() && (*it)->isOpen() ) { 650 if ( !(*it)->readOnly() && (*it)->isOpen() ) {
651 Ticket *ticket = requestSaveTicket( *it ); 651 Ticket *ticket = requestSaveTicket( *it );
652 qDebug("StdAddressBook::save '%s'", (*it)->resourceName().latin1() ); 652 qDebug("StdAddressBook::save '%s'", (*it)->resourceName().latin1() );
653 if ( !ticket ) { 653 if ( !ticket ) {
654 qDebug( i18n( "Unable to save to resource '%1'. It is locked." ) 654 qDebug( i18n( "Unable to save to resource '%1'. It is locked." )
655 .arg( (*it)->resourceName() ) ); 655 .arg( (*it)->resourceName() ) );
656 return false; 656 return false;
657 } 657 }
658 658
659 //if ( !save( ticket ) ) 659 //if ( !save( ticket ) )
660 if ( ticket->resource() ) { 660 if ( ticket->resource() ) {
661 QString name = ticket->resource()->resourceName(); 661 QString name = ticket->resource()->resourceName();
662 if ( ! ticket->resource()->save( ticket ) ) 662 if ( ! ticket->resource()->save( ticket ) )
663 ok = false; 663 ok = false;
664 else 664 else
665 qDebug("StdAddressBook::resource saved '%s'", name.latin1() ); 665 qDebug("StdAddressBook::resource saved '%s'", name.latin1() );
666 666
667 } else 667 } else
668 ok = false; 668 ok = false;
669 669
670 } 670 }
671 } 671 }
672 return ok; 672 return ok;
673} 673}
674 674
675AddressBook::Iterator AddressBook::begin() 675AddressBook::Iterator AddressBook::begin()
676{ 676{
677 Iterator it = Iterator(); 677 Iterator it = Iterator();
678 it.d->mIt = d->mAddressees.begin(); 678 it.d->mIt = d->mAddressees.begin();
679 return it; 679 return it;
680} 680}
681 681
682AddressBook::ConstIterator AddressBook::begin() const 682AddressBook::ConstIterator AddressBook::begin() const
683{ 683{
684 ConstIterator it = ConstIterator(); 684 ConstIterator it = ConstIterator();
685 it.d->mIt = d->mAddressees.begin(); 685 it.d->mIt = d->mAddressees.begin();
686 return it; 686 return it;
687} 687}
688 688
689AddressBook::Iterator AddressBook::end() 689AddressBook::Iterator AddressBook::end()
690{ 690{
691 Iterator it = Iterator(); 691 Iterator it = Iterator();
692 it.d->mIt = d->mAddressees.end(); 692 it.d->mIt = d->mAddressees.end();
693 return it; 693 return it;
694} 694}
695 695
696AddressBook::ConstIterator AddressBook::end() const 696AddressBook::ConstIterator AddressBook::end() const
697{ 697{
698 ConstIterator it = ConstIterator(); 698 ConstIterator it = ConstIterator();
699 it.d->mIt = d->mAddressees.end(); 699 it.d->mIt = d->mAddressees.end();
700 return it; 700 return it;
701} 701}
702 702
703void AddressBook::clear() 703void AddressBook::clear()
704{ 704{
705 d->mAddressees.clear(); 705 d->mAddressees.clear();
706} 706}
707 707
708Ticket *AddressBook::requestSaveTicket( Resource *resource ) 708Ticket *AddressBook::requestSaveTicket( Resource *resource )
709{ 709{
710 kdDebug(5700) << "AddressBook::requestSaveTicket()" << endl; 710 kdDebug(5700) << "AddressBook::requestSaveTicket()" << endl;
711 711
712 if ( !resource ) 712 if ( !resource )
713 { 713 {
714 qDebug("AddressBook::requestSaveTicket no resource" ); 714 qDebug("AddressBook::requestSaveTicket no resource" );
715 resource = standardResource(); 715 resource = standardResource();
716 } 716 }
717 717
718 KRES::Manager<Resource>::ActiveIterator it; 718 KRES::Manager<Resource>::ActiveIterator it;
719 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) { 719 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) {
720 if ( (*it) == resource ) { 720 if ( (*it) == resource ) {
721 if ( (*it)->readOnly() || !(*it)->isOpen() ) 721 if ( (*it)->readOnly() || !(*it)->isOpen() )
722 return 0; 722 return 0;
723 else 723 else
724 return (*it)->requestSaveTicket(); 724 return (*it)->requestSaveTicket();
725 } 725 }
726 } 726 }
727 727
728 return 0; 728 return 0;
729} 729}
730//void insertAddressee( const Addressee &, bool setRev = true, bool takeResource = false); 730//void insertAddressee( const Addressee &, bool setRev = true, bool takeResource = false);
731void AddressBook::insertAddressee( const Addressee &a, bool setRev, bool takeResource ) 731void AddressBook::insertAddressee( const Addressee &a, bool setRev, bool takeResource )
732{ 732{
733 if ( blockLSEchange && setRev && a.uid().left( 19 ) == QString("last-syncAddressee-") ) { 733 if ( blockLSEchange && setRev && a.uid().left( 19 ) == QString("last-syncAddressee-") ) {
734 //qDebug("block insert "); 734 //qDebug("block insert ");
735 return; 735 return;
736 } 736 }
737 //qDebug("inserting.... %s ",a.uid().latin1() ); 737 //qDebug("inserting.... %s ",a.uid().latin1() );
738 bool found = false; 738 bool found = false;
739 Addressee::List::Iterator it; 739 Addressee::List::Iterator it;
740 for ( it = d->mAddressees.begin(); it != d->mAddressees.end(); ++it ) { 740 for ( it = d->mAddressees.begin(); it != d->mAddressees.end(); ++it ) {
741 if ( a.uid() == (*it).uid() ) { 741 if ( a.uid() == (*it).uid() ) {
742 742
743 bool changed = false; 743 bool changed = false;
744 Addressee addr = a; 744 Addressee addr = a;
745 if ( addr != (*it) ) 745 if ( addr != (*it) )
746 changed = true; 746 changed = true;
747 747
748 if ( takeResource ) { 748 if ( takeResource ) {
749 Resource * res = (*it).resource(); 749 Resource * res = (*it).resource();
750 (*it) = a; 750 (*it) = a;
751 (*it).setResource( res ); 751 (*it).setResource( res );
752 } else { 752 } else {
753 (*it) = a; 753 (*it) = a;
754 if ( (*it).resource() == 0 ) 754 if ( (*it).resource() == 0 )
755 (*it).setResource( standardResource() ); 755 (*it).setResource( standardResource() );
756 } 756 }
757 if ( changed ) { 757 if ( changed ) {
758 if ( setRev ) { 758 if ( setRev ) {
759 759
760 // get rid of micro seconds 760 // get rid of micro seconds
761 QDateTime dt = QDateTime::currentDateTime(); 761 QDateTime dt = QDateTime::currentDateTime();
762 QTime t = dt.time(); 762 QTime t = dt.time();
763 dt.setTime( QTime (t.hour (), t.minute (), t.second () ) ); 763 dt.setTime( QTime (t.hour (), t.minute (), t.second () ) );
764 (*it).setRevision( dt ); 764 (*it).setRevision( dt );
765 } 765 }
766 (*it).setChanged( true ); 766 (*it).setChanged( true );
767 } 767 }
768 768
769 found = true; 769 found = true;
770 } else { 770 } else {
771 if ( (*it).uid().left( 19 ) == QString("last-syncAddressee-") ) { 771 if ( (*it).uid().left( 19 ) == QString("last-syncAddressee-") ) {
772 QString name = (*it).uid().mid( 19 ); 772 QString name = (*it).uid().mid( 19 );
773 Addressee b = a; 773 Addressee b = a;
774 QString id = b.getID( name ); 774 QString id = b.getID( name );
775 if ( ! id.isEmpty() ) { 775 if ( ! id.isEmpty() ) {
776 QString des = (*it).note(); 776 QString des = (*it).note();
777 int startN; 777 int startN;
778 if( (startN = des.find( id ) ) >= 0 ) { 778 if( (startN = des.find( id ) ) >= 0 ) {
779 int endN = des.find( ",", startN+1 ); 779 int endN = des.find( ",", startN+1 );
780 des = des.left( startN ) + des.mid( endN+1 ); 780 des = des.left( startN ) + des.mid( endN+1 );
781 (*it).setNote( des ); 781 (*it).setNote( des );
782 } 782 }
783 } 783 }
784 } 784 }
785 } 785 }
786 } 786 }
787 if ( found ) 787 if ( found )
788 return; 788 return;
789 d->mAddressees.append( a ); 789 d->mAddressees.append( a );
790 Addressee& addr = d->mAddressees.last(); 790 Addressee& addr = d->mAddressees.last();
791 if ( addr.resource() == 0 ) 791 if ( addr.resource() == 0 )
792 addr.setResource( standardResource() ); 792 addr.setResource( standardResource() );
793 793
794 addr.setChanged( true ); 794 addr.setChanged( true );
795} 795}
796 796
797void AddressBook::removeAddressee( const Addressee &a ) 797void AddressBook::removeAddressee( const Addressee &a )
798{ 798{
799 Iterator it; 799 Iterator it;
800 Iterator it2; 800 Iterator it2;
801 bool found = false; 801 bool found = false;
802 for ( it = begin(); it != end(); ++it ) { 802 for ( it = begin(); it != end(); ++it ) {
803 if ( a.uid() == (*it).uid() ) { 803 if ( a.uid() == (*it).uid() ) {
804 found = true; 804 found = true;
805 it2 = it; 805 it2 = it;
806 } else { 806 } else {
807 if ( (*it).uid().left( 19 ) == QString("last-syncAddressee-") ) { 807 if ( (*it).uid().left( 19 ) == QString("last-syncAddressee-") ) {
808 QString name = (*it).uid().mid( 19 ); 808 QString name = (*it).uid().mid( 19 );
809 Addressee b = a; 809 Addressee b = a;
810 QString id = b.getID( name ); 810 QString id = b.getID( name );
811 if ( ! id.isEmpty() ) { 811 if ( ! id.isEmpty() ) {
812 QString des = (*it).note(); 812 QString des = (*it).note();
813 if( des.find( id ) < 0 ) { 813 if( des.find( id ) < 0 ) {
814 des += id + ","; 814 des += id + ",";
815 (*it).setNote( des ); 815 (*it).setNote( des );
816 } 816 }
817 } 817 }
818 } 818 }
819 819
820 } 820 }
821 } 821 }
822 822
823 if ( found ) 823 if ( found )
824 removeAddressee( it2 ); 824 removeAddressee( it2 );
825 825
826} 826}
827 827
828void AddressBook::removeSyncAddressees( bool removeDeleted ) 828void AddressBook::removeSyncAddressees( bool removeDeleted )
829{ 829{
830 Iterator it = begin(); 830 Iterator it = begin();
831 Iterator it2 ; 831 Iterator it2 ;
832 QDateTime dt ( QDate( 2004,1,1) ); 832 QDateTime dt ( QDate( 2004,1,1) );
833 while ( it != end() ) { 833 while ( it != end() ) {
834 (*it).setRevision( dt ); 834 (*it).setRevision( dt );
835 (*it).removeCustom( "KADDRESSBOOK", "X-ExternalID" ); 835 (*it).removeCustom( "KADDRESSBOOK", "X-ExternalID" );
836 (*it).setIDStr(""); 836 (*it).setIDStr("");
837 if ( ( (*it).tempSyncStat() == SYNC_TEMPSTATE_DELETE && removeDeleted )|| (*it).uid().left( 19 ) == QString("last-syncAddressee-")) { 837 if ( ( (*it).tempSyncStat() == SYNC_TEMPSTATE_DELETE && removeDeleted )|| (*it).uid().left( 19 ) == QString("last-syncAddressee-")) {
838 it2 = it; 838 it2 = it;
839 //qDebug("removing %s ",(*it).uid().latin1() ); 839 //qDebug("removing %s ",(*it).uid().latin1() );
840 ++it; 840 ++it;
841 removeAddressee( it2 ); 841 removeAddressee( it2 );
842 } else { 842 } else {
843 //qDebug("skipping %s ",(*it).uid().latin1() ); 843 //qDebug("skipping %s ",(*it).uid().latin1() );
844 ++it; 844 ++it;
845 } 845 }
846 } 846 }
847 deleteRemovedAddressees(); 847 deleteRemovedAddressees();
848} 848}
849 849
850void AddressBook::removeAddressee( const Iterator &it ) 850void AddressBook::removeAddressee( const Iterator &it )
851{ 851{
852 d->mRemovedAddressees.append( (*it) ); 852 d->mRemovedAddressees.append( (*it) );
853 d->mAddressees.remove( it.d->mIt ); 853 d->mAddressees.remove( it.d->mIt );
854} 854}
855 855
856AddressBook::Iterator AddressBook::find( const Addressee &a ) 856AddressBook::Iterator AddressBook::find( const Addressee &a )
857{ 857{
858 Iterator it; 858 Iterator it;
859 for ( it = begin(); it != end(); ++it ) { 859 for ( it = begin(); it != end(); ++it ) {
860 if ( a.uid() == (*it).uid() ) { 860 if ( a.uid() == (*it).uid() ) {
861 return it; 861 return it;
862 } 862 }
863 } 863 }
864 return end(); 864 return end();
865} 865}
866 866
867Addressee AddressBook::findByUid( const QString &uid ) 867Addressee AddressBook::findByUid( const QString &uid )
868{ 868{
869 Iterator it; 869 Iterator it;
870 for ( it = begin(); it != end(); ++it ) { 870 for ( it = begin(); it != end(); ++it ) {
871 if ( uid == (*it).uid() ) { 871 if ( uid == (*it).uid() ) {
872 return *it; 872 return *it;
873 } 873 }
874 } 874 }
875 return Addressee(); 875 return Addressee();
876} 876}
877void AddressBook::preExternSync( AddressBook* aBook, const QString& csd , bool isSubset ) 877void AddressBook::preExternSync( AddressBook* aBook, const QString& csd , bool isSubset )
878{ 878{
879 //qDebug("AddressBook::preExternSync "); 879 //qDebug("AddressBook::preExternSync ");
880 AddressBook::Iterator it; 880 AddressBook::Iterator it;
881 for ( it = begin(); it != end(); ++it ) { 881 for ( it = begin(); it != end(); ++it ) {
882 (*it).setID( csd, (*it).externalUID() ); 882 (*it).setID( csd, (*it).externalUID() );
883 (*it).computeCsum( csd ); 883 (*it).computeCsum( csd );
884 } 884 }
885 mergeAB( aBook ,csd, isSubset ); 885 mergeAB( aBook ,csd, isSubset );
886} 886}
887void AddressBook::postExternSync( AddressBook* aBook , const QString& csd) 887void AddressBook::postExternSync( AddressBook* aBook , const QString& csd)
888{ 888{
889 //qDebug("AddressBook::postExternSync "); 889 //qDebug("AddressBook::postExternSync ");
890 AddressBook::Iterator it; 890 AddressBook::Iterator it;
891 for ( it = begin(); it != end(); ++it ) { 891 for ( it = begin(); it != end(); ++it ) {
892 // qDebug("check uid %s ", (*it).uid().latin1() ); 892 // qDebug("check uid %s ", (*it).uid().latin1() );
893 if ( (*it).tempSyncStat() == SYNC_TEMPSTATE_NEW_ID || 893 if ( (*it).tempSyncStat() == SYNC_TEMPSTATE_NEW_ID ||
894 (*it).tempSyncStat() == SYNC_TEMPSTATE_NEW_CSUM ) { 894 (*it).tempSyncStat() == SYNC_TEMPSTATE_NEW_CSUM ) {
895 Addressee ad = aBook->findByUid( ( (*it).uid() )); 895 Addressee ad = aBook->findByUid( ( (*it).uid() ));
896 if ( ad.isEmpty() ) { 896 if ( ad.isEmpty() ) {
897 qDebug("postExternSync:ERROR addressee is empty: %s ", (*it).uid().latin1()); 897 qDebug("postExternSync:ERROR addressee is empty: %s ", (*it).uid().latin1());
898 } else { 898 } else {
899 (*it).computeCsum( csd ); 899 (*it).computeCsum( csd );
900 if ( (*it).tempSyncStat() == SYNC_TEMPSTATE_NEW_ID ) 900 if ( (*it).tempSyncStat() == SYNC_TEMPSTATE_NEW_ID )
901 ad.setID( csd, (*it).externalUID() ); 901 ad.setID( csd, (*it).externalUID() );
902 ad.setCsum( csd, (*it).getCsum( csd ) ); 902 ad.setCsum( csd, (*it).getCsum( csd ) );
903 aBook->insertAddressee( ad ); 903 aBook->insertAddressee( ad );
904 } 904 }
905 } 905 }
906 } 906 }
907} 907}
908 908
909bool AddressBook::containsExternalUid( const QString& uid ) 909bool AddressBook::containsExternalUid( const QString& uid )
910{ 910{
911 Iterator it; 911 Iterator it;
912 for ( it = begin(); it != end(); ++it ) { 912 for ( it = begin(); it != end(); ++it ) {
913 if ( uid == (*it).externalUID( ) ) 913 if ( uid == (*it).externalUID( ) )
914 return true; 914 return true;
915 } 915 }
916 return false; 916 return false;
917} 917}
918Addressee AddressBook::findByExternUid( const QString& uid , const QString& profile ) 918Addressee AddressBook::findByExternUid( const QString& uid , const QString& profile )
919{ 919{
920 Iterator it; 920 Iterator it;
921 for ( it = begin(); it != end(); ++it ) { 921 for ( it = begin(); it != end(); ++it ) {
922 if ( uid == (*it).getID( profile ) ) 922 if ( uid == (*it).getID( profile ) )
923 return (*it); 923 return (*it);
924 } 924 }
925 return Addressee(); 925 return Addressee();
926} 926}
927void AddressBook::mergeAB( AddressBook *aBook, const QString& profile , bool isSubset ) 927void AddressBook::mergeAB( AddressBook *aBook, const QString& profile , bool isSubset )
928{ 928{
929 Iterator it; 929 Iterator it;
930 Addressee ad; 930 Addressee ad;
931 for ( it = begin(); it != end(); ++it ) { 931 for ( it = begin(); it != end(); ++it ) {
932 ad = aBook->findByExternUid( (*it).externalUID(), profile ); 932 ad = aBook->findByExternUid( (*it).externalUID(), profile );
933 if ( !ad.isEmpty() ) { 933 if ( !ad.isEmpty() ) {
934 (*it).mergeContact( ad ,isSubset); 934 (*it).mergeContact( ad ,isSubset);
935 } 935 }
936 } 936 }
937#if 0 937#if 0
938 // test only 938 // test only
939 for ( it = begin(); it != end(); ++it ) { 939 for ( it = begin(); it != end(); ++it ) {
940 940
941 qDebug("uid %s ", (*it).uid().latin1()); 941 qDebug("uid %s ", (*it).uid().latin1());
942 } 942 }
943#endif 943#endif
944} 944}
945 945
946#if 0 946#if 0
947Addressee::List AddressBook::getExternLastSyncAddressees() 947Addressee::List AddressBook::getExternLastSyncAddressees()
948{ 948{
949 Addressee::List results; 949 Addressee::List results;
950 950
951 Iterator it; 951 Iterator it;
952 for ( it = begin(); it != end(); ++it ) { 952 for ( it = begin(); it != end(); ++it ) {
953 if ( (*it).uid().left( 19 ) == "last-syncAddressee-" ) { 953 if ( (*it).uid().left( 19 ) == "last-syncAddressee-" ) {
954 if ( (*it).familyName().left(4) == "!E: " ) 954 if ( (*it).familyName().left(4) == "!E: " )
955 results.append( *it ); 955 results.append( *it );
956 } 956 }
957 } 957 }
958 958
959 return results; 959 return results;
960} 960}
961#endif 961#endif
962void AddressBook::resetTempSyncStat() 962void AddressBook::resetTempSyncStat()
963{ 963{
964 Iterator it; 964 Iterator it;
965 for ( it = begin(); it != end(); ++it ) { 965 for ( it = begin(); it != end(); ++it ) {
966 (*it).setTempSyncStat ( SYNC_TEMPSTATE_INITIAL ); 966 (*it).setTempSyncStat ( SYNC_TEMPSTATE_INITIAL );
967 } 967 }
968 968
969} 969}
970 970
971QStringList AddressBook:: uidList() 971QStringList AddressBook:: uidList()
972{ 972{
973 QStringList results; 973 QStringList results;
974 Iterator it; 974 Iterator it;
975 for ( it = begin(); it != end(); ++it ) { 975 for ( it = begin(); it != end(); ++it ) {
976 results.append( (*it).uid() ); 976 results.append( (*it).uid() );
977 } 977 }
978 return results; 978 return results;
979} 979}
980 980
981 981
982Addressee::List AddressBook::allAddressees() 982Addressee::List AddressBook::allAddressees()
983{ 983{
984 return d->mAddressees; 984 return d->mAddressees;
985 985
986} 986}
987 987
988Addressee::List AddressBook::findByName( const QString &name ) 988Addressee::List AddressBook::findByName( const QString &name )
989{ 989{
990 Addressee::List results; 990 Addressee::List results;
991 991
992 Iterator it; 992 Iterator it;
993 for ( it = begin(); it != end(); ++it ) { 993 for ( it = begin(); it != end(); ++it ) {
994 if ( name == (*it).realName() ) { 994 if ( name == (*it).realName() ) {
995 results.append( *it ); 995 results.append( *it );
996 } 996 }
997 } 997 }
998 998
999 return results; 999 return results;
1000} 1000}
1001 1001
1002Addressee::List AddressBook::findByEmail( const QString &email ) 1002Addressee::List AddressBook::findByEmail( const QString &email )
1003{ 1003{
1004 Addressee::List results; 1004 Addressee::List results;
1005 QStringList mailList; 1005 QStringList mailList;
1006 1006
1007 Iterator it; 1007 Iterator it;
1008 for ( it = begin(); it != end(); ++it ) { 1008 for ( it = begin(); it != end(); ++it ) {
1009 mailList = (*it).emails(); 1009 mailList = (*it).emails();
1010 for ( QStringList::Iterator ite = mailList.begin(); ite != mailList.end(); ++ite ) { 1010 for ( QStringList::Iterator ite = mailList.begin(); ite != mailList.end(); ++ite ) {
1011 if ( email == (*ite) ) { 1011 if ( email == (*ite) ) {
1012 results.append( *it ); 1012 results.append( *it );
1013 } 1013 }
1014 } 1014 }
1015 } 1015 }
1016 1016
1017 return results; 1017 return results;
1018} 1018}
1019 1019
1020Addressee::List AddressBook::findByCategory( const QString &category ) 1020Addressee::List AddressBook::findByCategory( const QString &category )
1021{ 1021{
1022 Addressee::List results; 1022 Addressee::List results;
1023 1023
1024 Iterator it; 1024 Iterator it;
1025 for ( it = begin(); it != end(); ++it ) { 1025 for ( it = begin(); it != end(); ++it ) {
1026 if ( (*it).hasCategory( category) ) { 1026 if ( (*it).hasCategory( category) ) {
1027 results.append( *it ); 1027 results.append( *it );
1028 } 1028 }
1029 } 1029 }
1030 1030
1031 return results; 1031 return results;
1032} 1032}
1033 1033
1034void AddressBook::dump() const 1034void AddressBook::dump() const
1035{ 1035{
1036 kdDebug(5700) << "AddressBook::dump() --- begin ---" << endl; 1036 kdDebug(5700) << "AddressBook::dump() --- begin ---" << endl;
1037 1037
1038 ConstIterator it; 1038 ConstIterator it;
1039 for( it = begin(); it != end(); ++it ) { 1039 for( it = begin(); it != end(); ++it ) {
1040 (*it).dump(); 1040 (*it).dump();
1041 } 1041 }
1042 1042
1043 kdDebug(5700) << "AddressBook::dump() --- end ---" << endl; 1043 kdDebug(5700) << "AddressBook::dump() --- end ---" << endl;
1044} 1044}
1045 1045
1046QString AddressBook::identifier() 1046QString AddressBook::identifier()
1047{ 1047{
1048 QStringList identifier; 1048 QStringList identifier;
1049 1049
1050 1050
1051 KRES::Manager<Resource>::ActiveIterator it; 1051 KRES::Manager<Resource>::ActiveIterator it;
1052 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) { 1052 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) {
1053 if ( !(*it)->identifier().isEmpty() ) 1053 if ( !(*it)->identifier().isEmpty() )
1054 identifier.append( (*it)->identifier() ); 1054 identifier.append( (*it)->identifier() );
1055 } 1055 }
1056 1056
1057 return identifier.join( ":" ); 1057 return identifier.join( ":" );
1058} 1058}
1059 1059
1060Field::List AddressBook::fields( int category ) 1060Field::List AddressBook::fields( int category )
1061{ 1061{
1062 if ( d->mAllFields.isEmpty() ) { 1062 if ( d->mAllFields.isEmpty() ) {
1063 d->mAllFields = Field::allFields(); 1063 d->mAllFields = Field::allFields();
1064 } 1064 }
1065 1065
1066 if ( category == Field::All ) return d->mAllFields; 1066 if ( category == Field::All ) return d->mAllFields;
1067 1067
1068 Field::List result; 1068 Field::List result;
1069 Field::List::ConstIterator it; 1069 Field::List::ConstIterator it;
1070 for( it = d->mAllFields.begin(); it != d->mAllFields.end(); ++it ) { 1070 for( it = d->mAllFields.begin(); it != d->mAllFields.end(); ++it ) {
1071 if ( (*it)->category() & category ) result.append( *it ); 1071 if ( (*it)->category() & category ) result.append( *it );
1072 } 1072 }
1073 1073
1074 return result; 1074 return result;
1075} 1075}
1076 1076
1077bool AddressBook::addCustomField( const QString &label, int category, 1077bool AddressBook::addCustomField( const QString &label, int category,
1078 const QString &key, const QString &app ) 1078 const QString &key, const QString &app )
1079{ 1079{
1080 if ( d->mAllFields.isEmpty() ) { 1080 if ( d->mAllFields.isEmpty() ) {
1081 d->mAllFields = Field::allFields(); 1081 d->mAllFields = Field::allFields();
1082 } 1082 }
1083//US QString a = app.isNull() ? KGlobal::instance()->instanceName() : app; 1083//US QString a = app.isNull() ? KGlobal::instance()->instanceName() : app;
1084 QString a = app.isNull() ? KGlobal::getAppName() : app; 1084 QString a = app.isNull() ? KGlobal::getAppName() : app;
1085 1085
1086 QString k = key.isNull() ? label : key; 1086 QString k = key.isNull() ? label : key;
1087 1087
1088 Field *field = Field::createCustomField( label, category, k, a ); 1088 Field *field = Field::createCustomField( label, category, k, a );
1089 1089
1090 if ( !field ) return false; 1090 if ( !field ) return false;
1091 1091
1092 d->mAllFields.append( field ); 1092 d->mAllFields.append( field );
1093 1093
1094 return true; 1094 return true;
1095} 1095}
1096 1096
1097QDataStream &KABC::operator<<( QDataStream &s, const AddressBook &ab ) 1097QDataStream &KABC::operator<<( QDataStream &s, const AddressBook &ab )
1098{ 1098{
1099 if (!ab.d) return s; 1099 if (!ab.d) return s;
1100 1100
1101 return s << ab.d->mAddressees; 1101 return s << ab.d->mAddressees;
1102} 1102}
1103 1103
1104QDataStream &KABC::operator>>( QDataStream &s, AddressBook &ab ) 1104QDataStream &KABC::operator>>( QDataStream &s, AddressBook &ab )
1105{ 1105{
1106 if (!ab.d) return s; 1106 if (!ab.d) return s;
1107 1107
1108 s >> ab.d->mAddressees; 1108 s >> ab.d->mAddressees;
1109 1109
1110 return s; 1110 return s;
1111} 1111}
1112 1112
1113bool AddressBook::addResource( Resource *resource ) 1113bool AddressBook::addResource( Resource *resource )
1114{ 1114{
1115 if ( !resource->open() ) { 1115 if ( !resource->open() ) {
1116 kdDebug(5700) << "AddressBook::addResource(): can't add resource" << endl; 1116 kdDebug(5700) << "AddressBook::addResource(): can't add resource" << endl;
1117 return false; 1117 return false;
1118 } 1118 }
1119 1119
1120 resource->setAddressBook( this ); 1120 resource->setAddressBook( this );
1121 1121
1122 d->mManager->add( resource ); 1122 d->mManager->add( resource );
1123 return true; 1123 return true;
1124} 1124}
1125 1125
1126bool AddressBook::removeResource( Resource *resource ) 1126bool AddressBook::removeResource( Resource *resource )
1127{ 1127{
1128 resource->close(); 1128 resource->close();
1129 1129
1130 if ( resource == standardResource() ) 1130 if ( resource == standardResource() )
1131 d->mManager->setStandardResource( 0 ); 1131 d->mManager->setStandardResource( 0 );
1132 1132
1133 resource->setAddressBook( 0 ); 1133 resource->setAddressBook( 0 );
1134 1134
1135 d->mManager->remove( resource ); 1135 d->mManager->remove( resource );
1136 return true; 1136 return true;
1137} 1137}
1138 1138
1139QPtrList<Resource> AddressBook::resources() 1139QPtrList<Resource> AddressBook::resources()
1140{ 1140{
1141 QPtrList<Resource> list; 1141 QPtrList<Resource> list;
1142 1142
1143// qDebug("AddressBook::resources() 1"); 1143// qDebug("AddressBook::resources() 1");
1144 1144
1145 KRES::Manager<Resource>::ActiveIterator it; 1145 KRES::Manager<Resource>::ActiveIterator it;
1146 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) 1146 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it )
1147 list.append( *it ); 1147 list.append( *it );
1148 1148
1149 return list; 1149 return list;
1150} 1150}
1151 1151
1152/*US 1152/*US
1153void AddressBook::setErrorHandler( ErrorHandler *handler ) 1153void AddressBook::setErrorHandler( ErrorHandler *handler )
1154{ 1154{
1155 delete d->mErrorHandler; 1155 delete d->mErrorHandler;
1156 d->mErrorHandler = handler; 1156 d->mErrorHandler = handler;
1157} 1157}
1158*/ 1158*/
1159 1159
1160void AddressBook::error( const QString& msg ) 1160void AddressBook::error( const QString& msg )
1161{ 1161{
1162/*US 1162/*US
1163 if ( !d->mErrorHandler ) // create default error handler 1163 if ( !d->mErrorHandler ) // create default error handler
1164 d->mErrorHandler = new ConsoleErrorHandler; 1164 d->mErrorHandler = new ConsoleErrorHandler;
1165 1165
1166 if ( d->mErrorHandler ) 1166 if ( d->mErrorHandler )
1167 d->mErrorHandler->error( msg ); 1167 d->mErrorHandler->error( msg );
1168 else 1168 else
1169 kdError(5700) << "no error handler defined" << endl; 1169 kdError(5700) << "no error handler defined" << endl;
1170*/ 1170*/
1171 kdDebug(5700) << "msg" << endl; 1171 kdDebug(5700) << "msg" << endl;
1172 qDebug(msg); 1172 qDebug(msg);
1173} 1173}
1174 1174
1175void AddressBook::deleteRemovedAddressees() 1175void AddressBook::deleteRemovedAddressees()
1176{ 1176{
1177 Addressee::List::Iterator it; 1177 Addressee::List::Iterator it;
1178 for ( it = d->mRemovedAddressees.begin(); it != d->mRemovedAddressees.end(); ++it ) { 1178 for ( it = d->mRemovedAddressees.begin(); it != d->mRemovedAddressees.end(); ++it ) {
1179 Resource *resource = (*it).resource(); 1179 Resource *resource = (*it).resource();
1180 if ( resource && !resource->readOnly() && resource->isOpen() ) 1180 if ( resource && !resource->readOnly() && resource->isOpen() )
1181 resource->removeAddressee( *it ); 1181 resource->removeAddressee( *it );
1182 } 1182 }
1183 1183
1184 d->mRemovedAddressees.clear(); 1184 d->mRemovedAddressees.clear();
1185} 1185}
1186 1186
1187void AddressBook::setStandardResource( Resource *resource ) 1187void AddressBook::setStandardResource( Resource *resource )
1188{ 1188{
1189// qDebug("AddressBook::setStandardResource 1"); 1189// qDebug("AddressBook::setStandardResource 1");
1190 d->mManager->setStandardResource( resource ); 1190 d->mManager->setStandardResource( resource );
1191} 1191}
1192 1192
1193Resource *AddressBook::standardResource() 1193Resource *AddressBook::standardResource()
1194{ 1194{
1195 return d->mManager->standardResource(); 1195 return d->mManager->standardResource();
1196} 1196}
1197 1197
1198KRES::Manager<Resource> *AddressBook::resourceManager() 1198KRES::Manager<Resource> *AddressBook::resourceManager()
1199{ 1199{
1200 return d->mManager; 1200 return d->mManager;
1201} 1201}
1202 1202
1203void AddressBook::cleanUp() 1203void AddressBook::cleanUp()
1204{ 1204{
1205 KRES::Manager<Resource>::ActiveIterator it; 1205 KRES::Manager<Resource>::ActiveIterator it;
1206 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) { 1206 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) {
1207 if ( !(*it)->readOnly() && (*it)->isOpen() ) 1207 if ( !(*it)->readOnly() && (*it)->isOpen() )
1208 (*it)->cleanUp(); 1208 (*it)->cleanUp();
1209 } 1209 }
1210} 1210}
diff --git a/kabc/kabcE.pro b/kabc/kabcE.pro
index 061909b..96fe39e 100644
--- a/kabc/kabcE.pro
+++ b/kabc/kabcE.pro
@@ -1,198 +1,196 @@
1 TEMPLATE= lib 1 TEMPLATE= lib
2CONFIG += qt warn_on 2CONFIG += qt warn_on
3TARGET = kamicrokabc 3TARGET = kamicrokabc
4 4
5 5
6INCLUDEPATH += . $(KDEPIMDIR) vcard/include vcard/include/generated $(KDEPIMDIR)/microkde $(KDEPIMDIR)/microkde/kdecore $(KDEPIMDIR)/microkde/kdeui $(KDEPIMDIR)/microkde/kio/kfile $(KDEPIMDIR)/microkde/kio/kio $(KDEPIMDIR)/libkdepim $(KDEPIMDIR)/qtcompat $(QPEDIR)/include 6INCLUDEPATH += . $(KDEPIMDIR) vcard/include vcard/include/generated $(KDEPIMDIR)/microkde $(KDEPIMDIR)/microkde/kdecore $(KDEPIMDIR)/microkde/kdeui $(KDEPIMDIR)/microkde/kio/kfile $(KDEPIMDIR)/microkde/kio/kio $(KDEPIMDIR)/libkdepim $(KDEPIMDIR)/qtcompat $(QPEDIR)/include
7OBJECTS_DIR = obj/$(PLATFORM) 7OBJECTS_DIR = obj/$(PLATFORM)
8MOC_DIR = moc/$(PLATFORM) 8MOC_DIR = moc/$(PLATFORM)
9DESTDIR = $(QPEDIR)/lib 9DESTDIR = $(QPEDIR)/lib
10LIBS += -lmicrokde 10LIBS += -lmicrokde
11LIBS += -lmicrokdepim 11LIBS += -lmicrokdepim
12#LIBS += -lldap 12#LIBS += -lldap
13LIBS += -L$(QPEDIR)/lib 13LIBS += -L$(QPEDIR)/lib
14DEFINES += KAB_EMBEDDED 14DEFINES += KAB_EMBEDDED
15 15
16#enable the following line if you want to get debugoutput while loading adresses 16#enable the following line if you want to get debugoutput while loading adresses
17#DEFINES += VCARD_DEBUG 17#DEFINES += VCARD_DEBUG
18 18
19INTERFACES = \ 19INTERFACES = \
20 20
21HEADERS = \ 21HEADERS = \
22 address.h \ 22 address.h \
23 addressbook.h \ 23 addressbook.h \
24 addressee.h \ 24 addressee.h \
25 addresseedialog.h \ 25 addresseedialog.h \
26 addresseelist.h \ 26 addresseelist.h \
27 addresseeview.h \ 27 addresseeview.h \
28 agent.h \ 28 agent.h \
29 distributionlist.h \ 29 distributionlist.h \
30 distributionlistdialog.h \ 30 distributionlistdialog.h \
31 distributionlisteditor.h \ 31 distributionlisteditor.h \
32 field.h \ 32 field.h \
33 formatfactory.h \ 33 formatfactory.h \
34 formatplugin.h \ 34 formatplugin.h \
35 geo.h \ 35 geo.h \
36 key.h \ 36 key.h \
37 phonenumber.h \ 37 phonenumber.h \
38 picture.h \ 38 picture.h \
39 plugin.h \ 39 plugin.h \
40 resource.h \ 40 resource.h \
41 secrecy.h \ 41 secrecy.h \
42 sound.h \ 42 sound.h \
43 stdaddressbook.h \ 43 stdaddressbook.h \
44 syncprefwidget.h \
45 timezone.h \ 44 timezone.h \
46 tmpaddressbook.h \ 45 tmpaddressbook.h \
47 vcardconverter.h \ 46 vcardconverter.h \
48 vcard21parser.h \ 47 vcard21parser.h \
49 vcardformatimpl.h \ 48 vcardformatimpl.h \
50 vcardformatplugin.h \ 49 vcardformatplugin.h \
51 vcardparser/vcardline.h \ 50 vcardparser/vcardline.h \
52 vcardparser/vcard.h \ 51 vcardparser/vcard.h \
53 vcardparser/vcardtool.h \ 52 vcardparser/vcardtool.h \
54 vcardparser/vcardparser.h \ 53 vcardparser/vcardparser.h \
55 vcard/include/VCardAdrParam.h \ 54 vcard/include/VCardAdrParam.h \
56 vcard/include/VCardAdrValue.h \ 55 vcard/include/VCardAdrValue.h \
57 vcard/include/VCardAgentParam.h \ 56 vcard/include/VCardAgentParam.h \
58 vcard/include/VCardContentLine.h \ 57 vcard/include/VCardContentLine.h \
59 vcard/include/VCardDateParam.h \ 58 vcard/include/VCardDateParam.h \
60 vcard/include/VCardDateValue.h \ 59 vcard/include/VCardDateValue.h \
61 vcard/include/VCardEmailParam.h \ 60 vcard/include/VCardEmailParam.h \
62 vcard/include/VCardGeoValue.h \ 61 vcard/include/VCardGeoValue.h \
63 vcard/include/VCardGroup.h \ 62 vcard/include/VCardGroup.h \
64 vcard/include/VCardImageParam.h \ 63 vcard/include/VCardImageParam.h \
65 vcard/include/VCardImageValue.h \ 64 vcard/include/VCardImageValue.h \
66 vcard/include/VCardLangValue.h \ 65 vcard/include/VCardLangValue.h \
67 vcard/include/VCardNValue.h \ 66 vcard/include/VCardNValue.h \
68 vcard/include/VCardParam.h \ 67 vcard/include/VCardParam.h \
69 vcard/include/VCardPhoneNumberValue.h \ 68 vcard/include/VCardPhoneNumberValue.h \
70 vcard/include/VCardSourceParam.h \ 69 vcard/include/VCardSourceParam.h \
71 vcard/include/VCardTelParam.h \ 70 vcard/include/VCardTelParam.h \
72 vcard/include/VCardTextParam.h \ 71 vcard/include/VCardTextParam.h \
73 vcard/include/VCardTextNSParam.h \ 72 vcard/include/VCardTextNSParam.h \
74 vcard/include/VCardTextValue.h \ 73 vcard/include/VCardTextValue.h \
75 vcard/include/VCardTextBinParam.h \ 74 vcard/include/VCardTextBinParam.h \
76 vcard/include/VCardURIValue.h \ 75 vcard/include/VCardURIValue.h \
77 vcard/include/VCardVCard.h \ 76 vcard/include/VCardVCard.h \
78 vcard/include/VCardEntity.h \ 77 vcard/include/VCardEntity.h \
79 vcard/include/VCardValue.h \ 78 vcard/include/VCardValue.h \
80 vcard/include/VCardSoundValue.h \ 79 vcard/include/VCardSoundValue.h \
81 vcard/include/VCardAgentValue.h \ 80 vcard/include/VCardAgentValue.h \
82 vcard/include/VCardTelValue.h \ 81 vcard/include/VCardTelValue.h \
83 vcard/include/VCardTextBinValue.h \ 82 vcard/include/VCardTextBinValue.h \
84 vcard/include/VCardOrgValue.h \ 83 vcard/include/VCardOrgValue.h \
85 vcard/include/VCardUTCValue.h \ 84 vcard/include/VCardUTCValue.h \
86 vcard/include/VCardClassValue.h \ 85 vcard/include/VCardClassValue.h \
87 vcard/include/VCardFloatValue.h \ 86 vcard/include/VCardFloatValue.h \
88 vcard/include/VCardTextListValue.h \ 87 vcard/include/VCardTextListValue.h \
89 vcard/include/generated/AdrParam-generated.h \ 88 vcard/include/generated/AdrParam-generated.h \
90 vcard/include/generated/AdrValue-generated.h \ 89 vcard/include/generated/AdrValue-generated.h \
91 vcard/include/generated/AgentParam-generated.h \ 90 vcard/include/generated/AgentParam-generated.h \
92 vcard/include/generated/ContentLine-generated.h \ 91 vcard/include/generated/ContentLine-generated.h \
93 vcard/include/generated/DateParam-generated.h \ 92 vcard/include/generated/DateParam-generated.h \
94 vcard/include/generated/DateValue-generated.h \ 93 vcard/include/generated/DateValue-generated.h \
95 vcard/include/generated/EmailParam-generated.h \ 94 vcard/include/generated/EmailParam-generated.h \
96 vcard/include/generated/GeoValue-generated.h \ 95 vcard/include/generated/GeoValue-generated.h \
97 vcard/include/generated/Group-generated.h \ 96 vcard/include/generated/Group-generated.h \
98 vcard/include/generated/ImageParam-generated.h \ 97 vcard/include/generated/ImageParam-generated.h \
99 vcard/include/generated/ImageValue-generated.h \ 98 vcard/include/generated/ImageValue-generated.h \
100 vcard/include/generated/LangValue-generated.h \ 99 vcard/include/generated/LangValue-generated.h \
101 vcard/include/generated/NValue-generated.h \ 100 vcard/include/generated/NValue-generated.h \
102 vcard/include/generated/Param-generated.h \ 101 vcard/include/generated/Param-generated.h \
103 vcard/include/generated/PhoneNumberValue-generated.h \ 102 vcard/include/generated/PhoneNumberValue-generated.h \
104 vcard/include/generated/SourceParam-generated.h \ 103 vcard/include/generated/SourceParam-generated.h \
105 vcard/include/generated/TelParam-generated.h \ 104 vcard/include/generated/TelParam-generated.h \
106 vcard/include/generated/TextParam-generated.h \ 105 vcard/include/generated/TextParam-generated.h \
107 vcard/include/generated/TextNSParam-generated.h \ 106 vcard/include/generated/TextNSParam-generated.h \
108 vcard/include/generated/TextValue-generated.h \ 107 vcard/include/generated/TextValue-generated.h \
109 vcard/include/generated/TextBinParam-generated.h \ 108 vcard/include/generated/TextBinParam-generated.h \
110 vcard/include/generated/URIValue-generated.h \ 109 vcard/include/generated/URIValue-generated.h \
111 vcard/include/generated/VCard-generated.h \ 110 vcard/include/generated/VCard-generated.h \
112 vcard/include/generated/VCardEntity-generated.h \ 111 vcard/include/generated/VCardEntity-generated.h \
113 vcard/include/generated/Value-generated.h \ 112 vcard/include/generated/Value-generated.h \
114 vcard/include/generated/SoundValue-generated.h \ 113 vcard/include/generated/SoundValue-generated.h \
115 vcard/include/generated/AgentValue-generated.h \ 114 vcard/include/generated/AgentValue-generated.h \
116 vcard/include/generated/TelValue-generated.h \ 115 vcard/include/generated/TelValue-generated.h \
117 vcard/include/generated/TextBinValue-generated.h \ 116 vcard/include/generated/TextBinValue-generated.h \
118 vcard/include/generated/OrgValue-generated.h \ 117 vcard/include/generated/OrgValue-generated.h \
119 vcard/include/generated/UTCValue-generated.h \ 118 vcard/include/generated/UTCValue-generated.h \
120 vcard/include/generated/ClassValue-generated.h \ 119 vcard/include/generated/ClassValue-generated.h \
121 vcard/include/generated/FloatValue-generated.h \ 120 vcard/include/generated/FloatValue-generated.h \
122 vcard/include/generated/TextListValue-generated.h 121 vcard/include/generated/TextListValue-generated.h
123 122
124 123
125 124
126 125
127SOURCES = \ 126SOURCES = \
128 address.cpp \ 127 address.cpp \
129 addressbook.cpp \ 128 addressbook.cpp \
130 addressee.cpp \ 129 addressee.cpp \
131 addresseedialog.cpp \ 130 addresseedialog.cpp \
132 addresseelist.cpp \ 131 addresseelist.cpp \
133 addresseeview.cpp \ 132 addresseeview.cpp \
134 agent.cpp \ 133 agent.cpp \
135 distributionlist.cpp \ 134 distributionlist.cpp \
136 distributionlistdialog.cpp \ 135 distributionlistdialog.cpp \
137 distributionlisteditor.cpp \ 136 distributionlisteditor.cpp \
138 field.cpp \ 137 field.cpp \
139 formatfactory.cpp \ 138 formatfactory.cpp \
140 geo.cpp \ 139 geo.cpp \
141 key.cpp \ 140 key.cpp \
142 phonenumber.cpp \ 141 phonenumber.cpp \
143 picture.cpp \ 142 picture.cpp \
144 plugin.cpp \ 143 plugin.cpp \
145 resource.cpp \ 144 resource.cpp \
146 secrecy.cpp \ 145 secrecy.cpp \
147 sound.cpp \ 146 sound.cpp \
148 stdaddressbook.cpp \ 147 stdaddressbook.cpp \
149 syncprefwidget.cpp \
150 timezone.cpp \ 148 timezone.cpp \
151 tmpaddressbook.cpp \ 149 tmpaddressbook.cpp \
152 vcardconverter.cpp \ 150 vcardconverter.cpp \
153 vcard21parser.cpp \ 151 vcard21parser.cpp \
154 vcardformatimpl.cpp \ 152 vcardformatimpl.cpp \
155 vcardformatplugin.cpp \ 153 vcardformatplugin.cpp \
156 vcardparser/vcardline.cpp \ 154 vcardparser/vcardline.cpp \
157 vcardparser/vcard.cpp \ 155 vcardparser/vcard.cpp \
158 vcardparser/vcardtool.cpp \ 156 vcardparser/vcardtool.cpp \
159 vcardparser/vcardparser.cpp \ 157 vcardparser/vcardparser.cpp \
160vcard/AdrParam.cpp \ 158vcard/AdrParam.cpp \
161vcard/AdrValue.cpp \ 159vcard/AdrValue.cpp \
162vcard/AgentParam.cpp \ 160vcard/AgentParam.cpp \
163vcard/ContentLine.cpp \ 161vcard/ContentLine.cpp \
164vcard/DateParam.cpp \ 162vcard/DateParam.cpp \
165vcard/DateValue.cpp \ 163vcard/DateValue.cpp \
166vcard/EmailParam.cpp \ 164vcard/EmailParam.cpp \
167vcard/Entity.cpp \ 165vcard/Entity.cpp \
168vcard/Enum.cpp \ 166vcard/Enum.cpp \
169vcard/GeoValue.cpp \ 167vcard/GeoValue.cpp \
170vcard/ImageParam.cpp \ 168vcard/ImageParam.cpp \
171vcard/ImageValue.cpp \ 169vcard/ImageValue.cpp \
172vcard/LangValue.cpp \ 170vcard/LangValue.cpp \
173vcard/NValue.cpp \ 171vcard/NValue.cpp \
174vcard/Param.cpp \ 172vcard/Param.cpp \
175vcard/PhoneNumberValue.cpp \ 173vcard/PhoneNumberValue.cpp \
176vcard/RToken.cpp \ 174vcard/RToken.cpp \
177vcard/SourceParam.cpp \ 175vcard/SourceParam.cpp \
178vcard/TelParam.cpp \ 176vcard/TelParam.cpp \
179vcard/TextParam.cpp \ 177vcard/TextParam.cpp \
180vcard/TextValue.cpp \ 178vcard/TextValue.cpp \
181vcard/TextBinParam.cpp \ 179vcard/TextBinParam.cpp \
182vcard/URIValue.cpp \ 180vcard/URIValue.cpp \
183vcard/VCardv.cpp \ 181vcard/VCardv.cpp \
184vcard/VCardEntity.cpp \ 182vcard/VCardEntity.cpp \
185vcard/Value.cpp \ 183vcard/Value.cpp \
186vcard/SoundValue.cpp \ 184vcard/SoundValue.cpp \
187vcard/AgentValue.cpp \ 185vcard/AgentValue.cpp \
188vcard/TelValue.cpp \ 186vcard/TelValue.cpp \
189vcard/TextBinValue.cpp \ 187vcard/TextBinValue.cpp \
190vcard/OrgValue.cpp \ 188vcard/OrgValue.cpp \
191vcard/UTCValue.cpp \ 189vcard/UTCValue.cpp \
192vcard/ClassValue.cpp \ 190vcard/ClassValue.cpp \
193vcard/FloatValue.cpp \ 191vcard/FloatValue.cpp \
194vcard/TextListValue.cpp 192vcard/TextListValue.cpp
195 193
196 194
197# plugins/ldap/resourceldap.cpp \ 195# plugins/ldap/resourceldap.cpp \
198# plugins/ldap/resourceldapconfig.cpp \ 196# plugins/ldap/resourceldapconfig.cpp \
diff --git a/kabc/plugins/dir/resourcedir.cpp b/kabc/plugins/dir/resourcedir.cpp
index e58e4f7..e2b7b08 100644
--- a/kabc/plugins/dir/resourcedir.cpp
+++ b/kabc/plugins/dir/resourcedir.cpp
@@ -1,375 +1,374 @@
1/* 1/*
2 This file is part of libkabc. 2 This file is part of libkabc.
3 Copyright (c) 2002 Tobias Koenig <tokoe@kde.org> 3 Copyright (c) 2002 Tobias Koenig <tokoe@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21/* 21/*
22Enhanced Version of the file for platform independent KDE tools. 22Enhanced Version of the file for platform independent KDE tools.
23Copyright (c) 2004 Ulf Schenk 23Copyright (c) 2004 Ulf Schenk
24 24
25$Id$ 25$Id$
26*/ 26*/
27 27
28 28
29#include <sys/types.h> 29#include <sys/types.h>
30#include <sys/stat.h> 30#include <sys/stat.h>
31#ifndef _WIN32_ 31#ifndef _WIN32_
32#include <unistd.h> 32#include <unistd.h>
33#endif 33#endif
34 34
35#include <qregexp.h> 35#include <qregexp.h>
36#include <qtimer.h> 36#include <qtimer.h>
37#include <qwidget.h> 37#include <qwidget.h>
38 38
39#include <kapplication.h> 39#include <kapplication.h>
40#include <kconfig.h> 40#include <kconfig.h>
41#include <kdebug.h> 41#include <kdebug.h>
42//US #include <kgenericfactory.h> 42//US #include <kgenericfactory.h>
43#include <kglobal.h> 43#include <kglobal.h>
44#include <klocale.h> 44#include <klocale.h>
45#include <kstandarddirs.h> 45#include <kstandarddirs.h>
46#include <kurlrequester.h> 46#include <kurlrequester.h>
47#include <kmessagebox.h> 47#include <kmessagebox.h>
48 48
49#include "addressbook.h" 49#include "addressbook.h"
50 50
51#include "formatfactory.h" 51#include "formatfactory.h"
52 52
53#include "resourcedirconfig.h" 53#include "resourcedirconfig.h"
54#include "stdaddressbook.h" 54#include "stdaddressbook.h"
55 55
56//US 56//US
57#include <qdir.h> 57#include <qdir.h>
58 58
59#define NO_DIRWATCH 59#define NO_DIRWATCH
60#include "resourcedir.h" 60#include "resourcedir.h"
61#include "syncprefwidget.h"
62 61
63//#define ALLOW_LOCKING 62//#define ALLOW_LOCKING
64 63
65using namespace KABC; 64using namespace KABC;
66 65
67extern "C" 66extern "C"
68#ifdef _WIN32_ 67#ifdef _WIN32_
69__declspec(dllexport) 68__declspec(dllexport)
70#else 69#else
71{ 70{
72#endif 71#endif
73 72
74//US void *init_kabc_dir() 73//US void *init_kabc_dir()
75 void *init_microkabc_dir() 74 void *init_microkabc_dir()
76 { 75 {
77 return new KRES::PluginFactory<ResourceDir,ResourceDirConfig, SyncPrefWidgetContainer>(); 76 return new KRES::PluginFactory<ResourceDir,ResourceDirConfig>();
78 } 77 }
79#ifndef _WIN32_ 78#ifndef _WIN32_
80} 79}
81#endif 80#endif
82 81
83ResourceDir::ResourceDir( const KConfig *config, bool syncable ) 82ResourceDir::ResourceDir( const KConfig *config )
84 : Resource( config, syncable ) 83 : Resource( config )
85{ 84{
86 QString path; 85 QString path;
87 86
88 KConfig *cfg = (KConfig *)config; 87 KConfig *cfg = (KConfig *)config;
89 if ( cfg ) { 88 if ( cfg ) {
90//US path = config->readEntry( "FilePath" ); 89//US path = config->readEntry( "FilePath" );
91 path = cfg->readEntry( "FilePath", StdAddressBook::directoryName() ); 90 path = cfg->readEntry( "FilePath", StdAddressBook::directoryName() );
92//US mFormatName = config->readEntry( "FileFormat" ); 91//US mFormatName = config->readEntry( "FileFormat" );
93 mFormatName = cfg->readEntry( "FileFormat", "vcard" ); 92 mFormatName = cfg->readEntry( "FileFormat", "vcard" );
94 } else { 93 } else {
95 path = StdAddressBook::directoryName(); 94 path = StdAddressBook::directoryName();
96 mFormatName = "vcard"; 95 mFormatName = "vcard";
97 } 96 }
98 97
99 98
100 FormatFactory *factory = FormatFactory::self(); 99 FormatFactory *factory = FormatFactory::self();
101 mFormat = factory->format( mFormatName ); 100 mFormat = factory->format( mFormatName );
102 101
103 if ( !mFormat ) { 102 if ( !mFormat ) {
104 mFormatName = "vcard"; 103 mFormatName = "vcard";
105 mFormat = factory->format( mFormatName ); 104 mFormat = factory->format( mFormatName );
106 } 105 }
107 106
108/*US 107/*US
109//US qDebug("ResourceDir::ResourceDir initialized with format %s ", mFormatName.latin1()); 108//US qDebug("ResourceDir::ResourceDir initialized with format %s ", mFormatName.latin1());
110 if (mFormatName == "vcard") 109 if (mFormatName == "vcard")
111 mFormat = new VCardFormatPlugin2(); 110 mFormat = new VCardFormatPlugin2();
112 else if (mFormatName == "binary") 111 else if (mFormatName == "binary")
113 mFormat = new BinaryFormat(); 112 mFormat = new BinaryFormat();
114 else 113 else
115 qDebug("ResourceFile::init format unknown !!! %s ", mFormatName.latin1()); 114 qDebug("ResourceFile::init format unknown !!! %s ", mFormatName.latin1());
116*/ 115*/
117#ifndef NO_DIRWATCH 116#ifndef NO_DIRWATCH
118 connect( &mDirWatch, SIGNAL( dirty(const QString&) ), SLOT( pathChanged() ) ); 117 connect( &mDirWatch, SIGNAL( dirty(const QString&) ), SLOT( pathChanged() ) );
119 connect( &mDirWatch, SIGNAL( created(const QString&) ), SLOT( pathChanged() ) ); 118 connect( &mDirWatch, SIGNAL( created(const QString&) ), SLOT( pathChanged() ) );
120 connect( &mDirWatch, SIGNAL( deleted(const QString&) ), SLOT( pathChanged() ) ); 119 connect( &mDirWatch, SIGNAL( deleted(const QString&) ), SLOT( pathChanged() ) );
121#endif 120#endif
122 setPath( path ); 121 setPath( path );
123} 122}
124 123
125ResourceDir::~ResourceDir() 124ResourceDir::~ResourceDir()
126{ 125{
127 delete mFormat; 126 delete mFormat;
128 mFormat = 0; 127 mFormat = 0;
129} 128}
130 129
131void ResourceDir::writeConfig( KConfig *config ) 130void ResourceDir::writeConfig( KConfig *config )
132{ 131{
133 config->setGroup( "Resource_" + identifier() ); 132 config->setGroup( "Resource_" + identifier() );
134 Resource::writeConfig( config ); 133 Resource::writeConfig( config );
135 134
136 config->writeEntry( "FilePath", mPath ); 135 config->writeEntry( "FilePath", mPath );
137 config->writeEntry( "FileFormat", mFormatName ); 136 config->writeEntry( "FileFormat", mFormatName );
138} 137}
139 138
140Ticket *ResourceDir::requestSaveTicket() 139Ticket *ResourceDir::requestSaveTicket()
141{ 140{
142 141
143 142
144 if ( !addressBook() ) return 0; 143 if ( !addressBook() ) return 0;
145#ifdef ALLOW_LOCKING 144#ifdef ALLOW_LOCKING
146 if ( !lock( mPath ) ) { 145 if ( !lock( mPath ) ) {
147 146
148 return 0; 147 return 0;
149 } 148 }
150#endif 149#endif
151 return createTicket( this ); 150 return createTicket( this );
152 151
153} 152}
154 153
155 154
156bool ResourceDir::doOpen() 155bool ResourceDir::doOpen()
157{ 156{
158 QDir dir( mPath ); 157 QDir dir( mPath );
159 if ( !dir.exists() ) { // no directory available 158 if ( !dir.exists() ) { // no directory available
160 return dir.mkdir( dir.path() ); 159 return dir.mkdir( dir.path() );
161 } else { 160 } else {
162 QString testName = dir.entryList( QDir::Files )[0]; 161 QString testName = dir.entryList( QDir::Files )[0];
163 if ( testName.isNull() || testName.isEmpty() ) // no file in directory 162 if ( testName.isNull() || testName.isEmpty() ) // no file in directory
164 return true; 163 return true;
165 164
166 QFile file( mPath + "/" + testName ); 165 QFile file( mPath + "/" + testName );
167 if ( file.open( IO_ReadOnly ) ) 166 if ( file.open( IO_ReadOnly ) )
168 return true; 167 return true;
169 168
170 if ( file.size() == 0 ) 169 if ( file.size() == 0 )
171 return true; 170 return true;
172 171
173 bool ok = mFormat->checkFormat( &file ); 172 bool ok = mFormat->checkFormat( &file );
174 file.close(); 173 file.close();
175 return ok; 174 return ok;
176 } 175 }
177} 176}
178 177
179void ResourceDir::doClose() 178void ResourceDir::doClose()
180{ 179{
181} 180}
182 181
183bool ResourceDir::load() 182bool ResourceDir::load()
184{ 183{
185 QDir dir( mPath ); 184 QDir dir( mPath );
186 QStringList files = dir.entryList( QDir::Files ); 185 QStringList files = dir.entryList( QDir::Files );
187 186
188 QStringList::Iterator it; 187 QStringList::Iterator it;
189 bool ok = true; 188 bool ok = true;
190 for ( it = files.begin(); it != files.end(); ++it ) { 189 for ( it = files.begin(); it != files.end(); ++it ) {
191 QFile file( mPath + "/" + (*it) ); 190 QFile file( mPath + "/" + (*it) );
192 191
193 if ( !file.open( IO_ReadOnly ) ) { 192 if ( !file.open( IO_ReadOnly ) ) {
194 addressBook()->error( i18n( "Unable to open file '%1' for reading" ).arg( file.name() ) ); 193 addressBook()->error( i18n( "Unable to open file '%1' for reading" ).arg( file.name() ) );
195 ok = false; 194 ok = false;
196 continue; 195 continue;
197 } 196 }
198 197
199 if ( !mFormat->loadAll( addressBook(), this, &file ) ) 198 if ( !mFormat->loadAll( addressBook(), this, &file ) )
200 ok = false; 199 ok = false;
201 200
202 file.close(); 201 file.close();
203 } 202 }
204 203
205 return ok; 204 return ok;
206} 205}
207 206
208bool ResourceDir::save( Ticket *ticket ) 207bool ResourceDir::save( Ticket *ticket )
209{ 208{
210 AddressBook::Iterator it; 209 AddressBook::Iterator it;
211 bool ok = true; 210 bool ok = true;
212#ifndef NO_DIRWATCH 211#ifndef NO_DIRWATCH
213 mDirWatch.stopScan(); 212 mDirWatch.stopScan();
214#endif 213#endif
215 for ( it = addressBook()->begin(); it != addressBook()->end(); ++it ) { 214 for ( it = addressBook()->begin(); it != addressBook()->end(); ++it ) {
216 if ( (*it).resource() != this || !(*it).changed() ) 215 if ( (*it).resource() != this || !(*it).changed() )
217 continue; 216 continue;
218 217
219 QFile file( mPath + "/" + (*it).uid() ); 218 QFile file( mPath + "/" + (*it).uid() );
220 if ( !file.open( IO_WriteOnly ) ) { 219 if ( !file.open( IO_WriteOnly ) ) {
221 addressBook()->error( i18n( "Unable to open file '%1' for writing" ).arg( file.name() ) ); 220 addressBook()->error( i18n( "Unable to open file '%1' for writing" ).arg( file.name() ) );
222 continue; 221 continue;
223 } 222 }
224 223
225 mFormat->save( *it, &file ); 224 mFormat->save( *it, &file );
226 225
227 // mark as unchanged 226 // mark as unchanged
228 (*it).setChanged( false ); 227 (*it).setChanged( false );
229 228
230 file.close(); 229 file.close();
231 } 230 }
232#ifndef NO_DIRWATCH 231#ifndef NO_DIRWATCH
233 mDirWatch.startScan(); 232 mDirWatch.startScan();
234#endif 233#endif
235 delete ticket; 234 delete ticket;
236#ifdef ALLOW_LOCKING 235#ifdef ALLOW_LOCKING
237 unlock( mPath ); 236 unlock( mPath );
238#endif 237#endif
239 return ok; 238 return ok;
240} 239}
241 240
242bool ResourceDir::lock( const QString &path ) 241bool ResourceDir::lock( const QString &path )
243{ 242{
244#ifdef ALLOW_LOCKING 243#ifdef ALLOW_LOCKING
245 QString p = path; 244 QString p = path;
246//US change the implementation how the lockfilename is getting created 245//US change the implementation how the lockfilename is getting created
247//US p.replace( QRegExp("/"), "_" ); 246//US p.replace( QRegExp("/"), "_" );
248//US QString lockName = locateLocal( "data", "kabc/lock/" + p + ".lock" ); 247//US QString lockName = locateLocal( "data", "kabc/lock/" + p + ".lock" );
249 KURL url(p); 248 KURL url(p);
250 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" ); 249 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" );
251 250
252 251
253 if ( QFile::exists( lockName ) ) return false; 252 if ( QFile::exists( lockName ) ) return false;
254 253
255 QString lockUniqueName; 254 QString lockUniqueName;
256 lockUniqueName = p + KApplication::randomString( 8 ); 255 lockUniqueName = p + KApplication::randomString( 8 );
257 256
258 url = lockUniqueName; 257 url = lockUniqueName;
259//US mLockUniqueName = locateLocal( "data", "kabc/lock/" + lockUniqueName ); 258//US mLockUniqueName = locateLocal( "data", "kabc/lock/" + lockUniqueName );
260 mLockUniqueName = locateLocal( "data", "kabc/lock/" + url.fileName() ); 259 mLockUniqueName = locateLocal( "data", "kabc/lock/" + url.fileName() );
261 260
262 // Create unique file 261 // Create unique file
263 QFile file( mLockUniqueName ); 262 QFile file( mLockUniqueName );
264 file.open( IO_WriteOnly ); 263 file.open( IO_WriteOnly );
265 file.close(); 264 file.close();
266 265
267 // Create lock file 266 // Create lock file
268 int result = 0; 267 int result = 0;
269#ifndef _WIN32_ 268#ifndef _WIN32_
270 result = ::link( QFile::encodeName( mLockUniqueName ), 269 result = ::link( QFile::encodeName( mLockUniqueName ),
271 QFile::encodeName( lockName ) ); 270 QFile::encodeName( lockName ) );
272#endif 271#endif
273 if ( result == 0 ) { 272 if ( result == 0 ) {
274 addressBook()->emitAddressBookLocked(); 273 addressBook()->emitAddressBookLocked();
275 return true; 274 return true;
276 } 275 }
277 276
278 // TODO: check stat 277 // TODO: check stat
279 278
280 return false; 279 return false;
281#else 280#else
282 return true; 281 return true;
283#endif 282#endif
284} 283}
285 284
286void ResourceDir::unlock( const QString &path ) 285void ResourceDir::unlock( const QString &path )
287{ 286{
288#ifdef ALLOW_LOCKING 287#ifdef ALLOW_LOCKING
289 QString p = path; 288 QString p = path;
290//US change the implementation how the lockfilename is getting created 289//US change the implementation how the lockfilename is getting created
291//US p.replace( QRegExp( "/" ), "_" ); 290//US p.replace( QRegExp( "/" ), "_" );
292//US QString lockName = locate( "data", "kabc/lock/" + p + ".lock" ); 291//US QString lockName = locate( "data", "kabc/lock/" + p + ".lock" );
293 KURL url(p); 292 KURL url(p);
294 QString lockName = locate( "data", "kabc/lock/" + url.fileName() + ".lock" ); 293 QString lockName = locate( "data", "kabc/lock/" + url.fileName() + ".lock" );
295 294
296 ::unlink( QFile::encodeName( lockName ) ); 295 ::unlink( QFile::encodeName( lockName ) );
297 QFile::remove( mLockUniqueName ); 296 QFile::remove( mLockUniqueName );
298 addressBook()->emitAddressBookUnlocked(); 297 addressBook()->emitAddressBookUnlocked();
299#else 298#else
300 return; 299 return;
301#endif 300#endif
302} 301}
303 302
304void ResourceDir::setPath( const QString &path ) 303void ResourceDir::setPath( const QString &path )
305{ 304{
306#ifndef NO_DIRWATCH 305#ifndef NO_DIRWATCH
307 mDirWatch.stopScan(); 306 mDirWatch.stopScan();
308 mDirWatch.removeDir( mPath ); 307 mDirWatch.removeDir( mPath );
309 308
310 mPath = path; 309 mPath = path;
311 310
312 mDirWatch.addDir( mPath, true ); 311 mDirWatch.addDir( mPath, true );
313 mDirWatch.startScan(); 312 mDirWatch.startScan();
314#else 313#else
315 mPath = path; 314 mPath = path;
316#endif 315#endif
317//US simulate KDirWatch event 316//US simulate KDirWatch event
318//US pathChanged(); 317//US pathChanged();
319 318
320} 319}
321 320
322QString ResourceDir::path() const 321QString ResourceDir::path() const
323{ 322{
324 return mPath; 323 return mPath;
325} 324}
326 325
327void ResourceDir::setFormat( const QString &format ) 326void ResourceDir::setFormat( const QString &format )
328{ 327{
329 mFormatName = format; 328 mFormatName = format;
330 329
331 if ( mFormat ) 330 if ( mFormat )
332 delete mFormat; 331 delete mFormat;
333 332
334 FormatFactory *factory = FormatFactory::self(); 333 FormatFactory *factory = FormatFactory::self();
335 mFormat = factory->format( mFormatName ); 334 mFormat = factory->format( mFormatName );
336/*US 335/*US
337qDebug("ResourceDir::setFormat initialized with format %s ", format.latin1()); 336qDebug("ResourceDir::setFormat initialized with format %s ", format.latin1());
338 if (mFormatName == "vcard") 337 if (mFormatName == "vcard")
339 mFormat = new VCardFormatPlugin2(); 338 mFormat = new VCardFormatPlugin2();
340 else if (mFormatName == "binary") 339 else if (mFormatName == "binary")
341 mFormat = new BinaryFormat(); 340 mFormat = new BinaryFormat();
342 else 341 else
343 qDebug("ResourceDir::setFormat format unknown !!! %s ", format.latin1()); 342 qDebug("ResourceDir::setFormat format unknown !!! %s ", format.latin1());
344*/ 343*/
345 344
346} 345}
347 346
348QString ResourceDir::format() const 347QString ResourceDir::format() const
349{ 348{
350 return mFormatName; 349 return mFormatName;
351} 350}
352 351
353void ResourceDir::pathChanged() 352void ResourceDir::pathChanged()
354{ 353{
355 if ( !addressBook() ) 354 if ( !addressBook() )
356 return; 355 return;
357 356
358 QString text( i18n( "Dir resource '%1'<br> has been changed by third party.<br>Do you want to reload?").arg( mPath ) ); 357 QString text( i18n( "Dir resource '%1'<br> has been changed by third party.<br>Do you want to reload?").arg( mPath ) );
359 if ( readOnly() || KMessageBox::questionYesNo( 0, text ) == KMessageBox::Yes ) { 358 if ( readOnly() || KMessageBox::questionYesNo( 0, text ) == KMessageBox::Yes ) {
360 load(); 359 load();
361 addressBook()->emitAddressBookChanged(); 360 addressBook()->emitAddressBookChanged();
362 } 361 }
363} 362}
364 363
365void ResourceDir::removeAddressee( const Addressee& addr ) 364void ResourceDir::removeAddressee( const Addressee& addr )
366{ 365{
367 QFile::remove( mPath + "/" + addr.uid() ); 366 QFile::remove( mPath + "/" + addr.uid() );
368} 367}
369 368
370void ResourceDir::cleanUp() 369void ResourceDir::cleanUp()
371{ 370{
372 unlock( mPath ); 371 unlock( mPath );
373} 372}
374 373
375//US #include "resourcedir.moc" 374//US #include "resourcedir.moc"
diff --git a/kabc/plugins/dir/resourcedir.h b/kabc/plugins/dir/resourcedir.h
index 77cd18c..6c1e922 100644
--- a/kabc/plugins/dir/resourcedir.h
+++ b/kabc/plugins/dir/resourcedir.h
@@ -1,116 +1,116 @@
1/* 1/*
2 This file is part of libkabc. 2 This file is part of libkabc.
3 Copyright (c) 2002 Tobias Koenig <tokoe@kde.org> 3 Copyright (c) 2002 Tobias Koenig <tokoe@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21/* 21/*
22Enhanced Version of the file for platform independent KDE tools. 22Enhanced Version of the file for platform independent KDE tools.
23Copyright (c) 2004 Ulf Schenk 23Copyright (c) 2004 Ulf Schenk
24 24
25$Id$ 25$Id$
26*/ 26*/
27 27
28#ifndef KABC_RESOURCEDIR_H 28#ifndef KABC_RESOURCEDIR_H
29#define KABC_RESOURCEDIR_H 29#define KABC_RESOURCEDIR_H
30 30
31#include <kconfig.h> 31#include <kconfig.h>
32#include <kdirwatch.h> 32#include <kdirwatch.h>
33 33
34#include <sys/types.h> 34#include <sys/types.h>
35 35
36#include "resource.h" 36#include "resource.h"
37 37
38class QTimer; 38class QTimer;
39 39
40namespace KABC { 40namespace KABC {
41 41
42class FormatPlugin; 42class FormatPlugin;
43 43
44/** 44/**
45 @internal 45 @internal
46*/ 46*/
47class ResourceDir : public Resource 47class ResourceDir : public Resource
48{ 48{
49 Q_OBJECT 49 Q_OBJECT
50 50
51public: 51public:
52 ResourceDir( const KConfig*, bool syncable ); 52 ResourceDir( const KConfig* );
53 ~ResourceDir(); 53 ~ResourceDir();
54 54
55 virtual void writeConfig( KConfig* ); 55 virtual void writeConfig( KConfig* );
56 56
57 virtual bool doOpen(); 57 virtual bool doOpen();
58 virtual void doClose(); 58 virtual void doClose();
59 59
60 virtual Ticket *requestSaveTicket(); 60 virtual Ticket *requestSaveTicket();
61 61
62 virtual bool load(); 62 virtual bool load();
63 virtual bool save( Ticket * ); 63 virtual bool save( Ticket * );
64 64
65 /** 65 /**
66 * Set path to be used for saving. 66 * Set path to be used for saving.
67 */ 67 */
68 void setPath( const QString & ); 68 void setPath( const QString & );
69 69
70 /** 70 /**
71 * Return path used for loading and saving the address book. 71 * Return path used for loading and saving the address book.
72 */ 72 */
73 QString path() const; 73 QString path() const;
74 74
75 /** 75 /**
76 * Set the format by name. 76 * Set the format by name.
77 */ 77 */
78 void setFormat( const QString &format ); 78 void setFormat( const QString &format );
79 79
80 /** 80 /**
81 * Returns the format name. 81 * Returns the format name.
82 */ 82 */
83 QString format() const; 83 QString format() const;
84 84
85 /** 85 /**
86 * Remove a addressee from its source. 86 * Remove a addressee from its source.
87 * This method is mainly called by KABC::AddressBook. 87 * This method is mainly called by KABC::AddressBook.
88 */ 88 */
89 virtual void removeAddressee( const Addressee& addr ); 89 virtual void removeAddressee( const Addressee& addr );
90 90
91 /** 91 /**
92 * This method is called by an error handler if the application 92 * This method is called by an error handler if the application
93 * crashed 93 * crashed
94 */ 94 */
95 virtual void cleanUp(); 95 virtual void cleanUp();
96 96
97protected slots: 97protected slots:
98 void pathChanged(); 98 void pathChanged();
99 99
100protected: 100protected:
101 bool lock( const QString &path ); 101 bool lock( const QString &path );
102 void unlock( const QString &path ); 102 void unlock( const QString &path );
103 103
104private: 104private:
105 FormatPlugin *mFormat; 105 FormatPlugin *mFormat;
106 106
107#ifndef NO_DIRWATCH 107#ifndef NO_DIRWATCH
108 KDirWatch mDirWatch; 108 KDirWatch mDirWatch;
109#endif 109#endif
110 QString mPath; 110 QString mPath;
111 QString mFormatName; 111 QString mFormatName;
112 QString mLockUniqueName; 112 QString mLockUniqueName;
113}; 113};
114 114
115} 115}
116#endif 116#endif
diff --git a/kabc/plugins/file/resourcefile.cpp b/kabc/plugins/file/resourcefile.cpp
index 163f2b4..dc5932f 100644
--- a/kabc/plugins/file/resourcefile.cpp
+++ b/kabc/plugins/file/resourcefile.cpp
@@ -1,408 +1,404 @@
1/* 1/*
2 This file is part of libkabc. 2 This file is part of libkabc.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21/* 21/*
22Enhanced Version of the file for platform independent KDE tools. 22Enhanced Version of the file for platform independent KDE tools.
23Copyright (c) 2004 Ulf Schenk 23Copyright (c) 2004 Ulf Schenk
24 24
25$Id$ 25$Id$
26*/ 26*/
27 27
28#include <sys/types.h> 28#include <sys/types.h>
29#include <sys/stat.h> 29#include <sys/stat.h>
30#ifndef _WIN32_ 30#ifndef _WIN32_
31#include <unistd.h> 31#include <unistd.h>
32#endif 32#endif
33 33
34#include <qfile.h> 34#include <qfile.h>
35#include <qfileinfo.h> 35#include <qfileinfo.h>
36#include <qregexp.h> 36#include <qregexp.h>
37#include <qtimer.h> 37#include <qtimer.h>
38 38
39#include <kapplication.h> 39#include <kapplication.h>
40#include <kconfig.h> 40#include <kconfig.h>
41#include <kdebug.h> 41#include <kdebug.h>
42#include <klocale.h> 42#include <klocale.h>
43//US #include <ksavefile.h> 43//US #include <ksavefile.h>
44#include <kstandarddirs.h> 44#include <kstandarddirs.h>
45#include <kmessagebox.h> 45#include <kmessagebox.h>
46 46
47#include "formatfactory.h" 47#include "formatfactory.h"
48 48
49#include "resource.h" 49#include "resource.h"
50#include "resourcefileconfig.h" 50#include "resourcefileconfig.h"
51#include "stdaddressbook.h" 51#include "stdaddressbook.h"
52#define NO_DIRWATCH 52#define NO_DIRWATCH
53#include "resourcefile.h" 53#include "resourcefile.h"
54#include "syncprefwidget.h"
55 54
56//#define ALLOW_LOCKING 55//#define ALLOW_LOCKING
57 56
58 57
59 58
60using namespace KABC; 59using namespace KABC;
61 60
62extern "C" 61extern "C"
63#ifdef _WIN32_ 62#ifdef _WIN32_
64__declspec(dllexport) 63__declspec(dllexport)
65#else 64#else
66{ 65{
67#endif 66#endif
68 67
69//US void *init_kabc_file() 68//US void *init_kabc_file()
70 void *init_microkabc_file() 69 void *init_microkabc_file()
71 { 70 {
72 return new KRES::PluginFactory<ResourceFile,ResourceFileConfig, SyncPrefWidgetContainer>(); 71 return new KRES::PluginFactory<ResourceFile,ResourceFileConfig>();
73 } 72 }
74#ifndef _WIN32_ 73#ifndef _WIN32_
75} 74}
76#endif 75#endif
77 76
78ResourceFile::ResourceFile( const KConfig *config, bool syncable ) 77ResourceFile::ResourceFile( const KConfig *config )
79 : Resource( config, syncable ) , mFormat( 0 ) 78 : Resource( config ) , mFormat( 0 )
80{ 79{
81 QString fileName, formatName, default_fileName; 80 QString fileName, formatName, default_fileName;
82 81
83 if (syncable == true) 82 default_fileName = StdAddressBook::fileName();
84 default_fileName = "/home/polo/kdepim/apps/kabc/localfile.vcf";
85 else
86 default_fileName = StdAddressBook::fileName();
87 83
88 KConfig *cfg = (KConfig *)config; 84 KConfig *cfg = (KConfig *)config;
89 if ( cfg ) { 85 if ( cfg ) {
90 fileName = cfg->readEntry( "FileName", default_fileName ); 86 fileName = cfg->readEntry( "FileName", default_fileName );
91 formatName = cfg->readEntry( "FileFormat", "vcard" ); 87 formatName = cfg->readEntry( "FileFormat", "vcard" );
92 } else { 88 } else {
93 fileName = default_fileName; 89 fileName = default_fileName;
94 formatName = "vcard"; 90 formatName = "vcard";
95 } 91 }
96 92
97 init( fileName, formatName ); 93 init( fileName, formatName );
98} 94}
99 95
100ResourceFile::ResourceFile( const QString &fileName, bool syncable , 96ResourceFile::ResourceFile( const QString &fileName ,
101 const QString &formatName ) 97 const QString &formatName )
102 : Resource( 0, syncable ) 98 : Resource( 0 )
103{ 99{
104// qDebug("ResourceFile::ResourceFile : 3 %s, %s", fileName.latin1(), formatName.latin1()); 100// qDebug("ResourceFile::ResourceFile : 3 %s, %s", fileName.latin1(), formatName.latin1());
105 init( fileName, formatName ); 101 init( fileName, formatName );
106} 102}
107 103
108void ResourceFile::init( const QString &fileName, const QString &formatName ) 104void ResourceFile::init( const QString &fileName, const QString &formatName )
109{ 105{
110 mFormatName = formatName; 106 mFormatName = formatName;
111 107
112 FormatFactory *factory = FormatFactory::self(); 108 FormatFactory *factory = FormatFactory::self();
113 mFormat = factory->format( mFormatName ); 109 mFormat = factory->format( mFormatName );
114 110
115 if ( !mFormat ) { 111 if ( !mFormat ) {
116 mFormatName = "vcard"; 112 mFormatName = "vcard";
117 mFormat = factory->format( mFormatName ); 113 mFormat = factory->format( mFormatName );
118 } 114 }
119 115
120#ifndef NO_DIRWATCH 116#ifndef NO_DIRWATCH
121 connect( &mDirWatch, SIGNAL( dirty(const QString&) ), SLOT( fileChanged() ) ); 117 connect( &mDirWatch, SIGNAL( dirty(const QString&) ), SLOT( fileChanged() ) );
122 connect( &mDirWatch, SIGNAL( created(const QString&) ), SLOT( fileChanged() ) ); 118 connect( &mDirWatch, SIGNAL( created(const QString&) ), SLOT( fileChanged() ) );
123 connect( &mDirWatch, SIGNAL( deleted(const QString&) ), SLOT( fileChanged() ) ); 119 connect( &mDirWatch, SIGNAL( deleted(const QString&) ), SLOT( fileChanged() ) );
124#endif 120#endif
125 setFileName( fileName ); 121 setFileName( fileName );
126} 122}
127 123
128ResourceFile::~ResourceFile() 124ResourceFile::~ResourceFile()
129{ 125{
130 delete mFormat; 126 delete mFormat;
131 mFormat = 0; 127 mFormat = 0;
132} 128}
133 129
134void ResourceFile::writeConfig( KConfig *config ) 130void ResourceFile::writeConfig( KConfig *config )
135{ 131{
136 132
137 config->setGroup( "Resource_" + identifier() ); 133 config->setGroup( "Resource_" + identifier() );
138 Resource::writeConfig( config ); 134 Resource::writeConfig( config );
139 135
140 config->writeEntry( "FileName", mFileName ); 136 config->writeEntry( "FileName", mFileName );
141 config->writeEntry( "FileFormat", mFormatName ); 137 config->writeEntry( "FileFormat", mFormatName );
142 138
143// qDebug("ResourceFile::writeConfig format %s, %s", mFileName.latin1(), mFormatName.latin1()); 139// qDebug("ResourceFile::writeConfig format %s, %s", mFileName.latin1(), mFormatName.latin1());
144 140
145} 141}
146 142
147Ticket *ResourceFile::requestSaveTicket() 143Ticket *ResourceFile::requestSaveTicket()
148{ 144{
149 kdDebug(5700) << "ResourceFile::requestSaveTicket()" << endl; 145 kdDebug(5700) << "ResourceFile::requestSaveTicket()" << endl;
150 146
151 if ( !addressBook() ) return 0; 147 if ( !addressBook() ) return 0;
152 148
153#ifdef ALLOW_LOCKING 149#ifdef ALLOW_LOCKING
154 if ( !lock( mFileName ) ) { 150 if ( !lock( mFileName ) ) {
155 qDebug("unablt to lock file "); 151 qDebug("unablt to lock file ");
156 return 0; 152 return 0;
157 } 153 }
158#endif 154#endif
159 return createTicket( this ); 155 return createTicket( this );
160} 156}
161 157
162 158
163bool ResourceFile::doOpen() 159bool ResourceFile::doOpen()
164{ 160{
165 QFile file( mFileName ); 161 QFile file( mFileName );
166 qDebug("ResourceFile::openfile %s ", mFileName.latin1()); 162 qDebug("ResourceFile::openfile %s ", mFileName.latin1());
167 163
168 if ( !file.exists() ) { 164 if ( !file.exists() ) {
169 // try to create the file 165 // try to create the file
170 bool ok = file.open( IO_WriteOnly ); 166 bool ok = file.open( IO_WriteOnly );
171 if ( ok ) 167 if ( ok )
172 file.close(); 168 file.close();
173 169
174 return ok; 170 return ok;
175 } else { 171 } else {
176 if ( !file.open( IO_ReadWrite ) ) 172 if ( !file.open( IO_ReadWrite ) )
177 return false; 173 return false;
178 174
179 if ( file.size() == 0 ) { 175 if ( file.size() == 0 ) {
180 file.close(); 176 file.close();
181 return true; 177 return true;
182 } 178 }
183 179
184 bool ok = mFormat->checkFormat( &file ); 180 bool ok = mFormat->checkFormat( &file );
185 file.close(); 181 file.close();
186 182
187 return ok; 183 return ok;
188 } 184 }
189} 185}
190 186
191void ResourceFile::doClose() 187void ResourceFile::doClose()
192{ 188{
193} 189}
194 190
195bool ResourceFile::load() 191bool ResourceFile::load()
196{ 192{
197 193
198 QFile file( mFileName ); 194 QFile file( mFileName );
199 if ( !file.open( IO_ReadOnly ) ) { 195 if ( !file.open( IO_ReadOnly ) ) {
200 addressBook()->error( i18n( "Unable to open file '%1'." ).arg( mFileName ) ); 196 addressBook()->error( i18n( "Unable to open file '%1'." ).arg( mFileName ) );
201 return false; 197 return false;
202 } 198 }
203 199
204// qDebug("ResourceFile::load format %s, %s", mFileName.latin1(), mFormatName.latin1()); 200// qDebug("ResourceFile::load format %s, %s", mFileName.latin1(), mFormatName.latin1());
205 201
206 return mFormat->loadAll( addressBook(), this, &file ); 202 return mFormat->loadAll( addressBook(), this, &file );
207} 203}
208 204
209bool ResourceFile::save( Ticket *ticket ) 205bool ResourceFile::save( Ticket *ticket )
210{ 206{
211// qDebug("ResourceFile::save format %s, %s", mFileName.latin1(), mFormatName.latin1()); 207// qDebug("ResourceFile::save format %s, %s", mFileName.latin1(), mFormatName.latin1());
212 208
213 209
214 // create backup file 210 // create backup file
215 QString extension = "_" + QString::number( QDate::currentDate().dayOfWeek() ); 211 QString extension = "_" + QString::number( QDate::currentDate().dayOfWeek() );
216 212
217/*US we use a simpler method to create a backupfile 213/*US we use a simpler method to create a backupfile
218 214
219 (void) KSaveFile::backupFile( mFileName, QString::null 215 (void) KSaveFile::backupFile( mFileName, QString::null
220 ,extension ); 216 ,extension );
221 217
222 KSaveFile saveFile( mFileName ); 218 KSaveFile saveFile( mFileName );
223 bool ok = false; 219 bool ok = false;
224 if ( saveFile.status() == 0 && saveFile.file() ) 220 if ( saveFile.status() == 0 && saveFile.file() )
225 { 221 {
226 mFormat->saveAll( addressBook(), this, saveFile.file() ); 222 mFormat->saveAll( addressBook(), this, saveFile.file() );
227 ok = saveFile.close(); 223 ok = saveFile.close();
228 } 224 }
229*/ 225*/
230 226
231//US ToDo: write backupfile 227//US ToDo: write backupfile
232#ifndef NO_DIRWATCH 228#ifndef NO_DIRWATCH
233 mDirWatch.stopScan(); 229 mDirWatch.stopScan();
234#endif 230#endif
235 QFile info; 231 QFile info;
236 info.setName( mFileName ); 232 info.setName( mFileName );
237 bool ok = info.open( IO_WriteOnly ); 233 bool ok = info.open( IO_WriteOnly );
238 if ( ok ) { 234 if ( ok ) {
239 mFormat->saveAll( addressBook(), this, &info ); 235 mFormat->saveAll( addressBook(), this, &info );
240 236
241 info.close(); 237 info.close();
242 ok = true; 238 ok = true;
243 } 239 }
244 else { 240 else {
245 241
246 } 242 }
247 243
248 if ( !ok ) 244 if ( !ok )
249 addressBook()->error( i18n( "Unable to save file '%1'." ).arg( mFileName ) ); 245 addressBook()->error( i18n( "Unable to save file '%1'." ).arg( mFileName ) );
250#ifndef NO_DIRWATCH 246#ifndef NO_DIRWATCH
251 mDirWatch.startScan(); 247 mDirWatch.startScan();
252#endif 248#endif
253 delete ticket; 249 delete ticket;
254#ifdef ALLOW_LOCKING 250#ifdef ALLOW_LOCKING
255 unlock( mFileName ); 251 unlock( mFileName );
256#endif 252#endif
257 253
258 return ok; 254 return ok;
259} 255}
260 256
261bool ResourceFile::lock( const QString &fileName ) 257bool ResourceFile::lock( const QString &fileName )
262{ 258{
263#ifdef ALLOW_LOCKING 259#ifdef ALLOW_LOCKING
264 260
265 261
266 QString fn = fileName; 262 QString fn = fileName;
267 263
268//US change the implementation how the lockfilename is getting created 264//US change the implementation how the lockfilename is getting created
269//US fn.replace( QRegExp("/"), "_" ); 265//US fn.replace( QRegExp("/"), "_" );
270//US QString lockName = locateLocal( "data", "kabc/lock/" + fn + ".lock" ); 266//US QString lockName = locateLocal( "data", "kabc/lock/" + fn + ".lock" );
271 267
272 KURL url(fn); 268 KURL url(fn);
273 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" ); 269 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" );
274 270
275 271
276 272
277 if (QFile::exists( lockName )) return false; 273 if (QFile::exists( lockName )) return false;
278 274
279 QString lockUniqueName; 275 QString lockUniqueName;
280 lockUniqueName = fn + KApplication::randomString( 8 ); 276 lockUniqueName = fn + KApplication::randomString( 8 );
281 277
282 url = lockUniqueName; 278 url = lockUniqueName;
283//US mLockUniqueName = locateLocal( "data", "kabc/lock/" + lockUniqueName ); 279//US mLockUniqueName = locateLocal( "data", "kabc/lock/" + lockUniqueName );
284 mLockUniqueName = locateLocal( "data", "kabc/lock/" + url.fileName() ); 280 mLockUniqueName = locateLocal( "data", "kabc/lock/" + url.fileName() );
285 kdDebug(5700) << "-- lock unique name: " << mLockUniqueName << endl; 281 kdDebug(5700) << "-- lock unique name: " << mLockUniqueName << endl;
286 282
287 // Create unique file 283 // Create unique file
288 QFile file( mLockUniqueName ); 284 QFile file( mLockUniqueName );
289 file.open( IO_WriteOnly ); 285 file.open( IO_WriteOnly );
290 file.close(); 286 file.close();
291 287
292 // Create lock file 288 // Create lock file
293 int result = 0; 289 int result = 0;
294#ifndef _WIN32_ 290#ifndef _WIN32_
295 result = ::link( QFile::encodeName( mLockUniqueName ), 291 result = ::link( QFile::encodeName( mLockUniqueName ),
296 QFile::encodeName( lockName ) ); 292 QFile::encodeName( lockName ) );
297#endif 293#endif
298 if ( result == 0 ) { 294 if ( result == 0 ) {
299 addressBook()->emitAddressBookLocked(); 295 addressBook()->emitAddressBookLocked();
300 return true; 296 return true;
301 } 297 }
302 298
303 // TODO: check stat 299 // TODO: check stat
304 300
305 return false; 301 return false;
306#else 302#else
307 return true; 303 return true;
308#endif 304#endif
309} 305}
310 306
311void ResourceFile::unlock( const QString &fileName ) 307void ResourceFile::unlock( const QString &fileName )
312{ 308{
313#ifdef ALLOW_LOCKING 309#ifdef ALLOW_LOCKING
314 QString fn = fileName; 310 QString fn = fileName;
315//US change the implementation how the lockfilename is getting created 311//US change the implementation how the lockfilename is getting created
316//US fn.replace( QRegExp( "/" ), "_" ); 312//US fn.replace( QRegExp( "/" ), "_" );
317//US QString lockName = locateLocal( "data", "kabc/lock/" + fn + ".lock" ); 313//US QString lockName = locateLocal( "data", "kabc/lock/" + fn + ".lock" );
318//US QString lockName = fn + ".lock"; 314//US QString lockName = fn + ".lock";
319 KURL url(fn); 315 KURL url(fn);
320 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" ); 316 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" );
321 317
322 QFile::remove( lockName ); 318 QFile::remove( lockName );
323 QFile::remove( mLockUniqueName ); 319 QFile::remove( mLockUniqueName );
324 addressBook()->emitAddressBookUnlocked(); 320 addressBook()->emitAddressBookUnlocked();
325#else 321#else
326 return; 322 return;
327#endif 323#endif
328} 324}
329 325
330void ResourceFile::setFileName( const QString &fileName ) 326void ResourceFile::setFileName( const QString &fileName )
331{ 327{
332#ifndef NO_DIRWATCH 328#ifndef NO_DIRWATCH
333 mDirWatch.stopScan(); 329 mDirWatch.stopScan();
334 mDirWatch.removeFile( mFileName ); 330 mDirWatch.removeFile( mFileName );
335 mFileName = fileName; 331 mFileName = fileName;
336 332
337 333
338 mDirWatch.addFile( mFileName ); 334 mDirWatch.addFile( mFileName );
339 mDirWatch.startScan(); 335 mDirWatch.startScan();
340#else 336#else
341 mFileName = fileName; 337 mFileName = fileName;
342#endif 338#endif
343 339
344//US simulate KDirWatch event 340//US simulate KDirWatch event
345//US fileChanged(); 341//US fileChanged();
346} 342}
347 343
348QString ResourceFile::fileName() const 344QString ResourceFile::fileName() const
349{ 345{
350 return mFileName; 346 return mFileName;
351} 347}
352 348
353void ResourceFile::setFormat( const QString &format ) 349void ResourceFile::setFormat( const QString &format )
354{ 350{
355 mFormatName = format; 351 mFormatName = format;
356 delete mFormat; 352 delete mFormat;
357 353
358 FormatFactory *factory = FormatFactory::self(); 354 FormatFactory *factory = FormatFactory::self();
359 mFormat = factory->format( mFormatName ); 355 mFormat = factory->format( mFormatName );
360/*US 356/*US
361//qDebug("ResourceFile::setFormat initialized with format %s ", format.latin1()); 357//qDebug("ResourceFile::setFormat initialized with format %s ", format.latin1());
362 if (mFormatName == "vcard") { 358 if (mFormatName == "vcard") {
363 mFormat = new VCardFormatPlugin2(); 359 mFormat = new VCardFormatPlugin2();
364// qDebug("ResourceFile::setFormat format %s", mFormatName.latin1()); 360// qDebug("ResourceFile::setFormat format %s", mFormatName.latin1());
365 } 361 }
366 else if (mFormatName == "binary") { 362 else if (mFormatName == "binary") {
367 mFormat = new BinaryFormat(); 363 mFormat = new BinaryFormat();
368// qDebug("ResourceFile::setFormat format %s", mFormatName.latin1()); 364// qDebug("ResourceFile::setFormat format %s", mFormatName.latin1());
369 } 365 }
370 else 366 else
371 qDebug("ResourceFile::setFormat format unknown !!! %s ", format.latin1()); 367 qDebug("ResourceFile::setFormat format unknown !!! %s ", format.latin1());
372*/ 368*/
373 369
374} 370}
375 371
376QString ResourceFile::format() const 372QString ResourceFile::format() const
377{ 373{
378 return mFormatName; 374 return mFormatName;
379} 375}
380 376
381void ResourceFile::fileChanged() 377void ResourceFile::fileChanged()
382{ 378{
383 // There is a small theoretical chance that KDirWatch calls us before 379 // There is a small theoretical chance that KDirWatch calls us before
384 // we are fully constructed 380 // we are fully constructed
385 if (!addressBook()) 381 if (!addressBook())
386 return; 382 return;
387 383
388 384
389 QString text( i18n( "File resource '%1'<br> has been changed by third party.<br>Do you want to reload?").arg( mFileName ) ); 385 QString text( i18n( "File resource '%1'<br> has been changed by third party.<br>Do you want to reload?").arg( mFileName ) );
390 if ( readOnly() || KMessageBox::questionYesNo( 0, text ) == KMessageBox::Yes ) { 386 if ( readOnly() || KMessageBox::questionYesNo( 0, text ) == KMessageBox::Yes ) {
391 load(); 387 load();
392 addressBook()->emitAddressBookChanged(); 388 addressBook()->emitAddressBookChanged();
393 } 389 }
394} 390}
395 391
396void ResourceFile::removeAddressee( const Addressee &addr ) 392void ResourceFile::removeAddressee( const Addressee &addr )
397{ 393{
398 QFile::remove( QFile::encodeName( locateLocal( "data", "kabc/photos/" ) + addr.uid() ) ); 394 QFile::remove( QFile::encodeName( locateLocal( "data", "kabc/photos/" ) + addr.uid() ) );
399 QFile::remove( QFile::encodeName( locateLocal( "data", "kabc/logos/" ) + addr.uid() ) ); 395 QFile::remove( QFile::encodeName( locateLocal( "data", "kabc/logos/" ) + addr.uid() ) );
400 QFile::remove( QFile::encodeName( locateLocal( "data", "kabc/sounds/" ) + addr.uid() ) ); 396 QFile::remove( QFile::encodeName( locateLocal( "data", "kabc/sounds/" ) + addr.uid() ) );
401} 397}
402 398
403void ResourceFile::cleanUp() 399void ResourceFile::cleanUp()
404{ 400{
405 unlock( mFileName ); 401 unlock( mFileName );
406} 402}
407 403
408//US #include "resourcefile.moc" 404//US #include "resourcefile.moc"
diff --git a/kabc/plugins/file/resourcefile.h b/kabc/plugins/file/resourcefile.h
index 8339340..b4421b2 100644
--- a/kabc/plugins/file/resourcefile.h
+++ b/kabc/plugins/file/resourcefile.h
@@ -1,163 +1,163 @@
1/* 1/*
2 This file is part of libkabc. 2 This file is part of libkabc.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21/* 21/*
22Enhanced Version of the file for platform independent KDE tools. 22Enhanced Version of the file for platform independent KDE tools.
23Copyright (c) 2004 Ulf Schenk 23Copyright (c) 2004 Ulf Schenk
24 24
25$Id$ 25$Id$
26*/ 26*/
27 27
28 28
29#ifndef KABC_RESOURCEFILE_H 29#ifndef KABC_RESOURCEFILE_H
30#define KABC_RESOURCEFILE_H 30#define KABC_RESOURCEFILE_H
31 31
32#include <kconfig.h> 32#include <kconfig.h>
33#include <kdirwatch.h> 33#include <kdirwatch.h>
34 34
35#include <sys/types.h> 35#include <sys/types.h>
36 36
37#include <resource.h> 37#include <resource.h>
38 38
39class QTimer; 39class QTimer;
40class FormatPlugin; 40class FormatPlugin;
41 41
42namespace KABC { 42namespace KABC {
43 43
44//US class FormatPlugin; 44//US class FormatPlugin;
45class ResourceConfigWidget; 45class ResourceConfigWidget;
46 46
47/** 47/**
48 @internal 48 @internal
49*/ 49*/
50class ResourceFile : public Resource 50class ResourceFile : public Resource
51{ 51{
52 Q_OBJECT 52 Q_OBJECT
53 53
54public: 54public:
55 55
56 /** 56 /**
57 Constructor. 57 Constructor.
58 58
59 @param cfg The config object where custom resource settings are stored. 59 @param cfg The config object where custom resource settings are stored.
60 */ 60 */
61 ResourceFile( const KConfig *cfg, bool syncable ); 61 ResourceFile( const KConfig *cfg );
62 62
63 /** 63 /**
64 Construct file resource on file @arg fileName using format @arg formatName. 64 Construct file resource on file @arg fileName using format @arg formatName.
65 */ 65 */
66 ResourceFile( const QString &fileName, bool syncable , const QString &formatName = "vcard" ); 66 ResourceFile( const QString &fileName , const QString &formatName = "vcard" );
67 67
68 /** 68 /**
69 * Destructor. 69 * Destructor.
70 */ 70 */
71 ~ResourceFile(); 71 ~ResourceFile();
72 72
73 /** 73 /**
74 Writes the config back. 74 Writes the config back.
75 */ 75 */
76 virtual void writeConfig( KConfig *cfg ); 76 virtual void writeConfig( KConfig *cfg );
77 77
78 /** 78 /**
79 * Tries to open the file and checks for the proper format. 79 * Tries to open the file and checks for the proper format.
80 * This method should be called before @ref load(). 80 * This method should be called before @ref load().
81 */ 81 */
82 virtual bool doOpen(); 82 virtual bool doOpen();
83 83
84 /** 84 /**
85 * Closes the file again. 85 * Closes the file again.
86 */ 86 */
87 virtual void doClose(); 87 virtual void doClose();
88 88
89 /** 89 /**
90 * Requests a save ticket, that is used by @ref save() 90 * Requests a save ticket, that is used by @ref save()
91 */ 91 */
92 virtual Ticket *requestSaveTicket(); 92 virtual Ticket *requestSaveTicket();
93 93
94 /** 94 /**
95 * Loads all addressees from file to the address book. 95 * Loads all addressees from file to the address book.
96 * Returns true if all addressees could be loaded otherwise false. 96 * Returns true if all addressees could be loaded otherwise false.
97 */ 97 */
98 virtual bool load(); 98 virtual bool load();
99 99
100 /** 100 /**
101 * Saves all addresses from address book to file. 101 * Saves all addresses from address book to file.
102 * Returns true if all addressees could be saved otherwise false. 102 * Returns true if all addressees could be saved otherwise false.
103 * 103 *
104 * @param ticket The ticket returned by @ref requestSaveTicket() 104 * @param ticket The ticket returned by @ref requestSaveTicket()
105 */ 105 */
106 virtual bool save( Ticket *ticket ); 106 virtual bool save( Ticket *ticket );
107 107
108 /** 108 /**
109 * Set name of file to be used for saving. 109 * Set name of file to be used for saving.
110 */ 110 */
111 void setFileName( const QString & ); 111 void setFileName( const QString & );
112 112
113 /** 113 /**
114 * Return name of file used for loading and saving the address book. 114 * Return name of file used for loading and saving the address book.
115 */ 115 */
116 QString fileName() const; 116 QString fileName() const;
117 117
118 /** 118 /**
119 Sets a new format by name. 119 Sets a new format by name.
120 */ 120 */
121 void setFormat( const QString &name ); 121 void setFormat( const QString &name );
122 122
123 /** 123 /**
124 Returns the format name. 124 Returns the format name.
125 */ 125 */
126 QString format() const; 126 QString format() const;
127 127
128 /** 128 /**
129 * Remove a addressee from its source. 129 * Remove a addressee from its source.
130 * This method is mainly called by KABC::AddressBook. 130 * This method is mainly called by KABC::AddressBook.
131 */ 131 */
132 virtual void removeAddressee( const Addressee& addr ); 132 virtual void removeAddressee( const Addressee& addr );
133 133
134 /** 134 /**
135 * This method is called by an error handler if the application 135 * This method is called by an error handler if the application
136 * crashed 136 * crashed
137 */ 137 */
138 virtual void cleanUp(); 138 virtual void cleanUp();
139 139
140protected slots: 140protected slots:
141 void fileChanged(); 141 void fileChanged();
142 142
143protected: 143protected:
144 void init( const QString &fileName, const QString &format ); 144 void init( const QString &fileName, const QString &format );
145 145
146 bool lock( const QString &fileName ); 146 bool lock( const QString &fileName );
147 void unlock( const QString &fileName ); 147 void unlock( const QString &fileName );
148 148
149private: 149private:
150 QString mFileName; 150 QString mFileName;
151 QString mFormatName; 151 QString mFormatName;
152 152
153 FormatPlugin *mFormat; 153 FormatPlugin *mFormat;
154 154
155 QString mLockUniqueName; 155 QString mLockUniqueName;
156#ifndef NO_DIRWATCH 156#ifndef NO_DIRWATCH
157 KDirWatch mDirWatch; 157 KDirWatch mDirWatch;
158#endif 158#endif
159}; 159};
160 160
161} 161}
162 162
163#endif 163#endif
diff --git a/kabc/plugins/ldap/resourceldap.cpp b/kabc/plugins/ldap/resourceldap.cpp
index 17f115d..55c43af 100644
--- a/kabc/plugins/ldap/resourceldap.cpp
+++ b/kabc/plugins/ldap/resourceldap.cpp
@@ -1,445 +1,444 @@
1/* 1/*
2 This file is part of libkabc. 2 This file is part of libkabc.
3 Copyright (c) 2002 Tobias Koenig <tokoe@kde.org> 3 Copyright (c) 2002 Tobias Koenig <tokoe@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21/* 21/*
22Enhanced Version of the file for platform independent KDE tools. 22Enhanced Version of the file for platform independent KDE tools.
23Copyright (c) 2004 Ulf Schenk 23Copyright (c) 2004 Ulf Schenk
24 24
25$Id$ 25$Id$
26*/ 26*/
27 27
28#include <kdebug.h> 28#include <kdebug.h>
29#include <kglobal.h> 29#include <kglobal.h>
30#include <klineedit.h> 30#include <klineedit.h>
31#include <klocale.h> 31#include <klocale.h>
32#include <kconfig.h> 32#include <kconfig.h>
33#include <kstringhandler.h> 33#include <kstringhandler.h>
34 34
35#include <stdlib.h> 35#include <stdlib.h>
36 36
37#include "resourceldap.h" 37#include "resourceldap.h"
38#include "resourceldapconfig.h" 38#include "resourceldapconfig.h"
39#include "syncprefwidget.h"
40 39
41using namespace KABC; 40using namespace KABC;
42 41
43extern "C" 42extern "C"
44{ 43{
45//US void *init_kabc_ldap() 44//US void *init_kabc_ldap()
46 void *init_microkabc_ldap() 45 void *init_microkabc_ldap()
47 { 46 {
48 return new KRES::PluginFactory<ResourceLDAP,ResourceLDAPConfig, SyncPrefWidgetContainer>(); 47 return new KRES::PluginFactory<ResourceLDAP,ResourceLDAPConfig>();
49 } 48 }
50} 49}
51 50
52void addModOp( LDAPMod ***pmods, const QString &attr, const QString &value ); 51void addModOp( LDAPMod ***pmods, const QString &attr, const QString &value );
53 52
54 53
55ResourceLDAP::ResourceLDAP( const KConfig *config, bool syncable ) 54ResourceLDAP::ResourceLDAP( const KConfig *config )
56 : Resource( config, syncable ), mPort( 389 ), mLdap( 0 ) 55 : Resource( config ), mPort( 389 ), mLdap( 0 )
57{ 56{
58 KConfig *cfg = (KConfig *)config; 57 KConfig *cfg = (KConfig *)config;
59 if ( cfg ) { 58 if ( cfg ) {
60 mUser = cfg->readEntry( "LdapUser" ); 59 mUser = cfg->readEntry( "LdapUser" );
61 mPassword = KStringHandler::obscure( cfg->readEntry( "LdapPassword" ) ); 60 mPassword = KStringHandler::obscure( cfg->readEntry( "LdapPassword" ) );
62 mDn = cfg->readEntry( "LdapDn" ); 61 mDn = cfg->readEntry( "LdapDn" );
63 mHost = cfg->readEntry( "LdapHost" ); 62 mHost = cfg->readEntry( "LdapHost" );
64 mPort = cfg->readNumEntry( "LdapPort", 389 ); 63 mPort = cfg->readNumEntry( "LdapPort", 389 );
65 mFilter = cfg->readEntry( "LdapFilter" ); 64 mFilter = cfg->readEntry( "LdapFilter" );
66 mAnonymous = cfg->readBoolEntry( "LdapAnonymous" ); 65 mAnonymous = cfg->readBoolEntry( "LdapAnonymous" );
67 66
68 QStringList attributes = cfg->readListEntry( "LdapAttributes" ); 67 QStringList attributes = cfg->readListEntry( "LdapAttributes" );
69 for ( uint pos = 0; pos < attributes.count(); pos += 2 ) 68 for ( uint pos = 0; pos < attributes.count(); pos += 2 )
70 mAttributes.insert( attributes[ pos ], attributes[ pos + 1 ] ); 69 mAttributes.insert( attributes[ pos ], attributes[ pos + 1 ] );
71 } 70 }
72 71
73 /** 72 /**
74 If you want to add new attributes, append them here, add a 73 If you want to add new attributes, append them here, add a
75 translation string in the ctor of AttributesDialog and 74 translation string in the ctor of AttributesDialog and
76 handle them in the load() method below. 75 handle them in the load() method below.
77 These are the default values from 76 These are the default values from
78 */ 77 */
79 if ( mAttributes.count() == 0 ) { 78 if ( mAttributes.count() == 0 ) {
80 mAttributes.insert( "commonName", "cn" ); 79 mAttributes.insert( "commonName", "cn" );
81 mAttributes.insert( "formattedName", "displayName" ); 80 mAttributes.insert( "formattedName", "displayName" );
82 mAttributes.insert( "familyName", "sn" ); 81 mAttributes.insert( "familyName", "sn" );
83 mAttributes.insert( "givenName", "givenName" ); 82 mAttributes.insert( "givenName", "givenName" );
84 mAttributes.insert( "mail", "mail" ); 83 mAttributes.insert( "mail", "mail" );
85 mAttributes.insert( "mailAlias", "" ); 84 mAttributes.insert( "mailAlias", "" );
86 mAttributes.insert( "phoneNumber", "telephoneNumber" ); 85 mAttributes.insert( "phoneNumber", "telephoneNumber" );
87 mAttributes.insert( "uid", "uid" ); 86 mAttributes.insert( "uid", "uid" );
88 } 87 }
89} 88}
90 89
91void ResourceLDAP::writeConfig( KConfig *config ) 90void ResourceLDAP::writeConfig( KConfig *config )
92{ 91{
93 Resource::writeConfig( config ); 92 Resource::writeConfig( config );
94 93
95 config->writeEntry( "LdapUser", mUser ); 94 config->writeEntry( "LdapUser", mUser );
96 config->writeEntry( "LdapPassword", KStringHandler::obscure( mPassword ) ); 95 config->writeEntry( "LdapPassword", KStringHandler::obscure( mPassword ) );
97 config->writeEntry( "LdapDn", mDn ); 96 config->writeEntry( "LdapDn", mDn );
98 config->writeEntry( "LdapHost", mHost ); 97 config->writeEntry( "LdapHost", mHost );
99 config->writeEntry( "LdapPort", mPort ); 98 config->writeEntry( "LdapPort", mPort );
100 config->writeEntry( "LdapFilter", mFilter ); 99 config->writeEntry( "LdapFilter", mFilter );
101 config->writeEntry( "LdapAnonymous", mAnonymous ); 100 config->writeEntry( "LdapAnonymous", mAnonymous );
102 101
103 QStringList attributes; 102 QStringList attributes;
104 QMap<QString, QString>::Iterator it; 103 QMap<QString, QString>::Iterator it;
105 for ( it = mAttributes.begin(); it != mAttributes.end(); ++it ) 104 for ( it = mAttributes.begin(); it != mAttributes.end(); ++it )
106 attributes << it.key() << it.data(); 105 attributes << it.key() << it.data();
107 106
108 config->writeEntry( "LdapAttributes", attributes ); 107 config->writeEntry( "LdapAttributes", attributes );
109} 108}
110 109
111Ticket *ResourceLDAP::requestSaveTicket() 110Ticket *ResourceLDAP::requestSaveTicket()
112{ 111{
113 if ( !addressBook() ) { 112 if ( !addressBook() ) {
114 kdDebug(5700) << "no addressbook" << endl; 113 kdDebug(5700) << "no addressbook" << endl;
115 return 0; 114 return 0;
116 } 115 }
117 116
118 return createTicket( this ); 117 return createTicket( this );
119} 118}
120 119
121bool ResourceLDAP::doOpen() 120bool ResourceLDAP::doOpen()
122{ 121{
123 if ( mLdap ) 122 if ( mLdap )
124 return false; 123 return false;
125 124
126 if ( !mPort ) 125 if ( !mPort )
127 mPort = 389; 126 mPort = 389;
128 127
129 mLdap = ldap_init( mHost.local8Bit(), mPort ); 128 mLdap = ldap_init( mHost.local8Bit(), mPort );
130 if ( !mLdap ) { 129 if ( !mLdap ) {
131 addressBook()->error( i18n( "Unable to connect to server '%1' on port '%2'" ).arg( mHost ).arg( mPort ) ); 130 addressBook()->error( i18n( "Unable to connect to server '%1' on port '%2'" ).arg( mHost ).arg( mPort ) );
132 return false; 131 return false;
133 } 132 }
134 133
135 if ( !mUser.isEmpty() && !mAnonymous ) { 134 if ( !mUser.isEmpty() && !mAnonymous ) {
136 if ( ldap_simple_bind_s( mLdap, mUser.local8Bit(), mPassword.local8Bit() ) != LDAP_SUCCESS ) { 135 if ( ldap_simple_bind_s( mLdap, mUser.local8Bit(), mPassword.local8Bit() ) != LDAP_SUCCESS ) {
137 addressBook()->error( i18n( "Unable to bind to server '%1'" ).arg( mHost ) ); 136 addressBook()->error( i18n( "Unable to bind to server '%1'" ).arg( mHost ) );
138 return false; 137 return false;
139 } 138 }
140 139
141 kdDebug(5700) << "ResourceLDAP: bind to server successfully" << endl; 140 kdDebug(5700) << "ResourceLDAP: bind to server successfully" << endl;
142 } else { 141 } else {
143 if ( ldap_simple_bind_s( mLdap, NULL, NULL ) != LDAP_SUCCESS ) { 142 if ( ldap_simple_bind_s( mLdap, NULL, NULL ) != LDAP_SUCCESS ) {
144 addressBook()->error( i18n( "Unable to bind anonymously to server '%1'" ).arg( mHost ) ); 143 addressBook()->error( i18n( "Unable to bind anonymously to server '%1'" ).arg( mHost ) );
145 return false; 144 return false;
146 } 145 }
147 146
148 kdDebug( 5700 ) << "ResourceLDAP: bind anonymously to server successfully" << endl; 147 kdDebug( 5700 ) << "ResourceLDAP: bind anonymously to server successfully" << endl;
149 } 148 }
150 149
151 int deref = LDAP_DEREF_ALWAYS; 150 int deref = LDAP_DEREF_ALWAYS;
152 if ( ldap_set_option( mLdap, LDAP_OPT_DEREF, (void *) &deref ) != LDAP_OPT_SUCCESS ) { 151 if ( ldap_set_option( mLdap, LDAP_OPT_DEREF, (void *) &deref ) != LDAP_OPT_SUCCESS ) {
153 kdDebug(5700) << "ResourceLDAP: can't set 'deref' option" << endl; 152 kdDebug(5700) << "ResourceLDAP: can't set 'deref' option" << endl;
154 return false; 153 return false;
155 } 154 }
156 155
157 if ( ldap_set_option( mLdap, LDAP_OPT_REFERRALS, LDAP_OPT_ON ) != LDAP_OPT_SUCCESS ) { 156 if ( ldap_set_option( mLdap, LDAP_OPT_REFERRALS, LDAP_OPT_ON ) != LDAP_OPT_SUCCESS ) {
158 kdDebug(5700) << "ResourceLDAP: can't set 'referrals' option" << endl; 157 kdDebug(5700) << "ResourceLDAP: can't set 'referrals' option" << endl;
159 return false; 158 return false;
160 } 159 }
161 160
162 return true; 161 return true;
163} 162}
164 163
165void ResourceLDAP::doClose() 164void ResourceLDAP::doClose()
166{ 165{
167 if ( ldap_unbind_s( mLdap ) != LDAP_SUCCESS ) { 166 if ( ldap_unbind_s( mLdap ) != LDAP_SUCCESS ) {
168 kdDebug(5700) << "ResourceLDAP: can't unbind from server" << endl; 167 kdDebug(5700) << "ResourceLDAP: can't unbind from server" << endl;
169 return; 168 return;
170 } 169 }
171 170
172 mLdap = 0; 171 mLdap = 0;
173} 172}
174 173
175bool ResourceLDAP::load() 174bool ResourceLDAP::load()
176{ 175{
177 LDAPMessage *res; 176 LDAPMessage *res;
178 LDAPMessage *msg; 177 LDAPMessage *msg;
179 BerElement *track; 178 BerElement *track;
180 char *names; 179 char *names;
181 char **values; 180 char **values;
182 181
183 char **LdapSearchAttr = new char*[ mAttributes.count() + 1 ]; 182 char **LdapSearchAttr = new char*[ mAttributes.count() + 1 ];
184 183
185 QMap<QString, QString>::Iterator it; 184 QMap<QString, QString>::Iterator it;
186 int i = 0; 185 int i = 0;
187 for ( it = mAttributes.begin(); it != mAttributes.end(); ++it ) { 186 for ( it = mAttributes.begin(); it != mAttributes.end(); ++it ) {
188 if ( !it.data().isEmpty() ) { 187 if ( !it.data().isEmpty() ) {
189 unsigned int len = it.data().utf8().length(); 188 unsigned int len = it.data().utf8().length();
190 LdapSearchAttr[ i ] = new char[ len+1 ]; 189 LdapSearchAttr[ i ] = new char[ len+1 ];
191 memcpy( LdapSearchAttr[ i ], it.data().utf8(), len ); 190 memcpy( LdapSearchAttr[ i ], it.data().utf8(), len );
192 LdapSearchAttr[ i ][ len ] = 0; 191 LdapSearchAttr[ i ][ len ] = 0;
193 ++i; 192 ++i;
194 } 193 }
195 } 194 }
196 LdapSearchAttr[ i ] = 0; 195 LdapSearchAttr[ i ] = 0;
197 196
198 QString filter = mFilter; 197 QString filter = mFilter;
199 if ( filter.isEmpty() ) 198 if ( filter.isEmpty() )
200 filter = "cn=*"; 199 filter = "cn=*";
201 200
202 int result; 201 int result;
203 if ( ( result = ldap_search_s( mLdap, mDn.local8Bit(), LDAP_SCOPE_SUBTREE, QString( "(%1)" ).arg( filter ).local8Bit(), 202 if ( ( result = ldap_search_s( mLdap, mDn.local8Bit(), LDAP_SCOPE_SUBTREE, QString( "(%1)" ).arg( filter ).local8Bit(),
204 LdapSearchAttr, 0, &res ) != LDAP_SUCCESS ) ) { 203 LdapSearchAttr, 0, &res ) != LDAP_SUCCESS ) ) {
205 addressBook()->error( i18n( "Unable to search on server '%1': %2" ) 204 addressBook()->error( i18n( "Unable to search on server '%1': %2" )
206 .arg( mHost ) 205 .arg( mHost )
207 .arg( ldap_err2string( result ) ) ); 206 .arg( ldap_err2string( result ) ) );
208 207
209 for ( i = 0; LdapSearchAttr[ i ]; ++i ) 208 for ( i = 0; LdapSearchAttr[ i ]; ++i )
210 delete [] LdapSearchAttr[ i ]; 209 delete [] LdapSearchAttr[ i ];
211 delete [] LdapSearchAttr; 210 delete [] LdapSearchAttr;
212 211
213 return false; 212 return false;
214 } 213 }
215 214
216 for ( msg = ldap_first_entry( mLdap, res ); msg; msg = ldap_next_entry( mLdap, msg ) ) { 215 for ( msg = ldap_first_entry( mLdap, res ); msg; msg = ldap_next_entry( mLdap, msg ) ) {
217 Addressee addr; 216 Addressee addr;
218 addr.setResource( this ); 217 addr.setResource( this );
219 for ( names = ldap_first_attribute( mLdap, msg, &track ); names; names = ldap_next_attribute( mLdap, msg, track ) ) { 218 for ( names = ldap_first_attribute( mLdap, msg, &track ); names; names = ldap_next_attribute( mLdap, msg, track ) ) {
220 values = ldap_get_values( mLdap, msg, names ); 219 values = ldap_get_values( mLdap, msg, names );
221 for ( int i = 0; i < ldap_count_values( values ); ++i ) { 220 for ( int i = 0; i < ldap_count_values( values ); ++i ) {
222 QString name = QString::fromUtf8( names ).lower(); 221 QString name = QString::fromUtf8( names ).lower();
223 QString value = QString::fromUtf8( values[ i ] ); 222 QString value = QString::fromUtf8( values[ i ] );
224 223
225 if ( name == mAttributes[ "commonName" ].lower() ) { 224 if ( name == mAttributes[ "commonName" ].lower() ) {
226 if ( !addr.formattedName().isEmpty() ) { 225 if ( !addr.formattedName().isEmpty() ) {
227 QString fn = addr.formattedName(); 226 QString fn = addr.formattedName();
228 addr.setNameFromString( value ); 227 addr.setNameFromString( value );
229 addr.setFormattedName( fn ); 228 addr.setFormattedName( fn );
230 } else 229 } else
231 addr.setNameFromString( value ); 230 addr.setNameFromString( value );
232 } else if ( name == mAttributes[ "formattedName" ].lower() ) { 231 } else if ( name == mAttributes[ "formattedName" ].lower() ) {
233 addr.setFormattedName( value ); 232 addr.setFormattedName( value );
234 } else if ( name == mAttributes[ "givenName" ].lower() ) { 233 } else if ( name == mAttributes[ "givenName" ].lower() ) {
235 addr.setGivenName( value ); 234 addr.setGivenName( value );
236 } else if ( name == mAttributes[ "mail" ].lower() ) { 235 } else if ( name == mAttributes[ "mail" ].lower() ) {
237 addr.insertEmail( value, true ); 236 addr.insertEmail( value, true );
238 } else if ( name == mAttributes[ "mailAlias" ].lower() ) { 237 } else if ( name == mAttributes[ "mailAlias" ].lower() ) {
239 addr.insertEmail( value, false ); 238 addr.insertEmail( value, false );
240 } else if ( name == mAttributes[ "phoneNumber" ].lower() ) { 239 } else if ( name == mAttributes[ "phoneNumber" ].lower() ) {
241 PhoneNumber phone; 240 PhoneNumber phone;
242 phone.setNumber( value ); 241 phone.setNumber( value );
243 addr.insertPhoneNumber( phone ); 242 addr.insertPhoneNumber( phone );
244 break; // read only the home number 243 break; // read only the home number
245 } else if ( name == mAttributes[ "familyName" ].lower() ) { 244 } else if ( name == mAttributes[ "familyName" ].lower() ) {
246 addr.setFamilyName( value ); 245 addr.setFamilyName( value );
247 } else if ( name == mAttributes[ "uid" ].lower() ) { 246 } else if ( name == mAttributes[ "uid" ].lower() ) {
248 addr.setUid( value ); 247 addr.setUid( value );
249 } 248 }
250 } 249 }
251 ldap_value_free( values ); 250 ldap_value_free( values );
252 } 251 }
253 ber_free( track, 0 ); 252 ber_free( track, 0 );
254 253
255 addressBook()->insertAddressee( addr ); 254 addressBook()->insertAddressee( addr );
256 } 255 }
257 256
258 ldap_msgfree( res ); 257 ldap_msgfree( res );
259 258
260 for ( i = 0; LdapSearchAttr[ i ]; ++i ) 259 for ( i = 0; LdapSearchAttr[ i ]; ++i )
261 delete [] LdapSearchAttr[ i ]; 260 delete [] LdapSearchAttr[ i ];
262 delete [] LdapSearchAttr; 261 delete [] LdapSearchAttr;
263 262
264 return true; 263 return true;
265} 264}
266 265
267bool ResourceLDAP::save( Ticket * ) 266bool ResourceLDAP::save( Ticket * )
268{ 267{
269 AddressBook::Iterator it; 268 AddressBook::Iterator it;
270 for ( it = addressBook()->begin(); it != addressBook()->end(); ++it ) { 269 for ( it = addressBook()->begin(); it != addressBook()->end(); ++it ) {
271 if ( (*it).resource() == this && (*it).changed() ) { 270 if ( (*it).resource() == this && (*it).changed() ) {
272 LDAPMod **mods = NULL; 271 LDAPMod **mods = NULL;
273 272
274 addModOp( &mods, "objectClass", "organizationalPerson" ); 273 addModOp( &mods, "objectClass", "organizationalPerson" );
275 addModOp( &mods, "objectClass", "person" ); 274 addModOp( &mods, "objectClass", "person" );
276 addModOp( &mods, "objectClass", "Top" ); 275 addModOp( &mods, "objectClass", "Top" );
277 addModOp( &mods, mAttributes[ "commonName" ].utf8(), (*it).assembledName() ); 276 addModOp( &mods, mAttributes[ "commonName" ].utf8(), (*it).assembledName() );
278 addModOp( &mods, mAttributes[ "formattedName" ].utf8(), (*it).formattedName() ); 277 addModOp( &mods, mAttributes[ "formattedName" ].utf8(), (*it).formattedName() );
279 addModOp( &mods, mAttributes[ "givenName" ].utf8(), (*it).givenName() ); 278 addModOp( &mods, mAttributes[ "givenName" ].utf8(), (*it).givenName() );
280 addModOp( &mods, mAttributes[ "familyName" ].utf8(), (*it).familyName() ); 279 addModOp( &mods, mAttributes[ "familyName" ].utf8(), (*it).familyName() );
281 addModOp( &mods, mAttributes[ "uid" ].utf8(), (*it).uid() ); 280 addModOp( &mods, mAttributes[ "uid" ].utf8(), (*it).uid() );
282 281
283 QStringList emails = (*it).emails(); 282 QStringList emails = (*it).emails();
284 QStringList::ConstIterator mailIt; 283 QStringList::ConstIterator mailIt;
285 bool first = true; 284 bool first = true;
286 for ( mailIt = emails.begin(); mailIt != emails.end(); ++mailIt ) { 285 for ( mailIt = emails.begin(); mailIt != emails.end(); ++mailIt ) {
287 if ( first ) { 286 if ( first ) {
288 addModOp( &mods, mAttributes[ "mail" ].utf8(), (*mailIt) ); 287 addModOp( &mods, mAttributes[ "mail" ].utf8(), (*mailIt) );
289 first = false; 288 first = false;
290 } else 289 } else
291 addModOp( &mods, mAttributes[ "mailAlias" ].utf8(), (*mailIt) ); 290 addModOp( &mods, mAttributes[ "mailAlias" ].utf8(), (*mailIt) );
292 } 291 }
293 292
294 PhoneNumber number = (*it).phoneNumber( PhoneNumber::Home ); 293 PhoneNumber number = (*it).phoneNumber( PhoneNumber::Home );
295 addModOp( &mods, mAttributes[ "phoneNumber" ].utf8(), number.number() ); 294 addModOp( &mods, mAttributes[ "phoneNumber" ].utf8(), number.number() );
296 295
297 QString dn = "cn=" + (*it).assembledName() + "," + mDn; 296 QString dn = "cn=" + (*it).assembledName() + "," + mDn;
298 297
299 int retval; 298 int retval;
300 if ( (retval = ldap_add_s( mLdap, dn.local8Bit(), mods )) != LDAP_SUCCESS ) 299 if ( (retval = ldap_add_s( mLdap, dn.local8Bit(), mods )) != LDAP_SUCCESS )
301 addressBook()->error( i18n( "Unable to modify '%1' on server '%2'" ).arg( (*it).uid() ).arg( mHost ) ); 300 addressBook()->error( i18n( "Unable to modify '%1' on server '%2'" ).arg( (*it).uid() ).arg( mHost ) );
302 301
303 ldap_mods_free( mods, 1 ); 302 ldap_mods_free( mods, 1 );
304 303
305 // mark as unchanged 304 // mark as unchanged
306 (*it).setChanged( false ); 305 (*it).setChanged( false );
307 } 306 }
308 } 307 }
309 308
310 return true; 309 return true;
311} 310}
312 311
313void ResourceLDAP::removeAddressee( const Addressee &addr ) 312void ResourceLDAP::removeAddressee( const Addressee &addr )
314{ 313{
315 LDAPMessage *res; 314 LDAPMessage *res;
316 LDAPMessage *msg; 315 LDAPMessage *msg;
317 316
318 QString filter = QString( "(&(uid=%1)(%2))" ).arg( addr.uid() ).arg( mFilter ); 317 QString filter = QString( "(&(uid=%1)(%2))" ).arg( addr.uid() ).arg( mFilter );
319 318
320 kdDebug(5700) << "ldap:removeAddressee" << filter << endl; 319 kdDebug(5700) << "ldap:removeAddressee" << filter << endl;
321 320
322 ldap_search_s( mLdap, mDn.local8Bit(), LDAP_SCOPE_SUBTREE, filter.local8Bit(), 321 ldap_search_s( mLdap, mDn.local8Bit(), LDAP_SCOPE_SUBTREE, filter.local8Bit(),
323 0, 0, &res ); 322 0, 0, &res );
324 323
325 for ( msg = ldap_first_entry( mLdap, res ); msg; msg = ldap_next_entry( mLdap, msg ) ) { 324 for ( msg = ldap_first_entry( mLdap, res ); msg; msg = ldap_next_entry( mLdap, msg ) ) {
326 char *dn = ldap_get_dn( mLdap, msg ); 325 char *dn = ldap_get_dn( mLdap, msg );
327 kdDebug(5700) << "found " << dn << endl; 326 kdDebug(5700) << "found " << dn << endl;
328 if ( ldap_delete_s( mLdap, dn ) != LDAP_SUCCESS ) 327 if ( ldap_delete_s( mLdap, dn ) != LDAP_SUCCESS )
329 addressBook()->error( i18n( "Unable to delete '%1' on server '%2'" ).arg( dn ).arg( mHost ) ); 328 addressBook()->error( i18n( "Unable to delete '%1' on server '%2'" ).arg( dn ).arg( mHost ) );
330 ldap_memfree( dn ); 329 ldap_memfree( dn );
331 } 330 }
332 331
333 ldap_msgfree( res ); 332 ldap_msgfree( res );
334} 333}
335 334
336void ResourceLDAP::setUser( const QString &user ) 335void ResourceLDAP::setUser( const QString &user )
337{ 336{
338 mUser = user; 337 mUser = user;
339} 338}
340 339
341QString ResourceLDAP::user() const 340QString ResourceLDAP::user() const
342{ 341{
343 return mUser; 342 return mUser;
344} 343}
345 344
346void ResourceLDAP::setPassword( const QString &password ) 345void ResourceLDAP::setPassword( const QString &password )
347{ 346{
348 mPassword = password; 347 mPassword = password;
349} 348}
350 349
351QString ResourceLDAP::password() const 350QString ResourceLDAP::password() const
352{ 351{
353 return mPassword; 352 return mPassword;
354} 353}
355 354
356void ResourceLDAP::setDn( const QString &dn ) 355void ResourceLDAP::setDn( const QString &dn )
357{ 356{
358 mDn = dn; 357 mDn = dn;
359} 358}
360 359
361QString ResourceLDAP::dn() const 360QString ResourceLDAP::dn() const
362{ 361{
363 return mDn; 362 return mDn;
364} 363}
365 364
366void ResourceLDAP::setHost( const QString &host ) 365void ResourceLDAP::setHost( const QString &host )
367{ 366{
368 mHost = host; 367 mHost = host;
369} 368}
370 369
371QString ResourceLDAP::host() const 370QString ResourceLDAP::host() const
372{ 371{
373 return mHost; 372 return mHost;
374} 373}
375 374
376void ResourceLDAP::setPort( int port ) 375void ResourceLDAP::setPort( int port )
377{ 376{
378 mPort = port; 377 mPort = port;
379} 378}
380 379
381int ResourceLDAP::port() const 380int ResourceLDAP::port() const
382{ 381{
383 return mPort; 382 return mPort;
384} 383}
385 384
386void ResourceLDAP::setFilter( const QString &filter ) 385void ResourceLDAP::setFilter( const QString &filter )
387{ 386{
388 mFilter = filter; 387 mFilter = filter;
389} 388}
390 389
391QString ResourceLDAP::filter() const 390QString ResourceLDAP::filter() const
392{ 391{
393 return mFilter; 392 return mFilter;
394} 393}
395 394
396void ResourceLDAP::setIsAnonymous( bool value ) 395void ResourceLDAP::setIsAnonymous( bool value )
397{ 396{
398 mAnonymous = value; 397 mAnonymous = value;
399} 398}
400 399
401bool ResourceLDAP::isAnonymous() const 400bool ResourceLDAP::isAnonymous() const
402{ 401{
403 return mAnonymous; 402 return mAnonymous;
404} 403}
405 404
406void ResourceLDAP::setAttributes( const QMap<QString, QString> &attributes ) 405void ResourceLDAP::setAttributes( const QMap<QString, QString> &attributes )
407{ 406{
408 mAttributes = attributes; 407 mAttributes = attributes;
409} 408}
410 409
411QMap<QString, QString> ResourceLDAP::attributes() const 410QMap<QString, QString> ResourceLDAP::attributes() const
412{ 411{
413 return mAttributes; 412 return mAttributes;
414} 413}
415 414
416void addModOp( LDAPMod ***pmods, const QString &attr, const QString &value ) 415void addModOp( LDAPMod ***pmods, const QString &attr, const QString &value )
417{ 416{
418 if ( value.isNull() ) 417 if ( value.isNull() )
419 return; 418 return;
420 419
421 LDAPMod**mods; 420 LDAPMod**mods;
422 421
423 mods = *pmods; 422 mods = *pmods;
424 423
425 uint i = 0; 424 uint i = 0;
426 if ( mods != 0 ) 425 if ( mods != 0 )
427 for ( ; mods[ i ] != 0; ++i ); 426 for ( ; mods[ i ] != 0; ++i );
428 427
429 if (( mods = (LDAPMod **)realloc( mods, (i + 2) * sizeof( LDAPMod * ))) == 0 ) { 428 if (( mods = (LDAPMod **)realloc( mods, (i + 2) * sizeof( LDAPMod * ))) == 0 ) {
430 kdError() << "ResourceLDAP: realloc" << endl; 429 kdError() << "ResourceLDAP: realloc" << endl;
431 return; 430 return;
432 } 431 }
433 432
434 *pmods = mods; 433 *pmods = mods;
435 mods[ i + 1 ] = 0; 434 mods[ i + 1 ] = 0;
436 435
437 mods[ i ] = new LDAPMod; 436 mods[ i ] = new LDAPMod;
438 437
439 mods[ i ]->mod_op = 0; 438 mods[ i ]->mod_op = 0;
440 mods[ i ]->mod_type = strdup( attr.utf8() ); 439 mods[ i ]->mod_type = strdup( attr.utf8() );
441 mods[ i ]->mod_values = new char*[ 2 ]; 440 mods[ i ]->mod_values = new char*[ 2 ];
442 mods[ i ]->mod_values[ 0 ] = strdup( value.utf8() ); 441 mods[ i ]->mod_values[ 0 ] = strdup( value.utf8() );
443 mods[ i ]->mod_values[ 1 ] = 0; 442 mods[ i ]->mod_values[ 1 ] = 0;
444} 443}
445 444
diff --git a/kabc/plugins/ldap/resourceldap.h b/kabc/plugins/ldap/resourceldap.h
index 0aad3c1..0625f30 100644
--- a/kabc/plugins/ldap/resourceldap.h
+++ b/kabc/plugins/ldap/resourceldap.h
@@ -1,99 +1,99 @@
1/* 1/*
2 This file is part of libkabc. 2 This file is part of libkabc.
3 Copyright (c) 2002 Tobias Koenig <tokoe@kde.org> 3 Copyright (c) 2002 Tobias Koenig <tokoe@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21/* 21/*
22Enhanced Version of the file for platform independent KDE tools. 22Enhanced Version of the file for platform independent KDE tools.
23Copyright (c) 2004 Ulf Schenk 23Copyright (c) 2004 Ulf Schenk
24 24
25$Id$ 25$Id$
26*/ 26*/
27 27
28#ifndef KABC_RESOURCELDAP_H 28#ifndef KABC_RESOURCELDAP_H
29#define KABC_RESOURCELDAP_H 29#define KABC_RESOURCELDAP_H
30 30
31 31
32#include <lber.h> 32#include <lber.h>
33#include <ldap.h> 33#include <ldap.h>
34 34
35#include "addressbook.h" 35#include "addressbook.h"
36#include "resource.h" 36#include "resource.h"
37 37
38class KConfig; 38class KConfig;
39 39
40namespace KABC { 40namespace KABC {
41 41
42class ResourceLDAP : public Resource 42class ResourceLDAP : public Resource
43{ 43{
44public: 44public:
45 45
46 ResourceLDAP( const KConfig*, bool syncable ); 46 ResourceLDAP( const KConfig* );
47 47
48 virtual void writeConfig( KConfig* ); 48 virtual void writeConfig( KConfig* );
49 49
50 virtual bool doOpen(); 50 virtual bool doOpen();
51 virtual void doClose(); 51 virtual void doClose();
52 52
53 virtual Ticket *requestSaveTicket(); 53 virtual Ticket *requestSaveTicket();
54 54
55 virtual bool load(); 55 virtual bool load();
56 virtual bool save( Ticket * ); 56 virtual bool save( Ticket * );
57 57
58 virtual void removeAddressee( const Addressee& addr ); 58 virtual void removeAddressee( const Addressee& addr );
59 59
60 void setUser( const QString &user ); 60 void setUser( const QString &user );
61 QString user() const; 61 QString user() const;
62 62
63 void setPassword( const QString &password ); 63 void setPassword( const QString &password );
64 QString password() const; 64 QString password() const;
65 65
66 void setDn( const QString &dn ); 66 void setDn( const QString &dn );
67 QString dn() const; 67 QString dn() const;
68 68
69 void setHost( const QString &host ); 69 void setHost( const QString &host );
70 QString host() const; 70 QString host() const;
71 71
72 void setPort( int port ); 72 void setPort( int port );
73 int port() const; 73 int port() const;
74 74
75 void setFilter( const QString &filter ); 75 void setFilter( const QString &filter );
76 QString filter() const; 76 QString filter() const;
77 77
78 void setIsAnonymous( bool value ); 78 void setIsAnonymous( bool value );
79 bool isAnonymous() const; 79 bool isAnonymous() const;
80 80
81 void setAttributes( const QMap<QString, QString> &attributes ); 81 void setAttributes( const QMap<QString, QString> &attributes );
82 QMap<QString, QString> attributes() const; 82 QMap<QString, QString> attributes() const;
83 83
84private: 84private:
85 QString mUser; 85 QString mUser;
86 QString mPassword; 86 QString mPassword;
87 QString mDn; 87 QString mDn;
88 QString mHost; 88 QString mHost;
89 QString mFilter; 89 QString mFilter;
90 int mPort; 90 int mPort;
91 bool mAnonymous; 91 bool mAnonymous;
92 QMap<QString, QString> mAttributes; 92 QMap<QString, QString> mAttributes;
93 93
94 LDAP *mLdap; 94 LDAP *mLdap;
95}; 95};
96 96
97} 97}
98 98
99#endif 99#endif
diff --git a/kabc/plugins/opie/resourceopie.cpp b/kabc/plugins/opie/resourceopie.cpp
index 22237dc..f610b38 100644
--- a/kabc/plugins/opie/resourceopie.cpp
+++ b/kabc/plugins/opie/resourceopie.cpp
@@ -1,350 +1,349 @@
1/* 1/*
2 This file is part of libkabc. 2 This file is part of libkabc.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21/* 21/*
22Enhanced Version of the file for platform independent KDE tools. 22Enhanced Version of the file for platform independent KDE tools.
23Copyright (c) 2004 Ulf Schenk 23Copyright (c) 2004 Ulf Schenk
24 24
25$Id$ 25$Id$
26*/ 26*/
27 27
28#include <sys/types.h> 28#include <sys/types.h>
29#include <sys/stat.h> 29#include <sys/stat.h>
30#include <unistd.h> 30#include <unistd.h>
31 31
32#include <qdir.h> 32#include <qdir.h>
33#include <qfile.h> 33#include <qfile.h>
34#include <qfileinfo.h> 34#include <qfileinfo.h>
35#include <qregexp.h> 35#include <qregexp.h>
36 36
37#include <kapplication.h> 37#include <kapplication.h>
38#include <kconfig.h> 38#include <kconfig.h>
39#include <kdebug.h> 39#include <kdebug.h>
40#include <klocale.h> 40#include <klocale.h>
41//US #include <ksavefile.h> 41//US #include <ksavefile.h>
42#include <kstandarddirs.h> 42#include <kstandarddirs.h>
43#include <kmessagebox.h> 43#include <kmessagebox.h>
44 44
45//US #include "formatfactory.h" 45//US #include "formatfactory.h"
46//US #include <qpe/qpeapplication.h> 46//US #include <qpe/qpeapplication.h>
47 47
48#include <opie/ocontactaccess.h> 48#include <opie/ocontactaccess.h>
49#include <opie/ocontactaccessbackend_xml.h> 49#include <opie/ocontactaccessbackend_xml.h>
50 50
51#include "resourceopieconfig.h" 51#include "resourceopieconfig.h"
52#include "stdaddressbook.h" 52#include "stdaddressbook.h"
53#include "syncprefwidget.h"
54 53
55#include "opieconverter.h" 54#include "opieconverter.h"
56 55
57#include "resourceopie.h" 56#include "resourceopie.h"
58 57
59using namespace KABC; 58using namespace KABC;
60extern "C" 59extern "C"
61{ 60{
62 void *init_microkabc_opie() 61 void *init_microkabc_opie()
63 { 62 {
64 return new KRES::PluginFactory<ResourceOpie,ResourceOpieConfig, SyncPrefWidgetContainer>(); 63 return new KRES::PluginFactory<ResourceOpie,ResourceOpieConfig>();
65 } 64 }
66} 65}
67 66
68ResourceOpie::ResourceOpie( const KConfig *config, bool syncable ) 67ResourceOpie::ResourceOpie( const KConfig *config )
69 : Resource( config, syncable ), mAccess(0), mConverter (0) 68 : Resource( config ), mAccess(0), mConverter (0)
70{ 69{
71 QString fileName = QDir::homeDirPath() + "/Applications/addressbook/addressbook.xml"; 70 QString fileName = QDir::homeDirPath() + "/Applications/addressbook/addressbook.xml";
72 71
73 KConfig *cfg = (KConfig *)config; 72 KConfig *cfg = (KConfig *)config;
74 if ( cfg ) { 73 if ( cfg ) {
75 fileName = cfg->readEntry( "FileName", fileName ); 74 fileName = cfg->readEntry( "FileName", fileName );
76 75
77 } 76 }
78 77
79 init( fileName ); 78 init( fileName );
80} 79}
81 80
82ResourceOpie::ResourceOpie( const QString &fileName, bool syncable ) 81ResourceOpie::ResourceOpie( const QString &fileName )
83 : Resource( 0, syncable ) 82 : Resource( 0 )
84{ 83{
85 init( fileName ); 84 init( fileName );
86} 85}
87 86
88void ResourceOpie::init( const QString &fileName ) 87void ResourceOpie::init( const QString &fileName )
89{ 88{
90 qDebug("ResourceOpie::init()"); 89 qDebug("ResourceOpie::init()");
91 90
92 connect( &mDirWatch, SIGNAL( dirty(const QString&) ), SLOT( fileChanged() ) ); 91 connect( &mDirWatch, SIGNAL( dirty(const QString&) ), SLOT( fileChanged() ) );
93 connect( &mDirWatch, SIGNAL( created(const QString&) ), SLOT( fileChanged() ) ); 92 connect( &mDirWatch, SIGNAL( created(const QString&) ), SLOT( fileChanged() ) );
94 connect( &mDirWatch, SIGNAL( deleted(const QString&) ), SLOT( fileChanged() ) ); 93 connect( &mDirWatch, SIGNAL( deleted(const QString&) ), SLOT( fileChanged() ) );
95 94
96 setFileName( fileName ); 95 setFileName( fileName );
97} 96}
98 97
99ResourceOpie::~ResourceOpie() 98ResourceOpie::~ResourceOpie()
100{ 99{
101 if (mConverter != 0) 100 if (mConverter != 0)
102 delete mConverter; 101 delete mConverter;
103 102
104 if(mAccess != 0) 103 if(mAccess != 0)
105 delete mAccess; 104 delete mAccess;
106} 105}
107 106
108void ResourceOpie::writeConfig( KConfig *config ) 107void ResourceOpie::writeConfig( KConfig *config )
109{ 108{
110 Resource::writeConfig( config ); 109 Resource::writeConfig( config );
111 110
112 config->writeEntry( "FileName", fileName() ); 111 config->writeEntry( "FileName", fileName() );
113} 112}
114 113
115Ticket *ResourceOpie::requestSaveTicket() 114Ticket *ResourceOpie::requestSaveTicket()
116{ 115{
117 kdDebug(5700) << "ResourceOpie::requestSaveTicket()" << endl; 116 kdDebug(5700) << "ResourceOpie::requestSaveTicket()" << endl;
118 117
119 qDebug("ResourceOpie::requestSaveTicket: %s", fileName().latin1()); 118 qDebug("ResourceOpie::requestSaveTicket: %s", fileName().latin1());
120 119
121 if ( !addressBook() ) return 0; 120 if ( !addressBook() ) return 0;
122 121
123 if ( !lock( fileName() ) ) { 122 if ( !lock( fileName() ) ) {
124 kdDebug(5700) << "ResourceOpie::requestSaveTicket(): Unable to lock file '" 123 kdDebug(5700) << "ResourceOpie::requestSaveTicket(): Unable to lock file '"
125 << fileName() << "'" << endl; 124 << fileName() << "'" << endl;
126 return 0; 125 return 0;
127 } 126 }
128 return createTicket( this ); 127 return createTicket( this );
129} 128}
130 129
131 130
132bool ResourceOpie::doOpen() 131bool ResourceOpie::doOpen()
133{ 132{
134 qDebug("ResourceOpie::doOpen: %s", fileName().latin1()); 133 qDebug("ResourceOpie::doOpen: %s", fileName().latin1());
135 134
136 OContactAccessBackend_XML* backend = new OContactAccessBackend_XML( "KDEPim/Pi", fileName() ); 135 OContactAccessBackend_XML* backend = new OContactAccessBackend_XML( "KDEPim/Pi", fileName() );
137 mAccess = new OContactAccess("KDEPim/Pi", 0l, backend, false); 136 mAccess = new OContactAccess("KDEPim/Pi", 0l, backend, false);
138 137
139 if ( !mAccess ) { 138 if ( !mAccess ) {
140 qDebug("Unable to load file() %s", fileName().latin1()); 139 qDebug("Unable to load file() %s", fileName().latin1());
141 return false; 140 return false;
142 } 141 }
143 142
144 mAccess->setReadAhead( 32 ); // Use ReadAhead-Cache if available 143 mAccess->setReadAhead( 32 ); // Use ReadAhead-Cache if available
145 144
146 145
147 if (mConverter == 0) 146 if (mConverter == 0)
148 { 147 {
149 mConverter = new OpieConverter(); 148 mConverter = new OpieConverter();
150 bool res = mConverter->init(); 149 bool res = mConverter->init();
151 if ( !res ) 150 if ( !res )
152 { 151 {
153 qDebug("Unable to initialize opie converter. Most likely a problem with the category file"); 152 qDebug("Unable to initialize opie converter. Most likely a problem with the category file");
154 delete mAccess; 153 delete mAccess;
155 mAccess = 0; 154 mAccess = 0;
156 return false; 155 return false;
157 } 156 }
158 } 157 }
159 158
160 159
161 160
162 return true; 161 return true;
163} 162}
164 163
165void ResourceOpie::doClose() 164void ResourceOpie::doClose()
166{ 165{
167 qDebug("ResourceOpie::doClose: %s", fileName().latin1()); 166 qDebug("ResourceOpie::doClose: %s", fileName().latin1());
168 167
169 if(mAccess) 168 if(mAccess)
170 { 169 {
171 delete mAccess; 170 delete mAccess;
172 mAccess = 0; 171 mAccess = 0;
173 } 172 }
174 // it seems so, that deletion of access deletes backend as well 173 // it seems so, that deletion of access deletes backend as well
175 //delete backend; 174 //delete backend;
176 175
177 return; 176 return;
178 177
179} 178}
180 179
181 180
182bool ResourceOpie::load() 181bool ResourceOpie::load()
183{ 182{
184 qDebug("ResourceOpie::load: %s", fileName().latin1()); 183 qDebug("ResourceOpie::load: %s", fileName().latin1());
185 184
186 bool res = false; 185 bool res = false;
187 186
188 OContactAccess::List::Iterator it; 187 OContactAccess::List::Iterator it;
189 OContactAccess::List allList = mAccess->allRecords(); 188 OContactAccess::List allList = mAccess->allRecords();
190 for ( it = allList.begin(); it != allList.end(); ++it ) 189 for ( it = allList.begin(); it != allList.end(); ++it )
191 { 190 {
192 const OContact c = (*it); 191 const OContact c = (*it);
193 192
194 KABC::Addressee addressee; 193 KABC::Addressee addressee;
195 194
196 res = mConverter->opieToAddressee( c, addressee ); 195 res = mConverter->opieToAddressee( c, addressee );
197 196
198 if ( !addressee.isEmpty() && res ) 197 if ( !addressee.isEmpty() && res )
199 { 198 {
200 addressee.setResource( this ); 199 addressee.setResource( this );
201 addressBook()->insertAddressee( addressee ); 200 addressBook()->insertAddressee( addressee );
202 } 201 }
203 202
204 } 203 }
205 204
206 205
207 return true; 206 return true;
208} 207}
209 208
210bool ResourceOpie::save( Ticket *ticket ) 209bool ResourceOpie::save( Ticket *ticket )
211{ 210{
212 qDebug("ResourceOpie::save: %s", fileName().latin1()); 211 qDebug("ResourceOpie::save: %s", fileName().latin1());
213 212
214 mDirWatch.stopScan(); 213 mDirWatch.stopScan();
215 214
216 KABC::AddressBook::Iterator it; 215 KABC::AddressBook::Iterator it;
217 bool res; 216 bool res;
218 217
219 for ( it = addressBook()->begin(); it != addressBook()->end(); ++it ) { 218 for ( it = addressBook()->begin(); it != addressBook()->end(); ++it ) {
220 OContact c; 219 OContact c;
221 KABC::Addressee addressee = (*it); 220 KABC::Addressee addressee = (*it);
222 221
223 res = mConverter->addresseeToOpie( *it, c ); 222 res = mConverter->addresseeToOpie( *it, c );
224 if (res == true) 223 if (res == true)
225 { 224 {
226 res = mAccess->add(c); 225 res = mAccess->add(c);
227 if (res == false) 226 if (res == false)
228 qDebug("Unable to append Contact %s", c.fullName().latin1()); 227 qDebug("Unable to append Contact %s", c.fullName().latin1());
229 } 228 }
230 else 229 else
231 { 230 {
232 qDebug("Unable to convert Addressee %s", addressee.formattedName().latin1()); 231 qDebug("Unable to convert Addressee %s", addressee.formattedName().latin1());
233 } 232 }
234 } 233 }
235 234
236 mAccess->save(); 235 mAccess->save();
237 236
238 mDirWatch.startScan(); 237 mDirWatch.startScan();
239 238
240 delete ticket; 239 delete ticket;
241 unlock( fileName() ); 240 unlock( fileName() );
242 241
243 return true; 242 return true;
244 243
245} 244}
246 245
247bool ResourceOpie::lock( const QString &lockfileName ) 246bool ResourceOpie::lock( const QString &lockfileName )
248{ 247{
249 qDebug("ResourceOpie::lock: %s", fileName().latin1()); 248 qDebug("ResourceOpie::lock: %s", fileName().latin1());
250 249
251 kdDebug(5700) << "ResourceOpie::lock()" << endl; 250 kdDebug(5700) << "ResourceOpie::lock()" << endl;
252 251
253 QString fn = lockfileName; 252 QString fn = lockfileName;
254 253
255 KURL url(fn); 254 KURL url(fn);
256 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" ); 255 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" );
257 256
258 kdDebug(5700) << "-- lock name: " << lockName << endl; 257 kdDebug(5700) << "-- lock name: " << lockName << endl;
259 258
260 if (QFile::exists( lockName )) 259 if (QFile::exists( lockName ))
261 { 260 {
262 qDebug("ResourceOpie::lock: lockfile %s already exists. (Delete it before continuing if nobody else is accessing the resourcefile %s)", lockName.latin1(), fileName().latin1()); 261 qDebug("ResourceOpie::lock: lockfile %s already exists. (Delete it before continuing if nobody else is accessing the resourcefile %s)", lockName.latin1(), fileName().latin1());
263 return false; 262 return false;
264 } 263 }
265 264
266 QString lockUniqueName; 265 QString lockUniqueName;
267 lockUniqueName = fn + KApplication::randomString( 8 ); 266 lockUniqueName = fn + KApplication::randomString( 8 );
268 267
269 url = lockUniqueName; 268 url = lockUniqueName;
270//US mLockUniqueName = locateLocal( "data", "kabc/lock/" + lockUniqueName ); 269//US mLockUniqueName = locateLocal( "data", "kabc/lock/" + lockUniqueName );
271 mLockUniqueName = locateLocal( "data", "kabc/lock/" + url.fileName() ); 270 mLockUniqueName = locateLocal( "data", "kabc/lock/" + url.fileName() );
272 kdDebug(5700) << "-- lock unique name: " << mLockUniqueName << endl; 271 kdDebug(5700) << "-- lock unique name: " << mLockUniqueName << endl;
273 272
274 // Create unique file 273 // Create unique file
275 QFile file( mLockUniqueName ); 274 QFile file( mLockUniqueName );
276 file.open( IO_WriteOnly ); 275 file.open( IO_WriteOnly );
277 file.close(); 276 file.close();
278 277
279 // Create lock file 278 // Create lock file
280 int result = 0; 279 int result = 0;
281#ifndef _WIN32_ 280#ifndef _WIN32_
282 result = ::link( QFile::encodeName( mLockUniqueName ), 281 result = ::link( QFile::encodeName( mLockUniqueName ),
283 QFile::encodeName( lockName ) ); 282 QFile::encodeName( lockName ) );
284#endif 283#endif
285 if ( result == 0 ) { 284 if ( result == 0 ) {
286 addressBook()->emitAddressBookLocked(); 285 addressBook()->emitAddressBookLocked();
287 return true; 286 return true;
288 } 287 }
289 288
290 // TODO: check stat 289 // TODO: check stat
291 290
292 return false; 291 return false;
293} 292}
294 293
295void ResourceOpie::unlock( const QString &fileName ) 294void ResourceOpie::unlock( const QString &fileName )
296{ 295{
297 qDebug("ResourceOpie::unlock() %s", fileName.latin1()); 296 qDebug("ResourceOpie::unlock() %s", fileName.latin1());
298 297
299 QString fn = fileName; 298 QString fn = fileName;
300 KURL url(fn); 299 KURL url(fn);
301 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" ); 300 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" );
302 301
303 QFile::remove( lockName ); 302 QFile::remove( lockName );
304 QFile::remove( mLockUniqueName ); 303 QFile::remove( mLockUniqueName );
305 addressBook()->emitAddressBookUnlocked(); 304 addressBook()->emitAddressBookUnlocked();
306} 305}
307 306
308void ResourceOpie::setFileName( const QString &newFileName ) 307void ResourceOpie::setFileName( const QString &newFileName )
309{ 308{
310 mDirWatch.stopScan(); 309 mDirWatch.stopScan();
311 mDirWatch.removeFile( fileName() ); 310 mDirWatch.removeFile( fileName() );
312 311
313 Resource::setFileName( newFileName ); 312 Resource::setFileName( newFileName );
314 313
315 mDirWatch.addFile( fileName() ); 314 mDirWatch.addFile( fileName() );
316 mDirWatch.startScan(); 315 mDirWatch.startScan();
317 316
318} 317}
319 318
320 319
321void ResourceOpie::fileChanged() 320void ResourceOpie::fileChanged()
322{ 321{
323 // There is a small theoretical chance that KDirWatch calls us before 322 // There is a small theoretical chance that KDirWatch calls us before
324 // we are fully constructed 323 // we are fully constructed
325 if (!addressBook()) 324 if (!addressBook())
326 return; 325 return;
327 326
328 QString text( i18n( "Opie resource '%1'<br> has been changed by third party.<br>Do you want to reload?").arg( fileName() ) ); 327 QString text( i18n( "Opie resource '%1'<br> has been changed by third party.<br>Do you want to reload?").arg( fileName() ) );
329 if ( readOnly() || KMessageBox::questionYesNo( 0, text ) == KMessageBox::Yes ) { 328 if ( readOnly() || KMessageBox::questionYesNo( 0, text ) == KMessageBox::Yes ) {
330 load(); 329 load();
331 addressBook()->emitAddressBookChanged(); 330 addressBook()->emitAddressBookChanged();
332 } 331 }
333 332
334 load(); 333 load();
335 addressBook()->emitAddressBookChanged(); 334 addressBook()->emitAddressBookChanged();
336} 335}
337 336
338void ResourceOpie::removeAddressee( const Addressee &addr ) 337void ResourceOpie::removeAddressee( const Addressee &addr )
339{ 338{
340} 339}
341 340
342void ResourceOpie::cleanUp() 341void ResourceOpie::cleanUp()
343{ 342{
344// qDebug("ResourceOpie::cleanup() %s", mFileName.latin1()); 343// qDebug("ResourceOpie::cleanup() %s", mFileName.latin1());
345 344
346 unlock( fileName() ); 345 unlock( fileName() );
347} 346}
348 347
349 348
350//US #include "resourceopie.moc" 349//US #include "resourceopie.moc"
diff --git a/kabc/plugins/opie/resourceopie.h b/kabc/plugins/opie/resourceopie.h
index d5b4ebd..9d05c70 100644
--- a/kabc/plugins/opie/resourceopie.h
+++ b/kabc/plugins/opie/resourceopie.h
@@ -1,146 +1,146 @@
1/* 1/*
2 This file is part of libkabc. 2 This file is part of libkabc.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21/* 21/*
22Enhanced Version of the file for platform independent KDE tools. 22Enhanced Version of the file for platform independent KDE tools.
23Copyright (c) 2004 Ulf Schenk 23Copyright (c) 2004 Ulf Schenk
24 24
25$Id$ 25$Id$
26*/ 26*/
27 27
28 28
29#ifndef KABC_RESOURCEOPIE_H 29#ifndef KABC_RESOURCEOPIE_H
30#define KABC_RESOURCEOPIE_H 30#define KABC_RESOURCEOPIE_H
31 31
32#include <kconfig.h> 32#include <kconfig.h>
33#include <kdirwatch.h> 33#include <kdirwatch.h>
34 34
35#include <sys/types.h> 35#include <sys/types.h>
36 36
37#include "resource.h" 37#include "resource.h"
38 38
39 39
40class OContactAccess; 40class OContactAccess;
41 41
42namespace KABC { 42namespace KABC {
43 43
44class ResourceConfigWidget; 44class ResourceConfigWidget;
45class OpieConverter; 45class OpieConverter;
46/** 46/**
47 @internal 47 @internal
48*/ 48*/
49class ResourceOpie : public Resource 49class ResourceOpie : public Resource
50{ 50{
51 Q_OBJECT 51 Q_OBJECT
52 52
53public: 53public:
54 54
55 /** 55 /**
56 Constructor. 56 Constructor.
57 57
58 @param cfg The config object where custom resource settings are stored. 58 @param cfg The config object where custom resource settings are stored.
59 */ 59 */
60 ResourceOpie( const KConfig *cfg, bool syncable ); 60 ResourceOpie( const KConfig *cfg );
61 61
62 /** 62 /**
63 Construct file resource on file @arg fileName using format @arg formatName. 63 Construct file resource on file @arg fileName using format @arg formatName.
64 */ 64 */
65 ResourceOpie( const QString &fileName, bool syncable ); 65 ResourceOpie( const QString &fileName );
66 66
67 /** 67 /**
68 * Destructor. 68 * Destructor.
69 */ 69 */
70 ~ResourceOpie(); 70 ~ResourceOpie();
71 71
72 /** 72 /**
73 Writes the config back. 73 Writes the config back.
74 */ 74 */
75 virtual void writeConfig( KConfig *cfg ); 75 virtual void writeConfig( KConfig *cfg );
76 76
77 /** 77 /**
78 * Tries to open the file and checks for the proper format. 78 * Tries to open the file and checks for the proper format.
79 * This method should be called before @ref load(). 79 * This method should be called before @ref load().
80 */ 80 */
81 virtual bool doOpen(); 81 virtual bool doOpen();
82 82
83 /** 83 /**
84 * Closes the file again. 84 * Closes the file again.
85 */ 85 */
86 virtual void doClose(); 86 virtual void doClose();
87 87
88 /** 88 /**
89 * Requests a save ticket, that is used by @ref save() 89 * Requests a save ticket, that is used by @ref save()
90 */ 90 */
91 virtual Ticket *requestSaveTicket(); 91 virtual Ticket *requestSaveTicket();
92 92
93 /** 93 /**
94 * Loads all addressees from file to the address book. 94 * Loads all addressees from file to the address book.
95 * Returns true if all addressees could be loaded otherwise false. 95 * Returns true if all addressees could be loaded otherwise false.
96 */ 96 */
97 virtual bool load(); 97 virtual bool load();
98 98
99 /** 99 /**
100 * Saves all addresses from address book to file. 100 * Saves all addresses from address book to file.
101 * Returns true if all addressees could be saved otherwise false. 101 * Returns true if all addressees could be saved otherwise false.
102 * 102 *
103 * @param ticket The ticket returned by @ref requestSaveTicket() 103 * @param ticket The ticket returned by @ref requestSaveTicket()
104 */ 104 */
105 virtual bool save( Ticket *ticket ); 105 virtual bool save( Ticket *ticket );
106 106
107 107
108 /** 108 /**
109 * Remove a addressee from its source. 109 * Remove a addressee from its source.
110 * This method is mainly called by KABC::AddressBook. 110 * This method is mainly called by KABC::AddressBook.
111 */ 111 */
112 virtual void removeAddressee( const Addressee& addr ); 112 virtual void removeAddressee( const Addressee& addr );
113 113
114 /** 114 /**
115 * Set name of file to be used for saving. 115 * Set name of file to be used for saving.
116 */ 116 */
117 virtual void setFileName( const QString & ); 117 virtual void setFileName( const QString & );
118 118
119 /** 119 /**
120 * This method is called by an error handler if the application 120 * This method is called by an error handler if the application
121 * crashed 121 * crashed
122 */ 122 */
123 virtual void cleanUp(); 123 virtual void cleanUp();
124 124
125 125
126protected slots: 126protected slots:
127 void fileChanged(); 127 void fileChanged();
128 128
129protected: 129protected:
130 void init( const QString &fileName ); 130 void init( const QString &fileName );
131 131
132 bool lock( const QString &fileName ); 132 bool lock( const QString &fileName );
133 void unlock( const QString &fileName ); 133 void unlock( const QString &fileName );
134 134
135private: 135private:
136 OContactAccess* mAccess; 136 OContactAccess* mAccess;
137 OpieConverter* mConverter; 137 OpieConverter* mConverter;
138 138
139 QString mLockUniqueName; 139 QString mLockUniqueName;
140 140
141 KDirWatch mDirWatch; 141 KDirWatch mDirWatch;
142}; 142};
143 143
144} 144}
145 145
146#endif 146#endif
diff --git a/kabc/plugins/qtopia/resourceqtopia.cpp b/kabc/plugins/qtopia/resourceqtopia.cpp
index f9cabcb..deb218b 100644
--- a/kabc/plugins/qtopia/resourceqtopia.cpp
+++ b/kabc/plugins/qtopia/resourceqtopia.cpp
@@ -1,322 +1,321 @@
1/* 1/*
2 This file is part of libkabc. 2 This file is part of libkabc.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21/* 21/*
22Enhanced Version of the file for platform independent KDE tools. 22Enhanced Version of the file for platform independent KDE tools.
23Copyright (c) 2004 Ulf Schenk 23Copyright (c) 2004 Ulf Schenk
24 24
25$Id$ 25$Id$
26*/ 26*/
27#include <sys/types.h> 27#include <sys/types.h>
28#include <sys/stat.h> 28#include <sys/stat.h>
29#include <unistd.h> 29#include <unistd.h>
30 30
31#include <qdir.h> 31#include <qdir.h>
32#include <qfile.h> 32#include <qfile.h>
33#include <qfileinfo.h> 33#include <qfileinfo.h>
34#include <qregexp.h> 34#include <qregexp.h>
35//US #include <qtimer.h> 35//US #include <qtimer.h>
36 36
37#include <kapplication.h> 37#include <kapplication.h>
38#include <kconfig.h> 38#include <kconfig.h>
39#include <kdebug.h> 39#include <kdebug.h>
40#include <klocale.h> 40#include <klocale.h>
41//US #include <ksavefile.h> 41//US #include <ksavefile.h>
42#include <kstandarddirs.h> 42#include <kstandarddirs.h>
43#include <kmessagebox.h> 43#include <kmessagebox.h>
44 44
45#include <qpe/pim/addressbookaccess.h> 45#include <qpe/pim/addressbookaccess.h>
46 46
47 47
48#include "resourceqtopiaconfig.h" 48#include "resourceqtopiaconfig.h"
49#include "stdaddressbook.h" 49#include "stdaddressbook.h"
50 50
51#include "qtopiaconverter.h" 51#include "qtopiaconverter.h"
52#include "syncprefwidget.h"
53 52
54#include "resourceqtopia.h" 53#include "resourceqtopia.h"
55 54
56using namespace KABC; 55using namespace KABC;
57extern "C" 56extern "C"
58{ 57{
59 void *init_microkabc_qtopia() 58 void *init_microkabc_qtopia()
60 { 59 {
61 return new KRES::PluginFactory<ResourceQtopia,ResourceQtopiaConfig, SyncPrefWidgetContainer>(); 60 return new KRES::PluginFactory<ResourceQtopia,ResourceQtopiaConfig>();
62 } 61 }
63} 62}
64 63
65ResourceQtopia::ResourceQtopia( const KConfig *config, bool syncable ) 64ResourceQtopia::ResourceQtopia( const KConfig *config )
66 : Resource( config, syncable ), mConverter (0) 65 : Resource( config ), mConverter (0)
67{ 66{
68 // we can not choose the filename. Therefore use the default to display 67 // we can not choose the filename. Therefore use the default to display
69 QString fileName = QDir::homeDirPath() + "/Applications/addressbook/addressbook.xml"; 68 QString fileName = QDir::homeDirPath() + "/Applications/addressbook/addressbook.xml";
70 init( fileName ); 69 init( fileName );
71} 70}
72 71
73ResourceQtopia::ResourceQtopia( const QString &fileName, bool syncable ) 72ResourceQtopia::ResourceQtopia( const QString &fileName )
74 : Resource( 0, syncable ) 73 : Resource( 0 )
75{ 74{
76 init( fileName ); 75 init( fileName );
77} 76}
78 77
79void ResourceQtopia::init( const QString &fileName ) 78void ResourceQtopia::init( const QString &fileName )
80{ 79{
81 80
82 connect( &mDirWatch, SIGNAL( dirty(const QString&) ), SLOT( fileChanged() ) ); 81 connect( &mDirWatch, SIGNAL( dirty(const QString&) ), SLOT( fileChanged() ) );
83 connect( &mDirWatch, SIGNAL( created(const QString&) ), SLOT( fileChanged() ) ); 82 connect( &mDirWatch, SIGNAL( created(const QString&) ), SLOT( fileChanged() ) );
84 connect( &mDirWatch, SIGNAL( deleted(const QString&) ), SLOT( fileChanged() ) ); 83 connect( &mDirWatch, SIGNAL( deleted(const QString&) ), SLOT( fileChanged() ) );
85 84
86 setFileName( fileName ); 85 setFileName( fileName );
87} 86}
88 87
89ResourceQtopia::~ResourceQtopia() 88ResourceQtopia::~ResourceQtopia()
90{ 89{
91 if (mConverter != 0) 90 if (mConverter != 0)
92 delete mConverter; 91 delete mConverter;
93 92
94 if(mAccess != 0) 93 if(mAccess != 0)
95 delete mAccess; 94 delete mAccess;
96} 95}
97 96
98void ResourceQtopia::writeConfig( KConfig *config ) 97void ResourceQtopia::writeConfig( KConfig *config )
99{ 98{
100 Resource::writeConfig( config ); 99 Resource::writeConfig( config );
101} 100}
102 101
103Ticket *ResourceQtopia::requestSaveTicket() 102Ticket *ResourceQtopia::requestSaveTicket()
104{ 103{
105 kdDebug(5700) << "ResourceQtopia::requestSaveTicket()" << endl; 104 kdDebug(5700) << "ResourceQtopia::requestSaveTicket()" << endl;
106 105
107 qDebug("ResourceQtopia::requestSaveTicket: %s", fileName().latin1()); 106 qDebug("ResourceQtopia::requestSaveTicket: %s", fileName().latin1());
108 107
109 if ( !addressBook() ) return 0; 108 if ( !addressBook() ) return 0;
110 109
111 if ( !lock( fileName() ) ) { 110 if ( !lock( fileName() ) ) {
112 kdDebug(5700) << "ResourceQtopia::requestSaveTicket(): Unable to lock file '" 111 kdDebug(5700) << "ResourceQtopia::requestSaveTicket(): Unable to lock file '"
113 << fileName() << "'" << endl; 112 << fileName() << "'" << endl;
114 return 0; 113 return 0;
115 } 114 }
116 return createTicket( this ); 115 return createTicket( this );
117} 116}
118 117
119 118
120bool ResourceQtopia::doOpen() 119bool ResourceQtopia::doOpen()
121{ 120{
122 qDebug("ResourceQtopia::doOpen(): %s", fileName().latin1()); 121 qDebug("ResourceQtopia::doOpen(): %s", fileName().latin1());
123 122
124 mAccess = new AddressBookAccess(); 123 mAccess = new AddressBookAccess();
125 124
126 if ( !mAccess ) { 125 if ( !mAccess ) {
127 qDebug("Unable to load file() %s", fileName().latin1()); 126 qDebug("Unable to load file() %s", fileName().latin1());
128 return false; 127 return false;
129 } 128 }
130 129
131 130
132 if (mConverter == 0) 131 if (mConverter == 0)
133 { 132 {
134 mConverter = new QtopiaConverter(); 133 mConverter = new QtopiaConverter();
135 bool res = mConverter->init(); 134 bool res = mConverter->init();
136 if ( !res ) 135 if ( !res )
137 { 136 {
138 QString msg("Unable to initialize qtopia converter. Most likely a problem with the category file"); 137 QString msg("Unable to initialize qtopia converter. Most likely a problem with the category file");
139 qDebug(msg); 138 qDebug(msg);
140 delete mAccess; 139 delete mAccess;
141 mAccess = 0; 140 mAccess = 0;
142 return false; 141 return false;
143 } 142 }
144 } 143 }
145 144
146 return true; 145 return true;
147} 146}
148 147
149void ResourceQtopia::doClose() 148void ResourceQtopia::doClose()
150{ 149{
151 qDebug("ResourceQtopia::doClose: %s", fileName().latin1()); 150 qDebug("ResourceQtopia::doClose: %s", fileName().latin1());
152 151
153 if(mAccess) 152 if(mAccess)
154 { 153 {
155 delete mAccess; 154 delete mAccess;
156 mAccess = 0; 155 mAccess = 0;
157 } 156 }
158 // it seems so, that deletion of access deletes backend as well 157 // it seems so, that deletion of access deletes backend as well
159 //delete backend; 158 //delete backend;
160 159
161 return; 160 return;
162} 161}
163 162
164bool ResourceQtopia::load() 163bool ResourceQtopia::load()
165{ 164{
166 qDebug("ResourceQtopia::load: %s", fileName().latin1()); 165 qDebug("ResourceQtopia::load: %s", fileName().latin1());
167 166
168 AddressBookIterator it(*mAccess); 167 AddressBookIterator it(*mAccess);
169 const PimContact* contact; 168 const PimContact* contact;
170 bool res; 169 bool res;
171 170
172 for (contact=it.toFirst(); it.current(); ++it) 171 for (contact=it.toFirst(); it.current(); ++it)
173 { 172 {
174 contact = it.current(); 173 contact = it.current();
175 174
176 KABC::Addressee addressee; 175 KABC::Addressee addressee;
177 176
178 res = mConverter->qtopiaToAddressee( (*contact), addressee ); 177 res = mConverter->qtopiaToAddressee( (*contact), addressee );
179 178
180 if ( !addressee.isEmpty() && res ) 179 if ( !addressee.isEmpty() && res )
181 { 180 {
182 addressee.setResource( this ); 181 addressee.setResource( this );
183 addressBook()->insertAddressee( addressee ); 182 addressBook()->insertAddressee( addressee );
184 } 183 }
185 } 184 }
186 185
187 return true; 186 return true;
188} 187}
189 188
190bool ResourceQtopia::save( Ticket *ticket ) 189bool ResourceQtopia::save( Ticket *ticket )
191{ 190{
192 qDebug("ResourceQtopia::save: %s", fileName().latin1()); 191 qDebug("ResourceQtopia::save: %s", fileName().latin1());
193 192
194 mDirWatch.stopScan(); 193 mDirWatch.stopScan();
195 194
196 KABC::AddressBook::Iterator it; 195 KABC::AddressBook::Iterator it;
197 bool res; 196 bool res;
198 197
199 for ( it = addressBook()->begin(); it != addressBook()->end(); ++it ) { 198 for ( it = addressBook()->begin(); it != addressBook()->end(); ++it ) {
200 PimContact c; 199 PimContact c;
201 KABC::Addressee addressee = (*it); 200 KABC::Addressee addressee = (*it);
202 201
203 res = mConverter->addresseeToQtopia( *it, c ); 202 res = mConverter->addresseeToQtopia( *it, c );
204 if (res == true) 203 if (res == true)
205 { 204 {
206 mAccess->addContact(c); 205 mAccess->addContact(c);
207// if (res == false) 206// if (res == false)
208// qDebug("Unable to append Contact %s", c.fullName().latin1()); 207// qDebug("Unable to append Contact %s", c.fullName().latin1());
209 } 208 }
210 else 209 else
211 { 210 {
212 qDebug("Unable to convert Addressee %s", addressee.formattedName().latin1()); 211 qDebug("Unable to convert Addressee %s", addressee.formattedName().latin1());
213 } 212 }
214 } 213 }
215 214
216// mAccess->addressBookUpdated(); 215// mAccess->addressBookUpdated();
217 216
218 mDirWatch.startScan(); 217 mDirWatch.startScan();
219 218
220 delete ticket; 219 delete ticket;
221 unlock( fileName() ); 220 unlock( fileName() );
222 221
223 return true; 222 return true;
224} 223}
225 224
226bool ResourceQtopia::lock( const QString &lockfileName ) 225bool ResourceQtopia::lock( const QString &lockfileName )
227{ 226{
228 qDebug("ResourceQtopia::lock: %s", fileName().latin1()); 227 qDebug("ResourceQtopia::lock: %s", fileName().latin1());
229 228
230 kdDebug(5700) << "ResourceQtopia::lock()" << endl; 229 kdDebug(5700) << "ResourceQtopia::lock()" << endl;
231 230
232 QString fn = lockfileName; 231 QString fn = lockfileName;
233 232
234 KURL url(fn); 233 KURL url(fn);
235 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" ); 234 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" );
236 235
237 kdDebug(5700) << "-- lock name: " << lockName << endl; 236 kdDebug(5700) << "-- lock name: " << lockName << endl;
238 237
239 if (QFile::exists( lockName )) 238 if (QFile::exists( lockName ))
240 { 239 {
241 qDebug("ResourceOpie::lock: lockfile %s already exists. (Delete it before continuing if nobody else is accessing the resourcefile %s)", lockName.latin1(), fileName().latin1()); 240 qDebug("ResourceOpie::lock: lockfile %s already exists. (Delete it before continuing if nobody else is accessing the resourcefile %s)", lockName.latin1(), fileName().latin1());
242 return false; 241 return false;
243 } 242 }
244 243
245 QString lockUniqueName; 244 QString lockUniqueName;
246 lockUniqueName = fn + KApplication::randomString( 8 ); 245 lockUniqueName = fn + KApplication::randomString( 8 );
247 246
248 url = lockUniqueName; 247 url = lockUniqueName;
249//US mLockUniqueName = locateLocal( "data", "kabc/lock/" + lockUniqueName ); 248//US mLockUniqueName = locateLocal( "data", "kabc/lock/" + lockUniqueName );
250 mLockUniqueName = locateLocal( "data", "kabc/lock/" + url.fileName() ); 249 mLockUniqueName = locateLocal( "data", "kabc/lock/" + url.fileName() );
251 kdDebug(5700) << "-- lock unique name: " << mLockUniqueName << endl; 250 kdDebug(5700) << "-- lock unique name: " << mLockUniqueName << endl;
252 251
253 // Create unique file 252 // Create unique file
254 QFile file( mLockUniqueName ); 253 QFile file( mLockUniqueName );
255 file.open( IO_WriteOnly ); 254 file.open( IO_WriteOnly );
256 file.close(); 255 file.close();
257 256
258 // Create lock file 257 // Create lock file
259 int result = 0; 258 int result = 0;
260#ifndef _WIN32_ 259#ifndef _WIN32_
261 result = ::link( QFile::encodeName( mLockUniqueName ), 260 result = ::link( QFile::encodeName( mLockUniqueName ),
262 QFile::encodeName( lockName ) ); 261 QFile::encodeName( lockName ) );
263#endif 262#endif
264 if ( result == 0 ) { 263 if ( result == 0 ) {
265 addressBook()->emitAddressBookLocked(); 264 addressBook()->emitAddressBookLocked();
266 return true; 265 return true;
267 } 266 }
268 267
269 // TODO: check stat 268 // TODO: check stat
270 269
271 return false; 270 return false;
272} 271}
273 272
274void ResourceQtopia::unlock( const QString &fileName ) 273void ResourceQtopia::unlock( const QString &fileName )
275{ 274{
276 qDebug("ResourceQtopia::unlock() %s", fileName.latin1()); 275 qDebug("ResourceQtopia::unlock() %s", fileName.latin1());
277 276
278 QString fn = fileName; 277 QString fn = fileName;
279 KURL url(fn); 278 KURL url(fn);
280 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" ); 279 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" );
281 280
282 QFile::remove( lockName ); 281 QFile::remove( lockName );
283 QFile::remove( mLockUniqueName ); 282 QFile::remove( mLockUniqueName );
284 addressBook()->emitAddressBookUnlocked(); 283 addressBook()->emitAddressBookUnlocked();
285} 284}
286 285
287void ResourceQtopia::setFileName( const QString &newFileName ) 286void ResourceQtopia::setFileName( const QString &newFileName )
288{ 287{
289 mDirWatch.stopScan(); 288 mDirWatch.stopScan();
290 mDirWatch.removeFile( fileName() ); 289 mDirWatch.removeFile( fileName() );
291 290
292 Resource::setFileName( newFileName ); 291 Resource::setFileName( newFileName );
293 292
294 mDirWatch.addFile( fileName() ); 293 mDirWatch.addFile( fileName() );
295 mDirWatch.startScan(); 294 mDirWatch.startScan();
296} 295}
297 296
298 297
299void ResourceQtopia::fileChanged() 298void ResourceQtopia::fileChanged()
300{ 299{
301 // There is a small theoretical chance that KDirWatch calls us before 300 // There is a small theoretical chance that KDirWatch calls us before
302 // we are fully constructed 301 // we are fully constructed
303 if (!addressBook()) 302 if (!addressBook())
304 return; 303 return;
305 304
306 QString text( i18n( "Qtopia resource '%1'<br> has been changed by third party.<br>Do you want to reload?").arg( fileName() ) ); 305 QString text( i18n( "Qtopia resource '%1'<br> has been changed by third party.<br>Do you want to reload?").arg( fileName() ) );
307 if ( readOnly() || KMessageBox::questionYesNo( 0, text ) == KMessageBox::Yes ) { 306 if ( readOnly() || KMessageBox::questionYesNo( 0, text ) == KMessageBox::Yes ) {
308 load(); 307 load();
309 addressBook()->emitAddressBookChanged(); 308 addressBook()->emitAddressBookChanged();
310 } 309 }
311} 310}
312 311
313void ResourceQtopia::removeAddressee( const Addressee &addr ) 312void ResourceQtopia::removeAddressee( const Addressee &addr )
314{ 313{
315} 314}
316 315
317void ResourceQtopia::cleanUp() 316void ResourceQtopia::cleanUp()
318{ 317{
319 unlock( fileName() ); 318 unlock( fileName() );
320} 319}
321 320
322//US #include "resourceqtopia.moc" 321//US #include "resourceqtopia.moc"
diff --git a/kabc/plugins/qtopia/resourceqtopia.h b/kabc/plugins/qtopia/resourceqtopia.h
index eace280..ff6350d 100644
--- a/kabc/plugins/qtopia/resourceqtopia.h
+++ b/kabc/plugins/qtopia/resourceqtopia.h
@@ -1,145 +1,145 @@
1/* 1/*
2 This file is part of libkabc. 2 This file is part of libkabc.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21/* 21/*
22Enhanced Version of the file for platform independent KDE tools. 22Enhanced Version of the file for platform independent KDE tools.
23Copyright (c) 2004 Ulf Schenk 23Copyright (c) 2004 Ulf Schenk
24 24
25$Id$ 25$Id$
26*/ 26*/
27 27
28 28
29#ifndef KABC_RESOURCEOPIE_H 29#ifndef KABC_RESOURCEOPIE_H
30#define KABC_RESOURCEOPIE_H 30#define KABC_RESOURCEOPIE_H
31 31
32#include <kconfig.h> 32#include <kconfig.h>
33#include <kdirwatch.h> 33#include <kdirwatch.h>
34 34
35#include <sys/types.h> 35#include <sys/types.h>
36 36
37#include "resource.h" 37#include "resource.h"
38 38
39class AddressBookAccess; 39class AddressBookAccess;
40 40
41namespace KABC { 41namespace KABC {
42 42
43//US class FormatPlugin; 43//US class FormatPlugin;
44class ResourceConfigWidget; 44class ResourceConfigWidget;
45class QtopiaConverter; 45class QtopiaConverter;
46 46
47/** 47/**
48 @internal 48 @internal
49*/ 49*/
50class ResourceQtopia : public Resource 50class ResourceQtopia : public Resource
51{ 51{
52 Q_OBJECT 52 Q_OBJECT
53 53
54public: 54public:
55 55
56 /** 56 /**
57 Constructor. 57 Constructor.
58 58
59 @param cfg The config object where custom resource settings are stored. 59 @param cfg The config object where custom resource settings are stored.
60 */ 60 */
61 ResourceQtopia( const KConfig *cfg, bool syncable ); 61 ResourceQtopia( const KConfig *cfg );
62 62
63 /** 63 /**
64 Construct file resource on file @arg fileName using format @arg formatName. 64 Construct file resource on file @arg fileName using format @arg formatName.
65 */ 65 */
66 ResourceQtopia( const QString &fileName, bool syncable ); 66 ResourceQtopia( const QString &fileName );
67 67
68 /** 68 /**
69 * Destructor. 69 * Destructor.
70 */ 70 */
71 ~ResourceQtopia(); 71 ~ResourceQtopia();
72 72
73 /** 73 /**
74 Writes the config back. 74 Writes the config back.
75 */ 75 */
76 virtual void writeConfig( KConfig *cfg ); 76 virtual void writeConfig( KConfig *cfg );
77 77
78 /** 78 /**
79 * Tries to open the file and checks for the proper format. 79 * Tries to open the file and checks for the proper format.
80 * This method should be called before @ref load(). 80 * This method should be called before @ref load().
81 */ 81 */
82 virtual bool doOpen(); 82 virtual bool doOpen();
83 83
84 /** 84 /**
85 * Closes the file again. 85 * Closes the file again.
86 */ 86 */
87 virtual void doClose(); 87 virtual void doClose();
88 88
89 /** 89 /**
90 * Requests a save ticket, that is used by @ref save() 90 * Requests a save ticket, that is used by @ref save()
91 */ 91 */
92 virtual Ticket *requestSaveTicket(); 92 virtual Ticket *requestSaveTicket();
93 93
94 /** 94 /**
95 * Loads all addressees from file to the address book. 95 * Loads all addressees from file to the address book.
96 * Returns true if all addressees could be loaded otherwise false. 96 * Returns true if all addressees could be loaded otherwise false.
97 */ 97 */
98 virtual bool load(); 98 virtual bool load();
99 99
100 /** 100 /**
101 * Saves all addresses from address book to file. 101 * Saves all addresses from address book to file.
102 * Returns true if all addressees could be saved otherwise false. 102 * Returns true if all addressees could be saved otherwise false.
103 * 103 *
104 * @param ticket The ticket returned by @ref requestSaveTicket() 104 * @param ticket The ticket returned by @ref requestSaveTicket()
105 */ 105 */
106 virtual bool save( Ticket *ticket ); 106 virtual bool save( Ticket *ticket );
107 107
108 /** 108 /**
109 * Remove a addressee from its source. 109 * Remove a addressee from its source.
110 * This method is mainly called by KABC::AddressBook. 110 * This method is mainly called by KABC::AddressBook.
111 */ 111 */
112 virtual void removeAddressee( const Addressee& addr ); 112 virtual void removeAddressee( const Addressee& addr );
113 113
114 /** 114 /**
115 * Set name of file to be used for saving. 115 * Set name of file to be used for saving.
116 */ 116 */
117 virtual void setFileName( const QString & ); 117 virtual void setFileName( const QString & );
118 118
119 /** 119 /**
120 * This method is called by an error handler if the application 120 * This method is called by an error handler if the application
121 * crashed 121 * crashed
122 */ 122 */
123 virtual void cleanUp(); 123 virtual void cleanUp();
124 124
125protected slots: 125protected slots:
126 void fileChanged(); 126 void fileChanged();
127 127
128protected: 128protected:
129 void init( const QString &fileName ); 129 void init( const QString &fileName );
130 130
131 bool lock( const QString &fileName ); 131 bool lock( const QString &fileName );
132 void unlock( const QString &fileName ); 132 void unlock( const QString &fileName );
133 133
134private: 134private:
135 AddressBookAccess* mAccess; 135 AddressBookAccess* mAccess;
136 QtopiaConverter* mConverter; 136 QtopiaConverter* mConverter;
137 137
138 QString mLockUniqueName; 138 QString mLockUniqueName;
139 139
140 KDirWatch mDirWatch; 140 KDirWatch mDirWatch;
141}; 141};
142 142
143} 143}
144 144
145#endif 145#endif
diff --git a/kabc/plugins/sharpdtm/resourcesharpdtm.cpp b/kabc/plugins/sharpdtm/resourcesharpdtm.cpp
index c013f52..2cdf4bf 100644
--- a/kabc/plugins/sharpdtm/resourcesharpdtm.cpp
+++ b/kabc/plugins/sharpdtm/resourcesharpdtm.cpp
@@ -1,408 +1,406 @@
1/* 1/*
2 This file is part of libkabc. 2 This file is part of libkabc.
3 Copyright (c) 2004 Ulf Schenk 3 Copyright (c) 2004 Ulf Schenk
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21/* 21/*
22Enhanced Version of the file for platform independent KDE tools. 22Enhanced Version of the file for platform independent KDE tools.
23Copyright (c) 2004 Ulf Schenk 23Copyright (c) 2004 Ulf Schenk
24 24
25$Id$ 25$Id$
26*/ 26*/
27 27
28#include <sys/types.h> 28#include <sys/types.h>
29#include <sys/stat.h> 29#include <sys/stat.h>
30#include <unistd.h> 30#include <unistd.h>
31 31
32#include <qdir.h> 32#include <qdir.h>
33#include <qfile.h> 33#include <qfile.h>
34#include <qfileinfo.h> 34#include <qfileinfo.h>
35#include <qregexp.h> 35#include <qregexp.h>
36//US #include <qtimer.h> 36//US #include <qtimer.h>
37 37
38#include <kapplication.h> 38#include <kapplication.h>
39#include <kconfig.h> 39#include <kconfig.h>
40#include <kdebug.h> 40#include <kdebug.h>
41#include <klocale.h> 41#include <klocale.h>
42//US #include <ksavefile.h> 42//US #include <ksavefile.h>
43#include <kstandarddirs.h> 43#include <kstandarddirs.h>
44#include <kmessagebox.h> 44#include <kmessagebox.h>
45 45
46#include <sl/slzdb.h> 46#include <sl/slzdb.h>
47 47
48#include <libkdepim/ksyncprofile.h> 48#include <libkdepim/ksyncprofile.h>
49 49
50#include "resourcesharpdtmconfig.h" 50#include "resourcesharpdtmconfig.h"
51#include "resourcesharpdtm.h" 51#include "resourcesharpdtm.h"
52 52
53#include "syncprefwidget.h"
54
55#include "stdaddressbook.h" 53#include "stdaddressbook.h"
56 54
57#include "sharpdtmconverter.h" 55#include "sharpdtmconverter.h"
58//#define ALLOW_LOCKING 56//#define ALLOW_LOCKING
59using namespace KABC; 57using namespace KABC;
60extern "C" 58extern "C"
61{ 59{
62 void *init_microkabc_sharpdtm() 60 void *init_microkabc_sharpdtm()
63 { 61 {
64 return new KRES::PluginFactory<ResourceSharpDTM,ResourceSharpDTMConfig,SyncPrefWidgetContainer>(); 62 return new KRES::PluginFactory<ResourceSharpDTM,ResourceSharpDTMConfig>();
65 } 63 }
66} 64}
67 65
68ResourceSharpDTM::ResourceSharpDTM( const KConfig *config, bool syncable ) 66ResourceSharpDTM::ResourceSharpDTM( const KConfig *config )
69 : Resource( config, syncable ), mConverter (0) 67 : Resource( config ), mConverter (0)
70{ 68{
71 // 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
72 70
73 QString fileName = SlZDataBase::addressbookFileName(); 71 QString fileName = SlZDataBase::addressbookFileName();
74 init( fileName ); 72 init( fileName );
75} 73}
76 74
77ResourceSharpDTM::ResourceSharpDTM( const QString &fileName, bool syncable ) 75ResourceSharpDTM::ResourceSharpDTM( const QString &fileName, bool syncable )
78 : Resource( 0, syncable ) 76 : Resource( 0, syncable )
79{ 77{
80 init( fileName ); 78 init( fileName );
81} 79}
82 80
83void ResourceSharpDTM::init( const QString &fileName ) 81void ResourceSharpDTM::init( const QString &fileName )
84{ 82{
85 83
86 connect( &mDirWatch, SIGNAL( dirty(const QString&) ), SLOT( fileChanged() ) ); 84 connect( &mDirWatch, SIGNAL( dirty(const QString&) ), SLOT( fileChanged() ) );
87 connect( &mDirWatch, SIGNAL( created(const QString&) ), SLOT( fileChanged() ) ); 85 connect( &mDirWatch, SIGNAL( created(const QString&) ), SLOT( fileChanged() ) );
88 connect( &mDirWatch, SIGNAL( deleted(const QString&) ), SLOT( fileChanged() ) ); 86 connect( &mDirWatch, SIGNAL( deleted(const QString&) ), SLOT( fileChanged() ) );
89 87
90 setFileName( fileName ); 88 setFileName( fileName );
91} 89}
92 90
93ResourceSharpDTM::~ResourceSharpDTM() 91ResourceSharpDTM::~ResourceSharpDTM()
94{ 92{
95 if (mConverter != 0) 93 if (mConverter != 0)
96 delete mConverter; 94 delete mConverter;
97 95
98 if(mAccess != 0) 96 if(mAccess != 0)
99 delete mAccess; 97 delete mAccess;
100} 98}
101 99
102void ResourceSharpDTM::writeConfig( KConfig *config ) 100void ResourceSharpDTM::writeConfig( KConfig *config )
103{ 101{
104 Resource::writeConfig( config ); 102 Resource::writeConfig( config );
105} 103}
106 104
107Ticket *ResourceSharpDTM::requestSaveTicket() 105Ticket *ResourceSharpDTM::requestSaveTicket()
108{ 106{
109 107
110 108
111 qDebug("ResourceSharpDTM::requestSaveTicket: %s", fileName().latin1()); 109 qDebug("ResourceSharpDTM::requestSaveTicket: %s", fileName().latin1());
112 110
113 if ( !addressBook() ) return 0; 111 if ( !addressBook() ) return 0;
114 112
115#ifdef ALLOW_LOCKING 113#ifdef ALLOW_LOCKING
116 if ( !lock( fileName() ) ) { 114 if ( !lock( fileName() ) ) {
117 qDebug("ResourceSharpDTM::requestSaveTicket(): Unable to lock file "); 115 qDebug("ResourceSharpDTM::requestSaveTicket(): Unable to lock file ");
118 return 0; 116 return 0;
119 } 117 }
120#endif 118#endif
121 return createTicket( this ); 119 return createTicket( this );
122} 120}
123 121
124 122
125bool ResourceSharpDTM::doOpen() 123bool ResourceSharpDTM::doOpen()
126{ 124{
127 qDebug("ResourceSharpDTM::doOpen: %s", fileName().latin1()); 125 qDebug("ResourceSharpDTM::doOpen: %s", fileName().latin1());
128 126
129 // the last parameter in the SlZDataBase constructor means "readonly" 127 // the last parameter in the SlZDataBase constructor means "readonly"
130 mAccess = new SlZDataBase(fileName(), 128 mAccess = new SlZDataBase(fileName(),
131 SlZDataBase::addressbookItems(), 129 SlZDataBase::addressbookItems(),
132 NULL, false); 130 NULL, false);
133 131
134 if ( !mAccess ) { 132 if ( !mAccess ) {
135 qDebug("Unable to load file() %s", fileName().latin1()); 133 qDebug("Unable to load file() %s", fileName().latin1());
136 return false; 134 return false;
137 } 135 }
138 136
139 if (mConverter == 0) 137 if (mConverter == 0)
140 { 138 {
141 mConverter = new SharpDTMConverter(); 139 mConverter = new SharpDTMConverter();
142 bool res = mConverter->init(); 140 bool res = mConverter->init();
143 if ( !res ) 141 if ( !res )
144 { 142 {
145 QString msg("Unable to initialize sharp converter. Most likely a problem with the category file"); 143 QString msg("Unable to initialize sharp converter. Most likely a problem with the category file");
146 144
147 qDebug(msg); 145 qDebug(msg);
148 delete mAccess; 146 delete mAccess;
149 mAccess = 0; 147 mAccess = 0;
150 return false; 148 return false;
151 } 149 }
152 } 150 }
153 151
154 return true; 152 return true;
155} 153}
156 154
157void ResourceSharpDTM::doClose() 155void ResourceSharpDTM::doClose()
158{ 156{
159 qDebug("ResourceSharpDTM::doClose: %s", fileName().latin1()); 157 qDebug("ResourceSharpDTM::doClose: %s", fileName().latin1());
160 158
161 if(mAccess) 159 if(mAccess)
162 { 160 {
163 delete mAccess; 161 delete mAccess;
164 mAccess = 0; 162 mAccess = 0;
165 } 163 }
166 // it seems so, that deletion of access deletes backend as well 164 // it seems so, that deletion of access deletes backend as well
167 //delete backend; 165 //delete backend;
168 166
169 return; 167 return;
170} 168}
171 169
172bool ResourceSharpDTM::load() 170bool ResourceSharpDTM::load()
173{ 171{
174 qDebug("ResourceSharpDTM::load: %s", fileName().latin1()); 172 qDebug("ResourceSharpDTM::load: %s", fileName().latin1());
175 173
176 bool res = false; 174 bool res = false;
177 175
178 CardId id; 176 CardId id;
179 177
180 for (bool res=mAccess->first(); res == true; res=mAccess->next()) 178 for (bool res=mAccess->first(); res == true; res=mAccess->next())
181 { 179 {
182 id = mAccess->cardId(); 180 id = mAccess->cardId();
183 181
184 KABC::Addressee addressee; 182 KABC::Addressee addressee;
185 183
186 res = mConverter->sharpToAddressee( id, mAccess, addressee ); 184 res = mConverter->sharpToAddressee( id, mAccess, addressee );
187 185
188 if ( !addressee.isEmpty() && res ) 186 if ( !addressee.isEmpty() && res )
189 { 187 {
190 addressee.setResource( this ); 188 addressee.setResource( this );
191 addressBook()->insertAddressee( addressee ); 189 addressBook()->insertAddressee( addressee );
192 } 190 }
193 } 191 }
194 192
195 return true; 193 return true;
196} 194}
197 195
198bool ResourceSharpDTM::save( Ticket *ticket ) 196bool ResourceSharpDTM::save( Ticket *ticket )
199{ 197{
200 qDebug("ResourceSharpDTM::save: %s", fileName().latin1()); 198 qDebug("ResourceSharpDTM::save: %s", fileName().latin1());
201 199
202 mDirWatch.stopScan(); 200 mDirWatch.stopScan();
203 201
204 KABC::AddressBook::Iterator it; 202 KABC::AddressBook::Iterator it;
205 bool res; 203 bool res;
206 KABC::Addressee::List changedAddressees; 204 KABC::Addressee::List changedAddressees;
207 typedef QMap<int,QString> AddresseeMap; 205 typedef QMap<int,QString> AddresseeMap;
208 AddresseeMap map; 206 AddresseeMap map;
209 CardId id ; 207 CardId id ;
210 208
211 for ( it = addressBook()->begin(); it != addressBook()->end(); ++it ) { 209 for ( it = addressBook()->begin(); it != addressBook()->end(); ++it ) {
212 210
213 if ( (*it).tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { 211 if ( (*it).tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) {
214 QString uid = (*it).originalExternalUID(); 212 QString uid = (*it).originalExternalUID();
215 bool res; 213 bool res;
216 if ( uid.isEmpty() ) 214 if ( uid.isEmpty() )
217 id = 0; 215 id = 0;
218 else 216 else
219 id = uid.toUInt(); 217 id = uid.toUInt();
220 KABC::Addressee addressee = (*it); 218 KABC::Addressee addressee = (*it);
221 if ( (*it).tempSyncStat() == SYNC_TEMPSTATE_ADDED_EXTERNAL ) { 219 if ( (*it).tempSyncStat() == SYNC_TEMPSTATE_ADDED_EXTERNAL ) {
222 res = mAccess->startEditCard(id); 220 res = mAccess->startEditCard(id);
223 if (res == true) 221 if (res == true)
224 { 222 {
225 res = mConverter->addresseeToSharp( (*it), mAccess, id ); 223 res = mConverter->addresseeToSharp( (*it), mAccess, id );
226 if (res == true) 224 if (res == true)
227 { 225 {
228 res = mAccess->finishEditCard(&id); 226 res = mAccess->finishEditCard(&id);
229 //(*it).setTempSyncStat( SYNC_TEMPSTATE_NEW_ID ); 227 //(*it).setTempSyncStat( SYNC_TEMPSTATE_NEW_ID );
230 //(*it).setExternalUID( QString::number( id ) ); 228 //(*it).setExternalUID( QString::number( id ) );
231 //(*it).setOriginalExternalUID( QString::number( id ) ); 229 //(*it).setOriginalExternalUID( QString::number( id ) );
232 map.insert(id,(*it).uid()); 230 map.insert(id,(*it).uid());
233 if (res == false) 231 if (res == false)
234 qDebug("Unable to append Contact: %s", addressee.formattedName().latin1()); 232 qDebug("Unable to append Contact: %s", addressee.formattedName().latin1());
235 233
236 } 234 }
237 else 235 else
238 { 236 {
239 qDebug("Unable to convert Addressee: %s", addressee.formattedName().latin1()); 237 qDebug("Unable to convert Addressee: %s", addressee.formattedName().latin1());
240 mAccess->cancelEditCard(); 238 mAccess->cancelEditCard();
241 } 239 }
242 } 240 }
243 241
244 } else if ( (*it).tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { 242 } else if ( (*it).tempSyncStat() == SYNC_TEMPSTATE_DELETE ) {
245 res = mAccess->deleteCard(&id); 243 res = mAccess->deleteCard(&id);
246 if ( !res ) 244 if ( !res )
247 qDebug("delete error "); 245 qDebug("delete error ");
248 246
249 247
250 } else if ( (*it).tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { 248 } else if ( (*it).tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) {
251 //changed 249 //changed
252 res = mAccess->startEditCard(id); 250 res = mAccess->startEditCard(id);
253 if (res == true) 251 if (res == true)
254 { 252 {
255 res = mConverter->addresseeToSharp( (*it), mAccess, id ); 253 res = mConverter->addresseeToSharp( (*it), mAccess, id );
256 if (res == true) 254 if (res == true)
257 { 255 {
258 res = mAccess->finishEditCard(&id); 256 res = mAccess->finishEditCard(&id);
259 //(*it).setTempSyncStat( SYNC_TEMPSTATE_NEW_CSUM ); 257 //(*it).setTempSyncStat( SYNC_TEMPSTATE_NEW_CSUM );
260 map.insert(id,(*it).uid()); 258 map.insert(id,(*it).uid());
261 if (res == false) 259 if (res == false)
262 qDebug("Unable to append Contact: %s", addressee.formattedName().latin1()); 260 qDebug("Unable to append Contact: %s", addressee.formattedName().latin1());
263 261
264 } 262 }
265 else 263 else
266 { 264 {
267 qDebug("Unable to convert Addressee: %s", addressee.formattedName().latin1()); 265 qDebug("Unable to convert Addressee: %s", addressee.formattedName().latin1());
268 mAccess->cancelEditCard(); 266 mAccess->cancelEditCard();
269 } 267 }
270 } 268 }
271 } 269 }
272 } 270 }
273 271
274 } 272 }
275 AddresseeMap::Iterator itam; 273 AddresseeMap::Iterator itam;
276 for ( res=mAccess->first(); res == true; res=mAccess->next()) 274 for ( res=mAccess->first(); res == true; res=mAccess->next())
277 { 275 {
278 id = mAccess->cardId(); 276 id = mAccess->cardId();
279 int idint = id; 277 int idint = id;
280 itam = map.find( idint ); 278 itam = map.find( idint );
281 if ( itam != map.end() ) { 279 if ( itam != map.end() ) {
282 KABC::Addressee addressee; 280 KABC::Addressee addressee;
283 res = mConverter->sharpToAddressee( id, mAccess, addressee ); 281 res = mConverter->sharpToAddressee( id, mAccess, addressee );
284 282
285 if ( !addressee.isEmpty() && res ) 283 if ( !addressee.isEmpty() && res )
286 { 284 {
287 addressee.setResource( this ); 285 addressee.setResource( this );
288 addressee.setUid( itam.data() ); 286 addressee.setUid( itam.data() );
289 addressee.setTempSyncStat( SYNC_TEMPSTATE_NEW_ID ); 287 addressee.setTempSyncStat( SYNC_TEMPSTATE_NEW_ID );
290 addressBook()->insertAddressee( addressee , false ); 288 addressBook()->insertAddressee( addressee , false );
291 } 289 }
292 } 290 }
293 } 291 }
294 292
295 //US mAccess->save(); 293 //US mAccess->save();
296 294
297 mDirWatch.startScan(); 295 mDirWatch.startScan();
298 delete ticket; 296 delete ticket;
299 unlock( fileName() ); 297 unlock( fileName() );
300 298
301 return true; 299 return true;
302} 300}
303 301
304bool ResourceSharpDTM::lock( const QString &lockfileName ) 302bool ResourceSharpDTM::lock( const QString &lockfileName )
305{ 303{
306#ifdef ALLOW_LOCKING 304#ifdef ALLOW_LOCKING
307 qDebug("ResourceSharpDTM::lock: %s", fileName().latin1()); 305 qDebug("ResourceSharpDTM::lock: %s", fileName().latin1());
308 306
309 kdDebug(5700) << "ResourceSharpDTM::lock()" << endl; 307 kdDebug(5700) << "ResourceSharpDTM::lock()" << endl;
310 308
311 QString fn = lockfileName; 309 QString fn = lockfileName;
312 310
313 KURL url(fn); 311 KURL url(fn);
314 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" ); 312 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" );
315 313
316 kdDebug(5700) << "-- lock name: " << lockName << endl; 314 kdDebug(5700) << "-- lock name: " << lockName << endl;
317 315
318 if (QFile::exists( lockName )) 316 if (QFile::exists( lockName ))
319 { 317 {
320 qDebug("ResourceSharpDTM::lock: lockfile %s already exists. (Delete it before continuing if nobody else is accessing the resourcefile %s)", lockName.latin1(), fileName()); 318 qDebug("ResourceSharpDTM::lock: lockfile %s already exists. (Delete it before continuing if nobody else is accessing the resourcefile %s)", lockName.latin1(), fileName());
321 return false; 319 return false;
322 } 320 }
323 321
324 322
325 QString lockUniqueName; 323 QString lockUniqueName;
326 lockUniqueName = fn + KApplication::randomString( 8 ); 324 lockUniqueName = fn + KApplication::randomString( 8 );
327 325
328 url = lockUniqueName; 326 url = lockUniqueName;
329//US mLockUniqueName = locateLocal( "data", "kabc/lock/" + lockUniqueName ); 327//US mLockUniqueName = locateLocal( "data", "kabc/lock/" + lockUniqueName );
330 mLockUniqueName = locateLocal( "data", "kabc/lock/" + url.fileName() ); 328 mLockUniqueName = locateLocal( "data", "kabc/lock/" + url.fileName() );
331 kdDebug(5700) << "-- lock unique name: " << mLockUniqueName << endl; 329 kdDebug(5700) << "-- lock unique name: " << mLockUniqueName << endl;
332 330
333 // Create unique file 331 // Create unique file
334 QFile file( mLockUniqueName ); 332 QFile file( mLockUniqueName );
335 file.open( IO_WriteOnly ); 333 file.open( IO_WriteOnly );
336 file.close(); 334 file.close();
337 335
338 // Create lock file 336 // Create lock file
339 int result = 0; 337 int result = 0;
340#ifndef _WIN32_ 338#ifndef _WIN32_
341 result = ::link( QFile::encodeName( mLockUniqueName ), 339 result = ::link( QFile::encodeName( mLockUniqueName ),
342 QFile::encodeName( lockName ) ); 340 QFile::encodeName( lockName ) );
343#endif 341#endif
344 if ( result == 0 ) { 342 if ( result == 0 ) {
345 addressBook()->emitAddressBookLocked(); 343 addressBook()->emitAddressBookLocked();
346 return true; 344 return true;
347 } 345 }
348 346
349 // TODO: check stat 347 // TODO: check stat
350 348
351 return false; 349 return false;
352#else 350#else
353 return true; 351 return true;
354#endif 352#endif
355} 353}
356 354
357void ResourceSharpDTM::unlock( const QString &fileName ) 355void ResourceSharpDTM::unlock( const QString &fileName )
358{ 356{
359#ifdef ALLOW_LOCKING 357#ifdef ALLOW_LOCKING
360 qDebug("ResourceSharpDTM::unlock() %s", fileName.latin1()); 358 qDebug("ResourceSharpDTM::unlock() %s", fileName.latin1());
361 359
362 QString fn = fileName; 360 QString fn = fileName;
363 KURL url(fn); 361 KURL url(fn);
364 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" ); 362 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" );
365 363
366 QFile::remove( lockName ); 364 QFile::remove( lockName );
367 QFile::remove( mLockUniqueName ); 365 QFile::remove( mLockUniqueName );
368 addressBook()->emitAddressBookUnlocked(); 366 addressBook()->emitAddressBookUnlocked();
369#endif 367#endif
370} 368}
371 369
372void ResourceSharpDTM::setFileName( const QString &newFileName ) 370void ResourceSharpDTM::setFileName( const QString &newFileName )
373{ 371{
374 mDirWatch.stopScan(); 372 mDirWatch.stopScan();
375 mDirWatch.removeFile( fileName() ); 373 mDirWatch.removeFile( fileName() );
376 374
377 Resource::setFileName( newFileName ); 375 Resource::setFileName( newFileName );
378 376
379 mDirWatch.addFile( fileName() ); 377 mDirWatch.addFile( fileName() );
380 mDirWatch.startScan(); 378 mDirWatch.startScan();
381 379
382} 380}
383 381
384void ResourceSharpDTM::fileChanged() 382void ResourceSharpDTM::fileChanged()
385{ 383{
386 // There is a small theoretical chance that KDirWatch calls us before 384 // There is a small theoretical chance that KDirWatch calls us before
387 // we are fully constructed 385 // we are fully constructed
388 if (!addressBook()) 386 if (!addressBook())
389 return; 387 return;
390 388
391 QString text( i18n( "Sharp DTM resource '%1'<br> has been changed by third party.<br>Do you want to reload?").arg( fileName() ) ); 389 QString text( i18n( "Sharp DTM resource '%1'<br> has been changed by third party.<br>Do you want to reload?").arg( fileName() ) );
392 if ( readOnly() || KMessageBox::questionYesNo( 0, text ) == KMessageBox::Yes ) { 390 if ( readOnly() || KMessageBox::questionYesNo( 0, text ) == KMessageBox::Yes ) {
393 load(); 391 load();
394 addressBook()->emitAddressBookChanged(); 392 addressBook()->emitAddressBookChanged();
395 } 393 }
396} 394}
397 395
398void ResourceSharpDTM::removeAddressee( const Addressee &addr ) 396void ResourceSharpDTM::removeAddressee( const Addressee &addr )
399{ 397{
400} 398}
401 399
402void ResourceSharpDTM::cleanUp() 400void ResourceSharpDTM::cleanUp()
403{ 401{
404 unlock( fileName() ); 402 unlock( fileName() );
405} 403}
406 404
407 405
408 406
diff --git a/kabc/plugins/sharpdtm/resourcesharpdtm.h b/kabc/plugins/sharpdtm/resourcesharpdtm.h
index f386e69..64d06f9 100644
--- a/kabc/plugins/sharpdtm/resourcesharpdtm.h
+++ b/kabc/plugins/sharpdtm/resourcesharpdtm.h
@@ -1,146 +1,146 @@
1/* 1/*
2 This file is part of libkabc. 2 This file is part of libkabc.
3 Copyright (c) 2004 Ulf Schenk 3 Copyright (c) 2004 Ulf Schenk
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21/* 21/*
22Enhanced Version of the file for platform independent KDE tools. 22Enhanced Version of the file for platform independent KDE tools.
23Copyright (c) 2004 Ulf Schenk 23Copyright (c) 2004 Ulf Schenk
24 24
25$Id$ 25$Id$
26*/ 26*/
27 27
28 28
29#ifndef KABC_RESOURCESHARPDTM_H 29#ifndef KABC_RESOURCESHARPDTM_H
30#define KABC_RESOURCESHARPDTM_H 30#define KABC_RESOURCESHARPDTM_H
31 31
32#include <kconfig.h> 32#include <kconfig.h>
33#include <kdirwatch.h> 33#include <kdirwatch.h>
34 34
35#include <sys/types.h> 35#include <sys/types.h>
36 36
37#include "resource.h" 37#include "resource.h"
38 38
39 39
40class SlZDataBase; 40class SlZDataBase;
41 41
42namespace KABC { 42namespace KABC {
43 43
44class ResourceConfigWidget; 44class ResourceConfigWidget;
45class SharpDTMConverter; 45class SharpDTMConverter;
46 46
47/** 47/**
48 @internal 48 @internal
49*/ 49*/
50class ResourceSharpDTM : public Resource 50class ResourceSharpDTM : public Resource
51{ 51{
52 Q_OBJECT 52 Q_OBJECT
53 53
54public: 54public:
55 55
56 /** 56 /**
57 Constructor. 57 Constructor.
58 58
59 @param cfg The config object where custom resource settings are stored. 59 @param cfg The config object where custom resource settings are stored.
60 */ 60 */
61 ResourceSharpDTM( const KConfig *cfg, bool syncable ); 61 ResourceSharpDTM( const KConfig *cfg );
62 62
63 /** 63 /**
64 Construct file resource on file @arg fileName using format @arg formatName. 64 Construct file resource on file @arg fileName using format @arg formatName.
65 */ 65 */
66 ResourceSharpDTM( const QString &fileName, bool syncable ); 66 ResourceSharpDTM( const QString &fileName );
67 67
68 /** 68 /**
69 * Destructor. 69 * Destructor.
70 */ 70 */
71 ~ResourceSharpDTM(); 71 ~ResourceSharpDTM();
72 72
73 /** 73 /**
74 Writes the config back. 74 Writes the config back.
75 */ 75 */
76 virtual void writeConfig( KConfig *cfg ); 76 virtual void writeConfig( KConfig *cfg );
77 77
78 /** 78 /**
79 * Tries to open the file and checks for the proper format. 79 * Tries to open the file and checks for the proper format.
80 * This method should be called before @ref load(). 80 * This method should be called before @ref load().
81 */ 81 */
82 virtual bool doOpen(); 82 virtual bool doOpen();
83 83
84 /** 84 /**
85 * Closes the file again. 85 * Closes the file again.
86 */ 86 */
87 virtual void doClose(); 87 virtual void doClose();
88 88
89 /** 89 /**
90 * Requests a save ticket, that is used by @ref save() 90 * Requests a save ticket, that is used by @ref save()
91 */ 91 */
92 virtual Ticket *requestSaveTicket(); 92 virtual Ticket *requestSaveTicket();
93 93
94 /** 94 /**
95 * Loads all addressees from file to the address book. 95 * Loads all addressees from file to the address book.
96 * Returns true if all addressees could be loaded otherwise false. 96 * Returns true if all addressees could be loaded otherwise false.
97 */ 97 */
98 virtual bool load(); 98 virtual bool load();
99 99
100 /** 100 /**
101 * Saves all addresses from address book to file. 101 * Saves all addresses from address book to file.
102 * Returns true if all addressees could be saved otherwise false. 102 * Returns true if all addressees could be saved otherwise false.
103 * 103 *
104 * @param ticket The ticket returned by @ref requestSaveTicket() 104 * @param ticket The ticket returned by @ref requestSaveTicket()
105 */ 105 */
106 virtual bool save( Ticket *ticket ); 106 virtual bool save( Ticket *ticket );
107 107
108 /** 108 /**
109 * Remove a addressee from its source. 109 * Remove a addressee from its source.
110 * This method is mainly called by KABC::AddressBook. 110 * This method is mainly called by KABC::AddressBook.
111 */ 111 */
112 virtual void removeAddressee( const Addressee& addr ); 112 virtual void removeAddressee( const Addressee& addr );
113 113
114 /** 114 /**
115 * Set name of file to be used for saving. 115 * Set name of file to be used for saving.
116 */ 116 */
117 virtual void setFileName( const QString & ); 117 virtual void setFileName( const QString & );
118 118
119 /** 119 /**
120 * This method is called by an error handler if the application 120 * This method is called by an error handler if the application
121 * crashed 121 * crashed
122 */ 122 */
123 virtual void cleanUp(); 123 virtual void cleanUp();
124 124
125 125
126protected slots: 126protected slots:
127 void fileChanged(); 127 void fileChanged();
128 128
129protected: 129protected:
130 void init( const QString &fileName ); 130 void init( const QString &fileName );
131 131
132 bool lock( const QString &fileName ); 132 bool lock( const QString &fileName );
133 void unlock( const QString &fileName ); 133 void unlock( const QString &fileName );
134 134
135private: 135private:
136 SlZDataBase* mAccess; 136 SlZDataBase* mAccess;
137 SharpDTMConverter* mConverter; 137 SharpDTMConverter* mConverter;
138 138
139 QString mLockUniqueName; 139 QString mLockUniqueName;
140 140
141 KDirWatch mDirWatch; 141 KDirWatch mDirWatch;
142}; 142};
143 143
144} 144}
145 145
146#endif 146#endif
diff --git a/kabc/resource.cpp b/kabc/resource.cpp
index 7b91239..267cdaf 100644
--- a/kabc/resource.cpp
+++ b/kabc/resource.cpp
@@ -1,144 +1,116 @@
1/* 1/*
2 This file is part of libkabc. 2 This file is part of libkabc.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21/* 21/*
22Enhanced Version of the file for platform independent KDE tools. 22Enhanced Version of the file for platform independent KDE tools.
23Copyright (c) 2004 Ulf Schenk 23Copyright (c) 2004 Ulf Schenk
24 24
25$Id$ 25$Id$
26*/ 26*/
27 27
28#include <kdebug.h> 28#include <kdebug.h>
29 29
30#include <ksyncprofile.h>
31
32#include "resource.h" 30#include "resource.h"
33 31
34using namespace KABC; 32using namespace KABC;
35 33
36Resource::Resource( const KConfig *config, bool syncable ) 34Resource::Resource( const KConfig *config )
37 : KRES::Resource( config ), mAddressBook( 0 ), mSyncProfile( 0 ) 35 : KRES::Resource( config ), mAddressBook( 0 )
38{ 36{
39 if(syncable == true) {
40 mSyncProfile = new KSyncProfile( );
41 mSyncProfile->setName("pending" /*resourceName()*/);
42 mSyncProfile->readConfig( (KConfig *)config );
43 }
44} 37}
45 38
46Resource::~Resource() 39Resource::~Resource()
47{ 40{
48 if (mSyncProfile != 0) {
49 delete mSyncProfile;
50 }
51} 41}
52 42
53void Resource::writeConfig( KConfig *config ) 43void Resource::writeConfig( KConfig *config )
54{ 44{
55 KRES::Resource::writeConfig( config ); 45 KRES::Resource::writeConfig( config );
56
57 if(mSyncProfile != 0)
58 mSyncProfile->writeConfig( config );
59} 46}
60 47
61 48
62void Resource::setAddressBook( AddressBook *ab ) 49void Resource::setAddressBook( AddressBook *ab )
63{ 50{
64 mAddressBook = ab; 51 mAddressBook = ab;
65} 52}
66 53
67AddressBook *Resource::addressBook() 54AddressBook *Resource::addressBook()
68{ 55{
69 return mAddressBook; 56 return mAddressBook;
70} 57}
71 58
72bool Resource::doOpen() 59bool Resource::doOpen()
73{ 60{
74 return true; 61 return true;
75} 62}
76 63
77void Resource::doClose() 64void Resource::doClose()
78{ 65{
79} 66}
80 67
81Ticket *Resource::requestSaveTicket() 68Ticket *Resource::requestSaveTicket()
82{ 69{
83 return 0; 70 return 0;
84} 71}
85 72
86bool Resource::load() 73bool Resource::load()
87{ 74{
88 return true; 75 return true;
89} 76}
90 77
91bool Resource::save( Ticket * ) 78bool Resource::save( Ticket * )
92{ 79{
93 return false; 80 return false;
94} 81}
95 82
96Ticket *Resource::createTicket( Resource *resource ) 83Ticket *Resource::createTicket( Resource *resource )
97{ 84{
98 return new Ticket( resource ); 85 return new Ticket( resource );
99} 86}
100 87
101void Resource::removeAddressee( const Addressee& ) 88void Resource::removeAddressee( const Addressee& )
102{ 89{
103 // do nothing 90 // do nothing
104} 91}
105 92
106void Resource::cleanUp() 93void Resource::cleanUp()
107{ 94{
108 // do nothing 95 // do nothing
109} 96}
110 97
111bool Resource::isSyncable() const
112{
113 return (mSyncProfile != 0);
114}
115
116KSyncProfile* Resource::getSyncProfile()
117{
118 return mSyncProfile;
119}
120
121
122QString Resource::fileName() const 98QString Resource::fileName() const
123{ 99{
124 return mFileName; 100 return mFileName;
125} 101}
126 102
127void Resource::setFileName( const QString &fileName ) 103void Resource::setFileName( const QString &fileName )
128{ 104{
129 mFileName = fileName; 105 mFileName = fileName;
130} 106}
131 107
132/** 108/**
133 * Set the name of resource.You can override this method, 109 * Set the name of resource.You can override this method,
134 * but also remember to call Resource::setResourceName(). 110 * but also remember to call Resource::setResourceName().
135 */ 111 */
136void Resource::setResourceName( const QString &name ) 112void Resource::setResourceName( const QString &name )
137{ 113{
138 KRES::Resource::setResourceName(name); 114 KRES::Resource::setResourceName(name);
139 if(mSyncProfile != 0) {
140 mSyncProfile->setName( name );
141 }
142
143} 115}
144 116
diff --git a/kabc/resource.h b/kabc/resource.h
index 2024d2d..e5f0d5d 100644
--- a/kabc/resource.h
+++ b/kabc/resource.h
@@ -1,171 +1,157 @@
1/* 1/*
2 This file is part of libkabc. 2 This file is part of libkabc.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21/* 21/*
22Enhanced Version of the file for platform independent KDE tools. 22Enhanced Version of the file for platform independent KDE tools.
23Copyright (c) 2004 Ulf Schenk 23Copyright (c) 2004 Ulf Schenk
24 24
25$Id$ 25$Id$
26*/ 26*/
27 27
28#ifndef KABC_RESOURCE_H 28#ifndef KABC_RESOURCE_H
29#define KABC_RESOURCE_H 29#define KABC_RESOURCE_H
30 30
31#include <kresources/resource.h> 31#include <kresources/resource.h>
32 32
33 33
34#include "addressbook.h" 34#include "addressbook.h"
35 35
36class KSyncProfile;
37
38namespace KABC { 36namespace KABC {
39 37
40/** 38/**
41 * @short Helper class for handling coordinated save of address books. 39 * @short Helper class for handling coordinated save of address books.
42 * 40 *
43 * This class is used as helper class for saving address book. 41 * This class is used as helper class for saving address book.
44 * @see requestSaveTicket(), save(). 42 * @see requestSaveTicket(), save().
45 */ 43 */
46class Ticket 44class Ticket
47{ 45{
48 friend class Resource; 46 friend class Resource;
49 public: 47 public:
50 Resource *resource() { return mResource; } 48 Resource *resource() { return mResource; }
51 49
52 private: 50 private:
53 Ticket( Resource *resource ) : mResource( resource ) {} 51 Ticket( Resource *resource ) : mResource( resource ) {}
54 52
55 Resource *mResource; 53 Resource *mResource;
56}; 54};
57 55
58/** 56/**
59 * @internal 57 * @internal
60 */ 58 */
61class Resource : public KRES::Resource 59class Resource : public KRES::Resource
62{ 60{
63private:
64 /**
65 * make this constructor private to force everybody to use the other one
66 */
67 Resource( const KConfig *config);
68
69public: 61public:
70 /** 62 /**
71 * Constructor 63 * Constructor
72 */ 64 */
73 Resource( const KConfig *config, bool syncable ); 65 Resource( const KConfig *config );
74 66
75 /** 67 /**
76 * Destructor. 68 * Destructor.
77 */ 69 */
78 virtual ~Resource(); 70 virtual ~Resource();
79 71
80 /** 72 /**
81 * Sets the address book of the resource. 73 * Sets the address book of the resource.
82 */ 74 */
83 void setAddressBook( AddressBook* ); 75 void setAddressBook( AddressBook* );
84 76
85 /** 77 /**
86 * Returns a pointer to the addressbook. 78 * Returns a pointer to the addressbook.
87 */ 79 */
88 AddressBook *addressBook(); 80 AddressBook *addressBook();
89 81
90 /** 82 /**
91 * Writes the resource specific config to file. 83 * Writes the resource specific config to file.
92 */ 84 */
93 virtual void writeConfig( KConfig *config ); 85 virtual void writeConfig( KConfig *config );
94 86
95 /** 87 /**
96 * Open the resource and returns if it was successfully 88 * Open the resource and returns if it was successfully
97 */ 89 */
98 virtual bool doOpen(); 90 virtual bool doOpen();
99 91
100 92
101 /** 93 /**
102 * Request a ticket, you have to pass through @ref save() to 94 * Request a ticket, you have to pass through @ref save() to
103 * allow locking. 95 * allow locking.
104 */ 96 */
105 virtual Ticket *requestSaveTicket(); 97 virtual Ticket *requestSaveTicket();
106 98
107 /** 99 /**
108 * Load all addressees to the addressbook 100 * Load all addressees to the addressbook
109 */ 101 */
110 virtual bool load(); 102 virtual bool load();
111 103
112 /** 104 /**
113 * Save all addressees to the addressbook. 105 * Save all addressees to the addressbook.
114 * 106 *
115 * @param ticket The ticket you get by @ref requestSaveTicket() 107 * @param ticket The ticket you get by @ref requestSaveTicket()
116 */ 108 */
117 virtual bool save( Ticket *ticket ); 109 virtual bool save( Ticket *ticket );
118 110
119 /** 111 /**
120 * Removes a addressee from resource. This method is mainly 112 * Removes a addressee from resource. This method is mainly
121 * used by record-based resources like LDAP or SQL. 113 * used by record-based resources like LDAP or SQL.
122 */ 114 */
123 virtual void removeAddressee( const Addressee& addr ); 115 virtual void removeAddressee( const Addressee& addr );
124 116
125 117
126 /** 118 /**
127 * This method is called by an error handler if the application 119 * This method is called by an error handler if the application
128 * crashed 120 * crashed
129 */ 121 */
130 virtual void cleanUp(); 122 virtual void cleanUp();
131 123
132 /** 124 /**
133 * Set name of file to be used for saving. 125 * Set name of file to be used for saving.
134 */ 126 */
135 virtual void setFileName( const QString & ); 127 virtual void setFileName( const QString & );
136 128
137 /** 129 /**
138 * Return name of file used for loading and saving the address book. 130 * Return name of file used for loading and saving the address book.
139 */ 131 */
140 virtual QString fileName() const; 132 virtual QString fileName() const;
141 133
142
143 virtual bool isSyncable() const;
144
145 virtual KSyncProfile* getSyncProfile();
146
147 /** 134 /**
148 * Set the name of resource.You can override this method, 135 * Set the name of resource.You can override this method,
149 * but also remember to call Resource::setResourceName(). 136 * but also remember to call Resource::setResourceName().
150 */ 137 */
151 virtual void setResourceName( const QString &name ); 138 virtual void setResourceName( const QString &name );
152 139
153 140
154 141
155protected: 142protected:
156 Ticket *createTicket( Resource * ); 143 Ticket *createTicket( Resource * );
157 virtual void doClose(); 144 virtual void doClose();
158 145
159private: 146private:
160 AddressBook *mAddressBook; 147 AddressBook *mAddressBook;
161 KSyncProfile *mSyncProfile;
162 QString mFileName; 148 QString mFileName;
163 149
164}; 150};
165 151
166 152
167} 153}
168 154
169 155
170 156
171#endif 157#endif