summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--bin/kdepim/WhatsNew.txt9
-rw-r--r--libkdepim/kcmconfigs/kdepimconfigwidget.cpp38
-rw-r--r--libkdepim/kcmconfigs/kdepimconfigwidget.h5
-rw-r--r--microkde/kdecore/kstandarddirs.cpp4
-rw-r--r--microkde/kdecore/kstandarddirs.h2
5 files changed, 55 insertions, 3 deletions
diff --git a/bin/kdepim/WhatsNew.txt b/bin/kdepim/WhatsNew.txt
index 683de7c..c0078be 100644
--- a/bin/kdepim/WhatsNew.txt
+++ b/bin/kdepim/WhatsNew.txt
@@ -1,748 +1,755 @@
1Info about the changes in new versions of KDE-Pim/Pi 1Info about the changes in new versions of KDE-Pim/Pi
2 2
3********** VERSION 1.9.18 ************ 3********** VERSION 1.9.18 ************
4 4
5FYI: The VERSION 1.9.17 was a testing release only. 5FYI: The VERSION 1.9.17 was a testing release only.
6Please read the changelog of VERSION 1.9.17 as well. 6Please read the changelog of VERSION 1.9.17 as well.
7 7
8Cleaned up the syncing config dialog. 8Cleaned up the syncing config dialog.
9Added sync config options for date range for events. 9Added sync config options for date range for events.
10Added sync config options for filters on incoming data. 10Added sync config options for filters on incoming data.
11Added sync config options for filters on outgoing data. 11Added sync config options for filters on outgoing data.
12Please read the updated SyncHowTo about the new filter settings. 12Please read the updated SyncHowTo about the new filter settings.
13These filter settings make it now possible to sync with shared 13These filter settings make it now possible to sync with shared
14calendars without writing back private or confidential data 14calendars without writing back private or confidential data
15(via the outgoing filters). 15(via the outgoing filters).
16To sync only with particular parts of a shared calendar, 16To sync only with particular parts of a shared calendar,
17the incoming filter settings can be used. 17the incoming filter settings can be used.
18An example can be found in the SyncHowTo. 18An example can be found in the SyncHowTo.
19Same for shared addressbooks. 19Same for shared addressbooks.
20 20
21Added a setting for the global kdepim data storage.
22Usually the data is stored in (yourhomedir/kdepim).
23Now you can set in the Global config dialog TAB, subTAB "Data storage path"
24a directory where all the kdepim data is stored.
25That makes it easy to save all kdepim data on a SD card on the Z, for example.
26
21KO/Pi: 27KO/Pi:
22The timeedit input has a pulldown list for times. 28The timeedit input has a pulldown list for times.
23If opened, this pulldown list should now has the right time highlighted. 29If opened, this pulldown list should now has the right time highlighted.
24Added the possibility to exclude events/todos/journals in a filter. 30Added the possibility to exclude events/todos/journals in a filter.
25You should exclude journals, if you do not want them to sync with a public calendar. 31You should exclude journals, if you do not want them to sync with a public calendar.
26 32
27KA/Pi: 33KA/Pi:
28Added the possibility to in/exclude public/private/confidential contacts to a filter. 34Added the possibility to in/exclude public/private/confidential contacts to a filter.
29If you have already defined filterrules in KA/Pi you have to adjust them all by setting the "include public/private/confidential" property manually. Sorry for that ... 35If you have already defined filterrules in KA/Pi you have to adjust them all by setting the "include public/private/confidential" property manually. Sorry for that ...
30Added printing of card view and details view on desktop. 36Added printing of card view and details view on desktop.
31Printing of list view is not working... 37Printing of list view is not working...
32Added button for removing pictures in contact editor. 38Added button for removing pictures in contact editor.
33Parsing data fix of KA/Pi version 1.9.17. 39Parsing data fix of KA/Pi version 1.9.17.
34Fixed the "parse name automatically" problem of KA/Pi version 1.9.17. 40Fixed the "parse name automatically" problem of KA/Pi version 1.9.17.
35 41Fixed some syncing merging problems.
42
36 43
37********** VERSION 1.9.17 ************ 44********** VERSION 1.9.17 ************
38 45
39KO/Pi: 46KO/Pi:
40Fixed that tooltips were not updated after moving an item in agenda view. 47Fixed that tooltips were not updated after moving an item in agenda view.
41Fixed a bug in sorting start date for recurring events in list view. 48Fixed a bug in sorting start date for recurring events in list view.
42Changed the left button in todo viewer from "Agenda" to "Set completed". 49Changed the left button in todo viewer from "Agenda" to "Set completed".
43This makes it possible to change a todo in the What's Next View quickly to the completed state without leaving the What's Next View. 50This makes it possible to change a todo in the What's Next View quickly to the completed state without leaving the What's Next View.
44Added more info in the todo viewer: Startdate, parent/sub todos. 51Added more info in the todo viewer: Startdate, parent/sub todos.
45 52
46 53
47KA/Pi: 54KA/Pi:
48All fields search does now actually search all the (possible) fields, 55All fields search does now actually search all the (possible) fields,
49not only those listed in the contact list. 56not only those listed in the contact list.
50Made is possible to inline a picture in a vcard on the Z. 57Made is possible to inline a picture in a vcard on the Z.
51This was only possible on the desktop, now is it possible on the Z as well. 58This was only possible on the desktop, now is it possible on the Z as well.
52Fixed of missing save settings after filter configuration. 59Fixed of missing save settings after filter configuration.
53Made saving of addressbook much faster. 60Made saving of addressbook much faster.
54Fixed extension widget layout problem. 61Fixed extension widget layout problem.
55Fixed saving of default formatted name settings. 62Fixed saving of default formatted name settings.
56Fixed formatted name handling in edit dialog. 63Fixed formatted name handling in edit dialog.
57Added an option for changing formatted names of many contacts 64Added an option for changing formatted names of many contacts
58(menu: File - Change - Set formatted name). 65(menu: File - Change - Set formatted name).
59 66
60QWhatsThis was not working on the Z ( only black rectangle was shown). 67QWhatsThis was not working on the Z ( only black rectangle was shown).
61This is Fixed. 68This is Fixed.
62 69
63KDE-Sync: 70KDE-Sync:
64Now readonly KDE resources are synced as well. 71Now readonly KDE resources are synced as well.
65(They are not changed in KDE itself, of course). 72(They are not changed in KDE itself, of course).
66 73
67 74
68 75
69********** VERSION 1.9.16 ************ 76********** VERSION 1.9.16 ************
70 77
71KO/Pi: 78KO/Pi:
72Fixed search dialog size on Z 6000 (480x640 display). 79Fixed search dialog size on Z 6000 (480x640 display).
73Added setting to hide/show time in agenda items. 80Added setting to hide/show time in agenda items.
74Added setting to hide not running todos in todo view. 81Added setting to hide not running todos in todo view.
75Added columns for start date/time in todo view. 82Added columns for start date/time in todo view.
76Replaced the solid half-hour lines in agenda view by dot lines. 83Replaced the solid half-hour lines in agenda view by dot lines.
77Added possibility of printing the What's Next View on the desktop 84Added possibility of printing the What's Next View on the desktop
78(i.e. Windows and Linux). 85(i.e. Windows and Linux).
79Fixed a crash in KO/Pi when starting KO/Pi with What's Next view. 86Fixed a crash in KO/Pi when starting KO/Pi with What's Next view.
80Added tooltips in month view.(Tooltips only available on desktop) 87Added tooltips in month view.(Tooltips only available on desktop)
81 88
82Fixed a strange problem in KO/Pi alarm applet. 89Fixed a strange problem in KO/Pi alarm applet.
83Did not find the actual problem, 90Did not find the actual problem,
84such that now Qtopia reboots again if deinstalling the alarm applet. 91such that now Qtopia reboots again if deinstalling the alarm applet.
85But the alarm applet should work again. 92But the alarm applet should work again.
86 93
87KA/Pi: 94KA/Pi:
88Fixed the problem, that internal pictures were not saved. 95Fixed the problem, that internal pictures were not saved.
89 96
90Fixed a problem in the pi-sync mode by increasing the timeout for data transfer from 20 seconds to 5 minutes. 97Fixed a problem in the pi-sync mode by increasing the timeout for data transfer from 20 seconds to 5 minutes.
91 98
92Fixed some minor problems. (Like word wrap in help text windows). 99Fixed some minor problems. (Like word wrap in help text windows).
93 100
94Fixed a compiling problem in microkde/kresources. 101Fixed a compiling problem in microkde/kresources.
95 102
96KO/Pi is using zdbat (renamed to db2file) for syncing with Sharp DTM. 103KO/Pi is using zdbat (renamed to db2file) for syncing with Sharp DTM.
97This version now includes zdbat 1.0.0 (old version was zdbat 0.2.9) 104This version now includes zdbat 1.0.0 (old version was zdbat 0.2.9)
98such that now syncing KO/Pi with Sharp DTM should work on the 105such that now syncing KO/Pi with Sharp DTM should work on the
99Zaurus C 3000 model. 106Zaurus C 3000 model.
100 107
101********** VERSION 1.9.15 ************ 108********** VERSION 1.9.15 ************
102 109
103Usebilty enhancements in KO/Pi: 110Usebilty enhancements in KO/Pi:
104When clicking on the date in a month view cell, the day view is shown. 111When clicking on the date in a month view cell, the day view is shown.
105Old behaviour was, that the "new event" dialog popped up. 112Old behaviour was, that the "new event" dialog popped up.
106 113
107Added a one step "undo delete" in KO/Pi (Accessable in the "Action" menu). 114Added a one step "undo delete" in KO/Pi (Accessable in the "Action" menu).
108That means, you can restore the latest 115That means, you can restore the latest
109event/todo/journal you have deleted. 116event/todo/journal you have deleted.
110A journal is deleted, if you clear all the text of the journal. 117A journal is deleted, if you clear all the text of the journal.
111 118
112Fixed the bug of the editor dialogs in KO/Pi of version 1.9.14. 119Fixed the bug of the editor dialogs in KO/Pi of version 1.9.14.
113 120
114KA/Pi starting in 480x640 resolution: 121KA/Pi starting in 480x640 resolution:
115Hide the filter action in toolbar 122Hide the filter action in toolbar
116and added icons for undo/delete/redo in toolbar. 123and added icons for undo/delete/redo in toolbar.
117 124
118Change in OM/Pi ViewMail dialog: 125Change in OM/Pi ViewMail dialog:
119When clicking on the "delete" icon the mail is deleted after confirmation as usual. 126When clicking on the "delete" icon the mail is deleted after confirmation as usual.
120But the edit dialog is not closed as before, now the next mail in the folder is shown automatically (if there is any). 127But the edit dialog is not closed as before, now the next mail in the folder is shown automatically (if there is any).
121 128
122Fixed a crash when deleting mail-accounts in OM/Pi. 129Fixed a crash when deleting mail-accounts in OM/Pi.
123 130
124 131
125********** VERSION 1.9.14 ************ 132********** VERSION 1.9.14 ************
126 133
127Fixed some problems with the dialog sizes when switching 134Fixed some problems with the dialog sizes when switching
128portrait/landscape mode on 640x480 PDA display. 135portrait/landscape mode on 640x480 PDA display.
129 136
130Fixed some other small bugs in KA/Pi KO/Pi and OM/Pi and PwM/Pi. 137Fixed some other small bugs in KA/Pi KO/Pi and OM/Pi and PwM/Pi.
131 138
132Fixed an ugly bug in KOpieMail: 139Fixed an ugly bug in KOpieMail:
133KOpieMail was not able to write files (mails) to MSDOS file system, 140KOpieMail was not able to write files (mails) to MSDOS file system,
134like on an usual preformatted SD card. That should work now. 141like on an usual preformatted SD card. That should work now.
135To save your mail data on the Sd card do the following: 142To save your mail data on the Sd card do the following:
136Create a dir on the SD card: 143Create a dir on the SD card:
137mkdir /mnt/card/localmail 144mkdir /mnt/card/localmail
138Go to your home dir: 145Go to your home dir:
139cd 146cd
140Go to kopiemail data storage dir: 147Go to kopiemail data storage dir:
141cd kdepim/apps/kopiemail 148cd kdepim/apps/kopiemail
142Create a symlink to the SD card: 149Create a symlink to the SD card:
143ls -s /mnt/card/localmail 150ls -s /mnt/card/localmail
144Now KOpieMail will store all mails on the SD card. 151Now KOpieMail will store all mails on the SD card.
145 152
146KO/Pi Monthview: 153KO/Pi Monthview:
147Now "Go to Today" selects the current month from day 1-end, 154Now "Go to Today" selects the current month from day 1-end,
148not the current date + some days. 155not the current date + some days.
149I.e. "Go to Today" shows now always 156I.e. "Go to Today" shows now always
150the current month with first day of month in the first row. 157the current month with first day of month in the first row.
151 158
152Added missing German translation. 159Added missing German translation.
153 160
154Fixed icons of executeable on Wintendo. 161Fixed icons of executeable on Wintendo.
155 162
156Added a "Show next Mail" button to the OM/Pi 163Added a "Show next Mail" button to the OM/Pi
157mail viewer such that the mail below the current mail 164mail viewer such that the mail below the current mail
158in the mail list view of the current folder 165in the mail list view of the current folder
159can be read with a single click. 166can be read with a single click.
160 167
161 168
162********** VERSION 1.9.13 ************ 169********** VERSION 1.9.13 ************
163 170
164Fixed nasty PwM/Pi file reading bug, when 171Fixed nasty PwM/Pi file reading bug, when
165the used hash algo of file is different then the global 172the used hash algo of file is different then the global
166hash algo. 173hash algo.
167 174
168Added KA/Pi support for opie mailit mailapplication. 175Added KA/Pi support for opie mailit mailapplication.
169 176
170Fixed some bugs in OM/Pi. 177Fixed some bugs in OM/Pi.
171Now character conversion tables are available for the Zaurus 178Now character conversion tables are available for the Zaurus
172to make OM/Pi working properly. 179to make OM/Pi working properly.
173To get the character conversion in OM/Pi working, please download 180To get the character conversion in OM/Pi working, please download
174at the sourceforge project site the package 181at the sourceforge project site the package
175sr-character-conversion_SharpROM_arm.ipk.zip 182sr-character-conversion_SharpROM_arm.ipk.zip
176(or oz-character-conversion_OZ-gcc3xx_arm.ipk.zip for OZ roms) 183(or oz-character-conversion_OZ-gcc3xx_arm.ipk.zip for OZ roms)
177from the section "general files for KDE/Pim" 184from the section "general files for KDE/Pim"
178Instructions how to install this package are in a ReadMe in this file. 185Instructions how to install this package are in a ReadMe in this file.
179 186
180 187
181Fixed the orientation change problem in KA/Pi when switching 188Fixed the orientation change problem in KA/Pi when switching
182portrait/landscape mode. 189portrait/landscape mode.
183 190
184French translation available for KA/Pi and OM/Pi. 191French translation available for KA/Pi and OM/Pi.
185 192
186Fixed some problems with categories in KO/Pi in DTM sync. 193Fixed some problems with categories in KO/Pi in DTM sync.
187 194
188Added selection dialog for export to phone in KA/Pi. 195Added selection dialog for export to phone in KA/Pi.
189 196
190If in KO/Pi is an attendee selected to add to a meeting and this 197If in KO/Pi is an attendee selected to add to a meeting and this
191attendee is already in the list of attendees, this person is not added 198attendee is already in the list of attendees, this person is not added
192again. 199again.
193 200
194Some menu cleanup in KA/Pi. 201Some menu cleanup in KA/Pi.
195 202
196********** VERSION 1.9.12 ************ 203********** VERSION 1.9.12 ************
197 204
198Fix for the bug in KO/Pi What's Next view of version 1.9.11. 205Fix for the bug in KO/Pi What's Next view of version 1.9.11.
199 206
200Bugfix: Licence file is now shown again. 207Bugfix: Licence file is now shown again.
201 208
202OM/Pi now supports Unicode (utf8 charset). 209OM/Pi now supports Unicode (utf8 charset).
203Fixed some bugs in OM/Pi. 210Fixed some bugs in OM/Pi.
204 211
205KA/Pi has more German translation. 212KA/Pi has more German translation.
206 213
207 214
208********** VERSION 1.9.11 ************ 215********** VERSION 1.9.11 ************
209 216
210Fixed several problems in PWM/Pi, like 217Fixed several problems in PWM/Pi, like
211asking the user, if unsaved changed are pending 218asking the user, if unsaved changed are pending
212when closing the app. 219when closing the app.
213And PwM/Pi handles now different texts for the 220And PwM/Pi handles now different texts for the
214fields Description, Username, Password, configurable per category. 221fields Description, Username, Password, configurable per category.
215 222
216Fixed a crash in KO/Pi , when importing/loading vcs files 223Fixed a crash in KO/Pi , when importing/loading vcs files
217which have an entry with an attendee with state: 224which have an entry with an attendee with state:
218NEEDS ACTION 225NEEDS ACTION
219 226
220Fixed some problems in the German translation of OM/Pi, 227Fixed some problems in the German translation of OM/Pi,
221which makes some dialogs not fitting on the screen 228which makes some dialogs not fitting on the screen
222of the Z 5500. 229of the Z 5500.
223 230
224Fixed Qtopia crash, when disabling/deinstalling 231Fixed Qtopia crash, when disabling/deinstalling
225KO/Pi alarm applet. 232KO/Pi alarm applet.
226 233
227Implemented direct KDE<->KA/Pi sync for KA/Pi running 234Implemented direct KDE<->KA/Pi sync for KA/Pi running
228on Linux desktop. 235on Linux desktop.
229 236
230Added feature "remove sync info" to sync menu. 237Added feature "remove sync info" to sync menu.
231 238
232Tweaked the KO/Pi What's next view a bit, added 239Tweaked the KO/Pi What's next view a bit, added
233setting to hide events that are done. 240setting to hide events that are done.
234 241
235Disabled "beam receive enabled" on startup to 242Disabled "beam receive enabled" on startup to
236avoid problems if Fastload is enabled. 243avoid problems if Fastload is enabled.
237Please set "beam receive enabled", 244Please set "beam receive enabled",
238if you want to receive data via IR. 245if you want to receive data via IR.
239 246
240Fixed bug in direct KDE<->KO/Pi sync for KO/Pi running 247Fixed bug in direct KDE<->KO/Pi sync for KO/Pi running
241on Linux desktop. 248on Linux desktop.
242 249
243Made in KA/Pi scrolling possible, if details view is selected. 250Made in KA/Pi scrolling possible, if details view is selected.
244(The keyboard focus is set automatically to the search line) 251(The keyboard focus is set automatically to the search line)
245 252
246Fixed a bug in DMT sync, that a new entry in DTM was added 253Fixed a bug in DMT sync, that a new entry in DTM was added
247on every sync to Kx/Pi. 254on every sync to Kx/Pi.
248 255
249Fixed missing writing of KA/Pi categories to DMT entries when syncing. 256Fixed missing writing of KA/Pi categories to DMT entries when syncing.
250 257
251Fixed a bug in DMT sync with todos created in KO/Pi containing 258Fixed a bug in DMT sync with todos created in KO/Pi containing
252non-latin1 characters. 259non-latin1 characters.
253 260
254Rearranged package contents of Sharp-ipks and made all 261Rearranged package contents of Sharp-ipks and made all
255packages installable on SD again. 262packages installable on SD again.
256 263
257Fixed the writing of addressbook data in DTM sync. 264Fixed the writing of addressbook data in DTM sync.
258Empty fields in KA/Pi were not removed. 265Empty fields in KA/Pi were not removed.
259 266
260Added better category handling in KA/Pi: 267Added better category handling in KA/Pi:
261Added item 268Added item
262Edit Categories and 269Edit Categories and
263Manage new categories 270Manage new categories
264to the settings menu. 271to the settings menu.
265Possible to configure a view to display categories. 272Possible to configure a view to display categories.
266 273
267Added detailed "KDE Sync Howto" and "Multi Sync Howto" to Help menu. 274Added detailed "KDE Sync Howto" and "Multi Sync Howto" to Help menu.
268 275
269Fixed displaying of "free" days and time in KO Monthview and Agendaview. 276Fixed displaying of "free" days and time in KO Monthview and Agendaview.
270 277
271... and many other bugfixes. 278... and many other bugfixes.
272 279
273********** VERSION 1.9.10 ************ 280********** VERSION 1.9.10 ************
274 281
275Many internal small bugfixes. 282Many internal small bugfixes.
276And fix of the "big" bug in KO/Pi, 283And fix of the "big" bug in KO/Pi,
277that after Syncing the appointments had an offset by several hours. 284that after Syncing the appointments had an offset by several hours.
278That was a problem with the internal timezone setting, 285That was a problem with the internal timezone setting,
279introduced by the changed timezone configuration settings. 286introduced by the changed timezone configuration settings.
280 287
281German translation for OM/Pi is now available. 288German translation for OM/Pi is now available.
282 289
283 290
284********** VERSION 1.9.9 ************ 291********** VERSION 1.9.9 ************
285 292
286KDE-Pim/Pi has a new Member! 293KDE-Pim/Pi has a new Member!
287It is called PWM/Pi (Passwordmanager/platform-independent) 294It is called PWM/Pi (Passwordmanager/platform-independent)
288and it is available for the Zaurus. 295and it is available for the Zaurus.
289It is planned, that it will be available later for Windows. 296It is planned, that it will be available later for Windows.
290(And for Linux, of course). 297(And for Linux, of course).
291It is a port of the Passwordmanager of KDE. 298It is a port of the Passwordmanager of KDE.
292It will need the MicroKDElibs to run. 299It will need the MicroKDElibs to run.
293 300
294Made loading of addressbooks in KA/Pi up to 7 times faster! 301Made loading of addressbooks in KA/Pi up to 7 times faster!
295The bigger your addressbook file, the more starting speed 302The bigger your addressbook file, the more starting speed
296will you gain. (relatively) 303will you gain. (relatively)
297 304
298The Qtopia addressbook connector is now platform independend 305The Qtopia addressbook connector is now platform independend
299as well and should work on any platform for importing/exporting 306as well and should work on any platform for importing/exporting
300Qtopia and Opie XML files. 307Qtopia and Opie XML files.
301 308
302Added a +30min feature to the timezone settings to make 309Added a +30min feature to the timezone settings to make
303KDE-Pim/Pi useable in Australia and other parts on the 310KDE-Pim/Pi useable in Australia and other parts on the
304world with strange timezones ;-) 311world with strange timezones ;-)
305 312
306German "Umlaute" should now be sorted correctly on the Z in KA/Pi. 313German "Umlaute" should now be sorted correctly on the Z in KA/Pi.
307 314
308It is now possible to disable the 315It is now possible to disable the
309"receive data via infrared" feature, such that syncing with 316"receive data via infrared" feature, such that syncing with
310Outlook is now possible again with Kx/Pi runing. 317Outlook is now possible again with Kx/Pi runing.
311Please disable it, before syncing Sharp DTM with Outlook. 318Please disable it, before syncing Sharp DTM with Outlook.
312For your convenience, the "receive data via infrared" feature 319For your convenience, the "receive data via infrared" feature
313is disabled automatically, if you sync Kx/Pi with DTM. 320is disabled automatically, if you sync Kx/Pi with DTM.
314You have to enable it again manually after syncing. 321You have to enable it again manually after syncing.
315Enabling this feature makes it impossible to start the 322Enabling this feature makes it impossible to start the
316Sharp DTM apps. If this feature is enabled, you will only get the 323Sharp DTM apps. If this feature is enabled, you will only get the
317alarm notification from KO/Pi and not from the Sharp calendar. 324alarm notification from KO/Pi and not from the Sharp calendar.
318This is very useful if you sync KO/Pi with Sharp DTM, 325This is very useful if you sync KO/Pi with Sharp DTM,
319because after syncing you usually would get notified about 326because after syncing you usually would get notified about
320an alarm by KO/Pi and the Sharp Calendar. 327an alarm by KO/Pi and the Sharp Calendar.
321 328
322Together with the Linux desktop version of KO/Pi 329Together with the Linux desktop version of KO/Pi
323it is now possible to sync KO/Pi on the Zaurus 330it is now possible to sync KO/Pi on the Zaurus
324with the complete KDE-desktop (3.3 or later) 331with the complete KDE-desktop (3.3 or later)
325calendar data easily. 332calendar data easily.
326That makes it possible to sync the Z with one 333That makes it possible to sync the Z with one
327click of a mouse with the KDE-Desktop. 334click of a mouse with the KDE-Desktop.
328This feature it available for all Zaurus platforms KO/Pi 335This feature it available for all Zaurus platforms KO/Pi
329is running on. 336is running on.
330The only thing needed is a running KO/Pi on Linux and 337The only thing needed is a running KO/Pi on Linux and
331a compiled version of the small 338a compiled version of the small
332KDE-Pim/Pi<->KDE-Desktop access command line program, 339KDE-Pim/Pi<->KDE-Desktop access command line program,
333which is in the KDE-Pim/Pi sources available. 340which is in the KDE-Pim/Pi sources available.
334 341
335The "KDE-desktop" syncing feature for KA/Pi will follow 342The "KDE-desktop" syncing feature for KA/Pi will follow
336in the next releases. 343in the next releases.
337 344
338Fixed the vcard export bug, which had the version 1.9.8. 345Fixed the vcard export bug, which had the version 1.9.8.
339 346
340Added missing GERMAN translation to KO/Pi. 347Added missing GERMAN translation to KO/Pi.
341Hi PsionX, could you add the missing french translation?Thx! 348Hi PsionX, could you add the missing french translation?Thx!
342 349
343Translation files for KA/Pi are available as well. 350Translation files for KA/Pi are available as well.
344GERMAN translation will be available in the next release. 351GERMAN translation will be available in the next release.
345PsionX ( yres, you again ;-) ), could you start translating 352PsionX ( yres, you again ;-) ), could you start translating
346KA/Pi? Thx! 353KA/Pi? Thx!
347 354
348You can download the version 1.9.9 at 355You can download the version 1.9.9 at
349 356
350http://sourceforge.net/project/showfiles.php?group_id=104103&package_id=112604 357http://sourceforge.net/project/showfiles.php?group_id=104103&package_id=112604
351 358
352Note: 359Note:
353To run the mail program OM/Pi you need libopenssl. 360To run the mail program OM/Pi you need libopenssl.
354A link to a download loaction is available at 361A link to a download loaction is available at
355ZSI at www.killefiz.de 362ZSI at www.killefiz.de
356 363
357 364
358********** VERSION 1.9.8 ************ 365********** VERSION 1.9.8 ************
359 366
360Fixed character decoding in OM/Pi. 367Fixed character decoding in OM/Pi.
361(e.g. German "Umlaute" were not displayed properly.) 368(e.g. German "Umlaute" were not displayed properly.)
362 369
363Made is possible to reparent todos in KO/Pi. 370Made is possible to reparent todos in KO/Pi.
364Use contextmenu or keys (look at Help-Keys + Colors) for that. 371Use contextmenu or keys (look at Help-Keys + Colors) for that.
365 372
366Added the missing Sync-Howto and WhatsNew to the packages. 373Added the missing Sync-Howto and WhatsNew to the packages.
367 374
368KO/Pi on Linux desktop can now sync with KDE desktop. 375KO/Pi on Linux desktop can now sync with KDE desktop.
369That means: When using KO/Pi on Linux desktop for syncing with 376That means: When using KO/Pi on Linux desktop for syncing with
370KDE desktop and the Zaurus, the Zaurus can be synced now 377KDE desktop and the Zaurus, the Zaurus can be synced now
371with all KDE-Calendar resources, not only with one local file. 378with all KDE-Calendar resources, not only with one local file.
372(That makes it possible to sync the Zaurus with the 379(That makes it possible to sync the Zaurus with the
373calendar data on a Kolab server) 380calendar data on a Kolab server)
374 381
375KA/Pi syncing with KDE desktop will be available in the next version. 382KA/Pi syncing with KDE desktop will be available in the next version.
376 383
377 384
378********** VERSION 1.9.7 ************ 385********** VERSION 1.9.7 ************
379 386
380KO/Pi - KA/Pi on Windows: 387KO/Pi - KA/Pi on Windows:
381Now a directory can be defined by the user, where the 388Now a directory can be defined by the user, where the
382application/config data should be saved. 389application/config data should be saved.
383 Define your desired path in the evironment variable 390 Define your desired path in the evironment variable
384 MICROKDEHOME 391 MICROKDEHOME
385 before starting KO/Pi or KA/Pi. 392 before starting KO/Pi or KA/Pi.
386 393
387An easy Kx/Pi to Kx/Pi syncing is now possible 394An easy Kx/Pi to Kx/Pi syncing is now possible
388(it is called Pi-Sync) via network. 395(it is called Pi-Sync) via network.
389Please look at the Sync Howto. 396Please look at the Sync Howto.
390 397
391Exporting of calendar data and contacts to mobile phones is now possible. 398Exporting of calendar data and contacts to mobile phones is now possible.
392The SyncHowto is updated with information howto 399The SyncHowto is updated with information howto
393access/sync mobile phones. 400access/sync mobile phones.
394Please look at the Sync Howto. 401Please look at the Sync Howto.
395 402
396Now KO/Pi and KA/Pi on the Zaurus can receive data via infrared directly. 403Now KO/Pi and KA/Pi on the Zaurus can receive data via infrared directly.
397Please disable Fastload for the original contact/calendar applications 404Please disable Fastload for the original contact/calendar applications
398and close them. 405and close them.
399KO/Pi and KA/Pi must be running in order to receive the data. 406KO/Pi and KA/Pi must be running in order to receive the data.
400(KO/Pi and KA/Pi are always running if Fastload for them is enabled!) 407(KO/Pi and KA/Pi are always running if Fastload for them is enabled!)
401 408
402In the KA/Pi details view are now the preferred tel. numbers displayed on top 409In the KA/Pi details view are now the preferred tel. numbers displayed on top
403of the other data ( emails/tel.numbers/addresses) 410of the other data ( emails/tel.numbers/addresses)
404 411
405Fixed some syncing problems in KA/Pi. 412Fixed some syncing problems in KA/Pi.
406 413
407Added font settings for the KA/Pi details view. 414Added font settings for the KA/Pi details view.
408Added fields "children's name" and "gender" to KA/Pi. 415Added fields "children's name" and "gender" to KA/Pi.
409 416
410Made searching in KA/Pi better: 417Made searching in KA/Pi better:
411Now the first item in a view is selected after a search automatically and 418Now the first item in a view is selected after a search automatically and
412the views can be scrolled up/down when the search input field has the keyboard focus. 419the views can be scrolled up/down when the search input field has the keyboard focus.
413 420
414And, of course, fixed a bunch of reported bugs in KO/Pi and KA/Pi. 421And, of course, fixed a bunch of reported bugs in KO/Pi and KA/Pi.
415 422
416 423
417********** VERSION 1.9.6 ************ 424********** VERSION 1.9.6 ************
418 425
419Changes in the external application communication on the Zaurus 426Changes in the external application communication on the Zaurus
420in order to use less RAM when the apps are running. 427in order to use less RAM when the apps are running.
421First syncing of addressbooks (KA/Pi) is possible. 428First syncing of addressbooks (KA/Pi) is possible.
422 429
423 430
424********** VERSION 1.9.5a ************ 431********** VERSION 1.9.5a ************
425 432
426Fixed a bug in KO/Pi in the SharpDTM sync of version 1.9.5. 433Fixed a bug in KO/Pi in the SharpDTM sync of version 1.9.5.
427Fixed some small bugs. 434Fixed some small bugs.
428KA/Pi shows now the birthday in summary view. 435KA/Pi shows now the birthday in summary view.
429Now OM/Pi and KA/Pi are using the date format defined in KO/Pi 436Now OM/Pi and KA/Pi are using the date format defined in KO/Pi
430for displaying dates. 437for displaying dates.
431 438
432 439
433********** VERSION 1.9.5 ************ 440********** VERSION 1.9.5 ************
434 441
435There is still no Addressbook syncing! 442There is still no Addressbook syncing!
436 443
437New in 1.9.5: 444New in 1.9.5:
438 445
439Many bugfixes. 446Many bugfixes.
440Better searching in KA/Pi. 447Better searching in KA/Pi.
441You can configure in KA/Pi if you want to search only after 448You can configure in KA/Pi if you want to search only after
442<return> key pressed. 449<return> key pressed.
443 450
444Better mail downloading in OM/Pi. 451Better mail downloading in OM/Pi.
445 452
446First experimental alpha version of sync of KO/Pi with mobile phones. 453First experimental alpha version of sync of KO/Pi with mobile phones.
447See gammu documentation for supported phones. 454See gammu documentation for supported phones.
448You need to install the package kammu_1.9.5_arm.ipk for sync of KO/Pi with mobile phones. kammu_1.9.5_arm.ipk needs libbluetooth and libsdp. 455You need to install the package kammu_1.9.5_arm.ipk for sync of KO/Pi with mobile phones. kammu_1.9.5_arm.ipk needs libbluetooth and libsdp.
449Quick hint how to use: 456Quick hint how to use:
450NOTE: MOBILE PHONE SYNC IS EXPERIMENTAL! 457NOTE: MOBILE PHONE SYNC IS EXPERIMENTAL!
451Install kammu_1.9.5_arm.ipk , libbluetooth and libsdp. 458Install kammu_1.9.5_arm.ipk , libbluetooth and libsdp.
452Create syncprofile - mobile device 459Create syncprofile - mobile device
453Remove entry for model. (Leave empty ). 460Remove entry for model. (Leave empty ).
454Enable infrared on Zaurus and your Phone. 461Enable infrared on Zaurus and your Phone.
455Sync. 462Sync.
456To get a more detailed log, start kopi from konsole. 463To get a more detailed log, start kopi from konsole.
457 464
458********** VERSION 1.9.4 ************ 465********** VERSION 1.9.4 ************
459 466
460This is the version 1.9.4 of KDE-Pim/Pi for the Zaurus. 467This is the version 1.9.4 of KDE-Pim/Pi for the Zaurus.
461 468
462WARNING: 469WARNING:
463PLEASE BACKUP ALL YOUR DATA! 470PLEASE BACKUP ALL YOUR DATA!
464We have changed a lot and maybe there are some unknown problems. 471We have changed a lot and maybe there are some unknown problems.
465 472
466SYNC HANDLING HAS CHANGED! 473SYNC HANDLING HAS CHANGED!
467Such that, if you sync now with an already synded device, you will duplicated entries after the first sync. 474Such that, if you sync now with an already synded device, you will duplicated entries after the first sync.
468(This change was introduced to make it possible to sync with mobile phones, which will be available later (maybe in 4 weeks). 475(This change was introduced to make it possible to sync with mobile phones, which will be available later (maybe in 4 weeks).
469 476
470You need the kmicrokdelibs_1.9.4_arm.ipk as a base for the other programs. 477You need the kmicrokdelibs_1.9.4_arm.ipk as a base for the other programs.
471If you get the error: "Install only possible in main memory", just try it again to install it on SD card. That worked for me. And it was reported that rebooting Qtopia did help in this case as well. 478If you get the error: "Install only possible in main memory", just try it again to install it on SD card. That worked for me. And it was reported that rebooting Qtopia did help in this case as well.
472 479
473As programs are available: 480As programs are available:
474KO/Pi (korganizer ipk) - a calendar program. 481KO/Pi (korganizer ipk) - a calendar program.
475KA/Pi (kaddressbook ipk ) - an addressbook 482KA/Pi (kaddressbook ipk ) - an addressbook
476OM/Pi (kopiemail ipk ) an email program with pop/smtp and IMAP support. 483OM/Pi (kopiemail ipk ) an email program with pop/smtp and IMAP support.
477 484
478An alarm notification program ( korganizer-alarm ipk ) for KO/Pi that notifies you about alarms, even if the Zaurus is in suspend mode. 485An alarm notification program ( korganizer-alarm ipk ) for KO/Pi that notifies you about alarms, even if the Zaurus is in suspend mode.
479(If you do not see an icon in the taskbar after installing korganizer-alarm, please restart Qtopia) 486(If you do not see an icon in the taskbar after installing korganizer-alarm, please restart Qtopia)
480 487
481All the applications are installed in a "Pim" TAB. 488All the applications are installed in a "Pim" TAB.
482If this TAB is new on your system, you can get an icon in this TAB by installing pim_TAB_icon_1.9.4_arm.ipk 489If this TAB is new on your system, you can get an icon in this TAB by installing pim_TAB_icon_1.9.4_arm.ipk
483 490
484All the application are integrated. 491All the application are integrated.
485Such that you can choose in KO/Pi the attendees of a meeting from the addresses in KA/Pi. When you click in KA/Pi on the email address, OM/Pi is started to write the mail. 492Such that you can choose in KO/Pi the attendees of a meeting from the addresses in KA/Pi. When you click in KA/Pi on the email address, OM/Pi is started to write the mail.
486 493
487HINT: 494HINT:
488If you install KPhone/Pi 0.9.7, it will be called, if you click in KA/Pi on a phone number. 495If you install KPhone/Pi 0.9.7, it will be called, if you click in KA/Pi on a phone number.
489 496
490What's new? 497What's new?
491 498
492SYNC HANDLING HAS CHANGED! 499SYNC HANDLING HAS CHANGED!
493Such that, if you sync now with an already synded device, you will duplicated entries after the first sync. 500Such that, if you sync now with an already synded device, you will duplicated entries after the first sync.
494(This change was introduced to make it possible to sync with mobile phones, which will be available later (maybe in 4 weeks). 501(This change was introduced to make it possible to sync with mobile phones, which will be available later (maybe in 4 weeks).
495 502
496New in OM/Pi: 503New in OM/Pi:
497When copying(i.e. downloading mails) , you can specify, that only mails of a given size should be downloaded. Added mail copy possibility for selected mails. 504When copying(i.e. downloading mails) , you can specify, that only mails of a given size should be downloaded. Added mail copy possibility for selected mails.
498 505
499New in KO/Pi: 506New in KO/Pi:
500French is now available for KO/Pi. 507French is now available for KO/Pi.
501Choose menu:Actions - Configure:TAB locale 508Choose menu:Actions - Configure:TAB locale
502Syncing has changed. 509Syncing has changed.
503Phone sync available soon. 510Phone sync available soon.
504Not much changes, I cannot remember them ... 511Not much changes, I cannot remember them ...
505 512
506New in KA/Pi: 513New in KA/Pi:
507Beaming possible. 514Beaming possible.
508Sharp DTM readonly access possible( create a new DTM resource ); 515Sharp DTM readonly access possible( create a new DTM resource );
509Better searching possible. 516Better searching possible.
510Search is performed only after pressing the return key. 517Search is performed only after pressing the return key.
511Use wildcard * to specify parts of a name. 518Use wildcard * to specify parts of a name.
512 519
513Better name/email selection dialog (called from KO/Pi or OM/Pi). In this dialog, now searching is possible. Like in KA/Pi, use return key and wildcard * . 520Better name/email selection dialog (called from KO/Pi or OM/Pi). In this dialog, now searching is possible. Like in KA/Pi, use return key and wildcard * .
514 521
515A big improvement is the new management of the contact access. 522A big improvement is the new management of the contact access.
516In version 1.9.3, every application was using their own addressbook access data. 523In version 1.9.3, every application was using their own addressbook access data.
517That means, the addressbook was loaded up to three times in the memory, when accessed by KA/Pi, KO/Pi and OM/Pi. 524That means, the addressbook was loaded up to three times in the memory, when accessed by KA/Pi, KO/Pi and OM/Pi.
518That was wasting of memory, if you had several hundreds of contacts. 525That was wasting of memory, if you had several hundreds of contacts.
519 526
520Now only KA/Pi accesses the addressbook. 527Now only KA/Pi accesses the addressbook.
521If KO/Pi or OM/Pi want to get some name/email data, they request KA/Pi to open the name/email selection dialog and send it back to them. 528If KO/Pi or OM/Pi want to get some name/email data, they request KA/Pi to open the name/email selection dialog and send it back to them.
522If you click on an attendee in a meeting, its contact data is displayed in KA/Pi directly. 529If you click on an attendee in a meeting, its contact data is displayed in KA/Pi directly.
523That means, if KO/Pi or OM/Pi want to access contact data, KA/Pi is started first. 530That means, if KO/Pi or OM/Pi want to access contact data, KA/Pi is started first.
524 531
525New in the KO/Pi alarm applet: 532New in the KO/Pi alarm applet:
526Configure your own timer popup menu! 533Configure your own timer popup menu!
527(Text and minutes for timer countdown) 534(Text and minutes for timer countdown)
528Just edit the file 535Just edit the file
529(yourhomedir)/.kopialarmtimerrc 536(yourhomedir)/.kopialarmtimerrc
530and start/stop a timer to get a new menu with the data of this file. 537and start/stop a timer to get a new menu with the data of this file.
531 538
532********** VERSION 1.9.3 ************ 539********** VERSION 1.9.3 ************
5331) 5401)
534Now KO/Pi on Windows imports directly the calendar data of 541Now KO/Pi on Windows imports directly the calendar data of
535an installed Outlook. Should work with OL version >= 2000. 542an installed Outlook. Should work with OL version >= 2000.
536 543
537********** VERSION 1.9.2 ************ 544********** VERSION 1.9.2 ************
5381) 5451)
539KDE-Pim/Pi has got a new member: 546KDE-Pim/Pi has got a new member:
540KmicroMail (KM/Pi) is a mail program, 547KmicroMail (KM/Pi) is a mail program,
541which can handle IMAP and POP mail access. 548which can handle IMAP and POP mail access.
542It is based on Opie-Mail v3. 549It is based on Opie-Mail v3.
543All dependencies to the Opie libraries ar removed, 550All dependencies to the Opie libraries ar removed,
544such that no additional Opie lib is needed. 551such that no additional Opie lib is needed.
545It is already integrated in KO/Pi and KA/Pi. 552It is already integrated in KO/Pi and KA/Pi.
546It it now available for the Zaurus,probably it 553It it now available for the Zaurus,probably it
547will be available for other platforms later. 554will be available for other platforms later.
548Hint: 555Hint:
549Create your own contact (name + email) 556Create your own contact (name + email)
550in KA/Pi, select this contact and choose menu: 557in KA/Pi, select this contact and choose menu:
551Settings - Set Who Am I. 558Settings - Set Who Am I.
552Now the settings of this contact are used as 559Now the settings of this contact are used as
553the sender data in KM/Pi. 560the sender data in KM/Pi.
5542) 5612)
555KDE-Pim/Pi is split up in five different 562KDE-Pim/Pi is split up in five different
556packages now precompiled for Sharp Zaurus: 563packages now precompiled for Sharp Zaurus:
557--kmicrokdelibs_1.9.2_arm.ipk 564--kmicrokdelibs_1.9.2_arm.ipk
558The libs are needed for any 565The libs are needed for any
559of the following programs: 566of the following programs:
560--kaddressbook_1.9.2_arm.ipk 567--kaddressbook_1.9.2_arm.ipk
561--kmicromail_1.9.2_arm.ipk 568--kmicromail_1.9.2_arm.ipk
562--korganizer_1.9.2_arm.ipk 569--korganizer_1.9.2_arm.ipk
563Independ from that, there is the alarm applet 570Independ from that, there is the alarm applet
564available for KO/Pi, which also offers 571available for KO/Pi, which also offers
565quick access for a new mail or 572quick access for a new mail or
566showing the addressbook.: 573showing the addressbook.:
567--korganizer-alarm_1.9.2_arm.ipk 574--korganizer-alarm_1.9.2_arm.ipk
568Independend means, that the alarm applet 575Independend means, that the alarm applet
569does not need any of the libs or programs above to run. 576does not need any of the libs or programs above to run.
570But it would be quite useless without these programs. 577But it would be quite useless without these programs.
571NOTE: 578NOTE:
572If you get a 579If you get a
573"This application depends on other programs" 580"This application depends on other programs"
574during installation of 581during installation of
575--kmicrokdelibs_1.9.2_arm.ipk 582--kmicrokdelibs_1.9.2_arm.ipk
576you probably do not have to care about that. 583you probably do not have to care about that.
577kmicrokdelibs_1.9.2 will come with some 584kmicrokdelibs_1.9.2 will come with some
578resource plugins, which needs additional libraries. 585resource plugins, which needs additional libraries.
579(E.g. libopie1, if you want to use the 586(E.g. libopie1, if you want to use the
580opie resource connector in KA/Pi). 587opie resource connector in KA/Pi).
581If you do not have this libraries installed, 588If you do not have this libraries installed,
582you simply cannot use the resource. 589you simply cannot use the resource.
583To make it clear: 590To make it clear:
584If the libraries are missing, the applications 591If the libraries are missing, the applications
585using kmicrokdelibs will start, 592using kmicrokdelibs will start,
586because the resources are plugins. 593because the resources are plugins.
5873) 5943)
588KO/Pi and friends are now installable on SD-Card! 595KO/Pi and friends are now installable on SD-Card!
589It is recommended to install all libs and apps 596It is recommended to install all libs and apps
590on the SD card or all in the internal storage. 597on the SD card or all in the internal storage.
591There may be problems, if this is mixed. 598There may be problems, if this is mixed.
5924) 5994)
593Fixed two bugs in the alarm notification on Windows. 600Fixed two bugs in the alarm notification on Windows.
5945) 6015)
595Great improvement! 602Great improvement!
596KO/Pi uses now the latest version of libical. 603KO/Pi uses now the latest version of libical.
597Libical is the library which actually reads 604Libical is the library which actually reads
598the calendar files and extract the data from it. 605the calendar files and extract the data from it.
599With the old version, there were problems 606With the old version, there were problems
600(crashes or program hangs) when licical did read 607(crashes or program hangs) when licical did read
601files, which were not stored from KO/Pi. 608files, which were not stored from KO/Pi.
602I do not know, if the new libical works perfect, 609I do not know, if the new libical works perfect,
603but actually it works much better than 610but actually it works much better than
604the old version. 611the old version.
605There are no problems with compatibility with 612There are no problems with compatibility with
606old calendar files of KO/Pi, of course! 613old calendar files of KO/Pi, of course!
6076) 6146)
608New in KA/Pi: 615New in KA/Pi:
609Opie addressbook resource connector available! 616Opie addressbook resource connector available!
610You will need libopie1 and the opie addressbook, 617You will need libopie1 and the opie addressbook,
611of course. 618of course.
612With the Opie addressbook resource connector, 619With the Opie addressbook resource connector,
613you can access the Opie addressbook readonly in KA/Pi. 620you can access the Opie addressbook readonly in KA/Pi.
614If you want to edit or import the data into KA/Pi, 621If you want to edit or import the data into KA/Pi,
615do this: 622do this:
616a) Create an Opie resource. 623a) Create an Opie resource.
617 (Menu: Settings-Configure Resources). 624 (Menu: Settings-Configure Resources).
618After configuration and restarting KA/Pi you should see 625After configuration and restarting KA/Pi you should see
619the Opie contacts in KA/Pi. 626the Opie contacts in KA/Pi.
620b) Select some or all Opie contacts. 627b) Select some or all Opie contacts.
621(NOTE: +++++ 628(NOTE: +++++
622To know exactly, what contacts are Opie contacts, 629To know exactly, what contacts are Opie contacts,
623do this: Choose menu: 630do this: Choose menu:
624View-Modify View - TAB Fields. 631View-Modify View - TAB Fields.
625Select in the above list "Resource" and click 632Select in the above list "Resource" and click
626down arrow to add it to the "Selected fields". 633down arrow to add it to the "Selected fields".
627Click OK. 634Click OK.
628Now you have a new column "Resource" in your list, 635Now you have a new column "Resource" in your list,
629where you can see, what an Opie resource is. 636where you can see, what an Opie resource is.
630++++ NOTE end.) 637++++ NOTE end.)
631Ok, we do have now some Opie contacts seleted. 638Ok, we do have now some Opie contacts seleted.
632(Use SHIFT or CTRL key in order to multiple select). 639(Use SHIFT or CTRL key in order to multiple select).
633c) Choose menu: Edit-Copy. 640c) Choose menu: Edit-Copy.
634d) Choose menu: Edit-Paste. 641d) Choose menu: Edit-Paste.
635e) Select the resource, you want to add the contacts to. 642e) Select the resource, you want to add the contacts to.
636Congrats! Now you have read/write access to the copied 643Congrats! Now you have read/write access to the copied
637opie contacts as "real" KA/Pi contacts. 644opie contacts as "real" KA/Pi contacts.
638 645
639 646
640********** VERSION 1.9.1 ************ 647********** VERSION 1.9.1 ************
6411) 6481)
642 +++ IMPORTANT 1 +++ 649 +++ IMPORTANT 1 +++
643 650
644The storing place of the default calendar 651The storing place of the default calendar
645file has changed! 652file has changed!
646The default calendar file was 653The default calendar file was
647Applications/korganizer/mycalendar.ics 654Applications/korganizer/mycalendar.ics
648on Zaurus and 655on Zaurus and
649(yourHomeDir)/korganizer/mycalendar.ics 656(yourHomeDir)/korganizer/mycalendar.ics
650on Windows/Linux desktop. Now it is 657on Windows/Linux desktop. Now it is
651(yourHomeDir)/kdepim/korganizer/mycalendar.ics 658(yourHomeDir)/kdepim/korganizer/mycalendar.ics
652on Zaurus, Windows and Linux. 659on Zaurus, Windows and Linux.
653To load the old file, choose menu 660To load the old file, choose menu
654File-Load calendar backup. 661File-Load calendar backup.
655(It should be loaded automatically 662(It should be loaded automatically
656at startup with a warning message displayed). 663at startup with a warning message displayed).
657The place of the configuration file has changed too. 664The place of the configuration file has changed too.
658If you want to use your old KO/Pi config, 665If you want to use your old KO/Pi config,
659copy it to 666copy it to
660(yourHomeDir)/kdepim/config/korganizerrc 667(yourHomeDir)/kdepim/config/korganizerrc
661Please read VERSION 1.9.0 - topic 3) as well! 668Please read VERSION 1.9.0 - topic 3) as well!
662 669
663 +++ IMPORTANT 2 +++ 670 +++ IMPORTANT 2 +++
664 671
665Because of the new paths, you will need 672Because of the new paths, you will need
666a new version of the KO/Pi alarm applet 673a new version of the KO/Pi alarm applet
667for Zaurus. 674for Zaurus.
668Use version >= 1.9.1 675Use version >= 1.9.1
669 676
6702) 6772)
671Now the QWhat'sThis Icon works for items 678Now the QWhat'sThis Icon works for items
672in the month view as well. 679in the month view as well.
673(See VERSION 1.7.8 Topic 1) ). 680(See VERSION 1.7.8 Topic 1) ).
6743) 6813)
675You can import birtsdays/anniversaries 682You can import birtsdays/anniversaries
676from KA/Pi into KO/Pi. 683from KA/Pi into KO/Pi.
677Choose menu File-Import birthdays. 684Choose menu File-Import birthdays.
678If you import twice, already imported items 685If you import twice, already imported items
679will not be imported again, if they 686will not be imported again, if they
680have not been changed in KO/Pi. 687have not been changed in KO/Pi.
6814) 6884)
682When syncing with sharp DTM, now a progress 689When syncing with sharp DTM, now a progress
683is shown, when the data is written back. 690is shown, when the data is written back.
684If there is much data in KO/Pi and no data 691If there is much data in KO/Pi and no data
685in DTM, that can take a long time. 692in DTM, that can take a long time.
686(But only for the first time ). 693(But only for the first time ).
6875) 6945)
688In the search dialog, you can search 695In the search dialog, you can search
689now for the name/email of an attendee 696now for the name/email of an attendee
690of an event/todo. 697of an event/todo.
691To get more space for displaying 698To get more space for displaying
692search results, the buttons 699search results, the buttons
693for "search" and "close" on the 700for "search" and "close" on the
694bottom are removed in the PDA version. 701bottom are removed in the PDA version.
695You have to click OK in the top right 702You have to click OK in the top right
696corner to do a search. 703corner to do a search.
6976) 7046)
698Now it is possible to disable the displaying 705Now it is possible to disable the displaying
699of todo items in the Allday part of the Agenda. 706of todo items in the Allday part of the Agenda.
700Choose Menu Action-Configure, 707Choose Menu Action-Configure,
701TAB Todo View, checkbox 708TAB Todo View, checkbox
702"Allday Agenda view shows todos" 709"Allday Agenda view shows todos"
7037) 7107)
704If FastLoad is enabled, now the settings and the 711If FastLoad is enabled, now the settings and the
705calendar data are saved, when KO/Pi is closed. 712calendar data are saved, when KO/Pi is closed.
706(If no Fastload is enabled, KO/Pi saves 713(If no Fastload is enabled, KO/Pi saves
707the data as well, of course) 714the data as well, of course)
7088) 7158)
709The Agenda View has a minimize-splitter now, 716The Agenda View has a minimize-splitter now,
710such that the height of the allday part can be 717such that the height of the allday part can be
711changed quickly. 718changed quickly.
712 719
713********** VERSION 1.9.0 ************ 720********** VERSION 1.9.0 ************
7141) 7211)
715KO/Pi is now merged with the new microKDE from KA/Pi. 722KO/Pi is now merged with the new microKDE from KA/Pi.
716KO/Pi accesses now KA/Pi as the addressbook. 723KO/Pi accesses now KA/Pi as the addressbook.
717The other ddressbook-plugins are not working any longer. 724The other ddressbook-plugins are not working any longer.
718(It is planned, that later KA/Pi itself uses these plugins) 725(It is planned, that later KA/Pi itself uses these plugins)
719New versions of KO/Pi are only available 726New versions of KO/Pi are only available
720together with KA/Pi as the KDE-Pim/Pi package. 727together with KA/Pi as the KDE-Pim/Pi package.
7212) 7282)
722If you click on an attendee of a meeting in the 729If you click on an attendee of a meeting in the
723event viewer, a detailed summary of the 730event viewer, a detailed summary of the
724attendee is shown. 731attendee is shown.
7253) 7323)
726The place of the configuration file has changed. 733The place of the configuration file has changed.
727If you want to use your old KO/Pi config, copy 734If you want to use your old KO/Pi config, copy
728Applications/korganizer/config_korganizerrc 735Applications/korganizer/config_korganizerrc
729to 736to
730Applications/korganizer/config/korganizerrc 737Applications/korganizer/config/korganizerrc
731 738
732********** VERSION 1.7.8 ************ 739********** VERSION 1.7.8 ************
7331) 7401)
734Now the QWhat'sThis ist working. 741Now the QWhat'sThis ist working.
735Enable the QWhat'sThis icon in the toolbar. 742Enable the QWhat'sThis icon in the toolbar.
736(You have to restart to reload the changed toolbar config). 743(You have to restart to reload the changed toolbar config).
737Now click on the QWhat'sThis Icon 744Now click on the QWhat'sThis Icon
738in the top right corner of KO/Pi. 745in the top right corner of KO/Pi.
739Then click on an item in the Agenda View: 746Then click on an item in the Agenda View:
740You will get a detailed display of the items content. 747You will get a detailed display of the items content.
7412) 7482)
742Some other very minor changes. 749Some other very minor changes.
743But I have forgotten the details ... 750But I have forgotten the details ...
744For that reason I start this log here: 751For that reason I start this log here:
745To document my changes, when I am doing it. 752To document my changes, when I am doing it.
746 753
747********** VERSION 1.7.7 ************ 754********** VERSION 1.7.7 ************
748Stable Version of KO/Pi 755Stable Version of KO/Pi
diff --git a/libkdepim/kcmconfigs/kdepimconfigwidget.cpp b/libkdepim/kcmconfigs/kdepimconfigwidget.cpp
index 20594c6..d097078 100644
--- a/libkdepim/kcmconfigs/kdepimconfigwidget.cpp
+++ b/libkdepim/kcmconfigs/kdepimconfigwidget.cpp
@@ -1,799 +1,837 @@
1/* 1/*
2 This file is part of KdePim/Pi. 2 This file is part of KdePim/Pi.
3 Copyright (c) 2004 Ulf Schenk 3 Copyright (c) 2004 Ulf Schenk
4 4
5 This program is free software; you can redistribute it and/or modify 5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by 6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or 7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version. 8 (at your option) any later version.
9 9
10 This program is distributed in the hope that it will be useful, 10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details. 13 GNU General Public License for more details.
14 14
15 You should have received a copy of the GNU General Public License 15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software 16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 18
19 As a special exception, permission is given to link this program 19 As a special exception, permission is given to link this program
20 with any edition of Qt, and distribute the resulting executable, 20 with any edition of Qt, and distribute the resulting executable,
21 without including the source code for Qt in the source distribution. 21 without including the source code for Qt in the source distribution.
22*/ 22*/
23 23
24/* 24/*
25Enhanced Version of the file for platform independent KDE tools. 25Enhanced Version of the file for platform independent KDE tools.
26Copyright (c) 2004 Ulf Schenk 26Copyright (c) 2004 Ulf Schenk
27 27
28$Id$ 28$Id$
29*/ 29*/
30 30
31#include <qlayout.h> 31#include <qlayout.h>
32#include <qtabwidget.h> 32#include <qtabwidget.h>
33#include <qcombobox.h> 33#include <qcombobox.h>
34#include <qgroupbox.h> 34#include <qgroupbox.h>
35#include <qlabel.h> 35#include <qlabel.h>
36#include <qlineedit.h> 36#include <qlineedit.h>
37#include <qbuttongroup.h> 37#include <qbuttongroup.h>
38#include <qfile.h> 38#include <qfile.h>
39#include <qvbox.h>
40#include <qdir.h>
39#include <qregexp.h> 41#include <qregexp.h>
40 42
41#include <kdialog.h> 43#include <kdialog.h>
42#include <klocale.h> 44#include <klocale.h>
43#include <kdateedit.h> 45#include <kdateedit.h>
44#include <kglobal.h> 46#include <kglobal.h>
45#include <stdlib.h> 47#include <stdlib.h>
46 48
47/*US 49/*US
48#include <qcheckbox.h> 50#include <qcheckbox.h>
49#include <qframe.h> 51#include <qframe.h>
50#include <qpushbutton.h> 52#include <qpushbutton.h>
51#include <qcombobox.h> 53#include <qcombobox.h>
52#include <qlineedit.h> 54#include <qlineedit.h>
53#include <qlabel.h> 55#include <qlabel.h>
54#include <qfile.h> 56#include <qfile.h>
55 57
56#include <kconfig.h> 58#include <kconfig.h>
57#include <kdebug.h> 59#include <kdebug.h>
58#include <kdialog.h> 60#include <kdialog.h>
59#include <klistview.h> 61#include <klistview.h>
60#include <klocale.h> 62#include <klocale.h>
61#include <kglobal.h> 63#include <kglobal.h>
62#include <kmessagebox.h> 64#include <kmessagebox.h>
63#include <kstandarddirs.h> 65#include <kstandarddirs.h>
64 66
65#ifndef KAB_EMBEDDED 67#ifndef KAB_EMBEDDED
66#include <ktrader.h> 68#include <ktrader.h>
67#else // KAB_EMBEDDED 69#else // KAB_EMBEDDED
68#include <mergewidget.h> 70#include <mergewidget.h>
69#include <distributionlistwidget.h> 71#include <distributionlistwidget.h>
70#endif // KAB_EMBEDDED 72#endif // KAB_EMBEDDED
71 73
72#include "addresseewidget.h" 74#include "addresseewidget.h"
73#include "extensionconfigdialog.h" 75#include "extensionconfigdialog.h"
74#include "extensionwidget.h" 76#include "extensionwidget.h"
75*/ 77*/
76 78
77#include "qapplication.h" 79#include "qapplication.h"
78 80
79#include "kpimglobalprefs.h" 81#include "kpimglobalprefs.h"
80 82
81#include "kdepimconfigwidget.h" 83#include "kdepimconfigwidget.h"
82 84
83 85
84KDEPIMConfigWidget::KDEPIMConfigWidget(KPimGlobalPrefs *prefs, QWidget *parent, const char *name ) 86KDEPIMConfigWidget::KDEPIMConfigWidget(KPimGlobalPrefs *prefs, QWidget *parent, const char *name )
85 : KPrefsWidget(prefs, parent, name ) 87 : KPrefsWidget(prefs, parent, name )
86{ 88{
87 mExternalAppsMap.insert(ExternalAppHandler::EMAIL, i18n("Email")); 89 mExternalAppsMap.insert(ExternalAppHandler::EMAIL, i18n("Email"));
88 mExternalAppsMap.insert(ExternalAppHandler::PHONE, i18n("Phone")); 90 mExternalAppsMap.insert(ExternalAppHandler::PHONE, i18n("Phone"));
89 mExternalAppsMap.insert(ExternalAppHandler::SMS, i18n("SMS")); 91 mExternalAppsMap.insert(ExternalAppHandler::SMS, i18n("SMS"));
90 mExternalAppsMap.insert(ExternalAppHandler::FAX, i18n("Fax")); 92 mExternalAppsMap.insert(ExternalAppHandler::FAX, i18n("Fax"));
91 mExternalAppsMap.insert(ExternalAppHandler::PAGER, i18n("Pager")); 93 mExternalAppsMap.insert(ExternalAppHandler::PAGER, i18n("Pager"));
92 mExternalAppsMap.insert(ExternalAppHandler::SIP, i18n("SIP")); 94 mExternalAppsMap.insert(ExternalAppHandler::SIP, i18n("SIP"));
93 95
94 96
95 QVBoxLayout *topLayout = new QVBoxLayout( this, 0, 97 QVBoxLayout *topLayout = new QVBoxLayout( this, 0,
96 KDialog::spacingHint() ); 98 KDialog::spacingHint() );
97 99
98 tabWidget = new QTabWidget( this ); 100 tabWidget = new QTabWidget( this );
99 topLayout->addWidget( tabWidget ); 101 topLayout->addWidget( tabWidget );
100 102
101 103
102 setupLocaleTab(); 104 setupLocaleTab();
103 setupLocaleDateTab(); 105 setupLocaleDateTab();
104 setupTimeZoneTab(); 106 setupTimeZoneTab();
105 setupExternalAppTab(); 107 setupExternalAppTab();
108 setupStoreTab();
106 109
107} 110}
108void KDEPIMConfigWidget::showTimeZoneTab() 111void KDEPIMConfigWidget::showTimeZoneTab()
109{ 112{
110 tabWidget->setCurrentPage ( 3 ) ; 113 tabWidget->setCurrentPage ( 3 ) ;
111} 114}
115void KDEPIMConfigWidget::setupStoreTab()
116{
117 QVBox *storePage = new QVBox( this );
118 new QLabel( i18n("Your current storage dir is:\n%1\nYour mail is stored in:\n(storagedir)/apps/kopiemail/localmail").arg(KGlobal::dirs()->localkdedir()), storePage );
119 new QLabel( i18n("<b>Set new data storage dir:</b>"), storePage );
120 mStoreUrl = new KURLRequester( storePage );
121 mStoreUrl->setURL( KGlobal::dirs()->localkdedir() );
122 new QLabel( i18n("Not existing dirs are created automatically"), storePage );
123 QHBox *bb = new QHBox( storePage );
124 QPushButton * pb = new QPushButton ( i18n("Save settings"), bb );
125 connect(pb, SIGNAL( clicked() ), this, SLOT ( saveStoreSettings() ) );
126 pb = new QPushButton ( i18n("Save standard"), bb );
127 connect(pb, SIGNAL( clicked() ), this, SLOT ( setStandardStore() ) );
128 new QLabel( i18n("<b>New settings are used\nafter a restart</b>"), storePage );
129 new QLabel( i18n("The settings of the storage\ndir is saved in the file\n%1").arg(QDir::homeDirPath() + "/.microkdehome" ), storePage );
130 tabWidget->addTab( storePage, i18n( "Data storage path" ) );
131}
132void KDEPIMConfigWidget::setStandardStore()
133{
134 mStoreUrl->setURL( QDir::homeDirPath() + "/kdepim" );
135 saveStoreSettings();
136}
137void KDEPIMConfigWidget::saveStoreSettings()
138{
139 if ( !mStoreUrl->url().isEmpty() ) {
140 KConfig cfg ( QDir::homeDirPath() + "/.microkdehome" );
141 cfg.setGroup("Global");
142 cfg.writeEntry( "MICROKDEHOME", mStoreUrl->url() );
143 qDebug("cfg.writeEntry( MICROKDEHOME, mStoreUrl->url() ); ");
144 cfg.sync();
145 } else {
146 mStoreUrl->setURL( QDir::homeDirPath() + "/kdepim" );
147 saveStoreSettings();
148 }
149}
112void KDEPIMConfigWidget::setupExternalAppTab() 150void KDEPIMConfigWidget::setupExternalAppTab()
113{ 151{
114 QWidget *externalAppsPage = new QWidget( this ); 152 QWidget *externalAppsPage = new QWidget( this );
115 QVBoxLayout* layout = new QVBoxLayout( externalAppsPage, KDialog::marginHintSmall(), 153 QVBoxLayout* layout = new QVBoxLayout( externalAppsPage, KDialog::marginHintSmall(),
116 KDialog::spacingHintSmall() ); 154 KDialog::spacingHintSmall() );
117 155
118 mExternalApps = new QComboBox( externalAppsPage ); 156 mExternalApps = new QComboBox( externalAppsPage );
119 157
120 QMap<ExternalAppHandler::Types, QString>::Iterator it; 158 QMap<ExternalAppHandler::Types, QString>::Iterator it;
121 for( it = mExternalAppsMap.begin(); it != mExternalAppsMap.end(); ++it ) 159 for( it = mExternalAppsMap.begin(); it != mExternalAppsMap.end(); ++it )
122 mExternalApps->insertItem( it.data(), it.key() ); 160 mExternalApps->insertItem( it.data(), it.key() );
123 161
124 layout->addWidget( mExternalApps ); 162 layout->addWidget( mExternalApps );
125 163
126 connect( mExternalApps, SIGNAL( activated( int ) ), 164 connect( mExternalApps, SIGNAL( activated( int ) ),
127 this, SLOT (externalapp_changed( int ) ) ); 165 this, SLOT (externalapp_changed( int ) ) );
128 166
129 167
130 mExternalAppGroupBox = new QGroupBox( 0, Qt::Vertical, i18n( "Used Mail Client" ), externalAppsPage ); 168 mExternalAppGroupBox = new QGroupBox( 0, Qt::Vertical, i18n( "Used Mail Client" ), externalAppsPage );
131 QGridLayout *boxLayout = new QGridLayout( mExternalAppGroupBox->layout(), 4, 2, -1, "gridlayout" ); 169 QGridLayout *boxLayout = new QGridLayout( mExternalAppGroupBox->layout(), 4, 2, -1, "gridlayout" );
132 mExternalAppGroupBox->layout()->setMargin(5); 170 mExternalAppGroupBox->layout()->setMargin(5);
133 171
134 mClient = new QComboBox( mExternalAppGroupBox ); 172 mClient = new QComboBox( mExternalAppGroupBox );
135 boxLayout->addMultiCellWidget( mClient, 0, 0, 0, 1 ); 173 boxLayout->addMultiCellWidget( mClient, 0, 0, 0, 1 );
136 174
137 connect( mClient, SIGNAL( activated( int ) ), 175 connect( mClient, SIGNAL( activated( int ) ),
138 this, SLOT (client_changed( int ) ) ); 176 this, SLOT (client_changed( int ) ) );
139 177
140 QLabel* lab = new QLabel( i18n("Channel:"), mExternalAppGroupBox); 178 QLabel* lab = new QLabel( i18n("Channel:"), mExternalAppGroupBox);
141 boxLayout->addWidget( lab, 1, 0 ); 179 boxLayout->addWidget( lab, 1, 0 );
142 mChannel = new QLineEdit(mExternalAppGroupBox); 180 mChannel = new QLineEdit(mExternalAppGroupBox);
143 mChannel->setReadOnly(true); 181 mChannel->setReadOnly(true);
144 boxLayout->addMultiCellWidget( mChannel, 2 , 2, 0, 1 ); 182 boxLayout->addMultiCellWidget( mChannel, 2 , 2, 0, 1 );
145 183
146 lab = new QLabel( i18n("Message:"), mExternalAppGroupBox); 184 lab = new QLabel( i18n("Message:"), mExternalAppGroupBox);
147 boxLayout->addWidget( lab, 3, 0 ); 185 boxLayout->addWidget( lab, 3, 0 );
148 mMessage = new QLineEdit(mExternalAppGroupBox); 186 mMessage = new QLineEdit(mExternalAppGroupBox);
149 mMessage->setReadOnly(true); 187 mMessage->setReadOnly(true);
150 boxLayout->addWidget( mMessage , 4, 0); 188 boxLayout->addWidget( mMessage , 4, 0);
151 189
152 lab = new QLabel( i18n("Parameters:"), mExternalAppGroupBox); 190 lab = new QLabel( i18n("Parameters:"), mExternalAppGroupBox);
153 boxLayout->addWidget( lab, 3, 1 ); 191 boxLayout->addWidget( lab, 3, 1 );
154 mParameters = new QLineEdit(mExternalAppGroupBox); 192 mParameters = new QLineEdit(mExternalAppGroupBox);
155 mParameters->setReadOnly(true); 193 mParameters->setReadOnly(true);
156 boxLayout->addWidget( mParameters, 4, 1 ); 194 boxLayout->addWidget( mParameters, 4, 1 );
157 195
158 lab = new QLabel( i18n("HINT: Delimiter=; Name=%1,Email=%2"), mExternalAppGroupBox); 196 lab = new QLabel( i18n("HINT: Delimiter=; Name=%1,Email=%2"), mExternalAppGroupBox);
159 boxLayout->addMultiCellWidget( lab, 5, 5, 0, 1 ); 197 boxLayout->addMultiCellWidget( lab, 5, 5, 0, 1 );
160 198
161 199
162 lab = new QLabel( i18n("extra Message:"), mExternalAppGroupBox); 200 lab = new QLabel( i18n("extra Message:"), mExternalAppGroupBox);
163 boxLayout->addWidget( lab, 6, 0 ); 201 boxLayout->addWidget( lab, 6, 0 );
164 mMessage2 = new QLineEdit(mExternalAppGroupBox); 202 mMessage2 = new QLineEdit(mExternalAppGroupBox);
165 mMessage2->setReadOnly(true); 203 mMessage2->setReadOnly(true);
166 boxLayout->addWidget( mMessage2 , 7, 0); 204 boxLayout->addWidget( mMessage2 , 7, 0);
167 205
168 lab = new QLabel( i18n("extra Parameters:"), mExternalAppGroupBox); 206 lab = new QLabel( i18n("extra Parameters:"), mExternalAppGroupBox);
169 boxLayout->addWidget( lab, 6, 1 ); 207 boxLayout->addWidget( lab, 6, 1 );
170 mParameters2 = new QLineEdit(mExternalAppGroupBox); 208 mParameters2 = new QLineEdit(mExternalAppGroupBox);
171 mParameters2->setReadOnly(true); 209 mParameters2->setReadOnly(true);
172 boxLayout->addWidget( mParameters2, 7, 1 ); 210 boxLayout->addWidget( mParameters2, 7, 1 );
173 211
174 lab = new QLabel( i18n("HINT: Emails=%1,Attachments=%2"), mExternalAppGroupBox); 212 lab = new QLabel( i18n("HINT: Emails=%1,Attachments=%2"), mExternalAppGroupBox);
175 boxLayout->addMultiCellWidget( lab, 8, 8, 0, 1 ); 213 boxLayout->addMultiCellWidget( lab, 8, 8, 0, 1 );
176 214
177 215
178 connect( mChannel, SIGNAL( textChanged ( const QString & )), this, SLOT( textChanged ( const QString & )) ); 216 connect( mChannel, SIGNAL( textChanged ( const QString & )), this, SLOT( textChanged ( const QString & )) );
179 connect( mMessage, SIGNAL( textChanged ( const QString & )), this, SLOT( textChanged ( const QString & )) ); 217 connect( mMessage, SIGNAL( textChanged ( const QString & )), this, SLOT( textChanged ( const QString & )) );
180 connect( mParameters, SIGNAL( textChanged ( const QString & )), this, SLOT( textChanged ( const QString & )) ); 218 connect( mParameters, SIGNAL( textChanged ( const QString & )), this, SLOT( textChanged ( const QString & )) );
181 connect( mMessage2, SIGNAL( textChanged ( const QString & )), this, SLOT( textChanged ( const QString & )) ); 219 connect( mMessage2, SIGNAL( textChanged ( const QString & )), this, SLOT( textChanged ( const QString & )) );
182 connect( mParameters2, SIGNAL( textChanged ( const QString & )), this, SLOT( textChanged ( const QString & )) ); 220 connect( mParameters2, SIGNAL( textChanged ( const QString & )), this, SLOT( textChanged ( const QString & )) );
183 221
184 222
185 layout->addWidget( mExternalAppGroupBox ); 223 layout->addWidget( mExternalAppGroupBox );
186 tabWidget->addTab( externalAppsPage, i18n( "External Apps." ) ); 224 tabWidget->addTab( externalAppsPage, i18n( "External Apps." ) );
187 225
188} 226}
189 227
190 228
191void KDEPIMConfigWidget::setupLocaleDateTab() 229void KDEPIMConfigWidget::setupLocaleDateTab()
192{ 230{
193 QWidget *topFrame = new QWidget( this ); 231 QWidget *topFrame = new QWidget( this );
194 QGridLayout *topLayout = new QGridLayout( topFrame, 3, 2); 232 QGridLayout *topLayout = new QGridLayout( topFrame, 3, 2);
195 233
196 topLayout->setSpacing(KDialog::spacingHintSmall()); 234 topLayout->setSpacing(KDialog::spacingHintSmall());
197 topLayout->setMargin(KDialog::marginHintSmall()); 235 topLayout->setMargin(KDialog::marginHintSmall());
198 int iii = 0; 236 int iii = 0;
199 237
200 238
201 KPrefsWidRadios *syncPrefsGroup = 239 KPrefsWidRadios *syncPrefsGroup =
202 addWidRadios(i18n("Date Format:"),&(KPimGlobalPrefs::instance()->mPreferredDate),topFrame); 240 addWidRadios(i18n("Date Format:"),&(KPimGlobalPrefs::instance()->mPreferredDate),topFrame);
203 QString format; 241 QString format;
204 if ( QApplication::desktop()->width() < 480 ) 242 if ( QApplication::desktop()->width() < 480 )
205 format = "(%d.%m.%Y)"; 243 format = "(%d.%m.%Y)";
206 else 244 else
207 format = "(%d.%m.%Y|%A %d %B %Y)"; 245 format = "(%d.%m.%Y|%A %d %B %Y)";
208 syncPrefsGroup->addRadio(i18n("24.03.2004 "+format)); 246 syncPrefsGroup->addRadio(i18n("24.03.2004 "+format));
209 if ( QApplication::desktop()->width() < 480 ) 247 if ( QApplication::desktop()->width() < 480 )
210 format = "(%m.%d.%Y)"; 248 format = "(%m.%d.%Y)";
211 else 249 else
212 format = "(%m.%d.%Y|%A %B %d %Y)"; 250 format = "(%m.%d.%Y|%A %B %d %Y)";
213 syncPrefsGroup->addRadio(i18n("03.24.2004 "+format)); 251 syncPrefsGroup->addRadio(i18n("03.24.2004 "+format));
214 if ( QApplication::desktop()->width() < 480 ) 252 if ( QApplication::desktop()->width() < 480 )
215 format = "(%Y-%m-%d)"; 253 format = "(%Y-%m-%d)";
216 else 254 else
217 format = "(%Y-%m-%d|%A %Y %B %d)"; 255 format = "(%Y-%m-%d|%A %Y %B %d)";
218 syncPrefsGroup->addRadio(i18n("2004-03-24 "+format)); 256 syncPrefsGroup->addRadio(i18n("2004-03-24 "+format));
219 syncPrefsGroup->addRadio(i18n("User defined")); 257 syncPrefsGroup->addRadio(i18n("User defined"));
220 if ( QApplication::desktop()->width() < 480 ) { 258 if ( QApplication::desktop()->width() < 480 ) {
221 syncPrefsGroup->groupBox()->layout()->setMargin( 5 ); 259 syncPrefsGroup->groupBox()->layout()->setMargin( 5 );
222 syncPrefsGroup->groupBox()->layout()->setSpacing( 0 ); 260 syncPrefsGroup->groupBox()->layout()->setSpacing( 0 );
223 } 261 }
224 topLayout->addMultiCellWidget( (QWidget*)syncPrefsGroup->groupBox(),iii,iii,0,1); 262 topLayout->addMultiCellWidget( (QWidget*)syncPrefsGroup->groupBox(),iii,iii,0,1);
225 ++iii; 263 ++iii;
226 ++iii; 264 ++iii;
227 QLabel * lab; 265 QLabel * lab;
228 mUserDateFormatLong = new QLineEdit(topFrame); 266 mUserDateFormatLong = new QLineEdit(topFrame);
229 lab = new QLabel(mUserDateFormatLong, i18n("User long date:"), topFrame); 267 lab = new QLabel(mUserDateFormatLong, i18n("User long date:"), topFrame);
230 topLayout->addWidget(lab ,iii,0); 268 topLayout->addWidget(lab ,iii,0);
231 topLayout->addWidget(mUserDateFormatLong,iii,1); 269 topLayout->addWidget(mUserDateFormatLong,iii,1);
232 ++iii; 270 ++iii;
233 mUserDateFormatShort = new QLineEdit(topFrame); 271 mUserDateFormatShort = new QLineEdit(topFrame);
234 lab = new QLabel(mUserDateFormatShort, i18n("User short date:"), topFrame); 272 lab = new QLabel(mUserDateFormatShort, i18n("User short date:"), topFrame);
235 topLayout->addWidget(lab ,iii,0); 273 topLayout->addWidget(lab ,iii,0);
236 topLayout->addWidget(mUserDateFormatShort,iii,1); 274 topLayout->addWidget(mUserDateFormatShort,iii,1);
237 ++iii; 275 ++iii;
238 lab = new QLabel( i18n("Monday 19 April 2004: %A %d %B %Y"), topFrame); 276 lab = new QLabel( i18n("Monday 19 April 2004: %A %d %B %Y"), topFrame);
239 topLayout->addMultiCellWidget(lab ,iii,iii,0,1); 277 topLayout->addMultiCellWidget(lab ,iii,iii,0,1);
240 ++iii; 278 ++iii;
241 lab = new QLabel( i18n("Mon 19.04.04: %a %d.%m.%y"), topFrame); 279 lab = new QLabel( i18n("Mon 19.04.04: %a %d.%m.%y"), topFrame);
242 topLayout->addMultiCellWidget(lab ,iii,iii,0,1); 280 topLayout->addMultiCellWidget(lab ,iii,iii,0,1);
243 ++iii; 281 ++iii;
244 lab = new QLabel( i18n("Mon, 19.Apr.04: %a, %d.%b.%y"), topFrame); 282 lab = new QLabel( i18n("Mon, 19.Apr.04: %a, %d.%b.%y"), topFrame);
245 topLayout->addMultiCellWidget(lab ,iii,iii,0,1); 283 topLayout->addMultiCellWidget(lab ,iii,iii,0,1);
246 ++iii; 284 ++iii;
247 285
248 connect( mUserDateFormatLong, SIGNAL( textChanged ( const QString & )), this, SLOT( textChanged ( const QString & )) ); 286 connect( mUserDateFormatLong, SIGNAL( textChanged ( const QString & )), this, SLOT( textChanged ( const QString & )) );
249 connect( mUserDateFormatShort, SIGNAL( textChanged ( const QString & )), this, SLOT( textChanged ( const QString & )) ); 287 connect( mUserDateFormatShort, SIGNAL( textChanged ( const QString & )), this, SLOT( textChanged ( const QString & )) );
250 288
251 289
252 tabWidget->addTab( topFrame, i18n( "Date Format" ) ); 290 tabWidget->addTab( topFrame, i18n( "Date Format" ) );
253} 291}
254 292
255void KDEPIMConfigWidget::setupLocaleTab() 293void KDEPIMConfigWidget::setupLocaleTab()
256{ 294{
257 295
258 QWidget *topFrame = new QWidget( this ); 296 QWidget *topFrame = new QWidget( this );
259 QGridLayout *topLayout = new QGridLayout(topFrame,4,2); 297 QGridLayout *topLayout = new QGridLayout(topFrame,4,2);
260 298
261 topLayout->setSpacing(KDialog::spacingHint()); 299 topLayout->setSpacing(KDialog::spacingHint());
262 topLayout->setMargin(KDialog::marginHint()); 300 topLayout->setMargin(KDialog::marginHint());
263 int iii = 0; 301 int iii = 0;
264 KPrefsWidRadios *syncPrefsGroup = 302 KPrefsWidRadios *syncPrefsGroup =
265 addWidRadios(i18n("Language:(needs restart)"),&(KPimGlobalPrefs::instance()->mPreferredLanguage),topFrame); 303 addWidRadios(i18n("Language:(needs restart)"),&(KPimGlobalPrefs::instance()->mPreferredLanguage),topFrame);
266 syncPrefsGroup->addRadio(i18n("English")); 304 syncPrefsGroup->addRadio(i18n("English"));
267 syncPrefsGroup->addRadio(i18n("German")); 305 syncPrefsGroup->addRadio(i18n("German"));
268 syncPrefsGroup->addRadio(i18n("French")); 306 syncPrefsGroup->addRadio(i18n("French"));
269 syncPrefsGroup->addRadio(i18n("Italian")); 307 syncPrefsGroup->addRadio(i18n("Italian"));
270 syncPrefsGroup->addRadio(i18n("User defined (usertranslation.txt)")); 308 syncPrefsGroup->addRadio(i18n("User defined (usertranslation.txt)"));
271 if ( QApplication::desktop()->width() < 300 ) { 309 if ( QApplication::desktop()->width() < 300 ) {
272 syncPrefsGroup->groupBox()->layout()->setMargin( 5 ); 310 syncPrefsGroup->groupBox()->layout()->setMargin( 5 );
273 syncPrefsGroup->groupBox()->layout()->setSpacing( 0 ); 311 syncPrefsGroup->groupBox()->layout()->setSpacing( 0 );
274 } 312 }
275 topLayout->addMultiCellWidget( (QWidget*)syncPrefsGroup->groupBox(),iii,iii,0,1); 313 topLayout->addMultiCellWidget( (QWidget*)syncPrefsGroup->groupBox(),iii,iii,0,1);
276 ++iii; 314 ++iii;
277 315
278 316
279 tabWidget->addTab( topFrame, i18n( "Language" ) ); 317 tabWidget->addTab( topFrame, i18n( "Language" ) );
280 topFrame = new QWidget( this ); 318 topFrame = new QWidget( this );
281 topLayout = new QGridLayout(topFrame,4,2); 319 topLayout = new QGridLayout(topFrame,4,2);
282 320
283 topLayout->setSpacing(KDialog::spacingHint()); 321 topLayout->setSpacing(KDialog::spacingHint());
284 topLayout->setMargin(KDialog::marginHint()); 322 topLayout->setMargin(KDialog::marginHint());
285 iii = 0; 323 iii = 0;
286 syncPrefsGroup = 324 syncPrefsGroup =
287 addWidRadios(i18n("Time Format(nr):"),&(KPimGlobalPrefs::instance()->mPreferredTime),topFrame); 325 addWidRadios(i18n("Time Format(nr):"),&(KPimGlobalPrefs::instance()->mPreferredTime),topFrame);
288 if ( QApplication::desktop()->width() > 300 ) 326 if ( QApplication::desktop()->width() > 300 )
289 syncPrefsGroup->groupBox()->setOrientation (Qt::Vertical); 327 syncPrefsGroup->groupBox()->setOrientation (Qt::Vertical);
290 syncPrefsGroup->addRadio(i18n("24:00")); 328 syncPrefsGroup->addRadio(i18n("24:00"));
291 syncPrefsGroup->addRadio(i18n("12:00am")); 329 syncPrefsGroup->addRadio(i18n("12:00am"));
292 syncPrefsGroup->groupBox()->setOrientation (Qt::Vertical); 330 syncPrefsGroup->groupBox()->setOrientation (Qt::Vertical);
293 topLayout->addMultiCellWidget( syncPrefsGroup->groupBox(),iii,iii,0,1); 331 topLayout->addMultiCellWidget( syncPrefsGroup->groupBox(),iii,iii,0,1);
294 ++iii; 332 ++iii;
295 333
296 KPrefsWidBool *sb = addWidBool(i18n("Week starts on Sunday"), 334 KPrefsWidBool *sb = addWidBool(i18n("Week starts on Sunday"),
297 &(KPimGlobalPrefs::instance()->mWeekStartsOnSunday),topFrame); 335 &(KPimGlobalPrefs::instance()->mWeekStartsOnSunday),topFrame);
298 topLayout->addMultiCellWidget((QWidget*)sb->checkBox(), iii,iii,0,1); 336 topLayout->addMultiCellWidget((QWidget*)sb->checkBox(), iii,iii,0,1);
299 ++iii; 337 ++iii;
300 338
301 339
302 tabWidget->addTab( topFrame, i18n( "Time Format" ) ); 340 tabWidget->addTab( topFrame, i18n( "Time Format" ) );
303 341
304} 342}
305 343
306 344
307void KDEPIMConfigWidget::setupTimeZoneTab() 345void KDEPIMConfigWidget::setupTimeZoneTab()
308{ 346{
309 QWidget *topFrame = new QWidget( this ); 347 QWidget *topFrame = new QWidget( this );
310 QGridLayout *topLayout = new QGridLayout( topFrame, 5, 2); 348 QGridLayout *topLayout = new QGridLayout( topFrame, 5, 2);
311 topLayout->setSpacing(KDialog::spacingHintSmall()); 349 topLayout->setSpacing(KDialog::spacingHintSmall());
312 topLayout->setMargin(KDialog::marginHintSmall()); 350 topLayout->setMargin(KDialog::marginHintSmall());
313 351
314 QHBox *timeZoneBox = new QHBox( topFrame ); 352 QHBox *timeZoneBox = new QHBox( topFrame );
315 topLayout->addMultiCellWidget( timeZoneBox, 0, 0, 0, 1 ); 353 topLayout->addMultiCellWidget( timeZoneBox, 0, 0, 0, 1 );
316 354
317 new QLabel( i18n("Timezone:"), timeZoneBox ); 355 new QLabel( i18n("Timezone:"), timeZoneBox );
318 mTimeZoneCombo = new QComboBox( timeZoneBox ); 356 mTimeZoneCombo = new QComboBox( timeZoneBox );
319 if ( QApplication::desktop()->width() < 300 ) { 357 if ( QApplication::desktop()->width() < 300 ) {
320 mTimeZoneCombo->setMaximumWidth(150); 358 mTimeZoneCombo->setMaximumWidth(150);
321 } 359 }
322 360
323 QStringList list; 361 QStringList list;
324 list = KGlobal::locale()->timeZoneList(); 362 list = KGlobal::locale()->timeZoneList();
325 mTimeZoneCombo->insertStringList(list); 363 mTimeZoneCombo->insertStringList(list);
326 364
327 // find the currently set time zone and select it 365 // find the currently set time zone and select it
328 QString sCurrentlySet = KPimGlobalPrefs::instance()->mTimeZoneId; 366 QString sCurrentlySet = KPimGlobalPrefs::instance()->mTimeZoneId;
329 int nCurrentlySet = 11; 367 int nCurrentlySet = 11;
330 for (int i = 0; i < mTimeZoneCombo->count(); i++) 368 for (int i = 0; i < mTimeZoneCombo->count(); i++)
331 { 369 {
332 if (mTimeZoneCombo->text(i) == sCurrentlySet) 370 if (mTimeZoneCombo->text(i) == sCurrentlySet)
333 { 371 {
334 nCurrentlySet = i; 372 nCurrentlySet = i;
335 break; 373 break;
336 } 374 }
337 } 375 }
338 mTimeZoneCombo->setCurrentItem(nCurrentlySet); 376 mTimeZoneCombo->setCurrentItem(nCurrentlySet);
339 int iii = 1; 377 int iii = 1;
340 KPrefsWidBool *sb = 378 KPrefsWidBool *sb =
341 addWidBool(i18n("Add 30 min to selected Timezone"), 379 addWidBool(i18n("Add 30 min to selected Timezone"),
342 &(KPimGlobalPrefs::instance()->mTimeZoneAdd30min),topFrame); 380 &(KPimGlobalPrefs::instance()->mTimeZoneAdd30min),topFrame);
343 topLayout->addMultiCellWidget((QWidget*)sb->checkBox(), iii,iii,0,1); 381 topLayout->addMultiCellWidget((QWidget*)sb->checkBox(), iii,iii,0,1);
344 ++iii; 382 ++iii;
345 sb = 383 sb =
346 addWidBool(i18n("Timezone has daylight saving"), 384 addWidBool(i18n("Timezone has daylight saving"),
347 &(KPimGlobalPrefs::instance()->mUseDaylightsaving),topFrame); 385 &(KPimGlobalPrefs::instance()->mUseDaylightsaving),topFrame);
348 topLayout->addMultiCellWidget((QWidget*)sb->checkBox(), iii,iii,0,1); 386 topLayout->addMultiCellWidget((QWidget*)sb->checkBox(), iii,iii,0,1);
349 ++iii; 387 ++iii;
350 QLabel* lab; 388 QLabel* lab;
351 389
352 lab = new QLabel( i18n("Actual start and end is the\nsunday before this date."), topFrame ); 390 lab = new QLabel( i18n("Actual start and end is the\nsunday before this date."), topFrame );
353 topLayout->addMultiCellWidget(lab, iii,iii,0,1); 391 topLayout->addMultiCellWidget(lab, iii,iii,0,1);
354 ++iii; 392 ++iii;
355 393
356 lab = new QLabel( i18n("The year in the date is ignored."), topFrame ); 394 lab = new QLabel( i18n("The year in the date is ignored."), topFrame );
357 topLayout->addMultiCellWidget(lab, iii,iii,0,1); 395 topLayout->addMultiCellWidget(lab, iii,iii,0,1);
358 ++iii; 396 ++iii;
359 lab = new QLabel( i18n("Daylight start:"), topFrame ); 397 lab = new QLabel( i18n("Daylight start:"), topFrame );
360 topLayout->addWidget(lab, iii,0); 398 topLayout->addWidget(lab, iii,0);
361 mStartDateSavingEdit = new KDateEdit(topFrame); 399 mStartDateSavingEdit = new KDateEdit(topFrame);
362 topLayout->addWidget(mStartDateSavingEdit, iii,1); 400 topLayout->addWidget(mStartDateSavingEdit, iii,1);
363 ++iii; 401 ++iii;
364 402
365 lab = new QLabel( i18n("Daylight end:"), topFrame ); 403 lab = new QLabel( i18n("Daylight end:"), topFrame );
366 topLayout->addWidget(lab, iii,0); 404 topLayout->addWidget(lab, iii,0);
367 mEndDateSavingEdit = new KDateEdit(topFrame); 405 mEndDateSavingEdit = new KDateEdit(topFrame);
368 topLayout->addWidget(mEndDateSavingEdit, iii,1); 406 topLayout->addWidget(mEndDateSavingEdit, iii,1);
369 ++iii; 407 ++iii;
370 QDate current ( 2001, 1,1); 408 QDate current ( 2001, 1,1);
371 mStartDateSavingEdit->setDate(current.addDays(KPimGlobalPrefs::instance()->mDaylightsavingStart-1)); 409 mStartDateSavingEdit->setDate(current.addDays(KPimGlobalPrefs::instance()->mDaylightsavingStart-1));
372 mEndDateSavingEdit->setDate(current.addDays(KPimGlobalPrefs::instance()->mDaylightsavingEnd-1)); 410 mEndDateSavingEdit->setDate(current.addDays(KPimGlobalPrefs::instance()->mDaylightsavingEnd-1));
373 411
374 connect( mStartDateSavingEdit, SIGNAL( dateChanged(QDate)), this, SLOT( modified()) ); 412 connect( mStartDateSavingEdit, SIGNAL( dateChanged(QDate)), this, SLOT( modified()) );
375 connect( mEndDateSavingEdit, SIGNAL( dateChanged(QDate)), this, SLOT( modified()) ); 413 connect( mEndDateSavingEdit, SIGNAL( dateChanged(QDate)), this, SLOT( modified()) );
376 connect( mTimeZoneCombo, SIGNAL( activated( int ) ), this, SLOT (modified() ) ); 414 connect( mTimeZoneCombo, SIGNAL( activated( int ) ), this, SLOT (modified() ) );
377 415
378 416
379 417
380 tabWidget->addTab( topFrame, i18n( "Time Zone" ) ); 418 tabWidget->addTab( topFrame, i18n( "Time Zone" ) );
381 419
382} 420}
383 421
384void KDEPIMConfigWidget::externalapp_changed( int newApp ) 422void KDEPIMConfigWidget::externalapp_changed( int newApp )
385{ 423{
386 // first store the current data 424 // first store the current data
387 saveEditFieldSettings(); 425 saveEditFieldSettings();
388 426
389 // set mCurrentApp 427 // set mCurrentApp
390 mCurrentApp = (ExternalAppHandler::Types)newApp; 428 mCurrentApp = (ExternalAppHandler::Types)newApp;
391 429
392 // set mCurrentClient 430 // set mCurrentClient
393 switch(mCurrentApp) 431 switch(mCurrentApp)
394 { 432 {
395 case(ExternalAppHandler::EMAIL): 433 case(ExternalAppHandler::EMAIL):
396 mCurrentClient = mEmailClient; 434 mCurrentClient = mEmailClient;
397 break; 435 break;
398 case(ExternalAppHandler::PHONE): 436 case(ExternalAppHandler::PHONE):
399 mCurrentClient = mPhoneClient; 437 mCurrentClient = mPhoneClient;
400 break; 438 break;
401 case(ExternalAppHandler::SMS): 439 case(ExternalAppHandler::SMS):
402 mCurrentClient = mSMSClient; 440 mCurrentClient = mSMSClient;
403 break; 441 break;
404 case(ExternalAppHandler::FAX): 442 case(ExternalAppHandler::FAX):
405 mCurrentClient = mFaxClient; 443 mCurrentClient = mFaxClient;
406 break; 444 break;
407 case(ExternalAppHandler::PAGER): 445 case(ExternalAppHandler::PAGER):
408 mCurrentClient = mPagerClient; 446 mCurrentClient = mPagerClient;
409 break; 447 break;
410 case(ExternalAppHandler::SIP): 448 case(ExternalAppHandler::SIP):
411 mCurrentClient = mSipClient; 449 mCurrentClient = mSipClient;
412 break; 450 break;
413 default: 451 default:
414 return; 452 return;
415 } 453 }
416 454
417 // and at last update the widgets 455 // and at last update the widgets
418 updateClientWidgets(); 456 updateClientWidgets();
419} 457}
420 458
421 459
422 460
423void KDEPIMConfigWidget::client_changed( int newClient ) 461void KDEPIMConfigWidget::client_changed( int newClient )
424{ 462{
425 if (newClient == mCurrentClient) 463 if (newClient == mCurrentClient)
426 return; 464 return;
427 465
428 // first store the current data 466 // first store the current data
429 saveEditFieldSettings(); 467 saveEditFieldSettings();
430 468
431 469
432 //then reset the clientvariable 470 //then reset the clientvariable
433 mCurrentClient = newClient; 471 mCurrentClient = newClient;
434 472
435 // and at last update the widgets 473 // and at last update the widgets
436 updateClientWidgets(); 474 updateClientWidgets();
437 475
438 KPrefsWidget::modified(); 476 KPrefsWidget::modified();
439} 477}
440 478
441void KDEPIMConfigWidget::saveEditFieldSettings() 479void KDEPIMConfigWidget::saveEditFieldSettings()
442{ 480{
443 481
444 switch(mCurrentApp) 482 switch(mCurrentApp)
445 { 483 {
446 case(ExternalAppHandler::EMAIL): 484 case(ExternalAppHandler::EMAIL):
447 mEmailClient = mClient->currentItem(); 485 mEmailClient = mClient->currentItem();
448 break; 486 break;
449 case(ExternalAppHandler::PHONE): 487 case(ExternalAppHandler::PHONE):
450 mPhoneClient= mClient->currentItem(); 488 mPhoneClient= mClient->currentItem();
451 break; 489 break;
452 case(ExternalAppHandler::SMS): 490 case(ExternalAppHandler::SMS):
453 mSMSClient = mClient->currentItem(); 491 mSMSClient = mClient->currentItem();
454 break; 492 break;
455 case(ExternalAppHandler::FAX): 493 case(ExternalAppHandler::FAX):
456 mFaxClient = mClient->currentItem(); 494 mFaxClient = mClient->currentItem();
457 break; 495 break;
458 case(ExternalAppHandler::PAGER): 496 case(ExternalAppHandler::PAGER):
459 mPagerClient = mClient->currentItem(); 497 mPagerClient = mClient->currentItem();
460 break; 498 break;
461 case(ExternalAppHandler::SIP): 499 case(ExternalAppHandler::SIP):
462 mSipClient = mClient->currentItem(); 500 mSipClient = mClient->currentItem();
463 break; 501 break;
464 default: 502 default:
465 return; 503 return;
466 } 504 }
467 505
468 //store the current data back to the apropriate membervariables if we had set it to "other" 506 //store the current data back to the apropriate membervariables if we had set it to "other"
469 if ((mCurrentApp == ExternalAppHandler::EMAIL) && (mCurrentClient == KPimGlobalPrefs::OTHER_EMC)) 507 if ((mCurrentApp == ExternalAppHandler::EMAIL) && (mCurrentClient == KPimGlobalPrefs::OTHER_EMC))
470 { 508 {
471 mEmailOtherChannel = mChannel->text(); 509 mEmailOtherChannel = mChannel->text();
472 mEmailOtherMessage = mMessage->text(); 510 mEmailOtherMessage = mMessage->text();
473 mEmailOtherMessageParameters = mParameters->text(); 511 mEmailOtherMessageParameters = mParameters->text();
474 mEmailOtherMessage2 = mMessage2->text(); 512 mEmailOtherMessage2 = mMessage2->text();
475 mEmailOtherMessageParameters2 = mParameters2->text(); 513 mEmailOtherMessageParameters2 = mParameters2->text();
476 } 514 }
477 else if ((mCurrentApp == ExternalAppHandler::PHONE) && (mCurrentClient == KPimGlobalPrefs::OTHER_PHC)) 515 else if ((mCurrentApp == ExternalAppHandler::PHONE) && (mCurrentClient == KPimGlobalPrefs::OTHER_PHC))
478 { 516 {
479 mPhoneOtherChannel = mChannel->text(); 517 mPhoneOtherChannel = mChannel->text();
480 mPhoneOtherMessage = mMessage->text(); 518 mPhoneOtherMessage = mMessage->text();
481 mPhoneOtherMessageParameters = mParameters->text(); 519 mPhoneOtherMessageParameters = mParameters->text();
482 } 520 }
483 else if ((mCurrentApp == ExternalAppHandler::SMS) && (mCurrentClient == KPimGlobalPrefs::OTHER_SMC)) 521 else if ((mCurrentApp == ExternalAppHandler::SMS) && (mCurrentClient == KPimGlobalPrefs::OTHER_SMC))
484 { 522 {
485 mSMSOtherChannel = mChannel->text(); 523 mSMSOtherChannel = mChannel->text();
486 mSMSOtherMessage = mMessage->text(); 524 mSMSOtherMessage = mMessage->text();
487 mSMSOtherMessageParameters = mParameters->text(); 525 mSMSOtherMessageParameters = mParameters->text();
488 } 526 }
489 else if ((mCurrentApp == ExternalAppHandler::FAX) && (mCurrentClient == KPimGlobalPrefs::OTHER_FAC)) 527 else if ((mCurrentApp == ExternalAppHandler::FAX) && (mCurrentClient == KPimGlobalPrefs::OTHER_FAC))
490 { 528 {
491 mFaxOtherChannel = mChannel->text(); 529 mFaxOtherChannel = mChannel->text();
492 mFaxOtherMessage = mMessage->text(); 530 mFaxOtherMessage = mMessage->text();
493 mFaxOtherMessageParameters = mParameters->text(); 531 mFaxOtherMessageParameters = mParameters->text();
494 } 532 }
495 else if ((mCurrentApp == ExternalAppHandler::PAGER) && (mCurrentClient == KPimGlobalPrefs::OTHER_PAC)) 533 else if ((mCurrentApp == ExternalAppHandler::PAGER) && (mCurrentClient == KPimGlobalPrefs::OTHER_PAC))
496 { 534 {
497 mPagerOtherChannel = mChannel->text(); 535 mPagerOtherChannel = mChannel->text();
498 mPagerOtherMessage = mMessage->text(); 536 mPagerOtherMessage = mMessage->text();
499 mPagerOtherMessageParameters = mParameters->text(); 537 mPagerOtherMessageParameters = mParameters->text();
500 } 538 }
501 else if ((mCurrentApp == ExternalAppHandler::SIP) && (mCurrentClient == KPimGlobalPrefs::OTHER_SIC)) 539 else if ((mCurrentApp == ExternalAppHandler::SIP) && (mCurrentClient == KPimGlobalPrefs::OTHER_SIC))
502 { 540 {
503 mSipOtherChannel = mChannel->text(); 541 mSipOtherChannel = mChannel->text();
504 mSipOtherMessage = mMessage->text(); 542 mSipOtherMessage = mMessage->text();
505 mSipOtherMessageParameters = mParameters->text(); 543 mSipOtherMessageParameters = mParameters->text();
506 } 544 }
507 545
508 546
509} 547}
510 548
511void KDEPIMConfigWidget::updateClientWidgets() 549void KDEPIMConfigWidget::updateClientWidgets()
512{ 550{
513 bool blocked = signalsBlocked(); 551 bool blocked = signalsBlocked();
514 blockSignals( true ); 552 blockSignals( true );
515 553
516 // at this point we assume, that mCurrentApp and mCurrentClient are set to the values that we want to display 554 // at this point we assume, that mCurrentApp and mCurrentClient are set to the values that we want to display
517 QMap<ExternalAppHandler::Types, QString>::Iterator it = mExternalAppsMap.find ( mCurrentApp ); 555 QMap<ExternalAppHandler::Types, QString>::Iterator it = mExternalAppsMap.find ( mCurrentApp );
518 if (it == mExternalAppsMap.end()) 556 if (it == mExternalAppsMap.end())
519 return; 557 return;
520 558
521 // update group box 559 // update group box
522 mExternalAppGroupBox->setTitle(i18n( "Used %1 Client" ).arg(it.data())); 560 mExternalAppGroupBox->setTitle(i18n( "Used %1 Client" ).arg(it.data()));
523 561
524 //update the entries in the client combobox 562 //update the entries in the client combobox
525 mClient->clear(); 563 mClient->clear();
526 564
527 QList<DefaultAppItem> items = ExternalAppHandler::instance()->getAvailableDefaultItems(mCurrentApp); 565 QList<DefaultAppItem> items = ExternalAppHandler::instance()->getAvailableDefaultItems(mCurrentApp);
528 DefaultAppItem* dai; 566 DefaultAppItem* dai;
529 for ( dai=items.first(); dai != 0; dai=items.next() ) 567 for ( dai=items.first(); dai != 0; dai=items.next() )
530 { 568 {
531 mClient->insertItem( i18n(dai->_label), dai->_id ); 569 mClient->insertItem( i18n(dai->_label), dai->_id );
532 570
533 if (dai->_id == mCurrentClient) 571 if (dai->_id == mCurrentClient)
534 { 572 {
535 //restore the edit fields with the data of the local membervariables if we had set it to "other". 573 //restore the edit fields with the data of the local membervariables if we had set it to "other".
536 //Otherwise take the default data from externalapphandler. 574 //Otherwise take the default data from externalapphandler.
537 mChannel->setText(dai->_channel); 575 mChannel->setText(dai->_channel);
538 mMessage->setText(dai->_message); 576 mMessage->setText(dai->_message);
539 mParameters->setText(dai->_parameters); 577 mParameters->setText(dai->_parameters);
540 mMessage2->setText(dai->_message2); 578 mMessage2->setText(dai->_message2);
541 mParameters2->setText(dai->_parameters2); 579 mParameters2->setText(dai->_parameters2);
542 580
543 581
544 if ((mCurrentApp == ExternalAppHandler::EMAIL) && (mCurrentClient == KPimGlobalPrefs::OTHER_EMC)) 582 if ((mCurrentApp == ExternalAppHandler::EMAIL) && (mCurrentClient == KPimGlobalPrefs::OTHER_EMC))
545 { 583 {
546 mChannel->setText(mEmailOtherChannel); 584 mChannel->setText(mEmailOtherChannel);
547 mMessage->setText(mEmailOtherMessage); 585 mMessage->setText(mEmailOtherMessage);
548 mParameters->setText(mEmailOtherMessageParameters); 586 mParameters->setText(mEmailOtherMessageParameters);
549 mMessage2->setText(mEmailOtherMessage2); 587 mMessage2->setText(mEmailOtherMessage2);
550 mParameters2->setText(mEmailOtherMessageParameters2); 588 mParameters2->setText(mEmailOtherMessageParameters2);
551 } 589 }
552 else if ((mCurrentApp == ExternalAppHandler::PHONE) && (mCurrentClient == KPimGlobalPrefs::OTHER_PHC)) 590 else if ((mCurrentApp == ExternalAppHandler::PHONE) && (mCurrentClient == KPimGlobalPrefs::OTHER_PHC))
553 { 591 {
554 mChannel->setText(mPhoneOtherChannel); 592 mChannel->setText(mPhoneOtherChannel);
555 mMessage->setText(mPhoneOtherMessage); 593 mMessage->setText(mPhoneOtherMessage);
556 mParameters->setText(mPhoneOtherMessageParameters); 594 mParameters->setText(mPhoneOtherMessageParameters);
557 } 595 }
558 else if ((mCurrentApp == ExternalAppHandler::SMS) && (mCurrentClient == KPimGlobalPrefs::OTHER_SMC)) 596 else if ((mCurrentApp == ExternalAppHandler::SMS) && (mCurrentClient == KPimGlobalPrefs::OTHER_SMC))
559 { 597 {
560 mChannel->setText(mSMSOtherChannel); 598 mChannel->setText(mSMSOtherChannel);
561 mMessage->setText(mSMSOtherMessage); 599 mMessage->setText(mSMSOtherMessage);
562 mParameters->setText(mSMSOtherMessageParameters); 600 mParameters->setText(mSMSOtherMessageParameters);
563 } 601 }
564 else if ((mCurrentApp == ExternalAppHandler::FAX) && (mCurrentClient == KPimGlobalPrefs::OTHER_FAC)) 602 else if ((mCurrentApp == ExternalAppHandler::FAX) && (mCurrentClient == KPimGlobalPrefs::OTHER_FAC))
565 { 603 {
566 mChannel->setText(mFaxOtherChannel); 604 mChannel->setText(mFaxOtherChannel);
567 mMessage->setText(mFaxOtherMessage); 605 mMessage->setText(mFaxOtherMessage);
568 mParameters->setText(mFaxOtherMessageParameters); 606 mParameters->setText(mFaxOtherMessageParameters);
569 } 607 }
570 else if ((mCurrentApp == ExternalAppHandler::PAGER) && (mCurrentClient == KPimGlobalPrefs::OTHER_PAC)) 608 else if ((mCurrentApp == ExternalAppHandler::PAGER) && (mCurrentClient == KPimGlobalPrefs::OTHER_PAC))
571 { 609 {
572 mChannel->setText(mPagerOtherChannel); 610 mChannel->setText(mPagerOtherChannel);
573 mMessage->setText(mPagerOtherMessage); 611 mMessage->setText(mPagerOtherMessage);
574 mParameters->setText(mPagerOtherMessageParameters); 612 mParameters->setText(mPagerOtherMessageParameters);
575 } 613 }
576 else if ((mCurrentApp == ExternalAppHandler::SIP) && (mCurrentClient == KPimGlobalPrefs::OTHER_SIC)) 614 else if ((mCurrentApp == ExternalAppHandler::SIP) && (mCurrentClient == KPimGlobalPrefs::OTHER_SIC))
577 { 615 {
578 mChannel->setText(mSipOtherChannel); 616 mChannel->setText(mSipOtherChannel);
579 mMessage->setText(mSipOtherMessage); 617 mMessage->setText(mSipOtherMessage);
580 mParameters->setText(mSipOtherMessageParameters); 618 mParameters->setText(mSipOtherMessageParameters);
581 } 619 }
582 } 620 }
583 621
584 } 622 }
585 623
586 bool readonly; 624 bool readonly;
587 bool enabled; 625 bool enabled;
588 if ( ((mCurrentApp == ExternalAppHandler::EMAIL) && (mCurrentClient == KPimGlobalPrefs::OTHER_EMC)) 626 if ( ((mCurrentApp == ExternalAppHandler::EMAIL) && (mCurrentClient == KPimGlobalPrefs::OTHER_EMC))
589 ||((mCurrentApp == ExternalAppHandler::PHONE) && (mCurrentClient == KPimGlobalPrefs::OTHER_PHC)) 627 ||((mCurrentApp == ExternalAppHandler::PHONE) && (mCurrentClient == KPimGlobalPrefs::OTHER_PHC))
590 ||((mCurrentApp == ExternalAppHandler::SMS) && (mCurrentClient == KPimGlobalPrefs::OTHER_SMC)) 628 ||((mCurrentApp == ExternalAppHandler::SMS) && (mCurrentClient == KPimGlobalPrefs::OTHER_SMC))
591 ||((mCurrentApp == ExternalAppHandler::FAX) && (mCurrentClient == KPimGlobalPrefs::OTHER_FAC)) 629 ||((mCurrentApp == ExternalAppHandler::FAX) && (mCurrentClient == KPimGlobalPrefs::OTHER_FAC))
592 ||((mCurrentApp == ExternalAppHandler::PAGER) && (mCurrentClient == KPimGlobalPrefs::OTHER_PAC)) 630 ||((mCurrentApp == ExternalAppHandler::PAGER) && (mCurrentClient == KPimGlobalPrefs::OTHER_PAC))
593 ||((mCurrentApp == ExternalAppHandler::SIP) && (mCurrentClient == KPimGlobalPrefs::OTHER_SIC))) 631 ||((mCurrentApp == ExternalAppHandler::SIP) && (mCurrentClient == KPimGlobalPrefs::OTHER_SIC)))
594 { 632 {
595 readonly = false; 633 readonly = false;
596 } 634 }
597 else 635 else
598 { 636 {
599 readonly = true; 637 readonly = true;
600 } 638 }
601 639
602 if ( ((mCurrentApp == ExternalAppHandler::EMAIL) && (mCurrentClient == KPimGlobalPrefs::NONE_EMC)) 640 if ( ((mCurrentApp == ExternalAppHandler::EMAIL) && (mCurrentClient == KPimGlobalPrefs::NONE_EMC))
603 ||((mCurrentApp == ExternalAppHandler::PHONE) && (mCurrentClient == KPimGlobalPrefs::NONE_PHC)) 641 ||((mCurrentApp == ExternalAppHandler::PHONE) && (mCurrentClient == KPimGlobalPrefs::NONE_PHC))
604 ||((mCurrentApp == ExternalAppHandler::SMS) && (mCurrentClient == KPimGlobalPrefs::NONE_SMC)) 642 ||((mCurrentApp == ExternalAppHandler::SMS) && (mCurrentClient == KPimGlobalPrefs::NONE_SMC))
605 ||((mCurrentApp == ExternalAppHandler::FAX) && (mCurrentClient == KPimGlobalPrefs::NONE_FAC)) 643 ||((mCurrentApp == ExternalAppHandler::FAX) && (mCurrentClient == KPimGlobalPrefs::NONE_FAC))
606 ||((mCurrentApp == ExternalAppHandler::PAGER) && (mCurrentClient == KPimGlobalPrefs::NONE_PAC)) 644 ||((mCurrentApp == ExternalAppHandler::PAGER) && (mCurrentClient == KPimGlobalPrefs::NONE_PAC))
607 ||((mCurrentApp == ExternalAppHandler::SIP) && (mCurrentClient == KPimGlobalPrefs::NONE_SIC))) 645 ||((mCurrentApp == ExternalAppHandler::SIP) && (mCurrentClient == KPimGlobalPrefs::NONE_SIC)))
608 { 646 {
609 enabled = false; 647 enabled = false;
610 } 648 }
611 else 649 else
612 { 650 {
613 enabled = true; 651 enabled = true;
614 } 652 }
615 653
616 654
617 mChannel->setReadOnly(readonly); 655 mChannel->setReadOnly(readonly);
618 mMessage->setReadOnly(readonly); 656 mMessage->setReadOnly(readonly);
619 mParameters->setReadOnly(readonly); 657 mParameters->setReadOnly(readonly);
620 mMessage2->setReadOnly(readonly); 658 mMessage2->setReadOnly(readonly);
621 mParameters2->setReadOnly(readonly); 659 mParameters2->setReadOnly(readonly);
622 660
623 mChannel->setEnabled(enabled); 661 mChannel->setEnabled(enabled);
624 mMessage->setEnabled(enabled); 662 mMessage->setEnabled(enabled);
625 mParameters->setEnabled(enabled); 663 mParameters->setEnabled(enabled);
626 mMessage2->setEnabled(enabled); 664 mMessage2->setEnabled(enabled);
627 mParameters2->setEnabled(enabled); 665 mParameters2->setEnabled(enabled);
628 666
629 667
630 668
631 mClient->setCurrentItem(mCurrentClient); 669 mClient->setCurrentItem(mCurrentClient);
632 670
633 671
634 // enable/disable the extra message/parameter field 672 // enable/disable the extra message/parameter field
635 if (mCurrentApp == ExternalAppHandler::EMAIL) 673 if (mCurrentApp == ExternalAppHandler::EMAIL)
636 { 674 {
637 } 675 }
638 else 676 else
639 { 677 {
640 mMessage2->setText( "" ); 678 mMessage2->setText( "" );
641 mParameters2->setText( "" ); 679 mParameters2->setText( "" );
642 } 680 }
643 681
644 if (enabled == true) { 682 if (enabled == true) {
645 mMessage2->setEnabled(mCurrentApp == ExternalAppHandler::EMAIL); 683 mMessage2->setEnabled(mCurrentApp == ExternalAppHandler::EMAIL);
646 mParameters2->setEnabled(mCurrentApp == ExternalAppHandler::EMAIL); 684 mParameters2->setEnabled(mCurrentApp == ExternalAppHandler::EMAIL);
647 } 685 }
648 686
649 687
650 blockSignals( blocked ); 688 blockSignals( blocked );
651 689
652} 690}
653 691
654void KDEPIMConfigWidget::usrReadConfig() 692void KDEPIMConfigWidget::usrReadConfig()
655{ 693{
656 KPimGlobalPrefs* prefs = KPimGlobalPrefs::instance(); 694 KPimGlobalPrefs* prefs = KPimGlobalPrefs::instance();
657 695
658 bool blocked = signalsBlocked(); 696 bool blocked = signalsBlocked();
659 blockSignals( true ); 697 blockSignals( true );
660 698
661 QString dummy = prefs->mUserDateFormatLong; 699 QString dummy = prefs->mUserDateFormatLong;
662 mUserDateFormatLong->setText(dummy.replace( QRegExp("K"), QString(",") )); 700 mUserDateFormatLong->setText(dummy.replace( QRegExp("K"), QString(",") ));
663 dummy = prefs->mUserDateFormatShort; 701 dummy = prefs->mUserDateFormatShort;
664 mUserDateFormatShort->setText(dummy.replace( QRegExp("K"), QString(",") )); 702 mUserDateFormatShort->setText(dummy.replace( QRegExp("K"), QString(",") ));
665 703
666 QDate current ( 2001, 1,1); 704 QDate current ( 2001, 1,1);
667 mStartDateSavingEdit->setDate(current.addDays(prefs->mDaylightsavingStart-1)); 705 mStartDateSavingEdit->setDate(current.addDays(prefs->mDaylightsavingStart-1));
668 mEndDateSavingEdit->setDate(current.addDays(prefs->mDaylightsavingEnd-1)); 706 mEndDateSavingEdit->setDate(current.addDays(prefs->mDaylightsavingEnd-1));
669 setCombo(mTimeZoneCombo,i18n(prefs->mTimeZoneId)); 707 setCombo(mTimeZoneCombo,i18n(prefs->mTimeZoneId));
670 708
671 709
672 710
673 711
674 mEmailClient = prefs->mEmailClient; 712 mEmailClient = prefs->mEmailClient;
675 mEmailOtherChannel = prefs->mEmailOtherChannel; 713 mEmailOtherChannel = prefs->mEmailOtherChannel;
676 mEmailOtherMessage = prefs->mEmailOtherMessage; 714 mEmailOtherMessage = prefs->mEmailOtherMessage;
677 mEmailOtherMessageParameters = prefs->mEmailOtherMessageParameters; 715 mEmailOtherMessageParameters = prefs->mEmailOtherMessageParameters;
678 mEmailOtherMessage2 = prefs->mEmailOtherMessage2; 716 mEmailOtherMessage2 = prefs->mEmailOtherMessage2;
679 mEmailOtherMessageParameters2 = prefs->mEmailOtherMessageParameters2; 717 mEmailOtherMessageParameters2 = prefs->mEmailOtherMessageParameters2;
680 718
681 mPhoneClient = prefs->mPhoneClient; 719 mPhoneClient = prefs->mPhoneClient;
682 mPhoneOtherChannel = prefs->mPhoneOtherChannel; 720 mPhoneOtherChannel = prefs->mPhoneOtherChannel;
683 mPhoneOtherMessage = prefs->mPhoneOtherMessage; 721 mPhoneOtherMessage = prefs->mPhoneOtherMessage;
684 mPhoneOtherMessageParameters = prefs->mPhoneOtherMessageParameters; 722 mPhoneOtherMessageParameters = prefs->mPhoneOtherMessageParameters;
685 723
686 mFaxClient = prefs->mFaxClient; 724 mFaxClient = prefs->mFaxClient;
687 mFaxOtherChannel = prefs->mFaxOtherChannel; 725 mFaxOtherChannel = prefs->mFaxOtherChannel;
688 mFaxOtherMessage = prefs->mFaxOtherMessage; 726 mFaxOtherMessage = prefs->mFaxOtherMessage;
689 mFaxOtherMessageParameters = prefs->mFaxOtherMessageParameters; 727 mFaxOtherMessageParameters = prefs->mFaxOtherMessageParameters;
690 728
691 mSMSClient = prefs->mSMSClient; 729 mSMSClient = prefs->mSMSClient;
692 mSMSOtherChannel = prefs->mSMSOtherChannel; 730 mSMSOtherChannel = prefs->mSMSOtherChannel;
693 mSMSOtherMessage = prefs->mSMSOtherMessage; 731 mSMSOtherMessage = prefs->mSMSOtherMessage;
694 mSMSOtherMessageParameters = prefs->mSMSOtherMessageParameters; 732 mSMSOtherMessageParameters = prefs->mSMSOtherMessageParameters;
695 733
696 mPagerClient = prefs->mPagerClient; 734 mPagerClient = prefs->mPagerClient;
697 mPagerOtherChannel = prefs->mPagerOtherChannel; 735 mPagerOtherChannel = prefs->mPagerOtherChannel;
698 mPagerOtherMessage = prefs->mPagerOtherMessage; 736 mPagerOtherMessage = prefs->mPagerOtherMessage;
699 mPagerOtherMessageParameters = prefs->mPagerOtherMessageParameters; 737 mPagerOtherMessageParameters = prefs->mPagerOtherMessageParameters;
700 738
701 mSipClient = prefs->mSipClient; 739 mSipClient = prefs->mSipClient;
702 mSipOtherChannel = prefs->mSipOtherChannel; 740 mSipOtherChannel = prefs->mSipOtherChannel;
703 mSipOtherMessage = prefs->mSipOtherMessage; 741 mSipOtherMessage = prefs->mSipOtherMessage;
704 mSipOtherMessageParameters = prefs->mSipOtherMessageParameters; 742 mSipOtherMessageParameters = prefs->mSipOtherMessageParameters;
705 743
706 mCurrentApp = ExternalAppHandler::EMAIL; 744 mCurrentApp = ExternalAppHandler::EMAIL;
707 mCurrentClient = mEmailClient; 745 mCurrentClient = mEmailClient;
708 746
709 updateClientWidgets(); 747 updateClientWidgets();
710 748
711 blockSignals( blocked ); 749 blockSignals( blocked );
712 750
713} 751}
714 752
715void KDEPIMConfigWidget::usrWriteConfig() 753void KDEPIMConfigWidget::usrWriteConfig()
716{ 754{
717 KPimGlobalPrefs* prefs = KPimGlobalPrefs::instance(); 755 KPimGlobalPrefs* prefs = KPimGlobalPrefs::instance();
718 756
719 saveEditFieldSettings(); 757 saveEditFieldSettings();
720 758
721 759
722 prefs->mUserDateFormatShort = mUserDateFormatShort->text().replace( QRegExp(","), QString("K") ); 760 prefs->mUserDateFormatShort = mUserDateFormatShort->text().replace( QRegExp(","), QString("K") );
723 prefs->mUserDateFormatLong = mUserDateFormatLong->text().replace( QRegExp(","), QString("K") ); 761 prefs->mUserDateFormatLong = mUserDateFormatLong->text().replace( QRegExp(","), QString("K") );
724 762
725 prefs->mTimeZoneId = mTimeZoneCombo->currentText(); 763 prefs->mTimeZoneId = mTimeZoneCombo->currentText();
726 QDate date; 764 QDate date;
727 date = mStartDateSavingEdit->date(); 765 date = mStartDateSavingEdit->date();
728 int sub = 0; 766 int sub = 0;
729 if ( QDate::leapYear( date.year() ) && date.dayOfYear() > 59 ) 767 if ( QDate::leapYear( date.year() ) && date.dayOfYear() > 59 )
730 sub = 1; 768 sub = 1;
731 prefs->mDaylightsavingStart = date.dayOfYear()-sub; 769 prefs->mDaylightsavingStart = date.dayOfYear()-sub;
732 date = mEndDateSavingEdit->date(); 770 date = mEndDateSavingEdit->date();
733 if ( QDate::leapYear( date.year() ) && date.dayOfYear() > 59 ) 771 if ( QDate::leapYear( date.year() ) && date.dayOfYear() > 59 )
734 sub = 1; 772 sub = 1;
735 else 773 else
736 sub = 0; 774 sub = 0;
737 prefs->mDaylightsavingEnd = date.dayOfYear()-sub; 775 prefs->mDaylightsavingEnd = date.dayOfYear()-sub;
738 776
739 777
740 prefs->mEmailClient = mEmailClient; 778 prefs->mEmailClient = mEmailClient;
741 prefs->mEmailOtherChannel = mEmailOtherChannel; 779 prefs->mEmailOtherChannel = mEmailOtherChannel;
742 prefs->mEmailOtherMessage = mEmailOtherMessage; 780 prefs->mEmailOtherMessage = mEmailOtherMessage;
743 prefs->mEmailOtherMessageParameters = mEmailOtherMessageParameters; 781 prefs->mEmailOtherMessageParameters = mEmailOtherMessageParameters;
744 prefs->mEmailOtherMessage2 = mEmailOtherMessage2; 782 prefs->mEmailOtherMessage2 = mEmailOtherMessage2;
745 prefs->mEmailOtherMessageParameters2 = mEmailOtherMessageParameters2; 783 prefs->mEmailOtherMessageParameters2 = mEmailOtherMessageParameters2;
746 784
747 prefs->mPhoneClient = mPhoneClient; 785 prefs->mPhoneClient = mPhoneClient;
748 prefs->mPhoneOtherChannel = mPhoneOtherChannel; 786 prefs->mPhoneOtherChannel = mPhoneOtherChannel;
749 prefs->mPhoneOtherMessage = mPhoneOtherMessage; 787 prefs->mPhoneOtherMessage = mPhoneOtherMessage;
750 prefs->mPhoneOtherMessageParameters = mPhoneOtherMessageParameters; 788 prefs->mPhoneOtherMessageParameters = mPhoneOtherMessageParameters;
751 789
752 prefs->mFaxClient = mFaxClient; 790 prefs->mFaxClient = mFaxClient;
753 prefs->mFaxOtherChannel = mFaxOtherChannel; 791 prefs->mFaxOtherChannel = mFaxOtherChannel;
754 prefs->mFaxOtherMessage = mFaxOtherMessage; 792 prefs->mFaxOtherMessage = mFaxOtherMessage;
755 prefs->mFaxOtherMessageParameters = mFaxOtherMessageParameters; 793 prefs->mFaxOtherMessageParameters = mFaxOtherMessageParameters;
756 794
757 prefs->mSMSClient = mSMSClient; 795 prefs->mSMSClient = mSMSClient;
758 prefs->mSMSOtherChannel = mSMSOtherChannel; 796 prefs->mSMSOtherChannel = mSMSOtherChannel;
759 prefs->mSMSOtherMessage = mSMSOtherMessage; 797 prefs->mSMSOtherMessage = mSMSOtherMessage;
760 prefs->mSMSOtherMessageParameters = mSMSOtherMessageParameters; 798 prefs->mSMSOtherMessageParameters = mSMSOtherMessageParameters;
761 799
762 prefs->mPagerClient = mPagerClient; 800 prefs->mPagerClient = mPagerClient;
763 prefs->mPagerOtherChannel = mPagerOtherChannel; 801 prefs->mPagerOtherChannel = mPagerOtherChannel;
764 prefs->mPagerOtherMessage = mPagerOtherMessage; 802 prefs->mPagerOtherMessage = mPagerOtherMessage;
765 prefs->mPagerOtherMessageParameters = mPagerOtherMessageParameters; 803 prefs->mPagerOtherMessageParameters = mPagerOtherMessageParameters;
766 804
767 805
768 prefs->mSipClient = mSipClient; 806 prefs->mSipClient = mSipClient;
769 prefs->mSipOtherChannel = mSipOtherChannel; 807 prefs->mSipOtherChannel = mSipOtherChannel;
770 prefs->mSipOtherMessage = mSipOtherMessage; 808 prefs->mSipOtherMessage = mSipOtherMessage;
771 prefs->mSipOtherMessageParameters = mSipOtherMessageParameters; 809 prefs->mSipOtherMessageParameters = mSipOtherMessageParameters;
772 810
773 //release the cache that other views can access the changed values instantanious 811 //release the cache that other views can access the changed values instantanious
774 ExternalAppHandler::instance()->loadConfig(); 812 ExternalAppHandler::instance()->loadConfig();
775 KPimGlobalPrefs::instance()->setGlobalConfig(); 813 KPimGlobalPrefs::instance()->setGlobalConfig();
776} 814}
777 815
778 816
779void KDEPIMConfigWidget::setCombo(QComboBox *combo, const QString & text, 817void KDEPIMConfigWidget::setCombo(QComboBox *combo, const QString & text,
780 const QStringList *tags) 818 const QStringList *tags)
781{ 819{
782 if (tags) { 820 if (tags) {
783 int i = tags->findIndex(text); 821 int i = tags->findIndex(text);
784 if (i > 0) combo->setCurrentItem(i); 822 if (i > 0) combo->setCurrentItem(i);
785 } else { 823 } else {
786 for(int i=0;i<combo->count();++i) { 824 for(int i=0;i<combo->count();++i) {
787 if (combo->text(i) == text) { 825 if (combo->text(i) == text) {
788 combo->setCurrentItem(i); 826 combo->setCurrentItem(i);
789 break; 827 break;
790 } 828 }
791 } 829 }
792 } 830 }
793} 831}
794 832
795 833
796void KDEPIMConfigWidget::textChanged( const QString& text ) 834void KDEPIMConfigWidget::textChanged( const QString& text )
797{ 835{
798 emit changed( true ); 836 emit changed( true );
799} 837}
diff --git a/libkdepim/kcmconfigs/kdepimconfigwidget.h b/libkdepim/kcmconfigs/kdepimconfigwidget.h
index 619f3d7..c545207 100644
--- a/libkdepim/kcmconfigs/kdepimconfigwidget.h
+++ b/libkdepim/kcmconfigs/kdepimconfigwidget.h
@@ -1,155 +1,160 @@
1/* 1/*
2 This file is part of KDEPim/Pi. 2 This file is part of KDEPim/Pi.
3 Copyright (c) 2004 Ulf Schenk 3 Copyright (c) 2004 Ulf Schenk
4 4
5 This program is free software; you can redistribute it and/or modify 5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by 6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or 7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version. 8 (at your option) any later version.
9 9
10 This program is distributed in the hope that it will be useful, 10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details. 13 GNU General Public License for more details.
14 14
15 You should have received a copy of the GNU General Public License 15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software 16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 18
19 As a special exception, permission is given to link this program 19 As a special exception, permission is given to link this program
20 with any edition of Qt, and distribute the resulting executable, 20 with any edition of Qt, and distribute the resulting executable,
21 without including the source code for Qt in the source distribution. 21 without including the source code for Qt in the source distribution.
22*/ 22*/
23 23
24/* 24/*
25Enhanced Version of the file for platform independent KDE tools. 25Enhanced Version of the file for platform independent KDE tools.
26Copyright (c) 2004 Ulf Schenk 26Copyright (c) 2004 Ulf Schenk
27 27
28$Id$ 28$Id$
29*/ 29*/
30 30
31#ifndef KDEPIMCONFIGWIDGET_H 31#ifndef KDEPIMCONFIGWIDGET_H
32#define KDEPIMCONFIGWIDGET_H 32#define KDEPIMCONFIGWIDGET_H
33 33
34#include <kprefswidget.h> 34#include <kprefswidget.h>
35#include <kio/kfile/kurlrequester.h>
35#include <qmap.h> 36#include <qmap.h>
36 37
37#include "externalapphandler.h" 38#include "externalapphandler.h"
38 39
39 40
40class QComboBox; 41class QComboBox;
41class QLineEdit; 42class QLineEdit;
42class KPimGlobalPrefs; 43class KPimGlobalPrefs;
43class QGroupBox; 44class QGroupBox;
44class QTabWidget; 45class QTabWidget;
45class KDateEdit; 46class KDateEdit;
46 47
47class KDEPIMConfigWidget : public KPrefsWidget 48class KDEPIMConfigWidget : public KPrefsWidget
48{ 49{
49 Q_OBJECT 50 Q_OBJECT
50 51
51 public: 52 public:
52 KDEPIMConfigWidget(KPimGlobalPrefs *prefs, QWidget *parent, const char *name = 0 ); 53 KDEPIMConfigWidget(KPimGlobalPrefs *prefs, QWidget *parent, const char *name = 0 );
53 54
54 public slots: 55 public slots:
55 void textChanged( const QString& text ); 56 void textChanged( const QString& text );
56 void showTimeZoneTab(); 57 void showTimeZoneTab();
57 58
58 protected: 59 protected:
59 /** Implement this to read custom configuration widgets. */ 60 /** Implement this to read custom configuration widgets. */
60 virtual void usrReadConfig(); 61 virtual void usrReadConfig();
61 /** Implement this to write custom configuration widgets. */ 62 /** Implement this to write custom configuration widgets. */
62 virtual void usrWriteConfig(); 63 virtual void usrWriteConfig();
63 64
64 65
65 private slots: 66 private slots:
66// void configureExtension(); 67// void configureExtension();
67// void selectionChanged( QListViewItem* ); 68// void selectionChanged( QListViewItem* );
68// void itemClicked( QListViewItem* ); 69// void itemClicked( QListViewItem* );
69 void client_changed( int newClient ); 70 void client_changed( int newClient );
70 void externalapp_changed( int newApp ); 71 void externalapp_changed( int newApp );
72 void saveStoreSettings();
73 void setStandardStore();
71 74
72 private: 75 private:
73 void setupExternalAppTab(); 76 void setupExternalAppTab();
74 void setupLocaleDateTab(); 77 void setupLocaleDateTab();
75 void setupLocaleTab(); 78 void setupLocaleTab();
76 void setupTimeZoneTab(); 79 void setupTimeZoneTab();
80 void setupStoreTab();
81 KURLRequester* mStoreUrl;
77 82
78 void setCombo(QComboBox *combo,const QString & text, const QStringList *tags = 0); 83 void setCombo(QComboBox *combo,const QString & text, const QStringList *tags = 0);
79 84
80 85
81 void saveEditFieldSettings(); 86 void saveEditFieldSettings();
82 void updateClientWidgets(); 87 void updateClientWidgets();
83 88
84 QTabWidget *tabWidget; 89 QTabWidget *tabWidget;
85 90
86 91
87 QLineEdit* mUserDateFormatShort; 92 QLineEdit* mUserDateFormatShort;
88 QLineEdit* mUserDateFormatLong; 93 QLineEdit* mUserDateFormatLong;
89 QComboBox* mTimeZoneCombo; 94 QComboBox* mTimeZoneCombo;
90 KDateEdit* mStartDateSavingEdit; 95 KDateEdit* mStartDateSavingEdit;
91 KDateEdit* mEndDateSavingEdit; 96 KDateEdit* mEndDateSavingEdit;
92 97
93// void restoreExtensionSettings(); 98// void restoreExtensionSettings();
94// void saveExtensionSettings(); 99// void saveExtensionSettings();
95 100
96// KListView *mExtensionView; 101// KListView *mExtensionView;
97 102
98// QCheckBox *mNameParsing; 103// QCheckBox *mNameParsing;
99// QCheckBox *mViewsSingleClickBox; 104// QCheckBox *mViewsSingleClickBox;
100// QPushButton *mConfigureButton; 105// QPushButton *mConfigureButton;
101 QComboBox* mExternalApps; 106 QComboBox* mExternalApps;
102 QGroupBox* mExternalAppGroupBox; 107 QGroupBox* mExternalAppGroupBox;
103 108
104 109
105 QComboBox* mClient; 110 QComboBox* mClient;
106 QLineEdit* mChannel; 111 QLineEdit* mChannel;
107 QLineEdit* mMessage; 112 QLineEdit* mMessage;
108 QLineEdit* mParameters; 113 QLineEdit* mParameters;
109 QLineEdit* mMessage2; 114 QLineEdit* mMessage2;
110 QLineEdit* mParameters2; 115 QLineEdit* mParameters2;
111 116
112 ExternalAppHandler::Types mCurrentApp; 117 ExternalAppHandler::Types mCurrentApp;
113 int mCurrentClient; 118 int mCurrentClient;
114 119
115 120
116 int mEmailClient; 121 int mEmailClient;
117 QString mEmailOtherChannel; 122 QString mEmailOtherChannel;
118 QString mEmailOtherMessage; 123 QString mEmailOtherMessage;
119 QString mEmailOtherMessageParameters; 124 QString mEmailOtherMessageParameters;
120 QString mEmailOtherMessage2; 125 QString mEmailOtherMessage2;
121 QString mEmailOtherMessageParameters2; 126 QString mEmailOtherMessageParameters2;
122 127
123 int mPhoneClient; 128 int mPhoneClient;
124 QString mPhoneOtherChannel; 129 QString mPhoneOtherChannel;
125 QString mPhoneOtherMessage; 130 QString mPhoneOtherMessage;
126 QString mPhoneOtherMessageParameters; 131 QString mPhoneOtherMessageParameters;
127 132
128 int mFaxClient; 133 int mFaxClient;
129 QString mFaxOtherChannel; 134 QString mFaxOtherChannel;
130 QString mFaxOtherMessage; 135 QString mFaxOtherMessage;
131 QString mFaxOtherMessageParameters; 136 QString mFaxOtherMessageParameters;
132 137
133 int mSMSClient; 138 int mSMSClient;
134 QString mSMSOtherChannel; 139 QString mSMSOtherChannel;
135 QString mSMSOtherMessage; 140 QString mSMSOtherMessage;
136 QString mSMSOtherMessageParameters; 141 QString mSMSOtherMessageParameters;
137 142
138 int mPagerClient; 143 int mPagerClient;
139 QString mPagerOtherChannel; 144 QString mPagerOtherChannel;
140 QString mPagerOtherMessage; 145 QString mPagerOtherMessage;
141 QString mPagerOtherMessageParameters; 146 QString mPagerOtherMessageParameters;
142 147
143 int mSipClient; 148 int mSipClient;
144 QString mSipOtherChannel; 149 QString mSipOtherChannel;
145 QString mSipOtherMessage; 150 QString mSipOtherMessage;
146 QString mSipOtherMessageParameters; 151 QString mSipOtherMessageParameters;
147 152
148 153
149 154
150 QMap<ExternalAppHandler::Types, QString> mExternalAppsMap; 155 QMap<ExternalAppHandler::Types, QString> mExternalAppsMap;
151 156
152// AddresseeWidget *mAddresseeWidget; 157// AddresseeWidget *mAddresseeWidget;
153}; 158};
154 159
155#endif 160#endif
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