* Added some code, that allows the folder view to unref its reference to the selecte...
[modest] / src / modest-tny-folder.c
index c913436..ff32e0e 100644 (file)
 #include <tny-simple-list.h>
 #include <tny-camel-folder.h>
 #include <tny-merge-folder.h>
-#include <camel/camel-folder.h>
 #include <modest-protocol-info.h>
 #include <modest-runtime.h>
 #include <modest-tny-account-store.h>
 
-TnyFolderType
-modest_tny_folder_guess_folder_type_from_name (const gchar* name)
-{
-       gint  type;
-       gchar *folder;
-       gchar *dc_outbox = NULL;
-       gchar *dc_sent = NULL;
-       gchar *dc_drafts = NULL;
 
-       g_return_val_if_fail (name, TNY_FOLDER_TYPE_UNKNOWN);
-       
-       type = TNY_FOLDER_TYPE_UNKNOWN;
-       folder = g_utf8_strdown (name, strlen(name));
-       dc_outbox = g_utf8_strdown (_("mcen_me_folder_outbox"), -1);
-       dc_sent = g_utf8_strdown (_("mcen_me_folder_sent"), -1);
-       dc_drafts = g_utf8_strdown (_("mcen_me_folder_drafts"), -1);
-
-//     if (strcmp (folder, "inbox") == 0 ||
-//         strcmp (folder, _("inbox")) == 0 ||
-//         strcmp (folder, _("mcen_me_folder_inbox")) == 0)
-//             type = TNY_FOLDER_TYPE_INBOX;
-       if (strcmp (folder, dc_outbox) == 0)
-               type = TNY_FOLDER_TYPE_OUTBOX;
-//     else if (g_str_has_prefix(folder, "junk") ||
-//              g_str_has_prefix(folder, _("junk")))
-//             type = TNY_FOLDER_TYPE_JUNK;
-//     else if (g_str_has_prefix(folder, "trash") ||
-//              g_str_has_prefix(folder, _("trash")))
-//             type = TNY_FOLDER_TYPE_TRASH;
-       else if (strcmp (folder, dc_sent) == 0)
-               type = TNY_FOLDER_TYPE_SENT;
-       else if (strcmp (folder, dc_drafts) == 0)
-               type = TNY_FOLDER_TYPE_DRAFTS;
-//     else if (g_str_has_prefix(folder, "notes") ||
-//              g_str_has_prefix(folder, _("notes")))
-//             type = TNY_FOLDER_TYPE_NOTES;
-//     else if (g_str_has_prefix(folder, "contacts") ||
-//              g_str_has_prefix(folder, _("contacts")))
-//             type = TNY_FOLDER_TYPE_CONTACTS;
-//     else if (g_str_has_prefix(folder, "calendar") ||
-//              g_str_has_prefix(folder, _("calendar")))
-//             type = TNY_FOLDER_TYPE_CALENDAR;
+/* make sure you use the *full* name, because foo/drafts is not the same as drafts */
+static TnyFolderType
+modest_tny_folder_guess_folder_type_from_name (const gchar* full_name)
+{
+       g_return_val_if_fail (full_name, TNY_FOLDER_TYPE_INVALID);
        
-       g_free (folder);
-       g_free (dc_outbox);
-       g_free (dc_sent);
-       g_free (dc_drafts);
-       return type;
+       if (strcmp (full_name, modest_local_folder_info_get_type_name(TNY_FOLDER_TYPE_OUTBOX)) == 0)
+               return TNY_FOLDER_TYPE_OUTBOX;
+       else if (strcmp (full_name, modest_local_folder_info_get_type_name(TNY_FOLDER_TYPE_DRAFTS)) == 0)
+               return TNY_FOLDER_TYPE_DRAFTS;
+       return
+               TNY_FOLDER_TYPE_NORMAL;
 }
 
 
@@ -97,7 +61,7 @@ modest_tny_folder_guess_folder_type (const TnyFolder *folder)
 {
        TnyFolderType type;
        
-       g_return_val_if_fail (TNY_IS_FOLDER(folder), TNY_FOLDER_TYPE_UNKNOWN);
+       g_return_val_if_fail (TNY_IS_FOLDER(folder), TNY_FOLDER_TYPE_INVALID);
 
        if (modest_tny_folder_is_local_folder ((TnyFolder*)folder))
                type = modest_tny_folder_get_local_or_mmc_folder_type ((TnyFolder*)folder);
@@ -105,15 +69,46 @@ modest_tny_folder_guess_folder_type (const TnyFolder *folder)
                type = tny_folder_get_folder_type (TNY_FOLDER (folder));
        
        if (type == TNY_FOLDER_TYPE_UNKNOWN) {
-               const gchar *folder_name;
-               folder_name = tny_folder_get_name (TNY_FOLDER (folder));
+               const gchar *folder_name =
+                       tny_camel_folder_get_full_name (TNY_CAMEL_FOLDER (folder));
                type =  modest_tny_folder_guess_folder_type_from_name (folder_name);
        }
 
+       if (type == TNY_FOLDER_TYPE_INVALID)
+               g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__);
+
        return type;
 }
 
 
+const gchar*
+modest_tny_folder_get_help_id (const TnyFolder *folder)
+{
+       TnyFolderType type;
+       const gchar* help_id = NULL;
+       
+       g_return_val_if_fail (folder, NULL);
+       g_return_val_if_fail (TNY_IS_FOLDER(folder), NULL);
+       
+       type = modest_tny_folder_guess_folder_type (TNY_FOLDER (folder));
+       
+       switch (type) {
+       case TNY_FOLDER_TYPE_NORMAL:  help_id = "applications_email_managefolders"; break;
+       case TNY_FOLDER_TYPE_INBOX:   help_id = "applications_email_inbox";break;
+       case TNY_FOLDER_TYPE_OUTBOX:  help_id = "applications_email_outbox";break;
+       case TNY_FOLDER_TYPE_SENT:    help_id = "applications_email_sent"; break;
+       case TNY_FOLDER_TYPE_DRAFTS:  help_id = "applications_email_drafts";break;
+       case TNY_FOLDER_TYPE_ARCHIVE: help_id = "applications_email_managefolders";break;
+
+       case TNY_FOLDER_TYPE_INVALID: g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__);break;
+       default:                      g_warning ("%s: BUG: unexpected folder type (%d)", __FUNCTION__, type);
+       }
+       
+       return help_id;
+}
+
+
+
 /* FIXME: encode all folder rules here */
 ModestTnyFolderRules
 modest_tny_folder_get_rules   (TnyFolder *folder)
@@ -122,11 +117,12 @@ modest_tny_folder_get_rules   (TnyFolder *folder)
        TnyFolderType type;
 
        g_return_val_if_fail (TNY_IS_FOLDER(folder), -1);
-
+       
        if (modest_tny_folder_is_local_folder (folder) ||
            modest_tny_folder_is_memory_card_folder (folder)) {
        
                type = modest_tny_folder_get_local_or_mmc_folder_type (folder);
+               g_return_val_if_fail (type != TNY_FOLDER_TYPE_INVALID, -1);
                
                switch (type) {
                case TNY_FOLDER_TYPE_OUTBOX:
@@ -175,6 +171,8 @@ modest_tny_folder_get_rules   (TnyFolder *folder)
 
                /* Neither INBOX nor ROOT, nor ARCHIVE folders should me moveable */
                folder_type = modest_tny_folder_guess_folder_type (folder);
+               g_return_val_if_fail (folder_type != TNY_FOLDER_TYPE_INVALID, -1);
+               
                if ((folder_type ==  TNY_FOLDER_TYPE_INBOX) ||
                    (folder_type == TNY_FOLDER_TYPE_ROOT) ||
                    (folder_type == TNY_FOLDER_TYPE_ARCHIVE)) {
@@ -232,6 +230,8 @@ gboolean
 modest_tny_folder_is_memory_card_folder   (TnyFolder *folder)
 {
        g_return_val_if_fail (folder, FALSE);
+       g_return_val_if_fail (modest_tny_folder_guess_folder_type (folder) !=
+                             TNY_FOLDER_TYPE_INVALID, FALSE);
        
        /* The merge folder is a special case, 
         * used to merge the per-account local outbox folders. 
@@ -267,13 +267,14 @@ modest_tny_folder_is_remote_folder   (TnyFolder *folder)
        return !is_local;
 }
 
+
 TnyFolderType
 modest_tny_folder_get_local_or_mmc_folder_type  (TnyFolder *folder)
 {
-       g_return_val_if_fail (folder, TNY_FOLDER_TYPE_UNKNOWN);
+       g_return_val_if_fail (folder, TNY_FOLDER_TYPE_INVALID);
        g_return_val_if_fail (modest_tny_folder_is_local_folder(folder)||
                              modest_tny_folder_is_memory_card_folder(folder),
-                             TNY_FOLDER_TYPE_UNKNOWN);
+                             TNY_FOLDER_TYPE_INVALID);
        
        /* The merge folder is a special case, 
         * used to merge the per-account local outbox folders. 
@@ -411,3 +412,24 @@ modest_tny_folder_has_subfolder_with_name (TnyFolderStore *parent,
                
        return same_subfolder;
 }
+
+gboolean 
+modest_tny_folder_is_ancestor (TnyFolder *folder,
+                              TnyFolderStore *ancestor)
+{
+       TnyFolderStore *tmp = NULL;
+       gboolean found = FALSE;
+
+       tmp = TNY_FOLDER_STORE (folder);
+       while (!found && tmp && !TNY_IS_ACCOUNT (tmp)) {
+               TnyFolderStore *folder_store;
+
+               folder_store = tny_folder_get_folder_store (TNY_FOLDER (tmp));
+               if (ancestor == folder_store)
+                       found = TRUE;
+               else
+                       tmp = folder_store;
+               g_object_unref (folder_store);
+       }
+       return found;
+}