* fixes for -Wall -Warning
[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                 default:
125                         rules |= MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE;
126                         rules |= MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE;
127                         rules |= MODEST_FOLDER_RULES_FOLDER_NON_RENAMEABLE;
128                 }
129         } else {
130                 ModestProtocol proto;
131                 TnyAccount *account =
132                         tny_folder_get_account ((TnyFolder*)folder);
133                 if (!account)
134                         return -1; /* no account: nothing is allowed */
135                 
136                 proto = modest_protocol_info_get_protocol (
137                         tny_account_get_proto (account));
138
139                 if (proto == MODEST_PROTOCOL_STORE_IMAP) {
140                         rules = 0;
141                 } else {
142                         /* pop, nntp, ... */
143                         rules =
144                                 MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE |
145                                 MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE |
146                                 MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE  |
147                                 MODEST_FOLDER_RULES_FOLDER_NON_RENAMEABLE;
148
149                 }
150                 g_object_unref (G_OBJECT(account));
151         }
152         return rules;
153 }
154
155
156 gboolean
157 modest_tny_folder_is_local_folder   (const TnyFolder *folder)
158 {
159         TnyAccount*  account;
160         const gchar* account_name;
161         
162         g_return_val_if_fail (folder, FALSE);
163         
164         account = tny_folder_get_account ((TnyFolder*)folder);
165         if (!account)
166                 return FALSE;
167
168         account_name = tny_account_get_id (account);
169         if (!account_name)
170                 return FALSE;
171
172         g_object_unref (G_OBJECT(account));
173         
174         return (strcmp (account_name, MODEST_LOCAL_FOLDERS_ACCOUNT_NAME) == 0);
175 }       
176
177
178 TnyFolderType
179 modest_tny_folder_get_local_folder_type  (const TnyFolder *folder)
180 {
181         CamelFolder *camel_folder;
182         const gchar *full_name;
183         
184         g_return_val_if_fail (folder, TNY_FOLDER_TYPE_UNKNOWN);
185         g_return_val_if_fail (modest_tny_folder_is_local_folder(folder),
186                               TNY_FOLDER_TYPE_UNKNOWN);
187
188         camel_folder = tny_camel_folder_get_folder (TNY_CAMEL_FOLDER(folder));
189         if (!camel_folder)
190                 return TNY_FOLDER_TYPE_UNKNOWN;
191
192         full_name = camel_folder_get_full_name (camel_folder);
193         if (!full_name)
194                 return TNY_FOLDER_TYPE_UNKNOWN;
195
196         return modest_local_folder_info_get_type (full_name);
197 }