summaryrefslogtreecommitdiffabout
authorzautrix <zautrix>2005-01-24 21:00:03 (UTC)
committer zautrix <zautrix>2005-01-24 21:00:03 (UTC)
commit60733d98dff3ff5f8e95c514af258498aa7aa014 (patch) (unidiff)
tree751d6533a51790da2afa49c870ff2342d6e3b0bf
parentbb33b559609356149ae51cb50c081b3e82aecafb (diff)
downloadkdepimpi-60733d98dff3ff5f8e95c514af258498aa7aa014.zip
kdepimpi-60733d98dff3ff5f8e95c514af258498aa7aa014.tar.gz
kdepimpi-60733d98dff3ff5f8e95c514af258498aa7aa014.tar.bz2
memory leak fix
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--bin/kdepim/WhatsNew.txt4
-rw-r--r--kmicromail/libetpan/mh/mailmh.c3
2 files changed, 5 insertions, 2 deletions
diff --git a/bin/kdepim/WhatsNew.txt b/bin/kdepim/WhatsNew.txt
index 42b36f1..5864ce4 100644
--- a/bin/kdepim/WhatsNew.txt
+++ b/bin/kdepim/WhatsNew.txt
@@ -1,541 +1,541 @@
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.20 ************ 3********** VERSION 1.9.20 ************
4 4
5KO/Pi: 5KO/Pi:
6Added for the "dislplay one day" agenda mode 6Added for the "dislplay one day" agenda mode
7info in the caption and in the day lables: 7info in the caption and in the day lables:
8Now it is displayed, if the selected day is from "day before yesterday" 8Now it is displayed, if the selected day is from "day before yesterday"
9to "day after tomorrow". 9to "day after tomorrow".
10Made it possible to delete a Todo, which has sub-todos. 10Made it possible to delete a Todo, which has sub-todos.
11Fixed two small problems in the todo view. 11Fixed two small problems in the todo view.
12Added missing German translation for filter edit and print dialog. 12Added missing German translation for filter edit and print dialog.
13Made search dialog closeable by cancel key. 13Made search dialog closeable by cancel key.
14 14
15Made it possible to select in the date picker the (ligt grey ) 15Made it possible to select in the date picker the (ligt grey )
16dates of the prev./next month with the mouse. 16dates of the prev./next month with the mouse.
17 17
18OM/Pi: 18OM/Pi:
19"Delete mail" icon in main window now deletes all selected mails. 19"Delete mail" icon in main window now deletes all selected mails.
20Fixed the problem, that the state flag of imap mails was ignored. 20Fixed the problem, that the state flag of imap mails was ignored.
21Now mails with "FLAG_SEEN" on the imap server get no icon in the list view 21Now mails with "FLAG_SEEN" on the imap server get no icon in the list view
22to indecate that they are already seen. 22to indecate that they are already seen.
23Fixed the problem that the body of some mails was not displayed in the 23Fixed the problem that the body of some mails was not displayed in the
24mail viewer when fetching them from the imap server directly to read them. 24mail viewer when fetching them from the imap server directly to read them.
25Made it (configurable) possible to show the "To:" field in the list view. 25Made it (configurable) possible to show the "To:" field in the list view.
26Added to the mail viewer the option "View Source" to make it possible to see the raw mail data. 26Added to the mail viewer the option "View Source" to make it possible to see the raw mail data.
27Added a "Download Mail" button to the mail viewer to quickly download the viewed mail to the 27Added a "Download Mail" button to the mail viewer to quickly download the viewed mail to the
28local storage folder (specified in account setiings) of the account of the mail. 28local storage folder (specified in account settings) of the account of the mail.
29 29Removed some memory leaks in OM/Pi.
30 30
31 31
32********** VERSION 1.9.19 ************ 32********** VERSION 1.9.19 ************
33 33
34Added a lot of missing translations to KA/Pi, 34Added a lot of missing translations to KA/Pi,
35Added some missing translations to KO/Pi and OM/Pi. 35Added some missing translations to KO/Pi and OM/Pi.
36 36
37Fixed some minor problems in KA/Pi + KO/Pi. 37Fixed some minor problems in KA/Pi + KO/Pi.
38 38
39Fixed a crash when closing PwM/Pi. 39Fixed a crash when closing PwM/Pi.
40Added German translation for PwM/Pi. 40Added German translation for PwM/Pi.
41 41
42Made view change and Month View update faster in KO/Pi. 42Made view change and Month View update faster in KO/Pi.
43 43
44 44
45********** VERSION 1.9.18 ************ 45********** VERSION 1.9.18 ************
46 46
47FYI: The VERSION 1.9.17 was a testing release only. 47FYI: The VERSION 1.9.17 was a testing release only.
48Please read the changelog of VERSION 1.9.17 as well. 48Please read the changelog of VERSION 1.9.17 as well.
49 49
50Cleaned up the syncing config dialog. 50Cleaned up the syncing config dialog.
51Added sync config options for date range for events. 51Added sync config options for date range for events.
52Added sync config options for filters on incoming data. 52Added sync config options for filters on incoming data.
53Added sync config options for filters on outgoing data. 53Added sync config options for filters on outgoing data.
54Please read the updated SyncHowTo about the new filter settings. 54Please read the updated SyncHowTo about the new filter settings.
55These filter settings make it now possible to sync with shared 55These filter settings make it now possible to sync with shared
56calendars without writing back private or confidential data 56calendars without writing back private or confidential data
57(via the outgoing filters). 57(via the outgoing filters).
58To sync only with particular parts of a shared calendar, 58To sync only with particular parts of a shared calendar,
59the incoming filter settings can be used. 59the incoming filter settings can be used.
60An example can be found in the SyncHowTo. 60An example can be found in the SyncHowTo.
61Same for shared addressbooks. 61Same for shared addressbooks.
62 62
63Added a setting for the global kdepim data storage. 63Added a setting for the global kdepim data storage.
64Usually the data is stored in (yourhomedir/kdepim). 64Usually the data is stored in (yourhomedir/kdepim).
65Now you can set in the Global config dialog TAB, subTAB "Data storage path" 65Now you can set in the Global config dialog TAB, subTAB "Data storage path"
66a directory where all the kdepim data is stored. 66a directory where all the kdepim data is stored.
67That makes it easy to save all kdepim data on a SD card on the Z, for example. 67That makes it easy to save all kdepim data on a SD card on the Z, for example.
68 68
69KO/Pi: 69KO/Pi:
70The timeedit input has a pulldown list for times. 70The timeedit input has a pulldown list for times.
71If opened, this pulldown list should now has the right time highlighted. 71If opened, this pulldown list should now has the right time highlighted.
72Added the possibility to exclude events/todos/journals in a filter. 72Added the possibility to exclude events/todos/journals in a filter.
73You should exclude journals, if you do not want them to sync with a public calendar. 73You should exclude journals, if you do not want them to sync with a public calendar.
74 74
75KA/Pi: 75KA/Pi:
76Added the possibility to in/exclude public/private/confidential contacts to a filter. 76Added the possibility to in/exclude public/private/confidential contacts to a filter.
77If 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 ... 77If 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 ...
78Added printing of card view and details view on desktop. 78Added printing of card view and details view on desktop.
79Printing of list view is not working... 79Printing of list view is not working...
80Added button for removing pictures in contact editor. 80Added button for removing pictures in contact editor.
81Parsing data fix of KA/Pi version 1.9.17. 81Parsing data fix of KA/Pi version 1.9.17.
82Fixed the "parse name automatically" problem of KA/Pi version 1.9.17. 82Fixed the "parse name automatically" problem of KA/Pi version 1.9.17.
83Fixed some syncing merging problems. 83Fixed some syncing merging problems.
84 84
85 85
86********** VERSION 1.9.17 ************ 86********** VERSION 1.9.17 ************
87 87
88KO/Pi: 88KO/Pi:
89Fixed that tooltips were not updated after moving an item in agenda view. 89Fixed that tooltips were not updated after moving an item in agenda view.
90Fixed a bug in sorting start date for recurring events in list view. 90Fixed a bug in sorting start date for recurring events in list view.
91Changed the left button in todo viewer from "Agenda" to "Set completed". 91Changed the left button in todo viewer from "Agenda" to "Set completed".
92This 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. 92This 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.
93Added more info in the todo viewer: Startdate, parent/sub todos. 93Added more info in the todo viewer: Startdate, parent/sub todos.
94 94
95 95
96KA/Pi: 96KA/Pi:
97All fields search does now actually search all the (possible) fields, 97All fields search does now actually search all the (possible) fields,
98not only those listed in the contact list. 98not only those listed in the contact list.
99Made is possible to inline a picture in a vcard on the Z. 99Made is possible to inline a picture in a vcard on the Z.
100This was only possible on the desktop, now is it possible on the Z as well. 100This was only possible on the desktop, now is it possible on the Z as well.
101Fixed of missing save settings after filter configuration. 101Fixed of missing save settings after filter configuration.
102Made saving of addressbook much faster. 102Made saving of addressbook much faster.
103Fixed extension widget layout problem. 103Fixed extension widget layout problem.
104Fixed saving of default formatted name settings. 104Fixed saving of default formatted name settings.
105Fixed formatted name handling in edit dialog. 105Fixed formatted name handling in edit dialog.
106Added an option for changing formatted names of many contacts 106Added an option for changing formatted names of many contacts
107(menu: File - Change - Set formatted name). 107(menu: File - Change - Set formatted name).
108 108
109QWhatsThis was not working on the Z ( only black rectangle was shown). 109QWhatsThis was not working on the Z ( only black rectangle was shown).
110This is Fixed. 110This is Fixed.
111 111
112KDE-Sync: 112KDE-Sync:
113Now readonly KDE resources are synced as well. 113Now readonly KDE resources are synced as well.
114(They are not changed in KDE itself, of course). 114(They are not changed in KDE itself, of course).
115 115
116 116
117 117
118********** VERSION 1.9.16 ************ 118********** VERSION 1.9.16 ************
119 119
120KO/Pi: 120KO/Pi:
121Fixed search dialog size on Z 6000 (480x640 display). 121Fixed search dialog size on Z 6000 (480x640 display).
122Added setting to hide/show time in agenda items. 122Added setting to hide/show time in agenda items.
123Added setting to hide not running todos in todo view. 123Added setting to hide not running todos in todo view.
124Added columns for start date/time in todo view. 124Added columns for start date/time in todo view.
125Replaced the solid half-hour lines in agenda view by dot lines. 125Replaced the solid half-hour lines in agenda view by dot lines.
126Added possibility of printing the What's Next View on the desktop 126Added possibility of printing the What's Next View on the desktop
127(i.e. Windows and Linux). 127(i.e. Windows and Linux).
128Fixed a crash in KO/Pi when starting KO/Pi with What's Next view. 128Fixed a crash in KO/Pi when starting KO/Pi with What's Next view.
129Added tooltips in month view.(Tooltips only available on desktop) 129Added tooltips in month view.(Tooltips only available on desktop)
130 130
131Fixed a strange problem in KO/Pi alarm applet. 131Fixed a strange problem in KO/Pi alarm applet.
132Did not find the actual problem, 132Did not find the actual problem,
133such that now Qtopia reboots again if deinstalling the alarm applet. 133such that now Qtopia reboots again if deinstalling the alarm applet.
134But the alarm applet should work again. 134But the alarm applet should work again.
135 135
136KA/Pi: 136KA/Pi:
137Fixed the problem, that internal pictures were not saved. 137Fixed the problem, that internal pictures were not saved.
138 138
139Fixed a problem in the pi-sync mode by increasing the timeout for data transfer from 20 seconds to 5 minutes. 139Fixed a problem in the pi-sync mode by increasing the timeout for data transfer from 20 seconds to 5 minutes.
140 140
141Fixed some minor problems. (Like word wrap in help text windows). 141Fixed some minor problems. (Like word wrap in help text windows).
142 142
143Fixed a compiling problem in microkde/kresources. 143Fixed a compiling problem in microkde/kresources.
144 144
145KO/Pi is using zdbat (renamed to db2file) for syncing with Sharp DTM. 145KO/Pi is using zdbat (renamed to db2file) for syncing with Sharp DTM.
146This version now includes zdbat 1.0.0 (old version was zdbat 0.2.9) 146This version now includes zdbat 1.0.0 (old version was zdbat 0.2.9)
147such that now syncing KO/Pi with Sharp DTM should work on the 147such that now syncing KO/Pi with Sharp DTM should work on the
148Zaurus C 3000 model. 148Zaurus C 3000 model.
149 149
150********** VERSION 1.9.15 ************ 150********** VERSION 1.9.15 ************
151 151
152Usebilty enhancements in KO/Pi: 152Usebilty enhancements in KO/Pi:
153When clicking on the date in a month view cell, the day view is shown. 153When clicking on the date in a month view cell, the day view is shown.
154Old behaviour was, that the "new event" dialog popped up. 154Old behaviour was, that the "new event" dialog popped up.
155 155
156Added a one step "undo delete" in KO/Pi (Accessable in the "Action" menu). 156Added a one step "undo delete" in KO/Pi (Accessable in the "Action" menu).
157That means, you can restore the latest 157That means, you can restore the latest
158event/todo/journal you have deleted. 158event/todo/journal you have deleted.
159A journal is deleted, if you clear all the text of the journal. 159A journal is deleted, if you clear all the text of the journal.
160 160
161Fixed the bug of the editor dialogs in KO/Pi of version 1.9.14. 161Fixed the bug of the editor dialogs in KO/Pi of version 1.9.14.
162 162
163KA/Pi starting in 480x640 resolution: 163KA/Pi starting in 480x640 resolution:
164Hide the filter action in toolbar 164Hide the filter action in toolbar
165and added icons for undo/delete/redo in toolbar. 165and added icons for undo/delete/redo in toolbar.
166 166
167Change in OM/Pi ViewMail dialog: 167Change in OM/Pi ViewMail dialog:
168When clicking on the "delete" icon the mail is deleted after confirmation as usual. 168When clicking on the "delete" icon the mail is deleted after confirmation as usual.
169But the edit dialog is not closed as before, now the next mail in the folder is shown automatically (if there is any). 169But the edit dialog is not closed as before, now the next mail in the folder is shown automatically (if there is any).
170 170
171Fixed a crash when deleting mail-accounts in OM/Pi. 171Fixed a crash when deleting mail-accounts in OM/Pi.
172 172
173 173
174********** VERSION 1.9.14 ************ 174********** VERSION 1.9.14 ************
175 175
176Fixed some problems with the dialog sizes when switching 176Fixed some problems with the dialog sizes when switching
177portrait/landscape mode on 640x480 PDA display. 177portrait/landscape mode on 640x480 PDA display.
178 178
179Fixed some other small bugs in KA/Pi KO/Pi and OM/Pi and PwM/Pi. 179Fixed some other small bugs in KA/Pi KO/Pi and OM/Pi and PwM/Pi.
180 180
181Fixed an ugly bug in KOpieMail: 181Fixed an ugly bug in KOpieMail:
182KOpieMail was not able to write files (mails) to MSDOS file system, 182KOpieMail was not able to write files (mails) to MSDOS file system,
183like on an usual preformatted SD card. That should work now. 183like on an usual preformatted SD card. That should work now.
184To save your mail data on the Sd card do the following: 184To save your mail data on the Sd card do the following:
185Create a dir on the SD card: 185Create a dir on the SD card:
186mkdir /mnt/card/localmail 186mkdir /mnt/card/localmail
187Go to your home dir: 187Go to your home dir:
188cd 188cd
189Go to kopiemail data storage dir: 189Go to kopiemail data storage dir:
190cd kdepim/apps/kopiemail 190cd kdepim/apps/kopiemail
191Create a symlink to the SD card: 191Create a symlink to the SD card:
192ls -s /mnt/card/localmail 192ls -s /mnt/card/localmail
193Now KOpieMail will store all mails on the SD card. 193Now KOpieMail will store all mails on the SD card.
194 194
195KO/Pi Monthview: 195KO/Pi Monthview:
196Now "Go to Today" selects the current month from day 1-end, 196Now "Go to Today" selects the current month from day 1-end,
197not the current date + some days. 197not the current date + some days.
198I.e. "Go to Today" shows now always 198I.e. "Go to Today" shows now always
199the current month with first day of month in the first row. 199the current month with first day of month in the first row.
200 200
201Added missing German translation. 201Added missing German translation.
202 202
203Fixed icons of executeable on Wintendo. 203Fixed icons of executeable on Wintendo.
204 204
205Added a "Show next Mail" button to the OM/Pi 205Added a "Show next Mail" button to the OM/Pi
206mail viewer such that the mail below the current mail 206mail viewer such that the mail below the current mail
207in the mail list view of the current folder 207in the mail list view of the current folder
208can be read with a single click. 208can be read with a single click.
209 209
210 210
211********** VERSION 1.9.13 ************ 211********** VERSION 1.9.13 ************
212 212
213Fixed nasty PwM/Pi file reading bug, when 213Fixed nasty PwM/Pi file reading bug, when
214the used hash algo of file is different then the global 214the used hash algo of file is different then the global
215hash algo. 215hash algo.
216 216
217Added KA/Pi support for opie mailit mailapplication. 217Added KA/Pi support for opie mailit mailapplication.
218 218
219Fixed some bugs in OM/Pi. 219Fixed some bugs in OM/Pi.
220Now character conversion tables are available for the Zaurus 220Now character conversion tables are available for the Zaurus
221to make OM/Pi working properly. 221to make OM/Pi working properly.
222To get the character conversion in OM/Pi working, please download 222To get the character conversion in OM/Pi working, please download
223at the sourceforge project site the package 223at the sourceforge project site the package
224sr-character-conversion_SharpROM_arm.ipk.zip 224sr-character-conversion_SharpROM_arm.ipk.zip
225(or oz-character-conversion_OZ-gcc3xx_arm.ipk.zip for OZ roms) 225(or oz-character-conversion_OZ-gcc3xx_arm.ipk.zip for OZ roms)
226from the section "general files for KDE/Pim" 226from the section "general files for KDE/Pim"
227Instructions how to install this package are in a ReadMe in this file. 227Instructions how to install this package are in a ReadMe in this file.
228 228
229 229
230Fixed the orientation change problem in KA/Pi when switching 230Fixed the orientation change problem in KA/Pi when switching
231portrait/landscape mode. 231portrait/landscape mode.
232 232
233French translation available for KA/Pi and OM/Pi. 233French translation available for KA/Pi and OM/Pi.
234 234
235Fixed some problems with categories in KO/Pi in DTM sync. 235Fixed some problems with categories in KO/Pi in DTM sync.
236 236
237Added selection dialog for export to phone in KA/Pi. 237Added selection dialog for export to phone in KA/Pi.
238 238
239If in KO/Pi is an attendee selected to add to a meeting and this 239If in KO/Pi is an attendee selected to add to a meeting and this
240attendee is already in the list of attendees, this person is not added 240attendee is already in the list of attendees, this person is not added
241again. 241again.
242 242
243Some menu cleanup in KA/Pi. 243Some menu cleanup in KA/Pi.
244 244
245********** VERSION 1.9.12 ************ 245********** VERSION 1.9.12 ************
246 246
247Fix for the bug in KO/Pi What's Next view of version 1.9.11. 247Fix for the bug in KO/Pi What's Next view of version 1.9.11.
248 248
249Bugfix: Licence file is now shown again. 249Bugfix: Licence file is now shown again.
250 250
251OM/Pi now supports Unicode (utf8 charset). 251OM/Pi now supports Unicode (utf8 charset).
252Fixed some bugs in OM/Pi. 252Fixed some bugs in OM/Pi.
253 253
254KA/Pi has more German translation. 254KA/Pi has more German translation.
255 255
256 256
257********** VERSION 1.9.11 ************ 257********** VERSION 1.9.11 ************
258 258
259Fixed several problems in PWM/Pi, like 259Fixed several problems in PWM/Pi, like
260asking the user, if unsaved changed are pending 260asking the user, if unsaved changed are pending
261when closing the app. 261when closing the app.
262And PwM/Pi handles now different texts for the 262And PwM/Pi handles now different texts for the
263fields Description, Username, Password, configurable per category. 263fields Description, Username, Password, configurable per category.
264 264
265Fixed a crash in KO/Pi , when importing/loading vcs files 265Fixed a crash in KO/Pi , when importing/loading vcs files
266which have an entry with an attendee with state: 266which have an entry with an attendee with state:
267NEEDS ACTION 267NEEDS ACTION
268 268
269Fixed some problems in the German translation of OM/Pi, 269Fixed some problems in the German translation of OM/Pi,
270which makes some dialogs not fitting on the screen 270which makes some dialogs not fitting on the screen
271of the Z 5500. 271of the Z 5500.
272 272
273Fixed Qtopia crash, when disabling/deinstalling 273Fixed Qtopia crash, when disabling/deinstalling
274KO/Pi alarm applet. 274KO/Pi alarm applet.
275 275
276Implemented direct KDE<->KA/Pi sync for KA/Pi running 276Implemented direct KDE<->KA/Pi sync for KA/Pi running
277on Linux desktop. 277on Linux desktop.
278 278
279Added feature "remove sync info" to sync menu. 279Added feature "remove sync info" to sync menu.
280 280
281Tweaked the KO/Pi What's next view a bit, added 281Tweaked the KO/Pi What's next view a bit, added
282setting to hide events that are done. 282setting to hide events that are done.
283 283
284Disabled "beam receive enabled" on startup to 284Disabled "beam receive enabled" on startup to
285avoid problems if Fastload is enabled. 285avoid problems if Fastload is enabled.
286Please set "beam receive enabled", 286Please set "beam receive enabled",
287if you want to receive data via IR. 287if you want to receive data via IR.
288 288
289Fixed bug in direct KDE<->KO/Pi sync for KO/Pi running 289Fixed bug in direct KDE<->KO/Pi sync for KO/Pi running
290on Linux desktop. 290on Linux desktop.
291 291
292Made in KA/Pi scrolling possible, if details view is selected. 292Made in KA/Pi scrolling possible, if details view is selected.
293(The keyboard focus is set automatically to the search line) 293(The keyboard focus is set automatically to the search line)
294 294
295Fixed a bug in DMT sync, that a new entry in DTM was added 295Fixed a bug in DMT sync, that a new entry in DTM was added
296on every sync to Kx/Pi. 296on every sync to Kx/Pi.
297 297
298Fixed missing writing of KA/Pi categories to DMT entries when syncing. 298Fixed missing writing of KA/Pi categories to DMT entries when syncing.
299 299
300Fixed a bug in DMT sync with todos created in KO/Pi containing 300Fixed a bug in DMT sync with todos created in KO/Pi containing
301non-latin1 characters. 301non-latin1 characters.
302 302
303Rearranged package contents of Sharp-ipks and made all 303Rearranged package contents of Sharp-ipks and made all
304packages installable on SD again. 304packages installable on SD again.
305 305
306Fixed the writing of addressbook data in DTM sync. 306Fixed the writing of addressbook data in DTM sync.
307Empty fields in KA/Pi were not removed. 307Empty fields in KA/Pi were not removed.
308 308
309Added better category handling in KA/Pi: 309Added better category handling in KA/Pi:
310Added item 310Added item
311Edit Categories and 311Edit Categories and
312Manage new categories 312Manage new categories
313to the settings menu. 313to the settings menu.
314Possible to configure a view to display categories. 314Possible to configure a view to display categories.
315 315
316Added detailed "KDE Sync Howto" and "Multi Sync Howto" to Help menu. 316Added detailed "KDE Sync Howto" and "Multi Sync Howto" to Help menu.
317 317
318Fixed displaying of "free" days and time in KO Monthview and Agendaview. 318Fixed displaying of "free" days and time in KO Monthview and Agendaview.
319 319
320... and many other bugfixes. 320... and many other bugfixes.
321 321
322********** VERSION 1.9.10 ************ 322********** VERSION 1.9.10 ************
323 323
324Many internal small bugfixes. 324Many internal small bugfixes.
325And fix of the "big" bug in KO/Pi, 325And fix of the "big" bug in KO/Pi,
326that after Syncing the appointments had an offset by several hours. 326that after Syncing the appointments had an offset by several hours.
327That was a problem with the internal timezone setting, 327That was a problem with the internal timezone setting,
328introduced by the changed timezone configuration settings. 328introduced by the changed timezone configuration settings.
329 329
330German translation for OM/Pi is now available. 330German translation for OM/Pi is now available.
331 331
332 332
333********** VERSION 1.9.9 ************ 333********** VERSION 1.9.9 ************
334 334
335KDE-Pim/Pi has a new Member! 335KDE-Pim/Pi has a new Member!
336It is called PWM/Pi (Passwordmanager/platform-independent) 336It is called PWM/Pi (Passwordmanager/platform-independent)
337and it is available for the Zaurus. 337and it is available for the Zaurus.
338It is planned, that it will be available later for Windows. 338It is planned, that it will be available later for Windows.
339(And for Linux, of course). 339(And for Linux, of course).
340It is a port of the Passwordmanager of KDE. 340It is a port of the Passwordmanager of KDE.
341It will need the MicroKDElibs to run. 341It will need the MicroKDElibs to run.
342 342
343Made loading of addressbooks in KA/Pi up to 7 times faster! 343Made loading of addressbooks in KA/Pi up to 7 times faster!
344The bigger your addressbook file, the more starting speed 344The bigger your addressbook file, the more starting speed
345will you gain. (relatively) 345will you gain. (relatively)
346 346
347The Qtopia addressbook connector is now platform independend 347The Qtopia addressbook connector is now platform independend
348as well and should work on any platform for importing/exporting 348as well and should work on any platform for importing/exporting
349Qtopia and Opie XML files. 349Qtopia and Opie XML files.
350 350
351Added a +30min feature to the timezone settings to make 351Added a +30min feature to the timezone settings to make
352KDE-Pim/Pi useable in Australia and other parts on the 352KDE-Pim/Pi useable in Australia and other parts on the
353world with strange timezones ;-) 353world with strange timezones ;-)
354 354
355German "Umlaute" should now be sorted correctly on the Z in KA/Pi. 355German "Umlaute" should now be sorted correctly on the Z in KA/Pi.
356 356
357It is now possible to disable the 357It is now possible to disable the
358"receive data via infrared" feature, such that syncing with 358"receive data via infrared" feature, such that syncing with
359Outlook is now possible again with Kx/Pi runing. 359Outlook is now possible again with Kx/Pi runing.
360Please disable it, before syncing Sharp DTM with Outlook. 360Please disable it, before syncing Sharp DTM with Outlook.
361For your convenience, the "receive data via infrared" feature 361For your convenience, the "receive data via infrared" feature
362is disabled automatically, if you sync Kx/Pi with DTM. 362is disabled automatically, if you sync Kx/Pi with DTM.
363You have to enable it again manually after syncing. 363You have to enable it again manually after syncing.
364Enabling this feature makes it impossible to start the 364Enabling this feature makes it impossible to start the
365Sharp DTM apps. If this feature is enabled, you will only get the 365Sharp DTM apps. If this feature is enabled, you will only get the
366alarm notification from KO/Pi and not from the Sharp calendar. 366alarm notification from KO/Pi and not from the Sharp calendar.
367This is very useful if you sync KO/Pi with Sharp DTM, 367This is very useful if you sync KO/Pi with Sharp DTM,
368because after syncing you usually would get notified about 368because after syncing you usually would get notified about
369an alarm by KO/Pi and the Sharp Calendar. 369an alarm by KO/Pi and the Sharp Calendar.
370 370
371Together with the Linux desktop version of KO/Pi 371Together with the Linux desktop version of KO/Pi
372it is now possible to sync KO/Pi on the Zaurus 372it is now possible to sync KO/Pi on the Zaurus
373with the complete KDE-desktop (3.3 or later) 373with the complete KDE-desktop (3.3 or later)
374calendar data easily. 374calendar data easily.
375That makes it possible to sync the Z with one 375That makes it possible to sync the Z with one
376click of a mouse with the KDE-Desktop. 376click of a mouse with the KDE-Desktop.
377This feature it available for all Zaurus platforms KO/Pi 377This feature it available for all Zaurus platforms KO/Pi
378is running on. 378is running on.
379The only thing needed is a running KO/Pi on Linux and 379The only thing needed is a running KO/Pi on Linux and
380a compiled version of the small 380a compiled version of the small
381KDE-Pim/Pi<->KDE-Desktop access command line program, 381KDE-Pim/Pi<->KDE-Desktop access command line program,
382which is in the KDE-Pim/Pi sources available. 382which is in the KDE-Pim/Pi sources available.
383 383
384The "KDE-desktop" syncing feature for KA/Pi will follow 384The "KDE-desktop" syncing feature for KA/Pi will follow
385in the next releases. 385in the next releases.
386 386
387Fixed the vcard export bug, which had the version 1.9.8. 387Fixed the vcard export bug, which had the version 1.9.8.
388 388
389Added missing GERMAN translation to KO/Pi. 389Added missing GERMAN translation to KO/Pi.
390Hi PsionX, could you add the missing french translation?Thx! 390Hi PsionX, could you add the missing french translation?Thx!
391 391
392Translation files for KA/Pi are available as well. 392Translation files for KA/Pi are available as well.
393GERMAN translation will be available in the next release. 393GERMAN translation will be available in the next release.
394PsionX ( yres, you again ;-) ), could you start translating 394PsionX ( yres, you again ;-) ), could you start translating
395KA/Pi? Thx! 395KA/Pi? Thx!
396 396
397You can download the version 1.9.9 at 397You can download the version 1.9.9 at
398 398
399http://sourceforge.net/project/showfiles.php?group_id=104103&package_id=112604 399http://sourceforge.net/project/showfiles.php?group_id=104103&package_id=112604
400 400
401Note: 401Note:
402To run the mail program OM/Pi you need libopenssl. 402To run the mail program OM/Pi you need libopenssl.
403A link to a download loaction is available at 403A link to a download loaction is available at
404ZSI at www.killefiz.de 404ZSI at www.killefiz.de
405 405
406 406
407********** VERSION 1.9.8 ************ 407********** VERSION 1.9.8 ************
408 408
409Fixed character decoding in OM/Pi. 409Fixed character decoding in OM/Pi.
410(e.g. German "Umlaute" were not displayed properly.) 410(e.g. German "Umlaute" were not displayed properly.)
411 411
412Made is possible to reparent todos in KO/Pi. 412Made is possible to reparent todos in KO/Pi.
413Use contextmenu or keys (look at Help-Keys + Colors) for that. 413Use contextmenu or keys (look at Help-Keys + Colors) for that.
414 414
415Added the missing Sync-Howto and WhatsNew to the packages. 415Added the missing Sync-Howto and WhatsNew to the packages.
416 416
417KO/Pi on Linux desktop can now sync with KDE desktop. 417KO/Pi on Linux desktop can now sync with KDE desktop.
418That means: When using KO/Pi on Linux desktop for syncing with 418That means: When using KO/Pi on Linux desktop for syncing with
419KDE desktop and the Zaurus, the Zaurus can be synced now 419KDE desktop and the Zaurus, the Zaurus can be synced now
420with all KDE-Calendar resources, not only with one local file. 420with all KDE-Calendar resources, not only with one local file.
421(That makes it possible to sync the Zaurus with the 421(That makes it possible to sync the Zaurus with the
422calendar data on a Kolab server) 422calendar data on a Kolab server)
423 423
424KA/Pi syncing with KDE desktop will be available in the next version. 424KA/Pi syncing with KDE desktop will be available in the next version.
425 425
426 426
427********** VERSION 1.9.7 ************ 427********** VERSION 1.9.7 ************
428 428
429KO/Pi - KA/Pi on Windows: 429KO/Pi - KA/Pi on Windows:
430Now a directory can be defined by the user, where the 430Now a directory can be defined by the user, where the
431application/config data should be saved. 431application/config data should be saved.
432 Define your desired path in the evironment variable 432 Define your desired path in the evironment variable
433 MICROKDEHOME 433 MICROKDEHOME
434 before starting KO/Pi or KA/Pi. 434 before starting KO/Pi or KA/Pi.
435 435
436An easy Kx/Pi to Kx/Pi syncing is now possible 436An easy Kx/Pi to Kx/Pi syncing is now possible
437(it is called Pi-Sync) via network. 437(it is called Pi-Sync) via network.
438Please look at the Sync Howto. 438Please look at the Sync Howto.
439 439
440Exporting of calendar data and contacts to mobile phones is now possible. 440Exporting of calendar data and contacts to mobile phones is now possible.
441The SyncHowto is updated with information howto 441The SyncHowto is updated with information howto
442access/sync mobile phones. 442access/sync mobile phones.
443Please look at the Sync Howto. 443Please look at the Sync Howto.
444 444
445Now KO/Pi and KA/Pi on the Zaurus can receive data via infrared directly. 445Now KO/Pi and KA/Pi on the Zaurus can receive data via infrared directly.
446Please disable Fastload for the original contact/calendar applications 446Please disable Fastload for the original contact/calendar applications
447and close them. 447and close them.
448KO/Pi and KA/Pi must be running in order to receive the data. 448KO/Pi and KA/Pi must be running in order to receive the data.
449(KO/Pi and KA/Pi are always running if Fastload for them is enabled!) 449(KO/Pi and KA/Pi are always running if Fastload for them is enabled!)
450 450
451In the KA/Pi details view are now the preferred tel. numbers displayed on top 451In the KA/Pi details view are now the preferred tel. numbers displayed on top
452of the other data ( emails/tel.numbers/addresses) 452of the other data ( emails/tel.numbers/addresses)
453 453
454Fixed some syncing problems in KA/Pi. 454Fixed some syncing problems in KA/Pi.
455 455
456Added font settings for the KA/Pi details view. 456Added font settings for the KA/Pi details view.
457Added fields "children's name" and "gender" to KA/Pi. 457Added fields "children's name" and "gender" to KA/Pi.
458 458
459Made searching in KA/Pi better: 459Made searching in KA/Pi better:
460Now the first item in a view is selected after a search automatically and 460Now the first item in a view is selected after a search automatically and
461the views can be scrolled up/down when the search input field has the keyboard focus. 461the views can be scrolled up/down when the search input field has the keyboard focus.
462 462
463And, of course, fixed a bunch of reported bugs in KO/Pi and KA/Pi. 463And, of course, fixed a bunch of reported bugs in KO/Pi and KA/Pi.
464 464
465 465
466********** VERSION 1.9.6 ************ 466********** VERSION 1.9.6 ************
467 467
468Changes in the external application communication on the Zaurus 468Changes in the external application communication on the Zaurus
469in order to use less RAM when the apps are running. 469in order to use less RAM when the apps are running.
470First syncing of addressbooks (KA/Pi) is possible. 470First syncing of addressbooks (KA/Pi) is possible.
471 471
472 472
473********** VERSION 1.9.5a ************ 473********** VERSION 1.9.5a ************
474 474
475Fixed a bug in KO/Pi in the SharpDTM sync of version 1.9.5. 475Fixed a bug in KO/Pi in the SharpDTM sync of version 1.9.5.
476Fixed some small bugs. 476Fixed some small bugs.
477KA/Pi shows now the birthday in summary view. 477KA/Pi shows now the birthday in summary view.
478Now OM/Pi and KA/Pi are using the date format defined in KO/Pi 478Now OM/Pi and KA/Pi are using the date format defined in KO/Pi
479for displaying dates. 479for displaying dates.
480 480
481 481
482********** VERSION 1.9.5 ************ 482********** VERSION 1.9.5 ************
483 483
484There is still no Addressbook syncing! 484There is still no Addressbook syncing!
485 485
486New in 1.9.5: 486New in 1.9.5:
487 487
488Many bugfixes. 488Many bugfixes.
489Better searching in KA/Pi. 489Better searching in KA/Pi.
490You can configure in KA/Pi if you want to search only after 490You can configure in KA/Pi if you want to search only after
491<return> key pressed. 491<return> key pressed.
492 492
493Better mail downloading in OM/Pi. 493Better mail downloading in OM/Pi.
494 494
495First experimental alpha version of sync of KO/Pi with mobile phones. 495First experimental alpha version of sync of KO/Pi with mobile phones.
496See gammu documentation for supported phones. 496See gammu documentation for supported phones.
497You 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. 497You 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.
498Quick hint how to use: 498Quick hint how to use:
499NOTE: MOBILE PHONE SYNC IS EXPERIMENTAL! 499NOTE: MOBILE PHONE SYNC IS EXPERIMENTAL!
500Install kammu_1.9.5_arm.ipk , libbluetooth and libsdp. 500Install kammu_1.9.5_arm.ipk , libbluetooth and libsdp.
501Create syncprofile - mobile device 501Create syncprofile - mobile device
502Remove entry for model. (Leave empty ). 502Remove entry for model. (Leave empty ).
503Enable infrared on Zaurus and your Phone. 503Enable infrared on Zaurus and your Phone.
504Sync. 504Sync.
505To get a more detailed log, start kopi from konsole. 505To get a more detailed log, start kopi from konsole.
506 506
507********** VERSION 1.9.4 ************ 507********** VERSION 1.9.4 ************
508 508
509This is the version 1.9.4 of KDE-Pim/Pi for the Zaurus. 509This is the version 1.9.4 of KDE-Pim/Pi for the Zaurus.
510 510
511WARNING: 511WARNING:
512PLEASE BACKUP ALL YOUR DATA! 512PLEASE BACKUP ALL YOUR DATA!
513We have changed a lot and maybe there are some unknown problems. 513We have changed a lot and maybe there are some unknown problems.
514 514
515SYNC HANDLING HAS CHANGED! 515SYNC HANDLING HAS CHANGED!
516Such that, if you sync now with an already synded device, you will duplicated entries after the first sync. 516Such that, if you sync now with an already synded device, you will duplicated entries after the first sync.
517(This change was introduced to make it possible to sync with mobile phones, which will be available later (maybe in 4 weeks). 517(This change was introduced to make it possible to sync with mobile phones, which will be available later (maybe in 4 weeks).
518 518
519You need the kmicrokdelibs_1.9.4_arm.ipk as a base for the other programs. 519You need the kmicrokdelibs_1.9.4_arm.ipk as a base for the other programs.
520If 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. 520If 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.
521 521
522As programs are available: 522As programs are available:
523KO/Pi (korganizer ipk) - a calendar program. 523KO/Pi (korganizer ipk) - a calendar program.
524KA/Pi (kaddressbook ipk ) - an addressbook 524KA/Pi (kaddressbook ipk ) - an addressbook
525OM/Pi (kopiemail ipk ) an email program with pop/smtp and IMAP support. 525OM/Pi (kopiemail ipk ) an email program with pop/smtp and IMAP support.
526 526
527An alarm notification program ( korganizer-alarm ipk ) for KO/Pi that notifies you about alarms, even if the Zaurus is in suspend mode. 527An alarm notification program ( korganizer-alarm ipk ) for KO/Pi that notifies you about alarms, even if the Zaurus is in suspend mode.
528(If you do not see an icon in the taskbar after installing korganizer-alarm, please restart Qtopia) 528(If you do not see an icon in the taskbar after installing korganizer-alarm, please restart Qtopia)
529 529
530All the applications are installed in a "Pim" TAB. 530All the applications are installed in a "Pim" TAB.
531If 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 531If 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
532 532
533All the application are integrated. 533All the application are integrated.
534Such 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. 534Such 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.
535 535
536HINT: 536HINT:
537If you install KPhone/Pi 0.9.7, it will be called, if you click in KA/Pi on a phone number. 537If you install KPhone/Pi 0.9.7, it will be called, if you click in KA/Pi on a phone number.
538 538
539What's new? 539What's new?
540 540
541SYNC HANDLING HAS CHANGED! 541SYNC HANDLING HAS CHANGED!
diff --git a/kmicromail/libetpan/mh/mailmh.c b/kmicromail/libetpan/mh/mailmh.c
index 1087ce1..2d1f26d 100644
--- a/kmicromail/libetpan/mh/mailmh.c
+++ b/kmicromail/libetpan/mh/mailmh.c
@@ -412,579 +412,582 @@ int mailmh_folder_update(struct mailmh_folder * folder)
412 chashdatum key; 412 chashdatum key;
413 chashdatum data; 413 chashdatum data;
414 414
415 if (ent->d_name[0] == '.') { 415 if (ent->d_name[0] == '.') {
416 if (ent->d_name[1] == 0) 416 if (ent->d_name[1] == 0)
417 continue; 417 continue;
418 if ((ent->d_name[1] == '.') && (ent->d_name[2] == 0)) 418 if ((ent->d_name[1] == '.') && (ent->d_name[2] == 0))
419 continue; 419 continue;
420 } 420 }
421 421
422 key.data = ent->d_name; 422 key.data = ent->d_name;
423 key.len = strlen(ent->d_name); 423 key.len = strlen(ent->d_name);
424 r = chash_get(folder->fl_subfolders_hash, &key, &data); 424 r = chash_get(folder->fl_subfolders_hash, &key, &data);
425 if (r < 0) { 425 if (r < 0) {
426 subfolder = mailmh_folder_new(folder, ent->d_name); 426 subfolder = mailmh_folder_new(folder, ent->d_name);
427 if (subfolder == NULL) { 427 if (subfolder == NULL) {
428 res = MAILMH_ERROR_MEMORY; 428 res = MAILMH_ERROR_MEMORY;
429 goto closedir; 429 goto closedir;
430 } 430 }
431 431
432 r = carray_add(folder->fl_subfolders_tab, subfolder, &array_index); 432 r = carray_add(folder->fl_subfolders_tab, subfolder, &array_index);
433 if (r < 0) { 433 if (r < 0) {
434 mailmh_folder_free(subfolder); 434 mailmh_folder_free(subfolder);
435 res = MAILMH_ERROR_MEMORY; 435 res = MAILMH_ERROR_MEMORY;
436 goto closedir; 436 goto closedir;
437 } 437 }
438 subfolder->fl_array_index = array_index; 438 subfolder->fl_array_index = array_index;
439 439
440 key.data = subfolder->fl_filename; 440 key.data = subfolder->fl_filename;
441 key.len = strlen(subfolder->fl_filename); 441 key.len = strlen(subfolder->fl_filename);
442 data.data = subfolder; 442 data.data = subfolder;
443 data.len = 0; 443 data.len = 0;
444 r = chash_set(folder->fl_subfolders_hash, &key, &data, NULL); 444 r = chash_set(folder->fl_subfolders_hash, &key, &data, NULL);
445 if (r < 0) { 445 if (r < 0) {
446 carray_delete_fast(folder->fl_subfolders_tab, subfolder->fl_array_index); 446 carray_delete_fast(folder->fl_subfolders_tab, subfolder->fl_array_index);
447 mailmh_folder_free(subfolder); 447 mailmh_folder_free(subfolder);
448 res = MAILMH_ERROR_MEMORY; 448 res = MAILMH_ERROR_MEMORY;
449 goto closedir; 449 goto closedir;
450 } 450 }
451 } 451 }
452 } 452 }
453 } 453 }
454 } 454 }
455 while (ent != NULL); 455 while (ent != NULL);
456 456
457 folder->fl_max_index = max_index; 457 folder->fl_max_index = max_index;
458 458
459 mh_seq = malloc(strlen(folder->fl_filename) + 2 + sizeof(".mh_sequences")); 459 mh_seq = malloc(strlen(folder->fl_filename) + 2 + sizeof(".mh_sequences"));
460 if (mh_seq == NULL) { 460 if (mh_seq == NULL) {
461 res = MAILMH_ERROR_MEMORY; 461 res = MAILMH_ERROR_MEMORY;
462 goto closedir; 462 goto closedir;
463 } 463 }
464 strcpy(mh_seq, folder->fl_filename); 464 strcpy(mh_seq, folder->fl_filename);
465 strcat(mh_seq, MAIL_DIR_SEPARATOR_S); 465 strcat(mh_seq, MAIL_DIR_SEPARATOR_S);
466 strcat(mh_seq, ".mh_sequences"); 466 strcat(mh_seq, ".mh_sequences");
467 467
468 if (stat(mh_seq, &buf) == -1) { 468 if (stat(mh_seq, &buf) == -1) {
469 int fd; 469 int fd;
470 470
471 fd = creat(mh_seq, S_IRUSR | S_IWUSR); 471 fd = creat(mh_seq, S_IRUSR | S_IWUSR);
472 if (fd != -1) 472 if (fd != -1)
473 close(fd); 473 close(fd);
474 } 474 }
475 free(mh_seq); 475 free(mh_seq);
476 476
477 closedir(d); 477 closedir(d);
478 478
479 return MAILMH_NO_ERROR; 479 return MAILMH_NO_ERROR;
480 480
481 closedir: 481 closedir:
482 closedir(d); 482 closedir(d);
483 err: 483 err:
484 return res; 484 return res;
485} 485}
486 486
487int mailmh_folder_add_subfolder(struct mailmh_folder * parent, 487int mailmh_folder_add_subfolder(struct mailmh_folder * parent,
488 const char * name) 488 const char * name)
489{ 489{
490 char * foldername; 490 char * foldername;
491 int r; 491 int r;
492 struct mailmh_folder * folder; 492 struct mailmh_folder * folder;
493 unsigned int array_index; 493 unsigned int array_index;
494 chashdatum key; 494 chashdatum key;
495 chashdatum data; 495 chashdatum data;
496 496
497 foldername = malloc(strlen(parent->fl_filename) + strlen(name) + 2); 497 foldername = malloc(strlen(parent->fl_filename) + strlen(name) + 2);
498 if (foldername == NULL) 498 if (foldername == NULL)
499 return MAILMH_ERROR_MEMORY; 499 return MAILMH_ERROR_MEMORY;
500 strcpy(foldername, parent->fl_filename); 500 strcpy(foldername, parent->fl_filename);
501 strcat(foldername, MAIL_DIR_SEPARATOR_S); 501 strcat(foldername, MAIL_DIR_SEPARATOR_S);
502 strcat(foldername, name); 502 strcat(foldername, name);
503 503
504 r = mkdir(foldername, 0700); 504 r = mkdir(foldername, 0700);
505 free(foldername); 505 free(foldername);
506 506
507 if (r < 0) 507 if (r < 0)
508 return MAILMH_ERROR_FOLDER; 508 return MAILMH_ERROR_FOLDER;
509 509
510 folder = mailmh_folder_new(parent, name); 510 folder = mailmh_folder_new(parent, name);
511 if (folder == NULL) 511 if (folder == NULL)
512 return MAILMH_ERROR_MEMORY; 512 return MAILMH_ERROR_MEMORY;
513 513
514 r = carray_add(parent->fl_subfolders_tab, folder, &array_index); 514 r = carray_add(parent->fl_subfolders_tab, folder, &array_index);
515 if (r < 0) { 515 if (r < 0) {
516 mailmh_folder_free(folder); 516 mailmh_folder_free(folder);
517 return MAILMH_ERROR_MEMORY; 517 return MAILMH_ERROR_MEMORY;
518 } 518 }
519 folder->fl_array_index = array_index; 519 folder->fl_array_index = array_index;
520 520
521 key.data = folder->fl_filename; 521 key.data = folder->fl_filename;
522 key.len = strlen(folder->fl_filename); 522 key.len = strlen(folder->fl_filename);
523 data.data = folder; 523 data.data = folder;
524 data.len = 0; 524 data.len = 0;
525 525
526 r = chash_set(parent->fl_subfolders_hash, &key, &data, NULL); 526 r = chash_set(parent->fl_subfolders_hash, &key, &data, NULL);
527 if (r < 0) { 527 if (r < 0) {
528 carray_delete_fast(folder->fl_subfolders_tab, folder->fl_array_index); 528 carray_delete_fast(folder->fl_subfolders_tab, folder->fl_array_index);
529 mailmh_folder_free(folder); 529 mailmh_folder_free(folder);
530 return MAILMH_ERROR_MEMORY; 530 return MAILMH_ERROR_MEMORY;
531 } 531 }
532 532
533 return MAILMH_NO_ERROR; 533 return MAILMH_NO_ERROR;
534} 534}
535 535
536int mailmh_folder_remove_subfolder(struct mailmh_folder * folder) 536int mailmh_folder_remove_subfolder(struct mailmh_folder * folder)
537{ 537{
538 struct mailmh_folder * parent; 538 struct mailmh_folder * parent;
539 chashdatum key; 539 chashdatum key;
540 chashdatum data; 540 chashdatum data;
541 int r; 541 int r;
542 542
543 parent = folder->fl_parent; 543 parent = folder->fl_parent;
544 544
545 key.data = folder->fl_filename; 545 key.data = folder->fl_filename;
546 key.len = strlen(folder->fl_filename); 546 key.len = strlen(folder->fl_filename);
547 547
548 r = chash_get(parent->fl_subfolders_hash, &key, &data); 548 r = chash_get(parent->fl_subfolders_hash, &key, &data);
549 if (r < 0) 549 if (r < 0)
550 return MAILMH_ERROR_FOLDER; 550 return MAILMH_ERROR_FOLDER;
551 551
552 chash_delete(parent->fl_subfolders_hash, &key, NULL); 552 chash_delete(parent->fl_subfolders_hash, &key, NULL);
553 carray_delete_fast(parent->fl_subfolders_tab, folder->fl_array_index); 553 carray_delete_fast(parent->fl_subfolders_tab, folder->fl_array_index);
554 554
555 mailmh_folder_free(folder); 555 mailmh_folder_free(folder);
556 556
557 return MAILMH_NO_ERROR; 557 return MAILMH_NO_ERROR;
558 558
559} 559}
560 560
561int mailmh_folder_rename_subfolder(struct mailmh_folder * src_folder, 561int mailmh_folder_rename_subfolder(struct mailmh_folder * src_folder,
562 struct mailmh_folder * dst_folder, 562 struct mailmh_folder * dst_folder,
563 const char * new_name) 563 const char * new_name)
564{ 564{
565 int r; 565 int r;
566 struct mailmh_folder * folder; 566 struct mailmh_folder * folder;
567 struct mailmh_folder * parent; 567 struct mailmh_folder * parent;
568 char * new_foldername; 568 char * new_foldername;
569 569
570 parent = src_folder->fl_parent; 570 parent = src_folder->fl_parent;
571 if (parent == NULL) 571 if (parent == NULL)
572 return MAILMH_ERROR_RENAME; 572 return MAILMH_ERROR_RENAME;
573 573
574 new_foldername = malloc(strlen(dst_folder->fl_filename) + 2 + strlen(new_name)); 574 new_foldername = malloc(strlen(dst_folder->fl_filename) + 2 + strlen(new_name));
575 if (new_foldername == NULL) 575 if (new_foldername == NULL)
576 return MAILMH_ERROR_MEMORY; 576 return MAILMH_ERROR_MEMORY;
577 577
578 strcpy(new_foldername, dst_folder->fl_filename); 578 strcpy(new_foldername, dst_folder->fl_filename);
579 strcat(new_foldername, MAIL_DIR_SEPARATOR_S); 579 strcat(new_foldername, MAIL_DIR_SEPARATOR_S);
580 strcat(new_foldername, new_name); 580 strcat(new_foldername, new_name);
581 581
582 r = rename(src_folder->fl_filename, new_foldername); 582 r = rename(src_folder->fl_filename, new_foldername);
583 free(new_foldername); 583 free(new_foldername);
584 if (r < 0) 584 if (r < 0)
585 return MAILMH_ERROR_RENAME; 585 return MAILMH_ERROR_RENAME;
586 586
587 r = mailmh_folder_remove_subfolder(src_folder); 587 r = mailmh_folder_remove_subfolder(src_folder);
588 if (r != MAILMH_NO_ERROR) 588 if (r != MAILMH_NO_ERROR)
589 return r; 589 return r;
590 590
591 folder = mailmh_folder_new(dst_folder, new_name); 591 folder = mailmh_folder_new(dst_folder, new_name);
592 if (folder == NULL) 592 if (folder == NULL)
593 return MAILMH_ERROR_MEMORY; 593 return MAILMH_ERROR_MEMORY;
594 594
595 r = carray_add(parent->fl_subfolders_tab, folder, NULL); 595 r = carray_add(parent->fl_subfolders_tab, folder, NULL);
596 if (r < 0) { 596 if (r < 0) {
597 mailmh_folder_free(folder); 597 mailmh_folder_free(folder);
598 return MAILMH_ERROR_MEMORY; 598 return MAILMH_ERROR_MEMORY;
599 } 599 }
600 600
601 return MAILMH_NO_ERROR; 601 return MAILMH_NO_ERROR;
602} 602}
603 603
604#define MAX_TRY_ALLOC 32 604#define MAX_TRY_ALLOC 32
605 605
606/* initial file MUST be in the same directory */ 606/* initial file MUST be in the same directory */
607 607
608static int mailmh_folder_alloc_msg(struct mailmh_folder * folder, 608static int mailmh_folder_alloc_msg(struct mailmh_folder * folder,
609 char * filename, uint32_t * result) 609 char * filename, uint32_t * result)
610{ 610{
611 uint32_t max; 611 uint32_t max;
612 uint32_t k; 612 uint32_t k;
613 char * new_filename; 613 char * new_filename;
614 size_t len; 614 size_t len;
615 struct stat f_stat; 615 struct stat f_stat;
616 616
617 len = strlen(folder->fl_filename) + 20; 617 len = strlen(folder->fl_filename) + 20;
618 new_filename = malloc(len); 618 new_filename = malloc(len);
619 if (new_filename == NULL) 619 if (new_filename == NULL)
620 return MAILMH_ERROR_MEMORY; 620 return MAILMH_ERROR_MEMORY;
621 621
622 max = folder->fl_max_index + 1; 622 max = folder->fl_max_index + 1;
623 623
624 //fprintf(stderr,"mailmh_folder_alloc_msg filename: %s \n", filename); 624 //fprintf(stderr,"mailmh_folder_alloc_msg filename: %s \n", filename);
625 k = 0; 625 k = 0;
626 while (k < MAX_TRY_ALLOC) { 626 while (k < MAX_TRY_ALLOC) {
627 snprintf(new_filename, len, "%s%c%lu", folder->fl_filename, 627 snprintf(new_filename, len, "%s%c%lu", folder->fl_filename,
628 MAIL_DIR_SEPARATOR, (unsigned long) (max + k)); 628 MAIL_DIR_SEPARATOR, (unsigned long) (max + k));
629 //fprintf(stderr,"mailmh_folder_alloc_msg new_filename: %s \n", new_filename); 629 //fprintf(stderr,"mailmh_folder_alloc_msg new_filename: %s \n", new_filename);
630 if ( stat( new_filename, &f_stat ) == -1 ) { 630 if ( stat( new_filename, &f_stat ) == -1 ) {
631 // if (link(filename, new_filename) == 0) { 631 // if (link(filename, new_filename) == 0) {
632 int r; 632 int r;
633 //fprintf(stderr,"filename found \n"); 633 //fprintf(stderr,"filename found \n");
634 //unlink(filename); 634 //unlink(filename);
635 rename (filename,new_filename ); 635 rename (filename,new_filename );
636 free(new_filename); 636 free(new_filename);
637 637
638 if (k > MAX_TRY_ALLOC / 2) { 638 if (k > MAX_TRY_ALLOC / 2) {
639 r = mailmh_folder_update(folder); 639 r = mailmh_folder_update(folder);
640 /* ignore errors */ 640 /* ignore errors */
641 } 641 }
642 642
643 * result = max + k; 643 * result = max + k;
644 644
645 folder->fl_max_index = max + k; 645 folder->fl_max_index = max + k;
646 646
647 return MAILMH_NO_ERROR; 647 return MAILMH_NO_ERROR;
648 } 648 }
649 else if (errno == EXDEV) { 649 else if (errno == EXDEV) {
650 free(filename); 650 free(filename);
651 return MAILMH_ERROR_FOLDER; 651 return MAILMH_ERROR_FOLDER;
652 } 652 }
653 k ++; 653 k ++;
654 } 654 }
655 655
656 free(new_filename); 656 free(new_filename);
657 657
658 return MAILMH_ERROR_FOLDER; 658 return MAILMH_ERROR_FOLDER;
659} 659}
660 660
661int mailmh_folder_get_message_filename(struct mailmh_folder * folder, 661int mailmh_folder_get_message_filename(struct mailmh_folder * folder,
662 uint32_t index, char ** result) 662 uint32_t index, char ** result)
663{ 663{
664 char * filename; 664 char * filename;
665 int len; 665 int len;
666 666
667#if 0 667#if 0
668 r = mailmh_folder_update(folder); 668 r = mailmh_folder_update(folder);
669 if (r != MAILMH_NO_ERROR) 669 if (r != MAILMH_NO_ERROR)
670 return r; 670 return r;
671#endif 671#endif
672 672
673 len = strlen(folder->fl_filename) + 20; 673 len = strlen(folder->fl_filename) + 20;
674 filename = malloc(len); 674 filename = malloc(len);
675 if (filename == NULL) 675 if (filename == NULL)
676 return MAILMH_ERROR_MEMORY; 676 return MAILMH_ERROR_MEMORY;
677 677
678 snprintf(filename, len, "%s%c%lu", folder->fl_filename, MAIL_DIR_SEPARATOR, 678 snprintf(filename, len, "%s%c%lu", folder->fl_filename, MAIL_DIR_SEPARATOR,
679 (unsigned long) index); 679 (unsigned long) index);
680 680
681 * result = filename; 681 * result = filename;
682 682
683 return MAILMH_NO_ERROR;; 683 return MAILMH_NO_ERROR;;
684} 684}
685 685
686 686
687int mailmh_folder_get_message_fd(struct mailmh_folder * folder, 687int mailmh_folder_get_message_fd(struct mailmh_folder * folder,
688 uint32_t index, int flags, int * result) 688 uint32_t index, int flags, int * result)
689{ 689{
690 char * filename; 690 char * filename;
691 int fd; 691 int fd;
692 int r; 692 int r;
693 693
694#if 0 694#if 0
695 r = mailmh_folder_update(folder); 695 r = mailmh_folder_update(folder);
696 if (r != MAILMH_NO_ERROR) 696 if (r != MAILMH_NO_ERROR)
697 return r; 697 return r;
698#endif 698#endif
699 699
700 r = mailmh_folder_get_message_filename(folder, index, &filename); 700 r = mailmh_folder_get_message_filename(folder, index, &filename);
701 if (r != MAILMH_NO_ERROR) 701 if (r != MAILMH_NO_ERROR)
702 return r; 702 return r;
703 703
704 fd = open(filename, flags); 704 fd = open(filename, flags);
705 free(filename); 705 free(filename);
706 if (fd == -1) 706 if (fd == -1)
707 return MAILMH_ERROR_MSG_NOT_FOUND; 707 return MAILMH_ERROR_MSG_NOT_FOUND;
708 708
709 * result = fd; 709 * result = fd;
710 710
711 return MAILMH_NO_ERROR; 711 return MAILMH_NO_ERROR;
712} 712}
713 713
714int mailmh_folder_get_message_size(struct mailmh_folder * folder, 714int mailmh_folder_get_message_size(struct mailmh_folder * folder,
715 uint32_t index, size_t * result) 715 uint32_t index, size_t * result)
716{ 716{
717 int r; 717 int r;
718 char * filename; 718 char * filename;
719 struct stat buf; 719 struct stat buf;
720 720
721 r = mailmh_folder_get_message_filename(folder, index, &filename); 721 r = mailmh_folder_get_message_filename(folder, index, &filename);
722 if (r != MAILMH_NO_ERROR) 722 if (r != MAILMH_NO_ERROR)
723 return r; 723 return r;
724 724
725 r = stat(filename, &buf); 725 r = stat(filename, &buf);
726 free(filename); 726 free(filename);
727 if (r < 0) 727 if (r < 0)
728 return MAILMH_ERROR_FILE; 728 return MAILMH_ERROR_FILE;
729 729
730 * result = buf.st_size; 730 * result = buf.st_size;
731 731
732 return MAILMH_NO_ERROR; 732 return MAILMH_NO_ERROR;
733} 733}
734 734
735int mailmh_folder_add_message_uid(struct mailmh_folder * folder, 735int mailmh_folder_add_message_uid(struct mailmh_folder * folder,
736 const char * message, size_t size, 736 const char * message, size_t size,
737 uint32_t * pindex) 737 uint32_t * pindex)
738{ 738{
739 char * tmpname; 739 char * tmpname;
740 int fd; 740 int fd;
741 size_t namesize; 741 size_t namesize;
742 size_t left; 742 size_t left;
743 ssize_t res; 743 ssize_t res;
744 struct mailmh_msg_info * msg_info; 744 struct mailmh_msg_info * msg_info;
745 uint32_t index; 745 uint32_t index;
746 int error; 746 int error;
747 int r; 747 int r;
748 unsigned int array_index; 748 unsigned int array_index;
749 struct stat buf; 749 struct stat buf;
750 chashdatum key; 750 chashdatum key;
751 chashdatum data; 751 chashdatum data;
752 752
753#if 0 753#if 0
754 r = mailmh_folder_update(folder); 754 r = mailmh_folder_update(folder);
755 if (r != MAILMH_NO_ERROR) { 755 if (r != MAILMH_NO_ERROR) {
756 error = r; 756 error = r;
757 goto err; 757 goto err;
758 } 758 }
759#endif 759#endif
760 760
761 namesize = strlen(folder->fl_filename) + 20; 761 namesize = strlen(folder->fl_filename) + 20;
762 tmpname = malloc(namesize); 762 tmpname = malloc(namesize);
763 snprintf(tmpname, namesize, "%s%ctmpXXXXXX", 763 snprintf(tmpname, namesize, "%s%ctmpXXXXXX",
764 folder->fl_filename, MAIL_DIR_SEPARATOR); 764 folder->fl_filename, MAIL_DIR_SEPARATOR);
765 fd = mkstemp(tmpname); 765 fd = mkstemp(tmpname);
766 if (fd < 0) { 766 if (fd < 0) {
767 error = MAILMH_ERROR_FILE; 767 error = MAILMH_ERROR_FILE;
768 goto free; 768 goto free;
769 } 769 }
770 770
771 left = size; 771 left = size;
772 while (left > 0) { 772 while (left > 0) {
773 res = write(fd, message, left); 773 res = write(fd, message, left);
774 if (res == -1) { 774 if (res == -1) {
775 close(fd); 775 close(fd);
776 error = MAILMH_ERROR_FILE; 776 error = MAILMH_ERROR_FILE;
777 goto free; 777 goto free;
778 } 778 }
779 779
780 left -= res; 780 left -= res;
781 } 781 }
782 close(fd); 782 close(fd);
783 783
784 r = stat(tmpname, &buf); 784 r = stat(tmpname, &buf);
785 if (r < 0) { 785 if (r < 0) {
786 error = MAILMH_ERROR_FILE; 786 error = MAILMH_ERROR_FILE;
787 goto free; 787 goto free;
788 } 788 }
789 789
790 r = mailmh_folder_alloc_msg(folder, tmpname, &index); 790 r = mailmh_folder_alloc_msg(folder, tmpname, &index);
791 if (r != MAILMH_NO_ERROR) { 791 if (r != MAILMH_NO_ERROR) {
792 unlink(tmpname); 792 unlink(tmpname);
793 error = MAILMH_ERROR_COULD_NOT_ALLOC_MSG; 793 error = MAILMH_ERROR_COULD_NOT_ALLOC_MSG;
794 goto free; 794 goto free;
795 } 795 }
796 free(tmpname); 796 free(tmpname);
797 797
798 msg_info = mailmh_msg_info_new(index, size, buf.st_mtime); 798 msg_info = mailmh_msg_info_new(index, size, buf.st_mtime);
799 if (msg_info == NULL) { 799 if (msg_info == NULL) {
800 mailmh_folder_remove_message(folder, index); 800 mailmh_folder_remove_message(folder, index);
801 error = MAILMH_ERROR_MEMORY; 801 error = MAILMH_ERROR_MEMORY;
802 goto err; 802 goto err;
803 } 803 }
804 804
805 r = carray_add(folder->fl_msgs_tab, msg_info, &array_index); 805 r = carray_add(folder->fl_msgs_tab, msg_info, &array_index);
806 if (r < 0) { 806 if (r < 0) {
807 mailmh_folder_remove_message(folder, index); 807 mailmh_folder_remove_message(folder, index);
808 mailmh_msg_info_free(msg_info); 808 mailmh_msg_info_free(msg_info);
809 error = MAILMH_ERROR_MEMORY; 809 error = MAILMH_ERROR_MEMORY;
810 goto err; 810 goto err;
811 } 811 }
812 msg_info->msg_array_index = array_index; 812 msg_info->msg_array_index = array_index;
813 813
814#if 0 814#if 0
815 r = cinthash_add(folder->fl_msgs_hash, index, msg_info); 815 r = cinthash_add(folder->fl_msgs_hash, index, msg_info);
816#endif 816#endif
817 key.data = &index; 817 key.data = &index;
818 key.len = sizeof(index); 818 key.len = sizeof(index);
819 data.data = msg_info; 819 data.data = msg_info;
820 data.len = 0; 820 data.len = 0;
821 821
822 if (pindex != NULL) 822 if (pindex != NULL)
823 * pindex = index; 823 * pindex = index;
824 824
825 r = chash_set(folder->fl_msgs_hash, &key, &data, NULL); 825 r = chash_set(folder->fl_msgs_hash, &key, &data, NULL);
826 if (r < 0) { 826 if (r < 0) {
827 carray_delete_fast(folder->fl_msgs_tab, msg_info->msg_array_index); 827 carray_delete_fast(folder->fl_msgs_tab, msg_info->msg_array_index);
828 mailmh_msg_info_free(msg_info); 828 mailmh_msg_info_free(msg_info);
829 error = MAILMH_ERROR_MEMORY; 829 error = MAILMH_ERROR_MEMORY;
830 goto err; 830 goto err;
831 } 831 }
832 832
833 return MAILMH_NO_ERROR; 833 return MAILMH_NO_ERROR;
834 834
835 free: 835 free:
836 free(tmpname); 836 free(tmpname);
837 err: 837 err:
838 return error; 838 return error;
839} 839}
840 840
841int mailmh_folder_add_message(struct mailmh_folder * folder, 841int mailmh_folder_add_message(struct mailmh_folder * folder,
842 const char * message, size_t size) 842 const char * message, size_t size)
843{ 843{
844 return mailmh_folder_add_message_uid(folder, message, size, NULL); 844 return mailmh_folder_add_message_uid(folder, message, size, NULL);
845} 845}
846 846
847int mailmh_folder_add_message_file_uid(struct mailmh_folder * folder, 847int mailmh_folder_add_message_file_uid(struct mailmh_folder * folder,
848 int fd, uint32_t * pindex) 848 int fd, uint32_t * pindex)
849{ 849{
850 char * message; 850 char * message;
851 struct stat buf; 851 struct stat buf;
852 int r; 852 int r;
853 853
854#if 0 854#if 0
855 r = mailmh_folder_update(folder); 855 r = mailmh_folder_update(folder);
856 if (r != MAILMH_NO_ERROR) 856 if (r != MAILMH_NO_ERROR)
857 return r; 857 return r;
858#endif 858#endif
859 859
860 if (fstat(fd, &buf) == -1) 860 if (fstat(fd, &buf) == -1)
861 return MAILMH_ERROR_FILE; 861 return MAILMH_ERROR_FILE;
862 862
863 message = mmap(NULL, buf.st_size, PROT_READ, MAP_PRIVATE, fd, 0); 863 message = mmap(NULL, buf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
864 if (message == MAP_FAILED) 864 if (message == MAP_FAILED)
865 return MAILMH_ERROR_FILE; 865 return MAILMH_ERROR_FILE;
866 866
867 r = mailmh_folder_add_message_uid(folder, message, buf.st_size, pindex); 867 r = mailmh_folder_add_message_uid(folder, message, buf.st_size, pindex);
868 868
869 munmap(message, buf.st_size); 869 munmap(message, buf.st_size);
870 870
871 return r; 871 return r;
872} 872}
873 873
874int mailmh_folder_add_message_file(struct mailmh_folder * folder, 874int mailmh_folder_add_message_file(struct mailmh_folder * folder,
875 int fd) 875 int fd)
876{ 876{
877 return mailmh_folder_add_message_file_uid(folder, fd, NULL); 877 return mailmh_folder_add_message_file_uid(folder, fd, NULL);
878} 878}
879 879
880int mailmh_folder_remove_message(struct mailmh_folder * folder, 880int mailmh_folder_remove_message(struct mailmh_folder * folder,
881 uint32_t index) 881 uint32_t index)
882{ 882{
883 char * filename; 883 char * filename;
884 struct mailmh_msg_info * msg_info; 884 struct mailmh_msg_info * msg_info;
885 int res; 885 int res;
886 int r; 886 int r;
887 chashdatum key; 887 chashdatum key;
888 chashdatum data; 888 chashdatum data;
889 889
890#if 0 890#if 0
891 r = mailmh_folder_update(folder); 891 r = mailmh_folder_update(folder);
892 if (r != MAILMH_NO_ERROR) { 892 if (r != MAILMH_NO_ERROR) {
893 res = r; 893 res = r;
894 goto err; 894 goto err;
895 } 895 }
896#endif 896#endif
897 897
898 r = mailmh_folder_get_message_filename(folder, index, &filename); 898 r = mailmh_folder_get_message_filename(folder, index, &filename);
899 if (filename == NULL) { 899 if (filename == NULL) {
900 res = r; 900 res = r;
901 goto err; 901 goto err;
902 } 902 }
903 903
904 if (unlink(filename) == -1) { 904 if (unlink(filename) == -1) {
905 res = MAILMH_ERROR_FILE; 905 res = MAILMH_ERROR_FILE;
906 goto free; 906 goto free;
907 } 907 }
908 908
909 key.data = &index; 909 key.data = &index;
910 key.len = sizeof(index); 910 key.len = sizeof(index);
911 r = chash_get(folder->fl_msgs_hash, &key, &data); 911 r = chash_get(folder->fl_msgs_hash, &key, &data);
912#if 0 912#if 0
913 msg_info = cinthash_find(folder->fl_msgs_hash, index); 913 msg_info = cinthash_find(folder->fl_msgs_hash, index);
914#endif 914#endif
915 if (r == 0) { 915 if (r == 0) {
916 msg_info = data.data; 916 msg_info = data.data;
917 917
918 carray_delete_fast(folder->fl_msgs_tab, msg_info->msg_array_index); 918 carray_delete_fast(folder->fl_msgs_tab, msg_info->msg_array_index);
919#if 0 919#if 0
920 cinthash_remove(folder->fl_msgs_hash, index); 920 cinthash_remove(folder->fl_msgs_hash, index);
921#endif 921#endif
922 chash_delete(folder->fl_msgs_hash, &key, NULL); 922 chash_delete(folder->fl_msgs_hash, &key, NULL);
923 } 923 }
924 // LR
925 mailmh_msg_info_free( msg_info );
926 free(filename);
924 927
925 return MAILMH_NO_ERROR; 928 return MAILMH_NO_ERROR;
926 929
927 free: 930 free:
928 free(filename); 931 free(filename);
929 err: 932 err:
930 return res; 933 return res;
931} 934}
932 935
933 936
934int mailmh_folder_move_message(struct mailmh_folder * dest_folder, 937int mailmh_folder_move_message(struct mailmh_folder * dest_folder,
935 struct mailmh_folder * src_folder, 938 struct mailmh_folder * src_folder,
936 uint32_t index) 939 uint32_t index)
937{ 940{
938 int fd; 941 int fd;
939 char * filename; 942 char * filename;
940 int r; 943 int r;
941 944
942#if 0 945#if 0
943 r = mailmh_folder_update(dest_folder); 946 r = mailmh_folder_update(dest_folder);
944 if (r != MAILMH_NO_ERROR) 947 if (r != MAILMH_NO_ERROR)
945 return r; 948 return r;
946 r = mailmh_folder_update(src_folder); 949 r = mailmh_folder_update(src_folder);
947 if (r != MAILMH_NO_ERROR) 950 if (r != MAILMH_NO_ERROR)
948 return r; 951 return r;
949#endif 952#endif
950 953
951 /* move on the same filesystem */ 954 /* move on the same filesystem */
952 r = mailmh_folder_get_message_filename(src_folder, index, &filename); 955 r = mailmh_folder_get_message_filename(src_folder, index, &filename);
953 if (r != MAILMH_NO_ERROR) 956 if (r != MAILMH_NO_ERROR)
954 return r; 957 return r;
955 958
956 r = mailmh_folder_alloc_msg(dest_folder, filename, &index); 959 r = mailmh_folder_alloc_msg(dest_folder, filename, &index);
957 free(filename); 960 free(filename);
958 if (r == MAILMH_NO_ERROR) 961 if (r == MAILMH_NO_ERROR)
959 return MAILMH_NO_ERROR; 962 return MAILMH_NO_ERROR;
960 963
961 /* move on the different filesystems */ 964 /* move on the different filesystems */
962 r = mailmh_folder_get_message_fd(src_folder, index, O_RDONLY, &fd); 965 r = mailmh_folder_get_message_fd(src_folder, index, O_RDONLY, &fd);
963 if (r != MAILMH_NO_ERROR) 966 if (r != MAILMH_NO_ERROR)
964 return r; 967 return r;
965 968
966 r = mailmh_folder_add_message_file(dest_folder, fd); 969 r = mailmh_folder_add_message_file(dest_folder, fd);
967 if (r != MAILMH_NO_ERROR) { 970 if (r != MAILMH_NO_ERROR) {
968 close(fd); 971 close(fd);
969 return r; 972 return r;
970 } 973 }
971 974
972 close(fd); 975 close(fd);
973 976
974 r = mailmh_folder_remove_message(src_folder, index); 977 r = mailmh_folder_remove_message(src_folder, index);
975 978
976 return MAILMH_NO_ERROR; 979 return MAILMH_NO_ERROR;
977} 980}
978 981
979unsigned int mailmh_folder_get_message_number(struct mailmh_folder * folder) 982unsigned int mailmh_folder_get_message_number(struct mailmh_folder * folder)
980{ 983{
981 unsigned int i; 984 unsigned int i;
982 unsigned int count; 985 unsigned int count;
983 986
984 count = 0; 987 count = 0;
985 for(i = 0 ; i < carray_count(folder->fl_msgs_tab) ; i ++) 988 for(i = 0 ; i < carray_count(folder->fl_msgs_tab) ; i ++)
986 if (carray_get(folder->fl_msgs_tab, i) != NULL) 989 if (carray_get(folder->fl_msgs_tab, i) != NULL)
987 count ++; 990 count ++;
988 991
989 return count; 992 return count;
990} 993}