summaryrefslogtreecommitdiffabout
path: root/kmicromail/libetpan/generic/mboxdriver.c
Unidiff
Diffstat (limited to 'kmicromail/libetpan/generic/mboxdriver.c') (more/less context) (ignore whitespace changes)
-rw-r--r--kmicromail/libetpan/generic/mboxdriver.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/kmicromail/libetpan/generic/mboxdriver.c b/kmicromail/libetpan/generic/mboxdriver.c
index fa3e2ea..c19a668 100644
--- a/kmicromail/libetpan/generic/mboxdriver.c
+++ b/kmicromail/libetpan/generic/mboxdriver.c
@@ -32,145 +32,149 @@
32/* 32/*
33 * $Id$ 33 * $Id$
34 */ 34 */
35 35
36#include "mboxdriver.h" 36#include "mboxdriver.h"
37 37
38#include <stdio.h> 38#include <stdio.h>
39#include <string.h> 39#include <string.h>
40#include <sys/types.h> 40#include <sys/types.h>
41#include <dirent.h> 41#include <dirent.h>
42#include <unistd.h> 42#include <unistd.h>
43#include <sys/stat.h> 43#include <sys/stat.h>
44#include <ctype.h> 44#include <ctype.h>
45#include <stdlib.h> 45#include <stdlib.h>
46#include <sys/times.h> 46#include <sys/times.h>
47 47
48#include "mail.h" 48#include "mail.h"
49#include "maildriver_tools.h" 49#include "maildriver_tools.h"
50#include "mailmbox.h" 50#include "mailmbox.h"
51#include "mboxdriver_tools.h" 51#include "mboxdriver_tools.h"
52#include "maildriver.h" 52#include "maildriver.h"
53#include "carray.h" 53#include "carray.h"
54#include "mboxdriver_message.h" 54#include "mboxdriver_message.h"
55#include "mailmessage.h" 55#include "mailmessage.h"
56 56
57static int mboxdriver_initialize(mailsession * session); 57static int mboxdriver_initialize(mailsession * session);
58 58
59static void mboxdriver_uninitialize(mailsession * session); 59static void mboxdriver_uninitialize(mailsession * session);
60 60
61static int mboxdriver_parameters(mailsession * session, 61static int mboxdriver_parameters(mailsession * session,
62 int id, void * value); 62 int id, void * value);
63 63
64static int mboxdriver_connect_path(mailsession * session, char * path); 64static int mboxdriver_connect_path(mailsession * session, char * path);
65 65
66static int mboxdriver_logout(mailsession * session); 66static int mboxdriver_logout(mailsession * session);
67 67
68static int mboxdriver_expunge_folder(mailsession * session); 68static int mboxdriver_expunge_folder(mailsession * session);
69 69
70static int mboxdriver_status_folder(mailsession * session, char * mb, 70static int mboxdriver_status_folder(mailsession * session, char * mb,
71 uint32_t * result_messages, uint32_t * result_recent, 71 uint32_t * result_messages, uint32_t * result_recent,
72 uint32_t * result_unseen); 72 uint32_t * result_unseen);
73 73
74static int mboxdriver_messages_number(mailsession * session, char * mb, 74static int mboxdriver_messages_number(mailsession * session, char * mb,
75 uint32_t * result); 75 uint32_t * result);
76 76
77static int mboxdriver_append_message(mailsession * session, 77static int mboxdriver_append_message(mailsession * session,
78 char * message, size_t size); 78 char * message, size_t size);
79 79
80static int mboxdriver_append_message_flags(mailsession * session,
81 char * message, size_t size, struct mail_flags * flags);
82
80static int mboxdriver_get_messages_list(mailsession * session, 83static int mboxdriver_get_messages_list(mailsession * session,
81 struct mailmessage_list ** result); 84 struct mailmessage_list ** result);
82 85
83static int 86static int
84mboxdriver_get_envelopes_list(mailsession * session, 87mboxdriver_get_envelopes_list(mailsession * session,
85 struct mailmessage_list * env_list); 88 struct mailmessage_list * env_list);
86 89
87static int mboxdriver_remove_message(mailsession * session, uint32_t num); 90static int mboxdriver_remove_message(mailsession * session, uint32_t num);
88 91
89static int mboxdriver_get_message(mailsession * session, 92static int mboxdriver_get_message(mailsession * session,
90 uint32_t num, mailmessage ** result); 93 uint32_t num, mailmessage ** result);
91 94
92static int mboxdriver_get_message_by_uid(mailsession * session, 95static int mboxdriver_get_message_by_uid(mailsession * session,
93 const char * uid, 96 const char * uid,
94 mailmessage ** result); 97 mailmessage ** result);
95 98
96static mailsession_driver local_mbox_session_driver = { 99static mailsession_driver local_mbox_session_driver = {
97 .sess_name = "mbox", 100 .sess_name = "mbox",
98 101
99 .sess_initialize = mboxdriver_initialize, 102 .sess_initialize = mboxdriver_initialize,
100 .sess_uninitialize = mboxdriver_uninitialize, 103 .sess_uninitialize = mboxdriver_uninitialize,
101 104
102 .sess_parameters = mboxdriver_parameters, 105 .sess_parameters = mboxdriver_parameters,
103 106
104 .sess_connect_path = mboxdriver_connect_path, 107 .sess_connect_path = mboxdriver_connect_path,
105 .sess_connect_stream = NULL, 108 .sess_connect_stream = NULL,
106 .sess_starttls = NULL, 109 .sess_starttls = NULL,
107 .sess_login = NULL, 110 .sess_login = NULL,
108 .sess_logout = mboxdriver_logout, 111 .sess_logout = mboxdriver_logout,
109 .sess_noop = NULL, 112 .sess_noop = NULL,
110 113
111 .sess_build_folder_name = NULL, 114 .sess_build_folder_name = NULL,
112 .sess_create_folder = NULL, 115 .sess_create_folder = NULL,
113 .sess_delete_folder = NULL, 116 .sess_delete_folder = NULL,
114 .sess_rename_folder = NULL, 117 .sess_rename_folder = NULL,
115 .sess_check_folder = NULL, 118 .sess_check_folder = NULL,
116 .sess_examine_folder = NULL, 119 .sess_examine_folder = NULL,
117 .sess_select_folder = NULL, 120 .sess_select_folder = NULL,
118 .sess_expunge_folder = mboxdriver_expunge_folder, 121 .sess_expunge_folder = mboxdriver_expunge_folder,
119 .sess_status_folder = mboxdriver_status_folder, 122 .sess_status_folder = mboxdriver_status_folder,
120 .sess_messages_number = mboxdriver_messages_number, 123 .sess_messages_number = mboxdriver_messages_number,
121 .sess_recent_number = mboxdriver_messages_number, 124 .sess_recent_number = mboxdriver_messages_number,
122 .sess_unseen_number = mboxdriver_messages_number, 125 .sess_unseen_number = mboxdriver_messages_number,
123 .sess_list_folders = NULL, 126 .sess_list_folders = NULL,
124 .sess_lsub_folders = NULL, 127 .sess_lsub_folders = NULL,
125 .sess_subscribe_folder = NULL, 128 .sess_subscribe_folder = NULL,
126 .sess_unsubscribe_folder = NULL, 129 .sess_unsubscribe_folder = NULL,
127 130
128 .sess_append_message = mboxdriver_append_message, 131 .sess_append_message = mboxdriver_append_message,
132 .sess_append_message_flags = mboxdriver_append_message_flags,
129 .sess_copy_message = NULL, 133 .sess_copy_message = NULL,
130 .sess_move_message = NULL, 134 .sess_move_message = NULL,
131 135
132 .sess_get_messages_list = mboxdriver_get_messages_list, 136 .sess_get_messages_list = mboxdriver_get_messages_list,
133 .sess_get_envelopes_list = mboxdriver_get_envelopes_list, 137 .sess_get_envelopes_list = mboxdriver_get_envelopes_list,
134 .sess_remove_message = mboxdriver_remove_message, 138 .sess_remove_message = mboxdriver_remove_message,
135#if 0 139#if 0
136 .sess_search_messages = maildriver_generic_search_messages, 140 .sess_search_messages = maildriver_generic_search_messages,
137#endif 141#endif
138 142
139 .sess_get_message = mboxdriver_get_message, 143 .sess_get_message = mboxdriver_get_message,
140 .sess_get_message_by_uid = mboxdriver_get_message_by_uid, 144 .sess_get_message_by_uid = mboxdriver_get_message_by_uid,
141}; 145};
142 146
143mailsession_driver * mbox_session_driver = &local_mbox_session_driver; 147mailsession_driver * mbox_session_driver = &local_mbox_session_driver;
144 148
145static inline struct mbox_session_state_data * get_data(mailsession * session) 149static inline struct mbox_session_state_data * get_data(mailsession * session)
146{ 150{
147 return session->sess_data; 151 return session->sess_data;
148} 152}
149 153
150static inline struct mailmbox_folder * get_mbox_session(mailsession * session) 154static inline struct mailmbox_folder * get_mbox_session(mailsession * session)
151{ 155{
152 return get_data(session)->mbox_folder; 156 return get_data(session)->mbox_folder;
153} 157}
154 158
155static int mboxdriver_initialize(mailsession * session) 159static int mboxdriver_initialize(mailsession * session)
156{ 160{
157 struct mbox_session_state_data * data; 161 struct mbox_session_state_data * data;
158 162
159 data = malloc(sizeof(* data)); 163 data = malloc(sizeof(* data));
160 if (data == NULL) 164 if (data == NULL)
161 goto err; 165 goto err;
162 166
163 data->mbox_folder = NULL; 167 data->mbox_folder = NULL;
164 168
165 data->mbox_force_read_only = FALSE; 169 data->mbox_force_read_only = FALSE;
166 data->mbox_force_no_uid = TRUE; 170 data->mbox_force_no_uid = TRUE;
167 171
168 session->sess_data = data; 172 session->sess_data = data;
169 173
170 return MAIL_NO_ERROR; 174 return MAIL_NO_ERROR;
171 175
172 err: 176 err:
173 return MAIL_ERROR_MEMORY; 177 return MAIL_ERROR_MEMORY;
174} 178}
175 179
176static void free_state(struct mbox_session_state_data * mbox_data) 180static void free_state(struct mbox_session_state_data * mbox_data)
@@ -299,96 +303,102 @@ static int mboxdriver_status_folder(mailsession * session, char * mb,
299 * result_unseen = count; 303 * result_unseen = count;
300 304
301 return MAIL_NO_ERROR; 305 return MAIL_NO_ERROR;
302} 306}
303 307
304static int mboxdriver_messages_number(mailsession * session, char * mb, 308static int mboxdriver_messages_number(mailsession * session, char * mb,
305 uint32_t * result) 309 uint32_t * result)
306{ 310{
307 struct mailmbox_folder * folder; 311 struct mailmbox_folder * folder;
308 int r; 312 int r;
309 313
310 folder = get_mbox_session(session); 314 folder = get_mbox_session(session);
311 if (folder == NULL) 315 if (folder == NULL)
312 return MAIL_ERROR_STATUS; 316 return MAIL_ERROR_STATUS;
313 317
314 r = mailmbox_validate_read_lock(folder); 318 r = mailmbox_validate_read_lock(folder);
315 if (r != MAIL_NO_ERROR) 319 if (r != MAIL_NO_ERROR)
316 return r; 320 return r;
317 321
318 mailmbox_read_unlock(folder); 322 mailmbox_read_unlock(folder);
319 323
320 * result = carray_count(folder->mb_tab) - folder->mb_deleted_count; 324 * result = carray_count(folder->mb_tab) - folder->mb_deleted_count;
321 325
322 return MAILMBOX_NO_ERROR; 326 return MAILMBOX_NO_ERROR;
323} 327}
324 328
325/* messages operations */ 329/* messages operations */
326 330
327static int mboxdriver_append_message(mailsession * session, 331static int mboxdriver_append_message(mailsession * session,
328 char * message, size_t size) 332 char * message, size_t size)
329{ 333{
330 int r; 334 int r;
331 struct mailmbox_folder * folder; 335 struct mailmbox_folder * folder;
332 336
333 folder = get_mbox_session(session); 337 folder = get_mbox_session(session);
334 if (folder == NULL) 338 if (folder == NULL)
335 return MAIL_ERROR_APPEND; 339 return MAIL_ERROR_APPEND;
336 340
337 r = mailmbox_append_message(folder, message, size); 341 r = mailmbox_append_message(folder, message, size);
338 342
339 switch (r) { 343 switch (r) {
340 case MAILMBOX_ERROR_FILE: 344 case MAILMBOX_ERROR_FILE:
341 return MAIL_ERROR_DISKSPACE; 345 return MAIL_ERROR_DISKSPACE;
342 default: 346 default:
343 return mboxdriver_mbox_error_to_mail_error(r); 347 return mboxdriver_mbox_error_to_mail_error(r);
344 } 348 }
345} 349}
346 350
351static int mboxdriver_append_message_flags(mailsession * session,
352 char * message, size_t size, struct mail_flags * flags)
353{
354 return mboxdriver_append_message(session, message, size);
355}
356
347static int mboxdriver_get_messages_list(mailsession * session, 357static int mboxdriver_get_messages_list(mailsession * session,
348 struct mailmessage_list ** result) 358 struct mailmessage_list ** result)
349{ 359{
350 struct mailmbox_folder * folder; 360 struct mailmbox_folder * folder;
351 int res; 361 int res;
352 362
353 folder = get_mbox_session(session); 363 folder = get_mbox_session(session);
354 if (folder == NULL) { 364 if (folder == NULL) {
355 res = MAIL_ERROR_BAD_STATE; 365 res = MAIL_ERROR_BAD_STATE;
356 goto err; 366 goto err;
357 } 367 }
358 368
359 return mbox_get_messages_list(folder, session, mbox_message_driver, result); 369 return mbox_get_messages_list(folder, session, mbox_message_driver, result);
360 370
361 err: 371 err:
362 return res; 372 return res;
363} 373}
364 374
365static int 375static int
366mboxdriver_get_envelopes_list(mailsession * session, 376mboxdriver_get_envelopes_list(mailsession * session,
367 struct mailmessage_list * env_list) 377 struct mailmessage_list * env_list)
368{ 378{
369 struct mailmbox_folder * folder; 379 struct mailmbox_folder * folder;
370 unsigned int i; 380 unsigned int i;
371 int r; 381 int r;
372 int res; 382 int res;
373 383
374 folder = get_mbox_session(session); 384 folder = get_mbox_session(session);
375 if (folder == NULL) { 385 if (folder == NULL) {
376 res = MAIL_ERROR_BAD_STATE; 386 res = MAIL_ERROR_BAD_STATE;
377 goto err; 387 goto err;
378 } 388 }
379 389
380 r = mailmbox_validate_read_lock(folder); 390 r = mailmbox_validate_read_lock(folder);
381 if (r != MAILMBOX_NO_ERROR) { 391 if (r != MAILMBOX_NO_ERROR) {
382 res = mboxdriver_mbox_error_to_mail_error(r); 392 res = mboxdriver_mbox_error_to_mail_error(r);
383 goto err; 393 goto err;
384 } 394 }
385 395
386 for(i = 0 ; i < carray_count(env_list->msg_tab) ; i ++) { 396 for(i = 0 ; i < carray_count(env_list->msg_tab) ; i ++) {
387 mailmessage * msg; 397 mailmessage * msg;
388 struct mailimf_fields * fields; 398 struct mailimf_fields * fields;
389 char * headers; 399 char * headers;
390 size_t headers_len; 400 size_t headers_len;
391 size_t cur_token; 401 size_t cur_token;
392 402
393 msg = carray_get(env_list->msg_tab, i); 403 msg = carray_get(env_list->msg_tab, i);
394 if (msg == NULL) 404 if (msg == NULL)