* let the dbus-invoked msgs use the same uids as other messages,
authorDirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>
Tue, 10 Jul 2007 23:13:08 +0000 (23:13 +0000)
committerDirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>
Tue, 10 Jul 2007 23:13:08 +0000 (23:13 +0000)
  so, modest-window-mgr will do the right thing.

also fixed up modest-window-mgr a bit.

  fixes: NB#62897

pmo-trunk-r2685

src/dbus_api/modest-dbus-callbacks.c
src/widgets/modest-window-mgr.c

index 7d6bd0e..f130961 100644 (file)
@@ -32,6 +32,7 @@
 #include "modest-account-mgr.h"
 #include "modest-account-mgr-helpers.h"
 #include "modest-tny-account.h"
+#include "modest-tny-folder.h"
 #include "modest-ui-actions.h"
 
 #include "modest-search.h"
@@ -445,7 +446,7 @@ static gint on_compose_mail(GArray * arguments, gpointer data, osso_rpc_t * retv
 
 
 static TnyMsg *
-find_message_by_url (const char *uri, TnyAccount **ac_out)
+find_message_by_url (const char *uri, TnyFolder **folder_out, TnyAccount **ac_out)
 {
        ModestTnyAccountStore *astore;
        TnyAccount            *account;
@@ -477,7 +478,6 @@ find_message_by_url (const char *uri, TnyAccount **ac_out)
        }
 
        g_debug ("%s: Account is store account.\n", __FUNCTION__);
-
        *ac_out = account;
 
        folder = tny_store_account_find_folder (TNY_STORE_ACCOUNT (account),
@@ -489,6 +489,8 @@ find_message_by_url (const char *uri, TnyAccount **ac_out)
                        tny_account_get_id (TNY_ACCOUNT(account)), uri);
                goto out;
        }
+       *folder = folder;
+
        g_debug ("%s: Found folder. (%s)\n",  __FUNCTION__, uri);
        
 
@@ -508,8 +510,9 @@ out:
                *ac_out = NULL;
        }
 
-       if (folder) {
+       if (folder && !msg) {
                g_object_unref (folder);
+               *folder_out = NULL;
        }
 
        return msg;
@@ -518,18 +521,20 @@ out:
 static gboolean
 on_idle_open_message (gpointer user_data)
 {
-       ModestWindow *msg_view;
+       ModestWindow *msg_view = NULL;
        TnyMsg       *msg;
-       TnyAccount   *account;
+       TnyAccount   *account = NULL;
        TnyHeader    *header; 
        const char   *msg_uid;
        const char   *account_name;
        char         *uri;
-       
+       ModestWindowMgr *win_mgr;
+       TnyFolder    *folder = NULL;
+
        uri = (char *) user_data;
 
-       g_debug ("%s: Trying to find msg by url: %s", __FUNCTION__, uri);       
-       msg = find_message_by_url (uri, &account);
+       g_debug ("%s: Trying to find msg by url: %s", __FUNCTION__, uri);
+       msg = find_message_by_url (uri, &folder, &account);
        g_free (uri);
 
        if (msg == NULL) {
@@ -538,25 +543,40 @@ on_idle_open_message (gpointer user_data)
        }
        g_debug ("  %s: Found message.", __FUNCTION__);
 
+       if (modest_tny_folder_get_local_folder_type (folder) == TNY_FOLDER_TYPE_DRAFTS) {
+               g_debug ("draft messages should be opened in edit mode... ");
+       }
+
        header = tny_msg_get_header (msg);
        account_name = tny_account_get_name (account);
-       msg_uid = tny_header_get_uid (header);
-       
+       msg_uid =  modest_tny_folder_get_header_unique_id(header); 
+/* FIXME:  modest_tny_folder_get_header_unique_id warns against this */
+       win_mgr = modest_runtime_get_window_mgr ();
+               
        gdk_threads_enter ();
-       
-       msg_view = modest_msg_view_window_new (msg,
-                                              account_name,
-                                              msg_uid);
 
-       modest_window_mgr_register_window (modest_runtime_get_window_mgr (), msg_view);
-       gtk_widget_show_all (GTK_WIDGET (msg_view));
+       if (modest_window_mgr_find_registered_header (win_mgr, header, &msg_view)) {
+               g_debug ("window for this msg is open already");
+               if (!MODEST_IS_MSG_VIEW_WINDOW(msg_view)) 
+                       g_debug ("not a msg view");
+               else {
+                       gtk_window_present (GTK_WINDOW(msg_view));
+               }
+       } else {
+               g_debug ("creating new window for this msg");
+               modest_window_mgr_register_header (win_mgr, header);
+               msg_view = modest_msg_view_window_new (msg,account_name,
+                                                      msg_uid);
+               modest_window_mgr_register_window (win_mgr, msg_view);
+               gtk_widget_show_all (GTK_WIDGET (msg_view));
+       }
 
        gdk_threads_leave ();
 
        g_object_unref (header);
        g_object_unref (account);
-       g_object_unref (msg_view);
-       
+       g_object_unref (folder);
+
        return FALSE; /* Do not call this callback again. */
 }
 
index 3312baa..d66cc14 100644 (file)
@@ -239,9 +239,13 @@ modest_window_mgr_register_header (ModestWindowMgr *self,  TnyHeader *header)
                
        priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
        uid = modest_tny_folder_get_header_unique_id (header);
-       
-       if (!has_uid (priv->preregistered_uids, uid))
+
+
+       if (!has_uid (priv->preregistered_uids, uid)) {
+               g_debug ("registering new uid %s", uid);
                priv->preregistered_uids = append_uid (priv->preregistered_uids, uid);
+       } else
+               g_debug ("already had uid %s", uid);
 
        g_free (uid);
 }
@@ -258,8 +262,19 @@ modest_window_mgr_unregister_header (ModestWindowMgr *self,  TnyHeader *header)
        priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
        uid = modest_tny_folder_get_header_unique_id (header);
        
-       if (has_uid (priv->preregistered_uids, uid))
+       if (!has_uid (priv->preregistered_uids, uid)) {
+               g_debug ("trying to unregister non-existing uid %s", uid);
+               priv->preregistered_uids = append_uid (priv->preregistered_uids, uid);
+       } else
+               g_debug ("unregistering uid %s", uid);
+
+       if (has_uid (priv->preregistered_uids, uid)) {
                priv->preregistered_uids = remove_uid (priv->preregistered_uids, uid);
+               if (has_uid (priv->preregistered_uids, uid))
+                       g_debug ("BUG: uid %s NOT removed", uid);
+               else
+                       g_debug ("uid %s removed", uid);
+       }
 
        g_free (uid);
 }
@@ -290,7 +305,7 @@ modest_window_mgr_find_registered_header (ModestWindowMgr *self, TnyHeader *head
 {
        ModestWindowMgrPrivate *priv;
        gchar* uid;
-       gboolean retval = FALSE;
+       gboolean has_header, has_window = FALSE;
        GList *item = NULL;
 
        g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), FALSE);
@@ -300,24 +315,29 @@ modest_window_mgr_find_registered_header (ModestWindowMgr *self, TnyHeader *head
 
        uid = modest_tny_folder_get_header_unique_id (header);
        
-       /* first, look for the window */
-       /* note, the UID cannot be in both the window list and the preregistered uid list */
-       if (priv->window_list) {
-               item = g_list_find_custom (priv->window_list, 
-                                          uid, (GCompareFunc) compare_msguids);
-               if (item) 
-                       retval = TRUE;
-               if (win)
-                       *win = item ? MODEST_WINDOW(item->data) : NULL;
-       }
+       if (win)
+               *win = NULL;
        
+       g_debug ("windows in list: %d", g_list_length (priv->window_list));
+       g_debug ("headers in list: %d", g_slist_length (priv->preregistered_uids));
 
-       /* IF It's not in the window list. maybe it's in our uid list... */
-       retval = retval || has_uid (priv->preregistered_uids, uid);
+       has_header = has_uid (priv->preregistered_uids, uid);
+               
+       item = g_list_find_custom (priv->window_list, uid, (GCompareFunc) compare_msguids);
+       if (item) {
+               has_window = TRUE;
+               if (win) {
+                       if (!MODEST_IS_MSG_VIEW_WINDOW(item->data))
+                               g_debug ("not a valid window!");
+                       else {
+                               g_debug ("found a window");
+                               *win = MODEST_WINDOW (item->data);
+                       }
+               }
+       }
 
        g_free (uid);
-
-       return retval;
+       return has_header || has_window;
 }
 
 
@@ -342,7 +362,7 @@ modest_window_mgr_register_window (ModestWindowMgr *self,
                g_warning ("Trying to register an already registered window");
                return;
        }
-
+       
        /* Check that it's not a second main window */
        if (MODEST_IS_MAIN_WINDOW (window)) {
                if (priv->main_window) {
@@ -355,6 +375,14 @@ modest_window_mgr_register_window (ModestWindowMgr *self,
 
        /* remove from the list of pre-registered uids */
        if (MODEST_IS_MSG_VIEW_WINDOW(window)) {
+               const gchar *uid = modest_msg_view_window_get_message_uid
+                       (MODEST_MSG_VIEW_WINDOW (window));
+
+               g_debug ("registering window for %s", uid);
+                               
+               if (!has_uid (priv->preregistered_uids, uid)) 
+                       g_debug ("weird: no uid for window (%s)", uid);
+
                priv->preregistered_uids = 
                        remove_uid (priv->preregistered_uids,
                                    modest_msg_view_window_get_message_uid