Update of /cvsroot/libetpan/libetpan/src/low-level/imap In directory sfp-cvsdas-2.v30.ch3.sourceforge.com:/tmp/cvs-serv26832/src/low-level/imap Modified Files: mailimap.c mailimap.h mailimap_parser.c mailimap_parser.h mailimap_sender.c mailimap_sender.h mailimap_types.h Log Message: improved progress report support for SMTP and IMAP. Index: mailimap.c =================================================================== RCS file: /cvsroot/libetpan/libetpan/src/low-level/imap/mailimap.c,v retrieving revision 1.44 retrieving revision 1.45 diff -u -d -r1.44 -r1.45 --- mailimap.c 5 Apr 2010 14:43:49 -0000 1.44 +++ mailimap.c 28 Nov 2010 17:01:26 -0000 1.45 @@ -629,8 +629,15 @@ return MAILIMAP_ERROR_APPEND; } - r = mailimap_literal_data_send(session->imap_stream, literal, literal_size, - session->imap_progr_rate, session->imap_progr_fun); + if (session->imap_body_progress_fun != NULL) { + r = mailimap_literal_data_send_with_context(session->imap_stream, literal, literal_size, + session->imap_body_progress_fun, + session->imap_progress_context); + } + else { + r = mailimap_literal_data_send(session->imap_stream, literal, literal_size, + session->imap_progr_rate, session->imap_progr_fun); + } if (r != MAILIMAP_NO_ERROR) return r; @@ -2393,10 +2400,21 @@ session->imap_response = NULL; - r = mailimap_response_parse(session->imap_stream, - session->imap_stream_buffer, - &indx, &response, - session->imap_progr_rate, session->imap_progr_fun); + if ((session->imap_body_progress_fun != NULL) || + (session->imap_items_progress_fun != NULL)) { + r = mailimap_response_parse_with_context(session->imap_stream, + session->imap_stream_buffer, + &indx, &response, + session->imap_body_progress_fun, + session->imap_items_progress_fun, + session->imap_progress_context); + } + else { + r = mailimap_response_parse(session->imap_stream, + session->imap_stream_buffer, + &indx, &response, + session->imap_progr_rate, session->imap_progr_fun); + } if (r != MAILIMAP_NO_ERROR) return r; @@ -2521,6 +2539,10 @@ f->imap_idle_timestamp = 0; f->imap_idle_maxdelay = 29 * 60; /* IMAP IDLE spec */ + f->imap_body_progress_fun = NULL; + f->imap_items_progress_fun = NULL; + f->imap_progress_context = NULL; + return f; free_stream_buffer: @@ -2556,3 +2578,14 @@ free(session); } + +LIBETPAN_EXPORT +void mailimap_set_progress_callback(mailimap * session, + mailprogress_function * body_progr_fun, + mailprogress_function * items_progr_fun, + void * context) +{ + session->imap_body_progress_fun = body_progr_fun; + session->imap_items_progress_fun = items_progr_fun; + session->imap_progress_context = context; +} Index: mailimap.h =================================================================== RCS file: /cvsroot/libetpan/libetpan/src/low-level/imap/mailimap.h,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- mailimap.h 26 May 2007 12:16:01 -0000 1.20 +++ mailimap.h 28 Nov 2010 17:01:26 -0000 1.21 @@ -652,6 +652,12 @@ int mailimap_parse_response(mailimap * session, struct mailimap_response ** result); +LIBETPAN_EXPORT +void mailimap_set_progress_callback(mailimap * session, + mailprogress_function * body_progr_fun, + mailprogress_function * items_progr_fun, + void * context); + #ifdef __cplusplus } #endif Index: mailimap_parser.c =================================================================== RCS file: /cvsroot/libetpan/libetpan/src/low-level/imap/mailimap_parser.c,v retrieving revision 1.54 retrieving revision 1.55 diff -u -d -r1.54 -r1.55 --- mailimap_parser.c 4 Sep 2010 22:35:50 -0000 1.54 +++ mailimap_parser.c 28 Nov 2010 17:01:26 -0000 1.55 @@ -68,6 +68,13 @@ /* ************************************************************************* */ +typedef int mailimap_struct_parser_progress(mailstream * fd, MMAPString * buffer, + size_t * indx, void * result, + size_t progr_rate, + progress_function * progr_fun, + mailprogress_function * body_progr_fun, + mailprogress_function * items_progr_fun, + void * context); [...1215 lines suppressed...] if (r != MAILIMAP_NO_ERROR) @@ -9398,6 +9854,17 @@ return MAILIMAP_NO_ERROR; } +int +mailimap_string_parse(mailstream * fd, MMAPString * buffer, + size_t * indx, char ** result, + size_t * result_len, + size_t progr_rate, + progress_function * progr_fun) +{ + return mailimap_string_parse_progress(fd, buffer, indx, result, + result_len, progr_rate, progr_fun, + NULL, NULL, NULL); +} /* UNIMPLEMENTED Index: mailimap_parser.h =================================================================== RCS file: /cvsroot/libetpan/libetpan/src/low-level/imap/mailimap_parser.h,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- mailimap_parser.h 3 Jan 2010 22:45:24 -0000 1.14 +++ mailimap_parser.h 28 Nov 2010 17:01:26 -0000 1.15 @@ -56,6 +56,13 @@ progress_function * progr_fun); int +mailimap_response_parse_with_context(mailstream * fd, MMAPString * buffer, + size_t * indx, struct mailimap_response ** result, + mailprogress_function * body_progress_fun, + mailprogress_function * items_progress_fun, + void * context); + +int mailimap_continue_req_parse(mailstream * fd, MMAPString * buffer, size_t * indx, struct mailimap_continue_req ** result, @@ -73,6 +80,7 @@ size_t * indx, void * result, size_t progr_rate, progress_function * progr_fun); + typedef void mailimap_struct_destructor(void * result); int Index: mailimap_sender.c =================================================================== RCS file: /cvsroot/libetpan/libetpan/src/low-level/imap/mailimap_sender.c,v retrieving revision 1.31 retrieving revision 1.32 diff -u -d -r1.31 -r1.32 --- mailimap_sender.c 22 Jul 2010 07:05:01 -0000 1.31 +++ mailimap_sender.c 28 Nov 2010 17:01:26 -0000 1.32 @@ -203,13 +203,25 @@ +static inline int mailimap_sized_token_send_with_context(mailstream * fd, const char * atom, + size_t len, + mailprogress_function * progr_fun, + void * context); static inline int mailimap_sized_token_send(mailstream * fd, const char * atom, size_t len) { - if (mailstream_send_data_crlf(fd, atom, len, 0, NULL) == -1) - return MAILIMAP_ERROR_STREAM; + return mailimap_sized_token_send_with_context(fd, atom, len, NULL, NULL); +} +static inline int mailimap_sized_token_send_with_context(mailstream * fd, const char * atom, + size_t len, + mailprogress_function * progr_fun, + void * context) +{ + if (mailstream_send_data_crlf_with_context(fd, atom, len, progr_fun, context) == -1) + return MAILIMAP_ERROR_STREAM; + return MAILIMAP_NO_ERROR; } @@ -1511,16 +1523,23 @@ size_t progr_rate, progress_function * progr_fun) { + return mailimap_literal_data_send_with_context(fd, literal, len, NULL, NULL); +} + +int +mailimap_literal_data_send_with_context(mailstream * fd, const char * literal, uint32_t len, + mailprogress_function * progr_fun, + void * context) +{ int r; - r = mailimap_sized_token_send(fd, literal, len); + r = mailimap_sized_token_send_with_context(fd, literal, len, progr_fun, context); if (r != MAILIMAP_NO_ERROR) return r; - + return MAILIMAP_NO_ERROR; } - /* => login = "LOGIN" SP userid SP password */ Index: mailimap_sender.h =================================================================== RCS file: /cvsroot/libetpan/libetpan/src/low-level/imap/mailimap_sender.h,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- mailimap_sender.h 20 Oct 2006 00:13:30 -0000 1.14 +++ mailimap_sender.h 28 Nov 2010 17:01:26 -0000 1.15 @@ -155,6 +155,11 @@ size_t progr_rate, progress_function * progr_fun); +int +mailimap_literal_data_send_with_context(mailstream * fd, const char * literal, uint32_t len, + mailprogress_function * progr_fun, + void * context); + int mailimap_starttls_send(mailstream * fd); int mailimap_token_send(mailstream * fd, const char * atom); Index: mailimap_types.h =================================================================== RCS file: /cvsroot/libetpan/libetpan/src/low-level/imap/mailimap_types.h,v retrieving revision 1.32 retrieving revision 1.33 diff -u -d -r1.32 -r1.33 --- mailimap_types.h 25 May 2007 01:31:18 -0000 1.32 +++ mailimap_types.h 28 Nov 2010 17:01:26 -0000 1.33 @@ -3143,6 +3143,10 @@ time_t imap_idle_timestamp; time_t imap_idle_maxdelay; + + mailprogress_function * imap_body_progress_fun; + mailprogress_function * imap_items_progress_fun; + void * imap_progress_context; }; typedef struct mailimap mailimap; |