1 /*
2 * libEtPan! -- a mail stuff library
3 *
4 * Copyright (C) 2001, 2005 - DINH Viet Hoa
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
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
17 * from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
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
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
29 * SUCH DAMAGE.
30 */
31
32 /*
33 * $Id: maildriver.c,v 1.28 2006/06/07 15:10:01 smarinier Exp $
34 */
35
36 #ifdef HAVE_CONFIG_H
37 # include <config.h>
38 #endif
39
40 #include "maildriver.h"
41 #include <ctype.h>
42 #include <string.h>
43 #include <stdlib.h>
44
45 /* *********************************************************************** */
46 /* mail session */
47
48 LIBETPAN_EXPORT
mailsession_new(mailsession_driver * sess_driver)49 mailsession * mailsession_new(mailsession_driver * sess_driver)
50 {
51 mailsession * session;
52 int r;
53
54 session = malloc(sizeof(* session));
55
56 session->sess_data = NULL;
57
58 if (sess_driver->sess_initialize != NULL) {
59 r = sess_driver->sess_initialize(session);
60 if (r != MAIL_NO_ERROR)
61 goto free;
62 }
63
64 session->sess_driver = sess_driver;
65
66 return session;
67
68 free:
69 free(session);
70 return NULL;
71 }
72
73 LIBETPAN_EXPORT
mailsession_free(mailsession * session)74 void mailsession_free(mailsession * session)
75 {
76 if (session->sess_driver->sess_uninitialize != NULL)
77 session->sess_driver->sess_uninitialize(session);
78 free(session);
79 }
80
81 LIBETPAN_EXPORT
mailsession_parameters(mailsession * session,int id,void * value)82 int mailsession_parameters(mailsession * session,
83 int id, void * value)
84 {
85 if (session->sess_driver->sess_parameters == NULL)
86 return MAIL_ERROR_NOT_IMPLEMENTED;
87
88 return session->sess_driver->sess_parameters(session, id, value);
89 }
90
91 LIBETPAN_EXPORT
mailsession_connect_stream(mailsession * session,mailstream * s)92 int mailsession_connect_stream(mailsession * session, mailstream * s)
93 {
94 if (session->sess_driver->sess_connect_stream == NULL)
95 return MAIL_ERROR_NOT_IMPLEMENTED;
96
97 return session->sess_driver->sess_connect_stream(session, s);
98 }
99
100 LIBETPAN_EXPORT
mailsession_connect_path(mailsession * session,const char * path)101 int mailsession_connect_path(mailsession * session, const char * path)
102 {
103 if (session->sess_driver->sess_connect_path == NULL)
104 return MAIL_ERROR_NOT_IMPLEMENTED;
105
106 return session->sess_driver->sess_connect_path(session, path);
107 }
108
109 LIBETPAN_EXPORT
mailsession_starttls(mailsession * session)110 int mailsession_starttls(mailsession * session)
111 {
112 if (session->sess_driver->sess_starttls == NULL)
113 return MAIL_ERROR_NOT_IMPLEMENTED;
114
115 return session->sess_driver->sess_starttls(session);
116 }
117
118 LIBETPAN_EXPORT
mailsession_login(mailsession * session,const char * userid,const char * password)119 int mailsession_login(mailsession * session,
120 const char * userid, const char * password)
121 {
122 if (session->sess_driver->sess_login == NULL)
123 return MAIL_ERROR_NOT_IMPLEMENTED;
124
125 return session->sess_driver->sess_login(session, userid, password);
126 }
127
128 LIBETPAN_EXPORT
mailsession_logout(mailsession * session)129 int mailsession_logout(mailsession * session)
130 {
131 if (session->sess_driver->sess_logout == NULL)
132 return MAIL_ERROR_NOT_IMPLEMENTED;
133
134 return session->sess_driver->sess_logout(session);
135 }
136
137 LIBETPAN_EXPORT
mailsession_noop(mailsession * session)138 int mailsession_noop(mailsession * session)
139 {
140 if (session->sess_driver->sess_noop == NULL)
141 return MAIL_ERROR_NOT_IMPLEMENTED;
142
143 return session->sess_driver->sess_noop(session);
144 }
145
146 /* folders operations */
147
148 LIBETPAN_EXPORT
mailsession_build_folder_name(mailsession * session,const char * mb,const char * name,char ** result)149 int mailsession_build_folder_name(mailsession * session, const char * mb,
150 const char * name, char ** result)
151 {
152 if (session->sess_driver->sess_build_folder_name == NULL)
153 return MAIL_ERROR_NOT_IMPLEMENTED;
154
155 return session->sess_driver->sess_build_folder_name(session,
156 mb, name, result);
157 }
158
159 LIBETPAN_EXPORT
mailsession_create_folder(mailsession * session,const char * mb)160 int mailsession_create_folder(mailsession * session, const char * mb)
161 {
162 if (session->sess_driver->sess_create_folder == NULL)
163 return MAIL_ERROR_NOT_IMPLEMENTED;
164
165 return session->sess_driver->sess_create_folder(session, mb);
166 }
167
168 LIBETPAN_EXPORT
mailsession_delete_folder(mailsession * session,const char * mb)169 int mailsession_delete_folder(mailsession * session, const char * mb)
170 {
171 if (session->sess_driver->sess_delete_folder == NULL)
172 return MAIL_ERROR_NOT_IMPLEMENTED;
173
174 return session->sess_driver->sess_delete_folder(session, mb);
175 }
176
177 LIBETPAN_EXPORT
mailsession_rename_folder(mailsession * session,const char * mb,const char * new_name)178 int mailsession_rename_folder(mailsession * session,
179 const char * mb, const char * new_name)
180 {
181 if (session->sess_driver->sess_rename_folder == NULL)
182 return MAIL_ERROR_NOT_IMPLEMENTED;
183
184 return session->sess_driver->sess_rename_folder(session, mb, new_name);
185 }
186
187 LIBETPAN_EXPORT
mailsession_check_folder(mailsession * session)188 int mailsession_check_folder(mailsession * session)
189 {
190 if (session->sess_driver->sess_check_folder == NULL)
191 return MAIL_ERROR_NOT_IMPLEMENTED;
192
193 return session->sess_driver->sess_check_folder(session);
194 }
195
196 LIBETPAN_EXPORT
mailsession_examine_folder(mailsession * session,const char * mb)197 int mailsession_examine_folder(mailsession * session, const char * mb)
198 {
199 if (session->sess_driver->sess_examine_folder == NULL)
200 return MAIL_ERROR_NOT_IMPLEMENTED;
201
202 return session->sess_driver->sess_examine_folder(session, mb);
203 }
204
205 LIBETPAN_EXPORT
mailsession_select_folder(mailsession * session,const char * mb)206 int mailsession_select_folder(mailsession * session, const char * mb)
207 {
208 if (session->sess_driver->sess_select_folder == NULL)
209 return MAIL_ERROR_NOT_IMPLEMENTED;
210
211 return session->sess_driver->sess_select_folder(session, mb);
212 }
213
214 LIBETPAN_EXPORT
mailsession_expunge_folder(mailsession * session)215 int mailsession_expunge_folder(mailsession * session)
216 {
217 if (session->sess_driver->sess_expunge_folder == NULL)
218 return MAIL_ERROR_NOT_IMPLEMENTED;
219
220 return session->sess_driver->sess_expunge_folder(session);
221 }
222
223 LIBETPAN_EXPORT
mailsession_status_folder(mailsession * session,const char * mb,uint32_t * result_messages,uint32_t * result_recent,uint32_t * result_unseen)224 int mailsession_status_folder(mailsession * session, const char * mb,
225 uint32_t * result_messages, uint32_t * result_recent,
226 uint32_t * result_unseen)
227 {
228 if (session->sess_driver->sess_status_folder == NULL)
229 return MAIL_ERROR_NOT_IMPLEMENTED;
230
231 return session->sess_driver->sess_status_folder(session, mb,
232 result_messages, result_recent, result_unseen);
233 }
234
235 LIBETPAN_EXPORT
mailsession_messages_number(mailsession * session,const char * mb,uint32_t * result)236 int mailsession_messages_number(mailsession * session, const char * mb,
237 uint32_t * result)
238 {
239 if (session->sess_driver->sess_messages_number == NULL)
240 return MAIL_ERROR_NOT_IMPLEMENTED;
241
242 return session->sess_driver->sess_messages_number(session, mb, result);
243 }
244
245 LIBETPAN_EXPORT
mailsession_recent_number(mailsession * session,const char * mb,uint32_t * result)246 int mailsession_recent_number(mailsession * session, const char * mb,
247 uint32_t * result)
248 {
249 if (session->sess_driver->sess_recent_number == NULL)
250 return MAIL_ERROR_NOT_IMPLEMENTED;
251
252 return session->sess_driver->sess_recent_number(session, mb, result);
253 }
254
255 LIBETPAN_EXPORT
mailsession_unseen_number(mailsession * session,const char * mb,uint32_t * result)256 int mailsession_unseen_number(mailsession * session, const char * mb,
257 uint32_t * result)
258 {
259 if (session->sess_driver->sess_unseen_number == NULL)
260 return MAIL_ERROR_NOT_IMPLEMENTED;
261
262 return session->sess_driver->sess_unseen_number(session, mb, result);
263 }
264
265 LIBETPAN_EXPORT
mailsession_list_folders(mailsession * session,const char * mb,struct mail_list ** result)266 int mailsession_list_folders(mailsession * session, const char * mb,
267 struct mail_list ** result)
268 {
269 if (session->sess_driver->sess_list_folders == NULL)
270 return MAIL_ERROR_NOT_IMPLEMENTED;
271
272 return session->sess_driver->sess_list_folders(session, mb, result);
273 }
274
275 LIBETPAN_EXPORT
mailsession_lsub_folders(mailsession * session,const char * mb,struct mail_list ** result)276 int mailsession_lsub_folders(mailsession * session, const char * mb,
277 struct mail_list ** result)
278 {
279 if (session->sess_driver->sess_lsub_folders == NULL)
280 return MAIL_ERROR_NOT_IMPLEMENTED;
281
282 return session->sess_driver->sess_lsub_folders(session, mb, result);
283 }
284
285 LIBETPAN_EXPORT
mailsession_subscribe_folder(mailsession * session,const char * mb)286 int mailsession_subscribe_folder(mailsession * session, const char * mb)
287 {
288 if (session->sess_driver->sess_subscribe_folder == NULL)
289 return MAIL_ERROR_NOT_IMPLEMENTED;
290
291 return session->sess_driver->sess_subscribe_folder(session, mb);
292 }
293
294 LIBETPAN_EXPORT
mailsession_unsubscribe_folder(mailsession * session,const char * mb)295 int mailsession_unsubscribe_folder(mailsession * session, const char * mb)
296 {
297 if (session->sess_driver->sess_unsubscribe_folder == NULL)
298 return MAIL_ERROR_NOT_IMPLEMENTED;
299
300 return session->sess_driver->sess_unsubscribe_folder(session, mb);
301 }
302
303 /* message */
304
305 LIBETPAN_EXPORT
mailsession_append_message(mailsession * session,const char * message,size_t size)306 int mailsession_append_message(mailsession * session,
307 const char * message, size_t size)
308 {
309 if (session->sess_driver->sess_append_message == NULL)
310 return MAIL_ERROR_NOT_IMPLEMENTED;
311
312 return session->sess_driver->sess_append_message(session, message, size);
313 }
314
315 LIBETPAN_EXPORT
mailsession_append_message_flags(mailsession * session,const char * message,size_t size,struct mail_flags * flags)316 int mailsession_append_message_flags(mailsession * session,
317 const char * message, size_t size, struct mail_flags * flags)
318 {
319 if (session->sess_driver->sess_append_message_flags == NULL)
320 return MAIL_ERROR_NOT_IMPLEMENTED;
321
322 return session->sess_driver->sess_append_message_flags(session,
323 message, size, flags);
324 }
325
326 LIBETPAN_EXPORT
mailsession_copy_message(mailsession * session,uint32_t num,const char * mb)327 int mailsession_copy_message(mailsession * session,
328 uint32_t num, const char * mb)
329 {
330 if (session->sess_driver->sess_copy_message == NULL)
331 return MAIL_ERROR_NOT_IMPLEMENTED;
332
333 return session->sess_driver->sess_copy_message(session, num, mb);
334 }
335
336 LIBETPAN_EXPORT
mailsession_move_message(mailsession * session,uint32_t num,const char * mb)337 int mailsession_move_message(mailsession * session,
338 uint32_t num, const char * mb)
339 {
340 if (session->sess_driver->sess_move_message == NULL) {
341 int r;
342
343 if ((session->sess_driver->sess_copy_message == NULL) &&
344 (session->sess_driver->sess_remove_message == NULL))
345 return MAIL_ERROR_NOT_IMPLEMENTED;
346
347 r = mailsession_copy_message(session, num, mb);
348 if (r != MAIL_NO_ERROR)
349 return r;
350
351 r = mailsession_remove_message(session, num);
352 if (r != MAIL_NO_ERROR)
353 return r;
354
355 return MAIL_NO_ERROR;
356 }
357
358 return session->sess_driver->sess_move_message(session, num, mb);
359 }
360
361 LIBETPAN_EXPORT
mailsession_get_envelopes_list(mailsession * session,struct mailmessage_list * env_list)362 int mailsession_get_envelopes_list(mailsession * session,
363 struct mailmessage_list * env_list)
364 {
365 if (session->sess_driver->sess_get_envelopes_list == NULL)
366 return MAIL_ERROR_NOT_IMPLEMENTED;
367
368 return session->sess_driver->sess_get_envelopes_list(session, env_list);
369 }
370
371 LIBETPAN_EXPORT
mailsession_get_messages_list(mailsession * session,struct mailmessage_list ** result)372 int mailsession_get_messages_list(mailsession * session,
373 struct mailmessage_list ** result)
374 {
375 if (session->sess_driver->sess_get_messages_list == NULL)
376 return MAIL_ERROR_NOT_IMPLEMENTED;
377
378 return session->sess_driver->sess_get_messages_list(session, result);
379 }
380
381 LIBETPAN_EXPORT
mailsession_remove_message(mailsession * session,uint32_t num)382 int mailsession_remove_message(mailsession * session, uint32_t num)
383 {
384 if (session->sess_driver->sess_remove_message == NULL)
385 return MAIL_ERROR_NOT_IMPLEMENTED;
386
387 return session->sess_driver->sess_remove_message(session, num);
388 }
389
390 #if 0
391 LIBETPAN_EXPORT
392 int mailsession_search_messages(mailsession * session, const char * charset,
393 struct mail_search_key * key,
394 struct mail_search_result ** result)
395 {
396 if (session->sess_driver->sess_search_messages == NULL)
397 return MAIL_ERROR_NOT_IMPLEMENTED;
398
399 return session->sess_driver->sess_search_messages(session,
400 charset, key, result);
401 }
402 #endif
403
404 LIBETPAN_EXPORT
mailsession_get_message(mailsession * session,uint32_t num,mailmessage ** result)405 int mailsession_get_message(mailsession * session,
406 uint32_t num, mailmessage ** result)
407 {
408 if (session->sess_driver->sess_get_message == NULL)
409 return MAIL_ERROR_NOT_IMPLEMENTED;
410
411 return session->sess_driver->sess_get_message(session, num, result);
412 }
413
414 LIBETPAN_EXPORT
mailsession_get_message_by_uid(mailsession * session,const char * uid,mailmessage ** result)415 int mailsession_get_message_by_uid(mailsession * session,
416 const char * uid, mailmessage ** result)
417 {
418 if (session->sess_driver->sess_get_message_by_uid == NULL)
419 return MAIL_ERROR_NOT_IMPLEMENTED;
420
421 return session->sess_driver->sess_get_message_by_uid(session, uid, result);
422 }
423
424 LIBETPAN_EXPORT
mailsession_login_sasl(mailsession * session,const char * auth_type,const char * server_fqdn,const char * local_ip_port,const char * remote_ip_port,const char * login,const char * auth_name,const char * password,const char * realm)425 int mailsession_login_sasl(mailsession * session, const char * auth_type,
426 const char * server_fqdn,
427 const char * local_ip_port,
428 const char * remote_ip_port,
429 const char * login, const char * auth_name,
430 const char * password, const char * realm)
431 {
432 if (session->sess_driver->sess_login_sasl == NULL)
433 return MAIL_ERROR_NOT_IMPLEMENTED;
434
435 return session->sess_driver->sess_login_sasl(session, auth_type,
436 server_fqdn,
437 local_ip_port,
438 remote_ip_port,
439 login, auth_name,
440 password, realm);
441 }
442