/*
* e-source-mail-composition.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-composition
* @include: libedataserver/libedataserver.h
* @short_description: #ESource extension for mail composition settings
*
* The #ESourceMailComposition extension tracks settings to be applied
* when composing a new mail message.
*
* Access the extension as follows:
*
* |[
* #include
*
* ESourceMailComposition *extension;
*
* extension = e_source_get_extension (source, E_SOURCE_EXTENSION_MAIL_COMPOSITION);
* ]|
**/
#include "evolution-data-server-config.h"
#include
#include "e-source-enumtypes.h"
#include "e-source-mail-composition.h"
struct _ESourceMailCompositionPrivate {
gchar **bcc;
gchar **cc;
gchar *drafts_folder;
gchar *templates_folder;
gchar *language;
gboolean sign_imip;
ESourceMailCompositionReplyStyle reply_style;
EThreeState start_bottom;
EThreeState top_signature;
};
enum {
PROP_0,
PROP_BCC,
PROP_CC,
PROP_DRAFTS_FOLDER,
PROP_REPLY_STYLE,
PROP_SIGN_IMIP,
PROP_TEMPLATES_FOLDER,
PROP_START_BOTTOM,
PROP_TOP_SIGNATURE,
PROP_LANGUAGE
};
G_DEFINE_TYPE_WITH_PRIVATE (
ESourceMailComposition,
e_source_mail_composition,
E_TYPE_SOURCE_EXTENSION)
static void
source_mail_composition_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec)
{
switch (property_id) {
case PROP_BCC:
e_source_mail_composition_set_bcc (
E_SOURCE_MAIL_COMPOSITION (object),
g_value_get_boxed (value));
return;
case PROP_CC:
e_source_mail_composition_set_cc (
E_SOURCE_MAIL_COMPOSITION (object),
g_value_get_boxed (value));
return;
case PROP_DRAFTS_FOLDER:
e_source_mail_composition_set_drafts_folder (
E_SOURCE_MAIL_COMPOSITION (object),
g_value_get_string (value));
return;
case PROP_LANGUAGE:
e_source_mail_composition_set_language (
E_SOURCE_MAIL_COMPOSITION (object),
g_value_get_string (value));
return;
case PROP_REPLY_STYLE:
e_source_mail_composition_set_reply_style (
E_SOURCE_MAIL_COMPOSITION (object),
g_value_get_enum (value));
return;
case PROP_SIGN_IMIP:
e_source_mail_composition_set_sign_imip (
E_SOURCE_MAIL_COMPOSITION (object),
g_value_get_boolean (value));
return;
case PROP_START_BOTTOM:
e_source_mail_composition_set_start_bottom (
E_SOURCE_MAIL_COMPOSITION (object),
g_value_get_enum (value));
return;
case PROP_TEMPLATES_FOLDER:
e_source_mail_composition_set_templates_folder (
E_SOURCE_MAIL_COMPOSITION (object),
g_value_get_string (value));
return;
case PROP_TOP_SIGNATURE:
e_source_mail_composition_set_top_signature (
E_SOURCE_MAIL_COMPOSITION (object),
g_value_get_enum (value));
return;
}
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
static void
source_mail_composition_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec)
{
switch (property_id) {
case PROP_BCC:
g_value_take_boxed (
value,
e_source_mail_composition_dup_bcc (
E_SOURCE_MAIL_COMPOSITION (object)));
return;
case PROP_CC:
g_value_take_boxed (
value,
e_source_mail_composition_dup_cc (
E_SOURCE_MAIL_COMPOSITION (object)));
return;
case PROP_DRAFTS_FOLDER:
g_value_take_string (
value,
e_source_mail_composition_dup_drafts_folder (
E_SOURCE_MAIL_COMPOSITION (object)));
return;
case PROP_LANGUAGE:
g_value_take_string (
value,
e_source_mail_composition_dup_language (
E_SOURCE_MAIL_COMPOSITION (object)));
return;
case PROP_REPLY_STYLE:
g_value_set_enum (
value,
e_source_mail_composition_get_reply_style (
E_SOURCE_MAIL_COMPOSITION (object)));
return;
case PROP_SIGN_IMIP:
g_value_set_boolean (
value,
e_source_mail_composition_get_sign_imip (
E_SOURCE_MAIL_COMPOSITION (object)));
return;
case PROP_START_BOTTOM:
g_value_set_enum (
value,
e_source_mail_composition_get_start_bottom (
E_SOURCE_MAIL_COMPOSITION (object)));
return;
case PROP_TEMPLATES_FOLDER:
g_value_take_string (
value,
e_source_mail_composition_dup_templates_folder (
E_SOURCE_MAIL_COMPOSITION (object)));
return;
case PROP_TOP_SIGNATURE:
g_value_set_enum (
value,
e_source_mail_composition_get_top_signature (
E_SOURCE_MAIL_COMPOSITION (object)));
return;
}
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
static void
source_mail_composition_finalize (GObject *object)
{
ESourceMailCompositionPrivate *priv;
priv = E_SOURCE_MAIL_COMPOSITION (object)->priv;
g_strfreev (priv->bcc);
g_strfreev (priv->cc);
g_free (priv->drafts_folder);
g_free (priv->templates_folder);
g_free (priv->language);
/* Chain up to parent's finalize() method. */
G_OBJECT_CLASS (e_source_mail_composition_parent_class)->
finalize (object);
}
static void
e_source_mail_composition_class_init (ESourceMailCompositionClass *class)
{
GObjectClass *object_class;
ESourceExtensionClass *extension_class;
object_class = G_OBJECT_CLASS (class);
object_class->set_property = source_mail_composition_set_property;
object_class->get_property = source_mail_composition_get_property;
object_class->finalize = source_mail_composition_finalize;
extension_class = E_SOURCE_EXTENSION_CLASS (class);
extension_class->name = E_SOURCE_EXTENSION_MAIL_COMPOSITION;
g_object_class_install_property (
object_class,
PROP_BCC,
g_param_spec_boxed (
"bcc",
"Bcc",
"Recipients to blind carbon-copy",
G_TYPE_STRV,
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_CC,
g_param_spec_boxed (
"cc",
"Cc",
"Recipients to carbon-copy",
G_TYPE_STRV,
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_DRAFTS_FOLDER,
g_param_spec_string (
"drafts-folder",
"Drafts Folder",
"Preferred folder for draft messages",
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_STYLE,
g_param_spec_enum (
"reply-style",
"Reply Style",
"What reply style to prefer",
E_TYPE_SOURCE_MAIL_COMPOSITION_REPLY_STYLE,
E_SOURCE_MAIL_COMPOSITION_REPLY_STYLE_DEFAULT,
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_SIGN_IMIP,
g_param_spec_boolean (
"sign-imip",
"Sign iMIP",
"Include iMIP messages when signing",
TRUE,
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_START_BOTTOM,
g_param_spec_enum (
"start-bottom",
"Start Bottom",
"Whether start at bottom on reply or forward",
E_TYPE_THREE_STATE,
E_THREE_STATE_INCONSISTENT,
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_TEMPLATES_FOLDER,
g_param_spec_string (
"templates-folder",
"Templates Folder",
"Preferred folder for message templates",
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_TOP_SIGNATURE,
g_param_spec_enum (
"top-signature",
"Top Signature",
"Whether place signature at the top on reply or forward",
E_TYPE_THREE_STATE,
E_THREE_STATE_INCONSISTENT,
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_LANGUAGE,
g_param_spec_string (
"language",
"Language",
"Preferred language",
NULL,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT |
G_PARAM_EXPLICIT_NOTIFY |
G_PARAM_STATIC_STRINGS |
E_SOURCE_PARAM_SETTING));
}
static void
e_source_mail_composition_init (ESourceMailComposition *extension)
{
extension->priv = e_source_mail_composition_get_instance_private (extension);
}
/**
* e_source_mail_composition_get_bcc:
* @extension: an #ESourceMailComposition
*
* Returns a %NULL-terminated string array of recipients which should
* automatically be added to the blind carbon-copy (Bcc) list when
* composing a new mail message. The recipient strings should be of
* the form "Full Name <email-address>". The returned array is
* owned by @extension and should not be modified or freed.
*
* Returns: (transfer none): a %NULL-terminated string array of Bcc recipients
*
* Since: 3.6
**/
const gchar * const *
e_source_mail_composition_get_bcc (ESourceMailComposition *extension)
{
g_return_val_if_fail (E_IS_SOURCE_MAIL_COMPOSITION (extension), NULL);
return (const gchar * const *) extension->priv->bcc;
}
/**
* e_source_mail_composition_dup_bcc:
* @extension: an #ESourceMailComposition
*
* Thread-safe variation of e_source_mail_composition_get_bcc().
* Use this function when accessing @extension from multiple threads.
*
* The returned string array should be freed with g_strfreev() when no
* longer needed.
*
* Returns: (transfer full): a newly-allocated copy of
* #ESourceMailComposition:bcc
*
* Since: 3.6
**/
gchar **
e_source_mail_composition_dup_bcc (ESourceMailComposition *extension)
{
const gchar * const *protected;
gchar **duplicate;
g_return_val_if_fail (E_IS_SOURCE_MAIL_COMPOSITION (extension), NULL);
e_source_extension_property_lock (E_SOURCE_EXTENSION (extension));
protected = e_source_mail_composition_get_bcc (extension);
duplicate = g_strdupv ((gchar **) protected);
e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension));
return duplicate;
}
/**
* e_source_mail_composition_set_bcc:
* @extension: an #ESource
* @bcc: (array zero-terminated=1): a %NULL-terminated string array of Bcc
* recipients
*
* Sets the recipients which should automatically be added to the blind
* carbon-copy (Bcc) list when composing a new mail message. The recipient
* strings should be of the form "Full Name <email-address>".
*
* Since: 3.6
**/
void
e_source_mail_composition_set_bcc (ESourceMailComposition *extension,
const gchar * const *bcc)
{
g_return_if_fail (E_IS_SOURCE_MAIL_COMPOSITION (extension));
e_source_extension_property_lock (E_SOURCE_EXTENSION (extension));
if (e_util_strv_equal (bcc, extension->priv->bcc)) {
e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension));
return;
}
g_strfreev (extension->priv->bcc);
extension->priv->bcc = g_strdupv ((gchar **) bcc);
e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension));
g_object_notify (G_OBJECT (extension), "bcc");
}
/**
* e_source_mail_composition_get_cc:
* @extension: an #ESourceMailComposition
*
* Returns a %NULL-terminated string array of recipients which should
* automatically be added to the carbon-copy (Cc) list when composing a
* new mail message. The recipient strings should be of the form "Full
* Name ". The returned array is owned by @extension and
* should not be modified or freed.
*
* Returns: (transfer none): a %NULL-terminated string array of Cc recipients
*
* Since: 3.6
**/
const gchar * const *
e_source_mail_composition_get_cc (ESourceMailComposition *extension)
{
g_return_val_if_fail (E_IS_SOURCE_MAIL_COMPOSITION (extension), NULL);
return (const gchar * const *) extension->priv->cc;
}
/**
* e_source_mail_composition_dup_cc:
* @extension: an #ESourceMailComposition
*
* Thread-safe variation of e_source_mail_composition_get_cc().
* Use this function when accessing @extension from multiple threads.
*
* The returned string array should be freed with g_strfreev() when no
* longer needed.
*
* Returns: (transfer full): a newly-allocated copy of
* #ESourceMailComposition:cc
*
* Since: 3.6
**/
gchar **
e_source_mail_composition_dup_cc (ESourceMailComposition *extension)
{
const gchar * const *protected;
gchar **duplicate;
g_return_val_if_fail (E_IS_SOURCE_MAIL_COMPOSITION (extension), NULL);
e_source_extension_property_lock (E_SOURCE_EXTENSION (extension));
protected = e_source_mail_composition_get_cc (extension);
duplicate = g_strdupv ((gchar **) protected);
e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension));
return duplicate;
}
/**
* e_source_mail_composition_set_cc:
* @extension: an #ESourceMailComposition
* @cc: (array zero-terminated=1): a %NULL-terminated string array of Cc
* recipients
*
* Sets the recipients which should automatically be added to the carbon
* copy (Cc) list when composing a new mail message. The recipient strings
* should be of the form "Full Name <email-address>".
*
* Since: 3.6
**/
void
e_source_mail_composition_set_cc (ESourceMailComposition *extension,
const gchar * const *cc)
{
g_return_if_fail (E_IS_SOURCE_MAIL_COMPOSITION (extension));
e_source_extension_property_lock (E_SOURCE_EXTENSION (extension));
if (e_util_strv_equal (cc, extension->priv->cc)) {
e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension));
return;
}
g_strfreev (extension->priv->cc);
extension->priv->cc = g_strdupv ((gchar **) cc);
e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension));
g_object_notify (G_OBJECT (extension), "cc");
}
/**
* e_source_mail_composition_get_drafts_folder:
* @extension: an #ESourceMailComposition
*
* Returns a string identifying the preferred folder for draft messages.
* The format of the identifier string is defined by the client application.
*
* Returns: (nullable): an identifier for the preferred drafts folder
*
* Since: 3.6
**/
const gchar *
e_source_mail_composition_get_drafts_folder (ESourceMailComposition *extension)
{
g_return_val_if_fail (E_IS_SOURCE_MAIL_COMPOSITION (extension), NULL);
return extension->priv->drafts_folder;
}
/**
* e_source_mail_composition_dup_drafts_folder:
* @extension: an #ESourceMailComposition
*
* Thread-safe variation of e_source_mail_composition_get_drafts_folder().
* 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 #ESourceMailComposition:drafts-folder
*
* Since: 3.6
**/
gchar *
e_source_mail_composition_dup_drafts_folder (ESourceMailComposition *extension)
{
const gchar *protected;
gchar *duplicate;
g_return_val_if_fail (E_IS_SOURCE_MAIL_COMPOSITION (extension), NULL);
e_source_extension_property_lock (E_SOURCE_EXTENSION (extension));
protected = e_source_mail_composition_get_drafts_folder (extension);
duplicate = g_strdup (protected);
e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension));
return duplicate;
}
/**
* e_source_mail_composition_set_drafts_folder:
* @extension: an #ESourceMailComposition
* @drafts_folder: (nullable): an identifier for the preferred drafts
* folder, or %NULL
*
* Sets the preferred folder for draft messages by an identifier string.
* The format of the identifier string is defined by the client application.
*
* The internal copy of @drafts_folder 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_composition_set_drafts_folder (ESourceMailComposition *extension,
const gchar *drafts_folder)
{
g_return_if_fail (E_IS_SOURCE_MAIL_COMPOSITION (extension));
e_source_extension_property_lock (E_SOURCE_EXTENSION (extension));
if (e_util_strcmp0 (extension->priv->drafts_folder, drafts_folder) == 0) {
e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension));
return;
}
g_free (extension->priv->drafts_folder);
extension->priv->drafts_folder = e_util_strdup_strip (drafts_folder);
e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension));
g_object_notify (G_OBJECT (extension), "drafts-folder");
}
/**
* e_source_mail_composition_get_sign_imip:
* @extension: an #ESourceMailComposition
*
* Returns whether outgoing iMIP messages such as meeting requests should
* also be signed. This is primarily intended as a workaround for certain
* versions of Microsoft Outlook which can't handle signed iMIP messages.
*
* Returns: whether outgoing iMIP messages should be signed
*
* Since: 3.6
**/
gboolean
e_source_mail_composition_get_sign_imip (ESourceMailComposition *extension)
{
g_return_val_if_fail (E_IS_SOURCE_MAIL_COMPOSITION (extension), FALSE);
return extension->priv->sign_imip;
}
/**
* e_source_mail_composition_set_sign_imip:
* @extension: an #ESourceMailComposition
* @sign_imip: whether outgoing iMIP messages should be signed
*
* Sets whether outgoing iMIP messages such as meeting requests should
* also be signed. This is primarily intended as a workaround for certain
* versions of Microsoft Outlook which can't handle signed iMIP messages.
*
* Since: 3.6
**/
void
e_source_mail_composition_set_sign_imip (ESourceMailComposition *extension,
gboolean sign_imip)
{
g_return_if_fail (E_IS_SOURCE_MAIL_COMPOSITION (extension));
if (extension->priv->sign_imip == sign_imip)
return;
extension->priv->sign_imip = sign_imip;
g_object_notify (G_OBJECT (extension), "sign-imip");
}
/**
* e_source_mail_composition_get_templates_folder:
* @extension: an #ESourceMailComposition
*
* Returns a string identifying the preferred folder for message templates.
* The format of the identifier string is defined by the client application.
*
* Returns: (nullable): an identifier for the preferred templates folder
*
* Since: 3.6
**/
const gchar *
e_source_mail_composition_get_templates_folder (ESourceMailComposition *extension)
{
g_return_val_if_fail (E_IS_SOURCE_MAIL_COMPOSITION (extension), NULL);
return extension->priv->templates_folder;
}
/**
* e_source_mail_composition_dup_templates_folder:
* @extension: an #ESourceMailComposition
*
* Thread-safe variation of e_source_mail_composition_get_templates_folder().
* 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 #ESourceMailComposition:templates-folder
*
* Since: 3.6
**/
gchar *
e_source_mail_composition_dup_templates_folder (ESourceMailComposition *extension)
{
const gchar *protected;
gchar *duplicate;
g_return_val_if_fail (E_IS_SOURCE_MAIL_COMPOSITION (extension), NULL);
e_source_extension_property_lock (E_SOURCE_EXTENSION (extension));
protected = e_source_mail_composition_get_templates_folder (extension);
duplicate = g_strdup (protected);
e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension));
return duplicate;
}
/**
* e_source_mail_composition_set_templates_folder:
* @extension: an #ESourceMailComposition
* @templates_folder: (nullable): an identifier for the preferred templates
* folder, or %NULL
*
* Sets the preferred folder for message templates by an identifier string.
* The format of the identifier string is defined by the client application.
*
* The internal copy of @templates_folder 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_composition_set_templates_folder (ESourceMailComposition *extension,
const gchar *templates_folder)
{
g_return_if_fail (E_IS_SOURCE_MAIL_COMPOSITION (extension));
e_source_extension_property_lock (E_SOURCE_EXTENSION (extension));
if (e_util_strcmp0 (extension->priv->templates_folder, templates_folder) == 0) {
e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension));
return;
}
g_free (extension->priv->templates_folder);
extension->priv->templates_folder = e_util_strdup_strip (templates_folder);
e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension));
g_object_notify (G_OBJECT (extension), "templates-folder");
}
/**
* e_source_mail_composition_get_reply_style:
* @extension: an #ESourceMailComposition
*
* Returns preferred reply style to be used when replying
* using the associated account. If no preference is set,
* the %E_SOURCE_MAIL_COMPOSITION_REPLY_STYLE_DEFAULT is returned.
*
* Returns: reply style preference
*
* Since: 3.20
**/
ESourceMailCompositionReplyStyle
e_source_mail_composition_get_reply_style (ESourceMailComposition *extension)
{
g_return_val_if_fail (E_IS_SOURCE_MAIL_COMPOSITION (extension),
E_SOURCE_MAIL_COMPOSITION_REPLY_STYLE_DEFAULT);
return extension->priv->reply_style;
}
/**
* e_source_mail_composition_set_reply_style:
* @extension: an #ESourceMailComposition
* @reply_style: an #ESourceMailCompositionReplyStyle
*
* Sets preferred reply style to be used when replying
* using the associated account. To unset the preference,
* use the %E_SOURCE_MAIL_COMPOSITION_REPLY_STYLE_DEFAULT.
*
* Since: 3.20
**/
void
e_source_mail_composition_set_reply_style (ESourceMailComposition *extension,
ESourceMailCompositionReplyStyle reply_style)
{
g_return_if_fail (E_IS_SOURCE_MAIL_COMPOSITION (extension));
if (extension->priv->reply_style == reply_style)
return;
extension->priv->reply_style = reply_style;
g_object_notify (G_OBJECT (extension), "reply-style");
}
/**
* e_source_mail_composition_get_start_bottom:
* @extension: an #ESourceMailComposition
*
* Returns whether start at bottom when replying or forwarding
* using the associated account. If no preference is set,
* the %E_THREE_STATE_INCONSISTENT is returned.
*
* Returns: start bottom on reply or forward preference
*
* Since: 3.26
**/
EThreeState
e_source_mail_composition_get_start_bottom (ESourceMailComposition *extension)
{
g_return_val_if_fail (E_IS_SOURCE_MAIL_COMPOSITION (extension), E_THREE_STATE_INCONSISTENT);
return extension->priv->start_bottom;
}
/**
* e_source_mail_composition_set_start_bottom:
* @extension: an #ESourceMailComposition
* @start_bottom: an #EThreeState
*
* Sets whether start bottom when replying or forwarding using the associated account.
* To unset the preference, use the %E_THREE_STATE_INCONSISTENT.
*
* Since: 3.26
**/
void
e_source_mail_composition_set_start_bottom (ESourceMailComposition *extension,
EThreeState start_bottom)
{
g_return_if_fail (E_IS_SOURCE_MAIL_COMPOSITION (extension));
if (extension->priv->start_bottom == start_bottom)
return;
extension->priv->start_bottom = start_bottom;
g_object_notify (G_OBJECT (extension), "start-bottom");
}
/**
* e_source_mail_composition_get_top_signature:
* @extension: an #ESourceMailComposition
*
* Returns whether place signature at top when replying or forwarding
* using the associated account. If no preference is set,
* the %E_THREE_STATE_INCONSISTENT is returned.
*
* Returns: top signature on reply or forward preference
*
* Since: 3.26
**/
EThreeState
e_source_mail_composition_get_top_signature (ESourceMailComposition *extension)
{
g_return_val_if_fail (E_IS_SOURCE_MAIL_COMPOSITION (extension), E_THREE_STATE_INCONSISTENT);
return extension->priv->top_signature;
}
/**
* e_source_mail_composition_set_top_signature:
* @extension: an #ESourceMailComposition
* @top_signature: an #EThreeState
*
* Sets whether place signature at top when replying or forwarding using the associated account.
* To unset the preference, use the %E_THREE_STATE_INCONSISTENT.
*
* Since: 3.26
**/
void
e_source_mail_composition_set_top_signature (ESourceMailComposition *extension,
EThreeState top_signature)
{
g_return_if_fail (E_IS_SOURCE_MAIL_COMPOSITION (extension));
if (extension->priv->top_signature == top_signature)
return;
extension->priv->top_signature = top_signature;
g_object_notify (G_OBJECT (extension), "top-signature");
}
/**
* e_source_mail_composition_get_language:
* @extension: an #ESourceMailComposition
*
* Returns a string identifying the preferred language, like "en_US".
*
* Returns: (nullable): an identifier for the preferred language, or %NULL for none
*
* Since: 3.32
**/
const gchar *
e_source_mail_composition_get_language (ESourceMailComposition *extension)
{
g_return_val_if_fail (E_IS_SOURCE_MAIL_COMPOSITION (extension), NULL);
return extension->priv->language;
}
/**
* e_source_mail_composition_dup_language:
* @extension: an #ESourceMailComposition
*
* Thread-safe variation of e_source_mail_composition_get_language().
* 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 #ESourceMailComposition:language
*
* Since: 3.32
**/
gchar *
e_source_mail_composition_dup_language (ESourceMailComposition *extension)
{
const gchar *protected;
gchar *duplicate;
g_return_val_if_fail (E_IS_SOURCE_MAIL_COMPOSITION (extension), NULL);
e_source_extension_property_lock (E_SOURCE_EXTENSION (extension));
protected = e_source_mail_composition_get_language (extension);
duplicate = g_strdup (protected);
e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension));
return duplicate;
}
/**
* e_source_mail_composition_set_language:
* @extension: an #ESourceMailComposition
* @language: (nullable): an identifier for the preferred language, or %NULL
*
* Sets the preferred language by an identifier string, like "en_US".
* Use %NULL to unset any previous value.
*
* The internal copy of @language is automatically stripped of
* leading and trailing whitespace. If the resulting string is empty,
* %NULL is set instead.
*
* Since: 3.32
**/
void
e_source_mail_composition_set_language (ESourceMailComposition *extension,
const gchar *language)
{
g_return_if_fail (E_IS_SOURCE_MAIL_COMPOSITION (extension));
e_source_extension_property_lock (E_SOURCE_EXTENSION (extension));
if (e_util_strcmp0 (extension->priv->language, language) == 0) {
e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension));
return;
}
g_free (extension->priv->language);
extension->priv->language = e_util_strdup_strip (language);
e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension));
g_object_notify (G_OBJECT (extension), "language");
}