aboutsummaryrefslogtreecommitdiffstats
path: root/mail/mail-config.c
diff options
context:
space:
mode:
Diffstat (limited to 'mail/mail-config.c')
-rw-r--r--mail/mail-config.c410
1 files changed, 339 insertions, 71 deletions
diff --git a/mail/mail-config.c b/mail/mail-config.c
index a59128b9f1..ef9185ecbd 100644
--- a/mail/mail-config.c
+++ b/mail/mail-config.c
@@ -77,12 +77,14 @@
#include "mail-tools.h"
/* Note, the first element of each MailConfigLabel must NOT be translated */
-MailConfigLabel label_defaults[5] = {
- { "important", N_("I_mportant"), "#EF2929" }, /* red */
- { "work", N_("_Work"), "#F57900" }, /* orange */
- { "personal", N_("_Personal"), "#4E9A06" }, /* green */
- { "todo", N_("_To Do"), "#3465A4" }, /* blue */
- { "later", N_("_Later"), "#75507B" } /* purple */
+/* Note, the label tag should Always starts with prefix "$Label"!
+ It's also because filters and search folders, so beware people. */
+MailConfigLabel label_defaults[LABEL_DEFAULTS_NUM] = {
+ { "$Labelimportant", N_("I_mportant"), "#EF2929" }, /* red */
+ { "$Labelwork", N_("_Work"), "#F57900" }, /* orange */
+ { "$Labelpersonal", N_("_Personal"), "#4E9A06" }, /* green */
+ { "$Labeltodo", N_("_To Do"), "#3465A4" }, /* blue */
+ { "$Labellater", N_("_Later"), "#75507B" } /* purple */
};
typedef struct {
@@ -163,75 +165,95 @@ config_clear_labels (void)
static void
config_cache_labels (void)
{
- GSList *labels, *list, *tail, *n;
+ GSList *labels, *list, *head;
MailConfigLabel *label;
- char *buf, *colour;
+ char *buf;
int num = 0;
- tail = labels = NULL;
+ labels = NULL;
- list = gconf_client_get_list (config->gconf, "/apps/evolution/mail/labels", GCONF_VALUE_STRING, NULL);
+ head = gconf_client_get_list (config->gconf, "/apps/evolution/mail/labels", GCONF_VALUE_STRING, NULL);
- while (list != NULL) {
- buf = list->data;
-
- if (num < 5 && (colour = strrchr (buf, ':'))) {
- label = g_new (MailConfigLabel, 1);
-
- *colour++ = '\0';
- label->tag = g_strdup(label_defaults[num].tag);
-
- /* Don't translate an empty string */
- if (buf == NULL || buf[0] == '\0')
- label->name = g_strdup (_("Unnamed"));
- else
- label->name = g_strdup (_(buf));
-
- label->colour = g_strdup (colour);
+ for (list = head; list; list = list->next) {
+ char *color, *name, *tag;
+ name = buf = list->data;
+ color = strrchr (buf, ':');
- n = g_slist_alloc ();
- n->next = NULL;
- n->data = label;
+ *color++ = '\0';
+ tag = strchr (color, '|');
+ if (tag)
+ *tag++ = '\0';
- if (tail == NULL)
- labels = n;
- else
- tail->next = n;
-
- tail = n;
+ label = g_new (MailConfigLabel, 1);
+ /* Needed for Backward Compatibility */
+ if (num < LABEL_DEFAULTS_NUM) {
+ label->name = g_strdup (_(buf));
+ label->tag = g_strdup (label_defaults[num].tag);
num++;
+ } else if (!tag) {
+ g_free (buf);
+ g_free (label);
+ continue;
+ } else {
+ label->name = g_strdup (name);
+ label->tag = g_strdup (tag);
}
- g_free (buf);
+ label->colour = g_strdup (color);
+ labels = g_slist_prepend (labels, label);
- n = list->next;
- g_slist_free_1 (list);
- list = n;
+ g_free (buf);
}
- while (num < 5) {
+ if (head)
+ g_slist_free (head);
+
+ while (num < LABEL_DEFAULTS_NUM) {
/* complete the list with defaults */
label = g_new (MailConfigLabel, 1);
label->tag = g_strdup (label_defaults[num].tag);
label->name = g_strdup (_(label_defaults[num].name));
label->colour = g_strdup (label_defaults[num].colour);
- n = g_slist_alloc ();
- n->next = NULL;
- n->data = label;
+ labels = g_slist_prepend (labels, label);
- if (tail == NULL)
- labels = n;
- else
- tail->next = n;
+ num++;
+ }
- tail = n;
+ config->labels = g_slist_reverse (labels);
+}
- num++;
+/* stores the actual cache to gconf */
+static gboolean
+config_cache_labels_flush (void)
+{
+ GSList *l, *text_labels;
+
+ if (!config || !config->labels)
+ return FALSE;
+
+ text_labels = NULL;
+
+ for (l = config->labels; l; l = l->next) {
+ MailConfigLabel *label = l->data;
+
+ if (label && label->tag && label->name && label->colour)
+ text_labels = g_slist_prepend (text_labels, g_strdup_printf ("%s:%s|%s", label->name, label->colour, label->tag));
}
- config->labels = labels;
+ if (!text_labels)
+ return FALSE;
+
+ text_labels = g_slist_reverse (text_labels);
+
+ gconf_client_set_list (config->gconf, "/apps/evolution/mail/labels", GCONF_VALUE_STRING, text_labels, NULL);
+
+ g_slist_foreach (text_labels, (GFunc)g_free, NULL);
+ g_slist_free (text_labels);
+
+ /* not true if gconf failed to write; who cares */
+ return TRUE;
}
static void
@@ -587,12 +609,6 @@ mail_config_is_corrupt (void)
return config->corrupt;
}
-GSList *
-mail_config_get_labels (void)
-{
- return config->labels;
-}
-
int
mail_config_get_address_count (void)
{
@@ -635,36 +651,288 @@ mail_config_get_enable_magic_spacebar ()
return config->magic_spacebar;
}
-const char *
-mail_config_get_label_color_by_name (const char *name)
+/* public Label functions */
+
+/**
+ * config_get_label
+ *
+ * Looks for label in labels cache by tag and returns actual pointer to cache.
+ * @param tag Tag of label you are looking for.
+ * @return Pointer to cache data if label with such tag exists or NULL. Do not free it!
+ **/
+static MailConfigLabel *
+config_get_label (const char *tag)
{
- MailConfigLabel *label;
- GSList *node;
-
- node = config->labels;
- while (node != NULL) {
- label = node->data;
- if (!strcmp (label->tag, name))
- return label->colour;
- node = node->next;
+ GSList *l;
+
+ g_return_val_if_fail (tag != NULL, NULL);
+
+ for (l = config->labels; l; l = l->next) {
+ MailConfigLabel *label = l->data;
+
+ if (label && label->tag && !strcmp (tag, label->tag))
+ return label;
}
return NULL;
}
+/**
+ * mail_config_get_labels
+ *
+ * @return list of known labels, each member data is MailConfigLabel structure.
+ * Returned list should not be freed, neither data inside it.
+ **/
+GSList *
+mail_config_get_labels (void)
+{
+ return config->labels;
+}
+
+/**
+ * mail_config_get_next_label_tag
+ *
+ * @param id [out] if not NULL, then assigned used number of the next free tag.
+ * @return Next free tag, which can be used for new label.
+ * Returned pointer should be freed with g_free.
+ *
+ * @note All labels should always start with "$Label" string, it's very important
+ * for filters and search folders!
+ **/
+char *
+mail_config_get_next_label_tag (int *id)
+{
+ char *tag = NULL;
+ int count = LABEL_DEFAULTS_NUM;
+
+ /* who wants more than 100 labels? */
+ while (!tag && count <= 100) {
+ count++;
+ tag = g_strdup_printf ("$Label%d", count);
+
+ if (config_get_label (tag)) {
+ g_free (tag);
+ tag = NULL;
+ }
+ }
+
+ if (id)
+ *id = count;
+
+ return tag;
+}
+
+/**
+ * mail_config_is_system_label
+ *
+ * @return Whether the tag is one of default/system labels or not.
+ **/
+gboolean
+mail_config_is_system_label (const char *tag)
+{
+ int i;
+
+ if (!tag)
+ return FALSE;
+
+ for (i = 0; i < LABEL_DEFAULTS_NUM; i++) {
+ if (strcmp (tag, label_defaults[i].tag) == 0)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/**
+ * mail_config_add_label
+ * Creates new label at the end of actual list of labels.
+ *
+ * @param tag Unique identifier of this new label.
+ * @param name User readable name of this label. Should not be NULL.
+ * @param color Color assigned to this label. Should not be NULL.
+ * @return Whether was added.
+ **/
+gboolean
+mail_config_add_label (const char *tag, const char *name, const GdkColor *color)
+{
+ MailConfigLabel *label;
+
+ g_return_val_if_fail (tag != NULL, FALSE);
+ g_return_val_if_fail (name != NULL, FALSE);
+ g_return_val_if_fail (color != NULL, FALSE);
+
+ if (config_get_label (tag) != NULL)
+ return FALSE;
+
+ label = g_new0 (MailConfigLabel, 1);
+ label->tag = g_strdup (tag);
+ label->name = g_strdup (name);
+ label->colour = gdk_color_to_string (color);
+
+ config->labels = g_slist_append (config->labels, label);
+
+ return config_cache_labels_flush ();
+}
+
+/**
+ * mail_config_remove_label
+ *
+ * @param tag Tag of the label to remove.
+ * @return Whether was removed.
+ **/
+gboolean
+mail_config_remove_label (const char *tag)
+{
+ MailConfigLabel *label;
+
+ g_return_val_if_fail (tag != NULL, FALSE);
+
+ label = config_get_label (tag);
+ if (!label)
+ return FALSE;
+
+ config->labels = g_slist_remove (config->labels, label);
+
+ g_free (label);
+
+ return config_cache_labels_flush ();
+}
+
+/**
+ * mail_config_get_label_name
+ *
+ * @param tag Tag of the label of our interest.
+ * @return Name of the label with that tag or NULL, if no such label exists.
+ **/
const char *
-mail_config_get_label_color_by_index (int index)
+mail_config_get_label_name (const char *tag)
+{
+ MailConfigLabel *label;
+
+ g_return_val_if_fail (tag != NULL, NULL);
+
+ label = config_get_label (tag);
+ if (!label)
+ return NULL;
+
+ return label->name;
+}
+
+/**
+ * mail_config_get_label_color
+ *
+ * @param tag Tag of the label of our interest.
+ * @param color [out] Actual color of the label with that tag, or unchanged if failed.
+ * @return Whether found such label and color has been set.
+ **/
+gboolean
+mail_config_get_label_color (const char *tag, GdkColor *color)
{
MailConfigLabel *label;
- label = g_slist_nth_data (config->labels, index);
+ g_return_val_if_fail (tag != NULL, FALSE);
+ g_return_val_if_fail (color != NULL, FALSE);
- if (label)
- return label->colour;
+ label = config_get_label (tag);
+ if (!label)
+ return FALSE;
+
+ return gdk_color_parse (label->colour, color);
+}
+
+/**
+ * mail_config_get_label_color_str
+ *
+ * @param tag Tag of the label of our interest.
+ * @return String representation of that label, or NULL, is no such label exists.
+ **/
+const char *
+mail_config_get_label_color_str (const char *tag)
+{
+ MailConfigLabel *label;
+
+ g_return_val_if_fail (tag != NULL, FALSE);
+
+ label = config_get_label (tag);
+ if (!label)
+ return FALSE;
+
+ return label->colour;
+}
+
+/**
+ * mail_config_get_new_label_tag
+ *
+ * @param old_tag Tag of the label from old version of Evolution.
+ * @return New tag name equivalent with the old tag, or NULL if no such name existed before.
+ **/
+const char *
+mail_config_get_new_label_tag (const char *old_tag)
+{
+ int i;
+
+ if (!old_tag)
+ return NULL;
+
+ for (i = 0; i < LABEL_DEFAULTS_NUM; i++) {
+ /* default labels have same name as those old, only with prefix "$Label" */
+ if (!strcmp (old_tag, label_defaults[i].tag + 6))
+ return label_defaults[i].tag;
+ }
return NULL;
}
+/**
+ * mail_config_set_label_name
+ *
+ * @param tag Tag of the label of our interest.
+ * @param name New name for the label.
+ * @return Whether successfully saved.
+ **/
+gboolean
+mail_config_set_label_name (const char *tag, const char *name)
+{
+ MailConfigLabel *label;
+
+ g_return_val_if_fail (tag != NULL, FALSE);
+ g_return_val_if_fail (name != NULL, FALSE);
+
+ label = config_get_label (tag);
+ if (!label)
+ return FALSE;
+
+ g_free (label->name);
+ label->name = g_strdup (name);
+
+ return config_cache_labels_flush ();
+}
+
+/**
+ * mail_config_set_label_color
+ *
+ * @param tag Tag of the label of our interest.
+ * @param color New color for the label.
+ * @return Whether successfully saved.
+ **/
+gboolean
+mail_config_set_label_color (const char *tag, const GdkColor *color)
+{
+ MailConfigLabel *label;
+
+ g_return_val_if_fail (tag != NULL, FALSE);
+ g_return_val_if_fail (color != NULL, FALSE);
+
+ label = config_get_label (tag);
+ if (!label)
+ return FALSE;
+
+ g_free (label->colour);
+ label->colour = gdk_color_to_string (color);
+
+ return config_cache_labels_flush ();
+}
+
const char **
mail_config_get_allowable_mime_types (void)
{