summaryrefslogtreecommitdiffabout
path: root/microkde
authorzautrix <zautrix>2005-01-18 12:06:27 (UTC)
committer zautrix <zautrix>2005-01-18 12:06:27 (UTC)
commit4b82a36d1b2479dd2e6f00aef45af848f6793099 (patch) (unidiff)
tree21e5077956085c33f57c4cb54c2b25d5d9a4dc20 /microkde
parentfbc1ca53388337b66017973896725d51416aae1a (diff)
downloadkdepimpi-4b82a36d1b2479dd2e6f00aef45af848f6793099.zip
kdepimpi-4b82a36d1b2479dd2e6f00aef45af848f6793099.tar.gz
kdepimpi-4b82a36d1b2479dd2e6f00aef45af848f6793099.tar.bz2
data dir
Diffstat (limited to 'microkde') (more/less context) (ignore whitespace changes)
-rw-r--r--microkde/kdecore/kstandarddirs.cpp4
-rw-r--r--microkde/kdecore/kstandarddirs.h2
2 files changed, 4 insertions, 2 deletions
diff --git a/microkde/kdecore/kstandarddirs.cpp b/microkde/kdecore/kstandarddirs.cpp
index 4c03c15..f3584d7 100644
--- a/microkde/kdecore/kstandarddirs.cpp
+++ b/microkde/kdecore/kstandarddirs.cpp
@@ -1,1662 +1,1664 @@
1/* This file is part of the KDE libraries 1/* This file is part of the KDE libraries
2 Copyright (C) 1999 Sirtaj Singh Kang <taj@kde.org> 2 Copyright (C) 1999 Sirtaj Singh Kang <taj@kde.org>
3 Copyright (C) 1999 Stephan Kulow <coolo@kde.org> 3 Copyright (C) 1999 Stephan Kulow <coolo@kde.org>
4 Copyright (C) 1999 Waldo Bastian <bastian@kde.org> 4 Copyright (C) 1999 Waldo Bastian <bastian@kde.org>
5 5
6 This library is free software; you can redistribute it and/or 6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public 7 modify it under the terms of the GNU Library General Public
8 License version 2 as published by the Free Software Foundation. 8 License version 2 as published by the Free Software Foundation.
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 * Author: Stephan Kulow <coolo@kde.org> and Sirtaj Singh Kang <taj@kde.org> 22 * Author: Stephan Kulow <coolo@kde.org> and Sirtaj Singh Kang <taj@kde.org>
23 * Version:$Id$ 23 * Version:$Id$
24 * Generated:Thu Mar 5 16:05:28 EST 1998 24 * Generated:Thu Mar 5 16:05:28 EST 1998
25 */ 25 */
26 26
27//US #include "config.h" 27//US #include "config.h"
28 28
29#include <stdlib.h> 29#include <stdlib.h>
30#include <assert.h> 30#include <assert.h>
31//US#include <errno.h> 31//US#include <errno.h>
32//US #ifdef HAVE_SYS_STAT_H 32//US #ifdef HAVE_SYS_STAT_H
33//US #include <sys/stat.h> 33//US #include <sys/stat.h>
34//US #endif 34//US #endif
35//US#include <sys/types.h> 35//US#include <sys/types.h>
36//US#include <dirent.h> 36//US#include <dirent.h>
37//US#include <pwd.h> 37//US#include <pwd.h>
38 38
39#include <qregexp.h> 39#include <qregexp.h>
40#include <qasciidict.h> 40#include <qasciidict.h>
41#include <qdict.h> 41#include <qdict.h>
42#include <qdir.h> 42#include <qdir.h>
43#include <qfileinfo.h> 43#include <qfileinfo.h>
44#include <qstring.h> 44#include <qstring.h>
45#include <qmessagebox.h> 45#include <qmessagebox.h>
46#include <qapplication.h> 46#include <qapplication.h>
47 47
48#include <qstringlist.h> 48#include <qstringlist.h>
49 49
50#include "kstandarddirs.h" 50#include "kstandarddirs.h"
51#include "kconfig.h" 51#include "kconfig.h"
52#include "kdebug.h" 52#include "kdebug.h"
53//US #include "kinstance.h" 53//US #include "kinstance.h"
54#include "kshell.h" 54#include "kshell.h"
55//US#include <sys/param.h> 55//US#include <sys/param.h>
56//US#include <unistd.h> 56//US#include <unistd.h>
57 57
58//US 58//US
59QString KStandardDirs::mAppDir = QString::null; 59QString KStandardDirs::mAppDir = QString::null;
60 60
61 61
62template class QDict<QStringList>; 62template class QDict<QStringList>;
63 63
64#if 0 64#if 0
65#include <qtextedit.h> 65#include <qtextedit.h>
66void ddd( QString op ) 66void ddd( QString op )
67{ 67{
68 static QTextEdit * dot = 0; 68 static QTextEdit * dot = 0;
69 if ( ! dot ) 69 if ( ! dot )
70 dot = new QTextEdit(); 70 dot = new QTextEdit();
71 71
72 dot->show(); 72 dot->show();
73 73
74 dot->append( op ); 74 dot->append( op );
75 75
76} 76}
77#endif 77#endif
78class KStandardDirs::KStandardDirsPrivate 78class KStandardDirs::KStandardDirsPrivate
79{ 79{
80public: 80public:
81 KStandardDirsPrivate() 81 KStandardDirsPrivate()
82 : restrictionsActive(false), 82 : restrictionsActive(false),
83 dataRestrictionActive(false) 83 dataRestrictionActive(false)
84 { } 84 { }
85 85
86 bool restrictionsActive; 86 bool restrictionsActive;
87 bool dataRestrictionActive; 87 bool dataRestrictionActive;
88 QAsciiDict<bool> restrictions; 88 QAsciiDict<bool> restrictions;
89 QStringList xdgdata_prefixes; 89 QStringList xdgdata_prefixes;
90 QStringList xdgconf_prefixes; 90 QStringList xdgconf_prefixes;
91}; 91};
92 92
93static const char* const types[] = {"html", "icon", "apps", "sound", 93static const char* const types[] = {"html", "icon", "apps", "sound",
94 "data", "locale", "services", "mime", 94 "data", "locale", "services", "mime",
95 "servicetypes", "config", "exe", "tmp", 95 "servicetypes", "config", "exe", "tmp",
96 "wallpaper", "lib", "pixmap", "templates", 96 "wallpaper", "lib", "pixmap", "templates",
97 "module", "qtplugins", 97 "module", "qtplugins",
98 "xdgdata-apps", "xdgdata-dirs", "xdgconf-menu", 0 }; 98 "xdgdata-apps", "xdgdata-dirs", "xdgconf-menu", 0 };
99 99
100static int tokenize( QStringList& token, const QString& str, 100static int tokenize( QStringList& token, const QString& str,
101 const QString& delim ); 101 const QString& delim );
102 102
103KStandardDirs::KStandardDirs( ) : addedCustoms(false) 103KStandardDirs::KStandardDirs( ) : addedCustoms(false)
104{ 104{
105 d = new KStandardDirsPrivate; 105 d = new KStandardDirsPrivate;
106 dircache.setAutoDelete(true); 106 dircache.setAutoDelete(true);
107 relatives.setAutoDelete(true); 107 relatives.setAutoDelete(true);
108 absolutes.setAutoDelete(true); 108 absolutes.setAutoDelete(true);
109 savelocations.setAutoDelete(true); 109 savelocations.setAutoDelete(true);
110 addKDEDefaults(); 110 addKDEDefaults();
111} 111}
112 112
113KStandardDirs::~KStandardDirs() 113KStandardDirs::~KStandardDirs()
114{ 114{
115 delete d; 115 delete d;
116} 116}
117 117
118bool KStandardDirs::isRestrictedResource(const char *type, const QString& relPath) const 118bool KStandardDirs::isRestrictedResource(const char *type, const QString& relPath) const
119{ 119{
120 if (!d || !d->restrictionsActive) 120 if (!d || !d->restrictionsActive)
121 return false; 121 return false;
122 122
123 if (d->restrictions[type]) 123 if (d->restrictions[type])
124 return true; 124 return true;
125 125
126 if (strcmp(type, "data")==0) 126 if (strcmp(type, "data")==0)
127 { 127 {
128 applyDataRestrictions(relPath); 128 applyDataRestrictions(relPath);
129 if (d->dataRestrictionActive) 129 if (d->dataRestrictionActive)
130 { 130 {
131 d->dataRestrictionActive = false; 131 d->dataRestrictionActive = false;
132 return true; 132 return true;
133 } 133 }
134 } 134 }
135 return false; 135 return false;
136} 136}
137 137
138void KStandardDirs::applyDataRestrictions(const QString &relPath) const 138void KStandardDirs::applyDataRestrictions(const QString &relPath) const
139{ 139{
140 QString key; 140 QString key;
141 int i = relPath.find('/'); 141 int i = relPath.find('/');
142 if (i != -1) 142 if (i != -1)
143 key = "data_"+relPath.left(i); 143 key = "data_"+relPath.left(i);
144 else 144 else
145 key = "data_"+relPath; 145 key = "data_"+relPath;
146 146
147 if (d && d->restrictions[key.latin1()]) 147 if (d && d->restrictions[key.latin1()])
148 d->dataRestrictionActive = true; 148 d->dataRestrictionActive = true;
149} 149}
150 150
151 151
152QStringList KStandardDirs::allTypes() const 152QStringList KStandardDirs::allTypes() const
153{ 153{
154 QStringList list; 154 QStringList list;
155 for (int i = 0; types[i] != 0; ++i) 155 for (int i = 0; types[i] != 0; ++i)
156 list.append(QString::fromLatin1(types[i])); 156 list.append(QString::fromLatin1(types[i]));
157 return list; 157 return list;
158} 158}
159 159
160void KStandardDirs::addPrefix( const QString& _dir ) 160void KStandardDirs::addPrefix( const QString& _dir )
161{ 161{
162 if (_dir.isNull()) 162 if (_dir.isNull())
163 return; 163 return;
164 164
165 QString dir = _dir; 165 QString dir = _dir;
166 if (dir.at(dir.length() - 1) != '/') 166 if (dir.at(dir.length() - 1) != '/')
167 dir += '/'; 167 dir += '/';
168 168
169 if (!prefixes.contains(dir)) { 169 if (!prefixes.contains(dir)) {
170 prefixes.append(dir); 170 prefixes.append(dir);
171 dircache.clear(); 171 dircache.clear();
172 } 172 }
173} 173}
174 174
175void KStandardDirs::addXdgConfigPrefix( const QString& _dir ) 175void KStandardDirs::addXdgConfigPrefix( const QString& _dir )
176{ 176{
177 if (_dir.isNull()) 177 if (_dir.isNull())
178 return; 178 return;
179 179
180 QString dir = _dir; 180 QString dir = _dir;
181 if (dir.at(dir.length() - 1) != '/') 181 if (dir.at(dir.length() - 1) != '/')
182 dir += '/'; 182 dir += '/';
183 183
184 if (!d->xdgconf_prefixes.contains(dir)) { 184 if (!d->xdgconf_prefixes.contains(dir)) {
185 d->xdgconf_prefixes.append(dir); 185 d->xdgconf_prefixes.append(dir);
186 dircache.clear(); 186 dircache.clear();
187 } 187 }
188} 188}
189 189
190void KStandardDirs::addXdgDataPrefix( const QString& _dir ) 190void KStandardDirs::addXdgDataPrefix( const QString& _dir )
191{ 191{
192 if (_dir.isNull()) 192 if (_dir.isNull())
193 return; 193 return;
194 194
195 QString dir = _dir; 195 QString dir = _dir;
196 if (dir.at(dir.length() - 1) != '/') 196 if (dir.at(dir.length() - 1) != '/')
197 dir += '/'; 197 dir += '/';
198 198
199 if (!d->xdgdata_prefixes.contains(dir)) { 199 if (!d->xdgdata_prefixes.contains(dir)) {
200 d->xdgdata_prefixes.append(dir); 200 d->xdgdata_prefixes.append(dir);
201 dircache.clear(); 201 dircache.clear();
202 } 202 }
203} 203}
204 204
205 205
206QString KStandardDirs::kfsstnd_prefixes() 206QString KStandardDirs::kfsstnd_prefixes()
207{ 207{
208 return prefixes.join(":"); 208 return prefixes.join(":");
209} 209}
210 210
211bool KStandardDirs::addResourceType( const char *type, 211bool KStandardDirs::addResourceType( const char *type,
212 const QString& relativename ) 212 const QString& relativename )
213{ 213{
214 if (relativename.isNull()) 214 if (relativename.isNull())
215 return false; 215 return false;
216 216
217 QStringList *rels = relatives.find(type); 217 QStringList *rels = relatives.find(type);
218 if (!rels) { 218 if (!rels) {
219 rels = new QStringList(); 219 rels = new QStringList();
220 relatives.insert(type, rels); 220 relatives.insert(type, rels);
221 } 221 }
222 QString copy = relativename; 222 QString copy = relativename;
223 if (copy.at(copy.length() - 1) != '/') 223 if (copy.at(copy.length() - 1) != '/')
224 copy += '/'; 224 copy += '/';
225 if (!rels->contains(copy)) { 225 if (!rels->contains(copy)) {
226 rels->prepend(copy); 226 rels->prepend(copy);
227 dircache.remove(type); // clean the cache 227 dircache.remove(type); // clean the cache
228 return true; 228 return true;
229 } 229 }
230 return false; 230 return false;
231} 231}
232 232
233bool KStandardDirs::addResourceDir( const char *type, 233bool KStandardDirs::addResourceDir( const char *type,
234 const QString& absdir) 234 const QString& absdir)
235{ 235{
236 QStringList *paths = absolutes.find(type); 236 QStringList *paths = absolutes.find(type);
237 if (!paths) { 237 if (!paths) {
238 paths = new QStringList(); 238 paths = new QStringList();
239 absolutes.insert(type, paths); 239 absolutes.insert(type, paths);
240 } 240 }
241 QString copy = absdir; 241 QString copy = absdir;
242 if (copy.at(copy.length() - 1) != '/') 242 if (copy.at(copy.length() - 1) != '/')
243 copy += '/'; 243 copy += '/';
244 244
245 if (!paths->contains(copy)) { 245 if (!paths->contains(copy)) {
246 paths->append(copy); 246 paths->append(copy);
247 dircache.remove(type); // clean the cache 247 dircache.remove(type); // clean the cache
248 return true; 248 return true;
249 } 249 }
250 return false; 250 return false;
251} 251}
252 252
253QString KStandardDirs::findResource( const char *type, 253QString KStandardDirs::findResource( const char *type,
254 const QString& filename ) const 254 const QString& filename ) const
255{ 255{
256 if (filename.at(0) == '/') 256 if (filename.at(0) == '/')
257 return filename; // absolute dirs are absolute dirs, right? :-/ 257 return filename; // absolute dirs are absolute dirs, right? :-/
258 258
259#if 0 259#if 0
260kdDebug() << "Find resource: " << type << endl; 260kdDebug() << "Find resource: " << type << endl;
261for (QStringList::ConstIterator pit = prefixes.begin(); 261for (QStringList::ConstIterator pit = prefixes.begin();
262 pit != prefixes.end(); 262 pit != prefixes.end();
263 pit++) 263 pit++)
264{ 264{
265 kdDebug() << "Prefix: " << *pit << endl; 265 kdDebug() << "Prefix: " << *pit << endl;
266} 266}
267#endif 267#endif
268 268
269 QString dir = findResourceDir(type, filename); 269 QString dir = findResourceDir(type, filename);
270 if (dir.isNull()) 270 if (dir.isNull())
271 return dir; 271 return dir;
272 else return dir + filename; 272 else return dir + filename;
273} 273}
274/*US 274/*US
275static Q_UINT32 updateHash(const QString &file, Q_UINT32 hash) 275static Q_UINT32 updateHash(const QString &file, Q_UINT32 hash)
276{ 276{
277 QCString cFile = QFile::encodeName(file); 277 QCString cFile = QFile::encodeName(file);
278//US struct stat buff; 278//US struct stat buff;
279//US if ((access(cFile, R_OK) == 0) && 279//US if ((access(cFile, R_OK) == 0) &&
280//US (stat( cFile, &buff ) == 0) && 280//US (stat( cFile, &buff ) == 0) &&
281//US (S_ISREG( buff.st_mode ))) 281//US (S_ISREG( buff.st_mode )))
282 QFileInfo pathfnInfo(cFile); 282 QFileInfo pathfnInfo(cFile);
283 if (( pathfnInfo.isReadable() == true ) && 283 if (( pathfnInfo.isReadable() == true ) &&
284 ( pathfnInfo.isFile()) ) 284 ( pathfnInfo.isFile()) )
285 { 285 {
286//US hash = hash + (Q_UINT32) buff.st_ctime; 286//US hash = hash + (Q_UINT32) buff.st_ctime;
287 hash = hash + (Q_UINT32) pathfnInfo.lastModified(); 287 hash = hash + (Q_UINT32) pathfnInfo.lastModified();
288 } 288 }
289 return hash; 289 return hash;
290} 290}
291*/ 291*/
292/*US 292/*US
293Q_UINT32 KStandardDirs::calcResourceHash( const char *type, 293Q_UINT32 KStandardDirs::calcResourceHash( const char *type,
294 const QString& filename, bool deep) const 294 const QString& filename, bool deep) const
295{ 295{
296 Q_UINT32 hash = 0; 296 Q_UINT32 hash = 0;
297 297
298 if (filename.at(0) == '/') 298 if (filename.at(0) == '/')
299 { 299 {
300 // absolute dirs are absolute dirs, right? :-/ 300 // absolute dirs are absolute dirs, right? :-/
301 return updateHash(filename, hash); 301 return updateHash(filename, hash);
302 } 302 }
303 if (d && d->restrictionsActive && (strcmp(type, "data")==0)) 303 if (d && d->restrictionsActive && (strcmp(type, "data")==0))
304 applyDataRestrictions(filename); 304 applyDataRestrictions(filename);
305 QStringList candidates = resourceDirs(type); 305 QStringList candidates = resourceDirs(type);
306 QString fullPath; 306 QString fullPath;
307 307
308 for (QStringList::ConstIterator it = candidates.begin(); 308 for (QStringList::ConstIterator it = candidates.begin();
309 it != candidates.end(); it++) 309 it != candidates.end(); it++)
310 { 310 {
311 hash = updateHash(*it + filename, hash); 311 hash = updateHash(*it + filename, hash);
312 if (!deep && hash) 312 if (!deep && hash)
313 return hash; 313 return hash;
314 } 314 }
315 return hash; 315 return hash;
316} 316}
317*/ 317*/
318 318
319QStringList KStandardDirs::findDirs( const char *type, 319QStringList KStandardDirs::findDirs( const char *type,
320 const QString& reldir ) const 320 const QString& reldir ) const
321{ 321{
322 QStringList list; 322 QStringList list;
323 323
324 checkConfig(); 324 checkConfig();
325 325
326 if (d && d->restrictionsActive && (strcmp(type, "data")==0)) 326 if (d && d->restrictionsActive && (strcmp(type, "data")==0))
327 applyDataRestrictions(reldir); 327 applyDataRestrictions(reldir);
328 QStringList candidates = resourceDirs(type); 328 QStringList candidates = resourceDirs(type);
329 QDir testdir; 329 QDir testdir;
330 330
331 for (QStringList::ConstIterator it = candidates.begin(); 331 for (QStringList::ConstIterator it = candidates.begin();
332 it != candidates.end(); it++) { 332 it != candidates.end(); it++) {
333 testdir.setPath(*it + reldir); 333 testdir.setPath(*it + reldir);
334 if (testdir.exists()) 334 if (testdir.exists())
335 list.append(testdir.absPath() + '/'); 335 list.append(testdir.absPath() + '/');
336 } 336 }
337 337
338 return list; 338 return list;
339} 339}
340 340
341QString KStandardDirs::findResourceDir( const char *type, 341QString KStandardDirs::findResourceDir( const char *type,
342 const QString& filename) const 342 const QString& filename) const
343{ 343{
344#ifndef NDEBUG 344#ifndef NDEBUG
345 if (filename.isEmpty()) { 345 if (filename.isEmpty()) {
346 kdWarning() << "filename for type " << type << " in KStandardDirs::findResourceDir is not supposed to be empty!!" << endl; 346 kdWarning() << "filename for type " << type << " in KStandardDirs::findResourceDir is not supposed to be empty!!" << endl;
347 return QString::null; 347 return QString::null;
348 } 348 }
349#endif 349#endif
350 350
351 if (d && d->restrictionsActive && (strcmp(type, "data")==0)) 351 if (d && d->restrictionsActive && (strcmp(type, "data")==0))
352 applyDataRestrictions(filename); 352 applyDataRestrictions(filename);
353 QStringList candidates = resourceDirs(type); 353 QStringList candidates = resourceDirs(type);
354 QString fullPath; 354 QString fullPath;
355#ifdef DESKTOP_VERSION 355#ifdef DESKTOP_VERSION
356#ifdef _WIN32_ 356#ifdef _WIN32_
357 candidates.prepend( qApp->applicationDirPath () +"\\"); 357 candidates.prepend( qApp->applicationDirPath () +"\\");
358#else 358#else
359 candidates.prepend( qApp->applicationDirPath () +"/"); 359 candidates.prepend( qApp->applicationDirPath () +"/");
360#endif 360#endif
361#endif 361#endif
362 for (QStringList::ConstIterator it = candidates.begin(); it != candidates.end(); it++) 362 for (QStringList::ConstIterator it = candidates.begin(); it != candidates.end(); it++)
363 { 363 {
364 //qDebug("looking for dir %s - file %s", (*it).latin1(), filename.latin1()); 364 //qDebug("looking for dir %s - file %s", (*it).latin1(), filename.latin1());
365 if (exists(*it + filename)) 365 if (exists(*it + filename))
366 return *it; 366 return *it;
367 } 367 }
368 368
369#ifndef NDEBUG 369#ifndef NDEBUG
370 if(false && type != "locale") 370 if(false && type != "locale")
371 qDebug("KStdDirs::findResDir(): can't find %s ", filename.latin1()); 371 qDebug("KStdDirs::findResDir(): can't find %s ", filename.latin1());
372 372
373#endif 373#endif
374 374
375 return QString::null; 375 return QString::null;
376} 376}
377 377
378bool KStandardDirs::exists(const QString &fullPath) 378bool KStandardDirs::exists(const QString &fullPath)
379{ 379{
380//US struct stat buff; 380//US struct stat buff;
381 QFileInfo fullPathInfo(QFile::encodeName(fullPath)); 381 QFileInfo fullPathInfo(QFile::encodeName(fullPath));
382 382
383//US if (access(QFile::encodeName(fullPath), R_OK) == 0 && fullPathInfo.isReadable()) 383//US if (access(QFile::encodeName(fullPath), R_OK) == 0 && fullPathInfo.isReadable())
384 if (fullPathInfo.isReadable()) 384 if (fullPathInfo.isReadable())
385 { 385 {
386 if (fullPath.at(fullPath.length() - 1) != '/') { 386 if (fullPath.at(fullPath.length() - 1) != '/') {
387 //US if (S_ISREG( buff.st_mode )) 387 //US if (S_ISREG( buff.st_mode ))
388 if (fullPathInfo.isFile()) 388 if (fullPathInfo.isFile())
389 return true; 389 return true;
390 } 390 }
391 else { 391 else {
392 //US if (S_ISDIR( buff.st_mode )) 392 //US if (S_ISDIR( buff.st_mode ))
393 if (fullPathInfo.isDir()) 393 if (fullPathInfo.isDir())
394 return true; 394 return true;
395 } 395 }
396 } 396 }
397 return false; 397 return false;
398} 398}
399 399
400static void lookupDirectory(const QString& path, const QString &relPart, 400static void lookupDirectory(const QString& path, const QString &relPart,
401 const QRegExp &regexp, 401 const QRegExp &regexp,
402 QStringList& list, 402 QStringList& list,
403 QStringList& relList, 403 QStringList& relList,
404 bool recursive, bool uniq) 404 bool recursive, bool uniq)
405{ 405{
406 QString pattern = regexp.pattern(); 406 QString pattern = regexp.pattern();
407 if (recursive || pattern.contains('?') || pattern.contains('*')) 407 if (recursive || pattern.contains('?') || pattern.contains('*'))
408 { 408 {
409 // We look for a set of files. 409 // We look for a set of files.
410//US DIR *dp = opendir( QFile::encodeName(path)); 410//US DIR *dp = opendir( QFile::encodeName(path));
411 QDir dp(QFile::encodeName(path)); 411 QDir dp(QFile::encodeName(path));
412 412
413 if (!dp.exists()) 413 if (!dp.exists())
414 return; 414 return;
415 static int iii = 0; 415 static int iii = 0;
416 ++iii; 416 ++iii;
417 if ( iii == 5 ) 417 if ( iii == 5 )
418 abort(); 418 abort();
419 assert(path.at(path.length() - 1) == '/'); 419 assert(path.at(path.length() - 1) == '/');
420 420
421//US struct dirent *ep; 421//US struct dirent *ep;
422//US struct stat buff; 422//US struct stat buff;
423 423
424 QString _dot("."); 424 QString _dot(".");
425 QString _dotdot(".."); 425 QString _dotdot("..");
426 426
427//US while( ( ep = readdir( dp ) ) != 0L ) 427//US while( ( ep = readdir( dp ) ) != 0L )
428 QStringList direntries = dp.entryList(); 428 QStringList direntries = dp.entryList();
429 QStringList::Iterator it = direntries.begin(); 429 QStringList::Iterator it = direntries.begin();
430 430
431 while ( it != list.end() ) // for each file... 431 while ( it != list.end() ) // for each file...
432 { 432 {
433 433
434//US QString fn( QFile::decodeName(ep->d_name)); 434//US QString fn( QFile::decodeName(ep->d_name));
435 QString fn = (*it); // dp.entryList already decodes 435 QString fn = (*it); // dp.entryList already decodes
436 it++; 436 it++;
437 if ( fn.isNull() ) 437 if ( fn.isNull() )
438 break; 438 break;
439 439
440 if (fn == _dot || fn == _dotdot || fn.at(fn.length() - 1).latin1() == '~' ) 440 if (fn == _dot || fn == _dotdot || fn.at(fn.length() - 1).latin1() == '~' )
441 continue; 441 continue;
442 442
443/*US 443/*US
444 if (!recursive && !regexp.exactMatch(fn)) 444 if (!recursive && !regexp.exactMatch(fn))
445 continue; // No match 445 continue; // No match
446*/ 446*/
447//US this should do the same: 447//US this should do the same:
448 int pos = regexp.match(fn); 448 int pos = regexp.match(fn);
449 if (!recursive && !pos == 0) 449 if (!recursive && !pos == 0)
450 continue; // No match 450 continue; // No match
451 451
452 QString pathfn = path + fn; 452 QString pathfn = path + fn;
453/*US 453/*US
454 if ( stat( QFile::encodeName(pathfn), &buff ) != 0 ) { 454 if ( stat( QFile::encodeName(pathfn), &buff ) != 0 ) {
455 kdDebug() << "Error stat'ing " << pathfn << " : " << perror << endl; 455 kdDebug() << "Error stat'ing " << pathfn << " : " << perror << endl;
456 continue; // Couldn't stat (e.g. no read permissions) 456 continue; // Couldn't stat (e.g. no read permissions)
457 } 457 }
458 458
459 if ( recursive ) 459 if ( recursive )
460 { 460 {
461 if ( S_ISDIR( buff.st_mode )) { 461 if ( S_ISDIR( buff.st_mode )) {
462 lookupDirectory(pathfn + '/', relPart + fn + '/', regexp, list, relList, recursive, uniq); 462 lookupDirectory(pathfn + '/', relPart + fn + '/', regexp, list, relList, recursive, uniq);
463 } 463 }
464*/ 464*/
465//US replacement: 465//US replacement:
466 QFileInfo pathfnInfo(QFile::encodeName(pathfn)); 466 QFileInfo pathfnInfo(QFile::encodeName(pathfn));
467 if ( pathfnInfo.isReadable() == false ) 467 if ( pathfnInfo.isReadable() == false )
468 { 468 {
469//US kdDebug() << "Error stat'ing " << pathfn << " : " << perror << endl; 469//US kdDebug() << "Error stat'ing " << pathfn << " : " << perror << endl;
470 continue; // Couldn't stat (e.g. no read permissions) 470 continue; // Couldn't stat (e.g. no read permissions)
471 } 471 }
472 472
473 if ( recursive ) 473 if ( recursive )
474 { 474 {
475 if ( pathfnInfo.isDir()) { 475 if ( pathfnInfo.isDir()) {
476 lookupDirectory(pathfn + '/', relPart + fn + '/', regexp, list, relList, recursive, uniq); 476 lookupDirectory(pathfn + '/', relPart + fn + '/', regexp, list, relList, recursive, uniq);
477 } 477 }
478 478
479 479
480/*US 480/*US
481 if (!regexp.exactMatch(fn)) 481 if (!regexp.exactMatch(fn))
482 continue; // No match 482 continue; // No match
483*/ 483*/
484//US this should do the same: 484//US this should do the same:
485 pos = regexp.match(fn); 485 pos = regexp.match(fn);
486 if (!pos == 0) 486 if (!pos == 0)
487 continue; // No match 487 continue; // No match
488 } 488 }
489 489
490//US if ( S_ISREG( buff.st_mode)) 490//US if ( S_ISREG( buff.st_mode))
491 if ( pathfnInfo.isFile()) 491 if ( pathfnInfo.isFile())
492 { 492 {
493 if (!uniq || !relList.contains(relPart + fn)) 493 if (!uniq || !relList.contains(relPart + fn))
494 { 494 {
495 list.append( pathfn ); 495 list.append( pathfn );
496 relList.append( relPart + fn ); 496 relList.append( relPart + fn );
497 } 497 }
498 } 498 }
499 } 499 }
500//US closedir( dp ); 500//US closedir( dp );
501 } 501 }
502 else 502 else
503 { 503 {
504 // We look for a single file. 504 // We look for a single file.
505 QString fn = pattern; 505 QString fn = pattern;
506 QString pathfn = path + fn; 506 QString pathfn = path + fn;
507//US struct stat buff; 507//US struct stat buff;
508 QFileInfo pathfnInfo(QFile::encodeName(pathfn)); 508 QFileInfo pathfnInfo(QFile::encodeName(pathfn));
509 509
510 510
511//US if ( stat( QFile::encodeName(pathfn), &buff ) != 0 ) 511//US if ( stat( QFile::encodeName(pathfn), &buff ) != 0 )
512 if ( pathfnInfo.isReadable() == false ) 512 if ( pathfnInfo.isReadable() == false )
513 return; // File not found 513 return; // File not found
514 514
515//US if ( S_ISREG( buff.st_mode)) 515//US if ( S_ISREG( buff.st_mode))
516 if ( pathfnInfo.isFile()) 516 if ( pathfnInfo.isFile())
517 { 517 {
518 if (!uniq || !relList.contains(relPart + fn)) 518 if (!uniq || !relList.contains(relPart + fn))
519 { 519 {
520 list.append( pathfn ); 520 list.append( pathfn );
521 relList.append( relPart + fn ); 521 relList.append( relPart + fn );
522 } 522 }
523 } 523 }
524 } 524 }
525} 525}
526 526
527static void lookupPrefix(const QString& prefix, const QString& relpath, 527static void lookupPrefix(const QString& prefix, const QString& relpath,
528 const QString& relPart, 528 const QString& relPart,
529 const QRegExp &regexp, 529 const QRegExp &regexp,
530 QStringList& list, 530 QStringList& list,
531 QStringList& relList, 531 QStringList& relList,
532 bool recursive, bool uniq) 532 bool recursive, bool uniq)
533{ 533{
534 if (relpath.isNull()) { 534 if (relpath.isNull()) {
535 lookupDirectory(prefix, relPart, regexp, list, 535 lookupDirectory(prefix, relPart, regexp, list,
536 relList, recursive, uniq); 536 relList, recursive, uniq);
537 return; 537 return;
538 } 538 }
539 QString path; 539 QString path;
540 QString rest; 540 QString rest;
541 541
542 if (relpath.length()) 542 if (relpath.length())
543 { 543 {
544 int slash = relpath.find('/'); 544 int slash = relpath.find('/');
545 if (slash < 0) 545 if (slash < 0)
546 rest = relpath.left(relpath.length() - 1); 546 rest = relpath.left(relpath.length() - 1);
547 else { 547 else {
548 path = relpath.left(slash); 548 path = relpath.left(slash);
549 rest = relpath.mid(slash + 1); 549 rest = relpath.mid(slash + 1);
550 } 550 }
551 } 551 }
552 assert(prefix.at(prefix.length() - 1) == '/'); 552 assert(prefix.at(prefix.length() - 1) == '/');
553 553
554//US struct stat buff; 554//US struct stat buff;
555 555
556 if (path.contains('*') || path.contains('?')) { 556 if (path.contains('*') || path.contains('?')) {
557 QRegExp pathExp(path, true, true); 557 QRegExp pathExp(path, true, true);
558 //USDIR *dp = opendir( QFile::encodeName(prefix) ); 558 //USDIR *dp = opendir( QFile::encodeName(prefix) );
559 QDir dp(QFile::encodeName(prefix)); 559 QDir dp(QFile::encodeName(prefix));
560 560
561 //USif (!dp) 561 //USif (!dp)
562 if (!dp.exists()) 562 if (!dp.exists())
563 { 563 {
564 return; 564 return;
565 } 565 }
566 566
567 //USstruct dirent *ep; 567 //USstruct dirent *ep;
568 568
569 QString _dot("."); 569 QString _dot(".");
570 QString _dotdot(".."); 570 QString _dotdot("..");
571 571
572 //USwhile( ( ep = readdir( dp ) ) != 0L ) 572 //USwhile( ( ep = readdir( dp ) ) != 0L )
573 QStringList direntries = dp.entryList(); 573 QStringList direntries = dp.entryList();
574 QStringList::Iterator it = direntries.begin(); 574 QStringList::Iterator it = direntries.begin();
575 575
576 while ( it != list.end() ) // for each file... 576 while ( it != list.end() ) // for each file...
577 { 577 {
578//US QString fn( QFile::decodeName(ep->d_name)); 578//US QString fn( QFile::decodeName(ep->d_name));
579 QString fn = (*it); // dp.entryList() already encodes the strings 579 QString fn = (*it); // dp.entryList() already encodes the strings
580 it++; 580 it++;
581 581
582 if (fn == _dot || fn == _dotdot || fn.at(fn.length() - 1) == '~') 582 if (fn == _dot || fn == _dotdot || fn.at(fn.length() - 1) == '~')
583 continue; 583 continue;
584 584
585#ifdef DESKTOP_VERSION 585#ifdef DESKTOP_VERSION
586 586
587 if (pathExp.search(fn) == -1) 587 if (pathExp.search(fn) == -1)
588 continue; // No match 588 continue; // No match
589 589
590#else 590#else
591//US this should do the same: 591//US this should do the same:
592 if (pathExp.find(fn, 0) == -1) 592 if (pathExp.find(fn, 0) == -1)
593 continue; // No match 593 continue; // No match
594#endif 594#endif
595 QString rfn = relPart+fn; 595 QString rfn = relPart+fn;
596 fn = prefix + fn; 596 fn = prefix + fn;
597//US if ( stat( QFile::encodeName(fn), &buff ) != 0 ) 597//US if ( stat( QFile::encodeName(fn), &buff ) != 0 )
598 QFileInfo fnInfo(QFile::encodeName(fn)); 598 QFileInfo fnInfo(QFile::encodeName(fn));
599 if ( fnInfo.isReadable() == false ) 599 if ( fnInfo.isReadable() == false )
600 { 600 {
601//US kdDebug() << "Error statting " << fn << " : " << perror << endl; 601//US kdDebug() << "Error statting " << fn << " : " << perror << endl;
602 continue; // Couldn't stat (e.g. no permissions) 602 continue; // Couldn't stat (e.g. no permissions)
603 } 603 }
604 //US if ( S_ISDIR( buff.st_mode )) 604 //US if ( S_ISDIR( buff.st_mode ))
605 if ( fnInfo.isDir() ) 605 if ( fnInfo.isDir() )
606 606
607 lookupPrefix(fn + '/', rest, rfn + '/', regexp, list, relList, recursive, uniq); 607 lookupPrefix(fn + '/', rest, rfn + '/', regexp, list, relList, recursive, uniq);
608 } 608 }
609 609
610 //USclosedir( dp ); 610 //USclosedir( dp );
611 } else { 611 } else {
612 // Don't stat, if the dir doesn't exist we will find out 612 // Don't stat, if the dir doesn't exist we will find out
613 // when we try to open it. 613 // when we try to open it.
614 lookupPrefix(prefix + path + '/', rest, 614 lookupPrefix(prefix + path + '/', rest,
615 relPart + path + '/', regexp, list, 615 relPart + path + '/', regexp, list,
616 relList, recursive, uniq); 616 relList, recursive, uniq);
617 } 617 }
618} 618}
619 619
620QStringList 620QStringList
621KStandardDirs::findAllResources( const char *type, 621KStandardDirs::findAllResources( const char *type,
622 const QString& filter, 622 const QString& filter,
623 bool recursive, 623 bool recursive,
624 bool uniq, 624 bool uniq,
625 QStringList &relList) const 625 QStringList &relList) const
626{ 626{
627 QStringList list; 627 QStringList list;
628 if (filter.at(0) == '/') // absolute paths we return 628 if (filter.at(0) == '/') // absolute paths we return
629 { 629 {
630 list.append( filter); 630 list.append( filter);
631 return list; 631 return list;
632 } 632 }
633 633
634 QString filterPath; 634 QString filterPath;
635 QString filterFile; 635 QString filterFile;
636 636
637 if (filter.length()) 637 if (filter.length())
638 { 638 {
639 int slash = filter.findRev('/'); 639 int slash = filter.findRev('/');
640 if (slash < 0) 640 if (slash < 0)
641 filterFile = filter; 641 filterFile = filter;
642 else { 642 else {
643 filterPath = filter.left(slash + 1); 643 filterPath = filter.left(slash + 1);
644 filterFile = filter.mid(slash + 1); 644 filterFile = filter.mid(slash + 1);
645 } 645 }
646 } 646 }
647 checkConfig(); 647 checkConfig();
648 648
649 if (d && d->restrictionsActive && (strcmp(type, "data")==0)) 649 if (d && d->restrictionsActive && (strcmp(type, "data")==0))
650 applyDataRestrictions(filter); 650 applyDataRestrictions(filter);
651 QStringList candidates = resourceDirs(type); 651 QStringList candidates = resourceDirs(type);
652 if (filterFile.isEmpty()) 652 if (filterFile.isEmpty())
653 filterFile = "*"; 653 filterFile = "*";
654 654
655 QRegExp regExp(filterFile, true, true); 655 QRegExp regExp(filterFile, true, true);
656 for (QStringList::ConstIterator it = candidates.begin(); 656 for (QStringList::ConstIterator it = candidates.begin();
657 it != candidates.end(); it++) 657 it != candidates.end(); it++)
658 { 658 {
659 lookupPrefix(*it, filterPath, "", regExp, list, 659 lookupPrefix(*it, filterPath, "", regExp, list,
660 relList, recursive, uniq); 660 relList, recursive, uniq);
661 } 661 }
662 return list; 662 return list;
663} 663}
664 664
665QStringList 665QStringList
666KStandardDirs::findAllResources( const char *type, 666KStandardDirs::findAllResources( const char *type,
667 const QString& filter, 667 const QString& filter,
668 bool recursive, 668 bool recursive,
669 bool uniq) const 669 bool uniq) const
670{ 670{
671 QStringList relList; 671 QStringList relList;
672 return findAllResources(type, filter, recursive, uniq, relList); 672 return findAllResources(type, filter, recursive, uniq, relList);
673} 673}
674 674
675QString 675QString
676KStandardDirs::realPath(const QString &dirname) 676KStandardDirs::realPath(const QString &dirname)
677{ 677{
678#ifdef _WIN32_ 678#ifdef _WIN32_
679 return dirname; 679 return dirname;
680#else 680#else
681//US char realpath_buffer[MAXPATHLEN + 1]; 681//US char realpath_buffer[MAXPATHLEN + 1];
682//US memset(realpath_buffer, 0, MAXPATHLEN + 1); 682//US memset(realpath_buffer, 0, MAXPATHLEN + 1);
683 char realpath_buffer[250 + 1]; 683 char realpath_buffer[250 + 1];
684 memset(realpath_buffer, 0, 250 + 1); 684 memset(realpath_buffer, 0, 250 + 1);
685 685
686 /* If the path contains symlinks, get the real name */ 686 /* If the path contains symlinks, get the real name */
687 if (realpath( QFile::encodeName(dirname).data(), realpath_buffer) != 0) { 687 if (realpath( QFile::encodeName(dirname).data(), realpath_buffer) != 0) {
688 // succes, use result from realpath 688 // succes, use result from realpath
689 int len = strlen(realpath_buffer); 689 int len = strlen(realpath_buffer);
690 realpath_buffer[len] = '/'; 690 realpath_buffer[len] = '/';
691 realpath_buffer[len+1] = 0; 691 realpath_buffer[len+1] = 0;
692 return QFile::decodeName(realpath_buffer); 692 return QFile::decodeName(realpath_buffer);
693 } 693 }
694 694
695 return dirname; 695 return dirname;
696#endif 696#endif
697} 697}
698/*US 698/*US
699void KStandardDirs::createSpecialResource(const char *type) 699void KStandardDirs::createSpecialResource(const char *type)
700{ 700{
701 char hostname[256]; 701 char hostname[256];
702 hostname[0] = 0; 702 hostname[0] = 0;
703 gethostname(hostname, 255); 703 gethostname(hostname, 255);
704 QString dir = QString("%1%2-%3").arg(localkdedir()).arg(type).arg(hostname); 704 QString dir = QString("%1%2-%3").arg(localkdedir()).arg(type).arg(hostname);
705 char link[1024]; 705 char link[1024];
706 link[1023] = 0; 706 link[1023] = 0;
707 int result = readlink(QFile::encodeName(dir).data(), link, 1023); 707 int result = readlink(QFile::encodeName(dir).data(), link, 1023);
708 if ((result == -1) && (errno == ENOENT)) 708 if ((result == -1) && (errno == ENOENT))
709 { 709 {
710 QString srv = findExe(QString::fromLatin1("lnusertemp"), KDEDIR+QString::fromLatin1("/bin")); 710 QString srv = findExe(QString::fromLatin1("lnusertemp"), KDEDIR+QString::fromLatin1("/bin"));
711 if (srv.isEmpty()) 711 if (srv.isEmpty())
712 srv = findExe(QString::fromLatin1("lnusertemp")); 712 srv = findExe(QString::fromLatin1("lnusertemp"));
713 if (!srv.isEmpty()) 713 if (!srv.isEmpty())
714 { 714 {
715 system(QFile::encodeName(srv)+" "+type); 715 system(QFile::encodeName(srv)+" "+type);
716 result = readlink(QFile::encodeName(dir).data(), link, 1023); 716 result = readlink(QFile::encodeName(dir).data(), link, 1023);
717 } 717 }
718 } 718 }
719 if (result > 0) 719 if (result > 0)
720 { 720 {
721 link[result] = 0; 721 link[result] = 0;
722 if (link[0] == '/') 722 if (link[0] == '/')
723 dir = QFile::decodeName(link); 723 dir = QFile::decodeName(link);
724 else 724 else
725 dir = QDir::cleanDirPath(dir+QFile::decodeName(link)); 725 dir = QDir::cleanDirPath(dir+QFile::decodeName(link));
726 } 726 }
727 addResourceDir(type, dir+'/'); 727 addResourceDir(type, dir+'/');
728} 728}
729*/ 729*/
730 730
731QStringList KStandardDirs::resourceDirs(const char *type) const 731QStringList KStandardDirs::resourceDirs(const char *type) const
732{ 732{
733 QStringList *candidates = dircache.find(type); 733 QStringList *candidates = dircache.find(type);
734 734
735 if (!candidates) { // filling cache 735 if (!candidates) { // filling cache
736/*US 736/*US
737 if (strcmp(type, "socket") == 0) 737 if (strcmp(type, "socket") == 0)
738 const_cast<KStandardDirs *>(this)->createSpecialResource(type); 738 const_cast<KStandardDirs *>(this)->createSpecialResource(type);
739 else if (strcmp(type, "tmp") == 0) 739 else if (strcmp(type, "tmp") == 0)
740 const_cast<KStandardDirs *>(this)->createSpecialResource(type); 740 const_cast<KStandardDirs *>(this)->createSpecialResource(type);
741 else if (strcmp(type, "cache") == 0) 741 else if (strcmp(type, "cache") == 0)
742 const_cast<KStandardDirs *>(this)->createSpecialResource(type); 742 const_cast<KStandardDirs *>(this)->createSpecialResource(type);
743*/ 743*/
744 QDir testdir; 744 QDir testdir;
745 745
746 candidates = new QStringList(); 746 candidates = new QStringList();
747 QStringList *dirs; 747 QStringList *dirs;
748 748
749 bool restrictionActive = false; 749 bool restrictionActive = false;
750 if (d && d->restrictionsActive) 750 if (d && d->restrictionsActive)
751 { 751 {
752 if (d->dataRestrictionActive) 752 if (d->dataRestrictionActive)
753 restrictionActive = true; 753 restrictionActive = true;
754 else if (d->restrictions["all"]) 754 else if (d->restrictions["all"])
755 restrictionActive = true; 755 restrictionActive = true;
756 else if (d->restrictions[type]) 756 else if (d->restrictions[type])
757 restrictionActive = true; 757 restrictionActive = true;
758 d->dataRestrictionActive = false; // Reset 758 d->dataRestrictionActive = false; // Reset
759 } 759 }
760 760
761 dirs = relatives.find(type); 761 dirs = relatives.find(type);
762 if (dirs) 762 if (dirs)
763 { 763 {
764 bool local = true; 764 bool local = true;
765 const QStringList *prefixList = 0; 765 const QStringList *prefixList = 0;
766 if (strncmp(type, "xdgdata-", 8) == 0) 766 if (strncmp(type, "xdgdata-", 8) == 0)
767 prefixList = &(d->xdgdata_prefixes); 767 prefixList = &(d->xdgdata_prefixes);
768 else if (strncmp(type, "xdgconf-", 8) == 0) 768 else if (strncmp(type, "xdgconf-", 8) == 0)
769 prefixList = &(d->xdgconf_prefixes); 769 prefixList = &(d->xdgconf_prefixes);
770 else 770 else
771 prefixList = &prefixes; 771 prefixList = &prefixes;
772 772
773 for (QStringList::ConstIterator pit = prefixList->begin(); 773 for (QStringList::ConstIterator pit = prefixList->begin();
774 pit != prefixList->end(); 774 pit != prefixList->end();
775 pit++) 775 pit++)
776 { 776 {
777 for (QStringList::ConstIterator it = dirs->begin(); 777 for (QStringList::ConstIterator it = dirs->begin();
778 it != dirs->end(); ++it) { 778 it != dirs->end(); ++it) {
779 QString path = realPath(*pit + *it); 779 QString path = realPath(*pit + *it);
780 testdir.setPath(path); 780 testdir.setPath(path);
781 if (local && restrictionActive) 781 if (local && restrictionActive)
782 continue; 782 continue;
783 if ((local || testdir.exists()) && !candidates->contains(path)) 783 if ((local || testdir.exists()) && !candidates->contains(path))
784 candidates->append(path); 784 candidates->append(path);
785 } 785 }
786 local = false; 786 local = false;
787 } 787 }
788 } 788 }
789 dirs = absolutes.find(type); 789 dirs = absolutes.find(type);
790 if (dirs) 790 if (dirs)
791 for (QStringList::ConstIterator it = dirs->begin(); 791 for (QStringList::ConstIterator it = dirs->begin();
792 it != dirs->end(); ++it) 792 it != dirs->end(); ++it)
793 { 793 {
794 testdir.setPath(*it); 794 testdir.setPath(*it);
795 if (testdir.exists()) 795 if (testdir.exists())
796 { 796 {
797 QString filename = realPath(*it); 797 QString filename = realPath(*it);
798 if (!candidates->contains(filename)) 798 if (!candidates->contains(filename))
799 candidates->append(filename); 799 candidates->append(filename);
800 } 800 }
801 } 801 }
802 dircache.insert(type, candidates); 802 dircache.insert(type, candidates);
803 } 803 }
804 804
805#if 0 805#if 0
806 kdDebug() << "found dirs for resource " << type << ":" << endl; 806 kdDebug() << "found dirs for resource " << type << ":" << endl;
807 for (QStringList::ConstIterator pit = candidates->begin(); 807 for (QStringList::ConstIterator pit = candidates->begin();
808 pit != candidates->end(); 808 pit != candidates->end();
809 pit++) 809 pit++)
810 { 810 {
811 fprintf(stderr, "%s\n", (*pit).latin1()); 811 fprintf(stderr, "%s\n", (*pit).latin1());
812 } 812 }
813#endif 813#endif
814 814
815 815
816 return *candidates; 816 return *candidates;
817} 817}
818 818
819/*US 819/*US
820QString KStandardDirs::findExe( const QString& appname, 820QString KStandardDirs::findExe( const QString& appname,
821 const QString& pstr, bool ignore) 821 const QString& pstr, bool ignore)
822{ 822{
823 QFileInfo info; 823 QFileInfo info;
824 824
825 // absolute path ? 825 // absolute path ?
826 if (appname.startsWith(QString::fromLatin1("/"))) 826 if (appname.startsWith(QString::fromLatin1("/")))
827 { 827 {
828 info.setFile( appname ); 828 info.setFile( appname );
829 if( info.exists() && ( ignore || info.isExecutable() ) 829 if( info.exists() && ( ignore || info.isExecutable() )
830 && info.isFile() ) { 830 && info.isFile() ) {
831 return appname; 831 return appname;
832 } 832 }
833 return QString::null; 833 return QString::null;
834 } 834 }
835 835
836//US QString p = QString("%1/%2").arg(__KDE_BINDIR).arg(appname); 836//US QString p = QString("%1/%2").arg(__KDE_BINDIR).arg(appname);
837 QString p = QString("%1/%2").arg(appname).arg(appname); 837 QString p = QString("%1/%2").arg(appname).arg(appname);
838 qDebug("KStandardDirs::findExe this is probably wrong"); 838 qDebug("KStandardDirs::findExe this is probably wrong");
839 839
840 info.setFile( p ); 840 info.setFile( p );
841 if( info.exists() && ( ignore || info.isExecutable() ) 841 if( info.exists() && ( ignore || info.isExecutable() )
842 && ( info.isFile() || info.isSymLink() ) ) { 842 && ( info.isFile() || info.isSymLink() ) ) {
843 return p; 843 return p;
844 } 844 }
845 845
846 QStringList tokens; 846 QStringList tokens;
847 p = pstr; 847 p = pstr;
848 848
849 if( p.isNull() ) { 849 if( p.isNull() ) {
850 p = getenv( "PATH" ); 850 p = getenv( "PATH" );
851 } 851 }
852 852
853 tokenize( tokens, p, ":\b" ); 853 tokenize( tokens, p, ":\b" );
854 854
855 // split path using : or \b as delimiters 855 // split path using : or \b as delimiters
856 for( unsigned i = 0; i < tokens.count(); i++ ) { 856 for( unsigned i = 0; i < tokens.count(); i++ ) {
857 p = tokens[ i ]; 857 p = tokens[ i ];
858 858
859 if ( p[ 0 ] == '~' ) 859 if ( p[ 0 ] == '~' )
860 { 860 {
861 int len = p.find( '/' ); 861 int len = p.find( '/' );
862 if ( len == -1 ) 862 if ( len == -1 )
863 len = p.length(); 863 len = p.length();
864 if ( len == 1 ) 864 if ( len == 1 )
865 p.replace( 0, 1, QDir::homeDirPath() ); 865 p.replace( 0, 1, QDir::homeDirPath() );
866 else 866 else
867 { 867 {
868 QString user = p.mid( 1, len - 1 ); 868 QString user = p.mid( 1, len - 1 );
869 struct passwd *dir = getpwnam( user.local8Bit().data() ); 869 struct passwd *dir = getpwnam( user.local8Bit().data() );
870 if ( dir && strlen( dir->pw_dir ) ) 870 if ( dir && strlen( dir->pw_dir ) )
871 p.replace( 0, len, QString::fromLocal8Bit( dir->pw_dir ) ); 871 p.replace( 0, len, QString::fromLocal8Bit( dir->pw_dir ) );
872 } 872 }
873 } 873 }
874 874
875 p += "/"; 875 p += "/";
876 p += appname; 876 p += appname;
877 877
878 // Check for executable in this tokenized path 878 // Check for executable in this tokenized path
879 info.setFile( p ); 879 info.setFile( p );
880 880
881 if( info.exists() && ( ignore || info.isExecutable() ) 881 if( info.exists() && ( ignore || info.isExecutable() )
882 && ( info.isFile() || info.isSymLink() ) ) { 882 && ( info.isFile() || info.isSymLink() ) ) {
883 return p; 883 return p;
884 } 884 }
885 } 885 }
886 886
887 // If we reach here, the executable wasn't found. 887 // If we reach here, the executable wasn't found.
888 // So return empty string. 888 // So return empty string.
889 889
890 return QString::null; 890 return QString::null;
891} 891}
892 892
893int KStandardDirs::findAllExe( QStringList& list, const QString& appname, 893int KStandardDirs::findAllExe( QStringList& list, const QString& appname,
894 const QString& pstr, bool ignore ) 894 const QString& pstr, bool ignore )
895{ 895{
896 QString p = pstr; 896 QString p = pstr;
897 QFileInfo info; 897 QFileInfo info;
898 QStringList tokens; 898 QStringList tokens;
899 899
900 if( p.isNull() ) { 900 if( p.isNull() ) {
901 p = getenv( "PATH" ); 901 p = getenv( "PATH" );
902 } 902 }
903 903
904 list.clear(); 904 list.clear();
905 tokenize( tokens, p, ":\b" ); 905 tokenize( tokens, p, ":\b" );
906 906
907 for ( unsigned i = 0; i < tokens.count(); i++ ) { 907 for ( unsigned i = 0; i < tokens.count(); i++ ) {
908 p = tokens[ i ]; 908 p = tokens[ i ];
909 p += "/"; 909 p += "/";
910 p += appname; 910 p += appname;
911 911
912 info.setFile( p ); 912 info.setFile( p );
913 913
914 if( info.exists() && (ignore || info.isExecutable()) 914 if( info.exists() && (ignore || info.isExecutable())
915 && info.isFile() ) { 915 && info.isFile() ) {
916 list.append( p ); 916 list.append( p );
917 } 917 }
918 918
919 } 919 }
920 920
921 return list.count(); 921 return list.count();
922} 922}
923*/ 923*/
924 924
925static int tokenize( QStringList& tokens, const QString& str, 925static int tokenize( QStringList& tokens, const QString& str,
926 const QString& delim ) 926 const QString& delim )
927{ 927{
928 int len = str.length(); 928 int len = str.length();
929 QString token = ""; 929 QString token = "";
930 930
931 for( int index = 0; index < len; index++) 931 for( int index = 0; index < len; index++)
932 { 932 {
933 if ( delim.find( str[ index ] ) >= 0 ) 933 if ( delim.find( str[ index ] ) >= 0 )
934 { 934 {
935 tokens.append( token ); 935 tokens.append( token );
936 token = ""; 936 token = "";
937 } 937 }
938 else 938 else
939 { 939 {
940 token += str[ index ]; 940 token += str[ index ];
941 } 941 }
942 } 942 }
943 if ( token.length() > 0 ) 943 if ( token.length() > 0 )
944 { 944 {
945 tokens.append( token ); 945 tokens.append( token );
946 } 946 }
947 947
948 return tokens.count(); 948 return tokens.count();
949} 949}
950 950
951QString KStandardDirs::kde_default(const char *type) { 951QString KStandardDirs::kde_default(const char *type) {
952 if (!strcmp(type, "data")) 952 if (!strcmp(type, "data"))
953 return "apps/"; 953 return "apps/";
954 if (!strcmp(type, "html")) 954 if (!strcmp(type, "html"))
955 return "share/doc/HTML/"; 955 return "share/doc/HTML/";
956 if (!strcmp(type, "icon")) 956 if (!strcmp(type, "icon"))
957 return "share/icons/"; 957 return "share/icons/";
958 if (!strcmp(type, "config")) 958 if (!strcmp(type, "config"))
959 return "config/"; 959 return "config/";
960 if (!strcmp(type, "pixmap")) 960 if (!strcmp(type, "pixmap"))
961 return "share/pixmaps/"; 961 return "share/pixmaps/";
962 if (!strcmp(type, "apps")) 962 if (!strcmp(type, "apps"))
963 return "share/applnk/"; 963 return "share/applnk/";
964 if (!strcmp(type, "sound")) 964 if (!strcmp(type, "sound"))
965 return "share/sounds/"; 965 return "share/sounds/";
966 if (!strcmp(type, "locale")) 966 if (!strcmp(type, "locale"))
967 return "share/locale/"; 967 return "share/locale/";
968 if (!strcmp(type, "services")) 968 if (!strcmp(type, "services"))
969 return "share/services/"; 969 return "share/services/";
970 if (!strcmp(type, "servicetypes")) 970 if (!strcmp(type, "servicetypes"))
971 return "share/servicetypes/"; 971 return "share/servicetypes/";
972 if (!strcmp(type, "mime")) 972 if (!strcmp(type, "mime"))
973 return "share/mimelnk/"; 973 return "share/mimelnk/";
974 if (!strcmp(type, "cgi")) 974 if (!strcmp(type, "cgi"))
975 return "cgi-bin/"; 975 return "cgi-bin/";
976 if (!strcmp(type, "wallpaper")) 976 if (!strcmp(type, "wallpaper"))
977 return "share/wallpapers/"; 977 return "share/wallpapers/";
978 if (!strcmp(type, "templates")) 978 if (!strcmp(type, "templates"))
979 return "share/templates/"; 979 return "share/templates/";
980 if (!strcmp(type, "exe")) 980 if (!strcmp(type, "exe"))
981 return "bin/"; 981 return "bin/";
982 if (!strcmp(type, "lib")) 982 if (!strcmp(type, "lib"))
983 return "lib/"; 983 return "lib/";
984 if (!strcmp(type, "module")) 984 if (!strcmp(type, "module"))
985 return "lib/kde3/"; 985 return "lib/kde3/";
986 if (!strcmp(type, "qtplugins")) 986 if (!strcmp(type, "qtplugins"))
987 return "lib/kde3/plugins"; 987 return "lib/kde3/plugins";
988 if (!strcmp(type, "xdgdata-apps")) 988 if (!strcmp(type, "xdgdata-apps"))
989 return "applications/"; 989 return "applications/";
990 if (!strcmp(type, "xdgdata-dirs")) 990 if (!strcmp(type, "xdgdata-dirs"))
991 return "desktop-directories/"; 991 return "desktop-directories/";
992 if (!strcmp(type, "xdgconf-menu")) 992 if (!strcmp(type, "xdgconf-menu"))
993 return "menus/"; 993 return "menus/";
994 if (!strcmp(type, "tmp")) 994 if (!strcmp(type, "tmp"))
995 return "tmp/"; 995 return "tmp/";
996 996
997 qFatal("unknown resource type %s", type); 997 qFatal("unknown resource type %s", type);
998 return QString::null; 998 return QString::null;
999} 999}
1000 1000
1001QString KStandardDirs::saveLocation(const char *type, 1001QString KStandardDirs::saveLocation(const char *type,
1002 const QString& suffix, 1002 const QString& suffix,
1003 bool create) const 1003 bool create) const
1004{ 1004{
1005 //qDebug("KStandardDirs::saveLocation called %s %s", type,suffix.latin1() ); 1005 //qDebug("KStandardDirs::saveLocation called %s %s", type,suffix.latin1() );
1006 //return ""; 1006 //return "";
1007 checkConfig(); 1007 checkConfig();
1008 1008
1009 QString *pPath = savelocations.find(type); 1009 QString *pPath = savelocations.find(type);
1010 if (!pPath) 1010 if (!pPath)
1011 { 1011 {
1012 QStringList *dirs = relatives.find(type); 1012 QStringList *dirs = relatives.find(type);
1013 if (!dirs && ( 1013 if (!dirs && (
1014 (strcmp(type, "socket") == 0) || 1014 (strcmp(type, "socket") == 0) ||
1015 (strcmp(type, "tmp") == 0) || 1015 (strcmp(type, "tmp") == 0) ||
1016 (strcmp(type, "cache") == 0) )) 1016 (strcmp(type, "cache") == 0) ))
1017 { 1017 {
1018 (void) resourceDirs(type); // Generate socket|tmp|cache resource. 1018 (void) resourceDirs(type); // Generate socket|tmp|cache resource.
1019 dirs = relatives.find(type); // Search again. 1019 dirs = relatives.find(type); // Search again.
1020 } 1020 }
1021 if (dirs) 1021 if (dirs)
1022 { 1022 {
1023 // Check for existance of typed directory + suffix 1023 // Check for existance of typed directory + suffix
1024 if (strncmp(type, "xdgdata-", 8) == 0) 1024 if (strncmp(type, "xdgdata-", 8) == 0)
1025 pPath = new QString(realPath(localxdgdatadir() + dirs->last())); 1025 pPath = new QString(realPath(localxdgdatadir() + dirs->last()));
1026 else if (strncmp(type, "xdgconf-", 8) == 0) 1026 else if (strncmp(type, "xdgconf-", 8) == 0)
1027 pPath = new QString(realPath(localxdgconfdir() + dirs->last())); 1027 pPath = new QString(realPath(localxdgconfdir() + dirs->last()));
1028 else 1028 else
1029 pPath = new QString(realPath(localkdedir() + dirs->last())); 1029 pPath = new QString(realPath(localkdedir() + dirs->last()));
1030 } 1030 }
1031 else { 1031 else {
1032 dirs = absolutes.find(type); 1032 dirs = absolutes.find(type);
1033 if (!dirs) 1033 if (!dirs)
1034 qFatal("KStandardDirs: The resource type %s is not registered", type); 1034 qFatal("KStandardDirs: The resource type %s is not registered", type);
1035 pPath = new QString(realPath(dirs->last())); 1035 pPath = new QString(realPath(dirs->last()));
1036 } 1036 }
1037 1037
1038 savelocations.insert(type, pPath); 1038 savelocations.insert(type, pPath);
1039 } 1039 }
1040 1040
1041 QString fullPath = *pPath + suffix; 1041 QString fullPath = *pPath + suffix;
1042//US struct stat st; 1042//US struct stat st;
1043//US if (stat(QFile::encodeName(fullPath), &st) != 0 || !(S_ISDIR(st.st_mode))) 1043//US if (stat(QFile::encodeName(fullPath), &st) != 0 || !(S_ISDIR(st.st_mode)))
1044 QFileInfo fullPathInfo(QFile::encodeName(fullPath)); 1044 QFileInfo fullPathInfo(QFile::encodeName(fullPath));
1045 if (fullPathInfo.isReadable() || !fullPathInfo.isDir()) 1045 if (fullPathInfo.isReadable() || !fullPathInfo.isDir())
1046 1046
1047 1047
1048 { 1048 {
1049 if(!create) { 1049 if(!create) {
1050#ifndef NDEBUG 1050#ifndef NDEBUG
1051 qDebug("save location %s doesn't exist", fullPath.latin1()); 1051 qDebug("save location %s doesn't exist", fullPath.latin1());
1052#endif 1052#endif
1053 return fullPath; 1053 return fullPath;
1054 } 1054 }
1055 if(!makeDir(fullPath, 0700)) { 1055 if(!makeDir(fullPath, 0700)) {
1056 qWarning("failed to create %s", fullPath.latin1()); 1056 qWarning("failed to create %s", fullPath.latin1());
1057 return fullPath; 1057 return fullPath;
1058 } 1058 }
1059 dircache.remove(type); 1059 dircache.remove(type);
1060 } 1060 }
1061 return fullPath; 1061 return fullPath;
1062} 1062}
1063 1063
1064QString KStandardDirs::relativeLocation(const char *type, const QString &absPath) 1064QString KStandardDirs::relativeLocation(const char *type, const QString &absPath)
1065{ 1065{
1066 QString fullPath = absPath; 1066 QString fullPath = absPath;
1067 int i = absPath.findRev('/'); 1067 int i = absPath.findRev('/');
1068 if (i != -1) 1068 if (i != -1)
1069 { 1069 {
1070 fullPath = realPath(absPath.left(i+1))+absPath.mid(i+1); // Normalize 1070 fullPath = realPath(absPath.left(i+1))+absPath.mid(i+1); // Normalize
1071 } 1071 }
1072 1072
1073 QStringList candidates = resourceDirs(type); 1073 QStringList candidates = resourceDirs(type);
1074 1074
1075 for (QStringList::ConstIterator it = candidates.begin(); 1075 for (QStringList::ConstIterator it = candidates.begin();
1076 it != candidates.end(); it++) 1076 it != candidates.end(); it++)
1077 if (fullPath.startsWith(*it)) 1077 if (fullPath.startsWith(*it))
1078 { 1078 {
1079 return fullPath.mid((*it).length()); 1079 return fullPath.mid((*it).length());
1080 } 1080 }
1081 1081
1082 return absPath; 1082 return absPath;
1083} 1083}
1084 1084
1085 1085
1086bool KStandardDirs::makeDir(const QString& dir2, int mode) 1086bool KStandardDirs::makeDir(const QString& dir2, int mode)
1087{ 1087{
1088 QString dir = QDir::convertSeparators( dir2 ); 1088 QString dir = QDir::convertSeparators( dir2 );
1089#if 0 1089#if 0
1090 //LR 1090 //LR
1091 1091
1092 // we want an absolute path 1092 // we want an absolute path
1093 if (dir.at(0) != '/') 1093 if (dir.at(0) != '/')
1094 return false; 1094 return false;
1095 1095
1096 QString target = dir; 1096 QString target = dir;
1097 uint len = target.length(); 1097 uint len = target.length();
1098 1098
1099 // append trailing slash if missing 1099 // append trailing slash if missing
1100 if (dir.at(len - 1) != '/') 1100 if (dir.at(len - 1) != '/')
1101 target += '/'; 1101 target += '/';
1102 1102
1103 QString base(""); 1103 QString base("");
1104 uint i = 1; 1104 uint i = 1;
1105 1105
1106 while( i < len ) 1106 while( i < len )
1107 { 1107 {
1108//US struct stat st; 1108//US struct stat st;
1109 int pos = target.find('/', i); 1109 int pos = target.find('/', i);
1110 base += target.mid(i - 1, pos - i + 1); 1110 base += target.mid(i - 1, pos - i + 1);
1111 QCString baseEncoded = QFile::encodeName(base); 1111 QCString baseEncoded = QFile::encodeName(base);
1112 // bail out if we encountered a problem 1112 // bail out if we encountered a problem
1113//US if (stat(baseEncoded, &st) != 0) 1113//US if (stat(baseEncoded, &st) != 0)
1114 QFileInfo baseEncodedInfo(baseEncoded); 1114 QFileInfo baseEncodedInfo(baseEncoded);
1115 if (!baseEncodedInfo.exists()) 1115 if (!baseEncodedInfo.exists())
1116 { 1116 {
1117 // Directory does not exist.... 1117 // Directory does not exist....
1118 // Or maybe a dangling symlink ? 1118 // Or maybe a dangling symlink ?
1119//US if (lstat(baseEncoded, &st) == 0) 1119//US if (lstat(baseEncoded, &st) == 0)
1120 if (baseEncodedInfo.isSymLink()) { 1120 if (baseEncodedInfo.isSymLink()) {
1121//US (void)unlink(baseEncoded); // try removing 1121//US (void)unlink(baseEncoded); // try removing
1122 QFile(baseEncoded).remove(); 1122 QFile(baseEncoded).remove();
1123 } 1123 }
1124 1124
1125 //US if ( mkdir(baseEncoded, (mode_t) mode) != 0) 1125 //US if ( mkdir(baseEncoded, (mode_t) mode) != 0)
1126 QDir dirObj; 1126 QDir dirObj;
1127 if ( dirObj.mkdir(baseEncoded) != true ) 1127 if ( dirObj.mkdir(baseEncoded) != true )
1128 { 1128 {
1129 //US perror("trying to create local folder"); 1129 //US perror("trying to create local folder");
1130 return false; // Couldn't create it :-( 1130 return false; // Couldn't create it :-(
1131 } 1131 }
1132 } 1132 }
1133 i = pos + 1; 1133 i = pos + 1;
1134 } 1134 }
1135 return true; 1135 return true;
1136#endif 1136#endif
1137 1137
1138 // ******************************************** 1138 // ********************************************
1139 // new code for WIN32 1139 // new code for WIN32
1140 QDir dirObj; 1140 QDir dirObj;
1141 1141
1142 1142
1143 // we want an absolute path 1143 // we want an absolute path
1144#ifndef _WIN32_ 1144#ifndef _WIN32_
1145 if (dir.at(0) != '/') 1145 if (dir.at(0) != '/')
1146 return false; 1146 return false;
1147#endif 1147#endif
1148 1148
1149 QString target = dir; 1149 QString target = dir;
1150 uint len = target.length(); 1150 uint len = target.length();
1151#ifndef _WIN32_ 1151#ifndef _WIN32_
1152 // append trailing slash if missing 1152 // append trailing slash if missing
1153 if (dir.at(len - 1) != '/') 1153 if (dir.at(len - 1) != '/')
1154 target += '/'; 1154 target += '/';
1155#endif 1155#endif
1156 1156
1157 QString base(""); 1157 QString base("");
1158 uint i = 1; 1158 uint i = 1;
1159 1159
1160 while( i < len ) 1160 while( i < len )
1161 { 1161 {
1162//US struct stat st; 1162//US struct stat st;
1163#ifndef _WIN32_ 1163#ifndef _WIN32_
1164 int pos = target.find('/', i); 1164 int pos = target.find('/', i);
1165#else 1165#else
1166 int pos = target.find('\\', i); 1166 int pos = target.find('\\', i);
1167#endif 1167#endif
1168 if ( pos < 0 ) 1168 if ( pos < 0 )
1169 return true; 1169 return true;
1170 base += target.mid(i - 1, pos - i + 1); 1170 base += target.mid(i - 1, pos - i + 1);
1171 //QMessageBox::information( 0,"cap111", base, 1 ); 1171 //QMessageBox::information( 0,"cap111", base, 1 );
1172/*US 1172/*US
1173 QCString baseEncoded = QFile::encodeName(base); 1173 QCString baseEncoded = QFile::encodeName(base);
1174 // bail out if we encountered a problem 1174 // bail out if we encountered a problem
1175 if (stat(baseEncoded, &st) != 0) 1175 if (stat(baseEncoded, &st) != 0)
1176 { 1176 {
1177 // Directory does not exist.... 1177 // Directory does not exist....
1178 // Or maybe a dangling symlink ? 1178 // Or maybe a dangling symlink ?
1179 if (lstat(baseEncoded, &st) == 0) 1179 if (lstat(baseEncoded, &st) == 0)
1180 (void)unlink(baseEncoded); // try removing 1180 (void)unlink(baseEncoded); // try removing
1181 1181
1182 1182
1183 if ( mkdir(baseEncoded, (mode_t) mode) != 0) { 1183 if ( mkdir(baseEncoded, (mode_t) mode) != 0) {
1184 perror("trying to create local folder"); 1184 perror("trying to create local folder");
1185 return false; // Couldn't create it :-( 1185 return false; // Couldn't create it :-(
1186 } 1186 }
1187 } 1187 }
1188*/ 1188*/
1189 1189
1190 if (dirObj.exists(base) == false) 1190 if (dirObj.exists(base) == false)
1191 { 1191 {
1192 //qDebug("KStandardDirs::makeDir try to create : %s" , base.latin1()); 1192 //qDebug("KStandardDirs::makeDir try to create : %s" , base.latin1());
1193 if (dirObj.mkdir(base) != true) 1193 if (dirObj.mkdir(base) != true)
1194 { 1194 {
1195 qDebug("KStandardDirs::makeDir could not create: %s" , base.latin1()); 1195 qDebug("KStandardDirs::makeDir could not create: %s" , base.latin1());
1196 return false; 1196 return false;
1197 } 1197 }
1198 } 1198 }
1199 1199
1200 i = pos + 1; 1200 i = pos + 1;
1201 } 1201 }
1202 return true; 1202 return true;
1203 1203
1204} 1204}
1205 1205
1206static QString readEnvPath(const char *env) 1206static QString readEnvPath(const char *env)
1207{ 1207{
1208 //#ifdef _WIN32_ 1208 //#ifdef _WIN32_
1209 // return ""; 1209 // return "";
1210 //#else 1210 //#else
1211 QCString c_path; 1211 QCString c_path;
1212 if ( getenv(env) != NULL ) 1212 if ( getenv(env) != NULL )
1213 c_path = QString ( getenv(env) ); 1213 c_path = QString ( getenv(env) );
1214 if (c_path.isEmpty()) 1214 if (c_path.isEmpty())
1215 return QString::null; 1215 return QString::null;
1216 return QFile::decodeName(c_path); 1216 return QFile::decodeName(c_path);
1217 //#endif 1217 //#endif
1218 1218
1219} 1219}
1220 1220
1221void KStandardDirs::addKDEDefaults() 1221void KStandardDirs::addKDEDefaults()
1222{ 1222{
1223 1223
1224 //qDebug("ERROR: KStandardDirs::addKDEDefaults() called "); 1224 //qDebug("ERROR: KStandardDirs::addKDEDefaults() called ");
1225 //return; 1225 //return;
1226 QStringList kdedirList; 1226 QStringList kdedirList;
1227 1227
1228 // begin KDEDIRS 1228 // begin KDEDIRS
1229 QString kdedirs = readEnvPath("MICROKDEDIRS"); 1229 QString kdedirs = readEnvPath("MICROKDEDIRS");
1230 if (!kdedirs.isEmpty()) 1230 if (!kdedirs.isEmpty())
1231 { 1231 {
1232 tokenize(kdedirList, kdedirs, ":"); 1232 tokenize(kdedirList, kdedirs, ":");
1233 } 1233 }
1234 else 1234 else
1235 { 1235 {
1236 QString kdedir = readEnvPath("MICROKDEDIR"); 1236 QString kdedir = readEnvPath("MICROKDEDIR");
1237 if (!kdedir.isEmpty()) 1237 if (!kdedir.isEmpty())
1238 { 1238 {
1239 kdedir = KShell::tildeExpand(kdedir); 1239 kdedir = KShell::tildeExpand(kdedir);
1240 kdedirList.append(kdedir); 1240 kdedirList.append(kdedir);
1241 } 1241 }
1242 } 1242 }
1243//US kdedirList.append(KDEDIR); 1243//US kdedirList.append(KDEDIR);
1244//US for embedded, add qtopia dir as kdedir 1244//US for embedded, add qtopia dir as kdedir
1245 1245
1246#ifndef DESKTOP_VERSION 1246#ifndef DESKTOP_VERSION
1247 QString tmp = readEnvPath("QPEDIR"); 1247 QString tmp = readEnvPath("QPEDIR");
1248 if (!tmp.isEmpty()) 1248 if (!tmp.isEmpty())
1249 kdedirList.append(tmp); 1249 kdedirList.append(tmp);
1250 1250
1251 tmp = readEnvPath("QTDIR"); 1251 tmp = readEnvPath("QTDIR");
1252 if (!tmp.isEmpty()) 1252 if (!tmp.isEmpty())
1253 kdedirList.append(tmp); 1253 kdedirList.append(tmp);
1254 1254
1255 tmp = readEnvPath("OPIEDIR"); 1255 tmp = readEnvPath("OPIEDIR");
1256 if (!tmp.isEmpty()) 1256 if (!tmp.isEmpty())
1257 kdedirList.append(tmp); 1257 kdedirList.append(tmp);
1258 1258
1259#endif 1259#endif
1260 1260
1261#ifdef __KDE_EXECPREFIX 1261#ifdef __KDE_EXECPREFIX
1262 QString execPrefix(__KDE_EXECPREFIX); 1262 QString execPrefix(__KDE_EXECPREFIX);
1263 if (execPrefix!="NONE") 1263 if (execPrefix!="NONE")
1264 kdedirList.append(execPrefix); 1264 kdedirList.append(execPrefix);
1265#endif 1265#endif
1266 1266
1267 QString localKdeDir; 1267 QString localKdeDir;
1268 1268
1269//US if (getuid()) 1269//US if (getuid())
1270 if (true) 1270 if (true)
1271 { 1271 {
1272 localKdeDir = readEnvPath("MICROKDEHOME"); 1272 localKdeDir = readEnvPath("MICROKDEHOME");
1273 if (!localKdeDir.isEmpty()) 1273 if (!localKdeDir.isEmpty())
1274 { 1274 {
1275#ifdef _WIN32_ 1275#ifdef _WIN32_
1276 if (localKdeDir.at(localKdeDir.length()-1) != '\\') 1276 if (localKdeDir.at(localKdeDir.length()-1) != '\\')
1277 localKdeDir += '\\'; 1277 localKdeDir += '\\';
1278#else 1278#else
1279 if (localKdeDir.at(localKdeDir.length()-1) != '/') 1279 if (localKdeDir.at(localKdeDir.length()-1) != '/')
1280 localKdeDir += '/'; 1280 localKdeDir += '/';
1281#endif 1281#endif
1282 //QMessageBox::information( 0,"localKdeDir",localKdeDir, 1 ); 1282 //QMessageBox::information( 0,"localKdeDir",localKdeDir, 1 );
1283 } 1283 }
1284 else 1284 else
1285 { 1285 {
1286 localKdeDir = QDir::homeDirPath() + "/kdepim/"; 1286 KConfig cfg ( QDir::homeDirPath() + "/.microkdehome" );
1287 cfg.setGroup("Global");
1288 localKdeDir = cfg.readEntry( "MICROKDEHOME", QDir::homeDirPath() + "/kdepim/" );
1287 } 1289 }
1288 } 1290 }
1289 else 1291 else
1290 { 1292 {
1291 // We treat root different to prevent root messing up the 1293 // We treat root different to prevent root messing up the
1292 // file permissions in the users home directory. 1294 // file permissions in the users home directory.
1293 localKdeDir = readEnvPath("MICROKDEROOTHOME"); 1295 localKdeDir = readEnvPath("MICROKDEROOTHOME");
1294 if (!localKdeDir.isEmpty()) 1296 if (!localKdeDir.isEmpty())
1295 { 1297 {
1296 if (localKdeDir.at(localKdeDir.length()-1) != '/') 1298 if (localKdeDir.at(localKdeDir.length()-1) != '/')
1297 localKdeDir += '/'; 1299 localKdeDir += '/';
1298 } 1300 }
1299 else 1301 else
1300 { 1302 {
1301//US struct passwd *pw = getpwuid(0); 1303//US struct passwd *pw = getpwuid(0);
1302//US localKdeDir = QFile::decodeName((pw && pw->pw_dir) ? pw->pw_dir : "/root") + "/.microkde/"; 1304//US localKdeDir = QFile::decodeName((pw && pw->pw_dir) ? pw->pw_dir : "/root") + "/.microkde/";
1303 qDebug("KStandardDirs::addKDEDefaults: 1 has to be fixed"); 1305 qDebug("KStandardDirs::addKDEDefaults: 1 has to be fixed");
1304 } 1306 }
1305 1307
1306 } 1308 }
1307 1309
1308//US localKdeDir = appDir(); 1310//US localKdeDir = appDir();
1309 1311
1310//US 1312//US
1311// qDebug("KStandardDirs::addKDEDefaults: localKdeDir=%s", localKdeDir.latin1()); 1313// qDebug("KStandardDirs::addKDEDefaults: localKdeDir=%s", localKdeDir.latin1());
1312 if (localKdeDir != "-/") 1314 if (localKdeDir != "-/")
1313 { 1315 {
1314 localKdeDir = KShell::tildeExpand(localKdeDir); 1316 localKdeDir = KShell::tildeExpand(localKdeDir);
1315 addPrefix(localKdeDir); 1317 addPrefix(localKdeDir);
1316 } 1318 }
1317 1319
1318 for (QStringList::ConstIterator it = kdedirList.begin(); 1320 for (QStringList::ConstIterator it = kdedirList.begin();
1319 it != kdedirList.end(); it++) 1321 it != kdedirList.end(); it++)
1320 { 1322 {
1321 QString dir = KShell::tildeExpand(*it); 1323 QString dir = KShell::tildeExpand(*it);
1322 addPrefix(dir); 1324 addPrefix(dir);
1323 } 1325 }
1324 // end KDEDIRS 1326 // end KDEDIRS
1325 1327
1326 // begin XDG_CONFIG_XXX 1328 // begin XDG_CONFIG_XXX
1327 QStringList xdgdirList; 1329 QStringList xdgdirList;
1328 QString xdgdirs = readEnvPath("XDG_CONFIG_DIRS"); 1330 QString xdgdirs = readEnvPath("XDG_CONFIG_DIRS");
1329 if (!xdgdirs.isEmpty()) 1331 if (!xdgdirs.isEmpty())
1330 { 1332 {
1331 tokenize(xdgdirList, xdgdirs, ":"); 1333 tokenize(xdgdirList, xdgdirs, ":");
1332 } 1334 }
1333 else 1335 else
1334 { 1336 {
1335 xdgdirList.clear(); 1337 xdgdirList.clear();
1336 xdgdirList.append("/etc/xdg"); 1338 xdgdirList.append("/etc/xdg");
1337 } 1339 }
1338 1340
1339 QString localXdgDir = readEnvPath("XDG_CONFIG_HOME"); 1341 QString localXdgDir = readEnvPath("XDG_CONFIG_HOME");
1340 if (!localXdgDir.isEmpty()) 1342 if (!localXdgDir.isEmpty())
1341 { 1343 {
1342 if (localXdgDir.at(localXdgDir.length()-1) != '/') 1344 if (localXdgDir.at(localXdgDir.length()-1) != '/')
1343 localXdgDir += '/'; 1345 localXdgDir += '/';
1344 } 1346 }
1345 else 1347 else
1346 { 1348 {
1347//US if (getuid()) 1349//US if (getuid())
1348 if (true) 1350 if (true)
1349 { 1351 {
1350 localXdgDir = QDir::homeDirPath() + "/.config/"; 1352 localXdgDir = QDir::homeDirPath() + "/.config/";
1351 } 1353 }
1352 else 1354 else
1353 { 1355 {
1354//US struct passwd *pw = getpwuid(0); 1356//US struct passwd *pw = getpwuid(0);
1355//US localXdgDir = QFile::decodeName((pw && pw->pw_dir) ? pw->pw_dir : "/root") + "/.config/"; 1357//US localXdgDir = QFile::decodeName((pw && pw->pw_dir) ? pw->pw_dir : "/root") + "/.config/";
1356 qDebug("KStandardDirs::addKDEDefaults: 2 has to be fixed"); 1358 qDebug("KStandardDirs::addKDEDefaults: 2 has to be fixed");
1357 } 1359 }
1358 } 1360 }
1359 1361
1360 localXdgDir = KShell::tildeExpand(localXdgDir); 1362 localXdgDir = KShell::tildeExpand(localXdgDir);
1361 addXdgConfigPrefix(localXdgDir); 1363 addXdgConfigPrefix(localXdgDir);
1362 1364
1363 for (QStringList::ConstIterator it = xdgdirList.begin(); 1365 for (QStringList::ConstIterator it = xdgdirList.begin();
1364 it != xdgdirList.end(); it++) 1366 it != xdgdirList.end(); it++)
1365 { 1367 {
1366 QString dir = KShell::tildeExpand(*it); 1368 QString dir = KShell::tildeExpand(*it);
1367 addXdgConfigPrefix(dir); 1369 addXdgConfigPrefix(dir);
1368 } 1370 }
1369 // end XDG_CONFIG_XXX 1371 // end XDG_CONFIG_XXX
1370 1372
1371 // begin XDG_DATA_XXX 1373 // begin XDG_DATA_XXX
1372 xdgdirs = readEnvPath("XDG_DATA_DIRS"); 1374 xdgdirs = readEnvPath("XDG_DATA_DIRS");
1373 if (!xdgdirs.isEmpty()) 1375 if (!xdgdirs.isEmpty())
1374 { 1376 {
1375 tokenize(xdgdirList, xdgdirs, ":"); 1377 tokenize(xdgdirList, xdgdirs, ":");
1376 } 1378 }
1377 else 1379 else
1378 { 1380 {
1379 xdgdirList.clear(); 1381 xdgdirList.clear();
1380 for (QStringList::ConstIterator it = kdedirList.begin(); 1382 for (QStringList::ConstIterator it = kdedirList.begin();
1381 it != kdedirList.end(); it++) 1383 it != kdedirList.end(); it++)
1382 { 1384 {
1383 QString dir = *it; 1385 QString dir = *it;
1384 if (dir.at(dir.length()-1) != '/') 1386 if (dir.at(dir.length()-1) != '/')
1385 dir += '/'; 1387 dir += '/';
1386 xdgdirList.append(dir+"share/"); 1388 xdgdirList.append(dir+"share/");
1387 } 1389 }
1388 1390
1389 xdgdirList.append("/usr/local/share/"); 1391 xdgdirList.append("/usr/local/share/");
1390 xdgdirList.append("/usr/share/"); 1392 xdgdirList.append("/usr/share/");
1391 } 1393 }
1392 1394
1393 localXdgDir = readEnvPath("XDG_DATA_HOME"); 1395 localXdgDir = readEnvPath("XDG_DATA_HOME");
1394 if (!localXdgDir.isEmpty()) 1396 if (!localXdgDir.isEmpty())
1395 { 1397 {
1396 if (localXdgDir.at(localXdgDir.length()-1) != '/') 1398 if (localXdgDir.at(localXdgDir.length()-1) != '/')
1397 localXdgDir += '/'; 1399 localXdgDir += '/';
1398 } 1400 }
1399 else 1401 else
1400 { 1402 {
1401//US if (getuid()) 1403//US if (getuid())
1402 if (true) 1404 if (true)
1403 { 1405 {
1404 localXdgDir = QDir::homeDirPath() + "/.local/share/"; 1406 localXdgDir = QDir::homeDirPath() + "/.local/share/";
1405 } 1407 }
1406 else 1408 else
1407 { 1409 {
1408//US struct passwd *pw = getpwuid(0); 1410//US struct passwd *pw = getpwuid(0);
1409//US localXdgDir = QFile::decodeName((pw && pw->pw_dir) ? pw->pw_dir : "/root") + "/.local/share/"; 1411//US localXdgDir = QFile::decodeName((pw && pw->pw_dir) ? pw->pw_dir : "/root") + "/.local/share/";
1410 qDebug("KStandardDirs::addKDEDefaults: 3 has to be fixed"); 1412 qDebug("KStandardDirs::addKDEDefaults: 3 has to be fixed");
1411 } 1413 }
1412 } 1414 }
1413 1415
1414 localXdgDir = KShell::tildeExpand(localXdgDir); 1416 localXdgDir = KShell::tildeExpand(localXdgDir);
1415 addXdgDataPrefix(localXdgDir); 1417 addXdgDataPrefix(localXdgDir);
1416 1418
1417 for (QStringList::ConstIterator it = xdgdirList.begin(); 1419 for (QStringList::ConstIterator it = xdgdirList.begin();
1418 it != xdgdirList.end(); it++) 1420 it != xdgdirList.end(); it++)
1419 { 1421 {
1420 QString dir = KShell::tildeExpand(*it); 1422 QString dir = KShell::tildeExpand(*it);
1421 1423
1422 addXdgDataPrefix(dir); 1424 addXdgDataPrefix(dir);
1423 } 1425 }
1424 // end XDG_DATA_XXX 1426 // end XDG_DATA_XXX
1425 1427
1426 1428
1427 uint index = 0; 1429 uint index = 0;
1428 while (types[index] != 0) { 1430 while (types[index] != 0) {
1429 addResourceType(types[index], kde_default(types[index])); 1431 addResourceType(types[index], kde_default(types[index]));
1430 index++; 1432 index++;
1431 } 1433 }
1432 1434
1433 addResourceDir("home", QDir::homeDirPath()); 1435 addResourceDir("home", QDir::homeDirPath());
1434} 1436}
1435 1437
1436void KStandardDirs::checkConfig() const 1438void KStandardDirs::checkConfig() const
1437{ 1439{
1438/*US 1440/*US
1439 if (!addedCustoms && KGlobal::_instance && KGlobal::_instance->_config) 1441 if (!addedCustoms && KGlobal::_instance && KGlobal::_instance->_config)
1440 const_cast<KStandardDirs*>(this)->addCustomized(KGlobal::_instance->_config); 1442 const_cast<KStandardDirs*>(this)->addCustomized(KGlobal::_instance->_config);
1441*/ 1443*/
1442 if (!addedCustoms && KGlobal::config()) 1444 if (!addedCustoms && KGlobal::config())
1443 const_cast<KStandardDirs*>(this)->addCustomized(KGlobal::config()); 1445 const_cast<KStandardDirs*>(this)->addCustomized(KGlobal::config());
1444} 1446}
1445 1447
1446bool KStandardDirs::addCustomized(KConfig *config) 1448bool KStandardDirs::addCustomized(KConfig *config)
1447{ 1449{
1448 if (addedCustoms) // there are already customized entries 1450 if (addedCustoms) // there are already customized entries
1449 return false; // we just quite and hope they are the right ones 1451 return false; // we just quite and hope they are the right ones
1450 1452
1451 // save the numbers of config directories. If this changes, 1453 // save the numbers of config directories. If this changes,
1452 // we will return true to give KConfig a chance to reparse 1454 // we will return true to give KConfig a chance to reparse
1453 uint configdirs = resourceDirs("config").count(); 1455 uint configdirs = resourceDirs("config").count();
1454 1456
1455 // reading the prefixes in 1457 // reading the prefixes in
1456 QString oldGroup = config->group(); 1458 QString oldGroup = config->group();
1457 config->setGroup("Directories"); 1459 config->setGroup("Directories");
1458 1460
1459 QStringList list; 1461 QStringList list;
1460 QStringList::ConstIterator it; 1462 QStringList::ConstIterator it;
1461 list = config->readListEntry("prefixes"); 1463 list = config->readListEntry("prefixes");
1462 for (it = list.begin(); it != list.end(); it++) 1464 for (it = list.begin(); it != list.end(); it++)
1463 addPrefix(*it); 1465 addPrefix(*it);
1464 1466
1465 // iterating over all entries in the group Directories 1467 // iterating over all entries in the group Directories
1466 // to find entries that start with dir_$type 1468 // to find entries that start with dir_$type
1467/*US 1469/*US
1468 QMap<QString, QString> entries = config->entryMap("Directories"); 1470 QMap<QString, QString> entries = config->entryMap("Directories");
1469 1471
1470 QMap<QString, QString>::ConstIterator it2; 1472 QMap<QString, QString>::ConstIterator it2;
1471 for (it2 = entries.begin(); it2 != entries.end(); it2++) 1473 for (it2 = entries.begin(); it2 != entries.end(); it2++)
1472 { 1474 {
1473 QString key = it2.key(); 1475 QString key = it2.key();
1474 if (key.left(4) == "dir_") { 1476 if (key.left(4) == "dir_") {
1475 // generate directory list, there may be more than 1. 1477 // generate directory list, there may be more than 1.
1476 QStringList dirs = QStringList::split(',', *it2); 1478 QStringList dirs = QStringList::split(',', *it2);
1477 QStringList::Iterator sIt(dirs.begin()); 1479 QStringList::Iterator sIt(dirs.begin());
1478 QString resType = key.mid(4, key.length()); 1480 QString resType = key.mid(4, key.length());
1479 for (; sIt != dirs.end(); ++sIt) { 1481 for (; sIt != dirs.end(); ++sIt) {
1480 addResourceDir(resType.latin1(), *sIt); 1482 addResourceDir(resType.latin1(), *sIt);
1481 } 1483 }
1482 } 1484 }
1483 } 1485 }
1484 1486
1485 // Process KIOSK restrictions. 1487 // Process KIOSK restrictions.
1486 config->setGroup("KDE Resource Restrictions"); 1488 config->setGroup("KDE Resource Restrictions");
1487 entries = config->entryMap("KDE Resource Restrictions"); 1489 entries = config->entryMap("KDE Resource Restrictions");
1488 for (it2 = entries.begin(); it2 != entries.end(); it2++) 1490 for (it2 = entries.begin(); it2 != entries.end(); it2++)
1489 { 1491 {
1490 QString key = it2.key(); 1492 QString key = it2.key();
1491 if (!config->readBoolEntry(key, true)) 1493 if (!config->readBoolEntry(key, true))
1492 { 1494 {
1493 d->restrictionsActive = true; 1495 d->restrictionsActive = true;
1494 d->restrictions.insert(key.latin1(), &d->restrictionsActive); // Anything will do 1496 d->restrictions.insert(key.latin1(), &d->restrictionsActive); // Anything will do
1495 dircache.remove(key.latin1()); 1497 dircache.remove(key.latin1());
1496 } 1498 }
1497 } 1499 }
1498*/ 1500*/
1499 // save it for future calls - that will return 1501 // save it for future calls - that will return
1500 addedCustoms = true; 1502 addedCustoms = true;
1501 config->setGroup(oldGroup); 1503 config->setGroup(oldGroup);
1502 1504
1503 // return true if the number of config dirs changed 1505 // return true if the number of config dirs changed
1504 return (resourceDirs("config").count() != configdirs); 1506 return (resourceDirs("config").count() != configdirs);
1505} 1507}
1506 1508
1507QString KStandardDirs::localkdedir() const 1509QString KStandardDirs::localkdedir() const
1508{ 1510{
1509 // Return the prefix to use for saving 1511 // Return the prefix to use for saving
1510 return prefixes.first(); 1512 return prefixes.first();
1511} 1513}
1512 1514
1513QString KStandardDirs::localxdgdatadir() const 1515QString KStandardDirs::localxdgdatadir() const
1514{ 1516{
1515 // Return the prefix to use for saving 1517 // Return the prefix to use for saving
1516 return d->xdgdata_prefixes.first(); 1518 return d->xdgdata_prefixes.first();
1517} 1519}
1518 1520
1519QString KStandardDirs::localxdgconfdir() const 1521QString KStandardDirs::localxdgconfdir() const
1520{ 1522{
1521 // Return the prefix to use for saving 1523 // Return the prefix to use for saving
1522 return d->xdgconf_prefixes.first(); 1524 return d->xdgconf_prefixes.first();
1523} 1525}
1524 1526
1525void KStandardDirs::setAppDir( const QString &appDir ) 1527void KStandardDirs::setAppDir( const QString &appDir )
1526{ 1528{
1527 mAppDir = appDir; 1529 mAppDir = appDir;
1528 1530
1529 if ( mAppDir.right( 1 ) != "/" ) 1531 if ( mAppDir.right( 1 ) != "/" )
1530 mAppDir += "/"; 1532 mAppDir += "/";
1531} 1533}
1532 1534
1533QString KStandardDirs::appDir() 1535QString KStandardDirs::appDir()
1534{ 1536{
1535 return mAppDir; 1537 return mAppDir;
1536} 1538}
1537 1539
1538// just to make code more readable without macros 1540// just to make code more readable without macros
1539QString locate( const char *type, 1541QString locate( const char *type,
1540 const QString& filename/*US , const KInstance* inst*/ ) 1542 const QString& filename/*US , const KInstance* inst*/ )
1541{ 1543{
1542//US return inst->dirs()->findResource(type, filename); 1544//US return inst->dirs()->findResource(type, filename);
1543 return KGlobal::dirs()->findResource(type, filename); 1545 return KGlobal::dirs()->findResource(type, filename);
1544} 1546}
1545 1547
1546QString locateLocal( const char *type, 1548QString locateLocal( const char *type,
1547 const QString& filename/*US , const KInstance* inst*/ ) 1549 const QString& filename/*US , const KInstance* inst*/ )
1548{ 1550{
1549 1551
1550 QString path = locateLocal(type, filename, true /*US, inst*/); 1552 QString path = locateLocal(type, filename, true /*US, inst*/);
1551 1553
1552 1554
1553/* 1555/*
1554 static int ccc = 0; 1556 static int ccc = 0;
1555 ++ccc; 1557 ++ccc;
1556 if ( ccc > 13 ) 1558 if ( ccc > 13 )
1557 abort(); 1559 abort();
1558*/ 1560*/
1559 //qDebug("locatelocal: %s" , path.latin1()); 1561 //qDebug("locatelocal: %s" , path.latin1());
1560 return path; 1562 return path;
1561 1563
1562/*US why do we put all files into one directory. It is quit complicated. 1564/*US why do we put all files into one directory. It is quit complicated.
1563why not staying with the original directorystructure ? 1565why not staying with the original directorystructure ?
1564 1566
1565 1567
1566 QString escapedFilename = filename; 1568 QString escapedFilename = filename;
1567 escapedFilename.replace( QRegExp( "/" ), "_" ); 1569 escapedFilename.replace( QRegExp( "/" ), "_" );
1568 1570
1569 QString path = KStandardDirs::appDir() + type + "_" + escapedFilename; 1571 QString path = KStandardDirs::appDir() + type + "_" + escapedFilename;
1570 1572
1571 kdDebug() << "locate: '" << path << "'" << endl; 1573 kdDebug() << "locate: '" << path << "'" << endl;
1572 qDebug("locate: %s" , path.latin1()); 1574 qDebug("locate: %s" , path.latin1());
1573 return path; 1575 return path;
1574*/ 1576*/
1575//US so my proposal is this: 1577//US so my proposal is this:
1576 1578
1577// QString escapedFilename = filename; 1579// QString escapedFilename = filename;
1578// escapedFilename.replace( QRegExp( "/" ), "_" ); 1580// escapedFilename.replace( QRegExp( "/" ), "_" );
1579 1581
1580#if 0 1582#if 0
1581#ifdef _WIN32_ 1583#ifdef _WIN32_
1582 QString path = QDir::convertSeparators(KStandardDirs::appDir() + type + "/" + filename); 1584 QString path = QDir::convertSeparators(KStandardDirs::appDir() + type + "/" + filename);
1583#else 1585#else
1584 QString path = KStandardDirs::appDir() + type + "/" + filename; 1586 QString path = KStandardDirs::appDir() + type + "/" + filename;
1585#endif 1587#endif
1586 1588
1587 //US Create the containing dir if needed 1589 //US Create the containing dir if needed
1588 QFileInfo fi ( path ); 1590 QFileInfo fi ( path );
1589 1591
1590 // QString dir=pathurl.directory(); 1592 // QString dir=pathurl.directory();
1591 //QMessageBox::information( 0,"path", path, 1 ); 1593 //QMessageBox::information( 0,"path", path, 1 );
1592 1594
1593#ifdef _WIN32_ 1595#ifdef _WIN32_
1594 KStandardDirs::makeDir(path); 1596 KStandardDirs::makeDir(path);
1595#else 1597#else
1596 KStandardDirs::makeDir(fi.dirPath( true )); 1598 KStandardDirs::makeDir(fi.dirPath( true ));
1597#endif 1599#endif
1598 1600
1599 qDebug("locate22: %s" , path.latin1()); 1601 qDebug("locate22: %s" , path.latin1());
1600 return path; 1602 return path;
1601 1603
1602#endif 1604#endif
1603 1605
1604} 1606}
1605 1607
1606QString locateLocal( const char *type, 1608QString locateLocal( const char *type,
1607 const QString& filename, bool createDir/*US , const KInstance* inst*/ ) 1609 const QString& filename, bool createDir/*US , const KInstance* inst*/ )
1608{ 1610{
1609 // try to find slashes. If there are some, we have to 1611 // try to find slashes. If there are some, we have to
1610 // create the subdir first 1612 // create the subdir first
1611 int slash = filename.findRev('/')+1; 1613 int slash = filename.findRev('/')+1;
1612 if (!slash) // only one filename 1614 if (!slash) // only one filename
1613 //USreturn inst->dirs()->saveLocation(type, QString::null, createDir) + filename; 1615 //USreturn inst->dirs()->saveLocation(type, QString::null, createDir) + filename;
1614 return KGlobal::dirs()->saveLocation(type, QString::null, createDir) + filename; 1616 return KGlobal::dirs()->saveLocation(type, QString::null, createDir) + filename;
1615 1617
1616 // split path from filename 1618 // split path from filename
1617 QString dir = filename.left(slash); 1619 QString dir = filename.left(slash);
1618 QString file = filename.mid(slash); 1620 QString file = filename.mid(slash);
1619//US return inst->dirs()->saveLocation(type, dir, createDir) + file; 1621//US return inst->dirs()->saveLocation(type, dir, createDir) + file;
1620 return KGlobal::dirs()->saveLocation(type, dir, createDir) + file; 1622 return KGlobal::dirs()->saveLocation(type, dir, createDir) + file;
1621 1623
1622 // *************************************************************** 1624 // ***************************************************************
1623#if 0 1625#if 0
1624 1626
1625/*US why do we put all files into one directory. It is quit complicated. 1627/*US why do we put all files into one directory. It is quit complicated.
1626why not staying with the original directorystructure ? 1628why not staying with the original directorystructure ?
1627 1629
1628 1630
1629 QString escapedFilename = filename; 1631 QString escapedFilename = filename;
1630 escapedFilename.replace( QRegExp( "/" ), "_" ); 1632 escapedFilename.replace( QRegExp( "/" ), "_" );
1631 1633
1632 QString path = KStandardDirs::appDir() + type + "_" + escapedFilename; 1634 QString path = KStandardDirs::appDir() + type + "_" + escapedFilename;
1633 1635
1634 kdDebug() << "locate: '" << path << "'" << endl; 1636 kdDebug() << "locate: '" << path << "'" << endl;
1635 qDebug("locate: %s" , path.latin1()); 1637 qDebug("locate: %s" , path.latin1());
1636 return path; 1638 return path;
1637*/ 1639*/
1638//US so my proposal is this: 1640//US so my proposal is this:
1639 1641
1640// QString escapedFilename = filename; 1642// QString escapedFilename = filename;
1641// escapedFilename.replace( QRegExp( "/" ), "_" ); 1643// escapedFilename.replace( QRegExp( "/" ), "_" );
1642 1644
1643#ifdef _WIN32_ 1645#ifdef _WIN32_
1644 QString path = QDir::convertSeparators(KStandardDirs::appDir() + type + "/" + filename); 1646 QString path = QDir::convertSeparators(KStandardDirs::appDir() + type + "/" + filename);
1645#else 1647#else
1646 QString path = KStandardDirs::appDir() + type + "/" + filename; 1648 QString path = KStandardDirs::appDir() + type + "/" + filename;
1647#endif 1649#endif
1648 1650
1649 //US Create the containing dir if needed 1651 //US Create the containing dir if needed
1650 KURL pathurl; 1652 KURL pathurl;
1651 pathurl.setPath(path); 1653 pathurl.setPath(path);
1652 QString dir=pathurl.directory(); 1654 QString dir=pathurl.directory();
1653 //QMessageBox::information( 0,"path", path, 1 ); 1655 //QMessageBox::information( 0,"path", path, 1 );
1654#ifdef _WIN32_ 1656#ifdef _WIN32_
1655 KStandardDirs::makeDir(path); 1657 KStandardDirs::makeDir(path);
1656#else 1658#else
1657 KStandardDirs::makeDir(dir); 1659 KStandardDirs::makeDir(dir);
1658#endif 1660#endif
1659 1661
1660 return path; 1662 return path;
1661#endif 1663#endif
1662} 1664}
diff --git a/microkde/kdecore/kstandarddirs.h b/microkde/kdecore/kstandarddirs.h
index c4e1108..bee864e 100644
--- a/microkde/kdecore/kstandarddirs.h
+++ b/microkde/kdecore/kstandarddirs.h
@@ -1,681 +1,681 @@
1/* 1/*
2 This file is part of the KDE libraries 2 This file is part of the KDE libraries
3 Copyright (C) 1999 Sirtaj Singh Kang <taj@kde.org> 3 Copyright (C) 1999 Sirtaj Singh Kang <taj@kde.org>
4 Stephan Kulow <coolo@kde.org> 4 Stephan Kulow <coolo@kde.org>
5 Waldo Bastian <bastian@kde.org> 5 Waldo Bastian <bastian@kde.org>
6 6
7 This library is free software; you can redistribute it and/or 7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Library General Public 8 modify it under the terms of the GNU Library General Public
9 License as published by the Free Software Foundation; either 9 License as published by the Free Software Foundation; either
10 version 2 of the License, or (at your option) any later version. 10 version 2 of the License, or (at your option) any later version.
11 11
12 This library is distributed in the hope that it will be useful, 12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Library General Public License for more details. 15 Library General Public License for more details.
16 16
17 You should have received a copy of the GNU Library General Public License 17 You should have received a copy of the GNU Library General Public License
18 along with this library; see the file COPYING.LIB. If not, write to 18 along with this library; see the file COPYING.LIB. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. 20 Boston, MA 02111-1307, USA.
21*/ 21*/
22 22
23#ifndef SSK_KSTDDIRS_H 23#ifndef SSK_KSTDDIRS_H
24#define SSK_KSTDDIRS_H 24#define SSK_KSTDDIRS_H
25 25
26#include <qstring.h> 26#include <qstring.h>
27#include <qdict.h> 27#include <qdict.h>
28#include <qstringlist.h> 28#include <qstringlist.h>
29#include <kglobal.h> 29#include <kglobal.h>
30 30
31class KConfig; 31class KConfig;
32class KStandardDirsPrivate; 32class KStandardDirsPrivate;
33 33
34 34
35/** 35/**
36 * @short Site-independent access to standard KDE directories. 36 * @short Site-independent access to standard KDE directories.
37 * @author Stephan Kulow <coolo@kde.org> and Sirtaj Singh Kang <taj@kde.org> 37 * @author Stephan Kulow <coolo@kde.org> and Sirtaj Singh Kang <taj@kde.org>
38 * @version $Id$ 38 * @version $Id$
39 * 39 *
40 * This is one of the most central classes in kdelibs as 40 * This is one of the most central classes in kdelibs as
41 * it provides a basic service: It knows where the files 41 * it provides a basic service: It knows where the files
42 * reside on the user's hard disk. And it's meant to be the 42 * reside on the user's hard disk. And it's meant to be the
43 * only one that knows -- to make the real location as 43 * only one that knows -- to make the real location as
44 * transparent as possible to both the user and the applications. 44 * transparent as possible to both the user and the applications.
45 * 45 *
46 * To this end it insulates the application from all information 46 * To this end it insulates the application from all information
47 * and applications always refer to a file with a resource type 47 * and applications always refer to a file with a resource type
48 * (e.g. icon) and a filename (e.g. khexdit.xpm). In an ideal world 48 * (e.g. icon) and a filename (e.g. khexdit.xpm). In an ideal world
49 * the application would make no assumption where this file is and 49 * the application would make no assumption where this file is and
50 * leave it up to @ref KStandardDirs::findResource("apps", "Home.desktop") 50 * leave it up to @ref KStandardDirs::findResource("apps", "Home.desktop")
51 * to apply this knowledge to return /opt/kde/share/applnk/Home.desktop 51 * to apply this knowledge to return /opt/kde/share/applnk/Home.desktop
52 * or ::locate("data", "kgame/background.jpg") to return 52 * or ::locate("data", "kgame/background.jpg") to return
53 * /opt/kde/share/apps/kgame/background.jpg 53 * /opt/kde/share/apps/kgame/background.jpg
54 * 54 *
55 * The main idea behind KStandardDirs is that there are several 55 * The main idea behind KStandardDirs is that there are several
56 * toplevel prefixes below which the files lie. One of these prefixes is 56 * toplevel prefixes below which the files lie. One of these prefixes is
57 * the one where the user installed kdelibs, one is where the 57 * the one where the user installed kdelibs, one is where the
58 * application was installed, and one is $HOME/.kde, but there 58 * application was installed, and one is $HOME/.kde, but there
59 * may be even more. Under these prefixes there are several well 59 * may be even more. Under these prefixes there are several well
60 * defined suffixes where specific resource types are to be found. 60 * defined suffixes where specific resource types are to be found.
61 * For example, for the resource type "html" the suffixes could be 61 * For example, for the resource type "html" the suffixes could be
62 * share/doc/HTML and share/doc/kde/HTML. 62 * share/doc/HTML and share/doc/kde/HTML.
63 * So the search algorithm basicly appends to each prefix each registered 63 * So the search algorithm basicly appends to each prefix each registered
64 * suffix and tries to locate the file there. 64 * suffix and tries to locate the file there.
65 * To make the thing even more complex, it's also possible to register 65 * To make the thing even more complex, it's also possible to register
66 * absolute paths that KStandardDirs looks up after not finding anything 66 * absolute paths that KStandardDirs looks up after not finding anything
67 * in the former steps. They can be useful if the user wants to provide 67 * in the former steps. They can be useful if the user wants to provide
68 * specific directories that aren't in his $HOME/.kde directory for, 68 * specific directories that aren't in his $HOME/.kde directory for,
69 * for example, icons. 69 * for example, icons.
70 * 70 *
71 * @sect Standard resources that kdelibs allocates are: 71 * @sect Standard resources that kdelibs allocates are:
72 * 72 *
73 * @li apps - Applications menu (.desktop files). 73 * @li apps - Applications menu (.desktop files).
74 * @li cache - Cached information (e.g. favicons, web-pages) 74 * @li cache - Cached information (e.g. favicons, web-pages)
75 * @li cgi - CGIs to run from kdehelp. 75 * @li cgi - CGIs to run from kdehelp.
76 * @li config - Configuration files. 76 * @li config - Configuration files.
77 * @li data - Where applications store data. 77 * @li data - Where applications store data.
78 * @li exe - Executables in $prefix/bin. @ref findExe() for a function that takes $PATH into account. 78 * @li exe - Executables in $prefix/bin. @ref findExe() for a function that takes $PATH into account.
79 * @li html - HTML documentation. 79 * @li html - HTML documentation.
80 * @li icon - Icons, see @ref KIconLoader. 80 * @li icon - Icons, see @ref KIconLoader.
81 * @li lib - Libraries. 81 * @li lib - Libraries.
82 * @li locale - Translation files for @ref KLocale. 82 * @li locale - Translation files for @ref KLocale.
83 * @li mime - Mime types. 83 * @li mime - Mime types.
84 * @li module - Module (dynamically loaded library). 84 * @li module - Module (dynamically loaded library).
85 * @li qtplugins - Qt plugins (dynamically loaded objects for Qt) 85 * @li qtplugins - Qt plugins (dynamically loaded objects for Qt)
86 * @li services - Services. 86 * @li services - Services.
87 * @li servicetypes - Service types. 87 * @li servicetypes - Service types.
88 * @li scripts - Application scripting additions. 88 * @li scripts - Application scripting additions.
89 * @li sound - Application sounds. 89 * @li sound - Application sounds.
90 * @li templates - Templates 90 * @li templates - Templates
91 * @li wallpaper - Wallpapers. 91 * @li wallpaper - Wallpapers.
92 * @li tmp - Temporary files (specfic for both current host and current user) 92 * @li tmp - Temporary files (specfic for both current host and current user)
93 * @li socket - UNIX Sockets (specific for both current host and current user) 93 * @li socket - UNIX Sockets (specific for both current host and current user)
94 * 94 *
95 * A type that is added by the class @ref KApplication if you use it, is 95 * A type that is added by the class @ref KApplication if you use it, is
96 * appdata. This one makes the use of the type data a bit easier as it 96 * appdata. This one makes the use of the type data a bit easier as it
97 * appends the name of the application. 97 * appends the name of the application.
98 * So while you had to ::locate("data", "appname/filename") so you can 98 * So while you had to ::locate("data", "appname/filename") so you can
99 * also write ::locate("appdata", "filename") if your KApplication instance 99 * also write ::locate("appdata", "filename") if your KApplication instance
100 * is called "appname" (as set via KApplication's constructor or KAboutData, if 100 * is called "appname" (as set via KApplication's constructor or KAboutData, if
101 * you use the global KStandardDirs object @ref KGlobal::dirs()). 101 * you use the global KStandardDirs object @ref KGlobal::dirs()).
102 * Please note though that you cannot use the "appdata" 102 * Please note though that you cannot use the "appdata"
103 * type if you intend to use it in an applet for Kicker because 'appname' would 103 * type if you intend to use it in an applet for Kicker because 'appname' would
104 * be "Kicker" instead of the applet's name. Therefore, for applets, you've got 104 * be "Kicker" instead of the applet's name. Therefore, for applets, you've got
105 * to work around this by using ::locate("data", "appletname/filename"). 105 * to work around this by using ::locate("data", "appletname/filename").
106 * 106 *
107 * @sect KStandardDirs supports the following environment variables: 107 * @sect KStandardDirs supports the following environment variables:
108 * 108 *
109 * @li KDEDIRS: This may set an additional number of directory prefixes to 109 * @li KDEDIRS: This may set an additional number of directory prefixes to
110 * search for resources. The directories should be seperated 110 * search for resources. The directories should be seperated
111 * by ':'. The directories are searched in the order they are 111 * by ':'. The directories are searched in the order they are
112 * specified. 112 * specified.
113 * @li KDEDIR: Used for backwards compatibility. As KDEDIRS but only a single 113 * @li KDEDIR: Used for backwards compatibility. As KDEDIRS but only a single
114 * directory may be specified. If KDEDIRS is set KDEDIR is 114 * directory may be specified. If KDEDIRS is set KDEDIR is
115 * ignored. 115 * ignored.
116 * @li KDEHOME: The directory where changes are saved to. This directory is 116 * @li KDEHOME: The directory where changes are saved to. This directory is
117 * used to search for resources first. If KDEHOME is not 117 * used to search for resources first. If KDEHOME is not
118 * specified it defaults to "$HOME/.kde" 118 * specified it defaults to "$HOME/.kde"
119 * @li KDEROOTHOME: Like KDEHOME, but used for the root user. 119 * @li KDEROOTHOME: Like KDEHOME, but used for the root user.
120 * If KDEROOTHOME is not set it defaults to the .kde directory in the 120 * If KDEROOTHOME is not set it defaults to the .kde directory in the
121 * home directory of root, usually "/root/.kde". 121 * home directory of root, usually "/root/.kde".
122 * Note that the setting of $HOME is ignored in this case. 122 * Note that the setting of $HOME is ignored in this case.
123 * 123 *
124 * @see KGlobalSettings 124 * @see KGlobalSettings
125 */ 125 */
126class KStandardDirs 126class KStandardDirs
127{ 127{
128public: 128public:
129 /** 129 /**
130 * KStandardDirs' constructor. It just initializes the caches. 130 * KStandardDirs' constructor. It just initializes the caches.
131 **/ 131 **/
132 KStandardDirs( ); 132 KStandardDirs( );
133 133
134 /** 134 /**
135 * KStandardDirs' destructor. 135 * KStandardDirs' destructor.
136 */ 136 */
137 virtual ~KStandardDirs(); 137 virtual ~KStandardDirs();
138 138
139 /** 139 /**
140 * Adds another search dir to front of the @p fsstnd list. 140 * Adds another search dir to front of the @p fsstnd list.
141 * 141 *
142 * @li When compiling kdelibs, the prefix is added to this. 142 * @li When compiling kdelibs, the prefix is added to this.
143 * @li KDEDIRS or KDEDIR is taking into account 143 * @li KDEDIRS or KDEDIR is taking into account
144 * @li Additional dirs may be loaded from kdeglobals. 144 * @li Additional dirs may be loaded from kdeglobals.
145 * 145 *
146 * @param dir The directory to append relative paths to. 146 * @param dir The directory to append relative paths to.
147 */ 147 */
148 void addPrefix( const QString& dir ); 148 void addPrefix( const QString& dir );
149 149
150 /** 150 /**
151 * Adds another search dir to front of the XDG_CONFIG_XXX list 151 * Adds another search dir to front of the XDG_CONFIG_XXX list
152 * of prefixes. 152 * of prefixes.
153 * This prefix is only used for resources that start with "xdgconf-" 153 * This prefix is only used for resources that start with "xdgconf-"
154 * 154 *
155 * @param dir The directory to append relative paths to. 155 * @param dir The directory to append relative paths to.
156 */ 156 */
157 void addXdgConfigPrefix( const QString& dir ); 157 void addXdgConfigPrefix( const QString& dir );
158 158
159 /** 159 /**
160 * Adds another search dir to front of the XDG_DATA_XXX list 160 * Adds another search dir to front of the XDG_DATA_XXX list
161 * of prefixes. 161 * of prefixes.
162 * This prefix is only used for resources that start with "xdgdata-" 162 * This prefix is only used for resources that start with "xdgdata-"
163 * 163 *
164 * @param dir The directory to append relative paths to. 164 * @param dir The directory to append relative paths to.
165 */ 165 */
166 void addXdgDataPrefix( const QString& dir ); 166 void addXdgDataPrefix( const QString& dir );
167 167
168 /** 168 /**
169 * Adds suffixes for types. 169 * Adds suffixes for types.
170 * 170 *
171 * You may add as many as you need, but it is advised that there 171 * You may add as many as you need, but it is advised that there
172 * is exactly one to make writing definite. 172 * is exactly one to make writing definite.
173 * All basic types (@ref kde_default) are added by @ref addKDEDefaults(), 173 * All basic types (@ref kde_default) are added by @ref addKDEDefaults(),
174 * but for those you can add more relative paths as well. 174 * but for those you can add more relative paths as well.
175 * 175 *
176 * The later a suffix is added, the higher its priority. Note, that the 176 * The later a suffix is added, the higher its priority. Note, that the
177 * suffix should end with / but doesn't have to start with one (as prefixes 177 * suffix should end with / but doesn't have to start with one (as prefixes
178 * should end with one). So adding a suffix for app_pics would look 178 * should end with one). So adding a suffix for app_pics would look
179 * like KGlobal::dirs()->addResourceType("app_pics", "share/app/pics"); 179 * like KGlobal::dirs()->addResourceType("app_pics", "share/app/pics");
180 * 180 *
181 * @param type Specifies a short descriptive string to access 181 * @param type Specifies a short descriptive string to access
182 * files of this type. 182 * files of this type.
183 * @param relativename Specifies a directory relative to the root 183 * @param relativename Specifies a directory relative to the root
184 * of the KFSSTND. 184 * of the KFSSTND.
185 * @return true if successful, false otherwise. 185 * @return true if successful, false otherwise.
186 */ 186 */
187 bool addResourceType( const char *type, 187 bool addResourceType( const char *type,
188 const QString& relativename ); 188 const QString& relativename );
189 189
190 /** 190 /**
191 * Adds absolute path at the end of the search path for 191 * Adds absolute path at the end of the search path for
192 * particular types (for example in case of icons where 192 * particular types (for example in case of icons where
193 * the user specifies extra paths). 193 * the user specifies extra paths).
194 * 194 *
195 * You shouldn't need this 195 * You shouldn't need this
196 * function in 99% of all cases besides adding user-given 196 * function in 99% of all cases besides adding user-given
197 * paths. 197 * paths.
198 * 198 *
199 * @param type Specifies a short descriptive string to access files 199 * @param type Specifies a short descriptive string to access files
200 * of this type. 200 * of this type.
201 * @param absdir Points to directory where to look for this specific 201 * @param absdir Points to directory where to look for this specific
202 * type. Non-existant directories may be saved but pruned. 202 * type. Non-existant directories may be saved but pruned.
203 * @return true if successful, false otherwise. 203 * @return true if successful, false otherwise.
204 */ 204 */
205 bool addResourceDir( const char *type, 205 bool addResourceDir( const char *type,
206 const QString& absdir); 206 const QString& absdir);
207 207
208 /** 208 /**
209 * Tries to find a resource in the following order: 209 * Tries to find a resource in the following order:
210 * @li All PREFIX/\<relativename> paths (most recent first). 210 * @li All PREFIX/\<relativename> paths (most recent first).
211 * @li All absolute paths (most recent first). 211 * @li All absolute paths (most recent first).
212 * 212 *
213 * The filename should be a filename relative to the base dir 213 * The filename should be a filename relative to the base dir
214 * for resources. So is a way to get the path to libkdecore.la 214 * for resources. So is a way to get the path to libkdecore.la
215 * to findResource("lib", "libkdecore.la"). KStandardDirs will 215 * to findResource("lib", "libkdecore.la"). KStandardDirs will
216 * then look into the subdir lib of all elements of all prefixes 216 * then look into the subdir lib of all elements of all prefixes
217 * ($KDEDIRS) for a file libkdecore.la and return the path to 217 * ($KDEDIRS) for a file libkdecore.la and return the path to
218 * the first one it finds (e.g. /opt/kde/lib/libkdecore.la) 218 * the first one it finds (e.g. /opt/kde/lib/libkdecore.la)
219 * 219 *
220 * @param type The type of the wanted resource 220 * @param type The type of the wanted resource
221 * @param filename A relative filename of the resource. 221 * @param filename A relative filename of the resource.
222 * 222 *
223 * @return A full path to the filename specified in the second 223 * @return A full path to the filename specified in the second
224 * argument, or QString::null if not found. 224 * argument, or QString::null if not found.
225 */ 225 */
226 QString findResource( const char *type, 226 QString findResource( const char *type,
227 const QString& filename ) const; 227 const QString& filename ) const;
228 228
229 /** 229 /**
230 * Checks whether a resource is restricted as part of the KIOSK 230 * Checks whether a resource is restricted as part of the KIOSK
231 * framework. When a resource is restricted it means that user- 231 * framework. When a resource is restricted it means that user-
232 * specific files in the resource are ignored. 232 * specific files in the resource are ignored.
233 * 233 *
234 * E.g. by restricting the "wallpaper" resource, only system-wide 234 * E.g. by restricting the "wallpaper" resource, only system-wide
235 * installed wallpapers will be found by this class. Wallpapers 235 * installed wallpapers will be found by this class. Wallpapers
236 * installed under the $KDEHOME directory will be ignored. 236 * installed under the $KDEHOME directory will be ignored.
237 * 237 *
238 * @param type The type of the resource to check 238 * @param type The type of the resource to check
239 * @param relPath A relative path in the resource. 239 * @param relPath A relative path in the resource.
240 * 240 *
241 * @return True if the resource is restricted. 241 * @return True if the resource is restricted.
242 * @since 3.1 242 * @since 3.1
243 */ 243 */
244 bool isRestrictedResource( const char *type, 244 bool isRestrictedResource( const char *type,
245 const QString& relPath=QString::null ) const; 245 const QString& relPath=QString::null ) const;
246 246
247 /** 247 /**
248 * Returns a number that identifies this version of the resource. 248 * Returns a number that identifies this version of the resource.
249 * When a change is made to the resource this number will change. 249 * When a change is made to the resource this number will change.
250 * 250 *
251 * @param type The type of the wanted resource 251 * @param type The type of the wanted resource
252 * @param filename A relative filename of the resource. 252 * @param filename A relative filename of the resource.
253 * @param deep If true, all resources are taken into account 253 * @param deep If true, all resources are taken into account
254 * otherwise only the one returned by findResource(). 254 * otherwise only the one returned by findResource().
255 * 255 *
256 * @return A number identifying the current version of the 256 * @return A number identifying the current version of the
257 * resource. 257 * resource.
258 */ 258 */
259/*US 259/*US
260 Q_UINT32 calcResourceHash( const char *type, 260 Q_UINT32 calcResourceHash( const char *type,
261 const QString& filename, bool deep) const; 261 const QString& filename, bool deep) const;
262*/ 262*/
263 /** 263 /**
264 * Tries to find all directories whose names consist of the 264 * Tries to find all directories whose names consist of the
265 * specified type and a relative path. So would 265 * specified type and a relative path. So would
266 * findDirs("apps", "Settings") return 266 * findDirs("apps", "Settings") return
267 * @li /opt/kde/share/applnk/Settings/ 267 * @li /opt/kde/share/applnk/Settings/
268 * @li /home/joe/.kde/share/applnk/Settings/ 268 * @li /home/joe/.kde/share/applnk/Settings/
269 * 269 *
270 * Note that it appends / to the end of the directories, 270 * Note that it appends / to the end of the directories,
271 * so you can use this right away as directory names. 271 * so you can use this right away as directory names.
272 * 272 *
273 * @param type The type of the base directory. 273 * @param type The type of the base directory.
274 * @param reldir Relative directory. 274 * @param reldir Relative directory.
275 * 275 *
276 * @return A list of matching directories, or an empty 276 * @return A list of matching directories, or an empty
277 * list if the resource specified is not found. 277 * list if the resource specified is not found.
278 */ 278 */
279 QStringList findDirs( const char *type, 279 QStringList findDirs( const char *type,
280 const QString& reldir ) const; 280 const QString& reldir ) const;
281 281
282 /** 282 /**
283 * Tries to find the directory the file is in. 283 * Tries to find the directory the file is in.
284 * It works the same as @ref findResource(), but it doesn't 284 * It works the same as @ref findResource(), but it doesn't
285 * return the filename but the name of the directory. 285 * return the filename but the name of the directory.
286 * 286 *
287 * This way the application can access a couple of files 287 * This way the application can access a couple of files
288 * that have been installed into the same directory without 288 * that have been installed into the same directory without
289 * having to look for each file. 289 * having to look for each file.
290 * 290 *
291 * findResourceDir("lib", "libkdecore.la") would return the 291 * findResourceDir("lib", "libkdecore.la") would return the
292 * path of the subdir libkdecore.la is found first in 292 * path of the subdir libkdecore.la is found first in
293 * (e.g. /opt/kde/lib/) 293 * (e.g. /opt/kde/lib/)
294 * 294 *
295 * @param type The type of the wanted resource 295 * @param type The type of the wanted resource
296 * @param filename A relative filename of the resource. 296 * @param filename A relative filename of the resource.
297 * @return The directory where the file specified in the second 297 * @return The directory where the file specified in the second
298 * argument is located, or QString::null if the type 298 * argument is located, or QString::null if the type
299 * of resource specified is unknown or the resource 299 * of resource specified is unknown or the resource
300 * cannot be found. 300 * cannot be found.
301 */ 301 */
302 QString findResourceDir( const char *type, 302 QString findResourceDir( const char *type,
303 const QString& filename) const; 303 const QString& filename) const;
304 304
305 305
306 /** 306 /**
307 * Tries to find all resources with the specified type. 307 * Tries to find all resources with the specified type.
308 * 308 *
309 * The function will look into all specified directories 309 * The function will look into all specified directories
310 * and return all filenames in these directories. 310 * and return all filenames in these directories.
311 * 311 *
312 * @param type The type of resource to locate directories for. 312 * @param type The type of resource to locate directories for.
313 * @param filter Only accept filenames that fit to filter. The filter 313 * @param filter Only accept filenames that fit to filter. The filter
314 * may consist of an optional directory and a @ref QRegExp 314 * may consist of an optional directory and a @ref QRegExp
315 * wildcard expression. E.g. "images\*.jpg". Use QString::null 315 * wildcard expression. E.g. "images\*.jpg". Use QString::null
316 * if you do not want a filter. 316 * if you do not want a filter.
317 * @param recursive Specifies if the function should decend 317 * @param recursive Specifies if the function should decend
318 * into subdirectories. 318 * into subdirectories.
319 * @param uniq If specified, only return items which have 319 * @param uniq If specified, only return items which have
320 * unique suffixes - suppressing duplicated filenames. 320 * unique suffixes - suppressing duplicated filenames.
321 * 321 *
322 * @return A list of directories matching the resource specified, 322 * @return A list of directories matching the resource specified,
323 * or an empty list if the resource type is unknown. 323 * or an empty list if the resource type is unknown.
324 */ 324 */
325 QStringList findAllResources( const char *type, 325 QStringList findAllResources( const char *type,
326 const QString& filter = QString::null, 326 const QString& filter = QString::null,
327 bool recursive = false, 327 bool recursive = false,
328 bool uniq = false) const; 328 bool uniq = false) const;
329 329
330 /** 330 /**
331 * Tries to find all resources with the specified type. 331 * Tries to find all resources with the specified type.
332 * 332 *
333 * The function will look into all specified directories 333 * The function will look into all specified directories
334 * and return all filenames (full and relative paths) in 334 * and return all filenames (full and relative paths) in
335 * these directories. 335 * these directories.
336 * 336 *
337 * @param type The type of resource to locate directories for. 337 * @param type The type of resource to locate directories for.
338 * @param filter Only accept filenames that fit to filter. The filter 338 * @param filter Only accept filenames that fit to filter. The filter
339 * may consist of an optional directory and a @ref QRegExp 339 * may consist of an optional directory and a @ref QRegExp
340 * wildcard expression. E.g. "images\*.jpg". Use QString::null 340 * wildcard expression. E.g. "images\*.jpg". Use QString::null
341 * if you do not want a filter. 341 * if you do not want a filter.
342 * @param recursive Specifies if the function should decend 342 * @param recursive Specifies if the function should decend
343 * into subdirectories. 343 * into subdirectories.
344 * @param uniq If specified, only return items which have 344 * @param uniq If specified, only return items which have
345 * unique suffixes. 345 * unique suffixes.
346 * @param list Of relative paths for the given type. 346 * @param list Of relative paths for the given type.
347 * @param relPaths The list to store the relative paths into 347 * @param relPaths The list to store the relative paths into
348 * These can be used later to ::locate() the file 348 * These can be used later to ::locate() the file
349 * 349 *
350 * @return A list of directories matching the resource specified, 350 * @return A list of directories matching the resource specified,
351 * or an empty list if the resource type is unknown. 351 * or an empty list if the resource type is unknown.
352 */ 352 */
353 QStringList findAllResources( const char *type, 353 QStringList findAllResources( const char *type,
354 const QString& filter, 354 const QString& filter,
355 bool recursive, 355 bool recursive,
356 bool uniq, 356 bool uniq,
357 QStringList &relPaths) const; 357 QStringList &relPaths) const;
358 358
359 /** 359 /**
360 * Finds the executable in the system path. 360 * Finds the executable in the system path.
361 * 361 *
362 * A valid executable must 362 * A valid executable must
363 * be a file and have its executable bit set. 363 * be a file and have its executable bit set.
364 * 364 *
365 * @param appname The name of the executable file for which to search. 365 * @param appname The name of the executable file for which to search.
366 * @param pathstr The path which will be searched. If this is 366 * @param pathstr The path which will be searched. If this is
367 * null (default), the $PATH environment variable will 367 * null (default), the $PATH environment variable will
368 * be searched. 368 * be searched.
369 * @param ignoreExecBitIf true, an existing file will be returned 369 * @param ignoreExecBitIf true, an existing file will be returned
370 * even if its executable bit is not set. 370 * even if its executable bit is not set.
371 * 371 *
372 * @return The path of the executable. If it was not found, 372 * @return The path of the executable. If it was not found,
373 * it will return QString::null. 373 * it will return QString::null.
374 * @see findAllExe() 374 * @see findAllExe()
375 */ 375 */
376/*US 376/*US
377 static QString findExe( const QString& appname, 377 static QString findExe( const QString& appname,
378 const QString& pathstr=QString::null, 378 const QString& pathstr=QString::null,
379 bool ignoreExecBit=false ); 379 bool ignoreExecBit=false );
380*/ 380*/
381 381
382 /** 382 /**
383 * Finds all occurences of an executable in the system path. 383 * Finds all occurences of an executable in the system path.
384 * 384 *
385 * @param listWill be filled with the pathnames of all the 385 * @param listWill be filled with the pathnames of all the
386 * executables found. Will be empty if the executable 386 * executables found. Will be empty if the executable
387 * was not found. 387 * was not found.
388 * @param appnameThe name of the executable for which to 388 * @param appnameThe name of the executable for which to
389 * search. 389 * search.
390 * @param pathstrThe path list which will be searched. If this 390 * @param pathstrThe path list which will be searched. If this
391 * is 0 (default), the $PATH environment variable will 391 * is 0 (default), the $PATH environment variable will
392 * be searched. 392 * be searched.
393 * @param ignoreExecBit If true, an existing file will be returned 393 * @param ignoreExecBit If true, an existing file will be returned
394 * even if its executable bit is not set. 394 * even if its executable bit is not set.
395 * 395 *
396 * @return The number of executables found, 0 if none were found. 396 * @return The number of executables found, 0 if none were found.
397 * 397 *
398 * @seefindExe() 398 * @seefindExe()
399 */ 399 */
400 static int findAllExe( QStringList& list, const QString& appname, 400 static int findAllExe( QStringList& list, const QString& appname,
401 const QString& pathstr=QString::null, 401 const QString& pathstr=QString::null,
402 bool ignoreExecBit=false ); 402 bool ignoreExecBit=false );
403 403
404 /** 404 /**
405 * This function adds the defaults that are used by the current 405 * This function adds the defaults that are used by the current
406 * KDE version. 406 * KDE version.
407 * 407 *
408 * It's a series of @ref addResourceTypes() 408 * It's a series of @ref addResourceTypes()
409 * and @ref addPrefix() calls. 409 * and @ref addPrefix() calls.
410 * You normally wouldn't call this function because it's called 410 * You normally wouldn't call this function because it's called
411 * for you from @ref KGlobal. 411 * for you from @ref KGlobal.
412 */ 412 */
413 void addKDEDefaults(); 413 void addKDEDefaults();
414 414
415 /** 415 /**
416 * Reads customized entries out of the given config object and add 416 * Reads customized entries out of the given config object and add
417 * them via @ref addResourceDirs(). 417 * them via @ref addResourceDirs().
418 * 418 *
419 * @param config The object the entries are read from. This should 419 * @param config The object the entries are read from. This should
420 * contain global config files 420 * contain global config files
421 * @return true if new config paths have been added 421 * @return true if new config paths have been added
422 * from @p config. 422 * from @p config.
423 **/ 423 **/
424 bool addCustomized(KConfig *config); 424 bool addCustomized(KConfig *config);
425 425
426 /** 426 /**
427 * This function is used internally by almost all other function as 427 * This function is used internally by almost all other function as
428 * it serves and fills the directories cache. 428 * it serves and fills the directories cache.
429 * 429 *
430 * @param type The type of resource 430 * @param type The type of resource
431 * @return The list of possible directories for the specified @p type. 431 * @return The list of possible directories for the specified @p type.
432 * The function updates the cache if possible. If the resource 432 * The function updates the cache if possible. If the resource
433 * type specified is unknown, it will return an empty list. 433 * type specified is unknown, it will return an empty list.
434 * Note, that the directories are assured to exist beside the save 434 * Note, that the directories are assured to exist beside the save
435 * location, which may not exist, but is returned anyway. 435 * location, which may not exist, but is returned anyway.
436 */ 436 */
437 QStringList resourceDirs(const char *type) const; 437 QStringList resourceDirs(const char *type) const;
438 438
439 /** 439 /**
440 * This function will return a list of all the types that KStandardDirs 440 * This function will return a list of all the types that KStandardDirs
441 * supports. 441 * supports.
442 * 442 *
443 * @return All types that KDE supports 443 * @return All types that KDE supports
444 */ 444 */
445 QStringList allTypes() const; 445 QStringList allTypes() const;
446 446
447 /** 447 /**
448 * Finds a location to save files into for the given type 448 * Finds a location to save files into for the given type
449 * in the user's home directory. 449 * in the user's home directory.
450 * 450 *
451 * @param type The type of location to return. 451 * @param type The type of location to return.
452 * @param suffix A subdirectory name. 452 * @param suffix A subdirectory name.
453 * Makes it easier for you to create subdirectories. 453 * Makes it easier for you to create subdirectories.
454 * You can't pass filenames here, you _have_ to pass 454 * You can't pass filenames here, you _have_ to pass
455 * directory names only and add possible filename in 455 * directory names only and add possible filename in
456 * that directory yourself. A directory name always has a 456 * that directory yourself. A directory name always has a
457 * trailing slash ('/'). 457 * trailing slash ('/').
458 * @param create If set, saveLocation() will create the directories 458 * @param create If set, saveLocation() will create the directories
459 * needed (including those given by @p suffix). 459 * needed (including those given by @p suffix).
460 * 460 *
461 * @return A path where resources of the specified type should be 461 * @return A path where resources of the specified type should be
462 * saved, or QString::null if the resource type is unknown. 462 * saved, or QString::null if the resource type is unknown.
463 */ 463 */
464 QString saveLocation(const char *type, 464 QString saveLocation(const char *type,
465 const QString& suffix = QString::null, 465 const QString& suffix = QString::null,
466 bool create = true) const; 466 bool create = true) const;
467 467
468 /** 468 /**
469 * Converts an absolute path to a path relative to a certain 469 * Converts an absolute path to a path relative to a certain
470 * resource. 470 * resource.
471 * 471 *
472 * If "abs = ::locate(resource, rel)" 472 * If "abs = ::locate(resource, rel)"
473 * then "rel = relativeLocation(resource, abs)" and vice versa. 473 * then "rel = relativeLocation(resource, abs)" and vice versa.
474 * 474 *
475 * @param type The type of resource. 475 * @param type The type of resource.
476 * 476 *
477 * @param absPath An absolute path to make relative. 477 * @param absPath An absolute path to make relative.
478 * 478 *
479 * @return A relative path relative to resource @p type that 479 * @return A relative path relative to resource @p type that
480 * will find @p absPath. If no such relative path exists, absPath 480 * will find @p absPath. If no such relative path exists, absPath
481 * will be returned unchanged. 481 * will be returned unchanged.
482 */ 482 */
483 QString relativeLocation(const char *type, const QString &absPath); 483 QString relativeLocation(const char *type, const QString &absPath);
484 484
485 /** 485 /**
486 * Recursively creates still-missing directories in the given path. 486 * Recursively creates still-missing directories in the given path.
487 * 487 *
488 * The resulting permissions will depend on the current umask setting. 488 * The resulting permissions will depend on the current umask setting.
489 * permission = mode & ~umask. 489 * permission = mode & ~umask.
490 * 490 *
491 * @param dir Absolute path of the directory to be made. 491 * @param dir Absolute path of the directory to be made.
492 * @param mode Directory permissions. 492 * @param mode Directory permissions.
493 * @return true if successful, false otherwise 493 * @return true if successful, false otherwise
494 */ 494 */
495 static bool makeDir(const QString& dir, int mode = 0755); 495 static bool makeDir(const QString& dir, int mode = 0755);
496 496
497 /** 497 /**
498 * This returns a default relative path for the standard KDE 498 * This returns a default relative path for the standard KDE
499 * resource types. Below is a list of them so you get an idea 499 * resource types. Below is a list of them so you get an idea
500 * of what this is all about. 500 * of what this is all about.
501 * 501 *
502 * @li data - share/apps 502 * @li data - share/apps
503 * @li html - share/doc/HTML 503 * @li html - share/doc/HTML
504 * @li icon - share/icon 504 * @li icon - share/icon
505 * @li config - share/config 505 * @li config - share/config
506 * @li pixmap - share/pixmaps 506 * @li pixmap - share/pixmaps
507 * @li apps - share/applnk 507 * @li apps - share/applnk
508 * @li sound - share/sounds 508 * @li sound - share/sounds
509 * @li locale - share/locale 509 * @li locale - share/locale
510 * @li services - share/services 510 * @li services - share/services
511 * @li servicetypes - share/servicetypes 511 * @li servicetypes - share/servicetypes
512 * @li mime - share/mimelnk 512 * @li mime - share/mimelnk
513 * @li wallpaper - share/wallpapers 513 * @li wallpaper - share/wallpapers
514 * @li templates - share/templates 514 * @li templates - share/templates
515 * @li exe - bin 515 * @li exe - bin
516 * @li lib - lib 516 * @li lib - lib
517 * 517 *
518 * @returns Static default for the specified resource. You 518 * @returns Static default for the specified resource. You
519 * should probably be using locate() or locateLocal() 519 * should probably be using locate() or locateLocal()
520 * instead. 520 * instead.
521 * @see locate() 521 * @see locate()
522 * @see locateLocal() 522 * @see locateLocal()
523 */ 523 */
524 static QString kde_default(const char *type); 524 static QString kde_default(const char *type);
525 525
526 /** 526 /**
527 * @internal (for use by sycoca only) 527 * @internal (for use by sycoca only)
528 */ 528 */
529 QString kfsstnd_prefixes(); 529 QString kfsstnd_prefixes();
530 530
531 /** 531 /**
532 * Returns the toplevel directory in which KStandardDirs 532 * Returns the toplevel directory in which KStandardDirs
533 * will store things. Most likely $HOME/.kde 533 * will store things. Most likely $HOME/.kde
534 * Don't use this function if you can use locateLocal 534 * Don't use this function if you can use locateLocal
535 * @return the toplevel directory 535 * @return the toplevel directory
536 */ 536 */
537 QString localkdedir() const; 537 QString localkdedir() const;
538 538
539 /** 539 /**
540 * @return $XDG_DATA_HOME 540 * @return $XDG_DATA_HOME
541 * See also http://www.freedesktop.org/standards/basedir/draft/basedir-spec/basedir-spec.html 541 * See also http://www.freedesktop.org/standards/basedir/draft/basedir-spec/basedir-spec.html
542 */ 542 */
543 QString localxdgdatadir() const; 543 QString localxdgdatadir() const;
544 544
545 /** 545 /**
546 * @return $XDG_CONFIG_HOME 546 * @return $XDG_CONFIG_HOME
547 * See also http://www.freedesktop.org/standards/basedir/draft/basedir-spec/basedir-spec.html 547 * See also http://www.freedesktop.org/standards/basedir/draft/basedir-spec/basedir-spec.html
548 */ 548 */
549 QString localxdgconfdir() const; 549 QString localxdgconfdir() const;
550 550
551 /** 551 /**
552 * Checks for existence and accessability. 552 * Checks for existence and accessability.
553 * Faster than creating a QFileInfo first. 553 * Faster than creating a QFileInfo first.
554 * @param fullPath the path to check 554 * @param fullPath the path to check
555 * @return true if the directory exists 555 * @return true if the directory exists
556 */ 556 */
557 static bool exists(const QString &fullPath); 557 static bool exists(const QString &fullPath);
558 558
559 /** 559 /**
560 * Expands all symbolic links and resolves references to 560 * Expands all symbolic links and resolves references to
561 * '/./', '/../' and extra '/' characters in @p dirname 561 * '/./', '/../' and extra '/' characters in @p dirname
562 * and returns the canonicalized absolute pathname. 562 * and returns the canonicalized absolute pathname.
563 * The resulting path will have no symbolic link, '/./' 563 * The resulting path will have no symbolic link, '/./'
564 * or '/../' components. 564 * or '/../' components.
565 * @since 3.1 565 * @since 3.1
566 */ 566 */
567 static QString realPath(const QString &dirname); 567 static QString realPath(const QString &dirname);
568 568
569 static void setAppDir( const QString & ); 569 static void setAppDir( const QString & );
570 static QString appDir(); 570 static QString appDir();
571 571
572 private: 572 private:
573 573
574 QStringList prefixes; 574 QStringList prefixes;
575 575
576 // Directory dictionaries 576 // Directory dictionaries
577 QDict<QStringList> absolutes; 577 QDict<QStringList> absolutes;
578 QDict<QStringList> relatives; 578 QDict<QStringList> relatives;
579 579
580 mutable QDict<QStringList> dircache; 580 mutable QDict<QStringList> dircache;
581 mutable QDict<QString> savelocations; 581 mutable QDict<QString> savelocations;
582 582
583 // Disallow assignment and copy-construction 583 // Disallow assignment and copy-construction
584 KStandardDirs( const KStandardDirs& ); 584 KStandardDirs( const KStandardDirs& );
585 KStandardDirs& operator= ( const KStandardDirs& ); 585 KStandardDirs& operator= ( const KStandardDirs& );
586 586
587 bool addedCustoms; 587 bool addedCustoms;
588 588
589 class KStandardDirsPrivate; 589 class KStandardDirsPrivate;
590 KStandardDirsPrivate *d; 590 KStandardDirsPrivate *d;
591//US 591//US
592 static QString mAppDir; 592 static QString mAppDir;
593 593
594 void checkConfig() const; 594 void checkConfig() const;
595 void applyDataRestrictions(const QString &) const; 595 void applyDataRestrictions(const QString &) const;
596 //US void createSpecialResource(const char*); 596 //US void createSpecialResource(const char*);
597}; 597};
598 598
599/** 599/**
600 * \addtogroup locates Locate Functions 600 * \addtogroup locates Locate Functions
601 * @{ 601 * @{
602 * On The Usage Of 'locate' and 'locateLocal' 602 * On The Usage Of 'locate' and 'locateLocal'
603 * 603 *
604 * Typical KDE applications use resource files in one out of 604 * Typical KDE applications use resource files in one out of
605 * three ways: 605 * three ways:
606 * 606 *
607 * 1) A resource file is read but is never written. A system 607 * 1) A resource file is read but is never written. A system
608 * default is supplied but the user can override this 608 * default is supplied but the user can override this
609 * default in his local .kde directory: 609 * default in his local .kde directory:
610 * 610 *
611 * \code 611 * \code
612 * // Code example 612 * // Code example
613 * myFile = locate("appdata", "groups.lst"); 613 * myFile = locate("appdata", "groups.lst");
614 * myData = myReadGroups(myFile); // myFile may be null 614 * myData = myReadGroups(myFile); // myFile may be null
615 * \endcode 615 * \endcode
616 * 616 *
617 * 2) A resource file is read and written. If the user has no 617 * 2) A resource file is read and written. If the user has no
618 * local version of the file the system default is used. 618 * local version of the file the system default is used.
619 * The resource file is always written to the users local 619 * The resource file is always written to the users local
620 * .kde directory. 620 * .kde directory.
621 * 621 *
622 * \code 622 * \code
623 * // Code example 623 * // Code example
624 * myFile = locate("appdata", "groups.lst") 624 * myFile = locate("appdata", "groups.lst")
625 * myData = myReadGroups(myFile); 625 * myData = myReadGroups(myFile);
626 * ... 626 * ...
627 * doSomething(myData); 627 * doSomething(myData);
628 * ... 628 * ...
629 * myFile = locateLocal("appdata", "groups.lst"); 629 * myFile = locateLocal("appdata", "groups.lst");
630 * myWriteGroups(myFile, myData); 630 * myWriteGroups(myFile, myData);
631 * \endcode 631 * \endcode
632 * 632 *
633 * 3) A resource file is read and written. No system default 633 * 3) A resource file is read and written. No system default
634 * is used if the user has no local version of the file. 634 * is used if the user has no local version of the file.
635 * The resource file is always written to the users local 635 * The resource file is always written to the users local
636 * .kde directory. 636 * .kde directory.
637 * 637 *
638 * \code 638 * \code
639 * // Code example 639 * // Code example
640 * myFile = locateLocal("appdata", "groups.lst"); 640 * myFile = locateLocal("appdata", "groups.lst");
641 * myData = myReadGroups(myFile); 641 * myData = myReadGroups(myFile);
642 * ... 642 * ...
643 * doSomething(myData); 643 * doSomething(myData);
644 * ... 644 * ...
645 * myFile = locateLocal("appdata", "groups.lst"); 645 * myFile = locateLocal("appdata", "groups.lst");
646 * myWriteGroups(myFile, myData); 646 * myWriteGroups(myFile, myData);
647 * \endcode 647 * \endcode
648 **/ 648 **/
649 649
650/*! 650/*!
651 * \relates KStandardDirs 651 * \relates KStandardDirs
652 * This function is just for convenience. It simply calls 652 * This function is just for convenience. It simply calls
653 *instance->dirs()->\link KStandardDirs::findResource() findResource\endlink(type, filename). 653 *instance->dirs()->\link KStandardDirs::findResource() findResource\endlink(type, filename).
654 **/ 654 **/
655QString locate( const char *type, const QString& filename /*US , const KInstance* instance = KGlobal::instance()*/ ); 655QString locate( const char *type, const QString& filename /*US , const KInstance* instance = KGlobal::instance()*/ );
656 656
657/*! 657/*!
658 * \relates KStandardDirs 658 * \relates KStandardDirs
659 * This function is much like locate. However it returns a 659 * This function is much like locate. However it returns a
660 * filename suitable for writing to. No check is made if the 660 * filename suitable for writing to. No check is made if the
661 * specified filename actually exists. Missing directories 661 * specified filename actually exists. Missing directories
662 * are created. If filename is only a directory, without a 662 * are created. If filename is only a directory, without a
663 * specific file, filename must have a trailing slash. 663 * specific file, filename must have a trailing slash.
664 * 664 *
665 **/ 665 **/
666QString locateLocal( const char *type, const QString& filename /*US , const KInstance* instance = KGlobal::instance() */ ); 666QString locateLocal( const char *type, const QString& filename /*US , const KInstance* instance = KGlobal::instance() */ );
667 667
668/*! 668/*!
669 * \relates KStandardDirs 669 * \relates KStandardDirs
670 * This function is much like locate. No check is made if the 670 * This function is much like locate. No check is made if the
671 * specified filename actually exists. Missing directories 671 * specified filename actually exists. Missing directories
672 * are created if @p createDir is true. If filename is only 672 * are created if @p createDir is true. If filename is only
673 * a directory, without a specific file, 673 * a directory, without a specific file,
674 * filename must have a trailing slash. 674 * filename must have a trailing slash.
675 * 675 *
676 **/ 676 **/
677QString locateLocal( const char *type, const QString& filename, bool createDir /*US , const KInstance* instance = KGlobal::instance() */); 677QString locateLocal( const char *type, const QString& filename, bool createDir /*US , const KInstance* instance = KGlobal::instance() */);
678 678
679/*! @} */ 679/*! @} */
680 680
681#endif // SSK_KSTDDIRS_H 681#endif // SSK_KSTDDIRS_H