2004-08-23 [colin] 0.9.12cvs77
[claws.git] / src / imap.c
index cec5ec158318323999310af5e778145d91b1cea1..73b2b18b8dad2a0ae0116a68ca53e76277344271 100644 (file)
@@ -92,7 +92,6 @@ struct _IMAPSession
        guint cmd_count;
 
        /* CLAWS */
-       time_t last_access_time;
        gboolean folder_content_changed;
        guint exists;
 };
@@ -659,19 +658,19 @@ static IMAPSession *imap_session_get(Folder *folder)
         * A better solution than sending a NOOP every time would be
         * for every command to be prepared to retry until it is
         * successfully sent. -- mbp */
-       if (time(NULL) - session->last_access_time > SESSION_TIMEOUT) {
+       if (time(NULL) - SESSION(session)->last_access_time > SESSION_TIMEOUT_INTERVAL) {
                /* verify that the session is still alive */
                if (imap_cmd_noop(session) != IMAP_SUCCESS) {
                        /* 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 to %s failed"),
                                            folder->account->recv_server);
                                session_destroy(SESSION(session));
                                session = NULL;
                        } else {
                                log_warning(_("IMAP4 connection to %s has been"
-                                             " disconnected. Reconnecting...\n"),
+                                           " disconnected. Reconnecting...\n"),
                                            folder->account->recv_server);
                                session_destroy(SESSION(session));
                                /* Clear folders session to make imap_session_get create
@@ -685,9 +684,7 @@ static IMAPSession *imap_session_get(Folder *folder)
        }
 
        rfolder->session = SESSION(session);
-       if (session) {
-               session->last_access_time = time(NULL);
-       }
+       
        return IMAP_SESSION(session);
 }
 
@@ -1717,6 +1714,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;
 
@@ -1896,6 +1899,8 @@ static GSList *imap_get_uncached_messages(IMAPSession *session,
                g_string_free(str, TRUE);
        }
        imap_seq_set_free(seq_list);
+       
+       session_set_access_time(SESSION(session));
 
        return newlist;
 }
@@ -2464,7 +2469,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)
@@ -2716,6 +2722,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 +2755,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 +2857,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 +2941,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;
@@ -2962,7 +2970,7 @@ static gint imap_cmd_append(IMAPSession *session, const gchar *destfolder,
        }
        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);
@@ -3013,13 +3021,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;
@@ -3252,6 +3260,8 @@ static gint imap_gen_recv(IMAPSession *session, gchar **ret)
        strretchomp(*ret);
 
        log_print("IMAP4< %s\n", *ret);
+       
+       session_set_access_time(SESSION(session));
 
        return IMAP_SUCCESS;
 }
@@ -3756,7 +3766,7 @@ gint imap_get_num_list(Folder *folder, FolderItem *_item, GSList **msgnum_list,
        IMAPFolderItem *item = (IMAPFolderItem *)_item;
        IMAPSession *session;
        gint ok, nummsgs = 0, exists, recent, uid_val, uid_next, unseen;
-       GSList *uidlist;
+       GSList *uidlist = NULL;
        gchar *dir;
        gboolean selected_folder;
 
@@ -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;
@@ -4107,7 +4118,8 @@ static gint imap_get_flags(Folder *folder, FolderItem *item,
 
        g_return_val_if_fail(folder != NULL, -1);
        g_return_val_if_fail(item != NULL, -1);
-       g_return_val_if_fail(msginfo_list != NULL, -1);
+       if (msginfo_list == NULL)
+               return 0;
 
        session = imap_session_get(folder);
        g_return_val_if_fail(session != NULL, -1);
@@ -4160,24 +4172,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 +4209,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);