2007-06-20 Murray Cumming <murrayc@murrayc-desktop>
[modest] / src / maemo / modest-main-window.c
index 280b946..8fd643c 100644 (file)
@@ -129,12 +129,11 @@ _on_msg_count_changed (ModestHeaderView *header_view,
                       TnyFolderChange *change,
                       ModestMainWindow *main_window);
 
+static void
+modest_main_window_cleanup_queue_error_signals (ModestMainWindow *self);
 
-static GtkWidget * create_empty_view (void);
 
-static gchar * 
-translate_func (const gchar *msgid,
-               const gchar *domain_name);
+static GtkWidget * create_empty_view (void);
 
 
 /* list my signals */
@@ -186,6 +185,7 @@ struct _ModestMainWindowPrivate {
 
        /* Signal handler UIDs */
        gint queue_changed_handler_uid; 
+       GList *queue_err_signals;
 };
 #define MODEST_MAIN_WINDOW_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
                                                 MODEST_TYPE_MAIN_WINDOW, \
@@ -212,7 +212,7 @@ static const GtkActionEntry modest_folder_view_action_entries [] = {
        /* Folder View CSM actions */
        { "FolderViewCSMNewFolder", NULL, N_("mcen_ti_new_folder"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_new_folder) },
        { "FolderViewCSMRenameFolder", NULL, N_("mcen_me_user_renamefolder"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_rename_folder) },
-       { "FolderViewCSMPasteMsgs", NULL, N_("mcen_me_inbox_paste"), NULL, NULL, NULL },
+       { "FolderViewCSMPasteMsgs", NULL, N_("mcen_me_inbox_paste"), NULL, NULL,  G_CALLBACK (modest_ui_actions_on_paste)},
        { "FolderViewCSMDeleteFolder", NULL, N_("mcen_me_inbox_delete"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_delete_folder) },
        { "FolderViewCSMSearchMessages", NULL, N_("mcen_me_inbox_search"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_search_messages) },
        { "FolderViewCSMHelp", NULL, N_("mcen_me_inbox_help"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_help) },
@@ -286,6 +286,7 @@ modest_main_window_init (ModestMainWindow *obj)
 
        priv = MODEST_MAIN_WINDOW_GET_PRIVATE(obj);
 
+       priv->queue_err_signals = NULL;
        priv->msg_paned    = NULL;
        priv->main_paned   = NULL;      
        priv->main_vbox    = NULL;
@@ -314,6 +315,8 @@ modest_main_window_finalize (GObject *obj)
 
        priv = MODEST_MAIN_WINDOW_GET_PRIVATE(obj);
 
+       modest_main_window_cleanup_queue_error_signals ((ModestMainWindow *) obj);
+
        g_slist_free (priv->progress_widgets);
 
        g_byte_array_free (priv->merge_ids, TRUE);
@@ -425,15 +428,89 @@ on_delete_event (GtkWidget *widget, GdkEvent  *event, ModestMainWindow *self)
        return FALSE;
 }
 
+typedef struct
+{
+       ModestMainWindow *self;
+       TnySendQueue *queue;
+       TnyHeader *header;
+} OnResponseInfo;
+
+static void
+on_response (GtkDialog *dialog, gint arg1, gpointer user_data)
+{
+       OnResponseInfo *info = (OnResponseInfo *) user_data;
+       ModestMainWindow *self = info->self;
+       TnyHeader *header = info->header;
+       TnySendQueue *queue = info->queue;
+
+       if (arg1 == GTK_RESPONSE_YES) {
+               TnyFolder *outbox = tny_send_queue_get_outbox (queue);
+               tny_folder_remove_msg (outbox, header, NULL);
+               tny_folder_sync (outbox, TRUE, NULL);
+               g_object_unref (outbox);
+       }
+
+       g_object_unref (queue);
+       g_object_unref (header);
+       g_object_unref (self);
+
+       gtk_widget_destroy (GTK_WIDGET (dialog));
+       g_slice_free (OnResponseInfo, info);
+}
+
+
+static void
+on_sendqueue_error_happened (TnySendQueue *self, TnyHeader *header, TnyMsg *msg, GError *err, ModestMainWindow *user_data)
+{
+       if (header) {
+               gchar *str = g_strdup_printf ("%s. Do you want to remove the message (%s)?",
+                       err->message, tny_header_get_subject (header));
+               OnResponseInfo *info = g_slice_new (OnResponseInfo);
+               GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW (user_data), 0,
+                       GTK_MESSAGE_ERROR, GTK_BUTTONS_YES_NO, str);
+               g_free (str);
+               info->queue = g_object_ref (self);
+               info->self = g_object_ref (user_data);
+               info->header = g_object_ref (header);
+               g_signal_connect (G_OBJECT (dialog), "response",
+                       G_CALLBACK (on_response), info);
+               gtk_widget_show_all (dialog);
+       }
+}
+
+typedef struct {
+       TnySendQueue *queue;
+       guint signal;
+} QueueErrorSignal;
+
+static void
+modest_main_window_cleanup_queue_error_signals (ModestMainWindow *self)
+{
+       ModestMainWindowPrivate *priv = MODEST_MAIN_WINDOW_GET_PRIVATE (self);
+
+       GList *oerrsignals = priv->queue_err_signals;
+       while (oerrsignals) {
+               QueueErrorSignal *esignal = (QueueErrorSignal *) oerrsignals->data;
+               g_signal_handler_disconnect (esignal->queue, esignal->signal);
+               g_slice_free (QueueErrorSignal, esignal);
+               oerrsignals = g_list_next (oerrsignals);
+       }
+       g_list_free (priv->queue_err_signals);
+       priv->queue_err_signals = NULL;
+}
 
 static void
 on_account_store_connecting_finished (TnyAccountStore *store, ModestMainWindow *self)
 {
+       ModestMainWindowPrivate *priv = MODEST_MAIN_WINDOW_GET_PRIVATE (self);
+
        /* When going online, do the equivalent of pressing the send/receive button, 
         * as per the specification:
         * (without the check for >0 accounts, though that is not specified): */
 
        TnyDevice *device = tny_account_store_get_device (store);
+
+       modest_folder_view_update_model (MODEST_FOLDER_VIEW (priv->folder_view), store);
        
        /* Check that we are really online.
         * This signal should not be emitted when we are not connected, 
@@ -454,6 +531,9 @@ on_account_store_connecting_finished (TnyAccountStore *store, ModestMainWindow *
        /* TODO: Does this really destroy the TnySendQueues and their threads
         * We do not want 2 TnySendQueues to exist with the same underlying 
         * outbox directory. */
+
+       modest_main_window_cleanup_queue_error_signals (self);
+
        GSList *account_names = modest_account_mgr_account_names (
                modest_runtime_get_account_mgr(), 
                TRUE /* enabled accounts only */);
@@ -465,17 +545,22 @@ on_account_store_connecting_finished (TnyAccountStore *store, ModestMainWindow *
                                modest_tny_account_store_get_transport_account_for_open_connection
                                                 (modest_runtime_get_account_store(), account_name));
                        if (account) {
+                               /* Q: Is this the first location where the send-queues are requested? */
+                               QueueErrorSignal *esignal = g_slice_new (QueueErrorSignal);
                                printf ("debug: %s:\n  Transport account for %s: %s\n", __FUNCTION__, account_name, 
                                        tny_account_get_id(TNY_ACCOUNT(account)));
-                               modest_runtime_get_send_queue (account);
+                               esignal->queue = TNY_SEND_QUEUE (modest_runtime_get_send_queue (account));
+                               esignal->signal = g_signal_connect (G_OBJECT (esignal->queue), "error-happened",
+                                       G_CALLBACK (on_sendqueue_error_happened), self);
+                               priv->queue_err_signals = g_list_prepend (priv->queue_err_signals, esignal);
                        }
                }
                
                iter = g_slist_next (iter);
        }
-       
-       g_slist_free (account_names);
-       
+
+       modest_account_mgr_free_account_names (account_names);
+       account_names = NULL;
        
        modest_ui_actions_do_send_receive (NULL, MODEST_WINDOW (self));
 }
@@ -663,22 +748,6 @@ modest_main_window_on_show (GtkWidget *self, gpointer user_data)
        }
 }
 
-/* Debugging */
-/* static void  */
-/* on_window_destroy (ModestWindow *window,  */
-/*                ModestWindowMgr *self) */
-/* { */
-/*     ModestMainWindow *mw = NULL;     */
-/*     ModestMainWindowPrivate *priv = NULL; */
-
-/*     mw  = MODEST_MAIN_WINDOW (window); */
-/*     priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); */
-
-/*     g_print ("\tMW: %d\n", ((GObject*)mw)->ref_count); */
-/*     g_print ("\tHV: %d\n", ((GObject*)priv->header_view)->ref_count); */
-/*     g_print ("\tFV: %d\n", ((GObject*)priv->folder_view)->ref_count); */
-/* } */
-
 ModestWindow *
 modest_main_window_new (void)
 {
@@ -703,7 +772,6 @@ modest_main_window_new (void)
 
        action_group = gtk_action_group_new ("ModestMainWindowActions");
        gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE);
-       gtk_action_group_set_translate_func (action_group, (GtkTranslateFunc) translate_func, GETTEXT_PACKAGE, g_free);
 
        menu_rules_group = modest_dimming_rules_group_new ("ModestMenuDimmingRules");
        toolbar_rules_group = modest_dimming_rules_group_new ("ModestToolbarDimmingRules");
@@ -832,11 +900,6 @@ modest_main_window_new (void)
 
        restore_settings (MODEST_MAIN_WINDOW(self), FALSE);
 
-/*     { */
-/*             g_signal_connect (self, "destroy",  */
-/*                               G_CALLBACK (on_window_destroy), self); */
-/*     } */
-
        return MODEST_WINDOW(self);
 }
 
@@ -1092,7 +1155,8 @@ on_account_update (TnyAccountStore *account_store,
 
                iter = iter->next;
        }
-       g_slist_free (account_names);
+       modest_account_mgr_free_account_names (account_names);
+       account_names = NULL;
 
        /* Order the list of accounts by its display name */
        accounts = g_slist_sort (accounts, (GCompareFunc) compare_display_names);
@@ -1833,6 +1897,7 @@ refresh_account (const gchar *account_name)
                modest_ui_actions_do_send_receive_all (win);
        else
                modest_ui_actions_do_send_receive (account_name, win);
+       
 }
 
 static void 
@@ -1849,9 +1914,3 @@ on_send_receive_csm_activated (GtkMenuItem *item,
        refresh_account ((const gchar*) user_data);
 }
 
-static gchar * 
-translate_func (const gchar *msgid,
-               const gchar *domain_name)
-{
-       return _(msgid);
-}