* added scripts/modest-parse-presets.pl, src/modest-presets.[ch]:
[modest] / src / modest-presets.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 <string.h> /* for strcmp */
31 #include "modest-presets.h"
32
33 #define MODEST_PRESETS_KEY_MCC               "MCC"
34 #define MODEST_PRESETS_KEY_INCOMING          "IncomingMailServer"
35 #define MODEST_PRESETS_KEY_OUTGOING          "OutgoingMailServer"
36 #define MODEST_PRESETS_KEY_MAILBOX_TYPE      "MailboxType"
37 #define MODEST_PRESETS_KEY_MAILBOX_TYPE_POP  "pop"
38 #define MODEST_PRESETS_KEY_MAILBOX_TYPE_IMAP "imap"
39 #define MODEST_PRESETS_KEY_APOP              "APOPSecureLogin"
40 #define MODEST_PRESETS_KEY_SECURE_SMTP       "SecureSMTP"
41 #define MODEST_PRESETS_KEY_TRUE              "true"
42
43 ModestPresets*
44 modest_presets_new (const gchar *presetfile)
45 {
46         ModestPresets *presets = NULL;
47         GError        *err     = NULL;
48         
49         g_return_val_if_fail (presetfile, NULL);
50         
51         presets = g_new (ModestPresets, 1);
52         presets->keyfile = g_key_file_new ();
53
54         if (!presets->keyfile) {
55                 g_printerr ("modest: cannot instantiate GKeyFile\n");
56                 g_free (presets);
57                 return NULL;
58         }
59
60         if (!g_key_file_load_from_file (presets->keyfile, presetfile,
61                                         G_KEY_FILE_NONE, &err)) {
62                 g_printerr ("modest: cannot open keyfile: %s\n",
63                             err ? err->message : "unknown reason");
64                 g_error_free (err);
65                 g_free (presets);
66                 return NULL;
67         }
68
69         return presets;
70 }
71
72 gchar**
73 modest_presets_get_providers  (ModestPresets *self, gint mcc, gboolean include_globals)
74 {
75         gchar **providers = NULL;
76         gchar **filtered  = NULL;
77         
78         g_return_val_if_fail (self && self->keyfile, NULL);
79
80         providers = g_key_file_get_groups (self->keyfile, NULL);
81
82         /* return *all* providers? */
83         if (mcc < 0)
84                 return providers;
85
86         /* nope: filter them instead */
87         filtered = g_new(gchar*, g_strv_length(providers));
88
89         if (filtered && providers) {
90                 int i = 0, j = 0;
91                 while (providers[i]) {
92
93                         int this_mcc;
94                         this_mcc = g_key_file_get_integer (self->keyfile, providers[i],
95                                                            MODEST_PRESETS_KEY_MCC,
96                                                            NULL);
97                         if (this_mcc == mcc || (this_mcc == 0 && include_globals)) {
98                                 filtered[j++] = providers[i];
99                                 providers[i] = NULL; /*  g_strfreev: leave it alone */
100                         }
101                         ++i;
102                 }
103         }
104         g_strfreev (providers);
105         
106         return filtered;
107 }
108
109
110 gchar*
111 modest_presets_get_server (ModestPresets *self, const gchar *provider,
112                            gboolean incoming_server)
113 {       
114         g_return_val_if_fail (self && self->keyfile, NULL);
115         g_return_val_if_fail (provider, NULL);
116
117         return g_key_file_get_string (self->keyfile, provider, 
118                                       incoming_server ?
119                                       MODEST_PRESETS_KEY_INCOMING :
120                                       MODEST_PRESETS_KEY_OUTGOING,
121                                       NULL);
122 }
123
124
125 ModestPresetsInfo
126 modest_presets_get_info (ModestPresets *self, const gchar *provider, gboolean incoming_server)
127 {
128         ModestPresetsInfo info = 0;
129         gchar *val = NULL;
130         
131         g_return_val_if_fail (self && self->keyfile, 0);
132
133         val = g_key_file_get_string (self->keyfile, provider,
134                                         MODEST_PRESETS_KEY_INCOMING, NULL);
135         if (val) {
136                 g_free (val);
137                 val = g_key_file_get_string (self->keyfile, provider,
138                                              MODEST_PRESETS_KEY_MAILBOX_TYPE, NULL);
139                 if (strcmp (val, MODEST_PRESETS_KEY_MAILBOX_TYPE_POP) == 0)
140                         info |= MODEST_PRESETS_INFO_POP;
141                 if (strcmp (val, MODEST_PRESETS_KEY_MAILBOX_TYPE_IMAP) == 0)
142                         info |= MODEST_PRESETS_INFO_IMAP;
143                 g_free (val);
144
145                 val = g_key_file_get_string (self->keyfile, provider,
146                                              MODEST_PRESETS_KEY_APOP, NULL);
147                 if (val && strcmp(val, MODEST_PRESETS_KEY_TRUE) == 0)
148                         info |= MODEST_PRESETS_INFO_APOP;
149                 g_free(val);
150         }
151                 
152
153         val = g_key_file_get_string (self->keyfile, provider,
154                                      MODEST_PRESETS_KEY_OUTGOING, NULL);
155         if (val) {
156                 g_free (val);
157                 info |= MODEST_PRESETS_INFO_SMTP;
158                 
159                 val = g_key_file_get_string (self->keyfile, provider,
160                                              MODEST_PRESETS_KEY_SECURE_SMTP, NULL);
161                 if (val && strcmp(val,MODEST_PRESETS_KEY_TRUE) == 0)
162                         info |= MODEST_PRESETS_INFO_SECURE_SMTP;
163                 g_free(val);
164         }
165
166         return info;
167 }
168         
169         
170 void
171 modest_presets_destroy (ModestPresets *self)
172 {
173         g_return_if_fail (self);
174
175         g_key_file_free (self->keyfile);
176         self->keyfile = NULL;
177         
178         g_free (self);
179 }