summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--bin/kdepim/WhatsNew.txt7
-rw-r--r--kmicromail/libetpan/imap/mailimap_parser.c22
-rw-r--r--kmicromail/libmailwrapper/imapwrapper.cpp67
-rw-r--r--kmicromail/viewmailbase.cpp2
4 files changed, 64 insertions, 34 deletions
diff --git a/bin/kdepim/WhatsNew.txt b/bin/kdepim/WhatsNew.txt
index 5bfe1c8..cbed872 100644
--- a/bin/kdepim/WhatsNew.txt
+++ b/bin/kdepim/WhatsNew.txt
@@ -1,786 +1,793 @@
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:
19"Delete mail" icon in main window now deletes all selected mails.
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
22to idecate that they are already seen.
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.
18 25
19 26
20 27
21********** VERSION 1.9.19 ************ 28********** VERSION 1.9.19 ************
22 29
23Added a lot of missing translations to KA/Pi, 30Added a lot of missing translations to KA/Pi,
24Added some missing translations to KO/Pi and OM/Pi. 31Added some missing translations to KO/Pi and OM/Pi.
25 32
26Fixed some minor problems in KA/Pi + KO/Pi. 33Fixed some minor problems in KA/Pi + KO/Pi.
27 34
28Fixed a crash when closing PwM/Pi. 35Fixed a crash when closing PwM/Pi.
29Added German translation for PwM/Pi. 36Added German translation for PwM/Pi.
30 37
31Made view change and Month View update faster in KO/Pi. 38Made view change and Month View update faster in KO/Pi.
32 39
33 40
34********** VERSION 1.9.18 ************ 41********** VERSION 1.9.18 ************
35 42
36FYI: The VERSION 1.9.17 was a testing release only. 43FYI: The VERSION 1.9.17 was a testing release only.
37Please read the changelog of VERSION 1.9.17 as well. 44Please read the changelog of VERSION 1.9.17 as well.
38 45
39Cleaned up the syncing config dialog. 46Cleaned up the syncing config dialog.
40Added sync config options for date range for events. 47Added sync config options for date range for events.
41Added sync config options for filters on incoming data. 48Added sync config options for filters on incoming data.
42Added sync config options for filters on outgoing data. 49Added sync config options for filters on outgoing data.
43Please read the updated SyncHowTo about the new filter settings. 50Please read the updated SyncHowTo about the new filter settings.
44These filter settings make it now possible to sync with shared 51These filter settings make it now possible to sync with shared
45calendars without writing back private or confidential data 52calendars without writing back private or confidential data
46(via the outgoing filters). 53(via the outgoing filters).
47To sync only with particular parts of a shared calendar, 54To sync only with particular parts of a shared calendar,
48the incoming filter settings can be used. 55the incoming filter settings can be used.
49An example can be found in the SyncHowTo. 56An example can be found in the SyncHowTo.
50Same for shared addressbooks. 57Same for shared addressbooks.
51 58
52Added a setting for the global kdepim data storage. 59Added a setting for the global kdepim data storage.
53Usually the data is stored in (yourhomedir/kdepim). 60Usually the data is stored in (yourhomedir/kdepim).
54Now you can set in the Global config dialog TAB, subTAB "Data storage path" 61Now you can set in the Global config dialog TAB, subTAB "Data storage path"
55a directory where all the kdepim data is stored. 62a directory where all the kdepim data is stored.
56That makes it easy to save all kdepim data on a SD card on the Z, for example. 63That makes it easy to save all kdepim data on a SD card on the Z, for example.
57 64
58KO/Pi: 65KO/Pi:
59The timeedit input has a pulldown list for times. 66The timeedit input has a pulldown list for times.
60If opened, this pulldown list should now has the right time highlighted. 67If opened, this pulldown list should now has the right time highlighted.
61Added the possibility to exclude events/todos/journals in a filter. 68Added the possibility to exclude events/todos/journals in a filter.
62You should exclude journals, if you do not want them to sync with a public calendar. 69You should exclude journals, if you do not want them to sync with a public calendar.
63 70
64KA/Pi: 71KA/Pi:
65Added the possibility to in/exclude public/private/confidential contacts to a filter. 72Added the possibility to in/exclude public/private/confidential contacts to a filter.
66If 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 ... 73If 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 ...
67Added printing of card view and details view on desktop. 74Added printing of card view and details view on desktop.
68Printing of list view is not working... 75Printing of list view is not working...
69Added button for removing pictures in contact editor. 76Added button for removing pictures in contact editor.
70Parsing data fix of KA/Pi version 1.9.17. 77Parsing data fix of KA/Pi version 1.9.17.
71Fixed the "parse name automatically" problem of KA/Pi version 1.9.17. 78Fixed the "parse name automatically" problem of KA/Pi version 1.9.17.
72Fixed some syncing merging problems. 79Fixed some syncing merging problems.
73 80
74 81
75********** VERSION 1.9.17 ************ 82********** VERSION 1.9.17 ************
76 83
77KO/Pi: 84KO/Pi:
78Fixed that tooltips were not updated after moving an item in agenda view. 85Fixed that tooltips were not updated after moving an item in agenda view.
79Fixed a bug in sorting start date for recurring events in list view. 86Fixed a bug in sorting start date for recurring events in list view.
80Changed the left button in todo viewer from "Agenda" to "Set completed". 87Changed the left button in todo viewer from "Agenda" to "Set completed".
81This 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. 88This 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.
82Added more info in the todo viewer: Startdate, parent/sub todos. 89Added more info in the todo viewer: Startdate, parent/sub todos.
83 90
84 91
85KA/Pi: 92KA/Pi:
86All fields search does now actually search all the (possible) fields, 93All fields search does now actually search all the (possible) fields,
87not only those listed in the contact list. 94not only those listed in the contact list.
88Made is possible to inline a picture in a vcard on the Z. 95Made is possible to inline a picture in a vcard on the Z.
89This was only possible on the desktop, now is it possible on the Z as well. 96This was only possible on the desktop, now is it possible on the Z as well.
90Fixed of missing save settings after filter configuration. 97Fixed of missing save settings after filter configuration.
91Made saving of addressbook much faster. 98Made saving of addressbook much faster.
92Fixed extension widget layout problem. 99Fixed extension widget layout problem.
93Fixed saving of default formatted name settings. 100Fixed saving of default formatted name settings.
94Fixed formatted name handling in edit dialog. 101Fixed formatted name handling in edit dialog.
95Added an option for changing formatted names of many contacts 102Added an option for changing formatted names of many contacts
96(menu: File - Change - Set formatted name). 103(menu: File - Change - Set formatted name).
97 104
98QWhatsThis was not working on the Z ( only black rectangle was shown). 105QWhatsThis was not working on the Z ( only black rectangle was shown).
99This is Fixed. 106This is Fixed.
100 107
101KDE-Sync: 108KDE-Sync:
102Now readonly KDE resources are synced as well. 109Now readonly KDE resources are synced as well.
103(They are not changed in KDE itself, of course). 110(They are not changed in KDE itself, of course).
104 111
105 112
106 113
107********** VERSION 1.9.16 ************ 114********** VERSION 1.9.16 ************
108 115
109KO/Pi: 116KO/Pi:
110Fixed search dialog size on Z 6000 (480x640 display). 117Fixed search dialog size on Z 6000 (480x640 display).
111Added setting to hide/show time in agenda items. 118Added setting to hide/show time in agenda items.
112Added setting to hide not running todos in todo view. 119Added setting to hide not running todos in todo view.
113Added columns for start date/time in todo view. 120Added columns for start date/time in todo view.
114Replaced the solid half-hour lines in agenda view by dot lines. 121Replaced the solid half-hour lines in agenda view by dot lines.
115Added possibility of printing the What's Next View on the desktop 122Added possibility of printing the What's Next View on the desktop
116(i.e. Windows and Linux). 123(i.e. Windows and Linux).
117Fixed a crash in KO/Pi when starting KO/Pi with What's Next view. 124Fixed a crash in KO/Pi when starting KO/Pi with What's Next view.
118Added tooltips in month view.(Tooltips only available on desktop) 125Added tooltips in month view.(Tooltips only available on desktop)
119 126
120Fixed a strange problem in KO/Pi alarm applet. 127Fixed a strange problem in KO/Pi alarm applet.
121Did not find the actual problem, 128Did not find the actual problem,
122such that now Qtopia reboots again if deinstalling the alarm applet. 129such that now Qtopia reboots again if deinstalling the alarm applet.
123But the alarm applet should work again. 130But the alarm applet should work again.
124 131
125KA/Pi: 132KA/Pi:
126Fixed the problem, that internal pictures were not saved. 133Fixed the problem, that internal pictures were not saved.
127 134
128Fixed a problem in the pi-sync mode by increasing the timeout for data transfer from 20 seconds to 5 minutes. 135Fixed a problem in the pi-sync mode by increasing the timeout for data transfer from 20 seconds to 5 minutes.
129 136
130Fixed some minor problems. (Like word wrap in help text windows). 137Fixed some minor problems. (Like word wrap in help text windows).
131 138
132Fixed a compiling problem in microkde/kresources. 139Fixed a compiling problem in microkde/kresources.
133 140
134KO/Pi is using zdbat (renamed to db2file) for syncing with Sharp DTM. 141KO/Pi is using zdbat (renamed to db2file) for syncing with Sharp DTM.
135This version now includes zdbat 1.0.0 (old version was zdbat 0.2.9) 142This version now includes zdbat 1.0.0 (old version was zdbat 0.2.9)
136such that now syncing KO/Pi with Sharp DTM should work on the 143such that now syncing KO/Pi with Sharp DTM should work on the
137Zaurus C 3000 model. 144Zaurus C 3000 model.
138 145
139********** VERSION 1.9.15 ************ 146********** VERSION 1.9.15 ************
140 147
141Usebilty enhancements in KO/Pi: 148Usebilty enhancements in KO/Pi:
142When clicking on the date in a month view cell, the day view is shown. 149When clicking on the date in a month view cell, the day view is shown.
143Old behaviour was, that the "new event" dialog popped up. 150Old behaviour was, that the "new event" dialog popped up.
144 151
145Added a one step "undo delete" in KO/Pi (Accessable in the "Action" menu). 152Added a one step "undo delete" in KO/Pi (Accessable in the "Action" menu).
146That means, you can restore the latest 153That means, you can restore the latest
147event/todo/journal you have deleted. 154event/todo/journal you have deleted.
148A journal is deleted, if you clear all the text of the journal. 155A journal is deleted, if you clear all the text of the journal.
149 156
150Fixed the bug of the editor dialogs in KO/Pi of version 1.9.14. 157Fixed the bug of the editor dialogs in KO/Pi of version 1.9.14.
151 158
152KA/Pi starting in 480x640 resolution: 159KA/Pi starting in 480x640 resolution:
153Hide the filter action in toolbar 160Hide the filter action in toolbar
154and added icons for undo/delete/redo in toolbar. 161and added icons for undo/delete/redo in toolbar.
155 162
156Change in OM/Pi ViewMail dialog: 163Change in OM/Pi ViewMail dialog:
157When clicking on the "delete" icon the mail is deleted after confirmation as usual. 164When clicking on the "delete" icon the mail is deleted after confirmation as usual.
158But the edit dialog is not closed as before, now the next mail in the folder is shown automatically (if there is any). 165But the edit dialog is not closed as before, now the next mail in the folder is shown automatically (if there is any).
159 166
160Fixed a crash when deleting mail-accounts in OM/Pi. 167Fixed a crash when deleting mail-accounts in OM/Pi.
161 168
162 169
163********** VERSION 1.9.14 ************ 170********** VERSION 1.9.14 ************
164 171
165Fixed some problems with the dialog sizes when switching 172Fixed some problems with the dialog sizes when switching
166portrait/landscape mode on 640x480 PDA display. 173portrait/landscape mode on 640x480 PDA display.
167 174
168Fixed some other small bugs in KA/Pi KO/Pi and OM/Pi and PwM/Pi. 175Fixed some other small bugs in KA/Pi KO/Pi and OM/Pi and PwM/Pi.
169 176
170Fixed an ugly bug in KOpieMail: 177Fixed an ugly bug in KOpieMail:
171KOpieMail was not able to write files (mails) to MSDOS file system, 178KOpieMail was not able to write files (mails) to MSDOS file system,
172like on an usual preformatted SD card. That should work now. 179like on an usual preformatted SD card. That should work now.
173To save your mail data on the Sd card do the following: 180To save your mail data on the Sd card do the following:
174Create a dir on the SD card: 181Create a dir on the SD card:
175mkdir /mnt/card/localmail 182mkdir /mnt/card/localmail
176Go to your home dir: 183Go to your home dir:
177cd 184cd
178Go to kopiemail data storage dir: 185Go to kopiemail data storage dir:
179cd kdepim/apps/kopiemail 186cd kdepim/apps/kopiemail
180Create a symlink to the SD card: 187Create a symlink to the SD card:
181ls -s /mnt/card/localmail 188ls -s /mnt/card/localmail
182Now KOpieMail will store all mails on the SD card. 189Now KOpieMail will store all mails on the SD card.
183 190
184KO/Pi Monthview: 191KO/Pi Monthview:
185Now "Go to Today" selects the current month from day 1-end, 192Now "Go to Today" selects the current month from day 1-end,
186not the current date + some days. 193not the current date + some days.
187I.e. "Go to Today" shows now always 194I.e. "Go to Today" shows now always
188the current month with first day of month in the first row. 195the current month with first day of month in the first row.
189 196
190Added missing German translation. 197Added missing German translation.
191 198
192Fixed icons of executeable on Wintendo. 199Fixed icons of executeable on Wintendo.
193 200
194Added a "Show next Mail" button to the OM/Pi 201Added a "Show next Mail" button to the OM/Pi
195mail viewer such that the mail below the current mail 202mail viewer such that the mail below the current mail
196in the mail list view of the current folder 203in the mail list view of the current folder
197can be read with a single click. 204can be read with a single click.
198 205
199 206
200********** VERSION 1.9.13 ************ 207********** VERSION 1.9.13 ************
201 208
202Fixed nasty PwM/Pi file reading bug, when 209Fixed nasty PwM/Pi file reading bug, when
203the used hash algo of file is different then the global 210the used hash algo of file is different then the global
204hash algo. 211hash algo.
205 212
206Added KA/Pi support for opie mailit mailapplication. 213Added KA/Pi support for opie mailit mailapplication.
207 214
208Fixed some bugs in OM/Pi. 215Fixed some bugs in OM/Pi.
209Now character conversion tables are available for the Zaurus 216Now character conversion tables are available for the Zaurus
210to make OM/Pi working properly. 217to make OM/Pi working properly.
211To get the character conversion in OM/Pi working, please download 218To get the character conversion in OM/Pi working, please download
212at the sourceforge project site the package 219at the sourceforge project site the package
213sr-character-conversion_SharpROM_arm.ipk.zip 220sr-character-conversion_SharpROM_arm.ipk.zip
214(or oz-character-conversion_OZ-gcc3xx_arm.ipk.zip for OZ roms) 221(or oz-character-conversion_OZ-gcc3xx_arm.ipk.zip for OZ roms)
215from the section "general files for KDE/Pim" 222from the section "general files for KDE/Pim"
216Instructions how to install this package are in a ReadMe in this file. 223Instructions how to install this package are in a ReadMe in this file.
217 224
218 225
219Fixed the orientation change problem in KA/Pi when switching 226Fixed the orientation change problem in KA/Pi when switching
220portrait/landscape mode. 227portrait/landscape mode.
221 228
222French translation available for KA/Pi and OM/Pi. 229French translation available for KA/Pi and OM/Pi.
223 230
224Fixed some problems with categories in KO/Pi in DTM sync. 231Fixed some problems with categories in KO/Pi in DTM sync.
225 232
226Added selection dialog for export to phone in KA/Pi. 233Added selection dialog for export to phone in KA/Pi.
227 234
228If in KO/Pi is an attendee selected to add to a meeting and this 235If in KO/Pi is an attendee selected to add to a meeting and this
229attendee is already in the list of attendees, this person is not added 236attendee is already in the list of attendees, this person is not added
230again. 237again.
231 238
232Some menu cleanup in KA/Pi. 239Some menu cleanup in KA/Pi.
233 240
234********** VERSION 1.9.12 ************ 241********** VERSION 1.9.12 ************
235 242
236Fix for the bug in KO/Pi What's Next view of version 1.9.11. 243Fix for the bug in KO/Pi What's Next view of version 1.9.11.
237 244
238Bugfix: Licence file is now shown again. 245Bugfix: Licence file is now shown again.
239 246
240OM/Pi now supports Unicode (utf8 charset). 247OM/Pi now supports Unicode (utf8 charset).
241Fixed some bugs in OM/Pi. 248Fixed some bugs in OM/Pi.
242 249
243KA/Pi has more German translation. 250KA/Pi has more German translation.
244 251
245 252
246********** VERSION 1.9.11 ************ 253********** VERSION 1.9.11 ************
247 254
248Fixed several problems in PWM/Pi, like 255Fixed several problems in PWM/Pi, like
249asking the user, if unsaved changed are pending 256asking the user, if unsaved changed are pending
250when closing the app. 257when closing the app.
251And PwM/Pi handles now different texts for the 258And PwM/Pi handles now different texts for the
252fields Description, Username, Password, configurable per category. 259fields Description, Username, Password, configurable per category.
253 260
254Fixed a crash in KO/Pi , when importing/loading vcs files 261Fixed a crash in KO/Pi , when importing/loading vcs files
255which have an entry with an attendee with state: 262which have an entry with an attendee with state:
256NEEDS ACTION 263NEEDS ACTION
257 264
258Fixed some problems in the German translation of OM/Pi, 265Fixed some problems in the German translation of OM/Pi,
259which makes some dialogs not fitting on the screen 266which makes some dialogs not fitting on the screen
260of the Z 5500. 267of the Z 5500.
261 268
262Fixed Qtopia crash, when disabling/deinstalling 269Fixed Qtopia crash, when disabling/deinstalling
263KO/Pi alarm applet. 270KO/Pi alarm applet.
264 271
265Implemented direct KDE<->KA/Pi sync for KA/Pi running 272Implemented direct KDE<->KA/Pi sync for KA/Pi running
266on Linux desktop. 273on Linux desktop.
267 274
268Added feature "remove sync info" to sync menu. 275Added feature "remove sync info" to sync menu.
269 276
270Tweaked the KO/Pi What's next view a bit, added 277Tweaked the KO/Pi What's next view a bit, added
271setting to hide events that are done. 278setting to hide events that are done.
272 279
273Disabled "beam receive enabled" on startup to 280Disabled "beam receive enabled" on startup to
274avoid problems if Fastload is enabled. 281avoid problems if Fastload is enabled.
275Please set "beam receive enabled", 282Please set "beam receive enabled",
276if you want to receive data via IR. 283if you want to receive data via IR.
277 284
278Fixed bug in direct KDE<->KO/Pi sync for KO/Pi running 285Fixed bug in direct KDE<->KO/Pi sync for KO/Pi running
279on Linux desktop. 286on Linux desktop.
280 287
281Made in KA/Pi scrolling possible, if details view is selected. 288Made in KA/Pi scrolling possible, if details view is selected.
282(The keyboard focus is set automatically to the search line) 289(The keyboard focus is set automatically to the search line)
283 290
284Fixed a bug in DMT sync, that a new entry in DTM was added 291Fixed a bug in DMT sync, that a new entry in DTM was added
285on every sync to Kx/Pi. 292on every sync to Kx/Pi.
286 293
287Fixed missing writing of KA/Pi categories to DMT entries when syncing. 294Fixed missing writing of KA/Pi categories to DMT entries when syncing.
288 295
289Fixed a bug in DMT sync with todos created in KO/Pi containing 296Fixed a bug in DMT sync with todos created in KO/Pi containing
290non-latin1 characters. 297non-latin1 characters.
291 298
292Rearranged package contents of Sharp-ipks and made all 299Rearranged package contents of Sharp-ipks and made all
293packages installable on SD again. 300packages installable on SD again.
294 301
295Fixed the writing of addressbook data in DTM sync. 302Fixed the writing of addressbook data in DTM sync.
296Empty fields in KA/Pi were not removed. 303Empty fields in KA/Pi were not removed.
297 304
298Added better category handling in KA/Pi: 305Added better category handling in KA/Pi:
299Added item 306Added item
300Edit Categories and 307Edit Categories and
301Manage new categories 308Manage new categories
302to the settings menu. 309to the settings menu.
303Possible to configure a view to display categories. 310Possible to configure a view to display categories.
304 311
305Added detailed "KDE Sync Howto" and "Multi Sync Howto" to Help menu. 312Added detailed "KDE Sync Howto" and "Multi Sync Howto" to Help menu.
306 313
307Fixed displaying of "free" days and time in KO Monthview and Agendaview. 314Fixed displaying of "free" days and time in KO Monthview and Agendaview.
308 315
309... and many other bugfixes. 316... and many other bugfixes.
310 317
311********** VERSION 1.9.10 ************ 318********** VERSION 1.9.10 ************
312 319
313Many internal small bugfixes. 320Many internal small bugfixes.
314And fix of the "big" bug in KO/Pi, 321And fix of the "big" bug in KO/Pi,
315that after Syncing the appointments had an offset by several hours. 322that after Syncing the appointments had an offset by several hours.
316That was a problem with the internal timezone setting, 323That was a problem with the internal timezone setting,
317introduced by the changed timezone configuration settings. 324introduced by the changed timezone configuration settings.
318 325
319German translation for OM/Pi is now available. 326German translation for OM/Pi is now available.
320 327
321 328
322********** VERSION 1.9.9 ************ 329********** VERSION 1.9.9 ************
323 330
324KDE-Pim/Pi has a new Member! 331KDE-Pim/Pi has a new Member!
325It is called PWM/Pi (Passwordmanager/platform-independent) 332It is called PWM/Pi (Passwordmanager/platform-independent)
326and it is available for the Zaurus. 333and it is available for the Zaurus.
327It is planned, that it will be available later for Windows. 334It is planned, that it will be available later for Windows.
328(And for Linux, of course). 335(And for Linux, of course).
329It is a port of the Passwordmanager of KDE. 336It is a port of the Passwordmanager of KDE.
330It will need the MicroKDElibs to run. 337It will need the MicroKDElibs to run.
331 338
332Made loading of addressbooks in KA/Pi up to 7 times faster! 339Made loading of addressbooks in KA/Pi up to 7 times faster!
333The bigger your addressbook file, the more starting speed 340The bigger your addressbook file, the more starting speed
334will you gain. (relatively) 341will you gain. (relatively)
335 342
336The Qtopia addressbook connector is now platform independend 343The Qtopia addressbook connector is now platform independend
337as well and should work on any platform for importing/exporting 344as well and should work on any platform for importing/exporting
338Qtopia and Opie XML files. 345Qtopia and Opie XML files.
339 346
340Added a +30min feature to the timezone settings to make 347Added a +30min feature to the timezone settings to make
341KDE-Pim/Pi useable in Australia and other parts on the 348KDE-Pim/Pi useable in Australia and other parts on the
342world with strange timezones ;-) 349world with strange timezones ;-)
343 350
344German "Umlaute" should now be sorted correctly on the Z in KA/Pi. 351German "Umlaute" should now be sorted correctly on the Z in KA/Pi.
345 352
346It is now possible to disable the 353It is now possible to disable the
347"receive data via infrared" feature, such that syncing with 354"receive data via infrared" feature, such that syncing with
348Outlook is now possible again with Kx/Pi runing. 355Outlook is now possible again with Kx/Pi runing.
349Please disable it, before syncing Sharp DTM with Outlook. 356Please disable it, before syncing Sharp DTM with Outlook.
350For your convenience, the "receive data via infrared" feature 357For your convenience, the "receive data via infrared" feature
351is disabled automatically, if you sync Kx/Pi with DTM. 358is disabled automatically, if you sync Kx/Pi with DTM.
352You have to enable it again manually after syncing. 359You have to enable it again manually after syncing.
353Enabling this feature makes it impossible to start the 360Enabling this feature makes it impossible to start the
354Sharp DTM apps. If this feature is enabled, you will only get the 361Sharp DTM apps. If this feature is enabled, you will only get the
355alarm notification from KO/Pi and not from the Sharp calendar. 362alarm notification from KO/Pi and not from the Sharp calendar.
356This is very useful if you sync KO/Pi with Sharp DTM, 363This is very useful if you sync KO/Pi with Sharp DTM,
357because after syncing you usually would get notified about 364because after syncing you usually would get notified about
358an alarm by KO/Pi and the Sharp Calendar. 365an alarm by KO/Pi and the Sharp Calendar.
359 366
360Together with the Linux desktop version of KO/Pi 367Together with the Linux desktop version of KO/Pi
361it is now possible to sync KO/Pi on the Zaurus 368it is now possible to sync KO/Pi on the Zaurus
362with the complete KDE-desktop (3.3 or later) 369with the complete KDE-desktop (3.3 or later)
363calendar data easily. 370calendar data easily.
364That makes it possible to sync the Z with one 371That makes it possible to sync the Z with one
365click of a mouse with the KDE-Desktop. 372click of a mouse with the KDE-Desktop.
366This feature it available for all Zaurus platforms KO/Pi 373This feature it available for all Zaurus platforms KO/Pi
367is running on. 374is running on.
368The only thing needed is a running KO/Pi on Linux and 375The only thing needed is a running KO/Pi on Linux and
369a compiled version of the small 376a compiled version of the small
370KDE-Pim/Pi<->KDE-Desktop access command line program, 377KDE-Pim/Pi<->KDE-Desktop access command line program,
371which is in the KDE-Pim/Pi sources available. 378which is in the KDE-Pim/Pi sources available.
372 379
373The "KDE-desktop" syncing feature for KA/Pi will follow 380The "KDE-desktop" syncing feature for KA/Pi will follow
374in the next releases. 381in the next releases.
375 382
376Fixed the vcard export bug, which had the version 1.9.8. 383Fixed the vcard export bug, which had the version 1.9.8.
377 384
378Added missing GERMAN translation to KO/Pi. 385Added missing GERMAN translation to KO/Pi.
379Hi PsionX, could you add the missing french translation?Thx! 386Hi PsionX, could you add the missing french translation?Thx!
380 387
381Translation files for KA/Pi are available as well. 388Translation files for KA/Pi are available as well.
382GERMAN translation will be available in the next release. 389GERMAN translation will be available in the next release.
383PsionX ( yres, you again ;-) ), could you start translating 390PsionX ( yres, you again ;-) ), could you start translating
384KA/Pi? Thx! 391KA/Pi? Thx!
385 392
386You can download the version 1.9.9 at 393You can download the version 1.9.9 at
387 394
388http://sourceforge.net/project/showfiles.php?group_id=104103&package_id=112604 395http://sourceforge.net/project/showfiles.php?group_id=104103&package_id=112604
389 396
390Note: 397Note:
391To run the mail program OM/Pi you need libopenssl. 398To run the mail program OM/Pi you need libopenssl.
392A link to a download loaction is available at 399A link to a download loaction is available at
393ZSI at www.killefiz.de 400ZSI at www.killefiz.de
394 401
395 402
396********** VERSION 1.9.8 ************ 403********** VERSION 1.9.8 ************
397 404
398Fixed character decoding in OM/Pi. 405Fixed character decoding in OM/Pi.
399(e.g. German "Umlaute" were not displayed properly.) 406(e.g. German "Umlaute" were not displayed properly.)
400 407
401Made is possible to reparent todos in KO/Pi. 408Made is possible to reparent todos in KO/Pi.
402Use contextmenu or keys (look at Help-Keys + Colors) for that. 409Use contextmenu or keys (look at Help-Keys + Colors) for that.
403 410
404Added the missing Sync-Howto and WhatsNew to the packages. 411Added the missing Sync-Howto and WhatsNew to the packages.
405 412
406KO/Pi on Linux desktop can now sync with KDE desktop. 413KO/Pi on Linux desktop can now sync with KDE desktop.
407That means: When using KO/Pi on Linux desktop for syncing with 414That means: When using KO/Pi on Linux desktop for syncing with
408KDE desktop and the Zaurus, the Zaurus can be synced now 415KDE desktop and the Zaurus, the Zaurus can be synced now
409with all KDE-Calendar resources, not only with one local file. 416with all KDE-Calendar resources, not only with one local file.
410(That makes it possible to sync the Zaurus with the 417(That makes it possible to sync the Zaurus with the
411calendar data on a Kolab server) 418calendar data on a Kolab server)
412 419
413KA/Pi syncing with KDE desktop will be available in the next version. 420KA/Pi syncing with KDE desktop will be available in the next version.
414 421
415 422
416********** VERSION 1.9.7 ************ 423********** VERSION 1.9.7 ************
417 424
418KO/Pi - KA/Pi on Windows: 425KO/Pi - KA/Pi on Windows:
419Now a directory can be defined by the user, where the 426Now a directory can be defined by the user, where the
420application/config data should be saved. 427application/config data should be saved.
421 Define your desired path in the evironment variable 428 Define your desired path in the evironment variable
422 MICROKDEHOME 429 MICROKDEHOME
423 before starting KO/Pi or KA/Pi. 430 before starting KO/Pi or KA/Pi.
424 431
425An easy Kx/Pi to Kx/Pi syncing is now possible 432An easy Kx/Pi to Kx/Pi syncing is now possible
426(it is called Pi-Sync) via network. 433(it is called Pi-Sync) via network.
427Please look at the Sync Howto. 434Please look at the Sync Howto.
428 435
429Exporting of calendar data and contacts to mobile phones is now possible. 436Exporting of calendar data and contacts to mobile phones is now possible.
430The SyncHowto is updated with information howto 437The SyncHowto is updated with information howto
431access/sync mobile phones. 438access/sync mobile phones.
432Please look at the Sync Howto. 439Please look at the Sync Howto.
433 440
434Now KO/Pi and KA/Pi on the Zaurus can receive data via infrared directly. 441Now KO/Pi and KA/Pi on the Zaurus can receive data via infrared directly.
435Please disable Fastload for the original contact/calendar applications 442Please disable Fastload for the original contact/calendar applications
436and close them. 443and close them.
437KO/Pi and KA/Pi must be running in order to receive the data. 444KO/Pi and KA/Pi must be running in order to receive the data.
438(KO/Pi and KA/Pi are always running if Fastload for them is enabled!) 445(KO/Pi and KA/Pi are always running if Fastload for them is enabled!)
439 446
440In the KA/Pi details view are now the preferred tel. numbers displayed on top 447In the KA/Pi details view are now the preferred tel. numbers displayed on top
441of the other data ( emails/tel.numbers/addresses) 448of the other data ( emails/tel.numbers/addresses)
442 449
443Fixed some syncing problems in KA/Pi. 450Fixed some syncing problems in KA/Pi.
444 451
445Added font settings for the KA/Pi details view. 452Added font settings for the KA/Pi details view.
446Added fields "children's name" and "gender" to KA/Pi. 453Added fields "children's name" and "gender" to KA/Pi.
447 454
448Made searching in KA/Pi better: 455Made searching in KA/Pi better:
449Now the first item in a view is selected after a search automatically and 456Now the first item in a view is selected after a search automatically and
450the views can be scrolled up/down when the search input field has the keyboard focus. 457the views can be scrolled up/down when the search input field has the keyboard focus.
451 458
452And, of course, fixed a bunch of reported bugs in KO/Pi and KA/Pi. 459And, of course, fixed a bunch of reported bugs in KO/Pi and KA/Pi.
453 460
454 461
455********** VERSION 1.9.6 ************ 462********** VERSION 1.9.6 ************
456 463
457Changes in the external application communication on the Zaurus 464Changes in the external application communication on the Zaurus
458in order to use less RAM when the apps are running. 465in order to use less RAM when the apps are running.
459First syncing of addressbooks (KA/Pi) is possible. 466First syncing of addressbooks (KA/Pi) is possible.
460 467
461 468
462********** VERSION 1.9.5a ************ 469********** VERSION 1.9.5a ************
463 470
464Fixed a bug in KO/Pi in the SharpDTM sync of version 1.9.5. 471Fixed a bug in KO/Pi in the SharpDTM sync of version 1.9.5.
465Fixed some small bugs. 472Fixed some small bugs.
466KA/Pi shows now the birthday in summary view. 473KA/Pi shows now the birthday in summary view.
467Now OM/Pi and KA/Pi are using the date format defined in KO/Pi 474Now OM/Pi and KA/Pi are using the date format defined in KO/Pi
468for displaying dates. 475for displaying dates.
469 476
470 477
471********** VERSION 1.9.5 ************ 478********** VERSION 1.9.5 ************
472 479
473There is still no Addressbook syncing! 480There is still no Addressbook syncing!
474 481
475New in 1.9.5: 482New in 1.9.5:
476 483
477Many bugfixes. 484Many bugfixes.
478Better searching in KA/Pi. 485Better searching in KA/Pi.
479You can configure in KA/Pi if you want to search only after 486You can configure in KA/Pi if you want to search only after
480<return> key pressed. 487<return> key pressed.
481 488
482Better mail downloading in OM/Pi. 489Better mail downloading in OM/Pi.
483 490
484First experimental alpha version of sync of KO/Pi with mobile phones. 491First experimental alpha version of sync of KO/Pi with mobile phones.
485See gammu documentation for supported phones. 492See gammu documentation for supported phones.
486You 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. 493You 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.
487Quick hint how to use: 494Quick hint how to use:
488NOTE: MOBILE PHONE SYNC IS EXPERIMENTAL! 495NOTE: MOBILE PHONE SYNC IS EXPERIMENTAL!
489Install kammu_1.9.5_arm.ipk , libbluetooth and libsdp. 496Install kammu_1.9.5_arm.ipk , libbluetooth and libsdp.
490Create syncprofile - mobile device 497Create syncprofile - mobile device
491Remove entry for model. (Leave empty ). 498Remove entry for model. (Leave empty ).
492Enable infrared on Zaurus and your Phone. 499Enable infrared on Zaurus and your Phone.
493Sync. 500Sync.
494To get a more detailed log, start kopi from konsole. 501To get a more detailed log, start kopi from konsole.
495 502
496********** VERSION 1.9.4 ************ 503********** VERSION 1.9.4 ************
497 504
498This is the version 1.9.4 of KDE-Pim/Pi for the Zaurus. 505This is the version 1.9.4 of KDE-Pim/Pi for the Zaurus.
499 506
500WARNING: 507WARNING:
501PLEASE BACKUP ALL YOUR DATA! 508PLEASE BACKUP ALL YOUR DATA!
502We have changed a lot and maybe there are some unknown problems. 509We have changed a lot and maybe there are some unknown problems.
503 510
504SYNC HANDLING HAS CHANGED! 511SYNC HANDLING HAS CHANGED!
505Such that, if you sync now with an already synded device, you will duplicated entries after the first sync. 512Such that, if you sync now with an already synded device, you will duplicated entries after the first sync.
506(This change was introduced to make it possible to sync with mobile phones, which will be available later (maybe in 4 weeks). 513(This change was introduced to make it possible to sync with mobile phones, which will be available later (maybe in 4 weeks).
507 514
508You need the kmicrokdelibs_1.9.4_arm.ipk as a base for the other programs. 515You need the kmicrokdelibs_1.9.4_arm.ipk as a base for the other programs.
509If 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. 516If 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.
510 517
511As programs are available: 518As programs are available:
512KO/Pi (korganizer ipk) - a calendar program. 519KO/Pi (korganizer ipk) - a calendar program.
513KA/Pi (kaddressbook ipk ) - an addressbook 520KA/Pi (kaddressbook ipk ) - an addressbook
514OM/Pi (kopiemail ipk ) an email program with pop/smtp and IMAP support. 521OM/Pi (kopiemail ipk ) an email program with pop/smtp and IMAP support.
515 522
516An alarm notification program ( korganizer-alarm ipk ) for KO/Pi that notifies you about alarms, even if the Zaurus is in suspend mode. 523An alarm notification program ( korganizer-alarm ipk ) for KO/Pi that notifies you about alarms, even if the Zaurus is in suspend mode.
517(If you do not see an icon in the taskbar after installing korganizer-alarm, please restart Qtopia) 524(If you do not see an icon in the taskbar after installing korganizer-alarm, please restart Qtopia)
518 525
519All the applications are installed in a "Pim" TAB. 526All the applications are installed in a "Pim" TAB.
520If 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 527If 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
521 528
522All the application are integrated. 529All the application are integrated.
523Such 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. 530Such 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.
524 531
525HINT: 532HINT:
526If you install KPhone/Pi 0.9.7, it will be called, if you click in KA/Pi on a phone number. 533If you install KPhone/Pi 0.9.7, it will be called, if you click in KA/Pi on a phone number.
527 534
528What's new? 535What's new?
529 536
530SYNC HANDLING HAS CHANGED! 537SYNC HANDLING HAS CHANGED!
531Such that, if you sync now with an already synded device, you will duplicated entries after the first sync. 538Such that, if you sync now with an already synded device, you will duplicated entries after the first sync.
532(This change was introduced to make it possible to sync with mobile phones, which will be available later (maybe in 4 weeks). 539(This change was introduced to make it possible to sync with mobile phones, which will be available later (maybe in 4 weeks).
533 540
534New in OM/Pi: 541New in OM/Pi:
535When 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. 542When 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.
536 543
537New in KO/Pi: 544New in KO/Pi:
538French is now available for KO/Pi. 545French is now available for KO/Pi.
539Choose menu:Actions - Configure:TAB locale 546Choose menu:Actions - Configure:TAB locale
540Syncing has changed. 547Syncing has changed.
541Phone sync available soon. 548Phone sync available soon.
542Not much changes, I cannot remember them ... 549Not much changes, I cannot remember them ...
543 550
544New in KA/Pi: 551New in KA/Pi:
545Beaming possible. 552Beaming possible.
546Sharp DTM readonly access possible( create a new DTM resource ); 553Sharp DTM readonly access possible( create a new DTM resource );
547Better searching possible. 554Better searching possible.
548Search is performed only after pressing the return key. 555Search is performed only after pressing the return key.
549Use wildcard * to specify parts of a name. 556Use wildcard * to specify parts of a name.
550 557
551Better 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 * . 558Better 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 * .
552 559
553A big improvement is the new management of the contact access. 560A big improvement is the new management of the contact access.
554In version 1.9.3, every application was using their own addressbook access data. 561In version 1.9.3, every application was using their own addressbook access data.
555That means, the addressbook was loaded up to three times in the memory, when accessed by KA/Pi, KO/Pi and OM/Pi. 562That means, the addressbook was loaded up to three times in the memory, when accessed by KA/Pi, KO/Pi and OM/Pi.
556That was wasting of memory, if you had several hundreds of contacts. 563That was wasting of memory, if you had several hundreds of contacts.
557 564
558Now only KA/Pi accesses the addressbook. 565Now only KA/Pi accesses the addressbook.
559If 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. 566If 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.
560If you click on an attendee in a meeting, its contact data is displayed in KA/Pi directly. 567If you click on an attendee in a meeting, its contact data is displayed in KA/Pi directly.
561That means, if KO/Pi or OM/Pi want to access contact data, KA/Pi is started first. 568That means, if KO/Pi or OM/Pi want to access contact data, KA/Pi is started first.
562 569
563New in the KO/Pi alarm applet: 570New in the KO/Pi alarm applet:
564Configure your own timer popup menu! 571Configure your own timer popup menu!
565(Text and minutes for timer countdown) 572(Text and minutes for timer countdown)
566Just edit the file 573Just edit the file
567(yourhomedir)/.kopialarmtimerrc 574(yourhomedir)/.kopialarmtimerrc
568and start/stop a timer to get a new menu with the data of this file. 575and start/stop a timer to get a new menu with the data of this file.
569 576
570********** VERSION 1.9.3 ************ 577********** VERSION 1.9.3 ************
5711) 5781)
572Now KO/Pi on Windows imports directly the calendar data of 579Now KO/Pi on Windows imports directly the calendar data of
573an installed Outlook. Should work with OL version >= 2000. 580an installed Outlook. Should work with OL version >= 2000.
574 581
575********** VERSION 1.9.2 ************ 582********** VERSION 1.9.2 ************
5761) 5831)
577KDE-Pim/Pi has got a new member: 584KDE-Pim/Pi has got a new member:
578KmicroMail (KM/Pi) is a mail program, 585KmicroMail (KM/Pi) is a mail program,
579which can handle IMAP and POP mail access. 586which can handle IMAP and POP mail access.
580It is based on Opie-Mail v3. 587It is based on Opie-Mail v3.
581All dependencies to the Opie libraries ar removed, 588All dependencies to the Opie libraries ar removed,
582such that no additional Opie lib is needed. 589such that no additional Opie lib is needed.
583It is already integrated in KO/Pi and KA/Pi. 590It is already integrated in KO/Pi and KA/Pi.
584It it now available for the Zaurus,probably it 591It it now available for the Zaurus,probably it
585will be available for other platforms later. 592will be available for other platforms later.
586Hint: 593Hint:
587Create your own contact (name + email) 594Create your own contact (name + email)
588in KA/Pi, select this contact and choose menu: 595in KA/Pi, select this contact and choose menu:
589Settings - Set Who Am I. 596Settings - Set Who Am I.
590Now the settings of this contact are used as 597Now the settings of this contact are used as
591the sender data in KM/Pi. 598the sender data in KM/Pi.
5922) 5992)
593KDE-Pim/Pi is split up in five different 600KDE-Pim/Pi is split up in five different
594packages now precompiled for Sharp Zaurus: 601packages now precompiled for Sharp Zaurus:
595--kmicrokdelibs_1.9.2_arm.ipk 602--kmicrokdelibs_1.9.2_arm.ipk
596The libs are needed for any 603The libs are needed for any
597of the following programs: 604of the following programs:
598--kaddressbook_1.9.2_arm.ipk 605--kaddressbook_1.9.2_arm.ipk
599--kmicromail_1.9.2_arm.ipk 606--kmicromail_1.9.2_arm.ipk
600--korganizer_1.9.2_arm.ipk 607--korganizer_1.9.2_arm.ipk
601Independ from that, there is the alarm applet 608Independ from that, there is the alarm applet
602available for KO/Pi, which also offers 609available for KO/Pi, which also offers
603quick access for a new mail or 610quick access for a new mail or
604showing the addressbook.: 611showing the addressbook.:
605--korganizer-alarm_1.9.2_arm.ipk 612--korganizer-alarm_1.9.2_arm.ipk
606Independend means, that the alarm applet 613Independend means, that the alarm applet
607does not need any of the libs or programs above to run. 614does not need any of the libs or programs above to run.
608But it would be quite useless without these programs. 615But it would be quite useless without these programs.
609NOTE: 616NOTE:
610If you get a 617If you get a
611"This application depends on other programs" 618"This application depends on other programs"
612during installation of 619during installation of
613--kmicrokdelibs_1.9.2_arm.ipk 620--kmicrokdelibs_1.9.2_arm.ipk
614you probably do not have to care about that. 621you probably do not have to care about that.
615kmicrokdelibs_1.9.2 will come with some 622kmicrokdelibs_1.9.2 will come with some
616resource plugins, which needs additional libraries. 623resource plugins, which needs additional libraries.
617(E.g. libopie1, if you want to use the 624(E.g. libopie1, if you want to use the
618opie resource connector in KA/Pi). 625opie resource connector in KA/Pi).
619If you do not have this libraries installed, 626If you do not have this libraries installed,
620you simply cannot use the resource. 627you simply cannot use the resource.
621To make it clear: 628To make it clear:
622If the libraries are missing, the applications 629If the libraries are missing, the applications
623using kmicrokdelibs will start, 630using kmicrokdelibs will start,
624because the resources are plugins. 631because the resources are plugins.
6253) 6323)
626KO/Pi and friends are now installable on SD-Card! 633KO/Pi and friends are now installable on SD-Card!
627It is recommended to install all libs and apps 634It is recommended to install all libs and apps
628on the SD card or all in the internal storage. 635on the SD card or all in the internal storage.
629There may be problems, if this is mixed. 636There may be problems, if this is mixed.
6304) 6374)
631Fixed two bugs in the alarm notification on Windows. 638Fixed two bugs in the alarm notification on Windows.
6325) 6395)
633Great improvement! 640Great improvement!
634KO/Pi uses now the latest version of libical. 641KO/Pi uses now the latest version of libical.
635Libical is the library which actually reads 642Libical is the library which actually reads
636the calendar files and extract the data from it. 643the calendar files and extract the data from it.
637With the old version, there were problems 644With the old version, there were problems
638(crashes or program hangs) when licical did read 645(crashes or program hangs) when licical did read
639files, which were not stored from KO/Pi. 646files, which were not stored from KO/Pi.
640I do not know, if the new libical works perfect, 647I do not know, if the new libical works perfect,
641but actually it works much better than 648but actually it works much better than
642the old version. 649the old version.
643There are no problems with compatibility with 650There are no problems with compatibility with
644old calendar files of KO/Pi, of course! 651old calendar files of KO/Pi, of course!
6456) 6526)
646New in KA/Pi: 653New in KA/Pi:
647Opie addressbook resource connector available! 654Opie addressbook resource connector available!
648You will need libopie1 and the opie addressbook, 655You will need libopie1 and the opie addressbook,
649of course. 656of course.
650With the Opie addressbook resource connector, 657With the Opie addressbook resource connector,
651you can access the Opie addressbook readonly in KA/Pi. 658you can access the Opie addressbook readonly in KA/Pi.
652If you want to edit or import the data into KA/Pi, 659If you want to edit or import the data into KA/Pi,
653do this: 660do this:
654a) Create an Opie resource. 661a) Create an Opie resource.
655 (Menu: Settings-Configure Resources). 662 (Menu: Settings-Configure Resources).
656After configuration and restarting KA/Pi you should see 663After configuration and restarting KA/Pi you should see
657the Opie contacts in KA/Pi. 664the Opie contacts in KA/Pi.
658b) Select some or all Opie contacts. 665b) Select some or all Opie contacts.
659(NOTE: +++++ 666(NOTE: +++++
660To know exactly, what contacts are Opie contacts, 667To know exactly, what contacts are Opie contacts,
661do this: Choose menu: 668do this: Choose menu:
662View-Modify View - TAB Fields. 669View-Modify View - TAB Fields.
663Select in the above list "Resource" and click 670Select in the above list "Resource" and click
664down arrow to add it to the "Selected fields". 671down arrow to add it to the "Selected fields".
665Click OK. 672Click OK.
666Now you have a new column "Resource" in your list, 673Now you have a new column "Resource" in your list,
667where you can see, what an Opie resource is. 674where you can see, what an Opie resource is.
668++++ NOTE end.) 675++++ NOTE end.)
669Ok, we do have now some Opie contacts seleted. 676Ok, we do have now some Opie contacts seleted.
670(Use SHIFT or CTRL key in order to multiple select). 677(Use SHIFT or CTRL key in order to multiple select).
671c) Choose menu: Edit-Copy. 678c) Choose menu: Edit-Copy.
672d) Choose menu: Edit-Paste. 679d) Choose menu: Edit-Paste.
673e) Select the resource, you want to add the contacts to. 680e) Select the resource, you want to add the contacts to.
674Congrats! Now you have read/write access to the copied 681Congrats! Now you have read/write access to the copied
675opie contacts as "real" KA/Pi contacts. 682opie contacts as "real" KA/Pi contacts.
676 683
677 684
678********** VERSION 1.9.1 ************ 685********** VERSION 1.9.1 ************
6791) 6861)
680 +++ IMPORTANT 1 +++ 687 +++ IMPORTANT 1 +++
681 688
682The storing place of the default calendar 689The storing place of the default calendar
683file has changed! 690file has changed!
684The default calendar file was 691The default calendar file was
685Applications/korganizer/mycalendar.ics 692Applications/korganizer/mycalendar.ics
686on Zaurus and 693on Zaurus and
687(yourHomeDir)/korganizer/mycalendar.ics 694(yourHomeDir)/korganizer/mycalendar.ics
688on Windows/Linux desktop. Now it is 695on Windows/Linux desktop. Now it is
689(yourHomeDir)/kdepim/korganizer/mycalendar.ics 696(yourHomeDir)/kdepim/korganizer/mycalendar.ics
690on Zaurus, Windows and Linux. 697on Zaurus, Windows and Linux.
691To load the old file, choose menu 698To load the old file, choose menu
692File-Load calendar backup. 699File-Load calendar backup.
693(It should be loaded automatically 700(It should be loaded automatically
694at startup with a warning message displayed). 701at startup with a warning message displayed).
695The place of the configuration file has changed too. 702The place of the configuration file has changed too.
696If you want to use your old KO/Pi config, 703If you want to use your old KO/Pi config,
697copy it to 704copy it to
698(yourHomeDir)/kdepim/config/korganizerrc 705(yourHomeDir)/kdepim/config/korganizerrc
699Please read VERSION 1.9.0 - topic 3) as well! 706Please read VERSION 1.9.0 - topic 3) as well!
700 707
701 +++ IMPORTANT 2 +++ 708 +++ IMPORTANT 2 +++
702 709
703Because of the new paths, you will need 710Because of the new paths, you will need
704a new version of the KO/Pi alarm applet 711a new version of the KO/Pi alarm applet
705for Zaurus. 712for Zaurus.
706Use version >= 1.9.1 713Use version >= 1.9.1
707 714
7082) 7152)
709Now the QWhat'sThis Icon works for items 716Now the QWhat'sThis Icon works for items
710in the month view as well. 717in the month view as well.
711(See VERSION 1.7.8 Topic 1) ). 718(See VERSION 1.7.8 Topic 1) ).
7123) 7193)
713You can import birtsdays/anniversaries 720You can import birtsdays/anniversaries
714from KA/Pi into KO/Pi. 721from KA/Pi into KO/Pi.
715Choose menu File-Import birthdays. 722Choose menu File-Import birthdays.
716If you import twice, already imported items 723If you import twice, already imported items
717will not be imported again, if they 724will not be imported again, if they
718have not been changed in KO/Pi. 725have not been changed in KO/Pi.
7194) 7264)
720When syncing with sharp DTM, now a progress 727When syncing with sharp DTM, now a progress
721is shown, when the data is written back. 728is shown, when the data is written back.
722If there is much data in KO/Pi and no data 729If there is much data in KO/Pi and no data
723in DTM, that can take a long time. 730in DTM, that can take a long time.
724(But only for the first time ). 731(But only for the first time ).
7255) 7325)
726In the search dialog, you can search 733In the search dialog, you can search
727now for the name/email of an attendee 734now for the name/email of an attendee
728of an event/todo. 735of an event/todo.
729To get more space for displaying 736To get more space for displaying
730search results, the buttons 737search results, the buttons
731for "search" and "close" on the 738for "search" and "close" on the
732bottom are removed in the PDA version. 739bottom are removed in the PDA version.
733You have to click OK in the top right 740You have to click OK in the top right
734corner to do a search. 741corner to do a search.
7356) 7426)
736Now it is possible to disable the displaying 743Now it is possible to disable the displaying
737of todo items in the Allday part of the Agenda. 744of todo items in the Allday part of the Agenda.
738Choose Menu Action-Configure, 745Choose Menu Action-Configure,
739TAB Todo View, checkbox 746TAB Todo View, checkbox
740"Allday Agenda view shows todos" 747"Allday Agenda view shows todos"
7417) 7487)
742If FastLoad is enabled, now the settings and the 749If FastLoad is enabled, now the settings and the
743calendar data are saved, when KO/Pi is closed. 750calendar data are saved, when KO/Pi is closed.
744(If no Fastload is enabled, KO/Pi saves 751(If no Fastload is enabled, KO/Pi saves
745the data as well, of course) 752the data as well, of course)
7468) 7538)
747The Agenda View has a minimize-splitter now, 754The Agenda View has a minimize-splitter now,
748such that the height of the allday part can be 755such that the height of the allday part can be
749changed quickly. 756changed quickly.
750 757
751********** VERSION 1.9.0 ************ 758********** VERSION 1.9.0 ************
7521) 7591)
753KO/Pi is now merged with the new microKDE from KA/Pi. 760KO/Pi is now merged with the new microKDE from KA/Pi.
754KO/Pi accesses now KA/Pi as the addressbook. 761KO/Pi accesses now KA/Pi as the addressbook.
755The other ddressbook-plugins are not working any longer. 762The other ddressbook-plugins are not working any longer.
756(It is planned, that later KA/Pi itself uses these plugins) 763(It is planned, that later KA/Pi itself uses these plugins)
757New versions of KO/Pi are only available 764New versions of KO/Pi are only available
758together with KA/Pi as the KDE-Pim/Pi package. 765together with KA/Pi as the KDE-Pim/Pi package.
7592) 7662)
760If you click on an attendee of a meeting in the 767If you click on an attendee of a meeting in the
761event viewer, a detailed summary of the 768event viewer, a detailed summary of the
762attendee is shown. 769attendee is shown.
7633) 7703)
764The place of the configuration file has changed. 771The place of the configuration file has changed.
765If you want to use your old KO/Pi config, copy 772If you want to use your old KO/Pi config, copy
766Applications/korganizer/config_korganizerrc 773Applications/korganizer/config_korganizerrc
767to 774to
768Applications/korganizer/config/korganizerrc 775Applications/korganizer/config/korganizerrc
769 776
770********** VERSION 1.7.8 ************ 777********** VERSION 1.7.8 ************
7711) 7781)
772Now the QWhat'sThis ist working. 779Now the QWhat'sThis ist working.
773Enable the QWhat'sThis icon in the toolbar. 780Enable the QWhat'sThis icon in the toolbar.
774(You have to restart to reload the changed toolbar config). 781(You have to restart to reload the changed toolbar config).
775Now click on the QWhat'sThis Icon 782Now click on the QWhat'sThis Icon
776in the top right corner of KO/Pi. 783in the top right corner of KO/Pi.
777Then click on an item in the Agenda View: 784Then click on an item in the Agenda View:
778You will get a detailed display of the items content. 785You will get a detailed display of the items content.
7792) 7862)
780Some other very minor changes. 787Some other very minor changes.
781But I have forgotten the details ... 788But I have forgotten the details ...
782For that reason I start this log here: 789For that reason I start this log here:
783To document my changes, when I am doing it. 790To document my changes, when I am doing it.
784 791
785********** VERSION 1.7.7 ************ 792********** VERSION 1.7.7 ************
786Stable Version of KO/Pi 793Stable Version of KO/Pi
diff --git a/kmicromail/libetpan/imap/mailimap_parser.c b/kmicromail/libetpan/imap/mailimap_parser.c
index 1c2ecde..560e58a 100644
--- a/kmicromail/libetpan/imap/mailimap_parser.c
+++ b/kmicromail/libetpan/imap/mailimap_parser.c
@@ -1,9506 +1,9524 @@
1/* 1/*
2 * libEtPan! -- a mail stuff library 2 * libEtPan! -- a mail stuff library
3 * 3 *
4 * Copyright (C) 2001, 2002 - DINH Viet Hoa 4 * Copyright (C) 2001, 2002 - DINH Viet Hoa
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * Redistribution and use in source and binary forms, with or without 7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions 8 * modification, are permitted provided that the following conditions
9 * are met: 9 * are met:
10 * 1. Redistributions of source code must retain the above copyright 10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer. 11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright 12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the 13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution. 14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the libEtPan! project nor the names of its 15 * 3. Neither the name of the libEtPan! project nor the names of its
16 * contributors may be used to endorse or promote products derived 16 * contributors may be used to endorse or promote products derived
17 * from this software without specific prior written permission. 17 * from this software without specific prior written permission.
18 * 18 *
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE. 29 * SUCH DAMAGE.
30 */ 30 */
31 31
32/* 32/*
33 * $Id$ 33 * $Id$
34 */ 34 */
35 35
36#include <string.h> 36#include <string.h>
37#include <stdlib.h> 37#include <stdlib.h>
38#include <stdio.h> 38#include <stdio.h>
39 39
40#include "mailstream.h" 40#include "mailstream.h"
41#include "mailimap_keywords.h" 41#include "mailimap_keywords.h"
42#include "mailimap_parser.h" 42#include "mailimap_parser.h"
43#include "mmapstring.h" 43#include "mmapstring.h"
44#include "mail.h" 44#include "mail.h"
45 45
46#ifndef UNSTRICT_SYNTAX 46#ifndef UNSTRICT_SYNTAX
47#define UNSTRICT_SYNTAX 47#define UNSTRICT_SYNTAX
48#endif 48#endif
49 49
50/* 50/*
51 Document: internet-drafts/draft-crispin-imapv-15.txt 51 Document: internet-drafts/draft-crispin-imapv-15.txt
52 RFC 2060 (IMAP but rather used draft) 52 RFC 2060 (IMAP but rather used draft)
53 RFC 2234 for all token that are not defined such as ALPHA 53 RFC 2234 for all token that are not defined such as ALPHA
54*/ 54*/
55 55
56 56
57 57
58/* ************************************************************************* */ 58/* ************************************************************************* */
59/* ************************************************************************* */ 59/* ************************************************************************* */
60/* ************************************************************************* */ 60/* ************************************************************************* */
61/* ************************************************************************* */ 61/* ************************************************************************* */
62/* ************************************************************************* */ 62/* ************************************************************************* */
63/* ************************************************************************* */ 63/* ************************************************************************* */
64 64
65 65
66 66
67 67
68static int mailimap_address_parse(mailstream * fd, MMAPString * buffer, 68static int mailimap_address_parse(mailstream * fd, MMAPString * buffer,
69 size_t * index, 69 size_t * index,
70 struct mailimap_address ** result, 70 struct mailimap_address ** result,
71 size_t progr_rate, 71 size_t progr_rate,
72 progress_function * progr_fun); 72 progress_function * progr_fun);
73 73
74static int mailimap_addr_adl_parse(mailstream * fd, MMAPString * buffer, 74static int mailimap_addr_adl_parse(mailstream * fd, MMAPString * buffer,
75 size_t * index, char ** result, 75 size_t * index, char ** result,
76 size_t progr_rate, 76 size_t progr_rate,
77 progress_function * progr_fun); 77 progress_function * progr_fun);
78 78
79static int mailimap_addr_host_parse(mailstream * fd, MMAPString * buffer, 79static int mailimap_addr_host_parse(mailstream * fd, MMAPString * buffer,
80 size_t * index, char ** result, 80 size_t * index, char ** result,
81 size_t progr_rate, 81 size_t progr_rate,
82 progress_function * progr_fun); 82 progress_function * progr_fun);
83 83
84static int mailimap_addr_mailbox_parse(mailstream * fd, MMAPString * buffer, 84static int mailimap_addr_mailbox_parse(mailstream * fd, MMAPString * buffer,
85 size_t * index, char ** result, 85 size_t * index, char ** result,
86 size_t progr_rate, 86 size_t progr_rate,
87 progress_function * progr_fun); 87 progress_function * progr_fun);
88 88
89static int mailimap_addr_name_parse(mailstream * fd, MMAPString * buffer, 89static int mailimap_addr_name_parse(mailstream * fd, MMAPString * buffer,
90 size_t * index, char ** result, 90 size_t * index, char ** result,
91 size_t progr_rate, 91 size_t progr_rate,
92 progress_function * progr_fun); 92 progress_function * progr_fun);
93 93
94 94
95static int 95static int
96mailimap_astring_parse(mailstream * fd, MMAPString * buffer, 96mailimap_astring_parse(mailstream * fd, MMAPString * buffer,
97 size_t * index, 97 size_t * index,
98 char ** result, 98 char ** result,
99 size_t progr_rate, 99 size_t progr_rate,
100 progress_function * progr_fun); 100 progress_function * progr_fun);
101 101
102static int mailimap_atom_parse(mailstream * fd, MMAPString * buffer, 102static int mailimap_atom_parse(mailstream * fd, MMAPString * buffer,
103 size_t * index, char ** result, 103 size_t * index, char ** result,
104 size_t progr_rate, 104 size_t progr_rate,
105 progress_function * progr_fun); 105 progress_function * progr_fun);
106 106
107static int mailimap_auth_type_parse(mailstream * fd, MMAPString * buffer, 107static int mailimap_auth_type_parse(mailstream * fd, MMAPString * buffer,
108 size_t * index, char ** result, 108 size_t * index, char ** result,
109 size_t progr_rate, 109 size_t progr_rate,
110 progress_function * progr_fun); 110 progress_function * progr_fun);
111 111
112static int mailimap_base64_parse(mailstream * fd, MMAPString * buffer, 112static int mailimap_base64_parse(mailstream * fd, MMAPString * buffer,
113 size_t * index, char ** result, 113 size_t * index, char ** result,
114 size_t progr_rate, 114 size_t progr_rate,
115 progress_function * progr_fun); 115 progress_function * progr_fun);
116 116
117static int mailimap_body_parse(mailstream * fd, MMAPString * buffer, 117static int mailimap_body_parse(mailstream * fd, MMAPString * buffer,
118 size_t * index, 118 size_t * index,
119 struct mailimap_body ** result, 119 struct mailimap_body ** result,
120 size_t progr_rate, 120 size_t progr_rate,
121 progress_function * progr_fun); 121 progress_function * progr_fun);
122 122
123 123
124static int 124static int
125mailimap_body_extension_parse(mailstream * fd, MMAPString * buffer, 125mailimap_body_extension_parse(mailstream * fd, MMAPString * buffer,
126 size_t * index, 126 size_t * index,
127 struct mailimap_body_extension ** result, 127 struct mailimap_body_extension ** result,
128 size_t progr_rate, 128 size_t progr_rate,
129 progress_function * progr_fun); 129 progress_function * progr_fun);
130 130
131 131
132static int 132static int
133mailimap_body_ext_1part_parse(mailstream * fd, MMAPString * buffer, 133mailimap_body_ext_1part_parse(mailstream * fd, MMAPString * buffer,
134 size_t * index, 134 size_t * index,
135 struct mailimap_body_ext_1part ** result, 135 struct mailimap_body_ext_1part ** result,
136 size_t progr_rate, 136 size_t progr_rate,
137 progress_function * progr_fun); 137 progress_function * progr_fun);
138 138
139 139
140 140
141static int 141static int
142mailimap_body_ext_mpart_parse(mailstream * fd, MMAPString * buffer, 142mailimap_body_ext_mpart_parse(mailstream * fd, MMAPString * buffer,
143 size_t * index, 143 size_t * index,
144 struct mailimap_body_ext_mpart ** result, 144 struct mailimap_body_ext_mpart ** result,
145 size_t progr_rate, 145 size_t progr_rate,
146 progress_function * progr_fun); 146 progress_function * progr_fun);
147 147
148 148
149static int 149static int
150mailimap_body_fields_parse(mailstream * fd, MMAPString * buffer, 150mailimap_body_fields_parse(mailstream * fd, MMAPString * buffer,
151 size_t * index, 151 size_t * index,
152 struct mailimap_body_fields ** result, 152 struct mailimap_body_fields ** result,
153 size_t progr_rate, 153 size_t progr_rate,
154 progress_function * progr_fun); 154 progress_function * progr_fun);
155 155
156static int mailimap_body_fld_desc_parse(mailstream * fd, MMAPString * buffer, 156static int mailimap_body_fld_desc_parse(mailstream * fd, MMAPString * buffer,
157 size_t * index, char ** result, 157 size_t * index, char ** result,
158 size_t progr_rate, 158 size_t progr_rate,
159 progress_function * progr_fun); 159 progress_function * progr_fun);
160 160
161 161
162static int 162static int
163mailimap_body_fld_dsp_parse(mailstream * fd, MMAPString * buffer, 163mailimap_body_fld_dsp_parse(mailstream * fd, MMAPString * buffer,
164 size_t * index, 164 size_t * index,
165 struct mailimap_body_fld_dsp ** result, 165 struct mailimap_body_fld_dsp ** result,
166 size_t progr_rate, 166 size_t progr_rate,
167 progress_function * progr_fun); 167 progress_function * progr_fun);
168 168
169 169
170 170
171static int 171static int
172mailimap_body_fld_enc_parse(mailstream * fd, MMAPString * buffer, 172mailimap_body_fld_enc_parse(mailstream * fd, MMAPString * buffer,
173 size_t * index, 173 size_t * index,
174 struct mailimap_body_fld_enc ** result, 174 struct mailimap_body_fld_enc ** result,
175 size_t progr_rate, 175 size_t progr_rate,
176 progress_function * progr_fun); 176 progress_function * progr_fun);
177 177
178 178
179 179
180static int mailimap_body_fld_id_parse(mailstream * fd, MMAPString * buffer, 180static int mailimap_body_fld_id_parse(mailstream * fd, MMAPString * buffer,
181 size_t * index, char ** result, 181 size_t * index, char ** result,
182 size_t progr_rate, 182 size_t progr_rate,
183 progress_function * progr_fun); 183 progress_function * progr_fun);
184 184
185 185
186static int 186static int
187mailimap_body_fld_lang_parse(mailstream * fd, MMAPString * buffer, 187mailimap_body_fld_lang_parse(mailstream * fd, MMAPString * buffer,
188 size_t * index, 188 size_t * index,
189 struct mailimap_body_fld_lang ** result, 189 struct mailimap_body_fld_lang ** result,
190 size_t progr_rate, 190 size_t progr_rate,
191 progress_function * progr_fun); 191 progress_function * progr_fun);
192 192
193static int mailimap_body_fld_lines_parse(mailstream * fd, 193static int mailimap_body_fld_lines_parse(mailstream * fd,
194 MMAPString * buffer, size_t * index, 194 MMAPString * buffer, size_t * index,
195 uint32_t * result); 195 uint32_t * result);
196 196
197static int mailimap_body_fld_md5_parse(mailstream * fd, MMAPString * buffer, 197static int mailimap_body_fld_md5_parse(mailstream * fd, MMAPString * buffer,
198 size_t * index, char ** result, 198 size_t * index, char ** result,
199 size_t progr_rate, 199 size_t progr_rate,
200 progress_function * progr_fun); 200 progress_function * progr_fun);
201 201
202static int mailimap_body_fld_octets_parse(mailstream * fd, 202static int mailimap_body_fld_octets_parse(mailstream * fd,
203 MMAPString * buffer, size_t * index, 203 MMAPString * buffer, size_t * index,
204 uint32_t * result); 204 uint32_t * result);
205 205
206static int 206static int
207mailimap_body_fld_param_parse(mailstream * fd, 207mailimap_body_fld_param_parse(mailstream * fd,
208 MMAPString * buffer, size_t * index, 208 MMAPString * buffer, size_t * index,
209 struct mailimap_body_fld_param ** result, 209 struct mailimap_body_fld_param ** result,
210 size_t progr_rate, 210 size_t progr_rate,
211 progress_function * progr_fun); 211 progress_function * progr_fun);
212 212
213 213
214 214
215static int 215static int
216mailimap_body_type_1part_parse(mailstream * fd, MMAPString * buffer, 216mailimap_body_type_1part_parse(mailstream * fd, MMAPString * buffer,
217 size_t * index, 217 size_t * index,
218 struct mailimap_body_type_1part ** result, 218 struct mailimap_body_type_1part ** result,
219 size_t progr_rate, 219 size_t progr_rate,
220 progress_function * progr_fun); 220 progress_function * progr_fun);
221 221
222 222
223 223
224static int 224static int
225mailimap_body_type_basic_parse(mailstream * fd, MMAPString * buffer, 225mailimap_body_type_basic_parse(mailstream * fd, MMAPString * buffer,
226 size_t * index, 226 size_t * index,
227 struct mailimap_body_type_basic ** result, 227 struct mailimap_body_type_basic ** result,
228 size_t progr_rate, 228 size_t progr_rate,
229 progress_function * progr_fun); 229 progress_function * progr_fun);
230 230
231 231
232 232
233static int 233static int
234mailimap_body_type_mpart_parse(mailstream * fd, 234mailimap_body_type_mpart_parse(mailstream * fd,
235 MMAPString * buffer, 235 MMAPString * buffer,
236 size_t * index, 236 size_t * index,
237 struct mailimap_body_type_mpart ** result, 237 struct mailimap_body_type_mpart ** result,
238 size_t progr_rate, 238 size_t progr_rate,
239 progress_function * progr_fun); 239 progress_function * progr_fun);
240 240
241 241
242 242
243static int 243static int
244mailimap_body_type_msg_parse(mailstream * fd, MMAPString * buffer, 244mailimap_body_type_msg_parse(mailstream * fd, MMAPString * buffer,
245 size_t * index, 245 size_t * index,
246 struct mailimap_body_type_msg ** result, 246 struct mailimap_body_type_msg ** result,
247 size_t progr_rate, 247 size_t progr_rate,
248 progress_function * progr_fun); 248 progress_function * progr_fun);
249 249
250 250
251 251
252static int 252static int
253mailimap_body_type_text_parse(mailstream * fd, MMAPString * buffer, 253mailimap_body_type_text_parse(mailstream * fd, MMAPString * buffer,
254 size_t * index, 254 size_t * index,
255 struct mailimap_body_type_text ** 255 struct mailimap_body_type_text **
256 result, 256 result,
257 size_t progr_rate, 257 size_t progr_rate,
258 progress_function * progr_fun); 258 progress_function * progr_fun);
259 259
260 260
261 261
262static int 262static int
263mailimap_capability_parse(mailstream * fd, MMAPString * buffer, 263mailimap_capability_parse(mailstream * fd, MMAPString * buffer,
264 size_t * index, 264 size_t * index,
265 struct mailimap_capability ** result, 265 struct mailimap_capability ** result,
266 size_t progr_rate, 266 size_t progr_rate,
267 progress_function * progr_fun); 267 progress_function * progr_fun);
268 268
269 269
270 270
271static int 271static int
272mailimap_capability_data_parse(mailstream * fd, MMAPString * buffer, 272mailimap_capability_data_parse(mailstream * fd, MMAPString * buffer,
273 size_t * index, 273 size_t * index,
274 struct mailimap_capability_data ** result, 274 struct mailimap_capability_data ** result,
275 size_t progr_rate, 275 size_t progr_rate,
276 progress_function * progr_fun); 276 progress_function * progr_fun);
277 277
278 278
279/* 279/*
280static gboolean mailimap_date_day_parse(mailstream * fd, 280static gboolean mailimap_date_day_parse(mailstream * fd,
281 MMAPString * buffer, 281 MMAPString * buffer,
282 guint32 * index, 282 guint32 * index,
283 gint * result); 283 gint * result);
284*/ 284*/
285static int mailimap_date_day_fixed_parse(mailstream * fd, 285static int mailimap_date_day_fixed_parse(mailstream * fd,
286 MMAPString * buffer, 286 MMAPString * buffer,
287 size_t * index, 287 size_t * index,
288 int * result); 288 int * result);
289 289
290static int mailimap_date_month_parse(mailstream * fd, MMAPString * buffer, 290static int mailimap_date_month_parse(mailstream * fd, MMAPString * buffer,
291 size_t * index, int * result); 291 size_t * index, int * result);
292 292
293/* 293/*
294struct mailimap_date_text { 294struct mailimap_date_text {
295 gint day; 295 gint day;
296 gint month; 296 gint month;
297 gint year; 297 gint year;
298}; 298};
299 299
300static gboolean 300static gboolean
301mailimap_date_text_parse(mailstream * fd, MMAPString * buffer, 301mailimap_date_text_parse(mailstream * fd, MMAPString * buffer,
302 guint32 * index, struct mailimap_date_text ** result); 302 guint32 * index, struct mailimap_date_text ** result);
303static void mailimap_date_text_free(struct mailimap_date_text * date_text); 303static void mailimap_date_text_free(struct mailimap_date_text * date_text);
304*/ 304*/
305 305
306static int mailimap_date_year_parse(mailstream * fd, MMAPString * buffer, 306static int mailimap_date_year_parse(mailstream * fd, MMAPString * buffer,
307 size_t * index, int * result); 307 size_t * index, int * result);
308 308
309static int mailimap_date_time_parse(mailstream * fd, MMAPString * buffer, 309static int mailimap_date_time_parse(mailstream * fd, MMAPString * buffer,
310 size_t * index, 310 size_t * index,
311 struct mailimap_date_time ** t, 311 struct mailimap_date_time ** t,
312 size_t progr_rate, 312 size_t progr_rate,
313 progress_function * progr_fun); 313 progress_function * progr_fun);
314 314
315#ifndef UNSTRICT_SYNTAX 315#ifndef UNSTRICT_SYNTAX
316static int mailimap_digit_nz_parse(mailstream * fd, MMAPString * buffer, 316static int mailimap_digit_nz_parse(mailstream * fd, MMAPString * buffer,
317 size_t * index, int * result); 317 size_t * index, int * result);
318#endif 318#endif
319 319
320 320
321static int mailimap_envelope_parse(mailstream * fd, MMAPString * buffer, 321static int mailimap_envelope_parse(mailstream * fd, MMAPString * buffer,
322 size_t * index, 322 size_t * index,
323 struct mailimap_envelope ** result, 323 struct mailimap_envelope ** result,
324 size_t progr_rate, 324 size_t progr_rate,
325 progress_function * progr_fun); 325 progress_function * progr_fun);
326 326
327 327
328static int 328static int
329mailimap_env_bcc_parse(mailstream * fd, MMAPString * buffer, 329mailimap_env_bcc_parse(mailstream * fd, MMAPString * buffer,
330 size_t * index, struct mailimap_env_bcc ** result, 330 size_t * index, struct mailimap_env_bcc ** result,
331 size_t progr_rate, 331 size_t progr_rate,
332 progress_function * progr_fun); 332 progress_function * progr_fun);
333 333
334 334
335static int 335static int
336mailimap_env_cc_parse(mailstream * fd, MMAPString * buffer, 336mailimap_env_cc_parse(mailstream * fd, MMAPString * buffer,
337 size_t * index, struct mailimap_env_cc ** result, 337 size_t * index, struct mailimap_env_cc ** result,
338 size_t progr_rate, 338 size_t progr_rate,
339 progress_function * progr_fun); 339 progress_function * progr_fun);
340 340
341static int mailimap_env_date_parse(mailstream * fd, MMAPString * buffer, 341static int mailimap_env_date_parse(mailstream * fd, MMAPString * buffer,
342 size_t * index, char ** result, 342 size_t * index, char ** result,
343 size_t progr_rate, 343 size_t progr_rate,
344 progress_function * progr_fun); 344 progress_function * progr_fun);
345 345
346 346
347static int 347static int
348mailimap_env_from_parse(mailstream * fd, MMAPString * buffer, 348mailimap_env_from_parse(mailstream * fd, MMAPString * buffer,
349 size_t * index, struct mailimap_env_from ** result, 349 size_t * index, struct mailimap_env_from ** result,
350 size_t progr_rate, 350 size_t progr_rate,
351 progress_function * progr_fun); 351 progress_function * progr_fun);
352 352
353 353
354static int mailimap_env_in_reply_to_parse(mailstream * fd, 354static int mailimap_env_in_reply_to_parse(mailstream * fd,
355 MMAPString * buffer, 355 MMAPString * buffer,
356 size_t * index, char ** result, 356 size_t * index, char ** result,
357 size_t progr_rate, 357 size_t progr_rate,
358 progress_function * progr_fun); 358 progress_function * progr_fun);
359 359
360static int mailimap_env_message_id_parse(mailstream * fd, 360static int mailimap_env_message_id_parse(mailstream * fd,
361 MMAPString * buffer, 361 MMAPString * buffer,
362 size_t * index, char ** result, 362 size_t * index, char ** result,
363 size_t progr_rate, 363 size_t progr_rate,
364 progress_function * progr_fun); 364 progress_function * progr_fun);
365 365
366static int 366static int
367mailimap_env_reply_to_parse(mailstream * fd, MMAPString * buffer, 367mailimap_env_reply_to_parse(mailstream * fd, MMAPString * buffer,
368 size_t * index, 368 size_t * index,
369 struct mailimap_env_reply_to ** result, 369 struct mailimap_env_reply_to ** result,
370 size_t progr_rate, 370 size_t progr_rate,
371 progress_function * progr_fun); 371 progress_function * progr_fun);
372 372
373 373
374 374
375static int 375static int
376mailimap_env_sender_parse(mailstream * fd, MMAPString * buffer, 376mailimap_env_sender_parse(mailstream * fd, MMAPString * buffer,
377 size_t * index, struct mailimap_env_sender ** result, 377 size_t * index, struct mailimap_env_sender ** result,
378 size_t progr_rate, 378 size_t progr_rate,
379 progress_function * progr_fun); 379 progress_function * progr_fun);
380 380
381static int mailimap_env_subject_parse(mailstream * fd, MMAPString * buffer, 381static int mailimap_env_subject_parse(mailstream * fd, MMAPString * buffer,
382 size_t * index, char ** result, 382 size_t * index, char ** result,
383 size_t progr_rate, 383 size_t progr_rate,
384 progress_function * progr_fun); 384 progress_function * progr_fun);
385 385
386 386
387static int 387static int
388mailimap_env_to_parse(mailstream * fd, MMAPString * buffer, 388mailimap_env_to_parse(mailstream * fd, MMAPString * buffer,
389 size_t * index, 389 size_t * index,
390 struct mailimap_env_to ** result, 390 struct mailimap_env_to ** result,
391 size_t progr_rate, 391 size_t progr_rate,
392 progress_function * progr_fun); 392 progress_function * progr_fun);
393 393
394 394
395static int mailimap_flag_parse(mailstream * fd, MMAPString * buffer, 395static int mailimap_flag_parse(mailstream * fd, MMAPString * buffer,
396 size_t * index, 396 size_t * index,
397 struct mailimap_flag ** result, 397 struct mailimap_flag ** result,
398 size_t progr_rate, 398 size_t progr_rate,
399 progress_function * progr_fun); 399 progress_function * progr_fun);
400 400
401static int mailimap_flag_extension_parse(mailstream * fd, 401static int mailimap_flag_extension_parse(mailstream * fd,
402 MMAPString * buffer, 402 MMAPString * buffer,
403 size_t * index, 403 size_t * index,
404 char ** result, 404 char ** result,
405 size_t progr_rate, 405 size_t progr_rate,
406 progress_function * progr_fun); 406 progress_function * progr_fun);
407 407
408 408
409 409
410 410
411static int 411static int
412mailimap_flag_fetch_parse(mailstream * fd, MMAPString * buffer, 412mailimap_flag_fetch_parse(mailstream * fd, MMAPString * buffer,
413 size_t * index, 413 size_t * index,
414 struct mailimap_flag_fetch ** result, 414 struct mailimap_flag_fetch ** result,
415 size_t progr_rate, 415 size_t progr_rate,
416 progress_function * progr_fun); 416 progress_function * progr_fun);
417 417
418 418
419 419
420static int 420static int
421mailimap_flag_perm_parse(mailstream * fd, MMAPString * buffer, 421mailimap_flag_perm_parse(mailstream * fd, MMAPString * buffer,
422 size_t * index, 422 size_t * index,
423 struct mailimap_flag_perm ** result, 423 struct mailimap_flag_perm ** result,
424 size_t progr_rate, 424 size_t progr_rate,
425 progress_function * progr_fun); 425 progress_function * progr_fun);
426 426
427 427
428static int mailimap_flag_keyword_parse(mailstream * fd, MMAPString * buffer, 428static int mailimap_flag_keyword_parse(mailstream * fd, MMAPString * buffer,
429 size_t * index, 429 size_t * index,
430 char ** result, 430 char ** result,
431 size_t progr_rate, 431 size_t progr_rate,
432 progress_function * progr_fun); 432 progress_function * progr_fun);
433 433
434 434
435static int mailimap_flag_list_parse(mailstream * fd, MMAPString * buffer, 435static int mailimap_flag_list_parse(mailstream * fd, MMAPString * buffer,
436 size_t * index, 436 size_t * index,
437 struct mailimap_flag_list ** result, 437 struct mailimap_flag_list ** result,
438 size_t progr_rate, 438 size_t progr_rate,
439 progress_function * progr_fun); 439 progress_function * progr_fun);
440 440
441 441
442static int 442static int
443mailimap_header_fld_name_parse(mailstream * fd, 443mailimap_header_fld_name_parse(mailstream * fd,
444 MMAPString * buffer, 444 MMAPString * buffer,
445 size_t * index, 445 size_t * index,
446 char ** result, 446 char ** result,
447 size_t progr_rate, 447 size_t progr_rate,
448 progress_function * progr_fun); 448 progress_function * progr_fun);
449 449
450 450
451 451
452 452
453static int 453static int
454mailimap_header_list_parse(mailstream * fd, MMAPString * buffer, 454mailimap_header_list_parse(mailstream * fd, MMAPString * buffer,
455 size_t * index, 455 size_t * index,
456 struct mailimap_header_list ** result, 456 struct mailimap_header_list ** result,
457 size_t progr_rate, 457 size_t progr_rate,
458 progress_function * progr_fun); 458 progress_function * progr_fun);
459 459
460static int mailimap_literal_parse(mailstream * fd, MMAPString * buffer, 460static int mailimap_literal_parse(mailstream * fd, MMAPString * buffer,
461 size_t * index, char ** result, 461 size_t * index, char ** result,
462 size_t * result_len, 462 size_t * result_len,
463 size_t progr_rate, 463 size_t progr_rate,
464 progress_function * progr_fun); 464 progress_function * progr_fun);
465 465
466 466
467static int 467static int
468mailimap_mailbox_parse(mailstream * fd, MMAPString * buffer, 468mailimap_mailbox_parse(mailstream * fd, MMAPString * buffer,
469 size_t * index, char ** result, 469 size_t * index, char ** result,
470 size_t progr_rate, 470 size_t progr_rate,
471 progress_function * progr_fun); 471 progress_function * progr_fun);
472 472
473 473
474 474
475 475
476static int 476static int
477mailimap_mailbox_data_parse(mailstream * fd, MMAPString * buffer, 477mailimap_mailbox_data_parse(mailstream * fd, MMAPString * buffer,
478 size_t * index, 478 size_t * index,
479 struct mailimap_mailbox_data ** result, 479 struct mailimap_mailbox_data ** result,
480 size_t progr_rate, 480 size_t progr_rate,
481 progress_function * progr_fun); 481 progress_function * progr_fun);
482 482
483 483
484static int 484static int
485mailimap_mbx_list_flags_parse(mailstream * fd, MMAPString * buffer, 485mailimap_mbx_list_flags_parse(mailstream * fd, MMAPString * buffer,
486 size_t * index, 486 size_t * index,
487 struct mailimap_mbx_list_flags ** result, 487 struct mailimap_mbx_list_flags ** result,
488 size_t progr_rate, 488 size_t progr_rate,
489 progress_function * progr_fun); 489 progress_function * progr_fun);
490 490
491 491
492static int 492static int
493mailimap_mbx_list_oflag_parse(mailstream * fd, MMAPString * buffer, 493mailimap_mbx_list_oflag_parse(mailstream * fd, MMAPString * buffer,
494 size_t * index, 494 size_t * index,
495 struct mailimap_mbx_list_oflag ** result, 495 struct mailimap_mbx_list_oflag ** result,
496 size_t progr_rate, 496 size_t progr_rate,
497 progress_function * progr_fun); 497 progress_function * progr_fun);
498 498
499static int 499static int
500mailimap_mbx_list_oflag_no_sflag_parse(mailstream * fd, MMAPString * buffer, 500mailimap_mbx_list_oflag_no_sflag_parse(mailstream * fd, MMAPString * buffer,
501 size_t * index, 501 size_t * index,
502 struct mailimap_mbx_list_oflag ** result, 502 struct mailimap_mbx_list_oflag ** result,
503 size_t progr_rate, 503 size_t progr_rate,
504 progress_function * progr_fun); 504 progress_function * progr_fun);
505 505
506static int 506static int
507mailimap_mbx_list_sflag_parse(mailstream * fd, MMAPString * buffer, 507mailimap_mbx_list_sflag_parse(mailstream * fd, MMAPString * buffer,
508 size_t * index, 508 size_t * index,
509 int * result); 509 int * result);
510 510
511 511
512static int 512static int
513mailimap_mailbox_list_parse(mailstream * fd, MMAPString * buffer, 513mailimap_mailbox_list_parse(mailstream * fd, MMAPString * buffer,
514 size_t * index, 514 size_t * index,
515 struct mailimap_mailbox_list ** result, 515 struct mailimap_mailbox_list ** result,
516 size_t progr_rate, 516 size_t progr_rate,
517 progress_function * progr_fun); 517 progress_function * progr_fun);
518 518
519 519
520 520
521static int 521static int
522mailimap_media_basic_parse(mailstream * fd, MMAPString * buffer, 522mailimap_media_basic_parse(mailstream * fd, MMAPString * buffer,
523 size_t * index, 523 size_t * index,
524 struct mailimap_media_basic ** result, 524 struct mailimap_media_basic ** result,
525 size_t progr_rate, 525 size_t progr_rate,
526 progress_function * progr_fun); 526 progress_function * progr_fun);
527 527
528static int 528static int
529mailimap_media_message_parse(mailstream * fd, MMAPString * buffer, 529mailimap_media_message_parse(mailstream * fd, MMAPString * buffer,
530 size_t * index); 530 size_t * index);
531 531
532static int 532static int
533mailimap_media_subtype_parse(mailstream * fd, MMAPString * buffer, 533mailimap_media_subtype_parse(mailstream * fd, MMAPString * buffer,
534 size_t * index, 534 size_t * index,
535 char ** result, 535 char ** result,
536 size_t progr_rate, 536 size_t progr_rate,
537 progress_function * progr_fun); 537 progress_function * progr_fun);
538 538
539static int mailimap_media_text_parse(mailstream * fd, MMAPString * buffer, 539static int mailimap_media_text_parse(mailstream * fd, MMAPString * buffer,
540 size_t * index, 540 size_t * index,
541 char ** result, 541 char ** result,
542 size_t progr_rate, 542 size_t progr_rate,
543 progress_function * progr_fun); 543 progress_function * progr_fun);
544 544
545 545
546 546
547static int 547static int
548mailimap_message_data_parse(mailstream * fd, MMAPString * buffer, 548mailimap_message_data_parse(mailstream * fd, MMAPString * buffer,
549 size_t * index, 549 size_t * index,
550 struct mailimap_message_data ** result, 550 struct mailimap_message_data ** result,
551 size_t progr_rate, 551 size_t progr_rate,
552 progress_function * progr_fun); 552 progress_function * progr_fun);
553 553
554 554
555 555
556 556
557 557
558static int 558static int
559mailimap_msg_att_parse(mailstream * fd, MMAPString * buffer, 559mailimap_msg_att_parse(mailstream * fd, MMAPString * buffer,
560 size_t * index, struct mailimap_msg_att ** result, 560 size_t * index, struct mailimap_msg_att ** result,
561 size_t progr_rate, 561 size_t progr_rate,
562 progress_function * progr_fun); 562 progress_function * progr_fun);
563 563
564 564
565 565
566static int 566static int
567mailimap_msg_att_dynamic_parse(mailstream * fd, MMAPString * buffer, 567mailimap_msg_att_dynamic_parse(mailstream * fd, MMAPString * buffer,
568 size_t * index, 568 size_t * index,
569 struct mailimap_msg_att_dynamic ** result, 569 struct mailimap_msg_att_dynamic ** result,
570 size_t progr_rate, 570 size_t progr_rate,
571 progress_function * progr_fun); 571 progress_function * progr_fun);
572 572
573 573
574static int 574static int
575mailimap_msg_att_static_parse(mailstream * fd, MMAPString * buffer, 575mailimap_msg_att_static_parse(mailstream * fd, MMAPString * buffer,
576 size_t * index, 576 size_t * index,
577 struct mailimap_msg_att_static ** result, 577 struct mailimap_msg_att_static ** result,
578 size_t progr_rate, 578 size_t progr_rate,
579 progress_function * progr_fun); 579 progress_function * progr_fun);
580 580
581static int mailimap_nil_parse(mailstream * fd, MMAPString * buffer, 581static int mailimap_nil_parse(mailstream * fd, MMAPString * buffer,
582 size_t * index); 582 size_t * index);
583 583
584static int mailimap_nstring_parse(mailstream * fd, MMAPString * buffer, 584static int mailimap_nstring_parse(mailstream * fd, MMAPString * buffer,
585 size_t * index, char ** result, 585 size_t * index, char ** result,
586 size_t * result_len, 586 size_t * result_len,
587 size_t progr_rate, 587 size_t progr_rate,
588 progress_function * progr_fun); 588 progress_function * progr_fun);
589 589
590static int 590static int
591mailimap_number_parse(mailstream * fd, MMAPString * buffer, 591mailimap_number_parse(mailstream * fd, MMAPString * buffer,
592 size_t * index, uint32_t * result); 592 size_t * index, uint32_t * result);
593 593
594static int 594static int
595mailimap_nz_number_parse(mailstream * fd, MMAPString * buffer, 595mailimap_nz_number_parse(mailstream * fd, MMAPString * buffer,
596 size_t * index, uint32_t * result); 596 size_t * index, uint32_t * result);
597 597
598 598
599static int 599static int
600mailimap_quoted_parse(mailstream * fd, MMAPString * buffer, 600mailimap_quoted_parse(mailstream * fd, MMAPString * buffer,
601 size_t * index, char ** result, 601 size_t * index, char ** result,
602 size_t progr_rate, 602 size_t progr_rate,
603 progress_function * progr_fun); 603 progress_function * progr_fun);
604 604
605static int 605static int
606mailimap_quoted_char_parse(mailstream * fd, MMAPString * buffer, 606mailimap_quoted_char_parse(mailstream * fd, MMAPString * buffer,
607 size_t * index, char * result); 607 size_t * index, char * result);
608 608
609 609
610static int 610static int
611mailimap_quoted_specials_parse(mailstream * fd, MMAPString * buffer, 611mailimap_quoted_specials_parse(mailstream * fd, MMAPString * buffer,
612 size_t * index, char * result); 612 size_t * index, char * result);
613 613
614 614
615 615
616 616
617 617
618static int 618static int
619mailimap_response_data_parse(mailstream * fd, MMAPString * buffer, 619mailimap_response_data_parse(mailstream * fd, MMAPString * buffer,
620 size_t * index, 620 size_t * index,
621 struct mailimap_response_data ** result, 621 struct mailimap_response_data ** result,
622 size_t progr_rate, 622 size_t progr_rate,
623 progress_function * progr_fun); 623 progress_function * progr_fun);
624 624
625 625
626 626
627 627
628static int 628static int
629mailimap_response_done_parse(mailstream * fd, MMAPString * buffer, 629mailimap_response_done_parse(mailstream * fd, MMAPString * buffer,
630 size_t * index, 630 size_t * index,
631 struct mailimap_response_done ** result, 631 struct mailimap_response_done ** result,
632 size_t progr_rate, 632 size_t progr_rate,
633 progress_function * progr_fun); 633 progress_function * progr_fun);
634 634
635static int 635static int
636mailimap_response_fatal_parse(mailstream * fd, MMAPString * buffer, 636mailimap_response_fatal_parse(mailstream * fd, MMAPString * buffer,
637 size_t * index, 637 size_t * index,
638 struct mailimap_response_fatal ** result, 638 struct mailimap_response_fatal ** result,
639 size_t progr_rate, 639 size_t progr_rate,
640 progress_function * progr_fun); 640 progress_function * progr_fun);
641 641
642 642
643static int 643static int
644mailimap_response_tagged_parse(mailstream * fd, MMAPString * buffer, 644mailimap_response_tagged_parse(mailstream * fd, MMAPString * buffer,
645 size_t * index, 645 size_t * index,
646 struct mailimap_response_tagged ** result, 646 struct mailimap_response_tagged ** result,
647 size_t progr_rate, 647 size_t progr_rate,
648 progress_function * progr_fun); 648 progress_function * progr_fun);
649 649
650 650
651static int 651static int
652mailimap_resp_cond_auth_parse(mailstream * fd, MMAPString * buffer, 652mailimap_resp_cond_auth_parse(mailstream * fd, MMAPString * buffer,
653 size_t * index, 653 size_t * index,
654 struct mailimap_resp_cond_auth ** result, 654 struct mailimap_resp_cond_auth ** result,
655 size_t progr_rate, 655 size_t progr_rate,
656 progress_function * progr_fun); 656 progress_function * progr_fun);
657 657
658static int 658static int
659mailimap_resp_cond_bye_parse(mailstream * fd, MMAPString * buffer, 659mailimap_resp_cond_bye_parse(mailstream * fd, MMAPString * buffer,
660 size_t * index, 660 size_t * index,
661 struct mailimap_resp_cond_bye ** result, 661 struct mailimap_resp_cond_bye ** result,
662 size_t progr_rate, 662 size_t progr_rate,
663 progress_function * progr_fun); 663 progress_function * progr_fun);
664 664
665 665
666static int 666static int
667mailimap_resp_cond_state_parse(mailstream * fd, MMAPString * buffer, 667mailimap_resp_cond_state_parse(mailstream * fd, MMAPString * buffer,
668 size_t * index, 668 size_t * index,
669 struct mailimap_resp_cond_state ** result, 669 struct mailimap_resp_cond_state ** result,
670 size_t progr_rate, 670 size_t progr_rate,
671 progress_function * progr_fun); 671 progress_function * progr_fun);
672 672
673 673
674static int 674static int
675mailimap_resp_text_parse(mailstream * fd, MMAPString * buffer, 675mailimap_resp_text_parse(mailstream * fd, MMAPString * buffer,
676 size_t * index, 676 size_t * index,
677 struct mailimap_resp_text ** result, 677 struct mailimap_resp_text ** result,
678 size_t progr_rate, 678 size_t progr_rate,
679 progress_function * progr_fun); 679 progress_function * progr_fun);
680 680
681 681
682static int 682static int
683mailimap_resp_text_code_parse(mailstream * fd, MMAPString * buffer, 683mailimap_resp_text_code_parse(mailstream * fd, MMAPString * buffer,
684 size_t * index, 684 size_t * index,
685 struct mailimap_resp_text_code ** result, 685 struct mailimap_resp_text_code ** result,
686 size_t progr_rate, 686 size_t progr_rate,
687 progress_function * progr_fun); 687 progress_function * progr_fun);
688 688
689 689
690static int 690static int
691mailimap_section_parse(mailstream * fd, MMAPString * buffer, 691mailimap_section_parse(mailstream * fd, MMAPString * buffer,
692 size_t * index, 692 size_t * index,
693 struct mailimap_section ** result, 693 struct mailimap_section ** result,
694 size_t progr_rate, 694 size_t progr_rate,
695 progress_function * progr_fun); 695 progress_function * progr_fun);
696 696
697 697
698static int 698static int
699mailimap_section_msgtext_parse(mailstream * fd, MMAPString * buffer, 699mailimap_section_msgtext_parse(mailstream * fd, MMAPString * buffer,
700 size_t * index, 700 size_t * index,
701 struct mailimap_section_msgtext ** result, 701 struct mailimap_section_msgtext ** result,
702 size_t progr_rate, 702 size_t progr_rate,
703 progress_function * progr_fun); 703 progress_function * progr_fun);
704 704
705 705
706static int 706static int
707mailimap_section_part_parse(mailstream * fd, MMAPString * buffer, 707mailimap_section_part_parse(mailstream * fd, MMAPString * buffer,
708 size_t * index, 708 size_t * index,
709 struct mailimap_section_part ** result, 709 struct mailimap_section_part ** result,
710 size_t progr_rate, 710 size_t progr_rate,
711 progress_function * progr_fun); 711 progress_function * progr_fun);
712 712
713 713
714 714
715 715
716static int 716static int
717mailimap_section_spec_parse(mailstream * fd, MMAPString * buffer, 717mailimap_section_spec_parse(mailstream * fd, MMAPString * buffer,
718 size_t * index, 718 size_t * index,
719 struct mailimap_section_spec ** result, 719 struct mailimap_section_spec ** result,
720 size_t progr_rate, 720 size_t progr_rate,
721 progress_function * progr_fun); 721 progress_function * progr_fun);
722 722
723 723
724static int 724static int
725mailimap_section_text_parse(mailstream * fd, MMAPString * buffer, 725mailimap_section_text_parse(mailstream * fd, MMAPString * buffer,
726 size_t * index, 726 size_t * index,
727 struct mailimap_section_text ** result, 727 struct mailimap_section_text ** result,
728 size_t progr_rate, 728 size_t progr_rate,
729 progress_function * progr_fun); 729 progress_function * progr_fun);
730 730
731 731
732static int mailimap_status_att_parse(mailstream * fd, MMAPString * buffer, 732static int mailimap_status_att_parse(mailstream * fd, MMAPString * buffer,
733 size_t * index, int * result); 733 size_t * index, int * result);
734 734
735static int 735static int
736mailimap_string_parse(mailstream * fd, MMAPString * buffer, 736mailimap_string_parse(mailstream * fd, MMAPString * buffer,
737 size_t * index, char ** result, 737 size_t * index, char ** result,
738 size_t * result_len, 738 size_t * result_len,
739 size_t progr_rate, 739 size_t progr_rate,
740 progress_function * progr_fun); 740 progress_function * progr_fun);
741 741
742static int mailimap_tag_parse(mailstream * fd, MMAPString * buffer, 742static int mailimap_tag_parse(mailstream * fd, MMAPString * buffer,
743 size_t * index, char ** result, 743 size_t * index, char ** result,
744 size_t progr_rate, 744 size_t progr_rate,
745 progress_function * progr_fun); 745 progress_function * progr_fun);
746 746
747static int mailimap_text_parse(mailstream * fd, MMAPString * buffer, 747static int mailimap_text_parse(mailstream * fd, MMAPString * buffer,
748 size_t * index, char ** result, 748 size_t * index, char ** result,
749 size_t progr_rate, 749 size_t progr_rate,
750 progress_function * progr_fun); 750 progress_function * progr_fun);
751 751
752static int mailimap_time_parse(mailstream * fd, MMAPString * buffer, 752static int mailimap_time_parse(mailstream * fd, MMAPString * buffer,
753 size_t * index, 753 size_t * index,
754 int * phour, int * pmin, int * psec); 754 int * phour, int * pmin, int * psec);
755 755
756static int mailimap_uniqueid_parse(mailstream * fd, MMAPString * buffer, 756static int mailimap_uniqueid_parse(mailstream * fd, MMAPString * buffer,
757 size_t * index, uint32_t * result); 757 size_t * index, uint32_t * result);
758 758
759static int mailimap_zone_parse(mailstream * fd, MMAPString * buffer, 759static int mailimap_zone_parse(mailstream * fd, MMAPString * buffer,
760 size_t * index, int * result); 760 size_t * index, int * result);
761 761
762 762
763 763
764/* ************************************************************************* */ 764/* ************************************************************************* */
765/* ************************************************************************* */ 765/* ************************************************************************* */
766/* ************************************************************************* */ 766/* ************************************************************************* */
767/* ************************************************************************* */ 767/* ************************************************************************* */
768/* ************************************************************************* */ 768/* ************************************************************************* */
769/* ************************************************************************* */ 769/* ************************************************************************* */
770 770
771 771
772 772
773 773
774 774
775/* ******************** TOOLS **************************** */ 775/* ******************** TOOLS **************************** */
776 776
777 777
778static int mailimap_unstrict_char_parse(mailstream * fd, MMAPString * buffer, 778static int mailimap_unstrict_char_parse(mailstream * fd, MMAPString * buffer,
779 size_t * index, char token) 779 size_t * index, char token)
780{ 780{
781 size_t cur_token; 781 size_t cur_token;
782 int r; 782 int r;
783 783
784 cur_token = * index; 784 cur_token = * index;
785 785
786#ifdef UNSTRICT_SYNTAX 786#ifdef UNSTRICT_SYNTAX
787 /* can accept unstrict syntax */ 787 /* can accept unstrict syntax */
788 788
789 mailimap_space_parse(fd, buffer, &cur_token); 789 mailimap_space_parse(fd, buffer, &cur_token);
790 if (token == ' ') { 790 if (token == ' ') {
791 * index = cur_token; 791 * index = cur_token;
792 return MAILIMAP_NO_ERROR; 792 return MAILIMAP_NO_ERROR;
793 } 793 }
794#endif 794#endif
795 795
796 r = mailimap_char_parse(fd, buffer, &cur_token, token); 796 r = mailimap_char_parse(fd, buffer, &cur_token, token);
797 if (r != MAILIMAP_NO_ERROR) 797 if (r != MAILIMAP_NO_ERROR)
798 return r; 798 return r;
799 799
800 * index = cur_token; 800 * index = cur_token;
801 801
802 return MAILIMAP_NO_ERROR; 802 return MAILIMAP_NO_ERROR;
803} 803}
804 804
805static int mailimap_oparenth_parse(mailstream * fd, MMAPString * buffer, 805static int mailimap_oparenth_parse(mailstream * fd, MMAPString * buffer,
806 size_t * index) 806 size_t * index)
807{ 807{
808 return mailimap_unstrict_char_parse(fd, buffer, index, '('); 808 return mailimap_unstrict_char_parse(fd, buffer, index, '(');
809} 809}
810 810
811static int mailimap_cparenth_parse(mailstream * fd, MMAPString * buffer, 811static int mailimap_cparenth_parse(mailstream * fd, MMAPString * buffer,
812 size_t * index) 812 size_t * index)
813{ 813{
814 return mailimap_unstrict_char_parse(fd, buffer, index, ')'); 814 return mailimap_unstrict_char_parse(fd, buffer, index, ')');
815} 815}
816 816
817static int mailimap_oaccolade_parse(mailstream * fd, MMAPString * buffer, 817static int mailimap_oaccolade_parse(mailstream * fd, MMAPString * buffer,
818 size_t * index) 818 size_t * index)
819{ 819{
820 return mailimap_unstrict_char_parse(fd, buffer, index, '{'); 820 return mailimap_unstrict_char_parse(fd, buffer, index, '{');
821} 821}
822 822
823static int mailimap_caccolade_parse(mailstream * fd, MMAPString * buffer, 823static int mailimap_caccolade_parse(mailstream * fd, MMAPString * buffer,
824 size_t * index) 824 size_t * index)
825{ 825{
826 return mailimap_unstrict_char_parse(fd, buffer, index, '}'); 826 return mailimap_unstrict_char_parse(fd, buffer, index, '}');
827} 827}
828 828
829static int mailimap_plus_parse(mailstream * fd, MMAPString * buffer, 829static int mailimap_plus_parse(mailstream * fd, MMAPString * buffer,
830 size_t * index) 830 size_t * index)
831{ 831{
832 return mailimap_unstrict_char_parse(fd, buffer, index, '+'); 832 return mailimap_unstrict_char_parse(fd, buffer, index, '+');
833} 833}
834 834
835static int mailimap_minus_parse(mailstream * fd, MMAPString * buffer, 835static int mailimap_minus_parse(mailstream * fd, MMAPString * buffer,
836 size_t * index) 836 size_t * index)
837{ 837{
838 return mailimap_unstrict_char_parse(fd, buffer, index, '-'); 838 return mailimap_unstrict_char_parse(fd, buffer, index, '-');
839} 839}
840 840
841static int mailimap_star_parse(mailstream * fd, MMAPString * buffer, 841static int mailimap_star_parse(mailstream * fd, MMAPString * buffer,
842 size_t * index) 842 size_t * index)
843{ 843{
844 return mailimap_unstrict_char_parse(fd, buffer, index, '*'); 844 return mailimap_unstrict_char_parse(fd, buffer, index, '*');
845} 845}
846 846
847static int mailimap_dot_parse(mailstream * fd, MMAPString * buffer, 847static int mailimap_dot_parse(mailstream * fd, MMAPString * buffer,
848 size_t * index) 848 size_t * index)
849{ 849{
850 return mailimap_unstrict_char_parse(fd, buffer, index, '.'); 850 return mailimap_unstrict_char_parse(fd, buffer, index, '.');
851} 851}
852 852
853static int mailimap_colon_parse(mailstream * fd, MMAPString * buffer, 853static int mailimap_colon_parse(mailstream * fd, MMAPString * buffer,
854 size_t * index) 854 size_t * index)
855{ 855{
856 return mailimap_unstrict_char_parse(fd, buffer, index, ':'); 856 return mailimap_unstrict_char_parse(fd, buffer, index, ':');
857} 857}
858 858
859static int mailimap_lower_parse(mailstream * fd, MMAPString * buffer, 859static int mailimap_lower_parse(mailstream * fd, MMAPString * buffer,
860 size_t * index) 860 size_t * index)
861{ 861{
862 return mailimap_unstrict_char_parse(fd, buffer, index, '<'); 862 return mailimap_unstrict_char_parse(fd, buffer, index, '<');
863} 863}
864 864
865static int mailimap_greater_parse(mailstream * fd, MMAPString * buffer, 865static int mailimap_greater_parse(mailstream * fd, MMAPString * buffer,
866 size_t * index) 866 size_t * index)
867{ 867{
868 return mailimap_unstrict_char_parse(fd, buffer, index, '>'); 868 return mailimap_unstrict_char_parse(fd, buffer, index, '>');
869} 869}
870 870
871static int mailimap_obracket_parse(mailstream * fd, MMAPString * buffer, 871static int mailimap_obracket_parse(mailstream * fd, MMAPString * buffer,
872 size_t * index) 872 size_t * index)
873{ 873{
874 return mailimap_unstrict_char_parse(fd, buffer, index, '['); 874 return mailimap_unstrict_char_parse(fd, buffer, index, '[');
875} 875}
876 876
877static int mailimap_cbracket_parse(mailstream * fd, MMAPString * buffer, 877static int mailimap_cbracket_parse(mailstream * fd, MMAPString * buffer,
878 size_t * index) 878 size_t * index)
879{ 879{
880 return mailimap_unstrict_char_parse(fd, buffer, index, ']'); 880 return mailimap_unstrict_char_parse(fd, buffer, index, ']');
881} 881}
882 882
883static int mailimap_dquote_parse(mailstream * fd, MMAPString * buffer, 883static int mailimap_dquote_parse(mailstream * fd, MMAPString * buffer,
884 size_t * index) 884 size_t * index)
885{ 885{
886 return mailimap_char_parse(fd, buffer, index, '\"'); 886 return mailimap_char_parse(fd, buffer, index, '\"');
887} 887}
888 888
889static int mailimap_crlf_parse(mailstream * fd, MMAPString * buffer, 889static int mailimap_crlf_parse(mailstream * fd, MMAPString * buffer,
890 size_t * index) 890 size_t * index)
891{ 891{
892 size_t cur_token = * index; 892 size_t cur_token = * index;
893 893
894#ifdef UNSTRICT_SYNTAX 894#ifdef UNSTRICT_SYNTAX
895 mailimap_space_parse(fd, buffer, &cur_token); 895 mailimap_space_parse(fd, buffer, &cur_token);
896#endif 896#endif
897 897
898 if (mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, "\r\n")) { 898 if (mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, "\r\n")) {
899 * index = cur_token; 899 * index = cur_token;
900 return MAILIMAP_NO_ERROR; 900 return MAILIMAP_NO_ERROR;
901 } 901 }
902 902
903#ifdef UNSTRICT_SYNTAX 903#ifdef UNSTRICT_SYNTAX
904 else if (mailimap_unstrict_char_parse(fd, buffer, &cur_token, '\n')) { 904 else if (mailimap_unstrict_char_parse(fd, buffer, &cur_token, '\n')) {
905 * index = cur_token; 905 * index = cur_token;
906 return MAILIMAP_NO_ERROR; 906 return MAILIMAP_NO_ERROR;
907 } 907 }
908#endif 908#endif
909 909
910 else 910 else
911 return MAILIMAP_ERROR_PARSE; 911 return MAILIMAP_ERROR_PARSE;
912} 912}
913 913
914typedef int mailimap_struct_parser(mailstream * fd, MMAPString * buffer, 914typedef int mailimap_struct_parser(mailstream * fd, MMAPString * buffer,
915 size_t * index, void * result, 915 size_t * index, void * result,
916 size_t progr_rate, 916 size_t progr_rate,
917 progress_function * progr_fun); 917 progress_function * progr_fun);
918typedef int mailimap_struct_destructor(void * result); 918typedef int mailimap_struct_destructor(void * result);
919 919
920 920
921static int 921static int
922mailimap_struct_multiple_parse(mailstream * fd, MMAPString * buffer, 922mailimap_struct_multiple_parse(mailstream * fd, MMAPString * buffer,
923 size_t * index, clist ** result, 923 size_t * index, clist ** result,
924 mailimap_struct_parser * parser, 924 mailimap_struct_parser * parser,
925 mailimap_struct_destructor * destructor, 925 mailimap_struct_destructor * destructor,
926 size_t progr_rate, 926 size_t progr_rate,
927 progress_function * progr_fun) 927 progress_function * progr_fun)
928{ 928{
929 clist * struct_list; 929 clist * struct_list;
930 size_t cur_token; 930 size_t cur_token;
931 void * value; 931 void * value;
932 int r; 932 int r;
933 int res; 933 int res;
934 934
935 cur_token = * index; 935 cur_token = * index;
936 936
937 r = parser(fd, buffer, &cur_token, &value, progr_rate, progr_fun); 937 r = parser(fd, buffer, &cur_token, &value, progr_rate, progr_fun);
938 if (r != MAILIMAP_NO_ERROR) { 938 if (r != MAILIMAP_NO_ERROR) {
939 res = r; 939 res = r;
940 goto err; 940 goto err;
941 } 941 }
942 942
943 struct_list = clist_new(); 943 struct_list = clist_new();
944 if (struct_list == NULL) { 944 if (struct_list == NULL) {
945 destructor(value); 945 destructor(value);
946 res = MAILIMAP_ERROR_MEMORY; 946 res = MAILIMAP_ERROR_MEMORY;
947 goto err; 947 goto err;
948 } 948 }
949 949
950 r = clist_append(struct_list, value); 950 r = clist_append(struct_list, value);
951 if (r < 0) { 951 if (r < 0) {
952 destructor(value); 952 destructor(value);
953 res = MAILIMAP_ERROR_MEMORY; 953 res = MAILIMAP_ERROR_MEMORY;
954 goto free_list; 954 goto free_list;
955 } 955 }
956 956
957 while (1) { 957 while (1) {
958 r = parser(fd, buffer, &cur_token, &value, progr_rate, progr_fun); 958 r = parser(fd, buffer, &cur_token, &value, progr_rate, progr_fun);
959 if (r == MAILIMAP_ERROR_PARSE) 959 if (r == MAILIMAP_ERROR_PARSE)
960 break; 960 break;
961 if (r != MAILIMAP_NO_ERROR) { 961 if (r != MAILIMAP_NO_ERROR) {
962 res = r; 962 res = r;
963 goto free_list; 963 goto free_list;
964 } 964 }
965 965
966 r = clist_append(struct_list, value); 966 r = clist_append(struct_list, value);
967 if (r < 0) { 967 if (r < 0) {
968 destructor(value); 968 destructor(value);
969 res = MAILIMAP_ERROR_MEMORY; 969 res = MAILIMAP_ERROR_MEMORY;
970 goto free_list; 970 goto free_list;
971 } 971 }
972 } 972 }
973 973
974 * result = struct_list; 974 * result = struct_list;
975 * index = cur_token; 975 * index = cur_token;
976 976
977 return MAILIMAP_NO_ERROR; 977 return MAILIMAP_NO_ERROR;
978 978
979 free_list: 979 free_list:
980 clist_foreach(struct_list, (clist_func) destructor, NULL); 980 clist_foreach(struct_list, (clist_func) destructor, NULL);
981 clist_free(struct_list); 981 clist_free(struct_list);
982 err: 982 err:
983 return res; 983 return res;
984} 984}
985 985
986static int 986static int
987mailimap_struct_list_parse(mailstream * fd, MMAPString * buffer, 987mailimap_struct_list_parse(mailstream * fd, MMAPString * buffer,
988 size_t * index, clist ** result, 988 size_t * index, clist ** result,
989 char symbol, 989 char symbol,
990 mailimap_struct_parser * parser, 990 mailimap_struct_parser * parser,
991 mailimap_struct_destructor * destructor, 991 mailimap_struct_destructor * destructor,
992 size_t progr_rate, 992 size_t progr_rate,
993 progress_function * progr_fun) 993 progress_function * progr_fun)
994{ 994{
995 clist * struct_list; 995 clist * struct_list;
996 size_t cur_token; 996 size_t cur_token;
997 void * value; 997 void * value;
998 size_t final_token; 998 size_t final_token;
999 int r; 999 int r;
1000 int res; 1000 int res;
1001 1001
1002 cur_token = * index; 1002 cur_token = * index;
1003 struct_list = NULL; 1003 struct_list = NULL;
1004 1004
1005 r = parser(fd, buffer, &cur_token, &value, progr_rate, progr_fun); 1005 r = parser(fd, buffer, &cur_token, &value, progr_rate, progr_fun);
1006 if (r != MAILIMAP_NO_ERROR) { 1006 if (r != MAILIMAP_NO_ERROR) {
1007 res = r; 1007 res = r;
1008 goto err; 1008 goto err;
1009 } 1009 }
1010 1010
1011 struct_list = clist_new(); 1011 struct_list = clist_new();
1012 if (struct_list == NULL) { 1012 if (struct_list == NULL) {
1013 destructor(value); 1013 destructor(value);
1014 res = MAILIMAP_ERROR_MEMORY; 1014 res = MAILIMAP_ERROR_MEMORY;
1015 goto err; 1015 goto err;
1016 } 1016 }
1017 1017
1018 r = clist_append(struct_list, value); 1018 r = clist_append(struct_list, value);
1019 if (r < 0) { 1019 if (r < 0) {
1020 destructor(value); 1020 destructor(value);
1021 res = MAILIMAP_ERROR_MEMORY; 1021 res = MAILIMAP_ERROR_MEMORY;
1022 goto free_list; 1022 goto free_list;
1023 } 1023 }
1024 1024
1025 final_token = cur_token; 1025 final_token = cur_token;
1026 1026
1027 while (1) { 1027 while (1) {
1028 r = mailimap_unstrict_char_parse(fd, buffer, &cur_token, symbol); 1028 r = mailimap_unstrict_char_parse(fd, buffer, &cur_token, symbol);
1029 if (r == MAILIMAP_ERROR_PARSE) 1029 if (r == MAILIMAP_ERROR_PARSE)
1030 break; 1030 break;
1031 if (r != MAILIMAP_NO_ERROR) { 1031 if (r != MAILIMAP_NO_ERROR) {
1032 res = r; 1032 res = r;
1033 goto free_list; 1033 goto free_list;
1034 } 1034 }
1035 1035
1036 r = parser(fd, buffer, &cur_token, &value, progr_rate, progr_fun); 1036 r = parser(fd, buffer, &cur_token, &value, progr_rate, progr_fun);
1037 if (r == MAILIMAP_ERROR_PARSE) 1037 if (r == MAILIMAP_ERROR_PARSE)
1038 break; 1038 break;
1039 1039
1040 if (r != MAILIMAP_NO_ERROR) { 1040 if (r != MAILIMAP_NO_ERROR) {
1041 res = r; 1041 res = r;
1042 goto free_list; 1042 goto free_list;
1043 } 1043 }
1044 1044
1045 r = clist_append(struct_list, value); 1045 r = clist_append(struct_list, value);
1046 if (r < 0) { 1046 if (r < 0) {
1047 destructor(value); 1047 destructor(value);
1048 res = MAILIMAP_ERROR_MEMORY; 1048 res = MAILIMAP_ERROR_MEMORY;
1049 goto free_list; 1049 goto free_list;
1050 } 1050 }
1051 1051
1052 final_token = cur_token; 1052 final_token = cur_token;
1053 } 1053 }
1054 1054
1055 * result = struct_list; 1055 * result = struct_list;
1056 * index = final_token; 1056 * index = final_token;
1057 1057
1058 return MAILIMAP_NO_ERROR; 1058 return MAILIMAP_NO_ERROR;
1059 1059
1060 free_list: 1060 free_list:
1061 clist_foreach(struct_list, (clist_func) destructor, NULL); 1061 clist_foreach(struct_list, (clist_func) destructor, NULL);
1062 clist_free(struct_list); 1062 clist_free(struct_list);
1063 err: 1063 err:
1064 return res; 1064 return res;
1065} 1065}
1066 1066
1067static int 1067static int
1068mailimap_struct_spaced_list_parse(mailstream * fd, MMAPString * buffer, 1068mailimap_struct_spaced_list_parse(mailstream * fd, MMAPString * buffer,
1069 size_t * index, clist ** result, 1069 size_t * index, clist ** result,
1070 mailimap_struct_parser * parser, 1070 mailimap_struct_parser * parser,
1071 mailimap_struct_destructor * destructor, 1071 mailimap_struct_destructor * destructor,
1072 size_t progr_rate, 1072 size_t progr_rate,
1073 progress_function * progr_fun) 1073 progress_function * progr_fun)
1074{ 1074{
1075 return mailimap_struct_list_parse(fd, buffer, index, result, 1075 return mailimap_struct_list_parse(fd, buffer, index, result,
1076 ' ', parser, destructor, 1076 ' ', parser, destructor,
1077 progr_rate, progr_fun); 1077 progr_rate, progr_fun);
1078} 1078}
1079 1079
1080 1080
1081 1081
1082static int 1082static int
1083mailimap_custom_string_parse(mailstream * fd, MMAPString * buffer, 1083mailimap_custom_string_parse(mailstream * fd, MMAPString * buffer,
1084 size_t * index, char ** result, 1084 size_t * index, char ** result,
1085 int (* is_custom_char)(char)) 1085 int (* is_custom_char)(char))
1086{ 1086{
1087 size_t begin; 1087 size_t begin;
1088 size_t end; 1088 size_t end;
1089 char * gstr; 1089 char * gstr;
1090 1090
1091 begin = * index; 1091 begin = * index;
1092 1092
1093#ifdef UNSTRICT_SYNTAX 1093#ifdef UNSTRICT_SYNTAX
1094 mailimap_space_parse(fd, buffer, &begin); 1094 mailimap_space_parse(fd, buffer, &begin);
1095#endif 1095#endif
1096 1096
1097 end = begin; 1097 end = begin;
1098 1098
1099 while (is_custom_char(buffer->str[end])) 1099 while (is_custom_char(buffer->str[end]))
1100 end ++; 1100 end ++;
1101 1101
1102 if (end != begin) { 1102 if (end != begin) {
1103 gstr = malloc(end - begin + 1); 1103 gstr = malloc(end - begin + 1);
1104 if (gstr == NULL) 1104 if (gstr == NULL)
1105 return MAILIMAP_ERROR_MEMORY; 1105 return MAILIMAP_ERROR_MEMORY;
1106 1106
1107 strncpy(gstr, buffer->str + begin, end - begin); 1107 strncpy(gstr, buffer->str + begin, end - begin);
1108 gstr[end - begin] = '\0'; 1108 gstr[end - begin] = '\0';
1109 1109
1110 * index = end; 1110 * index = end;
1111 * result = gstr; 1111 * result = gstr;
1112 return MAILIMAP_NO_ERROR; 1112 return MAILIMAP_NO_ERROR;
1113 } 1113 }
1114 else 1114 else
1115 return MAILIMAP_ERROR_PARSE; 1115 return MAILIMAP_ERROR_PARSE;
1116} 1116}
1117 1117
1118 1118
1119 1119
1120static int 1120static int
1121mailimap_nz_number_alloc_parse(mailstream * fd, MMAPString * buffer, 1121mailimap_nz_number_alloc_parse(mailstream * fd, MMAPString * buffer,
1122 size_t * index, 1122 size_t * index,
1123 uint32_t ** result, 1123 uint32_t ** result,
1124 size_t progr_rate, 1124 size_t progr_rate,
1125 progress_function * progr_fun) 1125 progress_function * progr_fun)
1126{ 1126{
1127 uint32_t number; 1127 uint32_t number;
1128 uint32_t * number_alloc; 1128 uint32_t * number_alloc;
1129 size_t cur_token; 1129 size_t cur_token;
1130 int r; 1130 int r;
1131 1131
1132 cur_token = * index; 1132 cur_token = * index;
1133 1133
1134 r = mailimap_nz_number_parse(fd, buffer, &cur_token, &number); 1134 r = mailimap_nz_number_parse(fd, buffer, &cur_token, &number);
1135 if (r != MAILIMAP_NO_ERROR) 1135 if (r != MAILIMAP_NO_ERROR)
1136 return r; 1136 return r;
1137 1137
1138 number_alloc = mailimap_number_alloc_new(number); 1138 number_alloc = mailimap_number_alloc_new(number);
1139 if (number_alloc == NULL) 1139 if (number_alloc == NULL)
1140 return MAILIMAP_ERROR_MEMORY; 1140 return MAILIMAP_ERROR_MEMORY;
1141 1141
1142 * index = cur_token; 1142 * index = cur_token;
1143 * result = number_alloc; 1143 * result = number_alloc;
1144 1144
1145 return MAILIMAP_NO_ERROR; 1145 return MAILIMAP_NO_ERROR;
1146} 1146}
1147 1147
1148 1148
1149static int is_ctl(char ch) 1149static int is_ctl(char ch)
1150{ 1150{
1151 unsigned char uch = (unsigned char) ch; 1151 unsigned char uch = (unsigned char) ch;
1152 1152
1153 return (uch <= 0x1F); 1153 return (uch <= 0x1F);
1154} 1154}
1155 1155
1156static int is_char(char ch) 1156static int is_char(char ch)
1157{ 1157{
1158#ifdef UNSTRICT_SYNTAX 1158#ifdef UNSTRICT_SYNTAX
1159 return (ch != 0); 1159 return (ch != 0);
1160#else 1160#else
1161 unsigned char uch = ch; 1161 unsigned char uch = ch;
1162 1162
1163 return (uch >= 0x01) && (uch <= 0x7f); 1163 return (uch >= 0x01) && (uch <= 0x7f);
1164#endif 1164#endif
1165} 1165}
1166 1166
1167static int is_alpha(char ch) 1167static int is_alpha(char ch)
1168{ 1168{
1169 return ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && (ch <= 'z'))); 1169 return ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && (ch <= 'z')));
1170} 1170}
1171 1171
1172static int is_digit(char ch) 1172static int is_digit(char ch)
1173{ 1173{
1174 return (ch >= '0') && (ch <= '9'); 1174 return (ch >= '0') && (ch <= '9');
1175} 1175}
1176 1176
1177static int mailimap_digit_parse(mailstream * fd, MMAPString * buffer, 1177static int mailimap_digit_parse(mailstream * fd, MMAPString * buffer,
1178 size_t * index, int * result) 1178 size_t * index, int * result)
1179{ 1179{
1180 size_t cur_token; 1180 size_t cur_token;
1181 1181
1182 cur_token = * index; 1182 cur_token = * index;
1183 1183
1184 if (is_digit(buffer->str[cur_token])) { 1184 if (is_digit(buffer->str[cur_token])) {
1185 * result = buffer->str[cur_token] - '0'; 1185 * result = buffer->str[cur_token] - '0';
1186 cur_token ++; 1186 cur_token ++;
1187 * index = cur_token; 1187 * index = cur_token;
1188 return MAILIMAP_NO_ERROR; 1188 return MAILIMAP_NO_ERROR;
1189 } 1189 }
1190 else 1190 else
1191 return MAILIMAP_ERROR_PARSE; 1191 return MAILIMAP_ERROR_PARSE;
1192} 1192}
1193 1193
1194 1194
1195/* ******************** parser **************************** */ 1195/* ******************** parser **************************** */
1196 1196
1197/* 1197/*
1198 address = "(" addr-name SP addr-adl SP addr-mailbox SP 1198 address = "(" addr-name SP addr-adl SP addr-mailbox SP
1199 addr-host ")" 1199 addr-host ")"
1200*/ 1200*/
1201 1201
1202static int mailimap_address_parse(mailstream * fd, MMAPString * buffer, 1202static int mailimap_address_parse(mailstream * fd, MMAPString * buffer,
1203 size_t * index, 1203 size_t * index,
1204 struct mailimap_address ** result, 1204 struct mailimap_address ** result,
1205 size_t progr_rate, 1205 size_t progr_rate,
1206 progress_function * progr_fun) 1206 progress_function * progr_fun)
1207{ 1207{
1208 size_t cur_token; 1208 size_t cur_token;
1209 char * addr_name; 1209 char * addr_name;
1210 char * addr_adl; 1210 char * addr_adl;
1211 char * addr_mailbox; 1211 char * addr_mailbox;
1212 char * addr_host; 1212 char * addr_host;
1213 struct mailimap_address * addr; 1213 struct mailimap_address * addr;
1214 int r; 1214 int r;
1215 int res; 1215 int res;
1216 1216
1217 cur_token = * index; 1217 cur_token = * index;
1218 1218
1219 addr_name = NULL; 1219 addr_name = NULL;
1220 addr_adl = NULL; 1220 addr_adl = NULL;
1221 addr_mailbox = NULL; 1221 addr_mailbox = NULL;
1222 addr_host = NULL; 1222 addr_host = NULL;
1223 1223
1224 r = mailimap_oparenth_parse(fd, buffer, &cur_token); 1224 r = mailimap_oparenth_parse(fd, buffer, &cur_token);
1225 if (r != MAILIMAP_NO_ERROR) { 1225 if (r != MAILIMAP_NO_ERROR) {
1226 res = r; 1226 res = r;
1227 goto err; 1227 goto err;
1228 } 1228 }
1229 1229
1230 r = mailimap_addr_name_parse(fd, buffer, &cur_token, &addr_name, 1230 r = mailimap_addr_name_parse(fd, buffer, &cur_token, &addr_name,
1231 progr_rate, progr_fun); 1231 progr_rate, progr_fun);
1232 if (r != MAILIMAP_NO_ERROR) { 1232 if (r != MAILIMAP_NO_ERROR) {
1233 res = r; 1233 res = r;
1234 goto err; 1234 goto err;
1235 } 1235 }
1236 1236
1237 r = mailimap_space_parse(fd, buffer, &cur_token); 1237 r = mailimap_space_parse(fd, buffer, &cur_token);
1238 if (r != MAILIMAP_NO_ERROR) { 1238 if (r != MAILIMAP_NO_ERROR) {
1239 res = r; 1239 res = r;
1240 goto addr_name_free; 1240 goto addr_name_free;
1241 } 1241 }
1242 1242
1243 r = mailimap_addr_adl_parse(fd, buffer, &cur_token, &addr_adl, 1243 r = mailimap_addr_adl_parse(fd, buffer, &cur_token, &addr_adl,
1244 progr_rate, progr_fun); 1244 progr_rate, progr_fun);
1245 if (r != MAILIMAP_NO_ERROR) { 1245 if (r != MAILIMAP_NO_ERROR) {
1246 res = r; 1246 res = r;
1247 goto addr_name_free; 1247 goto addr_name_free;
1248 } 1248 }
1249 1249
1250 r = mailimap_space_parse(fd, buffer, &cur_token); 1250 r = mailimap_space_parse(fd, buffer, &cur_token);
1251 if (r != MAILIMAP_NO_ERROR) { 1251 if (r != MAILIMAP_NO_ERROR) {
1252 res = r; 1252 res = r;
1253 goto addr_adl_free; 1253 goto addr_adl_free;
1254 } 1254 }
1255 1255
1256 r = mailimap_addr_mailbox_parse(fd, buffer, &cur_token, &addr_mailbox, 1256 r = mailimap_addr_mailbox_parse(fd, buffer, &cur_token, &addr_mailbox,
1257 progr_rate, progr_fun); 1257 progr_rate, progr_fun);
1258 if (r != MAILIMAP_NO_ERROR) { 1258 if (r != MAILIMAP_NO_ERROR) {
1259 res = r; 1259 res = r;
1260 goto addr_adl_free; 1260 goto addr_adl_free;
1261 } 1261 }
1262 1262
1263 r = mailimap_space_parse(fd, buffer, &cur_token); 1263 r = mailimap_space_parse(fd, buffer, &cur_token);
1264 if (r != MAILIMAP_NO_ERROR) { 1264 if (r != MAILIMAP_NO_ERROR) {
1265 res = r; 1265 res = r;
1266 goto addr_mailbox_free; 1266 goto addr_mailbox_free;
1267 } 1267 }
1268 1268
1269 r = mailimap_addr_host_parse(fd, buffer, &cur_token, &addr_host, 1269 r = mailimap_addr_host_parse(fd, buffer, &cur_token, &addr_host,
1270 progr_rate, progr_fun); 1270 progr_rate, progr_fun);
1271 if (r != MAILIMAP_NO_ERROR) { 1271 if (r != MAILIMAP_NO_ERROR) {
1272 res = r; 1272 res = r;
1273 goto addr_mailbox_free; 1273 goto addr_mailbox_free;
1274 } 1274 }
1275 1275
1276 r = mailimap_cparenth_parse(fd, buffer, &cur_token); 1276 r = mailimap_cparenth_parse(fd, buffer, &cur_token);
1277 if (r != MAILIMAP_NO_ERROR) { 1277 if (r != MAILIMAP_NO_ERROR) {
1278 res = r; 1278 res = r;
1279 goto addr_host_free; 1279 goto addr_host_free;
1280 } 1280 }
1281 1281
1282 addr = mailimap_address_new(addr_name, addr_adl, addr_mailbox, addr_host); 1282 addr = mailimap_address_new(addr_name, addr_adl, addr_mailbox, addr_host);
1283 1283
1284 if (addr == NULL) { 1284 if (addr == NULL) {
1285 res = MAILIMAP_ERROR_MEMORY; 1285 res = MAILIMAP_ERROR_MEMORY;
1286 goto addr_host_free; 1286 goto addr_host_free;
1287 } 1287 }
1288 1288
1289 * result = addr; 1289 * result = addr;
1290 * index = cur_token; 1290 * index = cur_token;
1291 1291
1292 return MAILIMAP_NO_ERROR; 1292 return MAILIMAP_NO_ERROR;
1293 1293
1294 addr_host_free: 1294 addr_host_free:
1295 mailimap_addr_host_free(addr_host); 1295 mailimap_addr_host_free(addr_host);
1296 addr_mailbox_free: 1296 addr_mailbox_free:
1297 mailimap_addr_mailbox_free(addr_mailbox); 1297 mailimap_addr_mailbox_free(addr_mailbox);
1298 addr_adl_free: 1298 addr_adl_free:
1299 mailimap_addr_adl_free(addr_adl); 1299 mailimap_addr_adl_free(addr_adl);
1300 addr_name_free: 1300 addr_name_free:
1301 mailimap_addr_name_free(addr_name); 1301 mailimap_addr_name_free(addr_name);
1302 err: 1302 err:
1303 return res; 1303 return res;
1304} 1304}
1305 1305
1306/* 1306/*
1307 addr-adl = nstring 1307 addr-adl = nstring
1308 ; Holds route from [RFC-822] route-addr if 1308 ; Holds route from [RFC-822] route-addr if
1309 ; non-NIL 1309 ; non-NIL
1310*/ 1310*/
1311 1311
1312static int mailimap_addr_adl_parse(mailstream * fd, MMAPString * buffer, 1312static int mailimap_addr_adl_parse(mailstream * fd, MMAPString * buffer,
1313 size_t * index, char ** result, 1313 size_t * index, char ** result,
1314 size_t progr_rate, 1314 size_t progr_rate,
1315 progress_function * progr_fun) 1315 progress_function * progr_fun)
1316{ 1316{
1317 return mailimap_nstring_parse(fd, buffer, index, result, NULL, 1317 return mailimap_nstring_parse(fd, buffer, index, result, NULL,
1318 progr_rate, progr_fun); 1318 progr_rate, progr_fun);
1319} 1319}
1320 1320
1321/* 1321/*
1322 addr-host = nstring 1322 addr-host = nstring
1323 ; NIL indicates [RFC-822] group syntax. 1323 ; NIL indicates [RFC-822] group syntax.
1324 ; Otherwise, holds [RFC-822] domain name 1324 ; Otherwise, holds [RFC-822] domain name
1325*/ 1325*/
1326 1326
1327static int mailimap_addr_host_parse(mailstream * fd, MMAPString * buffer, 1327static int mailimap_addr_host_parse(mailstream * fd, MMAPString * buffer,
1328 size_t * index, char ** result, 1328 size_t * index, char ** result,
1329 size_t progr_rate, 1329 size_t progr_rate,
1330 progress_function * progr_fun) 1330 progress_function * progr_fun)
1331{ 1331{
1332 return mailimap_nstring_parse(fd, buffer, index, result, NULL, 1332 return mailimap_nstring_parse(fd, buffer, index, result, NULL,
1333 progr_rate, progr_fun); 1333 progr_rate, progr_fun);
1334} 1334}
1335 1335
1336/* 1336/*
1337 addr-mailbox = nstring 1337 addr-mailbox = nstring
1338 ; NIL indicates end of [RFC-822] group; if 1338 ; NIL indicates end of [RFC-822] group; if
1339 ; non-NIL and addr-host is NIL, holds 1339 ; non-NIL and addr-host is NIL, holds
1340 ; [RFC-822] group name. 1340 ; [RFC-822] group name.
1341 ; Otherwise, holds [RFC-822] local-part 1341 ; Otherwise, holds [RFC-822] local-part
1342 ; after removing [RFC-822] quoting 1342 ; after removing [RFC-822] quoting
1343 */ 1343 */
1344 1344
1345static int mailimap_addr_mailbox_parse(mailstream * fd, MMAPString * buffer, 1345static int mailimap_addr_mailbox_parse(mailstream * fd, MMAPString * buffer,
1346 size_t * index, char ** result, 1346 size_t * index, char ** result,
1347 size_t progr_rate, 1347 size_t progr_rate,
1348 progress_function * progr_fun) 1348 progress_function * progr_fun)
1349{ 1349{
1350 return mailimap_nstring_parse(fd, buffer, index, result, NULL, 1350 return mailimap_nstring_parse(fd, buffer, index, result, NULL,
1351 progr_rate, progr_fun); 1351 progr_rate, progr_fun);
1352} 1352}
1353 1353
1354 1354
1355/* 1355/*
1356 addr-name = nstring 1356 addr-name = nstring
1357 ; If non-NIL, holds phrase from [RFC-822] 1357 ; If non-NIL, holds phrase from [RFC-822]
1358 ; mailbox after removing [RFC-822] quoting 1358 ; mailbox after removing [RFC-822] quoting
1359*/ 1359*/
1360 1360
1361static int mailimap_addr_name_parse(mailstream * fd, MMAPString * buffer, 1361static int mailimap_addr_name_parse(mailstream * fd, MMAPString * buffer,
1362 size_t * index, char ** result, 1362 size_t * index, char ** result,
1363 size_t progr_rate, 1363 size_t progr_rate,
1364 progress_function * progr_fun) 1364 progress_function * progr_fun)
1365{ 1365{
1366 return mailimap_nstring_parse(fd, buffer, index, result, NULL, 1366 return mailimap_nstring_parse(fd, buffer, index, result, NULL,
1367 progr_rate, progr_fun); 1367 progr_rate, progr_fun);
1368} 1368}
1369 1369
1370 1370
1371/* 1371/*
1372 NOT IMPLEMENTED 1372 NOT IMPLEMENTED
1373 append = "APPEND" SP mailbox [SP flag-list] [SP date-time] SP 1373 append = "APPEND" SP mailbox [SP flag-list] [SP date-time] SP
1374 literal 1374 literal
1375*/ 1375*/
1376 1376
1377/* 1377/*
1378 astring = 1*ASTRING-CHAR / string 1378 astring = 1*ASTRING-CHAR / string
1379*/ 1379*/
1380 1380
1381static int is_astring_char(char ch); 1381static int is_astring_char(char ch);
1382 1382
1383static int 1383static int
1384mailimap_atom_astring_parse(mailstream * fd, MMAPString * buffer, 1384mailimap_atom_astring_parse(mailstream * fd, MMAPString * buffer,
1385 size_t * index, char ** result, 1385 size_t * index, char ** result,
1386 size_t progr_rate, 1386 size_t progr_rate,
1387 progress_function * progr_fun) 1387 progress_function * progr_fun)
1388{ 1388{
1389 return mailimap_custom_string_parse(fd, buffer, index, result, 1389 return mailimap_custom_string_parse(fd, buffer, index, result,
1390 is_astring_char); 1390 is_astring_char);
1391} 1391}
1392 1392
1393static int 1393static int
1394mailimap_astring_parse(mailstream * fd, MMAPString * buffer, 1394mailimap_astring_parse(mailstream * fd, MMAPString * buffer,
1395 size_t * index, 1395 size_t * index,
1396 char ** result, 1396 char ** result,
1397 size_t progr_rate, 1397 size_t progr_rate,
1398 progress_function * progr_fun) 1398 progress_function * progr_fun)
1399{ 1399{
1400 size_t cur_token; 1400 size_t cur_token;
1401 char * astring; 1401 char * astring;
1402 int r; 1402 int r;
1403 1403
1404 cur_token = * index; 1404 cur_token = * index;
1405 1405
1406 r = mailimap_atom_astring_parse(fd, buffer, &cur_token, &astring, 1406 r = mailimap_atom_astring_parse(fd, buffer, &cur_token, &astring,
1407 progr_rate, progr_fun); 1407 progr_rate, progr_fun);
1408 switch (r) { 1408 switch (r) {
1409 case MAILIMAP_NO_ERROR: 1409 case MAILIMAP_NO_ERROR:
1410 break; 1410 break;
1411 1411
1412 case MAILIMAP_ERROR_PARSE: 1412 case MAILIMAP_ERROR_PARSE:
1413 r = mailimap_string_parse(fd, buffer, &cur_token, &astring, NULL, 1413 r = mailimap_string_parse(fd, buffer, &cur_token, &astring, NULL,
1414 progr_rate, progr_fun); 1414 progr_rate, progr_fun);
1415 if (r != MAILIMAP_NO_ERROR) 1415 if (r != MAILIMAP_NO_ERROR)
1416 return r; 1416 return r;
1417 break; 1417 break;
1418 1418
1419 default: 1419 default:
1420 return r; 1420 return r;
1421 } 1421 }
1422 1422
1423 * result = astring; 1423 * result = astring;
1424 * index = cur_token; 1424 * index = cur_token;
1425 1425
1426 return MAILIMAP_NO_ERROR; 1426 return MAILIMAP_NO_ERROR;
1427} 1427}
1428 1428
1429/* 1429/*
1430 ASTRING-CHAR = ATOM-CHAR / resp-specials 1430 ASTRING-CHAR = ATOM-CHAR / resp-specials
1431*/ 1431*/
1432 1432
1433static int is_atom_char(char ch); 1433static int is_atom_char(char ch);
1434static int is_resp_specials(char ch); 1434static int is_resp_specials(char ch);
1435 1435
1436static int is_astring_char(char ch) 1436static int is_astring_char(char ch)
1437{ 1437{
1438 if (is_atom_char(ch)) 1438 if (is_atom_char(ch))
1439 return TRUE; 1439 return TRUE;
1440 if (is_resp_specials(ch)) 1440 if (is_resp_specials(ch))
1441 return TRUE; 1441 return TRUE;
1442 return FALSE; 1442 return FALSE;
1443} 1443}
1444 1444
1445/* 1445/*
1446 atom = 1*ATOM-CHAR 1446 atom = 1*ATOM-CHAR
1447*/ 1447*/
1448 1448
1449static int mailimap_atom_parse(mailstream * fd, MMAPString * buffer, 1449static int mailimap_atom_parse(mailstream * fd, MMAPString * buffer,
1450 size_t * index, char ** result, 1450 size_t * index, char ** result,
1451 size_t progr_rate, 1451 size_t progr_rate,
1452 progress_function * progr_fun) 1452 progress_function * progr_fun)
1453{ 1453{
1454 return mailimap_custom_string_parse(fd, buffer, index, result, 1454 return mailimap_custom_string_parse(fd, buffer, index, result,
1455 is_atom_char); 1455 is_atom_char);
1456} 1456}
1457 1457
1458/* 1458/*
1459 ATOM-CHAR = <any CHAR except atom-specials> 1459 ATOM-CHAR = <any CHAR except atom-specials>
1460*/ 1460*/
1461 1461
1462static int is_atom_specials(char ch); 1462static int is_atom_specials(char ch);
1463 1463
1464static int is_atom_char(char ch) 1464static int is_atom_char(char ch)
1465{ 1465{
1466 if (is_atom_specials(ch)) 1466 if (is_atom_specials(ch))
1467 return FALSE; 1467 return FALSE;
1468 1468
1469 return is_char(ch); 1469 return is_char(ch);
1470} 1470}
1471 1471
1472/* 1472/*
1473 atom-specials = "(" / ")" / "{" / SP / CTL / list-wildcards / 1473 atom-specials = "(" / ")" / "{" / SP / CTL / list-wildcards /
1474 quoted-specials / resp-specials 1474 quoted-specials / resp-specials
1475 1475
1476no "}" because there is no need (Mark Crispin) 1476no "}" because there is no need (Mark Crispin)
1477*/ 1477*/
1478 1478
1479static int is_quoted_specials(char ch); 1479static int is_quoted_specials(char ch);
1480static int is_list_wildcards(char ch); 1480static int is_list_wildcards(char ch);
1481 1481
1482static int is_atom_specials(char ch) 1482static int is_atom_specials(char ch)
1483{ 1483{
1484 switch (ch) { 1484 switch (ch) {
1485 case '(': 1485 case '(':
1486 case ')': 1486 case ')':
1487 case '{': 1487 case '{':
1488 case ' ': 1488 case ' ':
1489 return TRUE; 1489 return TRUE;
1490 }; 1490 };
1491 if (is_ctl(ch)) 1491 if (is_ctl(ch))
1492 return TRUE; 1492 return TRUE;
1493 if (is_list_wildcards(ch)) 1493 if (is_list_wildcards(ch))
1494 return TRUE; 1494 return TRUE;
1495 if (is_resp_specials(ch)) 1495 if (is_resp_specials(ch))
1496 return TRUE; 1496 return TRUE;
1497 1497
1498 return is_quoted_specials(ch); 1498 return is_quoted_specials(ch);
1499} 1499}
1500 1500
1501/* 1501/*
1502 NOT IMPLEMENTED 1502 NOT IMPLEMENTED
1503 authenticate = "AUTHENTICATE" SP auth-type *(CRLF base64) 1503 authenticate = "AUTHENTICATE" SP auth-type *(CRLF base64)
1504*/ 1504*/
1505 1505
1506/* 1506/*
1507 auth-type = atom 1507 auth-type = atom
1508 ; Defined by [SASL] 1508 ; Defined by [SASL]
1509*/ 1509*/
1510 1510
1511static int mailimap_auth_type_parse(mailstream * fd, MMAPString * buffer, 1511static int mailimap_auth_type_parse(mailstream * fd, MMAPString * buffer,
1512 size_t * index, char ** result, 1512 size_t * index, char ** result,
1513 size_t progr_rate, 1513 size_t progr_rate,
1514 progress_function * progr_fun) 1514 progress_function * progr_fun)
1515{ 1515{
1516 return mailimap_atom_parse(fd, buffer, index, result, 1516 return mailimap_atom_parse(fd, buffer, index, result,
1517 progr_rate, progr_fun); 1517 progr_rate, progr_fun);
1518} 1518}
1519 1519
1520/* 1520/*
1521 base64 = *(4base64-char) [base64-terminal] 1521 base64 = *(4base64-char) [base64-terminal]
1522*/ 1522*/
1523 1523
1524static int is_base64_4char(char * str); 1524static int is_base64_4char(char * str);
1525static int is_base64_terminal(char * str); 1525static int is_base64_terminal(char * str);
1526 1526
1527static int mailimap_base64_parse(mailstream * fd, MMAPString * buffer, 1527static int mailimap_base64_parse(mailstream * fd, MMAPString * buffer,
1528 size_t * index, char ** result, 1528 size_t * index, char ** result,
1529 size_t progr_rate, 1529 size_t progr_rate,
1530 progress_function * progr_fun) 1530 progress_function * progr_fun)
1531{ 1531{
1532 size_t begin; 1532 size_t begin;
1533 size_t end; 1533 size_t end;
1534 char * gstr; 1534 char * gstr;
1535 1535
1536 begin = * index; 1536 begin = * index;
1537 end = begin; 1537 end = begin;
1538 1538
1539 while (is_base64_4char(buffer->str + end)) 1539 while (is_base64_4char(buffer->str + end))
1540 end += 4; 1540 end += 4;
1541 if (is_base64_terminal(buffer->str + end)) 1541 if (is_base64_terminal(buffer->str + end))
1542 end += 4; 1542 end += 4;
1543 else 1543 else
1544 return MAILIMAP_ERROR_PARSE; 1544 return MAILIMAP_ERROR_PARSE;
1545 1545
1546 gstr = malloc(end - begin + 1); 1546 gstr = malloc(end - begin + 1);
1547 if (gstr == NULL) 1547 if (gstr == NULL)
1548 return MAILIMAP_ERROR_MEMORY; 1548 return MAILIMAP_ERROR_MEMORY;
1549 strncpy(gstr, buffer->str + begin, end - begin); 1549 strncpy(gstr, buffer->str + begin, end - begin);
1550 gstr[end - begin] = '\0'; 1550 gstr[end - begin] = '\0';
1551 1551
1552 * result = gstr; 1552 * result = gstr;
1553 * index = end; 1553 * index = end;
1554 1554
1555 return MAILIMAP_NO_ERROR; 1555 return MAILIMAP_NO_ERROR;
1556} 1556}
1557 1557
1558/* 1558/*
1559 base64-char = ALPHA / DIGIT / "+" / "/" 1559 base64-char = ALPHA / DIGIT / "+" / "/"
1560 ; Case-sensitive 1560 ; Case-sensitive
1561*/ 1561*/
1562 1562
1563static int is_base64_char(char ch) 1563static int is_base64_char(char ch)
1564{ 1564{
1565 return (is_alpha(ch) || is_digit(ch) || ch == '+' || ch == '/'); 1565 return (is_alpha(ch) || is_digit(ch) || ch == '+' || ch == '/');
1566} 1566}
1567 1567
1568static int is_base64_4char(char * str) 1568static int is_base64_4char(char * str)
1569{ 1569{
1570 size_t i; 1570 size_t i;
1571 1571
1572 for (i = 0 ; i < 4 ; i++) 1572 for (i = 0 ; i < 4 ; i++)
1573 if (!is_base64_char(str[i])) 1573 if (!is_base64_char(str[i]))
1574 return FALSE; 1574 return FALSE;
1575 return TRUE; 1575 return TRUE;
1576} 1576}
1577 1577
1578/* 1578/*
1579 base64-terminal = (2base64-char "==") / (3base64-char "=") 1579 base64-terminal = (2base64-char "==") / (3base64-char "=")
1580*/ 1580*/
1581 1581
1582static int is_base64_terminal(char * str) 1582static int is_base64_terminal(char * str)
1583{ 1583{
1584 if (str[0] == 0) 1584 if (str[0] == 0)
1585 return FALSE; 1585 return FALSE;
1586 if (str[1] == 0) 1586 if (str[1] == 0)
1587 return FALSE; 1587 return FALSE;
1588 if (str[2] == 0) 1588 if (str[2] == 0)
1589 return FALSE; 1589 return FALSE;
1590 if (str[3] == 0) 1590 if (str[3] == 0)
1591 return FALSE; 1591 return FALSE;
1592 1592
1593 if (is_base64_char(str[0]) || is_base64_char(str[1]) 1593 if (is_base64_char(str[0]) || is_base64_char(str[1])
1594 || str[2] == '=' || str[3] == '=') 1594 || str[2] == '=' || str[3] == '=')
1595 return TRUE; 1595 return TRUE;
1596 if (is_base64_char(str[0]) || is_base64_char(str[1]) 1596 if (is_base64_char(str[0]) || is_base64_char(str[1])
1597 || is_base64_char(str[2]) || str[3] == '=') 1597 || is_base64_char(str[2]) || str[3] == '=')
1598 return TRUE; 1598 return TRUE;
1599 return FALSE; 1599 return FALSE;
1600} 1600}
1601 1601
1602 1602
1603/* 1603/*
1604 body = "(" (body-type-1part / body-type-mpart) ")" 1604 body = "(" (body-type-1part / body-type-mpart) ")"
1605*/ 1605*/
1606 1606
1607static int mailimap_body_parse(mailstream * fd, MMAPString * buffer, 1607static int mailimap_body_parse(mailstream * fd, MMAPString * buffer,
1608 size_t * index, 1608 size_t * index,
1609 struct mailimap_body ** result, 1609 struct mailimap_body ** result,
1610 size_t progr_rate, 1610 size_t progr_rate,
1611 progress_function * progr_fun) 1611 progress_function * progr_fun)
1612{ 1612{
1613 struct mailimap_body_type_1part * body_type_1part; 1613 struct mailimap_body_type_1part * body_type_1part;
1614 struct mailimap_body_type_mpart * body_type_mpart; 1614 struct mailimap_body_type_mpart * body_type_mpart;
1615 struct mailimap_body * body; 1615 struct mailimap_body * body;
1616 size_t cur_token; 1616 size_t cur_token;
1617 int type; 1617 int type;
1618 int r; 1618 int r;
1619 int res; 1619 int res;
1620 1620
1621 cur_token = * index; 1621 cur_token = * index;
1622 1622
1623 body_type_1part = NULL; 1623 body_type_1part = NULL;
1624 body_type_mpart = NULL; 1624 body_type_mpart = NULL;
1625 1625
1626 r = mailimap_oparenth_parse(fd, buffer, &cur_token); 1626 r = mailimap_oparenth_parse(fd, buffer, &cur_token);
1627 if (r != MAILIMAP_NO_ERROR) { 1627 if (r != MAILIMAP_NO_ERROR) {
1628 res = r; 1628 res = r;
1629 goto err; 1629 goto err;
1630 } 1630 }
1631 1631
1632 type = MAILIMAP_BODY_ERROR; /* XXX - removes a gcc warning */ 1632 type = MAILIMAP_BODY_ERROR; /* XXX - removes a gcc warning */
1633 1633
1634 r = mailimap_body_type_1part_parse(fd, buffer, &cur_token, &body_type_1part, 1634 r = mailimap_body_type_1part_parse(fd, buffer, &cur_token, &body_type_1part,
1635 progr_rate, progr_fun); 1635 progr_rate, progr_fun);
1636 if (r == MAILIMAP_NO_ERROR) 1636 if (r == MAILIMAP_NO_ERROR)
1637 type = MAILIMAP_BODY_1PART; 1637 type = MAILIMAP_BODY_1PART;
1638 1638
1639 if (r == MAILIMAP_ERROR_PARSE) { 1639 if (r == MAILIMAP_ERROR_PARSE) {
1640 r = mailimap_body_type_mpart_parse(fd, buffer, &cur_token, 1640 r = mailimap_body_type_mpart_parse(fd, buffer, &cur_token,
1641 &body_type_mpart, 1641 &body_type_mpart,
1642 progr_rate, progr_fun); 1642 progr_rate, progr_fun);
1643 1643
1644 if (r == MAILIMAP_NO_ERROR) 1644 if (r == MAILIMAP_NO_ERROR)
1645 type = MAILIMAP_BODY_MPART; 1645 type = MAILIMAP_BODY_MPART;
1646 } 1646 }
1647 1647
1648 if (r != MAILIMAP_NO_ERROR) { 1648 if (r != MAILIMAP_NO_ERROR) {
1649 res = r; 1649 res = r;
1650 goto err; 1650 goto err;
1651 } 1651 }
1652 1652
1653 r = mailimap_cparenth_parse(fd, buffer, &cur_token); 1653 r = mailimap_cparenth_parse(fd, buffer, &cur_token);
1654 if (r != MAILIMAP_NO_ERROR) { 1654 if (r != MAILIMAP_NO_ERROR) {
1655 res = r; 1655 res = r;
1656 goto free; 1656 goto free;
1657 } 1657 }
1658 1658
1659 body = mailimap_body_new(type, body_type_1part, body_type_mpart); 1659 body = mailimap_body_new(type, body_type_1part, body_type_mpart);
1660 if (body == NULL) { 1660 if (body == NULL) {
1661 res = MAILIMAP_ERROR_MEMORY; 1661 res = MAILIMAP_ERROR_MEMORY;
1662 goto free; 1662 goto free;
1663 } 1663 }
1664 1664
1665 * result = body; 1665 * result = body;
1666 * index = cur_token; 1666 * index = cur_token;
1667 1667
1668 return MAILIMAP_NO_ERROR; 1668 return MAILIMAP_NO_ERROR;
1669 1669
1670 free: 1670 free:
1671 if (body_type_1part) 1671 if (body_type_1part)
1672 mailimap_body_type_1part_free(body_type_1part); 1672 mailimap_body_type_1part_free(body_type_1part);
1673 if (body_type_mpart) 1673 if (body_type_mpart)
1674 mailimap_body_type_mpart_free(body_type_mpart); 1674 mailimap_body_type_mpart_free(body_type_mpart);
1675 err: 1675 err:
1676 return res; 1676 return res;
1677} 1677}
1678 1678
1679/* 1679/*
1680 body-extension = nstring / number / 1680 body-extension = nstring / number /
1681 "(" body-extension *(SP body-extension) ")" 1681 "(" body-extension *(SP body-extension) ")"
1682 ; Future expansion. Client implementations 1682 ; Future expansion. Client implementations
1683 ; MUST accept body-extension fields. Server 1683 ; MUST accept body-extension fields. Server
1684 ; implementations MUST NOT generate 1684 ; implementations MUST NOT generate
1685 ; body-extension fields except as defined by 1685 ; body-extension fields except as defined by
1686 ; future standard or standards-track 1686 ; future standard or standards-track
1687 ; revisions of this specification. 1687 ; revisions of this specification.
1688*/ 1688*/
1689 1689
1690/* 1690/*
1691 "(" body-extension *(SP body-extension) ")" 1691 "(" body-extension *(SP body-extension) ")"
1692*/ 1692*/
1693 1693
1694static int 1694static int
1695mailimap_body_ext_list_parse(mailstream * fd, MMAPString * buffer, 1695mailimap_body_ext_list_parse(mailstream * fd, MMAPString * buffer,
1696 size_t * index, 1696 size_t * index,
1697 clist ** result, 1697 clist ** result,
1698 size_t progr_rate, 1698 size_t progr_rate,
1699 progress_function * progr_fun) 1699 progress_function * progr_fun)
1700{ 1700{
1701 size_t cur_token; 1701 size_t cur_token;
1702 clist * list; 1702 clist * list;
1703 int r; 1703 int r;
1704 int res; 1704 int res;
1705 1705
1706 cur_token = * index; 1706 cur_token = * index;
1707 1707
1708 r = mailimap_oparenth_parse(fd, buffer, &cur_token); 1708 r = mailimap_oparenth_parse(fd, buffer, &cur_token);
1709 if (r != MAILIMAP_NO_ERROR) { 1709 if (r != MAILIMAP_NO_ERROR) {
1710 res = r; 1710 res = r;
1711 goto err; 1711 goto err;
1712 } 1712 }
1713 1713
1714 r = mailimap_struct_spaced_list_parse(fd, buffer, 1714 r = mailimap_struct_spaced_list_parse(fd, buffer,
1715 &cur_token, &list, 1715 &cur_token, &list,
1716 (mailimap_struct_parser * ) 1716 (mailimap_struct_parser * )
1717 mailimap_body_extension_parse, 1717 mailimap_body_extension_parse,
1718 (mailimap_struct_destructor * ) 1718 (mailimap_struct_destructor * )
1719 mailimap_body_extension_free, 1719 mailimap_body_extension_free,
1720 progr_rate, progr_fun); 1720 progr_rate, progr_fun);
1721 if (r != MAILIMAP_NO_ERROR) { 1721 if (r != MAILIMAP_NO_ERROR) {
1722 res = r; 1722 res = r;
1723 goto err; 1723 goto err;
1724 } 1724 }
1725 1725
1726 r = mailimap_cparenth_parse(fd, buffer, &cur_token); 1726 r = mailimap_cparenth_parse(fd, buffer, &cur_token);
1727 if (r != MAILIMAP_NO_ERROR) { 1727 if (r != MAILIMAP_NO_ERROR) {
1728 res = r; 1728 res = r;
1729 goto free_list; 1729 goto free_list;
1730 } 1730 }
1731 1731
1732 * index = cur_token; 1732 * index = cur_token;
1733 * result = list; 1733 * result = list;
1734 1734
1735 return MAILIMAP_NO_ERROR; 1735 return MAILIMAP_NO_ERROR;
1736 1736
1737 free_list: 1737 free_list:
1738 clist_foreach(list, (clist_func) mailimap_body_extension_free, NULL); 1738 clist_foreach(list, (clist_func) mailimap_body_extension_free, NULL);
1739 clist_free(list); 1739 clist_free(list);
1740 err: 1740 err:
1741 return res; 1741 return res;
1742} 1742}
1743 1743
1744/* 1744/*
1745 body-extension = nstring / number / 1745 body-extension = nstring / number /
1746 "(" body-extension *(SP body-extension) ")" 1746 "(" body-extension *(SP body-extension) ")"
1747 ; Future expansion. Client implementations 1747 ; Future expansion. Client implementations
1748 ; MUST accept body-extension fields. Server 1748 ; MUST accept body-extension fields. Server
1749 ; implementations MUST NOT generate 1749 ; implementations MUST NOT generate
1750 ; body-extension fields except as defined by 1750 ; body-extension fields except as defined by
1751 ; future standard or standards-track 1751 ; future standard or standards-track
1752 ; revisions of this specification. 1752 ; revisions of this specification.
1753*/ 1753*/
1754 1754
1755static int 1755static int
1756mailimap_body_extension_parse(mailstream * fd, MMAPString * buffer, 1756mailimap_body_extension_parse(mailstream * fd, MMAPString * buffer,
1757 size_t * index, 1757 size_t * index,
1758 struct mailimap_body_extension ** result, 1758 struct mailimap_body_extension ** result,
1759 size_t progr_rate, 1759 size_t progr_rate,
1760 progress_function * progr_fun) 1760 progress_function * progr_fun)
1761{ 1761{
1762 size_t cur_token; 1762 size_t cur_token;
1763 uint32_t number; 1763 uint32_t number;
1764 char * nstring; 1764 char * nstring;
1765 clist * body_extension_list; 1765 clist * body_extension_list;
1766 struct mailimap_body_extension * body_extension; 1766 struct mailimap_body_extension * body_extension;
1767 int type; 1767 int type;
1768 int r; 1768 int r;
1769 int res; 1769 int res;
1770 1770
1771 cur_token = * index; 1771 cur_token = * index;
1772 1772
1773 nstring = NULL; 1773 nstring = NULL;
1774 number = 0; 1774 number = 0;
1775 body_extension_list = NULL; 1775 body_extension_list = NULL;
1776 type = MAILIMAP_BODY_EXTENSION_ERROR; /* XXX - removes a gcc warning */ 1776 type = MAILIMAP_BODY_EXTENSION_ERROR; /* XXX - removes a gcc warning */
1777 1777
1778 r = mailimap_nstring_parse(fd, buffer, &cur_token, &nstring, NULL, 1778 r = mailimap_nstring_parse(fd, buffer, &cur_token, &nstring, NULL,
1779 progr_rate, progr_fun); 1779 progr_rate, progr_fun);
1780 if (r == MAILIMAP_NO_ERROR) 1780 if (r == MAILIMAP_NO_ERROR)
1781 type = MAILIMAP_BODY_EXTENSION_NSTRING; 1781 type = MAILIMAP_BODY_EXTENSION_NSTRING;
1782 1782
1783 if (r == MAILIMAP_ERROR_PARSE) { 1783 if (r == MAILIMAP_ERROR_PARSE) {
1784 r = mailimap_number_parse(fd, buffer, &cur_token, &number); 1784 r = mailimap_number_parse(fd, buffer, &cur_token, &number);
1785 1785
1786 if (r == MAILIMAP_NO_ERROR) 1786 if (r == MAILIMAP_NO_ERROR)
1787 type = MAILIMAP_BODY_EXTENSION_NUMBER; 1787 type = MAILIMAP_BODY_EXTENSION_NUMBER;
1788 } 1788 }
1789 1789
1790 if (r == MAILIMAP_ERROR_PARSE) { 1790 if (r == MAILIMAP_ERROR_PARSE) {
1791 r = mailimap_body_ext_list_parse(fd, buffer, &cur_token, 1791 r = mailimap_body_ext_list_parse(fd, buffer, &cur_token,
1792 &body_extension_list, 1792 &body_extension_list,
1793 progr_rate, progr_fun); 1793 progr_rate, progr_fun);
1794 1794
1795 if (r == MAILIMAP_NO_ERROR) 1795 if (r == MAILIMAP_NO_ERROR)
1796 type = MAILIMAP_BODY_EXTENSION_LIST; 1796 type = MAILIMAP_BODY_EXTENSION_LIST;
1797 } 1797 }
1798 1798
1799 if (r != MAILIMAP_NO_ERROR) { 1799 if (r != MAILIMAP_NO_ERROR) {
1800 res = r; 1800 res = r;
1801 goto err; 1801 goto err;
1802 } 1802 }
1803 1803
1804 body_extension = mailimap_body_extension_new(type, nstring, number, 1804 body_extension = mailimap_body_extension_new(type, nstring, number,
1805 body_extension_list); 1805 body_extension_list);
1806 1806
1807 if (body_extension == NULL) { 1807 if (body_extension == NULL) {
1808 res = MAILIMAP_ERROR_MEMORY; 1808 res = MAILIMAP_ERROR_MEMORY;
1809 goto free; 1809 goto free;
1810 } 1810 }
1811 1811
1812 * result = body_extension; 1812 * result = body_extension;
1813 * index = cur_token; 1813 * index = cur_token;
1814 1814
1815 return MAILIMAP_NO_ERROR; 1815 return MAILIMAP_NO_ERROR;
1816 1816
1817 free: 1817 free:
1818 if (nstring != NULL) 1818 if (nstring != NULL)
1819 mailimap_nstring_free(nstring); 1819 mailimap_nstring_free(nstring);
1820 if (body_extension_list) { 1820 if (body_extension_list) {
1821 clist_foreach(body_extension_list, 1821 clist_foreach(body_extension_list,
1822 (clist_func) mailimap_body_extension_free, 1822 (clist_func) mailimap_body_extension_free,
1823 NULL); 1823 NULL);
1824 clist_free(body_extension_list); 1824 clist_free(body_extension_list);
1825 } 1825 }
1826 err: 1826 err:
1827 return res; 1827 return res;
1828} 1828}
1829 1829
1830/* 1830/*
1831 body-ext-1part = body-fld-md5 [SP body-fld-dsp [SP body-fld-lang 1831 body-ext-1part = body-fld-md5 [SP body-fld-dsp [SP body-fld-lang
1832 *(SP body-extension)]] 1832 *(SP body-extension)]]
1833 ; MUST NOT be returned on non-extensible 1833 ; MUST NOT be returned on non-extensible
1834 ; "BODY" fetch 1834 ; "BODY" fetch
1835*/ 1835*/
1836 1836
1837/* 1837/*
1838 *(SP body-extension) 1838 *(SP body-extension)
1839*/ 1839*/
1840 1840
1841static int 1841static int
1842mailimap_body_ext_1part_3_parse(mailstream * fd, MMAPString * buffer, 1842mailimap_body_ext_1part_3_parse(mailstream * fd, MMAPString * buffer,
1843 size_t * index, 1843 size_t * index,
1844 clist ** body_ext_list, 1844 clist ** body_ext_list,
1845 size_t progr_rate, 1845 size_t progr_rate,
1846 progress_function * progr_fun) 1846 progress_function * progr_fun)
1847{ 1847{
1848 size_t cur_token; 1848 size_t cur_token;
1849 int r; 1849 int r;
1850 1850
1851 cur_token = * index; 1851 cur_token = * index;
1852 * body_ext_list = NULL; 1852 * body_ext_list = NULL;
1853 1853
1854 r = mailimap_space_parse(fd, buffer, &cur_token); 1854 r = mailimap_space_parse(fd, buffer, &cur_token);
1855 if (r != MAILIMAP_NO_ERROR) 1855 if (r != MAILIMAP_NO_ERROR)
1856 return r; 1856 return r;
1857 1857
1858 r = mailimap_struct_spaced_list_parse(fd, buffer, &cur_token, 1858 r = mailimap_struct_spaced_list_parse(fd, buffer, &cur_token,
1859 body_ext_list, 1859 body_ext_list,
1860 (mailimap_struct_parser *) 1860 (mailimap_struct_parser *)
1861 mailimap_body_extension_parse, 1861 mailimap_body_extension_parse,
1862 (mailimap_struct_destructor *) 1862 (mailimap_struct_destructor *)
1863 mailimap_body_extension_free, 1863 mailimap_body_extension_free,
1864 progr_rate, progr_fun); 1864 progr_rate, progr_fun);
1865 if (r != MAILIMAP_NO_ERROR) 1865 if (r != MAILIMAP_NO_ERROR)
1866 return r; 1866 return r;
1867 1867
1868 * index = cur_token; 1868 * index = cur_token;
1869 1869
1870 return MAILIMAP_NO_ERROR; 1870 return MAILIMAP_NO_ERROR;
1871} 1871}
1872 1872
1873 1873
1874/* 1874/*
1875 [SP body-fld-lang 1875 [SP body-fld-lang
1876 *(SP body-extension)]] 1876 *(SP body-extension)]]
1877*/ 1877*/
1878 1878
1879static int 1879static int
1880mailimap_body_ext_1part_2_parse(mailstream * fd, MMAPString * buffer, 1880mailimap_body_ext_1part_2_parse(mailstream * fd, MMAPString * buffer,
1881 size_t * index, 1881 size_t * index,
1882 struct mailimap_body_fld_lang ** fld_lang, 1882 struct mailimap_body_fld_lang ** fld_lang,
1883 clist ** body_ext_list, 1883 clist ** body_ext_list,
1884 size_t progr_rate, 1884 size_t progr_rate,
1885 progress_function * progr_fun) 1885 progress_function * progr_fun)
1886{ 1886{
1887 size_t cur_token; 1887 size_t cur_token;
1888 int r; 1888 int r;
1889 1889
1890 cur_token = * index; 1890 cur_token = * index;
1891 * fld_lang = NULL; 1891 * fld_lang = NULL;
1892 * body_ext_list = NULL; 1892 * body_ext_list = NULL;
1893 1893
1894 r = mailimap_space_parse(fd, buffer, &cur_token); 1894 r = mailimap_space_parse(fd, buffer, &cur_token);
1895 if (r != MAILIMAP_NO_ERROR) 1895 if (r != MAILIMAP_NO_ERROR)
1896 return r; 1896 return r;
1897 1897
1898 r = mailimap_body_fld_lang_parse(fd, buffer, &cur_token, fld_lang, 1898 r = mailimap_body_fld_lang_parse(fd, buffer, &cur_token, fld_lang,
1899 progr_rate, progr_fun); 1899 progr_rate, progr_fun);
1900 if (r != MAILIMAP_NO_ERROR) 1900 if (r != MAILIMAP_NO_ERROR)
1901 return r; 1901 return r;
1902 1902
1903 r = mailimap_body_ext_1part_3_parse(fd, buffer, &cur_token, 1903 r = mailimap_body_ext_1part_3_parse(fd, buffer, &cur_token,
1904 body_ext_list, progr_rate, progr_fun); 1904 body_ext_list, progr_rate, progr_fun);
1905 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) 1905 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE))
1906 return r; 1906 return r;
1907 1907
1908 * index = cur_token; 1908 * index = cur_token;
1909 1909
1910 return MAILIMAP_NO_ERROR; 1910 return MAILIMAP_NO_ERROR;
1911} 1911}
1912 1912
1913 1913
1914/* 1914/*
1915 SP body-fld-dsp [SP body-fld-lang 1915 SP body-fld-dsp [SP body-fld-lang
1916 *(SP body-extension)]] 1916 *(SP body-extension)]]
1917*/ 1917*/
1918 1918
1919static int 1919static int
1920mailimap_body_ext_1part_1_parse(mailstream * fd, MMAPString * buffer, 1920mailimap_body_ext_1part_1_parse(mailstream * fd, MMAPString * buffer,
1921 size_t * index, 1921 size_t * index,
1922 struct mailimap_body_fld_dsp ** fld_dsp, 1922 struct mailimap_body_fld_dsp ** fld_dsp,
1923 struct mailimap_body_fld_lang ** fld_lang, 1923 struct mailimap_body_fld_lang ** fld_lang,
1924 clist ** body_ext_list, 1924 clist ** body_ext_list,
1925 size_t progr_rate, 1925 size_t progr_rate,
1926 progress_function * progr_fun) 1926 progress_function * progr_fun)
1927{ 1927{
1928 size_t cur_token; 1928 size_t cur_token;
1929 int r; 1929 int r;
1930 1930
1931 cur_token = * index; 1931 cur_token = * index;
1932 * fld_dsp = NULL; 1932 * fld_dsp = NULL;
1933 * fld_lang = NULL; 1933 * fld_lang = NULL;
1934 * body_ext_list = NULL; 1934 * body_ext_list = NULL;
1935 1935
1936 r = mailimap_space_parse(fd, buffer, &cur_token); 1936 r = mailimap_space_parse(fd, buffer, &cur_token);
1937 if (r != MAILIMAP_NO_ERROR) 1937 if (r != MAILIMAP_NO_ERROR)
1938 return r; 1938 return r;
1939 1939
1940 r = mailimap_body_fld_dsp_parse(fd, buffer, &cur_token, fld_dsp, 1940 r = mailimap_body_fld_dsp_parse(fd, buffer, &cur_token, fld_dsp,
1941 progr_rate, progr_fun); 1941 progr_rate, progr_fun);
1942 if (r != MAILIMAP_NO_ERROR) 1942 if (r != MAILIMAP_NO_ERROR)
1943 return r; 1943 return r;
1944 1944
1945 r = mailimap_body_ext_1part_2_parse(fd, buffer, &cur_token, 1945 r = mailimap_body_ext_1part_2_parse(fd, buffer, &cur_token,
1946 fld_lang, body_ext_list, 1946 fld_lang, body_ext_list,
1947 progr_rate, progr_fun); 1947 progr_rate, progr_fun);
1948 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) 1948 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE))
1949 return r; 1949 return r;
1950 1950
1951 * index = cur_token; 1951 * index = cur_token;
1952 1952
1953 return MAILIMAP_NO_ERROR; 1953 return MAILIMAP_NO_ERROR;
1954} 1954}
1955 1955
1956/* 1956/*
1957 body-ext-1part = body-fld-md5 [SP body-fld-dsp [SP body-fld-lang 1957 body-ext-1part = body-fld-md5 [SP body-fld-dsp [SP body-fld-lang
1958 *(SP body-extension)]] 1958 *(SP body-extension)]]
1959 ; MUST NOT be returned on non-extensible 1959 ; MUST NOT be returned on non-extensible
1960 ; "BODY" fetch 1960 ; "BODY" fetch
1961*/ 1961*/
1962 1962
1963static int 1963static int
1964mailimap_body_ext_1part_parse(mailstream * fd, MMAPString * buffer, 1964mailimap_body_ext_1part_parse(mailstream * fd, MMAPString * buffer,
1965 size_t * index, 1965 size_t * index,
1966 struct mailimap_body_ext_1part ** result, 1966 struct mailimap_body_ext_1part ** result,
1967 size_t progr_rate, 1967 size_t progr_rate,
1968 progress_function * progr_fun) 1968 progress_function * progr_fun)
1969{ 1969{
1970 size_t cur_token; 1970 size_t cur_token;
1971 1971
1972 char * fld_md5; 1972 char * fld_md5;
1973 struct mailimap_body_fld_dsp * fld_dsp; 1973 struct mailimap_body_fld_dsp * fld_dsp;
1974 struct mailimap_body_fld_lang * fld_lang; 1974 struct mailimap_body_fld_lang * fld_lang;
1975 clist * body_ext_list; 1975 clist * body_ext_list;
1976 int r; 1976 int r;
1977 int res; 1977 int res;
1978 1978
1979 struct mailimap_body_ext_1part * ext_1part; 1979 struct mailimap_body_ext_1part * ext_1part;
1980 1980
1981 cur_token = * index; 1981 cur_token = * index;
1982 1982
1983 fld_md5 = NULL; 1983 fld_md5 = NULL;
1984 fld_dsp = NULL; 1984 fld_dsp = NULL;
1985 fld_lang = NULL; 1985 fld_lang = NULL;
1986 body_ext_list = NULL; 1986 body_ext_list = NULL;
1987 1987
1988 r = mailimap_body_fld_md5_parse(fd, buffer, &cur_token, &fld_md5, 1988 r = mailimap_body_fld_md5_parse(fd, buffer, &cur_token, &fld_md5,
1989 progr_rate, progr_fun); 1989 progr_rate, progr_fun);
1990 if (r != MAILIMAP_NO_ERROR) { 1990 if (r != MAILIMAP_NO_ERROR) {
1991 res = r; 1991 res = r;
1992 goto err; 1992 goto err;
1993 } 1993 }
1994 1994
1995 r = mailimap_body_ext_1part_1_parse(fd, buffer, &cur_token, 1995 r = mailimap_body_ext_1part_1_parse(fd, buffer, &cur_token,
1996 &fld_dsp, 1996 &fld_dsp,
1997 &fld_lang, 1997 &fld_lang,
1998 &body_ext_list, 1998 &body_ext_list,
1999 progr_rate, progr_fun); 1999 progr_rate, progr_fun);
2000 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) { 2000 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) {
2001 res = r; 2001 res = r;
2002 goto free; 2002 goto free;
2003 } 2003 }
2004 2004
2005 ext_1part = mailimap_body_ext_1part_new(fld_md5, fld_dsp, fld_lang, 2005 ext_1part = mailimap_body_ext_1part_new(fld_md5, fld_dsp, fld_lang,
2006 body_ext_list); 2006 body_ext_list);
2007 2007
2008 if (ext_1part == NULL) { 2008 if (ext_1part == NULL) {
2009 res = MAILIMAP_ERROR_MEMORY; 2009 res = MAILIMAP_ERROR_MEMORY;
2010 goto free; 2010 goto free;
2011 } 2011 }
2012 2012
2013 * result = ext_1part; 2013 * result = ext_1part;
2014 * index = cur_token; 2014 * index = cur_token;
2015 2015
2016 return MAILIMAP_NO_ERROR; 2016 return MAILIMAP_NO_ERROR;
2017 2017
2018 free: 2018 free:
2019 if (body_ext_list) { 2019 if (body_ext_list) {
2020 clist_foreach(body_ext_list, (clist_func) mailimap_body_extension_free, 2020 clist_foreach(body_ext_list, (clist_func) mailimap_body_extension_free,
2021 NULL); 2021 NULL);
2022 clist_free(body_ext_list); 2022 clist_free(body_ext_list);
2023 } 2023 }
2024 if (fld_lang) 2024 if (fld_lang)
2025 mailimap_body_fld_lang_free(fld_lang); 2025 mailimap_body_fld_lang_free(fld_lang);
2026 if (fld_dsp) 2026 if (fld_dsp)
2027 mailimap_body_fld_dsp_free(fld_dsp); 2027 mailimap_body_fld_dsp_free(fld_dsp);
2028 mailimap_body_fld_md5_free(fld_md5); 2028 mailimap_body_fld_md5_free(fld_md5);
2029 err: 2029 err:
2030 return res; 2030 return res;
2031} 2031}
2032 2032
2033 2033
2034/* 2034/*
2035 body-ext-mpart = body-fld-param [SP body-fld-dsp [SP body-fld-lang 2035 body-ext-mpart = body-fld-param [SP body-fld-dsp [SP body-fld-lang
2036 *(SP body-extension)]] 2036 *(SP body-extension)]]
2037 ; MUST NOT be returned on non-extensible 2037 ; MUST NOT be returned on non-extensible
2038 ; "BODY" fetch 2038 ; "BODY" fetch
2039*/ 2039*/
2040 2040
2041static int 2041static int
2042mailimap_body_ext_mpart_parse(mailstream * fd, MMAPString * buffer, 2042mailimap_body_ext_mpart_parse(mailstream * fd, MMAPString * buffer,
2043 size_t * index, 2043 size_t * index,
2044 struct mailimap_body_ext_mpart ** result, 2044 struct mailimap_body_ext_mpart ** result,
2045 size_t progr_rate, 2045 size_t progr_rate,
2046 progress_function * progr_fun) 2046 progress_function * progr_fun)
2047{ 2047{
2048 size_t cur_token; 2048 size_t cur_token;
2049 2049
2050 struct mailimap_body_fld_dsp * fld_dsp; 2050 struct mailimap_body_fld_dsp * fld_dsp;
2051 struct mailimap_body_fld_lang * fld_lang; 2051 struct mailimap_body_fld_lang * fld_lang;
2052 struct mailimap_body_fld_param * fld_param; 2052 struct mailimap_body_fld_param * fld_param;
2053 clist * body_ext_list; 2053 clist * body_ext_list;
2054 2054
2055 struct mailimap_body_ext_mpart * ext_mpart; 2055 struct mailimap_body_ext_mpart * ext_mpart;
2056 int r; 2056 int r;
2057 int res; 2057 int res;
2058 2058
2059 cur_token = * index; 2059 cur_token = * index;
2060 2060
2061 fld_param = NULL; 2061 fld_param = NULL;
2062 fld_dsp = NULL; 2062 fld_dsp = NULL;
2063 fld_lang = NULL; 2063 fld_lang = NULL;
2064 body_ext_list = NULL; 2064 body_ext_list = NULL;
2065 2065
2066 r = mailimap_body_fld_param_parse(fd, buffer, &cur_token, &fld_param, 2066 r = mailimap_body_fld_param_parse(fd, buffer, &cur_token, &fld_param,
2067 progr_rate, progr_fun); 2067 progr_rate, progr_fun);
2068 if (r != MAILIMAP_NO_ERROR) { 2068 if (r != MAILIMAP_NO_ERROR) {
2069 res = r; 2069 res = r;
2070 goto err; 2070 goto err;
2071 } 2071 }
2072 2072
2073 r = mailimap_body_ext_1part_1_parse(fd, buffer, &cur_token, 2073 r = mailimap_body_ext_1part_1_parse(fd, buffer, &cur_token,
2074 &fld_dsp, 2074 &fld_dsp,
2075 &fld_lang, 2075 &fld_lang,
2076 &body_ext_list, 2076 &body_ext_list,
2077 progr_rate, progr_fun); 2077 progr_rate, progr_fun);
2078 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) { 2078 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) {
2079 res = r; 2079 res = r;
2080 goto free; 2080 goto free;
2081 } 2081 }
2082 2082
2083 ext_mpart = mailimap_body_ext_mpart_new(fld_param, fld_dsp, fld_lang, 2083 ext_mpart = mailimap_body_ext_mpart_new(fld_param, fld_dsp, fld_lang,
2084 body_ext_list); 2084 body_ext_list);
2085 if (ext_mpart == NULL) { 2085 if (ext_mpart == NULL) {
2086 res = MAILIMAP_ERROR_MEMORY; 2086 res = MAILIMAP_ERROR_MEMORY;
2087 goto free; 2087 goto free;
2088 } 2088 }
2089 2089
2090 * result = ext_mpart; 2090 * result = ext_mpart;
2091 * index = cur_token; 2091 * index = cur_token;
2092 2092
2093 return MAILIMAP_NO_ERROR; 2093 return MAILIMAP_NO_ERROR;
2094 2094
2095 free: 2095 free:
2096 if (body_ext_list) { 2096 if (body_ext_list) {
2097 clist_foreach(body_ext_list, (clist_func) mailimap_body_extension_free, 2097 clist_foreach(body_ext_list, (clist_func) mailimap_body_extension_free,
2098 NULL); 2098 NULL);
2099 clist_free(body_ext_list); 2099 clist_free(body_ext_list);
2100 } 2100 }
2101 if (fld_lang) 2101 if (fld_lang)
2102 mailimap_body_fld_lang_free(fld_lang); 2102 mailimap_body_fld_lang_free(fld_lang);
2103 if (fld_dsp) 2103 if (fld_dsp)
2104 mailimap_body_fld_dsp_free(fld_dsp); 2104 mailimap_body_fld_dsp_free(fld_dsp);
2105 if (fld_param != NULL) 2105 if (fld_param != NULL)
2106 mailimap_body_fld_param_free(fld_param); 2106 mailimap_body_fld_param_free(fld_param);
2107 err: 2107 err:
2108 return res; 2108 return res;
2109} 2109}
2110 2110
2111/* 2111/*
2112 body-fields = body-fld-param SP body-fld-id SP body-fld-desc SP 2112 body-fields = body-fld-param SP body-fld-id SP body-fld-desc SP
2113 body-fld-enc SP body-fld-octets 2113 body-fld-enc SP body-fld-octets
2114*/ 2114*/
2115 2115
2116static int 2116static int
2117mailimap_body_fields_parse(mailstream * fd, MMAPString * buffer, 2117mailimap_body_fields_parse(mailstream * fd, MMAPString * buffer,
2118 size_t * index, 2118 size_t * index,
2119 struct mailimap_body_fields ** result, 2119 struct mailimap_body_fields ** result,
2120 size_t progr_rate, 2120 size_t progr_rate,
2121 progress_function * progr_fun) 2121 progress_function * progr_fun)
2122{ 2122{
2123 struct mailimap_body_fields * body_fields; 2123 struct mailimap_body_fields * body_fields;
2124 size_t cur_token; 2124 size_t cur_token;
2125 struct mailimap_body_fld_param * body_fld_param; 2125 struct mailimap_body_fld_param * body_fld_param;
2126 char * body_fld_id; 2126 char * body_fld_id;
2127 char * body_fld_desc; 2127 char * body_fld_desc;
2128 struct mailimap_body_fld_enc * body_fld_enc; 2128 struct mailimap_body_fld_enc * body_fld_enc;
2129 size_t body_fld_octets; 2129 size_t body_fld_octets;
2130 int r; 2130 int r;
2131 int res; 2131 int res;
2132 2132
2133 body_fld_param = NULL; 2133 body_fld_param = NULL;
2134 body_fld_id = NULL; 2134 body_fld_id = NULL;
2135 body_fld_desc = NULL; 2135 body_fld_desc = NULL;
2136 body_fld_enc = NULL; 2136 body_fld_enc = NULL;
2137 body_fld_octets = 0; 2137 body_fld_octets = 0;
2138 2138
2139 cur_token = * index; 2139 cur_token = * index;
2140 2140
2141 r = mailimap_body_fld_param_parse(fd, buffer, &cur_token, &body_fld_param, 2141 r = mailimap_body_fld_param_parse(fd, buffer, &cur_token, &body_fld_param,
2142 progr_rate, progr_fun); 2142 progr_rate, progr_fun);
2143 if (r != MAILIMAP_NO_ERROR) { 2143 if (r != MAILIMAP_NO_ERROR) {
2144 res = r; 2144 res = r;
2145 goto err; 2145 goto err;
2146 } 2146 }
2147 2147
2148 r = mailimap_space_parse(fd, buffer, &cur_token); 2148 r = mailimap_space_parse(fd, buffer, &cur_token);
2149 if (r != MAILIMAP_NO_ERROR) { 2149 if (r != MAILIMAP_NO_ERROR) {
2150 res = r; 2150 res = r;
2151 goto fld_param_free; 2151 goto fld_param_free;
2152 } 2152 }
2153 2153
2154 r = mailimap_body_fld_id_parse(fd, buffer, &cur_token, &body_fld_id, 2154 r = mailimap_body_fld_id_parse(fd, buffer, &cur_token, &body_fld_id,
2155 progr_rate, progr_fun); 2155 progr_rate, progr_fun);
2156 if (r != MAILIMAP_NO_ERROR) { 2156 if (r != MAILIMAP_NO_ERROR) {
2157 res = r; 2157 res = r;
2158 goto fld_param_free; 2158 goto fld_param_free;
2159 } 2159 }
2160 2160
2161 r = mailimap_space_parse(fd, buffer, &cur_token); 2161 r = mailimap_space_parse(fd, buffer, &cur_token);
2162 if (r != MAILIMAP_NO_ERROR) { 2162 if (r != MAILIMAP_NO_ERROR) {
2163 res = r; 2163 res = r;
2164 goto fld_id_free; 2164 goto fld_id_free;
2165 } 2165 }
2166 2166
2167 r = mailimap_body_fld_desc_parse(fd, buffer, &cur_token, &body_fld_desc, 2167 r = mailimap_body_fld_desc_parse(fd, buffer, &cur_token, &body_fld_desc,
2168 progr_rate, progr_fun); 2168 progr_rate, progr_fun);
2169 if (r != MAILIMAP_NO_ERROR) { 2169 if (r != MAILIMAP_NO_ERROR) {
2170 res = r; 2170 res = r;
2171 goto fld_id_free; 2171 goto fld_id_free;
2172 } 2172 }
2173 2173
2174 r = mailimap_space_parse(fd, buffer, &cur_token); 2174 r = mailimap_space_parse(fd, buffer, &cur_token);
2175 if (r != MAILIMAP_NO_ERROR) { 2175 if (r != MAILIMAP_NO_ERROR) {
2176 res = r; 2176 res = r;
2177 goto fld_desc_free; 2177 goto fld_desc_free;
2178 } 2178 }
2179 2179
2180 r = mailimap_body_fld_enc_parse(fd, buffer, &cur_token, &body_fld_enc, 2180 r = mailimap_body_fld_enc_parse(fd, buffer, &cur_token, &body_fld_enc,
2181 progr_rate, progr_fun); 2181 progr_rate, progr_fun);
2182 if (r != MAILIMAP_NO_ERROR) { 2182 if (r != MAILIMAP_NO_ERROR) {
2183 res = r; 2183 res = r;
2184 goto fld_desc_free; 2184 goto fld_desc_free;
2185 } 2185 }
2186 2186
2187 r = mailimap_space_parse(fd, buffer, &cur_token); 2187 r = mailimap_space_parse(fd, buffer, &cur_token);
2188 if (r != MAILIMAP_NO_ERROR) { 2188 if (r != MAILIMAP_NO_ERROR) {
2189 res = r; 2189 res = r;
2190 goto fld_enc_free; 2190 goto fld_enc_free;
2191 } 2191 }
2192 2192
2193 r = mailimap_body_fld_octets_parse(fd, buffer, &cur_token, 2193 r = mailimap_body_fld_octets_parse(fd, buffer, &cur_token,
2194 &body_fld_octets); 2194 &body_fld_octets);
2195 if (r != MAILIMAP_NO_ERROR) { 2195 if (r != MAILIMAP_NO_ERROR) {
2196 res = r; 2196 res = r;
2197 goto fld_enc_free; 2197 goto fld_enc_free;
2198 } 2198 }
2199 2199
2200 body_fields = mailimap_body_fields_new(body_fld_param, 2200 body_fields = mailimap_body_fields_new(body_fld_param,
2201 body_fld_id, 2201 body_fld_id,
2202 body_fld_desc, 2202 body_fld_desc,
2203 body_fld_enc, 2203 body_fld_enc,
2204 body_fld_octets); 2204 body_fld_octets);
2205 if (body_fields == NULL) { 2205 if (body_fields == NULL) {
2206 res = MAILIMAP_ERROR_MEMORY; 2206 res = MAILIMAP_ERROR_MEMORY;
2207 goto fld_enc_free; 2207 goto fld_enc_free;
2208 } 2208 }
2209 2209
2210 * result = body_fields; 2210 * result = body_fields;
2211 * index = cur_token; 2211 * index = cur_token;
2212 2212
2213 return MAILIMAP_NO_ERROR; 2213 return MAILIMAP_NO_ERROR;
2214 2214
2215 fld_enc_free: 2215 fld_enc_free:
2216 mailimap_body_fld_enc_free(body_fld_enc); 2216 mailimap_body_fld_enc_free(body_fld_enc);
2217 fld_desc_free: 2217 fld_desc_free:
2218 mailimap_body_fld_desc_free(body_fld_desc); 2218 mailimap_body_fld_desc_free(body_fld_desc);
2219 fld_id_free: 2219 fld_id_free:
2220 mailimap_body_fld_id_free(body_fld_id); 2220 mailimap_body_fld_id_free(body_fld_id);
2221 fld_param_free: 2221 fld_param_free:
2222 if (body_fld_param != NULL) 2222 if (body_fld_param != NULL)
2223 mailimap_body_fld_param_free(body_fld_param); 2223 mailimap_body_fld_param_free(body_fld_param);
2224 err: 2224 err:
2225 return res; 2225 return res;
2226} 2226}
2227 2227
2228/* 2228/*
2229 body-fld-desc = nstring 2229 body-fld-desc = nstring
2230*/ 2230*/
2231 2231
2232static int mailimap_body_fld_desc_parse(mailstream * fd, MMAPString * buffer, 2232static int mailimap_body_fld_desc_parse(mailstream * fd, MMAPString * buffer,
2233 size_t * index, char ** result, 2233 size_t * index, char ** result,
2234 size_t progr_rate, 2234 size_t progr_rate,
2235 progress_function * progr_fun) 2235 progress_function * progr_fun)
2236{ 2236{
2237 return mailimap_nstring_parse(fd, buffer, index, result, NULL, 2237 return mailimap_nstring_parse(fd, buffer, index, result, NULL,
2238 progr_rate, progr_fun); 2238 progr_rate, progr_fun);
2239} 2239}
2240 2240
2241/* 2241/*
2242 body-fld-dsp = "(" string SP body-fld-param ")" / nil 2242 body-fld-dsp = "(" string SP body-fld-param ")" / nil
2243*/ 2243*/
2244 2244
2245static int 2245static int
2246mailimap_body_fld_dsp_parse(mailstream * fd, MMAPString * buffer, 2246mailimap_body_fld_dsp_parse(mailstream * fd, MMAPString * buffer,
2247 size_t * index, 2247 size_t * index,
2248 struct mailimap_body_fld_dsp ** result, 2248 struct mailimap_body_fld_dsp ** result,
2249 size_t progr_rate, 2249 size_t progr_rate,
2250 progress_function * progr_fun) 2250 progress_function * progr_fun)
2251{ 2251{
2252 size_t cur_token; 2252 size_t cur_token;
2253 char * name; 2253 char * name;
2254 struct mailimap_body_fld_param * body_fld_param; 2254 struct mailimap_body_fld_param * body_fld_param;
2255 struct mailimap_body_fld_dsp * body_fld_dsp; 2255 struct mailimap_body_fld_dsp * body_fld_dsp;
2256 int res; 2256 int res;
2257 int r; 2257 int r;
2258 2258
2259 cur_token = * index; 2259 cur_token = * index;
2260 name = NULL; 2260 name = NULL;
2261 body_fld_param = NULL; 2261 body_fld_param = NULL;
2262 2262
2263 r = mailimap_nil_parse(fd, buffer, &cur_token); 2263 r = mailimap_nil_parse(fd, buffer, &cur_token);
2264 if (r == MAILIMAP_NO_ERROR) { 2264 if (r == MAILIMAP_NO_ERROR) {
2265 * result = NULL; 2265 * result = NULL;
2266 * index = cur_token; 2266 * index = cur_token;
2267 return MAILIMAP_NO_ERROR; 2267 return MAILIMAP_NO_ERROR;
2268 } 2268 }
2269 2269
2270 if (r != MAILIMAP_ERROR_PARSE) { 2270 if (r != MAILIMAP_ERROR_PARSE) {
2271 res = r; 2271 res = r;
2272 goto err; 2272 goto err;
2273 } 2273 }
2274 2274
2275 r = mailimap_oparenth_parse(fd, buffer, &cur_token); 2275 r = mailimap_oparenth_parse(fd, buffer, &cur_token);
2276 if (r != MAILIMAP_NO_ERROR) { 2276 if (r != MAILIMAP_NO_ERROR) {
2277 res = r; 2277 res = r;
2278 goto err; 2278 goto err;
2279 } 2279 }
2280 2280
2281 r = mailimap_string_parse(fd, buffer, &cur_token, &name, NULL, 2281 r = mailimap_string_parse(fd, buffer, &cur_token, &name, NULL,
2282 progr_rate, progr_fun); 2282 progr_rate, progr_fun);
2283 if (r != MAILIMAP_NO_ERROR) { 2283 if (r != MAILIMAP_NO_ERROR) {
2284 res = r; 2284 res = r;
2285 goto err; 2285 goto err;
2286 } 2286 }
2287 2287
2288 r = mailimap_space_parse(fd, buffer, &cur_token); 2288 r = mailimap_space_parse(fd, buffer, &cur_token);
2289 if (r != MAILIMAP_NO_ERROR) { 2289 if (r != MAILIMAP_NO_ERROR) {
2290 res = r; 2290 res = r;
2291 goto string_free; 2291 goto string_free;
2292 } 2292 }
2293 2293
2294 r = mailimap_body_fld_param_parse(fd, buffer, &cur_token, 2294 r = mailimap_body_fld_param_parse(fd, buffer, &cur_token,
2295 &body_fld_param, 2295 &body_fld_param,
2296 progr_rate, progr_fun); 2296 progr_rate, progr_fun);
2297 if (r != MAILIMAP_NO_ERROR) { 2297 if (r != MAILIMAP_NO_ERROR) {
2298 res = r; 2298 res = r;
2299 goto string_free; 2299 goto string_free;
2300 } 2300 }
2301 2301
2302 r = mailimap_cparenth_parse(fd, buffer, &cur_token); 2302 r = mailimap_cparenth_parse(fd, buffer, &cur_token);
2303 if (r != MAILIMAP_NO_ERROR) { 2303 if (r != MAILIMAP_NO_ERROR) {
2304 res = r; 2304 res = r;
2305 goto string_free; 2305 goto string_free;
2306 } 2306 }
2307 2307
2308 body_fld_dsp = mailimap_body_fld_dsp_new(name, body_fld_param); 2308 body_fld_dsp = mailimap_body_fld_dsp_new(name, body_fld_param);
2309 if (body_fld_dsp == NULL) { 2309 if (body_fld_dsp == NULL) {
2310 res = MAILIMAP_ERROR_MEMORY; 2310 res = MAILIMAP_ERROR_MEMORY;
2311 goto fld_param_free; 2311 goto fld_param_free;
2312 } 2312 }
2313 2313
2314 * index = cur_token; 2314 * index = cur_token;
2315 * result = body_fld_dsp; 2315 * result = body_fld_dsp;
2316 2316
2317 return MAILIMAP_NO_ERROR; 2317 return MAILIMAP_NO_ERROR;
2318 2318
2319 fld_param_free: 2319 fld_param_free:
2320 if (body_fld_param != NULL) 2320 if (body_fld_param != NULL)
2321 mailimap_body_fld_param_free(body_fld_param); 2321 mailimap_body_fld_param_free(body_fld_param);
2322 string_free: 2322 string_free:
2323 mailimap_string_free(name); 2323 mailimap_string_free(name);
2324 err: 2324 err:
2325 return res; 2325 return res;
2326} 2326}
2327 2327
2328/* 2328/*
2329 body-fld-enc = (DQUOTE ("7BIT" / "8BIT" / "BINARY" / "BASE64"/ 2329 body-fld-enc = (DQUOTE ("7BIT" / "8BIT" / "BINARY" / "BASE64"/
2330 "QUOTED-PRINTABLE") DQUOTE) / string 2330 "QUOTED-PRINTABLE") DQUOTE) / string
2331*/ 2331*/
2332 2332
2333static inline int 2333static inline int
2334mailimap_body_fld_known_enc_parse(mailstream * fd, MMAPString * buffer, 2334mailimap_body_fld_known_enc_parse(mailstream * fd, MMAPString * buffer,
2335 size_t * index, 2335 size_t * index,
2336 int * result, 2336 int * result,
2337 size_t progr_rate, 2337 size_t progr_rate,
2338 progress_function * progr_fun) 2338 progress_function * progr_fun)
2339{ 2339{
2340 size_t cur_token; 2340 size_t cur_token;
2341 int type; 2341 int type;
2342 int r; 2342 int r;
2343 int res; 2343 int res;
2344 2344
2345 cur_token = * index; 2345 cur_token = * index;
2346 2346
2347 r = mailimap_dquote_parse(fd, buffer, &cur_token); 2347 r = mailimap_dquote_parse(fd, buffer, &cur_token);
2348 if (r != MAILIMAP_NO_ERROR) { 2348 if (r != MAILIMAP_NO_ERROR) {
2349 res = r; 2349 res = r;
2350 goto err; 2350 goto err;
2351 } 2351 }
2352 2352
2353 type = mailimap_encoding_get_token_value(fd, buffer, &cur_token); 2353 type = mailimap_encoding_get_token_value(fd, buffer, &cur_token);
2354 2354
2355 if (type == -1) { 2355 if (type == -1) {
2356 res = MAILIMAP_ERROR_PARSE; 2356 res = MAILIMAP_ERROR_PARSE;
2357 goto err; 2357 goto err;
2358 } 2358 }
2359 2359
2360 r = mailimap_dquote_parse(fd, buffer, &cur_token); 2360 r = mailimap_dquote_parse(fd, buffer, &cur_token);
2361 if (r != MAILIMAP_NO_ERROR) { 2361 if (r != MAILIMAP_NO_ERROR) {
2362 res = r; 2362 res = r;
2363 goto err; 2363 goto err;
2364 } 2364 }
2365 2365
2366 * result = type; 2366 * result = type;
2367 * index = cur_token; 2367 * index = cur_token;
2368 2368
2369 return MAILIMAP_NO_ERROR; 2369 return MAILIMAP_NO_ERROR;
2370 2370
2371 err: 2371 err:
2372 return res; 2372 return res;
2373} 2373}
2374 2374
2375static int 2375static int
2376mailimap_body_fld_enc_parse(mailstream * fd, MMAPString * buffer, 2376mailimap_body_fld_enc_parse(mailstream * fd, MMAPString * buffer,
2377 size_t * index, 2377 size_t * index,
2378 struct mailimap_body_fld_enc ** result, 2378 struct mailimap_body_fld_enc ** result,
2379 size_t progr_rate, 2379 size_t progr_rate,
2380 progress_function * progr_fun) 2380 progress_function * progr_fun)
2381{ 2381{
2382 size_t cur_token; 2382 size_t cur_token;
2383 int type; 2383 int type;
2384 char * value; 2384 char * value;
2385 struct mailimap_body_fld_enc * body_fld_enc; 2385 struct mailimap_body_fld_enc * body_fld_enc;
2386 int r; 2386 int r;
2387 int res; 2387 int res;
2388 2388
2389 cur_token = * index; 2389 cur_token = * index;
2390 2390
2391 r = mailimap_body_fld_known_enc_parse(fd, buffer, &cur_token, 2391 r = mailimap_body_fld_known_enc_parse(fd, buffer, &cur_token,
2392 &type, progr_rate, progr_fun); 2392 &type, progr_rate, progr_fun);
2393 if (r == MAILIMAP_NO_ERROR) { 2393 if (r == MAILIMAP_NO_ERROR) {
2394 value = NULL; 2394 value = NULL;
2395 } 2395 }
2396 else if (r == MAILIMAP_ERROR_PARSE) { 2396 else if (r == MAILIMAP_ERROR_PARSE) {
2397 type = MAILIMAP_BODY_FLD_ENC_OTHER; 2397 type = MAILIMAP_BODY_FLD_ENC_OTHER;
2398 2398
2399 r = mailimap_string_parse(fd, buffer, &cur_token, &value, NULL, 2399 r = mailimap_string_parse(fd, buffer, &cur_token, &value, NULL,
2400 progr_rate, progr_fun); 2400 progr_rate, progr_fun);
2401 if (r != MAILIMAP_NO_ERROR) { 2401 if (r != MAILIMAP_NO_ERROR) {
2402 res = r; 2402 // LR start
2403 goto err; 2403 // accept NIL and set type to utf8
2404 int ret = r;
2405 r = mailimap_char_parse(fd, buffer, &cur_token, 'N');
2406 if (r == MAILIMAP_NO_ERROR) {
2407 r = mailimap_char_parse(fd, buffer, &cur_token, 'I');
2408 if (r == MAILIMAP_NO_ERROR) {
2409 r = mailimap_char_parse(fd, buffer, &cur_token, 'L');
2410 if (r == MAILIMAP_NO_ERROR) {
2411 type = 4;
2412 ret = MAILIMAP_NO_ERROR;
2413 value = NULL;
2414 }
2415 }
2416 }
2417 if ( ret != MAILIMAP_NO_ERROR ) {
2418 res = ret;
2419 goto err;
2420 }
2421 // LR end
2404 } 2422 }
2405 } 2423 }
2406 else { 2424 else {
2407 res = r; 2425 res = r;
2408 goto err; 2426 goto err;
2409 } 2427 }
2410 2428
2411 body_fld_enc = mailimap_body_fld_enc_new(type, value); 2429 body_fld_enc = mailimap_body_fld_enc_new(type, value);
2412 if (body_fld_enc == NULL) { 2430 if (body_fld_enc == NULL) {
2413 res = MAILIMAP_ERROR_MEMORY; 2431 res = MAILIMAP_ERROR_MEMORY;
2414 goto value_free; 2432 goto value_free;
2415 } 2433 }
2416 2434
2417 * result = body_fld_enc; 2435 * result = body_fld_enc;
2418 * index = cur_token; 2436 * index = cur_token;
2419 2437
2420 return MAILIMAP_NO_ERROR; 2438 return MAILIMAP_NO_ERROR;
2421 2439
2422 value_free: 2440 value_free:
2423 if (value) 2441 if (value)
2424 mailimap_string_free(value); 2442 mailimap_string_free(value);
2425 err: 2443 err:
2426 return res; 2444 return res;
2427} 2445}
2428 2446
2429/* 2447/*
2430 body-fld-id = nstring 2448 body-fld-id = nstring
2431*/ 2449*/
2432 2450
2433static int mailimap_body_fld_id_parse(mailstream * fd, MMAPString * buffer, 2451static int mailimap_body_fld_id_parse(mailstream * fd, MMAPString * buffer,
2434 size_t * index, char ** result, 2452 size_t * index, char ** result,
2435 size_t progr_rate, 2453 size_t progr_rate,
2436 progress_function * progr_fun) 2454 progress_function * progr_fun)
2437{ 2455{
2438 return mailimap_nstring_parse(fd, buffer, index, result, NULL, 2456 return mailimap_nstring_parse(fd, buffer, index, result, NULL,
2439 progr_rate, progr_fun); 2457 progr_rate, progr_fun);
2440} 2458}
2441 2459
2442 2460
2443/* 2461/*
2444 body-fld-lang = nstring / "(" string *(SP string) ")" 2462 body-fld-lang = nstring / "(" string *(SP string) ")"
2445*/ 2463*/
2446 2464
2447/* 2465/*
2448"(" string *(SP string) ")" 2466"(" string *(SP string) ")"
2449*/ 2467*/
2450 2468
2451static int 2469static int
2452mailimap_body_fld_lang_list_parse(mailstream * fd, MMAPString * buffer, 2470mailimap_body_fld_lang_list_parse(mailstream * fd, MMAPString * buffer,
2453 size_t * index, clist ** result, 2471 size_t * index, clist ** result,
2454 size_t progr_rate, 2472 size_t progr_rate,
2455 progress_function * progr_fun) 2473 progress_function * progr_fun)
2456{ 2474{
2457 size_t cur_token; 2475 size_t cur_token;
2458 clist * list; 2476 clist * list;
2459 int r; 2477 int r;
2460 int res; 2478 int res;
2461 2479
2462 cur_token = * index; 2480 cur_token = * index;
2463 2481
2464 r = mailimap_oparenth_parse(fd, buffer, &cur_token); 2482 r = mailimap_oparenth_parse(fd, buffer, &cur_token);
2465 if (r != MAILIMAP_NO_ERROR) { 2483 if (r != MAILIMAP_NO_ERROR) {
2466 res = r; 2484 res = r;
2467 goto err; 2485 goto err;
2468 } 2486 }
2469 2487
2470 list = clist_new(); 2488 list = clist_new();
2471 if (list == NULL) { 2489 if (list == NULL) {
2472 res = MAILIMAP_ERROR_MEMORY; 2490 res = MAILIMAP_ERROR_MEMORY;
2473 goto err; 2491 goto err;
2474 } 2492 }
2475 2493
2476 while (1) { 2494 while (1) {
2477 char * elt; 2495 char * elt;
2478 2496
2479 r = mailimap_string_parse(fd, buffer, &cur_token, &elt, NULL, 2497 r = mailimap_string_parse(fd, buffer, &cur_token, &elt, NULL,
2480 progr_rate, progr_fun); 2498 progr_rate, progr_fun);
2481 if (r != MAILIMAP_ERROR_PARSE) 2499 if (r != MAILIMAP_ERROR_PARSE)
2482 break; 2500 break;
2483 else if (r == MAILIMAP_NO_ERROR) { 2501 else if (r == MAILIMAP_NO_ERROR) {
2484 r = clist_append(list, elt); 2502 r = clist_append(list, elt);
2485 if (r < 0) { 2503 if (r < 0) {
2486 mailimap_string_free(elt); 2504 mailimap_string_free(elt);
2487 res = r; 2505 res = r;
2488 goto list_free; 2506 goto list_free;
2489 } 2507 }
2490 } 2508 }
2491 else { 2509 else {
2492 res = r; 2510 res = r;
2493 goto list_free; 2511 goto list_free;
2494 } 2512 }
2495 } 2513 }
2496 2514
2497 r = mailimap_cparenth_parse(fd, buffer, &cur_token); 2515 r = mailimap_cparenth_parse(fd, buffer, &cur_token);
2498 if (r != MAILIMAP_NO_ERROR) { 2516 if (r != MAILIMAP_NO_ERROR) {
2499 res = r; 2517 res = r;
2500 goto list_free; 2518 goto list_free;
2501 } 2519 }
2502 2520
2503 * index = cur_token; 2521 * index = cur_token;
2504 * result = list; 2522 * result = list;
2505 2523
2506 return MAILIMAP_NO_ERROR; 2524 return MAILIMAP_NO_ERROR;
2507 2525
2508 list_free: 2526 list_free:
2509 clist_foreach(list, (clist_func) mailimap_string_free, NULL); 2527 clist_foreach(list, (clist_func) mailimap_string_free, NULL);
2510 clist_free(list); 2528 clist_free(list);
2511 err: 2529 err:
2512 return res; 2530 return res;
2513} 2531}
2514 2532
2515/* 2533/*
2516 body-fld-lang = nstring / "(" string *(SP string) ")" 2534 body-fld-lang = nstring / "(" string *(SP string) ")"
2517*/ 2535*/
2518 2536
2519static int 2537static int
2520mailimap_body_fld_lang_parse(mailstream * fd, MMAPString * buffer, 2538mailimap_body_fld_lang_parse(mailstream * fd, MMAPString * buffer,
2521 size_t * index, 2539 size_t * index,
2522 struct mailimap_body_fld_lang ** result, 2540 struct mailimap_body_fld_lang ** result,
2523 size_t progr_rate, 2541 size_t progr_rate,
2524 progress_function * progr_fun) 2542 progress_function * progr_fun)
2525{ 2543{
2526 char * value; 2544 char * value;
2527 clist * list; 2545 clist * list;
2528 struct mailimap_body_fld_lang * fld_lang; 2546 struct mailimap_body_fld_lang * fld_lang;
2529 int type; 2547 int type;
2530 int r; 2548 int r;
2531 int res; 2549 int res;
2532 2550
2533 size_t cur_token; 2551 size_t cur_token;
2534 2552
2535 cur_token = * index; 2553 cur_token = * index;
2536 2554
2537 value = NULL; 2555 value = NULL;
2538 list = NULL; 2556 list = NULL;
2539 type = MAILIMAP_BODY_FLD_LANG_ERROR; /* XXX - removes a gcc warning */ 2557 type = MAILIMAP_BODY_FLD_LANG_ERROR; /* XXX - removes a gcc warning */
2540 2558
2541 r = mailimap_nstring_parse(fd, buffer, &cur_token, &value, NULL, 2559 r = mailimap_nstring_parse(fd, buffer, &cur_token, &value, NULL,
2542 progr_rate, progr_fun); 2560 progr_rate, progr_fun);
2543 if (r == MAILIMAP_NO_ERROR) 2561 if (r == MAILIMAP_NO_ERROR)
2544 type = MAILIMAP_BODY_FLD_LANG_SINGLE; 2562 type = MAILIMAP_BODY_FLD_LANG_SINGLE;
2545 2563
2546 if (r == MAILIMAP_ERROR_PARSE) { 2564 if (r == MAILIMAP_ERROR_PARSE) {
2547 r = mailimap_body_fld_lang_list_parse(fd, buffer, &cur_token, &list, 2565 r = mailimap_body_fld_lang_list_parse(fd, buffer, &cur_token, &list,
2548 progr_rate, progr_fun); 2566 progr_rate, progr_fun);
2549 if (r == MAILIMAP_NO_ERROR) 2567 if (r == MAILIMAP_NO_ERROR)
2550 type = MAILIMAP_BODY_FLD_LANG_LIST; 2568 type = MAILIMAP_BODY_FLD_LANG_LIST;
2551 } 2569 }
2552 2570
2553 if (r != MAILIMAP_NO_ERROR) { 2571 if (r != MAILIMAP_NO_ERROR) {
2554 res = r; 2572 res = r;
2555 goto err; 2573 goto err;
2556 } 2574 }
2557 2575
2558 fld_lang = mailimap_body_fld_lang_new(type, value, list); 2576 fld_lang = mailimap_body_fld_lang_new(type, value, list);
2559 if (fld_lang == NULL) { 2577 if (fld_lang == NULL) {
2560 res = MAILIMAP_ERROR_MEMORY; 2578 res = MAILIMAP_ERROR_MEMORY;
2561 goto free; 2579 goto free;
2562 } 2580 }
2563 2581
2564 * index = cur_token; 2582 * index = cur_token;
2565 * result = fld_lang; 2583 * result = fld_lang;
2566 2584
2567 return MAILIMAP_NO_ERROR; 2585 return MAILIMAP_NO_ERROR;
2568 2586
2569 free: 2587 free:
2570 if (value) 2588 if (value)
2571 mailimap_nstring_free(value); 2589 mailimap_nstring_free(value);
2572 if (list) { 2590 if (list) {
2573 clist_foreach(list, (clist_func) mailimap_string_free, NULL); 2591 clist_foreach(list, (clist_func) mailimap_string_free, NULL);
2574 clist_free(list); 2592 clist_free(list);
2575 } 2593 }
2576 err: 2594 err:
2577 return res; 2595 return res;
2578} 2596}
2579 2597
2580/* 2598/*
2581 body-fld-lines = number 2599 body-fld-lines = number
2582*/ 2600*/
2583 2601
2584static int mailimap_body_fld_lines_parse(mailstream * fd, 2602static int mailimap_body_fld_lines_parse(mailstream * fd,
2585 MMAPString * buffer, size_t * index, 2603 MMAPString * buffer, size_t * index,
2586 uint32_t * result) 2604 uint32_t * result)
2587{ 2605{
2588 return mailimap_number_parse(fd, buffer, index, result); 2606 return mailimap_number_parse(fd, buffer, index, result);
2589} 2607}
2590 2608
2591/* 2609/*
2592 body-fld-md5 = nstring 2610 body-fld-md5 = nstring
2593*/ 2611*/
2594 2612
2595static int mailimap_body_fld_md5_parse(mailstream * fd, MMAPString * buffer, 2613static int mailimap_body_fld_md5_parse(mailstream * fd, MMAPString * buffer,
2596 size_t * index, char ** result, 2614 size_t * index, char ** result,
2597 size_t progr_rate, 2615 size_t progr_rate,
2598 progress_function * progr_fun) 2616 progress_function * progr_fun)
2599{ 2617{
2600 return mailimap_nstring_parse(fd, buffer, index, result, NULL, 2618 return mailimap_nstring_parse(fd, buffer, index, result, NULL,
2601 progr_rate, progr_fun); 2619 progr_rate, progr_fun);
2602} 2620}
2603 2621
2604/* 2622/*
2605 body-fld-octets = number 2623 body-fld-octets = number
2606*/ 2624*/
2607 2625
2608static int mailimap_body_fld_octets_parse(mailstream * fd, 2626static int mailimap_body_fld_octets_parse(mailstream * fd,
2609 MMAPString * buffer, size_t * index, 2627 MMAPString * buffer, size_t * index,
2610 uint32_t * result) 2628 uint32_t * result)
2611{ 2629{
2612 return mailimap_number_parse(fd, buffer, index, result); 2630 return mailimap_number_parse(fd, buffer, index, result);
2613} 2631}
2614 2632
2615/* 2633/*
2616 body-fld-param = "(" string SP string *(SP string SP string) ")" / nil 2634 body-fld-param = "(" string SP string *(SP string SP string) ")" / nil
2617*/ 2635*/
2618 2636
2619/* 2637/*
2620 string SP string 2638 string SP string
2621*/ 2639*/
2622 2640
2623static int 2641static int
2624mailimap_single_body_fld_param_parse(mailstream * fd, MMAPString * buffer, 2642mailimap_single_body_fld_param_parse(mailstream * fd, MMAPString * buffer,
2625 size_t * index, 2643 size_t * index,
2626 struct mailimap_single_body_fld_param ** 2644 struct mailimap_single_body_fld_param **
2627 result, 2645 result,
2628 size_t progr_rate, 2646 size_t progr_rate,
2629 progress_function * progr_fun) 2647 progress_function * progr_fun)
2630{ 2648{
2631 struct mailimap_single_body_fld_param * param; 2649 struct mailimap_single_body_fld_param * param;
2632 char * name; 2650 char * name;
2633 char * value; 2651 char * value;
2634 size_t cur_token; 2652 size_t cur_token;
2635 int r; 2653 int r;
2636 int res; 2654 int res;
2637 2655
2638 cur_token = * index; 2656 cur_token = * index;
2639 2657
2640 name = NULL; 2658 name = NULL;
2641 value = NULL; 2659 value = NULL;
2642 2660
2643 r = mailimap_string_parse(fd, buffer, &cur_token, &name, NULL, 2661 r = mailimap_string_parse(fd, buffer, &cur_token, &name, NULL,
2644 progr_rate, progr_fun); 2662 progr_rate, progr_fun);
2645 if (r != MAILIMAP_NO_ERROR) { 2663 if (r != MAILIMAP_NO_ERROR) {
2646 res = r; 2664 res = r;
2647 goto err; 2665 goto err;
2648 } 2666 }
2649 2667
2650 r = mailimap_space_parse(fd, buffer, &cur_token); 2668 r = mailimap_space_parse(fd, buffer, &cur_token);
2651 if (r != MAILIMAP_NO_ERROR) { 2669 if (r != MAILIMAP_NO_ERROR) {
2652 res = r; 2670 res = r;
2653 goto free_name; 2671 goto free_name;
2654 } 2672 }
2655 2673
2656 r = mailimap_string_parse(fd, buffer, &cur_token, &value, NULL, 2674 r = mailimap_string_parse(fd, buffer, &cur_token, &value, NULL,
2657 progr_rate, progr_fun); 2675 progr_rate, progr_fun);
2658 if (r != MAILIMAP_NO_ERROR) { 2676 if (r != MAILIMAP_NO_ERROR) {
2659 res = r; 2677 res = r;
2660 goto free_name; 2678 goto free_name;
2661 } 2679 }
2662 2680
2663 param = mailimap_single_body_fld_param_new(name, value); 2681 param = mailimap_single_body_fld_param_new(name, value);
2664 if (param == NULL) { 2682 if (param == NULL) {
2665 res = MAILIMAP_ERROR_MEMORY; 2683 res = MAILIMAP_ERROR_MEMORY;
2666 goto free_value; 2684 goto free_value;
2667 } 2685 }
2668 2686
2669 * result = param; 2687 * result = param;
2670 * index = cur_token; 2688 * index = cur_token;
2671 2689
2672 return MAILIMAP_NO_ERROR; 2690 return MAILIMAP_NO_ERROR;
2673 2691
2674 free_value: 2692 free_value:
2675 mailimap_string_free(name); 2693 mailimap_string_free(name);
2676 free_name: 2694 free_name:
2677 mailimap_string_free(value); 2695 mailimap_string_free(value);
2678 err: 2696 err:
2679 return res; 2697 return res;
2680} 2698}
2681 2699
2682/* 2700/*
2683 body-fld-param = "(" string SP string *(SP string SP string) ")" / nil 2701 body-fld-param = "(" string SP string *(SP string SP string) ")" / nil
2684*/ 2702*/
2685 2703
2686static int 2704static int
2687mailimap_body_fld_param_parse(mailstream * fd, 2705mailimap_body_fld_param_parse(mailstream * fd,
2688 MMAPString * buffer, size_t * index, 2706 MMAPString * buffer, size_t * index,
2689 struct mailimap_body_fld_param ** result, 2707 struct mailimap_body_fld_param ** result,
2690 size_t progr_rate, 2708 size_t progr_rate,
2691 progress_function * progr_fun) 2709 progress_function * progr_fun)
2692{ 2710{
2693 size_t cur_token; 2711 size_t cur_token;
2694 clist * param_list; 2712 clist * param_list;
2695 struct mailimap_body_fld_param * fld_param; 2713 struct mailimap_body_fld_param * fld_param;
2696 int r; 2714 int r;
2697 int res; 2715 int res;
2698 2716
2699 param_list = NULL; 2717 param_list = NULL;
2700 cur_token = * index; 2718 cur_token = * index;
2701 2719
2702 r = mailimap_nil_parse(fd, buffer, &cur_token); 2720 r = mailimap_nil_parse(fd, buffer, &cur_token);
2703 if (r == MAILIMAP_NO_ERROR) { 2721 if (r == MAILIMAP_NO_ERROR) {
2704 * result = NULL; 2722 * result = NULL;
2705 * index = cur_token; 2723 * index = cur_token;
2706 return MAILIMAP_NO_ERROR; 2724 return MAILIMAP_NO_ERROR;
2707 } 2725 }
2708 2726
2709 if (r != MAILIMAP_ERROR_PARSE) { 2727 if (r != MAILIMAP_ERROR_PARSE) {
2710 res = r; 2728 res = r;
2711 goto err; 2729 goto err;
2712 } 2730 }
2713 2731
2714 r = mailimap_oparenth_parse(fd, buffer, &cur_token); 2732 r = mailimap_oparenth_parse(fd, buffer, &cur_token);
2715 if (r != MAILIMAP_NO_ERROR) { 2733 if (r != MAILIMAP_NO_ERROR) {
2716 res = r; 2734 res = r;
2717 goto err; 2735 goto err;
2718 } 2736 }
2719 2737
2720 r = mailimap_struct_spaced_list_parse(fd, buffer, &cur_token, &param_list, 2738 r = mailimap_struct_spaced_list_parse(fd, buffer, &cur_token, &param_list,
2721 (mailimap_struct_parser *) 2739 (mailimap_struct_parser *)
2722 mailimap_single_body_fld_param_parse, 2740 mailimap_single_body_fld_param_parse,
2723 (mailimap_struct_destructor *) 2741 (mailimap_struct_destructor *)
2724 mailimap_single_body_fld_param_free, 2742 mailimap_single_body_fld_param_free,
2725 progr_rate, progr_fun); 2743 progr_rate, progr_fun);
2726 if (r != MAILIMAP_NO_ERROR) { 2744 if (r != MAILIMAP_NO_ERROR) {
2727 res = r; 2745 res = r;
2728 goto err; 2746 goto err;
2729 } 2747 }
2730 2748
2731 r = mailimap_cparenth_parse(fd, buffer, &cur_token); 2749 r = mailimap_cparenth_parse(fd, buffer, &cur_token);
2732 if (r != MAILIMAP_NO_ERROR) { 2750 if (r != MAILIMAP_NO_ERROR) {
2733 res = r; 2751 res = r;
2734 goto free; 2752 goto free;
2735 } 2753 }
2736 2754
2737 fld_param = mailimap_body_fld_param_new(param_list); 2755 fld_param = mailimap_body_fld_param_new(param_list);
2738 if (fld_param == NULL) { 2756 if (fld_param == NULL) {
2739 res = MAILIMAP_ERROR_MEMORY; 2757 res = MAILIMAP_ERROR_MEMORY;
2740 goto free; 2758 goto free;
2741 } 2759 }
2742 2760
2743 * index = cur_token; 2761 * index = cur_token;
2744 * result = fld_param; 2762 * result = fld_param;
2745 2763
2746 return MAILIMAP_NO_ERROR; 2764 return MAILIMAP_NO_ERROR;
2747 2765
2748 free: 2766 free:
2749 clist_foreach(param_list, 2767 clist_foreach(param_list,
2750 (clist_func) mailimap_single_body_fld_param_free, 2768 (clist_func) mailimap_single_body_fld_param_free,
2751 NULL); 2769 NULL);
2752 clist_free(param_list); 2770 clist_free(param_list);
2753 err: 2771 err:
2754 return res; 2772 return res;
2755} 2773}
2756 2774
2757/* 2775/*
2758 body-type-1part = (body-type-basic / body-type-msg / body-type-text) 2776 body-type-1part = (body-type-basic / body-type-msg / body-type-text)
2759 [SP body-ext-1part] 2777 [SP body-ext-1part]
2760*/ 2778*/
2761 2779
2762static int 2780static int
2763mailimap_body_type_1part_parse(mailstream * fd, MMAPString * buffer, 2781mailimap_body_type_1part_parse(mailstream * fd, MMAPString * buffer,
2764 size_t * index, 2782 size_t * index,
2765 struct mailimap_body_type_1part ** result, 2783 struct mailimap_body_type_1part ** result,
2766 size_t progr_rate, 2784 size_t progr_rate,
2767 progress_function * progr_fun) 2785 progress_function * progr_fun)
2768{ 2786{
2769 size_t cur_token; 2787 size_t cur_token;
2770 struct mailimap_body_type_1part * body_type_1part; 2788 struct mailimap_body_type_1part * body_type_1part;
2771 struct mailimap_body_type_basic * body_type_basic; 2789 struct mailimap_body_type_basic * body_type_basic;
2772 struct mailimap_body_type_msg * body_type_msg; 2790 struct mailimap_body_type_msg * body_type_msg;
2773 struct mailimap_body_type_text * body_type_text; 2791 struct mailimap_body_type_text * body_type_text;
2774 struct mailimap_body_ext_1part * body_ext_1part; 2792 struct mailimap_body_ext_1part * body_ext_1part;
2775 int type; 2793 int type;
2776 size_t final_token; 2794 size_t final_token;
2777 int r; 2795 int r;
2778 int res; 2796 int res;
2779 2797
2780 cur_token = * index; 2798 cur_token = * index;
2781 2799
2782 body_type_basic = NULL; 2800 body_type_basic = NULL;
2783 body_type_msg = NULL; 2801 body_type_msg = NULL;
2784 body_type_text = NULL; 2802 body_type_text = NULL;
2785 body_ext_1part = NULL; 2803 body_ext_1part = NULL;
2786 2804
2787 type = MAILIMAP_BODY_TYPE_1PART_ERROR; /* XXX - removes a gcc warning */ 2805 type = MAILIMAP_BODY_TYPE_1PART_ERROR; /* XXX - removes a gcc warning */
2788 2806
2789 r = mailimap_body_type_msg_parse(fd, buffer, &cur_token, 2807 r = mailimap_body_type_msg_parse(fd, buffer, &cur_token,
2790 &body_type_msg, 2808 &body_type_msg,
2791 progr_rate, progr_fun); 2809 progr_rate, progr_fun);
2792 if (r == MAILIMAP_NO_ERROR) 2810 if (r == MAILIMAP_NO_ERROR)
2793 type = MAILIMAP_BODY_TYPE_1PART_MSG; 2811 type = MAILIMAP_BODY_TYPE_1PART_MSG;
2794 2812
2795 if (r == MAILIMAP_ERROR_PARSE) { 2813 if (r == MAILIMAP_ERROR_PARSE) {
2796 r = mailimap_body_type_text_parse(fd, buffer, &cur_token, 2814 r = mailimap_body_type_text_parse(fd, buffer, &cur_token,
2797 &body_type_text, 2815 &body_type_text,
2798 progr_rate, progr_fun); 2816 progr_rate, progr_fun);
2799 if (r == MAILIMAP_NO_ERROR) 2817 if (r == MAILIMAP_NO_ERROR)
2800 type = MAILIMAP_BODY_TYPE_1PART_TEXT; 2818 type = MAILIMAP_BODY_TYPE_1PART_TEXT;
2801 } 2819 }
2802 2820
2803 if (r == MAILIMAP_ERROR_PARSE) { 2821 if (r == MAILIMAP_ERROR_PARSE) {
2804 r = mailimap_body_type_basic_parse(fd, buffer, &cur_token, 2822 r = mailimap_body_type_basic_parse(fd, buffer, &cur_token,
2805 &body_type_basic, 2823 &body_type_basic,
2806 progr_rate, progr_fun); 2824 progr_rate, progr_fun);
2807 if (r == MAILIMAP_NO_ERROR) 2825 if (r == MAILIMAP_NO_ERROR)
2808 type = MAILIMAP_BODY_TYPE_1PART_BASIC; 2826 type = MAILIMAP_BODY_TYPE_1PART_BASIC;
2809 } 2827 }
2810 2828
2811 if (r != MAILIMAP_NO_ERROR) { 2829 if (r != MAILIMAP_NO_ERROR) {
2812 res = r; 2830 res = r;
2813 goto err; 2831 goto err;
2814 } 2832 }
2815 2833
2816 final_token = cur_token; 2834 final_token = cur_token;
2817 body_ext_1part = NULL; 2835 body_ext_1part = NULL;
2818 2836
2819 r = mailimap_space_parse(fd, buffer, &cur_token); 2837 r = mailimap_space_parse(fd, buffer, &cur_token);
2820 2838
2821 if (r == MAILIMAP_NO_ERROR) { 2839 if (r == MAILIMAP_NO_ERROR) {
2822 r = mailimap_body_ext_1part_parse(fd, buffer, &cur_token, &body_ext_1part, 2840 r = mailimap_body_ext_1part_parse(fd, buffer, &cur_token, &body_ext_1part,
2823 progr_rate, progr_fun); 2841 progr_rate, progr_fun);
2824 if (r == MAILIMAP_NO_ERROR) 2842 if (r == MAILIMAP_NO_ERROR)
2825 final_token = cur_token; 2843 final_token = cur_token;
2826 else if (r == MAILIMAP_ERROR_PARSE) { 2844 else if (r == MAILIMAP_ERROR_PARSE) {
2827 /* do nothing */ 2845 /* do nothing */
2828 } 2846 }
2829 else { 2847 else {
2830 res = r; 2848 res = r;
2831 goto free; 2849 goto free;
2832 } 2850 }
2833 } 2851 }
2834 else if (r == MAILIMAP_ERROR_PARSE) { 2852 else if (r == MAILIMAP_ERROR_PARSE) {
2835 /* do nothing */ 2853 /* do nothing */
2836 } 2854 }
2837 else { 2855 else {
2838 res = r; 2856 res = r;
2839 goto free; 2857 goto free;
2840 } 2858 }
2841 2859
2842 body_type_1part = mailimap_body_type_1part_new(type, body_type_basic, 2860 body_type_1part = mailimap_body_type_1part_new(type, body_type_basic,
2843 body_type_msg, body_type_text, 2861 body_type_msg, body_type_text,
2844 body_ext_1part); 2862 body_ext_1part);
2845 if (body_type_1part == NULL) { 2863 if (body_type_1part == NULL) {
2846 res = MAILIMAP_ERROR_MEMORY; 2864 res = MAILIMAP_ERROR_MEMORY;
2847 goto free; 2865 goto free;
2848 } 2866 }
2849 2867
2850 * index = final_token; 2868 * index = final_token;
2851 * result = body_type_1part; 2869 * result = body_type_1part;
2852 2870
2853 return MAILIMAP_NO_ERROR; 2871 return MAILIMAP_NO_ERROR;
2854 2872
2855 free: 2873 free:
2856 if (body_type_basic) 2874 if (body_type_basic)
2857 mailimap_body_type_basic_free(body_type_basic); 2875 mailimap_body_type_basic_free(body_type_basic);
2858 if (body_type_msg) 2876 if (body_type_msg)
2859 mailimap_body_type_msg_free(body_type_msg); 2877 mailimap_body_type_msg_free(body_type_msg);
2860 if (body_type_text) 2878 if (body_type_text)
2861 mailimap_body_type_text_free(body_type_text); 2879 mailimap_body_type_text_free(body_type_text);
2862 if (body_ext_1part) 2880 if (body_ext_1part)
2863 mailimap_body_ext_1part_free(body_ext_1part); 2881 mailimap_body_ext_1part_free(body_ext_1part);
2864 err: 2882 err:
2865 return res; 2883 return res;
2866} 2884}
2867 2885
2868/* 2886/*
2869 body-type-basic = media-basic SP body-fields 2887 body-type-basic = media-basic SP body-fields
2870 ; MESSAGE subtype MUST NOT be "RFC822" 2888 ; MESSAGE subtype MUST NOT be "RFC822"
2871*/ 2889*/
2872 2890
2873static int 2891static int
2874mailimap_body_type_basic_parse(mailstream * fd, MMAPString * buffer, 2892mailimap_body_type_basic_parse(mailstream * fd, MMAPString * buffer,
2875 size_t * index, 2893 size_t * index,
2876 struct mailimap_body_type_basic ** result, 2894 struct mailimap_body_type_basic ** result,
2877 size_t progr_rate, 2895 size_t progr_rate,
2878 progress_function * progr_fun) 2896 progress_function * progr_fun)
2879{ 2897{
2880 size_t cur_token; 2898 size_t cur_token;
2881 struct mailimap_body_type_basic * body_type_basic; 2899 struct mailimap_body_type_basic * body_type_basic;
2882 struct mailimap_media_basic * media_basic; 2900 struct mailimap_media_basic * media_basic;
2883 struct mailimap_body_fields * body_fields; 2901 struct mailimap_body_fields * body_fields;
2884 int r; 2902 int r;
2885 int res; 2903 int res;
2886 2904
2887 cur_token = * index; 2905 cur_token = * index;
2888 2906
2889 media_basic = NULL; 2907 media_basic = NULL;
2890 body_fields = NULL; 2908 body_fields = NULL;
2891 2909
2892 r = mailimap_media_basic_parse(fd, buffer, &cur_token, &media_basic, 2910 r = mailimap_media_basic_parse(fd, buffer, &cur_token, &media_basic,
2893 progr_rate, progr_fun); 2911 progr_rate, progr_fun);
2894 if (r != MAILIMAP_NO_ERROR) { 2912 if (r != MAILIMAP_NO_ERROR) {
2895 res = r; 2913 res = r;
2896 goto err; 2914 goto err;
2897 } 2915 }
2898 2916
2899 r = mailimap_space_parse(fd, buffer, &cur_token); 2917 r = mailimap_space_parse(fd, buffer, &cur_token);
2900 if (r != MAILIMAP_NO_ERROR) { 2918 if (r != MAILIMAP_NO_ERROR) {
2901 res = r; 2919 res = r;
2902 goto free_media_basic; 2920 goto free_media_basic;
2903 } 2921 }
2904 2922
2905 r = mailimap_body_fields_parse(fd, buffer, &cur_token, &body_fields, 2923 r = mailimap_body_fields_parse(fd, buffer, &cur_token, &body_fields,
2906 progr_rate, progr_fun); 2924 progr_rate, progr_fun);
2907 if (r != MAILIMAP_NO_ERROR) { 2925 if (r != MAILIMAP_NO_ERROR) {
2908 res = r; 2926 res = r;
2909 goto free_media_basic; 2927 goto free_media_basic;
2910 } 2928 }
2911 2929
2912 body_type_basic = mailimap_body_type_basic_new(media_basic, body_fields); 2930 body_type_basic = mailimap_body_type_basic_new(media_basic, body_fields);
2913 if (body_type_basic == NULL) { 2931 if (body_type_basic == NULL) {
2914 res = MAILIMAP_ERROR_MEMORY; 2932 res = MAILIMAP_ERROR_MEMORY;
2915 goto free_body_fields; 2933 goto free_body_fields;
2916 } 2934 }
2917 2935
2918 * index = cur_token; 2936 * index = cur_token;
2919 * result = body_type_basic; 2937 * result = body_type_basic;
2920 2938
2921 return MAILIMAP_NO_ERROR; 2939 return MAILIMAP_NO_ERROR;
2922 2940
2923 free_body_fields: 2941 free_body_fields:
2924 mailimap_body_fields_free(body_fields); 2942 mailimap_body_fields_free(body_fields);
2925 free_media_basic: 2943 free_media_basic:
2926 mailimap_media_basic_free(media_basic); 2944 mailimap_media_basic_free(media_basic);
2927 err: 2945 err:
2928 return res; 2946 return res;
2929} 2947}
2930 2948
2931/* 2949/*
2932 body-type-mpart = 1*body SP media-subtype 2950 body-type-mpart = 1*body SP media-subtype
2933 [SP body-ext-mpart] 2951 [SP body-ext-mpart]
2934*/ 2952*/
2935 2953
2936static int 2954static int
2937mailimap_body_type_mpart_parse(mailstream * fd, 2955mailimap_body_type_mpart_parse(mailstream * fd,
2938 MMAPString * buffer, 2956 MMAPString * buffer,
2939 size_t * index, 2957 size_t * index,
2940 struct mailimap_body_type_mpart ** result, 2958 struct mailimap_body_type_mpart ** result,
2941 size_t progr_rate, 2959 size_t progr_rate,
2942 progress_function * progr_fun) 2960 progress_function * progr_fun)
2943{ 2961{
2944 struct mailimap_body_type_mpart * body_type_mpart; 2962 struct mailimap_body_type_mpart * body_type_mpart;
2945 clist * body_list; 2963 clist * body_list;
2946 size_t cur_token; 2964 size_t cur_token;
2947 size_t final_token; 2965 size_t final_token;
2948 char * media_subtype; 2966 char * media_subtype;
2949 struct mailimap_body_ext_mpart * body_ext_mpart; 2967 struct mailimap_body_ext_mpart * body_ext_mpart;
2950 int r; 2968 int r;
2951 int res; 2969 int res;
2952 2970
2953 cur_token = * index; 2971 cur_token = * index;
2954 2972
2955 body_list = NULL; 2973 body_list = NULL;
2956 media_subtype = NULL; 2974 media_subtype = NULL;
2957 body_ext_mpart = NULL; 2975 body_ext_mpart = NULL;
2958 2976
2959 r = mailimap_struct_multiple_parse(fd, buffer, &cur_token, 2977 r = mailimap_struct_multiple_parse(fd, buffer, &cur_token,
2960 &body_list, 2978 &body_list,
2961 (mailimap_struct_parser *) 2979 (mailimap_struct_parser *)
2962 mailimap_body_parse, 2980 mailimap_body_parse,
2963 (mailimap_struct_destructor *) 2981 (mailimap_struct_destructor *)
2964 mailimap_body_free, 2982 mailimap_body_free,
2965 progr_rate, progr_fun); 2983 progr_rate, progr_fun);
2966 if (r != MAILIMAP_NO_ERROR) { 2984 if (r != MAILIMAP_NO_ERROR) {
2967 res = r; 2985 res = r;
2968 goto err; 2986 goto err;
2969 } 2987 }
2970 2988
2971 r = mailimap_space_parse(fd, buffer, &cur_token); 2989 r = mailimap_space_parse(fd, buffer, &cur_token);
2972 if (r != MAILIMAP_NO_ERROR) { 2990 if (r != MAILIMAP_NO_ERROR) {
2973 res = r; 2991 res = r;
2974 goto free_body_list; 2992 goto free_body_list;
2975 } 2993 }
2976 2994
2977 r = mailimap_media_subtype_parse(fd, buffer, &cur_token, &media_subtype, 2995 r = mailimap_media_subtype_parse(fd, buffer, &cur_token, &media_subtype,
2978 progr_rate, progr_fun); 2996 progr_rate, progr_fun);
2979 if (r != MAILIMAP_NO_ERROR) { 2997 if (r != MAILIMAP_NO_ERROR) {
2980 res = r; 2998 res = r;
2981 goto free_body_list; 2999 goto free_body_list;
2982 } 3000 }
2983 3001
2984 final_token = cur_token; 3002 final_token = cur_token;
2985 3003
2986 body_ext_mpart = NULL; 3004 body_ext_mpart = NULL;
2987 3005
2988 r = mailimap_space_parse(fd, buffer, &cur_token); 3006 r = mailimap_space_parse(fd, buffer, &cur_token);
2989 if (r == MAILIMAP_NO_ERROR) { 3007 if (r == MAILIMAP_NO_ERROR) {
2990 r = mailimap_body_ext_mpart_parse(fd, buffer, &cur_token, &body_ext_mpart, 3008 r = mailimap_body_ext_mpart_parse(fd, buffer, &cur_token, &body_ext_mpart,
2991 progr_rate, progr_fun); 3009 progr_rate, progr_fun);
2992 if (r == MAILIMAP_NO_ERROR) 3010 if (r == MAILIMAP_NO_ERROR)
2993 final_token = cur_token; 3011 final_token = cur_token;
2994 else if (r == MAILIMAP_ERROR_PARSE) { 3012 else if (r == MAILIMAP_ERROR_PARSE) {
2995 /* do nothing */ 3013 /* do nothing */
2996 } 3014 }
2997 else { 3015 else {
2998 res = r; 3016 res = r;
2999 goto free_body_list; 3017 goto free_body_list;
3000 } 3018 }
3001 } 3019 }
3002 else if (r == MAILIMAP_ERROR_PARSE) { 3020 else if (r == MAILIMAP_ERROR_PARSE) {
3003 /* do nothing */ 3021 /* do nothing */
3004 } 3022 }
3005 else { 3023 else {
3006 res = r; 3024 res = r;
3007 goto free_body_list; 3025 goto free_body_list;
3008 } 3026 }
3009 3027
3010 body_type_mpart = mailimap_body_type_mpart_new(body_list, media_subtype, 3028 body_type_mpart = mailimap_body_type_mpart_new(body_list, media_subtype,
3011 body_ext_mpart); 3029 body_ext_mpart);
3012 if (body_type_mpart == NULL) { 3030 if (body_type_mpart == NULL) {
3013 res = MAILIMAP_ERROR_MEMORY; 3031 res = MAILIMAP_ERROR_MEMORY;
3014 goto free_body_ext_mpart; 3032 goto free_body_ext_mpart;
3015 } 3033 }
3016 3034
3017 * result = body_type_mpart; 3035 * result = body_type_mpart;
3018 * index = final_token; 3036 * index = final_token;
3019 3037
3020 return MAILIMAP_NO_ERROR; 3038 return MAILIMAP_NO_ERROR;
3021 3039
3022 free_body_ext_mpart: 3040 free_body_ext_mpart:
3023 if (body_ext_mpart) 3041 if (body_ext_mpart)
3024 mailimap_body_ext_mpart_free(body_ext_mpart); 3042 mailimap_body_ext_mpart_free(body_ext_mpart);
3025 mailimap_media_subtype_free(media_subtype); 3043 mailimap_media_subtype_free(media_subtype);
3026 free_body_list: 3044 free_body_list:
3027 clist_foreach(body_list, (clist_func) mailimap_body_free, NULL); 3045 clist_foreach(body_list, (clist_func) mailimap_body_free, NULL);
3028 clist_free(body_list); 3046 clist_free(body_list);
3029 err: 3047 err:
3030 return res; 3048 return res;
3031} 3049}
3032 3050
3033/* 3051/*
3034 body-type-msg = media-message SP body-fields SP envelope 3052 body-type-msg = media-message SP body-fields SP envelope
3035 SP body SP body-fld-lines 3053 SP body SP body-fld-lines
3036*/ 3054*/
3037 3055
3038static int 3056static int
3039mailimap_body_type_msg_parse(mailstream * fd, MMAPString * buffer, 3057mailimap_body_type_msg_parse(mailstream * fd, MMAPString * buffer,
3040 size_t * index, 3058 size_t * index,
3041 struct mailimap_body_type_msg ** result, 3059 struct mailimap_body_type_msg ** result,
3042 size_t progr_rate, 3060 size_t progr_rate,
3043 progress_function * progr_fun) 3061 progress_function * progr_fun)
3044{ 3062{
3045 struct mailimap_body_fields * body_fields; 3063 struct mailimap_body_fields * body_fields;
3046 struct mailimap_envelope * envelope; 3064 struct mailimap_envelope * envelope;
3047 struct mailimap_body * body; 3065 struct mailimap_body * body;
3048 uint32_t body_fld_lines; 3066 uint32_t body_fld_lines;
3049 struct mailimap_body_type_msg * body_type_msg; 3067 struct mailimap_body_type_msg * body_type_msg;
3050 size_t cur_token; 3068 size_t cur_token;
3051 int r; 3069 int r;
3052 int res; 3070 int res;
3053 3071
3054 cur_token = * index; 3072 cur_token = * index;
3055 3073
3056 body_fields = NULL; 3074 body_fields = NULL;
3057 envelope = NULL; 3075 envelope = NULL;
3058 body = NULL; 3076 body = NULL;
3059 body_fld_lines = 0; 3077 body_fld_lines = 0;
3060 3078
3061 r = mailimap_media_message_parse(fd, buffer, &cur_token); 3079 r = mailimap_media_message_parse(fd, buffer, &cur_token);
3062 if (r != MAILIMAP_NO_ERROR) { 3080 if (r != MAILIMAP_NO_ERROR) {
3063 res = r; 3081 res = r;
3064 goto err; 3082 goto err;
3065 } 3083 }
3066 3084
3067 r = mailimap_space_parse(fd, buffer, &cur_token); 3085 r = mailimap_space_parse(fd, buffer, &cur_token);
3068 if (r != MAILIMAP_NO_ERROR) { 3086 if (r != MAILIMAP_NO_ERROR) {
3069 res = r; 3087 res = r;
3070 goto err; 3088 goto err;
3071 } 3089 }
3072 3090
3073 r = mailimap_body_fields_parse(fd, buffer, &cur_token, &body_fields, 3091 r = mailimap_body_fields_parse(fd, buffer, &cur_token, &body_fields,
3074 progr_rate, progr_fun); 3092 progr_rate, progr_fun);
3075 if (r != MAILIMAP_NO_ERROR) { 3093 if (r != MAILIMAP_NO_ERROR) {
3076 res = r; 3094 res = r;
3077 goto err; 3095 goto err;
3078 } 3096 }
3079 3097
3080 r = mailimap_space_parse(fd, buffer, &cur_token); 3098 r = mailimap_space_parse(fd, buffer, &cur_token);
3081 if (r != MAILIMAP_NO_ERROR) { 3099 if (r != MAILIMAP_NO_ERROR) {
3082 res = r; 3100 res = r;
3083 goto body_fields; 3101 goto body_fields;
3084 } 3102 }
3085 3103
3086 r = mailimap_envelope_parse(fd, buffer, &cur_token, &envelope, 3104 r = mailimap_envelope_parse(fd, buffer, &cur_token, &envelope,
3087 progr_rate, progr_fun); 3105 progr_rate, progr_fun);
3088 if (r != MAILIMAP_NO_ERROR) { 3106 if (r != MAILIMAP_NO_ERROR) {
3089 res = r; 3107 res = r;
3090 goto body_fields; 3108 goto body_fields;
3091 } 3109 }
3092 3110
3093 r = mailimap_space_parse(fd, buffer, &cur_token); 3111 r = mailimap_space_parse(fd, buffer, &cur_token);
3094 if (r != MAILIMAP_NO_ERROR) { 3112 if (r != MAILIMAP_NO_ERROR) {
3095 res = r; 3113 res = r;
3096 goto envelope; 3114 goto envelope;
3097 } 3115 }
3098 3116
3099 r = mailimap_body_parse(fd, buffer, &cur_token, &body, 3117 r = mailimap_body_parse(fd, buffer, &cur_token, &body,
3100 progr_rate, progr_fun); 3118 progr_rate, progr_fun);
3101 if (r != MAILIMAP_NO_ERROR) { 3119 if (r != MAILIMAP_NO_ERROR) {
3102 res = r; 3120 res = r;
3103 goto envelope; 3121 goto envelope;
3104 } 3122 }
3105 3123
3106 r = mailimap_space_parse(fd, buffer, &cur_token); 3124 r = mailimap_space_parse(fd, buffer, &cur_token);
3107 if (r != MAILIMAP_NO_ERROR) { 3125 if (r != MAILIMAP_NO_ERROR) {
3108 res = r; 3126 res = r;
3109 goto body; 3127 goto body;
3110 } 3128 }
3111 3129
3112 r = mailimap_body_fld_lines_parse(fd, buffer, &cur_token, 3130 r = mailimap_body_fld_lines_parse(fd, buffer, &cur_token,
3113 &body_fld_lines); 3131 &body_fld_lines);
3114 if (r != MAILIMAP_NO_ERROR) { 3132 if (r != MAILIMAP_NO_ERROR) {
3115 res = r; 3133 res = r;
3116 goto body; 3134 goto body;
3117 } 3135 }
3118 3136
3119 body_type_msg = mailimap_body_type_msg_new(body_fields, envelope, 3137 body_type_msg = mailimap_body_type_msg_new(body_fields, envelope,
3120 body, body_fld_lines); 3138 body, body_fld_lines);
3121 if (body_type_msg == NULL) { 3139 if (body_type_msg == NULL) {
3122 res = MAILIMAP_ERROR_MEMORY; 3140 res = MAILIMAP_ERROR_MEMORY;
3123 goto body; 3141 goto body;
3124 } 3142 }
3125 3143
3126 * result = body_type_msg; 3144 * result = body_type_msg;
3127 * index = cur_token; 3145 * index = cur_token;
3128 3146
3129 return MAILIMAP_NO_ERROR; 3147 return MAILIMAP_NO_ERROR;
3130 3148
3131 body: 3149 body:
3132 mailimap_body_free(body); 3150 mailimap_body_free(body);
3133 envelope: 3151 envelope:
3134 mailimap_envelope_free(envelope); 3152 mailimap_envelope_free(envelope);
3135 body_fields: 3153 body_fields:
3136 mailimap_body_fields_free(body_fields); 3154 mailimap_body_fields_free(body_fields);
3137 err: 3155 err:
3138 return res; 3156 return res;
3139} 3157}
3140 3158
3141/* 3159/*
3142 body-type-text = media-text SP body-fields SP body-fld-lines 3160 body-type-text = media-text SP body-fields SP body-fld-lines
3143*/ 3161*/
3144 3162
3145static int 3163static int
3146mailimap_body_type_text_parse(mailstream * fd, MMAPString * buffer, 3164mailimap_body_type_text_parse(mailstream * fd, MMAPString * buffer,
3147 size_t * index, 3165 size_t * index,
3148 struct mailimap_body_type_text ** 3166 struct mailimap_body_type_text **
3149 result, 3167 result,
3150 size_t progr_rate, 3168 size_t progr_rate,
3151 progress_function * progr_fun) 3169 progress_function * progr_fun)
3152{ 3170{
3153 char * media_text; 3171 char * media_text;
3154 struct mailimap_body_fields * body_fields; 3172 struct mailimap_body_fields * body_fields;
3155 uint32_t body_fld_lines; 3173 uint32_t body_fld_lines;
3156 struct mailimap_body_type_text * body_type_text; 3174 struct mailimap_body_type_text * body_type_text;
3157 size_t cur_token; 3175 size_t cur_token;
3158 int r; 3176 int r;
3159 int res; 3177 int res;
3160 3178
3161 media_text = NULL; 3179 media_text = NULL;
3162 body_fields = NULL; 3180 body_fields = NULL;
3163 body_fld_lines = 0; 3181 body_fld_lines = 0;
3164 3182
3165 cur_token = * index; 3183 cur_token = * index;
3166 3184
3167 r = mailimap_media_text_parse(fd, buffer, &cur_token, &media_text, 3185 r = mailimap_media_text_parse(fd, buffer, &cur_token, &media_text,
3168 progr_rate, progr_fun); 3186 progr_rate, progr_fun);
3169 if (r != MAILIMAP_NO_ERROR) { 3187 if (r != MAILIMAP_NO_ERROR) {
3170 res = r; 3188 res = r;
3171 goto err; 3189 goto err;
3172 } 3190 }
3173 3191
3174 r = mailimap_space_parse(fd, buffer, &cur_token); 3192 r = mailimap_space_parse(fd, buffer, &cur_token);
3175 if (r != MAILIMAP_NO_ERROR) { 3193 if (r != MAILIMAP_NO_ERROR) {
3176 res = r; 3194 res = r;
3177 goto free_media_text; 3195 goto free_media_text;
3178 } 3196 }
3179 3197
3180 r = mailimap_body_fields_parse(fd, buffer, &cur_token, &body_fields, 3198 r = mailimap_body_fields_parse(fd, buffer, &cur_token, &body_fields,
3181 progr_rate, progr_fun); 3199 progr_rate, progr_fun);
3182 if (r != MAILIMAP_NO_ERROR) { 3200 if (r != MAILIMAP_NO_ERROR) {
3183 res = r; 3201 res = r;
3184 goto free_media_text; 3202 goto free_media_text;
3185 } 3203 }
3186 3204
3187 r = mailimap_space_parse(fd, buffer, &cur_token); 3205 r = mailimap_space_parse(fd, buffer, &cur_token);
3188 if (r != MAILIMAP_NO_ERROR) { 3206 if (r != MAILIMAP_NO_ERROR) {
3189 res = r; 3207 res = r;
3190 goto free_body_fields; 3208 goto free_body_fields;
3191 } 3209 }
3192 3210
3193 r = mailimap_body_fld_lines_parse(fd, buffer, &cur_token, &body_fld_lines); 3211 r = mailimap_body_fld_lines_parse(fd, buffer, &cur_token, &body_fld_lines);
3194 if (r != MAILIMAP_NO_ERROR) { 3212 if (r != MAILIMAP_NO_ERROR) {
3195 res = r; 3213 res = r;
3196 goto free_body_fields; 3214 goto free_body_fields;
3197 } 3215 }
3198 3216
3199 body_type_text = mailimap_body_type_text_new(media_text, body_fields, 3217 body_type_text = mailimap_body_type_text_new(media_text, body_fields,
3200 body_fld_lines); 3218 body_fld_lines);
3201 if (body_type_text == NULL) { 3219 if (body_type_text == NULL) {
3202 res = MAILIMAP_ERROR_MEMORY; 3220 res = MAILIMAP_ERROR_MEMORY;
3203 goto free_body_fields; 3221 goto free_body_fields;
3204 } 3222 }
3205 3223
3206 * result = body_type_text; 3224 * result = body_type_text;
3207 * index = cur_token; 3225 * index = cur_token;
3208 3226
3209 return MAILIMAP_NO_ERROR; 3227 return MAILIMAP_NO_ERROR;
3210 3228
3211 free_body_fields: 3229 free_body_fields:
3212 mailimap_body_fields_free(body_fields); 3230 mailimap_body_fields_free(body_fields);
3213 free_media_text: 3231 free_media_text:
3214 mailimap_media_text_free(media_text); 3232 mailimap_media_text_free(media_text);
3215 err: 3233 err:
3216 return res; 3234 return res;
3217} 3235}
3218 3236
3219 3237
3220/* 3238/*
3221 capability = ("AUTH=" auth-type) / atom 3239 capability = ("AUTH=" auth-type) / atom
3222 ; New capabilities MUST begin with "X" or be 3240 ; New capabilities MUST begin with "X" or be
3223 ; registered with IANA as standard or 3241 ; registered with IANA as standard or
3224 ; standards-track 3242 ; standards-track
3225*/ 3243*/
3226 3244
3227static int 3245static int
3228mailimap_capability_parse(mailstream * fd, MMAPString * buffer, 3246mailimap_capability_parse(mailstream * fd, MMAPString * buffer,
3229 size_t * index, 3247 size_t * index,
3230 struct mailimap_capability ** result, 3248 struct mailimap_capability ** result,
3231 size_t progr_rate, 3249 size_t progr_rate,
3232 progress_function * progr_fun) 3250 progress_function * progr_fun)
3233{ 3251{
3234 size_t cur_token; 3252 size_t cur_token;
3235 int type; 3253 int type;
3236 char * auth_type; 3254 char * auth_type;
3237 char * atom; 3255 char * atom;
3238 struct mailimap_capability * cap; 3256 struct mailimap_capability * cap;
3239 int r; 3257 int r;
3240 int res; 3258 int res;
3241 3259
3242 cur_token = * index; 3260 cur_token = * index;
3243 3261
3244 auth_type = NULL; 3262 auth_type = NULL;
3245 atom = NULL; 3263 atom = NULL;
3246 3264
3247 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, "AUTH="); 3265 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, "AUTH=");
3248 switch (r) { 3266 switch (r) {
3249 case MAILIMAP_NO_ERROR: 3267 case MAILIMAP_NO_ERROR:
3250 type = MAILIMAP_CAPABILITY_AUTH_TYPE; 3268 type = MAILIMAP_CAPABILITY_AUTH_TYPE;
3251 3269
3252 r = mailimap_auth_type_parse(fd, buffer, &cur_token, &auth_type, 3270 r = mailimap_auth_type_parse(fd, buffer, &cur_token, &auth_type,
3253 progr_rate, progr_fun); 3271 progr_rate, progr_fun);
3254 if (r != MAILIMAP_NO_ERROR) { 3272 if (r != MAILIMAP_NO_ERROR) {
3255 res = r; 3273 res = r;
3256 goto err; 3274 goto err;
3257 } 3275 }
3258 break; 3276 break;
3259 3277
3260 case MAILIMAP_ERROR_PARSE: 3278 case MAILIMAP_ERROR_PARSE:
3261 r = mailimap_atom_parse(fd, buffer, &cur_token, &atom, 3279 r = mailimap_atom_parse(fd, buffer, &cur_token, &atom,
3262 progr_rate, progr_fun); 3280 progr_rate, progr_fun);
3263 if (r != MAILIMAP_NO_ERROR) { 3281 if (r != MAILIMAP_NO_ERROR) {
3264 res = r; 3282 res = r;
3265 goto err; 3283 goto err;
3266 } 3284 }
3267 3285
3268 type = MAILIMAP_CAPABILITY_NAME; 3286 type = MAILIMAP_CAPABILITY_NAME;
3269 break; 3287 break;
3270 3288
3271 default: 3289 default:
3272 res = r; 3290 res = r;
3273 goto err; 3291 goto err;
3274 } 3292 }
3275 3293
3276 cap = mailimap_capability_new(type, auth_type, atom); 3294 cap = mailimap_capability_new(type, auth_type, atom);
3277 if (cap == NULL) { 3295 if (cap == NULL) {
3278 res = MAILIMAP_ERROR_MEMORY; 3296 res = MAILIMAP_ERROR_MEMORY;
3279 goto free; 3297 goto free;
3280 } 3298 }
3281 3299
3282 * result = cap; 3300 * result = cap;
3283 * index = cur_token; 3301 * index = cur_token;
3284 3302
3285 return MAILIMAP_NO_ERROR; 3303 return MAILIMAP_NO_ERROR;
3286 3304
3287 free: 3305 free:
3288 if (auth_type) 3306 if (auth_type)
3289 mailimap_auth_type_free(auth_type); 3307 mailimap_auth_type_free(auth_type);
3290 if (atom) 3308 if (atom)
3291 mailimap_atom_free(atom); 3309 mailimap_atom_free(atom);
3292 err: 3310 err:
3293 return res; 3311 return res;
3294} 3312}
3295 3313
3296/* 3314/*
3297 capability-data = "CAPABILITY" *(SP capability) SP "IMAP4rev1" 3315 capability-data = "CAPABILITY" *(SP capability) SP "IMAP4rev1"
3298 *(SP capability) 3316 *(SP capability)
3299 ; IMAP4rev1 servers which offer RFC 1730 3317 ; IMAP4rev1 servers which offer RFC 1730
3300 ; compatibility MUST list "IMAP4" as the first 3318 ; compatibility MUST list "IMAP4" as the first
3301 ; capability. 3319 ; capability.
3302*/ 3320*/
3303 3321
3304/* 3322/*
3305 SP capability *(SP capability) 3323 SP capability *(SP capability)
3306*/ 3324*/
3307 3325
3308static int mailimap_capability_list_parse(mailstream * fd, 3326static int mailimap_capability_list_parse(mailstream * fd,
3309 MMAPString * buffer, 3327 MMAPString * buffer,
3310 size_t * index, 3328 size_t * index,
3311 clist ** result, 3329 clist ** result,
3312 size_t progr_rate, 3330 size_t progr_rate,
3313 progress_function * progr_fun) 3331 progress_function * progr_fun)
3314{ 3332{
3315 size_t cur_token; 3333 size_t cur_token;
3316 clist * list; 3334 clist * list;
3317 int r; 3335 int r;
3318 3336
3319 cur_token = * index; 3337 cur_token = * index;
3320 3338
3321 r = mailimap_space_parse(fd, buffer, &cur_token); 3339 r = mailimap_space_parse(fd, buffer, &cur_token);
3322 if (r != MAILIMAP_NO_ERROR) 3340 if (r != MAILIMAP_NO_ERROR)
3323 return r; 3341 return r;
3324 3342
3325 r = mailimap_struct_spaced_list_parse(fd, buffer, &cur_token, &list, 3343 r = mailimap_struct_spaced_list_parse(fd, buffer, &cur_token, &list,
3326 (mailimap_struct_parser *) 3344 (mailimap_struct_parser *)
3327 mailimap_capability_parse, 3345 mailimap_capability_parse,
3328 (mailimap_struct_destructor *) 3346 (mailimap_struct_destructor *)
3329 mailimap_capability_free, 3347 mailimap_capability_free,
3330 progr_rate, progr_fun); 3348 progr_rate, progr_fun);
3331 if (r != MAILIMAP_NO_ERROR) 3349 if (r != MAILIMAP_NO_ERROR)
3332 return r; 3350 return r;
3333 3351
3334 * index = cur_token; 3352 * index = cur_token;
3335 * result = list; 3353 * result = list;
3336 3354
3337 return MAILIMAP_NO_ERROR; 3355 return MAILIMAP_NO_ERROR;
3338} 3356}
3339 3357
3340static int 3358static int
3341mailimap_capability_data_parse(mailstream * fd, MMAPString * buffer, 3359mailimap_capability_data_parse(mailstream * fd, MMAPString * buffer,
3342 size_t * index, 3360 size_t * index,
3343 struct mailimap_capability_data ** result, 3361 struct mailimap_capability_data ** result,
3344 size_t progr_rate, 3362 size_t progr_rate,
3345 progress_function * progr_fun) 3363 progress_function * progr_fun)
3346{ 3364{
3347 size_t cur_token; 3365 size_t cur_token;
3348 clist * cap_list; 3366 clist * cap_list;
3349#if 0 3367#if 0
3350 clist * cap_list_2; 3368 clist * cap_list_2;
3351#endif 3369#endif
3352 struct mailimap_capability_data * cap_data; 3370 struct mailimap_capability_data * cap_data;
3353 int r; 3371 int r;
3354 int res; 3372 int res;
3355 3373
3356 cur_token = * index; 3374 cur_token = * index;
3357 3375
3358 cap_list = NULL; 3376 cap_list = NULL;
3359#if 0 3377#if 0
3360 cap_list_2 = NULL; 3378 cap_list_2 = NULL;
3361#endif 3379#endif
3362 3380
3363 r = mailimap_token_case_insensitive_parse(fd, buffer, 3381 r = mailimap_token_case_insensitive_parse(fd, buffer,
3364 &cur_token, "CAPABILITY"); 3382 &cur_token, "CAPABILITY");
3365 if (r != MAILIMAP_NO_ERROR) { 3383 if (r != MAILIMAP_NO_ERROR) {
3366 res = r; 3384 res = r;
3367 goto err; 3385 goto err;
3368 } 3386 }
3369 3387
3370 r = mailimap_capability_list_parse(fd, buffer, &cur_token, 3388 r = mailimap_capability_list_parse(fd, buffer, &cur_token,
3371 &cap_list, 3389 &cap_list,
3372 progr_rate, progr_fun); 3390 progr_rate, progr_fun);
3373 3391
3374 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) { 3392 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) {
3375 res = r; 3393 res = r;
3376 goto err; 3394 goto err;
3377 } 3395 }
3378 3396
3379#if 0 3397#if 0
3380 if (!mailimap_space_parse(fd, buffer, &cur_token)) { 3398 if (!mailimap_space_parse(fd, buffer, &cur_token)) {
3381 res = r; 3399 res = r;
3382 goto free_list; 3400 goto free_list;
3383 } 3401 }
3384 3402
3385 if (!mailimap_token_case_insensitive_parse(fd, buffer, 3403 if (!mailimap_token_case_insensitive_parse(fd, buffer,
3386 &cur_token, "IMAP4rev1")) 3404 &cur_token, "IMAP4rev1"))
3387 goto free_list; 3405 goto free_list;
3388 3406
3389 r = mailimap_capability_list_parse(fd, buffer, &cur_token, 3407 r = mailimap_capability_list_parse(fd, buffer, &cur_token,
3390 &cap_list_2, 3408 &cap_list_2,
3391 progr_rate, progr_fun); 3409 progr_rate, progr_fun);
3392 3410
3393 cap_list = g_list_concat(cap_list, cap_list_2); 3411 cap_list = g_list_concat(cap_list, cap_list_2);
3394#endif 3412#endif
3395 3413
3396 cap_data = mailimap_capability_data_new(cap_list); 3414 cap_data = mailimap_capability_data_new(cap_list);
3397 if (cap_data == NULL) { 3415 if (cap_data == NULL) {
3398 res = MAILIMAP_ERROR_MEMORY; 3416 res = MAILIMAP_ERROR_MEMORY;
3399 goto free_list; 3417 goto free_list;
3400 } 3418 }
3401 3419
3402 * result = cap_data; 3420 * result = cap_data;
3403 * index = cur_token; 3421 * index = cur_token;
3404 3422
3405 return MAILIMAP_NO_ERROR; 3423 return MAILIMAP_NO_ERROR;
3406 3424
3407 free_list: 3425 free_list:
3408 if (cap_list) { 3426 if (cap_list) {
3409 clist_foreach(cap_list, (clist_func) mailimap_capability_free, NULL); 3427 clist_foreach(cap_list, (clist_func) mailimap_capability_free, NULL);
3410 clist_free(cap_list); 3428 clist_free(cap_list);
3411 } 3429 }
3412 err: 3430 err:
3413 return res; 3431 return res;
3414} 3432}
3415 3433
3416/* 3434/*
3417 UNIMPLEMENTED BECAUSE UNUSED (only in literal) 3435 UNIMPLEMENTED BECAUSE UNUSED (only in literal)
3418 CHAR8 = %x01-ff 3436 CHAR8 = %x01-ff
3419 ; any OCTET except NUL, %x00 3437 ; any OCTET except NUL, %x00
3420*/ 3438*/
3421 3439
3422/* 3440/*
3423static gboolean is_char8(gchar ch) 3441static gboolean is_char8(gchar ch)
3424{ 3442{
3425 return (ch != 0x00); 3443 return (ch != 0x00);
3426} 3444}
3427*/ 3445*/
3428 3446
3429 3447
3430/* 3448/*
3431UNIMPLEMENTED 3449UNIMPLEMENTED
3432 command = tag SP (command-any / command-auth / command-nonauth / 3450 command = tag SP (command-any / command-auth / command-nonauth /
3433 command-select) CRLF 3451 command-select) CRLF
3434 ; Modal based on state 3452 ; Modal based on state
3435*/ 3453*/
3436 3454
3437/* 3455/*
3438UNIMPLEMENTED 3456UNIMPLEMENTED
3439 command-any = "CAPABILITY" / "LOGOUT" / "NOOP" / x-command 3457 command-any = "CAPABILITY" / "LOGOUT" / "NOOP" / x-command
3440 ; Valid in all states 3458 ; Valid in all states
3441*/ 3459*/
3442 3460
3443/* 3461/*
3444UNIMPLEMENTED 3462UNIMPLEMENTED
3445 command-auth = append / create / delete / examine / list / lsub / 3463 command-auth = append / create / delete / examine / list / lsub /
3446 rename / select / status / subscribe / unsubscribe 3464 rename / select / status / subscribe / unsubscribe
3447 ; Valid only in Authenticated or Selected state 3465 ; Valid only in Authenticated or Selected state
3448*/ 3466*/
3449 3467
3450/* 3468/*
3451UNIMPLEMENTED 3469UNIMPLEMENTED
3452 command-nonauth = login / authenticate 3470 command-nonauth = login / authenticate
3453 ; Valid only when in Not Authenticated state 3471 ; Valid only when in Not Authenticated state
3454*/ 3472*/
3455 3473
3456/* 3474/*
3457UNIMPLEMENTED 3475UNIMPLEMENTED
3458 command-select = "CHECK" / "CLOSE" / "EXPUNGE" / copy / fetch / store / 3476 command-select = "CHECK" / "CLOSE" / "EXPUNGE" / copy / fetch / store /
3459 uid / search 3477 uid / search
3460 ; Valid only when in Selected state 3478 ; Valid only when in Selected state
3461*/ 3479*/
3462 3480
3463/* 3481/*
3464 continue-req = "+" SP (resp-text / base64) CRLF 3482 continue-req = "+" SP (resp-text / base64) CRLF
3465*/ 3483*/
3466 3484
3467int 3485int
3468mailimap_continue_req_parse(mailstream * fd, MMAPString * buffer, 3486mailimap_continue_req_parse(mailstream * fd, MMAPString * buffer,
3469 size_t * index, 3487 size_t * index,
3470 struct mailimap_continue_req ** result, 3488 struct mailimap_continue_req ** result,
3471 size_t progr_rate, 3489 size_t progr_rate,
3472 progress_function * progr_fun) 3490 progress_function * progr_fun)
3473{ 3491{
3474 struct mailimap_resp_text * resp_text; 3492 struct mailimap_resp_text * resp_text;
3475 size_t cur_token; 3493 size_t cur_token;
3476 struct mailimap_continue_req * cont_req; 3494 struct mailimap_continue_req * cont_req;
3477 char * base64; 3495 char * base64;
3478 int type; 3496 int type;
3479 int r; 3497 int r;
3480 int res; 3498 int res;
3481 3499
3482 cur_token = * index; 3500 cur_token = * index;
3483 3501
3484 r = mailimap_plus_parse(fd, buffer, &cur_token); 3502 r = mailimap_plus_parse(fd, buffer, &cur_token);
3485 if (r != MAILIMAP_NO_ERROR) 3503 if (r != MAILIMAP_NO_ERROR)
3486 return r; 3504 return r;
3487 3505
3488 r = mailimap_space_parse(fd, buffer, &cur_token); 3506 r = mailimap_space_parse(fd, buffer, &cur_token);
3489 if (r != MAILIMAP_NO_ERROR) 3507 if (r != MAILIMAP_NO_ERROR)
3490 return r; 3508 return r;
3491 3509
3492 resp_text = NULL; 3510 resp_text = NULL;
3493 base64 = NULL; 3511 base64 = NULL;
3494 3512
3495 type = MAILIMAP_CONTINUE_REQ_ERROR; /* XXX - removes a gcc warning */ 3513 type = MAILIMAP_CONTINUE_REQ_ERROR; /* XXX - removes a gcc warning */
3496 3514
3497 r = mailimap_base64_parse(fd, buffer, &cur_token, &base64, 3515 r = mailimap_base64_parse(fd, buffer, &cur_token, &base64,
3498 progr_rate, progr_fun); 3516 progr_rate, progr_fun);
3499 3517
3500 if (r == MAILIMAP_NO_ERROR) 3518 if (r == MAILIMAP_NO_ERROR)
3501 type = MAILIMAP_CONTINUE_REQ_BASE64; 3519 type = MAILIMAP_CONTINUE_REQ_BASE64;
3502 3520
3503 if (r == MAILIMAP_ERROR_PARSE) { 3521 if (r == MAILIMAP_ERROR_PARSE) {
3504 r = mailimap_resp_text_parse(fd, buffer, &cur_token, &resp_text, 3522 r = mailimap_resp_text_parse(fd, buffer, &cur_token, &resp_text,
3505 progr_rate, progr_fun); 3523 progr_rate, progr_fun);
3506 3524
3507 if (r == MAILIMAP_NO_ERROR) 3525 if (r == MAILIMAP_NO_ERROR)
3508 type = MAILIMAP_CONTINUE_REQ_TEXT; 3526 type = MAILIMAP_CONTINUE_REQ_TEXT;
3509 } 3527 }
3510 3528
3511 if (r != MAILIMAP_NO_ERROR) { 3529 if (r != MAILIMAP_NO_ERROR) {
3512 res = r; 3530 res = r;
3513 goto err; 3531 goto err;
3514 } 3532 }
3515 3533
3516 r = mailimap_crlf_parse(fd, buffer, &cur_token); 3534 r = mailimap_crlf_parse(fd, buffer, &cur_token);
3517 if (r != MAILIMAP_NO_ERROR) { 3535 if (r != MAILIMAP_NO_ERROR) {
3518 res = r; 3536 res = r;
3519 goto free; 3537 goto free;
3520 } 3538 }
3521 3539
3522 cont_req = mailimap_continue_req_new(type, resp_text, base64); 3540 cont_req = mailimap_continue_req_new(type, resp_text, base64);
3523 if (cont_req == NULL) { 3541 if (cont_req == NULL) {
3524 res = MAILIMAP_ERROR_MEMORY; 3542 res = MAILIMAP_ERROR_MEMORY;
3525 goto free; 3543 goto free;
3526 } 3544 }
3527 3545
3528 * result = cont_req; 3546 * result = cont_req;
3529 * index = cur_token; 3547 * index = cur_token;
3530 3548
3531 return MAILIMAP_NO_ERROR; 3549 return MAILIMAP_NO_ERROR;
3532 3550
3533 free: 3551 free:
3534 if (base64 != NULL) 3552 if (base64 != NULL)
3535 mailimap_base64_free(base64); 3553 mailimap_base64_free(base64);
3536 if (resp_text != NULL) 3554 if (resp_text != NULL)
3537 mailimap_resp_text_free(resp_text); 3555 mailimap_resp_text_free(resp_text);
3538 err: 3556 err:
3539 return res; 3557 return res;
3540} 3558}
3541 3559
3542/* 3560/*
3543 UNIMPLEMENTED 3561 UNIMPLEMENTED
3544 copy = "COPY" SP set SP mailbox 3562 copy = "COPY" SP set SP mailbox
3545*/ 3563*/
3546 3564
3547/* 3565/*
3548 UNIMPLEMENTED 3566 UNIMPLEMENTED
3549 create = "CREATE" SP mailbox 3567 create = "CREATE" SP mailbox
3550 ; Use of INBOX gives a NO error 3568 ; Use of INBOX gives a NO error
3551*/ 3569*/
3552 3570
3553/* 3571/*
3554 UNIMPLEMENTED 3572 UNIMPLEMENTED
3555 date = date-text / DQUOTE date-text DQUOTE 3573 date = date-text / DQUOTE date-text DQUOTE
3556*/ 3574*/
3557 3575
3558/* 3576/*
3559 UNIMPLEMENTED 3577 UNIMPLEMENTED
3560 date-day = 1*2DIGIT 3578 date-day = 1*2DIGIT
3561 ; Day of month 3579 ; Day of month
3562*/ 3580*/
3563 3581
3564/* 3582/*
3565static gboolean mailimap_date_day_parse(mailstream * fd, 3583static gboolean mailimap_date_day_parse(mailstream * fd,
3566 MMAPString * buffer, 3584 MMAPString * buffer,
3567 guint32 * index, 3585 guint32 * index,
3568 gint * result) 3586 gint * result)
3569{ 3587{
3570 guint32 cur_token; 3588 guint32 cur_token;
3571 gint digit; 3589 gint digit;
3572 gint number; 3590 gint number;
3573 3591
3574 cur_token = * index; 3592 cur_token = * index;
3575 3593
3576 if (!mailimap_digit_parse(fd, buffer, &cur_token, &digit)) 3594 if (!mailimap_digit_parse(fd, buffer, &cur_token, &digit))
3577 return FALSE; 3595 return FALSE;
3578 3596
3579 number = digit; 3597 number = digit;
3580 3598
3581 if (mailimap_digit_parse(fd, buffer, &cur_token, &digit)) 3599 if (mailimap_digit_parse(fd, buffer, &cur_token, &digit))
3582 number = number * 10 + digit; 3600 number = number * 10 + digit;
3583 3601
3584 * result = number; 3602 * result = number;
3585 * index = cur_token; 3603 * index = cur_token;
3586 3604
3587 return TRUE; 3605 return TRUE;
3588} 3606}
3589*/ 3607*/
3590 3608
3591/* 3609/*
3592 date-day-fixed = (SP DIGIT) / 2DIGIT 3610 date-day-fixed = (SP DIGIT) / 2DIGIT
3593 ; Fixed-format version of date-day 3611 ; Fixed-format version of date-day
3594*/ 3612*/
3595 3613
3596static int mailimap_date_day_fixed_parse(mailstream * fd, 3614static int mailimap_date_day_fixed_parse(mailstream * fd,
3597 MMAPString * buffer, 3615 MMAPString * buffer,
3598 size_t * index, 3616 size_t * index,
3599 int * result) 3617 int * result)
3600{ 3618{
3601#ifdef UNSTRICT_SYNTAX 3619#ifdef UNSTRICT_SYNTAX
3602 size_t cur_token; 3620 size_t cur_token;
3603 uint32_t day; 3621 uint32_t day;
3604 int r; 3622 int r;
3605 3623
3606 cur_token = * index; 3624 cur_token = * index;
3607 3625
3608 r = mailimap_number_parse(fd, buffer, &cur_token, &day); 3626 r = mailimap_number_parse(fd, buffer, &cur_token, &day);
3609 if (r != MAILIMAP_NO_ERROR) 3627 if (r != MAILIMAP_NO_ERROR)
3610 return r; 3628 return r;
3611 3629
3612 * index = cur_token; 3630 * index = cur_token;
3613 * result = day; 3631 * result = day;
3614 3632
3615 return MAILIMAP_NO_ERROR; 3633 return MAILIMAP_NO_ERROR;
3616 3634
3617#else 3635#else
3618 size_t cur_token; 3636 size_t cur_token;
3619 int r; 3637 int r;
3620 3638
3621 cur_token = * index; 3639 cur_token = * index;
3622 3640
3623 if (mailimap_space_parse(fd, buffer, &cur_token)) { 3641 if (mailimap_space_parse(fd, buffer, &cur_token)) {
3624 int digit; 3642 int digit;
3625 3643
3626 r = mailimap_digit_parse(fd, buffer, &cur_token, &digit); 3644 r = mailimap_digit_parse(fd, buffer, &cur_token, &digit);
3627 if (r != MAILIMAP_NO_ERROR) 3645 if (r != MAILIMAP_NO_ERROR)
3628 return r; 3646 return r;
3629 3647
3630 * result = digit; 3648 * result = digit;
3631 * index = cur_token; 3649 * index = cur_token;
3632 3650
3633 return MAILIMAP_NO_ERROR; 3651 return MAILIMAP_NO_ERROR;
3634 } 3652 }
3635 else { 3653 else {
3636 int digit1; 3654 int digit1;
3637 int digit2; 3655 int digit2;
3638 3656
3639 r = mailimap_digit_parse(fd, buffer, &cur_token, &digit1); 3657 r = mailimap_digit_parse(fd, buffer, &cur_token, &digit1);
3640 if (r != MAILIMAP_NO_ERROR) 3658 if (r != MAILIMAP_NO_ERROR)
3641 return r; 3659 return r;
3642 r = mailimap_digit_parse(fd, buffer, &cur_token, &digit2); 3660 r = mailimap_digit_parse(fd, buffer, &cur_token, &digit2);
3643 if (r != MAILIMAP_NO_ERROR) 3661 if (r != MAILIMAP_NO_ERROR)
3644 return r; 3662 return r;
3645 3663
3646 * result = digit1 * 10 + digit2; 3664 * result = digit1 * 10 + digit2;
3647 * index = cur_token; 3665 * index = cur_token;
3648 3666
3649 return MAILIMAP_NO_ERROR; 3667 return MAILIMAP_NO_ERROR;
3650 } 3668 }
3651#endif 3669#endif
3652} 3670}
3653 3671
3654 3672
3655/* 3673/*
3656 date-month = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" / 3674 date-month = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" /
3657 "Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec" 3675 "Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec"
3658*/ 3676*/
3659 3677
3660static int mailimap_date_month_parse(mailstream * fd, MMAPString * buffer, 3678static int mailimap_date_month_parse(mailstream * fd, MMAPString * buffer,
3661 size_t * index, int * result) 3679 size_t * index, int * result)
3662{ 3680{
3663 size_t cur_token; 3681 size_t cur_token;
3664 int month; 3682 int month;
3665 3683
3666 cur_token = * index; 3684 cur_token = * index;
3667 3685
3668 month = mailimap_month_get_token_value(fd, buffer, &cur_token); 3686 month = mailimap_month_get_token_value(fd, buffer, &cur_token);
3669 if (month == -1) 3687 if (month == -1)
3670 return MAILIMAP_ERROR_PARSE; 3688 return MAILIMAP_ERROR_PARSE;
3671 3689
3672 * result = month; 3690 * result = month;
3673 * index = cur_token; 3691 * index = cur_token;
3674 3692
3675 return MAILIMAP_NO_ERROR; 3693 return MAILIMAP_NO_ERROR;
3676} 3694}
3677 3695
3678/* 3696/*
3679 UNIMPLEMENTED 3697 UNIMPLEMENTED
3680 date-text = date-day "-" date-month "-" date-year 3698 date-text = date-day "-" date-month "-" date-year
3681*/ 3699*/
3682 3700
3683/* 3701/*
3684static struct mailimap_date_text * 3702static struct mailimap_date_text *
3685mailimap_date_text_new(gint day, gint month, gint year) 3703mailimap_date_text_new(gint day, gint month, gint year)
3686{ 3704{
3687 struct mailimap_date_text * date_text; 3705 struct mailimap_date_text * date_text;
3688 3706
3689 date_text = g_new(struct mailimap_date_text, 1); 3707 date_text = g_new(struct mailimap_date_text, 1);
3690 if (date_text == NULL) 3708 if (date_text == NULL)
3691 return NULL; 3709 return NULL;
3692 3710
3693 date_text->day = day; 3711 date_text->day = day;
3694 date_text->month = month; 3712 date_text->month = month;
3695 date_text->year = year; 3713 date_text->year = year;
3696 3714
3697 return date_text; 3715 return date_text;
3698} 3716}
3699 3717
3700static void mailimap_date_text_free(struct mailimap_date_text * date_text) 3718static void mailimap_date_text_free(struct mailimap_date_text * date_text)
3701{ 3719{
3702 g_free(date_text); 3720 g_free(date_text);
3703} 3721}
3704 3722
3705static gboolean 3723static gboolean
3706mailimap_date_text_parse(mailstream * fd, MMAPString * buffer, 3724mailimap_date_text_parse(mailstream * fd, MMAPString * buffer,
3707 guint32 * index, struct mailimap_date_text ** result) 3725 guint32 * index, struct mailimap_date_text ** result)
3708{ 3726{
3709 struct mailimap_date_text * date_text; 3727 struct mailimap_date_text * date_text;
3710 gint day; 3728 gint day;
3711 gint month; 3729 gint month;
3712 gint year; 3730 gint year;
3713 guint32 cur_token; 3731 guint32 cur_token;
3714 3732
3715 cur_token = * index; 3733 cur_token = * index;
3716 3734
3717 if (!mailimap_date_day_parse(fd, buffer, &cur_token, &day)) 3735 if (!mailimap_date_day_parse(fd, buffer, &cur_token, &day))
3718 return FALSE; 3736 return FALSE;
3719 3737
3720 if (!mailimap_minus_parse(fd, buffer, &cur_token)) 3738 if (!mailimap_minus_parse(fd, buffer, &cur_token))
3721 return FALSE; 3739 return FALSE;
3722 3740
3723 if (!mailimap_date_month_parse(fd, buffer, &cur_token, &month)) 3741 if (!mailimap_date_month_parse(fd, buffer, &cur_token, &month))
3724 return FALSE; 3742 return FALSE;
3725 3743
3726 if (!mailimap_minus_parse(fd, buffer, &cur_token)) 3744 if (!mailimap_minus_parse(fd, buffer, &cur_token))
3727 return FALSE; 3745 return FALSE;
3728 3746
3729 if (!mailimap_date_year_parse(fd, buffer, &cur_token, &year)) 3747 if (!mailimap_date_year_parse(fd, buffer, &cur_token, &year))
3730 return FALSE; 3748 return FALSE;
3731 3749
3732 date_text = mailimap_date_text_new(day, month, year); 3750 date_text = mailimap_date_text_new(day, month, year);
3733 if (date_text == NULL) 3751 if (date_text == NULL)
3734 return FALSE; 3752 return FALSE;
3735 3753
3736 * result = date_text; 3754 * result = date_text;
3737 * index = cur_token; 3755 * index = cur_token;
3738 3756
3739 return TRUE; 3757 return TRUE;
3740} 3758}
3741*/ 3759*/
3742 3760
3743/* 3761/*
3744 date-year = 4DIGIT 3762 date-year = 4DIGIT
3745*/ 3763*/
3746 3764
3747static int mailimap_date_year_parse(mailstream * fd, MMAPString * buffer, 3765static int mailimap_date_year_parse(mailstream * fd, MMAPString * buffer,
3748 size_t * index, int * result) 3766 size_t * index, int * result)
3749{ 3767{
3750#ifdef UNSTRICT_SYNTAX 3768#ifdef UNSTRICT_SYNTAX
3751 uint32_t year; 3769 uint32_t year;
3752 int r; 3770 int r;
3753 size_t cur_token; 3771 size_t cur_token;
3754 3772
3755 cur_token = * index; 3773 cur_token = * index;
3756 3774
3757 r = mailimap_number_parse(fd, buffer, &cur_token, &year); 3775 r = mailimap_number_parse(fd, buffer, &cur_token, &year);
3758 if (r != MAILIMAP_NO_ERROR) 3776 if (r != MAILIMAP_NO_ERROR)
3759 return r; 3777 return r;
3760 3778
3761 * result = year; 3779 * result = year;
3762 * index = cur_token; 3780 * index = cur_token;
3763 3781
3764 return MAILIMAP_NO_ERROR; 3782 return MAILIMAP_NO_ERROR;
3765#else 3783#else
3766 int i; 3784 int i;
3767 size_t cur_token; 3785 size_t cur_token;
3768 int year; 3786 int year;
3769 int digit; 3787 int digit;
3770 int r; 3788 int r;
3771 3789
3772 cur_token = * index; 3790 cur_token = * index;
3773 year = 0; 3791 year = 0;
3774 3792
3775 for(i = 0 ; i < 4 ; i ++) { 3793 for(i = 0 ; i < 4 ; i ++) {
3776 r = mailimap_digit_parse(fd, buffer, &cur_token, &digit); 3794 r = mailimap_digit_parse(fd, buffer, &cur_token, &digit);
3777 if (r != MAILIMAP_NO_ERROR) 3795 if (r != MAILIMAP_NO_ERROR)
3778 return r; 3796 return r;
3779 year = year * 10 + digit; 3797 year = year * 10 + digit;
3780 } 3798 }
3781 3799
3782 * result = year; 3800 * result = year;
3783 * index = cur_token; 3801 * index = cur_token;
3784 3802
3785 return MAILIMAP_NO_ERROR; 3803 return MAILIMAP_NO_ERROR;
3786#endif 3804#endif
3787} 3805}
3788 3806
3789/* 3807/*
3790 date-time = DQUOTE date-day-fixed "-" date-month "-" date-year 3808 date-time = DQUOTE date-day-fixed "-" date-month "-" date-year
3791 SP time SP zone DQUOTE 3809 SP time SP zone DQUOTE
3792*/ 3810*/
3793 3811
3794static int mailimap_date_time_parse(mailstream * fd, MMAPString * buffer, 3812static int mailimap_date_time_parse(mailstream * fd, MMAPString * buffer,
3795 size_t * index, 3813 size_t * index,
3796 struct mailimap_date_time ** result, 3814 struct mailimap_date_time ** result,
3797 size_t progr_rate, 3815 size_t progr_rate,
3798 progress_function * progr_fun) 3816 progress_function * progr_fun)
3799{ 3817{
3800 int day; 3818 int day;
3801 int month; 3819 int month;
3802 int year; 3820 int year;
3803 int hour; 3821 int hour;
3804 int min; 3822 int min;
3805 int sec; 3823 int sec;
3806 struct mailimap_date_time * date_time; 3824 struct mailimap_date_time * date_time;
3807 size_t cur_token; 3825 size_t cur_token;
3808 int zone; 3826 int zone;
3809 int r; 3827 int r;
3810 3828
3811 cur_token = * index; 3829 cur_token = * index;
3812 3830
3813 r = mailimap_dquote_parse(fd, buffer, &cur_token); 3831 r = mailimap_dquote_parse(fd, buffer, &cur_token);
3814 if (r != MAILIMAP_NO_ERROR) 3832 if (r != MAILIMAP_NO_ERROR)
3815 return r; 3833 return r;
3816 3834
3817 r = mailimap_date_day_fixed_parse(fd, buffer, &cur_token, &day); 3835 r = mailimap_date_day_fixed_parse(fd, buffer, &cur_token, &day);
3818 if (r != MAILIMAP_NO_ERROR) 3836 if (r != MAILIMAP_NO_ERROR)
3819 return r; 3837 return r;
3820 3838
3821 r = mailimap_minus_parse(fd, buffer, &cur_token); 3839 r = mailimap_minus_parse(fd, buffer, &cur_token);
3822 if (r != MAILIMAP_NO_ERROR) 3840 if (r != MAILIMAP_NO_ERROR)
3823 return r; 3841 return r;
3824 3842
3825 r = mailimap_date_month_parse(fd, buffer, &cur_token, &month); 3843 r = mailimap_date_month_parse(fd, buffer, &cur_token, &month);
3826 if (r != MAILIMAP_NO_ERROR) 3844 if (r != MAILIMAP_NO_ERROR)
3827 return r; 3845 return r;
3828 3846
3829 r = mailimap_minus_parse(fd, buffer, &cur_token); 3847 r = mailimap_minus_parse(fd, buffer, &cur_token);
3830 if (r != MAILIMAP_NO_ERROR) 3848 if (r != MAILIMAP_NO_ERROR)
3831 return r; 3849 return r;
3832 3850
3833 r = mailimap_date_year_parse(fd, buffer, &cur_token, &year); 3851 r = mailimap_date_year_parse(fd, buffer, &cur_token, &year);
3834 if (r != MAILIMAP_NO_ERROR) 3852 if (r != MAILIMAP_NO_ERROR)
3835 return r; 3853 return r;
3836 3854
3837 r = mailimap_space_parse(fd, buffer, &cur_token); 3855 r = mailimap_space_parse(fd, buffer, &cur_token);
3838 if (r != MAILIMAP_NO_ERROR) 3856 if (r != MAILIMAP_NO_ERROR)
3839 return r; 3857 return r;
3840 3858
3841 r = mailimap_time_parse(fd, buffer, &cur_token, &hour, &min, &sec); 3859 r = mailimap_time_parse(fd, buffer, &cur_token, &hour, &min, &sec);
3842 if (r != MAILIMAP_NO_ERROR) 3860 if (r != MAILIMAP_NO_ERROR)
3843 return r; 3861 return r;
3844 3862
3845 r = mailimap_space_parse(fd, buffer, &cur_token); 3863 r = mailimap_space_parse(fd, buffer, &cur_token);
3846 if (r != MAILIMAP_NO_ERROR) 3864 if (r != MAILIMAP_NO_ERROR)
3847 return r; 3865 return r;
3848 3866
3849 r = mailimap_zone_parse(fd, buffer, &cur_token, &zone); 3867 r = mailimap_zone_parse(fd, buffer, &cur_token, &zone);
3850 if (r != MAILIMAP_NO_ERROR) 3868 if (r != MAILIMAP_NO_ERROR)
3851 return r; 3869 return r;
3852 3870
3853 r = mailimap_dquote_parse(fd, buffer, &cur_token); 3871 r = mailimap_dquote_parse(fd, buffer, &cur_token);
3854 if (r != MAILIMAP_NO_ERROR) 3872 if (r != MAILIMAP_NO_ERROR)
3855 return r; 3873 return r;
3856 3874
3857 date_time = mailimap_date_time_new(day, month, year, hour, min, sec, zone); 3875 date_time = mailimap_date_time_new(day, month, year, hour, min, sec, zone);
3858 if (date_time == NULL) 3876 if (date_time == NULL)
3859 return MAILIMAP_ERROR_MEMORY; 3877 return MAILIMAP_ERROR_MEMORY;
3860 3878
3861 * result = date_time; 3879 * result = date_time;
3862 * index = cur_token; 3880 * index = cur_token;
3863 3881
3864 return MAILIMAP_NO_ERROR; 3882 return MAILIMAP_NO_ERROR;
3865} 3883}
3866 3884
3867 3885
3868/* 3886/*
3869 UNIMPLEMENTED 3887 UNIMPLEMENTED
3870 delete = "DELETE" SP mailbox 3888 delete = "DELETE" SP mailbox
3871 ; Use of INBOX gives a NO error 3889 ; Use of INBOX gives a NO error
3872*/ 3890*/
3873 3891
3874/* 3892/*
3875 digit-nz = %x31-39 3893 digit-nz = %x31-39
3876 ; 1-9 3894 ; 1-9
3877*/ 3895*/
3878 3896
3879#ifndef UNSTRICT_SYNTAX 3897#ifndef UNSTRICT_SYNTAX
3880static int is_digit_nz(char ch) 3898static int is_digit_nz(char ch)
3881{ 3899{
3882 return (ch >= '1') && (ch <= '9'); 3900 return (ch >= '1') && (ch <= '9');
3883} 3901}
3884 3902
3885static int mailimap_digit_nz_parse(mailstream * fd, MMAPString * buffer, 3903static int mailimap_digit_nz_parse(mailstream * fd, MMAPString * buffer,
3886 size_t * index, int * result) 3904 size_t * index, int * result)
3887{ 3905{
3888 size_t cur_token; 3906 size_t cur_token;
3889 3907
3890 cur_token = * index; 3908 cur_token = * index;
3891 3909
3892 if (is_digit_nz(buffer->str[cur_token])) { 3910 if (is_digit_nz(buffer->str[cur_token])) {
3893 * result = buffer->str[cur_token] - '0'; 3911 * result = buffer->str[cur_token] - '0';
3894 cur_token ++; 3912 cur_token ++;
3895 * index = cur_token; 3913 * index = cur_token;
3896 return MAILIMAP_NO_ERROR; 3914 return MAILIMAP_NO_ERROR;
3897 } 3915 }
3898 else 3916 else
3899 return MAILIMAP_ERROR_PARSE; 3917 return MAILIMAP_ERROR_PARSE;
3900} 3918}
3901#endif 3919#endif
3902 3920
3903/* 3921/*
3904 envelope = "(" env-date SP env-subject SP env-from SP env-sender SP 3922 envelope = "(" env-date SP env-subject SP env-from SP env-sender SP
3905 env-reply-to SP env-to SP env-cc SP env-bcc SP 3923 env-reply-to SP env-to SP env-cc SP env-bcc SP
3906 env-in-reply-to SP env-message-id ")" 3924 env-in-reply-to SP env-message-id ")"
3907*/ 3925*/
3908 3926
3909static int mailimap_envelope_parse(mailstream * fd, MMAPString * buffer, 3927static int mailimap_envelope_parse(mailstream * fd, MMAPString * buffer,
3910 size_t * index, 3928 size_t * index,
3911 struct mailimap_envelope ** result, 3929 struct mailimap_envelope ** result,
3912 size_t progr_rate, 3930 size_t progr_rate,
3913 progress_function * progr_fun) 3931 progress_function * progr_fun)
3914{ 3932{
3915 size_t cur_token; 3933 size_t cur_token;
3916 char * date; 3934 char * date;
3917 char * subject; 3935 char * subject;
3918 struct mailimap_env_from * from; 3936 struct mailimap_env_from * from;
3919 struct mailimap_env_sender * sender; 3937 struct mailimap_env_sender * sender;
3920 struct mailimap_env_reply_to * reply_to; 3938 struct mailimap_env_reply_to * reply_to;
3921 struct mailimap_env_to * to; 3939 struct mailimap_env_to * to;
3922 struct mailimap_env_cc * cc; 3940 struct mailimap_env_cc * cc;
3923 struct mailimap_env_bcc * bcc; 3941 struct mailimap_env_bcc * bcc;
3924 char * in_reply_to; 3942 char * in_reply_to;
3925 char * message_id; 3943 char * message_id;
3926 struct mailimap_envelope * envelope; 3944 struct mailimap_envelope * envelope;
3927 int r; 3945 int r;
3928 int res; 3946 int res;
3929 3947
3930 date = NULL; 3948 date = NULL;
3931 subject = NULL; 3949 subject = NULL;
3932 from = NULL; 3950 from = NULL;
3933 sender = NULL; 3951 sender = NULL;
3934 reply_to = NULL; 3952 reply_to = NULL;
3935 to = NULL; 3953 to = NULL;
3936 cc = NULL; 3954 cc = NULL;
3937 bcc = NULL; 3955 bcc = NULL;
3938 in_reply_to = NULL; 3956 in_reply_to = NULL;
3939 message_id = NULL; 3957 message_id = NULL;
3940 3958
3941 cur_token = * index; 3959 cur_token = * index;
3942 3960
3943 r = mailimap_oparenth_parse(fd, buffer, &cur_token); 3961 r = mailimap_oparenth_parse(fd, buffer, &cur_token);
3944 if (r != MAILIMAP_NO_ERROR) { 3962 if (r != MAILIMAP_NO_ERROR) {
3945 res = r; 3963 res = r;
3946 goto err; 3964 goto err;
3947 } 3965 }
3948 3966
3949 r = mailimap_env_date_parse(fd, buffer, &cur_token, &date, 3967 r = mailimap_env_date_parse(fd, buffer, &cur_token, &date,
3950 progr_rate, progr_fun); 3968 progr_rate, progr_fun);
3951 if (r != MAILIMAP_NO_ERROR) { 3969 if (r != MAILIMAP_NO_ERROR) {
3952 res = r; 3970 res = r;
3953 goto err; 3971 goto err;
3954 } 3972 }
3955 3973
3956 r = mailimap_space_parse(fd, buffer, &cur_token); 3974 r = mailimap_space_parse(fd, buffer, &cur_token);
3957 if (r != MAILIMAP_NO_ERROR) { 3975 if (r != MAILIMAP_NO_ERROR) {
3958 res = r; 3976 res = r;
3959 goto date; 3977 goto date;
3960 } 3978 }
3961 3979
3962 r = mailimap_env_subject_parse(fd, buffer, &cur_token, &subject, 3980 r = mailimap_env_subject_parse(fd, buffer, &cur_token, &subject,
3963 progr_rate, progr_fun); 3981 progr_rate, progr_fun);
3964 if (r != MAILIMAP_NO_ERROR) { 3982 if (r != MAILIMAP_NO_ERROR) {
3965 res = r; 3983 res = r;
3966 goto date; 3984 goto date;
3967 } 3985 }
3968 3986
3969 r = mailimap_space_parse(fd, buffer, &cur_token); 3987 r = mailimap_space_parse(fd, buffer, &cur_token);
3970 if (r != MAILIMAP_NO_ERROR) { 3988 if (r != MAILIMAP_NO_ERROR) {
3971 res = r; 3989 res = r;
3972 goto subject; 3990 goto subject;
3973 } 3991 }
3974 3992
3975 r = mailimap_env_from_parse(fd, buffer, &cur_token, &from, 3993 r = mailimap_env_from_parse(fd, buffer, &cur_token, &from,
3976 progr_rate, progr_fun); 3994 progr_rate, progr_fun);
3977 if (r != MAILIMAP_NO_ERROR) { 3995 if (r != MAILIMAP_NO_ERROR) {
3978 res = r; 3996 res = r;
3979 goto subject; 3997 goto subject;
3980 } 3998 }
3981 3999
3982 r = mailimap_space_parse(fd, buffer, &cur_token); 4000 r = mailimap_space_parse(fd, buffer, &cur_token);
3983 if (r != MAILIMAP_NO_ERROR) { 4001 if (r != MAILIMAP_NO_ERROR) {
3984 res = r; 4002 res = r;
3985 goto from; 4003 goto from;
3986 } 4004 }
3987 4005
3988 r = mailimap_env_sender_parse(fd, buffer, &cur_token, &sender, 4006 r = mailimap_env_sender_parse(fd, buffer, &cur_token, &sender,
3989 progr_rate, progr_fun); 4007 progr_rate, progr_fun);
3990 if (r != MAILIMAP_NO_ERROR) { 4008 if (r != MAILIMAP_NO_ERROR) {
3991 res = r; 4009 res = r;
3992 goto from; 4010 goto from;
3993 } 4011 }
3994 4012
3995 r = mailimap_space_parse(fd, buffer, &cur_token); 4013 r = mailimap_space_parse(fd, buffer, &cur_token);
3996 if (r != MAILIMAP_NO_ERROR) { 4014 if (r != MAILIMAP_NO_ERROR) {
3997 res = r; 4015 res = r;
3998 goto sender; 4016 goto sender;
3999 } 4017 }
4000 4018
4001 r = mailimap_env_reply_to_parse(fd, buffer, &cur_token, &reply_to, 4019 r = mailimap_env_reply_to_parse(fd, buffer, &cur_token, &reply_to,
4002 progr_rate, progr_fun); 4020 progr_rate, progr_fun);
4003 if (r != MAILIMAP_NO_ERROR) { 4021 if (r != MAILIMAP_NO_ERROR) {
4004 res = r; 4022 res = r;
4005 goto sender; 4023 goto sender;
4006 } 4024 }
4007 4025
4008 r = mailimap_space_parse(fd, buffer, &cur_token); 4026 r = mailimap_space_parse(fd, buffer, &cur_token);
4009 if (r != MAILIMAP_NO_ERROR) { 4027 if (r != MAILIMAP_NO_ERROR) {
4010 res = r; 4028 res = r;
4011 goto reply_to; 4029 goto reply_to;
4012 } 4030 }
4013 4031
4014 r = mailimap_env_to_parse(fd, buffer, &cur_token, &to, 4032 r = mailimap_env_to_parse(fd, buffer, &cur_token, &to,
4015 progr_rate, progr_fun); 4033 progr_rate, progr_fun);
4016 if (r != MAILIMAP_NO_ERROR) { 4034 if (r != MAILIMAP_NO_ERROR) {
4017 res = r; 4035 res = r;
4018 goto reply_to; 4036 goto reply_to;
4019 } 4037 }
4020 4038
4021 r = mailimap_space_parse(fd, buffer, &cur_token); 4039 r = mailimap_space_parse(fd, buffer, &cur_token);
4022 if (r != MAILIMAP_NO_ERROR) { 4040 if (r != MAILIMAP_NO_ERROR) {
4023 res = r; 4041 res = r;
4024 goto to; 4042 goto to;
4025 } 4043 }
4026 4044
4027 r = mailimap_env_cc_parse(fd, buffer, &cur_token, &cc, 4045 r = mailimap_env_cc_parse(fd, buffer, &cur_token, &cc,
4028 progr_rate, progr_fun); 4046 progr_rate, progr_fun);
4029 if (r != MAILIMAP_NO_ERROR) { 4047 if (r != MAILIMAP_NO_ERROR) {
4030 res = r; 4048 res = r;
4031 goto to; 4049 goto to;
4032 } 4050 }
4033 4051
4034 r = mailimap_space_parse(fd, buffer, &cur_token); 4052 r = mailimap_space_parse(fd, buffer, &cur_token);
4035 if (r != MAILIMAP_NO_ERROR) { 4053 if (r != MAILIMAP_NO_ERROR) {
4036 res = r; 4054 res = r;
4037 goto cc; 4055 goto cc;
4038 } 4056 }
4039 4057
4040 r = mailimap_env_bcc_parse(fd, buffer, &cur_token, &bcc, 4058 r = mailimap_env_bcc_parse(fd, buffer, &cur_token, &bcc,
4041 progr_rate, progr_fun); 4059 progr_rate, progr_fun);
4042 if (r != MAILIMAP_NO_ERROR) { 4060 if (r != MAILIMAP_NO_ERROR) {
4043 res = r; 4061 res = r;
4044 goto cc; 4062 goto cc;
4045 } 4063 }
4046 4064
4047 r = mailimap_space_parse(fd, buffer, &cur_token); 4065 r = mailimap_space_parse(fd, buffer, &cur_token);
4048 if (r != MAILIMAP_NO_ERROR) { 4066 if (r != MAILIMAP_NO_ERROR) {
4049 res = r; 4067 res = r;
4050 goto bcc; 4068 goto bcc;
4051 } 4069 }
4052 4070
4053 r = mailimap_env_in_reply_to_parse(fd, buffer, &cur_token, &in_reply_to, 4071 r = mailimap_env_in_reply_to_parse(fd, buffer, &cur_token, &in_reply_to,
4054 progr_rate, progr_fun); 4072 progr_rate, progr_fun);
4055 if (r != MAILIMAP_NO_ERROR) { 4073 if (r != MAILIMAP_NO_ERROR) {
4056 res = r; 4074 res = r;
4057 goto bcc; 4075 goto bcc;
4058 } 4076 }
4059 4077
4060 r = mailimap_space_parse(fd, buffer, &cur_token); 4078 r = mailimap_space_parse(fd, buffer, &cur_token);
4061 if (r != MAILIMAP_NO_ERROR) { 4079 if (r != MAILIMAP_NO_ERROR) {
4062 res = r; 4080 res = r;
4063 goto in_reply_to; 4081 goto in_reply_to;
4064 } 4082 }
4065 4083
4066 r = mailimap_env_message_id_parse(fd, buffer, &cur_token, &message_id, 4084 r = mailimap_env_message_id_parse(fd, buffer, &cur_token, &message_id,
4067 progr_rate, progr_fun); 4085 progr_rate, progr_fun);
4068 if (r != MAILIMAP_NO_ERROR) { 4086 if (r != MAILIMAP_NO_ERROR) {
4069 res = r; 4087 res = r;
4070 goto in_reply_to; 4088 goto in_reply_to;
4071 } 4089 }
4072 4090
4073 r = mailimap_cparenth_parse(fd, buffer, &cur_token); 4091 r = mailimap_cparenth_parse(fd, buffer, &cur_token);
4074 if (r != MAILIMAP_NO_ERROR) { 4092 if (r != MAILIMAP_NO_ERROR) {
4075 res = r; 4093 res = r;
4076 goto message_id; 4094 goto message_id;
4077 } 4095 }
4078 4096
4079 envelope = mailimap_envelope_new(date, subject, from, sender, reply_to, to, 4097 envelope = mailimap_envelope_new(date, subject, from, sender, reply_to, to,
4080 cc, bcc, in_reply_to, message_id); 4098 cc, bcc, in_reply_to, message_id);
4081 if (envelope == NULL) { 4099 if (envelope == NULL) {
4082 res = MAILIMAP_ERROR_MEMORY; 4100 res = MAILIMAP_ERROR_MEMORY;
4083 goto message_id; 4101 goto message_id;
4084 } 4102 }
4085 4103
4086 * result = envelope; 4104 * result = envelope;
4087 * index = cur_token; 4105 * index = cur_token;
4088 4106
4089 return MAILIMAP_NO_ERROR; 4107 return MAILIMAP_NO_ERROR;
4090 4108
4091 message_id: 4109 message_id:
4092 mailimap_env_message_id_free(message_id); 4110 mailimap_env_message_id_free(message_id);
4093 in_reply_to: 4111 in_reply_to:
4094 mailimap_env_in_reply_to_free(in_reply_to); 4112 mailimap_env_in_reply_to_free(in_reply_to);
4095 bcc: 4113 bcc:
4096 mailimap_env_bcc_free(bcc); 4114 mailimap_env_bcc_free(bcc);
4097 cc: 4115 cc:
4098 mailimap_env_cc_free(cc); 4116 mailimap_env_cc_free(cc);
4099 to: 4117 to:
4100 mailimap_env_to_free(to); 4118 mailimap_env_to_free(to);
4101 reply_to: 4119 reply_to:
4102 mailimap_env_reply_to_free(reply_to); 4120 mailimap_env_reply_to_free(reply_to);
4103 sender: 4121 sender:
4104 mailimap_env_sender_free(sender); 4122 mailimap_env_sender_free(sender);
4105 from: 4123 from:
4106 mailimap_env_from_free(from); 4124 mailimap_env_from_free(from);
4107 subject: 4125 subject:
4108 mailimap_env_subject_free(date); 4126 mailimap_env_subject_free(date);
4109 date: 4127 date:
4110 mailimap_env_date_free(date); 4128 mailimap_env_date_free(date);
4111 err: 4129 err:
4112 return res; 4130 return res;
4113} 4131}
4114 4132
4115/* 4133/*
4116 "(" 1*address ")" 4134 "(" 1*address ")"
4117*/ 4135*/
4118 4136
4119static int mailimap_address_list_parse(mailstream * fd, MMAPString * buffer, 4137static int mailimap_address_list_parse(mailstream * fd, MMAPString * buffer,
4120 size_t * index, 4138 size_t * index,
4121 clist ** result, 4139 clist ** result,
4122 size_t progr_rate, 4140 size_t progr_rate,
4123 progress_function * progr_fun) 4141 progress_function * progr_fun)
4124{ 4142{
4125 size_t cur_token; 4143 size_t cur_token;
4126 clist * address_list; 4144 clist * address_list;
4127 int r; 4145 int r;
4128 int res; 4146 int res;
4129 4147
4130 cur_token = * index; 4148 cur_token = * index;
4131 4149
4132 address_list = NULL; 4150 address_list = NULL;
4133 4151
4134 r = mailimap_nil_parse(fd, buffer, &cur_token); 4152 r = mailimap_nil_parse(fd, buffer, &cur_token);
4135 switch (r) { 4153 switch (r) {
4136 case MAILIMAP_NO_ERROR: 4154 case MAILIMAP_NO_ERROR:
4137 address_list = NULL; 4155 address_list = NULL;
4138 break; 4156 break;
4139 4157
4140 case MAILIMAP_ERROR_PARSE: 4158 case MAILIMAP_ERROR_PARSE:
4141 r = mailimap_oparenth_parse(fd, buffer, &cur_token); 4159 r = mailimap_oparenth_parse(fd, buffer, &cur_token);
4142 if (r != MAILIMAP_NO_ERROR) { 4160 if (r != MAILIMAP_NO_ERROR) {
4143 res = r; 4161 res = r;
4144 goto err; 4162 goto err;
4145 } 4163 }
4146 4164
4147 r = mailimap_struct_multiple_parse(fd, buffer, &cur_token, &address_list, 4165 r = mailimap_struct_multiple_parse(fd, buffer, &cur_token, &address_list,
4148 (mailimap_struct_parser *) 4166 (mailimap_struct_parser *)
4149 mailimap_address_parse, 4167 mailimap_address_parse,
4150 (mailimap_struct_destructor *) 4168 (mailimap_struct_destructor *)
4151 mailimap_address_free, 4169 mailimap_address_free,
4152 progr_rate, progr_fun); 4170 progr_rate, progr_fun);
4153 if (r != MAILIMAP_NO_ERROR) { 4171 if (r != MAILIMAP_NO_ERROR) {
4154 res = r; 4172 res = r;
4155 goto err; 4173 goto err;
4156 } 4174 }
4157 4175
4158 r = mailimap_cparenth_parse(fd, buffer, &cur_token); 4176 r = mailimap_cparenth_parse(fd, buffer, &cur_token);
4159 if (r != MAILIMAP_NO_ERROR) { 4177 if (r != MAILIMAP_NO_ERROR) {
4160 res = r; 4178 res = r;
4161 goto address_list; 4179 goto address_list;
4162 } 4180 }
4163 4181
4164 break; 4182 break;
4165 4183
4166 default: 4184 default:
4167 res = r; 4185 res = r;
4168 goto err; 4186 goto err;
4169 } 4187 }
4170 4188
4171 * result = address_list; 4189 * result = address_list;
4172 * index = cur_token; 4190 * index = cur_token;
4173 4191
4174 return MAILIMAP_NO_ERROR; 4192 return MAILIMAP_NO_ERROR;
4175 4193
4176 address_list: 4194 address_list:
4177 if (address_list) { 4195 if (address_list) {
4178 clist_foreach(address_list, (clist_func) mailimap_address_free, NULL); 4196 clist_foreach(address_list, (clist_func) mailimap_address_free, NULL);
4179 clist_free(address_list); 4197 clist_free(address_list);
4180 } 4198 }
4181 err: 4199 err:
4182 return res; 4200 return res;
4183} 4201}
4184 4202
4185/* 4203/*
4186 env-bcc = "(" 1*address ")" / nil 4204 env-bcc = "(" 1*address ")" / nil
4187*/ 4205*/
4188 4206
4189static int 4207static int
4190mailimap_env_bcc_parse(mailstream * fd, MMAPString * buffer, 4208mailimap_env_bcc_parse(mailstream * fd, MMAPString * buffer,
4191 size_t * index, struct mailimap_env_bcc ** result, 4209 size_t * index, struct mailimap_env_bcc ** result,
4192 size_t progr_rate, 4210 size_t progr_rate,
4193 progress_function * progr_fun) 4211 progress_function * progr_fun)
4194{ 4212{
4195 clist * list; 4213 clist * list;
4196 size_t cur_token; 4214 size_t cur_token;
4197 struct mailimap_env_bcc * env_bcc; 4215 struct mailimap_env_bcc * env_bcc;
4198 int r; 4216 int r;
4199 int res; 4217 int res;
4200 4218
4201 cur_token = * index; 4219 cur_token = * index;
4202 list = NULL; 4220 list = NULL;
4203 4221
4204 r = mailimap_address_list_parse(fd, buffer, &cur_token, &list, 4222 r = mailimap_address_list_parse(fd, buffer, &cur_token, &list,
4205 progr_rate, progr_fun); 4223 progr_rate, progr_fun);
4206 if (r != MAILIMAP_NO_ERROR) { 4224 if (r != MAILIMAP_NO_ERROR) {
4207 res = r; 4225 res = r;
4208 goto err; 4226 goto err;
4209 } 4227 }
4210 4228
4211 env_bcc = mailimap_env_bcc_new(list); 4229 env_bcc = mailimap_env_bcc_new(list);
4212 if (env_bcc == NULL) { 4230 if (env_bcc == NULL) {
4213 res = MAILIMAP_ERROR_MEMORY; 4231 res = MAILIMAP_ERROR_MEMORY;
4214 goto free; 4232 goto free;
4215 } 4233 }
4216 4234
4217 * index = cur_token; 4235 * index = cur_token;
4218 * result = env_bcc; 4236 * result = env_bcc;
4219 4237
4220 return MAILIMAP_NO_ERROR; 4238 return MAILIMAP_NO_ERROR;
4221 4239
4222 free: 4240 free:
4223 clist_foreach(list, (clist_func) mailimap_address_free, NULL); 4241 clist_foreach(list, (clist_func) mailimap_address_free, NULL);
4224 clist_free(list); 4242 clist_free(list);
4225 err: 4243 err:
4226 return res; 4244 return res;
4227} 4245}
4228 4246
4229/* 4247/*
4230 env-cc = "(" 1*address ")" / nil 4248 env-cc = "(" 1*address ")" / nil
4231*/ 4249*/
4232 4250
4233static int 4251static int
4234mailimap_env_cc_parse(mailstream * fd, MMAPString * buffer, 4252mailimap_env_cc_parse(mailstream * fd, MMAPString * buffer,
4235 size_t * index, struct mailimap_env_cc ** result, 4253 size_t * index, struct mailimap_env_cc ** result,
4236 size_t progr_rate, 4254 size_t progr_rate,
4237 progress_function * progr_fun) 4255 progress_function * progr_fun)
4238{ 4256{
4239 clist * list; 4257 clist * list;
4240 size_t cur_token; 4258 size_t cur_token;
4241 struct mailimap_env_cc * env_cc; 4259 struct mailimap_env_cc * env_cc;
4242 int r; 4260 int r;
4243 int res; 4261 int res;
4244 4262
4245 cur_token = * index; 4263 cur_token = * index;
4246 list = NULL; 4264 list = NULL;
4247 4265
4248 r = mailimap_address_list_parse(fd, buffer, &cur_token, &list, 4266 r = mailimap_address_list_parse(fd, buffer, &cur_token, &list,
4249 progr_rate, progr_fun); 4267 progr_rate, progr_fun);
4250 if (r != MAILIMAP_NO_ERROR) { 4268 if (r != MAILIMAP_NO_ERROR) {
4251 res = r; 4269 res = r;
4252 goto err; 4270 goto err;
4253 } 4271 }
4254 4272
4255 env_cc = mailimap_env_cc_new(list); 4273 env_cc = mailimap_env_cc_new(list);
4256 if (env_cc == NULL) { 4274 if (env_cc == NULL) {
4257 res = MAILIMAP_ERROR_MEMORY; 4275 res = MAILIMAP_ERROR_MEMORY;
4258 goto free; 4276 goto free;
4259 } 4277 }
4260 4278
4261 * index = cur_token; 4279 * index = cur_token;
4262 * result = env_cc; 4280 * result = env_cc;
4263 4281
4264 return MAILIMAP_NO_ERROR; 4282 return MAILIMAP_NO_ERROR;
4265 4283
4266 free: 4284 free:
4267 clist_foreach(list, (clist_func) mailimap_address_free, NULL); 4285 clist_foreach(list, (clist_func) mailimap_address_free, NULL);
4268 clist_free(list); 4286 clist_free(list);
4269 err: 4287 err:
4270 return res; 4288 return res;
4271} 4289}
4272 4290
4273/* 4291/*
4274 env-date = nstring 4292 env-date = nstring
4275*/ 4293*/
4276 4294
4277static int mailimap_env_date_parse(mailstream * fd, MMAPString * buffer, 4295static int mailimap_env_date_parse(mailstream * fd, MMAPString * buffer,
4278 size_t * index, char ** result, 4296 size_t * index, char ** result,
4279 size_t progr_rate, 4297 size_t progr_rate,
4280 progress_function * progr_fun) 4298 progress_function * progr_fun)
4281{ 4299{
4282 return mailimap_nstring_parse(fd, buffer, index, result, NULL, 4300 return mailimap_nstring_parse(fd, buffer, index, result, NULL,
4283 progr_rate, progr_fun); 4301 progr_rate, progr_fun);
4284} 4302}
4285 4303
4286/* 4304/*
4287 env-from = "(" 1*address ")" / nil 4305 env-from = "(" 1*address ")" / nil
4288*/ 4306*/
4289 4307
4290static int 4308static int
4291mailimap_env_from_parse(mailstream * fd, MMAPString * buffer, 4309mailimap_env_from_parse(mailstream * fd, MMAPString * buffer,
4292 size_t * index, struct mailimap_env_from ** result, 4310 size_t * index, struct mailimap_env_from ** result,
4293 size_t progr_rate, 4311 size_t progr_rate,
4294 progress_function * progr_fun) 4312 progress_function * progr_fun)
4295{ 4313{
4296 clist * list; 4314 clist * list;
4297 size_t cur_token; 4315 size_t cur_token;
4298 struct mailimap_env_from * env_from; 4316 struct mailimap_env_from * env_from;
4299 int r; 4317 int r;
4300 int res; 4318 int res;
4301 4319
4302 cur_token = * index; 4320 cur_token = * index;
4303 list = NULL; 4321 list = NULL;
4304 4322
4305 r = mailimap_address_list_parse(fd, buffer, &cur_token, &list, 4323 r = mailimap_address_list_parse(fd, buffer, &cur_token, &list,
4306 progr_rate, progr_fun); 4324 progr_rate, progr_fun);
4307 if (r != MAILIMAP_NO_ERROR) { 4325 if (r != MAILIMAP_NO_ERROR) {
4308 res = r; 4326 res = r;
4309 goto err; 4327 goto err;
4310 } 4328 }
4311 4329
4312 env_from = mailimap_env_from_new(list); 4330 env_from = mailimap_env_from_new(list);
4313 if (env_from == NULL) { 4331 if (env_from == NULL) {
4314 res = MAILIMAP_ERROR_MEMORY; 4332 res = MAILIMAP_ERROR_MEMORY;
4315 goto free; 4333 goto free;
4316 } 4334 }
4317 4335
4318 * index = cur_token; 4336 * index = cur_token;
4319 * result = env_from; 4337 * result = env_from;
4320 4338
4321 return MAILIMAP_NO_ERROR; 4339 return MAILIMAP_NO_ERROR;
4322 4340
4323 free: 4341 free:
4324 clist_foreach(list, (clist_func) mailimap_address_free, NULL); 4342 clist_foreach(list, (clist_func) mailimap_address_free, NULL);
4325 clist_free(list); 4343 clist_free(list);
4326 err: 4344 err:
4327 return res; 4345 return res;
4328} 4346}
4329 4347
4330/* 4348/*
4331 env-in-reply-to = nstring 4349 env-in-reply-to = nstring
4332*/ 4350*/
4333 4351
4334static int mailimap_env_in_reply_to_parse(mailstream * fd, 4352static int mailimap_env_in_reply_to_parse(mailstream * fd,
4335 MMAPString * buffer, 4353 MMAPString * buffer,
4336 size_t * index, char ** result, 4354 size_t * index, char ** result,
4337 size_t progr_rate, 4355 size_t progr_rate,
4338 progress_function * progr_fun) 4356 progress_function * progr_fun)
4339{ 4357{
4340 return mailimap_nstring_parse(fd, buffer, index, result, NULL, 4358 return mailimap_nstring_parse(fd, buffer, index, result, NULL,
4341 progr_rate, progr_fun); 4359 progr_rate, progr_fun);
4342} 4360}
4343 4361
4344/* 4362/*
4345 env-message-id = nstring 4363 env-message-id = nstring
4346*/ 4364*/
4347 4365
4348static int mailimap_env_message_id_parse(mailstream * fd, 4366static int mailimap_env_message_id_parse(mailstream * fd,
4349 MMAPString * buffer, 4367 MMAPString * buffer,
4350 size_t * index, char ** result, 4368 size_t * index, char ** result,
4351 size_t progr_rate, 4369 size_t progr_rate,
4352 progress_function * progr_fun) 4370 progress_function * progr_fun)
4353{ 4371{
4354 return mailimap_nstring_parse(fd, buffer, index, result, NULL, 4372 return mailimap_nstring_parse(fd, buffer, index, result, NULL,
4355 progr_rate, progr_fun); 4373 progr_rate, progr_fun);
4356} 4374}
4357 4375
4358/* 4376/*
4359 env-reply-to = "(" 1*address ")" / nil 4377 env-reply-to = "(" 1*address ")" / nil
4360*/ 4378*/
4361 4379
4362static int 4380static int
4363mailimap_env_reply_to_parse(mailstream * fd, MMAPString * buffer, 4381mailimap_env_reply_to_parse(mailstream * fd, MMAPString * buffer,
4364 size_t * index, 4382 size_t * index,
4365 struct mailimap_env_reply_to ** result, 4383 struct mailimap_env_reply_to ** result,
4366 size_t progr_rate, 4384 size_t progr_rate,
4367 progress_function * progr_fun) 4385 progress_function * progr_fun)
4368{ 4386{
4369 clist * list; 4387 clist * list;
4370 size_t cur_token; 4388 size_t cur_token;
4371 struct mailimap_env_reply_to * env_reply_to; 4389 struct mailimap_env_reply_to * env_reply_to;
4372 int r; 4390 int r;
4373 int res; 4391 int res;
4374 4392
4375 cur_token = * index; 4393 cur_token = * index;
4376 list = NULL; 4394 list = NULL;
4377 4395
4378 r = mailimap_address_list_parse(fd, buffer, &cur_token, &list, 4396 r = mailimap_address_list_parse(fd, buffer, &cur_token, &list,
4379 progr_rate, progr_fun); 4397 progr_rate, progr_fun);
4380 if (r != MAILIMAP_NO_ERROR) { 4398 if (r != MAILIMAP_NO_ERROR) {
4381 res = r; 4399 res = r;
4382 goto err; 4400 goto err;
4383 } 4401 }
4384 4402
4385 env_reply_to = mailimap_env_reply_to_new(list); 4403 env_reply_to = mailimap_env_reply_to_new(list);
4386 if (env_reply_to == NULL) { 4404 if (env_reply_to == NULL) {
4387 res = MAILIMAP_ERROR_MEMORY; 4405 res = MAILIMAP_ERROR_MEMORY;
4388 goto free; 4406 goto free;
4389 } 4407 }
4390 4408
4391 * index = cur_token; 4409 * index = cur_token;
4392 * result = env_reply_to; 4410 * result = env_reply_to;
4393 4411
4394 return MAILIMAP_NO_ERROR; 4412 return MAILIMAP_NO_ERROR;
4395 4413
4396 free: 4414 free:
4397 clist_foreach(list, (clist_func) mailimap_address_free, NULL); 4415 clist_foreach(list, (clist_func) mailimap_address_free, NULL);
4398 clist_free(list); 4416 clist_free(list);
4399 err: 4417 err:
4400 return res; 4418 return res;
4401} 4419}
4402 4420
4403/* 4421/*
4404 env-sender = "(" 1*address ")" / nil 4422 env-sender = "(" 1*address ")" / nil
4405*/ 4423*/
4406 4424
4407 4425
4408static int 4426static int
4409mailimap_env_sender_parse(mailstream * fd, MMAPString * buffer, 4427mailimap_env_sender_parse(mailstream * fd, MMAPString * buffer,
4410 size_t * index, struct mailimap_env_sender ** result, 4428 size_t * index, struct mailimap_env_sender ** result,
4411 size_t progr_rate, 4429 size_t progr_rate,
4412 progress_function * progr_fun) 4430 progress_function * progr_fun)
4413{ 4431{
4414 clist * list; 4432 clist * list;
4415 size_t cur_token; 4433 size_t cur_token;
4416 struct mailimap_env_sender * env_sender; 4434 struct mailimap_env_sender * env_sender;
4417 int r; 4435 int r;
4418 int res; 4436 int res;
4419 4437
4420 cur_token = * index; 4438 cur_token = * index;
4421 list = NULL; 4439 list = NULL;
4422 4440
4423 r = mailimap_address_list_parse(fd, buffer, &cur_token, &list, 4441 r = mailimap_address_list_parse(fd, buffer, &cur_token, &list,
4424 progr_rate, progr_fun); 4442 progr_rate, progr_fun);
4425 if (r != MAILIMAP_NO_ERROR) { 4443 if (r != MAILIMAP_NO_ERROR) {
4426 res = r; 4444 res = r;
4427 goto err; 4445 goto err;
4428 } 4446 }
4429 4447
4430 env_sender = mailimap_env_sender_new(list); 4448 env_sender = mailimap_env_sender_new(list);
4431 if (env_sender == NULL) { 4449 if (env_sender == NULL) {
4432 res = MAILIMAP_ERROR_MEMORY; 4450 res = MAILIMAP_ERROR_MEMORY;
4433 goto free; 4451 goto free;
4434 } 4452 }
4435 4453
4436 * index = cur_token; 4454 * index = cur_token;
4437 * result = env_sender; 4455 * result = env_sender;
4438 4456
4439 return MAILIMAP_NO_ERROR; 4457 return MAILIMAP_NO_ERROR;
4440 4458
4441 free: 4459 free:
4442 clist_foreach(list, (clist_func) mailimap_address_free, NULL); 4460 clist_foreach(list, (clist_func) mailimap_address_free, NULL);
4443 clist_free(list); 4461 clist_free(list);
4444 err: 4462 err:
4445 return res; 4463 return res;
4446} 4464}
4447 4465
4448 4466
4449/* 4467/*
4450 env-subject = nstring 4468 env-subject = nstring
4451*/ 4469*/
4452 4470
4453static int mailimap_env_subject_parse(mailstream * fd, MMAPString * buffer, 4471static int mailimap_env_subject_parse(mailstream * fd, MMAPString * buffer,
4454 size_t * index, char ** result, 4472 size_t * index, char ** result,
4455 size_t progr_rate, 4473 size_t progr_rate,
4456 progress_function * progr_fun) 4474 progress_function * progr_fun)
4457{ 4475{
4458 return mailimap_nstring_parse(fd, buffer, index, result, NULL, 4476 return mailimap_nstring_parse(fd, buffer, index, result, NULL,
4459 progr_rate, progr_fun); 4477 progr_rate, progr_fun);
4460} 4478}
4461 4479
4462 4480
4463/* 4481/*
4464 env-to = "(" 1*address ")" / nil 4482 env-to = "(" 1*address ")" / nil
4465*/ 4483*/
4466 4484
4467static int mailimap_env_to_parse(mailstream * fd, MMAPString * buffer, 4485static int mailimap_env_to_parse(mailstream * fd, MMAPString * buffer,
4468 size_t * index, 4486 size_t * index,
4469 struct mailimap_env_to ** result, 4487 struct mailimap_env_to ** result,
4470 size_t progr_rate, 4488 size_t progr_rate,
4471 progress_function * progr_fun) 4489 progress_function * progr_fun)
4472{ 4490{
4473 clist * list; 4491 clist * list;
4474 size_t cur_token; 4492 size_t cur_token;
4475 struct mailimap_env_to * env_to; 4493 struct mailimap_env_to * env_to;
4476 int r; 4494 int r;
4477 int res; 4495 int res;
4478 4496
4479 cur_token = * index; 4497 cur_token = * index;
4480 list = NULL; 4498 list = NULL;
4481 4499
4482 r = mailimap_address_list_parse(fd, buffer, &cur_token, &list, 4500 r = mailimap_address_list_parse(fd, buffer, &cur_token, &list,
4483 progr_rate, progr_fun); 4501 progr_rate, progr_fun);
4484 if (r != MAILIMAP_NO_ERROR) { 4502 if (r != MAILIMAP_NO_ERROR) {
4485 res = r; 4503 res = r;
4486 goto err; 4504 goto err;
4487 } 4505 }
4488 4506
4489 env_to = mailimap_env_to_new(list); 4507 env_to = mailimap_env_to_new(list);
4490 if (env_to == NULL) { 4508 if (env_to == NULL) {
4491 res = MAILIMAP_ERROR_MEMORY; 4509 res = MAILIMAP_ERROR_MEMORY;
4492 goto free; 4510 goto free;
4493 } 4511 }
4494 4512
4495 * index = cur_token; 4513 * index = cur_token;
4496 * result = env_to; 4514 * result = env_to;
4497 4515
4498 return MAILIMAP_NO_ERROR; 4516 return MAILIMAP_NO_ERROR;
4499 4517
4500 free: 4518 free:
4501 clist_foreach(list, (clist_func) mailimap_address_free, NULL); 4519 clist_foreach(list, (clist_func) mailimap_address_free, NULL);
4502 clist_free(list); 4520 clist_free(list);
4503 err: 4521 err:
4504 return res; 4522 return res;
4505} 4523}
4506 4524
4507 4525
4508/* 4526/*
4509 UNIMPLEMENTED 4527 UNIMPLEMENTED
4510 examine = "EXAMINE" SP mailbox 4528 examine = "EXAMINE" SP mailbox
4511*/ 4529*/
4512 4530
4513/* 4531/*
4514 UNIMPLEMENTED 4532 UNIMPLEMENTED
4515 fetch = "FETCH" SP set SP ("ALL" / "FULL" / "FAST" / fetch-att / 4533 fetch = "FETCH" SP set SP ("ALL" / "FULL" / "FAST" / fetch-att /
4516 "(" fetch-att *(SP fetch-att) ")") 4534 "(" fetch-att *(SP fetch-att) ")")
4517*/ 4535*/
4518 4536
4519/* 4537/*
4520 UNIMPLEMENTED 4538 UNIMPLEMENTED
4521 fetch-att = "ENVELOPE" / "FLAGS" / "INTERNALDATE" / 4539 fetch-att = "ENVELOPE" / "FLAGS" / "INTERNALDATE" /
4522 "RFC822" [".HEADER" / ".SIZE" / ".TEXT"] / 4540 "RFC822" [".HEADER" / ".SIZE" / ".TEXT"] /
4523 "BODY" ["STRUCTURE"] / "UID" / 4541 "BODY" ["STRUCTURE"] / "UID" /
4524 "BODY" [".PEEK"] section ["<" number "." nz-number ">"] 4542 "BODY" [".PEEK"] section ["<" number "." nz-number ">"]
4525*/ 4543*/
4526 4544
4527/* 4545/*
4528 flag = "\Answered" / "\Flagged" / "\Deleted" / 4546 flag = "\Answered" / "\Flagged" / "\Deleted" /
4529 "\Seen" / "\Draft" / flag-keyword / flag-extension 4547 "\Seen" / "\Draft" / flag-keyword / flag-extension
4530 ; Does not include "\Recent" 4548 ; Does not include "\Recent"
4531*/ 4549*/
4532 4550
4533static int mailimap_flag_parse(mailstream * fd, MMAPString * buffer, 4551static int mailimap_flag_parse(mailstream * fd, MMAPString * buffer,
4534 size_t * index, 4552 size_t * index,
4535 struct mailimap_flag ** result, 4553 struct mailimap_flag ** result,
4536 size_t progr_rate, 4554 size_t progr_rate,
4537 progress_function * progr_fun) 4555 progress_function * progr_fun)
4538{ 4556{
4539 struct mailimap_flag * flag; 4557 struct mailimap_flag * flag;
4540 size_t cur_token; 4558 size_t cur_token;
4541 char * flag_keyword; 4559 char * flag_keyword;
4542 char * flag_extension; 4560 char * flag_extension;
4543 int type; 4561 int type;
4544 int r; 4562 int r;
4545 int res; 4563 int res;
4546 4564
4547 cur_token = * index; 4565 cur_token = * index;
4548 4566
4549 flag_keyword = NULL; 4567 flag_keyword = NULL;
4550 flag_extension = NULL; 4568 flag_extension = NULL;
4551 4569
4552 type = mailimap_flag_get_token_value(fd, buffer, &cur_token); 4570 type = mailimap_flag_get_token_value(fd, buffer, &cur_token);
4553 if (type == -1) { 4571 if (type == -1) {
4554 r = mailimap_flag_keyword_parse(fd, buffer, &cur_token, &flag_keyword, 4572 r = mailimap_flag_keyword_parse(fd, buffer, &cur_token, &flag_keyword,
4555 progr_rate, progr_fun); 4573 progr_rate, progr_fun);
4556 if (r == MAILIMAP_NO_ERROR) 4574 if (r == MAILIMAP_NO_ERROR)
4557 type = MAILIMAP_FLAG_KEYWORD; 4575 type = MAILIMAP_FLAG_KEYWORD;
4558 4576
4559 if (r == MAILIMAP_ERROR_PARSE) { 4577 if (r == MAILIMAP_ERROR_PARSE) {
4560 r = mailimap_flag_extension_parse(fd, buffer, &cur_token, 4578 r = mailimap_flag_extension_parse(fd, buffer, &cur_token,
4561 &flag_extension, 4579 &flag_extension,
4562 progr_rate, progr_fun); 4580 progr_rate, progr_fun);
4563 type = MAILIMAP_FLAG_EXTENSION; 4581 type = MAILIMAP_FLAG_EXTENSION;
4564 } 4582 }
4565 4583
4566 if (r != MAILIMAP_NO_ERROR) { 4584 if (r != MAILIMAP_NO_ERROR) {
4567 res = r; 4585 res = r;
4568 goto err; 4586 goto err;
4569 } 4587 }
4570 } 4588 }
4571 4589
4572 flag = mailimap_flag_new(type, flag_keyword, flag_extension); 4590 flag = mailimap_flag_new(type, flag_keyword, flag_extension);
4573 if (flag == NULL) { 4591 if (flag == NULL) {
4574 res = MAILIMAP_ERROR_MEMORY; 4592 res = MAILIMAP_ERROR_MEMORY;
4575 goto free; 4593 goto free;
4576 } 4594 }
4577 4595
4578 * result = flag; 4596 * result = flag;
4579 * index = cur_token; 4597 * index = cur_token;
4580 4598
4581 return MAILIMAP_NO_ERROR; 4599 return MAILIMAP_NO_ERROR;
4582 4600
4583 free: 4601 free:
4584 if (flag_keyword != NULL) 4602 if (flag_keyword != NULL)
4585 mailimap_flag_keyword_free(flag_keyword); 4603 mailimap_flag_keyword_free(flag_keyword);
4586 if (flag_extension != NULL) 4604 if (flag_extension != NULL)
4587 mailimap_flag_extension_free(flag_extension); 4605 mailimap_flag_extension_free(flag_extension);
4588 err: 4606 err:
4589 return res; 4607 return res;
4590} 4608}
4591 4609
4592/* 4610/*
4593 flag-extension = "\" atom 4611 flag-extension = "\" atom
4594 ; Future expansion. Client implementations 4612 ; Future expansion. Client implementations
4595 ; MUST accept flag-extension flags. Server 4613 ; MUST accept flag-extension flags. Server
4596 ; implementations MUST NOT generate 4614 ; implementations MUST NOT generate
4597 ; flag-extension flags except as defined by 4615 ; flag-extension flags except as defined by
4598 ; future standard or standards-track 4616 ; future standard or standards-track
4599 ; revisions of this specification. 4617 ; revisions of this specification.
4600*/ 4618*/
4601 4619
4602static int mailimap_flag_extension_parse(mailstream * fd, 4620static int mailimap_flag_extension_parse(mailstream * fd,
4603 MMAPString * buffer, 4621 MMAPString * buffer,
4604 size_t * index, 4622 size_t * index,
4605 char ** result, 4623 char ** result,
4606 size_t progr_rate, 4624 size_t progr_rate,
4607 progress_function * progr_fun) 4625 progress_function * progr_fun)
4608{ 4626{
4609 size_t cur_token; 4627 size_t cur_token;
4610 char * atom; 4628 char * atom;
4611 int r; 4629 int r;
4612 4630
4613 cur_token = * index; 4631 cur_token = * index;
4614 4632
4615 r = mailimap_char_parse(fd, buffer, &cur_token, '\\'); 4633 r = mailimap_char_parse(fd, buffer, &cur_token, '\\');
4616 if (r != MAILIMAP_NO_ERROR) 4634 if (r != MAILIMAP_NO_ERROR)
4617 return r; 4635 return r;
4618 4636
4619 r = mailimap_atom_parse(fd, buffer, &cur_token, &atom, 4637 r = mailimap_atom_parse(fd, buffer, &cur_token, &atom,
4620 progr_rate, progr_fun); 4638 progr_rate, progr_fun);
4621 if (r != MAILIMAP_NO_ERROR) 4639 if (r != MAILIMAP_NO_ERROR)
4622 return r; 4640 return r;
4623 4641
4624 * result = atom; 4642 * result = atom;
4625 * index = cur_token; 4643 * index = cur_token;
4626 4644
4627 return MAILIMAP_NO_ERROR; 4645 return MAILIMAP_NO_ERROR;
4628} 4646}
4629 4647
4630/* 4648/*
4631 flag-fetch = flag / "\Recent" 4649 flag-fetch = flag / "\Recent"
4632*/ 4650*/
4633 4651
4634static int 4652static int
4635mailimap_flag_fetch_parse(mailstream * fd, MMAPString * buffer, 4653mailimap_flag_fetch_parse(mailstream * fd, MMAPString * buffer,
4636 size_t * index, 4654 size_t * index,
4637 struct mailimap_flag_fetch ** result, 4655 struct mailimap_flag_fetch ** result,
4638 size_t progr_rate, 4656 size_t progr_rate,
4639 progress_function * progr_fun) 4657 progress_function * progr_fun)
4640{ 4658{
4641 size_t cur_token; 4659 size_t cur_token;
4642 struct mailimap_flag * flag; 4660 struct mailimap_flag * flag;
4643 struct mailimap_flag_fetch * flag_fetch; 4661 struct mailimap_flag_fetch * flag_fetch;
4644 int type; 4662 int type;
4645 int r; 4663 int r;
4646 int res; 4664 int res;
4647 4665
4648 cur_token = * index; 4666 cur_token = * index;
4649 4667
4650 flag = NULL; 4668 flag = NULL;
4651 4669
4652 type = MAILIMAP_FLAG_FETCH_ERROR; /* XXX - removes a gcc warning */ 4670 type = MAILIMAP_FLAG_FETCH_ERROR; /* XXX - removes a gcc warning */
4653 4671
4654 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, 4672 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token,
4655 "\\Recent"); 4673 "\\Recent");
4656 if (r == MAILIMAP_NO_ERROR) 4674 if (r == MAILIMAP_NO_ERROR)
4657 type = MAILIMAP_FLAG_FETCH_RECENT; 4675 type = MAILIMAP_FLAG_FETCH_RECENT;
4658 4676
4659 if (r == MAILIMAP_ERROR_PARSE) { 4677 if (r == MAILIMAP_ERROR_PARSE) {
4660 r = mailimap_flag_parse(fd, buffer, &cur_token, &flag, 4678 r = mailimap_flag_parse(fd, buffer, &cur_token, &flag,
4661 progr_rate, progr_fun); 4679 progr_rate, progr_fun);
4662 if (r == MAILIMAP_NO_ERROR) 4680 if (r == MAILIMAP_NO_ERROR)
4663 type = MAILIMAP_FLAG_FETCH_OTHER; 4681 type = MAILIMAP_FLAG_FETCH_OTHER;
4664 } 4682 }
4665 4683
4666 if (r != MAILIMAP_NO_ERROR) { 4684 if (r != MAILIMAP_NO_ERROR) {
4667 res = r; 4685 res = r;
4668 goto err; 4686 goto err;
4669 } 4687 }
4670 4688
4671 flag_fetch = mailimap_flag_fetch_new(type, flag); 4689 flag_fetch = mailimap_flag_fetch_new(type, flag);
4672 if (flag_fetch == NULL) { 4690 if (flag_fetch == NULL) {
4673 res = MAILIMAP_ERROR_MEMORY; 4691 res = MAILIMAP_ERROR_MEMORY;
4674 goto free; 4692 goto free;
4675 } 4693 }
4676 4694
4677 * index = cur_token; 4695 * index = cur_token;
4678 * result = flag_fetch; 4696 * result = flag_fetch;
4679 4697
4680 return MAILIMAP_NO_ERROR; 4698 return MAILIMAP_NO_ERROR;
4681 4699
4682 free: 4700 free:
4683 if (flag != NULL) 4701 if (flag != NULL)
4684 mailimap_flag_free(flag); 4702 mailimap_flag_free(flag);
4685 err: 4703 err:
4686 return res; 4704 return res;
4687} 4705}
4688 4706
4689/* 4707/*
4690 flag-keyword = atom 4708 flag-keyword = atom
4691*/ 4709*/
4692 4710
4693static int mailimap_flag_keyword_parse(mailstream * fd, MMAPString * buffer, 4711static int mailimap_flag_keyword_parse(mailstream * fd, MMAPString * buffer,
4694 size_t * index, 4712 size_t * index,
4695 char ** result, 4713 char ** result,
4696 size_t progr_rate, 4714 size_t progr_rate,
4697 progress_function * progr_fun) 4715 progress_function * progr_fun)
4698{ 4716{
4699 return mailimap_atom_parse(fd, buffer, index, result, 4717 return mailimap_atom_parse(fd, buffer, index, result,
4700 progr_rate, progr_fun); 4718 progr_rate, progr_fun);
4701} 4719}
4702 4720
4703/* 4721/*
4704 flag-list = "(" [flag *(SP flag)] ")" 4722 flag-list = "(" [flag *(SP flag)] ")"
4705*/ 4723*/
4706 4724
4707static int mailimap_flag_list_parse(mailstream * fd, MMAPString * buffer, 4725static int mailimap_flag_list_parse(mailstream * fd, MMAPString * buffer,
4708 size_t * index, 4726 size_t * index,
4709 struct mailimap_flag_list ** result, 4727 struct mailimap_flag_list ** result,
4710 size_t progr_rate, 4728 size_t progr_rate,
4711 progress_function * progr_fun) 4729 progress_function * progr_fun)
4712{ 4730{
4713 size_t cur_token; 4731 size_t cur_token;
4714 clist * list; 4732 clist * list;
4715 struct mailimap_flag_list * flag_list; 4733 struct mailimap_flag_list * flag_list;
4716 int r; 4734 int r;
4717 int res; 4735 int res;
4718 4736
4719 list = NULL; 4737 list = NULL;
4720 cur_token = * index; 4738 cur_token = * index;
4721 4739
4722 r = mailimap_oparenth_parse(fd, buffer, &cur_token); 4740 r = mailimap_oparenth_parse(fd, buffer, &cur_token);
4723 if (r != MAILIMAP_NO_ERROR) { 4741 if (r != MAILIMAP_NO_ERROR) {
4724 res = r; 4742 res = r;
4725 goto err; 4743 goto err;
4726 } 4744 }
4727 4745
4728 r = mailimap_struct_spaced_list_parse(fd, buffer, &cur_token, &list, 4746 r = mailimap_struct_spaced_list_parse(fd, buffer, &cur_token, &list,
4729 (mailimap_struct_parser *) 4747 (mailimap_struct_parser *)
4730 mailimap_flag_parse, 4748 mailimap_flag_parse,
4731 (mailimap_struct_destructor *) 4749 (mailimap_struct_destructor *)
4732 mailimap_flag_free, 4750 mailimap_flag_free,
4733 progr_rate, progr_fun); 4751 progr_rate, progr_fun);
4734 4752
4735 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) { 4753 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) {
4736 res = r; 4754 res = r;
4737 goto err; 4755 goto err;
4738 } 4756 }
4739 4757
4740 r = mailimap_cparenth_parse(fd, buffer, &cur_token); 4758 r = mailimap_cparenth_parse(fd, buffer, &cur_token);
4741 if (r != MAILIMAP_NO_ERROR) { 4759 if (r != MAILIMAP_NO_ERROR) {
4742 res = r; 4760 res = r;
4743 goto free; 4761 goto free;
4744 } 4762 }
4745 4763
4746 flag_list = mailimap_flag_list_new(list); 4764 flag_list = mailimap_flag_list_new(list);
4747 if (flag_list == NULL) { 4765 if (flag_list == NULL) {
4748 res = MAILIMAP_ERROR_MEMORY; 4766 res = MAILIMAP_ERROR_MEMORY;
4749 goto free; 4767 goto free;
4750 } 4768 }
4751 4769
4752 * result = flag_list; 4770 * result = flag_list;
4753 * index = cur_token; 4771 * index = cur_token;
4754 4772
4755 return MAILIMAP_NO_ERROR; 4773 return MAILIMAP_NO_ERROR;
4756 4774
4757 free: 4775 free:
4758 if (list != NULL) { 4776 if (list != NULL) {
4759 clist_foreach(list, (clist_func) mailimap_flag_free, NULL); 4777 clist_foreach(list, (clist_func) mailimap_flag_free, NULL);
4760 clist_free(list); 4778 clist_free(list);
4761 } 4779 }
4762 err: 4780 err:
4763 return res; 4781 return res;
4764} 4782}
4765 4783
4766/* 4784/*
4767 flag-perm = flag / "\*" 4785 flag-perm = flag / "\*"
4768*/ 4786*/
4769 4787
4770static int 4788static int
4771mailimap_flag_perm_parse(mailstream * fd, MMAPString * buffer, 4789mailimap_flag_perm_parse(mailstream * fd, MMAPString * buffer,
4772 size_t * index, 4790 size_t * index,
4773 struct mailimap_flag_perm ** result, 4791 struct mailimap_flag_perm ** result,
4774 size_t progr_rate, 4792 size_t progr_rate,
4775 progress_function * progr_fun) 4793 progress_function * progr_fun)
4776{ 4794{
4777 size_t cur_token; 4795 size_t cur_token;
4778 struct mailimap_flag_perm * flag_perm; 4796 struct mailimap_flag_perm * flag_perm;
4779 struct mailimap_flag * flag; 4797 struct mailimap_flag * flag;
4780 int type; 4798 int type;
4781 int r; 4799 int r;
4782 int res; 4800 int res;
4783 4801
4784 flag = NULL; 4802 flag = NULL;
4785 cur_token = * index; 4803 cur_token = * index;
4786 type = MAILIMAP_FLAG_PERM_ERROR; /* XXX - removes a gcc warning */ 4804 type = MAILIMAP_FLAG_PERM_ERROR; /* XXX - removes a gcc warning */
4787 4805
4788 r = mailimap_flag_parse(fd, buffer, &cur_token, &flag, 4806 r = mailimap_flag_parse(fd, buffer, &cur_token, &flag,
4789 progr_rate, progr_fun); 4807 progr_rate, progr_fun);
4790 if (r == MAILIMAP_NO_ERROR) 4808 if (r == MAILIMAP_NO_ERROR)
4791 type = MAILIMAP_FLAG_PERM_FLAG; 4809 type = MAILIMAP_FLAG_PERM_FLAG;
4792 4810
4793 if (r == MAILIMAP_ERROR_PARSE) { 4811 if (r == MAILIMAP_ERROR_PARSE) {
4794 r = mailimap_token_case_insensitive_parse(fd, buffer, 4812 r = mailimap_token_case_insensitive_parse(fd, buffer,
4795 &cur_token, "\\*"); 4813 &cur_token, "\\*");
4796 if (r == MAILIMAP_NO_ERROR) 4814 if (r == MAILIMAP_NO_ERROR)
4797 type = MAILIMAP_FLAG_PERM_ALL; 4815 type = MAILIMAP_FLAG_PERM_ALL;
4798 } 4816 }
4799 4817
4800 if (r != MAILIMAP_NO_ERROR) { 4818 if (r != MAILIMAP_NO_ERROR) {
4801 res = r; 4819 res = r;
4802 goto err; 4820 goto err;
4803 } 4821 }
4804 4822
4805 flag_perm = mailimap_flag_perm_new(type, flag); 4823 flag_perm = mailimap_flag_perm_new(type, flag);
4806 if (flag_perm == NULL) { 4824 if (flag_perm == NULL) {
4807 res = MAILIMAP_ERROR_MEMORY; 4825 res = MAILIMAP_ERROR_MEMORY;
4808 goto free; 4826 goto free;
4809 } 4827 }
4810 4828
4811 * result = flag_perm; 4829 * result = flag_perm;
4812 * index = cur_token; 4830 * index = cur_token;
4813 4831
4814 return MAILIMAP_NO_ERROR; 4832 return MAILIMAP_NO_ERROR;
4815 4833
4816 free: 4834 free:
4817 if (flag != NULL) 4835 if (flag != NULL)
4818 mailimap_flag_free(flag); 4836 mailimap_flag_free(flag);
4819 err: 4837 err:
4820 return res; 4838 return res;
4821} 4839}
4822 4840
4823/* 4841/*
4824 greeting = "*" SP (resp-cond-auth / resp-cond-bye) CRLF 4842 greeting = "*" SP (resp-cond-auth / resp-cond-bye) CRLF
4825*/ 4843*/
4826 4844
4827int mailimap_greeting_parse(mailstream * fd, MMAPString * buffer, 4845int mailimap_greeting_parse(mailstream * fd, MMAPString * buffer,
4828 size_t * index, 4846 size_t * index,
4829 struct mailimap_greeting ** result, 4847 struct mailimap_greeting ** result,
4830 size_t progr_rate, 4848 size_t progr_rate,
4831 progress_function * progr_fun) 4849 progress_function * progr_fun)
4832{ 4850{
4833 size_t cur_token; 4851 size_t cur_token;
4834 struct mailimap_resp_cond_auth * resp_cond_auth; 4852 struct mailimap_resp_cond_auth * resp_cond_auth;
4835 struct mailimap_resp_cond_bye * resp_cond_bye; 4853 struct mailimap_resp_cond_bye * resp_cond_bye;
4836 struct mailimap_greeting * greeting; 4854 struct mailimap_greeting * greeting;
4837 int type; 4855 int type;
4838 int r; 4856 int r;
4839 int res; 4857 int res;
4840 4858
4841 cur_token = * index; 4859 cur_token = * index;
4842 resp_cond_bye = NULL; 4860 resp_cond_bye = NULL;
4843 resp_cond_auth = NULL; 4861 resp_cond_auth = NULL;
4844 4862
4845 r = mailimap_star_parse(fd, buffer, &cur_token); 4863 r = mailimap_star_parse(fd, buffer, &cur_token);
4846 if (r != MAILIMAP_NO_ERROR) { 4864 if (r != MAILIMAP_NO_ERROR) {
4847 res = r; 4865 res = r;
4848 goto err; 4866 goto err;
4849 } 4867 }
4850 4868
4851 r = mailimap_space_parse(fd, buffer, &cur_token); 4869 r = mailimap_space_parse(fd, buffer, &cur_token);
4852 if (r != MAILIMAP_NO_ERROR) { 4870 if (r != MAILIMAP_NO_ERROR) {
4853 res = r; 4871 res = r;
4854 goto err; 4872 goto err;
4855 } 4873 }
4856 4874
4857 type = MAILIMAP_GREETING_RESP_COND_ERROR; /* XXX - removes a gcc warning */ 4875 type = MAILIMAP_GREETING_RESP_COND_ERROR; /* XXX - removes a gcc warning */
4858 4876
4859 r = mailimap_resp_cond_auth_parse(fd, buffer, &cur_token, &resp_cond_auth, 4877 r = mailimap_resp_cond_auth_parse(fd, buffer, &cur_token, &resp_cond_auth,
4860 progr_rate, progr_fun); 4878 progr_rate, progr_fun);
4861 if (r == MAILIMAP_NO_ERROR) 4879 if (r == MAILIMAP_NO_ERROR)
4862 type = MAILIMAP_GREETING_RESP_COND_AUTH; 4880 type = MAILIMAP_GREETING_RESP_COND_AUTH;
4863 4881
4864 if (r == MAILIMAP_ERROR_PARSE) { 4882 if (r == MAILIMAP_ERROR_PARSE) {
4865 r = mailimap_resp_cond_bye_parse(fd, buffer, &cur_token, 4883 r = mailimap_resp_cond_bye_parse(fd, buffer, &cur_token,
4866 &resp_cond_bye, 4884 &resp_cond_bye,
4867 progr_rate, progr_fun); 4885 progr_rate, progr_fun);
4868 if (r == MAILIMAP_NO_ERROR) 4886 if (r == MAILIMAP_NO_ERROR)
4869 type = MAILIMAP_GREETING_RESP_COND_BYE; 4887 type = MAILIMAP_GREETING_RESP_COND_BYE;
4870 } 4888 }
4871 4889
4872 if (r != MAILIMAP_NO_ERROR) { 4890 if (r != MAILIMAP_NO_ERROR) {
4873 res = r; 4891 res = r;
4874 goto err; 4892 goto err;
4875 } 4893 }
4876 4894
4877 r = mailimap_crlf_parse(fd, buffer, &cur_token); 4895 r = mailimap_crlf_parse(fd, buffer, &cur_token);
4878 if (r != MAILIMAP_NO_ERROR) { 4896 if (r != MAILIMAP_NO_ERROR) {
4879 res = r; 4897 res = r;
4880 goto free; 4898 goto free;
4881 } 4899 }
4882 4900
4883 greeting = mailimap_greeting_new(type, resp_cond_auth, resp_cond_bye); 4901 greeting = mailimap_greeting_new(type, resp_cond_auth, resp_cond_bye);
4884 if (greeting == NULL) { 4902 if (greeting == NULL) {
4885 res = MAILIMAP_ERROR_MEMORY; 4903 res = MAILIMAP_ERROR_MEMORY;
4886 goto free; 4904 goto free;
4887 } 4905 }
4888 4906
4889 * result = greeting; 4907 * result = greeting;
4890 * index = cur_token; 4908 * index = cur_token;
4891 4909
4892 return MAILIMAP_NO_ERROR; 4910 return MAILIMAP_NO_ERROR;
4893 4911
4894 free: 4912 free:
4895 if (resp_cond_auth) 4913 if (resp_cond_auth)
4896 mailimap_resp_cond_auth_free(resp_cond_auth); 4914 mailimap_resp_cond_auth_free(resp_cond_auth);
4897 if (resp_cond_bye) 4915 if (resp_cond_bye)
4898 mailimap_resp_cond_bye_free(resp_cond_bye); 4916 mailimap_resp_cond_bye_free(resp_cond_bye);
4899 err: 4917 err:
4900 return res; 4918 return res;
4901} 4919}
4902 4920
4903/* 4921/*
4904 header-fld-name = astring 4922 header-fld-name = astring
4905*/ 4923*/
4906 4924
4907static int 4925static int
4908mailimap_header_fld_name_parse(mailstream * fd, 4926mailimap_header_fld_name_parse(mailstream * fd,
4909 MMAPString * buffer, 4927 MMAPString * buffer,
4910 size_t * index, 4928 size_t * index,
4911 char ** result, 4929 char ** result,
4912 size_t progr_rate, 4930 size_t progr_rate,
4913 progress_function * progr_fun) 4931 progress_function * progr_fun)
4914{ 4932{
4915 return mailimap_astring_parse(fd, buffer, index, result, 4933 return mailimap_astring_parse(fd, buffer, index, result,
4916 progr_rate, progr_fun); 4934 progr_rate, progr_fun);
4917} 4935}
4918 4936
4919/* 4937/*
4920 header-list = "(" header-fld-name *(SP header-fld-name) ")" 4938 header-list = "(" header-fld-name *(SP header-fld-name) ")"
4921*/ 4939*/
4922 4940
4923static int 4941static int
4924mailimap_header_list_parse(mailstream * fd, MMAPString * buffer, 4942mailimap_header_list_parse(mailstream * fd, MMAPString * buffer,
4925 size_t * index, 4943 size_t * index,
4926 struct mailimap_header_list ** result, 4944 struct mailimap_header_list ** result,
4927 size_t progr_rate, 4945 size_t progr_rate,
4928 progress_function * progr_fun) 4946 progress_function * progr_fun)
4929{ 4947{
4930 size_t cur_token; 4948 size_t cur_token;
4931 struct mailimap_header_list * header_list; 4949 struct mailimap_header_list * header_list;
4932 clist * list; 4950 clist * list;
4933 int r; 4951 int r;
4934 int res; 4952 int res;
4935 4953
4936 cur_token = * index; 4954 cur_token = * index;
4937 4955
4938 list = NULL; 4956 list = NULL;
4939 4957
4940 r = mailimap_oparenth_parse(fd, buffer, &cur_token); 4958 r = mailimap_oparenth_parse(fd, buffer, &cur_token);
4941 if (r != MAILIMAP_NO_ERROR) { 4959 if (r != MAILIMAP_NO_ERROR) {
4942 res = r; 4960 res = r;
4943 goto err; 4961 goto err;
4944 } 4962 }
4945 4963
4946 r = mailimap_struct_spaced_list_parse(fd, buffer, &cur_token, &list, 4964 r = mailimap_struct_spaced_list_parse(fd, buffer, &cur_token, &list,
4947 (mailimap_struct_parser *) 4965 (mailimap_struct_parser *)
4948 mailimap_header_fld_name_parse, 4966 mailimap_header_fld_name_parse,
4949 (mailimap_struct_destructor *) 4967 (mailimap_struct_destructor *)
4950 mailimap_header_fld_name_free, 4968 mailimap_header_fld_name_free,
4951 progr_rate, progr_fun); 4969 progr_rate, progr_fun);
4952 if (r != MAILIMAP_NO_ERROR) { 4970 if (r != MAILIMAP_NO_ERROR) {
4953 res = r; 4971 res = r;
4954 goto err; 4972 goto err;
4955 } 4973 }
4956 4974
4957 r = mailimap_cparenth_parse(fd, buffer, &cur_token); 4975 r = mailimap_cparenth_parse(fd, buffer, &cur_token);
4958 if (r != MAILIMAP_NO_ERROR) { 4976 if (r != MAILIMAP_NO_ERROR) {
4959 res = r; 4977 res = r;
4960 goto free; 4978 goto free;
4961 } 4979 }
4962 4980
4963 header_list = mailimap_header_list_new(list); 4981 header_list = mailimap_header_list_new(list);
4964 if (header_list == NULL) { 4982 if (header_list == NULL) {
4965 res = MAILIMAP_ERROR_MEMORY; 4983 res = MAILIMAP_ERROR_MEMORY;
4966 goto free; 4984 goto free;
4967 } 4985 }
4968 4986
4969 * result = header_list; 4987 * result = header_list;
4970 * index = cur_token; 4988 * index = cur_token;
4971 4989
4972 return MAILIMAP_NO_ERROR; 4990 return MAILIMAP_NO_ERROR;
4973 4991
4974 free: 4992 free:
4975 clist_foreach(list, (clist_func) mailimap_header_fld_name_free, NULL); 4993 clist_foreach(list, (clist_func) mailimap_header_fld_name_free, NULL);
4976 clist_free(list); 4994 clist_free(list);
4977 err: 4995 err:
4978 return res; 4996 return res;
4979} 4997}
4980 4998
4981/* 4999/*
4982UNIMPLEMENTED 5000UNIMPLEMENTED
4983 list = "LIST" SP mailbox SP list-mailbox 5001 list = "LIST" SP mailbox SP list-mailbox
4984 5002
4985UNIMPLEMENTED 5003UNIMPLEMENTED
4986 list-mailbox = 1*list-char / string 5004 list-mailbox = 1*list-char / string
4987 5005
4988UNIMPLEMENTED 5006UNIMPLEMENTED
4989 list-char = ATOM-CHAR / list-wildcards / resp-specials 5007 list-char = ATOM-CHAR / list-wildcards / resp-specials
4990*/ 5008*/
4991 5009
4992/* 5010/*
4993 list-wildcards = "%" / "*" 5011 list-wildcards = "%" / "*"
4994*/ 5012*/
4995 5013
4996static int is_list_wildcards(char ch) 5014static int is_list_wildcards(char ch)
4997{ 5015{
4998 switch (ch) { 5016 switch (ch) {
4999 case '%': 5017 case '%':
5000 case '*': 5018 case '*':
5001 return TRUE; 5019 return TRUE;
5002 } 5020 }
5003 return FALSE; 5021 return FALSE;
5004} 5022}
5005 5023
5006 5024
5007/* 5025/*
5008 literal = "{" number "}" CRLF *CHAR8 5026 literal = "{" number "}" CRLF *CHAR8
5009 ; Number represents the number of CHAR8s 5027 ; Number represents the number of CHAR8s
5010*/ 5028*/
5011 5029
5012static int mailimap_literal_parse(mailstream * fd, MMAPString * buffer, 5030static int mailimap_literal_parse(mailstream * fd, MMAPString * buffer,
5013 size_t * index, char ** result, 5031 size_t * index, char ** result,
5014 size_t * result_len, 5032 size_t * result_len,
5015 size_t progr_rate, 5033 size_t progr_rate,
5016 progress_function * progr_fun) 5034 progress_function * progr_fun)
5017{ 5035{
5018 size_t cur_token; 5036 size_t cur_token;
5019 uint32_t number; 5037 uint32_t number;
5020 MMAPString * literal; 5038 MMAPString * literal;
5021 char * literal_p; 5039 char * literal_p;
5022 uint32_t left; 5040 uint32_t left;
5023 int r; 5041 int r;
5024 int res; 5042 int res;
5025 size_t number_token; 5043 size_t number_token;
5026 5044
5027 cur_token = * index; 5045 cur_token = * index;
5028 5046
5029 r = mailimap_oaccolade_parse(fd, buffer, &cur_token); 5047 r = mailimap_oaccolade_parse(fd, buffer, &cur_token);
5030 if (r != MAILIMAP_NO_ERROR) { 5048 if (r != MAILIMAP_NO_ERROR) {
5031 res = r; 5049 res = r;
5032 goto err; 5050 goto err;
5033 } 5051 }
5034 5052
5035 number_token = cur_token; 5053 number_token = cur_token;
5036 5054
5037 r = mailimap_number_parse(fd, buffer, &cur_token, &number); 5055 r = mailimap_number_parse(fd, buffer, &cur_token, &number);
5038 if (r != MAILIMAP_NO_ERROR) { 5056 if (r != MAILIMAP_NO_ERROR) {
5039 res = r; 5057 res = r;
5040 goto err; 5058 goto err;
5041 } 5059 }
5042 5060
5043 r = mailimap_caccolade_parse(fd, buffer, &cur_token); 5061 r = mailimap_caccolade_parse(fd, buffer, &cur_token);
5044 if (r != MAILIMAP_NO_ERROR) { 5062 if (r != MAILIMAP_NO_ERROR) {
5045 res = r; 5063 res = r;
5046 goto err; 5064 goto err;
5047 } 5065 }
5048 5066
5049 r = mailimap_crlf_parse(fd, buffer, &cur_token); 5067 r = mailimap_crlf_parse(fd, buffer, &cur_token);
5050 if (r != MAILIMAP_NO_ERROR) { 5068 if (r != MAILIMAP_NO_ERROR) {
5051 res = r; 5069 res = r;
5052 goto err; 5070 goto err;
5053 } 5071 }
5054 5072
5055 literal = mmap_string_sized_new(number); 5073 literal = mmap_string_sized_new(number);
5056 /* 5074 /*
5057 literal = g_new(char, number + 1); 5075 literal = g_new(char, number + 1);
5058 */ 5076 */
5059 if (literal == NULL) { 5077 if (literal == NULL) {
5060 res = MAILIMAP_ERROR_MEMORY; 5078 res = MAILIMAP_ERROR_MEMORY;
5061 goto err; 5079 goto err;
5062 } 5080 }
5063 5081
5064 left = buffer->len - cur_token; 5082 left = buffer->len - cur_token;
5065 5083
5066 if (left >= number) { 5084 if (left >= number) {
5067 /* 5085 /*
5068 if (number > 0) 5086 if (number > 0)
5069 strncpy(literal, buffer->str + cur_token, number); 5087 strncpy(literal, buffer->str + cur_token, number);
5070 literal[number] = 0; 5088 literal[number] = 0;
5071 */ 5089 */
5072 if (number > 0) 5090 if (number > 0)
5073 if (mmap_string_append_len(literal, buffer->str + cur_token, 5091 if (mmap_string_append_len(literal, buffer->str + cur_token,
5074 number) == NULL) { 5092 number) == NULL) {
5075 res = MAILIMAP_ERROR_MEMORY; 5093 res = MAILIMAP_ERROR_MEMORY;
5076 goto free_literal; 5094 goto free_literal;
5077 } 5095 }
5078 if ((progr_fun != NULL) && (progr_rate != 0)) 5096 if ((progr_fun != NULL) && (progr_rate != 0))
5079 progr_fun(number, number); 5097 progr_fun(number, number);
5080 5098
5081 cur_token = cur_token + number; 5099 cur_token = cur_token + number;
5082 } 5100 }
5083 else { 5101 else {
5084 uint32_t needed; 5102 uint32_t needed;
5085 uint32_t current_prog = 0; 5103 uint32_t current_prog = 0;
5086 uint32_t last_prog = 0; 5104 uint32_t last_prog = 0;
5087 5105
5088 needed = number - left; 5106 needed = number - left;
5089 memcpy(literal->str, buffer->str + cur_token, left); 5107 memcpy(literal->str, buffer->str + cur_token, left);
5090 literal->len += left; 5108 literal->len += left;
5091 literal_p = literal->str + left; 5109 literal_p = literal->str + left;
5092 current_prog = left; 5110 current_prog = left;
5093 5111
5094 while (needed > 0) { 5112 while (needed > 0) {
5095 ssize_t read_bytes; 5113 ssize_t read_bytes;
5096 5114
5097 read_bytes = mailstream_read(fd, literal_p, needed); 5115 read_bytes = mailstream_read(fd, literal_p, needed);
5098 if (read_bytes == -1) { 5116 if (read_bytes == -1) {
5099 res = MAILIMAP_ERROR_STREAM; 5117 res = MAILIMAP_ERROR_STREAM;
5100 goto free_literal; 5118 goto free_literal;
5101 } 5119 }
5102 literal->len += read_bytes; 5120 literal->len += read_bytes;
5103 needed -= read_bytes; 5121 needed -= read_bytes;
5104 literal_p += read_bytes; 5122 literal_p += read_bytes;
5105 5123
5106 current_prog += read_bytes; 5124 current_prog += read_bytes;
5107 if ((progr_fun != NULL) && (progr_rate != 0)) 5125 if ((progr_fun != NULL) && (progr_rate != 0))
5108 if (current_prog - last_prog > progr_rate) { 5126 if (current_prog - last_prog > progr_rate) {
5109 progr_fun(current_prog, number); 5127 progr_fun(current_prog, number);
5110 last_prog = current_prog; 5128 last_prog = current_prog;
5111 } 5129 }
5112 } 5130 }
5113 5131
5114 literal->str[number] = 0; 5132 literal->str[number] = 0;
5115 5133
5116#if 0 5134#if 0
5117 literal->str[number] = 0; 5135 literal->str[number] = 0;
5118 if (mmap_string_append_len(buffer, literal->str + left, 5136 if (mmap_string_append_len(buffer, literal->str + left,
5119 literal->len - left) == NULL) { 5137 literal->len - left) == NULL) {
5120 res = MAILIMAP_ERROR_STREAM; 5138 res = MAILIMAP_ERROR_STREAM;
5121 goto free_literal; 5139 goto free_literal;
5122 } 5140 }
5123#endif 5141#endif
5124 5142
5125 if (mmap_string_truncate(buffer, number_token) == NULL) { 5143 if (mmap_string_truncate(buffer, number_token) == NULL) {
5126 res = MAILIMAP_ERROR_MEMORY; 5144 res = MAILIMAP_ERROR_MEMORY;
5127 goto free_literal; 5145 goto free_literal;
5128 } 5146 }
5129 5147
5130 if (mmap_string_append(buffer, "0}\r\n") == NULL) { 5148 if (mmap_string_append(buffer, "0}\r\n") == NULL) {
5131 res = MAILIMAP_ERROR_MEMORY; 5149 res = MAILIMAP_ERROR_MEMORY;
5132 goto free_literal; 5150 goto free_literal;
5133 } 5151 }
5134 5152
5135 cur_token = number_token + 4; 5153 cur_token = number_token + 4;
5136 } 5154 }
5137 if ((progr_fun != NULL) && (progr_rate != 0)) 5155 if ((progr_fun != NULL) && (progr_rate != 0))
5138 progr_fun(number, number); 5156 progr_fun(number, number);
5139 5157
5140 if (mailstream_read_line_append(fd, buffer) == NULL) { 5158 if (mailstream_read_line_append(fd, buffer) == NULL) {
5141 res = MAILIMAP_ERROR_STREAM; 5159 res = MAILIMAP_ERROR_STREAM;
5142 goto free_literal; 5160 goto free_literal;
5143 } 5161 }
5144 5162
5145 if (mmap_string_ref(literal) < 0) { 5163 if (mmap_string_ref(literal) < 0) {
5146 res = MAILIMAP_ERROR_MEMORY; 5164 res = MAILIMAP_ERROR_MEMORY;
5147 goto free_literal; 5165 goto free_literal;
5148 } 5166 }
5149 5167
5150 * result = literal->str; 5168 * result = literal->str;
5151 if (result_len != NULL) 5169 if (result_len != NULL)
5152 * result_len = literal->len; 5170 * result_len = literal->len;
5153 * index = cur_token; 5171 * index = cur_token;
5154 5172
5155 return MAILIMAP_NO_ERROR; 5173 return MAILIMAP_NO_ERROR;
5156 5174
5157 free_literal: 5175 free_literal:
5158 mmap_string_free(literal); 5176 mmap_string_free(literal);
5159 err: 5177 err:
5160 return res; 5178 return res;
5161} 5179}
5162 5180
5163/* 5181/*
5164 UNIMPLEMENTED 5182 UNIMPLEMENTED
5165 login = "LOGIN" SP userid SP password 5183 login = "LOGIN" SP userid SP password
5166 5184
5167 UNIMPLEMENTED 5185 UNIMPLEMENTED
5168 lsub = "LSUB" SP mailbox SP list-mailbox 5186 lsub = "LSUB" SP mailbox SP list-mailbox
5169*/ 5187*/
5170 5188
5171/* 5189/*
5172 mailbox = "INBOX" / astring 5190 mailbox = "INBOX" / astring
5173 ; INBOX is case-insensitive. All case variants of 5191 ; INBOX is case-insensitive. All case variants of
5174 ; INBOX (e.g. "iNbOx") MUST be interpreted as INBOX 5192 ; INBOX (e.g. "iNbOx") MUST be interpreted as INBOX
5175 ; not as an astring. An astring which consists of 5193 ; not as an astring. An astring which consists of
5176 ; the case-insensitive sequence "I" "N" "B" "O" "X" 5194 ; the case-insensitive sequence "I" "N" "B" "O" "X"
5177 ; is considered to be INBOX and not an astring. 5195 ; is considered to be INBOX and not an astring.
5178 ; Refer to section 5.1 for further 5196 ; Refer to section 5.1 for further
5179 ; semantic details of mailbox names. 5197 ; semantic details of mailbox names.
5180*/ 5198*/
5181 5199
5182static int 5200static int
5183mailimap_mailbox_parse(mailstream * fd, MMAPString * buffer, 5201mailimap_mailbox_parse(mailstream * fd, MMAPString * buffer,
5184 size_t * index, char ** result, 5202 size_t * index, char ** result,
5185 size_t progr_rate, 5203 size_t progr_rate,
5186 progress_function * progr_fun) 5204 progress_function * progr_fun)
5187{ 5205{
5188 size_t cur_token; 5206 size_t cur_token;
5189 char * name; 5207 char * name;
5190 int r; 5208 int r;
5191 5209
5192 cur_token = * index; 5210 cur_token = * index;
5193 5211
5194 r = mailimap_astring_parse(fd, buffer, &cur_token, &name, 5212 r = mailimap_astring_parse(fd, buffer, &cur_token, &name,
5195 progr_rate, progr_fun); 5213 progr_rate, progr_fun);
5196 if (r != MAILIMAP_NO_ERROR) 5214 if (r != MAILIMAP_NO_ERROR)
5197 return r; 5215 return r;
5198 5216
5199 * result = name; 5217 * result = name;
5200 * index = cur_token; 5218 * index = cur_token;
5201 5219
5202 return MAILIMAP_NO_ERROR; 5220 return MAILIMAP_NO_ERROR;
5203} 5221}
5204 5222
5205 5223
5206/* 5224/*
5207 mailbox-data = "FLAGS" SP flag-list / "LIST" SP mailbox-list / 5225 mailbox-data = "FLAGS" SP flag-list / "LIST" SP mailbox-list /
5208 "LSUB" SP mailbox-list / "SEARCH" *(SP nz-number) / 5226 "LSUB" SP mailbox-list / "SEARCH" *(SP nz-number) /
5209 "STATUS" SP mailbox SP "(" 5227 "STATUS" SP mailbox SP "("
5210 [status-att SP number *(SP status-att SP number)] ")" / 5228 [status-att SP number *(SP status-att SP number)] ")" /
5211 number SP "EXISTS" / number SP "RECENT" 5229 number SP "EXISTS" / number SP "RECENT"
5212*/ 5230*/
5213 5231
5214/* 5232/*
5215 "FLAGS" SP flag-list 5233 "FLAGS" SP flag-list
5216*/ 5234*/
5217 5235
5218static int 5236static int
5219mailimap_mailbox_data_flags_parse(mailstream * fd, MMAPString * buffer, 5237mailimap_mailbox_data_flags_parse(mailstream * fd, MMAPString * buffer,
5220 size_t * index, 5238 size_t * index,
5221 struct mailimap_flag_list ** result, 5239 struct mailimap_flag_list ** result,
5222 size_t progr_rate, 5240 size_t progr_rate,
5223 progress_function * progr_fun) 5241 progress_function * progr_fun)
5224{ 5242{
5225 size_t cur_token; 5243 size_t cur_token;
5226 struct mailimap_flag_list * flag_list; 5244 struct mailimap_flag_list * flag_list;
5227 int r; 5245 int r;
5228 5246
5229 cur_token = * index; 5247 cur_token = * index;
5230 5248
5231 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, "FLAGS"); 5249 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, "FLAGS");
5232 if (r != MAILIMAP_NO_ERROR) 5250 if (r != MAILIMAP_NO_ERROR)
5233 return r; 5251 return r;
5234 5252
5235 r = mailimap_space_parse(fd, buffer, &cur_token); 5253 r = mailimap_space_parse(fd, buffer, &cur_token);
5236 if (r != MAILIMAP_NO_ERROR) 5254 if (r != MAILIMAP_NO_ERROR)
5237 return r; 5255 return r;
5238 5256
5239 r = mailimap_flag_list_parse(fd, buffer, &cur_token, &flag_list, 5257 r = mailimap_flag_list_parse(fd, buffer, &cur_token, &flag_list,
5240 progr_rate, progr_fun); 5258 progr_rate, progr_fun);
5241 if (r != MAILIMAP_NO_ERROR) 5259 if (r != MAILIMAP_NO_ERROR)
5242 return r; 5260 return r;
5243 5261
5244 * result = flag_list; 5262 * result = flag_list;
5245 * index = cur_token; 5263 * index = cur_token;
5246 5264
5247 return MAILIMAP_NO_ERROR; 5265 return MAILIMAP_NO_ERROR;
5248} 5266}
5249 5267
5250 5268
5251/* 5269/*
5252 "LIST" SP mailbox-list 5270 "LIST" SP mailbox-list
5253*/ 5271*/
5254 5272
5255static int 5273static int
5256mailimap_mailbox_data_list_parse(mailstream * fd, MMAPString * buffer, 5274mailimap_mailbox_data_list_parse(mailstream * fd, MMAPString * buffer,
5257 size_t * index, 5275 size_t * index,
5258 struct mailimap_mailbox_list ** result, 5276 struct mailimap_mailbox_list ** result,
5259 size_t progr_rate, 5277 size_t progr_rate,
5260 progress_function * progr_fun) 5278 progress_function * progr_fun)
5261{ 5279{
5262 size_t cur_token; 5280 size_t cur_token;
5263 struct mailimap_mailbox_list * mb_list; 5281 struct mailimap_mailbox_list * mb_list;
5264 int r; 5282 int r;
5265 int res; 5283 int res;
5266 5284
5267 cur_token = * index; 5285 cur_token = * index;
5268 5286
5269 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, "LIST"); 5287 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, "LIST");
5270 if (r != MAILIMAP_NO_ERROR) { 5288 if (r != MAILIMAP_NO_ERROR) {
5271 res = r; 5289 res = r;
5272 return r; 5290 return r;
5273 } 5291 }
5274 5292
5275 r = mailimap_space_parse(fd, buffer, &cur_token); 5293 r = mailimap_space_parse(fd, buffer, &cur_token);
5276 if (r != MAILIMAP_NO_ERROR) { 5294 if (r != MAILIMAP_NO_ERROR) {
5277 res = r; 5295 res = r;
5278 return r; 5296 return r;
5279 } 5297 }
5280 5298
5281 r = mailimap_mailbox_list_parse(fd, buffer, &cur_token, &mb_list, 5299 r = mailimap_mailbox_list_parse(fd, buffer, &cur_token, &mb_list,
5282 progr_rate, progr_fun); 5300 progr_rate, progr_fun);
5283 if (r != MAILIMAP_NO_ERROR) { 5301 if (r != MAILIMAP_NO_ERROR) {
5284 res = r; 5302 res = r;
5285 return r; 5303 return r;
5286 } 5304 }
5287 5305
5288 * result = mb_list; 5306 * result = mb_list;
5289 * index = cur_token; 5307 * index = cur_token;
5290 5308
5291 return MAILIMAP_NO_ERROR; 5309 return MAILIMAP_NO_ERROR;
5292} 5310}
5293 5311
5294/* 5312/*
5295 "LSUB" SP mailbox-list 5313 "LSUB" SP mailbox-list
5296*/ 5314*/
5297 5315
5298static int 5316static int
5299mailimap_mailbox_data_lsub_parse(mailstream * fd, MMAPString * buffer, 5317mailimap_mailbox_data_lsub_parse(mailstream * fd, MMAPString * buffer,
5300 size_t * index, 5318 size_t * index,
5301 struct mailimap_mailbox_list ** result, 5319 struct mailimap_mailbox_list ** result,
5302 size_t progr_rate, 5320 size_t progr_rate,
5303 progress_function * progr_fun) 5321 progress_function * progr_fun)
5304{ 5322{
5305 size_t cur_token; 5323 size_t cur_token;
5306 struct mailimap_mailbox_list * mb_list; 5324 struct mailimap_mailbox_list * mb_list;
5307 int r; 5325 int r;
5308 5326
5309 cur_token = * index; 5327 cur_token = * index;
5310 5328
5311 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, "LSUB"); 5329 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, "LSUB");
5312 if (r != MAILIMAP_NO_ERROR) 5330 if (r != MAILIMAP_NO_ERROR)
5313 return r; 5331 return r;
5314 5332
5315 r = mailimap_space_parse(fd, buffer, &cur_token); 5333 r = mailimap_space_parse(fd, buffer, &cur_token);
5316 if (r != MAILIMAP_NO_ERROR) 5334 if (r != MAILIMAP_NO_ERROR)
5317 return r; 5335 return r;
5318 5336
5319 r = mailimap_mailbox_list_parse(fd, buffer, &cur_token, &mb_list, 5337 r = mailimap_mailbox_list_parse(fd, buffer, &cur_token, &mb_list,
5320 progr_rate, progr_fun); 5338 progr_rate, progr_fun);
5321 if (r != MAILIMAP_NO_ERROR) 5339 if (r != MAILIMAP_NO_ERROR)
5322 return r; 5340 return r;
5323 5341
5324 * result = mb_list; 5342 * result = mb_list;
5325 * index = cur_token; 5343 * index = cur_token;
5326 5344
5327 return MAILIMAP_NO_ERROR; 5345 return MAILIMAP_NO_ERROR;
5328} 5346}
5329 5347
5330/* 5348/*
5331 "SEARCH" *(SP nz-number) 5349 "SEARCH" *(SP nz-number)
5332*/ 5350*/
5333 5351
5334 5352
5335static int 5353static int
5336mailimap_mailbox_data_search_parse(mailstream * fd, MMAPString * buffer, 5354mailimap_mailbox_data_search_parse(mailstream * fd, MMAPString * buffer,
5337 size_t * index, 5355 size_t * index,
5338 clist ** result, 5356 clist ** result,
5339 size_t progr_rate, 5357 size_t progr_rate,
5340 progress_function * progr_fun) 5358 progress_function * progr_fun)
5341{ 5359{
5342 size_t cur_token; 5360 size_t cur_token;
5343 size_t final_token; 5361 size_t final_token;
5344 clist * number_list; 5362 clist * number_list;
5345 int r; 5363 int r;
5346 5364
5347 cur_token = * index; 5365 cur_token = * index;
5348 5366
5349 r = mailimap_token_case_insensitive_parse(fd, buffer, 5367 r = mailimap_token_case_insensitive_parse(fd, buffer,
5350 &cur_token, "SEARCH"); 5368 &cur_token, "SEARCH");
5351 if (r != MAILIMAP_NO_ERROR) 5369 if (r != MAILIMAP_NO_ERROR)
5352 return r; 5370 return r;
5353 5371
5354 final_token = cur_token; 5372 final_token = cur_token;
5355 number_list = NULL; 5373 number_list = NULL;
5356 5374
5357 r = mailimap_space_parse(fd, buffer, &cur_token); 5375 r = mailimap_space_parse(fd, buffer, &cur_token);
5358 if (r == MAILIMAP_NO_ERROR) { 5376 if (r == MAILIMAP_NO_ERROR) {
5359 r = mailimap_struct_spaced_list_parse(fd, buffer, &cur_token, &number_list, 5377 r = mailimap_struct_spaced_list_parse(fd, buffer, &cur_token, &number_list,
5360 (mailimap_struct_parser *) 5378 (mailimap_struct_parser *)
5361 mailimap_nz_number_alloc_parse, 5379 mailimap_nz_number_alloc_parse,
5362 (mailimap_struct_destructor *) 5380 (mailimap_struct_destructor *)
5363 mailimap_number_alloc_free, 5381 mailimap_number_alloc_free,
5364 progr_rate, progr_fun); 5382 progr_rate, progr_fun);
5365 if (r == MAILIMAP_NO_ERROR) 5383 if (r == MAILIMAP_NO_ERROR)
5366 final_token = cur_token; 5384 final_token = cur_token;
5367 } 5385 }
5368 5386
5369 * result = number_list; 5387 * result = number_list;
5370 * index = final_token; 5388 * index = final_token;
5371 5389
5372 return MAILIMAP_NO_ERROR; 5390 return MAILIMAP_NO_ERROR;
5373} 5391}
5374 5392
5375/* 5393/*
5376 "STATUS" SP mailbox SP "(" 5394 "STATUS" SP mailbox SP "("
5377 [status-att SP number *(SP status-att SP number)] ")" 5395 [status-att SP number *(SP status-att SP number)] ")"
5378*/ 5396*/
5379 5397
5380/* 5398/*
5381 status-att SP number 5399 status-att SP number
5382*/ 5400*/
5383 5401
5384static int 5402static int
5385mailimap_status_info_parse(mailstream * fd, MMAPString * buffer, 5403mailimap_status_info_parse(mailstream * fd, MMAPString * buffer,
5386 size_t * index, 5404 size_t * index,
5387 struct mailimap_status_info ** 5405 struct mailimap_status_info **
5388 result, 5406 result,
5389 size_t progr_rate, 5407 size_t progr_rate,
5390 progress_function * progr_fun) 5408 progress_function * progr_fun)
5391{ 5409{
5392 size_t cur_token; 5410 size_t cur_token;
5393 int status_att; 5411 int status_att;
5394 uint32_t value; 5412 uint32_t value;
5395 struct mailimap_status_info * info; 5413 struct mailimap_status_info * info;
5396 int r; 5414 int r;
5397 5415
5398 cur_token = * index; 5416 cur_token = * index;
5399 value = 0; 5417 value = 0;
5400 5418
5401 r = mailimap_status_att_parse(fd, buffer, &cur_token, &status_att); 5419 r = mailimap_status_att_parse(fd, buffer, &cur_token, &status_att);
5402 if (r != MAILIMAP_NO_ERROR) 5420 if (r != MAILIMAP_NO_ERROR)
5403 return r; 5421 return r;
5404 5422
5405 r = mailimap_space_parse(fd, buffer, &cur_token); 5423 r = mailimap_space_parse(fd, buffer, &cur_token);
5406 if (r != MAILIMAP_NO_ERROR) 5424 if (r != MAILIMAP_NO_ERROR)
5407 return r; 5425 return r;
5408 5426
5409 r = mailimap_number_parse(fd, buffer, &cur_token, &value); 5427 r = mailimap_number_parse(fd, buffer, &cur_token, &value);
5410 if (r != MAILIMAP_NO_ERROR) 5428 if (r != MAILIMAP_NO_ERROR)
5411 return r; 5429 return r;
5412 5430
5413 info = mailimap_status_info_new(status_att, value); 5431 info = mailimap_status_info_new(status_att, value);
5414 if (info == NULL) 5432 if (info == NULL)
5415 return MAILIMAP_ERROR_MEMORY; 5433 return MAILIMAP_ERROR_MEMORY;
5416 5434
5417 * result = info; 5435 * result = info;
5418 * index = cur_token; 5436 * index = cur_token;
5419 5437
5420 return MAILIMAP_NO_ERROR; 5438 return MAILIMAP_NO_ERROR;
5421} 5439}
5422 5440
5423/* 5441/*
5424 "STATUS" SP mailbox SP "(" 5442 "STATUS" SP mailbox SP "("
5425 [status-att SP number *(SP status-att SP number)] ")" 5443 [status-att SP number *(SP status-att SP number)] ")"
5426*/ 5444*/
5427 5445
5428static int 5446static int
5429mailimap_mailbox_data_status_parse(mailstream * fd, MMAPString * buffer, 5447mailimap_mailbox_data_status_parse(mailstream * fd, MMAPString * buffer,
5430 size_t * index, struct 5448 size_t * index, struct
5431 mailimap_mailbox_data_status ** result, 5449 mailimap_mailbox_data_status ** result,
5432 size_t progr_rate, 5450 size_t progr_rate,
5433 progress_function * progr_fun) 5451 progress_function * progr_fun)
5434{ 5452{
5435 size_t cur_token; 5453 size_t cur_token;
5436 char * mb; 5454 char * mb;
5437 clist * status_info_list; 5455 clist * status_info_list;
5438 struct mailimap_mailbox_data_status * data_status; 5456 struct mailimap_mailbox_data_status * data_status;
5439 int r; 5457 int r;
5440 int res; 5458 int res;
5441 5459
5442 cur_token = * index; 5460 cur_token = * index;
5443 mb = NULL; 5461 mb = NULL;
5444 status_info_list = NULL; 5462 status_info_list = NULL;
5445 5463
5446 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, "STATUS"); 5464 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, "STATUS");
5447 if (r != MAILIMAP_NO_ERROR) { 5465 if (r != MAILIMAP_NO_ERROR) {
5448 res = r; 5466 res = r;
5449 goto err; 5467 goto err;
5450 } 5468 }
5451 5469
5452 r = mailimap_space_parse(fd, buffer, &cur_token); 5470 r = mailimap_space_parse(fd, buffer, &cur_token);
5453 if (r != MAILIMAP_NO_ERROR) { 5471 if (r != MAILIMAP_NO_ERROR) {
5454 res = r; 5472 res = r;
5455 goto err; 5473 goto err;
5456 } 5474 }
5457 5475
5458 r = mailimap_mailbox_parse(fd, buffer, &cur_token, &mb, 5476 r = mailimap_mailbox_parse(fd, buffer, &cur_token, &mb,
5459 progr_rate, progr_fun); 5477 progr_rate, progr_fun);
5460 if (r != MAILIMAP_NO_ERROR) { 5478 if (r != MAILIMAP_NO_ERROR) {
5461 res = r; 5479 res = r;
5462 goto err; 5480 goto err;
5463 } 5481 }
5464 5482
5465 r = mailimap_space_parse(fd, buffer, &cur_token); 5483 r = mailimap_space_parse(fd, buffer, &cur_token);
5466 if (r != MAILIMAP_NO_ERROR) { 5484 if (r != MAILIMAP_NO_ERROR) {
5467 res = r; 5485 res = r;
5468 goto mailbox; 5486 goto mailbox;
5469 } 5487 }
5470 5488
5471 r = mailimap_oparenth_parse(fd, buffer, &cur_token); 5489 r = mailimap_oparenth_parse(fd, buffer, &cur_token);
5472 if (r != MAILIMAP_NO_ERROR) { 5490 if (r != MAILIMAP_NO_ERROR) {
5473 res = r; 5491 res = r;
5474 goto mailbox; 5492 goto mailbox;
5475 } 5493 }
5476 5494
5477 r = mailimap_struct_spaced_list_parse(fd, buffer, &cur_token, 5495 r = mailimap_struct_spaced_list_parse(fd, buffer, &cur_token,
5478 &status_info_list, 5496 &status_info_list,
5479 (mailimap_struct_parser *) 5497 (mailimap_struct_parser *)
5480 mailimap_status_info_parse, 5498 mailimap_status_info_parse,
5481 (mailimap_struct_destructor *) 5499 (mailimap_struct_destructor *)
5482 mailimap_status_info_free, 5500 mailimap_status_info_free,
5483 progr_rate, progr_fun); 5501 progr_rate, progr_fun);
5484 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) { 5502 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) {
5485 res = r; 5503 res = r;
5486 goto mailbox; 5504 goto mailbox;
5487 } 5505 }
5488 5506
5489 r = mailimap_cparenth_parse(fd, buffer, &cur_token); 5507 r = mailimap_cparenth_parse(fd, buffer, &cur_token);
5490 if (r != MAILIMAP_NO_ERROR) { 5508 if (r != MAILIMAP_NO_ERROR) {
5491 res = r; 5509 res = r;
5492 goto status_info_list; 5510 goto status_info_list;
5493 } 5511 }
5494 5512
5495 data_status = mailimap_mailbox_data_status_new(mb, status_info_list); 5513 data_status = mailimap_mailbox_data_status_new(mb, status_info_list);
5496 if (data_status == NULL) { 5514 if (data_status == NULL) {
5497 res = MAILIMAP_ERROR_MEMORY; 5515 res = MAILIMAP_ERROR_MEMORY;
5498 goto status_info_list; 5516 goto status_info_list;
5499 } 5517 }
5500 5518
5501 * result = data_status; 5519 * result = data_status;
5502 * index = cur_token; 5520 * index = cur_token;
5503 5521
5504 return MAILIMAP_NO_ERROR; 5522 return MAILIMAP_NO_ERROR;
5505 5523
5506 status_info_list: 5524 status_info_list:
5507 if (status_info_list != NULL) { 5525 if (status_info_list != NULL) {
5508 clist_foreach(status_info_list, (clist_func) mailimap_status_info_free, 5526 clist_foreach(status_info_list, (clist_func) mailimap_status_info_free,
5509 NULL); 5527 NULL);
5510 clist_free(status_info_list); 5528 clist_free(status_info_list);
5511 } 5529 }
5512 mailbox: 5530 mailbox:
5513 mailimap_mailbox_free(mb); 5531 mailimap_mailbox_free(mb);
5514 err: 5532 err:
5515 return res; 5533 return res;
5516} 5534}
5517 5535
5518/* 5536/*
5519 number SP "EXISTS" 5537 number SP "EXISTS"
5520*/ 5538*/
5521 5539
5522static int 5540static int
5523mailimap_mailbox_data_exists_parse(mailstream * fd, MMAPString * buffer, 5541mailimap_mailbox_data_exists_parse(mailstream * fd, MMAPString * buffer,
5524 size_t * index, 5542 size_t * index,
5525 uint32_t * result) 5543 uint32_t * result)
5526{ 5544{
5527 size_t cur_token; 5545 size_t cur_token;
5528 uint32_t number; 5546 uint32_t number;
5529 int r; 5547 int r;
5530 5548
5531 cur_token = * index; 5549 cur_token = * index;
5532 5550
5533 r = mailimap_number_parse(fd, buffer, &cur_token, &number); 5551 r = mailimap_number_parse(fd, buffer, &cur_token, &number);
5534 if (r != MAILIMAP_NO_ERROR) 5552 if (r != MAILIMAP_NO_ERROR)
5535 return r; 5553 return r;
5536 5554
5537 r = mailimap_space_parse(fd, buffer, &cur_token); 5555 r = mailimap_space_parse(fd, buffer, &cur_token);
5538 if (r != MAILIMAP_NO_ERROR) 5556 if (r != MAILIMAP_NO_ERROR)
5539 return r; 5557 return r;
5540 5558
5541 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, "EXISTS"); 5559 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, "EXISTS");
5542 if (r != MAILIMAP_NO_ERROR) 5560 if (r != MAILIMAP_NO_ERROR)
5543 return r; 5561 return r;
5544 5562
5545 * result = number; 5563 * result = number;
5546 * index = cur_token; 5564 * index = cur_token;
5547 5565
5548 return MAILIMAP_NO_ERROR; 5566 return MAILIMAP_NO_ERROR;
5549} 5567}
5550 5568
5551/* 5569/*
5552 number SP "RECENT" 5570 number SP "RECENT"
5553*/ 5571*/
5554 5572
5555static int 5573static int
5556mailimap_mailbox_data_recent_parse(mailstream * fd, MMAPString * buffer, 5574mailimap_mailbox_data_recent_parse(mailstream * fd, MMAPString * buffer,
5557 size_t * index, 5575 size_t * index,
5558 uint32_t * result) 5576 uint32_t * result)
5559{ 5577{
5560 size_t cur_token; 5578 size_t cur_token;
5561 uint32_t number; 5579 uint32_t number;
5562 int r; 5580 int r;
5563 5581
5564 cur_token = * index; 5582 cur_token = * index;
5565 5583
5566 r = mailimap_number_parse(fd, buffer, &cur_token, &number); 5584 r = mailimap_number_parse(fd, buffer, &cur_token, &number);
5567 if (r != MAILIMAP_NO_ERROR) 5585 if (r != MAILIMAP_NO_ERROR)
5568 return r; 5586 return r;
5569 5587
5570 r = mailimap_space_parse(fd, buffer, &cur_token); 5588 r = mailimap_space_parse(fd, buffer, &cur_token);
5571 if (r != MAILIMAP_NO_ERROR) 5589 if (r != MAILIMAP_NO_ERROR)
5572 return r; 5590 return r;
5573 5591
5574 r = mailimap_token_case_insensitive_parse(fd, buffer, 5592 r = mailimap_token_case_insensitive_parse(fd, buffer,
5575 &cur_token, "RECENT"); 5593 &cur_token, "RECENT");
5576 if (r != MAILIMAP_NO_ERROR) 5594 if (r != MAILIMAP_NO_ERROR)
5577 return r; 5595 return r;
5578 5596
5579 * result = number; 5597 * result = number;
5580 * index = cur_token; 5598 * index = cur_token;
5581 5599
5582 return MAILIMAP_NO_ERROR; 5600 return MAILIMAP_NO_ERROR;
5583} 5601}
5584 5602
5585/* 5603/*
5586 mailbox-data = "FLAGS" SP flag-list / "LIST" SP mailbox-list / 5604 mailbox-data = "FLAGS" SP flag-list / "LIST" SP mailbox-list /
5587 "LSUB" SP mailbox-list / "SEARCH" *(SP nz-number) / 5605 "LSUB" SP mailbox-list / "SEARCH" *(SP nz-number) /
5588 "STATUS" SP mailbox SP "(" 5606 "STATUS" SP mailbox SP "("
5589 [status-att SP number *(SP status-att SP number)] ")" / 5607 [status-att SP number *(SP status-att SP number)] ")" /
5590 number SP "EXISTS" / number SP "RECENT" 5608 number SP "EXISTS" / number SP "RECENT"
5591*/ 5609*/
5592 5610
5593static int 5611static int
5594mailimap_mailbox_data_parse(mailstream * fd, MMAPString * buffer, 5612mailimap_mailbox_data_parse(mailstream * fd, MMAPString * buffer,
5595 size_t * index, 5613 size_t * index,
5596 struct mailimap_mailbox_data ** result, 5614 struct mailimap_mailbox_data ** result,
5597 size_t progr_rate, 5615 size_t progr_rate,
5598 progress_function * progr_fun) 5616 progress_function * progr_fun)
5599{ 5617{
5600 int type; 5618 int type;
5601 struct mailimap_flag_list * data_flags; 5619 struct mailimap_flag_list * data_flags;
5602 struct mailimap_mailbox_list * data_list; 5620 struct mailimap_mailbox_list * data_list;
5603 struct mailimap_mailbox_list * data_lsub; 5621 struct mailimap_mailbox_list * data_lsub;
5604 clist * data_search; 5622 clist * data_search;
5605 struct mailimap_mailbox_data_status * data_status; 5623 struct mailimap_mailbox_data_status * data_status;
5606 uint32_t data_exists; 5624 uint32_t data_exists;
5607 uint32_t data_recent; 5625 uint32_t data_recent;
5608 5626
5609 struct mailimap_mailbox_data * mailbox_data; 5627 struct mailimap_mailbox_data * mailbox_data;
5610 size_t cur_token; 5628 size_t cur_token;
5611 int r; 5629 int r;
5612 int res; 5630 int res;
5613 5631
5614 cur_token = * index; 5632 cur_token = * index;
5615 5633
5616 data_flags = NULL; 5634 data_flags = NULL;
5617 data_list = NULL; 5635 data_list = NULL;
5618 data_lsub = NULL; 5636 data_lsub = NULL;
5619 data_search = NULL; 5637 data_search = NULL;
5620 data_status = NULL; 5638 data_status = NULL;
5621 data_exists = 0; 5639 data_exists = 0;
5622 data_recent = 0; 5640 data_recent = 0;
5623 5641
5624 type = MAILIMAP_MAILBOX_DATA_ERROR; /* XXX - removes a gcc warning */ 5642 type = MAILIMAP_MAILBOX_DATA_ERROR; /* XXX - removes a gcc warning */
5625 5643
5626 r = mailimap_mailbox_data_flags_parse(fd, buffer, &cur_token, 5644 r = mailimap_mailbox_data_flags_parse(fd, buffer, &cur_token,
5627 &data_flags, 5645 &data_flags,
5628 progr_rate, progr_fun); 5646 progr_rate, progr_fun);
5629 if (r == MAILIMAP_NO_ERROR) 5647 if (r == MAILIMAP_NO_ERROR)
5630 type = MAILIMAP_MAILBOX_DATA_FLAGS; 5648 type = MAILIMAP_MAILBOX_DATA_FLAGS;
5631 5649
5632 if (r == MAILIMAP_ERROR_PARSE) { 5650 if (r == MAILIMAP_ERROR_PARSE) {
5633 r = mailimap_mailbox_data_list_parse(fd, buffer, &cur_token, 5651 r = mailimap_mailbox_data_list_parse(fd, buffer, &cur_token,
5634 &data_list, 5652 &data_list,
5635 progr_rate, progr_fun); 5653 progr_rate, progr_fun);
5636 if (r == MAILIMAP_NO_ERROR) 5654 if (r == MAILIMAP_NO_ERROR)
5637 type = MAILIMAP_MAILBOX_DATA_LIST; 5655 type = MAILIMAP_MAILBOX_DATA_LIST;
5638 } 5656 }
5639 5657
5640 if (r == MAILIMAP_ERROR_PARSE) { 5658 if (r == MAILIMAP_ERROR_PARSE) {
5641 r = mailimap_mailbox_data_lsub_parse(fd, buffer, &cur_token, 5659 r = mailimap_mailbox_data_lsub_parse(fd, buffer, &cur_token,
5642 &data_lsub, 5660 &data_lsub,
5643 progr_rate, progr_fun); 5661 progr_rate, progr_fun);
5644 if (r == MAILIMAP_NO_ERROR) 5662 if (r == MAILIMAP_NO_ERROR)
5645 type = MAILIMAP_MAILBOX_DATA_LSUB; 5663 type = MAILIMAP_MAILBOX_DATA_LSUB;
5646 } 5664 }
5647 5665
5648 if (r == MAILIMAP_ERROR_PARSE) { 5666 if (r == MAILIMAP_ERROR_PARSE) {
5649 r = mailimap_mailbox_data_search_parse(fd, buffer, &cur_token, 5667 r = mailimap_mailbox_data_search_parse(fd, buffer, &cur_token,
5650 &data_search, 5668 &data_search,
5651 progr_rate, progr_fun); 5669 progr_rate, progr_fun);
5652 if (r == MAILIMAP_NO_ERROR) 5670 if (r == MAILIMAP_NO_ERROR)
5653 type = MAILIMAP_MAILBOX_DATA_SEARCH; 5671 type = MAILIMAP_MAILBOX_DATA_SEARCH;
5654 } 5672 }
5655 5673
5656 if (r == MAILIMAP_ERROR_PARSE) { 5674 if (r == MAILIMAP_ERROR_PARSE) {
5657 r = mailimap_mailbox_data_status_parse(fd, buffer, &cur_token, 5675 r = mailimap_mailbox_data_status_parse(fd, buffer, &cur_token,
5658 &data_status, 5676 &data_status,
5659 progr_rate, progr_fun); 5677 progr_rate, progr_fun);
5660 if (r == MAILIMAP_NO_ERROR) 5678 if (r == MAILIMAP_NO_ERROR)
5661 type = MAILIMAP_MAILBOX_DATA_STATUS; 5679 type = MAILIMAP_MAILBOX_DATA_STATUS;
5662 } 5680 }
5663 5681
5664 if (r == MAILIMAP_ERROR_PARSE) { 5682 if (r == MAILIMAP_ERROR_PARSE) {
5665 r = mailimap_mailbox_data_exists_parse(fd, buffer, &cur_token, 5683 r = mailimap_mailbox_data_exists_parse(fd, buffer, &cur_token,
5666 &data_exists); 5684 &data_exists);
5667 if (r == MAILIMAP_NO_ERROR) 5685 if (r == MAILIMAP_NO_ERROR)
5668 type = MAILIMAP_MAILBOX_DATA_EXISTS; 5686 type = MAILIMAP_MAILBOX_DATA_EXISTS;
5669 } 5687 }
5670 5688
5671 if (r == MAILIMAP_ERROR_PARSE) { 5689 if (r == MAILIMAP_ERROR_PARSE) {
5672 r = mailimap_mailbox_data_recent_parse(fd, buffer, &cur_token, 5690 r = mailimap_mailbox_data_recent_parse(fd, buffer, &cur_token,
5673 &data_recent); 5691 &data_recent);
5674 if (r == MAILIMAP_NO_ERROR) 5692 if (r == MAILIMAP_NO_ERROR)
5675 type = MAILIMAP_MAILBOX_DATA_RECENT; 5693 type = MAILIMAP_MAILBOX_DATA_RECENT;
5676 } 5694 }
5677 5695
5678 if (r != MAILIMAP_NO_ERROR) { 5696 if (r != MAILIMAP_NO_ERROR) {
5679 res = r; 5697 res = r;
5680 goto err; 5698 goto err;
5681 } 5699 }
5682 5700
5683 mailbox_data = mailimap_mailbox_data_new(type, data_flags, data_list, 5701 mailbox_data = mailimap_mailbox_data_new(type, data_flags, data_list,
5684 data_lsub, data_search, 5702 data_lsub, data_search,
5685 data_status, 5703 data_status,
5686 data_exists, data_recent); 5704 data_exists, data_recent);
5687 5705
5688 if (mailbox_data == NULL) { 5706 if (mailbox_data == NULL) {
5689 res = MAILIMAP_ERROR_MEMORY; 5707 res = MAILIMAP_ERROR_MEMORY;
5690 goto free; 5708 goto free;
5691 } 5709 }
5692 5710
5693 * result = mailbox_data; 5711 * result = mailbox_data;
5694 * index = cur_token; 5712 * index = cur_token;
5695 5713
5696 return MAILIMAP_NO_ERROR; 5714 return MAILIMAP_NO_ERROR;
5697 5715
5698 free: 5716 free:
5699 if (data_flags != NULL) 5717 if (data_flags != NULL)
5700 mailimap_flag_list_free(data_flags); 5718 mailimap_flag_list_free(data_flags);
5701 if (data_list != NULL) 5719 if (data_list != NULL)
5702 mailimap_mailbox_list_free(data_list); 5720 mailimap_mailbox_list_free(data_list);
5703 if (data_lsub != NULL) 5721 if (data_lsub != NULL)
5704 mailimap_mailbox_list_free(data_lsub); 5722 mailimap_mailbox_list_free(data_lsub);
5705 if (data_search != NULL) 5723 if (data_search != NULL)
5706 mailimap_mailbox_data_search_free(data_search); 5724 mailimap_mailbox_data_search_free(data_search);
5707 if (data_status != NULL) 5725 if (data_status != NULL)
5708 mailimap_mailbox_data_status_free(data_status); 5726 mailimap_mailbox_data_status_free(data_status);
5709 err: 5727 err:
5710 return res; 5728 return res;
5711} 5729}
5712 5730
5713/* 5731/*
5714 mailbox-list = "(" [mbx-list-flags] ")" SP 5732 mailbox-list = "(" [mbx-list-flags] ")" SP
5715 (DQUOTE QUOTED-CHAR DQUOTE / nil) SP mailbox 5733 (DQUOTE QUOTED-CHAR DQUOTE / nil) SP mailbox
5716*/ 5734*/
5717 5735
5718/* 5736/*
5719 DQUOTE QUOTED-CHAR DQUOTE 5737 DQUOTE QUOTED-CHAR DQUOTE
5720*/ 5738*/
5721 5739
5722static int 5740static int
5723mailimap_mailbox_list_quoted_char_parse(mailstream * fd, MMAPString * buffer, 5741mailimap_mailbox_list_quoted_char_parse(mailstream * fd, MMAPString * buffer,
5724 size_t * index, 5742 size_t * index,
5725 char * result) 5743 char * result)
5726{ 5744{
5727 size_t cur_token; 5745 size_t cur_token;
5728 char ch; 5746 char ch;
5729 int r; 5747 int r;
5730 5748
5731 cur_token = * index; 5749 cur_token = * index;
5732 5750
5733 r = mailimap_dquote_parse(fd, buffer, &cur_token); 5751 r = mailimap_dquote_parse(fd, buffer, &cur_token);
5734 if (r != MAILIMAP_NO_ERROR) 5752 if (r != MAILIMAP_NO_ERROR)
5735 return r; 5753 return r;
5736 5754
5737 r = mailimap_quoted_char_parse(fd, buffer, &cur_token, &ch); 5755 r = mailimap_quoted_char_parse(fd, buffer, &cur_token, &ch);
5738 if (r != MAILIMAP_NO_ERROR) 5756 if (r != MAILIMAP_NO_ERROR)
5739 return r; 5757 return r;
5740 5758
5741 r = mailimap_dquote_parse(fd, buffer, &cur_token); 5759 r = mailimap_dquote_parse(fd, buffer, &cur_token);
5742 if (r != MAILIMAP_NO_ERROR) 5760 if (r != MAILIMAP_NO_ERROR)
5743 return r; 5761 return r;
5744 5762
5745 * index = cur_token; 5763 * index = cur_token;
5746 * result = ch; 5764 * result = ch;
5747 5765
5748 return MAILIMAP_NO_ERROR; 5766 return MAILIMAP_NO_ERROR;
5749} 5767}
5750 5768
5751static int 5769static int
5752mailimap_mailbox_list_parse(mailstream * fd, MMAPString * buffer, 5770mailimap_mailbox_list_parse(mailstream * fd, MMAPString * buffer,
5753 size_t * index, 5771 size_t * index,
5754 struct mailimap_mailbox_list ** result, 5772 struct mailimap_mailbox_list ** result,
5755 size_t progr_rate, 5773 size_t progr_rate,
5756 progress_function * progr_fun) 5774 progress_function * progr_fun)
5757{ 5775{
5758 struct mailimap_mailbox_list * mb_list; 5776 struct mailimap_mailbox_list * mb_list;
5759 struct mailimap_mbx_list_flags * mb_flag_list; 5777 struct mailimap_mbx_list_flags * mb_flag_list;
5760 char ch; 5778 char ch;
5761 char * mb; 5779 char * mb;
5762 size_t cur_token; 5780 size_t cur_token;
5763 int r; 5781 int r;
5764 int res; 5782 int res;
5765 5783
5766 cur_token = * index; 5784 cur_token = * index;
5767 5785
5768 r = mailimap_oparenth_parse(fd, buffer, &cur_token); 5786 r = mailimap_oparenth_parse(fd, buffer, &cur_token);
5769 if (r != MAILIMAP_NO_ERROR) { 5787 if (r != MAILIMAP_NO_ERROR) {
5770 res = r; 5788 res = r;
5771 goto err; 5789 goto err;
5772 } 5790 }
5773 5791
5774 mb_flag_list = NULL; 5792 mb_flag_list = NULL;
5775 ch = 0; 5793 ch = 0;
5776 mb = NULL; 5794 mb = NULL;
5777 5795
5778 r = mailimap_mbx_list_flags_parse(fd, buffer, &cur_token, 5796 r = mailimap_mbx_list_flags_parse(fd, buffer, &cur_token,
5779 &mb_flag_list, progr_rate, progr_fun); 5797 &mb_flag_list, progr_rate, progr_fun);
5780 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) { 5798 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) {
5781 res = r; 5799 res = r;
5782 goto err; 5800 goto err;
5783 } 5801 }
5784 5802
5785 r = mailimap_cparenth_parse(fd, buffer, &cur_token); 5803 r = mailimap_cparenth_parse(fd, buffer, &cur_token);
5786 if (r != MAILIMAP_NO_ERROR) { 5804 if (r != MAILIMAP_NO_ERROR) {
5787 res = r; 5805 res = r;
5788 goto free_list_flags; 5806 goto free_list_flags;
5789 } 5807 }
5790 5808
5791 r = mailimap_space_parse(fd, buffer, &cur_token); 5809 r = mailimap_space_parse(fd, buffer, &cur_token);
5792 if (r != MAILIMAP_NO_ERROR) { 5810 if (r != MAILIMAP_NO_ERROR) {
5793 res = r; 5811 res = r;
5794 goto free_list_flags; 5812 goto free_list_flags;
5795 } 5813 }
5796 5814
5797 r = mailimap_mailbox_list_quoted_char_parse(fd, buffer, &cur_token, &ch); 5815 r = mailimap_mailbox_list_quoted_char_parse(fd, buffer, &cur_token, &ch);
5798 if (r == MAILIMAP_ERROR_PARSE) 5816 if (r == MAILIMAP_ERROR_PARSE)
5799 r = mailimap_nil_parse(fd, buffer, &cur_token); 5817 r = mailimap_nil_parse(fd, buffer, &cur_token);
5800 5818
5801 if (r != MAILIMAP_NO_ERROR) { 5819 if (r != MAILIMAP_NO_ERROR) {
5802 res = r; 5820 res = r;
5803 goto free_list_flags; 5821 goto free_list_flags;
5804 } 5822 }
5805 5823
5806 r = mailimap_space_parse(fd, buffer, &cur_token); 5824 r = mailimap_space_parse(fd, buffer, &cur_token);
5807 if (r != MAILIMAP_NO_ERROR) { 5825 if (r != MAILIMAP_NO_ERROR) {
5808 res = r; 5826 res = r;
5809 goto free_list_flags; 5827 goto free_list_flags;
5810 } 5828 }
5811 5829
5812 r = mailimap_mailbox_parse(fd, buffer, &cur_token, &mb, 5830 r = mailimap_mailbox_parse(fd, buffer, &cur_token, &mb,
5813 progr_rate, progr_fun); 5831 progr_rate, progr_fun);
5814 if (r != MAILIMAP_NO_ERROR) { 5832 if (r != MAILIMAP_NO_ERROR) {
5815 res = r; 5833 res = r;
5816 goto free_list_flags; 5834 goto free_list_flags;
5817 } 5835 }
5818 5836
5819 mb_list = mailimap_mailbox_list_new(mb_flag_list, ch, mb); 5837 mb_list = mailimap_mailbox_list_new(mb_flag_list, ch, mb);
5820 if (mb_list == NULL) { 5838 if (mb_list == NULL) {
5821 res = MAILIMAP_ERROR_MEMORY; 5839 res = MAILIMAP_ERROR_MEMORY;
5822 goto free_mailbox; 5840 goto free_mailbox;
5823 } 5841 }
5824 5842
5825 * result = mb_list; 5843 * result = mb_list;
5826 * index = cur_token; 5844 * index = cur_token;
5827 5845
5828 return MAILIMAP_NO_ERROR; 5846 return MAILIMAP_NO_ERROR;
5829 5847
5830 free_mailbox: 5848 free_mailbox:
5831 mailimap_mailbox_free(mb); 5849 mailimap_mailbox_free(mb);
5832 free_list_flags: 5850 free_list_flags:
5833 if (mb_flag_list != NULL) 5851 if (mb_flag_list != NULL)
5834 mailimap_mbx_list_flags_free(mb_flag_list); 5852 mailimap_mbx_list_flags_free(mb_flag_list);
5835 err: 5853 err:
5836 return res; 5854 return res;
5837} 5855}
5838 5856
5839/* 5857/*
5840 mbx-list-flags = *(mbx-list-oflag SP) mbx-list-sflag 5858 mbx-list-flags = *(mbx-list-oflag SP) mbx-list-sflag
5841 *(SP mbx-list-oflag) / 5859 *(SP mbx-list-oflag) /
5842 mbx-list-oflag *(SP mbx-list-oflag) 5860 mbx-list-oflag *(SP mbx-list-oflag)
5843*/ 5861*/
5844 5862
5845static int 5863static int
5846mailimap_mbx_list_flags_parse(mailstream * fd, MMAPString * buffer, 5864mailimap_mbx_list_flags_parse(mailstream * fd, MMAPString * buffer,
5847 size_t * index, 5865 size_t * index,
5848 struct mailimap_mbx_list_flags ** result, 5866 struct mailimap_mbx_list_flags ** result,
5849 size_t progr_rate, 5867 size_t progr_rate,
5850 progress_function * progr_fun) 5868 progress_function * progr_fun)
5851{ 5869{
5852 struct mailimap_mbx_list_flags * mbx_list_flag; 5870 struct mailimap_mbx_list_flags * mbx_list_flag;
5853 size_t cur_token; 5871 size_t cur_token;
5854 clist * oflags; 5872 clist * oflags;
5855 clist * oflags_2; 5873 clist * oflags_2;
5856 int sflag; 5874 int sflag;
5857 int type; 5875 int type;
5858 int r; 5876 int r;
5859 int res; 5877 int res;
5860 size_t final_token; 5878 size_t final_token;
5861 int try_sflag; 5879 int try_sflag;
5862 5880
5863 cur_token = * index; 5881 cur_token = * index;
5864 final_token = cur_token; 5882 final_token = cur_token;
5865 5883
5866 oflags = clist_new(); 5884 oflags = clist_new();
5867 if (oflags == NULL) { 5885 if (oflags == NULL) {
5868 res = MAILIMAP_ERROR_MEMORY; 5886 res = MAILIMAP_ERROR_MEMORY;
5869 goto err; 5887 goto err;
5870 } 5888 }
5871 5889
5872 sflag = MAILIMAP_MBX_LIST_SFLAG_ERROR; 5890 sflag = MAILIMAP_MBX_LIST_SFLAG_ERROR;
5873 oflags_2 = NULL; 5891 oflags_2 = NULL;
5874 5892
5875 r = mailimap_struct_spaced_list_parse(fd, buffer, &cur_token, 5893 r = mailimap_struct_spaced_list_parse(fd, buffer, &cur_token,
5876 &oflags_2, 5894 &oflags_2,
5877 (mailimap_struct_parser *) 5895 (mailimap_struct_parser *)
5878 mailimap_mbx_list_oflag_no_sflag_parse, 5896 mailimap_mbx_list_oflag_no_sflag_parse,
5879 (mailimap_struct_destructor *) 5897 (mailimap_struct_destructor *)
5880 mailimap_mbx_list_oflag_free, 5898 mailimap_mbx_list_oflag_free,
5881 progr_rate, progr_fun); 5899 progr_rate, progr_fun);
5882 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) { 5900 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) {
5883 res = r; 5901 res = r;
5884 goto free; 5902 goto free;
5885 } 5903 }
5886 5904
5887 try_sflag = 1; 5905 try_sflag = 1;
5888 if (r == MAILIMAP_NO_ERROR) { 5906 if (r == MAILIMAP_NO_ERROR) {
5889 clist_concat(oflags, oflags_2); 5907 clist_concat(oflags, oflags_2);
5890 clist_free(oflags_2); 5908 clist_free(oflags_2);
5891 5909
5892 final_token = cur_token; 5910 final_token = cur_token;
5893 try_sflag = 0; 5911 try_sflag = 0;
5894 r = mailimap_space_parse(fd, buffer, &cur_token); 5912 r = mailimap_space_parse(fd, buffer, &cur_token);
5895 if (r == MAILIMAP_NO_ERROR) 5913 if (r == MAILIMAP_NO_ERROR)
5896 try_sflag = 1; 5914 try_sflag = 1;
5897 } 5915 }
5898 5916
5899 type = MAILIMAP_MBX_LIST_FLAGS_NO_SFLAG; 5917 type = MAILIMAP_MBX_LIST_FLAGS_NO_SFLAG;
5900 if (try_sflag) { 5918 if (try_sflag) {
5901 r = mailimap_mbx_list_sflag_parse(fd, buffer, &cur_token, &sflag); 5919 r = mailimap_mbx_list_sflag_parse(fd, buffer, &cur_token, &sflag);
5902 switch (r) { 5920 switch (r) {
5903 case MAILIMAP_ERROR_PARSE: 5921 case MAILIMAP_ERROR_PARSE:
5904 type = MAILIMAP_MBX_LIST_FLAGS_NO_SFLAG; 5922 type = MAILIMAP_MBX_LIST_FLAGS_NO_SFLAG;
5905 break; 5923 break;
5906 5924
5907 case MAILIMAP_NO_ERROR: 5925 case MAILIMAP_NO_ERROR:
5908 type = MAILIMAP_MBX_LIST_FLAGS_SFLAG; 5926 type = MAILIMAP_MBX_LIST_FLAGS_SFLAG;
5909 5927
5910 final_token = cur_token; 5928 final_token = cur_token;
5911 r = mailimap_space_parse(fd, buffer, &cur_token); 5929 r = mailimap_space_parse(fd, buffer, &cur_token);
5912 if (r == MAILIMAP_NO_ERROR) { 5930 if (r == MAILIMAP_NO_ERROR) {
5913 r = mailimap_struct_spaced_list_parse(fd, buffer, &cur_token, 5931 r = mailimap_struct_spaced_list_parse(fd, buffer, &cur_token,
5914 &oflags_2, 5932 &oflags_2,
5915 (mailimap_struct_parser *) mailimap_mbx_list_oflag_parse, 5933 (mailimap_struct_parser *) mailimap_mbx_list_oflag_parse,
5916 (mailimap_struct_destructor *) mailimap_mbx_list_oflag_free, 5934 (mailimap_struct_destructor *) mailimap_mbx_list_oflag_free,
5917 progr_rate, progr_fun); 5935 progr_rate, progr_fun);
5918 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) { 5936 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) {
5919 res = r; 5937 res = r;
5920 goto err; 5938 goto err;
5921 } 5939 }
5922 5940
5923 if (r == MAILIMAP_NO_ERROR) { 5941 if (r == MAILIMAP_NO_ERROR) {
5924 clist_concat(oflags, oflags_2); 5942 clist_concat(oflags, oflags_2);
5925 clist_free(oflags_2); 5943 clist_free(oflags_2);
5926 5944
5927 final_token = cur_token; 5945 final_token = cur_token;
5928 } 5946 }
5929 } 5947 }
5930 5948
5931 break; 5949 break;
5932 5950
5933 default: 5951 default:
5934 res = r; 5952 res = r;
5935 goto free; 5953 goto free;
5936 } 5954 }
5937 } 5955 }
5938 5956
5939 if ((clist_count(oflags) == 0) && (type == MAILIMAP_MBX_LIST_FLAGS_NO_SFLAG)) { 5957 if ((clist_count(oflags) == 0) && (type == MAILIMAP_MBX_LIST_FLAGS_NO_SFLAG)) {
5940 res = MAILIMAP_ERROR_PARSE; 5958 res = MAILIMAP_ERROR_PARSE;
5941 goto free; 5959 goto free;
5942 } 5960 }
5943 5961
5944 cur_token = final_token; 5962 cur_token = final_token;
5945 mbx_list_flag = mailimap_mbx_list_flags_new(type, oflags, sflag); 5963 mbx_list_flag = mailimap_mbx_list_flags_new(type, oflags, sflag);
5946 if (mbx_list_flag == NULL) { 5964 if (mbx_list_flag == NULL) {
5947 res = MAILIMAP_ERROR_MEMORY; 5965 res = MAILIMAP_ERROR_MEMORY;
5948 goto free; 5966 goto free;
5949 } 5967 }
5950 5968
5951 * result = mbx_list_flag; 5969 * result = mbx_list_flag;
5952 * index = cur_token; 5970 * index = cur_token;
5953 5971
5954 return MAILIMAP_NO_ERROR; 5972 return MAILIMAP_NO_ERROR;
5955 5973
5956free: 5974free:
5957 clist_foreach(oflags, (clist_func) mailimap_mbx_list_oflag_free, NULL); 5975 clist_foreach(oflags, (clist_func) mailimap_mbx_list_oflag_free, NULL);
5958 clist_free(oflags); 5976 clist_free(oflags);
5959err: 5977err:
5960 return res; 5978 return res;
5961} 5979}
5962 5980
5963/* 5981/*
5964 mbx-list-oflag = "\Noinferiors" / flag-extension 5982 mbx-list-oflag = "\Noinferiors" / flag-extension
5965 ; Other flags; multiple possible per LIST response 5983 ; Other flags; multiple possible per LIST response
5966*/ 5984*/
5967 5985
5968static int 5986static int
5969mailimap_mbx_list_oflag_parse(mailstream * fd, MMAPString * buffer, 5987mailimap_mbx_list_oflag_parse(mailstream * fd, MMAPString * buffer,
5970 size_t * index, 5988 size_t * index,
5971 struct mailimap_mbx_list_oflag ** result, 5989 struct mailimap_mbx_list_oflag ** result,
5972 size_t progr_rate, 5990 size_t progr_rate,
5973 progress_function * progr_fun) 5991 progress_function * progr_fun)
5974{ 5992{
5975 int type; 5993 int type;
5976 size_t cur_token; 5994 size_t cur_token;
5977 struct mailimap_mbx_list_oflag * oflag; 5995 struct mailimap_mbx_list_oflag * oflag;
5978 char * flag_ext; 5996 char * flag_ext;
5979 int r; 5997 int r;
5980 int res; 5998 int res;
5981 int sflag_type; 5999 int sflag_type;
5982 6000
5983 cur_token = * index; 6001 cur_token = * index;
5984 flag_ext = NULL; 6002 flag_ext = NULL;
5985 type = MAILIMAP_MBX_LIST_OFLAG_ERROR; /* XXX - removes a gcc warning */ 6003 type = MAILIMAP_MBX_LIST_OFLAG_ERROR; /* XXX - removes a gcc warning */
5986 6004
5987 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, 6005 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token,
5988 "\\Noinferiors"); 6006 "\\Noinferiors");
5989 if (r == MAILIMAP_NO_ERROR) 6007 if (r == MAILIMAP_NO_ERROR)
5990 type = MAILIMAP_MBX_LIST_OFLAG_NOINFERIORS; 6008 type = MAILIMAP_MBX_LIST_OFLAG_NOINFERIORS;
5991 6009
5992 if (r == MAILIMAP_ERROR_PARSE) { 6010 if (r == MAILIMAP_ERROR_PARSE) {
5993 r = mailimap_flag_extension_parse(fd, buffer, &cur_token, 6011 r = mailimap_flag_extension_parse(fd, buffer, &cur_token,
5994 &flag_ext, progr_rate, progr_fun); 6012 &flag_ext, progr_rate, progr_fun);
5995 if (r == MAILIMAP_NO_ERROR) 6013 if (r == MAILIMAP_NO_ERROR)
5996 type = MAILIMAP_MBX_LIST_OFLAG_FLAG_EXT; 6014 type = MAILIMAP_MBX_LIST_OFLAG_FLAG_EXT;
5997 } 6015 }
5998 6016
5999 if (r != MAILIMAP_NO_ERROR) { 6017 if (r != MAILIMAP_NO_ERROR) {
6000 res = r; 6018 res = r;
6001 goto err; 6019 goto err;
6002 } 6020 }
6003 6021
6004 oflag = mailimap_mbx_list_oflag_new(type, flag_ext); 6022 oflag = mailimap_mbx_list_oflag_new(type, flag_ext);
6005 if (oflag == NULL) { 6023 if (oflag == NULL) {
6006 res = MAILIMAP_ERROR_MEMORY; 6024 res = MAILIMAP_ERROR_MEMORY;
6007 goto free; 6025 goto free;
6008 } 6026 }
6009 6027
6010 * result = oflag; 6028 * result = oflag;
6011 * index = cur_token; 6029 * index = cur_token;
6012 6030
6013 return MAILIMAP_NO_ERROR; 6031 return MAILIMAP_NO_ERROR;
6014 6032
6015 free: 6033 free:
6016 if (flag_ext != NULL) 6034 if (flag_ext != NULL)
6017 mailimap_flag_extension_free(flag_ext); 6035 mailimap_flag_extension_free(flag_ext);
6018 err: 6036 err:
6019 return res; 6037 return res;
6020} 6038}
6021 6039
6022static int 6040static int
6023mailimap_mbx_list_oflag_no_sflag_parse(mailstream * fd, MMAPString * buffer, 6041mailimap_mbx_list_oflag_no_sflag_parse(mailstream * fd, MMAPString * buffer,
6024 size_t * index, 6042 size_t * index,
6025 struct mailimap_mbx_list_oflag ** result, 6043 struct mailimap_mbx_list_oflag ** result,
6026 size_t progr_rate, 6044 size_t progr_rate,
6027 progress_function * progr_fun) 6045 progress_function * progr_fun)
6028{ 6046{
6029 size_t cur_token; 6047 size_t cur_token;
6030 int sflag_type; 6048 int sflag_type;
6031 int r; 6049 int r;
6032 6050
6033 cur_token = * index; 6051 cur_token = * index;
6034 6052
6035 r = mailimap_mbx_list_sflag_parse(fd, buffer, &cur_token, &sflag_type); 6053 r = mailimap_mbx_list_sflag_parse(fd, buffer, &cur_token, &sflag_type);
6036 if (r == MAILIMAP_NO_ERROR) 6054 if (r == MAILIMAP_NO_ERROR)
6037 return MAILIMAP_ERROR_PARSE; 6055 return MAILIMAP_ERROR_PARSE;
6038 6056
6039 return mailimap_mbx_list_oflag_parse(fd, buffer, index, result, 6057 return mailimap_mbx_list_oflag_parse(fd, buffer, index, result,
6040 progr_rate, progr_fun); 6058 progr_rate, progr_fun);
6041} 6059}
6042 6060
6043 6061
6044/* 6062/*
6045 mbx-list-sflag = "\Noselect" / "\Marked" / "\Unmarked" 6063 mbx-list-sflag = "\Noselect" / "\Marked" / "\Unmarked"
6046 ; Selectability flags; only one per LIST response 6064 ; Selectability flags; only one per LIST response
6047*/ 6065*/
6048 6066
6049static int 6067static int
6050mailimap_mbx_list_sflag_parse(mailstream * fd, MMAPString * buffer, 6068mailimap_mbx_list_sflag_parse(mailstream * fd, MMAPString * buffer,
6051 size_t * index, 6069 size_t * index,
6052 int * result) 6070 int * result)
6053{ 6071{
6054 int type; 6072 int type;
6055 size_t cur_token; 6073 size_t cur_token;
6056 6074
6057 cur_token = * index; 6075 cur_token = * index;
6058 6076
6059 type = mailimap_mbx_list_sflag_get_token_value(fd, buffer, &cur_token); 6077 type = mailimap_mbx_list_sflag_get_token_value(fd, buffer, &cur_token);
6060 if (type == -1) 6078 if (type == -1)
6061 return MAILIMAP_ERROR_PARSE; 6079 return MAILIMAP_ERROR_PARSE;
6062 6080
6063 * result = type; 6081 * result = type;
6064 * index = cur_token; 6082 * index = cur_token;
6065 6083
6066 return MAILIMAP_NO_ERROR; 6084 return MAILIMAP_NO_ERROR;
6067} 6085}
6068 6086
6069 6087
6070/* 6088/*
6071 media-basic = ((DQUOTE ("APPLICATION" / "AUDIO" / "IMAGE" / "MESSAGE" / 6089 media-basic = ((DQUOTE ("APPLICATION" / "AUDIO" / "IMAGE" / "MESSAGE" /
6072 "VIDEO") DQUOTE) / string) SP media-subtype 6090 "VIDEO") DQUOTE) / string) SP media-subtype
6073 ; Defined in [MIME-IMT] 6091 ; Defined in [MIME-IMT]
6074*/ 6092*/
6075 6093
6076/* 6094/*
6077 DQUOTE ("APPLICATION" / "AUDIO" / "IMAGE" / "MESSAGE" / 6095 DQUOTE ("APPLICATION" / "AUDIO" / "IMAGE" / "MESSAGE" /
6078 "VIDEO") DQUOTE 6096 "VIDEO") DQUOTE
6079*/ 6097*/
6080 6098
6081static int 6099static int
6082mailimap_media_basic_standard_parse(mailstream * fd, MMAPString * buffer, 6100mailimap_media_basic_standard_parse(mailstream * fd, MMAPString * buffer,
6083 size_t * index, 6101 size_t * index,
6084 int * result) 6102 int * result)
6085{ 6103{
6086 size_t cur_token; 6104 size_t cur_token;
6087 int type; 6105 int type;
6088 int r; 6106 int r;
6089 6107
6090 cur_token = * index; 6108 cur_token = * index;
6091 6109
6092 r = mailimap_dquote_parse(fd, buffer, &cur_token); 6110 r = mailimap_dquote_parse(fd, buffer, &cur_token);
6093 if (r != MAILIMAP_NO_ERROR) 6111 if (r != MAILIMAP_NO_ERROR)
6094 return r; 6112 return r;
6095 6113
6096 type = mailimap_media_basic_get_token_value(fd, buffer, &cur_token); 6114 type = mailimap_media_basic_get_token_value(fd, buffer, &cur_token);
6097 if (type == -1) 6115 if (type == -1)
6098 return MAILIMAP_ERROR_PARSE; 6116 return MAILIMAP_ERROR_PARSE;
6099 6117
6100 r = mailimap_dquote_parse(fd, buffer, &cur_token); 6118 r = mailimap_dquote_parse(fd, buffer, &cur_token);
6101 if (r != MAILIMAP_NO_ERROR) 6119 if (r != MAILIMAP_NO_ERROR)
6102 return FALSE; 6120 return FALSE;
6103 6121
6104 * index = cur_token; 6122 * index = cur_token;
6105 * result = type; 6123 * result = type;
6106 6124
6107 return MAILIMAP_NO_ERROR; 6125 return MAILIMAP_NO_ERROR;
6108} 6126}
6109 6127
6110/* 6128/*
6111 media-basic = ((DQUOTE ("APPLICATION" / "AUDIO" / "IMAGE" / "MESSAGE" / 6129 media-basic = ((DQUOTE ("APPLICATION" / "AUDIO" / "IMAGE" / "MESSAGE" /
6112 "VIDEO") DQUOTE) / string) SP media-subtype 6130 "VIDEO") DQUOTE) / string) SP media-subtype
6113 ; Defined in [MIME-IMT] 6131 ; Defined in [MIME-IMT]
6114*/ 6132*/
6115 6133
6116static int 6134static int
6117mailimap_media_basic_parse(mailstream * fd, MMAPString * buffer, 6135mailimap_media_basic_parse(mailstream * fd, MMAPString * buffer,
6118 size_t * index, 6136 size_t * index,
6119 struct mailimap_media_basic ** result, 6137 struct mailimap_media_basic ** result,
6120 size_t progr_rate, 6138 size_t progr_rate,
6121 progress_function * progr_fun) 6139 progress_function * progr_fun)
6122{ 6140{
6123 size_t cur_token; 6141 size_t cur_token;
6124 int type; 6142 int type;
6125 char * basic_type; 6143 char * basic_type;
6126 char * subtype; 6144 char * subtype;
6127 struct mailimap_media_basic * media_basic; 6145 struct mailimap_media_basic * media_basic;
6128 int r; 6146 int r;
6129 int res; 6147 int res;
6130 6148
6131 cur_token = * index; 6149 cur_token = * index;
6132 6150
6133 basic_type = NULL; 6151 basic_type = NULL;
6134 subtype = NULL; 6152 subtype = NULL;
6135 6153
6136 r = mailimap_media_basic_standard_parse(fd, buffer, &cur_token, 6154 r = mailimap_media_basic_standard_parse(fd, buffer, &cur_token,
6137 &type); 6155 &type);
6138 6156
6139 if (r == MAILIMAP_ERROR_PARSE) { 6157 if (r == MAILIMAP_ERROR_PARSE) {
6140 r = mailimap_string_parse(fd, buffer, &cur_token, &basic_type, NULL, 6158 r = mailimap_string_parse(fd, buffer, &cur_token, &basic_type, NULL,
6141 progr_rate, progr_fun); 6159 progr_rate, progr_fun);
6142 if (r == MAILIMAP_NO_ERROR) 6160 if (r == MAILIMAP_NO_ERROR)
6143 type = MAILIMAP_MEDIA_BASIC_OTHER; 6161 type = MAILIMAP_MEDIA_BASIC_OTHER;
6144 } 6162 }
6145 6163
6146 if (r != MAILIMAP_NO_ERROR) { 6164 if (r != MAILIMAP_NO_ERROR) {
6147 res = r; 6165 res = r;
6148 goto err; 6166 goto err;
6149 } 6167 }
6150 6168
6151 r = mailimap_space_parse(fd, buffer, &cur_token); 6169 r = mailimap_space_parse(fd, buffer, &cur_token);
6152 if (r != MAILIMAP_NO_ERROR) { 6170 if (r != MAILIMAP_NO_ERROR) {
6153 res = r; 6171 res = r;
6154 goto free_basic_type; 6172 goto free_basic_type;
6155 } 6173 }
6156 6174
6157 r = mailimap_media_subtype_parse(fd, buffer, &cur_token, &subtype, 6175 r = mailimap_media_subtype_parse(fd, buffer, &cur_token, &subtype,
6158 progr_rate, progr_fun); 6176 progr_rate, progr_fun);
6159 if (r != MAILIMAP_NO_ERROR) { 6177 if (r != MAILIMAP_NO_ERROR) {
6160 res = r; 6178 res = r;
6161 goto free_basic_type; 6179 goto free_basic_type;
6162 } 6180 }
6163 6181
6164 media_basic = mailimap_media_basic_new(type, basic_type, subtype); 6182 media_basic = mailimap_media_basic_new(type, basic_type, subtype);
6165 if (media_basic == NULL) { 6183 if (media_basic == NULL) {
6166 res = MAILIMAP_ERROR_MEMORY; 6184 res = MAILIMAP_ERROR_MEMORY;
6167 goto free_subtype; 6185 goto free_subtype;
6168 } 6186 }
6169 6187
6170 * result = media_basic; 6188 * result = media_basic;
6171 * index = cur_token; 6189 * index = cur_token;
6172 6190
6173 return MAILIMAP_NO_ERROR; 6191 return MAILIMAP_NO_ERROR;
6174 6192
6175 free_subtype: 6193 free_subtype:
6176 mailimap_media_subtype_free(subtype); 6194 mailimap_media_subtype_free(subtype);
6177 free_basic_type: 6195 free_basic_type:
6178 if (basic_type != NULL) 6196 if (basic_type != NULL)
6179 mailimap_string_free(basic_type); 6197 mailimap_string_free(basic_type);
6180 err: 6198 err:
6181 return res; 6199 return res;
6182} 6200}
6183 6201
6184 6202
6185/* 6203/*
6186 media-message = DQUOTE "MESSAGE" DQUOTE SP DQUOTE "RFC822" DQUOTE 6204 media-message = DQUOTE "MESSAGE" DQUOTE SP DQUOTE "RFC822" DQUOTE
6187 ; Defined in [MIME-IMT] 6205 ; Defined in [MIME-IMT]
6188*/ 6206*/
6189 6207
6190static int 6208static int
6191mailimap_media_message_parse(mailstream * fd, MMAPString * buffer, 6209mailimap_media_message_parse(mailstream * fd, MMAPString * buffer,
6192 size_t * index) 6210 size_t * index)
6193{ 6211{
6194 size_t cur_token; 6212 size_t cur_token;
6195 int r; 6213 int r;
6196 6214
6197 cur_token = * index; 6215 cur_token = * index;
6198 6216
6199 r = mailimap_dquote_parse(fd, buffer, &cur_token); 6217 r = mailimap_dquote_parse(fd, buffer, &cur_token);
6200 if (r != MAILIMAP_NO_ERROR) 6218 if (r != MAILIMAP_NO_ERROR)
6201 return r; 6219 return r;
6202 6220
6203 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, 6221 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token,
6204 "MESSAGE"); 6222 "MESSAGE");
6205 if (r != MAILIMAP_NO_ERROR) 6223 if (r != MAILIMAP_NO_ERROR)
6206 return r; 6224 return r;
6207 6225
6208 r = mailimap_dquote_parse(fd, buffer, &cur_token); 6226 r = mailimap_dquote_parse(fd, buffer, &cur_token);
6209 if (r != MAILIMAP_NO_ERROR) 6227 if (r != MAILIMAP_NO_ERROR)
6210 return r; 6228 return r;
6211 6229
6212 r = mailimap_space_parse(fd, buffer, &cur_token); 6230 r = mailimap_space_parse(fd, buffer, &cur_token);
6213 if (r != MAILIMAP_NO_ERROR) 6231 if (r != MAILIMAP_NO_ERROR)
6214 return r; 6232 return r;
6215 6233
6216 r = mailimap_dquote_parse(fd, buffer, &cur_token); 6234 r = mailimap_dquote_parse(fd, buffer, &cur_token);
6217 if (r != MAILIMAP_NO_ERROR) 6235 if (r != MAILIMAP_NO_ERROR)
6218 return r; 6236 return r;
6219 6237
6220 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, 6238 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token,
6221 "RFC822"); 6239 "RFC822");
6222 if (r != MAILIMAP_NO_ERROR) 6240 if (r != MAILIMAP_NO_ERROR)
6223 return r; 6241 return r;
6224 6242
6225 r = mailimap_dquote_parse(fd, buffer, &cur_token); 6243 r = mailimap_dquote_parse(fd, buffer, &cur_token);
6226 if (r != MAILIMAP_NO_ERROR) 6244 if (r != MAILIMAP_NO_ERROR)
6227 return r; 6245 return r;
6228 6246
6229 * index = cur_token; 6247 * index = cur_token;
6230 6248
6231 return MAILIMAP_NO_ERROR; 6249 return MAILIMAP_NO_ERROR;
6232} 6250}
6233 6251
6234/* 6252/*
6235 media-subtype = string 6253 media-subtype = string
6236 ; Defined in [MIME-IMT] 6254 ; Defined in [MIME-IMT]
6237*/ 6255*/
6238 6256
6239static int 6257static int
6240mailimap_media_subtype_parse(mailstream * fd, MMAPString * buffer, 6258mailimap_media_subtype_parse(mailstream * fd, MMAPString * buffer,
6241 size_t * index, 6259 size_t * index,
6242 char ** result, 6260 char ** result,
6243 size_t progr_rate, 6261 size_t progr_rate,
6244 progress_function * progr_fun) 6262 progress_function * progr_fun)
6245{ 6263{
6246 return mailimap_string_parse(fd, buffer, index, result, NULL, 6264 return mailimap_string_parse(fd, buffer, index, result, NULL,
6247 progr_rate, progr_fun); 6265 progr_rate, progr_fun);
6248} 6266}
6249 6267
6250/* 6268/*
6251 media-text = DQUOTE "TEXT" DQUOTE SP media-subtype 6269 media-text = DQUOTE "TEXT" DQUOTE SP media-subtype
6252 ; Defined in [MIME-IMT] 6270 ; Defined in [MIME-IMT]
6253*/ 6271*/
6254 6272
6255static int mailimap_media_text_parse(mailstream * fd, MMAPString * buffer, 6273static int mailimap_media_text_parse(mailstream * fd, MMAPString * buffer,
6256 size_t * index, 6274 size_t * index,
6257 char ** result, 6275 char ** result,
6258 size_t progr_rate, 6276 size_t progr_rate,
6259 progress_function * progr_fun) 6277 progress_function * progr_fun)
6260{ 6278{
6261 size_t cur_token; 6279 size_t cur_token;
6262 char * media_subtype; 6280 char * media_subtype;
6263 int r; 6281 int r;
6264 6282
6265 cur_token = * index; 6283 cur_token = * index;
6266 6284
6267 r = mailimap_dquote_parse(fd, buffer, &cur_token); 6285 r = mailimap_dquote_parse(fd, buffer, &cur_token);
6268 if (r != MAILIMAP_NO_ERROR) 6286 if (r != MAILIMAP_NO_ERROR)
6269 return r; 6287 return r;
6270 6288
6271 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, 6289 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token,
6272 "TEXT"); 6290 "TEXT");
6273 if (r != MAILIMAP_NO_ERROR) 6291 if (r != MAILIMAP_NO_ERROR)
6274 return r; 6292 return r;
6275 6293
6276 r = mailimap_dquote_parse(fd, buffer, &cur_token); 6294 r = mailimap_dquote_parse(fd, buffer, &cur_token);
6277 if (r != MAILIMAP_NO_ERROR) 6295 if (r != MAILIMAP_NO_ERROR)
6278 return r; 6296 return r;
6279 6297
6280 r = mailimap_space_parse(fd, buffer, &cur_token); 6298 r = mailimap_space_parse(fd, buffer, &cur_token);
6281 if (r != MAILIMAP_NO_ERROR) 6299 if (r != MAILIMAP_NO_ERROR)
6282 return r; 6300 return r;
6283 6301
6284 r = mailimap_media_subtype_parse(fd, buffer, &cur_token, &media_subtype, 6302 r = mailimap_media_subtype_parse(fd, buffer, &cur_token, &media_subtype,
6285 progr_rate, progr_fun); 6303 progr_rate, progr_fun);
6286 if (r != MAILIMAP_NO_ERROR) 6304 if (r != MAILIMAP_NO_ERROR)
6287 return r; 6305 return r;
6288 6306
6289 * result = media_subtype; 6307 * result = media_subtype;
6290 * index = cur_token; 6308 * index = cur_token;
6291 6309
6292 return MAILIMAP_NO_ERROR; 6310 return MAILIMAP_NO_ERROR;
6293} 6311}
6294 6312
6295 6313
6296/* 6314/*
6297 message-data = nz-number SP ("EXPUNGE" / ("FETCH" SP msg-att)) 6315 message-data = nz-number SP ("EXPUNGE" / ("FETCH" SP msg-att))
6298*/ 6316*/
6299 6317
6300 6318
6301static int 6319static int
6302mailimap_message_data_parse(mailstream * fd, MMAPString * buffer, 6320mailimap_message_data_parse(mailstream * fd, MMAPString * buffer,
6303 size_t * index, 6321 size_t * index,
6304 struct mailimap_message_data ** result, 6322 struct mailimap_message_data ** result,
6305 size_t progr_rate, 6323 size_t progr_rate,
6306 progress_function * progr_fun) 6324 progress_function * progr_fun)
6307{ 6325{
6308 size_t cur_token; 6326 size_t cur_token;
6309 uint32_t number; 6327 uint32_t number;
6310 int type; 6328 int type;
6311 struct mailimap_msg_att * msg_att; 6329 struct mailimap_msg_att * msg_att;
6312 struct mailimap_message_data * msg_data; 6330 struct mailimap_message_data * msg_data;
6313 int r; 6331 int r;
6314 int res; 6332 int res;
6315 6333
6316 cur_token = * index; 6334 cur_token = * index;
6317 msg_att = NULL; 6335 msg_att = NULL;
6318 6336
6319 r = mailimap_nz_number_parse(fd, buffer, &cur_token, &number); 6337 r = mailimap_nz_number_parse(fd, buffer, &cur_token, &number);
6320 if (r != MAILIMAP_NO_ERROR) { 6338 if (r != MAILIMAP_NO_ERROR) {
6321 res = r; 6339 res = r;
6322 goto err; 6340 goto err;
6323 } 6341 }
6324 6342
6325 r = mailimap_space_parse(fd, buffer, &cur_token); 6343 r = mailimap_space_parse(fd, buffer, &cur_token);
6326 if (r != MAILIMAP_NO_ERROR) { 6344 if (r != MAILIMAP_NO_ERROR) {
6327 res = r; 6345 res = r;
6328 goto err; 6346 goto err;
6329 } 6347 }
6330 6348
6331 type = MAILIMAP_MESSAGE_DATA_ERROR; /* XXX - removes a gcc warning */ 6349 type = MAILIMAP_MESSAGE_DATA_ERROR; /* XXX - removes a gcc warning */
6332 6350
6333 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, 6351 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token,
6334 "EXPUNGE"); 6352 "EXPUNGE");
6335 if (r == MAILIMAP_NO_ERROR) 6353 if (r == MAILIMAP_NO_ERROR)
6336 type = MAILIMAP_MESSAGE_DATA_EXPUNGE; 6354 type = MAILIMAP_MESSAGE_DATA_EXPUNGE;
6337 6355
6338 if (r == MAILIMAP_ERROR_PARSE) { 6356 if (r == MAILIMAP_ERROR_PARSE) {
6339 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, 6357 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token,
6340 "FETCH"); 6358 "FETCH");
6341 if (r != MAILIMAP_NO_ERROR) { 6359 if (r != MAILIMAP_NO_ERROR) {
6342 res = r; 6360 res = r;
6343 goto err; 6361 goto err;
6344 } 6362 }
6345 6363
6346 r = mailimap_space_parse(fd, buffer, &cur_token); 6364 r = mailimap_space_parse(fd, buffer, &cur_token);
6347 if (r != MAILIMAP_NO_ERROR) { 6365 if (r != MAILIMAP_NO_ERROR) {
6348 res = r; 6366 res = r;
6349 goto err; 6367 goto err;
6350 } 6368 }
6351 6369
6352 r = mailimap_msg_att_parse(fd, buffer, &cur_token, &msg_att, 6370 r = mailimap_msg_att_parse(fd, buffer, &cur_token, &msg_att,
6353 progr_rate, progr_fun); 6371 progr_rate, progr_fun);
6354 if (r != MAILIMAP_NO_ERROR) { 6372 if (r != MAILIMAP_NO_ERROR) {
6355 res = r; 6373 res = r;
6356 goto err; 6374 goto err;
6357 } 6375 }
6358 6376
6359 type = MAILIMAP_MESSAGE_DATA_FETCH; 6377 type = MAILIMAP_MESSAGE_DATA_FETCH;
6360 } 6378 }
6361 6379
6362 if (r != MAILIMAP_NO_ERROR) { 6380 if (r != MAILIMAP_NO_ERROR) {
6363 res = r; 6381 res = r;
6364 goto err; 6382 goto err;
6365 } 6383 }
6366 6384
6367 msg_data = mailimap_message_data_new(number, type, msg_att); 6385 msg_data = mailimap_message_data_new(number, type, msg_att);
6368 if (msg_data == NULL) { 6386 if (msg_data == NULL) {
6369 res = MAILIMAP_ERROR_MEMORY; 6387 res = MAILIMAP_ERROR_MEMORY;
6370 goto free_msg_att; 6388 goto free_msg_att;
6371 } 6389 }
6372 6390
6373 * result = msg_data; 6391 * result = msg_data;
6374 * index = cur_token; 6392 * index = cur_token;
6375 6393
6376 return MAILIMAP_NO_ERROR; 6394 return MAILIMAP_NO_ERROR;
6377 6395
6378 free_msg_att: 6396 free_msg_att:
6379 if (msg_att != NULL) 6397 if (msg_att != NULL)
6380 mailimap_msg_att_free(msg_att); 6398 mailimap_msg_att_free(msg_att);
6381 err: 6399 err:
6382 return res; 6400 return res;
6383} 6401}
6384 6402
6385/* 6403/*
6386 msg-att = "(" (msg-att-dynamic / msg-att-static) 6404 msg-att = "(" (msg-att-dynamic / msg-att-static)
6387 *(SP (msg-att-dynamic / msg-att-static)) ")" 6405 *(SP (msg-att-dynamic / msg-att-static)) ")"
6388*/ 6406*/
6389 6407
6390/* 6408/*
6391 msg-att-dynamic / msg-att-static 6409 msg-att-dynamic / msg-att-static
6392*/ 6410*/
6393 6411
6394static int 6412static int
6395mailimap_msg_att_item_parse(mailstream * fd, MMAPString * buffer, 6413mailimap_msg_att_item_parse(mailstream * fd, MMAPString * buffer,
6396 size_t * index, 6414 size_t * index,
6397 struct mailimap_msg_att_item ** result, 6415 struct mailimap_msg_att_item ** result,
6398 size_t progr_rate, 6416 size_t progr_rate,
6399 progress_function * progr_fun) 6417 progress_function * progr_fun)
6400{ 6418{
6401 int type; 6419 int type;
6402 struct mailimap_msg_att_dynamic * msg_att_dynamic; 6420 struct mailimap_msg_att_dynamic * msg_att_dynamic;
6403 struct mailimap_msg_att_static * msg_att_static; 6421 struct mailimap_msg_att_static * msg_att_static;
6404 size_t cur_token; 6422 size_t cur_token;
6405 struct mailimap_msg_att_item * item; 6423 struct mailimap_msg_att_item * item;
6406 int r; 6424 int r;
6407 int res; 6425 int res;
6408 6426
6409 cur_token = * index; 6427 cur_token = * index;
6410 6428
6411 msg_att_dynamic = NULL; 6429 msg_att_dynamic = NULL;
6412 msg_att_static = NULL; 6430 msg_att_static = NULL;
6413 6431
6414 type = MAILIMAP_MSG_ATT_ITEM_ERROR; /* XXX - removes a gcc warning */ 6432 type = MAILIMAP_MSG_ATT_ITEM_ERROR; /* XXX - removes a gcc warning */
6415 6433
6416 r = mailimap_msg_att_dynamic_parse(fd, buffer, &cur_token, 6434 r = mailimap_msg_att_dynamic_parse(fd, buffer, &cur_token,
6417 &msg_att_dynamic, 6435 &msg_att_dynamic,
6418 progr_rate, progr_fun); 6436 progr_rate, progr_fun);
6419 if (r == MAILIMAP_NO_ERROR) 6437 if (r == MAILIMAP_NO_ERROR)
6420 type = MAILIMAP_MSG_ATT_ITEM_DYNAMIC; 6438 type = MAILIMAP_MSG_ATT_ITEM_DYNAMIC;
6421 6439
6422 if (r == MAILIMAP_ERROR_PARSE) { 6440 if (r == MAILIMAP_ERROR_PARSE) {
6423 r = mailimap_msg_att_static_parse(fd, buffer, &cur_token, 6441 r = mailimap_msg_att_static_parse(fd, buffer, &cur_token,
6424 &msg_att_static, 6442 &msg_att_static,
6425 progr_rate, progr_fun); 6443 progr_rate, progr_fun);
6426 if (r == MAILIMAP_NO_ERROR) 6444 if (r == MAILIMAP_NO_ERROR)
6427 type = MAILIMAP_MSG_ATT_ITEM_STATIC; 6445 type = MAILIMAP_MSG_ATT_ITEM_STATIC;
6428 } 6446 }
6429 6447
6430 if (r != MAILIMAP_NO_ERROR) { 6448 if (r != MAILIMAP_NO_ERROR) {
6431 res = r; 6449 res = r;
6432 goto err; 6450 goto err;
6433 } 6451 }
6434 6452
6435 item = mailimap_msg_att_item_new(type, msg_att_dynamic, msg_att_static); 6453 item = mailimap_msg_att_item_new(type, msg_att_dynamic, msg_att_static);
6436 if (item == NULL) { 6454 if (item == NULL) {
6437 res = MAILIMAP_ERROR_MEMORY; 6455 res = MAILIMAP_ERROR_MEMORY;
6438 goto free; 6456 goto free;
6439 } 6457 }
6440 6458
6441 * result = item; 6459 * result = item;
6442 * index = cur_token; 6460 * index = cur_token;
6443 6461
6444 return MAILIMAP_NO_ERROR; 6462 return MAILIMAP_NO_ERROR;
6445 6463
6446 free: 6464 free:
6447 if (msg_att_dynamic != NULL) 6465 if (msg_att_dynamic != NULL)
6448 mailimap_msg_att_dynamic_free(msg_att_dynamic); 6466 mailimap_msg_att_dynamic_free(msg_att_dynamic);
6449 if (msg_att_static != NULL) 6467 if (msg_att_static != NULL)
6450 mailimap_msg_att_static_free(msg_att_static); 6468 mailimap_msg_att_static_free(msg_att_static);
6451 err: 6469 err:
6452 return res; 6470 return res;
6453} 6471}
6454 6472
6455/* 6473/*
6456 msg-att = "(" (msg-att-dynamic / msg-att-static) 6474 msg-att = "(" (msg-att-dynamic / msg-att-static)
6457 *(SP (msg-att-dynamic / msg-att-static)) ")" 6475 *(SP (msg-att-dynamic / msg-att-static)) ")"
6458*/ 6476*/
6459 6477
6460static int 6478static int
6461mailimap_msg_att_parse(mailstream * fd, MMAPString * buffer, 6479mailimap_msg_att_parse(mailstream * fd, MMAPString * buffer,
6462 size_t * index, struct mailimap_msg_att ** result, 6480 size_t * index, struct mailimap_msg_att ** result,
6463 size_t progr_rate, 6481 size_t progr_rate,
6464 progress_function * progr_fun) 6482 progress_function * progr_fun)
6465{ 6483{
6466 size_t cur_token; 6484 size_t cur_token;
6467 clist * list; 6485 clist * list;
6468 struct mailimap_msg_att * msg_att; 6486 struct mailimap_msg_att * msg_att;
6469 int r; 6487 int r;
6470 int res; 6488 int res;
6471 6489
6472 cur_token = * index; 6490 cur_token = * index;
6473 list = NULL; 6491 list = NULL;
6474 6492
6475 r = mailimap_oparenth_parse(fd, buffer, &cur_token); 6493 r = mailimap_oparenth_parse(fd, buffer, &cur_token);
6476 if (r != MAILIMAP_NO_ERROR) { 6494 if (r != MAILIMAP_NO_ERROR) {
6477 res = r; 6495 res = r;
6478 goto err; 6496 goto err;
6479 } 6497 }
6480 6498
6481 r = mailimap_struct_spaced_list_parse(fd, buffer, &cur_token, &list, 6499 r = mailimap_struct_spaced_list_parse(fd, buffer, &cur_token, &list,
6482 (mailimap_struct_parser *) 6500 (mailimap_struct_parser *)
6483 mailimap_msg_att_item_parse, 6501 mailimap_msg_att_item_parse,
6484 (mailimap_struct_destructor *) 6502 (mailimap_struct_destructor *)
6485 mailimap_msg_att_item_free, 6503 mailimap_msg_att_item_free,
6486 progr_rate, progr_fun); 6504 progr_rate, progr_fun);
6487 if (r != MAILIMAP_NO_ERROR) { 6505 if (r != MAILIMAP_NO_ERROR) {
6488 res = r; 6506 res = r;
6489 goto err; 6507 goto err;
6490 } 6508 }
6491 6509
6492 r = mailimap_cparenth_parse(fd, buffer, &cur_token); 6510 r = mailimap_cparenth_parse(fd, buffer, &cur_token);
6493 if (r != MAILIMAP_NO_ERROR) { 6511 if (r != MAILIMAP_NO_ERROR) {
6494 res = r; 6512 res = r;
6495 goto free; 6513 goto free;
6496 } 6514 }
6497 6515
6498 msg_att = mailimap_msg_att_new(list); 6516 msg_att = mailimap_msg_att_new(list);
6499 if (msg_att == NULL) { 6517 if (msg_att == NULL) {
6500 res = MAILIMAP_ERROR_MEMORY; 6518 res = MAILIMAP_ERROR_MEMORY;
6501 goto free; 6519 goto free;
6502 } 6520 }
6503 6521
6504 * index = cur_token; 6522 * index = cur_token;
6505 * result = msg_att; 6523 * result = msg_att;
6506 6524
6507 return MAILIMAP_NO_ERROR; 6525 return MAILIMAP_NO_ERROR;
6508 6526
6509 free: 6527 free:
6510 clist_foreach(list, (clist_func) mailimap_msg_att_item_free, NULL); 6528 clist_foreach(list, (clist_func) mailimap_msg_att_item_free, NULL);
6511 clist_free(list); 6529 clist_free(list);
6512 err: 6530 err:
6513 return res; 6531 return res;
6514} 6532}
6515 6533
6516/* 6534/*
6517 msg-att-dynamic = "FLAGS" SP "(" [flag-fetch *(SP flag-fetch)] ")" 6535 msg-att-dynamic = "FLAGS" SP "(" [flag-fetch *(SP flag-fetch)] ")"
6518 ; MAY change for a message 6536 ; MAY change for a message
6519*/ 6537*/
6520 6538
6521 6539
6522static int 6540static int
6523mailimap_msg_att_dynamic_parse(mailstream * fd, MMAPString * buffer, 6541mailimap_msg_att_dynamic_parse(mailstream * fd, MMAPString * buffer,
6524 size_t * index, 6542 size_t * index,
6525 struct mailimap_msg_att_dynamic ** result, 6543 struct mailimap_msg_att_dynamic ** result,
6526 size_t progr_rate, 6544 size_t progr_rate,
6527 progress_function * progr_fun) 6545 progress_function * progr_fun)
6528{ 6546{
6529 clist * list; 6547 clist * list;
6530 struct mailimap_msg_att_dynamic * msg_att_dyn; 6548 struct mailimap_msg_att_dynamic * msg_att_dyn;
6531 size_t cur_token; 6549 size_t cur_token;
6532 int r; 6550 int r;
6533 int res; 6551 int res;
6534 6552
6535 cur_token = * index; 6553 cur_token = * index;
6536 6554
6537 list = NULL; 6555 list = NULL;
6538 6556
6539 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, "FLAGS"); 6557 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, "FLAGS");
6540 if (r != MAILIMAP_NO_ERROR) { 6558 if (r != MAILIMAP_NO_ERROR) {
6541 res = r; 6559 res = r;
6542 goto err; 6560 goto err;
6543 } 6561 }
6544 6562
6545 r = mailimap_space_parse(fd, buffer, &cur_token); 6563 r = mailimap_space_parse(fd, buffer, &cur_token);
6546 if (r != MAILIMAP_NO_ERROR) { 6564 if (r != MAILIMAP_NO_ERROR) {
6547 res = r; 6565 res = r;
6548 goto err; 6566 goto err;
6549 } 6567 }
6550 6568
6551 r = mailimap_oparenth_parse(fd, buffer, &cur_token); 6569 r = mailimap_oparenth_parse(fd, buffer, &cur_token);
6552 if (r != MAILIMAP_NO_ERROR) { 6570 if (r != MAILIMAP_NO_ERROR) {
6553 res = r; 6571 res = r;
6554 goto err; 6572 goto err;
6555 } 6573 }
6556 6574
6557 r = mailimap_struct_spaced_list_parse(fd, buffer, &cur_token, 6575 r = mailimap_struct_spaced_list_parse(fd, buffer, &cur_token,
6558 &list, 6576 &list,
6559 (mailimap_struct_parser *) 6577 (mailimap_struct_parser *)
6560 mailimap_flag_fetch_parse, 6578 mailimap_flag_fetch_parse,
6561 (mailimap_struct_destructor *) 6579 (mailimap_struct_destructor *)
6562 mailimap_flag_fetch_free, 6580 mailimap_flag_fetch_free,
6563 progr_rate, progr_fun); 6581 progr_rate, progr_fun);
6564 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) { 6582 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) {
6565 res = r; 6583 res = r;
6566 goto err; 6584 goto err;
6567 } 6585 }
6568 6586
6569 r = mailimap_cparenth_parse(fd, buffer, &cur_token); 6587 r = mailimap_cparenth_parse(fd, buffer, &cur_token);
6570 if (r != MAILIMAP_NO_ERROR) { 6588 if (r != MAILIMAP_NO_ERROR) {
6571 res = r; 6589 res = r;
6572 goto free; 6590 goto free;
6573 } 6591 }
6574 6592
6575 msg_att_dyn = mailimap_msg_att_dynamic_new(list); 6593 msg_att_dyn = mailimap_msg_att_dynamic_new(list);
6576 if (msg_att_dyn == NULL) { 6594 if (msg_att_dyn == NULL) {
6577 res = MAILIMAP_ERROR_MEMORY; 6595 res = MAILIMAP_ERROR_MEMORY;
6578 goto free; 6596 goto free;
6579 } 6597 }
6580 6598
6581 * result = msg_att_dyn; 6599 * result = msg_att_dyn;
6582 * index = cur_token; 6600 * index = cur_token;
6583 6601
6584 return MAILIMAP_NO_ERROR; 6602 return MAILIMAP_NO_ERROR;
6585 6603
6586 free: 6604 free:
6587 if (list != NULL) { 6605 if (list != NULL) {
6588 clist_foreach(list, (clist_func) mailimap_flag_fetch_free, NULL); 6606 clist_foreach(list, (clist_func) mailimap_flag_fetch_free, NULL);
6589 clist_free(list); 6607 clist_free(list);
6590 } 6608 }
6591 err: 6609 err:
6592 return res; 6610 return res;
6593} 6611}
6594 6612
6595/* 6613/*
6596 msg-att-static = "ENVELOPE" SP envelope / "INTERNALDATE" SP date-time / 6614 msg-att-static = "ENVELOPE" SP envelope / "INTERNALDATE" SP date-time /
6597 "RFC822" [".HEADER" / ".TEXT"] SP nstring / 6615 "RFC822" [".HEADER" / ".TEXT"] SP nstring /
6598 "RFC822.SIZE" SP number / "BODY" ["STRUCTURE"] SP body / 6616 "RFC822.SIZE" SP number / "BODY" ["STRUCTURE"] SP body /
6599 "BODY" section ["<" number ">"] SP nstring / 6617 "BODY" section ["<" number ">"] SP nstring /
6600 "UID" SP uniqueid 6618 "UID" SP uniqueid
6601 ; MUST NOT change for a message 6619 ; MUST NOT change for a message
6602*/ 6620*/
6603 6621
6604/* 6622/*
6605 "ENVELOPE" SP envelope 6623 "ENVELOPE" SP envelope
6606*/ 6624*/
6607 6625
6608 6626
6609static int 6627static int
6610mailimap_msg_att_envelope_parse(mailstream * fd, 6628mailimap_msg_att_envelope_parse(mailstream * fd,
6611 MMAPString * buffer, 6629 MMAPString * buffer,
6612 size_t * index, 6630 size_t * index,
6613 struct mailimap_envelope ** result, 6631 struct mailimap_envelope ** result,
6614 size_t progr_rate, 6632 size_t progr_rate,
6615 progress_function * progr_fun) 6633 progress_function * progr_fun)
6616{ 6634{
6617 size_t cur_token; 6635 size_t cur_token;
6618 struct mailimap_envelope * env; 6636 struct mailimap_envelope * env;
6619 int r; 6637 int r;
6620 6638
6621 cur_token = * index; 6639 cur_token = * index;
6622 6640
6623 r = mailimap_token_case_insensitive_parse(fd, buffer, 6641 r = mailimap_token_case_insensitive_parse(fd, buffer,
6624 &cur_token, "ENVELOPE"); 6642 &cur_token, "ENVELOPE");
6625 if (r != MAILIMAP_NO_ERROR) 6643 if (r != MAILIMAP_NO_ERROR)
6626 return r; 6644 return r;
6627 6645
6628 r = mailimap_space_parse(fd, buffer, &cur_token); 6646 r = mailimap_space_parse(fd, buffer, &cur_token);
6629 if (r != MAILIMAP_NO_ERROR) 6647 if (r != MAILIMAP_NO_ERROR)
6630 return r; 6648 return r;
6631 6649
6632 r = mailimap_envelope_parse(fd, buffer, &cur_token, &env, 6650 r = mailimap_envelope_parse(fd, buffer, &cur_token, &env,
6633 progr_rate, progr_fun); 6651 progr_rate, progr_fun);
6634 if (r != MAILIMAP_NO_ERROR) 6652 if (r != MAILIMAP_NO_ERROR)
6635 return r; 6653 return r;
6636 6654
6637 * index = cur_token; 6655 * index = cur_token;
6638 * result = env; 6656 * result = env;
6639 6657
6640 return MAILIMAP_NO_ERROR; 6658 return MAILIMAP_NO_ERROR;
6641} 6659}
6642 6660
6643 6661
6644/* 6662/*
6645 "INTERNALDATE" SP date-time 6663 "INTERNALDATE" SP date-time
6646*/ 6664*/
6647 6665
6648 6666
6649static int 6667static int
6650mailimap_msg_att_internaldate_parse(mailstream * fd, MMAPString * buffer, 6668mailimap_msg_att_internaldate_parse(mailstream * fd, MMAPString * buffer,
6651 size_t * index, 6669 size_t * index,
6652 struct mailimap_date_time ** result, 6670 struct mailimap_date_time ** result,
6653 size_t progr_rate, 6671 size_t progr_rate,
6654 progress_function * progr_fun) 6672 progress_function * progr_fun)
6655{ 6673{
6656 size_t cur_token; 6674 size_t cur_token;
6657 struct mailimap_date_time * date_time; 6675 struct mailimap_date_time * date_time;
6658 int r; 6676 int r;
6659 6677
6660 cur_token = * index; 6678 cur_token = * index;
6661 6679
6662 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, 6680 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token,
6663 "INTERNALDATE"); 6681 "INTERNALDATE");
6664 if (r != MAILIMAP_NO_ERROR) 6682 if (r != MAILIMAP_NO_ERROR)
6665 return r; 6683 return r;
6666 6684
6667 r = mailimap_space_parse(fd, buffer, &cur_token); 6685 r = mailimap_space_parse(fd, buffer, &cur_token);
6668 if (r != MAILIMAP_NO_ERROR) 6686 if (r != MAILIMAP_NO_ERROR)
6669 return FALSE; 6687 return FALSE;
6670 6688
6671 r = mailimap_date_time_parse(fd, buffer, &cur_token, &date_time, 6689 r = mailimap_date_time_parse(fd, buffer, &cur_token, &date_time,
6672 progr_rate, progr_fun); 6690 progr_rate, progr_fun);
6673 if (r != MAILIMAP_NO_ERROR) 6691 if (r != MAILIMAP_NO_ERROR)
6674 return r; 6692 return r;
6675 6693
6676 * result = date_time; 6694 * result = date_time;
6677 * index = cur_token; 6695 * index = cur_token;
6678 6696
6679 return MAILIMAP_NO_ERROR; 6697 return MAILIMAP_NO_ERROR;
6680} 6698}
6681 6699
6682/* 6700/*
6683 "RFC822" SP nstring 6701 "RFC822" SP nstring
6684*/ 6702*/
6685 6703
6686static int 6704static int
6687mailimap_msg_att_rfc822_parse(mailstream * fd, MMAPString * buffer, 6705mailimap_msg_att_rfc822_parse(mailstream * fd, MMAPString * buffer,
6688 size_t * index, char ** result, 6706 size_t * index, char ** result,
6689 size_t * result_len, 6707 size_t * result_len,
6690 size_t progr_rate, 6708 size_t progr_rate,
6691 progress_function * progr_fun) 6709 progress_function * progr_fun)
6692{ 6710{
6693 size_t cur_token; 6711 size_t cur_token;
6694 char * rfc822_message; 6712 char * rfc822_message;
6695 int r; 6713 int r;
6696 size_t length; 6714 size_t length;
6697 6715
6698 cur_token = * index; 6716 cur_token = * index;
6699 6717
6700 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, 6718 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token,
6701 "RFC822"); 6719 "RFC822");
6702 if (r != MAILIMAP_NO_ERROR) 6720 if (r != MAILIMAP_NO_ERROR)
6703 return r; 6721 return r;
6704 6722
6705 r = mailimap_space_parse(fd, buffer, &cur_token); 6723 r = mailimap_space_parse(fd, buffer, &cur_token);
6706 if (r != MAILIMAP_NO_ERROR) 6724 if (r != MAILIMAP_NO_ERROR)
6707 return r; 6725 return r;
6708 6726
6709 r = mailimap_nstring_parse(fd, buffer, &cur_token, &rfc822_message, &length, 6727 r = mailimap_nstring_parse(fd, buffer, &cur_token, &rfc822_message, &length,
6710 progr_rate, progr_fun); 6728 progr_rate, progr_fun);
6711 if (r != MAILIMAP_NO_ERROR) 6729 if (r != MAILIMAP_NO_ERROR)
6712 return r; 6730 return r;
6713 6731
6714 * result = rfc822_message; 6732 * result = rfc822_message;
6715 if (result_len != NULL) 6733 if (result_len != NULL)
6716 * result_len = length; 6734 * result_len = length;
6717 * index = cur_token; 6735 * index = cur_token;
6718 6736
6719 return MAILIMAP_NO_ERROR; 6737 return MAILIMAP_NO_ERROR;
6720} 6738}
6721 6739
6722/* 6740/*
6723 "RFC822" ".HEADER" SP nstring 6741 "RFC822" ".HEADER" SP nstring
6724*/ 6742*/
6725 6743
6726static int 6744static int
6727mailimap_msg_att_rfc822_header_parse(mailstream * fd, MMAPString * buffer, 6745mailimap_msg_att_rfc822_header_parse(mailstream * fd, MMAPString * buffer,
6728 size_t * index, char ** result, 6746 size_t * index, char ** result,
6729 size_t * result_len, 6747 size_t * result_len,
6730 size_t progr_rate, 6748 size_t progr_rate,
6731 progress_function * progr_fun) 6749 progress_function * progr_fun)
6732{ 6750{
6733 size_t cur_token; 6751 size_t cur_token;
6734 char * rfc822_header; 6752 char * rfc822_header;
6735 int r; 6753 int r;
6736 size_t length; 6754 size_t length;
6737 6755
6738 cur_token = * index; 6756 cur_token = * index;
6739 6757
6740 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, 6758 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token,
6741 "RFC822"); 6759 "RFC822");
6742 if (r != MAILIMAP_NO_ERROR) 6760 if (r != MAILIMAP_NO_ERROR)
6743 return r; 6761 return r;
6744 6762
6745 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, 6763 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token,
6746 ".HEADER"); 6764 ".HEADER");
6747 if (r != MAILIMAP_NO_ERROR) 6765 if (r != MAILIMAP_NO_ERROR)
6748 return r; 6766 return r;
6749 6767
6750 r = mailimap_space_parse(fd, buffer, &cur_token); 6768 r = mailimap_space_parse(fd, buffer, &cur_token);
6751 if (r != MAILIMAP_NO_ERROR) 6769 if (r != MAILIMAP_NO_ERROR)
6752 return r; 6770 return r;
6753 6771
6754 r = mailimap_nstring_parse(fd, buffer, &cur_token, &rfc822_header, &length, 6772 r = mailimap_nstring_parse(fd, buffer, &cur_token, &rfc822_header, &length,
6755 progr_rate, progr_fun); 6773 progr_rate, progr_fun);
6756 if (r != MAILIMAP_NO_ERROR) 6774 if (r != MAILIMAP_NO_ERROR)
6757 return r; 6775 return r;
6758 6776
6759 * result = rfc822_header; 6777 * result = rfc822_header;
6760 if (result_len != NULL) 6778 if (result_len != NULL)
6761 * result_len = length; 6779 * result_len = length;
6762 * index = cur_token; 6780 * index = cur_token;
6763 6781
6764 return MAILIMAP_NO_ERROR; 6782 return MAILIMAP_NO_ERROR;
6765} 6783}
6766 6784
6767/* 6785/*
6768 "RFC822" ".TEXT" SP nstring 6786 "RFC822" ".TEXT" SP nstring
6769*/ 6787*/
6770 6788
6771static int 6789static int
6772mailimap_msg_att_rfc822_text_parse(mailstream * fd, MMAPString * buffer, 6790mailimap_msg_att_rfc822_text_parse(mailstream * fd, MMAPString * buffer,
6773 size_t * index, char ** result, 6791 size_t * index, char ** result,
6774 size_t * result_len, 6792 size_t * result_len,
6775 size_t progr_rate, 6793 size_t progr_rate,
6776 progress_function * progr_fun) 6794 progress_function * progr_fun)
6777{ 6795{
6778 size_t cur_token; 6796 size_t cur_token;
6779 char * rfc822_text; 6797 char * rfc822_text;
6780 int r; 6798 int r;
6781 size_t length; 6799 size_t length;
6782 6800
6783 cur_token = * index; 6801 cur_token = * index;
6784 6802
6785 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, 6803 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token,
6786 "RFC822"); 6804 "RFC822");
6787 if (r != MAILIMAP_NO_ERROR) 6805 if (r != MAILIMAP_NO_ERROR)
6788 return r; 6806 return r;
6789 6807
6790 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, 6808 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token,
6791 ".TEXT"); 6809 ".TEXT");
6792 if (r != MAILIMAP_NO_ERROR) 6810 if (r != MAILIMAP_NO_ERROR)
6793 return r; 6811 return r;
6794 6812
6795 r = mailimap_space_parse(fd, buffer, &cur_token); 6813 r = mailimap_space_parse(fd, buffer, &cur_token);
6796 if (r != MAILIMAP_NO_ERROR) 6814 if (r != MAILIMAP_NO_ERROR)
6797 return r; 6815 return r;
6798 6816
6799 r = mailimap_nstring_parse(fd, buffer, &cur_token, &rfc822_text, &length, 6817 r = mailimap_nstring_parse(fd, buffer, &cur_token, &rfc822_text, &length,
6800 progr_rate, progr_fun); 6818 progr_rate, progr_fun);
6801 if (r != MAILIMAP_NO_ERROR) 6819 if (r != MAILIMAP_NO_ERROR)
6802 return r; 6820 return r;
6803 6821
6804 * result = rfc822_text; 6822 * result = rfc822_text;
6805 if (result_len != NULL) 6823 if (result_len != NULL)
6806 * result_len = length; 6824 * result_len = length;
6807 * index = cur_token; 6825 * index = cur_token;
6808 6826
6809 return MAILIMAP_NO_ERROR; 6827 return MAILIMAP_NO_ERROR;
6810} 6828}
6811 6829
6812/* 6830/*
6813 "RFC822.SIZE" SP number 6831 "RFC822.SIZE" SP number
6814*/ 6832*/
6815 6833
6816static int 6834static int
6817mailimap_msg_att_rfc822_size_parse(mailstream * fd, MMAPString * buffer, 6835mailimap_msg_att_rfc822_size_parse(mailstream * fd, MMAPString * buffer,
6818 size_t * index, uint32_t * result) 6836 size_t * index, uint32_t * result)
6819{ 6837{
6820 size_t cur_token; 6838 size_t cur_token;
6821 uint32_t number; 6839 uint32_t number;
6822 int r; 6840 int r;
6823 6841
6824 cur_token = * index; 6842 cur_token = * index;
6825 6843
6826 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, 6844 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token,
6827 "RFC822.SIZE"); 6845 "RFC822.SIZE");
6828 if (r != MAILIMAP_NO_ERROR) 6846 if (r != MAILIMAP_NO_ERROR)
6829 return r; 6847 return r;
6830 6848
6831 r = mailimap_space_parse(fd, buffer, &cur_token); 6849 r = mailimap_space_parse(fd, buffer, &cur_token);
6832 if (r != MAILIMAP_NO_ERROR) 6850 if (r != MAILIMAP_NO_ERROR)
6833 return r; 6851 return r;
6834 6852
6835 r = mailimap_number_parse(fd, buffer, &cur_token, &number); 6853 r = mailimap_number_parse(fd, buffer, &cur_token, &number);
6836 if (r != MAILIMAP_NO_ERROR) 6854 if (r != MAILIMAP_NO_ERROR)
6837 return r; 6855 return r;
6838 6856
6839 * result = number; 6857 * result = number;
6840 * index = cur_token; 6858 * index = cur_token;
6841 6859
6842 return MAILIMAP_NO_ERROR; 6860 return MAILIMAP_NO_ERROR;
6843} 6861}
6844 6862
6845/* 6863/*
6846 "BODY" SP body 6864 "BODY" SP body
6847*/ 6865*/
6848 6866
6849 6867
6850static int 6868static int
6851mailimap_msg_att_body_parse(mailstream * fd, MMAPString * buffer, 6869mailimap_msg_att_body_parse(mailstream * fd, MMAPString * buffer,
6852 size_t * index, struct mailimap_body ** result, 6870 size_t * index, struct mailimap_body ** result,
6853 size_t progr_rate, 6871 size_t progr_rate,
6854 progress_function * progr_fun) 6872 progress_function * progr_fun)
6855{ 6873{
6856 struct mailimap_body * body; 6874 struct mailimap_body * body;
6857 size_t cur_token; 6875 size_t cur_token;
6858 int r; 6876 int r;
6859 6877
6860 cur_token = * index; 6878 cur_token = * index;
6861 6879
6862 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, 6880 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token,
6863 "BODY"); 6881 "BODY");
6864 if (r != MAILIMAP_NO_ERROR) 6882 if (r != MAILIMAP_NO_ERROR)
6865 return r; 6883 return r;
6866 6884
6867 r = mailimap_space_parse(fd, buffer, &cur_token); 6885 r = mailimap_space_parse(fd, buffer, &cur_token);
6868 if (r != MAILIMAP_NO_ERROR) 6886 if (r != MAILIMAP_NO_ERROR)
6869 return r; 6887 return r;
6870 6888
6871 r = mailimap_body_parse(fd, buffer, &cur_token, &body, 6889 r = mailimap_body_parse(fd, buffer, &cur_token, &body,
6872 progr_rate, progr_fun); 6890 progr_rate, progr_fun);
6873 if (r != MAILIMAP_NO_ERROR) 6891 if (r != MAILIMAP_NO_ERROR)
6874 return r; 6892 return r;
6875 6893
6876 * result = body; 6894 * result = body;
6877 * index = cur_token; 6895 * index = cur_token;
6878 6896
6879 return MAILIMAP_NO_ERROR; 6897 return MAILIMAP_NO_ERROR;
6880} 6898}
6881 6899
6882/* 6900/*
6883 "BODY" "STRUCTURE" SP body 6901 "BODY" "STRUCTURE" SP body
6884*/ 6902*/
6885 6903
6886 6904
6887static int 6905static int
6888mailimap_msg_att_bodystructure_parse(mailstream * fd, MMAPString * buffer, 6906mailimap_msg_att_bodystructure_parse(mailstream * fd, MMAPString * buffer,
6889 size_t * index, 6907 size_t * index,
6890 struct mailimap_body ** result, 6908 struct mailimap_body ** result,
6891 size_t progr_rate, 6909 size_t progr_rate,
6892 progress_function * progr_fun) 6910 progress_function * progr_fun)
6893{ 6911{
6894 struct mailimap_body * body; 6912 struct mailimap_body * body;
6895 size_t cur_token; 6913 size_t cur_token;
6896 int r; 6914 int r;
6897 6915
6898 cur_token = * index; 6916 cur_token = * index;
6899 6917
6900 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, 6918 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token,
6901 "BODY"); 6919 "BODY");
6902 if (r != MAILIMAP_NO_ERROR) 6920 if (r != MAILIMAP_NO_ERROR)
6903 return r; 6921 return r;
6904 6922
6905 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, 6923 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token,
6906 "STRUCTURE"); 6924 "STRUCTURE");
6907 if (r != MAILIMAP_NO_ERROR) 6925 if (r != MAILIMAP_NO_ERROR)
6908 return r; 6926 return r;
6909 6927
6910 r = mailimap_space_parse(fd, buffer, &cur_token); 6928 r = mailimap_space_parse(fd, buffer, &cur_token);
6911 if (r != MAILIMAP_NO_ERROR) 6929 if (r != MAILIMAP_NO_ERROR)
6912 return r; 6930 return r;
6913 6931
6914 r = mailimap_body_parse(fd, buffer, &cur_token, &body, 6932 r = mailimap_body_parse(fd, buffer, &cur_token, &body,
6915 progr_rate, progr_fun); 6933 progr_rate, progr_fun);
6916 if (r != MAILIMAP_NO_ERROR) 6934 if (r != MAILIMAP_NO_ERROR)
6917 return r; 6935 return r;
6918 6936
6919 * result = body; 6937 * result = body;
6920 * index = cur_token; 6938 * index = cur_token;
6921 6939
6922 return MAILIMAP_NO_ERROR; 6940 return MAILIMAP_NO_ERROR;
6923} 6941}
6924 6942
6925/* 6943/*
6926 "BODY" section ["<" number ">"] SP nstring 6944 "BODY" section ["<" number ">"] SP nstring
6927*/ 6945*/
6928 6946
6929static int 6947static int
6930mailimap_msg_att_body_section_parse(mailstream * fd, MMAPString * buffer, 6948mailimap_msg_att_body_section_parse(mailstream * fd, MMAPString * buffer,
6931 size_t * index, 6949 size_t * index,
6932 struct mailimap_msg_att_body_section ** 6950 struct mailimap_msg_att_body_section **
6933 result, 6951 result,
6934 size_t progr_rate, 6952 size_t progr_rate,
6935 progress_function * progr_fun) 6953 progress_function * progr_fun)
6936{ 6954{
6937 size_t cur_token; 6955 size_t cur_token;
6938 uint32_t number; 6956 uint32_t number;
6939 struct mailimap_section * section; 6957 struct mailimap_section * section;
6940 char * body_part; 6958 char * body_part;
6941 struct mailimap_msg_att_body_section * msg_att_body_section; 6959 struct mailimap_msg_att_body_section * msg_att_body_section;
6942 int r; 6960 int r;
6943 int res; 6961 int res;
6944 size_t length; 6962 size_t length;
6945 6963
6946 cur_token = * index; 6964 cur_token = * index;
6947 6965
6948 section = NULL; 6966 section = NULL;
6949 number = 0; 6967 number = 0;
6950 body_part = NULL; 6968 body_part = NULL;
6951 6969
6952 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, 6970 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token,
6953 "BODY"); 6971 "BODY");
6954 if (r != MAILIMAP_NO_ERROR) { 6972 if (r != MAILIMAP_NO_ERROR) {
6955 res = r; 6973 res = r;
6956 goto err; 6974 goto err;
6957 } 6975 }
6958 6976
6959 r = mailimap_section_parse(fd, buffer, &cur_token, &section, 6977 r = mailimap_section_parse(fd, buffer, &cur_token, &section,
6960 progr_rate, progr_fun); 6978 progr_rate, progr_fun);
6961 if (r != MAILIMAP_NO_ERROR) { 6979 if (r != MAILIMAP_NO_ERROR) {
6962 res = r; 6980 res = r;
6963 goto err; 6981 goto err;
6964 } 6982 }
6965 6983
6966 r = mailimap_lower_parse(fd, buffer, &cur_token); 6984 r = mailimap_lower_parse(fd, buffer, &cur_token);
6967 switch (r) { 6985 switch (r) {
6968 case MAILIMAP_NO_ERROR: 6986 case MAILIMAP_NO_ERROR:
6969 r = mailimap_number_parse(fd, buffer, &cur_token, &number); 6987 r = mailimap_number_parse(fd, buffer, &cur_token, &number);
6970 if (r != MAILIMAP_NO_ERROR) { 6988 if (r != MAILIMAP_NO_ERROR) {
6971 res = r; 6989 res = r;
6972 goto free_section; 6990 goto free_section;
6973 } 6991 }
6974 6992
6975 r = mailimap_greater_parse(fd, buffer, &cur_token); 6993 r = mailimap_greater_parse(fd, buffer, &cur_token);
6976 if (r != MAILIMAP_NO_ERROR) { 6994 if (r != MAILIMAP_NO_ERROR) {
6977 res = r; 6995 res = r;
6978 goto free_section; 6996 goto free_section;
6979 } 6997 }
6980 break; 6998 break;
6981 6999
6982 case MAILIMAP_ERROR_PARSE: 7000 case MAILIMAP_ERROR_PARSE:
6983 break; 7001 break;
6984 7002
6985 default: 7003 default:
6986 return r; 7004 return r;
6987 } 7005 }
6988 7006
6989 r = mailimap_space_parse(fd, buffer, &cur_token); 7007 r = mailimap_space_parse(fd, buffer, &cur_token);
6990 if (r != MAILIMAP_NO_ERROR) { 7008 if (r != MAILIMAP_NO_ERROR) {
6991 res = r; 7009 res = r;
6992 goto free_section; 7010 goto free_section;
6993 } 7011 }
6994 7012
6995 r = mailimap_nstring_parse(fd, buffer, &cur_token, &body_part, &length, 7013 r = mailimap_nstring_parse(fd, buffer, &cur_token, &body_part, &length,
6996 progr_rate, progr_fun); 7014 progr_rate, progr_fun);
6997 if (r != MAILIMAP_NO_ERROR) { 7015 if (r != MAILIMAP_NO_ERROR) {
6998 res = r; 7016 res = r;
6999 goto free_section; 7017 goto free_section;
7000 } 7018 }
7001 7019
7002 msg_att_body_section = 7020 msg_att_body_section =
7003 mailimap_msg_att_body_section_new(section, number, body_part, length); 7021 mailimap_msg_att_body_section_new(section, number, body_part, length);
7004 if (msg_att_body_section == NULL) { 7022 if (msg_att_body_section == NULL) {
7005 res = MAILIMAP_ERROR_MEMORY; 7023 res = MAILIMAP_ERROR_MEMORY;
7006 goto free_string; 7024 goto free_string;
7007 } 7025 }
7008 7026
7009 * result = msg_att_body_section; 7027 * result = msg_att_body_section;
7010 * index = cur_token; 7028 * index = cur_token;
7011 7029
7012 return MAILIMAP_NO_ERROR; 7030 return MAILIMAP_NO_ERROR;
7013 7031
7014 free_string: 7032 free_string:
7015 mailimap_nstring_free(body_part); 7033 mailimap_nstring_free(body_part);
7016 free_section: 7034 free_section:
7017 if (section != NULL) 7035 if (section != NULL)
7018 mailimap_section_free(section); 7036 mailimap_section_free(section);
7019 err: 7037 err:
7020 return res; 7038 return res;
7021} 7039}
7022 7040
7023/* 7041/*
7024 "UID" SP uniqueid 7042 "UID" SP uniqueid
7025*/ 7043*/
7026 7044
7027static int 7045static int
7028mailimap_msg_att_uid_parse(mailstream * fd, MMAPString * buffer, 7046mailimap_msg_att_uid_parse(mailstream * fd, MMAPString * buffer,
7029 size_t * index, 7047 size_t * index,
7030 uint32_t * result) 7048 uint32_t * result)
7031{ 7049{
7032 size_t cur_token; 7050 size_t cur_token;
7033 uint32_t uid; 7051 uint32_t uid;
7034 int r; 7052 int r;
7035 7053
7036 cur_token = * index; 7054 cur_token = * index;
7037 7055
7038 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, "UID"); 7056 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, "UID");
7039 if (r != MAILIMAP_NO_ERROR) 7057 if (r != MAILIMAP_NO_ERROR)
7040 return r; 7058 return r;
7041 7059
7042 r = mailimap_space_parse(fd, buffer, &cur_token); 7060 r = mailimap_space_parse(fd, buffer, &cur_token);
7043 if (r != MAILIMAP_NO_ERROR) 7061 if (r != MAILIMAP_NO_ERROR)
7044 return r; 7062 return r;
7045 7063
7046 r = mailimap_uniqueid_parse(fd, buffer, &cur_token, &uid); 7064 r = mailimap_uniqueid_parse(fd, buffer, &cur_token, &uid);
7047 if (r != MAILIMAP_NO_ERROR) 7065 if (r != MAILIMAP_NO_ERROR)
7048 return r; 7066 return r;
7049 7067
7050 * index = cur_token; 7068 * index = cur_token;
7051 * result = uid; 7069 * result = uid;
7052 7070
7053 return MAILIMAP_NO_ERROR; 7071 return MAILIMAP_NO_ERROR;
7054} 7072}
7055 7073
7056/* 7074/*
7057 msg-att-static = "ENVELOPE" SP envelope / "INTERNALDATE" SP date-time / 7075 msg-att-static = "ENVELOPE" SP envelope / "INTERNALDATE" SP date-time /
7058 "RFC822" [".HEADER" / ".TEXT"] SP nstring / 7076 "RFC822" [".HEADER" / ".TEXT"] SP nstring /
7059 "RFC822.SIZE" SP number / "BODY" ["STRUCTURE"] SP body / 7077 "RFC822.SIZE" SP number / "BODY" ["STRUCTURE"] SP body /
7060 "BODY" section ["<" number ">"] SP nstring / 7078 "BODY" section ["<" number ">"] SP nstring /
7061 "UID" SP uniqueid 7079 "UID" SP uniqueid
7062 ; MUST NOT change for a message 7080 ; MUST NOT change for a message
7063*/ 7081*/
7064 7082
7065static int 7083static int
7066mailimap_msg_att_static_parse(mailstream * fd, MMAPString * buffer, 7084mailimap_msg_att_static_parse(mailstream * fd, MMAPString * buffer,
7067 size_t * index, 7085 size_t * index,
7068 struct mailimap_msg_att_static ** result, 7086 struct mailimap_msg_att_static ** result,
7069 size_t progr_rate, 7087 size_t progr_rate,
7070 progress_function * progr_fun) 7088 progress_function * progr_fun)
7071{ 7089{
7072 size_t cur_token; 7090 size_t cur_token;
7073 struct mailimap_envelope * env; 7091 struct mailimap_envelope * env;
7074 struct mailimap_date_time * internal_date; 7092 struct mailimap_date_time * internal_date;
7075 char * rfc822; 7093 char * rfc822;
7076 char * rfc822_header; 7094 char * rfc822_header;
7077 char * rfc822_text; 7095 char * rfc822_text;
7078 uint32_t rfc822_size; 7096 uint32_t rfc822_size;
7079 struct mailimap_body * bodystructure; 7097 struct mailimap_body * bodystructure;
7080 struct mailimap_body * body; 7098 struct mailimap_body * body;
7081 struct mailimap_msg_att_body_section * body_section; 7099 struct mailimap_msg_att_body_section * body_section;
7082 uint32_t uid; 7100 uint32_t uid;
7083 struct mailimap_msg_att_static * msg_att_static; 7101 struct mailimap_msg_att_static * msg_att_static;
7084 int type; 7102 int type;
7085 int r; 7103 int r;
7086 int res; 7104 int res;
7087 size_t length; 7105 size_t length;
7088 7106
7089 cur_token = * index; 7107 cur_token = * index;
7090 7108
7091 env = NULL; 7109 env = NULL;
7092 internal_date = NULL; 7110 internal_date = NULL;
7093 rfc822 = NULL; 7111 rfc822 = NULL;
7094 rfc822_header = NULL; 7112 rfc822_header = NULL;
7095 rfc822_text = NULL; 7113 rfc822_text = NULL;
7096 rfc822_size = 0; 7114 rfc822_size = 0;
7097 length = 0; 7115 length = 0;
7098 bodystructure = NULL; 7116 bodystructure = NULL;
7099 body = NULL; 7117 body = NULL;
7100 body_section = NULL; 7118 body_section = NULL;
7101 uid = 0; 7119 uid = 0;
7102 7120
7103 type = MAILIMAP_MSG_ATT_ERROR; /* XXX - removes a gcc warning */ 7121 type = MAILIMAP_MSG_ATT_ERROR; /* XXX - removes a gcc warning */
7104 7122
7105 r = mailimap_msg_att_envelope_parse(fd, buffer, &cur_token, &env, 7123 r = mailimap_msg_att_envelope_parse(fd, buffer, &cur_token, &env,
7106 progr_rate, progr_fun); 7124 progr_rate, progr_fun);
7107 if (r == MAILIMAP_NO_ERROR) 7125 if (r == MAILIMAP_NO_ERROR)
7108 type = MAILIMAP_MSG_ATT_ENVELOPE; 7126 type = MAILIMAP_MSG_ATT_ENVELOPE;
7109 7127
7110 if (r == MAILIMAP_ERROR_PARSE) { 7128 if (r == MAILIMAP_ERROR_PARSE) {
7111 r = mailimap_msg_att_internaldate_parse(fd, buffer, &cur_token, 7129 r = mailimap_msg_att_internaldate_parse(fd, buffer, &cur_token,
7112 &internal_date, 7130 &internal_date,
7113 progr_rate, progr_fun); 7131 progr_rate, progr_fun);
7114 if (r == MAILIMAP_NO_ERROR) 7132 if (r == MAILIMAP_NO_ERROR)
7115 type = MAILIMAP_MSG_ATT_INTERNALDATE; 7133 type = MAILIMAP_MSG_ATT_INTERNALDATE;
7116 } 7134 }
7117 7135
7118 if (r == MAILIMAP_ERROR_PARSE) { 7136 if (r == MAILIMAP_ERROR_PARSE) {
7119 r = mailimap_msg_att_rfc822_parse(fd, buffer, &cur_token, 7137 r = mailimap_msg_att_rfc822_parse(fd, buffer, &cur_token,
7120 &rfc822, &length, 7138 &rfc822, &length,
7121 progr_rate, progr_fun); 7139 progr_rate, progr_fun);
7122 if (r == MAILIMAP_NO_ERROR) 7140 if (r == MAILIMAP_NO_ERROR)
7123 type = MAILIMAP_MSG_ATT_RFC822; 7141 type = MAILIMAP_MSG_ATT_RFC822;
7124 } 7142 }
7125 7143
7126 if (r == MAILIMAP_ERROR_PARSE) { 7144 if (r == MAILIMAP_ERROR_PARSE) {
7127 r = mailimap_msg_att_rfc822_header_parse(fd, buffer, &cur_token, 7145 r = mailimap_msg_att_rfc822_header_parse(fd, buffer, &cur_token,
7128 &rfc822_header, &length, 7146 &rfc822_header, &length,
7129 progr_rate, progr_fun); 7147 progr_rate, progr_fun);
7130 type = MAILIMAP_MSG_ATT_RFC822_HEADER; 7148 type = MAILIMAP_MSG_ATT_RFC822_HEADER;
7131 } 7149 }
7132 7150
7133 if (r == MAILIMAP_ERROR_PARSE) { 7151 if (r == MAILIMAP_ERROR_PARSE) {
7134 r = mailimap_msg_att_rfc822_text_parse(fd, buffer, &cur_token, 7152 r = mailimap_msg_att_rfc822_text_parse(fd, buffer, &cur_token,
7135 &rfc822_text, &length, 7153 &rfc822_text, &length,
7136 progr_rate, progr_fun); 7154 progr_rate, progr_fun);
7137 if (r == MAILIMAP_NO_ERROR) 7155 if (r == MAILIMAP_NO_ERROR)
7138 type = MAILIMAP_MSG_ATT_RFC822_TEXT; 7156 type = MAILIMAP_MSG_ATT_RFC822_TEXT;
7139 } 7157 }
7140 7158
7141 if (r == MAILIMAP_ERROR_PARSE) { 7159 if (r == MAILIMAP_ERROR_PARSE) {
7142 r = mailimap_msg_att_rfc822_size_parse(fd, buffer, &cur_token, 7160 r = mailimap_msg_att_rfc822_size_parse(fd, buffer, &cur_token,
7143 &rfc822_size); 7161 &rfc822_size);
7144 if (r == MAILIMAP_NO_ERROR) 7162 if (r == MAILIMAP_NO_ERROR)
7145 type = MAILIMAP_MSG_ATT_RFC822_SIZE; 7163 type = MAILIMAP_MSG_ATT_RFC822_SIZE;
7146 } 7164 }
7147 7165
7148 if (r == MAILIMAP_ERROR_PARSE) { 7166 if (r == MAILIMAP_ERROR_PARSE) {
7149 r = mailimap_msg_att_body_parse(fd, buffer, &cur_token, 7167 r = mailimap_msg_att_body_parse(fd, buffer, &cur_token,
7150 &body, progr_rate, progr_fun); 7168 &body, progr_rate, progr_fun);
7151 if (r == MAILIMAP_NO_ERROR) 7169 if (r == MAILIMAP_NO_ERROR)
7152 type = MAILIMAP_MSG_ATT_BODY; 7170 type = MAILIMAP_MSG_ATT_BODY;
7153 } 7171 }
7154 7172
7155 if (r == MAILIMAP_ERROR_PARSE) { 7173 if (r == MAILIMAP_ERROR_PARSE) {
7156 r = mailimap_msg_att_bodystructure_parse(fd, buffer, &cur_token, 7174 r = mailimap_msg_att_bodystructure_parse(fd, buffer, &cur_token,
7157 &bodystructure, 7175 &bodystructure,
7158 progr_rate, progr_fun); 7176 progr_rate, progr_fun);
7159 if (r == MAILIMAP_NO_ERROR) 7177 if (r == MAILIMAP_NO_ERROR)
7160 type = MAILIMAP_MSG_ATT_BODYSTRUCTURE; 7178 type = MAILIMAP_MSG_ATT_BODYSTRUCTURE;
7161 } 7179 }
7162 7180
7163 if (r == MAILIMAP_ERROR_PARSE) { 7181 if (r == MAILIMAP_ERROR_PARSE) {
7164 r = mailimap_msg_att_body_section_parse(fd, buffer, &cur_token, 7182 r = mailimap_msg_att_body_section_parse(fd, buffer, &cur_token,
7165 &body_section, 7183 &body_section,
7166 progr_rate, progr_fun); 7184 progr_rate, progr_fun);
7167 if (r == MAILIMAP_NO_ERROR) 7185 if (r == MAILIMAP_NO_ERROR)
7168 type = MAILIMAP_MSG_ATT_BODY_SECTION; 7186 type = MAILIMAP_MSG_ATT_BODY_SECTION;
7169 } 7187 }
7170 7188
7171 if (r == MAILIMAP_ERROR_PARSE) { 7189 if (r == MAILIMAP_ERROR_PARSE) {
7172 r = mailimap_msg_att_uid_parse(fd, buffer, &cur_token, 7190 r = mailimap_msg_att_uid_parse(fd, buffer, &cur_token,
7173 &uid); 7191 &uid);
7174 if (r == MAILIMAP_NO_ERROR) 7192 if (r == MAILIMAP_NO_ERROR)
7175 type = MAILIMAP_MSG_ATT_UID; 7193 type = MAILIMAP_MSG_ATT_UID;
7176 } 7194 }
7177 7195
7178 if (r != MAILIMAP_NO_ERROR) { 7196 if (r != MAILIMAP_NO_ERROR) {
7179 res = r; 7197 res = r;
7180 goto err; 7198 goto err;
7181 } 7199 }
7182 7200
7183 msg_att_static = mailimap_msg_att_static_new(type, env, internal_date, 7201 msg_att_static = mailimap_msg_att_static_new(type, env, internal_date,
7184 rfc822, rfc822_header, 7202 rfc822, rfc822_header,
7185 rfc822_text, length, 7203 rfc822_text, length,
7186 rfc822_size, bodystructure, 7204 rfc822_size, bodystructure,
7187 body, body_section, uid); 7205 body, body_section, uid);
7188 if (msg_att_static == NULL) { 7206 if (msg_att_static == NULL) {
7189 res = MAILIMAP_ERROR_MEMORY; 7207 res = MAILIMAP_ERROR_MEMORY;
7190 goto free; 7208 goto free;
7191 } 7209 }
7192 7210
7193 * result = msg_att_static; 7211 * result = msg_att_static;
7194 * index = cur_token; 7212 * index = cur_token;
7195 7213
7196 return MAILIMAP_NO_ERROR; 7214 return MAILIMAP_NO_ERROR;
7197 7215
7198 free: 7216 free:
7199 if (env) 7217 if (env)
7200 mailimap_msg_att_envelope_free(env); 7218 mailimap_msg_att_envelope_free(env);
7201 if (internal_date) 7219 if (internal_date)
7202 mailimap_msg_att_internaldate_free(internal_date); 7220 mailimap_msg_att_internaldate_free(internal_date);
7203 if (rfc822) 7221 if (rfc822)
7204 mailimap_msg_att_rfc822_free(rfc822); 7222 mailimap_msg_att_rfc822_free(rfc822);
7205 if (rfc822_header) 7223 if (rfc822_header)
7206 mailimap_msg_att_rfc822_header_free(rfc822_header); 7224 mailimap_msg_att_rfc822_header_free(rfc822_header);
7207 if (rfc822_text) 7225 if (rfc822_text)
7208 mailimap_msg_att_rfc822_text_free(rfc822_text); 7226 mailimap_msg_att_rfc822_text_free(rfc822_text);
7209 if (bodystructure) 7227 if (bodystructure)
7210 mailimap_msg_att_bodystructure_free(bodystructure); 7228 mailimap_msg_att_bodystructure_free(bodystructure);
7211 if (body) 7229 if (body)
7212 mailimap_msg_att_body_free(body); 7230 mailimap_msg_att_body_free(body);
7213 if (body_section) 7231 if (body_section)
7214 mailimap_msg_att_body_section_free(body_section); 7232 mailimap_msg_att_body_section_free(body_section);
7215 err: 7233 err:
7216 return res; 7234 return res;
7217} 7235}
7218 7236
7219 7237
7220/* 7238/*
7221 nil = "NIL" 7239 nil = "NIL"
7222*/ 7240*/
7223 7241
7224static int mailimap_nil_parse(mailstream * fd, MMAPString * buffer, 7242static int mailimap_nil_parse(mailstream * fd, MMAPString * buffer,
7225 size_t * index) 7243 size_t * index)
7226{ 7244{
7227 return mailimap_token_case_insensitive_parse(fd, buffer, index, "NIL"); 7245 return mailimap_token_case_insensitive_parse(fd, buffer, index, "NIL");
7228} 7246}
7229 7247
7230/* 7248/*
7231 nstring = string / nil 7249 nstring = string / nil
7232*/ 7250*/
7233 7251
7234 7252
7235static int mailimap_nstring_parse(mailstream * fd, MMAPString * buffer, 7253static int mailimap_nstring_parse(mailstream * fd, MMAPString * buffer,
7236 size_t * index, char ** result, 7254 size_t * index, char ** result,
7237 size_t * result_len, 7255 size_t * result_len,
7238 size_t progr_rate, 7256 size_t progr_rate,
7239 progress_function * progr_fun) 7257 progress_function * progr_fun)
7240{ 7258{
7241 int r; 7259 int r;
7242 7260
7243 r = mailimap_string_parse(fd, buffer, index, result, result_len, 7261 r = mailimap_string_parse(fd, buffer, index, result, result_len,
7244 progr_rate, progr_fun); 7262 progr_rate, progr_fun);
7245 switch (r) { 7263 switch (r) {
7246 case MAILIMAP_NO_ERROR: 7264 case MAILIMAP_NO_ERROR:
7247 return MAILIMAP_NO_ERROR; 7265 return MAILIMAP_NO_ERROR;
7248 7266
7249 case MAILIMAP_ERROR_PARSE: 7267 case MAILIMAP_ERROR_PARSE:
7250 r = mailimap_nil_parse(fd, buffer, index); 7268 r = mailimap_nil_parse(fd, buffer, index);
7251 if (r != MAILIMAP_NO_ERROR) { 7269 if (r != MAILIMAP_NO_ERROR) {
7252 return r; 7270 return r;
7253 } 7271 }
7254 7272
7255 * result = NULL; 7273 * result = NULL;
7256 if (result_len != NULL) 7274 if (result_len != NULL)
7257 * result_len = 0; 7275 * result_len = 0;
7258 return MAILIMAP_NO_ERROR; 7276 return MAILIMAP_NO_ERROR;
7259 7277
7260 default: 7278 default:
7261 return r; 7279 return r;
7262 } 7280 }
7263} 7281}
7264 7282
7265/* 7283/*
7266 number = 1*DIGIT 7284 number = 1*DIGIT
7267 ; Unsigned 32-bit integer 7285 ; Unsigned 32-bit integer
7268 ; (0 <= n < 4,294,967,296) 7286 ; (0 <= n < 4,294,967,296)
7269*/ 7287*/
7270 7288
7271static int 7289static int
7272mailimap_number_parse(mailstream * fd, MMAPString * buffer, 7290mailimap_number_parse(mailstream * fd, MMAPString * buffer,
7273 size_t * index, uint32_t * result) 7291 size_t * index, uint32_t * result)
7274{ 7292{
7275 size_t cur_token; 7293 size_t cur_token;
7276 int digit; 7294 int digit;
7277 uint32_t number; 7295 uint32_t number;
7278 int parsed; 7296 int parsed;
7279 int r; 7297 int r;
7280 7298
7281 cur_token = * index; 7299 cur_token = * index;
7282 parsed = FALSE; 7300 parsed = FALSE;
7283 7301
7284#ifdef UNSTRICT_SYNTAX 7302#ifdef UNSTRICT_SYNTAX
7285 mailimap_space_parse(fd, buffer, &cur_token); 7303 mailimap_space_parse(fd, buffer, &cur_token);
7286#endif 7304#endif
7287 7305
7288 number = 0; 7306 number = 0;
7289 while (1) { 7307 while (1) {
7290 r = mailimap_digit_parse(fd, buffer, &cur_token, &digit); 7308 r = mailimap_digit_parse(fd, buffer, &cur_token, &digit);
7291 if (r == MAILIMAP_ERROR_PARSE) 7309 if (r == MAILIMAP_ERROR_PARSE)
7292 break; 7310 break;
7293 else if (r == MAILIMAP_NO_ERROR) { 7311 else if (r == MAILIMAP_NO_ERROR) {
7294 number *= 10; 7312 number *= 10;
7295 number += digit; 7313 number += digit;
7296 parsed = TRUE; 7314 parsed = TRUE;
7297 } 7315 }
7298 else 7316 else
7299 return r; 7317 return r;
7300 } 7318 }
7301 7319
7302 if (!parsed) 7320 if (!parsed)
7303 return MAILIMAP_ERROR_PARSE; 7321 return MAILIMAP_ERROR_PARSE;
7304 7322
7305 * result = number; 7323 * result = number;
7306 * index = cur_token; 7324 * index = cur_token;
7307 7325
7308 return MAILIMAP_NO_ERROR; 7326 return MAILIMAP_NO_ERROR;
7309} 7327}
7310 7328
7311/* 7329/*
7312 nz-number = digit-nz *DIGIT 7330 nz-number = digit-nz *DIGIT
7313 ; Non-zero unsigned 32-bit integer 7331 ; Non-zero unsigned 32-bit integer
7314 ; (0 < n < 4,294,967,296) 7332 ; (0 < n < 4,294,967,296)
7315*/ 7333*/
7316 7334
7317static int 7335static int
7318mailimap_nz_number_parse(mailstream * fd, MMAPString * buffer, 7336mailimap_nz_number_parse(mailstream * fd, MMAPString * buffer,
7319 size_t * index, uint32_t * result) 7337 size_t * index, uint32_t * result)
7320{ 7338{
7321#ifdef UNSTRICT_SYNTAX 7339#ifdef UNSTRICT_SYNTAX
7322 size_t cur_token; 7340 size_t cur_token;
7323 uint32_t number; 7341 uint32_t number;
7324 int r; 7342 int r;
7325 7343
7326 cur_token = * index; 7344 cur_token = * index;
7327 7345
7328 r = mailimap_number_parse(fd, buffer, &cur_token, &number); 7346 r = mailimap_number_parse(fd, buffer, &cur_token, &number);
7329 if (r != MAILIMAP_NO_ERROR) 7347 if (r != MAILIMAP_NO_ERROR)
7330 return r; 7348 return r;
7331 7349
7332 if (number == 0) 7350 if (number == 0)
7333 return MAILIMAP_ERROR_PARSE; 7351 return MAILIMAP_ERROR_PARSE;
7334 7352
7335#else 7353#else
7336 size_t cur_token; 7354 size_t cur_token;
7337 int digit; 7355 int digit;
7338 uint32_t number; 7356 uint32_t number;
7339 int r; 7357 int r;
7340 7358
7341 cur_token = * index; 7359 cur_token = * index;
7342 7360
7343 r = mailimap_digit_nz_parse(fd, buffer, &cur_token, &digit); 7361 r = mailimap_digit_nz_parse(fd, buffer, &cur_token, &digit);
7344 if (r != MAILIMAP_NO_ERROR) 7362 if (r != MAILIMAP_NO_ERROR)
7345 return r; 7363 return r;
7346 7364
7347 number = digit; 7365 number = digit;
7348 7366
7349 while (1) { 7367 while (1) {
7350 r = mailimap_digit_parse(fd, buffer, &cur_token, &digit); 7368 r = mailimap_digit_parse(fd, buffer, &cur_token, &digit);
7351 if (r == MAILIMAP_ERROR_PARSE) 7369 if (r == MAILIMAP_ERROR_PARSE)
7352 break; 7370 break;
7353 else if (r == MAILIMAP_NO_ERROR) { 7371 else if (r == MAILIMAP_NO_ERROR) {
7354 number *= 10; 7372 number *= 10;
7355 number += (guint32) digit; 7373 number += (guint32) digit;
7356 } 7374 }
7357 else 7375 else
7358 return r; 7376 return r;
7359 } 7377 }
7360#endif 7378#endif
7361 7379
7362 * result = number; 7380 * result = number;
7363 * index = cur_token; 7381 * index = cur_token;
7364 7382
7365 return MAILIMAP_NO_ERROR; 7383 return MAILIMAP_NO_ERROR;
7366} 7384}
7367 7385
7368/* 7386/*
7369 password = astring 7387 password = astring
7370*/ 7388*/
7371 7389
7372/* 7390/*
7373 quoted = DQUOTE *QUOTED-CHAR DQUOTE 7391 quoted = DQUOTE *QUOTED-CHAR DQUOTE
7374*/ 7392*/
7375 7393
7376static int 7394static int
7377mailimap_quoted_parse(mailstream * fd, MMAPString * buffer, 7395mailimap_quoted_parse(mailstream * fd, MMAPString * buffer,
7378 size_t * index, char ** result, 7396 size_t * index, char ** result,
7379 size_t progr_rate, 7397 size_t progr_rate,
7380 progress_function * progr_fun) 7398 progress_function * progr_fun)
7381{ 7399{
7382 char ch; 7400 char ch;
7383 size_t cur_token; 7401 size_t cur_token;
7384 MMAPString * gstr_quoted; 7402 MMAPString * gstr_quoted;
7385 int r; 7403 int r;
7386 int res; 7404 int res;
7387 7405
7388 cur_token = * index; 7406 cur_token = * index;
7389 7407
7390#ifdef UNSTRICT_SYNTAX 7408#ifdef UNSTRICT_SYNTAX
7391 r = mailimap_space_parse(fd, buffer, &cur_token); 7409 r = mailimap_space_parse(fd, buffer, &cur_token);
7392 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) 7410 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE))
7393 return r; 7411 return r;
7394#endif 7412#endif
7395 7413
7396 r = mailimap_dquote_parse(fd, buffer, &cur_token); 7414 r = mailimap_dquote_parse(fd, buffer, &cur_token);
7397 if (r != MAILIMAP_NO_ERROR) { 7415 if (r != MAILIMAP_NO_ERROR) {
7398 res = r; 7416 res = r;
7399 goto err; 7417 goto err;
7400 } 7418 }
7401 7419
7402 gstr_quoted = mmap_string_new(""); 7420 gstr_quoted = mmap_string_new("");
7403 if (gstr_quoted == NULL) { 7421 if (gstr_quoted == NULL) {
7404 res = MAILIMAP_ERROR_MEMORY; 7422 res = MAILIMAP_ERROR_MEMORY;
7405 goto err; 7423 goto err;
7406 } 7424 }
7407 7425
7408 while (1) { 7426 while (1) {
7409 r = mailimap_quoted_char_parse(fd, buffer, &cur_token, &ch); 7427 r = mailimap_quoted_char_parse(fd, buffer, &cur_token, &ch);
7410 if (r == MAILIMAP_ERROR_PARSE) 7428 if (r == MAILIMAP_ERROR_PARSE)
7411 break; 7429 break;
7412 else if (r == MAILIMAP_NO_ERROR) { 7430 else if (r == MAILIMAP_NO_ERROR) {
7413 if (mmap_string_append_c(gstr_quoted, ch) == NULL) { 7431 if (mmap_string_append_c(gstr_quoted, ch) == NULL) {
7414 res = MAILIMAP_ERROR_MEMORY; 7432 res = MAILIMAP_ERROR_MEMORY;
7415 goto free; 7433 goto free;
7416 } 7434 }
7417 } 7435 }
7418 else { 7436 else {
7419 res = r; 7437 res = r;
7420 goto free; 7438 goto free;
7421 } 7439 }
7422 } 7440 }
7423 7441
7424 r = mailimap_dquote_parse(fd, buffer, &cur_token); 7442 r = mailimap_dquote_parse(fd, buffer, &cur_token);
7425 if (r != MAILIMAP_NO_ERROR) { 7443 if (r != MAILIMAP_NO_ERROR) {
7426 res = r; 7444 res = r;
7427 goto free; 7445 goto free;
7428 } 7446 }
7429 7447
7430 if (mmap_string_ref(gstr_quoted) < 0) { 7448 if (mmap_string_ref(gstr_quoted) < 0) {
7431 res = MAILIMAP_ERROR_MEMORY; 7449 res = MAILIMAP_ERROR_MEMORY;
7432 goto free; 7450 goto free;
7433 } 7451 }
7434 7452
7435 * index = cur_token; 7453 * index = cur_token;
7436 * result = gstr_quoted->str; 7454 * result = gstr_quoted->str;
7437 7455
7438 return MAILIMAP_NO_ERROR; 7456 return MAILIMAP_NO_ERROR;
7439 7457
7440 free: 7458 free:
7441 mmap_string_free(gstr_quoted); 7459 mmap_string_free(gstr_quoted);
7442 err: 7460 err:
7443 return res; 7461 return res;
7444} 7462}
7445 7463
7446/* 7464/*
7447 QUOTED-CHAR = <any TEXT-CHAR except quoted-specials> / 7465 QUOTED-CHAR = <any TEXT-CHAR except quoted-specials> /
7448 "\" quoted-specials 7466 "\" quoted-specials
7449*/ 7467*/
7450 7468
7451static int is_quoted_specials(char ch); 7469static int is_quoted_specials(char ch);
7452 7470
7453static int 7471static int
7454mailimap_quoted_char_parse(mailstream * fd, MMAPString * buffer, 7472mailimap_quoted_char_parse(mailstream * fd, MMAPString * buffer,
7455 size_t * index, char * result) 7473 size_t * index, char * result)
7456{ 7474{
7457 size_t cur_token; 7475 size_t cur_token;
7458 int r; 7476 int r;
7459 7477
7460 cur_token = * index; 7478 cur_token = * index;
7461 7479
7462 if (!is_quoted_specials(buffer->str[cur_token])) { 7480 if (!is_quoted_specials(buffer->str[cur_token])) {
7463 * result = buffer->str[cur_token]; 7481 * result = buffer->str[cur_token];
7464 cur_token ++; 7482 cur_token ++;
7465 * index = cur_token; 7483 * index = cur_token;
7466 return MAILIMAP_NO_ERROR; 7484 return MAILIMAP_NO_ERROR;
7467 } 7485 }
7468 else { 7486 else {
7469 char quoted_special; 7487 char quoted_special;
7470 7488
7471 r = mailimap_char_parse(fd, buffer, &cur_token, '\\'); 7489 r = mailimap_char_parse(fd, buffer, &cur_token, '\\');
7472 if (r != MAILIMAP_NO_ERROR) 7490 if (r != MAILIMAP_NO_ERROR)
7473 return r; 7491 return r;
7474 7492
7475 r = mailimap_quoted_specials_parse(fd, buffer, &cur_token, 7493 r = mailimap_quoted_specials_parse(fd, buffer, &cur_token,
7476 &quoted_special); 7494 &quoted_special);
7477 if (r != MAILIMAP_NO_ERROR) 7495 if (r != MAILIMAP_NO_ERROR)
7478 return r; 7496 return r;
7479 7497
7480 * result = quoted_special; 7498 * result = quoted_special;
7481 * index = cur_token; 7499 * index = cur_token;
7482 7500
7483 return MAILIMAP_NO_ERROR; 7501 return MAILIMAP_NO_ERROR;
7484 } 7502 }
7485} 7503}
7486 7504
7487/* 7505/*
7488 quoted-specials = DQUOTE / "\" 7506 quoted-specials = DQUOTE / "\"
7489*/ 7507*/
7490 7508
7491static int is_quoted_specials(char ch) 7509static int is_quoted_specials(char ch)
7492{ 7510{
7493 return (ch == '\"') || (ch == '\\'); 7511 return (ch == '\"') || (ch == '\\');
7494} 7512}
7495 7513
7496static int 7514static int
7497mailimap_quoted_specials_parse(mailstream * fd, MMAPString * buffer, 7515mailimap_quoted_specials_parse(mailstream * fd, MMAPString * buffer,
7498 size_t * index, char * result) 7516 size_t * index, char * result)
7499{ 7517{
7500 size_t cur_token; 7518 size_t cur_token;
7501 7519
7502 cur_token = * index; 7520 cur_token = * index;
7503 7521
7504 if (is_quoted_specials(buffer->str[cur_token])) { 7522 if (is_quoted_specials(buffer->str[cur_token])) {
7505 * result = buffer->str[cur_token]; 7523 * result = buffer->str[cur_token];
7506 cur_token ++; 7524 cur_token ++;
7507 * index = cur_token; 7525 * index = cur_token;
7508 return MAILIMAP_NO_ERROR; 7526 return MAILIMAP_NO_ERROR;
7509 } 7527 }
7510 else 7528 else
7511 return MAILIMAP_ERROR_PARSE; 7529 return MAILIMAP_ERROR_PARSE;
7512} 7530}
7513 7531
7514/* 7532/*
7515 UNIMPLEMENTED 7533 UNIMPLEMENTED
7516 rename = "RENAME" SP mailbox SP mailbox 7534 rename = "RENAME" SP mailbox SP mailbox
7517 ; Use of INBOX as a destination gives a NO error 7535 ; Use of INBOX as a destination gives a NO error
7518*/ 7536*/
7519 7537
7520/* 7538/*
7521 response = *(continue-req / response-data) response-done 7539 response = *(continue-req / response-data) response-done
7522*/ 7540*/
7523 7541
7524/* 7542/*
7525 continue-req / response-data 7543 continue-req / response-data
7526*/ 7544*/
7527 7545
7528/* static */ int 7546/* static */ int
7529mailimap_cont_req_or_resp_data_parse(mailstream * fd, MMAPString * buffer, 7547mailimap_cont_req_or_resp_data_parse(mailstream * fd, MMAPString * buffer,
7530 size_t * index, 7548 size_t * index,
7531 struct mailimap_cont_req_or_resp_data ** 7549 struct mailimap_cont_req_or_resp_data **
7532 result, 7550 result,
7533 size_t progr_rate, 7551 size_t progr_rate,
7534 progress_function * progr_fun) 7552 progress_function * progr_fun)
7535{ 7553{
7536 size_t cur_token; 7554 size_t cur_token;
7537 struct mailimap_cont_req_or_resp_data * cont_req_or_resp_data; 7555 struct mailimap_cont_req_or_resp_data * cont_req_or_resp_data;
7538 struct mailimap_continue_req * cont_req; 7556 struct mailimap_continue_req * cont_req;
7539 struct mailimap_response_data * resp_data; 7557 struct mailimap_response_data * resp_data;
7540 int type; 7558 int type;
7541 int r; 7559 int r;
7542 int res; 7560 int res;
7543 7561
7544 cur_token = * index; 7562 cur_token = * index;
7545 7563
7546 cont_req = NULL; 7564 cont_req = NULL;
7547 resp_data = NULL; 7565 resp_data = NULL;
7548 type = MAILIMAP_RESP_ERROR; /* XXX - removes a gcc warning */ 7566 type = MAILIMAP_RESP_ERROR; /* XXX - removes a gcc warning */
7549 7567
7550 r = mailimap_continue_req_parse(fd, buffer, &cur_token, &cont_req, 7568 r = mailimap_continue_req_parse(fd, buffer, &cur_token, &cont_req,
7551 progr_rate, progr_fun); 7569 progr_rate, progr_fun);
7552 if (r == MAILIMAP_NO_ERROR) 7570 if (r == MAILIMAP_NO_ERROR)
7553 type = MAILIMAP_RESP_CONT_REQ; 7571 type = MAILIMAP_RESP_CONT_REQ;
7554 7572
7555 if (r == MAILIMAP_ERROR_PARSE) { 7573 if (r == MAILIMAP_ERROR_PARSE) {
7556 r = mailimap_response_data_parse(fd, buffer, &cur_token, &resp_data, 7574 r = mailimap_response_data_parse(fd, buffer, &cur_token, &resp_data,
7557 progr_rate, progr_fun); 7575 progr_rate, progr_fun);
7558 if (r == MAILIMAP_NO_ERROR) 7576 if (r == MAILIMAP_NO_ERROR)
7559 type = MAILIMAP_RESP_RESP_DATA; 7577 type = MAILIMAP_RESP_RESP_DATA;
7560 } 7578 }
7561 7579
7562 if (r != MAILIMAP_NO_ERROR) { 7580 if (r != MAILIMAP_NO_ERROR) {
7563 res = r; 7581 res = r;
7564 goto err; 7582 goto err;
7565 } 7583 }
7566 7584
7567 /* 7585 /*
7568 multi-lines response 7586 multi-lines response
7569 read another response line because after that token, 7587 read another response line because after that token,
7570 there must have something (continue-req, response-data or response-done) 7588 there must have something (continue-req, response-data or response-done)
7571 */ 7589 */
7572 7590
7573 if (!mailstream_read_line_append(fd, buffer)) { 7591 if (!mailstream_read_line_append(fd, buffer)) {
7574 res = MAILIMAP_ERROR_STREAM; 7592 res = MAILIMAP_ERROR_STREAM;
7575 goto free; 7593 goto free;
7576 } 7594 }
7577 7595
7578 cont_req_or_resp_data = 7596 cont_req_or_resp_data =
7579 mailimap_cont_req_or_resp_data_new(type, cont_req, resp_data); 7597 mailimap_cont_req_or_resp_data_new(type, cont_req, resp_data);
7580 if (cont_req_or_resp_data == NULL) { 7598 if (cont_req_or_resp_data == NULL) {
7581 res = MAILIMAP_ERROR_MEMORY; 7599 res = MAILIMAP_ERROR_MEMORY;
7582 goto free; 7600 goto free;
7583 } 7601 }
7584 7602
7585 * result = cont_req_or_resp_data; 7603 * result = cont_req_or_resp_data;
7586 * index = cur_token; 7604 * index = cur_token;
7587 7605
7588 return MAILIMAP_NO_ERROR; 7606 return MAILIMAP_NO_ERROR;
7589 7607
7590 free: 7608 free:
7591 if (cont_req != NULL) 7609 if (cont_req != NULL)
7592 mailimap_continue_req_free(cont_req); 7610 mailimap_continue_req_free(cont_req);
7593 if (resp_data != NULL) 7611 if (resp_data != NULL)
7594 mailimap_response_data_free(resp_data); 7612 mailimap_response_data_free(resp_data);
7595 err: 7613 err:
7596 return res; 7614 return res;
7597} 7615}
7598 7616
7599/* 7617/*
7600 response = *(continue-req / response-data) response-done 7618 response = *(continue-req / response-data) response-done
7601*/ 7619*/
7602 7620
7603int 7621int
7604mailimap_response_parse(mailstream * fd, MMAPString * buffer, 7622mailimap_response_parse(mailstream * fd, MMAPString * buffer,
7605 size_t * index, struct mailimap_response ** result, 7623 size_t * index, struct mailimap_response ** result,
7606 size_t progr_rate, 7624 size_t progr_rate,
7607 progress_function * progr_fun) 7625 progress_function * progr_fun)
7608{ 7626{
7609 size_t cur_token; 7627 size_t cur_token;
7610 clist * cont_req_or_resp_data_list; 7628 clist * cont_req_or_resp_data_list;
7611 struct mailimap_response * resp; 7629 struct mailimap_response * resp;
7612 struct mailimap_response_done * resp_done; 7630 struct mailimap_response_done * resp_done;
7613 int r; 7631 int r;
7614 int res; 7632 int res;
7615 7633
7616 cur_token = * index; 7634 cur_token = * index;
7617 cont_req_or_resp_data_list = NULL; 7635 cont_req_or_resp_data_list = NULL;
7618 resp_done = NULL; 7636 resp_done = NULL;
7619 7637
7620 r = mailimap_struct_multiple_parse(fd, buffer, 7638 r = mailimap_struct_multiple_parse(fd, buffer,
7621 &cur_token, &cont_req_or_resp_data_list, 7639 &cur_token, &cont_req_or_resp_data_list,
7622 (mailimap_struct_parser *) 7640 (mailimap_struct_parser *)
7623 mailimap_cont_req_or_resp_data_parse, 7641 mailimap_cont_req_or_resp_data_parse,
7624 (mailimap_struct_destructor *) 7642 (mailimap_struct_destructor *)
7625 mailimap_cont_req_or_resp_data_free, 7643 mailimap_cont_req_or_resp_data_free,
7626 progr_rate, progr_fun); 7644 progr_rate, progr_fun);
7627 7645
7628 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) 7646 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE))
7629 return r; 7647 return r;
7630 7648
7631 r = mailimap_response_done_parse(fd, buffer, &cur_token, &resp_done, 7649 r = mailimap_response_done_parse(fd, buffer, &cur_token, &resp_done,
7632 progr_rate, progr_fun); 7650 progr_rate, progr_fun);
7633 if (r != MAILIMAP_NO_ERROR) { 7651 if (r != MAILIMAP_NO_ERROR) {
7634 res = r; 7652 res = r;
7635 goto free_list; 7653 goto free_list;
7636 } 7654 }
7637 7655
7638 resp = mailimap_response_new(cont_req_or_resp_data_list, resp_done); 7656 resp = mailimap_response_new(cont_req_or_resp_data_list, resp_done);
7639 if (resp == NULL) { 7657 if (resp == NULL) {
7640 res = MAILIMAP_ERROR_MEMORY; 7658 res = MAILIMAP_ERROR_MEMORY;
7641 goto free_resp_done; 7659 goto free_resp_done;
7642 } 7660 }
7643 7661
7644 * result = resp; 7662 * result = resp;
7645 * index = cur_token; 7663 * index = cur_token;
7646 7664
7647 return MAILIMAP_NO_ERROR; 7665 return MAILIMAP_NO_ERROR;
7648 7666
7649 free_resp_done: 7667 free_resp_done:
7650 mailimap_response_done_free(resp_done); 7668 mailimap_response_done_free(resp_done);
7651 free_list: 7669 free_list:
7652 if (cont_req_or_resp_data_list != NULL) { 7670 if (cont_req_or_resp_data_list != NULL) {
7653 clist_foreach(cont_req_or_resp_data_list, 7671 clist_foreach(cont_req_or_resp_data_list,
7654 (clist_func) mailimap_cont_req_or_resp_data_free, NULL); 7672 (clist_func) mailimap_cont_req_or_resp_data_free, NULL);
7655 clist_free(cont_req_or_resp_data_list); 7673 clist_free(cont_req_or_resp_data_list);
7656 } 7674 }
7657 return res; 7675 return res;
7658} 7676}
7659 7677
7660/* 7678/*
7661 response-data = "*" SP (resp-cond-state / resp-cond-bye / 7679 response-data = "*" SP (resp-cond-state / resp-cond-bye /
7662 mailbox-data / message-data / capability-data) CRLF 7680 mailbox-data / message-data / capability-data) CRLF
7663*/ 7681*/
7664 7682
7665static int 7683static int
7666mailimap_response_data_parse(mailstream * fd, MMAPString * buffer, 7684mailimap_response_data_parse(mailstream * fd, MMAPString * buffer,
7667 size_t * index, 7685 size_t * index,
7668 struct mailimap_response_data ** result, 7686 struct mailimap_response_data ** result,
7669 size_t progr_rate, 7687 size_t progr_rate,
7670 progress_function * progr_fun) 7688 progress_function * progr_fun)
7671{ 7689{
7672 struct mailimap_response_data * resp_data; 7690 struct mailimap_response_data * resp_data;
7673 size_t cur_token; 7691 size_t cur_token;
7674 int type; 7692 int type;
7675 struct mailimap_resp_cond_state * cond_state; 7693 struct mailimap_resp_cond_state * cond_state;
7676 struct mailimap_resp_cond_bye * cond_bye; 7694 struct mailimap_resp_cond_bye * cond_bye;
7677 struct mailimap_mailbox_data * mb_data; 7695 struct mailimap_mailbox_data * mb_data;
7678 struct mailimap_message_data * msg_data; 7696 struct mailimap_message_data * msg_data;
7679 struct mailimap_capability_data * cap_data; 7697 struct mailimap_capability_data * cap_data;
7680 int r; 7698 int r;
7681 int res; 7699 int res;
7682 7700
7683 cond_state = NULL; 7701 cond_state = NULL;
7684 cond_bye = NULL; 7702 cond_bye = NULL;
7685 mb_data = NULL; 7703 mb_data = NULL;
7686 msg_data = NULL; 7704 msg_data = NULL;
7687 cap_data = NULL; 7705 cap_data = NULL;
7688 7706
7689 cur_token = * index; 7707 cur_token = * index;
7690 7708
7691 r = mailimap_star_parse(fd, buffer, &cur_token); 7709 r = mailimap_star_parse(fd, buffer, &cur_token);
7692 if (r != MAILIMAP_NO_ERROR) { 7710 if (r != MAILIMAP_NO_ERROR) {
7693 res = r; 7711 res = r;
7694 goto err; 7712 goto err;
7695 } 7713 }
7696 7714
7697 r = mailimap_space_parse(fd, buffer, &cur_token); 7715 r = mailimap_space_parse(fd, buffer, &cur_token);
7698 if (r != MAILIMAP_NO_ERROR) { 7716 if (r != MAILIMAP_NO_ERROR) {
7699 res = r; 7717 res = r;
7700 goto err; 7718 goto err;
7701 } 7719 }
7702 7720
7703 type = MAILIMAP_RESP_DATA_TYPE_ERROR; /* XXX - removes a gcc warning */ 7721 type = MAILIMAP_RESP_DATA_TYPE_ERROR; /* XXX - removes a gcc warning */
7704 7722
7705 r = mailimap_resp_cond_state_parse(fd, buffer, &cur_token, &cond_state, 7723 r = mailimap_resp_cond_state_parse(fd, buffer, &cur_token, &cond_state,
7706 progr_rate, progr_fun); 7724 progr_rate, progr_fun);
7707 if (r == MAILIMAP_NO_ERROR) 7725 if (r == MAILIMAP_NO_ERROR)
7708 type = MAILIMAP_RESP_DATA_TYPE_COND_STATE; 7726 type = MAILIMAP_RESP_DATA_TYPE_COND_STATE;
7709 7727
7710 if (r == MAILIMAP_ERROR_PARSE) { 7728 if (r == MAILIMAP_ERROR_PARSE) {
7711 r = mailimap_resp_cond_bye_parse(fd, buffer, &cur_token, &cond_bye, 7729 r = mailimap_resp_cond_bye_parse(fd, buffer, &cur_token, &cond_bye,
7712 progr_rate, progr_fun); 7730 progr_rate, progr_fun);
7713 if (r == MAILIMAP_NO_ERROR) 7731 if (r == MAILIMAP_NO_ERROR)
7714 type = MAILIMAP_RESP_DATA_TYPE_COND_BYE; 7732 type = MAILIMAP_RESP_DATA_TYPE_COND_BYE;
7715 } 7733 }
7716 7734
7717 if (r == MAILIMAP_ERROR_PARSE) { 7735 if (r == MAILIMAP_ERROR_PARSE) {
7718 r = mailimap_mailbox_data_parse(fd, buffer, &cur_token, &mb_data, 7736 r = mailimap_mailbox_data_parse(fd, buffer, &cur_token, &mb_data,
7719 progr_rate, progr_fun); 7737 progr_rate, progr_fun);
7720 if (r == MAILIMAP_NO_ERROR) 7738 if (r == MAILIMAP_NO_ERROR)
7721 type = MAILIMAP_RESP_DATA_TYPE_MAILBOX_DATA; 7739 type = MAILIMAP_RESP_DATA_TYPE_MAILBOX_DATA;
7722 } 7740 }
7723 7741
7724 if (r == MAILIMAP_ERROR_PARSE) { 7742 if (r == MAILIMAP_ERROR_PARSE) {
7725 r = mailimap_message_data_parse(fd, buffer, &cur_token, &msg_data, 7743 r = mailimap_message_data_parse(fd, buffer, &cur_token, &msg_data,
7726 progr_rate, progr_fun); 7744 progr_rate, progr_fun);
7727 if (r == MAILIMAP_NO_ERROR) 7745 if (r == MAILIMAP_NO_ERROR)
7728 type = MAILIMAP_RESP_DATA_TYPE_MESSAGE_DATA; 7746 type = MAILIMAP_RESP_DATA_TYPE_MESSAGE_DATA;
7729 } 7747 }
7730 7748
7731 if (r == MAILIMAP_ERROR_PARSE) { 7749 if (r == MAILIMAP_ERROR_PARSE) {
7732 r = mailimap_capability_data_parse(fd, buffer, &cur_token, &cap_data, 7750 r = mailimap_capability_data_parse(fd, buffer, &cur_token, &cap_data,
7733 progr_rate, progr_fun); 7751 progr_rate, progr_fun);
7734 if (r == MAILIMAP_NO_ERROR) 7752 if (r == MAILIMAP_NO_ERROR)
7735 type = MAILIMAP_RESP_DATA_TYPE_CAPABILITY_DATA; 7753 type = MAILIMAP_RESP_DATA_TYPE_CAPABILITY_DATA;
7736 } 7754 }
7737 7755
7738 if (r != MAILIMAP_NO_ERROR) { 7756 if (r != MAILIMAP_NO_ERROR) {
7739 res = r; 7757 res = r;
7740 goto err; 7758 goto err;
7741 } 7759 }
7742 7760
7743 r = mailimap_crlf_parse(fd, buffer, &cur_token); 7761 r = mailimap_crlf_parse(fd, buffer, &cur_token);
7744 if (r != MAILIMAP_NO_ERROR) { 7762 if (r != MAILIMAP_NO_ERROR) {
7745 res = r; 7763 res = r;
7746 goto free; 7764 goto free;
7747 } 7765 }
7748 7766
7749 resp_data = mailimap_response_data_new(type, cond_state, 7767 resp_data = mailimap_response_data_new(type, cond_state,
7750 cond_bye, mb_data, 7768 cond_bye, mb_data,
7751 msg_data, cap_data); 7769 msg_data, cap_data);
7752 if (resp_data == NULL) { 7770 if (resp_data == NULL) {
7753 res = MAILIMAP_ERROR_MEMORY; 7771 res = MAILIMAP_ERROR_MEMORY;
7754 goto free; 7772 goto free;
7755 } 7773 }
7756 7774
7757 * result = resp_data; 7775 * result = resp_data;
7758 * index = cur_token; 7776 * index = cur_token;
7759 7777
7760 return MAILIMAP_NO_ERROR; 7778 return MAILIMAP_NO_ERROR;
7761 7779
7762 free: 7780 free:
7763 if (cond_state) 7781 if (cond_state)
7764 mailimap_resp_cond_state_free(cond_state); 7782 mailimap_resp_cond_state_free(cond_state);
7765 if (cond_bye) 7783 if (cond_bye)
7766 mailimap_resp_cond_bye_free(cond_bye); 7784 mailimap_resp_cond_bye_free(cond_bye);
7767 if (mb_data) 7785 if (mb_data)
7768 mailimap_mailbox_data_free(mb_data); 7786 mailimap_mailbox_data_free(mb_data);
7769 if (msg_data) 7787 if (msg_data)
7770 mailimap_message_data_free(msg_data); 7788 mailimap_message_data_free(msg_data);
7771 if (cap_data) 7789 if (cap_data)
7772 mailimap_capability_data_free(cap_data); 7790 mailimap_capability_data_free(cap_data);
7773 err: 7791 err:
7774 return res; 7792 return res;
7775} 7793}
7776 7794
7777/* 7795/*
7778 response-done = response-tagged / response-fatal 7796 response-done = response-tagged / response-fatal
7779*/ 7797*/
7780 7798
7781static int 7799static int
7782mailimap_response_done_parse(mailstream * fd, MMAPString * buffer, 7800mailimap_response_done_parse(mailstream * fd, MMAPString * buffer,
7783 size_t * index, 7801 size_t * index,
7784 struct mailimap_response_done ** result, 7802 struct mailimap_response_done ** result,
7785 size_t progr_rate, 7803 size_t progr_rate,
7786 progress_function * progr_fun) 7804 progress_function * progr_fun)
7787{ 7805{
7788 int type; 7806 int type;
7789 struct mailimap_response_done * resp_done; 7807 struct mailimap_response_done * resp_done;
7790 size_t cur_token; 7808 size_t cur_token;
7791 struct mailimap_response_tagged * tagged; 7809 struct mailimap_response_tagged * tagged;
7792 struct mailimap_response_fatal * fatal; 7810 struct mailimap_response_fatal * fatal;
7793 int r; 7811 int r;
7794 int res; 7812 int res;
7795 7813
7796 cur_token = * index; 7814 cur_token = * index;
7797 7815
7798 tagged = NULL; 7816 tagged = NULL;
7799 fatal = NULL; 7817 fatal = NULL;
7800 7818
7801 type = MAILIMAP_RESP_DONE_TYPE_ERROR; /* removes a gcc warning */ 7819 type = MAILIMAP_RESP_DONE_TYPE_ERROR; /* removes a gcc warning */
7802 7820
7803 r = mailimap_response_tagged_parse(fd, buffer, &cur_token, &tagged, 7821 r = mailimap_response_tagged_parse(fd, buffer, &cur_token, &tagged,
7804 progr_rate, progr_fun); 7822 progr_rate, progr_fun);
7805 if (r == MAILIMAP_NO_ERROR) 7823 if (r == MAILIMAP_NO_ERROR)
7806 type = MAILIMAP_RESP_DONE_TYPE_TAGGED; 7824 type = MAILIMAP_RESP_DONE_TYPE_TAGGED;
7807 7825
7808 if (r == MAILIMAP_ERROR_PARSE) { 7826 if (r == MAILIMAP_ERROR_PARSE) {
7809 r = mailimap_response_fatal_parse(fd, buffer, &cur_token, &fatal, 7827 r = mailimap_response_fatal_parse(fd, buffer, &cur_token, &fatal,
7810 progr_rate, progr_fun); 7828 progr_rate, progr_fun);
7811 if (r == MAILIMAP_NO_ERROR) 7829 if (r == MAILIMAP_NO_ERROR)
7812 type = MAILIMAP_RESP_DONE_TYPE_FATAL; 7830 type = MAILIMAP_RESP_DONE_TYPE_FATAL;
7813 } 7831 }
7814 7832
7815 if (r != MAILIMAP_NO_ERROR) { 7833 if (r != MAILIMAP_NO_ERROR) {
7816 res = r; 7834 res = r;
7817 goto err; 7835 goto err;
7818 } 7836 }
7819 7837
7820 resp_done = mailimap_response_done_new(type, tagged, fatal); 7838 resp_done = mailimap_response_done_new(type, tagged, fatal);
7821 if (resp_done == NULL) { 7839 if (resp_done == NULL) {
7822 res = MAILIMAP_ERROR_MEMORY; 7840 res = MAILIMAP_ERROR_MEMORY;
7823 goto free; 7841 goto free;
7824 } 7842 }
7825 7843
7826 * result = resp_done; 7844 * result = resp_done;
7827 * index = cur_token; 7845 * index = cur_token;
7828 7846
7829 return MAILIMAP_NO_ERROR; 7847 return MAILIMAP_NO_ERROR;
7830 7848
7831 free: 7849 free:
7832 if (tagged == NULL) 7850 if (tagged == NULL)
7833 mailimap_response_tagged_free(tagged); 7851 mailimap_response_tagged_free(tagged);
7834 if (fatal == NULL) 7852 if (fatal == NULL)
7835 mailimap_response_fatal_free(fatal); 7853 mailimap_response_fatal_free(fatal);
7836 err: 7854 err:
7837 return res; 7855 return res;
7838} 7856}
7839 7857
7840/* 7858/*
7841 response-fatal = "*" SP resp-cond-bye CRLF 7859 response-fatal = "*" SP resp-cond-bye CRLF
7842 ; Server closes connection immediately 7860 ; Server closes connection immediately
7843*/ 7861*/
7844 7862
7845static int 7863static int
7846mailimap_response_fatal_parse(mailstream * fd, MMAPString * buffer, 7864mailimap_response_fatal_parse(mailstream * fd, MMAPString * buffer,
7847 size_t * index, 7865 size_t * index,
7848 struct mailimap_response_fatal ** result, 7866 struct mailimap_response_fatal ** result,
7849 size_t progr_rate, 7867 size_t progr_rate,
7850 progress_function * progr_fun) 7868 progress_function * progr_fun)
7851{ 7869{
7852 struct mailimap_resp_cond_bye * cond_bye; 7870 struct mailimap_resp_cond_bye * cond_bye;
7853 struct mailimap_response_fatal * fatal; 7871 struct mailimap_response_fatal * fatal;
7854 size_t cur_token; 7872 size_t cur_token;
7855 int res; 7873 int res;
7856 int r; 7874 int r;
7857 7875
7858 cur_token = * index; 7876 cur_token = * index;
7859 7877
7860 r = mailimap_star_parse(fd, buffer, &cur_token); 7878 r = mailimap_star_parse(fd, buffer, &cur_token);
7861 if (r != MAILIMAP_NO_ERROR) { 7879 if (r != MAILIMAP_NO_ERROR) {
7862 res = r; 7880 res = r;
7863 goto err; 7881 goto err;
7864 } 7882 }
7865 7883
7866 r = mailimap_space_parse(fd, buffer, &cur_token); 7884 r = mailimap_space_parse(fd, buffer, &cur_token);
7867 if (r != MAILIMAP_NO_ERROR) { 7885 if (r != MAILIMAP_NO_ERROR) {
7868 res = r; 7886 res = r;
7869 goto err; 7887 goto err;
7870 } 7888 }
7871 7889
7872 r = mailimap_resp_cond_bye_parse(fd, buffer, &cur_token, &cond_bye, 7890 r = mailimap_resp_cond_bye_parse(fd, buffer, &cur_token, &cond_bye,
7873 progr_rate, progr_fun); 7891 progr_rate, progr_fun);
7874 if (r != MAILIMAP_NO_ERROR) { 7892 if (r != MAILIMAP_NO_ERROR) {
7875 res = r; 7893 res = r;
7876 goto err; 7894 goto err;
7877 } 7895 }
7878 7896
7879 r = mailimap_crlf_parse(fd, buffer, &cur_token); 7897 r = mailimap_crlf_parse(fd, buffer, &cur_token);
7880 if (r != MAILIMAP_NO_ERROR) { 7898 if (r != MAILIMAP_NO_ERROR) {
7881 res = r; 7899 res = r;
7882 goto free; 7900 goto free;
7883 } 7901 }
7884 7902
7885 fatal = mailimap_response_fatal_new(cond_bye); 7903 fatal = mailimap_response_fatal_new(cond_bye);
7886 if (fatal == NULL) { 7904 if (fatal == NULL) {
7887 res = MAILIMAP_ERROR_MEMORY; 7905 res = MAILIMAP_ERROR_MEMORY;
7888 goto free; 7906 goto free;
7889 } 7907 }
7890 7908
7891 * result = fatal; 7909 * result = fatal;
7892 * index = cur_token; 7910 * index = cur_token;
7893 7911
7894 return MAILIMAP_NO_ERROR; 7912 return MAILIMAP_NO_ERROR;
7895 7913
7896 free: 7914 free:
7897 mailimap_resp_cond_bye_free(cond_bye); 7915 mailimap_resp_cond_bye_free(cond_bye);
7898 err: 7916 err:
7899 return res; 7917 return res;
7900} 7918}
7901 7919
7902/* 7920/*
7903 response-tagged = tag SP resp-cond-state CRLF 7921 response-tagged = tag SP resp-cond-state CRLF
7904*/ 7922*/
7905 7923
7906static int 7924static int
7907mailimap_response_tagged_parse(mailstream * fd, MMAPString * buffer, 7925mailimap_response_tagged_parse(mailstream * fd, MMAPString * buffer,
7908 size_t * index, 7926 size_t * index,
7909 struct mailimap_response_tagged ** result, 7927 struct mailimap_response_tagged ** result,
7910 size_t progr_rate, 7928 size_t progr_rate,
7911 progress_function * progr_fun) 7929 progress_function * progr_fun)
7912{ 7930{
7913 size_t cur_token; 7931 size_t cur_token;
7914 char * tag; 7932 char * tag;
7915 struct mailimap_resp_cond_state * cond_state; 7933 struct mailimap_resp_cond_state * cond_state;
7916 struct mailimap_response_tagged * resp_tagged; 7934 struct mailimap_response_tagged * resp_tagged;
7917 int r; 7935 int r;
7918 int res; 7936 int res;
7919 7937
7920 cur_token = * index; 7938 cur_token = * index;
7921 cond_state = NULL; 7939 cond_state = NULL;
7922 7940
7923 r = mailimap_tag_parse(fd, buffer, &cur_token, &tag, 7941 r = mailimap_tag_parse(fd, buffer, &cur_token, &tag,
7924 progr_rate, progr_fun); 7942 progr_rate, progr_fun);
7925 if (r != MAILIMAP_NO_ERROR) { 7943 if (r != MAILIMAP_NO_ERROR) {
7926 res = r; 7944 res = r;
7927 goto err; 7945 goto err;
7928 } 7946 }
7929 7947
7930 r = mailimap_space_parse(fd, buffer, &cur_token); 7948 r = mailimap_space_parse(fd, buffer, &cur_token);
7931 if (r != MAILIMAP_NO_ERROR) { 7949 if (r != MAILIMAP_NO_ERROR) {
7932 res = r; 7950 res = r;
7933 goto free_tag; 7951 goto free_tag;
7934 } 7952 }
7935 7953
7936 r = mailimap_resp_cond_state_parse(fd, buffer, &cur_token, &cond_state, 7954 r = mailimap_resp_cond_state_parse(fd, buffer, &cur_token, &cond_state,
7937 progr_rate, progr_fun); 7955 progr_rate, progr_fun);
7938 if (r != MAILIMAP_NO_ERROR) { 7956 if (r != MAILIMAP_NO_ERROR) {
7939 res = r; 7957 res = r;
7940 goto free_tag; 7958 goto free_tag;
7941 } 7959 }
7942 7960
7943 resp_tagged = mailimap_response_tagged_new(tag, cond_state); 7961 resp_tagged = mailimap_response_tagged_new(tag, cond_state);
7944 if (resp_tagged == NULL) { 7962 if (resp_tagged == NULL) {
7945 res = MAILIMAP_ERROR_MEMORY; 7963 res = MAILIMAP_ERROR_MEMORY;
7946 goto free_cond_state; 7964 goto free_cond_state;
7947 } 7965 }
7948 7966
7949 * result = resp_tagged; 7967 * result = resp_tagged;
7950 * index = cur_token; 7968 * index = cur_token;
7951 7969
7952 return MAILIMAP_NO_ERROR; 7970 return MAILIMAP_NO_ERROR;
7953 7971
7954 free_cond_state: 7972 free_cond_state:
7955 mailimap_resp_cond_state_free(cond_state); 7973 mailimap_resp_cond_state_free(cond_state);
7956 free_tag: 7974 free_tag:
7957 mailimap_tag_free(tag); 7975 mailimap_tag_free(tag);
7958 err: 7976 err:
7959 return res; 7977 return res;
7960} 7978}
7961 7979
7962/* 7980/*
7963 resp-cond-auth = ("OK" / "PREAUTH") SP resp-text 7981 resp-cond-auth = ("OK" / "PREAUTH") SP resp-text
7964 ; Authentication condition 7982 ; Authentication condition
7965*/ 7983*/
7966 7984
7967static int 7985static int
7968mailimap_resp_cond_auth_parse(mailstream * fd, MMAPString * buffer, 7986mailimap_resp_cond_auth_parse(mailstream * fd, MMAPString * buffer,
7969 size_t * index, 7987 size_t * index,
7970 struct mailimap_resp_cond_auth ** result, 7988 struct mailimap_resp_cond_auth ** result,
7971 size_t progr_rate, 7989 size_t progr_rate,
7972 progress_function * progr_fun) 7990 progress_function * progr_fun)
7973{ 7991{
7974 struct mailimap_resp_cond_auth * cond_auth; 7992 struct mailimap_resp_cond_auth * cond_auth;
7975 size_t cur_token; 7993 size_t cur_token;
7976 struct mailimap_resp_text * text; 7994 struct mailimap_resp_text * text;
7977 int type; 7995 int type;
7978 int r; 7996 int r;
7979 int res; 7997 int res;
7980 7998
7981 cur_token = * index; 7999 cur_token = * index;
7982 text = NULL; 8000 text = NULL;
7983 8001
7984 type = MAILIMAP_RESP_COND_AUTH_ERROR; /* XXX - removes a gcc warning */ 8002 type = MAILIMAP_RESP_COND_AUTH_ERROR; /* XXX - removes a gcc warning */
7985 8003
7986 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, "OK"); 8004 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, "OK");
7987 if (r == MAILIMAP_NO_ERROR) 8005 if (r == MAILIMAP_NO_ERROR)
7988 type = MAILIMAP_RESP_COND_AUTH_OK; 8006 type = MAILIMAP_RESP_COND_AUTH_OK;
7989 8007
7990 if (r == MAILIMAP_ERROR_PARSE) { 8008 if (r == MAILIMAP_ERROR_PARSE) {
7991 r = mailimap_token_case_insensitive_parse(fd, buffer, 8009 r = mailimap_token_case_insensitive_parse(fd, buffer,
7992 &cur_token, "PREAUTH"); 8010 &cur_token, "PREAUTH");
7993 if (r == MAILIMAP_NO_ERROR) 8011 if (r == MAILIMAP_NO_ERROR)
7994 type = MAILIMAP_RESP_COND_AUTH_PREAUTH; 8012 type = MAILIMAP_RESP_COND_AUTH_PREAUTH;
7995 } 8013 }
7996 8014
7997 if (r != MAILIMAP_NO_ERROR) { 8015 if (r != MAILIMAP_NO_ERROR) {
7998 res = r; 8016 res = r;
7999 goto err; 8017 goto err;
8000 } 8018 }
8001 8019
8002 r = mailimap_space_parse(fd, buffer, &cur_token); 8020 r = mailimap_space_parse(fd, buffer, &cur_token);
8003 if (r != MAILIMAP_NO_ERROR) { 8021 if (r != MAILIMAP_NO_ERROR) {
8004 res = r; 8022 res = r;
8005 goto err; 8023 goto err;
8006 } 8024 }
8007 8025
8008 r = mailimap_resp_text_parse(fd, buffer, &cur_token, &text, 8026 r = mailimap_resp_text_parse(fd, buffer, &cur_token, &text,
8009 progr_rate, progr_fun); 8027 progr_rate, progr_fun);
8010 if (r != MAILIMAP_NO_ERROR) { 8028 if (r != MAILIMAP_NO_ERROR) {
8011 res = r; 8029 res = r;
8012 goto err; 8030 goto err;
8013 } 8031 }
8014 8032
8015 cond_auth = mailimap_resp_cond_auth_new(type, text); 8033 cond_auth = mailimap_resp_cond_auth_new(type, text);
8016 if (cond_auth == NULL) { 8034 if (cond_auth == NULL) {
8017 res = MAILIMAP_ERROR_MEMORY; 8035 res = MAILIMAP_ERROR_MEMORY;
8018 goto free; 8036 goto free;
8019 } 8037 }
8020 8038
8021 * result = cond_auth; 8039 * result = cond_auth;
8022 * index = cur_token; 8040 * index = cur_token;
8023 8041
8024 return MAILIMAP_NO_ERROR; 8042 return MAILIMAP_NO_ERROR;
8025 8043
8026 free: 8044 free:
8027 mailimap_resp_text_free(text); 8045 mailimap_resp_text_free(text);
8028 err: 8046 err:
8029 return res; 8047 return res;
8030} 8048}
8031 8049
8032/* 8050/*
8033 resp-cond-bye = "BYE" SP resp-text 8051 resp-cond-bye = "BYE" SP resp-text
8034*/ 8052*/
8035 8053
8036static int 8054static int
8037mailimap_resp_cond_bye_parse(mailstream * fd, MMAPString * buffer, 8055mailimap_resp_cond_bye_parse(mailstream * fd, MMAPString * buffer,
8038 size_t * index, 8056 size_t * index,
8039 struct mailimap_resp_cond_bye ** result, 8057 struct mailimap_resp_cond_bye ** result,
8040 size_t progr_rate, 8058 size_t progr_rate,
8041 progress_function * progr_fun) 8059 progress_function * progr_fun)
8042{ 8060{
8043 size_t cur_token; 8061 size_t cur_token;
8044 struct mailimap_resp_cond_bye * cond_bye; 8062 struct mailimap_resp_cond_bye * cond_bye;
8045 struct mailimap_resp_text * text; 8063 struct mailimap_resp_text * text;
8046 int r; 8064 int r;
8047 int res; 8065 int res;
8048 8066
8049 cur_token = * index; 8067 cur_token = * index;
8050 8068
8051 r = mailimap_token_case_insensitive_parse(fd, buffer, 8069 r = mailimap_token_case_insensitive_parse(fd, buffer,
8052 &cur_token, "BYE"); 8070 &cur_token, "BYE");
8053 if (r != MAILIMAP_NO_ERROR) { 8071 if (r != MAILIMAP_NO_ERROR) {
8054 res = r; 8072 res = r;
8055 goto err; 8073 goto err;
8056 } 8074 }
8057 8075
8058 r = mailimap_space_parse(fd, buffer, &cur_token); 8076 r = mailimap_space_parse(fd, buffer, &cur_token);
8059 if (r != MAILIMAP_NO_ERROR) { 8077 if (r != MAILIMAP_NO_ERROR) {
8060 res = r; 8078 res = r;
8061 goto err; 8079 goto err;
8062 } 8080 }
8063 8081
8064 r = mailimap_resp_text_parse(fd, buffer, &cur_token, &text, 8082 r = mailimap_resp_text_parse(fd, buffer, &cur_token, &text,
8065 progr_rate, progr_fun); 8083 progr_rate, progr_fun);
8066 if (r != MAILIMAP_NO_ERROR) { 8084 if (r != MAILIMAP_NO_ERROR) {
8067 res = r; 8085 res = r;
8068 goto err; 8086 goto err;
8069 } 8087 }
8070 8088
8071 cond_bye = mailimap_resp_cond_bye_new(text); 8089 cond_bye = mailimap_resp_cond_bye_new(text);
8072 if (cond_bye == NULL) { 8090 if (cond_bye == NULL) {
8073 res = MAILIMAP_ERROR_MEMORY; 8091 res = MAILIMAP_ERROR_MEMORY;
8074 goto free; 8092 goto free;
8075 } 8093 }
8076 8094
8077 * index = cur_token; 8095 * index = cur_token;
8078 * result = cond_bye; 8096 * result = cond_bye;
8079 8097
8080 return MAILIMAP_NO_ERROR; 8098 return MAILIMAP_NO_ERROR;
8081 8099
8082 free: 8100 free:
8083 mailimap_resp_text_free(text); 8101 mailimap_resp_text_free(text);
8084 err: 8102 err:
8085 return res; 8103 return res;
8086} 8104}
8087 8105
8088/* 8106/*
8089 resp-cond-state = ("OK" / "NO" / "BAD") SP resp-text 8107 resp-cond-state = ("OK" / "NO" / "BAD") SP resp-text
8090 ; Status condition 8108 ; Status condition
8091*/ 8109*/
8092 8110
8093static int 8111static int
8094mailimap_resp_cond_state_parse(mailstream * fd, MMAPString * buffer, 8112mailimap_resp_cond_state_parse(mailstream * fd, MMAPString * buffer,
8095 size_t * index, 8113 size_t * index,
8096 struct mailimap_resp_cond_state ** result, 8114 struct mailimap_resp_cond_state ** result,
8097 size_t progr_rate, 8115 size_t progr_rate,
8098 progress_function * progr_fun) 8116 progress_function * progr_fun)
8099{ 8117{
8100 struct mailimap_resp_cond_state * cond_state; 8118 struct mailimap_resp_cond_state * cond_state;
8101 size_t cur_token; 8119 size_t cur_token;
8102 struct mailimap_resp_text * text; 8120 struct mailimap_resp_text * text;
8103 int type; 8121 int type;
8104 int r; 8122 int r;
8105 int res; 8123 int res;
8106 8124
8107 cur_token = * index; 8125 cur_token = * index;
8108 text = NULL; 8126 text = NULL;
8109 8127
8110 type = mailimap_resp_cond_state_get_token_value(fd, buffer, &cur_token); 8128 type = mailimap_resp_cond_state_get_token_value(fd, buffer, &cur_token);
8111 if (type == -1) { 8129 if (type == -1) {
8112 res = MAILIMAP_ERROR_PARSE; 8130 res = MAILIMAP_ERROR_PARSE;
8113 goto err; 8131 goto err;
8114 } 8132 }
8115 8133
8116 r = mailimap_space_parse(fd, buffer, &cur_token); 8134 r = mailimap_space_parse(fd, buffer, &cur_token);
8117 if (r != MAILIMAP_NO_ERROR) { 8135 if (r != MAILIMAP_NO_ERROR) {
8118 res = r; 8136 res = r;
8119 goto err; 8137 goto err;
8120 } 8138 }
8121 8139
8122 r = mailimap_resp_text_parse(fd, buffer, &cur_token, &text, 8140 r = mailimap_resp_text_parse(fd, buffer, &cur_token, &text,
8123 progr_rate, progr_fun); 8141 progr_rate, progr_fun);
8124 if (r != MAILIMAP_NO_ERROR) { 8142 if (r != MAILIMAP_NO_ERROR) {
8125 res = r; 8143 res = r;
8126 goto err; 8144 goto err;
8127 } 8145 }
8128 8146
8129 cond_state = mailimap_resp_cond_state_new(type, text); 8147 cond_state = mailimap_resp_cond_state_new(type, text);
8130 if (cond_state == NULL) { 8148 if (cond_state == NULL) {
8131 res = MAILIMAP_ERROR_MEMORY; 8149 res = MAILIMAP_ERROR_MEMORY;
8132 goto free; 8150 goto free;
8133 } 8151 }
8134 8152
8135 * result = cond_state; 8153 * result = cond_state;
8136 * index = cur_token; 8154 * index = cur_token;
8137 8155
8138 return MAILIMAP_NO_ERROR; 8156 return MAILIMAP_NO_ERROR;
8139 8157
8140 free: 8158 free:
8141 mailimap_resp_text_free(text); 8159 mailimap_resp_text_free(text);
8142 err: 8160 err:
8143 return res; 8161 return res;
8144} 8162}
8145 8163
8146 8164
8147/* 8165/*
8148 resp-specials = "]" 8166 resp-specials = "]"
8149*/ 8167*/
8150 8168
8151static int is_resp_specials(char ch) 8169static int is_resp_specials(char ch)
8152{ 8170{
8153 switch (ch) { 8171 switch (ch) {
8154 case ']': 8172 case ']':
8155 return TRUE; 8173 return TRUE;
8156 }; 8174 };
8157 return FALSE; 8175 return FALSE;
8158} 8176}
8159 8177
8160/* 8178/*
8161 resp-text = ["[" resp-text-code "]" SP] text 8179 resp-text = ["[" resp-text-code "]" SP] text
8162*/ 8180*/
8163 8181
8164/* "[" resp-text-code "]" */ 8182/* "[" resp-text-code "]" */
8165 8183
8166static int 8184static int
8167mailimap_resp_text_resp_text_code_parse(mailstream * fd, MMAPString * buffer, 8185mailimap_resp_text_resp_text_code_parse(mailstream * fd, MMAPString * buffer,
8168 size_t * index, 8186 size_t * index,
8169 struct mailimap_resp_text_code ** 8187 struct mailimap_resp_text_code **
8170 result, 8188 result,
8171 size_t progr_rate, 8189 size_t progr_rate,
8172 progress_function * progr_fun) 8190 progress_function * progr_fun)
8173{ 8191{
8174 struct mailimap_resp_text_code * text_code; 8192 struct mailimap_resp_text_code * text_code;
8175 size_t cur_token; 8193 size_t cur_token;
8176 int r; 8194 int r;
8177 int res; 8195 int res;
8178 8196
8179 cur_token = * index; 8197 cur_token = * index;
8180 8198
8181 r = mailimap_obracket_parse(fd, buffer, &cur_token); 8199 r = mailimap_obracket_parse(fd, buffer, &cur_token);
8182 if (r != MAILIMAP_NO_ERROR) { 8200 if (r != MAILIMAP_NO_ERROR) {
8183 res = r; 8201 res = r;
8184 goto err; 8202 goto err;
8185 } 8203 }
8186 8204
8187 r = mailimap_resp_text_code_parse(fd, buffer, &cur_token, &text_code, 8205 r = mailimap_resp_text_code_parse(fd, buffer, &cur_token, &text_code,
8188 progr_rate, progr_fun); 8206 progr_rate, progr_fun);
8189 if (r != MAILIMAP_NO_ERROR) { 8207 if (r != MAILIMAP_NO_ERROR) {
8190 res = r; 8208 res = r;
8191 goto err; 8209 goto err;
8192 } 8210 }
8193 8211
8194 r = mailimap_cbracket_parse(fd, buffer, &cur_token); 8212 r = mailimap_cbracket_parse(fd, buffer, &cur_token);
8195 if (r != MAILIMAP_NO_ERROR) { 8213 if (r != MAILIMAP_NO_ERROR) {
8196 res = r; 8214 res = r;
8197 goto free; 8215 goto free;
8198 } 8216 }
8199 8217
8200 r = mailimap_space_parse(fd, buffer, &cur_token); 8218 r = mailimap_space_parse(fd, buffer, &cur_token);
8201 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) { 8219 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) {
8202 res = r; 8220 res = r;
8203 goto free; 8221 goto free;
8204 } 8222 }
8205 8223
8206 * result = text_code; 8224 * result = text_code;
8207 * index = cur_token; 8225 * index = cur_token;
8208 8226
8209 return MAILIMAP_NO_ERROR; 8227 return MAILIMAP_NO_ERROR;
8210 8228
8211 free: 8229 free:
8212 mailimap_resp_text_code_free(text_code); 8230 mailimap_resp_text_code_free(text_code);
8213 err: 8231 err:
8214 return res; 8232 return res;
8215} 8233}
8216 8234
8217/* 8235/*
8218 resp-text = ["[" resp-text-code "]" SP] text 8236 resp-text = ["[" resp-text-code "]" SP] text
8219*/ 8237*/
8220 8238
8221static int 8239static int
8222mailimap_resp_text_parse(mailstream * fd, MMAPString * buffer, 8240mailimap_resp_text_parse(mailstream * fd, MMAPString * buffer,
8223 size_t * index, 8241 size_t * index,
8224 struct mailimap_resp_text ** result, 8242 struct mailimap_resp_text ** result,
8225 size_t progr_rate, 8243 size_t progr_rate,
8226 progress_function * progr_fun) 8244 progress_function * progr_fun)
8227{ 8245{
8228 size_t cur_token; 8246 size_t cur_token;
8229 struct mailimap_resp_text_code * text_code; 8247 struct mailimap_resp_text_code * text_code;
8230 struct mailimap_resp_text * resp_text; 8248 struct mailimap_resp_text * resp_text;
8231 char * text; 8249 char * text;
8232 int r; 8250 int r;
8233 int res; 8251 int res;
8234 8252
8235 cur_token = * index; 8253 cur_token = * index;
8236 text = NULL; 8254 text = NULL;
8237 text_code = NULL; 8255 text_code = NULL;
8238 8256
8239 r = mailimap_resp_text_resp_text_code_parse(fd, buffer, &cur_token, 8257 r = mailimap_resp_text_resp_text_code_parse(fd, buffer, &cur_token,
8240 &text_code, 8258 &text_code,
8241 progr_rate, progr_fun); 8259 progr_rate, progr_fun);
8242 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) 8260 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE))
8243 return r; 8261 return r;
8244 8262
8245 r = mailimap_text_parse(fd, buffer, &cur_token, &text, 8263 r = mailimap_text_parse(fd, buffer, &cur_token, &text,
8246 progr_rate, progr_fun); 8264 progr_rate, progr_fun);
8247 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) { 8265 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) {
8248 res = r; 8266 res = r;
8249 goto free_resp_text_code; 8267 goto free_resp_text_code;
8250 } 8268 }
8251 8269
8252 resp_text = mailimap_resp_text_new(text_code, text); 8270 resp_text = mailimap_resp_text_new(text_code, text);
8253 if (resp_text == NULL) { 8271 if (resp_text == NULL) {
8254 res = MAILIMAP_ERROR_MEMORY; 8272 res = MAILIMAP_ERROR_MEMORY;
8255 goto free_text; 8273 goto free_text;
8256 } 8274 }
8257 8275
8258 * result = resp_text; 8276 * result = resp_text;
8259 * index = cur_token; 8277 * index = cur_token;
8260 8278
8261 return MAILIMAP_NO_ERROR; 8279 return MAILIMAP_NO_ERROR;
8262 8280
8263 free_resp_text_code: 8281 free_resp_text_code:
8264 if (text_code != NULL) 8282 if (text_code != NULL)
8265 mailimap_resp_text_code_free(text_code); 8283 mailimap_resp_text_code_free(text_code);
8266 free_text: 8284 free_text:
8267 mailimap_text_free(text); 8285 mailimap_text_free(text);
8268 return res; 8286 return res;
8269} 8287}
8270 8288
8271/* 8289/*
8272 resp-text-code = "ALERT" / 8290 resp-text-code = "ALERT" /
8273 "BADCHARSET" [SP "(" astring *(SP astring) ")" ] / 8291 "BADCHARSET" [SP "(" astring *(SP astring) ")" ] /
8274 capability-data / "PARSE" / 8292 capability-data / "PARSE" /
8275 "PERMANENTFLAGS" SP "(" [flag-perm *(SP flag-perm)] ")" / 8293 "PERMANENTFLAGS" SP "(" [flag-perm *(SP flag-perm)] ")" /
8276 "READ-ONLY" / "READ-WRITE" / "TRYCREATE" / 8294 "READ-ONLY" / "READ-WRITE" / "TRYCREATE" /
8277 "UIDNEXT" SP nz-number / "UIDVALIDITY" SP nz-number / 8295 "UIDNEXT" SP nz-number / "UIDVALIDITY" SP nz-number /
8278 "UNSEEN" SP nz-number / 8296 "UNSEEN" SP nz-number /
8279 atom [SP 1*<any TEXT-CHAR except "]">] 8297 atom [SP 1*<any TEXT-CHAR except "]">]
8280*/ 8298*/
8281 8299
8282/* 8300/*
8283 ALERT / PARSE / READ-ONLY / READ-WRITE / TRYCREATE 8301 ALERT / PARSE / READ-ONLY / READ-WRITE / TRYCREATE
8284*/ 8302*/
8285 8303
8286static int 8304static int
8287mailimap_resp_text_code_1_parse(mailstream * fd, MMAPString * buffer, 8305mailimap_resp_text_code_1_parse(mailstream * fd, MMAPString * buffer,
8288 size_t * index, 8306 size_t * index,
8289 int * result) 8307 int * result)
8290{ 8308{
8291 int id; 8309 int id;
8292 size_t cur_token; 8310 size_t cur_token;
8293 8311
8294 cur_token = * index; 8312 cur_token = * index;
8295 8313
8296 id = mailimap_resp_text_code_1_get_token_value(fd, buffer, &cur_token); 8314 id = mailimap_resp_text_code_1_get_token_value(fd, buffer, &cur_token);
8297 8315
8298 if (id == -1) 8316 if (id == -1)
8299 return MAILIMAP_ERROR_PARSE; 8317 return MAILIMAP_ERROR_PARSE;
8300 8318
8301 * result = id; 8319 * result = id;
8302 * index = cur_token; 8320 * index = cur_token;
8303 8321
8304 return MAILIMAP_NO_ERROR; 8322 return MAILIMAP_NO_ERROR;
8305} 8323}
8306 8324
8307 8325
8308/* 8326/*
8309 "BADCHARSET" [SP "(" astring *(SP astring) ")" ] 8327 "BADCHARSET" [SP "(" astring *(SP astring) ")" ]
8310*/ 8328*/
8311 8329
8312/* 8330/*
8313 SP "(" astring *(SP astring) ")" 8331 SP "(" astring *(SP astring) ")"
8314*/ 8332*/
8315 8333
8316static int 8334static int
8317mailimap_resp_text_code_badcharset_1_parse(mailstream * fd, 8335mailimap_resp_text_code_badcharset_1_parse(mailstream * fd,
8318 MMAPString * buffer, 8336 MMAPString * buffer,
8319 size_t * index, 8337 size_t * index,
8320 clist ** result, 8338 clist ** result,
8321 size_t progr_rate, 8339 size_t progr_rate,
8322 progress_function * progr_fun) 8340 progress_function * progr_fun)
8323{ 8341{
8324 size_t cur_token; 8342 size_t cur_token;
8325 clist * charset; 8343 clist * charset;
8326 int r; 8344 int r;
8327 int res; 8345 int res;
8328 8346
8329 cur_token = * index; 8347 cur_token = * index;
8330 8348
8331 r = mailimap_space_parse(fd, buffer, &cur_token); 8349 r = mailimap_space_parse(fd, buffer, &cur_token);
8332 if (r != MAILIMAP_NO_ERROR) { 8350 if (r != MAILIMAP_NO_ERROR) {
8333 res = r; 8351 res = r;
8334 goto err; 8352 goto err;
8335 } 8353 }
8336 8354
8337 r = mailimap_oparenth_parse(fd, buffer, &cur_token); 8355 r = mailimap_oparenth_parse(fd, buffer, &cur_token);
8338 if (r != MAILIMAP_NO_ERROR) { 8356 if (r != MAILIMAP_NO_ERROR) {
8339 res = r; 8357 res = r;
8340 goto err; 8358 goto err;
8341 } 8359 }
8342 8360
8343 r = mailimap_struct_spaced_list_parse(fd, buffer, &cur_token, &charset, 8361 r = mailimap_struct_spaced_list_parse(fd, buffer, &cur_token, &charset,
8344 (mailimap_struct_parser *) 8362 (mailimap_struct_parser *)
8345 mailimap_astring_parse, 8363 mailimap_astring_parse,
8346 (mailimap_struct_destructor *) 8364 (mailimap_struct_destructor *)
8347 mailimap_astring_free, 8365 mailimap_astring_free,
8348 progr_rate, progr_fun); 8366 progr_rate, progr_fun);
8349 if (r != MAILIMAP_NO_ERROR) { 8367 if (r != MAILIMAP_NO_ERROR) {
8350 res = r; 8368 res = r;
8351 goto err; 8369 goto err;
8352 } 8370 }
8353 8371
8354 r = mailimap_cparenth_parse(fd, buffer, &cur_token); 8372 r = mailimap_cparenth_parse(fd, buffer, &cur_token);
8355 if (r != MAILIMAP_NO_ERROR) { 8373 if (r != MAILIMAP_NO_ERROR) {
8356 res = r; 8374 res = r;
8357 goto charset; 8375 goto charset;
8358 } 8376 }
8359 8377
8360 * index = cur_token; 8378 * index = cur_token;
8361 * result = charset; 8379 * result = charset;
8362 8380
8363 return MAILIMAP_NO_ERROR; 8381 return MAILIMAP_NO_ERROR;
8364 8382
8365 charset: 8383 charset:
8366 clist_foreach(charset, (clist_func) mailimap_string_free, NULL); 8384 clist_foreach(charset, (clist_func) mailimap_string_free, NULL);
8367 clist_free(charset); 8385 clist_free(charset);
8368 err: 8386 err:
8369 return res; 8387 return res;
8370} 8388}
8371 8389
8372/* 8390/*
8373 "BADCHARSET" [SP "(" astring *(SP astring) ")" ] 8391 "BADCHARSET" [SP "(" astring *(SP astring) ")" ]
8374*/ 8392*/
8375 8393
8376static int 8394static int
8377mailimap_resp_text_code_badcharset_parse(mailstream * fd, MMAPString * buffer, 8395mailimap_resp_text_code_badcharset_parse(mailstream * fd, MMAPString * buffer,
8378 size_t * index, 8396 size_t * index,
8379 clist ** result, 8397 clist ** result,
8380 size_t progr_rate, 8398 size_t progr_rate,
8381 progress_function * progr_fun) 8399 progress_function * progr_fun)
8382{ 8400{
8383 size_t cur_token; 8401 size_t cur_token;
8384 clist * charset; 8402 clist * charset;
8385 int r; 8403 int r;
8386 8404
8387 cur_token = * index; 8405 cur_token = * index;
8388 8406
8389 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, 8407 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token,
8390 "BADCHARSET"); 8408 "BADCHARSET");
8391 if (r != MAILIMAP_NO_ERROR) 8409 if (r != MAILIMAP_NO_ERROR)
8392 return r; 8410 return r;
8393 8411
8394 charset = NULL; 8412 charset = NULL;
8395 8413
8396 r = mailimap_resp_text_code_badcharset_1_parse(fd, buffer, &cur_token, 8414 r = mailimap_resp_text_code_badcharset_1_parse(fd, buffer, &cur_token,
8397 &charset, 8415 &charset,
8398 progr_rate, progr_fun); 8416 progr_rate, progr_fun);
8399 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) 8417 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE))
8400 return r; 8418 return r;
8401 8419
8402 * result = charset; 8420 * result = charset;
8403 * index = cur_token; 8421 * index = cur_token;
8404 8422
8405 return MAILIMAP_NO_ERROR; 8423 return MAILIMAP_NO_ERROR;
8406} 8424}
8407 8425
8408/* 8426/*
8409 "PERMANENTFLAGS" SP "(" [flag-perm *(SP flag-perm)] ")" 8427 "PERMANENTFLAGS" SP "(" [flag-perm *(SP flag-perm)] ")"
8410*/ 8428*/
8411 8429
8412static int 8430static int
8413mailimap_resp_text_code_permanentflags_parse(mailstream * fd, 8431mailimap_resp_text_code_permanentflags_parse(mailstream * fd,
8414 MMAPString * buffer, 8432 MMAPString * buffer,
8415 size_t * index, 8433 size_t * index,
8416 clist ** result, 8434 clist ** result,
8417 size_t progr_rate, 8435 size_t progr_rate,
8418 progress_function * progr_fun) 8436 progress_function * progr_fun)
8419{ 8437{
8420 size_t cur_token; 8438 size_t cur_token;
8421 clist * flaglist; 8439 clist * flaglist;
8422 int r; 8440 int r;
8423 int res; 8441 int res;
8424 8442
8425 cur_token = * index; 8443 cur_token = * index;
8426 8444
8427 flaglist = NULL; 8445 flaglist = NULL;
8428 8446
8429 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, 8447 r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token,
8430 "PERMANENTFLAGS"); 8448 "PERMANENTFLAGS");
8431 if (r != MAILIMAP_NO_ERROR) { 8449 if (r != MAILIMAP_NO_ERROR) {
8432 res = r; 8450 res = r;
8433 goto err; 8451 goto err;
8434 } 8452 }
8435 8453
8436 r = mailimap_space_parse(fd, buffer, &cur_token); 8454 r = mailimap_space_parse(fd, buffer, &cur_token);
8437 if (r != MAILIMAP_NO_ERROR) { 8455 if (r != MAILIMAP_NO_ERROR) {
8438 res = r; 8456 res = r;
8439 goto err; 8457 goto err;
8440 } 8458 }
8441 8459
8442 r = mailimap_oparenth_parse(fd, buffer, &cur_token); 8460 r = mailimap_oparenth_parse(fd, buffer, &cur_token);
8443 if (r != MAILIMAP_NO_ERROR) { 8461 if (r != MAILIMAP_NO_ERROR) {
8444 res = r; 8462 res = r;
8445 goto err; 8463 goto err;
8446 } 8464 }
8447 8465
8448 r = mailimap_struct_spaced_list_parse(fd, buffer, &cur_token, &flaglist, 8466 r = mailimap_struct_spaced_list_parse(fd, buffer, &cur_token, &flaglist,
8449 (mailimap_struct_parser *) 8467 (mailimap_struct_parser *)
8450 mailimap_flag_perm_parse, 8468 mailimap_flag_perm_parse,
8451 (mailimap_struct_destructor *) 8469 (mailimap_struct_destructor *)
8452 mailimap_flag_perm_free, 8470 mailimap_flag_perm_free,
8453 progr_rate, progr_fun); 8471 progr_rate, progr_fun);
8454 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) { 8472 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) {
8455 res = r; 8473 res = r;
8456 goto err; 8474 goto err;
8457 } 8475 }
8458 8476
8459 r = mailimap_cparenth_parse(fd, buffer, &cur_token); 8477 r = mailimap_cparenth_parse(fd, buffer, &cur_token);
8460 if (r != MAILIMAP_NO_ERROR) { 8478 if (r != MAILIMAP_NO_ERROR) {
8461 res = r; 8479 res = r;
8462 goto free; 8480 goto free;
8463 } 8481 }
8464 8482
8465 * index = cur_token; 8483 * index = cur_token;
8466 * result = flaglist; 8484 * result = flaglist;
8467 8485
8468 return MAILIMAP_NO_ERROR; 8486 return MAILIMAP_NO_ERROR;
8469 8487
8470 free: 8488 free:
8471 clist_foreach(flaglist, (clist_func) mailimap_flag_perm_free, NULL); 8489 clist_foreach(flaglist, (clist_func) mailimap_flag_perm_free, NULL);
8472 clist_free(flaglist); 8490 clist_free(flaglist);
8473 err: 8491 err:
8474 return res; 8492 return res;
8475} 8493}
8476 8494
8477 8495
8478/* 8496/*
8479 "UIDNEXT" SP nz-number / 8497 "UIDNEXT" SP nz-number /
8480 "UIDVALIDITY" SP nz-number / 8498 "UIDVALIDITY" SP nz-number /
8481 "UNSEEN" SP nz-number 8499 "UNSEEN" SP nz-number
8482*/ 8500*/
8483 8501
8484static int 8502static int
8485mailimap_resp_text_code_number_parse(mailstream * fd, MMAPString * buffer, 8503mailimap_resp_text_code_number_parse(mailstream * fd, MMAPString * buffer,
8486 size_t * index, 8504 size_t * index,
8487 struct mailimap_resp_text_code ** result, 8505 struct mailimap_resp_text_code ** result,
8488 size_t progr_rate, 8506 size_t progr_rate,
8489 progress_function * progr_fun) 8507 progress_function * progr_fun)
8490{ 8508{
8491 size_t cur_token; 8509 size_t cur_token;
8492 int type; 8510 int type;
8493 uint32_t number; 8511 uint32_t number;
8494 struct mailimap_resp_text_code * resp_text_code; 8512 struct mailimap_resp_text_code * resp_text_code;
8495 int r; 8513 int r;
8496 8514
8497 cur_token = * index; 8515 cur_token = * index;
8498 8516
8499 resp_text_code = NULL; 8517 resp_text_code = NULL;
8500 8518
8501 type = mailimap_resp_text_code_2_get_token_value(fd, buffer, &cur_token); 8519 type = mailimap_resp_text_code_2_get_token_value(fd, buffer, &cur_token);
8502 if (type == -1) 8520 if (type == -1)
8503 return MAILIMAP_ERROR_PARSE; 8521 return MAILIMAP_ERROR_PARSE;
8504 8522
8505 r = mailimap_space_parse(fd, buffer, &cur_token); 8523 r = mailimap_space_parse(fd, buffer, &cur_token);
8506 if (r != MAILIMAP_NO_ERROR) 8524 if (r != MAILIMAP_NO_ERROR)
8507 return r; 8525 return r;
8508 8526
8509 r = mailimap_nz_number_parse(fd, buffer, &cur_token, &number); 8527 r = mailimap_nz_number_parse(fd, buffer, &cur_token, &number);
8510 if (r != MAILIMAP_NO_ERROR) 8528 if (r != MAILIMAP_NO_ERROR)
8511 return r; 8529 return r;
8512 8530
8513 switch (type) { 8531 switch (type) {
8514 case MAILIMAP_RESP_TEXT_CODE_UIDNEXT: 8532 case MAILIMAP_RESP_TEXT_CODE_UIDNEXT:
8515 resp_text_code = mailimap_resp_text_code_new(type, NULL, NULL, NULL, 8533 resp_text_code = mailimap_resp_text_code_new(type, NULL, NULL, NULL,
8516 number, 0, 0, NULL , NULL); 8534 number, 0, 0, NULL , NULL);
8517 break; 8535 break;
8518 case MAILIMAP_RESP_TEXT_CODE_UIDVALIDITY: 8536 case MAILIMAP_RESP_TEXT_CODE_UIDVALIDITY:
8519 resp_text_code = mailimap_resp_text_code_new(type, NULL, NULL, NULL, 8537 resp_text_code = mailimap_resp_text_code_new(type, NULL, NULL, NULL,
8520 0, number, 0, NULL , NULL); 8538 0, number, 0, NULL , NULL);
8521 break; 8539 break;
8522 case MAILIMAP_RESP_TEXT_CODE_UNSEEN: 8540 case MAILIMAP_RESP_TEXT_CODE_UNSEEN:
8523 resp_text_code = mailimap_resp_text_code_new(type, NULL, NULL, NULL, 8541 resp_text_code = mailimap_resp_text_code_new(type, NULL, NULL, NULL,
8524 0, 0, number, NULL , NULL); 8542 0, 0, number, NULL , NULL);
8525 break; 8543 break;
8526 } 8544 }
8527 8545
8528 if (resp_text_code == NULL) 8546 if (resp_text_code == NULL)
8529 return MAILIMAP_ERROR_MEMORY; 8547 return MAILIMAP_ERROR_MEMORY;
8530 8548
8531 * result = resp_text_code; 8549 * result = resp_text_code;
8532 * index = cur_token; 8550 * index = cur_token;
8533 8551
8534 return MAILIMAP_NO_ERROR; 8552 return MAILIMAP_NO_ERROR;
8535} 8553}
8536 8554
8537/* 8555/*
8538 atom [SP 1*<any TEXT-CHAR except "]">] 8556 atom [SP 1*<any TEXT-CHAR except "]">]
8539*/ 8557*/
8540 8558
8541static int is_text_char(char ch); 8559static int is_text_char(char ch);
8542 8560
8543/* 8561/*
8544 any TEXT-CHAR except "]" 8562 any TEXT-CHAR except "]"
8545*/ 8563*/
8546 8564
8547static int is_text_char_1(char ch) 8565static int is_text_char_1(char ch)
8548{ 8566{
8549 if (ch == ']') 8567 if (ch == ']')
8550 return FALSE; 8568 return FALSE;
8551 return is_text_char(ch); 8569 return is_text_char(ch);
8552} 8570}
8553 8571
8554/* 8572/*
8555 1*<any TEXT-CHAR except "]" 8573 1*<any TEXT-CHAR except "]"
8556*/ 8574*/
8557 8575
8558static int 8576static int
8559mailimap_resp_text_code_other_2_parse(mailstream * fd, MMAPString * buffer, 8577mailimap_resp_text_code_other_2_parse(mailstream * fd, MMAPString * buffer,
8560 size_t * index, char ** result, 8578 size_t * index, char ** result,
8561 size_t progr_rate, 8579 size_t progr_rate,
8562 progress_function * progr_fun) 8580 progress_function * progr_fun)
8563{ 8581{
8564 return mailimap_custom_string_parse(fd, buffer, index, result, 8582 return mailimap_custom_string_parse(fd, buffer, index, result,
8565 is_text_char_1); 8583 is_text_char_1);
8566} 8584}
8567 8585
8568/* 8586/*
8569 SP 1*<any TEXT-CHAR except "]"> 8587 SP 1*<any TEXT-CHAR except "]">
8570*/ 8588*/
8571 8589
8572static int 8590static int
8573mailimap_resp_text_code_other_1_parse(mailstream * fd, MMAPString * buffer, 8591mailimap_resp_text_code_other_1_parse(mailstream * fd, MMAPString * buffer,
8574 size_t * index, 8592 size_t * index,
8575 char ** result, 8593 char ** result,
8576 size_t progr_rate, 8594 size_t progr_rate,
8577 progress_function * progr_fun) 8595 progress_function * progr_fun)
8578{ 8596{
8579 size_t cur_token; 8597 size_t cur_token;
8580 char * value; 8598 char * value;
8581 int r; 8599 int r;
8582 8600
8583 cur_token = * index; 8601 cur_token = * index;
8584 8602
8585 r = mailimap_space_parse(fd, buffer, &cur_token); 8603 r = mailimap_space_parse(fd, buffer, &cur_token);
8586 if (r != MAILIMAP_NO_ERROR) 8604 if (r != MAILIMAP_NO_ERROR)
8587 return r; 8605 return r;
8588 8606
8589 r = mailimap_resp_text_code_other_2_parse(fd, buffer, &cur_token, 8607 r = mailimap_resp_text_code_other_2_parse(fd, buffer, &cur_token,
8590 &value, 8608 &value,
8591 progr_rate, progr_fun); 8609 progr_rate, progr_fun);
8592 if (r != MAILIMAP_NO_ERROR) 8610 if (r != MAILIMAP_NO_ERROR)
8593 return r; 8611 return r;
8594 8612
8595 * result = value; 8613 * result = value;
8596 * index = cur_token; 8614 * index = cur_token;
8597 8615
8598 return MAILIMAP_NO_ERROR; 8616 return MAILIMAP_NO_ERROR;
8599} 8617}
8600 8618
8601/* 8619/*
8602 atom [SP 1*<any TEXT-CHAR except "]">] 8620 atom [SP 1*<any TEXT-CHAR except "]">]
8603*/ 8621*/
8604 8622
8605static int 8623static int
8606mailimap_resp_text_code_other_parse(mailstream * fd, MMAPString * buffer, 8624mailimap_resp_text_code_other_parse(mailstream * fd, MMAPString * buffer,
8607 size_t * index, 8625 size_t * index,
8608 struct mailimap_resp_text_code ** result, 8626 struct mailimap_resp_text_code ** result,
8609 size_t progr_rate, 8627 size_t progr_rate,
8610 progress_function * progr_fun) 8628 progress_function * progr_fun)
8611{ 8629{
8612 size_t cur_token; 8630 size_t cur_token;
8613 char * atom; 8631 char * atom;
8614 char * value; 8632 char * value;
8615 struct mailimap_resp_text_code * resp_text_code; 8633 struct mailimap_resp_text_code * resp_text_code;
8616 int r; 8634 int r;
8617 int res; 8635 int res;
8618 8636
8619 cur_token = * index; 8637 cur_token = * index;
8620 atom = NULL; 8638 atom = NULL;
8621 value = NULL; 8639 value = NULL;
8622 8640
8623 r = mailimap_atom_parse(fd, buffer, &cur_token, &atom, 8641 r = mailimap_atom_parse(fd, buffer, &cur_token, &atom,
8624 progr_rate, progr_fun); 8642 progr_rate, progr_fun);
8625 if (r != MAILIMAP_NO_ERROR) { 8643 if (r != MAILIMAP_NO_ERROR) {
8626 res = r; 8644 res = r;
8627 goto err; 8645 goto err;
8628 } 8646 }
8629 8647
8630 r = mailimap_resp_text_code_other_1_parse(fd, buffer, &cur_token, 8648 r = mailimap_resp_text_code_other_1_parse(fd, buffer, &cur_token,
8631 &value, progr_rate, progr_fun); 8649 &value, progr_rate, progr_fun);
8632 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) { 8650 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) {
8633 res = r; 8651 res = r;
8634 goto err; 8652 goto err;
8635 } 8653 }
8636 8654
8637 resp_text_code = mailimap_resp_text_code_new(MAILIMAP_RESP_TEXT_CODE_OTHER, 8655 resp_text_code = mailimap_resp_text_code_new(MAILIMAP_RESP_TEXT_CODE_OTHER,
8638 NULL, NULL, NULL, 8656 NULL, NULL, NULL,
8639 0, 0, 0, atom, value); 8657 0, 0, 0, atom, value);
8640 if (resp_text_code == NULL) { 8658 if (resp_text_code == NULL) {
8641 res = MAILIMAP_ERROR_MEMORY; 8659 res = MAILIMAP_ERROR_MEMORY;
8642 goto free_value; 8660 goto free_value;
8643 } 8661 }
8644 8662
8645 * result = resp_text_code; 8663 * result = resp_text_code;
8646 * index = cur_token; 8664 * index = cur_token;
8647 8665
8648 return MAILIMAP_NO_ERROR; 8666 return MAILIMAP_NO_ERROR;
8649 8667
8650 free_value: 8668 free_value:
8651 if (value != NULL) 8669 if (value != NULL)
8652 free(value); 8670 free(value);
8653 mailimap_atom_free(atom); 8671 mailimap_atom_free(atom);
8654 err: 8672 err:
8655 return res; 8673 return res;
8656} 8674}
8657 8675
8658 8676
8659 8677
8660/* 8678/*
8661 resp-text-code = "ALERT" / 8679 resp-text-code = "ALERT" /
8662 "BADCHARSET" [SP "(" astring *(SP astring) ")" ] / 8680 "BADCHARSET" [SP "(" astring *(SP astring) ")" ] /
8663 capability-data / "PARSE" / 8681 capability-data / "PARSE" /
8664 "PERMANENTFLAGS" SP "(" [flag-perm *(SP flag-perm)] ")" / 8682 "PERMANENTFLAGS" SP "(" [flag-perm *(SP flag-perm)] ")" /
8665 "READ-ONLY" / "READ-WRITE" / "TRYCREATE" / 8683 "READ-ONLY" / "READ-WRITE" / "TRYCREATE" /
8666 "UIDNEXT" SP nz-number / "UIDVALIDITY" SP nz-number / 8684 "UIDNEXT" SP nz-number / "UIDVALIDITY" SP nz-number /
8667 "UNSEEN" SP nz-number / 8685 "UNSEEN" SP nz-number /
8668 atom [SP 1*<any TEXT-CHAR except "]">] 8686 atom [SP 1*<any TEXT-CHAR except "]">]
8669*/ 8687*/
8670 8688
8671static int 8689static int
8672mailimap_resp_text_code_parse(mailstream * fd, MMAPString * buffer, 8690mailimap_resp_text_code_parse(mailstream * fd, MMAPString * buffer,
8673 size_t * index, 8691 size_t * index,
8674 struct mailimap_resp_text_code ** result, 8692 struct mailimap_resp_text_code ** result,
8675 size_t progr_rate, 8693 size_t progr_rate,
8676 progress_function * progr_fun) 8694 progress_function * progr_fun)
8677{ 8695{
8678 size_t cur_token; 8696 size_t cur_token;
8679 struct mailimap_resp_text_code * resp_text_code; 8697 struct mailimap_resp_text_code * resp_text_code;
8680 clist * badcharset; 8698 clist * badcharset;
8681 clist * permanentflags; 8699 clist * permanentflags;
8682 struct mailimap_capability_data * cap_data; 8700 struct mailimap_capability_data * cap_data;
8683 int type; 8701 int type;
8684 int r; 8702 int r;
8685 int res; 8703 int res;
8686 8704
8687 cur_token = * index; 8705 cur_token = * index;
8688 8706
8689 resp_text_code = NULL; 8707 resp_text_code = NULL;
8690 badcharset = NULL; 8708 badcharset = NULL;
8691 cap_data = NULL; 8709 cap_data = NULL;
8692 permanentflags = NULL; 8710 permanentflags = NULL;
8693 8711
8694 r = mailimap_resp_text_code_1_parse(fd, buffer, &cur_token, &type); 8712 r = mailimap_resp_text_code_1_parse(fd, buffer, &cur_token, &type);
8695 if (r == MAILIMAP_NO_ERROR) { 8713 if (r == MAILIMAP_NO_ERROR) {
8696 /* do nothing */ 8714 /* do nothing */
8697 } 8715 }
8698 8716
8699 if (r == MAILIMAP_ERROR_PARSE) { 8717 if (r == MAILIMAP_ERROR_PARSE) {
8700 8718
8701 r = mailimap_resp_text_code_badcharset_parse(fd, buffer, &cur_token, 8719 r = mailimap_resp_text_code_badcharset_parse(fd, buffer, &cur_token,
8702 &badcharset, 8720 &badcharset,
8703 progr_rate, progr_fun); 8721 progr_rate, progr_fun);
8704 if (r == MAILIMAP_NO_ERROR) 8722 if (r == MAILIMAP_NO_ERROR)
8705 type = MAILIMAP_RESP_TEXT_CODE_BADCHARSET; 8723 type = MAILIMAP_RESP_TEXT_CODE_BADCHARSET;
8706 } 8724 }
8707 8725
8708 if (r == MAILIMAP_ERROR_PARSE) { 8726 if (r == MAILIMAP_ERROR_PARSE) {
8709 8727
8710 r = mailimap_capability_data_parse(fd, buffer, &cur_token, 8728 r = mailimap_capability_data_parse(fd, buffer, &cur_token,
8711 &cap_data, 8729 &cap_data,
8712 progr_rate, progr_fun); 8730 progr_rate, progr_fun);
8713 if (r == MAILIMAP_NO_ERROR) 8731 if (r == MAILIMAP_NO_ERROR)
8714 type = MAILIMAP_RESP_TEXT_CODE_CAPABILITY_DATA; 8732 type = MAILIMAP_RESP_TEXT_CODE_CAPABILITY_DATA;
8715 } 8733 }
8716 8734
8717 if (r == MAILIMAP_ERROR_PARSE) { 8735 if (r == MAILIMAP_ERROR_PARSE) {
8718 r = mailimap_resp_text_code_permanentflags_parse(fd, buffer, &cur_token, 8736 r = mailimap_resp_text_code_permanentflags_parse(fd, buffer, &cur_token,
8719 &permanentflags, 8737 &permanentflags,
8720 progr_rate, 8738 progr_rate,
8721 progr_fun); 8739 progr_fun);
8722 if (r == MAILIMAP_NO_ERROR) 8740 if (r == MAILIMAP_NO_ERROR)
8723 type = MAILIMAP_RESP_TEXT_CODE_PERMANENTFLAGS; 8741 type = MAILIMAP_RESP_TEXT_CODE_PERMANENTFLAGS;
8724 } 8742 }
8725 8743
8726 if (r == MAILIMAP_ERROR_PARSE) { 8744 if (r == MAILIMAP_ERROR_PARSE) {
8727 r = mailimap_resp_text_code_number_parse(fd, buffer, &cur_token, 8745 r = mailimap_resp_text_code_number_parse(fd, buffer, &cur_token,
8728 &resp_text_code, 8746 &resp_text_code,
8729 progr_rate, progr_fun); 8747 progr_rate, progr_fun);
8730 } 8748 }
8731 8749
8732 if (r == MAILIMAP_ERROR_PARSE) { 8750 if (r == MAILIMAP_ERROR_PARSE) {
8733 r = mailimap_resp_text_code_other_parse(fd, buffer, &cur_token, 8751 r = mailimap_resp_text_code_other_parse(fd, buffer, &cur_token,
8734 &resp_text_code, 8752 &resp_text_code,
8735 progr_rate, progr_fun); 8753 progr_rate, progr_fun);
8736 } 8754 }
8737 8755
8738 if (r != MAILIMAP_NO_ERROR) { 8756 if (r != MAILIMAP_NO_ERROR) {
8739 res = r; 8757 res = r;
8740 goto err; 8758 goto err;
8741 } 8759 }
8742 8760
8743 if (resp_text_code == NULL) { 8761 if (resp_text_code == NULL) {
8744 resp_text_code = mailimap_resp_text_code_new(type, 8762 resp_text_code = mailimap_resp_text_code_new(type,
8745 badcharset, cap_data, 8763 badcharset, cap_data,
8746 permanentflags, 8764 permanentflags,
8747 0, 0, 0, NULL, NULL); 8765 0, 0, 0, NULL, NULL);
8748 if (resp_text_code == NULL) { 8766 if (resp_text_code == NULL) {
8749 res = MAILIMAP_ERROR_MEMORY; 8767 res = MAILIMAP_ERROR_MEMORY;
8750 goto free; 8768 goto free;
8751 } 8769 }
8752 } 8770 }
8753 8771
8754 * result = resp_text_code; 8772 * result = resp_text_code;
8755 * index = cur_token; 8773 * index = cur_token;
8756 8774
8757 return MAILIMAP_NO_ERROR; 8775 return MAILIMAP_NO_ERROR;
8758 8776
8759free: 8777free:
8760 if (permanentflags) { 8778 if (permanentflags) {
8761 clist_foreach(permanentflags, 8779 clist_foreach(permanentflags,
8762 (clist_func) mailimap_flag_perm_free, NULL); 8780 (clist_func) mailimap_flag_perm_free, NULL);
8763 clist_free(permanentflags); 8781 clist_free(permanentflags);
8764 } 8782 }
8765 if (cap_data) 8783 if (cap_data)
8766 mailimap_capability_data_free(cap_data); 8784 mailimap_capability_data_free(cap_data);
8767 if (badcharset) { 8785 if (badcharset) {
8768 clist_foreach(badcharset, (clist_func) mailimap_astring_free, NULL); 8786 clist_foreach(badcharset, (clist_func) mailimap_astring_free, NULL);
8769 clist_free(badcharset); 8787 clist_free(badcharset);
8770 } 8788 }
8771err: 8789err:
8772 return res; 8790 return res;
8773} 8791}
8774 8792
8775/* 8793/*
8776 UNIMPLEMENTED 8794 UNIMPLEMENTED
8777 search = "SEARCH" [SP "CHARSET" SP astring] 1*(SP search-key) 8795 search = "SEARCH" [SP "CHARSET" SP astring] 1*(SP search-key)
8778 ; CHARSET argument to MUST be registered with IANA 8796 ; CHARSET argument to MUST be registered with IANA
8779*/ 8797*/
8780 8798
8781/* 8799/*
8782 UNIMPLEMENTED 8800 UNIMPLEMENTED
8783 search-key = "ALL" / "ANSWERED" / "BCC" SP astring / 8801 search-key = "ALL" / "ANSWERED" / "BCC" SP astring /
8784 "BEFORE" SP date / "BODY" SP astring / 8802 "BEFORE" SP date / "BODY" SP astring /
8785 "CC" SP astring / "DELETED" / "FLAGGED" / 8803 "CC" SP astring / "DELETED" / "FLAGGED" /
8786 "FROM" SP astring / "KEYWORD" SP flag-keyword / "NEW" / 8804 "FROM" SP astring / "KEYWORD" SP flag-keyword / "NEW" /
8787 "OLD" / "ON" SP date / "RECENT" / "SEEN" / 8805 "OLD" / "ON" SP date / "RECENT" / "SEEN" /
8788 "SINCE" SP date / "SUBJECT" SP astring / 8806 "SINCE" SP date / "SUBJECT" SP astring /
8789 "TEXT" SP astring / "TO" SP astring / 8807 "TEXT" SP astring / "TO" SP astring /
8790 "UNANSWERED" / "UNDELETED" / "UNFLAGGED" / 8808 "UNANSWERED" / "UNDELETED" / "UNFLAGGED" /
8791 "UNKEYWORD" SP flag-keyword / "UNSEEN" / 8809 "UNKEYWORD" SP flag-keyword / "UNSEEN" /
8792 ; Above this line were in [IMAP2] 8810 ; Above this line were in [IMAP2]
8793 "DRAFT" / "HEADER" SP header-fld-name SP astring / 8811 "DRAFT" / "HEADER" SP header-fld-name SP astring /
8794 "LARGER" SP number / "NOT" SP search-key / 8812 "LARGER" SP number / "NOT" SP search-key /
8795 "OR" SP search-key SP search-key / 8813 "OR" SP search-key SP search-key /
8796 "SENTBEFORE" SP date / "SENTON" SP date / 8814 "SENTBEFORE" SP date / "SENTON" SP date /
8797 "SENTSINCE" SP date / "SMALLER" SP number / 8815 "SENTSINCE" SP date / "SMALLER" SP number /
8798 "UID" SP set / "UNDRAFT" / set / 8816 "UID" SP set / "UNDRAFT" / set /
8799 "(" search-key *(SP search-key) ")" 8817 "(" search-key *(SP search-key) ")"
8800*/ 8818*/
8801 8819
8802/* 8820/*
8803 section = "[" [section-spec] "]" 8821 section = "[" [section-spec] "]"
8804*/ 8822*/
8805 8823
8806static int 8824static int
8807mailimap_section_parse(mailstream * fd, MMAPString * buffer, 8825mailimap_section_parse(mailstream * fd, MMAPString * buffer,
8808 size_t * index, 8826 size_t * index,
8809 struct mailimap_section ** result, 8827 struct mailimap_section ** result,
8810 size_t progr_rate, 8828 size_t progr_rate,
8811 progress_function * progr_fun) 8829 progress_function * progr_fun)
8812{ 8830{
8813 struct mailimap_section_spec * section_spec; 8831 struct mailimap_section_spec * section_spec;
8814 size_t cur_token; 8832 size_t cur_token;
8815 struct mailimap_section * section; 8833 struct mailimap_section * section;
8816 int r; 8834 int r;
8817 int res; 8835 int res;
8818 8836
8819 cur_token = * index; 8837 cur_token = * index;
8820 8838
8821 section_spec = NULL; 8839 section_spec = NULL;
8822 8840
8823 r = mailimap_obracket_parse(fd, buffer, &cur_token); 8841 r = mailimap_obracket_parse(fd, buffer, &cur_token);
8824 if (r != MAILIMAP_NO_ERROR) { 8842 if (r != MAILIMAP_NO_ERROR) {
8825 res = r; 8843 res = r;
8826 goto err; 8844 goto err;
8827 } 8845 }
8828 8846
8829 r = mailimap_section_spec_parse(fd, buffer, &cur_token, &section_spec, 8847 r = mailimap_section_spec_parse(fd, buffer, &cur_token, &section_spec,
8830 progr_rate, progr_fun); 8848 progr_rate, progr_fun);
8831 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) { 8849 if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) {
8832 res = r; 8850 res = r;
8833 goto err; 8851 goto err;
8834 } 8852 }
8835 8853
8836 r = mailimap_cbracket_parse(fd, buffer, &cur_token); 8854 r = mailimap_cbracket_parse(fd, buffer, &cur_token);
8837 if (r != MAILIMAP_NO_ERROR) { 8855 if (r != MAILIMAP_NO_ERROR) {
8838 res = r; 8856 res = r;
8839 goto err; 8857 goto err;
8840 } 8858 }
8841 8859
8842 if (section_spec == NULL) 8860 if (section_spec == NULL)
8843 section = NULL; 8861 section = NULL;
8844 else { 8862 else {
8845 section = mailimap_section_new(section_spec); 8863 section = mailimap_section_new(section_spec);
8846 if (section == NULL) { 8864 if (section == NULL) {
8847 res = MAILIMAP_ERROR_MEMORY; 8865 res = MAILIMAP_ERROR_MEMORY;
8848 goto free; 8866 goto free;
8849 } 8867 }
8850 } 8868 }
8851 8869
8852 * result = section; 8870 * result = section;
8853 * index = cur_token; 8871 * index = cur_token;
8854 8872
8855 return MAILIMAP_NO_ERROR; 8873 return MAILIMAP_NO_ERROR;
8856 8874
8857 free: 8875 free:
8858 mailimap_section_spec_free(section_spec); 8876 mailimap_section_spec_free(section_spec);
8859 err: 8877 err:
8860 return res; 8878 return res;
8861} 8879}
8862 8880
8863/* 8881/*
8864 section-msgtext = "HEADER" / "HEADER.FIELDS" [".NOT"] SP header-list / 8882 section-msgtext = "HEADER" / "HEADER.FIELDS" [".NOT"] SP header-list /
8865 "TEXT" 8883 "TEXT"
8866 ; top-level or MESSAGE/RFC822 part 8884 ; top-level or MESSAGE/RFC822 part
8867*/ 8885*/
8868 8886
8869static int 8887static int
8870mailimap_section_msgtext_parse(mailstream * fd, MMAPString * buffer, 8888mailimap_section_msgtext_parse(mailstream * fd, MMAPString * buffer,
8871 size_t * index, 8889 size_t * index,
8872 struct mailimap_section_msgtext ** result, 8890 struct mailimap_section_msgtext ** result,
8873 size_t progr_rate, 8891 size_t progr_rate,
8874 progress_function * progr_fun) 8892 progress_function * progr_fun)
8875{ 8893{
8876 size_t cur_token; 8894 size_t cur_token;
8877 int type; 8895 int type;
8878 struct mailimap_header_list * header_list; 8896 struct mailimap_header_list * header_list;
8879 struct mailimap_section_msgtext * msgtext; 8897 struct mailimap_section_msgtext * msgtext;
8880 int r; 8898 int r;
8881 int res; 8899 int res;
8882 8900
8883 cur_token = * index; 8901 cur_token = * index;
8884 8902
8885 header_list = NULL; 8903 header_list = NULL;
8886 8904
8887 type = mailimap_section_msgtext_get_token_value(fd, buffer, &cur_token); 8905 type = mailimap_section_msgtext_get_token_value(fd, buffer, &cur_token);
8888 if (type == -1) { 8906 if (type == -1) {
8889 res = MAILIMAP_ERROR_PARSE; 8907 res = MAILIMAP_ERROR_PARSE;
8890 goto err; 8908 goto err;
8891 } 8909 }
8892 8910
8893 if (type == MAILIMAP_SECTION_MSGTEXT_HEADER_FIELDS) { 8911 if (type == MAILIMAP_SECTION_MSGTEXT_HEADER_FIELDS) {
8894 r = mailimap_header_list_parse(fd, buffer, &cur_token, &header_list, 8912 r = mailimap_header_list_parse(fd, buffer, &cur_token, &header_list,
8895 progr_rate, progr_fun); 8913 progr_rate, progr_fun);
8896 if (r != MAILIMAP_NO_ERROR) { 8914 if (r != MAILIMAP_NO_ERROR) {
8897 res = r; 8915 res = r;
8898 goto err; 8916 goto err;
8899 } 8917 }
8900 } 8918 }
8901 else if (type == MAILIMAP_SECTION_MSGTEXT_HEADER_FIELDS_NOT) { 8919 else if (type == MAILIMAP_SECTION_MSGTEXT_HEADER_FIELDS_NOT) {
8902 r = mailimap_header_list_parse(fd, buffer, &cur_token, &header_list, 8920 r = mailimap_header_list_parse(fd, buffer, &cur_token, &header_list,
8903 progr_rate, progr_fun); 8921 progr_rate, progr_fun);
8904 if (r != MAILIMAP_NO_ERROR) { 8922 if (r != MAILIMAP_NO_ERROR) {
8905 res = r; 8923 res = r;
8906 goto err; 8924 goto err;
8907 } 8925 }
8908 } 8926 }
8909 8927
8910 msgtext = mailimap_section_msgtext_new(type, header_list); 8928 msgtext = mailimap_section_msgtext_new(type, header_list);
8911 if (msgtext == NULL) { 8929 if (msgtext == NULL) {
8912 res = MAILIMAP_ERROR_MEMORY; 8930 res = MAILIMAP_ERROR_MEMORY;
8913 goto free_header_list; 8931 goto free_header_list;
8914 } 8932 }
8915 8933
8916 * result = msgtext; 8934 * result = msgtext;
8917 * index = cur_token; 8935 * index = cur_token;
8918 8936
8919 return MAILIMAP_NO_ERROR; 8937 return MAILIMAP_NO_ERROR;
8920 8938
8921 free_header_list: 8939 free_header_list:
8922 if (header_list) 8940 if (header_list)
8923 mailimap_header_list_free(header_list); 8941 mailimap_header_list_free(header_list);
8924 err: 8942 err:
8925 return res; 8943 return res;
8926} 8944}
8927 8945
8928/* 8946/*
8929 section-part = nz-number *("." nz-number) 8947 section-part = nz-number *("." nz-number)
8930 ; body part nesting 8948 ; body part nesting
8931*/ 8949*/
8932 8950
8933static int 8951static int
8934mailimap_section_part_parse(mailstream * fd, MMAPString * buffer, 8952mailimap_section_part_parse(mailstream * fd, MMAPString * buffer,
8935 size_t * index, 8953 size_t * index,
8936 struct mailimap_section_part ** result, 8954 struct mailimap_section_part ** result,
8937 size_t progr_rate, 8955 size_t progr_rate,
8938 progress_function * progr_fun) 8956 progress_function * progr_fun)
8939{ 8957{
8940 struct mailimap_section_part * section_part; 8958 struct mailimap_section_part * section_part;
8941 size_t cur_token; 8959 size_t cur_token;
8942 clist * section_id; 8960 clist * section_id;
8943 int r; 8961 int r;
8944 int res; 8962 int res;
8945 8963
8946 cur_token = * index; 8964 cur_token = * index;
8947 section_id = NULL; 8965 section_id = NULL;
8948 8966
8949 r = mailimap_struct_list_parse(fd, buffer, &cur_token, &section_id, '.', 8967 r = mailimap_struct_list_parse(fd, buffer, &cur_token, &section_id, '.',
8950 (mailimap_struct_parser *) 8968 (mailimap_struct_parser *)
8951 mailimap_nz_number_alloc_parse, 8969 mailimap_nz_number_alloc_parse,
8952 (mailimap_struct_destructor *) 8970 (mailimap_struct_destructor *)
8953 mailimap_number_alloc_free, 8971 mailimap_number_alloc_free,
8954 progr_rate, progr_fun); 8972 progr_rate, progr_fun);
8955 if (r != MAILIMAP_NO_ERROR) { 8973 if (r != MAILIMAP_NO_ERROR) {
8956 res = r; 8974 res = r;
8957 goto err; 8975 goto err;
8958 } 8976 }
8959 8977
8960 section_part = mailimap_section_part_new(section_id); 8978 section_part = mailimap_section_part_new(section_id);
8961 if (section_part == NULL) { 8979 if (section_part == NULL) {
8962 res = MAILIMAP_ERROR_MEMORY; 8980 res = MAILIMAP_ERROR_MEMORY;
8963 goto free_section_id; 8981 goto free_section_id;
8964 } 8982 }
8965 8983
8966 * result = section_part; 8984 * result = section_part;
8967 * index = cur_token; 8985 * index = cur_token;
8968 8986
8969 return MAILIMAP_NO_ERROR; 8987 return MAILIMAP_NO_ERROR;
8970 8988
8971 free_section_id: 8989 free_section_id:
8972 clist_foreach(section_id, (clist_func) mailimap_number_alloc_free, NULL); 8990 clist_foreach(section_id, (clist_func) mailimap_number_alloc_free, NULL);
8973 clist_free(section_id); 8991 clist_free(section_id);
8974 err: 8992 err:
8975 return res; 8993 return res;
8976} 8994}
8977 8995
8978/* 8996/*
8979 section-spec = section-msgtext / (section-part ["." section-text]) 8997 section-spec = section-msgtext / (section-part ["." section-text])
8980*/ 8998*/
8981 8999
8982static int 9000static int
8983mailimap_section_spec_parse(mailstream * fd, MMAPString * buffer, 9001mailimap_section_spec_parse(mailstream * fd, MMAPString * buffer,
8984 size_t * index, 9002 size_t * index,
8985 struct mailimap_section_spec ** result, 9003 struct mailimap_section_spec ** result,
8986 size_t progr_rate, 9004 size_t progr_rate,
8987 progress_function * progr_fun) 9005 progress_function * progr_fun)
8988{ 9006{
8989 int type; 9007 int type;
8990 struct mailimap_section_msgtext * section_msgtext; 9008 struct mailimap_section_msgtext * section_msgtext;
8991 struct mailimap_section_part * section_part; 9009 struct mailimap_section_part * section_part;
8992 struct mailimap_section_text * section_text; 9010 struct mailimap_section_text * section_text;
8993 struct mailimap_section_spec * section_spec; 9011 struct mailimap_section_spec * section_spec;
8994 size_t cur_token; 9012 size_t cur_token;
8995 int r; 9013 int r;
8996 int res; 9014 int res;
8997 size_t final_token; 9015 size_t final_token;
8998 9016
8999 cur_token = * index; 9017 cur_token = * index;
9000 9018
9001 section_msgtext = NULL; 9019 section_msgtext = NULL;
9002 section_part = NULL; 9020 section_part = NULL;
9003 section_text = NULL; 9021 section_text = NULL;
9004 9022
9005 r = mailimap_section_msgtext_parse(fd, buffer, &cur_token, 9023 r = mailimap_section_msgtext_parse(fd, buffer, &cur_token,
9006 &section_msgtext, 9024 &section_msgtext,
9007 progr_rate, progr_fun); 9025 progr_rate, progr_fun);
9008 switch (r) { 9026 switch (r) {
9009 case MAILIMAP_NO_ERROR: 9027 case MAILIMAP_NO_ERROR:
9010 type = MAILIMAP_SECTION_SPEC_SECTION_MSGTEXT; 9028 type = MAILIMAP_SECTION_SPEC_SECTION_MSGTEXT;
9011 break; 9029 break;
9012 9030
9013 case MAILIMAP_ERROR_PARSE: 9031 case MAILIMAP_ERROR_PARSE:
9014 9032
9015 r = mailimap_section_part_parse(fd, buffer, &cur_token, 9033 r = mailimap_section_part_parse(fd, buffer, &cur_token,
9016 &section_part, 9034 &section_part,
9017 progr_rate, progr_fun); 9035 progr_rate, progr_fun);
9018 if (r != MAILIMAP_NO_ERROR) { 9036 if (r != MAILIMAP_NO_ERROR) {
9019 res = r; 9037 res = r;
9020 goto err; 9038 goto err;
9021 } 9039 }
9022 9040
9023 final_token = cur_token; 9041 final_token = cur_token;
9024 9042
9025 type = MAILIMAP_SECTION_SPEC_SECTION_PART; 9043 type = MAILIMAP_SECTION_SPEC_SECTION_PART;
9026 9044
9027 r = mailimap_dot_parse(fd, buffer, &cur_token); 9045 r = mailimap_dot_parse(fd, buffer, &cur_token);
9028 if (r == MAILIMAP_NO_ERROR) { 9046 if (r == MAILIMAP_NO_ERROR) {
9029 r = mailimap_section_text_parse(fd, buffer, &cur_token, &section_text, 9047 r = mailimap_section_text_parse(fd, buffer, &cur_token, &section_text,
9030 progr_rate, progr_fun); 9048 progr_rate, progr_fun);
9031 if (r == MAILIMAP_NO_ERROR) { 9049 if (r == MAILIMAP_NO_ERROR) {
9032 final_token = cur_token; 9050 final_token = cur_token;
9033 } 9051 }
9034 else if (r != MAILIMAP_ERROR_PARSE) { 9052 else if (r != MAILIMAP_ERROR_PARSE) {
9035 res = r; 9053 res = r;
9036 goto err; 9054 goto err;
9037 } 9055 }
9038 } 9056 }
9039 else if (r != MAILIMAP_ERROR_PARSE) { 9057 else if (r != MAILIMAP_ERROR_PARSE) {
9040 res = r; 9058 res = r;
9041 goto err; 9059 goto err;
9042 } 9060 }
9043 9061
9044 cur_token = final_token; 9062 cur_token = final_token;
9045 break; 9063 break;
9046 9064
9047 default: 9065 default:
9048 res = r; 9066 res = r;
9049 goto err; 9067 goto err;
9050 } 9068 }
9051 9069
9052 section_spec = mailimap_section_spec_new(type, section_msgtext, 9070 section_spec = mailimap_section_spec_new(type, section_msgtext,
9053 section_part, section_text); 9071 section_part, section_text);
9054 if (section_spec == NULL) { 9072 if (section_spec == NULL) {
9055 res = MAILIMAP_ERROR_MEMORY; 9073 res = MAILIMAP_ERROR_MEMORY;
9056 goto free; 9074 goto free;
9057 } 9075 }
9058 9076
9059 * result = section_spec; 9077 * result = section_spec;
9060 * index = cur_token; 9078 * index = cur_token;
9061 9079
9062 return MAILIMAP_NO_ERROR; 9080 return MAILIMAP_NO_ERROR;
9063 9081
9064 free: 9082 free:
9065 if (section_msgtext) 9083 if (section_msgtext)
9066 mailimap_section_msgtext_free(section_msgtext); 9084 mailimap_section_msgtext_free(section_msgtext);
9067 if (section_part) 9085 if (section_part)
9068 mailimap_section_part_free(section_part); 9086 mailimap_section_part_free(section_part);
9069 if (section_text) 9087 if (section_text)
9070 mailimap_section_text_free(section_text); 9088 mailimap_section_text_free(section_text);
9071 err: 9089 err:
9072 return res; 9090 return res;
9073} 9091}
9074 9092
9075/* 9093/*
9076 section-text = section-msgtext / "MIME" 9094 section-text = section-msgtext / "MIME"
9077 ; text other than actual body part (headers, etc.) 9095 ; text other than actual body part (headers, etc.)
9078*/ 9096*/
9079 9097
9080static int 9098static int
9081mailimap_section_text_parse(mailstream * fd, MMAPString * buffer, 9099mailimap_section_text_parse(mailstream * fd, MMAPString * buffer,
9082 size_t * index, 9100 size_t * index,
9083 struct mailimap_section_text ** result, 9101 struct mailimap_section_text ** result,
9084 size_t progr_rate, 9102 size_t progr_rate,
9085 progress_function * progr_fun) 9103 progress_function * progr_fun)
9086{ 9104{
9087 struct mailimap_section_msgtext * section_msgtext; 9105 struct mailimap_section_msgtext * section_msgtext;
9088 size_t cur_token; 9106 size_t cur_token;
9089 struct mailimap_section_text * section_text; 9107 struct mailimap_section_text * section_text;
9090 int type; 9108 int type;
9091 int r; 9109 int r;
9092 int res; 9110 int res;
9093 9111
9094 cur_token = * index; 9112 cur_token = * index;
9095 9113
9096 section_msgtext = NULL; 9114 section_msgtext = NULL;
9097 9115
9098 type = MAILIMAP_SECTION_TEXT_ERROR; /* XXX - removes a gcc warning */ 9116 type = MAILIMAP_SECTION_TEXT_ERROR; /* XXX - removes a gcc warning */
9099 9117
9100 r = mailimap_section_msgtext_parse(fd, buffer, &cur_token, &section_msgtext, 9118 r = mailimap_section_msgtext_parse(fd, buffer, &cur_token, &section_msgtext,
9101 progr_rate, progr_fun); 9119 progr_rate, progr_fun);
9102 if (r == MAILIMAP_NO_ERROR) 9120 if (r == MAILIMAP_NO_ERROR)
9103 type = MAILIMAP_SECTION_TEXT_SECTION_MSGTEXT; 9121 type = MAILIMAP_SECTION_TEXT_SECTION_MSGTEXT;
9104 9122
9105 if (r == MAILIMAP_ERROR_PARSE) { 9123 if (r == MAILIMAP_ERROR_PARSE) {
9106 r= mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, "MIME"); 9124 r= mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, "MIME");
9107 9125
9108 if (r == MAILIMAP_NO_ERROR) 9126 if (r == MAILIMAP_NO_ERROR)
9109 type = MAILIMAP_SECTION_TEXT_MIME; 9127 type = MAILIMAP_SECTION_TEXT_MIME;
9110 } 9128 }
9111 9129
9112 if (r != MAILIMAP_NO_ERROR) { 9130 if (r != MAILIMAP_NO_ERROR) {
9113 res = r; 9131 res = r;
9114 goto err; 9132 goto err;
9115 } 9133 }
9116 9134
9117 section_text = mailimap_section_text_new(type, section_msgtext); 9135 section_text = mailimap_section_text_new(type, section_msgtext);
9118 if (section_text == NULL) { 9136 if (section_text == NULL) {
9119 res = MAILIMAP_ERROR_MEMORY; 9137 res = MAILIMAP_ERROR_MEMORY;
9120 goto free; 9138 goto free;
9121 } 9139 }
9122 9140
9123 * result = section_text; 9141 * result = section_text;
9124 * index = cur_token; 9142 * index = cur_token;
9125 9143
9126 return MAILIMAP_NO_ERROR; 9144 return MAILIMAP_NO_ERROR;
9127 9145
9128 free: 9146 free:
9129 if (section_msgtext) 9147 if (section_msgtext)
9130 mailimap_section_msgtext_free(section_msgtext); 9148 mailimap_section_msgtext_free(section_msgtext);
9131 err: 9149 err:
9132 return res; 9150 return res;
9133} 9151}
9134 9152
9135/* 9153/*
9136 UNIMPLEMENTED 9154 UNIMPLEMENTED
9137 select = "SELECT" SP mailbox 9155 select = "SELECT" SP mailbox
9138*/ 9156*/
9139 9157
9140/* 9158/*
9141 UNIMPLEMENTED 9159 UNIMPLEMENTED
9142 sequence-num = nz-number / "*" 9160 sequence-num = nz-number / "*"
9143 ; * is the largest number in use. For message 9161 ; * is the largest number in use. For message
9144 ; sequence numbers, it is the number of messages 9162 ; sequence numbers, it is the number of messages
9145 ; in the mailbox. For unique identifiers, it is 9163 ; in the mailbox. For unique identifiers, it is
9146 ; the unique identifier of the last message in 9164 ; the unique identifier of the last message in
9147 ; the mailbox. 9165 ; the mailbox.
9148*/ 9166*/
9149 9167
9150/* 9168/*
9151 UNIMPLEMENTED 9169 UNIMPLEMENTED
9152 set = sequence-num / (sequence-num ":" sequence-num) / 9170 set = sequence-num / (sequence-num ":" sequence-num) /
9153 (set "," set) 9171 (set "," set)
9154 ; Identifies a set of messages. For message 9172 ; Identifies a set of messages. For message
9155 ; sequence numbers, these are consecutive 9173 ; sequence numbers, these are consecutive
9156 ; numbers from 1 to the number of messages in 9174 ; numbers from 1 to the number of messages in
9157 ; the mailbox 9175 ; the mailbox
9158 ; Comma delimits individual numbers, colon 9176 ; Comma delimits individual numbers, colon
9159 ; delimits between two numbers inclusive. 9177 ; delimits between two numbers inclusive.
9160 ; Example: 2,4:7,9,12:* is 2,4,5,6,7,9,12,13, 9178 ; Example: 2,4:7,9,12:* is 2,4,5,6,7,9,12,13,
9161 ; 14,15 for a mailbox with 15 messages. 9179 ; 14,15 for a mailbox with 15 messages.
9162*/ 9180*/
9163 9181
9164/* 9182/*
9165 UNIMPLEMENTED 9183 UNIMPLEMENTED
9166 status = "STATUS" SP mailbox SP "(" status-att *(SP status-att) ")" 9184 status = "STATUS" SP mailbox SP "(" status-att *(SP status-att) ")"
9167*/ 9185*/
9168 9186
9169/* 9187/*
9170 status-att = "MESSAGES" / "RECENT" / "UIDNEXT" / "UIDVALIDITY" / 9188 status-att = "MESSAGES" / "RECENT" / "UIDNEXT" / "UIDVALIDITY" /
9171 "UNSEEN" 9189 "UNSEEN"
9172*/ 9190*/
9173 9191
9174static int mailimap_status_att_parse(mailstream * fd, MMAPString * buffer, 9192static int mailimap_status_att_parse(mailstream * fd, MMAPString * buffer,
9175 size_t * index, int * result) 9193 size_t * index, int * result)
9176{ 9194{
9177 int type; 9195 int type;
9178 size_t cur_token; 9196 size_t cur_token;
9179 9197
9180 cur_token = * index; 9198 cur_token = * index;
9181 9199
9182 type = mailimap_status_att_get_token_value(fd, buffer, &cur_token); 9200 type = mailimap_status_att_get_token_value(fd, buffer, &cur_token);
9183 9201
9184 if (type == -1) 9202 if (type == -1)
9185 return MAILIMAP_ERROR_PARSE; 9203 return MAILIMAP_ERROR_PARSE;
9186 9204
9187 * result = type; 9205 * result = type;
9188 * index = cur_token; 9206 * index = cur_token;
9189 9207
9190 return MAILIMAP_NO_ERROR; 9208 return MAILIMAP_NO_ERROR;
9191} 9209}
9192 9210
9193 9211
9194/* 9212/*
9195 UNIMPLEMENTED 9213 UNIMPLEMENTED
9196 store = "STORE" SP set SP store-att-flags 9214 store = "STORE" SP set SP store-att-flags
9197*/ 9215*/
9198 9216
9199/* 9217/*
9200 UNIMPLEMENTED 9218 UNIMPLEMENTED
9201 store-att-flags = (["+" / "-"] "FLAGS" [".SILENT"]) SP 9219 store-att-flags = (["+" / "-"] "FLAGS" [".SILENT"]) SP
9202 (flag-list / (flag *(SP flag))) 9220 (flag-list / (flag *(SP flag)))
9203*/ 9221*/
9204 9222
9205/* 9223/*
9206 string = quoted / literal 9224 string = quoted / literal
9207*/ 9225*/
9208 9226
9209static int 9227static int
9210mailimap_string_parse(mailstream * fd, MMAPString * buffer, 9228mailimap_string_parse(mailstream * fd, MMAPString * buffer,
9211 size_t * index, char ** result, 9229 size_t * index, char ** result,
9212 size_t * result_len, 9230 size_t * result_len,
9213 size_t progr_rate, 9231 size_t progr_rate,
9214 progress_function * progr_fun) 9232 progress_function * progr_fun)
9215{ 9233{
9216 size_t cur_token; 9234 size_t cur_token;
9217 char * string; 9235 char * string;
9218 int r; 9236 int r;
9219 size_t len; 9237 size_t len;
9220 9238
9221 cur_token = * index; 9239 cur_token = * index;
9222 9240
9223 r = mailimap_quoted_parse(fd, buffer, &cur_token, &string, 9241 r = mailimap_quoted_parse(fd, buffer, &cur_token, &string,
9224 progr_rate, progr_fun); 9242 progr_rate, progr_fun);
9225 if (r == MAILIMAP_NO_ERROR) 9243 if (r == MAILIMAP_NO_ERROR)
9226 len = strlen(string); 9244 len = strlen(string);
9227 else if (r == MAILIMAP_ERROR_PARSE) { 9245 else if (r == MAILIMAP_ERROR_PARSE) {
9228 r = mailimap_literal_parse(fd, buffer, &cur_token, &string, &len, 9246 r = mailimap_literal_parse(fd, buffer, &cur_token, &string, &len,
9229 progr_rate, progr_fun); 9247 progr_rate, progr_fun);
9230 } 9248 }
9231 9249
9232 if (r != MAILIMAP_NO_ERROR) 9250 if (r != MAILIMAP_NO_ERROR)
9233 return r; 9251 return r;
9234 9252
9235 * result = string; 9253 * result = string;
9236 if (result_len != NULL) 9254 if (result_len != NULL)
9237 * result_len = len; 9255 * result_len = len;
9238 * index = cur_token; 9256 * index = cur_token;
9239 9257
9240 return MAILIMAP_NO_ERROR; 9258 return MAILIMAP_NO_ERROR;
9241} 9259}
9242 9260
9243 9261
9244/* 9262/*
9245 UNIMPLEMENTED 9263 UNIMPLEMENTED
9246 subscribe = "SUBSCRIBE" SP mailbox 9264 subscribe = "SUBSCRIBE" SP mailbox
9247*/ 9265*/
9248 9266
9249/* 9267/*
9250 tag = 1*<any ASTRING-CHAR except "+"> 9268 tag = 1*<any ASTRING-CHAR except "+">
9251*/ 9269*/
9252 9270
9253/* 9271/*
9254 any ASTRING-CHAR except "+" 9272 any ASTRING-CHAR except "+"
9255*/ 9273*/
9256 9274
9257static int is_tag_char(char ch) 9275static int is_tag_char(char ch)
9258{ 9276{
9259 if (ch == '+') 9277 if (ch == '+')
9260 return FALSE; 9278 return FALSE;
9261 return is_astring_char(ch); 9279 return is_astring_char(ch);
9262} 9280}
9263 9281
9264/* 9282/*
9265 tag = 1*<any ASTRING-CHAR except "+"> 9283 tag = 1*<any ASTRING-CHAR except "+">
9266*/ 9284*/
9267 9285
9268static int mailimap_tag_parse(mailstream * fd, MMAPString * buffer, 9286static int mailimap_tag_parse(mailstream * fd, MMAPString * buffer,
9269 size_t * index, char ** result, 9287 size_t * index, char ** result,
9270 size_t progr_rate, 9288 size_t progr_rate,
9271 progress_function * progr_fun) 9289 progress_function * progr_fun)
9272{ 9290{
9273 size_t cur_token; 9291 size_t cur_token;
9274 char * tag; 9292 char * tag;
9275 int r; 9293 int r;
9276 9294
9277 cur_token = * index; 9295 cur_token = * index;
9278 9296
9279 r = mailimap_custom_string_parse(fd, buffer, &cur_token, &tag, 9297 r = mailimap_custom_string_parse(fd, buffer, &cur_token, &tag,
9280 is_tag_char); 9298 is_tag_char);
9281 if (r != MAILIMAP_NO_ERROR) 9299 if (r != MAILIMAP_NO_ERROR)
9282 return r; 9300 return r;
9283 9301
9284 * index = cur_token; 9302 * index = cur_token;
9285 * result = tag; 9303 * result = tag;
9286 9304
9287 return MAILIMAP_NO_ERROR; 9305 return MAILIMAP_NO_ERROR;
9288} 9306}
9289 9307
9290/* 9308/*
9291 text = 1*TEXT-CHAR 9309 text = 1*TEXT-CHAR
9292*/ 9310*/
9293 9311
9294static int mailimap_text_parse(mailstream * fd, MMAPString * buffer, 9312static int mailimap_text_parse(mailstream * fd, MMAPString * buffer,
9295 size_t * index, char ** result, 9313 size_t * index, char ** result,
9296 size_t progr_rate, 9314 size_t progr_rate,
9297 progress_function * progr_fun) 9315 progress_function * progr_fun)
9298{ 9316{
9299 return mailimap_custom_string_parse(fd, buffer, index, result, 9317 return mailimap_custom_string_parse(fd, buffer, index, result,
9300 is_text_char); 9318 is_text_char);
9301} 9319}
9302 9320
9303 9321
9304/* 9322/*
9305 TEXT-CHAR = <any CHAR except CR and LF> 9323 TEXT-CHAR = <any CHAR except CR and LF>
9306*/ 9324*/
9307 9325
9308static int is_text_char(char ch) 9326static int is_text_char(char ch)
9309{ 9327{
9310 if ((ch == '\r') || (ch == '\n')) 9328 if ((ch == '\r') || (ch == '\n'))
9311 return FALSE; 9329 return FALSE;
9312 9330
9313 return is_char(ch); 9331 return is_char(ch);
9314} 9332}
9315 9333
9316/* 9334/*
9317 time = 2DIGIT ":" 2DIGIT ":" 2DIGIT 9335 time = 2DIGIT ":" 2DIGIT ":" 2DIGIT
9318 ; Hours minutes seconds 9336 ; Hours minutes seconds
9319*/ 9337*/
9320 9338
9321/* 9339/*
9322 2DIGIT 9340 2DIGIT
9323*/ 9341*/
9324 9342
9325static int mailimap_2digit_parse(mailstream * fd, MMAPString * buffer, 9343static int mailimap_2digit_parse(mailstream * fd, MMAPString * buffer,
9326 size_t * index, int * result) 9344 size_t * index, int * result)
9327{ 9345{
9328#ifndef UNSTRICT_SYNTAX 9346#ifndef UNSTRICT_SYNTAX
9329 int digit; 9347 int digit;
9330 int two_digit; 9348 int two_digit;
9331 size_t cur_token; 9349 size_t cur_token;
9332 int r; 9350 int r;
9333 9351
9334 cur_token = * index; 9352 cur_token = * index;
9335 9353
9336 r = mailimap_digit_parse(fd, buffer, &cur_token, &digit); 9354 r = mailimap_digit_parse(fd, buffer, &cur_token, &digit);
9337 if (r != MAILIMAP_NO_ERROR) 9355 if (r != MAILIMAP_NO_ERROR)
9338 return r; 9356 return r;
9339 9357
9340 two_digit = digit; 9358 two_digit = digit;
9341 9359
9342 r = mailimap_digit_parse(fd, buffer, &cur_token, &digit); 9360 r = mailimap_digit_parse(fd, buffer, &cur_token, &digit);
9343 if (r != MAILIMAP_NO_ERROR) 9361 if (r != MAILIMAP_NO_ERROR)
9344 return r; 9362 return r;
9345 9363
9346 two_digit = two_digit * 10 + digit; 9364 two_digit = two_digit * 10 + digit;
9347 9365
9348 * result = two_digit; 9366 * result = two_digit;
9349 * index = cur_token; 9367 * index = cur_token;
9350 9368
9351 return MAILIMAP_NO_ERROR; 9369 return MAILIMAP_NO_ERROR;
9352#else 9370#else
9353 uint32_t number; 9371 uint32_t number;
9354 size_t cur_token; 9372 size_t cur_token;
9355 int r; 9373 int r;
9356 9374
9357 cur_token = * index; 9375 cur_token = * index;
9358 9376
9359 r = mailimap_number_parse(fd, buffer, &cur_token, &number); 9377 r = mailimap_number_parse(fd, buffer, &cur_token, &number);
9360 if (r != MAILIMAP_NO_ERROR) 9378 if (r != MAILIMAP_NO_ERROR)
9361 return r; 9379 return r;
9362 9380
9363 * index = cur_token; 9381 * index = cur_token;
9364 * result = number; 9382 * result = number;
9365 9383
9366 return MAILIMAP_NO_ERROR; 9384 return MAILIMAP_NO_ERROR;
9367#endif 9385#endif
9368} 9386}
9369 9387
9370/* 9388/*
9371 time = 2DIGIT ":" 2DIGIT ":" 2DIGIT 9389 time = 2DIGIT ":" 2DIGIT ":" 2DIGIT
9372 ; Hours minutes seconds 9390 ; Hours minutes seconds
9373*/ 9391*/
9374 9392
9375static int mailimap_time_parse(mailstream * fd, MMAPString * buffer, 9393static int mailimap_time_parse(mailstream * fd, MMAPString * buffer,
9376 size_t * index, 9394 size_t * index,
9377 int * phour, int * pmin, int * psec) 9395 int * phour, int * pmin, int * psec)
9378{ 9396{
9379 size_t cur_token; 9397 size_t cur_token;
9380 int hour; 9398 int hour;
9381 int min; 9399 int min;
9382 int sec; 9400 int sec;
9383 int r; 9401 int r;
9384 9402
9385 cur_token = * index; 9403 cur_token = * index;
9386 9404
9387 r = mailimap_2digit_parse(fd, buffer, &cur_token, &hour); 9405 r = mailimap_2digit_parse(fd, buffer, &cur_token, &hour);
9388 if (r != MAILIMAP_NO_ERROR) 9406 if (r != MAILIMAP_NO_ERROR)
9389 return r; 9407 return r;
9390 9408
9391 r = mailimap_colon_parse(fd, buffer, &cur_token); 9409 r = mailimap_colon_parse(fd, buffer, &cur_token);
9392 if (r != MAILIMAP_NO_ERROR) 9410 if (r != MAILIMAP_NO_ERROR)
9393 return r; 9411 return r;
9394 9412
9395 r = mailimap_2digit_parse(fd, buffer, &cur_token, &min); 9413 r = mailimap_2digit_parse(fd, buffer, &cur_token, &min);
9396 if (r != MAILIMAP_NO_ERROR) 9414 if (r != MAILIMAP_NO_ERROR)
9397 return r; 9415 return r;
9398 9416
9399 r = mailimap_colon_parse(fd, buffer, &cur_token); 9417 r = mailimap_colon_parse(fd, buffer, &cur_token);
9400 if (r != MAILIMAP_NO_ERROR) 9418 if (r != MAILIMAP_NO_ERROR)
9401 return r; 9419 return r;
9402 9420
9403 r = mailimap_2digit_parse(fd, buffer, &cur_token, &sec); 9421 r = mailimap_2digit_parse(fd, buffer, &cur_token, &sec);
9404 if (r != MAILIMAP_NO_ERROR) 9422 if (r != MAILIMAP_NO_ERROR)
9405 return r; 9423 return r;
9406 9424
9407 * phour = hour; 9425 * phour = hour;
9408 * pmin = min; 9426 * pmin = min;
9409 * psec = sec; 9427 * psec = sec;
9410 * index = cur_token; 9428 * index = cur_token;
9411 9429
9412 return MAILIMAP_NO_ERROR; 9430 return MAILIMAP_NO_ERROR;
9413} 9431}
9414 9432
9415/* 9433/*
9416 UNIMPLEMENTED 9434 UNIMPLEMENTED
9417 uid = "UID" SP (copy / fetch / search / store) 9435 uid = "UID" SP (copy / fetch / search / store)
9418 ; Unique identifiers used instead of message 9436 ; Unique identifiers used instead of message
9419 ; sequence numbers 9437 ; sequence numbers
9420*/ 9438*/
9421 9439
9422/* 9440/*
9423 uniqueid = nz-number 9441 uniqueid = nz-number
9424 ; Strictly ascending 9442 ; Strictly ascending
9425*/ 9443*/
9426 9444
9427static int mailimap_uniqueid_parse(mailstream * fd, MMAPString * buffer, 9445static int mailimap_uniqueid_parse(mailstream * fd, MMAPString * buffer,
9428 size_t * index, uint32_t * result) 9446 size_t * index, uint32_t * result)
9429{ 9447{
9430 return mailimap_nz_number_parse(fd, buffer, index, result); 9448 return mailimap_nz_number_parse(fd, buffer, index, result);
9431} 9449}
9432 9450
9433/* 9451/*
9434 UNIMPLEMENTED 9452 UNIMPLEMENTED
9435 unsubscribe = "UNSUBSCRIBE" SP mailbox 9453 unsubscribe = "UNSUBSCRIBE" SP mailbox
9436*/ 9454*/
9437 9455
9438/* 9456/*
9439 UNIMPLEMENTED 9457 UNIMPLEMENTED
9440 userid = astring 9458 userid = astring
9441*/ 9459*/
9442 9460
9443/* 9461/*
9444 UNIMPLEMENTED 9462 UNIMPLEMENTED
9445 x-command = "X" atom <experimental command arguments> 9463 x-command = "X" atom <experimental command arguments>
9446*/ 9464*/
9447 9465
9448/* 9466/*
9449 zone = ("+" / "-") 4DIGIT 9467 zone = ("+" / "-") 4DIGIT
9450 ; Signed four-digit value of hhmm representing 9468 ; Signed four-digit value of hhmm representing
9451 ; hours and minutes east of Greenwich (that is, 9469 ; hours and minutes east of Greenwich (that is,
9452 ; the amount that the given time differs from 9470 ; the amount that the given time differs from
9453 ; Universal Time). Subtracting the timezone 9471 ; Universal Time). Subtracting the timezone
9454 ; from the given time will give the UT form. 9472 ; from the given time will give the UT form.
9455 ; The Universal Time zone is "+0000". 9473 ; The Universal Time zone is "+0000".
9456*/ 9474*/
9457 9475
9458static int mailimap_zone_parse(mailstream * fd, MMAPString * buffer, 9476static int mailimap_zone_parse(mailstream * fd, MMAPString * buffer,
9459 size_t * index, int * result) 9477 size_t * index, int * result)
9460{ 9478{
9461 size_t cur_token; 9479 size_t cur_token;
9462 uint32_t zone; 9480 uint32_t zone;
9463#ifndef UNSTRICT_SYNTAX 9481#ifndef UNSTRICT_SYNTAX
9464 int i; 9482 int i;
9465 int digit; 9483 int digit;
9466#endif 9484#endif
9467 int sign; 9485 int sign;
9468 int r; 9486 int r;
9469 9487
9470 cur_token = * index; 9488 cur_token = * index;
9471 9489
9472 sign = 1; 9490 sign = 1;
9473 r = mailimap_plus_parse(fd, buffer, &cur_token); 9491 r = mailimap_plus_parse(fd, buffer, &cur_token);
9474 if (r == MAILIMAP_NO_ERROR) 9492 if (r == MAILIMAP_NO_ERROR)
9475 sign = 1; 9493 sign = 1;
9476 9494
9477 if (r == MAILIMAP_ERROR_PARSE) { 9495 if (r == MAILIMAP_ERROR_PARSE) {
9478 r = mailimap_minus_parse(fd, buffer, &cur_token); 9496 r = mailimap_minus_parse(fd, buffer, &cur_token);
9479 if (r == MAILIMAP_NO_ERROR) 9497 if (r == MAILIMAP_NO_ERROR)
9480 sign = -1; 9498 sign = -1;
9481 } 9499 }
9482 9500
9483 if (r != MAILIMAP_NO_ERROR) 9501 if (r != MAILIMAP_NO_ERROR)
9484 return r; 9502 return r;
9485 9503
9486#ifdef UNSTRICT_SYNTAX 9504#ifdef UNSTRICT_SYNTAX
9487 r = mailimap_number_parse(fd, buffer, &cur_token, &zone); 9505 r = mailimap_number_parse(fd, buffer, &cur_token, &zone);
9488 if (r != MAILIMAP_NO_ERROR) 9506 if (r != MAILIMAP_NO_ERROR)
9489 return r; 9507 return r;
9490#else 9508#else
9491 zone = 0; 9509 zone = 0;
9492 for(i = 0 ; i < 4 ; i ++) { 9510 for(i = 0 ; i < 4 ; i ++) {
9493 r = mailimap_digit_parse(fd, buffer, &cur_token, &digit); 9511 r = mailimap_digit_parse(fd, buffer, &cur_token, &digit);
9494 if (r != MAILIMAP_NO_ERROR) 9512 if (r != MAILIMAP_NO_ERROR)
9495 return r; 9513 return r;
9496 zone = zone * 10 + digit; 9514 zone = zone * 10 + digit;
9497 } 9515 }
9498#endif 9516#endif
9499 9517
9500 zone *= sign; 9518 zone *= sign;
9501 9519
9502 * result = zone; 9520 * result = zone;
9503 * index = cur_token; 9521 * index = cur_token;
9504 9522
9505 return MAILIMAP_NO_ERROR; 9523 return MAILIMAP_NO_ERROR;
9506} 9524}
diff --git a/kmicromail/libmailwrapper/imapwrapper.cpp b/kmicromail/libmailwrapper/imapwrapper.cpp
index d9496af..93fb7de 100644
--- a/kmicromail/libmailwrapper/imapwrapper.cpp
+++ b/kmicromail/libmailwrapper/imapwrapper.cpp
@@ -1,1360 +1,1365 @@
1// CHANGED 2004-09-31 Lutz Rogowski 1// CHANGED 2004-09-31 Lutz Rogowski
2#include <stdlib.h> 2#include <stdlib.h>
3#include <libetpan/libetpan.h> 3#include <libetpan/libetpan.h>
4#include <qpe/global.h> 4#include <qpe/global.h>
5#include <qapplication.h> 5#include <qapplication.h>
6#include "imapwrapper.h" 6#include "imapwrapper.h"
7#include "mailtypes.h" 7#include "mailtypes.h"
8#include "logindialog.h" 8#include "logindialog.h"
9#include <qprogressbar.h> 9#include <qprogressbar.h>
10#include "genericwrapper.h" 10#include "genericwrapper.h"
11#include <kglobal.h> 11#include <kglobal.h>
12 12
13using namespace Opie::Core; 13using namespace Opie::Core;
14int IMAPwrapper::mMax = 0; 14int IMAPwrapper::mMax = 0;
15int IMAPwrapper::mCurrent = 0; 15int IMAPwrapper::mCurrent = 0;
16 16
17IMAPwrapper::IMAPwrapper( IMAPaccount *a ) 17IMAPwrapper::IMAPwrapper( IMAPaccount *a )
18 : AbstractMail() 18 : AbstractMail()
19{ 19{
20 account = a; 20 account = a;
21 m_imap = 0; 21 m_imap = 0;
22 m_Lastmbox = ""; 22 m_Lastmbox = "";
23 mCurrent = 0; 23 mCurrent = 0;
24 mMax = 0; 24 mMax = 0;
25} 25}
26 26
27IMAPwrapper::~IMAPwrapper() 27IMAPwrapper::~IMAPwrapper()
28{ 28{
29 logout(); 29 logout();
30} 30}
31 31
32/* to avoid to often select statements in loops etc. 32/* to avoid to often select statements in loops etc.
33 we trust that we are logged in and connection is established!*/ 33 we trust that we are logged in and connection is established!*/
34int IMAPwrapper::selectMbox(const QString&mbox) 34int IMAPwrapper::selectMbox(const QString&mbox)
35{ 35{
36 if (mbox == m_Lastmbox) { 36 if (mbox == m_Lastmbox) {
37 return MAILIMAP_NO_ERROR; 37 return MAILIMAP_NO_ERROR;
38 } 38 }
39 int err = mailimap_select( m_imap, (char*)mbox.latin1()); 39 int err = mailimap_select( m_imap, (char*)mbox.latin1());
40 if ( err != MAILIMAP_NO_ERROR ) { 40 if ( err != MAILIMAP_NO_ERROR ) {
41 m_Lastmbox = ""; 41 m_Lastmbox = "";
42 return err; 42 return err;
43 } 43 }
44 m_Lastmbox = mbox; 44 m_Lastmbox = mbox;
45 return err; 45 return err;
46} 46}
47 47
48void IMAPwrapper::imap_progress( size_t current, size_t maximum ) 48void IMAPwrapper::imap_progress( size_t current, size_t maximum )
49{ 49{
50 qApp->processEvents(); 50 qApp->processEvents();
51 return; 51 return;
52 //qDebug("imap progress %d of %d ",current,maximum ); 52 //qDebug("imap progress %d of %d ",current,maximum );
53 //Global::statusMessage(i18n("Downloading message %1 of %2").arg( current).arg(maximum)); 53 //Global::statusMessage(i18n("Downloading message %1 of %2").arg( current).arg(maximum));
54 //qApp->processEvents() 54 //qApp->processEvents()
55 static unsigned int last = 0; 55 static unsigned int last = 0;
56 if ( last != current ) 56 if ( last != current )
57 IMAPwrapper::progress(); 57 IMAPwrapper::progress();
58 last = current; 58 last = current;
59} 59}
60void IMAPwrapper::progress( QString m ) 60void IMAPwrapper::progress( QString m )
61{ 61{
62 static QString mProgrMess; 62 static QString mProgrMess;
63 if ( m != QString::null ) { 63 if ( m != QString::null ) {
64 mProgrMess = m; 64 mProgrMess = m;
65 mCurrent = 1; 65 mCurrent = 1;
66 return; 66 return;
67 } 67 }
68 QString mess; 68 QString mess;
69 //qDebug("progress "); 69 //qDebug("progress ");
70 if ( mMax ) mess = mProgrMess +i18n(" message %1 of %2").arg( mCurrent++).arg(mMax); 70 if ( mMax ) mess = mProgrMess +i18n(" message %1 of %2").arg( mCurrent++).arg(mMax);
71 else mess = mProgrMess +i18n(" message %1").arg( mCurrent++); 71 else mess = mProgrMess +i18n(" message %1").arg( mCurrent++);
72 Global::statusMessage(mess); 72 Global::statusMessage(mess);
73 //qDebug("Progress %s %s", mess.latin1(), m.latin1()); 73 //qDebug("Progress %s %s", mess.latin1(), m.latin1());
74 qApp->processEvents(); 74 qApp->processEvents();
75} 75}
76bool IMAPwrapper::start_tls(bool force_tls) 76bool IMAPwrapper::start_tls(bool force_tls)
77{ 77{
78 int err; 78 int err;
79 bool try_tls = force_tls; 79 bool try_tls = force_tls;
80 mailimap_capability_data * cap_data = 0; 80 mailimap_capability_data * cap_data = 0;
81 81
82 err = mailimap_capability(m_imap,&cap_data); 82 err = mailimap_capability(m_imap,&cap_data);
83 if (err != MAILIMAP_NO_ERROR) { 83 if (err != MAILIMAP_NO_ERROR) {
84 Global::statusMessage("error getting capabilities!"); 84 Global::statusMessage("error getting capabilities!");
85 return false; 85 return false;
86 } 86 }
87 clistiter * cur; 87 clistiter * cur;
88 for(cur = clist_begin(cap_data->cap_list) ; cur != NULL;cur = clist_next(cur)) { 88 for(cur = clist_begin(cap_data->cap_list) ; cur != NULL;cur = clist_next(cur)) {
89 struct mailimap_capability * cap; 89 struct mailimap_capability * cap;
90 cap = (struct mailimap_capability *)clist_content(cur); 90 cap = (struct mailimap_capability *)clist_content(cur);
91 if (cap->cap_type == MAILIMAP_CAPABILITY_NAME) { 91 if (cap->cap_type == MAILIMAP_CAPABILITY_NAME) {
92 if (strcasecmp(cap->cap_data.cap_name, "STARTTLS") == 0) { 92 if (strcasecmp(cap->cap_data.cap_name, "STARTTLS") == 0) {
93 try_tls = true; 93 try_tls = true;
94 break; 94 break;
95 } 95 }
96 } 96 }
97 } 97 }
98 if (cap_data) { 98 if (cap_data) {
99 mailimap_capability_data_free(cap_data); 99 mailimap_capability_data_free(cap_data);
100 } 100 }
101 if (try_tls) { 101 if (try_tls) {
102 err = mailimap_starttls(m_imap); 102 err = mailimap_starttls(m_imap);
103 if (err != MAILIMAP_NO_ERROR && force_tls) { 103 if (err != MAILIMAP_NO_ERROR && force_tls) {
104 Global::statusMessage(i18n("Server has no TLS support!")); 104 Global::statusMessage(i18n("Server has no TLS support!"));
105 try_tls = false; 105 try_tls = false;
106 } else { 106 } else {
107 mailstream_low * low; 107 mailstream_low * low;
108 mailstream_low * new_low; 108 mailstream_low * new_low;
109 low = mailstream_get_low(m_imap->imap_stream); 109 low = mailstream_get_low(m_imap->imap_stream);
110 if (!low) { 110 if (!low) {
111 try_tls = false; 111 try_tls = false;
112 } else { 112 } else {
113 int fd = mailstream_low_get_fd(low); 113 int fd = mailstream_low_get_fd(low);
114 if (fd > -1 && (new_low = mailstream_low_ssl_open(fd))!=0) { 114 if (fd > -1 && (new_low = mailstream_low_ssl_open(fd))!=0) {
115 mailstream_low_free(low); 115 mailstream_low_free(low);
116 mailstream_set_low(m_imap->imap_stream, new_low); 116 mailstream_set_low(m_imap->imap_stream, new_low);
117 } else { 117 } else {
118 try_tls = false; 118 try_tls = false;
119 } 119 }
120 } 120 }
121 } 121 }
122 } 122 }
123 return try_tls; 123 return try_tls;
124} 124}
125 125
126void IMAPwrapper::login() 126void IMAPwrapper::login()
127{ 127{
128 QString server, user, pass; 128 QString server, user, pass;
129 uint16_t port; 129 uint16_t port;
130 int err = MAILIMAP_NO_ERROR; 130 int err = MAILIMAP_NO_ERROR;
131 131
132 if (account->getOffline()) return; 132 if (account->getOffline()) return;
133 /* we are connected this moment */ 133 /* we are connected this moment */
134 /* TODO: setup a timer holding the line or if connection closed - delete the value */ 134 /* TODO: setup a timer holding the line or if connection closed - delete the value */
135 if (m_imap) { 135 if (m_imap) {
136 err = mailimap_noop(m_imap); 136 err = mailimap_noop(m_imap);
137 if (err!=MAILIMAP_NO_ERROR) { 137 if (err!=MAILIMAP_NO_ERROR) {
138 logout(); 138 logout();
139 } else { 139 } else {
140 mailstream_flush(m_imap->imap_stream); 140 mailstream_flush(m_imap->imap_stream);
141 return; 141 return;
142 } 142 }
143 } 143 }
144 server = account->getServer(); 144 server = account->getServer();
145 port = account->getPort().toUInt(); 145 port = account->getPort().toUInt();
146 if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) { 146 if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) {
147 LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true ); 147 LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true );
148 login.show(); 148 login.show();
149 if ( QDialog::Accepted == login.exec() ) { 149 if ( QDialog::Accepted == login.exec() ) {
150 // ok 150 // ok
151 user = login.getUser(); 151 user = login.getUser();
152 pass = login.getPassword(); 152 pass = login.getPassword();
153 } else { 153 } else {
154 // cancel 154 // cancel
155 return; 155 return;
156 } 156 }
157 } else { 157 } else {
158 user = account->getUser(); 158 user = account->getUser();
159 pass = account->getPassword(); 159 pass = account->getPassword();
160 } 160 }
161 161
162 m_imap = mailimap_new( 20, &imap_progress ); 162 m_imap = mailimap_new( 20, &imap_progress );
163 163
164 /* connect */ 164 /* connect */
165 bool ssl = false; 165 bool ssl = false;
166 bool try_tls = false; 166 bool try_tls = false;
167 bool force_tls = false; 167 bool force_tls = false;
168 168
169 if ( account->ConnectionType() == 2 ) { 169 if ( account->ConnectionType() == 2 ) {
170 ssl = true; 170 ssl = true;
171 } 171 }
172 if (account->ConnectionType()==1) { 172 if (account->ConnectionType()==1) {
173 force_tls = true; 173 force_tls = true;
174 } 174 }
175 175
176 if ( ssl ) { 176 if ( ssl ) {
177 qDebug("using ssl "); 177 qDebug("using ssl ");
178 err = mailimap_ssl_connect( m_imap, (char*)server.latin1(), port ); 178 err = mailimap_ssl_connect( m_imap, (char*)server.latin1(), port );
179 qDebug("back "); 179 qDebug("back ");
180 } else { 180 } else {
181 err = mailimap_socket_connect( m_imap, (char*)server.latin1(), port ); 181 err = mailimap_socket_connect( m_imap, (char*)server.latin1(), port );
182 } 182 }
183 183
184 if ( err != MAILIMAP_NO_ERROR && 184 if ( err != MAILIMAP_NO_ERROR &&
185 err != MAILIMAP_NO_ERROR_AUTHENTICATED && 185 err != MAILIMAP_NO_ERROR_AUTHENTICATED &&
186 err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) { 186 err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) {
187 QString failure = ""; 187 QString failure = "";
188 if (err == MAILIMAP_ERROR_CONNECTION_REFUSED) { 188 if (err == MAILIMAP_ERROR_CONNECTION_REFUSED) {
189 failure="Connection refused"; 189 failure="Connection refused";
190 } else { 190 } else {
191 failure="Unknown failure"; 191 failure="Unknown failure";
192 } 192 }
193 Global::statusMessage(i18n("error connecting imap server: %1").arg(failure)); 193 Global::statusMessage(i18n("error connecting imap server: %1").arg(failure));
194 mailimap_free( m_imap ); 194 mailimap_free( m_imap );
195 m_imap = 0; 195 m_imap = 0;
196 return; 196 return;
197 } 197 }
198 198
199 if (!ssl) { 199 if (!ssl) {
200 try_tls = start_tls(force_tls); 200 try_tls = start_tls(force_tls);
201 } 201 }
202 202
203 bool ok = true; 203 bool ok = true;
204 if (force_tls && !try_tls) { 204 if (force_tls && !try_tls) {
205 Global::statusMessage(i18n("Server has no TLS support!")); 205 Global::statusMessage(i18n("Server has no TLS support!"));
206 ok = false; 206 ok = false;
207 } 207 }
208 208
209 209
210 /* login */ 210 /* login */
211 211
212 if (ok) { 212 if (ok) {
213 err = mailimap_login_simple( m_imap, (char*)user.latin1(), (char*)pass.latin1() ); 213 err = mailimap_login_simple( m_imap, (char*)user.latin1(), (char*)pass.latin1() );
214 if ( err != MAILIMAP_NO_ERROR ) { 214 if ( err != MAILIMAP_NO_ERROR ) {
215 Global::statusMessage(i18n("error logging in imap server: %1").arg(m_imap->imap_response)); 215 Global::statusMessage(i18n("error logging in imap server: %1").arg(m_imap->imap_response));
216 ok = false; 216 ok = false;
217 } 217 }
218 } 218 }
219 if (!ok) { 219 if (!ok) {
220 err = mailimap_close( m_imap ); 220 err = mailimap_close( m_imap );
221 mailimap_free( m_imap ); 221 mailimap_free( m_imap );
222 m_imap = 0; 222 m_imap = 0;
223 } 223 }
224} 224}
225 225
226void IMAPwrapper::logout() 226void IMAPwrapper::logout()
227{ 227{
228 int err = MAILIMAP_NO_ERROR; 228 int err = MAILIMAP_NO_ERROR;
229 if (!m_imap) return; 229 if (!m_imap) return;
230 err = mailimap_logout( m_imap ); 230 err = mailimap_logout( m_imap );
231 err = mailimap_close( m_imap ); 231 err = mailimap_close( m_imap );
232 mailimap_free( m_imap ); 232 mailimap_free( m_imap );
233 m_imap = 0; 233 m_imap = 0;
234 m_Lastmbox = ""; 234 m_Lastmbox = "";
235} 235}
236 236
237void IMAPwrapper::listMessages(const QString&mailbox,QValueList<Opie::Core::OSmartPointer<RecMail> > &target , int maxSizeInKb) 237void IMAPwrapper::listMessages(const QString&mailbox,QValueList<Opie::Core::OSmartPointer<RecMail> > &target , int maxSizeInKb)
238{ 238{
239 239
240 int tryAgain = 1; 240 int tryAgain = 1;
241 while ( tryAgain >= 0 ) { 241 while ( tryAgain >= 0 ) {
242 int err = MAILIMAP_NO_ERROR; 242 int err = MAILIMAP_NO_ERROR;
243 clist *result = 0; 243 clist *result = 0;
244 clistcell *current; 244 clistcell *current;
245 mailimap_fetch_type *fetchType = 0; 245 mailimap_fetch_type *fetchType = 0;
246 mailimap_set *set = 0; 246 mailimap_set *set = 0;
247 247
248 login(); 248 login();
249 if (!m_imap) { 249 if (!m_imap) {
250 return; 250 return;
251 } 251 }
252 /* select mailbox READONLY for operations */ 252 /* select mailbox READONLY for operations */
253 err = selectMbox(mailbox); 253 err = selectMbox(mailbox);
254 if ( err != MAILIMAP_NO_ERROR ) { 254 if ( err != MAILIMAP_NO_ERROR ) {
255 return; 255 return;
256 } 256 }
257 257
258 int last = m_imap->imap_selection_info->sel_exists; 258 int last = m_imap->imap_selection_info->sel_exists;
259 259
260 if (last == 0) { 260 if (last == 0) {
261 Global::statusMessage(i18n("Mailbox has no mails")); 261 Global::statusMessage(i18n("Mailbox has no mails"));
262 return; 262 return;
263 } else { 263 } else {
264 } 264 }
265 progress( i18n("Fetch ")); 265 progress( i18n("Fetch "));
266 mMax = last; 266 mMax = last;
267 //qDebug("last %d ", last); 267 //qDebug("last %d ", last);
268 Global::statusMessage(i18n("Fetching header list")); 268 Global::statusMessage(i18n("Fetching header list"));
269 qApp->processEvents(); 269 qApp->processEvents();
270 /* the range has to start at 1!!! not with 0!!!! */ 270 /* the range has to start at 1!!! not with 0!!!! */
271 //LR the access to web.de imap server is no working with value 1 271 //LR the access to web.de imap server is no working with value 1
272 //qDebug("interval %d - %d ", tryAgain, last-1+tryAgain ); 272 //qDebug("interval %d - %d ", tryAgain, last-1+tryAgain );
273 set = mailimap_set_new_interval( tryAgain, last ); 273 set = mailimap_set_new_interval( tryAgain, last );
274 fetchType = mailimap_fetch_type_new_fetch_att_list_empty(); 274 fetchType = mailimap_fetch_type_new_fetch_att_list_empty();
275 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_envelope()); 275 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_envelope());
276 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_flags()); 276 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_flags());
277 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_internaldate()); 277 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_internaldate());
278 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_rfc822_size()); 278 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_rfc822_size());
279 279
280 err = mailimap_fetch( m_imap, set, fetchType, &result ); 280 err = mailimap_fetch( m_imap, set, fetchType, &result );
281 mailimap_set_free( set ); 281 mailimap_set_free( set );
282 mailimap_fetch_type_free( fetchType ); 282 mailimap_fetch_type_free( fetchType );
283 283
284 QString date,subject,from; 284 QString date,subject,from;
285 285
286 if ( err == MAILIMAP_NO_ERROR ) { 286 if ( err == MAILIMAP_NO_ERROR ) {
287 tryAgain = -1; 287 tryAgain = -1;
288 mailimap_msg_att * msg_att; 288 mailimap_msg_att * msg_att;
289 int i = 0; 289 int i = 0;
290 for (current = clist_begin(result); current != 0; current=clist_next(current)) { 290 for (current = clist_begin(result); current != 0; current=clist_next(current)) {
291 ++i; 291 ++i;
292 //qDebug("iii %d ",i); 292 //qDebug("iii %d ",i);
293 msg_att = (mailimap_msg_att*)current->data; 293 msg_att = (mailimap_msg_att*)current->data;
294 RecMail*m = parse_list_result(msg_att); 294 RecMail*m = parse_list_result(msg_att);
295 if (m) { 295 if (m) {
296 if ( maxSizeInKb == 0 || m->Msgsize()<=(unsigned int ) maxSizeInKb*1024 ) { 296 if ( maxSizeInKb == 0 || m->Msgsize()<=(unsigned int ) maxSizeInKb*1024 ) {
297 m->setNumber(i); 297 m->setNumber(i);
298 m->setMbox(mailbox); 298 m->setMbox(mailbox);
299 m->setWrapper(this); 299 m->setWrapper(this);
300 target.append(m); 300 target.append(m);
301 } 301 }
302 } 302 }
303 } 303 }
304 Global::statusMessage(i18n("Mailbox has %1 mails").arg(target.count())); 304 Global::statusMessage(i18n("Mailbox has %1 mails").arg(target.count()));
305 } else { 305 } else {
306 --tryAgain; 306 --tryAgain;
307 --tryAgain;//disabled tryagain by adding this line 307 --tryAgain;//disabled tryagain by adding this line
308 if ( tryAgain < 0 ) 308 if ( tryAgain < 0 )
309 Global::statusMessage(i18n("Error fetching headers: %1").arg(m_imap->imap_response)); 309 Global::statusMessage(i18n("Error fetching headers: %1").arg(m_imap->imap_response));
310 else 310 else
311 qDebug("try again... "); 311 qDebug("try again... ");
312 } 312 }
313 313
314 if (result) mailimap_fetch_list_free(result); 314 if (result) mailimap_fetch_list_free(result);
315 } 315 }
316} 316}
317 317
318QValueList<Opie::Core::OSmartPointer<Folder> >* IMAPwrapper::listFolders() 318QValueList<Opie::Core::OSmartPointer<Folder> >* IMAPwrapper::listFolders()
319{ 319{
320 const char *path, *mask; 320 const char *path, *mask;
321 int err = MAILIMAP_NO_ERROR; 321 int err = MAILIMAP_NO_ERROR;
322 clist *result = 0; 322 clist *result = 0;
323 clistcell *current = 0; 323 clistcell *current = 0;
324 clistcell*cur_flag = 0; 324 clistcell*cur_flag = 0;
325 mailimap_mbx_list_flags*bflags = 0; 325 mailimap_mbx_list_flags*bflags = 0;
326 326
327 QValueList<FolderP>* folders = new QValueList<FolderP>(); 327 QValueList<FolderP>* folders = new QValueList<FolderP>();
328 login(); 328 login();
329 if (!m_imap) { 329 if (!m_imap) {
330 return folders; 330 return folders;
331 } 331 }
332 332
333/* 333/*
334 * First we have to check for INBOX 'cause it sometimes it's not inside the path. 334 * First we have to check for INBOX 'cause it sometimes it's not inside the path.
335 * We must not forget to filter them out in next loop! 335 * We must not forget to filter them out in next loop!
336 * it seems like ugly code. and yes - it is ugly code. but the best way. 336 * it seems like ugly code. and yes - it is ugly code. but the best way.
337 */ 337 */
338 Global::statusMessage(i18n("Fetching folder list")); 338 Global::statusMessage(i18n("Fetching folder list"));
339 qApp->processEvents(); 339 qApp->processEvents();
340 QString temp; 340 QString temp;
341 mask = "INBOX" ; 341 mask = "INBOX" ;
342 mailimap_mailbox_list *list; 342 mailimap_mailbox_list *list;
343 err = mailimap_list( m_imap, (char*)"", (char*)mask, &result ); 343 err = mailimap_list( m_imap, (char*)"", (char*)mask, &result );
344 QString del; 344 QString del;
345 bool selectable = true; 345 bool selectable = true;
346 bool no_inferiors = false; 346 bool no_inferiors = false;
347 if ( err == MAILIMAP_NO_ERROR ) { 347 if ( err == MAILIMAP_NO_ERROR ) {
348 current = result->first; 348 current = result->first;
349 for ( int i = result->count; i > 0; i-- ) { 349 for ( int i = result->count; i > 0; i-- ) {
350 list = (mailimap_mailbox_list *) current->data; 350 list = (mailimap_mailbox_list *) current->data;
351 // it is better use the deep copy mechanism of qt itself 351 // it is better use the deep copy mechanism of qt itself
352 // instead of using strdup! 352 // instead of using strdup!
353 temp = list->mb_name; 353 temp = list->mb_name;
354 del = list->mb_delimiter; 354 del = list->mb_delimiter;
355 current = current->next; 355 current = current->next;
356 if ( (bflags = list->mb_flag) ) { 356 if ( (bflags = list->mb_flag) ) {
357 selectable = !(bflags->mbf_type==MAILIMAP_MBX_LIST_FLAGS_SFLAG&& 357 selectable = !(bflags->mbf_type==MAILIMAP_MBX_LIST_FLAGS_SFLAG&&
358 bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT); 358 bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT);
359 for(cur_flag=clist_begin(bflags->mbf_oflags);cur_flag;cur_flag=clist_next(cur_flag)) { 359 for(cur_flag=clist_begin(bflags->mbf_oflags);cur_flag;cur_flag=clist_next(cur_flag)) {
360 if ( ((mailimap_mbx_list_oflag*)cur_flag->data)->of_type==MAILIMAP_MBX_LIST_OFLAG_NOINFERIORS) { 360 if ( ((mailimap_mbx_list_oflag*)cur_flag->data)->of_type==MAILIMAP_MBX_LIST_OFLAG_NOINFERIORS) {
361 no_inferiors = true; 361 no_inferiors = true;
362 } 362 }
363 } 363 }
364 } 364 }
365 folders->append( new IMAPFolder(temp,del,selectable,no_inferiors,account->getPrefix())); 365 folders->append( new IMAPFolder(temp,del,selectable,no_inferiors,account->getPrefix()));
366 } 366 }
367 } else { 367 } else {
368 qDebug("error fetching folders: "); 368 qDebug("error fetching folders: ");
369 369
370 } 370 }
371 mailimap_list_result_free( result ); 371 mailimap_list_result_free( result );
372 372
373/* 373/*
374 * second stage - get the other then inbox folders 374 * second stage - get the other then inbox folders
375 */ 375 */
376 mask = "*" ; 376 mask = "*" ;
377 path = account->getPrefix().latin1(); 377 path = account->getPrefix().latin1();
378 if (!path) path = ""; 378 if (!path) path = "";
379 err = mailimap_list( m_imap, (char*)path, (char*)mask, &result ); 379 err = mailimap_list( m_imap, (char*)path, (char*)mask, &result );
380 if ( err == MAILIMAP_NO_ERROR ) { 380 if ( err == MAILIMAP_NO_ERROR ) {
381 current = result->first; 381 current = result->first;
382 for ( current=clist_begin(result);current!=NULL;current=clist_next(current)) { 382 for ( current=clist_begin(result);current!=NULL;current=clist_next(current)) {
383 no_inferiors = false; 383 no_inferiors = false;
384 list = (mailimap_mailbox_list *) current->data; 384 list = (mailimap_mailbox_list *) current->data;
385 // it is better use the deep copy mechanism of qt itself 385 // it is better use the deep copy mechanism of qt itself
386 // instead of using strdup! 386 // instead of using strdup!
387 temp = list->mb_name; 387 temp = list->mb_name;
388 if (temp.lower()=="inbox") 388 if (temp.lower()=="inbox")
389 continue; 389 continue;
390 if (temp.lower()==account->getPrefix().lower()) 390 if (temp.lower()==account->getPrefix().lower())
391 continue; 391 continue;
392 if ( (bflags = list->mb_flag) ) { 392 if ( (bflags = list->mb_flag) ) {
393 selectable = !(bflags->mbf_type==MAILIMAP_MBX_LIST_FLAGS_SFLAG&& 393 selectable = !(bflags->mbf_type==MAILIMAP_MBX_LIST_FLAGS_SFLAG&&
394 bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT); 394 bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT);
395 for(cur_flag=clist_begin(bflags->mbf_oflags);cur_flag;cur_flag=clist_next(cur_flag)) { 395 for(cur_flag=clist_begin(bflags->mbf_oflags);cur_flag;cur_flag=clist_next(cur_flag)) {
396 if ( ((mailimap_mbx_list_oflag*)cur_flag->data)->of_type==MAILIMAP_MBX_LIST_OFLAG_NOINFERIORS) { 396 if ( ((mailimap_mbx_list_oflag*)cur_flag->data)->of_type==MAILIMAP_MBX_LIST_OFLAG_NOINFERIORS) {
397 no_inferiors = true; 397 no_inferiors = true;
398 } 398 }
399 } 399 }
400 } 400 }
401 del = list->mb_delimiter; 401 del = list->mb_delimiter;
402 folders->append(new IMAPFolder(temp,del,selectable,no_inferiors,account->getPrefix())); 402 folders->append(new IMAPFolder(temp,del,selectable,no_inferiors,account->getPrefix()));
403 } 403 }
404 } else { 404 } else {
405 qDebug("error fetching folders "); 405 qDebug("error fetching folders ");
406 406
407 } 407 }
408 if (result) mailimap_list_result_free( result ); 408 if (result) mailimap_list_result_free( result );
409 return folders; 409 return folders;
410} 410}
411 411
412RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att) 412RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
413{ 413{
414 RecMail * m = 0; 414 RecMail * m = 0;
415 mailimap_msg_att_item *item=0; 415 mailimap_msg_att_item *item=0;
416 clistcell *current,*c,*cf; 416 clistcell *current,*c,*cf;
417 mailimap_msg_att_dynamic*flist; 417 mailimap_msg_att_dynamic*flist;
418 mailimap_flag_fetch*cflag; 418 mailimap_flag_fetch*cflag;
419 int size = 0; 419 int size = 0;
420 QBitArray mFlags(7); 420 QBitArray mFlags(7);
421 QStringList addresslist; 421 QStringList addresslist;
422 422
423 if (!m_att) { 423 if (!m_att) {
424 return m; 424 return m;
425 } 425 }
426 m = new RecMail(); 426 m = new RecMail();
427 for (c = clist_begin(m_att->att_list); c!=NULL;c=clist_next(c) ) { 427 for (c = clist_begin(m_att->att_list); c!=NULL;c=clist_next(c) ) {
428 current = c; 428 current = c;
429 size = 0; 429 size = 0;
430 item = (mailimap_msg_att_item*)current->data; 430 item = (mailimap_msg_att_item*)current->data;
431 if ( !item ) 431 if ( !item )
432 continue; 432 continue;
433 if (item->att_type!=MAILIMAP_MSG_ATT_ITEM_STATIC) { 433 if (item->att_type!=MAILIMAP_MSG_ATT_ITEM_STATIC) {
434 flist = (mailimap_msg_att_dynamic*)item->att_data.att_dyn; 434 flist = (mailimap_msg_att_dynamic*)item->att_data.att_dyn;
435 if (!flist || !flist->att_list) { 435 if (!flist || !flist->att_list) {
436 continue; 436 continue;
437 } 437 }
438 cf = flist->att_list->first; 438 cf = flist->att_list->first;
439 if( ! cf ) 439 if( cf ) {
440 for (cf = clist_begin(flist->att_list); cf!=NULL; cf = clist_next(cf)) { 440 for (cf = clist_begin(flist->att_list); cf!=NULL; cf = clist_next(cf)) {
441 cflag = (mailimap_flag_fetch*)cf->data; 441 cflag = (mailimap_flag_fetch*)cf->data;
442 if( ! cflag ) 442 if( ! cflag )
443 qDebug("imap:not cflag "); 443 qDebug("imap:NO cflag ");
444 if (cflag->fl_type==MAILIMAP_FLAG_FETCH_OTHER && cflag->fl_flag!=0) { 444 else {
445 switch (cflag->fl_flag->fl_type) { 445 if (cflag->fl_type==MAILIMAP_FLAG_FETCH_OTHER && cflag->fl_flag!=0) {
446 case MAILIMAP_FLAG_ANSWERED: /* \Answered flag */ 446 switch (cflag->fl_flag->fl_type) {
447 mFlags.setBit(FLAG_ANSWERED); 447 case MAILIMAP_FLAG_ANSWERED: /* \Answered flag */
448 break; 448 mFlags.setBit(FLAG_ANSWERED);
449 case MAILIMAP_FLAG_FLAGGED: /* \Flagged flag */ 449 break;
450 mFlags.setBit(FLAG_FLAGGED); 450 case MAILIMAP_FLAG_FLAGGED: /* \Flagged flag */
451 break; 451 mFlags.setBit(FLAG_FLAGGED);
452 case MAILIMAP_FLAG_DELETED: /* \Deleted flag */ 452 break;
453 mFlags.setBit(FLAG_DELETED); 453 case MAILIMAP_FLAG_DELETED: /* \Deleted flag */
454 break; 454 mFlags.setBit(FLAG_DELETED);
455 case MAILIMAP_FLAG_SEEN: /* \Seen flag */ 455 break;
456 mFlags.setBit(FLAG_SEEN); 456 case MAILIMAP_FLAG_SEEN: /* \Seen flag */
457 break; 457 mFlags.setBit(FLAG_SEEN);
458 case MAILIMAP_FLAG_DRAFT: /* \Draft flag */ 458 break;
459 mFlags.setBit(FLAG_DRAFT); 459 case MAILIMAP_FLAG_DRAFT: /* \Draft flag */
460 break; 460 mFlags.setBit(FLAG_DRAFT);
461 case MAILIMAP_FLAG_KEYWORD: /* keyword flag */ 461 break;
462 break; 462 case MAILIMAP_FLAG_KEYWORD: /* keyword flag */
463 case MAILIMAP_FLAG_EXTENSION: /* \extension flag */ 463 break;
464 break; 464 case MAILIMAP_FLAG_EXTENSION: /* \extension flag */
465 default: 465 break;
466 break; 466 default:
467 break;
468 }
469 } else if (cflag->fl_type==MAILIMAP_FLAG_FETCH_RECENT) {
470 mFlags.setBit(FLAG_RECENT);
471 }
467 } 472 }
468 } else if (cflag->fl_type==MAILIMAP_FLAG_FETCH_RECENT) {
469 mFlags.setBit(FLAG_RECENT);
470 } 473 }
471 } 474 }
475 //qDebug(" continue");
472 continue; 476 continue;
473 } 477 }
474 if ( item->att_data.att_static == NULL ) 478 if ( item->att_data.att_static == NULL )
475 continue; 479 continue;
476 if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_ENVELOPE) { 480 if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_ENVELOPE) {
477 mailimap_envelope * head = item->att_data.att_static->att_data.att_env; 481 mailimap_envelope * head = item->att_data.att_static->att_data.att_env;
478 if ( head == NULL ) 482 if ( head == NULL )
479 continue; 483 continue;
480 if ( head->env_date != NULL ) { 484 if ( head->env_date != NULL ) {
481 m->setDate(head->env_date); 485 m->setDate(head->env_date);
482 //struct mailimf_date_time result; 486 //struct mailimf_date_time result;
483 struct mailimf_date_time* date;// = &result; 487 struct mailimf_date_time* date;// = &result;
484 struct mailimf_date_time **re = &date; 488 struct mailimf_date_time **re = &date;
485 size_t length = m->getDate().length(); 489 size_t length = m->getDate().length();
486 size_t index = 0; 490 size_t index = 0;
487 if ( mailimf_date_time_parse(head->env_date, length,&index, re ) == MAILIMF_NO_ERROR ) { 491 if ( mailimf_date_time_parse(head->env_date, length,&index, re ) == MAILIMF_NO_ERROR ) {
492 //qDebug("parseDateTime ");
488 QDateTime dt = Genericwrapper::parseDateTime( date ); 493 QDateTime dt = Genericwrapper::parseDateTime( date );
489 QString ret; 494 QString ret;
490 if ( dt.date() == QDate::currentDate () ) 495 if ( dt.date() == QDate::currentDate () )
491 ret = KGlobal::locale()->formatTime( dt.time(),true); 496 ret = KGlobal::locale()->formatTime( dt.time(),true);
492 else { 497 else {
493 ret = KGlobal::locale()->formatDateTime( dt,true,true); 498 ret = KGlobal::locale()->formatDateTime( dt,true,true);
494 } 499 }
495 m->setDate( ret ); 500 m->setDate( ret );
496 char tmp[20]; 501 char tmp[20];
497 snprintf( tmp, 20, "%04i-%02i-%02i %02i:%02i:%02i", 502 snprintf( tmp, 20, "%04i-%02i-%02i %02i:%02i:%02i",
498 dt.date().year(),dt.date().month(), dt.date().day(), dt.time().hour(), dt.time().minute(), dt.time().second() ); 503 dt.date().year(),dt.date().month(), dt.date().day(), dt.time().hour(), dt.time().minute(), dt.time().second() );
499 //qDebug("%d iso %s %s ", date->dt_zone, tmp, head->env_date); 504 //qDebug("%d iso %s %s ", date->dt_zone, tmp, head->env_date);
500 m->setIsoDate( QString( tmp ) ); 505 m->setIsoDate( QString( tmp ) );
501 mailimf_date_time_free ( date ); 506 mailimf_date_time_free ( date );
502 } else { 507 } else {
503 m->setIsoDate(head->env_date); 508 m->setIsoDate(head->env_date);
504 } 509 }
505 } 510 }
506 if ( head->env_subject != NULL ) 511 if ( head->env_subject != NULL )
507 m->setSubject(convert_String((const char*)head->env_subject)); 512 m->setSubject(convert_String((const char*)head->env_subject));
508 //m->setSubject(head->env_subject); 513 //m->setSubject(head->env_subject);
509 if (head->env_from!=NULL) { 514 if (head->env_from!=NULL) {
510 addresslist = address_list_to_stringlist(head->env_from->frm_list); 515 addresslist = address_list_to_stringlist(head->env_from->frm_list);
511 if (addresslist.count()) { 516 if (addresslist.count()) {
512 m->setFrom(addresslist.first()); 517 m->setFrom(addresslist.first());
513 } 518 }
514 } 519 }
515 if (head->env_to!=NULL) { 520 if (head->env_to!=NULL) {
516 addresslist = address_list_to_stringlist(head->env_to->to_list); 521 addresslist = address_list_to_stringlist(head->env_to->to_list);
517 m->setTo(addresslist); 522 m->setTo(addresslist);
518 } 523 }
519 if (head->env_cc!=NULL) { 524 if (head->env_cc!=NULL) {
520 addresslist = address_list_to_stringlist(head->env_cc->cc_list); 525 addresslist = address_list_to_stringlist(head->env_cc->cc_list);
521 m->setCC(addresslist); 526 m->setCC(addresslist);
522 } 527 }
523 if (head->env_bcc!=NULL) { 528 if (head->env_bcc!=NULL) {
524 addresslist = address_list_to_stringlist(head->env_bcc->bcc_list); 529 addresslist = address_list_to_stringlist(head->env_bcc->bcc_list);
525 m->setBcc(addresslist); 530 m->setBcc(addresslist);
526 } 531 }
527 /* reply to address, eg. email. */ 532 /* reply to address, eg. email. */
528 if (head->env_reply_to!=NULL) { 533 if (head->env_reply_to!=NULL) {
529 addresslist = address_list_to_stringlist(head->env_reply_to->rt_list); 534 addresslist = address_list_to_stringlist(head->env_reply_to->rt_list);
530 if (addresslist.count()) { 535 if (addresslist.count()) {
531 m->setReplyto(addresslist.first()); 536 m->setReplyto(addresslist.first());
532 } 537 }
533 } 538 }
534 if (head->env_in_reply_to!=NULL) { 539 if (head->env_in_reply_to!=NULL) {
535 QString h(head->env_in_reply_to); 540 QString h(head->env_in_reply_to);
536 while (h.length()>0 && h[0]=='<') { 541 while (h.length()>0 && h[0]=='<') {
537 h.remove(0,1); 542 h.remove(0,1);
538 } 543 }
539 while (h.length()>0 && h[h.length()-1]=='>') { 544 while (h.length()>0 && h[h.length()-1]=='>') {
540 h.remove(h.length()-1,1); 545 h.remove(h.length()-1,1);
541 } 546 }
542 if (h.length()>0) { 547 if (h.length()>0) {
543 m->setInreply(QStringList(h)); 548 m->setInreply(QStringList(h));
544 } 549 }
545 } 550 }
546 if (head->env_message_id != NULL) { 551 if (head->env_message_id != NULL) {
547 m->setMsgid(QString(head->env_message_id)); 552 m->setMsgid(QString(head->env_message_id));
548 } 553 }
549 } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_INTERNALDATE) { 554 } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_INTERNALDATE) {
550#if 0 555#if 0
551 mailimap_date_time*d = item->att_data.att_static->att_data.att_internal_date; 556 mailimap_date_time*d = item->att_data.att_static->att_data.att_internal_date;
552 QDateTime da(QDate(d->dt_year,d->dt_month,d->dt_day),QTime(d->dt_hour,d->dt_min,d->dt_sec)); 557 QDateTime da(QDate(d->dt_year,d->dt_month,d->dt_day),QTime(d->dt_hour,d->dt_min,d->dt_sec));
553 qDebug("time %s ",da.toString().latin1() ); 558 qDebug("time %s ",da.toString().latin1() );
554#endif 559#endif
555 } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_RFC822_SIZE) { 560 } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_RFC822_SIZE) {
556 size = item->att_data.att_static->att_data.att_rfc822_size; 561 size = item->att_data.att_static->att_data.att_rfc822_size;
557 } 562 }
558 } 563 }
559 /* msg is already deleted */ 564 /* msg is already deleted */
560 if (mFlags.testBit(FLAG_DELETED) && m) { 565 if (mFlags.testBit(FLAG_DELETED) && m) {
561 delete m; 566 delete m;
562 m = 0; 567 m = 0;
563 } 568 }
564 if (m) { 569 if (m) {
565 m->setFlags(mFlags); 570 m->setFlags(mFlags);
566 m->setMsgsize(size); 571 m->setMsgsize(size);
567 } 572 }
568 return m; 573 return m;
569} 574}
570 575
571RecBodyP IMAPwrapper::fetchBody(const RecMailP&mail) 576RecBodyP IMAPwrapper::fetchBody(const RecMailP&mail)
572{ 577{
573 RecBodyP body = new RecBody(); 578 RecBodyP body = new RecBody();
574 const char *mb; 579 const char *mb;
575 int err = MAILIMAP_NO_ERROR; 580 int err = MAILIMAP_NO_ERROR;
576 clist *result = 0; 581 clist *result = 0;
577 clistcell *current; 582 clistcell *current;
578 mailimap_fetch_att *fetchAtt = 0; 583 mailimap_fetch_att *fetchAtt = 0;
579 mailimap_fetch_type *fetchType = 0; 584 mailimap_fetch_type *fetchType = 0;
580 mailimap_set *set = 0; 585 mailimap_set *set = 0;
581 mailimap_body*body_desc = 0; 586 mailimap_body*body_desc = 0;
582 587
583 mb = mail->getMbox().latin1(); 588 mb = mail->getMbox().latin1();
584 589
585 login(); 590 login();
586 if (!m_imap) { 591 if (!m_imap) {
587 return body; 592 return body;
588 } 593 }
589 err = selectMbox(mail->getMbox()); 594 err = selectMbox(mail->getMbox());
590 if ( err != MAILIMAP_NO_ERROR ) { 595 if ( err != MAILIMAP_NO_ERROR ) {
591 return body; 596 return body;
592 } 597 }
593 598
594 /* the range has to start at 1!!! not with 0!!!! */ 599 /* the range has to start at 1!!! not with 0!!!! */
595 set = mailimap_set_new_interval( mail->getNumber(),mail->getNumber() ); 600 set = mailimap_set_new_interval( mail->getNumber(),mail->getNumber() );
596 fetchAtt = mailimap_fetch_att_new_bodystructure(); 601 fetchAtt = mailimap_fetch_att_new_bodystructure();
597 fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt); 602 fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
598 err = mailimap_fetch( m_imap, set, fetchType, &result ); 603 err = mailimap_fetch( m_imap, set, fetchType, &result );
599 mailimap_set_free( set ); 604 mailimap_set_free( set );
600 mailimap_fetch_type_free( fetchType ); 605 mailimap_fetch_type_free( fetchType );
601 606
602 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) { 607 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
603 mailimap_msg_att * msg_att; 608 mailimap_msg_att * msg_att;
604 msg_att = (mailimap_msg_att*)current->data; 609 msg_att = (mailimap_msg_att*)current->data;
605 mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->att_list->first->data; 610 mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->att_list->first->data;
606 QValueList<int> path; 611 QValueList<int> path;
607 body_desc = item->att_data.att_static->att_data.att_body; 612 body_desc = item->att_data.att_static->att_data.att_body;
608 traverseBody(mail,body_desc,body,0,path); 613 traverseBody(mail,body_desc,body,0,path);
609 } else { 614 } else {
610 //odebug << "error fetching body: " << m_imap->imap_response << "" << oendl; 615 qDebug("error fetching body %d (%d): %s", err, MAILIMAP_NO_ERROR, m_imap->imap_response );
611 } 616 }
612 if (result) mailimap_fetch_list_free(result); 617 if (result) mailimap_fetch_list_free(result);
613 return body; 618 return body;
614} 619}
615 620
616QStringList IMAPwrapper::address_list_to_stringlist(clist*list) 621QStringList IMAPwrapper::address_list_to_stringlist(clist*list)
617{ 622{
618 QStringList l; 623 QStringList l;
619 QString from; 624 QString from;
620 bool named_from; 625 bool named_from;
621 clistcell *current = NULL; 626 clistcell *current = NULL;
622 mailimap_address * current_address=NULL; 627 mailimap_address * current_address=NULL;
623 if (!list) { 628 if (!list) {
624 return l; 629 return l;
625 } 630 }
626 unsigned int count = 0; 631 unsigned int count = 0;
627 for (current=clist_begin(list);current!= NULL;current=clist_next(current)) { 632 for (current=clist_begin(list);current!= NULL;current=clist_next(current)) {
628 from = ""; 633 from = "";
629 named_from = false; 634 named_from = false;
630 current_address=(mailimap_address*)current->data; 635 current_address=(mailimap_address*)current->data;
631 if (current_address->ad_personal_name){ 636 if (current_address->ad_personal_name){
632 from+=convert_String((const char*)current_address->ad_personal_name); 637 from+=convert_String((const char*)current_address->ad_personal_name);
633 from+=" "; 638 from+=" ";
634 named_from = true; 639 named_from = true;
635 } 640 }
636 if (named_from && (current_address->ad_mailbox_name || current_address->ad_host_name)) { 641 if (named_from && (current_address->ad_mailbox_name || current_address->ad_host_name)) {
637 from+="<"; 642 from+="<";
638 } 643 }
639 if (current_address->ad_mailbox_name) { 644 if (current_address->ad_mailbox_name) {
640 from+=QString(current_address->ad_mailbox_name); 645 from+=QString(current_address->ad_mailbox_name);
641 from+="@"; 646 from+="@";
642 } 647 }
643 if (current_address->ad_host_name) { 648 if (current_address->ad_host_name) {
644 from+=QString(current_address->ad_host_name); 649 from+=QString(current_address->ad_host_name);
645 } 650 }
646 if (named_from && (current_address->ad_mailbox_name || current_address->ad_host_name)) { 651 if (named_from && (current_address->ad_mailbox_name || current_address->ad_host_name)) {
647 from+=">"; 652 from+=">";
648 } 653 }
649 l.append(QString(from)); 654 l.append(QString(from));
650 if (++count > 99) { 655 if (++count > 99) {
651 break; 656 break;
652 } 657 }
653 } 658 }
654 return l; 659 return l;
655} 660}
656 661
657encodedString*IMAPwrapper::fetchRawPart(const RecMailP&mail,const QValueList<int>&path,bool internal_call) 662encodedString*IMAPwrapper::fetchRawPart(const RecMailP&mail,const QValueList<int>&path,bool internal_call)
658{ 663{
659 encodedString*res=new encodedString; 664 encodedString*res=new encodedString;
660 int err; 665 int err;
661 mailimap_fetch_type *fetchType; 666 mailimap_fetch_type *fetchType;
662 mailimap_set *set; 667 mailimap_set *set;
663 clistcell*current,*cur; 668 clistcell*current,*cur;
664 mailimap_section_part * section_part = 0; 669 mailimap_section_part * section_part = 0;
665 mailimap_section_spec * section_spec = 0; 670 mailimap_section_spec * section_spec = 0;
666 mailimap_section * section = 0; 671 mailimap_section * section = 0;
667 mailimap_fetch_att * fetch_att = 0; 672 mailimap_fetch_att * fetch_att = 0;
668 673
669 login(); 674 login();
670 if (!m_imap) { 675 if (!m_imap) {
671 return res; 676 return res;
672 } 677 }
673 if (!internal_call) { 678 if (!internal_call) {
674 err = selectMbox(mail->getMbox()); 679 err = selectMbox(mail->getMbox());
675 if ( err != MAILIMAP_NO_ERROR ) { 680 if ( err != MAILIMAP_NO_ERROR ) {
676 return res; 681 return res;
677 } 682 }
678 } 683 }
679 set = mailimap_set_new_single(mail->getNumber()); 684 set = mailimap_set_new_single(mail->getNumber());
680 685
681 clist*id_list = 0; 686 clist*id_list = 0;
682 687
683 /* if path == empty then its a request for the whole rfc822 mail and generates 688 /* if path == empty then its a request for the whole rfc822 mail and generates
684 a "fetch <id> (body[])" statement on imap server */ 689 a "fetch <id> (body[])" statement on imap server */
685 if (path.count()>0 ) { 690 if (path.count()>0 ) {
686 id_list = clist_new(); 691 id_list = clist_new();
687 for (unsigned j=0; j < path.count();++j) { 692 for (unsigned j=0; j < path.count();++j) {
688 uint32_t * p_id = (uint32_t *)malloc(sizeof(*p_id)); 693 uint32_t * p_id = (uint32_t *)malloc(sizeof(*p_id));
689 *p_id = path[j]; 694 *p_id = path[j];
690 clist_append(id_list,p_id); 695 clist_append(id_list,p_id);
691 } 696 }
692 section_part = mailimap_section_part_new(id_list); 697 section_part = mailimap_section_part_new(id_list);
693 section_spec = mailimap_section_spec_new(MAILIMAP_SECTION_SPEC_SECTION_PART, NULL, section_part, NULL); 698 section_spec = mailimap_section_spec_new(MAILIMAP_SECTION_SPEC_SECTION_PART, NULL, section_part, NULL);
694 } 699 }
695 700
696 section = mailimap_section_new(section_spec); 701 section = mailimap_section_new(section_spec);
697 fetch_att = mailimap_fetch_att_new_body_section(section); 702 fetch_att = mailimap_fetch_att_new_body_section(section);
698 fetchType = mailimap_fetch_type_new_fetch_att(fetch_att); 703 fetchType = mailimap_fetch_type_new_fetch_att(fetch_att);
699 704
700 clist*result = 0; 705 clist*result = 0;
701 706
702 err = mailimap_fetch( m_imap, set, fetchType, &result ); 707 err = mailimap_fetch( m_imap, set, fetchType, &result );
703 mailimap_set_free( set ); 708 mailimap_set_free( set );
704 mailimap_fetch_type_free( fetchType ); 709 mailimap_fetch_type_free( fetchType );
705 710
706 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) { 711 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
707 mailimap_msg_att * msg_att; 712 mailimap_msg_att * msg_att;
708 msg_att = (mailimap_msg_att*)current->data; 713 msg_att = (mailimap_msg_att*)current->data;
709 mailimap_msg_att_item*msg_att_item; 714 mailimap_msg_att_item*msg_att_item;
710 for(cur = clist_begin(msg_att->att_list) ; cur != NULL ; cur = clist_next(cur)) { 715 for(cur = clist_begin(msg_att->att_list) ; cur != NULL ; cur = clist_next(cur)) {
711 msg_att_item = (mailimap_msg_att_item*)clist_content(cur); 716 msg_att_item = (mailimap_msg_att_item*)clist_content(cur);
712 if (msg_att_item->att_type == MAILIMAP_MSG_ATT_ITEM_STATIC) { 717 if (msg_att_item->att_type == MAILIMAP_MSG_ATT_ITEM_STATIC) {
713 if (msg_att_item->att_data.att_static->att_type == MAILIMAP_MSG_ATT_BODY_SECTION) { 718 if (msg_att_item->att_data.att_static->att_type == MAILIMAP_MSG_ATT_BODY_SECTION) {
714 char*text = msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part; 719 char*text = msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part;
715 /* detach - we take over the content */ 720 /* detach - we take over the content */
716 msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part = 0L; 721 msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part = 0L;
717 res->setContent(text,msg_att_item->att_data.att_static->att_data.att_body_section->sec_length); 722 res->setContent(text,msg_att_item->att_data.att_static->att_data.att_body_section->sec_length);
718 } 723 }
719 } 724 }
720 } 725 }
721 } else { 726 } else {
722 ;//odebug << "error fetching text: " << m_imap->imap_response << "" << oendl; 727 ;//odebug << "error fetching text: " << m_imap->imap_response << "" << oendl;
723 } 728 }
724 if (result) mailimap_fetch_list_free(result); 729 if (result) mailimap_fetch_list_free(result);
725 return res; 730 return res;
726} 731}
727 732
728/* current_recursion is for recursive calls. 733/* current_recursion is for recursive calls.
729 current_count means the position inside the internal loop! */ 734 current_count means the position inside the internal loop! */
730void IMAPwrapper::traverseBody(const RecMailP&mail,mailimap_body*body,RecBodyP&target_body, 735void IMAPwrapper::traverseBody(const RecMailP&mail,mailimap_body*body,RecBodyP&target_body,
731 int current_recursion,QValueList<int>recList,int current_count) 736 int current_recursion,QValueList<int>recList,int current_count)
732{ 737{
733 if (!body || current_recursion>=10) { 738 if (!body || current_recursion>=10) {
734 return; 739 return;
735 } 740 }
736 switch (body->bd_type) { 741 switch (body->bd_type) {
737 case MAILIMAP_BODY_1PART: 742 case MAILIMAP_BODY_1PART:
738 { 743 {
739 QValueList<int>countlist = recList; 744 QValueList<int>countlist = recList;
740 countlist.append(current_count); 745 countlist.append(current_count);
741 RecPartP currentPart = new RecPart(); 746 RecPartP currentPart = new RecPart();
742 mailimap_body_type_1part*part1 = body->bd_data.bd_body_1part; 747 mailimap_body_type_1part*part1 = body->bd_data.bd_body_1part;
743 QString id(""); 748 QString id("");
744 currentPart->setPositionlist(countlist); 749 currentPart->setPositionlist(countlist);
745 for (unsigned int j = 0; j < countlist.count();++j) { 750 for (unsigned int j = 0; j < countlist.count();++j) {
746 id+=(j>0?" ":""); 751 id+=(j>0?" ":"");
747 id+=QString("%1").arg(countlist[j]); 752 id+=QString("%1").arg(countlist[j]);
748 } 753 }
749 //odebug << "ID = " << id.latin1() << "" << oendl; 754 //odebug << "ID = " << id.latin1() << "" << oendl;
750 currentPart->setIdentifier(id); 755 currentPart->setIdentifier(id);
751 fillSinglePart(currentPart,part1); 756 fillSinglePart(currentPart,part1);
752 /* important: Check for is NULL 'cause a body can be empty! 757 /* important: Check for is NULL 'cause a body can be empty!
753 And we put it only into the mail if it is the FIRST part */ 758 And we put it only into the mail if it is the FIRST part */
754 if (part1->bd_type==MAILIMAP_BODY_TYPE_1PART_TEXT && target_body->Bodytext().isNull() && countlist[0]==1) { 759 if (part1->bd_type==MAILIMAP_BODY_TYPE_1PART_TEXT && target_body->Bodytext().isNull() && countlist[0]==1) {
755 QString body_text = fetchTextPart(mail,countlist,true,currentPart->Encoding()); 760 QString body_text = fetchTextPart(mail,countlist,true,currentPart->Encoding());
756 761
757 size_t index = 0; 762 size_t index = 0;
758 char*res = 0; 763 char*res = 0;
759 int err = MAILIMF_NO_ERROR; 764 int err = MAILIMF_NO_ERROR;
760 765
761 QString charset = currentPart->searchParamter( "charset"); 766 QString charset = currentPart->searchParamter( "charset");
762 qDebug("CHARSET %s ",charset.latin1() ); 767 qDebug("CHARSET %s ",charset.latin1() );
763 if ( false ) { 768 if ( false ) {
764 //if ( !charset.isEmpty() ) { 769 //if ( !charset.isEmpty() ) {
765 target_body->setCharset( charset ); 770 target_body->setCharset( charset );
766 //err = mailmime_encoded_phrase_parse("iso-8859-1", 771 //err = mailmime_encoded_phrase_parse("iso-8859-1",
767 // text, strlen(text),&index, "iso-8859-1",&res); 772 // text, strlen(text),&index, "iso-8859-1",&res);
768 err = mailmime_encoded_phrase_parse(charset.latin1(), 773 err = mailmime_encoded_phrase_parse(charset.latin1(),
769 body_text.latin1(), body_text.length(),&index, "utf-8",&res); 774 body_text.latin1(), body_text.length(),&index, "utf-8",&res);
770 if (err == MAILIMF_NO_ERROR && res && strlen(res)) { 775 if (err == MAILIMF_NO_ERROR && res && strlen(res)) {
771 //qDebug("res %d %s ", index, res); 776 //qDebug("res %d %s ", index, res);
772 body_text = QString::fromUtf8(res); 777 body_text = QString::fromUtf8(res);
773 } 778 }
774 if (res) free(res); 779 if (res) free(res);
775 } 780 }
776 //qDebug("encoding %d text %s ",currentPart->Encoding().latin1(), body_text.latin1() ); 781 //qDebug("encoding %d text %s ",currentPart->Encoding().latin1(), body_text.latin1() );
777 target_body->setDescription(currentPart); 782 target_body->setDescription(currentPart);
778 target_body->setBodytext(body_text); 783 target_body->setBodytext(body_text);
779 if (countlist.count()>1) { 784 if (countlist.count()>1) {
780 target_body->addPart(currentPart); 785 target_body->addPart(currentPart);
781 } 786 }
782 } else { 787 } else {
783 target_body->addPart(currentPart); 788 target_body->addPart(currentPart);
784 } 789 }
785 if (part1->bd_type==MAILIMAP_BODY_TYPE_1PART_MSG) { 790 if (part1->bd_type==MAILIMAP_BODY_TYPE_1PART_MSG) {
786 traverseBody(mail,part1->bd_data.bd_type_msg->bd_body,target_body,current_recursion+1,countlist); 791 traverseBody(mail,part1->bd_data.bd_type_msg->bd_body,target_body,current_recursion+1,countlist);
787 } 792 }
788 } 793 }
789 break; 794 break;
790 case MAILIMAP_BODY_MPART: 795 case MAILIMAP_BODY_MPART:
791 { 796 {
792 QValueList<int>countlist = recList; 797 QValueList<int>countlist = recList;
793 clistcell*current=0; 798 clistcell*current=0;
794 mailimap_body*current_body=0; 799 mailimap_body*current_body=0;
795 unsigned int ccount = 1; 800 unsigned int ccount = 1;
796 mailimap_body_type_mpart*mailDescription = body->bd_data.bd_body_mpart; 801 mailimap_body_type_mpart*mailDescription = body->bd_data.bd_body_mpart;
797 for (current=clist_begin(mailDescription->bd_list);current!=0;current=clist_next(current)) { 802 for (current=clist_begin(mailDescription->bd_list);current!=0;current=clist_next(current)) {
798 current_body = (mailimap_body*)current->data; 803 current_body = (mailimap_body*)current->data;
799 if (current_body->bd_type==MAILIMAP_BODY_MPART) { 804 if (current_body->bd_type==MAILIMAP_BODY_MPART) {
800 RecPartP targetPart = new RecPart(); 805 RecPartP targetPart = new RecPart();
801 targetPart->setType("multipart"); 806 targetPart->setType("multipart");
802 fillMultiPart(targetPart,mailDescription); 807 fillMultiPart(targetPart,mailDescription);
803 countlist.append(current_count); 808 countlist.append(current_count);
804 targetPart->setPositionlist(countlist); 809 targetPart->setPositionlist(countlist);
805 target_body->addPart(targetPart); 810 target_body->addPart(targetPart);
806 QString id(""); 811 QString id("");
807 for (unsigned int j = 0; j < countlist.count();++j) { 812 for (unsigned int j = 0; j < countlist.count();++j) {
808 id+=(j>0?" ":""); 813 id+=(j>0?" ":"");
809 id+=QString("%1").arg(countlist[j]); 814 id+=QString("%1").arg(countlist[j]);
810 } 815 }
811 // odebug << "ID(mpart) = " << id.latin1() << "" << oendl; 816 // odebug << "ID(mpart) = " << id.latin1() << "" << oendl;
812 } 817 }
813 traverseBody(mail,current_body,target_body,current_recursion+1,countlist,ccount); 818 traverseBody(mail,current_body,target_body,current_recursion+1,countlist,ccount);
814 if (current_body->bd_type==MAILIMAP_BODY_MPART) { 819 if (current_body->bd_type==MAILIMAP_BODY_MPART) {
815 countlist = recList; 820 countlist = recList;
816 } 821 }
817 ++ccount; 822 ++ccount;
818 } 823 }
819 } 824 }
820 break; 825 break;
821 default: 826 default:
822 break; 827 break;
823 } 828 }
824} 829}
825 830
826void IMAPwrapper::fillSinglePart(RecPartP&target_part,mailimap_body_type_1part*Description) 831void IMAPwrapper::fillSinglePart(RecPartP&target_part,mailimap_body_type_1part*Description)
827{ 832{
828 if (!Description) { 833 if (!Description) {
829 return; 834 return;
830 } 835 }
831 switch (Description->bd_type) { 836 switch (Description->bd_type) {
832 case MAILIMAP_BODY_TYPE_1PART_TEXT: 837 case MAILIMAP_BODY_TYPE_1PART_TEXT:
833 target_part->setType("text"); 838 target_part->setType("text");
834 fillSingleTextPart(target_part,Description->bd_data.bd_type_text); 839 fillSingleTextPart(target_part,Description->bd_data.bd_type_text);
835 break; 840 break;
836 case MAILIMAP_BODY_TYPE_1PART_BASIC: 841 case MAILIMAP_BODY_TYPE_1PART_BASIC:
837 fillSingleBasicPart(target_part,Description->bd_data.bd_type_basic); 842 fillSingleBasicPart(target_part,Description->bd_data.bd_type_basic);
838 break; 843 break;
839 case MAILIMAP_BODY_TYPE_1PART_MSG: 844 case MAILIMAP_BODY_TYPE_1PART_MSG:
840 target_part->setType("message"); 845 target_part->setType("message");
841 fillSingleMsgPart(target_part,Description->bd_data.bd_type_msg); 846 fillSingleMsgPart(target_part,Description->bd_data.bd_type_msg);
842 break; 847 break;
843 default: 848 default:
844 break; 849 break;
845 } 850 }
846} 851}
847 852
848void IMAPwrapper::fillSingleTextPart(RecPartP&target_part,mailimap_body_type_text*which) 853void IMAPwrapper::fillSingleTextPart(RecPartP&target_part,mailimap_body_type_text*which)
849{ 854{
850 if (!which) { 855 if (!which) {
851 return; 856 return;
852 } 857 }
853 QString sub; 858 QString sub;
854 sub = which->bd_media_text; 859 sub = which->bd_media_text;
855 //odebug << "Type= text/" << which->bd_media_text << "" << oendl; 860 //odebug << "Type= text/" << which->bd_media_text << "" << oendl;
856 target_part->setSubtype(sub.lower()); 861 target_part->setSubtype(sub.lower());
857 target_part->setLines(which->bd_lines); 862 target_part->setLines(which->bd_lines);
858 fillBodyFields(target_part,which->bd_fields); 863 fillBodyFields(target_part,which->bd_fields);
859} 864}
860 865
861void IMAPwrapper::fillSingleMsgPart(RecPartP&target_part,mailimap_body_type_msg*which) 866void IMAPwrapper::fillSingleMsgPart(RecPartP&target_part,mailimap_body_type_msg*which)
862{ 867{
863 if (!which) { 868 if (!which) {
864 return; 869 return;
865 } 870 }
866 target_part->setSubtype("rfc822"); 871 target_part->setSubtype("rfc822");
867 //odebug << "Message part" << oendl; 872 //odebug << "Message part" << oendl;
868 /* we set this type to text/plain */ 873 /* we set this type to text/plain */
869 target_part->setLines(which->bd_lines); 874 target_part->setLines(which->bd_lines);
870 fillBodyFields(target_part,which->bd_fields); 875 fillBodyFields(target_part,which->bd_fields);
871} 876}
872 877
873void IMAPwrapper::fillMultiPart(RecPartP&target_part,mailimap_body_type_mpart*which) 878void IMAPwrapper::fillMultiPart(RecPartP&target_part,mailimap_body_type_mpart*which)
874{ 879{
875 if (!which) return; 880 if (!which) return;
876 QString sub = which->bd_media_subtype; 881 QString sub = which->bd_media_subtype;
877 target_part->setSubtype(sub.lower()); 882 target_part->setSubtype(sub.lower());
878 if (which->bd_ext_mpart && which->bd_ext_mpart->bd_parameter && which->bd_ext_mpart->bd_parameter->pa_list) { 883 if (which->bd_ext_mpart && which->bd_ext_mpart->bd_parameter && which->bd_ext_mpart->bd_parameter->pa_list) {
879 clistcell*cur = 0; 884 clistcell*cur = 0;
880 mailimap_single_body_fld_param*param=0; 885 mailimap_single_body_fld_param*param=0;
881 for (cur = clist_begin(which->bd_ext_mpart->bd_parameter->pa_list);cur!=NULL;cur=clist_next(cur)) { 886 for (cur = clist_begin(which->bd_ext_mpart->bd_parameter->pa_list);cur!=NULL;cur=clist_next(cur)) {
882 param = (mailimap_single_body_fld_param*)cur->data; 887 param = (mailimap_single_body_fld_param*)cur->data;
883 if (param) { 888 if (param) {
884 target_part->addParameter(QString(param->pa_name).lower(),QString(param->pa_value)); 889 target_part->addParameter(QString(param->pa_name).lower(),QString(param->pa_value));
885 } 890 }
886 } 891 }
887 } 892 }
888} 893}
889 894
890void IMAPwrapper::fillSingleBasicPart(RecPartP&target_part,mailimap_body_type_basic*which) 895void IMAPwrapper::fillSingleBasicPart(RecPartP&target_part,mailimap_body_type_basic*which)
891{ 896{
892 if (!which) { 897 if (!which) {
893 return; 898 return;
894 } 899 }
895 QString type,sub; 900 QString type,sub;
896 switch (which->bd_media_basic->med_type) { 901 switch (which->bd_media_basic->med_type) {
897 case MAILIMAP_MEDIA_BASIC_APPLICATION: 902 case MAILIMAP_MEDIA_BASIC_APPLICATION:
898 type = "application"; 903 type = "application";
899 break; 904 break;
900 case MAILIMAP_MEDIA_BASIC_AUDIO: 905 case MAILIMAP_MEDIA_BASIC_AUDIO:
901 type = "audio"; 906 type = "audio";
902 break; 907 break;
903 case MAILIMAP_MEDIA_BASIC_IMAGE: 908 case MAILIMAP_MEDIA_BASIC_IMAGE:
904 type = "image"; 909 type = "image";
905 break; 910 break;
906 case MAILIMAP_MEDIA_BASIC_MESSAGE: 911 case MAILIMAP_MEDIA_BASIC_MESSAGE:
907 type = "message"; 912 type = "message";
908 break; 913 break;
909 case MAILIMAP_MEDIA_BASIC_VIDEO: 914 case MAILIMAP_MEDIA_BASIC_VIDEO:
910 type = "video"; 915 type = "video";
911 break; 916 break;
912 case MAILIMAP_MEDIA_BASIC_OTHER: 917 case MAILIMAP_MEDIA_BASIC_OTHER:
913 default: 918 default:
914 if (which->bd_media_basic->med_basic_type) { 919 if (which->bd_media_basic->med_basic_type) {
915 type = which->bd_media_basic->med_basic_type; 920 type = which->bd_media_basic->med_basic_type;
916 } else { 921 } else {
917 type = ""; 922 type = "";
918 } 923 }
919 break; 924 break;
920 } 925 }
921 if (which->bd_media_basic->med_subtype) { 926 if (which->bd_media_basic->med_subtype) {
922 sub = which->bd_media_basic->med_subtype; 927 sub = which->bd_media_basic->med_subtype;
923 } else { 928 } else {
924 sub = ""; 929 sub = "";
925 } 930 }
926 // odebug << "Type = " << type.latin1() << "/" << sub.latin1() << "" << oendl; 931 // odebug << "Type = " << type.latin1() << "/" << sub.latin1() << "" << oendl;
927 target_part->setType(type.lower()); 932 target_part->setType(type.lower());
928 target_part->setSubtype(sub.lower()); 933 target_part->setSubtype(sub.lower());
929 fillBodyFields(target_part,which->bd_fields); 934 fillBodyFields(target_part,which->bd_fields);
930} 935}
931 936
932void IMAPwrapper::fillBodyFields(RecPartP&target_part,mailimap_body_fields*which) 937void IMAPwrapper::fillBodyFields(RecPartP&target_part,mailimap_body_fields*which)
933{ 938{
934 if (!which) return; 939 if (!which) return;
935 if (which->bd_parameter && which->bd_parameter->pa_list && which->bd_parameter->pa_list->count>0) { 940 if (which->bd_parameter && which->bd_parameter->pa_list && which->bd_parameter->pa_list->count>0) {
936 clistcell*cur; 941 clistcell*cur;
937 mailimap_single_body_fld_param*param=0; 942 mailimap_single_body_fld_param*param=0;
938 for (cur = clist_begin(which->bd_parameter->pa_list);cur!=NULL;cur=clist_next(cur)) { 943 for (cur = clist_begin(which->bd_parameter->pa_list);cur!=NULL;cur=clist_next(cur)) {
939 param = (mailimap_single_body_fld_param*)cur->data; 944 param = (mailimap_single_body_fld_param*)cur->data;
940 if (param) { 945 if (param) {
941 target_part->addParameter(QString(param->pa_name).lower(),QString(param->pa_value)); 946 target_part->addParameter(QString(param->pa_name).lower(),QString(param->pa_value));
942 } 947 }
943 } 948 }
944 } 949 }
945 mailimap_body_fld_enc*enc = which->bd_encoding; 950 mailimap_body_fld_enc*enc = which->bd_encoding;
946 QString encoding(""); 951 QString encoding("");
947 switch (enc->enc_type) { 952 switch (enc->enc_type) {
948 case MAILIMAP_BODY_FLD_ENC_7BIT: 953 case MAILIMAP_BODY_FLD_ENC_7BIT:
949 encoding = "7bit"; 954 encoding = "7bit";
950 break; 955 break;
951 case MAILIMAP_BODY_FLD_ENC_8BIT: 956 case MAILIMAP_BODY_FLD_ENC_8BIT:
952 encoding = "8bit"; 957 encoding = "8bit";
953 break; 958 break;
954 case MAILIMAP_BODY_FLD_ENC_BINARY: 959 case MAILIMAP_BODY_FLD_ENC_BINARY:
955 encoding="binary"; 960 encoding="binary";
956 break; 961 break;
957 case MAILIMAP_BODY_FLD_ENC_BASE64: 962 case MAILIMAP_BODY_FLD_ENC_BASE64:
958 encoding="base64"; 963 encoding="base64";
959 break; 964 break;
960 case MAILIMAP_BODY_FLD_ENC_QUOTED_PRINTABLE: 965 case MAILIMAP_BODY_FLD_ENC_QUOTED_PRINTABLE:
961 encoding="quoted-printable"; 966 encoding="quoted-printable";
962 break; 967 break;
963 case MAILIMAP_BODY_FLD_ENC_OTHER: 968 case MAILIMAP_BODY_FLD_ENC_OTHER:
964 default: 969 default:
965 if (enc->enc_value) { 970 if (enc->enc_value) {
966 char*t=enc->enc_value; 971 char*t=enc->enc_value;
967 encoding=QString(enc->enc_value); 972 encoding=QString(enc->enc_value);
968 enc->enc_value=0L; 973 enc->enc_value=0L;
969 free(t); 974 free(t);
970 } 975 }
971 } 976 }
972 if (which->bd_description) { 977 if (which->bd_description) {
973 target_part->setDescription(QString(which->bd_description)); 978 target_part->setDescription(QString(which->bd_description));
974 } 979 }
975 target_part->setEncoding(encoding); 980 target_part->setEncoding(encoding);
976 target_part->setSize(which->bd_size); 981 target_part->setSize(which->bd_size);
977} 982}
978void IMAPwrapper::deleteMailList(const QValueList<RecMailP>&target) 983void IMAPwrapper::deleteMailList(const QValueList<RecMailP>&target)
979{ 984{
980 //#if 0 985 //#if 0
981 mailimap_flag_list*flist; 986 mailimap_flag_list*flist;
982 mailimap_set *set; 987 mailimap_set *set;
983 mailimap_store_att_flags * store_flags; 988 mailimap_store_att_flags * store_flags;
984 int err; 989 int err;
985 login(); 990 login();
986 //#endif 991 //#endif
987 if (!m_imap) { 992 if (!m_imap) {
988 return; 993 return;
989 } 994 }
990 int iii = 0; 995 int iii = 0;
991 int count = target.count(); 996 int count = target.count();
992 // qDebug("imap remove count %d ", count); 997 // qDebug("imap remove count %d ", count);
993 998
994 999
995 mMax = count; 1000 mMax = count;
996 progress( i18n("Delete")); 1001 progress( i18n("Delete"));
997 1002
998 QProgressBar wid ( count ); 1003 QProgressBar wid ( count );
999 wid.setCaption( i18n("Deleting ...")); 1004 wid.setCaption( i18n("Deleting ..."));
1000 wid.show(); 1005 wid.show();
1001 while (iii < count ) { 1006 while (iii < count ) {
1002 Global::statusMessage(i18n("Delete message %1 of %2").arg(iii).arg(count)); 1007 Global::statusMessage(i18n("Delete message %1 of %2").arg(iii).arg(count));
1003 wid.setProgress( iii ); 1008 wid.setProgress( iii );
1004 wid.raise(); 1009 wid.raise();
1005 qApp->processEvents(); 1010 qApp->processEvents();
1006 RecMailP mail = (*target.at( iii )); 1011 RecMailP mail = (*target.at( iii ));
1007 //#if 0 1012 //#if 0
1008 //qDebug("IMAP remove %d %d ", iii, mail->getNumber() ); 1013 //qDebug("IMAP remove %d %d ", iii, mail->getNumber() );
1009 err = selectMbox(mail->getMbox()); 1014 err = selectMbox(mail->getMbox());
1010 if ( err != MAILIMAP_NO_ERROR ) { 1015 if ( err != MAILIMAP_NO_ERROR ) {
1011 return; 1016 return;
1012 } 1017 }
1013 flist = mailimap_flag_list_new_empty(); 1018 flist = mailimap_flag_list_new_empty();
1014 mailimap_flag_list_add(flist,mailimap_flag_new_deleted()); 1019 mailimap_flag_list_add(flist,mailimap_flag_new_deleted());
1015 store_flags = mailimap_store_att_flags_new_set_flags(flist); 1020 store_flags = mailimap_store_att_flags_new_set_flags(flist);
1016 set = mailimap_set_new_single(mail->getNumber()); 1021 set = mailimap_set_new_single(mail->getNumber());
1017 err = mailimap_store(m_imap,set,store_flags); 1022 err = mailimap_store(m_imap,set,store_flags);
1018 mailimap_set_free( set ); 1023 mailimap_set_free( set );
1019 mailimap_store_att_flags_free(store_flags); 1024 mailimap_store_att_flags_free(store_flags);
1020 1025
1021 if (err != MAILIMAP_NO_ERROR) { 1026 if (err != MAILIMAP_NO_ERROR) {
1022 // odebug << "error deleting mail: " << m_imap->imap_response << "" << oendl; 1027 // odebug << "error deleting mail: " << m_imap->imap_response << "" << oendl;
1023 return; 1028 return;
1024 } 1029 }
1025 // odebug << "deleting mail: " << m_imap->imap_response << "" << oendl; 1030 // odebug << "deleting mail: " << m_imap->imap_response << "" << oendl;
1026 /* should we realy do that at this moment? */ 1031 /* should we realy do that at this moment? */
1027 1032
1028 // err = mailimap_expunge(m_imap); 1033 // err = mailimap_expunge(m_imap);
1029 //if (err != MAILIMAP_NO_ERROR) { 1034 //if (err != MAILIMAP_NO_ERROR) {
1030 // Global::statusMessage(i18n("Error deleting mails: %s").arg(m_imap->imap_response)); 1035 // Global::statusMessage(i18n("Error deleting mails: %s").arg(m_imap->imap_response));
1031 // } 1036 // }
1032 //#endif 1037 //#endif
1033 //deleteMail( mail); 1038 //deleteMail( mail);
1034 ++iii; 1039 ++iii;
1035 } 1040 }
1036 //qDebug("Deleting imap mails... "); 1041 //qDebug("Deleting imap mails... ");
1037 err = mailimap_expunge(m_imap); 1042 err = mailimap_expunge(m_imap);
1038 if (err != MAILIMAP_NO_ERROR) { 1043 if (err != MAILIMAP_NO_ERROR) {
1039 Global::statusMessage(i18n("Error deleting mails: %s").arg(m_imap->imap_response)); 1044 Global::statusMessage(i18n("Error deleting mails: %s").arg(m_imap->imap_response));
1040 } 1045 }
1041} 1046}
1042void IMAPwrapper::deleteMail(const RecMailP&mail) 1047void IMAPwrapper::deleteMail(const RecMailP&mail)
1043{ 1048{
1044 mailimap_flag_list*flist; 1049 mailimap_flag_list*flist;
1045 mailimap_set *set; 1050 mailimap_set *set;
1046 mailimap_store_att_flags * store_flags; 1051 mailimap_store_att_flags * store_flags;
1047 int err; 1052 int err;
1048 login(); 1053 login();
1049 if (!m_imap) { 1054 if (!m_imap) {
1050 return; 1055 return;
1051 } 1056 }
1052 err = selectMbox(mail->getMbox()); 1057 err = selectMbox(mail->getMbox());
1053 if ( err != MAILIMAP_NO_ERROR ) { 1058 if ( err != MAILIMAP_NO_ERROR ) {
1054 return; 1059 return;
1055 } 1060 }
1056 flist = mailimap_flag_list_new_empty(); 1061 flist = mailimap_flag_list_new_empty();
1057 mailimap_flag_list_add(flist,mailimap_flag_new_deleted()); 1062 mailimap_flag_list_add(flist,mailimap_flag_new_deleted());
1058 store_flags = mailimap_store_att_flags_new_set_flags(flist); 1063 store_flags = mailimap_store_att_flags_new_set_flags(flist);
1059 set = mailimap_set_new_single(mail->getNumber()); 1064 set = mailimap_set_new_single(mail->getNumber());
1060 err = mailimap_store(m_imap,set,store_flags); 1065 err = mailimap_store(m_imap,set,store_flags);
1061 mailimap_set_free( set ); 1066 mailimap_set_free( set );
1062 mailimap_store_att_flags_free(store_flags); 1067 mailimap_store_att_flags_free(store_flags);
1063 1068
1064 if (err != MAILIMAP_NO_ERROR) { 1069 if (err != MAILIMAP_NO_ERROR) {
1065 // odebug << "error deleting mail: " << m_imap->imap_response << "" << oendl; 1070 // odebug << "error deleting mail: " << m_imap->imap_response << "" << oendl;
1066 return; 1071 return;
1067 } 1072 }
1068 // odebug << "deleting mail: " << m_imap->imap_response << "" << oendl; 1073 // odebug << "deleting mail: " << m_imap->imap_response << "" << oendl;
1069 /* should we realy do that at this moment? */ 1074 /* should we realy do that at this moment? */
1070 1075
1071 err = mailimap_expunge(m_imap); 1076 err = mailimap_expunge(m_imap);
1072 if (err != MAILIMAP_NO_ERROR) { 1077 if (err != MAILIMAP_NO_ERROR) {
1073 Global::statusMessage(i18n("error deleting mail: %s").arg(m_imap->imap_response)); 1078 Global::statusMessage(i18n("error deleting mail: %s").arg(m_imap->imap_response));
1074 } 1079 }
1075 //qDebug("IMAPwrapper::deleteMail 2"); 1080 //qDebug("IMAPwrapper::deleteMail 2");
1076 1081
1077} 1082}
1078 1083
1079void IMAPwrapper::answeredMail(const RecMailP&mail) 1084void IMAPwrapper::answeredMail(const RecMailP&mail)
1080{ 1085{
1081 mailimap_flag_list*flist; 1086 mailimap_flag_list*flist;
1082 mailimap_set *set; 1087 mailimap_set *set;
1083 mailimap_store_att_flags * store_flags; 1088 mailimap_store_att_flags * store_flags;
1084 int err; 1089 int err;
1085 login(); 1090 login();
1086 if (!m_imap) { 1091 if (!m_imap) {
1087 return; 1092 return;
1088 } 1093 }
1089 err = selectMbox(mail->getMbox()); 1094 err = selectMbox(mail->getMbox());
1090 if ( err != MAILIMAP_NO_ERROR ) { 1095 if ( err != MAILIMAP_NO_ERROR ) {
1091 return; 1096 return;
1092 } 1097 }
1093 flist = mailimap_flag_list_new_empty(); 1098 flist = mailimap_flag_list_new_empty();
1094 mailimap_flag_list_add(flist,mailimap_flag_new_answered()); 1099 mailimap_flag_list_add(flist,mailimap_flag_new_answered());
1095 store_flags = mailimap_store_att_flags_new_add_flags(flist); 1100 store_flags = mailimap_store_att_flags_new_add_flags(flist);
1096 set = mailimap_set_new_single(mail->getNumber()); 1101 set = mailimap_set_new_single(mail->getNumber());
1097 err = mailimap_store(m_imap,set,store_flags); 1102 err = mailimap_store(m_imap,set,store_flags);
1098 mailimap_set_free( set ); 1103 mailimap_set_free( set );
1099 mailimap_store_att_flags_free(store_flags); 1104 mailimap_store_att_flags_free(store_flags);
1100 1105
1101 if (err != MAILIMAP_NO_ERROR) { 1106 if (err != MAILIMAP_NO_ERROR) {
1102 // odebug << "error marking mail: " << m_imap->imap_response << "" << oendl; 1107 // odebug << "error marking mail: " << m_imap->imap_response << "" << oendl;
1103 return; 1108 return;
1104 } 1109 }
1105} 1110}
1106 1111
1107QString IMAPwrapper::fetchTextPart(const RecMailP&mail,const QValueList<int>&path,bool internal_call,const QString&enc) 1112QString IMAPwrapper::fetchTextPart(const RecMailP&mail,const QValueList<int>&path,bool internal_call,const QString&enc)
1108{ 1113{
1109 QString body(""); 1114 QString body("");
1110 encodedString*res = fetchRawPart(mail,path,internal_call); 1115 encodedString*res = fetchRawPart(mail,path,internal_call);
1111 encodedString*r = decode_String(res,enc); 1116 encodedString*r = decode_String(res,enc);
1112 delete res; 1117 delete res;
1113 if (r) { 1118 if (r) {
1114 if (r->Length()>0) { 1119 if (r->Length()>0) {
1115 body = r->Content(); 1120 body = r->Content();
1116 } 1121 }
1117 delete r; 1122 delete r;
1118 } 1123 }
1119 return body; 1124 return body;
1120} 1125}
1121 1126
1122QString IMAPwrapper::fetchTextPart(const RecMailP&mail,const RecPartP&part) 1127QString IMAPwrapper::fetchTextPart(const RecMailP&mail,const RecPartP&part)
1123{ 1128{
1124 return fetchTextPart(mail,part->Positionlist(),false,part->Encoding()); 1129 return fetchTextPart(mail,part->Positionlist(),false,part->Encoding());
1125} 1130}
1126 1131
1127encodedString* IMAPwrapper::fetchDecodedPart(const RecMailP&mail,const RecPartP&part) 1132encodedString* IMAPwrapper::fetchDecodedPart(const RecMailP&mail,const RecPartP&part)
1128{ 1133{
1129 encodedString*res = fetchRawPart(mail,part->Positionlist(),false); 1134 encodedString*res = fetchRawPart(mail,part->Positionlist(),false);
1130 encodedString*r = decode_String(res,part->Encoding()); 1135 encodedString*r = decode_String(res,part->Encoding());
1131 delete res; 1136 delete res;
1132 return r; 1137 return r;
1133} 1138}
1134 1139
1135encodedString* IMAPwrapper::fetchRawPart(const RecMailP&mail,const RecPartP&part) 1140encodedString* IMAPwrapper::fetchRawPart(const RecMailP&mail,const RecPartP&part)
1136{ 1141{
1137 return fetchRawPart(mail,part->Positionlist(),false); 1142 return fetchRawPart(mail,part->Positionlist(),false);
1138} 1143}
1139 1144
1140int IMAPwrapper::deleteAllMail(const FolderP&folder) 1145int IMAPwrapper::deleteAllMail(const FolderP&folder)
1141{ 1146{
1142 login(); 1147 login();
1143 if (!m_imap) { 1148 if (!m_imap) {
1144 return 0; 1149 return 0;
1145 } 1150 }
1146 mailimap_flag_list*flist; 1151 mailimap_flag_list*flist;
1147 mailimap_set *set; 1152 mailimap_set *set;
1148 mailimap_store_att_flags * store_flags; 1153 mailimap_store_att_flags * store_flags;
1149 int err = selectMbox(folder->getName()); 1154 int err = selectMbox(folder->getName());
1150 if ( err != MAILIMAP_NO_ERROR ) { 1155 if ( err != MAILIMAP_NO_ERROR ) {
1151 return 0; 1156 return 0;
1152 } 1157 }
1153 1158
1154 int last = m_imap->imap_selection_info->sel_exists; 1159 int last = m_imap->imap_selection_info->sel_exists;
1155 if (last == 0) { 1160 if (last == 0) {
1156 Global::statusMessage(i18n("Mailbox has no mails!")); 1161 Global::statusMessage(i18n("Mailbox has no mails!"));
1157 return 0; 1162 return 0;
1158 } 1163 }
1159 flist = mailimap_flag_list_new_empty(); 1164 flist = mailimap_flag_list_new_empty();
1160 mailimap_flag_list_add(flist,mailimap_flag_new_deleted()); 1165 mailimap_flag_list_add(flist,mailimap_flag_new_deleted());
1161 store_flags = mailimap_store_att_flags_new_set_flags(flist); 1166 store_flags = mailimap_store_att_flags_new_set_flags(flist);
1162 set = mailimap_set_new_interval( 1, last ); 1167 set = mailimap_set_new_interval( 1, last );
1163 err = mailimap_store(m_imap,set,store_flags); 1168 err = mailimap_store(m_imap,set,store_flags);
1164 mailimap_set_free( set ); 1169 mailimap_set_free( set );
1165 mailimap_store_att_flags_free(store_flags); 1170 mailimap_store_att_flags_free(store_flags);
1166 if (err != MAILIMAP_NO_ERROR) { 1171 if (err != MAILIMAP_NO_ERROR) {
1167 Global::statusMessage(i18n("error deleting mail: %s").arg(m_imap->imap_response)); 1172 Global::statusMessage(i18n("error deleting mail: %s").arg(m_imap->imap_response));
1168 return 0; 1173 return 0;
1169 } 1174 }
1170 // odebug << "deleting mail: " << m_imap->imap_response << "" << oendl; 1175 // odebug << "deleting mail: " << m_imap->imap_response << "" << oendl;
1171 /* should we realy do that at this moment? */ 1176 /* should we realy do that at this moment? */
1172 err = mailimap_expunge(m_imap); 1177 err = mailimap_expunge(m_imap);
1173 if (err != MAILIMAP_NO_ERROR) { 1178 if (err != MAILIMAP_NO_ERROR) {
1174 Global::statusMessage(i18n("error deleting mail: %s").arg(m_imap->imap_response)); 1179 Global::statusMessage(i18n("error deleting mail: %s").arg(m_imap->imap_response));
1175 return 0; 1180 return 0;
1176 } 1181 }
1177 // odebug << "Delete successfull " << m_imap->imap_response << "" << oendl; 1182 // odebug << "Delete successfull " << m_imap->imap_response << "" << oendl;
1178 return 1; 1183 return 1;
1179} 1184}
1180 1185
1181int IMAPwrapper::createMbox(const QString&folder,const FolderP&parentfolder,const QString& delemiter,bool getsubfolder) 1186int IMAPwrapper::createMbox(const QString&folder,const FolderP&parentfolder,const QString& delemiter,bool getsubfolder)
1182{ 1187{
1183 if (folder.length()==0) return 0; 1188 if (folder.length()==0) return 0;
1184 login(); 1189 login();
1185 if (!m_imap) {return 0;} 1190 if (!m_imap) {return 0;}
1186 QString pre = account->getPrefix(); 1191 QString pre = account->getPrefix();
1187 if (delemiter.length()>0 && pre.findRev(delemiter)!=((int)pre.length())-1) { 1192 if (delemiter.length()>0 && pre.findRev(delemiter)!=((int)pre.length())-1) {
1188 pre+=delemiter; 1193 pre+=delemiter;
1189 } 1194 }
1190 if (parentfolder) { 1195 if (parentfolder) {
1191 pre += parentfolder->getDisplayName()+delemiter; 1196 pre += parentfolder->getDisplayName()+delemiter;
1192 } 1197 }
1193 pre+=folder; 1198 pre+=folder;
1194 if (getsubfolder) { 1199 if (getsubfolder) {
1195 if (delemiter.length()>0) { 1200 if (delemiter.length()>0) {
1196 pre+=delemiter; 1201 pre+=delemiter;
1197 } else { 1202 } else {
1198 Global::statusMessage(i18n("Cannot create folder %1 for holding subfolders").arg(pre)); 1203 Global::statusMessage(i18n("Cannot create folder %1 for holding subfolders").arg(pre));
1199 return 0; 1204 return 0;
1200 } 1205 }
1201 } 1206 }
1202 // odebug << "Creating " << pre.latin1() << "" << oendl; 1207 // odebug << "Creating " << pre.latin1() << "" << oendl;
1203 int res = mailimap_create(m_imap,pre.latin1()); 1208 int res = mailimap_create(m_imap,pre.latin1());
1204 if (res != MAILIMAP_NO_ERROR) { 1209 if (res != MAILIMAP_NO_ERROR) {
1205 Global::statusMessage(i18n("%1").arg(m_imap->imap_response)); 1210 Global::statusMessage(i18n("%1").arg(m_imap->imap_response));
1206 return 0; 1211 return 0;
1207 } 1212 }
1208 return 1; 1213 return 1;
1209} 1214}
1210 1215
1211int IMAPwrapper::deleteMbox(const FolderP&folder) 1216int IMAPwrapper::deleteMbox(const FolderP&folder)
1212{ 1217{
1213 if (!folder) return 0; 1218 if (!folder) return 0;
1214 login(); 1219 login();
1215 if (!m_imap) {return 0;} 1220 if (!m_imap) {return 0;}
1216 int res = mailimap_delete(m_imap,folder->getName()); 1221 int res = mailimap_delete(m_imap,folder->getName());
1217 if (res != MAILIMAP_NO_ERROR) { 1222 if (res != MAILIMAP_NO_ERROR) {
1218 Global::statusMessage(i18n("%1").arg(m_imap->imap_response)); 1223 Global::statusMessage(i18n("%1").arg(m_imap->imap_response));
1219 return 0; 1224 return 0;
1220 } 1225 }
1221 return 1; 1226 return 1;
1222} 1227}
1223 1228
1224void IMAPwrapper::statusFolder(folderStat&target_stat,const QString & mailbox) 1229void IMAPwrapper::statusFolder(folderStat&target_stat,const QString & mailbox)
1225{ 1230{
1226 mailimap_status_att_list * att_list =0; 1231 mailimap_status_att_list * att_list =0;
1227 mailimap_mailbox_data_status * status=0; 1232 mailimap_mailbox_data_status * status=0;
1228 clistiter * cur = 0; 1233 clistiter * cur = 0;
1229 int r = 0; 1234 int r = 0;
1230 target_stat.message_count = 0; 1235 target_stat.message_count = 0;
1231 target_stat.message_unseen = 0; 1236 target_stat.message_unseen = 0;
1232 target_stat.message_recent = 0; 1237 target_stat.message_recent = 0;
1233 login(); 1238 login();
1234 if (!m_imap) { 1239 if (!m_imap) {
1235 return; 1240 return;
1236 } 1241 }
1237 att_list = mailimap_status_att_list_new_empty(); 1242 att_list = mailimap_status_att_list_new_empty();
1238 if (!att_list) return; 1243 if (!att_list) return;
1239 r = mailimap_status_att_list_add(att_list, MAILIMAP_STATUS_ATT_MESSAGES); 1244 r = mailimap_status_att_list_add(att_list, MAILIMAP_STATUS_ATT_MESSAGES);
1240 r = mailimap_status_att_list_add(att_list, MAILIMAP_STATUS_ATT_RECENT); 1245 r = mailimap_status_att_list_add(att_list, MAILIMAP_STATUS_ATT_RECENT);
1241 r = mailimap_status_att_list_add(att_list, MAILIMAP_STATUS_ATT_UNSEEN); 1246 r = mailimap_status_att_list_add(att_list, MAILIMAP_STATUS_ATT_UNSEEN);
1242 r = mailimap_status(m_imap, mailbox.latin1(), att_list, &status); 1247 r = mailimap_status(m_imap, mailbox.latin1(), att_list, &status);
1243 if (r==MAILIMAP_NO_ERROR&&status->st_info_list!=0) { 1248 if (r==MAILIMAP_NO_ERROR&&status->st_info_list!=0) {
1244 for (cur = clist_begin(status->st_info_list); 1249 for (cur = clist_begin(status->st_info_list);
1245 cur != NULL ; cur = clist_next(cur)) { 1250 cur != NULL ; cur = clist_next(cur)) {
1246 mailimap_status_info * status_info; 1251 mailimap_status_info * status_info;
1247 status_info = (mailimap_status_info *)clist_content(cur); 1252 status_info = (mailimap_status_info *)clist_content(cur);
1248 switch (status_info->st_att) { 1253 switch (status_info->st_att) {
1249 case MAILIMAP_STATUS_ATT_MESSAGES: 1254 case MAILIMAP_STATUS_ATT_MESSAGES:
1250 target_stat.message_count = status_info->st_value; 1255 target_stat.message_count = status_info->st_value;
1251 break; 1256 break;
1252 case MAILIMAP_STATUS_ATT_RECENT: 1257 case MAILIMAP_STATUS_ATT_RECENT:
1253 target_stat.message_recent = status_info->st_value; 1258 target_stat.message_recent = status_info->st_value;
1254 break; 1259 break;
1255 case MAILIMAP_STATUS_ATT_UNSEEN: 1260 case MAILIMAP_STATUS_ATT_UNSEEN:
1256 target_stat.message_unseen = status_info->st_value; 1261 target_stat.message_unseen = status_info->st_value;
1257 break; 1262 break;
1258 } 1263 }
1259 } 1264 }
1260 } else { 1265 } else {
1261 // odebug << "Error retrieving status" << oendl; 1266 // odebug << "Error retrieving status" << oendl;
1262 } 1267 }
1263 if (status) mailimap_mailbox_data_status_free(status); 1268 if (status) mailimap_mailbox_data_status_free(status);
1264 if (att_list) mailimap_status_att_list_free(att_list); 1269 if (att_list) mailimap_status_att_list_free(att_list);
1265} 1270}
1266 1271
1267void IMAPwrapper::storeMessage(const char*msg,size_t length, const QString&folder) 1272void IMAPwrapper::storeMessage(const char*msg,size_t length, const QString&folder)
1268{ 1273{
1269 login(); 1274 login();
1270 if (!m_imap) return; 1275 if (!m_imap) return;
1271 if (!msg) return; 1276 if (!msg) return;
1272 int r = mailimap_append(m_imap,(char*)folder.latin1(),0,0,msg,length); 1277 int r = mailimap_append(m_imap,(char*)folder.latin1(),0,0,msg,length);
1273 if (r != MAILIMAP_NO_ERROR) { 1278 if (r != MAILIMAP_NO_ERROR) {
1274 Global::statusMessage("Error storing mail!"); 1279 Global::statusMessage("Error storing mail!");
1275 } 1280 }
1276} 1281}
1277 1282
1278MAILLIB::ATYPE IMAPwrapper::getType()const 1283MAILLIB::ATYPE IMAPwrapper::getType()const
1279{ 1284{
1280 return account->getType(); 1285 return account->getType();
1281} 1286}
1282 1287
1283const QString&IMAPwrapper::getName()const 1288const QString&IMAPwrapper::getName()const
1284{ 1289{
1285 // odebug << "Get name: " << account->getAccountName().latin1() << "" << oendl; 1290 // odebug << "Get name: " << account->getAccountName().latin1() << "" << oendl;
1286 return account->getAccountName(); 1291 return account->getAccountName();
1287} 1292}
1288 1293
1289encodedString* IMAPwrapper::fetchRawBody(const RecMailP&mail) 1294encodedString* IMAPwrapper::fetchRawBody(const RecMailP&mail)
1290{ 1295{
1291 // dummy 1296 // dummy
1292 QValueList<int> path; 1297 QValueList<int> path;
1293 return fetchRawPart(mail,path,false); 1298 return fetchRawPart(mail,path,false);
1294} 1299}
1295 1300
1296void IMAPwrapper::mvcpAllMails(const FolderP&fromFolder, 1301void IMAPwrapper::mvcpAllMails(const FolderP&fromFolder,
1297 const QString&targetFolder,AbstractMail*targetWrapper,bool moveit, int maxSizeInKb) 1302 const QString&targetFolder,AbstractMail*targetWrapper,bool moveit, int maxSizeInKb)
1298{ 1303{
1299 if (targetWrapper != this || maxSizeInKb > 0 ) { 1304 if (targetWrapper != this || maxSizeInKb > 0 ) {
1300 mMax = 0; 1305 mMax = 0;
1301 progress( i18n("Copy")); 1306 progress( i18n("Copy"));
1302 AbstractMail::mvcpAllMails(fromFolder,targetFolder,targetWrapper,moveit, maxSizeInKb); 1307 AbstractMail::mvcpAllMails(fromFolder,targetFolder,targetWrapper,moveit, maxSizeInKb);
1303 //qDebug("IMAPwrapper::mvcpAllMails::Using generic"); 1308 //qDebug("IMAPwrapper::mvcpAllMails::Using generic");
1304 // odebug << "Using generic" << oendl; 1309 // odebug << "Using generic" << oendl;
1305 return; 1310 return;
1306 } 1311 }
1307 mailimap_set *set = 0; 1312 mailimap_set *set = 0;
1308 login(); 1313 login();
1309 if (!m_imap) { 1314 if (!m_imap) {
1310 return; 1315 return;
1311 } 1316 }
1312 int err = selectMbox(fromFolder->getName()); 1317 int err = selectMbox(fromFolder->getName());
1313 if ( err != MAILIMAP_NO_ERROR ) { 1318 if ( err != MAILIMAP_NO_ERROR ) {
1314 return; 1319 return;
1315 } 1320 }
1316 Global::statusMessage( i18n("Copying mails on server...") ); 1321 Global::statusMessage( i18n("Copying mails on server...") );
1317 int last = m_imap->imap_selection_info->sel_exists; 1322 int last = m_imap->imap_selection_info->sel_exists;
1318 set = mailimap_set_new_interval( 1, last ); 1323 set = mailimap_set_new_interval( 1, last );
1319 err = mailimap_copy(m_imap,set,targetFolder.latin1()); 1324 err = mailimap_copy(m_imap,set,targetFolder.latin1());
1320 mailimap_set_free( set ); 1325 mailimap_set_free( set );
1321 if ( err != MAILIMAP_NO_ERROR ) { 1326 if ( err != MAILIMAP_NO_ERROR ) {
1322 QString error_msg = i18n("Error copy mails: %1").arg(m_imap->imap_response); 1327 QString error_msg = i18n("Error copy mails: %1").arg(m_imap->imap_response);
1323 Global::statusMessage(error_msg); 1328 Global::statusMessage(error_msg);
1324 // odebug << error_msg << oendl; 1329 // odebug << error_msg << oendl;
1325 return; 1330 return;
1326 } 1331 }
1327 if (moveit) { 1332 if (moveit) {
1328 deleteAllMail(fromFolder); 1333 deleteAllMail(fromFolder);
1329 } 1334 }
1330} 1335}
1331 1336
1332void IMAPwrapper::mvcpMail(const RecMailP&mail,const QString&targetFolder,AbstractMail*targetWrapper,bool moveit) 1337void IMAPwrapper::mvcpMail(const RecMailP&mail,const QString&targetFolder,AbstractMail*targetWrapper,bool moveit)
1333{ 1338{
1334 if (targetWrapper != this) { 1339 if (targetWrapper != this) {
1335 // odebug << "Using generic" << oendl; 1340 // odebug << "Using generic" << oendl;
1336 AbstractMail::mvcpMail(mail,targetFolder,targetWrapper,moveit); 1341 AbstractMail::mvcpMail(mail,targetFolder,targetWrapper,moveit);
1337 return; 1342 return;
1338 } 1343 }
1339 mailimap_set *set = 0; 1344 mailimap_set *set = 0;
1340 login(); 1345 login();
1341 if (!m_imap) { 1346 if (!m_imap) {
1342 return; 1347 return;
1343 } 1348 }
1344 int err = selectMbox(mail->getMbox()); 1349 int err = selectMbox(mail->getMbox());
1345 if ( err != MAILIMAP_NO_ERROR ) { 1350 if ( err != MAILIMAP_NO_ERROR ) {
1346 return; 1351 return;
1347 } 1352 }
1348 set = mailimap_set_new_single(mail->getNumber()); 1353 set = mailimap_set_new_single(mail->getNumber());
1349 err = mailimap_copy(m_imap,set,targetFolder.latin1()); 1354 err = mailimap_copy(m_imap,set,targetFolder.latin1());
1350 mailimap_set_free( set ); 1355 mailimap_set_free( set );
1351 if ( err != MAILIMAP_NO_ERROR ) { 1356 if ( err != MAILIMAP_NO_ERROR ) {
1352 QString error_msg = i18n("error copy mail: %1").arg(m_imap->imap_response); 1357 QString error_msg = i18n("error copy mail: %1").arg(m_imap->imap_response);
1353 Global::statusMessage(error_msg); 1358 Global::statusMessage(error_msg);
1354 // odebug << error_msg << oendl; 1359 // odebug << error_msg << oendl;
1355 return; 1360 return;
1356 } 1361 }
1357 if (moveit) { 1362 if (moveit) {
1358 deleteMail(mail); 1363 deleteMail(mail);
1359 } 1364 }
1360} 1365}
diff --git a/kmicromail/viewmailbase.cpp b/kmicromail/viewmailbase.cpp
index c4731a7..d21696a 100644
--- a/kmicromail/viewmailbase.cpp
+++ b/kmicromail/viewmailbase.cpp
@@ -1,104 +1,104 @@
1// CHANGED 2004-08-06 Lutz Rogowski 1// CHANGED 2004-08-06 Lutz Rogowski
2#include <qtextbrowser.h> 2#include <qtextbrowser.h>
3#include <qlistview.h> 3#include <qlistview.h>
4#include <qaction.h> 4#include <qaction.h>
5#include <qlabel.h> 5#include <qlabel.h>
6#include <qvbox.h> 6#include <qvbox.h>
7 7
8#include <qtoolbar.h> 8#include <qtoolbar.h>
9#include <qmenubar.h> 9#include <qmenubar.h>
10#include <kiconloader.h> 10#include <kiconloader.h>
11//#include <qpe/resource.h> 11//#include <qpe/resource.h>
12#include <klocale.h> 12#include <klocale.h>
13 13
14#include "viewmailbase.h" 14#include "viewmailbase.h"
15//#include "opendiag.h" 15//#include "opendiag.h"
16 16
17ViewMailBase::ViewMailBase(QWidget *parent, const char *name, WFlags fl) 17ViewMailBase::ViewMailBase(QWidget *parent, const char *name, WFlags fl)
18 : QMainWindow(parent, name, fl) 18 : QMainWindow(parent, name, fl)
19{ 19{
20 20
21 setToolBarsMovable(false); 21 setToolBarsMovable(false);
22 22
23 toolbar = new QToolBar(this); 23 toolbar = new QToolBar(this);
24 menubar = new QMenuBar( toolbar ); 24 menubar = new QMenuBar( toolbar );
25 mailmenu = new QPopupMenu( menubar ); 25 mailmenu = new QPopupMenu( menubar );
26 menubar->insertItem( i18n( "Mail" ), mailmenu ); 26 menubar->insertItem( i18n( "Mail" ), mailmenu );
27 27
28 toolbar->setHorizontalStretchable(true); 28 toolbar->setHorizontalStretchable(true);
29 addToolBar(toolbar); 29 addToolBar(toolbar);
30 30
31 reply = new QAction(i18n("Reply"),SmallIcon("reply"), 0, 0, this); 31 reply = new QAction(i18n("Reply"),SmallIcon("reply"), 0, 0, this);
32 reply->addTo(toolbar); 32 reply->addTo(toolbar);
33 reply->addTo(mailmenu); 33 reply->addTo(mailmenu);
34 34
35 forward = new QAction(i18n("Forward"),SmallIcon("forward"), 0, 0, this); 35 forward = new QAction(i18n("Forward"),SmallIcon("forward"), 0, 0, this);
36 forward->addTo(toolbar); 36 forward->addTo(toolbar);
37 forward->addTo(mailmenu); 37 forward->addTo(mailmenu);
38 38
39 attachbutton = new QAction(i18n("Attachments"),SmallIcon("attach"), 0, 0, this, 0, true); 39 attachbutton = new QAction(i18n("Attachments"),SmallIcon("attach"), 0, 0, this, 0, true);
40 attachbutton->addTo(toolbar); 40 attachbutton->addTo(toolbar);
41 attachbutton->addTo(mailmenu); 41 attachbutton->addTo(mailmenu);
42 connect(attachbutton, SIGNAL(toggled(bool)), SLOT(slotChangeAttachview(bool))); 42 connect(attachbutton, SIGNAL(toggled(bool)), SLOT(slotChangeAttachview(bool)));
43 43
44 44
45 showHtml = new QAction( i18n( "Show Html" ), SmallIcon( "html" ), 0, 0, this, 0, true ); 45 showHtml = new QAction( i18n( "Show Html" ), SmallIcon( "html" ), 0, 0, this, 0, true );
46 showHtml->addTo( toolbar ); 46 showHtml->addTo( toolbar );
47 showHtml->addTo( mailmenu ); 47 showHtml->addTo( mailmenu );
48 48
49 deleteMail = new QAction(i18n("Delete Mail"),SmallIcon("trash"), 0, 0, this); 49 deleteMail = new QAction(i18n("Delete Mail"),SmallIcon("trash"), 0, 0, this);
50 deleteMail->addTo(toolbar); 50 deleteMail->addTo(toolbar);
51 deleteMail->addTo(mailmenu); 51 deleteMail->addTo(mailmenu);
52 52
53 53
54 54
55 nextMail = new QAction(i18n("Show next mail"),SmallIcon("add"), 0, 0, this); 55 nextMail = new QAction(i18n("Show next mail"),SmallIcon("enter"), 0, 0, this);
56 QLabel *spacer = new QLabel(toolbar); 56 QLabel *spacer = new QLabel(toolbar);
57 nextMail->addTo(toolbar); 57 nextMail->addTo(toolbar);
58 nextMail->addTo(mailmenu); 58 nextMail->addTo(mailmenu);
59 59
60 60
61 61
62 62
63 closeMail = new QAction(i18n("Close"),SmallIcon("exit"), 0, 0, this); 63 closeMail = new QAction(i18n("Close"),SmallIcon("exit"), 0, 0, this);
64 //QLabel *spacer = new QLabel(toolbar); 64 //QLabel *spacer = new QLabel(toolbar);
65 spacer->setBackgroundMode(QWidget::PaletteButton); 65 spacer->setBackgroundMode(QWidget::PaletteButton);
66 toolbar->setStretchableWidget(spacer); 66 toolbar->setStretchableWidget(spacer);
67 closeMail->addTo(toolbar); 67 closeMail->addTo(toolbar);
68 closeMail->addTo(mailmenu); 68 closeMail->addTo(mailmenu);
69 QVBox *view = new QVBox(this); 69 QVBox *view = new QVBox(this);
70 setCentralWidget(view); 70 setCentralWidget(view);
71 71
72 attachments = new QListView(view); 72 attachments = new QListView(view);
73 attachments->setMinimumHeight(90); 73 attachments->setMinimumHeight(90);
74 attachments->setMaximumHeight(90); 74 attachments->setMaximumHeight(90);
75 attachments->setAllColumnsShowFocus(true); 75 attachments->setAllColumnsShowFocus(true);
76 attachments->addColumn("Mime Type", 60); 76 attachments->addColumn("Mime Type", 60);
77 attachments->addColumn(i18n("Description"), 100); 77 attachments->addColumn(i18n("Description"), 100);
78 attachments->addColumn(i18n("Filename"), 80); 78 attachments->addColumn(i18n("Filename"), 80);
79 attachments->addColumn(i18n("Size"), 80); 79 attachments->addColumn(i18n("Size"), 80);
80 attachments->setSorting(-1); 80 attachments->setSorting(-1);
81 attachments->hide(); 81 attachments->hide();
82 82
83 browser = new QTextBrowser(view); 83 browser = new QTextBrowser(view);
84 84
85 //openDiag = new OpenDiag(view); 85 //openDiag = new OpenDiag(view);
86 //openDiag->hide(); 86 //openDiag->hide();
87 87
88} 88}
89 89
90void ViewMailBase::slotChangeAttachview(bool state) 90void ViewMailBase::slotChangeAttachview(bool state)
91{ 91{
92 if (state) attachments->show(); 92 if (state) attachments->show();
93 else attachments->hide(); 93 else attachments->hide();
94} 94}
95 95
96void ViewMailBase::keyPressEvent ( QKeyEvent * e ) 96void ViewMailBase::keyPressEvent ( QKeyEvent * e )
97{ 97{
98 if( e->key()==Qt::Key_Escape ) { 98 if( e->key()==Qt::Key_Escape ) {
99 close(); 99 close();
100 e->accept(); 100 e->accept();
101 return; 101 return;
102 } 102 }
103 QWidget::keyPressEvent(e); 103 QWidget::keyPressEvent(e);
104} 104}