summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--bin/kdepim/kaddressbook/icons22/ka24.pngbin0 -> 1435 bytes
-rw-r--r--kabc/plugins/dir/dir.pro5
-rw-r--r--kabc/plugins/dir/resourcedir.cpp11
-rw-r--r--kabc/plugins/file/file.pro5
-rw-r--r--kabc/plugins/file/resourcefile.cpp10
-rw-r--r--kaddressbook/mainembedded.cpp1
-rw-r--r--kaddressbook/views/contactlistview.cpp6
-rw-r--r--microkde/kdecore/klibloader.cpp7
8 files changed, 39 insertions, 6 deletions
diff --git a/bin/kdepim/kaddressbook/icons22/ka24.png b/bin/kdepim/kaddressbook/icons22/ka24.png
new file mode 100644
index 0000000..738e939
--- a/dev/null
+++ b/bin/kdepim/kaddressbook/icons22/ka24.png
Binary files differ
diff --git a/kabc/plugins/dir/dir.pro b/kabc/plugins/dir/dir.pro
index 3db201f..0023029 100644
--- a/kabc/plugins/dir/dir.pro
+++ b/kabc/plugins/dir/dir.pro
@@ -1,29 +1,34 @@
1 TEMPLATE= lib 1 TEMPLATE= lib
2CONFIG += qt warn_on release 2CONFIG += qt warn_on release
3#release debug 3#release debug
4 4
5TARGET = microkabc_dir 5TARGET = microkabc_dir
6INCLUDEPATH += ../.. ../../../microkde ../../../microkde/kdecore ../../../microkde/kio/kfile ../../../qtcompat 6INCLUDEPATH += ../.. ../../../microkde ../../../microkde/kdecore ../../../microkde/kio/kfile ../../../qtcompat
7DESTDIR = ../../../bin 7DESTDIR = ../../../bin
8#LIBS += -lmicrokde -lmicrokabc 8#LIBS += -lmicrokde -lmicrokabc
9#LIBS += -L$(QPEDIR)/lib 9#LIBS += -L$(QPEDIR)/lib
10 10
11INTERFACES = \ 11INTERFACES = \
12 12
13HEADERS = \ 13HEADERS = \
14 resourcedir.h \ 14 resourcedir.h \
15 resourcedirconfig.h 15 resourcedirconfig.h
16 16
17SOURCES = \ 17SOURCES = \
18 resourcedir.cpp \ 18 resourcedir.cpp \
19 resourcedirconfig.cpp 19 resourcedirconfig.cpp
20 20
21unix : { 21unix : {
22OBJECTS_DIR = obj/unix 22OBJECTS_DIR = obj/unix
23MOC_DIR = moc/unix 23MOC_DIR = moc/unix
24} 24}
25win32: { 25win32: {
26CONFIG += dll
26DEFINES += _WIN32_ 27DEFINES += _WIN32_
27OBJECTS_DIR = obj/win 28OBJECTS_DIR = obj/win
28MOC_DIR = moc/win 29MOC_DIR = moc/win
30LIBS += ../../../bin/microkdepim.lib
31LIBS += ../../../bin/microkcal.lib
32LIBS += ../../../bin/microkde.lib
33LIBS += ../../../bin/microkabc.lib
29} \ No newline at end of file 34} \ No newline at end of file
diff --git a/kabc/plugins/dir/resourcedir.cpp b/kabc/plugins/dir/resourcedir.cpp
index 6ea2f4b..3cb5179 100644
--- a/kabc/plugins/dir/resourcedir.cpp
+++ b/kabc/plugins/dir/resourcedir.cpp
@@ -1,360 +1,367 @@
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 47
48#include "addressbook.h" 48#include "addressbook.h"
49 49
50#include "formatfactory.h" 50#include "formatfactory.h"
51 51
52#include "resourcedirconfig.h" 52#include "resourcedirconfig.h"
53#include "stdaddressbook.h" 53#include "stdaddressbook.h"
54 54
55//US 55//US
56#include <qdir.h> 56#include <qdir.h>
57//US #include "../../formats/vcardformatplugin2.h" 57//US #include "../../formats/vcardformatplugin2.h"
58//US #include "../../formats/binaryformat.h" 58//US #include "../../formats/binaryformat.h"
59 59
60#include "resourcedir.h" 60#include "resourcedir.h"
61 61
62using namespace KABC; 62using namespace KABC;
63 63
64extern "C" 64extern "C"
65#ifdef _WIN32_
66__declspec(dllexport)
67#else
65{ 68{
69#endif
70
66//US void *init_kabc_dir() 71//US void *init_kabc_dir()
67 void *init_microkabc_dir() 72 void *init_microkabc_dir()
68 { 73 {
69 return new KRES::PluginFactory<ResourceDir,ResourceDirConfig>(); 74 return new KRES::PluginFactory<ResourceDir,ResourceDirConfig>();
70 } 75 }
76#ifndef _WIN32_
71} 77}
72 78#endif
73 79
74ResourceDir::ResourceDir( const KConfig *config ) 80ResourceDir::ResourceDir( const KConfig *config )
75 : Resource( config ) 81 : Resource( config )
76{ 82{
77 QString path; 83 QString path;
78 84
79 KConfig *cfg = (KConfig *)config; 85 KConfig *cfg = (KConfig *)config;
80 if ( cfg ) { 86 if ( cfg ) {
81//US path = config->readEntry( "FilePath" ); 87//US path = config->readEntry( "FilePath" );
82 path = cfg->readEntry( "FilePath", StdAddressBook::directoryName() ); 88 path = cfg->readEntry( "FilePath", StdAddressBook::directoryName() );
83//US mFormatName = config->readEntry( "FileFormat" ); 89//US mFormatName = config->readEntry( "FileFormat" );
84 mFormatName = cfg->readEntry( "FileFormat", "vcard" ); 90 mFormatName = cfg->readEntry( "FileFormat", "vcard" );
85 } else { 91 } else {
86 path = StdAddressBook::directoryName(); 92 path = StdAddressBook::directoryName();
87 mFormatName = "vcard"; 93 mFormatName = "vcard";
88 } 94 }
89 95
90 96
91 FormatFactory *factory = FormatFactory::self(); 97 FormatFactory *factory = FormatFactory::self();
92 mFormat = factory->format( mFormatName ); 98 mFormat = factory->format( mFormatName );
93 99
94 if ( !mFormat ) { 100 if ( !mFormat ) {
95 mFormatName = "vcard"; 101 mFormatName = "vcard";
96 mFormat = factory->format( mFormatName ); 102 mFormat = factory->format( mFormatName );
97 } 103 }
98 104
99/*US 105/*US
100//US qDebug("ResourceDir::ResourceDir initialized with format %s ", mFormatName.latin1()); 106//US qDebug("ResourceDir::ResourceDir initialized with format %s ", mFormatName.latin1());
101 if (mFormatName == "vcard") 107 if (mFormatName == "vcard")
102 mFormat = new VCardFormatPlugin2(); 108 mFormat = new VCardFormatPlugin2();
103 else if (mFormatName == "binary") 109 else if (mFormatName == "binary")
104 mFormat = new BinaryFormat(); 110 mFormat = new BinaryFormat();
105 else 111 else
106 qDebug("ResourceFile::init format unknown !!! %s ", mFormatName.latin1()); 112 qDebug("ResourceFile::init format unknown !!! %s ", mFormatName.latin1());
107*/ 113*/
108 114
109/*US we have no KDirWatch. SO simulate the signals from inside the apropriate methods 115/*US we have no KDirWatch. SO simulate the signals from inside the apropriate methods
110 connect( &mDirWatch, SIGNAL( dirty(const QString&) ), SLOT( pathChanged() ) ); 116 connect( &mDirWatch, SIGNAL( dirty(const QString&) ), SLOT( pathChanged() ) );
111 connect( &mDirWatch, SIGNAL( created(const QString&) ), SLOT( pathChanged() ) ); 117 connect( &mDirWatch, SIGNAL( created(const QString&) ), SLOT( pathChanged() ) );
112 connect( &mDirWatch, SIGNAL( deleted(const QString&) ), SLOT( pathChanged() ) ); 118 connect( &mDirWatch, SIGNAL( deleted(const QString&) ), SLOT( pathChanged() ) );
113*/ 119*/
114 120
115 setPath( path ); 121 setPath( path );
116} 122}
117 123
118ResourceDir::~ResourceDir() 124ResourceDir::~ResourceDir()
119{ 125{
120 delete mFormat; 126 delete mFormat;
121 mFormat = 0; 127 mFormat = 0;
122} 128}
123 129
124void ResourceDir::writeConfig( KConfig *config ) 130void ResourceDir::writeConfig( KConfig *config )
125{ 131{
132 config->setGroup( "Resource_" + identifier() );
126 Resource::writeConfig( config ); 133 Resource::writeConfig( config );
127 134
128 config->writeEntry( "FilePath", mPath ); 135 config->writeEntry( "FilePath", mPath );
129 config->writeEntry( "FileFormat", mFormatName ); 136 config->writeEntry( "FileFormat", mFormatName );
130} 137}
131 138
132Ticket *ResourceDir::requestSaveTicket() 139Ticket *ResourceDir::requestSaveTicket()
133{ 140{
134 kdDebug(5700) << "ResourceDir::requestSaveTicket()" << endl; 141 kdDebug(5700) << "ResourceDir::requestSaveTicket()" << endl;
135 142
136 if ( !addressBook() ) return 0; 143 if ( !addressBook() ) return 0;
137 144
138 if ( !lock( mPath ) ) { 145 if ( !lock( mPath ) ) {
139 kdDebug(5700) << "ResourceDir::requestSaveTicket(): Unable to lock path '" 146 kdDebug(5700) << "ResourceDir::requestSaveTicket(): Unable to lock path '"
140 << mPath << "'" << endl; 147 << mPath << "'" << endl;
141 return 0; 148 return 0;
142 } 149 }
143 return createTicket( this ); 150 return createTicket( this );
144} 151}
145 152
146 153
147bool ResourceDir::doOpen() 154bool ResourceDir::doOpen()
148{ 155{
149 QDir dir( mPath ); 156 QDir dir( mPath );
150 if ( !dir.exists() ) { // no directory available 157 if ( !dir.exists() ) { // no directory available
151 return dir.mkdir( dir.path() ); 158 return dir.mkdir( dir.path() );
152 } else { 159 } else {
153 QString testName = dir.entryList( QDir::Files )[0]; 160 QString testName = dir.entryList( QDir::Files )[0];
154 if ( testName.isNull() || testName.isEmpty() ) // no file in directory 161 if ( testName.isNull() || testName.isEmpty() ) // no file in directory
155 return true; 162 return true;
156 163
157 QFile file( mPath + "/" + testName ); 164 QFile file( mPath + "/" + testName );
158 if ( file.open( IO_ReadOnly ) ) 165 if ( file.open( IO_ReadOnly ) )
159 return true; 166 return true;
160 167
161 if ( file.size() == 0 ) 168 if ( file.size() == 0 )
162 return true; 169 return true;
163 170
164 bool ok = mFormat->checkFormat( &file ); 171 bool ok = mFormat->checkFormat( &file );
165 file.close(); 172 file.close();
166 return ok; 173 return ok;
167 } 174 }
168} 175}
169 176
170void ResourceDir::doClose() 177void ResourceDir::doClose()
171{ 178{
172} 179}
173 180
174bool ResourceDir::load() 181bool ResourceDir::load()
175{ 182{
176 kdDebug(5700) << "ResourceDir::load(): '" << mPath << "'" << endl; 183 kdDebug(5700) << "ResourceDir::load(): '" << mPath << "'" << endl;
177 184
178 QDir dir( mPath ); 185 QDir dir( mPath );
179 QStringList files = dir.entryList( QDir::Files ); 186 QStringList files = dir.entryList( QDir::Files );
180 187
181 QStringList::Iterator it; 188 QStringList::Iterator it;
182 bool ok = true; 189 bool ok = true;
183 for ( it = files.begin(); it != files.end(); ++it ) { 190 for ( it = files.begin(); it != files.end(); ++it ) {
184 QFile file( mPath + "/" + (*it) ); 191 QFile file( mPath + "/" + (*it) );
185 192
186 if ( !file.open( IO_ReadOnly ) ) { 193 if ( !file.open( IO_ReadOnly ) ) {
187 addressBook()->error( i18n( "Unable to open file '%1' for reading" ).arg( file.name() ) ); 194 addressBook()->error( i18n( "Unable to open file '%1' for reading" ).arg( file.name() ) );
188 ok = false; 195 ok = false;
189 continue; 196 continue;
190 } 197 }
191 198
192 if ( !mFormat->loadAll( addressBook(), this, &file ) ) 199 if ( !mFormat->loadAll( addressBook(), this, &file ) )
193 ok = false; 200 ok = false;
194 201
195 file.close(); 202 file.close();
196 } 203 }
197 204
198 return ok; 205 return ok;
199} 206}
200 207
201bool ResourceDir::save( Ticket *ticket ) 208bool ResourceDir::save( Ticket *ticket )
202{ 209{
203 kdDebug(5700) << "ResourceDir::save(): '" << mPath << "'" << endl; 210 kdDebug(5700) << "ResourceDir::save(): '" << mPath << "'" << endl;
204 211
205 AddressBook::Iterator it; 212 AddressBook::Iterator it;
206 bool ok = true; 213 bool ok = true;
207 214
208 for ( it = addressBook()->begin(); it != addressBook()->end(); ++it ) { 215 for ( it = addressBook()->begin(); it != addressBook()->end(); ++it ) {
209 if ( (*it).resource() != this || !(*it).changed() ) 216 if ( (*it).resource() != this || !(*it).changed() )
210 continue; 217 continue;
211 218
212 QFile file( mPath + "/" + (*it).uid() ); 219 QFile file( mPath + "/" + (*it).uid() );
213 if ( !file.open( IO_WriteOnly ) ) { 220 if ( !file.open( IO_WriteOnly ) ) {
214 addressBook()->error( i18n( "Unable to open file '%1' for writing" ).arg( file.name() ) ); 221 addressBook()->error( i18n( "Unable to open file '%1' for writing" ).arg( file.name() ) );
215 continue; 222 continue;
216 } 223 }
217 224
218 mFormat->save( *it, &file ); 225 mFormat->save( *it, &file );
219 226
220 // mark as unchanged 227 // mark as unchanged
221 (*it).setChanged( false ); 228 (*it).setChanged( false );
222 229
223 file.close(); 230 file.close();
224 } 231 }
225 232
226 delete ticket; 233 delete ticket;
227 unlock( mPath ); 234 unlock( mPath );
228 235
229 return ok; 236 return ok;
230} 237}
231 238
232bool ResourceDir::lock( const QString &path ) 239bool ResourceDir::lock( const QString &path )
233{ 240{
234 kdDebug(5700) << "ResourceDir::lock()" << endl; 241 kdDebug(5700) << "ResourceDir::lock()" << endl;
235 242
236 QString p = path; 243 QString p = path;
237//US change the implementation how the lockfilename is getting created 244//US change the implementation how the lockfilename is getting created
238//US p.replace( QRegExp("/"), "_" ); 245//US p.replace( QRegExp("/"), "_" );
239//US QString lockName = locateLocal( "data", "kabc/lock/" + p + ".lock" ); 246//US QString lockName = locateLocal( "data", "kabc/lock/" + p + ".lock" );
240 KURL url(p); 247 KURL url(p);
241 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" ); 248 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" );
242 249
243 250
244 kdDebug(5700) << "-- lock name: " << lockName << endl; 251 kdDebug(5700) << "-- lock name: " << lockName << endl;
245 252
246 if ( QFile::exists( lockName ) ) return false; 253 if ( QFile::exists( lockName ) ) return false;
247 254
248 QString lockUniqueName; 255 QString lockUniqueName;
249 lockUniqueName = p + KApplication::randomString( 8 ); 256 lockUniqueName = p + KApplication::randomString( 8 );
250 257
251 url = lockUniqueName; 258 url = lockUniqueName;
252//US mLockUniqueName = locateLocal( "data", "kabc/lock/" + lockUniqueName ); 259//US mLockUniqueName = locateLocal( "data", "kabc/lock/" + lockUniqueName );
253 mLockUniqueName = locateLocal( "data", "kabc/lock/" + url.fileName() ); 260 mLockUniqueName = locateLocal( "data", "kabc/lock/" + url.fileName() );
254 261
255 kdDebug(5700) << "-- lock unique name: " << mLockUniqueName << endl; 262 kdDebug(5700) << "-- lock unique name: " << mLockUniqueName << endl;
256 263
257 // Create unique file 264 // Create unique file
258 QFile file( mLockUniqueName ); 265 QFile file( mLockUniqueName );
259 file.open( IO_WriteOnly ); 266 file.open( IO_WriteOnly );
260 file.close(); 267 file.close();
261 268
262 // Create lock file 269 // Create lock file
263 int result = 0; 270 int result = 0;
264#ifndef _WIN32_ 271#ifndef _WIN32_
265 result = ::link( QFile::encodeName( mLockUniqueName ), 272 result = ::link( QFile::encodeName( mLockUniqueName ),
266 QFile::encodeName( lockName ) ); 273 QFile::encodeName( lockName ) );
267#endif 274#endif
268 if ( result == 0 ) { 275 if ( result == 0 ) {
269 addressBook()->emitAddressBookLocked(); 276 addressBook()->emitAddressBookLocked();
270 return true; 277 return true;
271 } 278 }
272 279
273 // TODO: check stat 280 // TODO: check stat
274 281
275 return false; 282 return false;
276} 283}
277 284
278void ResourceDir::unlock( const QString &path ) 285void ResourceDir::unlock( const QString &path )
279{ 286{
280 QString p = path; 287 QString p = path;
281//US change the implementation how the lockfilename is getting created 288//US change the implementation how the lockfilename is getting created
282//US p.replace( QRegExp( "/" ), "_" ); 289//US p.replace( QRegExp( "/" ), "_" );
283//US QString lockName = locate( "data", "kabc/lock/" + p + ".lock" ); 290//US QString lockName = locate( "data", "kabc/lock/" + p + ".lock" );
284 KURL url(p); 291 KURL url(p);
285 QString lockName = locate( "data", "kabc/lock/" + url.fileName() + ".lock" ); 292 QString lockName = locate( "data", "kabc/lock/" + url.fileName() + ".lock" );
286 293
287 ::unlink( QFile::encodeName( lockName ) ); 294 ::unlink( QFile::encodeName( lockName ) );
288 QFile::remove( mLockUniqueName ); 295 QFile::remove( mLockUniqueName );
289 addressBook()->emitAddressBookUnlocked(); 296 addressBook()->emitAddressBookUnlocked();
290} 297}
291 298
292void ResourceDir::setPath( const QString &path ) 299void ResourceDir::setPath( const QString &path )
293{ 300{
294/*US ToDo: no synchronization so far. Has to be changed in the future 301/*US ToDo: no synchronization so far. Has to be changed in the future
295 mDirWatch.stopScan(); 302 mDirWatch.stopScan();
296 mDirWatch.removeDir( mPath ); 303 mDirWatch.removeDir( mPath );
297*/ 304*/
298 mPath = path; 305 mPath = path;
299 306
300/*US ToDo: no synchronization so far. Has to be changed in the future 307/*US ToDo: no synchronization so far. Has to be changed in the future
301 mDirWatch.addDir( mPath, true ); 308 mDirWatch.addDir( mPath, true );
302 mDirWatch.startScan(); 309 mDirWatch.startScan();
303*/ 310*/
304 311
305//US simulate KDirWatch event 312//US simulate KDirWatch event
306 pathChanged(); 313 pathChanged();
307 314
308} 315}
309 316
310QString ResourceDir::path() const 317QString ResourceDir::path() const
311{ 318{
312 return mPath; 319 return mPath;
313} 320}
314 321
315void ResourceDir::setFormat( const QString &format ) 322void ResourceDir::setFormat( const QString &format )
316{ 323{
317 mFormatName = format; 324 mFormatName = format;
318 325
319 if ( mFormat ) 326 if ( mFormat )
320 delete mFormat; 327 delete mFormat;
321 328
322 FormatFactory *factory = FormatFactory::self(); 329 FormatFactory *factory = FormatFactory::self();
323 mFormat = factory->format( mFormatName ); 330 mFormat = factory->format( mFormatName );
324/*US 331/*US
325qDebug("ResourceDir::setFormat initialized with format %s ", format.latin1()); 332qDebug("ResourceDir::setFormat initialized with format %s ", format.latin1());
326 if (mFormatName == "vcard") 333 if (mFormatName == "vcard")
327 mFormat = new VCardFormatPlugin2(); 334 mFormat = new VCardFormatPlugin2();
328 else if (mFormatName == "binary") 335 else if (mFormatName == "binary")
329 mFormat = new BinaryFormat(); 336 mFormat = new BinaryFormat();
330 else 337 else
331 qDebug("ResourceDir::setFormat format unknown !!! %s ", format.latin1()); 338 qDebug("ResourceDir::setFormat format unknown !!! %s ", format.latin1());
332*/ 339*/
333 340
334} 341}
335 342
336QString ResourceDir::format() const 343QString ResourceDir::format() const
337{ 344{
338 return mFormatName; 345 return mFormatName;
339} 346}
340 347
341void ResourceDir::pathChanged() 348void ResourceDir::pathChanged()
342{ 349{
343 if ( !addressBook() ) 350 if ( !addressBook() )
344 return; 351 return;
345 352
346 load(); 353 load();
347 addressBook()->emitAddressBookChanged(); 354 addressBook()->emitAddressBookChanged();
348} 355}
349 356
350void ResourceDir::removeAddressee( const Addressee& addr ) 357void ResourceDir::removeAddressee( const Addressee& addr )
351{ 358{
352 QFile::remove( mPath + "/" + addr.uid() ); 359 QFile::remove( mPath + "/" + addr.uid() );
353} 360}
354 361
355void ResourceDir::cleanUp() 362void ResourceDir::cleanUp()
356{ 363{
357 unlock( mPath ); 364 unlock( mPath );
358} 365}
359 366
360//US #include "resourcedir.moc" 367//US #include "resourcedir.moc"
diff --git a/kabc/plugins/file/file.pro b/kabc/plugins/file/file.pro
index a5ade93..7cf7c58 100644
--- a/kabc/plugins/file/file.pro
+++ b/kabc/plugins/file/file.pro
@@ -1,30 +1,35 @@
1 TEMPLATE= lib 1 TEMPLATE= lib
2CONFIG += qt warn_on release 2CONFIG += qt warn_on release
3#release debug 3#release debug
4 4
5TARGET = microkabc_file 5TARGET = microkabc_file
6INCLUDEPATH += ../.. ../../../microkde ../../../microkde/kdecore ../../../microkde/kio/kfile ../../../qtcompat 6INCLUDEPATH += ../.. ../../../microkde ../../../microkde/kdecore ../../../microkde/kio/kfile ../../../qtcompat
7 7
8DESTDIR = ../../../bin 8DESTDIR = ../../../bin
9#LIBS += -lmicrokde -lmicrokabc 9#LIBS += -lmicrokde -lmicrokabc
10#LIBS += -L$(QPEDIR)/lib 10#LIBS += -L$(QPEDIR)/lib
11 11
12INTERFACES = \ 12INTERFACES = \
13 13
14HEADERS = \ 14HEADERS = \
15 resourcefile.h \ 15 resourcefile.h \
16 resourcefileconfig.h 16 resourcefileconfig.h
17 17
18SOURCES = \ 18SOURCES = \
19 resourcefile.cpp \ 19 resourcefile.cpp \
20 resourcefileconfig.cpp 20 resourcefileconfig.cpp
21 21
22unix : { 22unix : {
23OBJECTS_DIR = obj/unix 23OBJECTS_DIR = obj/unix
24MOC_DIR = moc/unix 24MOC_DIR = moc/unix
25} 25}
26win32: { 26win32: {
27CONFIG += dll
27DEFINES += _WIN32_ 28DEFINES += _WIN32_
28OBJECTS_DIR = obj/win 29OBJECTS_DIR = obj/win
29MOC_DIR = moc/win 30MOC_DIR = moc/win
31LIBS += ../../../bin/microkdepim.lib
32LIBS += ../../../bin/microkcal.lib
33LIBS += ../../../bin/microkde.lib
34LIBS += ../../../bin/microkabc.lib
30} \ No newline at end of file 35} \ No newline at end of file
diff --git a/kabc/plugins/file/resourcefile.cpp b/kabc/plugins/file/resourcefile.cpp
index 4b4c935..2d20706 100644
--- a/kabc/plugins/file/resourcefile.cpp
+++ b/kabc/plugins/file/resourcefile.cpp
@@ -1,391 +1,399 @@
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 45
46#include "formatfactory.h" 46#include "formatfactory.h"
47 47
48#include "resource.h" 48#include "resource.h"
49#include "resourcefileconfig.h" 49#include "resourcefileconfig.h"
50#include "stdaddressbook.h" 50#include "stdaddressbook.h"
51 51
52//US #include "../../formats/vcardformatplugin2.h" 52//US #include "../../formats/vcardformatplugin2.h"
53//US #include "../../formats/binaryformat.h" 53//US #include "../../formats/binaryformat.h"
54 54
55 55
56#include "resourcefile.h" 56#include "resourcefile.h"
57 57
58using namespace KABC; 58using namespace KABC;
59 59
60extern "C" 60extern "C"
61#ifdef _WIN32_
62__declspec(dllexport)
63#else
61{ 64{
65#endif
66
62//US void *init_kabc_file() 67//US void *init_kabc_file()
63 void *init_microkabc_file() 68 void *init_microkabc_file()
64 { 69 {
65 return new KRES::PluginFactory<ResourceFile,ResourceFileConfig>(); 70 return new KRES::PluginFactory<ResourceFile,ResourceFileConfig>();
66 } 71 }
72#ifndef _WIN32_
67} 73}
68 74#endif
69 75
70ResourceFile::ResourceFile( const KConfig *config ) 76ResourceFile::ResourceFile( const KConfig *config )
71 : Resource( config ) , mFormat( 0 ) 77 : Resource( config ) , mFormat( 0 )
72{ 78{
73 QString fileName, formatName; 79 QString fileName, formatName;
74 80
75 KConfig *cfg = (KConfig *)config; 81 KConfig *cfg = (KConfig *)config;
76 if ( cfg ) { 82 if ( cfg ) {
77 fileName = cfg->readEntry( "FileName", StdAddressBook::fileName() ); 83 fileName = cfg->readEntry( "FileName", StdAddressBook::fileName() );
78 formatName = cfg->readEntry( "FileFormat", "vcard" ); 84 formatName = cfg->readEntry( "FileFormat", "vcard" );
79// qDebug("ResourceFile::ResourceFile : 1 %s, %s", fileName.latin1(), formatName.latin1() ); 85// qDebug("ResourceFile::ResourceFile : 1 %s, %s", fileName.latin1(), formatName.latin1() );
80 } else { 86 } else {
81 fileName = StdAddressBook::fileName(); 87 fileName = StdAddressBook::fileName();
82 formatName = "vcard"; 88 formatName = "vcard";
83// qDebug("ResourceFile::ResourceFile : 2 %s, %s", fileName.latin1(), formatName.latin1() ); 89// qDebug("ResourceFile::ResourceFile : 2 %s, %s", fileName.latin1(), formatName.latin1() );
84 } 90 }
85 91
86 init( fileName, formatName ); 92 init( fileName, formatName );
87} 93}
88 94
89ResourceFile::ResourceFile( const QString &fileName, 95ResourceFile::ResourceFile( const QString &fileName,
90 const QString &formatName ) 96 const QString &formatName )
91 : Resource( 0 ) 97 : Resource( 0 )
92{ 98{
93// qDebug("ResourceFile::ResourceFile : 3 %s, %s", fileName.latin1(), formatName.latin1()); 99// qDebug("ResourceFile::ResourceFile : 3 %s, %s", fileName.latin1(), formatName.latin1());
94 init( fileName, formatName ); 100 init( fileName, formatName );
95} 101}
96 102
97void ResourceFile::init( const QString &fileName, const QString &formatName ) 103void ResourceFile::init( const QString &fileName, const QString &formatName )
98{ 104{
99 mFormatName = formatName; 105 mFormatName = formatName;
100 106
101 FormatFactory *factory = FormatFactory::self(); 107 FormatFactory *factory = FormatFactory::self();
102 mFormat = factory->format( mFormatName ); 108 mFormat = factory->format( mFormatName );
103 109
104 if ( !mFormat ) { 110 if ( !mFormat ) {
105 mFormatName = "vcard"; 111 mFormatName = "vcard";
106 mFormat = factory->format( mFormatName ); 112 mFormat = factory->format( mFormatName );
107 } 113 }
108 114
109/*US 115/*US
110//US qDebug("ResourceFile::init initialized with format %s ", formatName.latin1()); 116//US qDebug("ResourceFile::init initialized with format %s ", formatName.latin1());
111 if (mFormatName == "vcard") { 117 if (mFormatName == "vcard") {
112 mFormat = new VCardFormatPlugin2(); 118 mFormat = new VCardFormatPlugin2();
113// qDebug("ResourceFile::init format VCardFormatPlugin2"); 119// qDebug("ResourceFile::init format VCardFormatPlugin2");
114 } 120 }
115 else if (mFormatName == "binary") { 121 else if (mFormatName == "binary") {
116 mFormat = new BinaryFormat(); 122 mFormat = new BinaryFormat();
117// qDebug("ResourceFile::init format BinaryFormat"); 123// qDebug("ResourceFile::init format BinaryFormat");
118 } 124 }
119 else 125 else
120 qDebug("ResourceFile::init format unknown !!! %s ", formatName.latin1()); 126 qDebug("ResourceFile::init format unknown !!! %s ", formatName.latin1());
121*/ 127*/
122 128
123/*US we have no KDirWatch. SO simulate the signals from inside the apropriate methods 129/*US we have no KDirWatch. SO simulate the signals from inside the apropriate methods
124 connect( &mDirWatch, SIGNAL( dirty(const QString&) ), SLOT( fileChanged() ) ); 130 connect( &mDirWatch, SIGNAL( dirty(const QString&) ), SLOT( fileChanged() ) );
125 connect( &mDirWatch, SIGNAL( created(const QString&) ), SLOT( fileChanged() ) ); 131 connect( &mDirWatch, SIGNAL( created(const QString&) ), SLOT( fileChanged() ) );
126 connect( &mDirWatch, SIGNAL( deleted(const QString&) ), SLOT( fileChanged() ) ); 132 connect( &mDirWatch, SIGNAL( deleted(const QString&) ), SLOT( fileChanged() ) );
127*/ 133*/
128 134
129 setFileName( fileName ); 135 setFileName( fileName );
130} 136}
131 137
132ResourceFile::~ResourceFile() 138ResourceFile::~ResourceFile()
133{ 139{
134 delete mFormat; 140 delete mFormat;
135 mFormat = 0; 141 mFormat = 0;
136} 142}
137 143
138void ResourceFile::writeConfig( KConfig *config ) 144void ResourceFile::writeConfig( KConfig *config )
139{ 145{
146
147 config->setGroup( "Resource_" + identifier() );
140 Resource::writeConfig( config ); 148 Resource::writeConfig( config );
141 149
142 config->writeEntry( "FileName", mFileName ); 150 config->writeEntry( "FileName", mFileName );
143 config->writeEntry( "FileFormat", mFormatName ); 151 config->writeEntry( "FileFormat", mFormatName );
144 152
145// qDebug("ResourceFile::writeConfig format %s, %s", mFileName.latin1(), mFormatName.latin1()); 153// qDebug("ResourceFile::writeConfig format %s, %s", mFileName.latin1(), mFormatName.latin1());
146 154
147} 155}
148 156
149Ticket *ResourceFile::requestSaveTicket() 157Ticket *ResourceFile::requestSaveTicket()
150{ 158{
151 kdDebug(5700) << "ResourceFile::requestSaveTicket()" << endl; 159 kdDebug(5700) << "ResourceFile::requestSaveTicket()" << endl;
152 160
153 if ( !addressBook() ) return 0; 161 if ( !addressBook() ) return 0;
154 162
155 if ( !lock( mFileName ) ) { 163 if ( !lock( mFileName ) ) {
156 kdDebug(5700) << "ResourceFile::requestSaveTicket(): Unable to lock file '" 164 kdDebug(5700) << "ResourceFile::requestSaveTicket(): Unable to lock file '"
157 << mFileName << "'" << endl; 165 << mFileName << "'" << endl;
158 return 0; 166 return 0;
159 } 167 }
160 return createTicket( this ); 168 return createTicket( this );
161} 169}
162 170
163 171
164bool ResourceFile::doOpen() 172bool ResourceFile::doOpen()
165{ 173{
166 QFile file( mFileName ); 174 QFile file( mFileName );
167 175
168 if ( !file.exists() ) { 176 if ( !file.exists() ) {
169 // try to create the file 177 // try to create the file
170 bool ok = file.open( IO_WriteOnly ); 178 bool ok = file.open( IO_WriteOnly );
171 if ( ok ) 179 if ( ok )
172 file.close(); 180 file.close();
173 181
174 return ok; 182 return ok;
175 } else { 183 } else {
176 if ( !file.open( IO_ReadWrite ) ) 184 if ( !file.open( IO_ReadWrite ) )
177 return false; 185 return false;
178 186
179 if ( file.size() == 0 ) { 187 if ( file.size() == 0 ) {
180 file.close(); 188 file.close();
181 return true; 189 return true;
182 } 190 }
183 191
184 bool ok = mFormat->checkFormat( &file ); 192 bool ok = mFormat->checkFormat( &file );
185 file.close(); 193 file.close();
186 194
187 return ok; 195 return ok;
188 } 196 }
189} 197}
190 198
191void ResourceFile::doClose() 199void ResourceFile::doClose()
192{ 200{
193} 201}
194 202
195bool ResourceFile::load() 203bool ResourceFile::load()
196{ 204{
197 205
198 206
199 QFile file( mFileName ); 207 QFile file( mFileName );
200 if ( !file.open( IO_ReadOnly ) ) { 208 if ( !file.open( IO_ReadOnly ) ) {
201 addressBook()->error( i18n( "Unable to open file '%1'." ).arg( mFileName ) ); 209 addressBook()->error( i18n( "Unable to open file '%1'." ).arg( mFileName ) );
202 return false; 210 return false;
203 } 211 }
204 212
205// qDebug("ResourceFile::load format %s, %s", mFileName.latin1(), mFormatName.latin1()); 213// qDebug("ResourceFile::load format %s, %s", mFileName.latin1(), mFormatName.latin1());
206 214
207 return mFormat->loadAll( addressBook(), this, &file ); 215 return mFormat->loadAll( addressBook(), this, &file );
208} 216}
209 217
210bool ResourceFile::save( Ticket *ticket ) 218bool ResourceFile::save( Ticket *ticket )
211{ 219{
212// qDebug("ResourceFile::save format %s, %s", mFileName.latin1(), mFormatName.latin1()); 220// qDebug("ResourceFile::save format %s, %s", mFileName.latin1(), mFormatName.latin1());
213 221
214 222
215 // create backup file 223 // create backup file
216 QString extension = "_" + QString::number( QDate::currentDate().dayOfWeek() ); 224 QString extension = "_" + QString::number( QDate::currentDate().dayOfWeek() );
217 225
218/*US we use a simpler method to create a backupfile 226/*US we use a simpler method to create a backupfile
219 227
220 (void) KSaveFile::backupFile( mFileName, QString::null 228 (void) KSaveFile::backupFile( mFileName, QString::null
221 ,extension ); 229 ,extension );
222 230
223 KSaveFile saveFile( mFileName ); 231 KSaveFile saveFile( mFileName );
224 bool ok = false; 232 bool ok = false;
225 if ( saveFile.status() == 0 && saveFile.file() ) 233 if ( saveFile.status() == 0 && saveFile.file() )
226 { 234 {
227 mFormat->saveAll( addressBook(), this, saveFile.file() ); 235 mFormat->saveAll( addressBook(), this, saveFile.file() );
228 ok = saveFile.close(); 236 ok = saveFile.close();
229 } 237 }
230*/ 238*/
231 239
232//US ToDo: write backupfile 240//US ToDo: write backupfile
233 QFile info; 241 QFile info;
234 info.setName( mFileName ); 242 info.setName( mFileName );
235 bool ok = info.open( IO_WriteOnly ); 243 bool ok = info.open( IO_WriteOnly );
236 if ( ok ) { 244 if ( ok ) {
237 mFormat->saveAll( addressBook(), this, &info ); 245 mFormat->saveAll( addressBook(), this, &info );
238 246
239 info.close(); 247 info.close();
240 ok = true; 248 ok = true;
241 } 249 }
242 else { 250 else {
243 251
244 } 252 }
245 253
246 if ( !ok ) 254 if ( !ok )
247 addressBook()->error( i18n( "Unable to save file '%1'." ).arg( mFileName ) ); 255 addressBook()->error( i18n( "Unable to save file '%1'." ).arg( mFileName ) );
248 256
249 delete ticket; 257 delete ticket;
250 unlock( mFileName ); 258 unlock( mFileName );
251 259
252 return ok; 260 return ok;
253 261
254 qDebug("ResourceFile::save has to be changed"); 262 qDebug("ResourceFile::save has to be changed");
255 return true; 263 return true;
256} 264}
257 265
258bool ResourceFile::lock( const QString &fileName ) 266bool ResourceFile::lock( const QString &fileName )
259{ 267{
260 268
261 269
262 QString fn = fileName; 270 QString fn = fileName;
263 271
264//US change the implementation how the lockfilename is getting created 272//US change the implementation how the lockfilename is getting created
265//US fn.replace( QRegExp("/"), "_" ); 273//US fn.replace( QRegExp("/"), "_" );
266//US QString lockName = locateLocal( "data", "kabc/lock/" + fn + ".lock" ); 274//US QString lockName = locateLocal( "data", "kabc/lock/" + fn + ".lock" );
267 275
268 KURL url(fn); 276 KURL url(fn);
269 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" ); 277 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" );
270 278
271 279
272 280
273 if (QFile::exists( lockName )) return false; 281 if (QFile::exists( lockName )) return false;
274 282
275 QString lockUniqueName; 283 QString lockUniqueName;
276 lockUniqueName = fn + KApplication::randomString( 8 ); 284 lockUniqueName = fn + KApplication::randomString( 8 );
277 285
278 url = lockUniqueName; 286 url = lockUniqueName;
279//US mLockUniqueName = locateLocal( "data", "kabc/lock/" + lockUniqueName ); 287//US mLockUniqueName = locateLocal( "data", "kabc/lock/" + lockUniqueName );
280 mLockUniqueName = locateLocal( "data", "kabc/lock/" + url.fileName() ); 288 mLockUniqueName = locateLocal( "data", "kabc/lock/" + url.fileName() );
281 kdDebug(5700) << "-- lock unique name: " << mLockUniqueName << endl; 289 kdDebug(5700) << "-- lock unique name: " << mLockUniqueName << endl;
282 290
283 // Create unique file 291 // Create unique file
284 QFile file( mLockUniqueName ); 292 QFile file( mLockUniqueName );
285 file.open( IO_WriteOnly ); 293 file.open( IO_WriteOnly );
286 file.close(); 294 file.close();
287 295
288 // Create lock file 296 // Create lock file
289 int result = 0; 297 int result = 0;
290#ifndef _WIN32_ 298#ifndef _WIN32_
291 result = ::link( QFile::encodeName( mLockUniqueName ), 299 result = ::link( QFile::encodeName( mLockUniqueName ),
292 QFile::encodeName( lockName ) ); 300 QFile::encodeName( lockName ) );
293#endif 301#endif
294 if ( result == 0 ) { 302 if ( result == 0 ) {
295 addressBook()->emitAddressBookLocked(); 303 addressBook()->emitAddressBookLocked();
296 return true; 304 return true;
297 } 305 }
298 306
299 // TODO: check stat 307 // TODO: check stat
300 308
301 return false; 309 return false;
302} 310}
303 311
304void ResourceFile::unlock( const QString &fileName ) 312void ResourceFile::unlock( const QString &fileName )
305{ 313{
306 QString fn = fileName; 314 QString fn = fileName;
307//US change the implementation how the lockfilename is getting created 315//US change the implementation how the lockfilename is getting created
308//US fn.replace( QRegExp( "/" ), "_" ); 316//US fn.replace( QRegExp( "/" ), "_" );
309//US QString lockName = locateLocal( "data", "kabc/lock/" + fn + ".lock" ); 317//US QString lockName = locateLocal( "data", "kabc/lock/" + fn + ".lock" );
310//US QString lockName = fn + ".lock"; 318//US QString lockName = fn + ".lock";
311 KURL url(fn); 319 KURL url(fn);
312 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" ); 320 QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" );
313 321
314 QFile::remove( lockName ); 322 QFile::remove( lockName );
315 QFile::remove( mLockUniqueName ); 323 QFile::remove( mLockUniqueName );
316 addressBook()->emitAddressBookUnlocked(); 324 addressBook()->emitAddressBookUnlocked();
317} 325}
318 326
319void ResourceFile::setFileName( const QString &fileName ) 327void ResourceFile::setFileName( const QString &fileName )
320{ 328{
321/*US ToDo: no synchronization so far. Has to be changed in the future 329/*US ToDo: no synchronization so far. Has to be changed in the future
322 mDirWatch.stopScan(); 330 mDirWatch.stopScan();
323 mDirWatch.removeFile( mFileName ); 331 mDirWatch.removeFile( mFileName );
324*/ 332*/
325 mFileName = fileName; 333 mFileName = fileName;
326 334
327 335
328/*US ToDo: no synchronization so far. Has to be changed in the future 336/*US ToDo: no synchronization so far. Has to be changed in the future
329 mDirWatch.addFile( mFileName ); 337 mDirWatch.addFile( mFileName );
330 mDirWatch.startScan(); 338 mDirWatch.startScan();
331*/ 339*/
332//US simulate KDirWatch event 340//US simulate KDirWatch event
333 fileChanged(); 341 fileChanged();
334} 342}
335 343
336QString ResourceFile::fileName() const 344QString ResourceFile::fileName() const
337{ 345{
338 return mFileName; 346 return mFileName;
339} 347}
340 348
341void ResourceFile::setFormat( const QString &format ) 349void ResourceFile::setFormat( const QString &format )
342{ 350{
343 mFormatName = format; 351 mFormatName = format;
344 delete mFormat; 352 delete mFormat;
345 353
346 FormatFactory *factory = FormatFactory::self(); 354 FormatFactory *factory = FormatFactory::self();
347 mFormat = factory->format( mFormatName ); 355 mFormat = factory->format( mFormatName );
348/*US 356/*US
349//qDebug("ResourceFile::setFormat initialized with format %s ", format.latin1()); 357//qDebug("ResourceFile::setFormat initialized with format %s ", format.latin1());
350 if (mFormatName == "vcard") { 358 if (mFormatName == "vcard") {
351 mFormat = new VCardFormatPlugin2(); 359 mFormat = new VCardFormatPlugin2();
352// qDebug("ResourceFile::setFormat format %s", mFormatName.latin1()); 360// qDebug("ResourceFile::setFormat format %s", mFormatName.latin1());
353 } 361 }
354 else if (mFormatName == "binary") { 362 else if (mFormatName == "binary") {
355 mFormat = new BinaryFormat(); 363 mFormat = new BinaryFormat();
356// qDebug("ResourceFile::setFormat format %s", mFormatName.latin1()); 364// qDebug("ResourceFile::setFormat format %s", mFormatName.latin1());
357 } 365 }
358 else 366 else
359 qDebug("ResourceFile::setFormat format unknown !!! %s ", format.latin1()); 367 qDebug("ResourceFile::setFormat format unknown !!! %s ", format.latin1());
360*/ 368*/
361 369
362} 370}
363 371
364QString ResourceFile::format() const 372QString ResourceFile::format() const
365{ 373{
366 return mFormatName; 374 return mFormatName;
367} 375}
368 376
369void ResourceFile::fileChanged() 377void ResourceFile::fileChanged()
370{ 378{
371 // There is a small theoretical chance that KDirWatch calls us before 379 // There is a small theoretical chance that KDirWatch calls us before
372 // we are fully constructed 380 // we are fully constructed
373 if (!addressBook()) 381 if (!addressBook())
374 return; 382 return;
375 load(); 383 load();
376 addressBook()->emitAddressBookChanged(); 384 addressBook()->emitAddressBookChanged();
377} 385}
378 386
379void ResourceFile::removeAddressee( const Addressee &addr ) 387void ResourceFile::removeAddressee( const Addressee &addr )
380{ 388{
381 QFile::remove( QFile::encodeName( locateLocal( "data", "kabc/photos/" ) + addr.uid() ) ); 389 QFile::remove( QFile::encodeName( locateLocal( "data", "kabc/photos/" ) + addr.uid() ) );
382 QFile::remove( QFile::encodeName( locateLocal( "data", "kabc/logos/" ) + addr.uid() ) ); 390 QFile::remove( QFile::encodeName( locateLocal( "data", "kabc/logos/" ) + addr.uid() ) );
383 QFile::remove( QFile::encodeName( locateLocal( "data", "kabc/sounds/" ) + addr.uid() ) ); 391 QFile::remove( QFile::encodeName( locateLocal( "data", "kabc/sounds/" ) + addr.uid() ) );
384} 392}
385 393
386void ResourceFile::cleanUp() 394void ResourceFile::cleanUp()
387{ 395{
388 unlock( mFileName ); 396 unlock( mFileName );
389} 397}
390 398
391//US #include "resourcefile.moc" 399//US #include "resourcefile.moc"
diff --git a/kaddressbook/mainembedded.cpp b/kaddressbook/mainembedded.cpp
index cf1fd3e..7f368eb 100644
--- a/kaddressbook/mainembedded.cpp
+++ b/kaddressbook/mainembedded.cpp
@@ -1,190 +1,191 @@
1#ifndef DESKTOP_VERSION 1#ifndef DESKTOP_VERSION
2#include <qpe/qpeapplication.h> 2#include <qpe/qpeapplication.h>
3#include <stdlib.h> 3#include <stdlib.h>
4#else 4#else
5#include <qapplication.h> 5#include <qapplication.h>
6#include <qwindowsstyle.h> 6#include <qwindowsstyle.h>
7#include <qplatinumstyle.h> 7#include <qplatinumstyle.h>
8#include <qmainwindow.h> 8#include <qmainwindow.h>
9#endif 9#endif
10 10
11#include <kstandarddirs.h> 11#include <kstandarddirs.h>
12#include <kglobal.h> 12#include <kglobal.h>
13#include <stdio.h> 13#include <stdio.h>
14#include <qdir.h> 14#include <qdir.h>
15#include "kaddressbookmain.h" 15#include "kaddressbookmain.h"
16 16
17int main( int argc, char **argv ) 17int main( int argc, char **argv )
18{ 18{
19#ifndef DESKTOP_VERSION 19#ifndef DESKTOP_VERSION
20 QPEApplication a( argc, argv ); 20 QPEApplication a( argc, argv );
21 a.setKeepRunning (); 21 a.setKeepRunning ();
22#else 22#else
23 QApplication a( argc, argv ); 23 QApplication a( argc, argv );
24 QApplication::setStyle( new QPlatinumStyle ()); 24 QApplication::setStyle( new QPlatinumStyle ());
25#endif 25#endif
26 26
27 bool exitHelp = false; 27 bool exitHelp = false;
28 if ( argc > 1 ) { 28 if ( argc > 1 ) {
29 QString command = argv[1]; 29 QString command = argv[1];
30 if ( command == "-help" ){ 30 if ( command == "-help" ){
31 printf("KA/E command line commands:\n"); 31 printf("KA/E command line commands:\n");
32 printf(" no command: Start KA/E in usual way\n"); 32 printf(" no command: Start KA/E in usual way\n");
33 printf(" -help: This output\n"); 33 printf(" -help: This output\n");
34 printf(" KA/E is exiting now. Bye!\n"); 34 printf(" KA/E is exiting now. Bye!\n");
35 exitHelp = true; 35 exitHelp = true;
36 } 36 }
37 } 37 }
38 if ( ! exitHelp ) { 38 if ( ! exitHelp ) {
39 39
40 KGlobal::setAppName( "kaddressbook" ); 40 KGlobal::setAppName( "kaddressbook" );
41#ifndef DESKTOP_VERSION 41#ifndef DESKTOP_VERSION
42 if ( QApplication::desktop()->width() > 320 ) 42 if ( QApplication::desktop()->width() > 320 )
43 KGlobal::iconLoader()->setIconPath(QString(getenv("QPEDIR"))+"/pics/kdepim/kaddressbook/icons22/"); 43 KGlobal::iconLoader()->setIconPath(QString(getenv("QPEDIR"))+"/pics/kdepim/kaddressbook/icons22/");
44 else 44 else
45 KGlobal::iconLoader()->setIconPath(QString(getenv("QPEDIR"))+"/pics/kdepim/kaddressbook/icons16/"); 45 KGlobal::iconLoader()->setIconPath(QString(getenv("QPEDIR"))+"/pics/kdepim/kaddressbook/icons16/");
46#else 46#else
47 QString fileName ; 47 QString fileName ;
48 fileName = qApp->applicationDirPath () + "/kdepim/kaddressbook/icons22/"; 48 fileName = qApp->applicationDirPath () + "/kdepim/kaddressbook/icons22/";
49 KGlobal::iconLoader()->setIconPath(QDir::convertSeparators(fileName)); 49 KGlobal::iconLoader()->setIconPath(QDir::convertSeparators(fileName));
50 QApplication::addLibraryPath ( qApp->applicationDirPath () ); 50 QApplication::addLibraryPath ( qApp->applicationDirPath () );
51 51
52#endif 52#endif
53 KStandardDirs::setAppDir( QDir::convertSeparators(locateLocal("data", "kaddressbook"))); 53 KStandardDirs::setAppDir( QDir::convertSeparators(locateLocal("data", "kaddressbook")));
54 KAddressBookMain m ; 54 KAddressBookMain m ;
55//US MainWindow m; 55//US MainWindow m;
56//US QObject::connect( &a, SIGNAL (appMessage ( const QCString &, const QByteArray & )),&m, SLOT(recieve( const QCString&, const QByteArray& ))); 56//US QObject::connect( &a, SIGNAL (appMessage ( const QCString &, const QByteArray & )),&m, SLOT(recieve( const QCString&, const QByteArray& )));
57 57
58#ifndef DESKTOP_VERSION 58#ifndef DESKTOP_VERSION
59 a.showMainWidget( &m ); 59 a.showMainWidget( &m );
60#else 60#else
61 a.setMainWidget( &m ); 61 a.setMainWidget( &m );
62 m.resize (640, 480 );
62 m.show(); 63 m.show();
63#endif 64#endif
64 a.exec(); 65 a.exec();
65 66
66 } 67 }
67 qDebug("KA: Bye! "); 68 qDebug("KA: Bye! ");
68} 69}
69 70
70/* 71/*
71#include <stdlib.h> 72#include <stdlib.h>
72 73
73#include <qstring.h> 74#include <qstring.h>
74 75
75#include <kabc/stdaddressbook.h> 76#include <kabc/stdaddressbook.h>
76#include <kaboutdata.h> 77#include <kaboutdata.h>
77#include <kcmdlineargs.h> 78#include <kcmdlineargs.h>
78#include <kcrash.h> 79#include <kcrash.h>
79#include <kdebug.h> 80#include <kdebug.h>
80#include <klocale.h> 81#include <klocale.h>
81#include <kstartupinfo.h> 82#include <kstartupinfo.h>
82#include <kuniqueapplication.h> 83#include <kuniqueapplication.h>
83#include <kwin.h> 84#include <kwin.h>
84 85
85#include "kaddressbookmain.h" 86#include "kaddressbookmain.h"
86#include "kabcore.h" 87#include "kabcore.h"
87 88
88extern "C" { 89extern "C" {
89 90
90void crashHandler( int ) 91void crashHandler( int )
91{ 92{
92 KABC::StdAddressBook::handleCrash(); 93 KABC::StdAddressBook::handleCrash();
93 ::exit( 0 ); 94 ::exit( 0 );
94} 95}
95 96
96} 97}
97 98
98class KAddressBookApp : public KUniqueApplication { 99class KAddressBookApp : public KUniqueApplication {
99 public: 100 public:
100 KAddressBookApp() : mMainWin( 0 ) {} 101 KAddressBookApp() : mMainWin( 0 ) {}
101 ~KAddressBookApp() {} 102 ~KAddressBookApp() {}
102 103
103 int newInstance(); 104 int newInstance();
104 105
105 private: 106 private:
106 KAddressBookMain *mMainWin; 107 KAddressBookMain *mMainWin;
107}; 108};
108 109
109int KAddressBookApp::newInstance() 110int KAddressBookApp::newInstance()
110{ 111{
111 if ( isRestored() ) { 112 if ( isRestored() ) {
112 // There can only be one main window 113 // There can only be one main window
113 if ( KMainWindow::canBeRestored( 1 ) ) { 114 if ( KMainWindow::canBeRestored( 1 ) ) {
114 mMainWin = new KAddressBookMain; 115 mMainWin = new KAddressBookMain;
115 mMainWin->show(); 116 mMainWin->show();
116 mMainWin->restore( 1 ); 117 mMainWin->restore( 1 );
117 } 118 }
118 } else { 119 } else {
119 KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); 120 KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
120 121
121 QCString addrStr = args->getOption( "addr" ); 122 QCString addrStr = args->getOption( "addr" );
122 QCString uidStr = args->getOption( "uid" ); 123 QCString uidStr = args->getOption( "uid" );
123 QString addr; 124 QString addr;
124 QString uid; 125 QString uid;
125 if ( !addrStr.isEmpty() ) 126 if ( !addrStr.isEmpty() )
126 addr = QString::fromLocal8Bit( addrStr ); 127 addr = QString::fromLocal8Bit( addrStr );
127 if ( !uidStr.isEmpty() ) 128 if ( !uidStr.isEmpty() )
128 uid = QString::fromLocal8Bit( uidStr ); 129 uid = QString::fromLocal8Bit( uidStr );
129 130
130 131
131 if ( args->isSet( "editor-only" ) ) { 132 if ( args->isSet( "editor-only" ) ) {
132 if ( !mMainWin ) 133 if ( !mMainWin )
133 mMainWin = new KAddressBookMain; 134 mMainWin = new KAddressBookMain;
134 KStartupInfo::appStarted(); 135 KStartupInfo::appStarted();
135 mMainWin->hide(); 136 mMainWin->hide();
136 } else { 137 } else {
137 if ( mMainWin ) { 138 if ( mMainWin ) {
138 mMainWin->show(); 139 mMainWin->show();
139 KWin::setActiveWindow( mMainWin->winId() ); 140 KWin::setActiveWindow( mMainWin->winId() );
140 } else { 141 } else {
141 mMainWin = new KAddressBookMain; 142 mMainWin = new KAddressBookMain;
142 mMainWin->show(); 143 mMainWin->show();
143 } 144 }
144 } 145 }
145 // Can not see why anyone would pass both a uid and an email address, so I'll leave it that two contact editors will show if they do 146 // Can not see why anyone would pass both a uid and an email address, so I'll leave it that two contact editors will show if they do
146 if ( !addr.isEmpty() ) 147 if ( !addr.isEmpty() )
147 mMainWin->addEmail( addr ); 148 mMainWin->addEmail( addr );
148 149
149 if ( !uid.isEmpty() ) 150 if ( !uid.isEmpty() )
150 mMainWin->showContactEditor( uid ); 151 mMainWin->showContactEditor( uid );
151 if ( args->isSet( "new-contact" ) ) { 152 if ( args->isSet( "new-contact" ) ) {
152 mMainWin->newContact(); 153 mMainWin->newContact();
153 } 154 }
154 } 155 }
155 156
156 KCrash::setEmergencySaveFunction( crashHandler ); 157 KCrash::setEmergencySaveFunction( crashHandler );
157 158
158 return 0; 159 return 0;
159} 160}
160 161
161// the dummy argument is required, because KMail apparently sends an empty 162// the dummy argument is required, because KMail apparently sends an empty
162// argument. 163// argument.
163static KCmdLineOptions kmoptions[] = 164static KCmdLineOptions kmoptions[] =
164{ 165{
165 { "a", 0 , 0 }, 166 { "a", 0 , 0 },
166 { "addr <email>", I18N_NOOP( "Shows contact editor with given email address" ), 0 }, 167 { "addr <email>", I18N_NOOP( "Shows contact editor with given email address" ), 0 },
167 { "uid <uid>", I18N_NOOP( "Shows contact editor with given uid" ), 0 }, 168 { "uid <uid>", I18N_NOOP( "Shows contact editor with given uid" ), 0 },
168 { "editor-only", I18N_NOOP( "Launches in editor only mode" ), 0 }, 169 { "editor-only", I18N_NOOP( "Launches in editor only mode" ), 0 },
169 { "new-contact", I18N_NOOP( "Launches editor for the new contact" ), 0 }, 170 { "new-contact", I18N_NOOP( "Launches editor for the new contact" ), 0 },
170 { "+[argument]", I18N_NOOP( "dummy argument" ), 0}, 171 { "+[argument]", I18N_NOOP( "dummy argument" ), 0},
171 { 0, 0, 0} 172 { 0, 0, 0}
172}; 173};
173 174
174int main( int argc, char *argv[] ) 175int main( int argc, char *argv[] )
175{ 176{
176 KLocale::setMainCatalogue( "kaddressbook" ); 177 KLocale::setMainCatalogue( "kaddressbook" );
177 178
178 KCmdLineArgs::init( argc, argv, KABCore::createAboutData() ); 179 KCmdLineArgs::init( argc, argv, KABCore::createAboutData() );
179 KCmdLineArgs::addCmdLineOptions( kmoptions ); 180 KCmdLineArgs::addCmdLineOptions( kmoptions );
180 KUniqueApplication::addCmdLineOptions(); 181 KUniqueApplication::addCmdLineOptions();
181 182
182 if ( !KAddressBookApp::start() ) 183 if ( !KAddressBookApp::start() )
183 exit( 0 ); 184 exit( 0 );
184 185
185 KAddressBookApp app; 186 KAddressBookApp app;
186 KGlobal::locale()->insertCatalogue( "libkdepim" ); 187 KGlobal::locale()->insertCatalogue( "libkdepim" );
187 188
188 return app.exec(); 189 return app.exec();
189} 190}
190*/ 191*/
diff --git a/kaddressbook/views/contactlistview.cpp b/kaddressbook/views/contactlistview.cpp
index 98b2fb2..9804e28 100644
--- a/kaddressbook/views/contactlistview.cpp
+++ b/kaddressbook/views/contactlistview.cpp
@@ -1,340 +1,340 @@
1/* 1/*
2 This file is part of KAddressBook. 2 This file is part of KAddressBook.
3 Copyright (c) 2002 Mike Pilone <mpilone@slac.com> 3 Copyright (c) 2002 Mike Pilone <mpilone@slac.com>
4 4
5 This program is free software; you can redistribute it and/or modify 5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by 6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or 7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version. 8 (at your option) any later version.
9 9
10 This program is distributed in the hope that it will be useful, 10 This program 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 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details. 13 GNU General Public License for more details.
14 14
15 You should have received a copy of the GNU General Public License 15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software 16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 18
19 As a special exception, permission is given to link this program 19 As a special exception, permission is given to link this program
20 with any edition of Qt, and distribute the resulting executable, 20 with any edition of Qt, and distribute the resulting executable,
21 without including the source code for Qt in the source distribution. 21 without including the source code for Qt in the source distribution.
22*/ 22*/
23 23
24#include <qheader.h> 24#include <qheader.h>
25#include <qiconset.h> 25#include <qiconset.h>
26#include <qimage.h> 26#include <qimage.h>
27#include <qdragobject.h> 27#include <qdragobject.h>
28#include <qcombobox.h> 28#include <qcombobox.h>
29#include <qpainter.h> 29#include <qpainter.h>
30#include <qbrush.h> 30#include <qbrush.h>
31#include <qevent.h> 31#include <qevent.h>
32 32
33#include <klocale.h> 33#include <klocale.h>
34#include <kglobalsettings.h> 34#include <kglobalsettings.h>
35#include <kiconloader.h> 35#include <kiconloader.h>
36#include <kdebug.h> 36#include <kdebug.h>
37#include <kconfig.h> 37#include <kconfig.h>
38#include <kapplication.h> 38#include <kapplication.h>
39#include <kurl.h> 39#include <kurl.h>
40 40
41#include "kaddressbooktableview.h" 41#include "kaddressbooktableview.h"
42 42
43#include "contactlistview.h" 43#include "contactlistview.h"
44 44
45///////////////////////////////// 45/////////////////////////////////
46// DynamicTip Methods 46// DynamicTip Methods
47 47
48DynamicTip::DynamicTip( ContactListView *parent) 48DynamicTip::DynamicTip( ContactListView *parent)
49 : QToolTip( parent ) 49 : QToolTip( parent )
50{ 50{
51} 51}
52 52
53void DynamicTip::maybeTip( const QPoint &pos ) 53void DynamicTip::maybeTip( const QPoint &pos )
54{ 54{
55 static bool ishidden = true; 55 static bool ishidden = true;
56 if (!parentWidget()->inherits( "ContactListView" )) 56 if (!parentWidget()->inherits( "ContactListView" ))
57 return; 57 return;
58 58
59 ContactListView *plv = (ContactListView*)parentWidget(); 59 ContactListView *plv = (ContactListView*)parentWidget();
60 if (!plv->tooltips()) 60 if (!plv->tooltips())
61 return; 61 return;
62 62
63 QPoint posVp = plv->viewport()->pos(); 63 QPoint posVp = plv->viewport()->pos();
64 64
65 QListViewItem *lvi = plv->itemAt( pos - posVp ); 65 QListViewItem *lvi = plv->itemAt( pos - posVp );
66 if (!lvi) 66 if (!lvi)
67 return; 67 return;
68 68
69#ifndef KAB_EMBEDDED 69#ifndef KAB_EMBEDDED
70 ContactListViewItem *plvi = dynamic_cast< ContactListViewItem* >(lvi); 70 ContactListViewItem *plvi = dynamic_cast< ContactListViewItem* >(lvi);
71#else //KAB_EMBEDDED 71#else //KAB_EMBEDDED
72 ContactListViewItem *plvi = (ContactListViewItem*)(lvi); 72 ContactListViewItem *plvi = (ContactListViewItem*)(lvi);
73#endif //KAB_EMBEDDED 73#endif //KAB_EMBEDDED
74 74
75 if (!plvi) 75 if (!plvi)
76 return; 76 return;
77 77
78 if (ishidden) { 78 if (ishidden) {
79 QString s; 79 QString s;
80 QRect r = plv->itemRect( lvi ); 80 QRect r = plv->itemRect( lvi );
81 r.moveBy( posVp.x(), posVp.y() ); 81 r.moveBy( posVp.x(), posVp.y() );
82 82
83 //kdDebug() << "Tip rec: " << r.x() << "," << r.y() << "," << r.width() 83 //kdDebug() << "Tip rec: " << r.x() << "," << r.y() << "," << r.width()
84 // << "," << r.height() << endl; 84 // << "," << r.height() << endl;
85 85
86 KABC::Addressee a = plvi->addressee(); 86 KABC::Addressee a = plvi->addressee();
87 if (a.isEmpty()) 87 if (a.isEmpty())
88 return; 88 return;
89 89
90 s += i18n("label: value", "%1: %2").arg(a.formattedNameLabel()) 90 s += i18n("label: value", "%1: %2").arg(a.formattedNameLabel())
91 .arg(a.formattedName()); 91 .arg(a.formattedName());
92 92
93 s += '\n'; 93 s += '\n';
94 s += i18n("label: value", "%1: %2").arg(a.organizationLabel()) 94 s += i18n("label: value", "%1: %2").arg(a.organizationLabel())
95 .arg(a.organization()); 95 .arg(a.organization());
96 96
97 QString notes = a.note().stripWhiteSpace(); 97 QString notes = a.note().stripWhiteSpace();
98 if ( !notes.isEmpty() ) { 98 if ( !notes.isEmpty() ) {
99 notes += '\n'; 99 notes += '\n';
100 s += '\n' + i18n("label: value", "%1: \n").arg(a.noteLabel()); 100 s += '\n' + i18n("label: value", "%1: \n").arg(a.noteLabel());
101 QFontMetrics fm( font() ); 101 QFontMetrics fm( font() );
102 102
103 // Begin word wrap code based on QMultiLineEdit code 103 // Begin word wrap code based on QMultiLineEdit code
104 int i = 0; 104 int i = 0;
105 bool doBreak = false; 105 bool doBreak = false;
106 int linew = 0; 106 int linew = 0;
107 int lastSpace = -1; 107 int lastSpace = -1;
108 int a = 0; 108 int a = 0;
109 int lastw = 0; 109 int lastw = 0;
110 110
111 while ( i < int(notes.length()) ) { 111 while ( i < int(notes.length()) ) {
112 doBreak = FALSE; 112 doBreak = FALSE;
113 if ( notes[i] != '\n' ) 113 if ( notes[i] != '\n' )
114 linew += fm.width( notes[i] ); 114 linew += fm.width( notes[i] );
115 115
116 if ( lastSpace >= a && notes[i] != '\n' ) 116 if ( lastSpace >= a && notes[i] != '\n' )
117 if (linew >= parentWidget()->width()) { 117 if (linew >= parentWidget()->width()) {
118 doBreak = TRUE; 118 doBreak = TRUE;
119 if ( lastSpace > a ) { 119 if ( lastSpace > a ) {
120 i = lastSpace; 120 i = lastSpace;
121 linew = lastw; 121 linew = lastw;
122 } 122 }
123 else 123 else
124 i = QMAX( a, i-1 ); 124 i = QMAX( a, i-1 );
125 } 125 }
126 126
127 if ( notes[i] == '\n' || doBreak ) { 127 if ( notes[i] == '\n' || doBreak ) {
128 s += notes.mid( a, i - a + (doBreak?1:0) ) +"\n"; 128 s += notes.mid( a, i - a + (doBreak?1:0) ) +"\n";
129 129
130 a = i + 1; 130 a = i + 1;
131 lastSpace = a; 131 lastSpace = a;
132 linew = 0; 132 linew = 0;
133 } 133 }
134 134
135 if ( notes[i].isSpace() ) { 135 if ( notes[i].isSpace() ) {
136 lastSpace = i; 136 lastSpace = i;
137 lastw = linew; 137 lastw = linew;
138 } 138 }
139 139
140 if ( lastSpace <= a ) { 140 if ( lastSpace <= a ) {
141 lastw = linew; 141 lastw = linew;
142 } 142 }
143 143
144 ++i; 144 ++i;
145 } 145 }
146 } 146 }
147 147
148 tip( r, s ); 148 tip( r, s );
149 } 149 }
150 else 150 else
151 hide(); 151 hide();
152 ishidden = !ishidden; 152 ishidden = !ishidden;
153 153
154} 154}
155 155
156/////////////////////////// 156///////////////////////////
157// ContactListViewItem Methods 157// ContactListViewItem Methods
158 158
159ContactListViewItem::ContactListViewItem(const KABC::Addressee &a, 159ContactListViewItem::ContactListViewItem(const KABC::Addressee &a,
160 ContactListView *parent, 160 ContactListView *parent,
161 KABC::AddressBook *doc, 161 KABC::AddressBook *doc,
162 const KABC::Field::List &fields ) 162 const KABC::Field::List &fields )
163 : KListViewItem(parent), mAddressee(a), mFields( fields ), 163 : KListViewItem(parent), mAddressee(a), mFields( fields ),
164 parentListView( parent ), mDocument(doc) 164 parentListView( parent ), mDocument(doc)
165{ 165{
166 refresh(); 166 refresh();
167} 167}
168 168
169QString ContactListViewItem::key(int column, bool ascending) const 169QString ContactListViewItem::key(int column, bool ascending) const
170{ 170{
171 return QListViewItem::key(column, ascending).lower(); 171 return QListViewItem::key(column, ascending).lower();
172} 172}
173 173
174void ContactListViewItem::paintCell(QPainter * p, 174void ContactListViewItem::paintCell(QPainter * p,
175 const QColorGroup & cg, 175 const QColorGroup & cg,
176 int column, 176 int column,
177 int width, 177 int width,
178 int align) 178 int align)
179{ 179{
180 KListViewItem::paintCell(p, cg, column, width, align); 180 KListViewItem::paintCell(p, cg, column, width, align);
181 181
182 if ( !p ) 182 if ( !p )
183 return; 183 return;
184 184
185 if (parentListView->singleLine()) { 185 if (parentListView->singleLine()) {
186 p->setPen( parentListView->alternateColor() ); 186 p->setPen( parentListView->alternateColor() );
187 p->drawLine( 0, height() - 1, width, height() - 1 ); 187 p->drawLine( 0, height() - 1, width, height() - 1 );
188 } 188 }
189} 189}
190 190
191 191
192ContactListView *ContactListViewItem::parent() 192ContactListView *ContactListViewItem::parent()
193{ 193{
194 return parentListView; 194 return parentListView;
195} 195}
196 196
197 197
198void ContactListViewItem::refresh() 198void ContactListViewItem::refresh()
199{ 199{
200 // Update our addressee, since it may have changed else were 200 // Update our addressee, since it may have changed else were
201 mAddressee = mDocument->findByUid(mAddressee.uid()); 201 mAddressee = mDocument->findByUid(mAddressee.uid());
202 if (mAddressee.isEmpty()) 202 if (mAddressee.isEmpty())
203 return; 203 return;
204 204
205 int i = 0; 205 int i = 0;
206 KABC::Field::List::ConstIterator it; 206 KABC::Field::List::ConstIterator it;
207 for( it = mFields.begin(); it != mFields.end(); ++it ) { 207 for( it = mFields.begin(); it != mFields.end(); ++it ) {
208 setText( i++, (*it)->value( mAddressee ) ); 208 setText( i++, (*it)->value( mAddressee ) );
209 } 209 }
210} 210}
211 211
212/////////////////////////////// 212///////////////////////////////
213// ContactListView 213// ContactListView
214 214
215ContactListView::ContactListView(KAddressBookTableView *view, 215ContactListView::ContactListView(KAddressBookTableView *view,
216 KABC::AddressBook* /* doc */, 216 KABC::AddressBook* /* doc */,
217 QWidget *parent, 217 QWidget *parent,
218 const char *name ) 218 const char *name )
219 : KListView( parent, name ), 219 : KListView( parent, name ),
220 pabWidget( view ), 220 pabWidget( view ),
221 oldColumn( 0 ) 221 oldColumn( 0 )
222{ 222{
223 mABackground = true; 223 mABackground = true;
224 mSingleLine = false; 224 mSingleLine = false;
225 mToolTips = true; 225 mToolTips = true;
226#ifndef KAB_EMBEDDED 226#ifndef KAB_EMBEDDED
227 mAlternateColor = KGlobalSettings::alternateBackgroundColor(); 227 mAlternateColor = KGlobalSettings::alternateBackgroundColor();
228#else //KAB_EMBEDDED 228#else //KAB_EMBEDDED
229 mAlternateColor = QColor(240, 240, 240); 229 mAlternateColor = QColor(240, 240, 240);
230#endif //KAB_EMBEDDED 230#endif //KAB_EMBEDDED
231 231
232 setAlternateBackgroundEnabled(mABackground); 232 setAlternateBackgroundEnabled(mABackground);
233 setAcceptDrops( true ); 233 setAcceptDrops( true );
234 viewport()->setAcceptDrops( true ); 234 viewport()->setAcceptDrops( true );
235 setAllColumnsShowFocus( true ); 235 setAllColumnsShowFocus( true );
236 setShowSortIndicator(true); 236 setShowSortIndicator(true);
237 237
238 setSelectionModeExt( KListView::Extended ); 238 setSelectionModeExt( KListView::Extended );
239 setDropVisualizer(false); 239 setDropVisualizer(false);
240 // setFrameStyle(QFrame::NoFrame); 240 // setFrameStyle(QFrame::NoFrame);
241 setLineWidth ( 0 ); 241 //setLineWidth ( 0 );
242 setMidLineWidth ( 0 ); 242 //setMidLineWidth ( 0 );
243 setMargin ( 0 ); 243 //setMargin ( 0 );
244#ifndef KAB_EMBEDDED 244#ifndef KAB_EMBEDDED
245 connect(this, SIGNAL(dropped(QDropEvent*)), 245 connect(this, SIGNAL(dropped(QDropEvent*)),
246 this, SLOT(itemDropped(QDropEvent*))); 246 this, SLOT(itemDropped(QDropEvent*)));
247#endif //KAB_EMBEDDED 247#endif //KAB_EMBEDDED
248 248
249 249
250 new DynamicTip( this ); 250 new DynamicTip( this );
251} 251}
252 252
253void ContactListView::paintEmptyArea( QPainter * p, const QRect & rect ) 253void ContactListView::paintEmptyArea( QPainter * p, const QRect & rect )
254{ 254{
255 QBrush b = palette().brush(QPalette::Active, QColorGroup::Base); 255 QBrush b = palette().brush(QPalette::Active, QColorGroup::Base);
256 256
257 // Get the brush, which will have the background pixmap if there is one. 257 // Get the brush, which will have the background pixmap if there is one.
258 if (b.pixmap()) 258 if (b.pixmap())
259 { 259 {
260 p->drawTiledPixmap( rect.left(), rect.top(), rect.width(), rect.height(), 260 p->drawTiledPixmap( rect.left(), rect.top(), rect.width(), rect.height(),
261 *(b.pixmap()), 261 *(b.pixmap()),
262 rect.left() + contentsX(), 262 rect.left() + contentsX(),
263 rect.top() + contentsY() ); 263 rect.top() + contentsY() );
264 } 264 }
265 265
266 else 266 else
267 { 267 {
268 // Do a normal paint 268 // Do a normal paint
269 KListView::paintEmptyArea(p, rect); 269 KListView::paintEmptyArea(p, rect);
270 } 270 }
271} 271}
272 272
273void ContactListView::contentsMousePressEvent(QMouseEvent* e) 273void ContactListView::contentsMousePressEvent(QMouseEvent* e)
274{ 274{
275 presspos = e->pos(); 275 presspos = e->pos();
276 KListView::contentsMousePressEvent(e); 276 KListView::contentsMousePressEvent(e);
277} 277}
278 278
279 279
280// To initiate a drag operation 280// To initiate a drag operation
281void ContactListView::contentsMouseMoveEvent( QMouseEvent *e ) 281void ContactListView::contentsMouseMoveEvent( QMouseEvent *e )
282{ 282{
283 if ((e->state() & LeftButton) && (e->pos() - presspos).manhattanLength() > 4 ) { 283 if ((e->state() & LeftButton) && (e->pos() - presspos).manhattanLength() > 4 ) {
284 emit startAddresseeDrag(); 284 emit startAddresseeDrag();
285 } 285 }
286 else 286 else
287 KListView::contentsMouseMoveEvent( e ); 287 KListView::contentsMouseMoveEvent( e );
288} 288}
289 289
290bool ContactListView::acceptDrag(QDropEvent *e) const 290bool ContactListView::acceptDrag(QDropEvent *e) const
291{ 291{
292#ifndef KAB_EMBEDDED 292#ifndef KAB_EMBEDDED
293 return QTextDrag::canDecode(e); 293 return QTextDrag::canDecode(e);
294#else //KAB_EMBEDDED 294#else //KAB_EMBEDDED
295qDebug("ContactListView::acceptDrag has to be fixed"); 295qDebug("ContactListView::acceptDrag has to be fixed");
296 return false; 296 return false;
297#endif //KAB_EMBEDDED 297#endif //KAB_EMBEDDED
298} 298}
299 299
300void ContactListView::itemDropped(QDropEvent *e) 300void ContactListView::itemDropped(QDropEvent *e)
301{ 301{
302 contentsDropEvent(e); 302 contentsDropEvent(e);
303} 303}
304 304
305void ContactListView::contentsDropEvent( QDropEvent *e ) 305void ContactListView::contentsDropEvent( QDropEvent *e )
306{ 306{
307 emit addresseeDropped(e); 307 emit addresseeDropped(e);
308} 308}
309 309
310void ContactListView::setAlternateBackgroundEnabled(bool enabled) 310void ContactListView::setAlternateBackgroundEnabled(bool enabled)
311{ 311{
312 mABackground = enabled; 312 mABackground = enabled;
313 313
314 if (mABackground) 314 if (mABackground)
315 { 315 {
316 setAlternateBackground(mAlternateColor); 316 setAlternateBackground(mAlternateColor);
317 } 317 }
318 else 318 else
319 { 319 {
320 setAlternateBackground(QColor()); 320 setAlternateBackground(QColor());
321 } 321 }
322} 322}
323 323
324void ContactListView::setBackgroundPixmap(const QString &filename) 324void ContactListView::setBackgroundPixmap(const QString &filename)
325{ 325{
326 if (filename.isEmpty()) 326 if (filename.isEmpty())
327 { 327 {
328 unsetPalette(); 328 unsetPalette();
329 } 329 }
330 else 330 else
331 { 331 {
332 qDebug("ContactListView::setBackgroundPixmap has to be verified"); 332 qDebug("ContactListView::setBackgroundPixmap has to be verified");
333//US setPaletteBackgroundPixmap(QPixmap(filename)); 333//US setPaletteBackgroundPixmap(QPixmap(filename));
334 KListView::setBackgroundPixmap((const QPixmap&)QPixmap(filename)); 334 KListView::setBackgroundPixmap((const QPixmap&)QPixmap(filename));
335 } 335 }
336 336
337} 337}
338#ifndef KAB_EMBEDDED 338#ifndef KAB_EMBEDDED
339#include "contactlistview.moc" 339#include "contactlistview.moc"
340#endif //KAB_EMBEDDED 340#endif //KAB_EMBEDDED
diff --git a/microkde/kdecore/klibloader.cpp b/microkde/kdecore/klibloader.cpp
index 9eee912..1394154 100644
--- a/microkde/kdecore/klibloader.cpp
+++ b/microkde/kdecore/klibloader.cpp
@@ -1,654 +1,661 @@
1/* This file is part of the KDE libraries 1/* This file is part of the KDE libraries
2 Copyright (C) 1999 Torben Weis <weis@kde.org> 2 Copyright (C) 1999 Torben Weis <weis@kde.org>
3 Copyright (C) 2000 Michael Matz <matz@kde.org> 3 Copyright (C) 2000 Michael Matz <matz@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 version 2 as published by the Free Software Foundation. 7 License version 2 as published by the Free Software Foundation.
8 8
9 This library is distributed in the hope that it will be useful, 9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of 10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details. 12 Library General Public License for more details.
13 13
14 You should have received a copy of the GNU Library General Public License 14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to 15 along with this library; see the file COPYING.LIB. If not, write to
16 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 16 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 Boston, MA 02111-1307, USA. 17 Boston, MA 02111-1307, USA.
18*/ 18*/
19//US #include <config.h> 19//US #include <config.h>
20#include <qclipboard.h> 20#include <qclipboard.h>
21#include <qfile.h> 21#include <qfile.h>
22#include <qtimer.h> 22#include <qtimer.h>
23#include <qobjectdict.h> 23#include <qobjectdict.h>
24#include <qwidgetlist.h> 24#include <qwidgetlist.h>
25#include <qwidget.h> 25#include <qwidget.h>
26 26
27#include "kapplication.h" 27#include "kapplication.h"
28#include "klibloader.h" 28#include "klibloader.h"
29#include "kstandarddirs.h" 29#include "kstandarddirs.h"
30#include "kdebug.h" 30#include "kdebug.h"
31#include "klocale.h" 31#include "klocale.h"
32 32
33/*US 33/*US
34#ifndef NDEBUG 34#ifndef NDEBUG
35#include "ltdl.h" 35#include "ltdl.h"
36#endif 36#endif
37*/ 37*/
38 38
39//US do everything through qlibrary 39//US do everything through qlibrary
40#ifndef DESKTOP_VERSION 40#ifndef DESKTOP_VERSION
41#include <qpe/qpeapplication.h> 41#include <qpe/qpeapplication.h>
42#include <qtopia/qlibrary.h> 42#include <qtopia/qlibrary.h>
43#else 43#else
44#include <qlibrary.h> 44#include <qlibrary.h>
45#endif 45#endif
46 46
47 47
48template class QAsciiDict<KLibrary>; 48template class QAsciiDict<KLibrary>;
49 49
50#include <stdlib.h> //getenv 50#include <stdlib.h> //getenv
51 51
52/*US 52/*US
53#if HAVE_DLFCN_H 53#if HAVE_DLFCN_H
54# include <dlfcn.h> 54# include <dlfcn.h>
55#endif 55#endif
56 56
57#ifdef RTLD_GLOBAL 57#ifdef RTLD_GLOBAL
58# define LT_GLOBAL RTLD_GLOBAL 58# define LT_GLOBAL RTLD_GLOBAL
59#else 59#else
60# ifdef DL_GLOBAL 60# ifdef DL_GLOBAL
61# define LT_GLOBAL DL_GLOBAL 61# define LT_GLOBAL DL_GLOBAL
62# endif 62# endif
63#endif 63#endif
64#ifndef LT_GLOBAL 64#ifndef LT_GLOBAL
65# define LT_GLOBAL 0 65# define LT_GLOBAL 0
66#endif 66#endif
67*/ 67*/
68 68
69/*US 69/*US
70extern "C" { 70extern "C" {
71extern int lt_dlopen_flag; 71extern int lt_dlopen_flag;
72} 72}
73*/ 73*/
74 74
75KLibFactory::KLibFactory( QObject* parent, const char* name ) 75KLibFactory::KLibFactory( QObject* parent, const char* name )
76 : QObject( parent, name ) 76 : QObject( parent, name )
77{ 77{
78} 78}
79 79
80KLibFactory::~KLibFactory() 80KLibFactory::~KLibFactory()
81{ 81{
82// kdDebug(150) << "Deleting KLibFactory " << this << endl; 82// kdDebug(150) << "Deleting KLibFactory " << this << endl;
83} 83}
84 84
85QObject* KLibFactory::create( QObject* parent, const char* name, const char* classname, const QStringList &args ) 85QObject* KLibFactory::create( QObject* parent, const char* name, const char* classname, const QStringList &args )
86{ 86{
87 QObject* obj = createObject( parent, name, classname, args ); 87 QObject* obj = createObject( parent, name, classname, args );
88 if ( obj ) 88 if ( obj )
89 emit objectCreated( obj ); 89 emit objectCreated( obj );
90 return obj; 90 return obj;
91} 91}
92 92
93 93
94QObject* KLibFactory::createObject( QObject*, const char*, const char*, const QStringList &) 94QObject* KLibFactory::createObject( QObject*, const char*, const char*, const QStringList &)
95{ 95{
96 return 0; 96 return 0;
97} 97}
98 98
99 99
100// ----------------------------------------------- 100// -----------------------------------------------
101 101
102//US KLibrary::KLibrary( const QString& libname, const QString& filename, void * handle ) 102//US KLibrary::KLibrary( const QString& libname, const QString& filename, void * handle )
103KLibrary::KLibrary( const QString& libname, const QString& filename, QLibrary* handle ) 103KLibrary::KLibrary( const QString& libname, const QString& filename, QLibrary* handle )
104{ 104{
105 /* Make sure, we have a KLibLoader */ 105 /* Make sure, we have a KLibLoader */
106 (void) KLibLoader::self(); 106 (void) KLibLoader::self();
107 m_libname = libname; 107 m_libname = libname;
108 m_filename = filename; 108 m_filename = filename;
109 m_handle = handle; 109 m_handle = handle;
110 m_factory = 0; 110 m_factory = 0;
111 m_timer = 0; 111 m_timer = 0;
112} 112}
113 113
114KLibrary::~KLibrary() 114KLibrary::~KLibrary()
115{ 115{
116// kdDebug(150) << "Deleting KLibrary " << this << " " << m_libname << endl; 116// kdDebug(150) << "Deleting KLibrary " << this << " " << m_libname << endl;
117 if ( m_timer && m_timer->isActive() ) 117 if ( m_timer && m_timer->isActive() )
118 m_timer->stop(); 118 m_timer->stop();
119 119
120 // If any object is remaining, delete 120 // If any object is remaining, delete
121 if ( m_objs.count() > 0 ) 121 if ( m_objs.count() > 0 )
122 { 122 {
123 QPtrListIterator<QObject> it( m_objs ); 123 QPtrListIterator<QObject> it( m_objs );
124 for ( ; it.current() ; ++it ) 124 for ( ; it.current() ; ++it )
125 { 125 {
126 kdDebug(150) << "Factory still has object " << it.current() << " " << it.current()->name () << " Library = " << m_libname << endl; 126 kdDebug(150) << "Factory still has object " << it.current() << " " << it.current()->name () << " Library = " << m_libname << endl;
127 disconnect( it.current(), SIGNAL( destroyed() ), 127 disconnect( it.current(), SIGNAL( destroyed() ),
128 this, SLOT( slotObjectDestroyed() ) ); 128 this, SLOT( slotObjectDestroyed() ) );
129 } 129 }
130 m_objs.setAutoDelete(true); 130 m_objs.setAutoDelete(true);
131 m_objs.clear(); 131 m_objs.clear();
132 } 132 }
133 133
134 if ( m_factory ) { 134 if ( m_factory ) {
135 //kdDebug(150) << " ... deleting the factory " << m_factory << endl; 135 //kdDebug(150) << " ... deleting the factory " << m_factory << endl;
136 delete m_factory; 136 delete m_factory;
137 } 137 }
138} 138}
139 139
140QString KLibrary::name() const 140QString KLibrary::name() const
141{ 141{
142 return m_libname; 142 return m_libname;
143} 143}
144 144
145QString KLibrary::fileName() const 145QString KLibrary::fileName() const
146{ 146{
147 return m_filename; 147 return m_filename;
148} 148}
149 149
150KLibFactory* KLibrary::factory() 150KLibFactory* KLibrary::factory()
151{ 151{
152 if ( m_factory ) 152 if ( m_factory )
153 return m_factory; 153 return m_factory;
154 154
155 QCString symname; 155 QCString symname;
156 symname.sprintf("init_%s", name().latin1() ); 156 symname.sprintf("init_%s", name().latin1() );
157 157
158 void* sym = symbol( symname ); 158 void* sym = symbol( symname );
159 if ( !sym ) 159 if ( !sym )
160 { 160 {
161 qDebug("KLibrary: The library %s does not offer an %s function", name().latin1(), symname.data()); 161 qDebug("KLibrary: The library %s does not offer an %s function", name().latin1(), symname.data());
162#ifndef NDEBUG 162#ifndef NDEBUG
163//US qDebug("KLibrary: errorcode: %s", lt_dlerror()); 163//US qDebug("KLibrary: errorcode: %s", lt_dlerror());
164#endif 164#endif
165 kdWarning(150) << "KLibrary: The library " << name().latin1() << " does not offer an init_" << name().latin1() << " function" << endl; 165 kdWarning(150) << "KLibrary: The library " << name().latin1() << " does not offer an init_" << name().latin1() << " function" << endl;
166 return 0; 166 return 0;
167 } 167 }
168 168
169 typedef KLibFactory* (*t_func)(); 169 typedef KLibFactory* (*t_func)();
170 t_func func = (t_func)sym; 170 t_func func = (t_func)sym;
171 m_factory = func(); 171 m_factory = func();
172 172
173 if( !m_factory ) 173 if( !m_factory )
174 { 174 {
175 kdWarning(150) << "KLibrary: The library " << name() << " does not offer a KDE compatible factory" << endl; 175 kdWarning(150) << "KLibrary: The library " << name() << " does not offer a KDE compatible factory" << endl;
176 return 0; 176 return 0;
177 } 177 }
178 178
179 connect( m_factory, SIGNAL( objectCreated( QObject * ) ), 179 connect( m_factory, SIGNAL( objectCreated( QObject * ) ),
180 this, SLOT( slotObjectCreated( QObject * ) ) ); 180 this, SLOT( slotObjectCreated( QObject * ) ) );
181 181
182 return m_factory; 182 return m_factory;
183} 183}
184 184
185void* KLibrary::symbol( const char* symname ) const 185void* KLibrary::symbol( const char* symname ) const
186{ 186{
187//US void* sym = lt_dlsym( (lt_dlhandle) m_handle, symname ); 187//US void* sym = lt_dlsym( (lt_dlhandle) m_handle, symname );
188 void* sym = m_handle->resolve( symname ); 188 void* sym = m_handle->resolve( symname );
189 if ( !sym ) 189 if ( !sym )
190 { 190 {
191//US kdWarning(150) << "KLibrary: " << lt_dlerror() << endl; 191//US kdWarning(150) << "KLibrary: " << lt_dlerror() << endl;
192 return 0; 192 return 0;
193 } 193 }
194 194
195 return sym; 195 return sym;
196} 196}
197 197
198bool KLibrary::hasSymbol( const char* symname ) const 198bool KLibrary::hasSymbol( const char* symname ) const
199{ 199{
200//US void* sym = lt_dlsym( (lt_dlhandle) m_handle, symname ); 200//US void* sym = lt_dlsym( (lt_dlhandle) m_handle, symname );
201 void* sym = m_handle->resolve( symname ); 201 void* sym = m_handle->resolve( symname );
202 return (sym != 0L ); 202 return (sym != 0L );
203} 203}
204 204
205void KLibrary::unload() const 205void KLibrary::unload() const
206{ 206{
207 if (KLibLoader::s_self) 207 if (KLibLoader::s_self)
208 KLibLoader::s_self->unloadLibrary(QFile::encodeName(name())); 208 KLibLoader::s_self->unloadLibrary(QFile::encodeName(name()));
209} 209}
210 210
211void KLibrary::slotObjectCreated( QObject *obj ) 211void KLibrary::slotObjectCreated( QObject *obj )
212{ 212{
213 if ( !obj ) 213 if ( !obj )
214 return; 214 return;
215 215
216 if ( m_timer && m_timer->isActive() ) 216 if ( m_timer && m_timer->isActive() )
217 m_timer->stop(); 217 m_timer->stop();
218 218
219 if ( m_objs.containsRef( obj ) ) 219 if ( m_objs.containsRef( obj ) )
220 return; // we know this object already 220 return; // we know this object already
221 221
222 connect( obj, SIGNAL( destroyed() ), 222 connect( obj, SIGNAL( destroyed() ),
223 this, SLOT( slotObjectDestroyed() ) ); 223 this, SLOT( slotObjectDestroyed() ) );
224 224
225 m_objs.append( obj ); 225 m_objs.append( obj );
226} 226}
227 227
228void KLibrary::slotObjectDestroyed() 228void KLibrary::slotObjectDestroyed()
229{ 229{
230 m_objs.removeRef( sender() ); 230 m_objs.removeRef( sender() );
231 231
232 if ( m_objs.count() == 0 ) 232 if ( m_objs.count() == 0 )
233 { 233 {
234// kdDebug(150) << "KLibrary: shutdown timer for " << name() << " started!" 234// kdDebug(150) << "KLibrary: shutdown timer for " << name() << " started!"
235// << endl; 235// << endl;
236 236
237 if ( !m_timer ) 237 if ( !m_timer )
238 { 238 {
239 m_timer = new QTimer( this, "klibrary_shutdown_timer" ); 239 m_timer = new QTimer( this, "klibrary_shutdown_timer" );
240 connect( m_timer, SIGNAL( timeout() ), 240 connect( m_timer, SIGNAL( timeout() ),
241 this, SLOT( slotTimeout() ) ); 241 this, SLOT( slotTimeout() ) );
242 } 242 }
243 243
244 // as long as it's not stable make the timeout short, for debugging 244 // as long as it's not stable make the timeout short, for debugging
245 // pleasure (matz) 245 // pleasure (matz)
246 //m_timer->start( 1000*60, true ); 246 //m_timer->start( 1000*60, true );
247 m_timer->start( 1000*10, true ); 247 m_timer->start( 1000*10, true );
248 } 248 }
249} 249}
250 250
251void KLibrary::slotTimeout() 251void KLibrary::slotTimeout()
252{ 252{
253 if ( m_objs.count() != 0 ) 253 if ( m_objs.count() != 0 )
254 return; 254 return;
255 255
256 /* Don't go through KLibLoader::unloadLibrary(), because that uses the 256 /* Don't go through KLibLoader::unloadLibrary(), because that uses the
257 ref counter, but this timeout means to unconditionally close this library 257 ref counter, but this timeout means to unconditionally close this library
258 The destroyed() signal will take care to remove us from all lists. 258 The destroyed() signal will take care to remove us from all lists.
259 */ 259 */
260 delete this; 260 delete this;
261} 261}
262 262
263// ------------------------------------------------- 263// -------------------------------------------------
264 264
265/* This helper class is needed, because KLibraries can go away without 265/* This helper class is needed, because KLibraries can go away without
266 being unloaded. So we need some info about KLibraries even after its 266 being unloaded. So we need some info about KLibraries even after its
267 death. */ 267 death. */
268class KLibWrapPrivate 268class KLibWrapPrivate
269{ 269{
270public: 270public:
271//US KLibWrapPrivate(KLibrary *l, lt_dlhandle h); 271//US KLibWrapPrivate(KLibrary *l, lt_dlhandle h);
272 KLibWrapPrivate(KLibrary *l, QLibrary* h); 272 KLibWrapPrivate(KLibrary *l, QLibrary* h);
273 273
274 KLibrary *lib; 274 KLibrary *lib;
275 enum {UNKNOWN, UNLOAD, DONT_UNLOAD} unload_mode; 275 enum {UNKNOWN, UNLOAD, DONT_UNLOAD} unload_mode;
276 int ref_count; 276 int ref_count;
277//US lt_dlhandle handle; 277//US lt_dlhandle handle;
278 QLibrary *handle; 278 QLibrary *handle;
279 QString name; 279 QString name;
280 QString filename; 280 QString filename;
281}; 281};
282 282
283//US KLibWrapPrivate::KLibWrapPrivate(KLibrary *l, lt_dlhandle h) 283//US KLibWrapPrivate::KLibWrapPrivate(KLibrary *l, lt_dlhandle h)
284KLibWrapPrivate::KLibWrapPrivate(KLibrary *l, QLibrary* h) 284KLibWrapPrivate::KLibWrapPrivate(KLibrary *l, QLibrary* h)
285 : lib(l), ref_count(1), handle(h), name(l->name()), filename(l->fileName()) 285 : lib(l), ref_count(1), handle(h), name(l->name()), filename(l->fileName())
286{ 286{
287 unload_mode = UNKNOWN; 287 unload_mode = UNKNOWN;
288/*US 288/*US
289 if (lt_dlsym(handle, "__kde_do_not_unload") != 0) { 289 if (lt_dlsym(handle, "__kde_do_not_unload") != 0) {
290// kdDebug(150) << "Will not unload " << name << endl; 290// kdDebug(150) << "Will not unload " << name << endl;
291 unload_mode = DONT_UNLOAD; 291 unload_mode = DONT_UNLOAD;
292 } else if (lt_dlsym(handle, "__kde_do_unload") != 0) { 292 } else if (lt_dlsym(handle, "__kde_do_unload") != 0) {
293 unload_mode = UNLOAD; 293 unload_mode = UNLOAD;
294 } 294 }
295*/ 295*/
296//US use instead: 296//US use instead:
297 if (h->resolve("__kde_do_not_unload") != 0) { 297 if (h->resolve("__kde_do_not_unload") != 0) {
298// kdDebug(150) << "Will not unload " << name << endl; 298// kdDebug(150) << "Will not unload " << name << endl;
299 unload_mode = DONT_UNLOAD; 299 unload_mode = DONT_UNLOAD;
300 } else if (h->resolve("__kde_do_unload") != 0) { 300 } else if (h->resolve("__kde_do_unload") != 0) {
301 unload_mode = UNLOAD; 301 unload_mode = UNLOAD;
302 } 302 }
303} 303}
304 304
305class KLibLoaderPrivate 305class KLibLoaderPrivate
306{ 306{
307public: 307public:
308 QPtrList<KLibWrapPrivate> loaded_stack; 308 QPtrList<KLibWrapPrivate> loaded_stack;
309 QPtrList<KLibWrapPrivate> pending_close; 309 QPtrList<KLibWrapPrivate> pending_close;
310 enum {UNKNOWN, UNLOAD, DONT_UNLOAD} unload_mode; 310 enum {UNKNOWN, UNLOAD, DONT_UNLOAD} unload_mode;
311 311
312 QString errorMessage; 312 QString errorMessage;
313}; 313};
314 314
315KLibLoader* KLibLoader::s_self = 0; 315KLibLoader* KLibLoader::s_self = 0;
316 316
317KLibLoader* KLibLoader::self() 317KLibLoader* KLibLoader::self()
318{ 318{
319 if ( !s_self ) 319 if ( !s_self )
320 s_self = new KLibLoader; 320 s_self = new KLibLoader;
321 return s_self; 321 return s_self;
322} 322}
323 323
324void KLibLoader::cleanUp() 324void KLibLoader::cleanUp()
325{ 325{
326 if ( !s_self ) 326 if ( !s_self )
327 return; 327 return;
328 328
329 delete s_self; 329 delete s_self;
330 s_self = 0; 330 s_self = 0;
331} 331}
332 332
333KLibLoader::KLibLoader( QObject* parent, const char* name ) 333KLibLoader::KLibLoader( QObject* parent, const char* name )
334 : QObject( parent, name ) 334 : QObject( parent, name )
335{ 335{
336 s_self = this; 336 s_self = this;
337 d = new KLibLoaderPrivate; 337 d = new KLibLoaderPrivate;
338//US lt_dlinit(); 338//US lt_dlinit();
339 d->unload_mode = KLibLoaderPrivate::UNKNOWN; 339 d->unload_mode = KLibLoaderPrivate::UNKNOWN;
340 if (getenv("KDE_NOUNLOAD") != 0) 340 if (getenv("KDE_NOUNLOAD") != 0)
341 d->unload_mode = KLibLoaderPrivate::DONT_UNLOAD; 341 d->unload_mode = KLibLoaderPrivate::DONT_UNLOAD;
342 else if (getenv("KDE_DOUNLOAD") != 0) 342 else if (getenv("KDE_DOUNLOAD") != 0)
343 d->unload_mode = KLibLoaderPrivate::UNLOAD; 343 d->unload_mode = KLibLoaderPrivate::UNLOAD;
344 d->loaded_stack.setAutoDelete( true ); 344 d->loaded_stack.setAutoDelete( true );
345} 345}
346 346
347KLibLoader::~KLibLoader() 347KLibLoader::~KLibLoader()
348{ 348{
349// kdDebug(150) << "Deleting KLibLoader " << this << " " << name() << endl; 349// kdDebug(150) << "Deleting KLibLoader " << this << " " << name() << endl;
350 350
351 QAsciiDictIterator<KLibWrapPrivate> it( m_libs ); 351 QAsciiDictIterator<KLibWrapPrivate> it( m_libs );
352 for (; it.current(); ++it ) 352 for (; it.current(); ++it )
353 { 353 {
354 kdDebug(150) << "The KLibLoader contains the library " << it.current()->name 354 kdDebug(150) << "The KLibLoader contains the library " << it.current()->name
355 << " (" << it.current()->lib << ")" << endl; 355 << " (" << it.current()->lib << ")" << endl;
356 d->pending_close.append(it.current()); 356 d->pending_close.append(it.current());
357 } 357 }
358 358
359 close_pending(0); 359 close_pending(0);
360 360
361 delete d; 361 delete d;
362} 362}
363 363
364//static 364//static
365QString KLibLoader::findLibrary( const char * name/*US , const KInstance * instance*/ ) 365QString KLibLoader::findLibrary( const char * name/*US , const KInstance * instance*/ )
366{ 366{
367 QCString libname( name ); 367 QCString libname( name );
368 368
369 // only append ".la" if there is no extension 369 // only append ".la" if there is no extension
370 // this allows to load non-libtool libraries as well 370 // this allows to load non-libtool libraries as well
371 // (mhk, 20000228) 371 // (mhk, 20000228)
372 int pos = libname.findRev('/'); 372 int pos = libname.findRev('/');
373 if (pos < 0) 373 if (pos < 0)
374 pos = 0; 374 pos = 0;
375/*US 375/*US
376 if (libname.find('.', pos) < 0) { 376 if (libname.find('.', pos) < 0) {
377 libname += ".la"; 377 libname += ".la";
378 } 378 }
379*/ 379*/
380//US in the microedition we work only with shared libraries. 380//US in the microedition we work only with shared libraries.
381
381 if (libname.find('.', pos) < 0) { 382 if (libname.find('.', pos) < 0) {
383#ifdef _WIN32_
384 libname += ".dll";
385#else
382 libname += ".so"; 386 libname += ".so";
387#endif
383 } 388 }
384 389
385 // only look up the file if it is not an absolute filename 390 // only look up the file if it is not an absolute filename
386 // (mhk, 20000228) 391 // (mhk, 20000228)
387 QString libfile; 392 QString libfile;
388 if (libname[0] == '/') 393 if (libname[0] == '/')
389 libfile = libname; 394 libfile = libname;
390 else 395 else
391 { 396 {
392//US at this point the libname must exist as real filesname. No expansions will be made later 397//US at this point the libname must exist as real filesname. No expansions will be made later
393// in findResources. Because of that we prepend the lib prefix here to the name 398// in findResources. Because of that we prepend the lib prefix here to the name
394//US I add also the "lib" prefix. I do not how could this could have worked before without it? 399//US I add also the "lib" prefix. I do not how could this could have worked before without it?
400#ifndef _WIN32_
395 libname.insert(pos, "lib"); 401 libname.insert(pos, "lib");
402#endif
396 403
397 404
398//US libfile = instance->dirs()->findResource( "module", libname ); 405//US libfile = instance->dirs()->findResource( "module", libname );
399 //qDebug("libname = %s ",libname.data() ); 406 //qDebug("libname = %s ",libname.data() );
400 libfile = KGlobal::dirs()->findResource( "module", libname ); 407 libfile = KGlobal::dirs()->findResource( "module", libname );
401 //qDebug("libfile = %s ",libfile.latin1() ); 408 //qDebug("libfile = %s ",libfile.latin1() );
402 409
403 if ( libfile.isEmpty() ) 410 if ( libfile.isEmpty() )
404 { 411 {
405//US libfile = instance->dirs()->findResource( "lib", libname ); 412//US libfile = instance->dirs()->findResource( "lib", libname );
406 libfile = KGlobal::dirs()->findResource( "lib", libname ); 413 libfile = KGlobal::dirs()->findResource( "lib", libname );
407 //qDebug("libfile2 = %s ",libfile.latin1() ); 414 //qDebug("libfile2 = %s ",libfile.latin1() );
408#ifndef NDEBUG 415#ifndef NDEBUG
409 if ( !libfile.isEmpty() && libname.left(3) == "lib" ) // don't warn for kdeinit modules 416 if ( !libfile.isEmpty() && libname.left(3) == "lib" ) // don't warn for kdeinit modules
410 kdDebug(150) << "library " << libname << " not found under 'module' but under 'lib'" << endl; 417 kdDebug(150) << "library " << libname << " not found under 'module' but under 'lib'" << endl;
411#endif 418#endif
412 } 419 }
413 if ( libfile.isEmpty() ) 420 if ( libfile.isEmpty() )
414 { 421 {
415#ifndef NDEBUG 422#ifndef NDEBUG
416 kdDebug(150) << "library=" << libname << ": No file names " << libname.data() << " found in paths." << endl; 423 kdDebug(150) << "library=" << libname << ": No file names " << libname.data() << " found in paths." << endl;
417 self()->d->errorMessage = i18n("Library files for \"%1\" not found in paths").arg(libname); 424 self()->d->errorMessage = i18n("Library files for \"%1\" not found in paths").arg(libname);
418 425
419 qDebug("KLibLoader::library could not find library: %s", libname.data()); 426 qDebug("KLibLoader::library could not find library: %s", libname.data());
420#endif 427#endif
421 428
422 } 429 }
423 else 430 else
424 self()->d->errorMessage = QString::null; 431 self()->d->errorMessage = QString::null;
425 } 432 }
426 433
427 //qDebug("return libfile = %s ",libfile.latin1() ); 434 //qDebug("return libfile = %s ",libfile.latin1() );
428 return libfile; 435 return libfile;
429} 436}
430 437
431 438
432KLibrary* KLibLoader::globalLibrary( const char *name ) 439KLibrary* KLibLoader::globalLibrary( const char *name )
433{ 440{
434KLibrary *tmp; 441KLibrary *tmp;
435/*US 442/*US
436int olt_dlopen_flag = lt_dlopen_flag; 443int olt_dlopen_flag = lt_dlopen_flag;
437 444
438 lt_dlopen_flag |= LT_GLOBAL; 445 lt_dlopen_flag |= LT_GLOBAL;
439 kdDebug(150) << "Loading the next library global with flag " 446 kdDebug(150) << "Loading the next library global with flag "
440 << lt_dlopen_flag 447 << lt_dlopen_flag
441 << "." << endl; 448 << "." << endl;
442*/ 449*/
443 tmp = library(name); 450 tmp = library(name);
444/*US 451/*US
445 lt_dlopen_flag = olt_dlopen_flag; 452 lt_dlopen_flag = olt_dlopen_flag;
446*/ 453*/
447return tmp; 454return tmp;
448} 455}
449 456
450 457
451KLibrary* KLibLoader::library( const char *name ) 458KLibrary* KLibLoader::library( const char *name )
452{ 459{
453 if (!name) 460 if (!name)
454 return 0; 461 return 0;
455 462
456 KLibWrapPrivate* wrap = m_libs[name]; 463 KLibWrapPrivate* wrap = m_libs[name];
457 if (wrap) { 464 if (wrap) {
458 /* Nothing to do to load the library. */ 465 /* Nothing to do to load the library. */
459 wrap->ref_count++; 466 wrap->ref_count++;
460 return wrap->lib; 467 return wrap->lib;
461 } 468 }
462 469
463 /* Test if this library was loaded at some time, but got 470 /* Test if this library was loaded at some time, but got
464 unloaded meanwhile, whithout being dlclose()'ed. */ 471 unloaded meanwhile, whithout being dlclose()'ed. */
465 QPtrListIterator<KLibWrapPrivate> it(d->loaded_stack); 472 QPtrListIterator<KLibWrapPrivate> it(d->loaded_stack);
466 for (; it.current(); ++it) { 473 for (; it.current(); ++it) {
467 if (it.current()->name == name) 474 if (it.current()->name == name)
468 wrap = it.current(); 475 wrap = it.current();
469 } 476 }
470 477
471 if (wrap) { 478 if (wrap) {
472 d->pending_close.removeRef(wrap); 479 d->pending_close.removeRef(wrap);
473 if (!wrap->lib) { 480 if (!wrap->lib) {
474 /* This lib only was in loaded_stack, but not in m_libs. */ 481 /* This lib only was in loaded_stack, but not in m_libs. */
475 wrap->lib = new KLibrary( name, wrap->filename, wrap->handle ); 482 wrap->lib = new KLibrary( name, wrap->filename, wrap->handle );
476 } 483 }
477 wrap->ref_count++; 484 wrap->ref_count++;
478 } else { 485 } else {
479 QString libfile = findLibrary( name ); 486 QString libfile = findLibrary( name );
480 if ( libfile.isEmpty() ) 487 if ( libfile.isEmpty() )
481 return 0; 488 return 0;
482#ifdef DESKTOP_VERSION 489#ifdef DESKTOP_VERSION
483 QLibrary *qlib = new QLibrary( libfile.latin1() ); 490 QLibrary *qlib = new QLibrary( libfile.latin1() );
484#else 491#else
485 QLibrary *qlib = new QLibrary( libfile.latin1(), QLibrary::Immediately ); 492 QLibrary *qlib = new QLibrary( libfile.latin1(), QLibrary::Immediately );
486#endif 493#endif
487 494
488//US lt_dlhandle handle = lt_dlopen( libfile.latin1() ); 495//US lt_dlhandle handle = lt_dlopen( libfile.latin1() );
489//US if ( !handle ) 496//US if ( !handle )
490 if ( !qlib ) 497 if ( !qlib )
491 { 498 {
492//US const char* errmsg = lt_dlerror(); 499//US const char* errmsg = lt_dlerror();
493 char* errmsg; 500 char* errmsg;
494 sprintf(errmsg, "KLibLoader::library could not load library: %s", libfile.latin1()); 501 sprintf(errmsg, "KLibLoader::library could not load library: %s", libfile.latin1());
495 qDebug(errmsg); 502 qDebug(errmsg);
496 503
497 if(errmsg) 504 if(errmsg)
498 d->errorMessage = QString::fromLatin1(errmsg); 505 d->errorMessage = QString::fromLatin1(errmsg);
499 else 506 else
500 d->errorMessage = QString::null; 507 d->errorMessage = QString::null;
501 kdWarning(150) << "library=" << name << ": file=" << libfile << ": " << d->errorMessage << endl; 508 kdWarning(150) << "library=" << name << ": file=" << libfile << ": " << d->errorMessage << endl;
502 return 0; 509 return 0;
503 } 510 }
504 else 511 else
505 d->errorMessage = QString::null; 512 d->errorMessage = QString::null;
506 513
507 KLibrary *lib = new KLibrary( name, libfile, qlib ); 514 KLibrary *lib = new KLibrary( name, libfile, qlib );
508 wrap = new KLibWrapPrivate(lib, qlib); 515 wrap = new KLibWrapPrivate(lib, qlib);
509 d->loaded_stack.prepend(wrap); 516 d->loaded_stack.prepend(wrap);
510 } 517 }
511 m_libs.insert( name, wrap ); 518 m_libs.insert( name, wrap );
512 519
513 connect( wrap->lib, SIGNAL( destroyed() ), 520 connect( wrap->lib, SIGNAL( destroyed() ),
514 this, SLOT( slotLibraryDestroyed() ) ); 521 this, SLOT( slotLibraryDestroyed() ) );
515 522
516 return wrap->lib; 523 return wrap->lib;
517} 524}
518 525
519QString KLibLoader::lastErrorMessage() const 526QString KLibLoader::lastErrorMessage() const
520{ 527{
521 return d->errorMessage; 528 return d->errorMessage;
522} 529}
523 530
524void KLibLoader::unloadLibrary( const char *libname ) 531void KLibLoader::unloadLibrary( const char *libname )
525{ 532{
526 KLibWrapPrivate *wrap = m_libs[ libname ]; 533 KLibWrapPrivate *wrap = m_libs[ libname ];
527 if (!wrap) 534 if (!wrap)
528 return; 535 return;
529 if (--wrap->ref_count) 536 if (--wrap->ref_count)
530 return; 537 return;
531 538
532// kdDebug(150) << "closing library " << libname << endl; 539// kdDebug(150) << "closing library " << libname << endl;
533 540
534 m_libs.remove( libname ); 541 m_libs.remove( libname );
535 542
536 disconnect( wrap->lib, SIGNAL( destroyed() ), 543 disconnect( wrap->lib, SIGNAL( destroyed() ),
537 this, SLOT( slotLibraryDestroyed() ) ); 544 this, SLOT( slotLibraryDestroyed() ) );
538 close_pending( wrap ); 545 close_pending( wrap );
539} 546}
540 547
541KLibFactory* KLibLoader::factory( const char* name ) 548KLibFactory* KLibLoader::factory( const char* name )
542{ 549{
543 KLibrary* lib = library( name ); 550 KLibrary* lib = library( name );
544 if ( !lib ) 551 if ( !lib )
545 return 0; 552 return 0;
546 553
547 return lib->factory(); 554 return lib->factory();
548} 555}
549 556
550void KLibLoader::slotLibraryDestroyed() 557void KLibLoader::slotLibraryDestroyed()
551{ 558{
552 const KLibrary *lib = static_cast<const KLibrary *>( sender() ); 559 const KLibrary *lib = static_cast<const KLibrary *>( sender() );
553 560
554 QAsciiDictIterator<KLibWrapPrivate> it( m_libs ); 561 QAsciiDictIterator<KLibWrapPrivate> it( m_libs );
555 for (; it.current(); ++it ) 562 for (; it.current(); ++it )
556 if ( it.current()->lib == lib ) 563 if ( it.current()->lib == lib )
557 { 564 {
558 KLibWrapPrivate *wrap = it.current(); 565 KLibWrapPrivate *wrap = it.current();
559 wrap->lib = 0; /* the KLibrary object is already away */ 566 wrap->lib = 0; /* the KLibrary object is already away */
560 m_libs.remove( it.currentKey() ); 567 m_libs.remove( it.currentKey() );
561 close_pending( wrap ); 568 close_pending( wrap );
562 return; 569 return;
563 } 570 }
564} 571}
565 572
566void KLibLoader::close_pending(KLibWrapPrivate *wrap) 573void KLibLoader::close_pending(KLibWrapPrivate *wrap)
567{ 574{
568 if (wrap && !d->pending_close.containsRef( wrap )) 575 if (wrap && !d->pending_close.containsRef( wrap ))
569 d->pending_close.append( wrap ); 576 d->pending_close.append( wrap );
570 577
571 /* First delete all KLibrary objects in pending_close, but _don't_ unload 578 /* First delete all KLibrary objects in pending_close, but _don't_ unload
572 the DSO behind it. */ 579 the DSO behind it. */
573 QPtrListIterator<KLibWrapPrivate> it(d->pending_close); 580 QPtrListIterator<KLibWrapPrivate> it(d->pending_close);
574 for (; it.current(); ++it) { 581 for (; it.current(); ++it) {
575 wrap = it.current(); 582 wrap = it.current();
576 if (wrap->lib) { 583 if (wrap->lib) {
577 disconnect( wrap->lib, SIGNAL( destroyed() ), 584 disconnect( wrap->lib, SIGNAL( destroyed() ),
578 this, SLOT( slotLibraryDestroyed() ) ); 585 this, SLOT( slotLibraryDestroyed() ) );
579 delete wrap->lib; 586 delete wrap->lib;
580 wrap->lib = 0; 587 wrap->lib = 0;
581 } 588 }
582 } 589 }
583 590
584 if (d->unload_mode == KLibLoaderPrivate::DONT_UNLOAD) return; 591 if (d->unload_mode == KLibLoaderPrivate::DONT_UNLOAD) return;
585 592
586 bool deleted_one = false; 593 bool deleted_one = false;
587 while ((wrap = d->loaded_stack.first())) { 594 while ((wrap = d->loaded_stack.first())) {
588 /* Let's first see, if we want to try to unload this lib. 595 /* Let's first see, if we want to try to unload this lib.
589 If the env. var KDE_DOUNLOAD is set, we try to unload every lib. 596 If the env. var KDE_DOUNLOAD is set, we try to unload every lib.
590 If not, we look at the lib itself, and unload it only, if it exports 597 If not, we look at the lib itself, and unload it only, if it exports
591 the symbol __kde_do_unload. */ 598 the symbol __kde_do_unload. */
592 if (d->unload_mode != KLibLoaderPrivate::UNLOAD 599 if (d->unload_mode != KLibLoaderPrivate::UNLOAD
593 && wrap->unload_mode != KLibWrapPrivate::UNLOAD) 600 && wrap->unload_mode != KLibWrapPrivate::UNLOAD)
594 break; 601 break;
595 602
596 /* Now ensure, that the libs are only unloaded in the reverse direction 603 /* Now ensure, that the libs are only unloaded in the reverse direction
597 they were loaded. */ 604 they were loaded. */
598 if (!d->pending_close.containsRef( wrap )) { 605 if (!d->pending_close.containsRef( wrap )) {
599 if (!deleted_one) 606 if (!deleted_one)
600 /* Only diagnose, if we really haven't deleted anything. */ 607 /* Only diagnose, if we really haven't deleted anything. */
601// kdDebug(150) << "try to dlclose " << wrap->name << ": not yet" << endl; 608// kdDebug(150) << "try to dlclose " << wrap->name << ": not yet" << endl;
602 break; 609 break;
603 } 610 }
604 611
605// kdDebug(150) << "try to dlclose " << wrap->name << ": yes, done." << endl; 612// kdDebug(150) << "try to dlclose " << wrap->name << ": yes, done." << endl;
606 613
607#if 0 614#if 0
608#ifndef Q_WS_QWS 615#ifndef Q_WS_QWS
609 if ( !deleted_one ) { 616 if ( !deleted_one ) {
610 /* Only do the hack once in this loop. 617 /* Only do the hack once in this loop.
611 WABA: *HACK* 618 WABA: *HACK*
612 We need to make sure to clear the clipboard before unloading a DSO 619 We need to make sure to clear the clipboard before unloading a DSO
613 because the DSO could have defined an object derived from QMimeSource 620 because the DSO could have defined an object derived from QMimeSource
614 and placed that on the clipboard. */ 621 and placed that on the clipboard. */
615 /*kapp->clipboard()->clear();*/ 622 /*kapp->clipboard()->clear();*/
616 623
617 /* Well.. let's do something more subtle... convert the clipboard context 624 /* Well.. let's do something more subtle... convert the clipboard context
618 to text. That should be safe as it only uses objects defined by Qt. */ 625 to text. That should be safe as it only uses objects defined by Qt. */
619 626
620 QWidgetList *widgetlist = QApplication::topLevelWidgets(); 627 QWidgetList *widgetlist = QApplication::topLevelWidgets();
621 QWidget *co = widgetlist->first(); 628 QWidget *co = widgetlist->first();
622 while (co) { 629 while (co) {
623 if (qstrcmp(co->name(), "internal clipboard owner") == 0) { 630 if (qstrcmp(co->name(), "internal clipboard owner") == 0) {
624 if (XGetSelectionOwner(co->x11Display(), XA_PRIMARY) == co->winId()) 631 if (XGetSelectionOwner(co->x11Display(), XA_PRIMARY) == co->winId())
625 kapp->clipboard()->setText(kapp->clipboard()->text()); 632 kapp->clipboard()->setText(kapp->clipboard()->text());
626 633
627 break; 634 break;
628 } 635 }
629 co = widgetlist->next(); 636 co = widgetlist->next();
630 } 637 }
631 delete widgetlist; 638 delete widgetlist;
632 } 639 }
633#else 640#else
634 // FIXME(E): Implement in Qt Embedded 641 // FIXME(E): Implement in Qt Embedded
635#endif 642#endif
636 643
637#endif // 0 644#endif // 0
638 deleted_one = true; 645 deleted_one = true;
639//US lt_dlclose(wrap->handle); 646//US lt_dlclose(wrap->handle);
640 wrap->handle->unload(); 647 wrap->handle->unload();
641 648
642 d->pending_close.removeRef(wrap); 649 d->pending_close.removeRef(wrap);
643 /* loaded_stack is AutoDelete, so wrap is freed */ 650 /* loaded_stack is AutoDelete, so wrap is freed */
644 d->loaded_stack.remove(); 651 d->loaded_stack.remove();
645 } 652 }
646} 653}
647 654
648void KLibLoader::virtual_hook( int, void* ) 655void KLibLoader::virtual_hook( int, void* )
649{ /*BASE::virtual_hook( id, data );*/ } 656{ /*BASE::virtual_hook( id, data );*/ }
650 657
651void KLibFactory::virtual_hook( int, void* ) 658void KLibFactory::virtual_hook( int, void* )
652{ /*BASE::virtual_hook( id, data );*/ } 659{ /*BASE::virtual_hook( id, data );*/ }
653 660
654//US #include "klibloader.moc" 661//US #include "klibloader.moc"