author | zautrix <zautrix> | 2004-07-08 00:16:46 (UTC) |
---|---|---|
committer | zautrix <zautrix> | 2004-07-08 00:16:46 (UTC) |
commit | e8628e6e3e98f2276fb69bbc545866cc9a022228 (patch) (unidiff) | |
tree | 798f61100c1ec3dab71a00ba63ac0d99fbd643b1 | |
parent | 5030b0bd32b1e526f28ce0339d4b4854492393ae (diff) | |
download | kdepimpi-e8628e6e3e98f2276fb69bbc545866cc9a022228.zip kdepimpi-e8628e6e3e98f2276fb69bbc545866cc9a022228.tar.gz kdepimpi-e8628e6e3e98f2276fb69bbc545866cc9a022228.tar.bz2 |
Compile fixes for windows
-rw-r--r-- | bin/kdepim/kaddressbook/icons22/ka24.png | bin | 0 -> 1435 bytes | |||
-rw-r--r-- | kabc/plugins/dir/dir.pro | 5 | ||||
-rw-r--r-- | kabc/plugins/dir/resourcedir.cpp | 11 | ||||
-rw-r--r-- | kabc/plugins/file/file.pro | 5 | ||||
-rw-r--r-- | kabc/plugins/file/resourcefile.cpp | 10 | ||||
-rw-r--r-- | kaddressbook/mainembedded.cpp | 1 | ||||
-rw-r--r-- | kaddressbook/views/contactlistview.cpp | 6 | ||||
-rw-r--r-- | microkde/kdecore/klibloader.cpp | 7 |
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 |
2 | CONFIG += qt warn_on release | 2 | CONFIG += qt warn_on release |
3 | #release debug | 3 | #release debug |
4 | 4 | ||
5 | TARGET = microkabc_dir | 5 | TARGET = microkabc_dir |
6 | INCLUDEPATH += ../.. ../../../microkde ../../../microkde/kdecore ../../../microkde/kio/kfile ../../../qtcompat | 6 | INCLUDEPATH += ../.. ../../../microkde ../../../microkde/kdecore ../../../microkde/kio/kfile ../../../qtcompat |
7 | DESTDIR = ../../../bin | 7 | DESTDIR = ../../../bin |
8 | #LIBS += -lmicrokde -lmicrokabc | 8 | #LIBS += -lmicrokde -lmicrokabc |
9 | #LIBS += -L$(QPEDIR)/lib | 9 | #LIBS += -L$(QPEDIR)/lib |
10 | 10 | ||
11 | INTERFACES = \ | 11 | INTERFACES = \ |
12 | 12 | ||
13 | HEADERS = \ | 13 | HEADERS = \ |
14 | resourcedir.h \ | 14 | resourcedir.h \ |
15 | resourcedirconfig.h | 15 | resourcedirconfig.h |
16 | 16 | ||
17 | SOURCES = \ | 17 | SOURCES = \ |
18 | resourcedir.cpp \ | 18 | resourcedir.cpp \ |
19 | resourcedirconfig.cpp | 19 | resourcedirconfig.cpp |
20 | 20 | ||
21 | unix : { | 21 | unix : { |
22 | OBJECTS_DIR = obj/unix | 22 | OBJECTS_DIR = obj/unix |
23 | MOC_DIR = moc/unix | 23 | MOC_DIR = moc/unix |
24 | } | 24 | } |
25 | win32: { | 25 | win32: { |
26 | CONFIG += dll | ||
26 | DEFINES += _WIN32_ | 27 | DEFINES += _WIN32_ |
27 | OBJECTS_DIR = obj/win | 28 | OBJECTS_DIR = obj/win |
28 | MOC_DIR = moc/win | 29 | MOC_DIR = moc/win |
30 | LIBS += ../../../bin/microkdepim.lib | ||
31 | LIBS += ../../../bin/microkcal.lib | ||
32 | LIBS += ../../../bin/microkde.lib | ||
33 | LIBS += ../../../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,317 +1,324 @@ | |||
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 | /* |
22 | Enhanced Version of the file for platform independent KDE tools. | 22 | Enhanced Version of the file for platform independent KDE tools. |
23 | Copyright (c) 2004 Ulf Schenk | 23 | Copyright (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 | ||
62 | using namespace KABC; | 62 | using namespace KABC; |
63 | 63 | ||
64 | extern "C" | 64 | extern "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 | ||
74 | ResourceDir::ResourceDir( const KConfig *config ) | 80 | ResourceDir::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 | ||
118 | ResourceDir::~ResourceDir() | 124 | ResourceDir::~ResourceDir() |
119 | { | 125 | { |
120 | delete mFormat; | 126 | delete mFormat; |
121 | mFormat = 0; | 127 | mFormat = 0; |
122 | } | 128 | } |
123 | 129 | ||
124 | void ResourceDir::writeConfig( KConfig *config ) | 130 | void 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 | ||
132 | Ticket *ResourceDir::requestSaveTicket() | 139 | Ticket *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 | ||
147 | bool ResourceDir::doOpen() | 154 | bool 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 | ||
170 | void ResourceDir::doClose() | 177 | void ResourceDir::doClose() |
171 | { | 178 | { |
172 | } | 179 | } |
173 | 180 | ||
174 | bool ResourceDir::load() | 181 | bool 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 | ||
201 | bool ResourceDir::save( Ticket *ticket ) | 208 | bool 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 | ||
232 | bool ResourceDir::lock( const QString &path ) | 239 | bool 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 | ||
278 | void ResourceDir::unlock( const QString &path ) | 285 | void 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 | ||
292 | void ResourceDir::setPath( const QString &path ) | 299 | void 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 | ||
310 | QString ResourceDir::path() const | 317 | QString ResourceDir::path() const |
311 | { | 318 | { |
312 | return mPath; | 319 | return mPath; |
313 | } | 320 | } |
314 | 321 | ||
315 | void ResourceDir::setFormat( const QString &format ) | 322 | void ResourceDir::setFormat( const QString &format ) |
316 | { | 323 | { |
317 | mFormatName = format; | 324 | mFormatName = format; |
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 |
2 | CONFIG += qt warn_on release | 2 | CONFIG += qt warn_on release |
3 | #release debug | 3 | #release debug |
4 | 4 | ||
5 | TARGET = microkabc_file | 5 | TARGET = microkabc_file |
6 | INCLUDEPATH += ../.. ../../../microkde ../../../microkde/kdecore ../../../microkde/kio/kfile ../../../qtcompat | 6 | INCLUDEPATH += ../.. ../../../microkde ../../../microkde/kdecore ../../../microkde/kio/kfile ../../../qtcompat |
7 | 7 | ||
8 | DESTDIR = ../../../bin | 8 | DESTDIR = ../../../bin |
9 | #LIBS += -lmicrokde -lmicrokabc | 9 | #LIBS += -lmicrokde -lmicrokabc |
10 | #LIBS += -L$(QPEDIR)/lib | 10 | #LIBS += -L$(QPEDIR)/lib |
11 | 11 | ||
12 | INTERFACES = \ | 12 | INTERFACES = \ |
13 | 13 | ||
14 | HEADERS = \ | 14 | HEADERS = \ |
15 | resourcefile.h \ | 15 | resourcefile.h \ |
16 | resourcefileconfig.h | 16 | resourcefileconfig.h |
17 | 17 | ||
18 | SOURCES = \ | 18 | SOURCES = \ |
19 | resourcefile.cpp \ | 19 | resourcefile.cpp \ |
20 | resourcefileconfig.cpp | 20 | resourcefileconfig.cpp |
21 | 21 | ||
22 | unix : { | 22 | unix : { |
23 | OBJECTS_DIR = obj/unix | 23 | OBJECTS_DIR = obj/unix |
24 | MOC_DIR = moc/unix | 24 | MOC_DIR = moc/unix |
25 | } | 25 | } |
26 | win32: { | 26 | win32: { |
27 | CONFIG += dll | ||
27 | DEFINES += _WIN32_ | 28 | DEFINES += _WIN32_ |
28 | OBJECTS_DIR = obj/win | 29 | OBJECTS_DIR = obj/win |
29 | MOC_DIR = moc/win | 30 | MOC_DIR = moc/win |
31 | LIBS += ../../../bin/microkdepim.lib | ||
32 | LIBS += ../../../bin/microkcal.lib | ||
33 | LIBS += ../../../bin/microkde.lib | ||
34 | LIBS += ../../../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,331 +1,339 @@ | |||
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 | /* |
22 | Enhanced Version of the file for platform independent KDE tools. | 22 | Enhanced Version of the file for platform independent KDE tools. |
23 | Copyright (c) 2004 Ulf Schenk | 23 | Copyright (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 | ||
58 | using namespace KABC; | 58 | using namespace KABC; |
59 | 59 | ||
60 | extern "C" | 60 | extern "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 | ||
70 | ResourceFile::ResourceFile( const KConfig *config ) | 76 | ResourceFile::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 | ||
89 | ResourceFile::ResourceFile( const QString &fileName, | 95 | ResourceFile::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 | ||
97 | void ResourceFile::init( const QString &fileName, const QString &formatName ) | 103 | void 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 | ||
132 | ResourceFile::~ResourceFile() | 138 | ResourceFile::~ResourceFile() |
133 | { | 139 | { |
134 | delete mFormat; | 140 | delete mFormat; |
135 | mFormat = 0; | 141 | mFormat = 0; |
136 | } | 142 | } |
137 | 143 | ||
138 | void ResourceFile::writeConfig( KConfig *config ) | 144 | void 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 | ||
149 | Ticket *ResourceFile::requestSaveTicket() | 157 | Ticket *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 | ||
164 | bool ResourceFile::doOpen() | 172 | bool 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 | ||
191 | void ResourceFile::doClose() | 199 | void ResourceFile::doClose() |
192 | { | 200 | { |
193 | } | 201 | } |
194 | 202 | ||
195 | bool ResourceFile::load() | 203 | bool 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 | ||
210 | bool ResourceFile::save( Ticket *ticket ) | 218 | bool 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 | ||
258 | bool ResourceFile::lock( const QString &fileName ) | 266 | bool 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 | ||
304 | void ResourceFile::unlock( const QString &fileName ) | 312 | void 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 | ||
319 | void ResourceFile::setFileName( const QString &fileName ) | 327 | void 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 | */ |
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 | ||
17 | int main( int argc, char **argv ) | 17 | int 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 | ||
88 | extern "C" { | 89 | extern "C" { |
89 | 90 | ||
90 | void crashHandler( int ) | 91 | void 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 | ||
98 | class KAddressBookApp : public KUniqueApplication { | 99 | class 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 | ||
109 | int KAddressBookApp::newInstance() | 110 | int 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. |
163 | static KCmdLineOptions kmoptions[] = | 164 | static 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 | ||
174 | int main( int argc, char *argv[] ) | 175 | int 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 | |||
@@ -49,292 +49,292 @@ DynamicTip::DynamicTip( ContactListView *parent) | |||
49 | : QToolTip( parent ) | 49 | : QToolTip( parent ) |
50 | { | 50 | { |
51 | } | 51 | } |
52 | 52 | ||
53 | void DynamicTip::maybeTip( const QPoint &pos ) | 53 | void 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 | ||
159 | ContactListViewItem::ContactListViewItem(const KABC::Addressee &a, | 159 | ContactListViewItem::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 | ||
169 | QString ContactListViewItem::key(int column, bool ascending) const | 169 | QString 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 | ||
174 | void ContactListViewItem::paintCell(QPainter * p, | 174 | void 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 | ||
192 | ContactListView *ContactListViewItem::parent() | 192 | ContactListView *ContactListViewItem::parent() |
193 | { | 193 | { |
194 | return parentListView; | 194 | return parentListView; |
195 | } | 195 | } |
196 | 196 | ||
197 | 197 | ||
198 | void ContactListViewItem::refresh() | 198 | void 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 | ||
215 | ContactListView::ContactListView(KAddressBookTableView *view, | 215 | ContactListView::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 | ||
253 | void ContactListView::paintEmptyArea( QPainter * p, const QRect & rect ) | 253 | void 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 | ||
273 | void ContactListView::contentsMousePressEvent(QMouseEvent* e) | 273 | void 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 |
281 | void ContactListView::contentsMouseMoveEvent( QMouseEvent *e ) | 281 | void 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 | ||
290 | bool ContactListView::acceptDrag(QDropEvent *e) const | 290 | bool 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 |
295 | qDebug("ContactListView::acceptDrag has to be fixed"); | 295 | qDebug("ContactListView::acceptDrag has to be fixed"); |
296 | return false; | 296 | return false; |
297 | #endif //KAB_EMBEDDED | 297 | #endif //KAB_EMBEDDED |
298 | } | 298 | } |
299 | 299 | ||
300 | void ContactListView::itemDropped(QDropEvent *e) | 300 | void ContactListView::itemDropped(QDropEvent *e) |
301 | { | 301 | { |
302 | contentsDropEvent(e); | 302 | contentsDropEvent(e); |
303 | } | 303 | } |
304 | 304 | ||
305 | void ContactListView::contentsDropEvent( QDropEvent *e ) | 305 | void ContactListView::contentsDropEvent( QDropEvent *e ) |
306 | { | 306 | { |
307 | emit addresseeDropped(e); | 307 | emit addresseeDropped(e); |
308 | } | 308 | } |
309 | 309 | ||
310 | void ContactListView::setAlternateBackgroundEnabled(bool enabled) | 310 | void 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 | ||
324 | void ContactListView::setBackgroundPixmap(const QString &filename) | 324 | void 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 | |||
@@ -189,399 +189,406 @@ void* KLibrary::symbol( const char* symname ) const | |||
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 | ||
198 | bool KLibrary::hasSymbol( const char* symname ) const | 198 | bool 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 | ||
205 | void KLibrary::unload() const | 205 | void 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 | ||
211 | void KLibrary::slotObjectCreated( QObject *obj ) | 211 | void 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 | ||
228 | void KLibrary::slotObjectDestroyed() | 228 | void 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 | ||
251 | void KLibrary::slotTimeout() | 251 | void 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. */ |
268 | class KLibWrapPrivate | 268 | class KLibWrapPrivate |
269 | { | 269 | { |
270 | public: | 270 | public: |
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) |
284 | KLibWrapPrivate::KLibWrapPrivate(KLibrary *l, QLibrary* h) | 284 | KLibWrapPrivate::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 | ||
305 | class KLibLoaderPrivate | 305 | class KLibLoaderPrivate |
306 | { | 306 | { |
307 | public: | 307 | public: |
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 | ||
315 | KLibLoader* KLibLoader::s_self = 0; | 315 | KLibLoader* KLibLoader::s_self = 0; |
316 | 316 | ||
317 | KLibLoader* KLibLoader::self() | 317 | KLibLoader* 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 | ||
324 | void KLibLoader::cleanUp() | 324 | void 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 | ||
333 | KLibLoader::KLibLoader( QObject* parent, const char* name ) | 333 | KLibLoader::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 | ||
347 | KLibLoader::~KLibLoader() | 347 | KLibLoader::~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 |
365 | QString KLibLoader::findLibrary( const char * name/*US , const KInstance * instance*/ ) | 365 | QString 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 | ||
432 | KLibrary* KLibLoader::globalLibrary( const char *name ) | 439 | KLibrary* KLibLoader::globalLibrary( const char *name ) |
433 | { | 440 | { |
434 | KLibrary *tmp; | 441 | KLibrary *tmp; |
435 | /*US | 442 | /*US |
436 | int olt_dlopen_flag = lt_dlopen_flag; | 443 | int 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 | */ |
447 | return tmp; | 454 | return tmp; |
448 | } | 455 | } |
449 | 456 | ||
450 | 457 | ||
451 | KLibrary* KLibLoader::library( const char *name ) | 458 | KLibrary* 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 | ||
519 | QString KLibLoader::lastErrorMessage() const | 526 | QString KLibLoader::lastErrorMessage() const |
520 | { | 527 | { |
521 | return d->errorMessage; | 528 | return d->errorMessage; |
522 | } | 529 | } |
523 | 530 | ||
524 | void KLibLoader::unloadLibrary( const char *libname ) | 531 | void 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 | ||
541 | KLibFactory* KLibLoader::factory( const char* name ) | 548 | KLibFactory* 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 | ||
550 | void KLibLoader::slotLibraryDestroyed() | 557 | void 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 | ||
566 | void KLibLoader::close_pending(KLibWrapPrivate *wrap) | 573 | void 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())) { |