X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-presets.c;h=6bddb7cba3d8831a6544a8a656ed5e0749596122;hp=081a9b4e6b40ff7f3963345327dc33e05bfe99ee;hb=4927d2ba3643bba250d1c0e12a8c732db905fad3;hpb=e34599b2fdab11f4ea229279ca49f75cfad77bf6 diff --git a/src/modest-presets.c b/src/modest-presets.c index 081a9b4..6bddb7c 100644 --- a/src/modest-presets.c +++ b/src/modest-presets.c @@ -28,17 +28,27 @@ */ #include /* for strcmp */ +#include +#include #include "modest-presets.h" +#include -#define MODEST_PRESETS_KEY_MCC "MCC" -#define MODEST_PRESETS_KEY_INCOMING "IncomingMailServer" -#define MODEST_PRESETS_KEY_OUTGOING "OutgoingMailServer" -#define MODEST_PRESETS_KEY_MAILBOX_TYPE "MailboxType" -#define MODEST_PRESETS_KEY_MAILBOX_TYPE_POP "pop" -#define MODEST_PRESETS_KEY_MAILBOX_TYPE_IMAP "imap" -#define MODEST_PRESETS_KEY_APOP "APOPSecureLogin" -#define MODEST_PRESETS_KEY_SECURE_SMTP "SecureSMTP" -#define MODEST_PRESETS_KEY_TRUE "true" +/* Include config.h so that _() works: */ +#ifdef HAVE_CONFIG_H +#include +#endif + +#define MODEST_PRESETS_KEY_NAME "Name" +#define MODEST_PRESETS_KEY_DOMAIN "Domain" +#define MODEST_PRESETS_KEY_MCC "MCC" +#define MODEST_PRESETS_KEY_INCOMING "IncomingMailServer" +#define MODEST_PRESETS_KEY_INCOMING_SECURITY "IncomingSecurity" +#define MODEST_PRESETS_KEY_OUTGOING "OutgoingMailServer" +#define MODEST_PRESETS_KEY_MAILBOX_TYPE "MailboxType" +#define MODEST_PRESETS_KEY_APOP "APOPSecureLogin" +#define MODEST_PRESETS_KEY_SECURE_SMTP "SecureSmtp" +#define MODEST_PRESETS_KEY_SMTP_PORT "SmtpPort" + ModestPresets* modest_presets_new (const gchar *presetfile) @@ -56,10 +66,10 @@ modest_presets_new (const gchar *presetfile) g_free (presets); return NULL; } - + if (!g_key_file_load_from_file (presets->keyfile, presetfile, G_KEY_FILE_NONE, &err)) { - g_printerr ("modest: cannot open keyfile: %s\n", + g_printerr ("modest: cannot open keyfile from %s:\n %s\n", presetfile, err ? err->message : "unknown reason"); g_error_free (err); g_free (presets); @@ -70,107 +80,313 @@ modest_presets_new (const gchar *presetfile) } gchar** -modest_presets_get_providers (ModestPresets *self, gint mcc, gboolean include_globals) +modest_presets_get_providers (ModestPresets *self, guint mcc, + gboolean include_globals, gchar ***provider_ids) { - gchar **providers = NULL; + gchar **all_providers = NULL; + gchar **all_provider_ids = NULL; gchar **filtered = NULL; + gchar **filtered_ids = NULL; + GError *err = NULL; + guint i, j, len; g_return_val_if_fail (self && self->keyfile, NULL); - providers = g_key_file_get_groups (self->keyfile, NULL); + /* Get all the provider IDs: */ + all_provider_ids = g_key_file_get_groups (self->keyfile, NULL); + len = g_strv_length(all_provider_ids); + /* Get the names for all these providers: */ + all_providers = g_new0(gchar*, len + 1); /* Provider names. */ + for (i=0; i != len; ++i) { + const gchar * provider_id = all_provider_ids[i]; + if(provider_id) { + gchar* name = g_key_file_get_string(self->keyfile, provider_id, + MODEST_PRESETS_KEY_NAME, NULL); + + /* Be forgiving of missing names. + * If we use NULL then we will null-terminate the array. + */ + if(!name) + name = g_strdup(""); + + all_providers[i] = name; + } + else + all_providers[i] = NULL; + }; + /* return *all* providers? */ - if (mcc < 0) - return providers; - - /* nope: filter them instead */ - filtered = g_new(gchar*, g_strv_length(providers)); - - if (filtered && providers) { - int i = 0, j = 0; - while (providers[i]) { - - int this_mcc; - this_mcc = g_key_file_get_integer (self->keyfile, providers[i], - MODEST_PRESETS_KEY_MCC, - NULL); - if (this_mcc == mcc || (this_mcc == 0 && include_globals)) { - filtered[j++] = providers[i]; - providers[i] = NULL; /* g_strfreev: leave it alone */ - } - ++i; + /* + if (mcc == 0 && include_globals) { + *provider_ids = all_provider_ids; + return all_providers; + } + */ + + /* nope: filter them */ + + filtered = g_new0(gchar*, len + 1); /* Provider names. */ + filtered_ids = g_new0(gchar*, len + 1); /* Provider IDs */ + + for (i=0, j=0; i != len; ++i) { + + int this_mcc; + this_mcc = g_key_file_get_integer (self->keyfile, all_provider_ids[i], + MODEST_PRESETS_KEY_MCC, &err); + if (err) { + g_strfreev (all_providers); + g_strfreev (all_provider_ids); + g_strfreev (filtered); + g_strfreev (filtered_ids); + + g_printerr ("modest: error parsing keyfile: %s\n", err->message); + g_error_free (err); + + return NULL; + } + + if (this_mcc == mcc || (this_mcc == 0 && include_globals)) { + filtered[j] = all_providers[i]; + filtered_ids[j] = all_provider_ids[i]; + ++j; + filtered[j] = NULL; /* the array must be NULL-terminated */ + filtered_ids[j] = NULL; /* the array must be NULL-terminated */ + + all_providers[i] = NULL; /* g_strfreev: leave it alone */ + all_provider_ids[i] = NULL; /* g_strfreev: leave it alone */ } } - g_strfreev (providers); + g_strfreev (all_providers); + g_strfreev (all_provider_ids); + + *provider_ids = filtered_ids; return filtered; } gchar* -modest_presets_get_server (ModestPresets *self, const gchar *provider, +modest_presets_get_server (ModestPresets *self, const gchar *provider_id, gboolean incoming_server) { g_return_val_if_fail (self && self->keyfile, NULL); - g_return_val_if_fail (provider, NULL); + g_return_val_if_fail (provider_id, NULL); - return g_key_file_get_string (self->keyfile, provider, + return g_key_file_get_string (self->keyfile, provider_id, incoming_server ? MODEST_PRESETS_KEY_INCOMING : MODEST_PRESETS_KEY_OUTGOING, NULL); } +gchar * +modest_presets_get_domain (ModestPresets *self, + const gchar *provider_id) +{ + g_return_val_if_fail (self && self->keyfile, NULL); + g_return_val_if_fail (provider_id, NULL); + + return g_key_file_get_string (self->keyfile, provider_id, + MODEST_PRESETS_KEY_DOMAIN, + NULL); +} + + + -ModestPresetsInfo -modest_presets_get_info (ModestPresets *self, const gchar *provider, gboolean incoming_server) +ModestProtocolType +modest_presets_get_info_server_type (ModestPresets *self, + const gchar *provider_id, + gboolean incoming_server) { - ModestPresetsInfo info = 0; + ModestProtocolType protocol_type = MODEST_PROTOCOL_REGISTRY_TYPE_INVALID; + ModestProtocolRegistry *protocol_registry; + ModestProtocol *protocol; gchar *val = NULL; g_return_val_if_fail (self && self->keyfile, 0); + protocol_registry = modest_runtime_get_protocol_registry (); - val = g_key_file_get_string (self->keyfile, provider, - MODEST_PRESETS_KEY_INCOMING, NULL); - if (val) { - g_free (val); - val = g_key_file_get_string (self->keyfile, provider, - MODEST_PRESETS_KEY_MAILBOX_TYPE, NULL); - if (strcmp (val, MODEST_PRESETS_KEY_MAILBOX_TYPE_POP) == 0) - info |= MODEST_PRESETS_INFO_POP; - if (strcmp (val, MODEST_PRESETS_KEY_MAILBOX_TYPE_IMAP) == 0) - info |= MODEST_PRESETS_INFO_IMAP; + if (incoming_server) { + val = g_key_file_get_string (self->keyfile, provider_id, + MODEST_PRESETS_KEY_INCOMING, NULL); + if (!val) + return protocol_type; + g_free (val); + val = g_key_file_get_string (self->keyfile, provider_id, + MODEST_PRESETS_KEY_MAILBOX_TYPE,NULL); + + protocol = modest_protocol_registry_get_protocol_by_name (protocol_registry, MODEST_PROTOCOL_REGISTRY_STORE_PROTOCOLS, val); + if (protocol == NULL) + return protocol_type; + protocol_type = modest_protocol_get_type_id (protocol); + } else { + val = g_key_file_get_string (self->keyfile, provider_id, + MODEST_PRESETS_KEY_OUTGOING, NULL); + if (!val) + return protocol_type; - val = g_key_file_get_string (self->keyfile, provider, - MODEST_PRESETS_KEY_APOP, NULL); - if (val && strcmp(val, MODEST_PRESETS_KEY_TRUE) == 0) - info |= MODEST_PRESETS_INFO_APOP; - g_free(val); + protocol_type = MODEST_PROTOCOLS_TRANSPORT_SMTP; } - + g_free (val); - val = g_key_file_get_string (self->keyfile, provider, - MODEST_PRESETS_KEY_OUTGOING, NULL); - if (val) { - g_free (val); - info |= MODEST_PRESETS_INFO_SMTP; - - val = g_key_file_get_string (self->keyfile, provider, - MODEST_PRESETS_KEY_SECURE_SMTP, NULL); - if (val && strcmp(val,MODEST_PRESETS_KEY_TRUE) == 0) - info |= MODEST_PRESETS_INFO_SECURE_SMTP; - g_free(val); + /* debug: */ +/* g_message ("provider id: %s, server type: %d", provider_id, info); */ + return protocol_type; +} + + + +ModestProtocolType +modest_presets_get_info_server_security (ModestPresets *self, const gchar *provider_id, + gboolean incoming_server) +{ + ModestProtocolType protocol_type = MODEST_PROTOCOLS_CONNECTION_NONE; + gchar *val = NULL; + + g_return_val_if_fail (self && self->keyfile, MODEST_PROTOCOLS_CONNECTION_NONE); + + if (incoming_server) { + val = g_key_file_get_string (self->keyfile, provider_id, + MODEST_PRESETS_KEY_INCOMING, NULL); + if (val) { + g_free (val); + + val = g_key_file_get_string (self->keyfile, provider_id, + MODEST_PRESETS_KEY_INCOMING_SECURITY, NULL); + if (val && strcmp (val, "1") == 0) { + protocol_type = MODEST_PROTOCOLS_CONNECTION_TLS; + } else if (val && strcmp (val, "2") == 0) { + protocol_type = MODEST_PROTOCOLS_CONNECTION_SSL; + } else if (val && (strcmp (val, "tls") == 0)) { + protocol_type = MODEST_PROTOCOLS_CONNECTION_TLS; + } else if (val && (strcmp (val, "ssl") == 0)) { + protocol_type = MODEST_PROTOCOLS_CONNECTION_SSL; + } + g_free (val); + } + } else /* outgoing: */ { + val = g_key_file_get_string (self->keyfile, provider_id, + MODEST_PRESETS_KEY_OUTGOING, NULL); + if (val) { + g_free (val); + + val = g_key_file_get_string (self->keyfile, provider_id, + MODEST_PRESETS_KEY_SECURE_SMTP, NULL); + if (val && strcmp(val,"true") == 0) + protocol_type = MODEST_PROTOCOLS_CONNECTION_SSL; + else if (val && strcmp (val, "ssl") == 0) + protocol_type = MODEST_PROTOCOLS_CONNECTION_SSL; + else if (val && strcmp (val, "2") == 0) + protocol_type = MODEST_PROTOCOLS_CONNECTION_SSL; + else if (val && strcmp (val, "tls") == 0) + protocol_type = MODEST_PROTOCOLS_CONNECTION_TLS; + else if (val && strcmp (val, "1") == 0) + protocol_type = MODEST_PROTOCOLS_CONNECTION_TLS; + g_free(val); + } + } + + return protocol_type; +} + +gboolean +modest_presets_get_info_server_use_alternate_port (ModestPresets *self, const gchar *provider_id, + gboolean incoming_server) +{ + gboolean result = FALSE; + gchar *val = NULL; + + g_return_val_if_fail (self && self->keyfile, MODEST_PROTOCOLS_CONNECTION_NONE); + + if (incoming_server) { + val = g_key_file_get_string (self->keyfile, provider_id, + MODEST_PRESETS_KEY_INCOMING, NULL); + if (val) { + g_free (val); + + val = g_key_file_get_string (self->keyfile, provider_id, + MODEST_PRESETS_KEY_INCOMING_SECURITY, NULL); + if (val && (strcmp (val, "2") == 0)) { + result = TRUE; + } + g_free (val); + } + } + + return result; +} + +ModestProtocolType +modest_presets_get_info_server_auth (ModestPresets *self, const gchar *provider_id, + gboolean incoming_server) +{ + ModestProtocolType protocol_type = MODEST_PROTOCOLS_AUTH_NONE; + gchar *val = NULL; + + g_return_val_if_fail (self && self->keyfile, MODEST_PROTOCOLS_AUTH_NONE); + + if (incoming_server) { + val = g_key_file_get_string (self->keyfile, provider_id, + MODEST_PRESETS_KEY_INCOMING, NULL); + if (val) { + g_free (val); + val = g_key_file_get_string (self->keyfile, provider_id, + MODEST_PRESETS_KEY_APOP, NULL); + if (val && strcmp(val, "true") == 0) + protocol_type = MODEST_PROTOCOLS_AUTH_PASSWORD; + g_free(val); + + } + } else /* outgoing: */ { + val = g_key_file_get_string (self->keyfile, provider_id, + MODEST_PRESETS_KEY_OUTGOING, NULL); + if (val) { + g_free (val); + + val = g_key_file_get_string (self->keyfile, provider_id, + MODEST_PRESETS_KEY_SECURE_SMTP, NULL); + /* printf("debug: %s: provider_id=%s, secure-smtp val=%s\n", __FUNCTION__, provider_id, val); */ + if (val && strcmp(val,"true") == 0) + protocol_type = MODEST_PROTOCOLS_AUTH_PASSWORD; + g_free(val); + } } - return info; + return protocol_type; } + +/* + * at the moment, this only for mac.com, which have a special SMTP port + */ +guint +modest_presets_get_port (ModestPresets *self, const gchar* provider_id, + gboolean incoming_server) +{ + guint port; + g_return_val_if_fail (self && self->keyfile, 0); + + if (incoming_server) + port = 0; /* not used yet */ + else + port = (guint)g_key_file_get_integer (self->keyfile, provider_id, + MODEST_PRESETS_KEY_SMTP_PORT, NULL); + + return port; +} + + + + void modest_presets_destroy (ModestPresets *self) { - g_return_if_fail (self); + if (!self) + return; g_key_file_free (self->keyfile); self->keyfile = NULL;