commit 4032aa94f43f1cdf535b2011c0b5a03f64214351
Author: Oswald Buddenhagen <o...@kde.org>
Date:   Sun Mar 13 14:24:15 2011 +0100

    centralize imap_cmd disposal

 src/drv_imap.c |   43 +++++++++++++++++++++++--------------------
 1 files changed, 23 insertions(+), 20 deletions(-)

diff --git a/src/drv_imap.c b/src/drv_imap.c
index fb6902a..1dd6f0f 100644
--- a/src/drv_imap.c
+++ b/src/drv_imap.c
@@ -206,6 +206,20 @@ new_imap_cmd( int size )
        cmdp->gen.callback = cb; \
        cmdp->gen.callback_aux = aux;
 
+static int
+done_imap_cmd( imap_store_t *ctx, struct imap_cmd *cmd, int response )
+{
+       int cancel;
+
+       cmd->param.done( ctx, cmd, response );
+       free( cmd->param.data );
+       free( cmd->cmd );
+       free( cmd );
+       cancel = ctx->store_canceled;
+       deref_store( ctx );
+       return cancel ? -1 : 0;
+}
+
 static struct imap_cmd *
 v_submit_imap_cmd( imap_store_t *ctx, struct imap_cmd *cmd,
                    const char *fmt, va_list ap )
@@ -273,11 +287,7 @@ v_submit_imap_cmd( imap_store_t *ctx, struct imap_cmd *cmd,
   bail:
        ctx->gen.bad_callback( ctx->gen.bad_callback_aux );
   bail2:
-       cmd->param.done( ctx, cmd, RESP_CANCEL );
-       free( cmd->param.data );
-       free( cmd->cmd );
-       free( cmd );
-       deref_store( ctx );
+       done_imap_cmd( ctx, cmd, RESP_CANCEL );
        return NULL;
 }
 
@@ -754,7 +764,7 @@ get_cmd_result( imap_store_t *ctx, struct imap_cmd *tcmd )
 {
        struct imap_cmd *cmdp, **pcmdp;
        char *cmd, *arg, *arg1, *p;
-       int resp, resp2, tag, greeted;
+       int cancel, resp, resp2, tag, greeted;
 
        greeted = ctx->greeting;
        while (!buffer_gets( &ctx->conn, &cmd )) {
@@ -801,7 +811,10 @@ get_cmd_result( imap_store_t *ctx, struct imap_cmd *tcmd )
                        if (greeted == GreetingPending) {
                                ctx->ref_count++;
                                imap_open_store_greeted( ctx );
-                               goto finalize;
+                               cancel = ctx->store_canceled;
+                               deref_store( ctx );
+                               if (cancel)
+                                       return;
                        }
                } else if (!ctx->in_progress) {
                        error( "IMAP error: unexpected reply: %s %s\n", arg, 
cmd ? cmd : "" );
@@ -880,14 +893,8 @@ get_cmd_result( imap_store_t *ctx, struct imap_cmd *tcmd )
                                resp = resp2;
                        if (resp == RESP_CANCEL)
                                ctx->gen.bad_callback( 
ctx->gen.bad_callback_aux );
-                       cmdp->param.done( ctx, cmdp, resp );
-                       free( cmdp->param.data );
-                       free( cmdp->cmd );
-                       free( cmdp );
-                 finalize:
-                       if (ctx->store_canceled)
-                               tcmd = 0;
-                       deref_store( ctx );
+                       if (done_imap_cmd( ctx, cmdp, resp ) < 0)
+                               return;
                        if (!tcmd || tcmd == cmdp)
                                return;
                }
@@ -902,11 +909,7 @@ get_cmd_result_p2( imap_store_t *ctx, struct imap_cmd 
*cmd, int response )
        struct imap_cmd *ocmd = cmdp->orig_cmd;
 
        if (response != RESP_OK) {
-               ocmd->param.done( ctx, ocmd, response );
-               free( ocmd->param.data );
-               free( ocmd->cmd );
-               free( ocmd );
-               deref_store( ctx );
+               done_imap_cmd( ctx, ocmd, response );
        } else {
                ctx->uidnext = 0;
                ocmd->param.create = 0;

------------------------------------------------------------------------------
Colocation vs. Managed Hosting
A question and answer guide to determining the best fit
for your organization - today and in the future.
http://p.sf.net/sfu/internap-sfd2d
_______________________________________________
isync-devel mailing list
isync-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/isync-devel

Reply via email to