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