sync with 0.8.2cvs8
[claws.git] / src / news.c
index b589c06ce47023d39b40c6afc811cc183cbb58c8..e50ef1798b3b1b3568c55071e0fdbb7e4e3d4896 100644 (file)
@@ -80,9 +80,6 @@ static gint news_get_article_cmd       (NNTPSession   *session,
 static gint news_get_article            (NNTPSession   *session,
                                          gint           num,
                                          gchar         *filename);
-static gint news_get_header             (NNTPSession   *session,
-                                         gint           num,
-                                         gchar         *filename);
 
 static gint news_select_group           (NNTPSession   *session,
                                          const gchar   *group,
@@ -101,6 +98,8 @@ static GSList *news_delete_old_articles       (GSList        *alist,
                                          FolderItem    *item,
                                          gint           first);
 static void news_delete_all_articles    (FolderItem    *item);
+static void news_delete_expired_caches  (GSList        *alist,
+                                         FolderItem    *item);
 
 static gint news_remove_msg             (Folder        *folder, 
                                          FolderItem    *item, 
@@ -124,18 +123,25 @@ Folder *news_folder_new(const gchar *name, const gchar *path)
        return folder;
 }
 
-void news_folder_destroy(NewsFolder *folder)
+void news_folder_destroy(Folder *folder)
 {
+       gchar *dir;
+
+       dir = folder_get_path(folder);
+       if (is_dir_exist(dir))
+               remove_dir_recursive(dir);
+       g_free(dir);
+
        folder_remote_folder_destroy(REMOTE_FOLDER(folder));
 }
 
 static void news_folder_init(Folder *folder, const gchar *name,
                             const gchar *path)
 {
-       folder_remote_folder_init(folder, name, path);
-
        folder->type = F_NEWS;
 
+       folder_remote_folder_init(folder, name, path);
+
 /*
        folder->get_msg_list = news_get_article_list;
 */
@@ -143,6 +149,7 @@ static void news_folder_init(Folder *folder, const gchar *name,
 /*
        folder->scan         = news_scan_group;
 */
+       folder->destroy      = news_folder_destroy;
        folder->remove_msg   = news_remove_msg;
        folder->get_num_list = news_get_num_list;
        folder->fetch_msginfo = news_fetch_msginfo;
@@ -191,18 +198,21 @@ static Session *news_session_new(const gchar *server, gushort port,
        SESSION(session)->phase            = SESSION_READY;
        SESSION(session)->last_access_time = time(NULL);
        SESSION(session)->data             = NULL;
+
+       SESSION(session)->destroy          = news_session_destroy;
+
        session->group = NULL;
 
        return SESSION(session);
 }
 
-void news_session_destroy(NNTPSession *session)
+void news_session_destroy(Session *session)
 {
-       nntp_close(session->nntp_sock);
-       session->nntp_sock = NULL;
-       SESSION(session)->sock = NULL;
+       nntp_close(NNTP_SESSION(session)->nntp_sock);
+       NNTP_SESSION(session)->nntp_sock = NULL;
+       session->sock = NULL;
 
-       g_free(session->group);
+       g_free(NNTP_SESSION(session)->group);
 }
 
 static Session *news_session_new_for_folder(Folder *folder)
@@ -292,7 +302,7 @@ GSList *news_get_article_list(Folder *folder, FolderItem *item,
 
        if (!session) {
                alist = procmsg_read_cache(item, FALSE);
-               item->last_num = procmsg_get_last_num_in_cache(alist);
+               item->last_num = procmsg_get_last_num_in_msg_list(alist);
        } else if (use_cache) {
                GSList *newlist;
                gint cache_last;
@@ -300,12 +310,20 @@ GSList *news_get_article_list(Folder *folder, FolderItem *item,
 
                alist = procmsg_read_cache(item, FALSE);
 
-               cache_last = procmsg_get_last_num_in_cache(alist);
+               cache_last = procmsg_get_last_num_in_msg_list(alist);
                newlist = news_get_uncached_articles
                        (session, item, cache_last, &first, &last);
-               alist = news_delete_old_articles(alist, item, first);
+               if (first == 0 && last == 0) {
+                       news_delete_all_articles(item);
+                       procmsg_msg_list_free(alist);
+                       alist = NULL;
+               } else {
+                       alist = news_delete_old_articles(alist, item, first);
+                       news_delete_expired_caches(alist, item);
+               }
 
                alist = g_slist_concat(alist, newlist);
+
                item->last_num = last;
        } else {
                gint last;
@@ -339,7 +357,7 @@ gchar *news_fetch_msg(Folder *folder, FolderItem *item, gint num)
        g_free(path);
 
        if (is_file_exist(filename)) {
-               debug_print(_("article %d has been already cached.\n"), num);
+               debug_print("article %d has been already cached.\n", num);
                return filename;
        }
 
@@ -357,7 +375,7 @@ gchar *news_fetch_msg(Folder *folder, FolderItem *item, gint num)
                return NULL;
        }
 
-       debug_print(_("getting article %d...\n"), num);
+       debug_print("getting article %d...\n", num);
        ok = news_get_article(NNTP_SESSION(REMOTE_FOLDER(folder)->session),
                              num, filename);
        statusbar_pop_all();
@@ -374,9 +392,6 @@ gint news_scan_group(Folder *folder, FolderItem *item)
 {
        NNTPSession *session;
        gint num = 0, first = 0, last = 0;
-       gint new = 0, unread = 0, total = 0;
-       gint min = 0, max = 0;
-       gchar *path;
        gint ok;
 
        g_return_val_if_fail(folder != NULL, -1);
@@ -409,10 +424,6 @@ gint news_scan_group(Folder *folder, FolderItem *item)
        else {
                if (min < first)
                        min = first;
-               else if (first < min) {
-                       num -= min - first;
-                       first = min;
-               }
 
                if (last < max)
                        max = last;
@@ -625,22 +636,13 @@ static gint news_get_article_cmd(NNTPSession *session, const gchar *cmd,
 
 static gint news_remove_msg(Folder *folder, FolderItem *item, gint num)
 {
-       MsgInfo * msginfo;
-       gchar * filename;
-       MsgFlags msgflags = { 0, 0 };
+       gchar * dir;
        gint r;
 
-       filename = folder_item_fetch_msg(item, num);
-       if (filename == NULL)
-               return -1;
-
-       msginfo = procheader_parse_file(filename, msgflags, FALSE, FALSE);
-       if (msginfo == NULL)
-               return -1;
-
-       r = news_cancel_article(folder, msginfo);
-
-       procmsg_msginfo_free(msginfo);
+       dir = folder_item_get_path(item);
+       printf("removing %d in %s\n",num,dir);
+       r = remove_numbered_files(dir, num, num);
+       g_free(dir);
 
        return r;
 }
@@ -650,11 +652,6 @@ static gint news_get_article(NNTPSession *session, gint num, gchar *filename)
        return news_get_article_cmd(session, "ARTICLE", num, filename);
 }
 
-static gint news_get_header(NNTPSession *session, gint num, gchar *filename)
-{
-       return news_get_article_cmd(session, "HEAD", num, filename);
-}
-
 /**
  * news_select_group:
  * @session: Active NNTP session.
@@ -703,8 +700,8 @@ static GSList *news_get_uncached_articles(NNTPSession *session,
        GSList *llast = NULL;
        MsgInfo *msginfo;
 
-       if (rfirst) *rfirst = 0;
-       if (rlast)  *rlast  = 0;
+       if (rfirst) *rfirst = -1;
+       if (rlast)  *rlast  = -1;
 
        g_return_val_if_fail(session != NULL, NULL);
        g_return_val_if_fail(item != NULL, NULL);
@@ -723,20 +720,21 @@ static GSList *news_get_uncached_articles(NNTPSession *session,
                            first, last);
                return NULL;
        }
+
+       if (rfirst) *rfirst = first;
+       if (rlast)  *rlast  = last;
+
        if (cache_last < first)
                begin = first;
        else if (last < cache_last)
                begin = first;
        else if (last == cache_last) {
-               debug_print(_("no new articles.\n"));
+               debug_print("no new articles.\n");
                return NULL;
        } else
                begin = cache_last + 1;
        end = last;
 
-       if (rfirst) *rfirst = first;
-       if (rlast)  *rlast  = last;
-
        if (prefs_common.max_articles > 0 &&
            end - begin + 1 > prefs_common.max_articles)
                begin = end - prefs_common.max_articles + 1;
@@ -941,7 +939,7 @@ static GSList *news_delete_old_articles(GSList *alist, FolderItem *item,
 
        if (first < 2) return alist;
 
-       debug_print(_("Deleting cached articles 1 - %d ... "), first - 1);
+       debug_print("Deleting cached articles 1 - %d ...\n", first - 1);
 
        dir = folder_item_get_path(item);
        remove_numbered_files(dir, 1, first - 1);
@@ -970,13 +968,26 @@ static void news_delete_all_articles(FolderItem *item)
        g_return_if_fail(item->folder != NULL);
        g_return_if_fail(item->folder->type == F_NEWS);
 
-       debug_print(_("\tDeleting all cached articles... "));
+       debug_print("Deleting all cached articles...\n");
 
        dir = folder_item_get_path(item);
        remove_all_numbered_files(dir);
        g_free(dir);
+}
+
+static void news_delete_expired_caches(GSList *alist, FolderItem *item)
+{
+       gchar *dir;
 
-       debug_print(_("done.\n"));
+       g_return_if_fail(item != NULL);
+       g_return_if_fail(item->folder != NULL);
+       g_return_if_fail(item->folder->type == F_NEWS);
+
+       debug_print("Deleting expired cached articles...\n");
+
+       dir = folder_item_get_path(item);
+       remove_expired_files(dir, 24 * 7);
+       g_free(dir);
 }
 
 gint news_cancel_article(Folder * folder, MsgInfo * msginfo)
@@ -1054,7 +1065,7 @@ GSList *news_get_num_list(Folder *folder, FolderItem *item)
 #define READ_TO_LISTEND(hdr) \
        while (!(buf[0] == '.' && buf[1] == '\r')) { \
                if (sock_gets(SESSION(session)->sock, buf, sizeof(buf)) < 0) { \
-                       log_warning(_("error occurred while getting " hdr ".\n")); \
+                       log_warning(_("error occurred while getting %s.\n"), hdr); \
                        return msginfo; \
                } \
        }