/* * 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 "e-source-mail-composition.h" #include #define E_SOURCE_MAIL_COMPOSITION_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE \ ((obj), E_TYPE_SOURCE_MAIL_COMPOSITION, ESourceMailCompositionPrivate)) struct _ESourceMailCompositionPrivate { gchar **bcc; gchar **cc; gchar *drafts_folder; gchar *templates_folder; gboolean sign_imip; }; enum { PROP_0, PROP_BCC, PROP_CC, PROP_DRAFTS_FOLDER, PROP_SIGN_IMIP, PROP_TEMPLATES_FOLDER }; G_DEFINE_TYPE ( 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_SIGN_IMIP: e_source_mail_composition_set_sign_imip ( E_SOURCE_MAIL_COMPOSITION (object), g_value_get_boolean (value)); return; case PROP_TEMPLATES_FOLDER: e_source_mail_composition_set_templates_folder ( E_SOURCE_MAIL_COMPOSITION (object), g_value_get_string (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_SIGN_IMIP: g_value_set_boolean ( value, e_source_mail_composition_get_sign_imip ( 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; } 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_GET_PRIVATE (object); g_strfreev (priv->bcc); g_strfreev (priv->cc); g_free (priv->drafts_folder); g_free (priv->templates_folder); /* 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; g_type_class_add_private ( class, sizeof (ESourceMailCompositionPrivate)); 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_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_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_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_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_STATIC_STRINGS | E_SOURCE_PARAM_SETTING)); } static void e_source_mail_composition_init (ESourceMailComposition *extension) { extension->priv = E_SOURCE_MAIL_COMPOSITION_GET_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: (allow-none): 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: (allow-none): 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: 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: 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: (allow-none): 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 (g_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: 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: 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: (allow-none): 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 (g_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"); }