afbe166e2120cd9643e9d8204fc73a3694c21e73
[modest] / src / modest-tny-folder.c
1 /* Copyright (c) 2006, Nokia Corporation
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  * * Redistributions of source code must retain the above copyright
9  *   notice, this list of conditions and the following disclaimer.
10  * * Redistributions in binary form must reproduce the above copyright
11  *   notice, this list of conditions and the following disclaimer in the
12  *   documentation and/or other materials provided with the distribution.
13  * * Neither the name of the Nokia Corporation nor the names of its
14  *   contributors may be used to endorse or promote products derived from
15  *   this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
18  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
20  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29
30 #include <glib.h>
31 #include <glib/gi18n.h>
32 #include <string.h>
33 #include <modest-tny-folder.h>
34 #include <tny-camel-folder.h>
35 #include <camel/camel-folder.h>
36 #include <modest-protocol-info.h>
37
38 TnyFolderType
39 modest_tny_folder_guess_folder_type_from_name (const gchar* name)
40 {
41         gint  type;
42         gchar *folder;
43
44         g_return_val_if_fail (name, TNY_FOLDER_TYPE_UNKNOWN);
45         
46         type = TNY_FOLDER_TYPE_UNKNOWN;
47         folder = g_utf8_strdown (name, strlen(name));
48
49         if (strcmp (folder, "inbox") == 0 ||
50             strcmp (folder, _("inbox")) == 0)
51                 type = TNY_FOLDER_TYPE_INBOX;
52         else if (strcmp (folder, "outbox") == 0 ||
53                  strcmp (folder, _("outbox")) == 0)
54                 type = TNY_FOLDER_TYPE_OUTBOX;
55         else if (g_str_has_prefix(folder, "junk") ||
56                  g_str_has_prefix(folder, _("junk")))
57                 type = TNY_FOLDER_TYPE_JUNK;
58         else if (g_str_has_prefix(folder, "trash") ||
59                  g_str_has_prefix(folder, _("trash")))
60                 type = TNY_FOLDER_TYPE_TRASH;
61         else if (g_str_has_prefix(folder, "sent") ||
62                  g_str_has_prefix(folder, _("sent")))
63                 type = TNY_FOLDER_TYPE_SENT;
64         else if (g_str_has_prefix(folder, "draft") ||
65                  g_str_has_prefix(folder, _("draft")))
66                 type = TNY_FOLDER_TYPE_DRAFTS;
67         else if (g_str_has_prefix(folder, "notes") ||
68                  g_str_has_prefix(folder, _("notes")))
69                 type = TNY_FOLDER_TYPE_NOTES;
70         else if (g_str_has_prefix(folder, "contacts") ||
71                  g_str_has_prefix(folder, _("contacts")))
72                 type = TNY_FOLDER_TYPE_CONTACTS;
73         else if (g_str_has_prefix(folder, "calendar") ||
74                  g_str_has_prefix(folder, _("calendar")))
75                 type = TNY_FOLDER_TYPE_CALENDAR;
76         
77         g_free (folder);
78         return type;
79 }
80
81
82
83 TnyFolderType
84 modest_tny_folder_guess_folder_type (const TnyFolder *folder)
85 {
86         TnyFolderType type;
87
88         g_return_val_if_fail (folder, TNY_FOLDER_TYPE_UNKNOWN);
89
90         type = tny_folder_get_folder_type (TNY_FOLDER (folder));
91         
92         if (type == TNY_FOLDER_TYPE_UNKNOWN) {
93                 const gchar *folder_name;
94
95                 folder_name = tny_folder_get_name (TNY_FOLDER (folder));
96                 type =  modest_tny_folder_guess_folder_type_from_name (folder_name);
97         }
98
99         return type;
100 }
101
102
103 /* FIXME: encode all folder rules here */
104 ModestTnyFolderRules
105 modest_tny_folder_get_folder_rules   (const TnyFolder *folder)
106 {
107         ModestTnyFolderRules rules = 0;
108         TnyFolderType type;
109
110         g_return_val_if_fail (TNY_IS_FOLDER(folder), -1);
111
112         if (modest_tny_folder_is_local_folder (folder)) {
113         
114                 type = modest_tny_folder_get_local_folder_type (folder);
115                 
116                 switch (type) {
117                 case TNY_FOLDER_TYPE_DRAFTS:
118                 case TNY_FOLDER_TYPE_OUTBOX:
119                         rules |= MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
120                 case TNY_FOLDER_TYPE_INBOX:
121                 case TNY_FOLDER_TYPE_JUNK:
122                 case TNY_FOLDER_TYPE_TRASH:
123                 case TNY_FOLDER_TYPE_SENT:
124                         rules |= MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE;
125                         rules |= MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE;
126                         rules |= MODEST_FOLDER_RULES_FOLDER_NON_RENAMEABLE;
127                 }
128         } else {
129                 ModestProtocol proto;
130                 TnyAccount *account =
131                         tny_folder_get_account ((TnyFolder*)folder);
132                 if (!account)
133                         return -1; /* no account: nothing is allowed */
134                 
135                 proto = modest_protocol_info_get_protocol (
136                         tny_account_get_proto (account));
137
138                 if (proto == MODEST_PROTOCOL_STORE_IMAP) {
139                         rules = 0;
140                 } else {
141                         /* pop, nntp, ... */
142                         rules =
143                                 MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE |
144                                 MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE |
145                                 MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE  |
146                                 MODEST_FOLDER_RULES_FOLDER_NON_RENAMEABLE;
147
148                 }
149                 g_object_unref (G_OBJECT(account));
150         }
151         return rules;
152 }
153
154
155 gboolean
156 modest_tny_folder_is_local_folder   (const TnyFolder *folder)
157 {
158         TnyAccount*  account;
159         const gchar* account_name;
160         
161         g_return_val_if_fail (folder, FALSE);
162         
163         account = tny_folder_get_account ((TnyFolder*)folder);
164         if (!account)
165                 return FALSE;
166
167         account_name = tny_account_get_id (account);
168         if (!account_name)
169                 return FALSE;
170
171         g_object_unref (G_OBJECT(account));
172         
173         return (strcmp (account_name, MODEST_LOCAL_FOLDERS_ACCOUNT_NAME) == 0);
174 }       
175
176
177 TnyFolderType
178 modest_tny_folder_get_local_folder_type  (const TnyFolder *folder)
179 {
180         CamelFolder *camel_folder;
181         const gchar *full_name;
182         
183         g_return_val_if_fail (folder, TNY_FOLDER_TYPE_UNKNOWN);
184         g_return_val_if_fail (modest_tny_folder_is_local_folder(folder),
185                               TNY_FOLDER_TYPE_UNKNOWN);
186
187         camel_folder = tny_camel_folder_get_folder (TNY_CAMEL_FOLDER(folder));
188         if (!camel_folder)
189                 return TNY_FOLDER_TYPE_UNKNOWN;
190
191         full_name = camel_folder_get_full_name (camel_folder);
192         if (!full_name)
193                 return TNY_FOLDER_TYPE_UNKNOWN;
194
195         return modest_local_folder_info_get_type (full_name);
196 }