summaryrefslogtreecommitdiffabout
path: root/kabc/plugins
authorulf69 <ulf69>2004-08-04 22:45:22 (UTC)
committer ulf69 <ulf69>2004-08-04 22:45:22 (UTC)
commitc3a704f5acda9cf9fee66e5c0b1b864f3b7dd852 (patch) (unidiff)
treedc59744a6d59ba241e793ce051da485d0bf16d06 /kabc/plugins
parentb83866e08ddcc5cb2734801977927f48b53a2e1c (diff)
downloadkdepimpi-c3a704f5acda9cf9fee66e5c0b1b864f3b7dd852.zip
kdepimpi-c3a704f5acda9cf9fee66e5c0b1b864f3b7dd852.tar.gz
kdepimpi-c3a704f5acda9cf9fee66e5c0b1b864f3b7dd852.tar.bz2
final changes for addressbook sync config dialog
Diffstat (limited to 'kabc/plugins') (more/less context) (ignore whitespace changes)
-rw-r--r--kabc/plugins/dir/resourcedir.cpp2
-rw-r--r--kabc/plugins/file/resourcefile.cpp28
-rw-r--r--kabc/plugins/ldap/resourceldap.cpp2
-rw-r--r--kabc/plugins/opie/resourceopie.cpp2
-rw-r--r--kabc/plugins/qtopia/resourceqtopia.cpp2
-rw-r--r--kabc/plugins/sharpdtm/resourcesharpdtm.cpp2
6 files changed, 14 insertions, 24 deletions
diff --git a/kabc/plugins/dir/resourcedir.cpp b/kabc/plugins/dir/resourcedir.cpp
index 29f1e3a..eccd482 100644
--- a/kabc/plugins/dir/resourcedir.cpp
+++ b/kabc/plugins/dir/resourcedir.cpp
@@ -1,365 +1,365 @@
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#include "resourcedir.h" 59#include "resourcedir.h"
60#include "syncprefwidget.h" 60#include "syncprefwidget.h"
61 61
62using namespace KABC; 62using namespace KABC;
63 63
64extern "C" 64extern "C"
65#ifdef _WIN32_ 65#ifdef _WIN32_
66__declspec(dllexport) 66__declspec(dllexport)
67#else 67#else
68{ 68{
69#endif 69#endif
70 70
71//US void *init_kabc_dir() 71//US void *init_kabc_dir()
72 void *init_microkabc_dir() 72 void *init_microkabc_dir()
73 { 73 {
74 return new KRES::PluginFactory<ResourceDir,ResourceDirConfig, SyncPrefWidget>(); 74 return new KRES::PluginFactory<ResourceDir,ResourceDirConfig, SyncPrefWidgetContainer>();
75 } 75 }
76#ifndef _WIN32_ 76#ifndef _WIN32_
77} 77}
78#endif 78#endif
79 79
80ResourceDir::ResourceDir( const KConfig *config, bool syncable ) 80ResourceDir::ResourceDir( const KConfig *config, bool syncable )
81 : Resource( config, syncable ) 81 : Resource( config, syncable )
82{ 82{
83 QString path; 83 QString path;
84 84
85 KConfig *cfg = (KConfig *)config; 85 KConfig *cfg = (KConfig *)config;
86 if ( cfg ) { 86 if ( cfg ) {
87//US path = config->readEntry( "FilePath" ); 87//US path = config->readEntry( "FilePath" );
88 path = cfg->readEntry( "FilePath", StdAddressBook::directoryName() ); 88 path = cfg->readEntry( "FilePath", StdAddressBook::directoryName() );
89//US mFormatName = config->readEntry( "FileFormat" ); 89//US mFormatName = config->readEntry( "FileFormat" );
90 mFormatName = cfg->readEntry( "FileFormat", "vcard" ); 90 mFormatName = cfg->readEntry( "FileFormat", "vcard" );
91 } else { 91 } else {
92 path = StdAddressBook::directoryName(); 92 path = StdAddressBook::directoryName();
93 mFormatName = "vcard"; 93 mFormatName = "vcard";
94 } 94 }
95 95
96 96
97 FormatFactory *factory = FormatFactory::self(); 97 FormatFactory *factory = FormatFactory::self();
98 mFormat = factory->format( mFormatName ); 98 mFormat = factory->format( mFormatName );
99 99
100 if ( !mFormat ) { 100 if ( !mFormat ) {
101 mFormatName = "vcard"; 101 mFormatName = "vcard";
102 mFormat = factory->format( mFormatName ); 102 mFormat = factory->format( mFormatName );
103 } 103 }
104 104
105/*US 105/*US
106//US qDebug("ResourceDir::ResourceDir initialized with format %s ", mFormatName.latin1()); 106//US qDebug("ResourceDir::ResourceDir initialized with format %s ", mFormatName.latin1());
107 if (mFormatName == "vcard") 107 if (mFormatName == "vcard")
108 mFormat = new VCardFormatPlugin2(); 108 mFormat = new VCardFormatPlugin2();
109 else if (mFormatName == "binary") 109 else if (mFormatName == "binary")
110 mFormat = new BinaryFormat(); 110 mFormat = new BinaryFormat();
111 else 111 else
112 qDebug("ResourceFile::init format unknown !!! %s ", mFormatName.latin1()); 112 qDebug("ResourceFile::init format unknown !!! %s ", mFormatName.latin1());
113*/ 113*/
114 114
115 connect( &mDirWatch, SIGNAL( dirty(const QString&) ), SLOT( pathChanged() ) ); 115 connect( &mDirWatch, SIGNAL( dirty(const QString&) ), SLOT( pathChanged() ) );
116 connect( &mDirWatch, SIGNAL( created(const QString&) ), SLOT( pathChanged() ) ); 116 connect( &mDirWatch, SIGNAL( created(const QString&) ), SLOT( pathChanged() ) );
117 connect( &mDirWatch, SIGNAL( deleted(const QString&) ), SLOT( pathChanged() ) ); 117 connect( &mDirWatch, SIGNAL( deleted(const QString&) ), SLOT( pathChanged() ) );
118 118
119 setPath( path ); 119 setPath( path );
120} 120}
121 121
122ResourceDir::~ResourceDir() 122ResourceDir::~ResourceDir()
123{ 123{
124 delete mFormat; 124 delete mFormat;
125 mFormat = 0; 125 mFormat = 0;
126} 126}
127 127
128void ResourceDir::writeConfig( KConfig *config ) 128void ResourceDir::writeConfig( KConfig *config )
129{ 129{
130 config->setGroup( "Resource_" + identifier() ); 130 config->setGroup( "Resource_" + identifier() );
131 Resource::writeConfig( config ); 131 Resource::writeConfig( config );
132 132
133 config->writeEntry( "FilePath", mPath ); 133 config->writeEntry( "FilePath", mPath );
134 config->writeEntry( "FileFormat", mFormatName ); 134 config->writeEntry( "FileFormat", mFormatName );
135} 135}
136 136
137Ticket *ResourceDir::requestSaveTicket() 137Ticket *ResourceDir::requestSaveTicket()
138{ 138{
139 kdDebug(5700) << "ResourceDir::requestSaveTicket()" << endl; 139 kdDebug(5700) << "ResourceDir::requestSaveTicket()" << endl;
140 140
141 if ( !addressBook() ) return 0; 141 if ( !addressBook() ) return 0;
142 142
143 if ( !lock( mPath ) ) { 143 if ( !lock( mPath ) ) {
144 kdDebug(5700) << "ResourceDir::requestSaveTicket(): Unable to lock path '" 144 kdDebug(5700) << "ResourceDir::requestSaveTicket(): Unable to lock path '"
145 << mPath << "'" << endl; 145 << mPath << "'" << endl;
146 return 0; 146 return 0;
147 } 147 }
148 return createTicket( this ); 148 return createTicket( this );
149} 149}
150 150
151 151
152bool ResourceDir::doOpen() 152bool ResourceDir::doOpen()
153{ 153{
154 QDir dir( mPath ); 154 QDir dir( mPath );
155 if ( !dir.exists() ) { // no directory available 155 if ( !dir.exists() ) { // no directory available
156 return dir.mkdir( dir.path() ); 156 return dir.mkdir( dir.path() );
157 } else { 157 } else {
158 QString testName = dir.entryList( QDir::Files )[0]; 158 QString testName = dir.entryList( QDir::Files )[0];
159 if ( testName.isNull() || testName.isEmpty() ) // no file in directory 159 if ( testName.isNull() || testName.isEmpty() ) // no file in directory
160 return true; 160 return true;
161 161
162 QFile file( mPath + "/" + testName ); 162 QFile file( mPath + "/" + testName );
163 if ( file.open( IO_ReadOnly ) ) 163 if ( file.open( IO_ReadOnly ) )
164 return true; 164 return true;
165 165
166 if ( file.size() == 0 ) 166 if ( file.size() == 0 )
167 return true; 167 return true;
168 168
169 bool ok = mFormat->checkFormat( &file ); 169 bool ok = mFormat->checkFormat( &file );
170 file.close(); 170 file.close();
171 return ok; 171 return ok;
172 } 172 }
173} 173}
174 174
175void ResourceDir::doClose() 175void ResourceDir::doClose()
176{ 176{
177} 177}
178 178
179bool ResourceDir::load() 179bool ResourceDir::load()
180{ 180{
181 kdDebug(5700) << "ResourceDir::load(): '" << mPath << "'" << endl; 181 kdDebug(5700) << "ResourceDir::load(): '" << mPath << "'" << endl;
182 182
183 QDir dir( mPath ); 183 QDir dir( mPath );
184 QStringList files = dir.entryList( QDir::Files ); 184 QStringList files = dir.entryList( QDir::Files );
185 185
186 QStringList::Iterator it; 186 QStringList::Iterator it;
187 bool ok = true; 187 bool ok = true;
188 for ( it = files.begin(); it != files.end(); ++it ) { 188 for ( it = files.begin(); it != files.end(); ++it ) {
189 QFile file( mPath + "/" + (*it) ); 189 QFile file( mPath + "/" + (*it) );
190 190
191 if ( !file.open( IO_ReadOnly ) ) { 191 if ( !file.open( IO_ReadOnly ) ) {
192 addressBook()->error( i18n( "Unable to open file '%1' for reading" ).arg( file.name() ) ); 192 addressBook()->error( i18n( "Unable to open file '%1' for reading" ).arg( file.name() ) );
193 ok = false; 193 ok = false;
194 continue; 194 continue;
195 } 195 }
196 196
197 if ( !mFormat->loadAll( addressBook(), this, &file ) ) 197 if ( !mFormat->loadAll( addressBook(), this, &file ) )
198 ok = false; 198 ok = false;
199 199
200 file.close(); 200 file.close();
201 } 201 }
202 202
203 return ok; 203 return ok;
204} 204}
205 205
206bool ResourceDir::save( Ticket *ticket ) 206bool ResourceDir::save( Ticket *ticket )
207{ 207{
208 kdDebug(5700) << "ResourceDir::save(): '" << mPath << "'" << endl; 208 kdDebug(5700) << "ResourceDir::save(): '" << mPath << "'" << endl;
209 209
210 AddressBook::Iterator it; 210 AddressBook::Iterator it;
211 bool ok = true; 211 bool ok = true;
212 212
213 for ( it = addressBook()->begin(); it != addressBook()->end(); ++it ) { 213 for ( it = addressBook()->begin(); it != addressBook()->end(); ++it ) {
214 if ( (*it).resource() != this || !(*it).changed() ) 214 if ( (*it).resource() != this || !(*it).changed() )
215 continue; 215 continue;
216 216
217 QFile file( mPath + "/" + (*it).uid() ); 217 QFile file( mPath + "/" + (*it).uid() );
218 if ( !file.open( IO_WriteOnly ) ) { 218 if ( !file.open( IO_WriteOnly ) ) {
219 addressBook()->error( i18n( "Unable to open file '%1' for writing" ).arg( file.name() ) ); 219 addressBook()->error( i18n( "Unable to open file '%1' for writing" ).arg( file.name() ) );
220 continue; 220 continue;
221 } 221 }
222 222
223 mFormat->save( *it, &file ); 223 mFormat->save( *it, &file );
224 224
225 // mark as unchanged 225 // mark as unchanged
226 (*it).setChanged( false ); 226 (*it).setChanged( false );
227 227
228 file.close(); 228 file.close();
229 } 229 }
230 230
231 delete ticket; 231 delete ticket;
232 unlock( mPath ); 232 unlock( mPath );
233 233
234 return ok; 234 return ok;
235} 235}
236 236
237bool ResourceDir::lock( const QString &path ) 237bool ResourceDir::lock( const QString &path )
238{ 238{
239 kdDebug(5700) << "ResourceDir::lock()" << endl; 239 kdDebug(5700) << "ResourceDir::lock()" << endl;
240 240
241 QString p = path; 241 QString p = path;
242//US change the implementation how the lockfilename is getting created 242//US change the implementation how the lockfilename is getting created
243//US p.replace( QRegExp("/"), "_" ); 243//US p.replace( QRegExp("/"), "_" );
244//US QString lockName = locateLocal( "data", "kabc/lock/" + p + ".lock" ); 244//US QString lockName = locateLocal( "data", "kabc/lock/" + p + ".lock" );
245 KURL url(p); 245 KURL url(p);
246 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" ); 246 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" );
247 247
248 248
249 kdDebug(5700) << "-- lock name: " << lockName << endl; 249 kdDebug(5700) << "-- lock name: " << lockName << endl;
250 250
251 if ( QFile::exists( lockName ) ) return false; 251 if ( QFile::exists( lockName ) ) return false;
252 252
253 QString lockUniqueName; 253 QString lockUniqueName;
254 lockUniqueName = p + KApplication::randomString( 8 ); 254 lockUniqueName = p + KApplication::randomString( 8 );
255 255
256 url = lockUniqueName; 256 url = lockUniqueName;
257//US mLockUniqueName = locateLocal( "data", "kabc/lock/" + lockUniqueName ); 257//US mLockUniqueName = locateLocal( "data", "kabc/lock/" + lockUniqueName );
258 mLockUniqueName = locateLocal( "data", "kabc/lock/" + url.fileName() ); 258 mLockUniqueName = locateLocal( "data", "kabc/lock/" + url.fileName() );
259 259
260 kdDebug(5700) << "-- lock unique name: " << mLockUniqueName << endl; 260 kdDebug(5700) << "-- lock unique name: " << mLockUniqueName << endl;
261 261
262 // Create unique file 262 // Create unique file
263 QFile file( mLockUniqueName ); 263 QFile file( mLockUniqueName );
264 file.open( IO_WriteOnly ); 264 file.open( IO_WriteOnly );
265 file.close(); 265 file.close();
266 266
267 // Create lock file 267 // Create lock file
268 int result = 0; 268 int result = 0;
269#ifndef _WIN32_ 269#ifndef _WIN32_
270 result = ::link( QFile::encodeName( mLockUniqueName ), 270 result = ::link( QFile::encodeName( mLockUniqueName ),
271 QFile::encodeName( lockName ) ); 271 QFile::encodeName( lockName ) );
272#endif 272#endif
273 if ( result == 0 ) { 273 if ( result == 0 ) {
274 addressBook()->emitAddressBookLocked(); 274 addressBook()->emitAddressBookLocked();
275 return true; 275 return true;
276 } 276 }
277 277
278 // TODO: check stat 278 // TODO: check stat
279 279
280 return false; 280 return false;
281} 281}
282 282
283void ResourceDir::unlock( const QString &path ) 283void ResourceDir::unlock( const QString &path )
284{ 284{
285 QString p = path; 285 QString p = path;
286//US change the implementation how the lockfilename is getting created 286//US change the implementation how the lockfilename is getting created
287//US p.replace( QRegExp( "/" ), "_" ); 287//US p.replace( QRegExp( "/" ), "_" );
288//US QString lockName = locate( "data", "kabc/lock/" + p + ".lock" ); 288//US QString lockName = locate( "data", "kabc/lock/" + p + ".lock" );
289 KURL url(p); 289 KURL url(p);
290 QString lockName = locate( "data", "kabc/lock/" + url.fileName() + ".lock" ); 290 QString lockName = locate( "data", "kabc/lock/" + url.fileName() + ".lock" );
291 291
292 ::unlink( QFile::encodeName( lockName ) ); 292 ::unlink( QFile::encodeName( lockName ) );
293 QFile::remove( mLockUniqueName ); 293 QFile::remove( mLockUniqueName );
294 addressBook()->emitAddressBookUnlocked(); 294 addressBook()->emitAddressBookUnlocked();
295} 295}
296 296
297void ResourceDir::setPath( const QString &path ) 297void ResourceDir::setPath( const QString &path )
298{ 298{
299 mDirWatch.stopScan(); 299 mDirWatch.stopScan();
300 mDirWatch.removeDir( mPath ); 300 mDirWatch.removeDir( mPath );
301 301
302 mPath = path; 302 mPath = path;
303 303
304 mDirWatch.addDir( mPath, true ); 304 mDirWatch.addDir( mPath, true );
305 mDirWatch.startScan(); 305 mDirWatch.startScan();
306 306
307//US simulate KDirWatch event 307//US simulate KDirWatch event
308//US pathChanged(); 308//US pathChanged();
309 309
310} 310}
311 311
312QString ResourceDir::path() const 312QString ResourceDir::path() const
313{ 313{
314 return mPath; 314 return mPath;
315} 315}
316 316
317void ResourceDir::setFormat( const QString &format ) 317void ResourceDir::setFormat( const QString &format )
318{ 318{
319 mFormatName = format; 319 mFormatName = format;
320 320
321 if ( mFormat ) 321 if ( mFormat )
322 delete mFormat; 322 delete mFormat;
323 323
324 FormatFactory *factory = FormatFactory::self(); 324 FormatFactory *factory = FormatFactory::self();
325 mFormat = factory->format( mFormatName ); 325 mFormat = factory->format( mFormatName );
326/*US 326/*US
327qDebug("ResourceDir::setFormat initialized with format %s ", format.latin1()); 327qDebug("ResourceDir::setFormat initialized with format %s ", format.latin1());
328 if (mFormatName == "vcard") 328 if (mFormatName == "vcard")
329 mFormat = new VCardFormatPlugin2(); 329 mFormat = new VCardFormatPlugin2();
330 else if (mFormatName == "binary") 330 else if (mFormatName == "binary")
331 mFormat = new BinaryFormat(); 331 mFormat = new BinaryFormat();
332 else 332 else
333 qDebug("ResourceDir::setFormat format unknown !!! %s ", format.latin1()); 333 qDebug("ResourceDir::setFormat format unknown !!! %s ", format.latin1());
334*/ 334*/
335 335
336} 336}
337 337
338QString ResourceDir::format() const 338QString ResourceDir::format() const
339{ 339{
340 return mFormatName; 340 return mFormatName;
341} 341}
342 342
343void ResourceDir::pathChanged() 343void ResourceDir::pathChanged()
344{ 344{
345 if ( !addressBook() ) 345 if ( !addressBook() )
346 return; 346 return;
347 347
348 QString text( i18n( "Dir resource '%1'<br> has been changed by third party.<br>Do you want to reload?").arg( mPath ) ); 348 QString text( i18n( "Dir resource '%1'<br> has been changed by third party.<br>Do you want to reload?").arg( mPath ) );
349 if ( readOnly() || KMessageBox::questionYesNo( 0, text ) == KMessageBox::Yes ) { 349 if ( readOnly() || KMessageBox::questionYesNo( 0, text ) == KMessageBox::Yes ) {
350 load(); 350 load();
351 addressBook()->emitAddressBookChanged(); 351 addressBook()->emitAddressBookChanged();
352 } 352 }
353} 353}
354 354
355void ResourceDir::removeAddressee( const Addressee& addr ) 355void ResourceDir::removeAddressee( const Addressee& addr )
356{ 356{
357 QFile::remove( mPath + "/" + addr.uid() ); 357 QFile::remove( mPath + "/" + addr.uid() );
358} 358}
359 359
360void ResourceDir::cleanUp() 360void ResourceDir::cleanUp()
361{ 361{
362 unlock( mPath ); 362 unlock( mPath );
363} 363}
364 364
365//US #include "resourcedir.moc" 365//US #include "resourcedir.moc"
diff --git a/kabc/plugins/file/resourcefile.cpp b/kabc/plugins/file/resourcefile.cpp
index d98efc8..da2e4d7 100644
--- a/kabc/plugins/file/resourcefile.cpp
+++ b/kabc/plugins/file/resourcefile.cpp
@@ -1,399 +1,389 @@
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 52
53#include "resourcefile.h" 53#include "resourcefile.h"
54#include "syncprefwidget.h" 54#include "syncprefwidget.h"
55 55
56 56
57using namespace KABC; 57using namespace KABC;
58 58
59extern "C" 59extern "C"
60#ifdef _WIN32_ 60#ifdef _WIN32_
61__declspec(dllexport) 61__declspec(dllexport)
62#else 62#else
63{ 63{
64#endif 64#endif
65 65
66//US void *init_kabc_file() 66//US void *init_kabc_file()
67 void *init_microkabc_file() 67 void *init_microkabc_file()
68 { 68 {
69 return new KRES::PluginFactory<ResourceFile,ResourceFileConfig, SyncPrefWidget>(); 69 return new KRES::PluginFactory<ResourceFile,ResourceFileConfig, SyncPrefWidgetContainer>();
70 } 70 }
71#ifndef _WIN32_ 71#ifndef _WIN32_
72} 72}
73#endif 73#endif
74 74
75ResourceFile::ResourceFile( const KConfig *config, bool syncable ) 75ResourceFile::ResourceFile( const KConfig *config, bool syncable )
76 : Resource( config, syncable ) , mFormat( 0 ) 76 : Resource( config, syncable ) , mFormat( 0 )
77{ 77{
78 QString fileName, formatName; 78 QString fileName, formatName, default_fileName;
79
80 if (syncable == true)
81 default_fileName = "/home/polo/kdepim/apps/kabc/localfile.vcf";
82 else
83 default_fileName = StdAddressBook::fileName();
79 84
80 KConfig *cfg = (KConfig *)config; 85 KConfig *cfg = (KConfig *)config;
81 if ( cfg ) { 86 if ( cfg ) {
82 fileName = cfg->readEntry( "FileName", StdAddressBook::fileName() ); 87 fileName = cfg->readEntry( "FileName", default_fileName );
83 formatName = cfg->readEntry( "FileFormat", "vcard" ); 88 formatName = cfg->readEntry( "FileFormat", "vcard" );
84// qDebug("ResourceFile::ResourceFile : 1 %s, %s", fileName.latin1(), formatName.latin1() );
85 } else { 89 } else {
86 fileName = StdAddressBook::fileName(); 90 fileName = default_fileName;
87 formatName = "vcard"; 91 formatName = "vcard";
88// qDebug("ResourceFile::ResourceFile : 2 %s, %s", fileName.latin1(), formatName.latin1() );
89 } 92 }
90 93
91 init( fileName, formatName ); 94 init( fileName, formatName );
92} 95}
93 96
94ResourceFile::ResourceFile( const QString &fileName, bool syncable , 97ResourceFile::ResourceFile( const QString &fileName, bool syncable ,
95 const QString &formatName ) 98 const QString &formatName )
96 : Resource( 0, syncable ) 99 : Resource( 0, syncable )
97{ 100{
98// qDebug("ResourceFile::ResourceFile : 3 %s, %s", fileName.latin1(), formatName.latin1()); 101// qDebug("ResourceFile::ResourceFile : 3 %s, %s", fileName.latin1(), formatName.latin1());
99 init( fileName, formatName ); 102 init( fileName, formatName );
100} 103}
101 104
102void ResourceFile::init( const QString &fileName, const QString &formatName ) 105void ResourceFile::init( const QString &fileName, const QString &formatName )
103{ 106{
104 mFormatName = formatName; 107 mFormatName = formatName;
105 108
106 FormatFactory *factory = FormatFactory::self(); 109 FormatFactory *factory = FormatFactory::self();
107 mFormat = factory->format( mFormatName ); 110 mFormat = factory->format( mFormatName );
108 111
109 if ( !mFormat ) { 112 if ( !mFormat ) {
110 mFormatName = "vcard"; 113 mFormatName = "vcard";
111 mFormat = factory->format( mFormatName ); 114 mFormat = factory->format( mFormatName );
112 } 115 }
113 116
114/*US
115//US qDebug("ResourceFile::init initialized with format %s ", formatName.latin1());
116 if (mFormatName == "vcard") {
117 mFormat = new VCardFormatPlugin2();
118// qDebug("ResourceFile::init format VCardFormatPlugin2");
119 }
120 else if (mFormatName == "binary") {
121 mFormat = new BinaryFormat();
122// qDebug("ResourceFile::init format BinaryFormat");
123 }
124 else
125 qDebug("ResourceFile::init format unknown !!! %s ", formatName.latin1());
126*/
127 117
128 connect( &mDirWatch, SIGNAL( dirty(const QString&) ), SLOT( fileChanged() ) ); 118 connect( &mDirWatch, SIGNAL( dirty(const QString&) ), SLOT( fileChanged() ) );
129 connect( &mDirWatch, SIGNAL( created(const QString&) ), SLOT( fileChanged() ) ); 119 connect( &mDirWatch, SIGNAL( created(const QString&) ), SLOT( fileChanged() ) );
130 connect( &mDirWatch, SIGNAL( deleted(const QString&) ), SLOT( fileChanged() ) ); 120 connect( &mDirWatch, SIGNAL( deleted(const QString&) ), SLOT( fileChanged() ) );
131 121
132 setFileName( fileName ); 122 setFileName( fileName );
133} 123}
134 124
135ResourceFile::~ResourceFile() 125ResourceFile::~ResourceFile()
136{ 126{
137 delete mFormat; 127 delete mFormat;
138 mFormat = 0; 128 mFormat = 0;
139} 129}
140 130
141void ResourceFile::writeConfig( KConfig *config ) 131void ResourceFile::writeConfig( KConfig *config )
142{ 132{
143 133
144 config->setGroup( "Resource_" + identifier() ); 134 config->setGroup( "Resource_" + identifier() );
145 Resource::writeConfig( config ); 135 Resource::writeConfig( config );
146 136
147 config->writeEntry( "FileName", mFileName ); 137 config->writeEntry( "FileName", mFileName );
148 config->writeEntry( "FileFormat", mFormatName ); 138 config->writeEntry( "FileFormat", mFormatName );
149 139
150// qDebug("ResourceFile::writeConfig format %s, %s", mFileName.latin1(), mFormatName.latin1()); 140// qDebug("ResourceFile::writeConfig format %s, %s", mFileName.latin1(), mFormatName.latin1());
151 141
152} 142}
153 143
154Ticket *ResourceFile::requestSaveTicket() 144Ticket *ResourceFile::requestSaveTicket()
155{ 145{
156 kdDebug(5700) << "ResourceFile::requestSaveTicket()" << endl; 146 kdDebug(5700) << "ResourceFile::requestSaveTicket()" << endl;
157 147
158 if ( !addressBook() ) return 0; 148 if ( !addressBook() ) return 0;
159 149
160 if ( !lock( mFileName ) ) { 150 if ( !lock( mFileName ) ) {
161 kdDebug(5700) << "ResourceFile::requestSaveTicket(): Unable to lock file '" 151 kdDebug(5700) << "ResourceFile::requestSaveTicket(): Unable to lock file '"
162 << mFileName << "'" << endl; 152 << mFileName << "'" << endl;
163 return 0; 153 return 0;
164 } 154 }
165 return createTicket( this ); 155 return createTicket( this );
166} 156}
167 157
168 158
169bool ResourceFile::doOpen() 159bool ResourceFile::doOpen()
170{ 160{
171 QFile file( mFileName ); 161 QFile file( mFileName );
172 162
173 if ( !file.exists() ) { 163 if ( !file.exists() ) {
174 // try to create the file 164 // try to create the file
175 bool ok = file.open( IO_WriteOnly ); 165 bool ok = file.open( IO_WriteOnly );
176 if ( ok ) 166 if ( ok )
177 file.close(); 167 file.close();
178 168
179 return ok; 169 return ok;
180 } else { 170 } else {
181 if ( !file.open( IO_ReadWrite ) ) 171 if ( !file.open( IO_ReadWrite ) )
182 return false; 172 return false;
183 173
184 if ( file.size() == 0 ) { 174 if ( file.size() == 0 ) {
185 file.close(); 175 file.close();
186 return true; 176 return true;
187 } 177 }
188 178
189 bool ok = mFormat->checkFormat( &file ); 179 bool ok = mFormat->checkFormat( &file );
190 file.close(); 180 file.close();
191 181
192 return ok; 182 return ok;
193 } 183 }
194} 184}
195 185
196void ResourceFile::doClose() 186void ResourceFile::doClose()
197{ 187{
198} 188}
199 189
200bool ResourceFile::load() 190bool ResourceFile::load()
201{ 191{
202 192
203 193
204 QFile file( mFileName ); 194 QFile file( mFileName );
205 if ( !file.open( IO_ReadOnly ) ) { 195 if ( !file.open( IO_ReadOnly ) ) {
206 addressBook()->error( i18n( "Unable to open file '%1'." ).arg( mFileName ) ); 196 addressBook()->error( i18n( "Unable to open file '%1'." ).arg( mFileName ) );
207 return false; 197 return false;
208 } 198 }
209 199
210// qDebug("ResourceFile::load format %s, %s", mFileName.latin1(), mFormatName.latin1()); 200// qDebug("ResourceFile::load format %s, %s", mFileName.latin1(), mFormatName.latin1());
211 201
212 return mFormat->loadAll( addressBook(), this, &file ); 202 return mFormat->loadAll( addressBook(), this, &file );
213} 203}
214 204
215bool ResourceFile::save( Ticket *ticket ) 205bool ResourceFile::save( Ticket *ticket )
216{ 206{
217// qDebug("ResourceFile::save format %s, %s", mFileName.latin1(), mFormatName.latin1()); 207// qDebug("ResourceFile::save format %s, %s", mFileName.latin1(), mFormatName.latin1());
218 208
219 209
220 // create backup file 210 // create backup file
221 QString extension = "_" + QString::number( QDate::currentDate().dayOfWeek() ); 211 QString extension = "_" + QString::number( QDate::currentDate().dayOfWeek() );
222 212
223/*US we use a simpler method to create a backupfile 213/*US we use a simpler method to create a backupfile
224 214
225 (void) KSaveFile::backupFile( mFileName, QString::null 215 (void) KSaveFile::backupFile( mFileName, QString::null
226 ,extension ); 216 ,extension );
227 217
228 KSaveFile saveFile( mFileName ); 218 KSaveFile saveFile( mFileName );
229 bool ok = false; 219 bool ok = false;
230 if ( saveFile.status() == 0 && saveFile.file() ) 220 if ( saveFile.status() == 0 && saveFile.file() )
231 { 221 {
232 mFormat->saveAll( addressBook(), this, saveFile.file() ); 222 mFormat->saveAll( addressBook(), this, saveFile.file() );
233 ok = saveFile.close(); 223 ok = saveFile.close();
234 } 224 }
235*/ 225*/
236 226
237//US ToDo: write backupfile 227//US ToDo: write backupfile
238 QFile info; 228 QFile info;
239 info.setName( mFileName ); 229 info.setName( mFileName );
240 bool ok = info.open( IO_WriteOnly ); 230 bool ok = info.open( IO_WriteOnly );
241 if ( ok ) { 231 if ( ok ) {
242 mFormat->saveAll( addressBook(), this, &info ); 232 mFormat->saveAll( addressBook(), this, &info );
243 233
244 info.close(); 234 info.close();
245 ok = true; 235 ok = true;
246 } 236 }
247 else { 237 else {
248 238
249 } 239 }
250 240
251 if ( !ok ) 241 if ( !ok )
252 addressBook()->error( i18n( "Unable to save file '%1'." ).arg( mFileName ) ); 242 addressBook()->error( i18n( "Unable to save file '%1'." ).arg( mFileName ) );
253 243
254 delete ticket; 244 delete ticket;
255 unlock( mFileName ); 245 unlock( mFileName );
256 246
257 return ok; 247 return ok;
258 248
259 qDebug("ResourceFile::save has to be changed"); 249 qDebug("ResourceFile::save has to be changed");
260 return true; 250 return true;
261} 251}
262 252
263bool ResourceFile::lock( const QString &fileName ) 253bool ResourceFile::lock( const QString &fileName )
264{ 254{
265 255
266 256
267 QString fn = fileName; 257 QString fn = fileName;
268 258
269//US change the implementation how the lockfilename is getting created 259//US change the implementation how the lockfilename is getting created
270//US fn.replace( QRegExp("/"), "_" ); 260//US fn.replace( QRegExp("/"), "_" );
271//US QString lockName = locateLocal( "data", "kabc/lock/" + fn + ".lock" ); 261//US QString lockName = locateLocal( "data", "kabc/lock/" + fn + ".lock" );
272 262
273 KURL url(fn); 263 KURL url(fn);
274 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" ); 264 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" );
275 265
276 266
277 267
278 if (QFile::exists( lockName )) return false; 268 if (QFile::exists( lockName )) return false;
279 269
280 QString lockUniqueName; 270 QString lockUniqueName;
281 lockUniqueName = fn + KApplication::randomString( 8 ); 271 lockUniqueName = fn + KApplication::randomString( 8 );
282 272
283 url = lockUniqueName; 273 url = lockUniqueName;
284//US mLockUniqueName = locateLocal( "data", "kabc/lock/" + lockUniqueName ); 274//US mLockUniqueName = locateLocal( "data", "kabc/lock/" + lockUniqueName );
285 mLockUniqueName = locateLocal( "data", "kabc/lock/" + url.fileName() ); 275 mLockUniqueName = locateLocal( "data", "kabc/lock/" + url.fileName() );
286 kdDebug(5700) << "-- lock unique name: " << mLockUniqueName << endl; 276 kdDebug(5700) << "-- lock unique name: " << mLockUniqueName << endl;
287 277
288 // Create unique file 278 // Create unique file
289 QFile file( mLockUniqueName ); 279 QFile file( mLockUniqueName );
290 file.open( IO_WriteOnly ); 280 file.open( IO_WriteOnly );
291 file.close(); 281 file.close();
292 282
293 // Create lock file 283 // Create lock file
294 int result = 0; 284 int result = 0;
295#ifndef _WIN32_ 285#ifndef _WIN32_
296 result = ::link( QFile::encodeName( mLockUniqueName ), 286 result = ::link( QFile::encodeName( mLockUniqueName ),
297 QFile::encodeName( lockName ) ); 287 QFile::encodeName( lockName ) );
298#endif 288#endif
299 if ( result == 0 ) { 289 if ( result == 0 ) {
300 addressBook()->emitAddressBookLocked(); 290 addressBook()->emitAddressBookLocked();
301 return true; 291 return true;
302 } 292 }
303 293
304 // TODO: check stat 294 // TODO: check stat
305 295
306 return false; 296 return false;
307} 297}
308 298
309void ResourceFile::unlock( const QString &fileName ) 299void ResourceFile::unlock( const QString &fileName )
310{ 300{
311 QString fn = fileName; 301 QString fn = fileName;
312//US change the implementation how the lockfilename is getting created 302//US change the implementation how the lockfilename is getting created
313//US fn.replace( QRegExp( "/" ), "_" ); 303//US fn.replace( QRegExp( "/" ), "_" );
314//US QString lockName = locateLocal( "data", "kabc/lock/" + fn + ".lock" ); 304//US QString lockName = locateLocal( "data", "kabc/lock/" + fn + ".lock" );
315//US QString lockName = fn + ".lock"; 305//US QString lockName = fn + ".lock";
316 KURL url(fn); 306 KURL url(fn);
317 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" ); 307 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" );
318 308
319 QFile::remove( lockName ); 309 QFile::remove( lockName );
320 QFile::remove( mLockUniqueName ); 310 QFile::remove( mLockUniqueName );
321 addressBook()->emitAddressBookUnlocked(); 311 addressBook()->emitAddressBookUnlocked();
322} 312}
323 313
324void ResourceFile::setFileName( const QString &fileName ) 314void ResourceFile::setFileName( const QString &fileName )
325{ 315{
326 mDirWatch.stopScan(); 316 mDirWatch.stopScan();
327 mDirWatch.removeFile( mFileName ); 317 mDirWatch.removeFile( mFileName );
328 318
329 mFileName = fileName; 319 mFileName = fileName;
330 320
331 321
332 mDirWatch.addFile( mFileName ); 322 mDirWatch.addFile( mFileName );
333 mDirWatch.startScan(); 323 mDirWatch.startScan();
334 324
335//US simulate KDirWatch event 325//US simulate KDirWatch event
336//US fileChanged(); 326//US fileChanged();
337} 327}
338 328
339QString ResourceFile::fileName() const 329QString ResourceFile::fileName() const
340{ 330{
341 return mFileName; 331 return mFileName;
342} 332}
343 333
344void ResourceFile::setFormat( const QString &format ) 334void ResourceFile::setFormat( const QString &format )
345{ 335{
346 mFormatName = format; 336 mFormatName = format;
347 delete mFormat; 337 delete mFormat;
348 338
349 FormatFactory *factory = FormatFactory::self(); 339 FormatFactory *factory = FormatFactory::self();
350 mFormat = factory->format( mFormatName ); 340 mFormat = factory->format( mFormatName );
351/*US 341/*US
352//qDebug("ResourceFile::setFormat initialized with format %s ", format.latin1()); 342//qDebug("ResourceFile::setFormat initialized with format %s ", format.latin1());
353 if (mFormatName == "vcard") { 343 if (mFormatName == "vcard") {
354 mFormat = new VCardFormatPlugin2(); 344 mFormat = new VCardFormatPlugin2();
355// qDebug("ResourceFile::setFormat format %s", mFormatName.latin1()); 345// qDebug("ResourceFile::setFormat format %s", mFormatName.latin1());
356 } 346 }
357 else if (mFormatName == "binary") { 347 else if (mFormatName == "binary") {
358 mFormat = new BinaryFormat(); 348 mFormat = new BinaryFormat();
359// qDebug("ResourceFile::setFormat format %s", mFormatName.latin1()); 349// qDebug("ResourceFile::setFormat format %s", mFormatName.latin1());
360 } 350 }
361 else 351 else
362 qDebug("ResourceFile::setFormat format unknown !!! %s ", format.latin1()); 352 qDebug("ResourceFile::setFormat format unknown !!! %s ", format.latin1());
363*/ 353*/
364 354
365} 355}
366 356
367QString ResourceFile::format() const 357QString ResourceFile::format() const
368{ 358{
369 return mFormatName; 359 return mFormatName;
370} 360}
371 361
372void ResourceFile::fileChanged() 362void ResourceFile::fileChanged()
373{ 363{
374 // There is a small theoretical chance that KDirWatch calls us before 364 // There is a small theoretical chance that KDirWatch calls us before
375 // we are fully constructed 365 // we are fully constructed
376 if (!addressBook()) 366 if (!addressBook())
377 return; 367 return;
378 368
379 369
380 QString text( i18n( "File resource '%1'<br> has been changed by third party.<br>Do you want to reload?").arg( mFileName ) ); 370 QString text( i18n( "File resource '%1'<br> has been changed by third party.<br>Do you want to reload?").arg( mFileName ) );
381 if ( readOnly() || KMessageBox::questionYesNo( 0, text ) == KMessageBox::Yes ) { 371 if ( readOnly() || KMessageBox::questionYesNo( 0, text ) == KMessageBox::Yes ) {
382 load(); 372 load();
383 addressBook()->emitAddressBookChanged(); 373 addressBook()->emitAddressBookChanged();
384 } 374 }
385} 375}
386 376
387void ResourceFile::removeAddressee( const Addressee &addr ) 377void ResourceFile::removeAddressee( const Addressee &addr )
388{ 378{
389 QFile::remove( QFile::encodeName( locateLocal( "data", "kabc/photos/" ) + addr.uid() ) ); 379 QFile::remove( QFile::encodeName( locateLocal( "data", "kabc/photos/" ) + addr.uid() ) );
390 QFile::remove( QFile::encodeName( locateLocal( "data", "kabc/logos/" ) + addr.uid() ) ); 380 QFile::remove( QFile::encodeName( locateLocal( "data", "kabc/logos/" ) + addr.uid() ) );
391 QFile::remove( QFile::encodeName( locateLocal( "data", "kabc/sounds/" ) + addr.uid() ) ); 381 QFile::remove( QFile::encodeName( locateLocal( "data", "kabc/sounds/" ) + addr.uid() ) );
392} 382}
393 383
394void ResourceFile::cleanUp() 384void ResourceFile::cleanUp()
395{ 385{
396 unlock( mFileName ); 386 unlock( mFileName );
397} 387}
398 388
399//US #include "resourcefile.moc" 389//US #include "resourcefile.moc"
diff --git a/kabc/plugins/ldap/resourceldap.cpp b/kabc/plugins/ldap/resourceldap.cpp
index 198e80a..17f115d 100644
--- a/kabc/plugins/ldap/resourceldap.cpp
+++ b/kabc/plugins/ldap/resourceldap.cpp
@@ -1,432 +1,432 @@
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" 39#include "syncprefwidget.h"
40 40
41using namespace KABC; 41using namespace KABC;
42 42
43extern "C" 43extern "C"
44{ 44{
45//US void *init_kabc_ldap() 45//US void *init_kabc_ldap()
46 void *init_microkabc_ldap() 46 void *init_microkabc_ldap()
47 { 47 {
48 return new KRES::PluginFactory<ResourceLDAP,ResourceLDAPConfig, SyncPrefWidget>(); 48 return new KRES::PluginFactory<ResourceLDAP,ResourceLDAPConfig, SyncPrefWidgetContainer>();
49 } 49 }
50} 50}
51 51
52void addModOp( LDAPMod ***pmods, const QString &attr, const QString &value ); 52void addModOp( LDAPMod ***pmods, const QString &attr, const QString &value );
53 53
54 54
55ResourceLDAP::ResourceLDAP( const KConfig *config, bool syncable ) 55ResourceLDAP::ResourceLDAP( const KConfig *config, bool syncable )
56 : Resource( config, syncable ), mPort( 389 ), mLdap( 0 ) 56 : Resource( config, syncable ), mPort( 389 ), mLdap( 0 )
57{ 57{
58 KConfig *cfg = (KConfig *)config; 58 KConfig *cfg = (KConfig *)config;
59 if ( cfg ) { 59 if ( cfg ) {
60 mUser = cfg->readEntry( "LdapUser" ); 60 mUser = cfg->readEntry( "LdapUser" );
61 mPassword = KStringHandler::obscure( cfg->readEntry( "LdapPassword" ) ); 61 mPassword = KStringHandler::obscure( cfg->readEntry( "LdapPassword" ) );
62 mDn = cfg->readEntry( "LdapDn" ); 62 mDn = cfg->readEntry( "LdapDn" );
63 mHost = cfg->readEntry( "LdapHost" ); 63 mHost = cfg->readEntry( "LdapHost" );
64 mPort = cfg->readNumEntry( "LdapPort", 389 ); 64 mPort = cfg->readNumEntry( "LdapPort", 389 );
65 mFilter = cfg->readEntry( "LdapFilter" ); 65 mFilter = cfg->readEntry( "LdapFilter" );
66 mAnonymous = cfg->readBoolEntry( "LdapAnonymous" ); 66 mAnonymous = cfg->readBoolEntry( "LdapAnonymous" );
67 67
68 QStringList attributes = cfg->readListEntry( "LdapAttributes" ); 68 QStringList attributes = cfg->readListEntry( "LdapAttributes" );
69 for ( uint pos = 0; pos < attributes.count(); pos += 2 ) 69 for ( uint pos = 0; pos < attributes.count(); pos += 2 )
70 mAttributes.insert( attributes[ pos ], attributes[ pos + 1 ] ); 70 mAttributes.insert( attributes[ pos ], attributes[ pos + 1 ] );
71 } 71 }
72 72
73 /** 73 /**
74 If you want to add new attributes, append them here, add a 74 If you want to add new attributes, append them here, add a
75 translation string in the ctor of AttributesDialog and 75 translation string in the ctor of AttributesDialog and
76 handle them in the load() method below. 76 handle them in the load() method below.
77 These are the default values from 77 These are the default values from
78 */ 78 */
79 if ( mAttributes.count() == 0 ) { 79 if ( mAttributes.count() == 0 ) {
80 mAttributes.insert( "commonName", "cn" ); 80 mAttributes.insert( "commonName", "cn" );
81 mAttributes.insert( "formattedName", "displayName" ); 81 mAttributes.insert( "formattedName", "displayName" );
82 mAttributes.insert( "familyName", "sn" ); 82 mAttributes.insert( "familyName", "sn" );
83 mAttributes.insert( "givenName", "givenName" ); 83 mAttributes.insert( "givenName", "givenName" );
84 mAttributes.insert( "mail", "mail" ); 84 mAttributes.insert( "mail", "mail" );
85 mAttributes.insert( "mailAlias", "" ); 85 mAttributes.insert( "mailAlias", "" );
86 mAttributes.insert( "phoneNumber", "telephoneNumber" ); 86 mAttributes.insert( "phoneNumber", "telephoneNumber" );
87 mAttributes.insert( "uid", "uid" ); 87 mAttributes.insert( "uid", "uid" );
88 } 88 }
89} 89}
90 90
91void ResourceLDAP::writeConfig( KConfig *config ) 91void ResourceLDAP::writeConfig( KConfig *config )
92{ 92{
93 Resource::writeConfig( config ); 93 Resource::writeConfig( config );
94 94
95 config->writeEntry( "LdapUser", mUser ); 95 config->writeEntry( "LdapUser", mUser );
96 config->writeEntry( "LdapPassword", KStringHandler::obscure( mPassword ) ); 96 config->writeEntry( "LdapPassword", KStringHandler::obscure( mPassword ) );
97 config->writeEntry( "LdapDn", mDn ); 97 config->writeEntry( "LdapDn", mDn );
98 config->writeEntry( "LdapHost", mHost ); 98 config->writeEntry( "LdapHost", mHost );
99 config->writeEntry( "LdapPort", mPort ); 99 config->writeEntry( "LdapPort", mPort );
100 config->writeEntry( "LdapFilter", mFilter ); 100 config->writeEntry( "LdapFilter", mFilter );
101 config->writeEntry( "LdapAnonymous", mAnonymous ); 101 config->writeEntry( "LdapAnonymous", mAnonymous );
102 102
103 QStringList attributes; 103 QStringList attributes;
104 QMap<QString, QString>::Iterator it; 104 QMap<QString, QString>::Iterator it;
105 for ( it = mAttributes.begin(); it != mAttributes.end(); ++it ) 105 for ( it = mAttributes.begin(); it != mAttributes.end(); ++it )
106 attributes << it.key() << it.data(); 106 attributes << it.key() << it.data();
107 107
108 config->writeEntry( "LdapAttributes", attributes ); 108 config->writeEntry( "LdapAttributes", attributes );
109} 109}
110 110
111Ticket *ResourceLDAP::requestSaveTicket() 111Ticket *ResourceLDAP::requestSaveTicket()
112{ 112{
113 if ( !addressBook() ) { 113 if ( !addressBook() ) {
114 kdDebug(5700) << "no addressbook" << endl; 114 kdDebug(5700) << "no addressbook" << endl;
115 return 0; 115 return 0;
116 } 116 }
117 117
118 return createTicket( this ); 118 return createTicket( this );
119} 119}
120 120
121bool ResourceLDAP::doOpen() 121bool ResourceLDAP::doOpen()
122{ 122{
123 if ( mLdap ) 123 if ( mLdap )
124 return false; 124 return false;
125 125
126 if ( !mPort ) 126 if ( !mPort )
127 mPort = 389; 127 mPort = 389;
128 128
129 mLdap = ldap_init( mHost.local8Bit(), mPort ); 129 mLdap = ldap_init( mHost.local8Bit(), mPort );
130 if ( !mLdap ) { 130 if ( !mLdap ) {
131 addressBook()->error( i18n( "Unable to connect to server '%1' on port '%2'" ).arg( mHost ).arg( mPort ) ); 131 addressBook()->error( i18n( "Unable to connect to server '%1' on port '%2'" ).arg( mHost ).arg( mPort ) );
132 return false; 132 return false;
133 } 133 }
134 134
135 if ( !mUser.isEmpty() && !mAnonymous ) { 135 if ( !mUser.isEmpty() && !mAnonymous ) {
136 if ( ldap_simple_bind_s( mLdap, mUser.local8Bit(), mPassword.local8Bit() ) != LDAP_SUCCESS ) { 136 if ( ldap_simple_bind_s( mLdap, mUser.local8Bit(), mPassword.local8Bit() ) != LDAP_SUCCESS ) {
137 addressBook()->error( i18n( "Unable to bind to server '%1'" ).arg( mHost ) ); 137 addressBook()->error( i18n( "Unable to bind to server '%1'" ).arg( mHost ) );
138 return false; 138 return false;
139 } 139 }
140 140
141 kdDebug(5700) << "ResourceLDAP: bind to server successfully" << endl; 141 kdDebug(5700) << "ResourceLDAP: bind to server successfully" << endl;
142 } else { 142 } else {
143 if ( ldap_simple_bind_s( mLdap, NULL, NULL ) != LDAP_SUCCESS ) { 143 if ( ldap_simple_bind_s( mLdap, NULL, NULL ) != LDAP_SUCCESS ) {
144 addressBook()->error( i18n( "Unable to bind anonymously to server '%1'" ).arg( mHost ) ); 144 addressBook()->error( i18n( "Unable to bind anonymously to server '%1'" ).arg( mHost ) );
145 return false; 145 return false;
146 } 146 }
147 147
148 kdDebug( 5700 ) << "ResourceLDAP: bind anonymously to server successfully" << endl; 148 kdDebug( 5700 ) << "ResourceLDAP: bind anonymously to server successfully" << endl;
149 } 149 }
150 150
151 int deref = LDAP_DEREF_ALWAYS; 151 int deref = LDAP_DEREF_ALWAYS;
152 if ( ldap_set_option( mLdap, LDAP_OPT_DEREF, (void *) &deref ) != LDAP_OPT_SUCCESS ) { 152 if ( ldap_set_option( mLdap, LDAP_OPT_DEREF, (void *) &deref ) != LDAP_OPT_SUCCESS ) {
153 kdDebug(5700) << "ResourceLDAP: can't set 'deref' option" << endl; 153 kdDebug(5700) << "ResourceLDAP: can't set 'deref' option" << endl;
154 return false; 154 return false;
155 } 155 }
156 156
157 if ( ldap_set_option( mLdap, LDAP_OPT_REFERRALS, LDAP_OPT_ON ) != LDAP_OPT_SUCCESS ) { 157 if ( ldap_set_option( mLdap, LDAP_OPT_REFERRALS, LDAP_OPT_ON ) != LDAP_OPT_SUCCESS ) {
158 kdDebug(5700) << "ResourceLDAP: can't set 'referrals' option" << endl; 158 kdDebug(5700) << "ResourceLDAP: can't set 'referrals' option" << endl;
159 return false; 159 return false;
160 } 160 }
161 161
162 return true; 162 return true;
163} 163}
164 164
165void ResourceLDAP::doClose() 165void ResourceLDAP::doClose()
166{ 166{
167 if ( ldap_unbind_s( mLdap ) != LDAP_SUCCESS ) { 167 if ( ldap_unbind_s( mLdap ) != LDAP_SUCCESS ) {
168 kdDebug(5700) << "ResourceLDAP: can't unbind from server" << endl; 168 kdDebug(5700) << "ResourceLDAP: can't unbind from server" << endl;
169 return; 169 return;
170 } 170 }
171 171
172 mLdap = 0; 172 mLdap = 0;
173} 173}
174 174
175bool ResourceLDAP::load() 175bool ResourceLDAP::load()
176{ 176{
177 LDAPMessage *res; 177 LDAPMessage *res;
178 LDAPMessage *msg; 178 LDAPMessage *msg;
179 BerElement *track; 179 BerElement *track;
180 char *names; 180 char *names;
181 char **values; 181 char **values;
182 182
183 char **LdapSearchAttr = new char*[ mAttributes.count() + 1 ]; 183 char **LdapSearchAttr = new char*[ mAttributes.count() + 1 ];
184 184
185 QMap<QString, QString>::Iterator it; 185 QMap<QString, QString>::Iterator it;
186 int i = 0; 186 int i = 0;
187 for ( it = mAttributes.begin(); it != mAttributes.end(); ++it ) { 187 for ( it = mAttributes.begin(); it != mAttributes.end(); ++it ) {
188 if ( !it.data().isEmpty() ) { 188 if ( !it.data().isEmpty() ) {
189 unsigned int len = it.data().utf8().length(); 189 unsigned int len = it.data().utf8().length();
190 LdapSearchAttr[ i ] = new char[ len+1 ]; 190 LdapSearchAttr[ i ] = new char[ len+1 ];
191 memcpy( LdapSearchAttr[ i ], it.data().utf8(), len ); 191 memcpy( LdapSearchAttr[ i ], it.data().utf8(), len );
192 LdapSearchAttr[ i ][ len ] = 0; 192 LdapSearchAttr[ i ][ len ] = 0;
193 ++i; 193 ++i;
194 } 194 }
195 } 195 }
196 LdapSearchAttr[ i ] = 0; 196 LdapSearchAttr[ i ] = 0;
197 197
198 QString filter = mFilter; 198 QString filter = mFilter;
199 if ( filter.isEmpty() ) 199 if ( filter.isEmpty() )
200 filter = "cn=*"; 200 filter = "cn=*";
201 201
202 int result; 202 int result;
203 if ( ( result = ldap_search_s( mLdap, mDn.local8Bit(), LDAP_SCOPE_SUBTREE, QString( "(%1)" ).arg( filter ).local8Bit(), 203 if ( ( result = ldap_search_s( mLdap, mDn.local8Bit(), LDAP_SCOPE_SUBTREE, QString( "(%1)" ).arg( filter ).local8Bit(),
204 LdapSearchAttr, 0, &res ) != LDAP_SUCCESS ) ) { 204 LdapSearchAttr, 0, &res ) != LDAP_SUCCESS ) ) {
205 addressBook()->error( i18n( "Unable to search on server '%1': %2" ) 205 addressBook()->error( i18n( "Unable to search on server '%1': %2" )
206 .arg( mHost ) 206 .arg( mHost )
207 .arg( ldap_err2string( result ) ) ); 207 .arg( ldap_err2string( result ) ) );
208 208
209 for ( i = 0; LdapSearchAttr[ i ]; ++i ) 209 for ( i = 0; LdapSearchAttr[ i ]; ++i )
210 delete [] LdapSearchAttr[ i ]; 210 delete [] LdapSearchAttr[ i ];
211 delete [] LdapSearchAttr; 211 delete [] LdapSearchAttr;
212 212
213 return false; 213 return false;
214 } 214 }
215 215
216 for ( msg = ldap_first_entry( mLdap, res ); msg; msg = ldap_next_entry( mLdap, msg ) ) { 216 for ( msg = ldap_first_entry( mLdap, res ); msg; msg = ldap_next_entry( mLdap, msg ) ) {
217 Addressee addr; 217 Addressee addr;
218 addr.setResource( this ); 218 addr.setResource( this );
219 for ( names = ldap_first_attribute( mLdap, msg, &track ); names; names = ldap_next_attribute( mLdap, msg, track ) ) { 219 for ( names = ldap_first_attribute( mLdap, msg, &track ); names; names = ldap_next_attribute( mLdap, msg, track ) ) {
220 values = ldap_get_values( mLdap, msg, names ); 220 values = ldap_get_values( mLdap, msg, names );
221 for ( int i = 0; i < ldap_count_values( values ); ++i ) { 221 for ( int i = 0; i < ldap_count_values( values ); ++i ) {
222 QString name = QString::fromUtf8( names ).lower(); 222 QString name = QString::fromUtf8( names ).lower();
223 QString value = QString::fromUtf8( values[ i ] ); 223 QString value = QString::fromUtf8( values[ i ] );
224 224
225 if ( name == mAttributes[ "commonName" ].lower() ) { 225 if ( name == mAttributes[ "commonName" ].lower() ) {
226 if ( !addr.formattedName().isEmpty() ) { 226 if ( !addr.formattedName().isEmpty() ) {
227 QString fn = addr.formattedName(); 227 QString fn = addr.formattedName();
228 addr.setNameFromString( value ); 228 addr.setNameFromString( value );
229 addr.setFormattedName( fn ); 229 addr.setFormattedName( fn );
230 } else 230 } else
231 addr.setNameFromString( value ); 231 addr.setNameFromString( value );
232 } else if ( name == mAttributes[ "formattedName" ].lower() ) { 232 } else if ( name == mAttributes[ "formattedName" ].lower() ) {
233 addr.setFormattedName( value ); 233 addr.setFormattedName( value );
234 } else if ( name == mAttributes[ "givenName" ].lower() ) { 234 } else if ( name == mAttributes[ "givenName" ].lower() ) {
235 addr.setGivenName( value ); 235 addr.setGivenName( value );
236 } else if ( name == mAttributes[ "mail" ].lower() ) { 236 } else if ( name == mAttributes[ "mail" ].lower() ) {
237 addr.insertEmail( value, true ); 237 addr.insertEmail( value, true );
238 } else if ( name == mAttributes[ "mailAlias" ].lower() ) { 238 } else if ( name == mAttributes[ "mailAlias" ].lower() ) {
239 addr.insertEmail( value, false ); 239 addr.insertEmail( value, false );
240 } else if ( name == mAttributes[ "phoneNumber" ].lower() ) { 240 } else if ( name == mAttributes[ "phoneNumber" ].lower() ) {
241 PhoneNumber phone; 241 PhoneNumber phone;
242 phone.setNumber( value ); 242 phone.setNumber( value );
243 addr.insertPhoneNumber( phone ); 243 addr.insertPhoneNumber( phone );
244 break; // read only the home number 244 break; // read only the home number
245 } else if ( name == mAttributes[ "familyName" ].lower() ) { 245 } else if ( name == mAttributes[ "familyName" ].lower() ) {
246 addr.setFamilyName( value ); 246 addr.setFamilyName( value );
247 } else if ( name == mAttributes[ "uid" ].lower() ) { 247 } else if ( name == mAttributes[ "uid" ].lower() ) {
248 addr.setUid( value ); 248 addr.setUid( value );
249 } 249 }
250 } 250 }
251 ldap_value_free( values ); 251 ldap_value_free( values );
252 } 252 }
253 ber_free( track, 0 ); 253 ber_free( track, 0 );
254 254
255 addressBook()->insertAddressee( addr ); 255 addressBook()->insertAddressee( addr );
256 } 256 }
257 257
258 ldap_msgfree( res ); 258 ldap_msgfree( res );
259 259
260 for ( i = 0; LdapSearchAttr[ i ]; ++i ) 260 for ( i = 0; LdapSearchAttr[ i ]; ++i )
261 delete [] LdapSearchAttr[ i ]; 261 delete [] LdapSearchAttr[ i ];
262 delete [] LdapSearchAttr; 262 delete [] LdapSearchAttr;
263 263
264 return true; 264 return true;
265} 265}
266 266
267bool ResourceLDAP::save( Ticket * ) 267bool ResourceLDAP::save( Ticket * )
268{ 268{
269 AddressBook::Iterator it; 269 AddressBook::Iterator it;
270 for ( it = addressBook()->begin(); it != addressBook()->end(); ++it ) { 270 for ( it = addressBook()->begin(); it != addressBook()->end(); ++it ) {
271 if ( (*it).resource() == this && (*it).changed() ) { 271 if ( (*it).resource() == this && (*it).changed() ) {
272 LDAPMod **mods = NULL; 272 LDAPMod **mods = NULL;
273 273
274 addModOp( &mods, "objectClass", "organizationalPerson" ); 274 addModOp( &mods, "objectClass", "organizationalPerson" );
275 addModOp( &mods, "objectClass", "person" ); 275 addModOp( &mods, "objectClass", "person" );
276 addModOp( &mods, "objectClass", "Top" ); 276 addModOp( &mods, "objectClass", "Top" );
277 addModOp( &mods, mAttributes[ "commonName" ].utf8(), (*it).assembledName() ); 277 addModOp( &mods, mAttributes[ "commonName" ].utf8(), (*it).assembledName() );
278 addModOp( &mods, mAttributes[ "formattedName" ].utf8(), (*it).formattedName() ); 278 addModOp( &mods, mAttributes[ "formattedName" ].utf8(), (*it).formattedName() );
279 addModOp( &mods, mAttributes[ "givenName" ].utf8(), (*it).givenName() ); 279 addModOp( &mods, mAttributes[ "givenName" ].utf8(), (*it).givenName() );
280 addModOp( &mods, mAttributes[ "familyName" ].utf8(), (*it).familyName() ); 280 addModOp( &mods, mAttributes[ "familyName" ].utf8(), (*it).familyName() );
281 addModOp( &mods, mAttributes[ "uid" ].utf8(), (*it).uid() ); 281 addModOp( &mods, mAttributes[ "uid" ].utf8(), (*it).uid() );
282 282
283 QStringList emails = (*it).emails(); 283 QStringList emails = (*it).emails();
284 QStringList::ConstIterator mailIt; 284 QStringList::ConstIterator mailIt;
285 bool first = true; 285 bool first = true;
286 for ( mailIt = emails.begin(); mailIt != emails.end(); ++mailIt ) { 286 for ( mailIt = emails.begin(); mailIt != emails.end(); ++mailIt ) {
287 if ( first ) { 287 if ( first ) {
288 addModOp( &mods, mAttributes[ "mail" ].utf8(), (*mailIt) ); 288 addModOp( &mods, mAttributes[ "mail" ].utf8(), (*mailIt) );
289 first = false; 289 first = false;
290 } else 290 } else
291 addModOp( &mods, mAttributes[ "mailAlias" ].utf8(), (*mailIt) ); 291 addModOp( &mods, mAttributes[ "mailAlias" ].utf8(), (*mailIt) );
292 } 292 }
293 293
294 PhoneNumber number = (*it).phoneNumber( PhoneNumber::Home ); 294 PhoneNumber number = (*it).phoneNumber( PhoneNumber::Home );
295 addModOp( &mods, mAttributes[ "phoneNumber" ].utf8(), number.number() ); 295 addModOp( &mods, mAttributes[ "phoneNumber" ].utf8(), number.number() );
296 296
297 QString dn = "cn=" + (*it).assembledName() + "," + mDn; 297 QString dn = "cn=" + (*it).assembledName() + "," + mDn;
298 298
299 int retval; 299 int retval;
300 if ( (retval = ldap_add_s( mLdap, dn.local8Bit(), mods )) != LDAP_SUCCESS ) 300 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 ) ); 301 addressBook()->error( i18n( "Unable to modify '%1' on server '%2'" ).arg( (*it).uid() ).arg( mHost ) );
302 302
303 ldap_mods_free( mods, 1 ); 303 ldap_mods_free( mods, 1 );
304 304
305 // mark as unchanged 305 // mark as unchanged
306 (*it).setChanged( false ); 306 (*it).setChanged( false );
307 } 307 }
308 } 308 }
309 309
310 return true; 310 return true;
311} 311}
312 312
313void ResourceLDAP::removeAddressee( const Addressee &addr ) 313void ResourceLDAP::removeAddressee( const Addressee &addr )
314{ 314{
315 LDAPMessage *res; 315 LDAPMessage *res;
316 LDAPMessage *msg; 316 LDAPMessage *msg;
317 317
318 QString filter = QString( "(&(uid=%1)(%2))" ).arg( addr.uid() ).arg( mFilter ); 318 QString filter = QString( "(&(uid=%1)(%2))" ).arg( addr.uid() ).arg( mFilter );
319 319
320 kdDebug(5700) << "ldap:removeAddressee" << filter << endl; 320 kdDebug(5700) << "ldap:removeAddressee" << filter << endl;
321 321
322 ldap_search_s( mLdap, mDn.local8Bit(), LDAP_SCOPE_SUBTREE, filter.local8Bit(), 322 ldap_search_s( mLdap, mDn.local8Bit(), LDAP_SCOPE_SUBTREE, filter.local8Bit(),
323 0, 0, &res ); 323 0, 0, &res );
324 324
325 for ( msg = ldap_first_entry( mLdap, res ); msg; msg = ldap_next_entry( mLdap, msg ) ) { 325 for ( msg = ldap_first_entry( mLdap, res ); msg; msg = ldap_next_entry( mLdap, msg ) ) {
326 char *dn = ldap_get_dn( mLdap, msg ); 326 char *dn = ldap_get_dn( mLdap, msg );
327 kdDebug(5700) << "found " << dn << endl; 327 kdDebug(5700) << "found " << dn << endl;
328 if ( ldap_delete_s( mLdap, dn ) != LDAP_SUCCESS ) 328 if ( ldap_delete_s( mLdap, dn ) != LDAP_SUCCESS )
329 addressBook()->error( i18n( "Unable to delete '%1' on server '%2'" ).arg( dn ).arg( mHost ) ); 329 addressBook()->error( i18n( "Unable to delete '%1' on server '%2'" ).arg( dn ).arg( mHost ) );
330 ldap_memfree( dn ); 330 ldap_memfree( dn );
331 } 331 }
332 332
333 ldap_msgfree( res ); 333 ldap_msgfree( res );
334} 334}
335 335
336void ResourceLDAP::setUser( const QString &user ) 336void ResourceLDAP::setUser( const QString &user )
337{ 337{
338 mUser = user; 338 mUser = user;
339} 339}
340 340
341QString ResourceLDAP::user() const 341QString ResourceLDAP::user() const
342{ 342{
343 return mUser; 343 return mUser;
344} 344}
345 345
346void ResourceLDAP::setPassword( const QString &password ) 346void ResourceLDAP::setPassword( const QString &password )
347{ 347{
348 mPassword = password; 348 mPassword = password;
349} 349}
350 350
351QString ResourceLDAP::password() const 351QString ResourceLDAP::password() const
352{ 352{
353 return mPassword; 353 return mPassword;
354} 354}
355 355
356void ResourceLDAP::setDn( const QString &dn ) 356void ResourceLDAP::setDn( const QString &dn )
357{ 357{
358 mDn = dn; 358 mDn = dn;
359} 359}
360 360
361QString ResourceLDAP::dn() const 361QString ResourceLDAP::dn() const
362{ 362{
363 return mDn; 363 return mDn;
364} 364}
365 365
366void ResourceLDAP::setHost( const QString &host ) 366void ResourceLDAP::setHost( const QString &host )
367{ 367{
368 mHost = host; 368 mHost = host;
369} 369}
370 370
371QString ResourceLDAP::host() const 371QString ResourceLDAP::host() const
372{ 372{
373 return mHost; 373 return mHost;
374} 374}
375 375
376void ResourceLDAP::setPort( int port ) 376void ResourceLDAP::setPort( int port )
377{ 377{
378 mPort = port; 378 mPort = port;
379} 379}
380 380
381int ResourceLDAP::port() const 381int ResourceLDAP::port() const
382{ 382{
383 return mPort; 383 return mPort;
384} 384}
385 385
386void ResourceLDAP::setFilter( const QString &filter ) 386void ResourceLDAP::setFilter( const QString &filter )
387{ 387{
388 mFilter = filter; 388 mFilter = filter;
389} 389}
390 390
391QString ResourceLDAP::filter() const 391QString ResourceLDAP::filter() const
392{ 392{
393 return mFilter; 393 return mFilter;
394} 394}
395 395
396void ResourceLDAP::setIsAnonymous( bool value ) 396void ResourceLDAP::setIsAnonymous( bool value )
397{ 397{
398 mAnonymous = value; 398 mAnonymous = value;
399} 399}
400 400
401bool ResourceLDAP::isAnonymous() const 401bool ResourceLDAP::isAnonymous() const
402{ 402{
403 return mAnonymous; 403 return mAnonymous;
404} 404}
405 405
406void ResourceLDAP::setAttributes( const QMap<QString, QString> &attributes ) 406void ResourceLDAP::setAttributes( const QMap<QString, QString> &attributes )
407{ 407{
408 mAttributes = attributes; 408 mAttributes = attributes;
409} 409}
410 410
411QMap<QString, QString> ResourceLDAP::attributes() const 411QMap<QString, QString> ResourceLDAP::attributes() const
412{ 412{
413 return mAttributes; 413 return mAttributes;
414} 414}
415 415
416void addModOp( LDAPMod ***pmods, const QString &attr, const QString &value ) 416void addModOp( LDAPMod ***pmods, const QString &attr, const QString &value )
417{ 417{
418 if ( value.isNull() ) 418 if ( value.isNull() )
419 return; 419 return;
420 420
421 LDAPMod**mods; 421 LDAPMod**mods;
422 422
423 mods = *pmods; 423 mods = *pmods;
424 424
425 uint i = 0; 425 uint i = 0;
426 if ( mods != 0 ) 426 if ( mods != 0 )
427 for ( ; mods[ i ] != 0; ++i ); 427 for ( ; mods[ i ] != 0; ++i );
428 428
429 if (( mods = (LDAPMod **)realloc( mods, (i + 2) * sizeof( LDAPMod * ))) == 0 ) { 429 if (( mods = (LDAPMod **)realloc( mods, (i + 2) * sizeof( LDAPMod * ))) == 0 ) {
430 kdError() << "ResourceLDAP: realloc" << endl; 430 kdError() << "ResourceLDAP: realloc" << endl;
431 return; 431 return;
432 } 432 }
diff --git a/kabc/plugins/opie/resourceopie.cpp b/kabc/plugins/opie/resourceopie.cpp
index 9dfd473..4b811e9 100644
--- a/kabc/plugins/opie/resourceopie.cpp
+++ b/kabc/plugins/opie/resourceopie.cpp
@@ -1,348 +1,348 @@
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" 53#include "syncprefwidget.h"
54 54
55#include "opieconverter.h" 55#include "opieconverter.h"
56 56
57#include "resourceopie.h" 57#include "resourceopie.h"
58 58
59using namespace KABC; 59using namespace KABC;
60extern "C" 60extern "C"
61{ 61{
62 void *init_microkabc_opie() 62 void *init_microkabc_opie()
63 { 63 {
64 return new KRES::PluginFactory<ResourceOpie,ResourceOpieConfig, SyncPrefWidget>(); 64 return new KRES::PluginFactory<ResourceOpie,ResourceOpieConfig, SyncPrefWidgetContainer>();
65 } 65 }
66} 66}
67 67
68ResourceOpie::ResourceOpie( const KConfig *config, bool syncable ) 68ResourceOpie::ResourceOpie( const KConfig *config, bool syncable )
69 : Resource( config, syncable ), mAccess(0), mConverter (0) 69 : Resource( config, syncable ), mAccess(0), mConverter (0)
70{ 70{
71 QString fileName = QDir::homeDirPath() + "/Applications/addressbook/addressbook.xml"; 71 QString fileName = QDir::homeDirPath() + "/Applications/addressbook/addressbook.xml";
72 72
73 KConfig *cfg = (KConfig *)config; 73 KConfig *cfg = (KConfig *)config;
74 if ( cfg ) { 74 if ( cfg ) {
75 fileName = cfg->readEntry( "FileName", fileName ); 75 fileName = cfg->readEntry( "FileName", fileName );
76 76
77 } 77 }
78 78
79 init( fileName ); 79 init( fileName );
80} 80}
81 81
82ResourceOpie::ResourceOpie( const QString &fileName, bool syncable ) 82ResourceOpie::ResourceOpie( const QString &fileName, bool syncable )
83 : Resource( 0, syncable ) 83 : Resource( 0, syncable )
84{ 84{
85 init( fileName ); 85 init( fileName );
86} 86}
87 87
88void ResourceOpie::init( const QString &fileName ) 88void ResourceOpie::init( const QString &fileName )
89{ 89{
90 qDebug("ResourceOpie::init()"); 90 qDebug("ResourceOpie::init()");
91 91
92 connect( &mDirWatch, SIGNAL( dirty(const QString&) ), SLOT( fileChanged() ) ); 92 connect( &mDirWatch, SIGNAL( dirty(const QString&) ), SLOT( fileChanged() ) );
93 connect( &mDirWatch, SIGNAL( created(const QString&) ), SLOT( fileChanged() ) ); 93 connect( &mDirWatch, SIGNAL( created(const QString&) ), SLOT( fileChanged() ) );
94 connect( &mDirWatch, SIGNAL( deleted(const QString&) ), SLOT( fileChanged() ) ); 94 connect( &mDirWatch, SIGNAL( deleted(const QString&) ), SLOT( fileChanged() ) );
95 95
96 setFileName( fileName ); 96 setFileName( fileName );
97} 97}
98 98
99ResourceOpie::~ResourceOpie() 99ResourceOpie::~ResourceOpie()
100{ 100{
101 if (mConverter != 0) 101 if (mConverter != 0)
102 delete mConverter; 102 delete mConverter;
103 103
104 if(mAccess != 0) 104 if(mAccess != 0)
105 delete mAccess; 105 delete mAccess;
106} 106}
107 107
108void ResourceOpie::writeConfig( KConfig *config ) 108void ResourceOpie::writeConfig( KConfig *config )
109{ 109{
110 Resource::writeConfig( config ); 110 Resource::writeConfig( config );
111 111
112 config->writeEntry( "FileName", fileName() ); 112 config->writeEntry( "FileName", fileName() );
113} 113}
114 114
115Ticket *ResourceOpie::requestSaveTicket() 115Ticket *ResourceOpie::requestSaveTicket()
116{ 116{
117 kdDebug(5700) << "ResourceOpie::requestSaveTicket()" << endl; 117 kdDebug(5700) << "ResourceOpie::requestSaveTicket()" << endl;
118 118
119 qDebug("ResourceOpie::requestSaveTicket: %s", fileName().latin1()); 119 qDebug("ResourceOpie::requestSaveTicket: %s", fileName().latin1());
120 120
121 if ( !addressBook() ) return 0; 121 if ( !addressBook() ) return 0;
122 122
123 if ( !lock( fileName() ) ) { 123 if ( !lock( fileName() ) ) {
124 kdDebug(5700) << "ResourceOpie::requestSaveTicket(): Unable to lock file '" 124 kdDebug(5700) << "ResourceOpie::requestSaveTicket(): Unable to lock file '"
125 << fileName() << "'" << endl; 125 << fileName() << "'" << endl;
126 return 0; 126 return 0;
127 } 127 }
128 return createTicket( this ); 128 return createTicket( this );
129} 129}
130 130
131 131
132bool ResourceOpie::doOpen() 132bool ResourceOpie::doOpen()
133{ 133{
134 qDebug("ResourceOpie::doOpen: %s", fileName().latin1()); 134 qDebug("ResourceOpie::doOpen: %s", fileName().latin1());
135 135
136 OContactAccessBackend_XML* backend = new OContactAccessBackend_XML( "KDEPim/Pi", fileName() ); 136 OContactAccessBackend_XML* backend = new OContactAccessBackend_XML( "KDEPim/Pi", fileName() );
137 mAccess = new OContactAccess("KDEPim/Pi", 0l, backend, false); 137 mAccess = new OContactAccess("KDEPim/Pi", 0l, backend, false);
138 138
139 if ( !mAccess ) { 139 if ( !mAccess ) {
140 qDebug("Unable to load file() %s", fileName().latin1()); 140 qDebug("Unable to load file() %s", fileName().latin1());
141 return false; 141 return false;
142 } 142 }
143 143
144 mAccess->setReadAhead( 32 ); // Use ReadAhead-Cache if available 144 mAccess->setReadAhead( 32 ); // Use ReadAhead-Cache if available
145 145
146 146
147 if (mConverter == 0) 147 if (mConverter == 0)
148 { 148 {
149 mConverter = new OpieConverter(); 149 mConverter = new OpieConverter();
150 bool res = mConverter->init(); 150 bool res = mConverter->init();
151 if ( !res ) 151 if ( !res )
152 { 152 {
153 qDebug("Unable to initialize opie converter. Most likely a problem with the category file"); 153 qDebug("Unable to initialize opie converter. Most likely a problem with the category file");
154 delete mAccess; 154 delete mAccess;
155 mAccess = 0; 155 mAccess = 0;
156 return false; 156 return false;
157 } 157 }
158 } 158 }
159 159
160 160
161 161
162 return true; 162 return true;
163} 163}
164 164
165void ResourceOpie::doClose() 165void ResourceOpie::doClose()
166{ 166{
167 qDebug("ResourceOpie::doClose: %s", fileName().latin1()); 167 qDebug("ResourceOpie::doClose: %s", fileName().latin1());
168 168
169 if(mAccess) 169 if(mAccess)
170 { 170 {
171 delete mAccess; 171 delete mAccess;
172 mAccess = 0; 172 mAccess = 0;
173 } 173 }
174 // it seems so, that deletion of access deletes backend as well 174 // it seems so, that deletion of access deletes backend as well
175 //delete backend; 175 //delete backend;
176 176
177 return; 177 return;
178 178
179} 179}
180 180
181 181
182bool ResourceOpie::load() 182bool ResourceOpie::load()
183{ 183{
184 qDebug("ResourceOpie::load: %s", fileName().latin1()); 184 qDebug("ResourceOpie::load: %s", fileName().latin1());
185 185
186 bool res = false; 186 bool res = false;
187 187
188 OContactAccess::List::Iterator it; 188 OContactAccess::List::Iterator it;
189 OContactAccess::List allList = mAccess->allRecords(); 189 OContactAccess::List allList = mAccess->allRecords();
190 for ( it = allList.begin(); it != allList.end(); ++it ) 190 for ( it = allList.begin(); it != allList.end(); ++it )
191 { 191 {
192 const OContact c = (*it); 192 const OContact c = (*it);
193 193
194 KABC::Addressee addressee; 194 KABC::Addressee addressee;
195 195
196 res = mConverter->opieToAddressee( c, addressee ); 196 res = mConverter->opieToAddressee( c, addressee );
197 197
198 if ( !addressee.isEmpty() && res ) 198 if ( !addressee.isEmpty() && res )
199 { 199 {
200 addressee.setResource( this ); 200 addressee.setResource( this );
201 addressBook()->insertAddressee( addressee ); 201 addressBook()->insertAddressee( addressee );
202 } 202 }
203 203
204 } 204 }
205 205
206 206
207 return true; 207 return true;
208} 208}
209 209
210bool ResourceOpie::save( Ticket *ticket ) 210bool ResourceOpie::save( Ticket *ticket )
211{ 211{
212 qDebug("ResourceOpie::save: %s", fileName().latin1()); 212 qDebug("ResourceOpie::save: %s", fileName().latin1());
213 213
214 214
215 215
216 KABC::AddressBook::Iterator it; 216 KABC::AddressBook::Iterator it;
217 bool res; 217 bool res;
218 218
219 for ( it = addressBook()->begin(); it != addressBook()->end(); ++it ) { 219 for ( it = addressBook()->begin(); it != addressBook()->end(); ++it ) {
220 OContact c; 220 OContact c;
221 KABC::Addressee addressee = (*it); 221 KABC::Addressee addressee = (*it);
222 222
223 res = mConverter->addresseeToOpie( *it, c ); 223 res = mConverter->addresseeToOpie( *it, c );
224 if (res == true) 224 if (res == true)
225 { 225 {
226 res = mAccess->add(c); 226 res = mAccess->add(c);
227 if (res == false) 227 if (res == false)
228 qDebug("Unable to append Contact %s", c.fullName().latin1()); 228 qDebug("Unable to append Contact %s", c.fullName().latin1());
229 } 229 }
230 else 230 else
231 { 231 {
232 qDebug("Unable to convert Addressee %s", addressee.formattedName().latin1()); 232 qDebug("Unable to convert Addressee %s", addressee.formattedName().latin1());
233 } 233 }
234 } 234 }
235 235
236 mAccess->save(); 236 mAccess->save();
237 237
238 delete ticket; 238 delete ticket;
239 unlock( fileName() ); 239 unlock( fileName() );
240 240
241 return true; 241 return true;
242 242
243} 243}
244 244
245bool ResourceOpie::lock( const QString &lockfileName ) 245bool ResourceOpie::lock( const QString &lockfileName )
246{ 246{
247 qDebug("ResourceOpie::lock: %s", fileName().latin1()); 247 qDebug("ResourceOpie::lock: %s", fileName().latin1());
248 248
249 kdDebug(5700) << "ResourceOpie::lock()" << endl; 249 kdDebug(5700) << "ResourceOpie::lock()" << endl;
250 250
251 QString fn = lockfileName; 251 QString fn = lockfileName;
252 252
253 KURL url(fn); 253 KURL url(fn);
254 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" ); 254 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" );
255 255
256 kdDebug(5700) << "-- lock name: " << lockName << endl; 256 kdDebug(5700) << "-- lock name: " << lockName << endl;
257 257
258 if (QFile::exists( lockName )) 258 if (QFile::exists( lockName ))
259 { 259 {
260 qDebug("ResourceOpie::lock: lockfile %s already exists. (Delete it before continuing if nobody else is accessing the resourcefile %s)", lockName.latin1(), fileName().latin1()); 260 qDebug("ResourceOpie::lock: lockfile %s already exists. (Delete it before continuing if nobody else is accessing the resourcefile %s)", lockName.latin1(), fileName().latin1());
261 return false; 261 return false;
262 } 262 }
263 263
264 QString lockUniqueName; 264 QString lockUniqueName;
265 lockUniqueName = fn + KApplication::randomString( 8 ); 265 lockUniqueName = fn + KApplication::randomString( 8 );
266 266
267 url = lockUniqueName; 267 url = lockUniqueName;
268//US mLockUniqueName = locateLocal( "data", "kabc/lock/" + lockUniqueName ); 268//US mLockUniqueName = locateLocal( "data", "kabc/lock/" + lockUniqueName );
269 mLockUniqueName = locateLocal( "data", "kabc/lock/" + url.fileName() ); 269 mLockUniqueName = locateLocal( "data", "kabc/lock/" + url.fileName() );
270 kdDebug(5700) << "-- lock unique name: " << mLockUniqueName << endl; 270 kdDebug(5700) << "-- lock unique name: " << mLockUniqueName << endl;
271 271
272 // Create unique file 272 // Create unique file
273 QFile file( mLockUniqueName ); 273 QFile file( mLockUniqueName );
274 file.open( IO_WriteOnly ); 274 file.open( IO_WriteOnly );
275 file.close(); 275 file.close();
276 276
277 // Create lock file 277 // Create lock file
278 int result = 0; 278 int result = 0;
279#ifndef _WIN32_ 279#ifndef _WIN32_
280 result = ::link( QFile::encodeName( mLockUniqueName ), 280 result = ::link( QFile::encodeName( mLockUniqueName ),
281 QFile::encodeName( lockName ) ); 281 QFile::encodeName( lockName ) );
282#endif 282#endif
283 if ( result == 0 ) { 283 if ( result == 0 ) {
284 addressBook()->emitAddressBookLocked(); 284 addressBook()->emitAddressBookLocked();
285 return true; 285 return true;
286 } 286 }
287 287
288 // TODO: check stat 288 // TODO: check stat
289 289
290 return false; 290 return false;
291} 291}
292 292
293void ResourceOpie::unlock( const QString &fileName ) 293void ResourceOpie::unlock( const QString &fileName )
294{ 294{
295 qDebug("ResourceOpie::unlock() %s", fileName.latin1()); 295 qDebug("ResourceOpie::unlock() %s", fileName.latin1());
296 296
297 QString fn = fileName; 297 QString fn = fileName;
298 KURL url(fn); 298 KURL url(fn);
299 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" ); 299 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" );
300 300
301 QFile::remove( lockName ); 301 QFile::remove( lockName );
302 QFile::remove( mLockUniqueName ); 302 QFile::remove( mLockUniqueName );
303 addressBook()->emitAddressBookUnlocked(); 303 addressBook()->emitAddressBookUnlocked();
304} 304}
305 305
306void ResourceOpie::setFileName( const QString &newFileName ) 306void ResourceOpie::setFileName( const QString &newFileName )
307{ 307{
308 mDirWatch.stopScan(); 308 mDirWatch.stopScan();
309 mDirWatch.removeFile( fileName() ); 309 mDirWatch.removeFile( fileName() );
310 310
311 Resource::setFileName( newFileName ); 311 Resource::setFileName( newFileName );
312 312
313 mDirWatch.addFile( fileName() ); 313 mDirWatch.addFile( fileName() );
314 mDirWatch.startScan(); 314 mDirWatch.startScan();
315 315
316} 316}
317 317
318 318
319void ResourceOpie::fileChanged() 319void ResourceOpie::fileChanged()
320{ 320{
321 // There is a small theoretical chance that KDirWatch calls us before 321 // There is a small theoretical chance that KDirWatch calls us before
322 // we are fully constructed 322 // we are fully constructed
323 if (!addressBook()) 323 if (!addressBook())
324 return; 324 return;
325 325
326 QString text( i18n( "Opie resource '%1'<br> has been changed by third party.<br>Do you want to reload?").arg( fileName() ) ); 326 QString text( i18n( "Opie resource '%1'<br> has been changed by third party.<br>Do you want to reload?").arg( fileName() ) );
327 if ( readOnly() || KMessageBox::questionYesNo( 0, text ) == KMessageBox::Yes ) { 327 if ( readOnly() || KMessageBox::questionYesNo( 0, text ) == KMessageBox::Yes ) {
328 load(); 328 load();
329 addressBook()->emitAddressBookChanged(); 329 addressBook()->emitAddressBookChanged();
330 } 330 }
331 331
332 load(); 332 load();
333 addressBook()->emitAddressBookChanged(); 333 addressBook()->emitAddressBookChanged();
334} 334}
335 335
336void ResourceOpie::removeAddressee( const Addressee &addr ) 336void ResourceOpie::removeAddressee( const Addressee &addr )
337{ 337{
338} 338}
339 339
340void ResourceOpie::cleanUp() 340void ResourceOpie::cleanUp()
341{ 341{
342// qDebug("ResourceOpie::cleanup() %s", mFileName.latin1()); 342// qDebug("ResourceOpie::cleanup() %s", mFileName.latin1());
343 343
344 unlock( fileName() ); 344 unlock( fileName() );
345} 345}
346 346
347 347
348//US #include "resourceopie.moc" 348//US #include "resourceopie.moc"
diff --git a/kabc/plugins/qtopia/resourceqtopia.cpp b/kabc/plugins/qtopia/resourceqtopia.cpp
index 5565580..93a4d33 100644
--- a/kabc/plugins/qtopia/resourceqtopia.cpp
+++ b/kabc/plugins/qtopia/resourceqtopia.cpp
@@ -1,319 +1,319 @@
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" 52#include "syncprefwidget.h"
53 53
54#include "resourceqtopia.h" 54#include "resourceqtopia.h"
55 55
56using namespace KABC; 56using namespace KABC;
57extern "C" 57extern "C"
58{ 58{
59 void *init_microkabc_qtopia() 59 void *init_microkabc_qtopia()
60 { 60 {
61 return new KRES::PluginFactory<ResourceQtopia,ResourceQtopiaConfig, SyncPrefWidget>(); 61 return new KRES::PluginFactory<ResourceQtopia,ResourceQtopiaConfig, SyncPrefWidgetContainer>();
62 } 62 }
63} 63}
64 64
65ResourceQtopia::ResourceQtopia( const KConfig *config, bool syncable ) 65ResourceQtopia::ResourceQtopia( const KConfig *config, bool syncable )
66 : Resource( config, syncable ), mConverter (0) 66 : Resource( config, syncable ), mConverter (0)
67{ 67{
68 // we can not choose the filename. Therefore use the default to display 68 // we can not choose the filename. Therefore use the default to display
69 QString fileName = QDir::homeDirPath() + "/Applications/addressbook/addressbook.xml"; 69 QString fileName = QDir::homeDirPath() + "/Applications/addressbook/addressbook.xml";
70 init( fileName ); 70 init( fileName );
71} 71}
72 72
73ResourceQtopia::ResourceQtopia( const QString &fileName, bool syncable ) 73ResourceQtopia::ResourceQtopia( const QString &fileName, bool syncable )
74 : Resource( 0, syncable ) 74 : Resource( 0, syncable )
75{ 75{
76 init( fileName ); 76 init( fileName );
77} 77}
78 78
79void ResourceQtopia::init( const QString &fileName ) 79void ResourceQtopia::init( const QString &fileName )
80{ 80{
81 81
82 connect( &mDirWatch, SIGNAL( dirty(const QString&) ), SLOT( fileChanged() ) ); 82 connect( &mDirWatch, SIGNAL( dirty(const QString&) ), SLOT( fileChanged() ) );
83 connect( &mDirWatch, SIGNAL( created(const QString&) ), SLOT( fileChanged() ) ); 83 connect( &mDirWatch, SIGNAL( created(const QString&) ), SLOT( fileChanged() ) );
84 connect( &mDirWatch, SIGNAL( deleted(const QString&) ), SLOT( fileChanged() ) ); 84 connect( &mDirWatch, SIGNAL( deleted(const QString&) ), SLOT( fileChanged() ) );
85 85
86 setFileName( fileName ); 86 setFileName( fileName );
87} 87}
88 88
89ResourceQtopia::~ResourceQtopia() 89ResourceQtopia::~ResourceQtopia()
90{ 90{
91 if (mConverter != 0) 91 if (mConverter != 0)
92 delete mConverter; 92 delete mConverter;
93 93
94 if(mAccess != 0) 94 if(mAccess != 0)
95 delete mAccess; 95 delete mAccess;
96} 96}
97 97
98void ResourceQtopia::writeConfig( KConfig *config ) 98void ResourceQtopia::writeConfig( KConfig *config )
99{ 99{
100 Resource::writeConfig( config ); 100 Resource::writeConfig( config );
101} 101}
102 102
103Ticket *ResourceQtopia::requestSaveTicket() 103Ticket *ResourceQtopia::requestSaveTicket()
104{ 104{
105 kdDebug(5700) << "ResourceQtopia::requestSaveTicket()" << endl; 105 kdDebug(5700) << "ResourceQtopia::requestSaveTicket()" << endl;
106 106
107 qDebug("ResourceQtopia::requestSaveTicket: %s", fileName().latin1()); 107 qDebug("ResourceQtopia::requestSaveTicket: %s", fileName().latin1());
108 108
109 if ( !addressBook() ) return 0; 109 if ( !addressBook() ) return 0;
110 110
111 if ( !lock( fileName() ) ) { 111 if ( !lock( fileName() ) ) {
112 kdDebug(5700) << "ResourceQtopia::requestSaveTicket(): Unable to lock file '" 112 kdDebug(5700) << "ResourceQtopia::requestSaveTicket(): Unable to lock file '"
113 << fileName() << "'" << endl; 113 << fileName() << "'" << endl;
114 return 0; 114 return 0;
115 } 115 }
116 return createTicket( this ); 116 return createTicket( this );
117} 117}
118 118
119 119
120bool ResourceQtopia::doOpen() 120bool ResourceQtopia::doOpen()
121{ 121{
122 qDebug("ResourceQtopia::doOpen(): %s", fileName().latin1()); 122 qDebug("ResourceQtopia::doOpen(): %s", fileName().latin1());
123 123
124 mAccess = new AddressBookAccess(); 124 mAccess = new AddressBookAccess();
125 125
126 if ( !mAccess ) { 126 if ( !mAccess ) {
127 qDebug("Unable to load file() %s", fileName().latin1()); 127 qDebug("Unable to load file() %s", fileName().latin1());
128 return false; 128 return false;
129 } 129 }
130 130
131 131
132 if (mConverter == 0) 132 if (mConverter == 0)
133 { 133 {
134 mConverter = new QtopiaConverter(); 134 mConverter = new QtopiaConverter();
135 bool res = mConverter->init(); 135 bool res = mConverter->init();
136 if ( !res ) 136 if ( !res )
137 { 137 {
138 QString msg("Unable to initialize qtopia converter. Most likely a problem with the category file"); 138 QString msg("Unable to initialize qtopia converter. Most likely a problem with the category file");
139 qDebug(msg); 139 qDebug(msg);
140 delete mAccess; 140 delete mAccess;
141 mAccess = 0; 141 mAccess = 0;
142 return false; 142 return false;
143 } 143 }
144 } 144 }
145 145
146 return true; 146 return true;
147} 147}
148 148
149void ResourceQtopia::doClose() 149void ResourceQtopia::doClose()
150{ 150{
151 qDebug("ResourceQtopia::doClose: %s", fileName().latin1()); 151 qDebug("ResourceQtopia::doClose: %s", fileName().latin1());
152 152
153 if(mAccess) 153 if(mAccess)
154 { 154 {
155 delete mAccess; 155 delete mAccess;
156 mAccess = 0; 156 mAccess = 0;
157 } 157 }
158 // it seems so, that deletion of access deletes backend as well 158 // it seems so, that deletion of access deletes backend as well
159 //delete backend; 159 //delete backend;
160 160
161 return; 161 return;
162} 162}
163 163
164bool ResourceQtopia::load() 164bool ResourceQtopia::load()
165{ 165{
166 qDebug("ResourceQtopia::load: %s", fileName().latin1()); 166 qDebug("ResourceQtopia::load: %s", fileName().latin1());
167 167
168 AddressBookIterator it(*mAccess); 168 AddressBookIterator it(*mAccess);
169 const PimContact* contact; 169 const PimContact* contact;
170 bool res; 170 bool res;
171 171
172 for (contact=it.toFirst(); it.current(); ++it) 172 for (contact=it.toFirst(); it.current(); ++it)
173 { 173 {
174 contact = it.current(); 174 contact = it.current();
175 175
176 KABC::Addressee addressee; 176 KABC::Addressee addressee;
177 177
178 res = mConverter->qtopiaToAddressee( (*contact), addressee ); 178 res = mConverter->qtopiaToAddressee( (*contact), addressee );
179 179
180 if ( !addressee.isEmpty() && res ) 180 if ( !addressee.isEmpty() && res )
181 { 181 {
182 addressee.setResource( this ); 182 addressee.setResource( this );
183 addressBook()->insertAddressee( addressee ); 183 addressBook()->insertAddressee( addressee );
184 } 184 }
185 } 185 }
186 186
187 return true; 187 return true;
188} 188}
189 189
190bool ResourceQtopia::save( Ticket *ticket ) 190bool ResourceQtopia::save( Ticket *ticket )
191{ 191{
192 qDebug("ResourceQtopia::save: %s", fileName().latin1()); 192 qDebug("ResourceQtopia::save: %s", fileName().latin1());
193 193
194 194
195 KABC::AddressBook::Iterator it; 195 KABC::AddressBook::Iterator it;
196 bool res; 196 bool res;
197 197
198 for ( it = addressBook()->begin(); it != addressBook()->end(); ++it ) { 198 for ( it = addressBook()->begin(); it != addressBook()->end(); ++it ) {
199 PimContact c; 199 PimContact c;
200 KABC::Addressee addressee = (*it); 200 KABC::Addressee addressee = (*it);
201 201
202 res = mConverter->addresseeToQtopia( *it, c ); 202 res = mConverter->addresseeToQtopia( *it, c );
203 if (res == true) 203 if (res == true)
204 { 204 {
205 mAccess->addContact(c); 205 mAccess->addContact(c);
206// if (res == false) 206// if (res == false)
207// qDebug("Unable to append Contact %s", c.fullName().latin1()); 207// qDebug("Unable to append Contact %s", c.fullName().latin1());
208 } 208 }
209 else 209 else
210 { 210 {
211 qDebug("Unable to convert Addressee %s", addressee.formattedName().latin1()); 211 qDebug("Unable to convert Addressee %s", addressee.formattedName().latin1());
212 } 212 }
213 } 213 }
214 214
215// mAccess->addressBookUpdated(); 215// mAccess->addressBookUpdated();
216 216
217 delete ticket; 217 delete ticket;
218 unlock( fileName() ); 218 unlock( fileName() );
219 219
220 return true; 220 return true;
221} 221}
222 222
223bool ResourceQtopia::lock( const QString &lockfileName ) 223bool ResourceQtopia::lock( const QString &lockfileName )
224{ 224{
225 qDebug("ResourceQtopia::lock: %s", fileName().latin1()); 225 qDebug("ResourceQtopia::lock: %s", fileName().latin1());
226 226
227 kdDebug(5700) << "ResourceQtopia::lock()" << endl; 227 kdDebug(5700) << "ResourceQtopia::lock()" << endl;
228 228
229 QString fn = lockfileName; 229 QString fn = lockfileName;
230 230
231 KURL url(fn); 231 KURL url(fn);
232 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" ); 232 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" );
233 233
234 kdDebug(5700) << "-- lock name: " << lockName << endl; 234 kdDebug(5700) << "-- lock name: " << lockName << endl;
235 235
236 if (QFile::exists( lockName )) 236 if (QFile::exists( lockName ))
237 { 237 {
238 qDebug("ResourceOpie::lock: lockfile %s already exists. (Delete it before continuing if nobody else is accessing the resourcefile %s)", lockName.latin1(), fileName().latin1()); 238 qDebug("ResourceOpie::lock: lockfile %s already exists. (Delete it before continuing if nobody else is accessing the resourcefile %s)", lockName.latin1(), fileName().latin1());
239 return false; 239 return false;
240 } 240 }
241 241
242 QString lockUniqueName; 242 QString lockUniqueName;
243 lockUniqueName = fn + KApplication::randomString( 8 ); 243 lockUniqueName = fn + KApplication::randomString( 8 );
244 244
245 url = lockUniqueName; 245 url = lockUniqueName;
246//US mLockUniqueName = locateLocal( "data", "kabc/lock/" + lockUniqueName ); 246//US mLockUniqueName = locateLocal( "data", "kabc/lock/" + lockUniqueName );
247 mLockUniqueName = locateLocal( "data", "kabc/lock/" + url.fileName() ); 247 mLockUniqueName = locateLocal( "data", "kabc/lock/" + url.fileName() );
248 kdDebug(5700) << "-- lock unique name: " << mLockUniqueName << endl; 248 kdDebug(5700) << "-- lock unique name: " << mLockUniqueName << endl;
249 249
250 // Create unique file 250 // Create unique file
251 QFile file( mLockUniqueName ); 251 QFile file( mLockUniqueName );
252 file.open( IO_WriteOnly ); 252 file.open( IO_WriteOnly );
253 file.close(); 253 file.close();
254 254
255 // Create lock file 255 // Create lock file
256 int result = 0; 256 int result = 0;
257#ifndef _WIN32_ 257#ifndef _WIN32_
258 result = ::link( QFile::encodeName( mLockUniqueName ), 258 result = ::link( QFile::encodeName( mLockUniqueName ),
259 QFile::encodeName( lockName ) ); 259 QFile::encodeName( lockName ) );
260#endif 260#endif
261 if ( result == 0 ) { 261 if ( result == 0 ) {
262 addressBook()->emitAddressBookLocked(); 262 addressBook()->emitAddressBookLocked();
263 return true; 263 return true;
264 } 264 }
265 265
266 // TODO: check stat 266 // TODO: check stat
267 267
268 return false; 268 return false;
269} 269}
270 270
271void ResourceQtopia::unlock( const QString &fileName ) 271void ResourceQtopia::unlock( const QString &fileName )
272{ 272{
273 qDebug("ResourceQtopia::unlock() %s", fileName.latin1()); 273 qDebug("ResourceQtopia::unlock() %s", fileName.latin1());
274 274
275 QString fn = fileName; 275 QString fn = fileName;
276 KURL url(fn); 276 KURL url(fn);
277 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" ); 277 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" );
278 278
279 QFile::remove( lockName ); 279 QFile::remove( lockName );
280 QFile::remove( mLockUniqueName ); 280 QFile::remove( mLockUniqueName );
281 addressBook()->emitAddressBookUnlocked(); 281 addressBook()->emitAddressBookUnlocked();
282} 282}
283 283
284void ResourceQtopia::setFileName( const QString &newFileName ) 284void ResourceQtopia::setFileName( const QString &newFileName )
285{ 285{
286 mDirWatch.stopScan(); 286 mDirWatch.stopScan();
287 mDirWatch.removeFile( fileName() ); 287 mDirWatch.removeFile( fileName() );
288 288
289 Resource::setFileName( newFileName ); 289 Resource::setFileName( newFileName );
290 290
291 mDirWatch.addFile( fileName() ); 291 mDirWatch.addFile( fileName() );
292 mDirWatch.startScan(); 292 mDirWatch.startScan();
293} 293}
294 294
295 295
296void ResourceQtopia::fileChanged() 296void ResourceQtopia::fileChanged()
297{ 297{
298 // There is a small theoretical chance that KDirWatch calls us before 298 // There is a small theoretical chance that KDirWatch calls us before
299 // we are fully constructed 299 // we are fully constructed
300 if (!addressBook()) 300 if (!addressBook())
301 return; 301 return;
302 302
303 QString text( i18n( "Qtopia resource '%1'<br> has been changed by third party.<br>Do you want to reload?").arg( fileName() ) ); 303 QString text( i18n( "Qtopia resource '%1'<br> has been changed by third party.<br>Do you want to reload?").arg( fileName() ) );
304 if ( readOnly() || KMessageBox::questionYesNo( 0, text ) == KMessageBox::Yes ) { 304 if ( readOnly() || KMessageBox::questionYesNo( 0, text ) == KMessageBox::Yes ) {
305 load(); 305 load();
306 addressBook()->emitAddressBookChanged(); 306 addressBook()->emitAddressBookChanged();
307 } 307 }
308} 308}
309 309
310void ResourceQtopia::removeAddressee( const Addressee &addr ) 310void ResourceQtopia::removeAddressee( const Addressee &addr )
311{ 311{
312} 312}
313 313
314void ResourceQtopia::cleanUp() 314void ResourceQtopia::cleanUp()
315{ 315{
316 unlock( fileName() ); 316 unlock( fileName() );
317} 317}
318 318
319//US #include "resourceqtopia.moc" 319//US #include "resourceqtopia.moc"
diff --git a/kabc/plugins/sharpdtm/resourcesharpdtm.cpp b/kabc/plugins/sharpdtm/resourcesharpdtm.cpp
index 70c3718..b63df0c 100644
--- a/kabc/plugins/sharpdtm/resourcesharpdtm.cpp
+++ b/kabc/plugins/sharpdtm/resourcesharpdtm.cpp
@@ -1,337 +1,337 @@
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 48
49#include "resourcesharpdtmconfig.h" 49#include "resourcesharpdtmconfig.h"
50#include "resourcesharpdtm.h" 50#include "resourcesharpdtm.h"
51 51
52#include "syncprefwidget.h" 52#include "syncprefwidget.h"
53 53
54#include "stdaddressbook.h" 54#include "stdaddressbook.h"
55 55
56#include "sharpdtmconverter.h" 56#include "sharpdtmconverter.h"
57 57
58using namespace KABC; 58using namespace KABC;
59extern "C" 59extern "C"
60{ 60{
61 void *init_microkabc_sharpdtm() 61 void *init_microkabc_sharpdtm()
62 { 62 {
63 return new KRES::PluginFactory<ResourceSharpDTM,ResourceSharpDTMConfig,SyncPrefWidget>(); 63 return new KRES::PluginFactory<ResourceSharpDTM,ResourceSharpDTMConfig,SyncPrefWidgetContainer>();
64 } 64 }
65} 65}
66 66
67ResourceSharpDTM::ResourceSharpDTM( const KConfig *config, bool syncable ) 67ResourceSharpDTM::ResourceSharpDTM( const KConfig *config, bool syncable )
68 : Resource( config, syncable ), mConverter (0) 68 : Resource( config, syncable ), mConverter (0)
69{ 69{
70 // we can not choose the filename. Therefore use the default to display 70 // we can not choose the filename. Therefore use the default to display
71 71
72 QString fileName = SlZDataBase::addressbookFileName(); 72 QString fileName = SlZDataBase::addressbookFileName();
73 init( fileName ); 73 init( fileName );
74} 74}
75 75
76ResourceSharpDTM::ResourceSharpDTM( const QString &fileName, bool syncable ) 76ResourceSharpDTM::ResourceSharpDTM( const QString &fileName, bool syncable )
77 : Resource( 0, syncable ) 77 : Resource( 0, syncable )
78{ 78{
79 init( fileName ); 79 init( fileName );
80} 80}
81 81
82void ResourceSharpDTM::init( const QString &fileName ) 82void ResourceSharpDTM::init( const QString &fileName )
83{ 83{
84 84
85 connect( &mDirWatch, SIGNAL( dirty(const QString&) ), SLOT( fileChanged() ) ); 85 connect( &mDirWatch, SIGNAL( dirty(const QString&) ), SLOT( fileChanged() ) );
86 connect( &mDirWatch, SIGNAL( created(const QString&) ), SLOT( fileChanged() ) ); 86 connect( &mDirWatch, SIGNAL( created(const QString&) ), SLOT( fileChanged() ) );
87 connect( &mDirWatch, SIGNAL( deleted(const QString&) ), SLOT( fileChanged() ) ); 87 connect( &mDirWatch, SIGNAL( deleted(const QString&) ), SLOT( fileChanged() ) );
88 88
89 setFileName( fileName ); 89 setFileName( fileName );
90} 90}
91 91
92ResourceSharpDTM::~ResourceSharpDTM() 92ResourceSharpDTM::~ResourceSharpDTM()
93{ 93{
94 if (mConverter != 0) 94 if (mConverter != 0)
95 delete mConverter; 95 delete mConverter;
96 96
97 if(mAccess != 0) 97 if(mAccess != 0)
98 delete mAccess; 98 delete mAccess;
99} 99}
100 100
101void ResourceSharpDTM::writeConfig( KConfig *config ) 101void ResourceSharpDTM::writeConfig( KConfig *config )
102{ 102{
103 Resource::writeConfig( config ); 103 Resource::writeConfig( config );
104} 104}
105 105
106Ticket *ResourceSharpDTM::requestSaveTicket() 106Ticket *ResourceSharpDTM::requestSaveTicket()
107{ 107{
108 kdDebug(5700) << "ResourceSharpDTM::requestSaveTicket()" << endl; 108 kdDebug(5700) << "ResourceSharpDTM::requestSaveTicket()" << endl;
109 109
110 qDebug("ResourceSharpDTM::requestSaveTicket: %s", fileName().latin1()); 110 qDebug("ResourceSharpDTM::requestSaveTicket: %s", fileName().latin1());
111 111
112 if ( !addressBook() ) return 0; 112 if ( !addressBook() ) return 0;
113 113
114 if ( !lock( fileName() ) ) { 114 if ( !lock( fileName() ) ) {
115 kdDebug(5700) << "ResourceSharpDTM::requestSaveTicket(): Unable to lock file '" 115 kdDebug(5700) << "ResourceSharpDTM::requestSaveTicket(): Unable to lock file '"
116 << fileName() << "'" << endl; 116 << fileName() << "'" << endl;
117 return 0; 117 return 0;
118 } 118 }
119 return createTicket( this ); 119 return createTicket( this );
120} 120}
121 121
122 122
123bool ResourceSharpDTM::doOpen() 123bool ResourceSharpDTM::doOpen()
124{ 124{
125 qDebug("ResourceSharpDTM::doOpen: %s", fileName().latin1()); 125 qDebug("ResourceSharpDTM::doOpen: %s", fileName().latin1());
126 126
127 // the last parameter in the SlZDataBase constructor means "readonly" 127 // the last parameter in the SlZDataBase constructor means "readonly"
128 mAccess = new SlZDataBase(fileName(), 128 mAccess = new SlZDataBase(fileName(),
129 SlZDataBase::addressbookItems(), 129 SlZDataBase::addressbookItems(),
130 NULL, true); 130 NULL, true);
131 131
132 if ( !mAccess ) { 132 if ( !mAccess ) {
133 qDebug("Unable to load file() %s", fileName().latin1()); 133 qDebug("Unable to load file() %s", fileName().latin1());
134 return false; 134 return false;
135 } 135 }
136 136
137 if (mConverter == 0) 137 if (mConverter == 0)
138 { 138 {
139 mConverter = new SharpDTMConverter(); 139 mConverter = new SharpDTMConverter();
140 bool res = mConverter->init(); 140 bool res = mConverter->init();
141 if ( !res ) 141 if ( !res )
142 { 142 {
143 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");
144 144
145 qDebug(msg); 145 qDebug(msg);
146 delete mAccess; 146 delete mAccess;
147 mAccess = 0; 147 mAccess = 0;
148 return false; 148 return false;
149 } 149 }
150 } 150 }
151 151
152 return true; 152 return true;
153} 153}
154 154
155void ResourceSharpDTM::doClose() 155void ResourceSharpDTM::doClose()
156{ 156{
157 qDebug("ResourceSharpDTM::doClose: %s", fileName().latin1()); 157 qDebug("ResourceSharpDTM::doClose: %s", fileName().latin1());
158 158
159 if(mAccess) 159 if(mAccess)
160 { 160 {
161 delete mAccess; 161 delete mAccess;
162 mAccess = 0; 162 mAccess = 0;
163 } 163 }
164 // it seems so, that deletion of access deletes backend as well 164 // it seems so, that deletion of access deletes backend as well
165 //delete backend; 165 //delete backend;
166 166
167 return; 167 return;
168} 168}
169 169
170bool ResourceSharpDTM::load() 170bool ResourceSharpDTM::load()
171{ 171{
172 qDebug("ResourceSharpDTM::load: %s", fileName().latin1()); 172 qDebug("ResourceSharpDTM::load: %s", fileName().latin1());
173 173
174 bool res = false; 174 bool res = false;
175 175
176 CardId id; 176 CardId id;
177 177
178 for (bool res=mAccess->first(); res == true; res=mAccess->next()) 178 for (bool res=mAccess->first(); res == true; res=mAccess->next())
179 { 179 {
180 id = mAccess->cardId(); 180 id = mAccess->cardId();
181 181
182 KABC::Addressee addressee; 182 KABC::Addressee addressee;
183 183
184 res = mConverter->sharpToAddressee( id, mAccess, addressee ); 184 res = mConverter->sharpToAddressee( id, mAccess, addressee );
185 185
186 if ( !addressee.isEmpty() && res ) 186 if ( !addressee.isEmpty() && res )
187 { 187 {
188 addressee.setResource( this ); 188 addressee.setResource( this );
189 addressBook()->insertAddressee( addressee ); 189 addressBook()->insertAddressee( addressee );
190 } 190 }
191 } 191 }
192 192
193 return true; 193 return true;
194} 194}
195 195
196bool ResourceSharpDTM::save( Ticket *ticket ) 196bool ResourceSharpDTM::save( Ticket *ticket )
197{ 197{
198 qDebug("ResourceSharpDTM::save: %s", fileName().latin1()); 198 qDebug("ResourceSharpDTM::save: %s", fileName().latin1());
199 199
200 200
201 KABC::AddressBook::Iterator it; 201 KABC::AddressBook::Iterator it;
202 bool res; 202 bool res;
203 203
204 for ( it = addressBook()->begin(); it != addressBook()->end(); ++it ) { 204 for ( it = addressBook()->begin(); it != addressBook()->end(); ++it ) {
205 CardId id = 0;// 0 means new card 205 CardId id = 0;// 0 means new card
206 KABC::Addressee addressee = (*it); 206 KABC::Addressee addressee = (*it);
207 207
208 res = mAccess->startEditCard(id); 208 res = mAccess->startEditCard(id);
209 if (res == true) 209 if (res == true)
210 { 210 {
211 res = mConverter->addresseeToSharp( *it, mAccess, id ); 211 res = mConverter->addresseeToSharp( *it, mAccess, id );
212 if (res == true) 212 if (res == true)
213 { 213 {
214 res = mAccess->finishEditCard(&id); 214 res = mAccess->finishEditCard(&id);
215 if (res == false) 215 if (res == false)
216 qDebug("Unable to append Contact: %s", addressee.formattedName().latin1()); 216 qDebug("Unable to append Contact: %s", addressee.formattedName().latin1());
217 } 217 }
218 else 218 else
219 { 219 {
220 qDebug("Unable to convert Addressee: %s", addressee.formattedName().latin1()); 220 qDebug("Unable to convert Addressee: %s", addressee.formattedName().latin1());
221 mAccess->cancelEditCard(); 221 mAccess->cancelEditCard();
222 } 222 }
223 } 223 }
224 else 224 else
225 { 225 {
226 qDebug("Unable to add new card. Addressee: %s", addressee.formattedName().latin1()); 226 qDebug("Unable to add new card. Addressee: %s", addressee.formattedName().latin1());
227 } 227 }
228 228
229 } 229 }
230 230
231//US mAccess->save(); 231//US mAccess->save();
232 232
233 delete ticket; 233 delete ticket;
234 unlock( fileName() ); 234 unlock( fileName() );
235 235
236 return true; 236 return true;
237} 237}
238 238
239bool ResourceSharpDTM::lock( const QString &lockfileName ) 239bool ResourceSharpDTM::lock( const QString &lockfileName )
240{ 240{
241 qDebug("ResourceSharpDTM::lock: %s", fileName().latin1()); 241 qDebug("ResourceSharpDTM::lock: %s", fileName().latin1());
242 242
243 kdDebug(5700) << "ResourceSharpDTM::lock()" << endl; 243 kdDebug(5700) << "ResourceSharpDTM::lock()" << endl;
244 244
245 QString fn = lockfileName; 245 QString fn = lockfileName;
246 246
247 KURL url(fn); 247 KURL url(fn);
248 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" ); 248 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" );
249 249
250 kdDebug(5700) << "-- lock name: " << lockName << endl; 250 kdDebug(5700) << "-- lock name: " << lockName << endl;
251 251
252 if (QFile::exists( lockName )) 252 if (QFile::exists( lockName ))
253 { 253 {
254 qDebug("ResourceSharpDTM::lock: lockfile %s already exists. (Delete it before continuing if nobody else is accessing the resourcefile %s)", lockName.latin1(), fileName()); 254 qDebug("ResourceSharpDTM::lock: lockfile %s already exists. (Delete it before continuing if nobody else is accessing the resourcefile %s)", lockName.latin1(), fileName());
255 return false; 255 return false;
256 } 256 }
257 257
258 258
259 QString lockUniqueName; 259 QString lockUniqueName;
260 lockUniqueName = fn + KApplication::randomString( 8 ); 260 lockUniqueName = fn + KApplication::randomString( 8 );
261 261
262 url = lockUniqueName; 262 url = lockUniqueName;
263//US mLockUniqueName = locateLocal( "data", "kabc/lock/" + lockUniqueName ); 263//US mLockUniqueName = locateLocal( "data", "kabc/lock/" + lockUniqueName );
264 mLockUniqueName = locateLocal( "data", "kabc/lock/" + url.fileName() ); 264 mLockUniqueName = locateLocal( "data", "kabc/lock/" + url.fileName() );
265 kdDebug(5700) << "-- lock unique name: " << mLockUniqueName << endl; 265 kdDebug(5700) << "-- lock unique name: " << mLockUniqueName << endl;
266 266
267 // Create unique file 267 // Create unique file
268 QFile file( mLockUniqueName ); 268 QFile file( mLockUniqueName );
269 file.open( IO_WriteOnly ); 269 file.open( IO_WriteOnly );
270 file.close(); 270 file.close();
271 271
272 // Create lock file 272 // Create lock file
273 int result = 0; 273 int result = 0;
274#ifndef _WIN32_ 274#ifndef _WIN32_
275 result = ::link( QFile::encodeName( mLockUniqueName ), 275 result = ::link( QFile::encodeName( mLockUniqueName ),
276 QFile::encodeName( lockName ) ); 276 QFile::encodeName( lockName ) );
277#endif 277#endif
278 if ( result == 0 ) { 278 if ( result == 0 ) {
279 addressBook()->emitAddressBookLocked(); 279 addressBook()->emitAddressBookLocked();
280 return true; 280 return true;
281 } 281 }
282 282
283 // TODO: check stat 283 // TODO: check stat
284 284
285 return false; 285 return false;
286} 286}
287 287
288void ResourceSharpDTM::unlock( const QString &fileName ) 288void ResourceSharpDTM::unlock( const QString &fileName )
289{ 289{
290 qDebug("ResourceSharpDTM::unlock() %s", fileName.latin1()); 290 qDebug("ResourceSharpDTM::unlock() %s", fileName.latin1());
291 291
292 QString fn = fileName; 292 QString fn = fileName;
293 KURL url(fn); 293 KURL url(fn);
294 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" ); 294 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" );
295 295
296 QFile::remove( lockName ); 296 QFile::remove( lockName );
297 QFile::remove( mLockUniqueName ); 297 QFile::remove( mLockUniqueName );
298 addressBook()->emitAddressBookUnlocked(); 298 addressBook()->emitAddressBookUnlocked();
299} 299}
300 300
301void ResourceSharpDTM::setFileName( const QString &newFileName ) 301void ResourceSharpDTM::setFileName( const QString &newFileName )
302{ 302{
303 mDirWatch.stopScan(); 303 mDirWatch.stopScan();
304 mDirWatch.removeFile( fileName() ); 304 mDirWatch.removeFile( fileName() );
305 305
306 Resource::setFileName( newFileName ); 306 Resource::setFileName( newFileName );
307 307
308 mDirWatch.addFile( fileName() ); 308 mDirWatch.addFile( fileName() );
309 mDirWatch.startScan(); 309 mDirWatch.startScan();
310 310
311} 311}
312 312
313void ResourceSharpDTM::fileChanged() 313void ResourceSharpDTM::fileChanged()
314{ 314{
315 // There is a small theoretical chance that KDirWatch calls us before 315 // There is a small theoretical chance that KDirWatch calls us before
316 // we are fully constructed 316 // we are fully constructed
317 if (!addressBook()) 317 if (!addressBook())
318 return; 318 return;
319 319
320 QString text( i18n( "Sharp DTM resource '%1'<br> has been changed by third party.<br>Do you want to reload?").arg( fileName() ) ); 320 QString text( i18n( "Sharp DTM resource '%1'<br> has been changed by third party.<br>Do you want to reload?").arg( fileName() ) );
321 if ( readOnly() || KMessageBox::questionYesNo( 0, text ) == KMessageBox::Yes ) { 321 if ( readOnly() || KMessageBox::questionYesNo( 0, text ) == KMessageBox::Yes ) {
322 load(); 322 load();
323 addressBook()->emitAddressBookChanged(); 323 addressBook()->emitAddressBookChanged();
324 } 324 }
325} 325}
326 326
327void ResourceSharpDTM::removeAddressee( const Addressee &addr ) 327void ResourceSharpDTM::removeAddressee( const Addressee &addr )
328{ 328{
329} 329}
330 330
331void ResourceSharpDTM::cleanUp() 331void ResourceSharpDTM::cleanUp()
332{ 332{
333 unlock( fileName() ); 333 unlock( fileName() );
334} 334}
335 335
336 336
337 337