0.9.3claws64
[claws.git] / src / imap.c
index 2ab293edf418791ea6f813f9986f3202e176b66c..0df7e4318a27bb1af2cb067225e8c3ea2a94c685 100644 (file)
@@ -166,7 +166,7 @@ static gint imap_add_msg(Folder * folder,
                         const gchar * file, MsgFlags * flags);
 static gint imap_add_msgs(Folder * folder, FolderItem * dest,
                          GSList * file_list,
-                         MsgNumberList **newnum_list);
+                         GRelation *relation);
 
 static gint imap_copy_msg(Folder * folder,
                          FolderItem * dest, MsgInfo * msginfo);
@@ -367,7 +367,7 @@ static gint imap_cmd_ok             (IMAPSession    *session,
 static void imap_gen_send      (IMAPSession    *sock,
                                 const gchar    *format, ...);
 static gint imap_gen_recv      (IMAPSession    *sock,
-                                gchar         **buf);
+                                gchar         **ret);
 
 /* misc utility functions */
 static gchar *strchr_cpy                       (const gchar    *src,
@@ -793,7 +793,6 @@ gint imap_add_msg(Folder *folder, FolderItem *dest, const gchar *file, MsgFlags
        gint ret;
        GSList file_list;
        MsgFileInfo fileinfo;
-       MsgNumberList *msgnum_list = NULL;
 
        g_return_val_if_fail(file != NULL, -1);
 
@@ -802,13 +801,12 @@ gint imap_add_msg(Folder *folder, FolderItem *dest, const gchar *file, MsgFlags
        file_list.data = &fileinfo;
        file_list.next = NULL;
 
-       ret = imap_add_msgs(folder, dest, &file_list, &msgnum_list);
-       g_slist_free(msgnum_list);
+       ret = imap_add_msgs(folder, dest, &file_list, NULL);
        return ret;
 }
 
 gint imap_add_msgs(Folder *folder, FolderItem *dest, GSList *file_list,
-                  MsgNumberList **newnum_list)
+                  GRelation *relation)
 {
        gchar *destdir;
        IMAPSession *session;
@@ -854,7 +852,8 @@ gint imap_add_msgs(Folder *folder, FolderItem *dest, GSList *file_list,
                        return -1;
                }
 
-               *newnum_list = g_slist_append(*newnum_list, GINT_TO_POINTER(newnum));
+               if (relation != NULL)
+                       g_relation_insert(relation, fileinfo, GINT_TO_POINTER(newnum));
                if (newnum > last_uid)
                        last_uid = newnum;
        }
@@ -2198,7 +2197,7 @@ static gchar *imap_get_flag_str(IMAPFlags flags)
        if (IMAP_IS_DELETED(flags))     g_string_append(str, "\\Deleted ");
        if (IMAP_IS_DRAFT(flags))       g_string_append(str, "\\Draft");
 
-       if (str->str[str->len - 1] == ' ')
+       if (str->len > 0 && str->str[str->len - 1] == ' ')
                g_string_truncate(str, str->len - 1);
 
        ret = str->str;
@@ -2342,7 +2341,7 @@ static gint imap_cmd_authenticate(IMAPSession *session, const gchar *user,
 {
        gchar *auth_type;
        gint ok;
-       gchar *buf;
+       gchar *buf = NULL;
        gchar *challenge;
        gint challenge_len;
        gchar hexdigest[33];
@@ -2361,8 +2360,8 @@ static gint imap_cmd_authenticate(IMAPSession *session, const gchar *user,
        challenge = g_malloc(strlen(buf + 2) + 1);
        challenge_len = base64_decode(challenge, buf + 2, -1);
        challenge[challenge_len] = '\0';
-       log_print("IMAP< [Decoded: %s]\n", challenge);
        g_free(buf);
+       log_print("IMAP< [Decoded: %s]\n", challenge);
 
        md5_hex_hmac(hexdigest, challenge, challenge_len, pass, strlen(pass));
        g_free(challenge);
@@ -2728,7 +2727,7 @@ static gint imap_cmd_search(IMAPSession *session, const gchar *criteria, GSList
 static gint imap_cmd_fetch(IMAPSession *session, guint32 uid, const gchar *filename)
 {
        gint ok;
-       gchar *buf;
+       gchar *buf = NULL;
        gchar *cur_pos;
        gchar size_str[32];
        glong size_num;
@@ -2737,14 +2736,12 @@ static gint imap_cmd_fetch(IMAPSession *session, guint32 uid, const gchar *filen
 
        imap_gen_send(session, "UID FETCH %d BODY.PEEK[]", uid);
 
-       while ((ok = imap_gen_recv(session, &buf))
-              == IMAP_SUCCESS) {
+       while ((ok = imap_gen_recv(session, &buf)) == IMAP_SUCCESS) {
                if (buf[0] != '*' || buf[1] != ' ') {
                        g_free(buf);
                        return IMAP_ERROR;
                }
-               if (strstr(buf, "FETCH") != NULL)
-                       break;
+               if (strstr(buf, "FETCH") != NULL) break;
                g_free(buf);
        }
        if (ok != IMAP_SUCCESS) {
@@ -2752,29 +2749,27 @@ static gint imap_cmd_fetch(IMAPSession *session, guint32 uid, const gchar *filen
                return ok;
        }
 
-       cur_pos = strchr(buf, '{');
-       if (cur_pos == NULL) {
-               g_free(buf);
-               return IMAP_ERROR;
+#define RETURN_ERROR_IF_FAIL(cond)     \
+       if (!(cond)) {                  \
+               g_free(buf);            \
+               return IMAP_ERROR;      \
        }
 
+       cur_pos = strchr(buf, '{');
+       RETURN_ERROR_IF_FAIL(cur_pos != NULL);
        cur_pos = strchr_cpy(cur_pos + 1, '}', size_str, sizeof(size_str));
-       if (cur_pos == NULL) {
-               g_free(buf);
-               return IMAP_ERROR;
-       }
+       RETURN_ERROR_IF_FAIL(cur_pos != NULL);
        size_num = atol(size_str);
-       g_return_val_if_fail(size_num > 0, IMAP_ERROR);
+       RETURN_ERROR_IF_FAIL(size_num > 0);
 
-       if (*cur_pos != '\0') {
-               g_free(buf);
-               return IMAP_ERROR;
-       }
+       RETURN_ERROR_IF_FAIL(*cur_pos == '\0');
 
-       if (recv_bytes_write_to_file(SESSION(session)->sock, size_num, filename) != 0) {
-               g_free(buf);
+#undef RETURN_ERROR_IF_FAIL
+
+       g_free(buf);
+
+       if (recv_bytes_write_to_file(SESSION(session)->sock, size_num, filename) != 0)
                return IMAP_ERROR;
-       }
 
        if (imap_gen_recv(session, &buf) != IMAP_SUCCESS) {
                g_free(buf);
@@ -2785,8 +2780,8 @@ static gint imap_cmd_fetch(IMAPSession *session, guint32 uid, const gchar *filen
                g_free(buf);
                return IMAP_ERROR;
        }
-
        g_free(buf);
+
        ok = imap_cmd_ok(session, NULL);
 
        return ok;
@@ -2799,7 +2794,8 @@ static gint imap_cmd_append(IMAPSession *session, const gchar *destfolder,
        gint size, newuid;
        gchar *destfolder_;
        gchar *flag_str;
-       gchar buf[BUFFSIZE], *imapbuf;
+       gchar *ret = NULL;
+       gchar buf[BUFFSIZE];
        FILE *fp;
        GPtrArray *reply;
        gchar *okmsginfo;
@@ -2817,14 +2813,14 @@ static gint imap_cmd_append(IMAPSession *session, const gchar *destfolder,
                      destfolder_, flag_str, size);
        g_free(flag_str);
 
-       ok = imap_gen_recv(session, &imapbuf);
-       if (ok != IMAP_SUCCESS || imapbuf[0] != '+' || imapbuf[1] != ' ') {
+       ok = imap_gen_recv(session, &ret);
+       if (ok != IMAP_SUCCESS || ret[0] != '+' || ret[1] != ' ') {
                log_warning(_("can't append %s to %s\n"), file, destfolder_);
-               g_free(imapbuf);
+               g_free(ret);
                fclose(fp);
                return IMAP_ERROR;
        }
-       g_free(imapbuf);
+       g_free(ret);
 
        log_print("IMAP4> %s\n", _("(sending file...)"));
 
@@ -3051,14 +3047,14 @@ static void imap_gen_send(IMAPSession *session, const gchar *format, ...)
        g_free(buf);
 }
 
-static gint imap_gen_recv(IMAPSession *session, gchar **buf)
+static gint imap_gen_recv(IMAPSession *session, gchar **ret)
 {
-       if ((*buf = sock_getline(SESSION(session)->sock)) == NULL)
+       if ((*ret = sock_getline(SESSION(session)->sock)) == NULL)
                return IMAP_SOCKET;
 
-       strretchomp(*buf);
+       strretchomp(*ret);
 
-       log_print("IMAP4< %s\n", *buf);
+       log_print("IMAP4< %s\n", *ret);
 
        return IMAP_SUCCESS;
 }