* Check subfolders name on move-to operations.
authorJavier Fernandez Garcia-Boente <jfernandez@igalia.com>
Thu, 23 Aug 2007 16:23:40 +0000 (16:23 +0000)
committerJavier Fernandez Garcia-Boente <jfernandez@igalia.com>
Thu, 23 Aug 2007 16:23:40 +0000 (16:23 +0000)
* Fixes: NB#66403

pmo-trunk-r3059

src/modest-mail-operation.c
src/modest-tny-folder.c
src/modest-tny-folder.h
src/modest-ui-actions.c
src/widgets/modest-folder-view.c
src/widgets/modest-folder-view.h

index f54fb4b..350a3d1 100644 (file)
@@ -1820,12 +1820,14 @@ modest_mail_operation_xfer_folder (ModestMailOperation *self,
        ModestMailOperationPrivate *priv = NULL;
        ModestTnyFolderRules parent_rules = 0, rules; 
        XFerMsgAsyncHelper *helper = NULL;
+       const gchar *folder_name = NULL;
 
        g_return_if_fail (MODEST_IS_MAIL_OPERATION (self));
        g_return_if_fail (TNY_IS_FOLDER (folder));
        g_return_if_fail (TNY_IS_FOLDER_STORE (parent));
 
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
+       folder_name = tny_folder_get_name (folder);
 
        /* Get account and set it into mail_operation */
        priv->account = modest_tny_folder_get_account (TNY_FOLDER(folder));
@@ -1840,6 +1842,7 @@ modest_mail_operation_xfer_folder (ModestMailOperation *self,
        if ((gpointer) parent == (gpointer) folder ||
            (!TNY_IS_FOLDER_STORE (parent)) || 
            (rules & MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE)) {
+
                /* Set status failed and set an error */
                priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
                g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
@@ -1848,8 +1851,10 @@ modest_mail_operation_xfer_folder (ModestMailOperation *self,
 
                /* Notify the queue */
                modest_mail_operation_notify_end (self);
+
        } else if (TNY_IS_FOLDER (parent) && 
                   (parent_rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE)) {
+
                /* Set status failed and set an error */
                priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
                g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
@@ -1858,6 +1863,7 @@ modest_mail_operation_xfer_folder (ModestMailOperation *self,
 
                /* Notify the queue */
                modest_mail_operation_notify_end (self);
+
        } else if (TNY_IS_FOLDER (parent) &&
                   TNY_IS_FOLDER_STORE (folder) &&
                   folder_is_ancestor (TNY_FOLDER (parent), TNY_FOLDER_STORE (folder))) {
@@ -1869,31 +1875,52 @@ modest_mail_operation_xfer_folder (ModestMailOperation *self,
 
                /* Notify the queue */
                modest_mail_operation_notify_end (self);
-       } else {
+
+       } else if (TNY_IS_FOLDER_STORE (parent) &&
+                  modest_tny_folder_same_subfolder (parent, folder_name)) {
+               /* Check that the new folder name is not used by any
+                   parent subfolder */
+
+               /* Set status failed and set an error */
+               priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
+               g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
+                            MODEST_MAIL_OPERATION_ERROR_FOLDER_RULES,
+                            _("mail_in_ui_folder_move_target_error"));
+
+               /* Notify the queue */
+               modest_mail_operation_notify_end (self);
+               
+       } else if (!(new_name_valid_if_local_account (priv, parent, folder_name))) {
                /* Check that the new folder name is not used by any
                   special local folder */
-               if (new_name_valid_if_local_account (priv, parent, 
-                                                    tny_folder_get_name (folder))) {
-                       /* Create the helper */
-                       helper = g_slice_new0 (XFerMsgAsyncHelper);
-                       helper->mail_op = g_object_ref(self);
-                       helper->dest_folder = NULL;
-                       helper->headers = NULL;
-                       helper->user_callback = user_callback;
-                       helper->user_data = user_data;
-                       
-                       /* Move/Copy folder */          
-                       tny_folder_copy_async (folder,
-                                              parent,
-                                              tny_folder_get_name (folder),
+
+               /* Set status failed and set an error */
+               priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
+               g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
+                            MODEST_MAIL_OPERATION_ERROR_FOLDER_RULES,
+                            _("mail_in_ui_folder_move_target_error"));
+
+               /* Notify the queue */
+               modest_mail_operation_notify_end (self);
+       } else {
+               /* Create the helper */
+               helper = g_slice_new0 (XFerMsgAsyncHelper);
+               helper->mail_op = g_object_ref(self);
+               helper->dest_folder = NULL;
+               helper->headers = NULL;
+               helper->user_callback = user_callback;
+               helper->user_data = user_data;
+               
+               /* Move/Copy folder */          
+               tny_folder_copy_async (folder,
+                                      parent,
+                                      tny_folder_get_name (folder),
                                               delete_original,
-                                              transfer_folder_cb,
-                                              transfer_folder_status_cb,
-                                              helper);
-               } else {
-                       modest_mail_operation_notify_end (self);
-               }
-       }
+                                      transfer_folder_cb,
+                                      transfer_folder_status_cb,
+                                      helper);
+       } 
+       
 }
 
 void
index fb70c47..1dfeefd 100644 (file)
@@ -32,6 +32,7 @@
 #include <string.h>
 #include <modest-tny-folder.h>
 #include <modest-tny-outbox-account.h>
+#include <tny-simple-list.h>
 #include <tny-camel-folder.h>
 #include <tny-merge-folder.h>
 #include <camel/camel-folder.h>
@@ -376,3 +377,41 @@ modest_tny_folder_get_account (TnyFolder *folder)
        
        return account;
 }
+
+gboolean 
+modest_tny_folder_same_subfolder (TnyFolderStore *parent,
+                                 const gchar *new_name)
+{
+       TnyList *subfolders = NULL;
+       TnyIterator *iter = NULL;
+       TnyFolder *folder = NULL;
+       GError *err = NULL;
+       const gchar *name = NULL;
+       gboolean same_subfolder = FALSE;
+
+       g_return_val_if_fail (TNY_IS_FOLDER_STORE (parent), FALSE);
+
+       /* Get direct subfolders */
+       subfolders = tny_simple_list_new ();
+       tny_folder_store_get_folders (parent, subfolders, NULL, &err);
+
+       /* Check names */
+       iter = tny_list_create_iterator (subfolders);
+       while (!tny_iterator_is_done (iter) && !same_subfolder) {
+               folder = TNY_FOLDER(tny_iterator_get_current (iter));
+               name = tny_folder_get_name (folder);
+               
+               same_subfolder = !strcmp(name, new_name);
+
+               g_object_unref (folder);
+               tny_iterator_next(iter);
+       }
+       
+       /* free */
+       if (iter != NULL)
+               g_object_unref (iter);
+       if (subfolders != NULL)
+               g_object_unref (subfolders);
+               
+       return same_subfolder;
+}
index 97977fc..274727d 100644 (file)
@@ -178,6 +178,22 @@ TnyAccount *modest_tny_folder_get_account (TnyFolder *folder);
  **/
 gchar* modest_tny_folder_get_header_unique_id (TnyHeader *header);
 
+/**
+ * modest_tny_msg_get_header_unique_id:
+ * @folder: a #TnyFolderStore 
+ * @new_name: the new name to check into subfolders.
+ *   
+ * This function check if subfolders of @folder has the same
+ * name as @new_name.
+ *
+ * Returns: TRUE if some subfolder has the name @new_name.
+ **/
+gboolean modest_tny_folder_same_subfolder (TnyFolderStore *folder,
+                                          const gchar *new_name);
+
+
+
+
 G_END_DECLS
 
 #endif /* __MODEST_TNY_FOLDER_H__*/
index 48363a2..840ad29 100644 (file)
@@ -2081,7 +2081,7 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
        
        gchar *from = modest_account_mgr_get_from_string (account_mgr, account_name);
 
-       modest_platform_information_banner (NULL, NULL, _("mcen_ib_outbox_waiting_to_be_sent"));
+/*     modest_platform_information_banner (NULL, NULL, _("mcen_ib_outbox_waiting_to_be_sent")); */
 
        /* Create the mail operation */
        ModestMailOperation *mail_operation = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_SEND, G_OBJECT(edit_window));
@@ -3408,6 +3408,7 @@ create_move_to_dialog (GtkWindow *win,
 
        /* Create folder view */
        *tree_view = modest_platform_create_folder_view (NULL);
+/*     *tree_view = modest_folder_view_new (NULL); */
 
        g_signal_connect (G_OBJECT (new_button), "clicked", G_CALLBACK(create_move_to_dialog_on_new_folder), *tree_view);
 
@@ -3415,13 +3416,14 @@ create_move_to_dialog (GtkWindow *win,
           window (msg window for example) after the main window was
           closed, so we can not just get the model of the folder
           view */
-       if (MODEST_IS_FOLDER_VIEW (folder_view))
-               gtk_tree_view_set_model (GTK_TREE_VIEW (*tree_view),
-                                        gtk_tree_view_get_model (GTK_TREE_VIEW (folder_view)));
-       else
+       if (MODEST_IS_FOLDER_VIEW (folder_view)) {
+               modest_folder_view_copy_model (MODEST_FOLDER_VIEW(folder_view), 
+                                              MODEST_FOLDER_VIEW(*tree_view));
+       } else
                modest_folder_view_update_model (MODEST_FOLDER_VIEW (*tree_view), 
                                                 TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()));
 
+       /* Hide special folders */
        modest_folder_view_show_non_move_folders (MODEST_FOLDER_VIEW (*tree_view), FALSE);
        
        gtk_container_add (GTK_CONTAINER (scroll), *tree_view);
@@ -3816,7 +3818,6 @@ modest_ui_actions_xfer_messages_from_move_to (TnyFolderStore *dst_folder,
        g_object_unref (headers);
 }
 
-
 /*
  * UI handler for the "Move to" action when invoked from the
  * ModestMainWindow
index 989c03a..1448474 100644 (file)
@@ -2328,13 +2328,48 @@ modest_folder_view_cut_selection (ModestFolderView *folder_view)
 }
 
 void
+modest_folder_view_copy_model (ModestFolderView *folder_view_src,
+                              ModestFolderView *folder_view_dst)
+{
+       GtkTreeModel *filter_model = NULL;
+       GtkTreeModel *model = NULL;
+       GtkTreeModel *new_filter_model = NULL;
+       
+       g_return_if_fail (MODEST_IS_FOLDER_VIEW (folder_view_src));
+       g_return_if_fail (MODEST_IS_FOLDER_VIEW (folder_view_dst));
+
+       /* Get src model*/
+       filter_model = gtk_tree_view_get_model (GTK_TREE_VIEW (folder_view_src));
+       model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER(filter_model));
+
+       /* Build new filter model */
+       new_filter_model = gtk_tree_model_filter_new (model, NULL);     
+       gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (new_filter_model),
+                                               filter_row,
+                                               folder_view_dst,
+                                               NULL);
+       /* Set copied model */
+       gtk_tree_view_set_model (GTK_TREE_VIEW (folder_view_dst), new_filter_model);
+
+       /* Free */
+       g_object_unref (new_filter_model);
+}
+
+void
 modest_folder_view_show_non_move_folders (ModestFolderView *folder_view,
-                                   gboolean show)
+                                         gboolean show)
 {
+       GtkTreeModel *model = NULL;
        ModestFolderViewPrivate* priv = MODEST_FOLDER_VIEW_GET_PRIVATE(folder_view);
        priv->show_non_move = show;
-       modest_folder_view_update_model(folder_view,
-                                                                                                                                       TNY_ACCOUNT_STORE(modest_runtime_get_account_store()));
+/*     modest_folder_view_update_model(folder_view, */
+/*                                     TNY_ACCOUNT_STORE(modest_runtime_get_account_store())); */
+
+       /* Hide special folders */
+       model = gtk_tree_view_get_model (GTK_TREE_VIEW (folder_view));
+       if (GTK_IS_TREE_MODEL_FILTER (model)) {
+               gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (model));
+       }
 }
 
 /* Returns FALSE if it did not selected anything */
index 56d8490..0bfc49f 100644 (file)
@@ -226,6 +226,19 @@ void
 modest_folder_view_show_non_move_folders (ModestFolderView *folder_view,
                                    gboolean show);
 
+/*
+ * modest_folder_view_copy_model:
+ * @folder_view_src: a #ModestFolderView
+ * @folder_view_dst: a #ModestFolderView
+ * 
+ * Get model from @folder_view_src and builds a new 
+ * #GtkTreeFilterModel object for that model. This copied
+ * model will be asigned to @folder_view_dst. 
+ **/
+void
+modest_folder_view_copy_model (ModestFolderView *folder_view_src,
+                              ModestFolderView *folder_view_dst);
+
 G_END_DECLS
 
 #endif /* __MODEST_FOLDER_VIEW_H__ */