2011-11-21 [pawel] 3.7.10cvs97
[claws.git] / src / account.c
index d38970a588e044e969025bb08f01219d14570f88..474bea162c6a3641223a2385105d2ab79e41348e 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2007 Hiroyuki Yamamoto and the Claws Mail team
+ * Copyright (C) 1999-2011 Hiroyuki Yamamoto and the Claws Mail team
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -74,8 +74,6 @@ typedef enum
 
 # define N_EDIT_ACCOUNT_COLS   5
 
-#define PREFSBUFSIZE           1024
-
 PrefsAccount *cur_account;
 
 static GList *account_list = NULL;
@@ -113,10 +111,15 @@ static gboolean account_key_pressed       (GtkWidget      *widget,
                                         GdkEventKey    *event,
                                         gpointer        data);
 #endif
+static gboolean account_search_func_cb (GtkTreeModel *model, gint column, 
+                                               const gchar *key, GtkTreeIter *iter, 
+                                               gpointer search_data);
 static void account_list_view_add      (PrefsAccount   *ac_prefs);
 static void account_list_view_set      (void);
 
 static void account_list_set           (void);
+static void account_rename_path_prefix (const gchar    *old_prefix,
+                                        const gchar    *new_prefix);
 
 typedef struct FindAccountInStore {
        gint             account_id;
@@ -281,8 +284,8 @@ PrefsAccount *account_find_from_smtp_server(const gchar *address,
        GList *cur;
        PrefsAccount *ac;
 
-       g_return_val_if_fail(address != NULL, NULL);
-       g_return_val_if_fail(smtp_server != NULL, NULL);
+       cm_return_val_if_fail(address != NULL, NULL);
+       cm_return_val_if_fail(smtp_server != NULL, NULL);
 
        for (cur = account_list; cur != NULL; cur = cur->next) {
                ac = (PrefsAccount *)cur->data;
@@ -298,20 +301,20 @@ PrefsAccount *account_find_from_smtp_server(const gchar *address,
  * account_find_from_address:
  * @address: Email address string.
  *
- * Find a mail (not news) account with the specified email address.
+ * Find a mail (not news if newsgroups_ok is FALSE) account with the specified email address.
  *
  * Return value: The found account, or NULL if not found.
  */
-PrefsAccount *account_find_from_address(const gchar *address)
+PrefsAccount *account_find_from_address(const gchar *address, gboolean newsgroups_ok)
 {
        GList *cur;
        PrefsAccount *ac;
 
-       g_return_val_if_fail(address != NULL, NULL);
+       cm_return_val_if_fail(address != NULL, NULL);
 
        for (cur = account_list; cur != NULL; cur = cur->next) {
                ac = (PrefsAccount *)cur->data;
-               if (ac->protocol != A_NNTP && ac->address &&
+               if ((ac->protocol != A_NNTP || newsgroups_ok) && ac->address &&
                    g_ascii_strcasecmp(address, ac->address) == 0)
                        return ac;
        }
@@ -337,7 +340,7 @@ PrefsAccount *account_find_from_item(FolderItem *item)
 {
        PrefsAccount *ac;
 
-       g_return_val_if_fail(item != NULL, NULL);
+       cm_return_val_if_fail(item != NULL, NULL);
 
        ac = item->account;
        if (!ac) {
@@ -371,7 +374,7 @@ GList *account_get_list(void)
        return account_list;
 }
 
-void account_edit_open(void)
+void account_edit_open(gpointer a, gpointer b)
 {
        inc_lock();
 
@@ -395,7 +398,7 @@ void account_edit_open(void)
        manage_window_set_transient(GTK_WINDOW(edit_account.window));
        gtk_widget_grab_focus(edit_account.close_btn);
        gtk_widget_show(edit_account.window);
-
+       gtk_window_set_modal(GTK_WINDOW(edit_account.window), TRUE);
        manage_window_focus_in(edit_account.window, NULL, NULL);
 }
 
@@ -441,10 +444,10 @@ void account_add(void)
 void account_open(PrefsAccount *ac_prefs)
 {
        gboolean prev_default;
-       gchar *ac_name;
+       gchar *ac_name, *old_prefix, *new_prefix;
        gboolean account_dirty = FALSE;
 
-       g_return_if_fail(ac_prefs != NULL);
+       cm_return_if_fail(ac_prefs != NULL);
 
        prev_default = ac_prefs->is_default;
        Xstrdup_a(ac_name, ac_prefs->account_name ? ac_prefs->account_name : "",
@@ -457,9 +460,18 @@ void account_open(PrefsAccount *ac_prefs)
                        account_set_as_default(ac_prefs);
 
                if (ac_prefs->folder && strcmp2(ac_name, ac_prefs->account_name) != 0) {
+                       old_prefix = folder_get_identifier(FOLDER(ac_prefs->folder));
                        folder_set_name(FOLDER(ac_prefs->folder),
                                        ac_prefs->account_name);
                        folderview_set_all();
+                       folder_prefs_save_config_recursive(FOLDER(ac_prefs->folder));
+                       new_prefix = folder_get_identifier(FOLDER(ac_prefs->folder));
+
+                       account_rename_path_prefix(old_prefix, new_prefix);
+                       prefs_filtering_rename_path_prefix(old_prefix, new_prefix);
+                       
+                       g_free(old_prefix);
+                       g_free(new_prefix);
                }
 
                account_write_config_all();
@@ -558,12 +570,38 @@ void account_rename_path(const gchar *old_id, const gchar *new_id)
 
 #undef CHECK_CHANGE_FOLDER
 
+#define CHANGE_FOLDER_PREFIX(folder) {                                         \
+       if (folder && g_str_has_prefix(folder, old_prefix)) {                   \
+               gchar *new_path = g_strconcat(new_prefix,                       \
+                                  (folder + strlen(old_prefix)), NULL);        \
+               g_free(folder);                                                 \
+               folder = new_path;                                              \
+       }                                                                       \
+}
+
+static void account_rename_path_prefix(const gchar *old_prefix,
+                               const gchar *new_prefix)
+{
+       GList *cur = account_list;
+       for (; cur != NULL; cur = g_list_next(cur)) {
+               PrefsAccount *ap = (PrefsAccount *)cur->data;
+               CHANGE_FOLDER_PREFIX(ap->inbox);
+               CHANGE_FOLDER_PREFIX(ap->local_inbox);
+               CHANGE_FOLDER_PREFIX(ap->queue_folder);
+               CHANGE_FOLDER_PREFIX(ap->sent_folder);
+               CHANGE_FOLDER_PREFIX(ap->draft_folder);
+               CHANGE_FOLDER_PREFIX(ap->trash_folder);
+       }
+}
+
+#undef CHANGE_FOLDER_PREFIX
+
 FolderItem *account_get_special_folder(PrefsAccount *ac_prefs,
                                       SpecialFolderItemType type)
 {
        FolderItem *item = NULL;
 
-       g_return_val_if_fail(ac_prefs != NULL, NULL);
+       cm_return_val_if_fail(ac_prefs != NULL, NULL);
 
        switch (type) {
        case F_INBOX:
@@ -637,7 +675,7 @@ FolderItem *account_get_special_folder(PrefsAccount *ac_prefs,
 
 void account_destroy(PrefsAccount *ac_prefs)
 {
-       g_return_if_fail(ac_prefs != NULL);
+       cm_return_if_fail(ac_prefs != NULL);
 
        folder_unref_account_all(ac_prefs);
 
@@ -661,7 +699,7 @@ void account_destroy(PrefsAccount *ac_prefs)
 static void account_size_allocate_cb(GtkWidget *widget,
                                         GtkAllocation *allocation)
 {
-       g_return_if_fail(allocation != NULL);
+       cm_return_if_fail(allocation != NULL);
 
        prefs_common.accountswin_width = allocation->width;
        prefs_common.accountswin_height = allocation->height;
@@ -697,7 +735,6 @@ static void account_edit_create(void)
        window = gtkut_window_new(GTK_WINDOW_TOPLEVEL, "account");
        gtk_container_set_border_width (GTK_CONTAINER (window), 8);
        gtk_window_set_title (GTK_WINDOW (window), _("Edit accounts"));
-       gtk_window_set_modal (GTK_WINDOW (window), TRUE);
        g_signal_connect (G_OBJECT (window), "delete_event",
                          G_CALLBACK (account_delete_event), NULL);
 #ifdef MAEMO
@@ -823,6 +860,9 @@ static void account_edit_create(void)
                                      GDK_HINT_MIN_SIZE);
        gtk_widget_set_size_request(window, prefs_common.accountswin_width,
                                    prefs_common.accountswin_height);
+#ifdef G_OS_WIN32
+       gtk_window_move(GTK_WINDOW(window), 48, 48);
+#endif
 
        edit_account.window    = window;
        edit_account.list_view = list_view;
@@ -849,7 +889,7 @@ static gboolean account_delete_references_func(GNode *node, gpointer data)
        FolderItem *item;
        gint account;
 
-       g_return_val_if_fail(node->data != NULL, FALSE);
+       cm_return_val_if_fail(node->data != NULL, FALSE);
 
        item = FOLDER_ITEM(node->data);
        account = GPOINTER_TO_INT(data);
@@ -915,12 +955,11 @@ static void account_clone(GtkWidget *widget, gpointer data)
        ACP_FASSIGN(ssl_smtp);
        ACP_FASSIGN(use_nonblocking_ssl);
        
-       ac_clon->tmp_pass = NULL;
-
        /* receive */
        ACP_FASSIGN(use_apop_auth);
        ACP_FASSIGN(rmmail);
        ACP_FASSIGN(msg_leave_time);
+       ACP_FASSIGN(msg_leave_hour);
        ACP_FASSIGN(recv_at_getall);
        ACP_FASSIGN(sd_rmmail_on_download);
        ACP_FASSIGN(enable_size_limit);
@@ -935,14 +974,13 @@ static void account_clone(GtkWidget *widget, gpointer data)
 
        /* send */
        ACP_FASSIGN(gen_msgid);
+       ACP_FASSIGN(gen_xmailer);
        ACP_FASSIGN(add_customhdr);
        ACP_FASSIGN(use_smtp_auth);
        ACP_FASSIGN(smtp_auth_type);
        ACP_FDUP(smtp_userid);
        ACP_FDUP(smtp_passwd);
 
-       ac_clon->tmp_smtp_pass = NULL;
-
        ACP_FASSIGN(pop_before_smtp);
        ACP_FASSIGN(pop_before_smtp_timeout);
        ACP_FASSIGN(last_pop_login_time);
@@ -992,6 +1030,7 @@ static void account_clone(GtkWidget *widget, gpointer data)
         ACP_FASSIGN(default_encrypt);
        ACP_FASSIGN(default_encrypt_reply);
         ACP_FASSIGN(default_sign);
+       ACP_FASSIGN(default_sign_reply);
        ACP_FASSIGN(save_encrypted_as_clear_text);
        ACP_FASSIGN(encrypt_to_self);
        
@@ -1213,7 +1252,7 @@ static void account_edit_close(GtkWidget *widget, gpointer data)
                account_flush_state();
 
        gtk_widget_hide(edit_account.window);
-
+       gtk_window_set_modal(GTK_WINDOW(edit_account.window), FALSE);
        inc_unlock();
 }
 
@@ -1227,11 +1266,29 @@ static gint account_delete_event(GtkWidget *widget, GdkEventAny *event,
 static gboolean account_key_pressed(GtkWidget *widget, GdkEventKey *event,
                                    gpointer data)
 {
-       if (event && event->keyval == GDK_Escape)
+       if (event && event->keyval == GDK_KEY_Escape)
                account_edit_close(NULL, NULL);
        return FALSE;
 }
 #endif
+
+static gboolean account_search_func_cb (GtkTreeModel *model, gint column, const gchar *key, 
+                                               GtkTreeIter *iter, gpointer search_data) 
+{
+       gboolean retval;
+       PrefsAccount *ac;
+
+       gtk_tree_model_get (model, iter, ACCOUNT_DATA, &ac, -1);
+
+       if (!ac->name || !key) return FALSE;
+
+       retval = (strncmp (key, ac->account_name, strlen(key)) != 0);
+
+       debug_print("selecting row\n");
+       account_list_view_select_account(edit_account.list_view, ac->account_id);
+
+       return retval;
+}
 static void account_list_view_add(PrefsAccount *ac_prefs)
 {
        GtkTreeView *list_view = GTK_TREE_VIEW(edit_account.list_view);
@@ -1241,7 +1298,7 @@ static void account_list_view_add(PrefsAccount *ac_prefs)
        gboolean getall;
 
        name = ac_prefs->account_name;
-#if (defined(USE_OPENSSL) || defined (USE_GNUTLS))
+#ifdef USE_GNUTLS
        protocol = ac_prefs->protocol == A_POP3 ?
                  (ac_prefs->ssl_pop == SSL_TUNNEL ?
                   "POP3 (SSL)" :
@@ -1366,7 +1423,7 @@ PrefsAccount *account_get_reply_account(MsgInfo *msginfo, gboolean reply_autosel
                                if (!strchr(field, ',')) {
                                        Xstrdup_a(to, field, return NULL);
                                        extract_address(to);
-                                       account = account_find_from_address(to);
+                                       account = account_find_from_address(to, FALSE);
                                } else {
                                        gchar **split = g_strsplit(field, ",", -1);
                                        int i = -1;
@@ -1376,7 +1433,7 @@ PrefsAccount *account_get_reply_account(MsgInfo *msginfo, gboolean reply_autosel
                                                        break;
                                                Xstrdup_a(to, split[i], return NULL);
                                                extract_address(to);
-                                               account = account_find_from_address(to);
+                                               account = account_find_from_address(to, FALSE);
                                        } while (!account);
                                        g_strfreev(split);
                                }
@@ -1388,7 +1445,7 @@ PrefsAccount *account_get_reply_account(MsgInfo *msginfo, gboolean reply_autosel
                                (msginfo, deliveredto,sizeof deliveredto , "Delivered-To:")) { 
                                gchar *buf = deliveredto + strlen("Delivered-To:");
                                extract_address(buf);
-                               account = account_find_from_address(buf);
+                               account = account_find_from_address(buf, FALSE);
                        }
                }
        }
@@ -1464,7 +1521,7 @@ static GtkWidget *account_list_view_create(void)
 
        list_view = GTK_TREE_VIEW(gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)));
        g_object_unref(G_OBJECT(store));
-#ifdef MAEMO
+#ifdef GENERIC_UMPC
        g_object_set(list_view, "allow-checkbox-mode", FALSE, NULL);
 #endif
        gtk_tree_view_set_rules_hint(list_view, prefs_common.use_stripes_everywhere);
@@ -1497,7 +1554,6 @@ static void account_create_list_view_columns(GtkWidget *list_view)
 {
        GtkTreeViewColumn *column;
        GtkCellRenderer *renderer;
-       GtkTooltips *tooltips = gtk_tooltips_new();
 
        renderer = gtk_cell_renderer_toggle_new();
        g_object_set(renderer, 
@@ -1510,8 +1566,8 @@ static void account_create_list_view_columns(GtkWidget *list_view)
                 NULL);
        gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), column);          
        gtk_tree_view_column_set_alignment (column, 0.5);
-       gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), column->button,
-                       _("'Get Mail' retrieves mail from the checked accounts"), NULL);
+       CLAWS_SET_TIP(gtk_tree_view_column_get_widget(column),
+                       _("'Get Mail' retrieves mail from the checked accounts"));
        g_signal_connect(G_OBJECT(renderer), "toggled",                      
                         G_CALLBACK(account_get_all_toggled),
                         list_view);
@@ -1538,6 +1594,8 @@ static void account_create_list_view_columns(GtkWidget *list_view)
                 "text", ACCOUNT_SERVER,
                 "weight", ACCOUNT_IS_DEFAULT,
                 NULL);
+       gtk_tree_view_set_search_column(GTK_TREE_VIEW(list_view), ACCOUNT_NAME);
+       gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(list_view), account_search_func_cb , NULL, NULL);
        gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), column);           
 }
 
@@ -1763,3 +1821,60 @@ static void account_row_changed_while_drag_drop(GtkTreeModel *model,
 {      
        account_list_set();     
 }
+
+gchar *account_get_signature_str(PrefsAccount *account)
+{
+       gchar *sig_body = NULL;
+       gchar *sig_str = NULL;
+       gchar *utf8_sig_str = NULL;
+
+       cm_return_val_if_fail(account != NULL, NULL);
+
+       if (!account->sig_path)
+               return NULL;
+
+       if (account->sig_type == SIG_FILE) {
+               if (!is_file_or_fifo_exist(account->sig_path)) {
+                       g_warning("can't open signature file: %s\n",
+                                 account->sig_path);
+                       return NULL;
+               }
+       }
+
+       if (account->sig_type == SIG_COMMAND)
+               sig_body = get_command_output(account->sig_path);
+       else {
+               gchar *tmp;
+
+               tmp = file_read_to_str(account->sig_path);
+               if (!tmp)
+                       return NULL;
+               sig_body = normalize_newlines(tmp);
+               g_free(tmp);
+       }
+
+       if (account->sig_sep) {
+               sig_str = g_strconcat("\n", account->sig_sep, "\n", sig_body,
+                                     NULL);
+               g_free(sig_body);
+       } else
+               sig_str = g_strconcat("\n", sig_body, NULL);
+
+       if (sig_str) {
+               if (g_utf8_validate(sig_str, -1, NULL) == TRUE)
+                       utf8_sig_str = sig_str;
+               else {
+                       utf8_sig_str = conv_codeset_strdup
+                               (sig_str, conv_get_locale_charset_str_no_utf8(),
+                                CS_INTERNAL);
+                       g_free(sig_str);
+               }
+       }
+
+       return utf8_sig_str;
+}
+
+PrefsAccount *account_get_cur_account (void)
+{
+       return cur_account;
+}