* fix for the crash in NB#74605
[modest] / src / modest-protocol-info.c
index 125c418..a771c01 100644 (file)
 #include <string.h> /* strcmp */
 #include <modest-protocol-info.h>
 #include <modest-pair.h>
-
+#include <modest-defs.h>
+#include <modest-text-utils.h>
 
 typedef struct {
-       ModestProtocol   proto;
+       gint   proto;
        const gchar*     name;
        const gchar*     display_name;
 } ProtocolInfo;
 
-static const ProtocolInfo ProtocolMap[] = {
+static const ProtocolInfo TransportStoreProtocolMap[] = {
        { MODEST_PROTOCOL_TRANSPORT_SENDMAIL, "sendmail", N_("Sendmail") },
        { MODEST_PROTOCOL_TRANSPORT_SMTP,     "smtp",     N_("SMTP Server") },
        
        { MODEST_PROTOCOL_STORE_POP,          "pop",      N_("POP3") },
        { MODEST_PROTOCOL_STORE_IMAP,         "imap",     N_("IMAPv4") },
        { MODEST_PROTOCOL_STORE_MAILDIR,      "maildir",  N_("Maildir") },
-       { MODEST_PROTOCOL_STORE_MBOX,         "mbox",     N_("MBox") },     
-
-       { MODEST_PROTOCOL_SECURITY_SSL,       "ssl",      N_("SSL") },   
-       { MODEST_PROTOCOL_SECURITY_TLS,       "tls",      N_("TLS") },
+       { MODEST_PROTOCOL_STORE_MBOX,         "mbox",     N_("MBox") }
+};
 
-       { MODEST_PROTOCOL_AUTH_NONE,          "none",     N_("none") },
-       { MODEST_PROTOCOL_AUTH_PASSWORD,      "password", N_("Password") }
+static const ProtocolInfo ConnectionProtocolMap[] = {
+       { MODEST_PROTOCOL_CONNECTION_NORMAL,    "none",     N_("None") },   
+       { MODEST_PROTOCOL_CONNECTION_SSL,       "ssl",      N_("SSL") },   
+       { MODEST_PROTOCOL_CONNECTION_TLS,       "tls",      N_("TLS") },
+       { MODEST_PROTOCOL_CONNECTION_TLS_OP,    "tls-op",   N_("TLS when possible") }
+       /* op stands for optional */
 };
-const guint PROTOCOL_MAP_SIZE = sizeof(ProtocolMap)/sizeof(ProtocolInfo);
 
 
-GSList*
-modest_protocol_info_get_protocol_list (ModestProtocolType type)
+/* FIXME: these names must match those of tny_camel_account_get_supported_secure_auth */
+static const ProtocolInfo AuthProtocolMap[] = {
+       { MODEST_PROTOCOL_AUTH_NONE,          MODEST_ACCOUNT_AUTH_MECH_VALUE_NONE,     N_("None") },
+       { MODEST_PROTOCOL_AUTH_PASSWORD,      MODEST_ACCOUNT_AUTH_MECH_VALUE_PASSWORD, N_("Password") },
+       { MODEST_PROTOCOL_AUTH_CRAMMD5,       MODEST_ACCOUNT_AUTH_MECH_VALUE_CRAMMD5, N_("Cram MD5") }
+};
+
+static ModestPairList*
+get_protocol_pair_list (const ProtocolInfo* map, guint size)
 {
-       GSList *proto_list = NULL;
+       g_return_val_if_fail (map, NULL);
+
+       ModestPairList *proto_list = NULL;      
        int i;
-       
-       g_return_val_if_fail (type > MODEST_PROTOCOL_TYPE_UNKNOWN &&
-                             type < MODEST_PROTOCOL_TYPE_NUM,
-                             NULL);
-               
-       for (i = 0; i != PROTOCOL_MAP_SIZE; ++i) {
-               ProtocolInfo info = (ProtocolInfo)ProtocolMap[i];
-               if (modest_protocol_info_get_protocol_type(info.proto) == type)
-                       proto_list = g_slist_append (proto_list, GINT_TO_POINTER(info.proto));
+       for (i = 0; i != size; ++i) {
+               const ProtocolInfo info = map[i];
+               proto_list = g_slist_append (proto_list,
+                                            (gpointer)modest_pair_new(
+                                                    (gpointer)info.name,
+                                                    (gpointer)info.display_name,
+                                                    FALSE));                   
        }
        return proto_list;
 }
 
+static gint
+get_protocol_by_name (const ProtocolInfo* map,
+                      guint size,
+                      const gchar* query_name,
+                      gint default_value,
+                      gboolean case_sensitive)
+{
+       guint i;
 
+       g_return_val_if_fail (map, default_value);
+       g_return_val_if_fail (query_name, default_value);
+       
+       for(i = 0; i < size; ++i)
+               if (modest_text_utils_utf8_strcmp (map[i].name, query_name,
+                                                  !case_sensitive) == 0)
+                       return map[i].proto;
+       
+       return default_value;
+}
 
 ModestPairList*
-modest_protocol_info_get_protocol_pair_list (ModestProtocolType type)
+modest_protocol_info_get_transport_store_protocol_pair_list (void)
 {
-       ModestPairList *proto_list = NULL;
-       int i;
-       
-       g_return_val_if_fail (type > MODEST_PROTOCOL_TYPE_UNKNOWN && type < MODEST_PROTOCOL_TYPE_NUM,
-                             NULL);
-
-       for (i = 0; i != PROTOCOL_MAP_SIZE; ++i) {
-               ProtocolInfo info = (ProtocolInfo)ProtocolMap[i];
-               if (modest_protocol_info_get_protocol_type(info.proto) == type)
-                       proto_list = g_slist_append (proto_list,
-                                                    (gpointer)modest_pair_new(
-                                                            (gpointer)info.name,
-                                                            (gpointer)info.display_name,
-                                                            FALSE));                   
-       }
-       return proto_list;
+       return get_protocol_pair_list (TransportStoreProtocolMap,
+               G_N_ELEMENTS(TransportStoreProtocolMap));
 }
 
-
-ModestProtocolType
-modest_protocol_info_get_protocol_type (ModestProtocol proto)
+ModestPairList*
+modest_protocol_info_get_auth_protocol_pair_list (void)
 {
-       switch (proto) {
-       case MODEST_PROTOCOL_TRANSPORT_SENDMAIL:
-       case MODEST_PROTOCOL_TRANSPORT_SMTP:
-               return MODEST_PROTOCOL_TYPE_TRANSPORT;
-               
-       case MODEST_PROTOCOL_STORE_POP:
-       case MODEST_PROTOCOL_STORE_IMAP:
-       case MODEST_PROTOCOL_STORE_MAILDIR:
-       case MODEST_PROTOCOL_STORE_MBOX:
-               return MODEST_PROTOCOL_TYPE_STORE;
-
-       case MODEST_PROTOCOL_SECURITY_SSL:   
-       case MODEST_PROTOCOL_SECURITY_TLS:
-               return MODEST_PROTOCOL_TYPE_SECURITY;
-
-       case MODEST_PROTOCOL_AUTH_NONE:
-       case MODEST_PROTOCOL_AUTH_PASSWORD:
-               return MODEST_PROTOCOL_TYPE_AUTH;
-               
-       default:
-               return MODEST_PROTOCOL_TYPE_UNKNOWN;
-       }
+       return get_protocol_pair_list (AuthProtocolMap,
+               G_N_ELEMENTS(AuthProtocolMap));
 }
 
-
-ModestProtocol
-modest_protocol_info_get_protocol (const gchar* name)
+ModestPairList*
+modest_protocol_info_get_connection_protocol_pair_list (void)
 {
-       int i;
-       g_return_val_if_fail (name, MODEST_PROTOCOL_UNKNOWN);
-
-       for (i = 0; i != PROTOCOL_MAP_SIZE; ++i) {
-               ProtocolInfo info = (ProtocolInfo)ProtocolMap[i];
-               if (strcmp(name, info.name) == 0)
-                       return info.proto;
-       }
+       return get_protocol_pair_list (ConnectionProtocolMap,
+               G_N_ELEMENTS(ConnectionProtocolMap));
+}
        
-       return MODEST_PROTOCOL_UNKNOWN;
+ModestTransportStoreProtocol
+modest_protocol_info_get_transport_store_protocol (const gchar* name)
+{
+       g_return_val_if_fail (name, MODEST_PROTOCOL_TRANSPORT_STORE_UNKNOWN);
+       
+       return get_protocol_by_name(TransportStoreProtocolMap,
+                                   G_N_ELEMENTS(TransportStoreProtocolMap),
+                                   name,
+                                   MODEST_PROTOCOL_TRANSPORT_STORE_UNKNOWN,
+                                   TRUE);
 }
 
-
+ModestAuthProtocol
+modest_protocol_info_get_auth_protocol (const gchar* name)
+{
+       g_return_val_if_fail (name, MODEST_PROTOCOL_AUTH_NONE);
+       
+       return get_protocol_by_name(AuthProtocolMap,
+                                   G_N_ELEMENTS(AuthProtocolMap),
+                                   name,
+                                   MODEST_PROTOCOL_AUTH_NONE,
+                                   FALSE);
+}
 
 
 /* get either the name or the display_name for the protocol */
 static const gchar*
-get_protocol_string (ModestProtocol proto, gboolean get_name)
+get_protocol_string (gint proto, const ProtocolInfo* map, guint size, gboolean get_name)
 {
-       int i;
-       g_return_val_if_fail (modest_protocol_info_get_protocol_type(proto) !=
-                             MODEST_PROTOCOL_TYPE_UNKNOWN, NULL);
+       g_return_val_if_fail (map, NULL);
        
-       for (i = 0; i != PROTOCOL_MAP_SIZE; ++i) {
-               ProtocolInfo info = (ProtocolInfo)ProtocolMap[i];
+       int i;
+       for (i = 0; i != size; ++i) {
+               ProtocolInfo info = map[i];
                if (info.proto == proto)
                        return get_name ? info.name : info.display_name;        
        }
@@ -162,27 +166,50 @@ get_protocol_string (ModestProtocol proto, gboolean get_name)
 }
 
 const gchar*
-modest_protocol_info_get_protocol_name (ModestProtocol proto)
+modest_protocol_info_get_transport_store_protocol_name (ModestTransportStoreProtocol proto)
 {
-       return get_protocol_string (proto, TRUE);
+       return get_protocol_string (proto, TransportStoreProtocolMap,
+               G_N_ELEMENTS(TransportStoreProtocolMap), TRUE);
 }
 
+const gchar*
+modest_protocol_info_get_auth_protocol_name (ModestAuthProtocol proto)
+{
+       return get_protocol_string (proto, AuthProtocolMap,
+               G_N_ELEMENTS(AuthProtocolMap), TRUE);
+}
 
 const gchar*
-modest_protocol_info_get_protocol_display_name (ModestProtocol proto)
+modest_protocol_info_get_connection_protocol_name (ModestAuthProtocol proto)
 {
-       return get_protocol_string (proto, FALSE);
+       return get_protocol_string (proto, ConnectionProtocolMap,
+               G_N_ELEMENTS(ConnectionProtocolMap), TRUE);
 }
 
 
 gboolean
-modest_protocol_info_protocol_is_local_store (ModestProtocol proto)
+modest_protocol_info_protocol_is_local_store (ModestTransportStoreProtocol proto)
 {
-       g_return_val_if_fail (modest_protocol_info_get_protocol_type (proto) !=
-                             MODEST_PROTOCOL_TYPE_UNKNOWN, FALSE);
-
-       /* may add MH later */
        return proto == MODEST_PROTOCOL_STORE_MBOX || proto == MODEST_PROTOCOL_STORE_MAILDIR;
 }
 
 
+
+gboolean
+modest_protocol_info_protocol_is_store (ModestTransportStoreProtocol proto)
+{
+       return proto == MODEST_PROTOCOL_STORE_MBOX || proto == MODEST_PROTOCOL_STORE_MAILDIR ||
+               proto == MODEST_PROTOCOL_STORE_POP || proto == MODEST_PROTOCOL_STORE_IMAP;
+}
+
+gboolean
+modest_protocol_info_is_secure(ModestConnectionProtocol protocol)
+{
+       return (protocol == MODEST_PROTOCOL_CONNECTION_SSL ||
+                                       protocol == MODEST_PROTOCOL_CONNECTION_TLS);
+}
+
+gboolean modest_protocol_info_auth_is_secure(ModestAuthProtocol protocol)
+{
+       return (protocol == MODEST_PROTOCOL_AUTH_CRAMMD5);
+}