/* * e-source-mail-identity.c * * This library is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library. If not, see . * */ /** * SECTION: e-source-mail-identity * @include: libedataserver/libedataserver.h * @short_description: #ESource extension for an email identity * * The #ESourceMailIdentity extension describes an "identity" for a mail * account, which is the information that other people see when they read * your messages. * * Access the extension as follows: * * |[ * #include * * ESourceMailIdentity *extension; * * extension = e_source_get_extension (source, E_SOURCE_EXTENSION_MAIL_IDENTITY); * ]| **/ #include "evolution-data-server-config.h" #include "camel/camel.h" #include "e-data-server-util.h" #include "e-source-mail-identity.h" struct _ESourceMailIdentityPrivate { gchar *address; gchar *name; gchar *organization; gchar *reply_to; gchar *signature_uid; gchar *aliases; }; enum { PROP_0, PROP_ADDRESS, PROP_ALIASES, PROP_NAME, PROP_ORGANIZATION, PROP_REPLY_TO, PROP_SIGNATURE_UID }; G_DEFINE_TYPE_WITH_PRIVATE ( ESourceMailIdentity, e_source_mail_identity, E_TYPE_SOURCE_EXTENSION) static void source_mail_identity_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { switch (property_id) { case PROP_ADDRESS: e_source_mail_identity_set_address ( E_SOURCE_MAIL_IDENTITY (object), g_value_get_string (value)); return; case PROP_ALIASES: e_source_mail_identity_set_aliases ( E_SOURCE_MAIL_IDENTITY (object), g_value_get_string (value)); return; case PROP_NAME: e_source_mail_identity_set_name ( E_SOURCE_MAIL_IDENTITY (object), g_value_get_string (value)); return; case PROP_ORGANIZATION: e_source_mail_identity_set_organization ( E_SOURCE_MAIL_IDENTITY (object), g_value_get_string (value)); return; case PROP_REPLY_TO: e_source_mail_identity_set_reply_to ( E_SOURCE_MAIL_IDENTITY (object), g_value_get_string (value)); return; case PROP_SIGNATURE_UID: e_source_mail_identity_set_signature_uid ( E_SOURCE_MAIL_IDENTITY (object), g_value_get_string (value)); return; } G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } static void source_mail_identity_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { switch (property_id) { case PROP_ADDRESS: g_value_take_string ( value, e_source_mail_identity_dup_address ( E_SOURCE_MAIL_IDENTITY (object))); return; case PROP_ALIASES: g_value_take_string ( value, e_source_mail_identity_dup_aliases ( E_SOURCE_MAIL_IDENTITY (object))); return; case PROP_NAME: g_value_take_string ( value, e_source_mail_identity_dup_name ( E_SOURCE_MAIL_IDENTITY (object))); return; case PROP_ORGANIZATION: g_value_take_string ( value, e_source_mail_identity_dup_organization ( E_SOURCE_MAIL_IDENTITY (object))); return; case PROP_REPLY_TO: g_value_take_string ( value, e_source_mail_identity_dup_reply_to ( E_SOURCE_MAIL_IDENTITY (object))); return; case PROP_SIGNATURE_UID: g_value_take_string ( value, e_source_mail_identity_dup_signature_uid ( E_SOURCE_MAIL_IDENTITY (object))); return; } G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } static void source_mail_identity_finalize (GObject *object) { ESourceMailIdentityPrivate *priv; priv = E_SOURCE_MAIL_IDENTITY (object)->priv; g_free (priv->address); g_free (priv->name); g_free (priv->organization); g_free (priv->reply_to); g_free (priv->signature_uid); g_free (priv->aliases); /* Chain up to parent's finalize() method. */ G_OBJECT_CLASS (e_source_mail_identity_parent_class)->finalize (object); } static void e_source_mail_identity_class_init (ESourceMailIdentityClass *class) { GObjectClass *object_class; ESourceExtensionClass *extension_class; object_class = G_OBJECT_CLASS (class); object_class->set_property = source_mail_identity_set_property; object_class->get_property = source_mail_identity_get_property; object_class->finalize = source_mail_identity_finalize; extension_class = E_SOURCE_EXTENSION_CLASS (class); extension_class->name = E_SOURCE_EXTENSION_MAIL_IDENTITY; g_object_class_install_property ( object_class, PROP_ADDRESS, g_param_spec_string ( "address", "Address", "Sender's email address", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS | E_SOURCE_PARAM_SETTING)); g_object_class_install_property ( object_class, PROP_ALIASES, g_param_spec_string ( "aliases", "Aliases", "Sender's email address aliases", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS | E_SOURCE_PARAM_SETTING)); g_object_class_install_property ( object_class, PROP_NAME, g_param_spec_string ( "name", "Name", "Sender's name", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS | E_SOURCE_PARAM_SETTING)); g_object_class_install_property ( object_class, PROP_ORGANIZATION, g_param_spec_string ( "organization", "Organization", "Sender's organization", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS | E_SOURCE_PARAM_SETTING)); g_object_class_install_property ( object_class, PROP_REPLY_TO, g_param_spec_string ( "reply-to", "Reply-To", "Sender's reply-to address", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS | E_SOURCE_PARAM_SETTING)); g_object_class_install_property ( object_class, PROP_SIGNATURE_UID, g_param_spec_string ( "signature-uid", "Signature UID", "ESource UID of the sender's signature", "none", G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS | E_SOURCE_PARAM_SETTING)); } static void e_source_mail_identity_init (ESourceMailIdentity *extension) { extension->priv = e_source_mail_identity_get_instance_private (extension); } /** * e_source_mail_identity_get_address: * @extension: an #ESourceMailIdentity * * Returns the email address for this identity from which to send messages. * This may be an empty string but will never be %NULL. * * Returns: (nullable): the sender's email address * * Since: 3.6 **/ const gchar * e_source_mail_identity_get_address (ESourceMailIdentity *extension) { g_return_val_if_fail (E_IS_SOURCE_MAIL_IDENTITY (extension), NULL); return extension->priv->address; } /** * e_source_mail_identity_dup_address: * @extension: an #ESourceMailIdentity * * Thread-safe variation of e_source_mail_identity_get_address(). * Use this function when accessing @extension from multiple threads. * * The returned string should be freed with g_free() when no longer needed. * * Returns: (nullable): a newly-allocated copy of #ESourceMailIdentity:address * * Since: 3.6 **/ gchar * e_source_mail_identity_dup_address (ESourceMailIdentity *extension) { const gchar *protected; gchar *duplicate; g_return_val_if_fail (E_IS_SOURCE_MAIL_IDENTITY (extension), NULL); e_source_extension_property_lock (E_SOURCE_EXTENSION (extension)); protected = e_source_mail_identity_get_address (extension); duplicate = g_strdup (protected); e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); return duplicate; } /** * e_source_mail_identity_set_address: * @extension: an #ESourceMailIdentity * @address: (nullable): the sender's email address, or %NULL * * Sets the email address for this identity from which to send messages. * * The internal copy of @address is automatically stripped of leading and * trailing whitespace. If the resulting string is empty, %NULL is set * instead. * * Since: 3.6 **/ void e_source_mail_identity_set_address (ESourceMailIdentity *extension, const gchar *address) { g_return_if_fail (E_IS_SOURCE_MAIL_IDENTITY (extension)); e_source_extension_property_lock (E_SOURCE_EXTENSION (extension)); if (e_util_strcmp0 (extension->priv->address, address) == 0) { e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); return; } g_free (extension->priv->address); extension->priv->address = e_util_strdup_strip (address); e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); g_object_notify (G_OBJECT (extension), "address"); } /** * e_source_mail_identity_get_name: * @extension: an #ESourceMailIdentity * * Returns the sender's name for this identity. * * Returns: (nullable): the sender's name * * Since: 3.6 **/ const gchar * e_source_mail_identity_get_name (ESourceMailIdentity *extension) { g_return_val_if_fail (E_IS_SOURCE_MAIL_IDENTITY (extension), NULL); return extension->priv->name; } /** * e_source_mail_identity_dup_name: * @extension: an #ESourceMailIdentity * * Thread-safe variation of e_source_mail_identity_get_name(). * Use this function when accessing @extension from multiple threads. * * The returned string should be freed with g_free() when no longer needed. * * Returns: (nullable): a newly-allocated copy of #ESourceMailIdentity:name * * Since: 3.6 **/ gchar * e_source_mail_identity_dup_name (ESourceMailIdentity *extension) { const gchar *protected; gchar *duplicate; g_return_val_if_fail (E_IS_SOURCE_MAIL_IDENTITY (extension), NULL); e_source_extension_property_lock (E_SOURCE_EXTENSION (extension)); protected = e_source_mail_identity_get_name (extension); duplicate = g_strdup (protected); e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); return duplicate; } /** * e_source_mail_identity_set_name: * @extension: an #ESourceMailIdentity * @name: (nullable): the sender's name, or %NULL * * Sets the sender's name for this identity. * * The internal copy of @name is automatically stripped of leading and * trailing whitespace. * * Since: 3.6 **/ void e_source_mail_identity_set_name (ESourceMailIdentity *extension, const gchar *name) { g_return_if_fail (E_IS_SOURCE_MAIL_IDENTITY (extension)); e_source_extension_property_lock (E_SOURCE_EXTENSION (extension)); if (e_util_strcmp0 (extension->priv->name, name) == 0) { e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); return; } g_free (extension->priv->name); extension->priv->name = e_util_strdup_strip (name); e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); g_object_notify (G_OBJECT (extension), "name"); } /** * e_source_mail_identity_get_organization: * @extension: an #ESourceMailIdentity * * Returns the sender's organization for this identity. * * Returns: (nullable): the sender's organization * * Since: 3.6 **/ const gchar * e_source_mail_identity_get_organization (ESourceMailIdentity *extension) { g_return_val_if_fail (E_IS_SOURCE_MAIL_IDENTITY (extension), NULL); return extension->priv->organization; } /** * e_source_mail_identity_dup_organization: * @extension: an #ESourceMailIdentity * * Thread-safe variation of e_source_mail_identity_dup_organization(). * Use this function when accessing @extension from multiple threads. * * The returned string should be freed with g_free() when no longer needed. * * Returns: (nullable): a newly-allocated copy of #ESourceMailIdentity:organization * * Since: 3.6 **/ gchar * e_source_mail_identity_dup_organization (ESourceMailIdentity *extension) { const gchar *protected; gchar *duplicate; g_return_val_if_fail (E_IS_SOURCE_MAIL_IDENTITY (extension), NULL); e_source_extension_property_lock (E_SOURCE_EXTENSION (extension)); protected = e_source_mail_identity_get_organization (extension); duplicate = g_strdup (protected); e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); return duplicate; } /** * e_source_mail_identity_set_organization: * @extension: an #ESourceMailIdentity * @organization: (nullable): the sender's organization, or %NULL * * Sets the sender's organization for this identity. * * The internal copy of @organization is automatically stripped of leading * and trailing whitespace. If the resulting string is empty, %NULL is set * instead. * * Since: 3.6 **/ void e_source_mail_identity_set_organization (ESourceMailIdentity *extension, const gchar *organization) { g_return_if_fail (E_IS_SOURCE_MAIL_IDENTITY (extension)); e_source_extension_property_lock (E_SOURCE_EXTENSION (extension)); if (e_util_strcmp0 (extension->priv->organization, organization) == 0) { e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); return; } g_free (extension->priv->organization); extension->priv->organization = e_util_strdup_strip (organization); e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); g_object_notify (G_OBJECT (extension), "organization"); } /** * e_source_mail_identity_get_reply_to: * @extension: an #ESourceMailIdentity * * Returns the email address for this identity to which recipients should * send replies. * * Returns: (nullable): the sender's reply-to address * * Since: 3.6 **/ const gchar * e_source_mail_identity_get_reply_to (ESourceMailIdentity *extension) { g_return_val_if_fail (E_IS_SOURCE_MAIL_IDENTITY (extension), NULL); return extension->priv->reply_to; } /** * e_source_mail_identity_dup_reply_to: * @extension: an #ESourceMailIdentity * * Thread-safe variation of e_source_mail_identity_get_reply_to(). * Use this function when accessing @extension from multiple threads. * * The returned string should be freed with g_free() when no longer needed. * * Returns: (nullable): a newly-allocated copy of #ESourceMailIdentity:reply-to * * Since: 3.6 **/ gchar * e_source_mail_identity_dup_reply_to (ESourceMailIdentity *extension) { const gchar *protected; gchar *duplicate; g_return_val_if_fail (E_IS_SOURCE_MAIL_IDENTITY (extension), NULL); e_source_extension_property_lock (E_SOURCE_EXTENSION (extension)); protected = e_source_mail_identity_get_reply_to (extension); duplicate = g_strdup (protected); e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); return duplicate; } /** * e_source_mail_identity_set_reply_to: * @extension: an #ESourceMailIdentity * @reply_to: (nullable): the sender's reply-to address, or %NULL * * Sets the email address for this identity to which recipients should * send replies. * * The internal copy of @reply_to is automatically stripped of leading * and trailing whitespace. If the resulting string is empty, %NULL is * set instead. * * Since: 3.6 **/ void e_source_mail_identity_set_reply_to (ESourceMailIdentity *extension, const gchar *reply_to) { g_return_if_fail (E_IS_SOURCE_MAIL_IDENTITY (extension)); e_source_extension_property_lock (E_SOURCE_EXTENSION (extension)); if (e_util_strcmp0 (extension->priv->reply_to, reply_to) == 0) { e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); return; } g_free (extension->priv->reply_to); extension->priv->reply_to = e_util_strdup_strip (reply_to); e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); g_object_notify (G_OBJECT (extension), "reply-to"); } /** * e_source_mail_identity_get_signature_uid: * @extension: an #ESourceMailIdentity * * Returns the #ESource:uid of an #ESource describing a mail signature. * * If the user does not want to use a signature for this identity, the * convention is to set the #ESourceMailIdentity:signature-uid property * to "none". * * Returns: (nullable): the sender's signature ID, or "none" * * Since: 3.6 **/ const gchar * e_source_mail_identity_get_signature_uid (ESourceMailIdentity *extension) { g_return_val_if_fail (E_IS_SOURCE_MAIL_IDENTITY (extension), NULL); return extension->priv->signature_uid; } /** * e_source_mail_identity_dup_signature_uid: * @extension: an #ESourceMailIdentity * * Thread-safe variation of e_source_mail_identity_get_signature_uid(). * Use this function when accessing @extension from multiple threads. * * The returned string should be freed with g_free() when no longer needed. * * Returns: (nullable): a newly-allocated copy of #ESourceMailIdentity:signature-uid * * Since: 3.6 **/ gchar * e_source_mail_identity_dup_signature_uid (ESourceMailIdentity *extension) { const gchar *protected; gchar *duplicate; g_return_val_if_fail (E_IS_SOURCE_MAIL_IDENTITY (extension), NULL); e_source_extension_property_lock (E_SOURCE_EXTENSION (extension)); protected = e_source_mail_identity_get_signature_uid (extension); duplicate = g_strdup (protected); e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); return duplicate; } /** * e_source_mail_identity_set_signature_uid: * @extension: an #ESourceMailIdentity * @signature_uid: (nullable): the sender's signature ID, or %NULL * * Sets the #ESource:uid of an #ESource describing a mail signature. * * If the user does not want to use a signature for this identity, the * convention is to set the #ESourceMailIdentity:signature-uid property * to "none". In keeping with that convention, the property will be set * to "none" if @signature_uid is %NULL or an empty string. * * Since: 3.6 **/ void e_source_mail_identity_set_signature_uid (ESourceMailIdentity *extension, const gchar *signature_uid) { g_return_if_fail (E_IS_SOURCE_MAIL_IDENTITY (extension)); /* Convert empty strings to "none". */ if (signature_uid == NULL || *signature_uid == '\0') signature_uid = "none"; e_source_extension_property_lock (E_SOURCE_EXTENSION (extension)); if (g_strcmp0 (extension->priv->signature_uid, signature_uid) == 0) { e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); return; } g_free (extension->priv->signature_uid); extension->priv->signature_uid = g_strdup (signature_uid); e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); g_object_notify (G_OBJECT (extension), "signature-uid"); } /** * e_source_mail_identity_get_aliases: * @extension: an #ESourceMailIdentity * * Returns the email address aliases for this identity. These are comma-separated * email addresses which may or may not contain also different name. * This may be an empty string, but will never be %NULL. * There can be used camel_address_decode() on a #CamelInternetAddress * to decode the list of aliases. * * Returns: (nullable): the sender's email address aliases * * Since: 3.24 **/ const gchar * e_source_mail_identity_get_aliases (ESourceMailIdentity *extension) { g_return_val_if_fail (E_IS_SOURCE_MAIL_IDENTITY (extension), NULL); return extension->priv->aliases; } /** * e_source_mail_identity_dup_aliases: * @extension: an #ESourceMailIdentity * * Thread-safe variation of e_source_mail_identity_get_aliases(). * Use this function when accessing @extension from multiple threads. * * The returned string should be freed with g_free() when no longer needed. * * Returns: (nullable): a newly-allocated copy of #ESourceMailIdentity:aliases * * Since: 3.24 **/ gchar * e_source_mail_identity_dup_aliases (ESourceMailIdentity *extension) { const gchar *protected; gchar *duplicate; g_return_val_if_fail (E_IS_SOURCE_MAIL_IDENTITY (extension), NULL); e_source_extension_property_lock (E_SOURCE_EXTENSION (extension)); protected = e_source_mail_identity_get_aliases (extension); duplicate = g_strdup (protected); e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); return duplicate; } /** * e_source_mail_identity_set_aliases: * @extension: an #ESourceMailIdentity * @aliases: (nullable): the sender's email address aliases, or %NULL * * Sets the email address aliases for this identity. These are comma-separated * email addresses which may or may not contain also different name. * * The internal copy of @aliases is automatically stripped of leading and * trailing whitespace. If the resulting string is empty, %NULL is set * instead. * * Since: 3.24 **/ void e_source_mail_identity_set_aliases (ESourceMailIdentity *extension, const gchar *aliases) { g_return_if_fail (E_IS_SOURCE_MAIL_IDENTITY (extension)); e_source_extension_property_lock (E_SOURCE_EXTENSION (extension)); if (e_util_strcmp0 (extension->priv->aliases, aliases) == 0) { e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); return; } g_free (extension->priv->aliases); extension->priv->aliases = e_util_strdup_strip (aliases); e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); g_object_notify (G_OBJECT (extension), "aliases"); } /** * e_source_mail_identity_get_aliases_as_hash_table: * @extension: an #ESourceMailIdentity * * Returns a set aliases as a hash table with address as key and * name as value of the hash table. The name can be sometimes * empty or NULL, thus rather use g_hash_table_contains() when * checking for particular address. The addresses are * compared case insensitively. The same addresses with a different * name are included only once, the last variant of it. Use * e_source_mail_identity_get_aliases() if you need more fine-grained * control on the list of aliases. * * Returns: (transfer full) (element-type utf8 utf8) (nullable): A newly created * #GHashTable will all the aliases. Returns %NULL if there are none set. * Use g_hash_table_destroy() to free the returned hash table. * * Since: 3.24 **/ GHashTable * e_source_mail_identity_get_aliases_as_hash_table (ESourceMailIdentity *extension) { GHashTable *aliases = NULL; g_return_val_if_fail (E_IS_SOURCE_MAIL_IDENTITY (extension), NULL); e_source_extension_property_lock (E_SOURCE_EXTENSION (extension)); if (extension->priv->aliases && *extension->priv->aliases) { CamelInternetAddress *inet_address; gint ii, len; inet_address = camel_internet_address_new (); len = camel_address_decode (CAMEL_ADDRESS (inet_address), extension->priv->aliases); if (len > 0) { aliases = g_hash_table_new_full (camel_strcase_hash, camel_strcase_equal, g_free, g_free); for (ii = 0; ii < len; ii++) { const gchar *name = NULL, *address = NULL; if (camel_internet_address_get (inet_address, ii, &name, &address) && address && *address) { g_hash_table_insert (aliases, g_strdup (address), g_strdup (name)); } } } g_clear_object (&inet_address); } e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); return aliases; }