* src/imap.c
[claws.git] / src / imap.c
index cec5ec158318323999310af5e778145d91b1cea1..0acaf306372fbdc490a40f9e1e476d0c5ecf58c6 100644 (file)
@@ -665,13 +665,13 @@ static IMAPSession *imap_session_get(Folder *folder)
                        /* Check if this is the first try to establish a
                           connection, if yes we don't try to reconnect */
                        if (rfolder->session == NULL) {
-                               log_warning(_("Connecting %s failed"),
+                               log_warning("Connecting %s failed",
                                            folder->account->recv_server);
                                session_destroy(SESSION(session));
                                session = NULL;
                        } else {
-                               log_warning(_("IMAP4 connection to %s has been"
-                                             " disconnected. Reconnecting...\n"),
+                               log_warning("IMAP4 connection to %s has been"
+                                           " disconnected. Reconnecting...\n",
                                            folder->account->recv_server);
                                session_destroy(SESSION(session));
                                /* Clear folders session to make imap_session_get create
@@ -710,7 +710,7 @@ static IMAPSession *imap_session_new(const PrefsAccount *account)
 #endif
 
        if (account->set_tunnelcmd) {
-               log_message(_("creating tunneled IMAP4 connection\n"));
+               log_message("creating tunneled IMAP4 connection\n");
 #if USE_OPENSSL
                if ((imap_sock = imap_open_tunnel(account->recv_server, 
                                                  account->tunnelcmd,
@@ -723,7 +723,7 @@ static IMAPSession *imap_session_new(const PrefsAccount *account)
        } else {
                g_return_val_if_fail(account->recv_server != NULL, NULL);
 
-               log_message(_("creating IMAP4 connection to %s:%d ...\n"),
+               log_message("creating IMAP4 connection to %s:%d ...\n",
                            account->recv_server, port);
                
 #if USE_OPENSSL
@@ -762,7 +762,7 @@ static IMAPSession *imap_session_new(const PrefsAccount *account)
 
                ok = imap_cmd_starttls(session);
                if (ok != IMAP_SUCCESS) {
-                       log_warning(_("Can't start TLS session.\n"));
+                       log_warning("Can't start TLS session.\n");
                        session_destroy(SESSION(session));
                        return NULL;
                }
@@ -1096,7 +1096,7 @@ static gint imap_remove_msg(Folder *folder, FolderItem *item, gint uid)
                (IMAP_SESSION(REMOTE_FOLDER(folder)->session),
                &numlist, IMAP_FLAG_DELETED, TRUE);
        if (ok != IMAP_SUCCESS) {
-               log_warning(_("can't set deleted flags: %d\n"), uid);
+               log_warning("can't set deleted flags: %d\n", uid);
                return ok;
        }
 
@@ -1110,7 +1110,7 @@ static gint imap_remove_msg(Folder *folder, FolderItem *item, gint uid)
                g_free(uidstr);
        }
        if (ok != IMAP_SUCCESS) {
-               log_warning(_("can't expunge\n"));
+               log_warning("can't expunge\n");
                return ok;
        }
 
@@ -1144,13 +1144,13 @@ static gint imap_remove_all_msg(Folder *folder, FolderItem *item)
        imap_gen_send(session, "STORE 1:* +FLAGS.SILENT (\\Deleted)");
        ok = imap_cmd_ok(session, NULL);
        if (ok != IMAP_SUCCESS) {
-               log_warning(_("can't set deleted flags: 1:*\n"));
+               log_warning("can't set deleted flags: 1:*\n");
                return ok;
        }
 
        ok = imap_cmd_expunge(session, NULL);
        if (ok != IMAP_SUCCESS) {
-               log_warning(_("can't expunge\n"));
+               log_warning("can't expunge\n");
                return ok;
        }
 
@@ -1186,7 +1186,7 @@ static gint imap_close(Folder *folder, FolderItem *item)
 
                ok = imap_cmd_close(session);
                if (ok != IMAP_SUCCESS)
-                       log_warning(_("can't close folder\n"));
+                       log_warning("can't close folder\n");
 
                g_free(session->mbox);
                session->mbox = NULL;
@@ -1238,7 +1238,7 @@ static gint imap_scan_tree(Folder *folder)
                ok = imap_cmd_list(session, NULL, real_path, argbuf);
                if (ok != IMAP_SUCCESS ||
                    search_array_str(argbuf, "LIST ") == NULL) {
-                       log_warning(_("root folder %s does not exist\n"), real_path);
+                       log_warning("root folder %s does not exist\n", real_path);
                        g_ptr_array_free(argbuf, TRUE);
                        g_free(real_path);
 
@@ -1417,7 +1417,7 @@ static GSList *imap_parse_list(IMAPFolder *folder, IMAPSession *session,
 
        for (;;) {
                if (sock_gets(SESSION(session)->sock, buf, sizeof(buf)) <= 0) {
-                       log_warning(_("error occurred while getting LIST.\n"));
+                       log_warning("error occurred while getting LIST.\n");
                        break;
                }
                strretchomp(buf);
@@ -1425,7 +1425,7 @@ static GSList *imap_parse_list(IMAPFolder *folder, IMAPSession *session,
                        log_print("IMAP4< %s\n", buf);
                        if (sscanf(buf, "%*d %16s", buf) < 1 ||
                            strcmp(buf, "OK") != 0)
-                               log_warning(_("error occurred while getting LIST.\n"));
+                               log_warning("error occurred while getting LIST.\n");
                                
                        break;
                }
@@ -1653,7 +1653,7 @@ static FolderItem *imap_create_folder(Folder *folder, FolderItem *parent,
                ok = imap_cmd_list(session, NULL, imap_path,
                                   argbuf);
                if (ok != IMAP_SUCCESS) {
-                       log_warning(_("can't create mailbox: LIST failed\n"));
+                       log_warning("can't create mailbox: LIST failed\n");
                        g_free(imap_path);
                        g_free(dirpath);
                        ptr_array_free_strings(argbuf);
@@ -1675,7 +1675,7 @@ static FolderItem *imap_create_folder(Folder *folder, FolderItem *parent,
                if (!exist) {
                        ok = imap_cmd_create(session, imap_path);
                        if (ok != IMAP_SUCCESS) {
-                               log_warning(_("can't create mailbox\n"));
+                               log_warning("can't create mailbox\n");
                                g_free(imap_path);
                                g_free(dirpath);
                                return NULL;
@@ -1717,6 +1717,12 @@ static gint imap_rename_folder(Folder *folder, FolderItem *item,
        g_return_val_if_fail(item->path != NULL, -1);
        g_return_val_if_fail(name != NULL, -1);
 
+       if (strchr(name, imap_get_path_separator(IMAP_FOLDER(folder), item->path)) != NULL) {
+               g_warning(_("New folder name must not contain the namespace "
+                           "path separator"));
+               return -1;
+       }
+
        session = imap_session_get(folder);
        if (!session) return -1;
 
@@ -1744,7 +1750,7 @@ static gint imap_rename_folder(Folder *folder, FolderItem *item,
 
        ok = imap_cmd_rename(session, real_oldpath, real_newpath);
        if (ok != IMAP_SUCCESS) {
-               log_warning(_("can't rename mailbox: %s to %s\n"),
+               log_warning("can't rename mailbox: %s to %s\n",
                            real_oldpath, real_newpath);
                g_free(real_oldpath);
                g_free(newpath);
@@ -1806,7 +1812,7 @@ static gint imap_remove_folder(Folder *folder, FolderItem *item)
 
        ok = imap_cmd_delete(session, path);
        if (ok != IMAP_SUCCESS) {
-               log_warning(_("can't delete mailbox\n"));
+               log_warning("can't delete mailbox\n");
                g_free(path);
                return -1;
        }
@@ -1844,7 +1850,7 @@ static GSList *imap_get_uncached_messages(IMAPSession *session,
 
                if (imap_cmd_envelope(session, imapset)
                    != IMAP_SUCCESS) {
-                       log_warning(_("can't get envelope\n"));
+                       log_warning("can't get envelope\n");
                        continue;
                }
 
@@ -1852,7 +1858,7 @@ static GSList *imap_get_uncached_messages(IMAPSession *session,
 
                for (;;) {
                        if ((tmp = sock_getline(SESSION(session)->sock)) == NULL) {
-                               log_warning(_("error occurred while getting envelope.\n"));
+                               log_warning("error occurred while getting envelope.\n");
                                g_string_free(str, TRUE);
                                break;
                        }
@@ -1874,7 +1880,7 @@ static GSList *imap_get_uncached_messages(IMAPSession *session,
                        msginfo = imap_parse_envelope
                                (SESSION(session)->sock, item, str);
                        if (!msginfo) {
-                               log_warning(_("can't parse envelope: %s\n"), str->str);
+                               log_warning("can't parse envelope: %s\n", str->str);
                                continue;
                        }
                        if (item->stype == F_QUEUE) {
@@ -1930,7 +1936,7 @@ static SockInfo *imap_open_tunnel(const gchar *server,
        SockInfo *sock;
 
        if ((sock = sock_connect_cmd(server, tunnelcmd)) == NULL) {
-               log_warning(_("Can't establish IMAP4 session with: %s\n"),
+               log_warning("Can't establish IMAP4 session with: %s\n",
                            server);
                return NULL;
        }
@@ -1952,14 +1958,14 @@ static SockInfo *imap_open(const gchar *server, gushort port)
        SockInfo *sock;
 
        if ((sock = sock_connect(server, port)) == NULL) {
-               log_warning(_("Can't connect to IMAP4 server: %s:%d\n"),
+               log_warning("Can't connect to IMAP4 server: %s:%d\n",
                            server, port);
                return NULL;
        }
 
 #if USE_OPENSSL
        if (ssl_type == SSL_TUNNEL && !ssl_init_socket(sock)) {
-               log_warning(_("Can't establish IMAP4 session with: %s:%d\n"),
+               log_warning("Can't establish IMAP4 session with: %s:%d\n",
                            server, port);
                sock_close(sock);
                return NULL;
@@ -2049,7 +2055,7 @@ static void imap_parse_namespace(IMAPSession *session, IMAPFolder *folder)
        
        if (imap_cmd_namespace(session, &ns_str)
            != IMAP_SUCCESS) {
-               log_warning(_("can't get namespace\n"));
+               log_warning("can't get namespace\n");
                return;
        }
 
@@ -2464,7 +2470,8 @@ static gint imap_select(IMAPSession *session, IMAPFolder *folder,
 {
        gchar *real_path;
        gint ok;
-       gint exists_, recent_, unseen_, uid_validity_;
+       gint exists_, recent_, unseen_;
+       guint32 uid_validity_;
 
        if (!exists || !recent || !unseen || !uid_validity) {
                if (session->mbox && strcmp(session->mbox, path) == 0)
@@ -2482,7 +2489,7 @@ static gint imap_select(IMAPSession *session, IMAPFolder *folder,
        ok = imap_cmd_select(session, real_path,
                             exists, recent, unseen, uid_validity);
        if (ok != IMAP_SUCCESS)
-               log_warning(_("can't select folder: %s\n"), real_path);
+               log_warning("can't select folder: %s\n", real_path);
        else {
                session->mbox = g_strdup(path);
                session->folder_content_changed = FALSE;
@@ -2622,7 +2629,7 @@ static gint imap_cmd_authenticate(IMAPSession *session, const gchar *user,
        sock_puts(SESSION(session)->sock, response64);
        ok = imap_cmd_ok(session, NULL);
        if (ok != IMAP_SUCCESS)
-               log_warning(_("IMAP4 authentication failed.\n"));
+               log_warning("IMAP4 authentication failed.\n");
 
        return ok;
 }
@@ -2639,7 +2646,7 @@ static gint imap_cmd_login(IMAPSession *session,
 
        ok = imap_cmd_ok(session, NULL);
        if (ok != IMAP_SUCCESS)
-               log_warning(_("IMAP4 login failed.\n"));
+               log_warning("IMAP4 login failed.\n");
 
        return ok;
 }
@@ -2716,6 +2723,7 @@ static gint imap_cmd_do_select(IMAPSession *session, const gchar *folder,
        GPtrArray *argbuf;
        gchar *select_cmd;
        gchar *folder_;
+       unsigned int uid_validity_;
 
        *exists = *recent = *unseen = *uid_validity = 0;
        argbuf = g_ptr_array_new();
@@ -2748,11 +2756,12 @@ static gint imap_cmd_do_select(IMAPSession *session, const gchar *folder,
 
        resp_str = search_array_contain_str(argbuf, "UIDVALIDITY");
        if (resp_str) {
-               if (sscanf(resp_str, "OK [UIDVALIDITY %u] ", uid_validity)
+               if (sscanf(resp_str, "OK [UIDVALIDITY %u] ", &uid_validity_)
                    != 1) {
                        g_warning("imap_cmd_select(): invalid UIDVALIDITY line.\n");
                        THROW;
                }
+               *uid_validity = uid_validity_;
        }
 
        resp_str = search_array_contain_str(argbuf, "UNSEEN");
@@ -2849,7 +2858,7 @@ static gint imap_cmd_search(IMAPSession *session, const gchar *criteria,
                for (p = strlist; *p != NULL; ++p) {
                        guint msgnum;
 
-                       if (sscanf(*p, "%d", &msgnum) == 1)
+                       if (sscanf(*p, "%u", &msgnum) == 1)
                                *list = g_slist_append(*list, GINT_TO_POINTER(msgnum));
                }
                g_strfreev(strlist);
@@ -2933,7 +2942,7 @@ static gint imap_cmd_append(IMAPSession *session, const gchar *destfolder,
        gint size;
        gchar *destfolder_;
        gchar *flag_str;
-       guint32 new_uid_;
+       unsigned int new_uid_;
        gchar *ret = NULL;
        gchar buf[BUFFSIZE];
        FILE *fp;
@@ -2955,14 +2964,14 @@ static gint imap_cmd_append(IMAPSession *session, const gchar *destfolder,
 
        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_);
+               log_warning("can't append %s to %s\n", file, destfolder_);
                g_free(ret);
                fclose(fp);
                return IMAP_ERROR;
        }
        g_free(ret);
 
-       log_print("IMAP4> %s\n", _("(sending file...)"));
+       log_print("IMAP4> %s\n", "(sending file...)");
 
        while (fgets(buf, sizeof(buf), fp) != NULL) {
                strretchomp(buf);
@@ -3004,7 +3013,7 @@ static gint imap_cmd_append(IMAPSession *session, const gchar *destfolder,
                ok = imap_cmd_ok(session, NULL);
 
        if (ok != IMAP_SUCCESS)
-               log_warning(_("can't append message to %s\n"),
+               log_warning("can't append message to %s\n",
                            destfolder_);
 
        return ok;
@@ -3013,13 +3022,13 @@ static gint imap_cmd_append(IMAPSession *session, const gchar *destfolder,
 static MsgNumberList *imapset_to_numlist(IMAPSet imapset)
 {
        gchar **ranges, **range;
-       guint32 low, high;
+       unsigned int low, high;
        MsgNumberList *uids = NULL;
        
        ranges = g_strsplit(imapset, ",", 0);
        for (range = ranges; *range != NULL; range++) {
                printf("%s\n", *range);
-               if(sscanf(*range, "%u:%u", &low, &high) == 1)
+               if (sscanf(*range, "%u:%u", &low, &high) == 1)
                        uids = g_slist_prepend(uids, GINT_TO_POINTER(low));
                else {
                        int i;
@@ -3086,7 +3095,7 @@ static gint imap_cmd_copy(IMAPSession *session, const gchar *seq_set,
                ok = imap_cmd_ok(session, NULL);
 
        if (ok != IMAP_SUCCESS)
-               log_warning(_("can't copy %s to %s\n"), seq_set, destfolder_);
+               log_warning("can't copy %s to %s\n", seq_set, destfolder_);
 
        return ok;
 }
@@ -3136,7 +3145,7 @@ static gint imap_cmd_store(IMAPSession *session, IMAPSet seq_set,
        imap_gen_send(session, "UID STORE %s %s", seq_set, sub_cmd);
 
        if ((ok = imap_cmd_ok(session, NULL)) != IMAP_SUCCESS) {
-               log_warning(_("error while imap command: STORE %s %s\n"),
+               log_warning("error while imap command: STORE %s %s\n",
                            seq_set, sub_cmd);
                return ok;
        }
@@ -3153,7 +3162,7 @@ static gint imap_cmd_expunge(IMAPSession *session, IMAPSet seq_set)
        else    
                imap_gen_send(session, "EXPUNGE");
        if ((ok = imap_cmd_ok(session, NULL)) != IMAP_SUCCESS) {
-               log_warning(_("error while imap command: EXPUNGE\n"));
+               log_warning("error while imap command: EXPUNGE\n");
                return ok;
        }
 
@@ -3166,7 +3175,7 @@ static gint imap_cmd_close(IMAPSession *session)
 
        imap_gen_send(session, "CLOSE");
        if ((ok = imap_cmd_ok(session, NULL)) != IMAP_SUCCESS)
-               log_warning(_("error while imap command: CLOSE\n"));
+               log_warning("error while imap command: CLOSE\n");
 
        return ok;
 }
@@ -3683,6 +3692,7 @@ static gint get_list_of_uids(Folder *folder, IMAPFolderItem *item, GSList **msgn
        GSList *uidlist, *elem;
        gchar *cmd_buf;
 
+       *msgnum_list = NULL;
        session = imap_session_get(folder);
        g_return_val_if_fail(session != NULL, -1);
 
@@ -4094,9 +4104,10 @@ static gint imap_get_flags(Folder *folder, FolderItem *item,
        GSList *sorted_list;
        /*
        GSList *new = NULL, *p_new;
+       GSList *deleted = NULL, *p_deleted;
        */
-       GSList *unseen = NULL, *answered = NULL, *flagged = NULL, *deleted = NULL;
-       GSList *p_unseen, *p_answered, *p_flagged, *p_deleted;
+       GSList *unseen = NULL, *answered = NULL, *flagged = NULL;
+       GSList *p_unseen, *p_answered, *p_flagged;
        GSList *elem;
        GSList *seq_list, *cur;
        gboolean reverse_seen = FALSE;
@@ -4160,24 +4171,27 @@ static gint imap_get_flags(Folder *folder, FolderItem *item,
        p_unseen = unseen;
        p_answered = answered;
        p_flagged = flagged;
+/*
        p_deleted = deleted;
-       
+*/     
        for (elem = sorted_list; elem != NULL; elem = g_slist_next(elem)) {
                MsgInfo *msginfo;
                MsgPermFlags flags;
+               gboolean wasnew;
                
                msginfo = (MsgInfo *) elem->data;
                flags = msginfo->flags.perm_flags;
-               flags &= ~((reverse_seen ? 0 : MSG_UNREAD) | MSG_REPLIED | MSG_MARKED);
+               wasnew = (flags & MSG_NEW);
+               flags &= ~((reverse_seen ? 0 : MSG_UNREAD | MSG_NEW) | MSG_REPLIED | MSG_MARKED);
                if (reverse_seen)
-                       flags |= MSG_UNREAD;
+                       flags |= MSG_UNREAD | (wasnew ? MSG_NEW : 0);
                /*
                if (gslist_find_next_num(&p_new, msginfo->msgnum) == msginfo->msgnum)
                        flags |= MSG_NEW;
                */
                if (gslist_find_next_num(&p_unseen, msginfo->msgnum) == msginfo->msgnum) {
                        if (!reverse_seen) {
-                               flags |= MSG_UNREAD;
+                               flags |= MSG_UNREAD | (wasnew ? MSG_NEW : 0);
                        } else {
                                flags &= ~(MSG_UNREAD | MSG_NEW);
                        }
@@ -4194,7 +4208,7 @@ static gint imap_get_flags(Folder *folder, FolderItem *item,
        }
 
        imap_seq_set_free(seq_list);
-       g_slist_free(deleted);
+       /* g_slist_free(deleted); */
        g_slist_free(flagged);
        g_slist_free(answered);
        g_slist_free(unseen);