2008-09-22 [colin] 3.5.0cvs122
[claws.git] / src / news.c
index 6bd9928ed07cd10bbaa9401fdda8fd860d45eeda..f0a9f1afc03f79cb28084e4509ffbea3c504c937 100644 (file)
@@ -37,7 +37,6 @@
 
 #include "nntp-thread.h"
 #include "news.h"
-#include "news.h"
 #include "news_gtk.h"
 #include "socket.h"
 #include "recv.h"
@@ -147,6 +146,9 @@ static void news_synchronise                 (FolderItem    *item, gint days);
 static int news_remove_msg              (Folder        *folder, 
                                          FolderItem    *item, 
                                          gint           msgnum);
+static gint news_rename_folder          (Folder *folder,
+                                         FolderItem *item,
+                                         const gchar *name);
 static gint news_remove_folder          (Folder        *folder,
                                          FolderItem    *item);
 static FolderClass news_class;
@@ -166,6 +168,7 @@ FolderClass *news_get_class(void)
                news_class.item_get_path = news_item_get_path;
                news_class.get_num_list = news_get_num_list;
                news_class.scan_required = news_scan_required;
+               news_class.rename_folder = news_rename_folder;
                news_class.remove_folder = news_remove_folder;
 
                /* Message functions */
@@ -211,7 +214,7 @@ static int news_remove_msg           (Folder        *folder,
        
        filename = g_strconcat(path, G_DIR_SEPARATOR_S, itos(msgnum), NULL);
        g_free(path);
-       g_unlink(filename);
+       claws_unlink(filename);
        g_free(filename);
        return 0;
 }
@@ -294,7 +297,7 @@ static Session *news_session_new(Folder *folder, const gchar *server, gushort po
        log_message(LOG_PROTOCOL, _("creating NNTP connection to %s:%d ...\n"), server, port);
 
        session = g_new0(NewsSession, 1);
-       session_init(SESSION(session));
+       session_init(SESSION(session), folder->account, FALSE);
        SESSION(session)->type             = SESSION_NEWS;
        SESSION(session)->server           = g_strdup(server);
        SESSION(session)->sock             = NULL;
@@ -335,8 +338,9 @@ static Session *news_session_new_for_folder(Folder *folder)
                if (ac->passwd && ac->passwd[0])
                        passwd = g_strdup(ac->passwd);
                else
-                       passwd = input_dialog_query_password(ac->nntp_server,
-                                                            userid);
+                       passwd = input_dialog_query_password_keep(ac->nntp_server,
+                                                                 userid,
+                                                                 &(ac->session_passwd));
        }
 
 #if (defined(USE_OPENSSL) || defined (USE_GNUTLS))
@@ -368,6 +372,10 @@ static Session *news_session_new_for_folder(Folder *folder)
                        log_error(LOG_PROTOCOL, _("Error authenticating to %s:%d ...\n"), ac->nntp_server, port);
                        session_destroy(SESSION(session));
                        g_free(passwd);
+                       if (ac->session_passwd) {
+                               g_free(ac->session_passwd);
+                               ac->session_passwd = NULL;
+                       }
                        return NULL;
                }
        }
@@ -380,6 +388,8 @@ static NewsSession *news_session_get(Folder *folder)
 {
        RemoteFolder *rfolder = REMOTE_FOLDER(folder);
        struct tm lt;
+       int r;
+       
        g_return_val_if_fail(folder != NULL, NULL);
        g_return_val_if_fail(FOLDER_CLASS(folder) == &news_class, NULL);
        g_return_val_if_fail(folder->account != NULL, NULL);
@@ -401,15 +411,17 @@ static NewsSession *news_session_get(Folder *folder)
                return NEWS_SESSION(rfolder->session);
        }
 
-       if (nntp_threaded_date(folder, &lt)
-           == NEWSNNTP_ERROR_STREAM) {
-               log_warning(LOG_PROTOCOL, _("NNTP connection to %s:%d has been"
+       if ((r = nntp_threaded_date(folder, &lt)) != NEWSNNTP_NO_ERROR) {
+               if (r != NEWSNNTP_ERROR_COMMAND_NOT_SUPPORTED &&
+                   r != NEWSNNTP_ERROR_COMMAND_NOT_UNDERSTOOD) {
+                       log_warning(LOG_PROTOCOL, _("NNTP connection to %s:%d has been"
                              " disconnected. Reconnecting...\n"),
                            folder->account->nntp_server,
                            folder->account->set_nntpport ?
                            folder->account->nntpport : NNTP_PORT);
-               session_destroy(rfolder->session);
-               rfolder->session = news_session_new_for_folder(folder);
+                       session_destroy(rfolder->session);
+                       rfolder->session = news_session_new_for_folder(folder);
+               }
        }
        
        if (rfolder->session)
@@ -433,7 +445,7 @@ static void news_remove_cached_msg(Folder *folder, FolderItem *item, MsgInfo *ms
        g_free(path);
 
        if (is_file_exist(filename)) {
-               g_unlink(filename);
+               claws_unlink(filename);
        }
        g_free(filename);
 }
@@ -538,7 +550,7 @@ GSList *news_get_group_list(Folder *folder)
                gint ok;
                clist *grouplist = NULL;
                clistiter *cur;
-               fp = fopen(filename, "wb");
+               fp = g_fopen(filename, "wb");
                
                if (!fp) {
                        g_free(filename);
@@ -664,7 +676,7 @@ void news_remove_group_list_cache(Folder *folder)
 gint news_post(Folder *folder, const gchar *file)
 {
        gint ok;
-       char *contents = file_read_to_str(file);
+       char *contents = file_read_to_str_no_recode(file);
        NewsSession *session;
 
        g_return_val_if_fail(folder != NULL, -1);
@@ -678,14 +690,20 @@ gint news_post(Folder *folder, const gchar *file)
        }
        
        ok = nntp_threaded_post(folder, contents, strlen(contents));
-       
+
+       if (ok != NEWSNNTP_NO_ERROR && ok != NEWSNNTP_ERROR_STREAM) {
+               ok = nntp_threaded_mode_reader(folder);
+               if (ok == NEWSNNTP_NO_ERROR)
+                       ok = nntp_threaded_post(folder, contents, strlen(contents));
+       }
        g_free(contents);
+
        if (ok == NEWSNNTP_ERROR_STREAM) {
                session_destroy(SESSION(session));
                REMOTE_FOLDER(folder)->session = NULL;
        }
 
-       return ok;
+       return (ok == NEWSNNTP_NO_ERROR ? 0 : -1);
 }
 
 static gint news_get_article(Folder *folder, gint num, gchar *filename)
@@ -699,9 +717,9 @@ static gint news_get_article(Folder *folder, gint num, gchar *filename)
        if (r == NEWSNNTP_NO_ERROR) {
                if (str_write_to_file(result, filename) < 0)
                        return -1;
+               g_free(result);
        }
        
-       g_free(result);
        return r;
 }
 
@@ -838,7 +856,7 @@ gint news_cancel_article(Folder * folder, MsgInfo * msginfo)
        FILE * tmpfp;
        gchar buf[BUFFSIZE];
 
-       tmp = g_strdup_printf("%s%ctmp%p", g_get_tmp_dir(),
+       tmp = g_strdup_printf("%s%ccancel%p", get_tmp_dir(),
                              G_DIR_SEPARATOR, msginfo);
        if (tmp == NULL)
                return -1;
@@ -871,14 +889,14 @@ gint news_cancel_article(Folder * folder, MsgInfo * msginfo)
                       buf) < 0) {
                FILE_OP_ERROR(tmp, "fprintf");
                fclose(tmpfp);
-               g_unlink(tmp);
+               claws_unlink(tmp);
                g_free(tmp);
                return -1;
        }
 
        if (fclose(tmpfp) == EOF) {
                FILE_OP_ERROR(tmp, "fclose");
-               g_unlink(tmp);
+               claws_unlink(tmp);
                g_free(tmp);
                return -1;
        }
@@ -913,7 +931,7 @@ static gchar *news_item_get_path(Folder *folder, FolderItem *item)
        folder_path = news_folder_get_path(folder);
 
         g_return_val_if_fail(folder_path != NULL, NULL);
-        if (folder_path[0] == G_DIR_SEPARATOR) {
+        if (g_path_is_absolute(folder_path)) {
                 if (item->path)
                         path = g_strconcat(folder_path, G_DIR_SEPARATOR_S,
                                            item->path, NULL);
@@ -929,7 +947,10 @@ static gchar *news_item_get_path(Folder *folder, FolderItem *item)
                                            folder_path, NULL);
         }
         g_free(folder_path);
-
+#ifdef G_OS_WIN32
+       while (strchr(path, '/'))
+               *strchr(path, '/') = '\\';
+#endif
        return path;
 }
 
@@ -1202,6 +1223,26 @@ void news_synchronise(FolderItem *item, gint days)
        news_gtk_synchronise(item, days);
 }
 
+static gint news_rename_folder(Folder *folder, FolderItem *item,
+                               const gchar *name)
+{
+       gchar *path;
+        
+       g_return_val_if_fail(folder != NULL, -1);
+       g_return_val_if_fail(item != NULL, -1);
+       g_return_val_if_fail(item->path != NULL, -1);
+       g_return_val_if_fail(name != NULL, -1);
+
+       path = folder_item_get_path(item);
+       if (!is_dir_exist(path))
+               make_dir_hier(path);
+
+       g_free(item->name);
+       item->name = g_strdup(name);
+
+       return 0;
+}
+
 static gint news_remove_folder(Folder *folder, FolderItem *item)
 {
        gchar *path;