2 * e-source-mail-submission.c
4 * This library is free software you can redistribute it and/or modify it
5 * under the terms of the GNU Lesser General Public License as published by
6 * the Free Software Foundation.
8 * This library is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
10 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this library; if not, see <http://www.gnu.org/licenses/>.
19 * SECTION: e-source-mail-submission
20 * @include: libedataserver/libedataserver.h
21 * @short_description: #ESource extension for submitting emails
23 * The #ESourceMailSubmission extension tracks settings to be applied
24 * when submitting a mail message for delivery.
26 * Access the extension as follows:
29 * #include <libedataserver/libedataserver.h>
31 * ESourceMailSubmission *extension;
33 * extension = e_source_get_extension (source, E_SOURCE_EXTENSION_MAIL_SUBMISSION);
37 #include "e-source-mail-submission.h"
39 #include <libedataserver/e-data-server-util.h>
41 #define E_SOURCE_MAIL_SUBMISSION_GET_PRIVATE(obj) \
42 (G_TYPE_INSTANCE_GET_PRIVATE \
43 ((obj), E_TYPE_SOURCE_MAIL_SUBMISSION, ESourceMailSubmissionPrivate))
45 struct _ESourceMailSubmissionPrivate {
49 gboolean replies_to_origin_folder;
56 PROP_REPLIES_TO_ORIGIN_FOLDER
60 ESourceMailSubmission,
61 e_source_mail_submission,
62 E_TYPE_SOURCE_EXTENSION)
65 source_mail_submission_set_property (GObject *object,
70 switch (property_id) {
71 case PROP_SENT_FOLDER:
72 e_source_mail_submission_set_sent_folder (
73 E_SOURCE_MAIL_SUBMISSION (object),
74 g_value_get_string (value));
77 case PROP_TRANSPORT_UID:
78 e_source_mail_submission_set_transport_uid (
79 E_SOURCE_MAIL_SUBMISSION (object),
80 g_value_get_string (value));
83 case PROP_REPLIES_TO_ORIGIN_FOLDER:
84 e_source_mail_submission_set_replies_to_origin_folder (
85 E_SOURCE_MAIL_SUBMISSION (object),
86 g_value_get_boolean (value));
90 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
94 source_mail_submission_get_property (GObject *object,
99 switch (property_id) {
100 case PROP_SENT_FOLDER:
101 g_value_take_string (
103 e_source_mail_submission_dup_sent_folder (
104 E_SOURCE_MAIL_SUBMISSION (object)));
107 case PROP_TRANSPORT_UID:
108 g_value_take_string (
110 e_source_mail_submission_dup_transport_uid (
111 E_SOURCE_MAIL_SUBMISSION (object)));
114 case PROP_REPLIES_TO_ORIGIN_FOLDER:
115 g_value_set_boolean (
117 e_source_mail_submission_get_replies_to_origin_folder (
118 E_SOURCE_MAIL_SUBMISSION (object)));
122 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
126 source_mail_submission_finalize (GObject *object)
128 ESourceMailSubmissionPrivate *priv;
130 priv = E_SOURCE_MAIL_SUBMISSION_GET_PRIVATE (object);
132 g_mutex_clear (&priv->property_lock);
134 g_free (priv->sent_folder);
135 g_free (priv->transport_uid);
137 /* Chain up to parent's finalize() method. */
138 G_OBJECT_CLASS (e_source_mail_submission_parent_class)->
143 e_source_mail_submission_class_init (ESourceMailSubmissionClass *class)
145 GObjectClass *object_class;
146 ESourceExtensionClass *extension_class;
148 g_type_class_add_private (
149 class, sizeof (ESourceMailSubmissionPrivate));
151 object_class = G_OBJECT_CLASS (class);
152 object_class->set_property = source_mail_submission_set_property;
153 object_class->get_property = source_mail_submission_get_property;
154 object_class->finalize = source_mail_submission_finalize;
156 extension_class = E_SOURCE_EXTENSION_CLASS (class);
157 extension_class->name = E_SOURCE_EXTENSION_MAIL_SUBMISSION;
159 g_object_class_install_property (
162 g_param_spec_string (
165 "Preferred folder for sent messages",
169 G_PARAM_STATIC_STRINGS |
170 E_SOURCE_PARAM_SETTING));
172 g_object_class_install_property (
175 g_param_spec_string (
178 "ESource UID of a Mail Transport",
182 G_PARAM_STATIC_STRINGS |
183 E_SOURCE_PARAM_SETTING));
185 g_object_class_install_property (
187 PROP_REPLIES_TO_ORIGIN_FOLDER,
188 g_param_spec_boolean (
189 "replies-to-origin-folder",
190 "Replies to origin folder",
191 "Whether to save replies to folder of the message "
192 "being replied to, instead of the Sent folder",
196 G_PARAM_STATIC_STRINGS |
197 E_SOURCE_PARAM_SETTING));
201 e_source_mail_submission_init (ESourceMailSubmission *extension)
203 extension->priv = E_SOURCE_MAIL_SUBMISSION_GET_PRIVATE (extension);
204 g_mutex_init (&extension->priv->property_lock);
208 * e_source_mail_submission_get_sent_folder:
209 * @extension: an #ESourceMailSubmission
211 * Returns a string identifying the preferred folder for sent messages.
212 * The format of the identifier string is defined by the client application.
214 * Returns: an identifier for the preferred sent folder
219 e_source_mail_submission_get_sent_folder (ESourceMailSubmission *extension)
221 g_return_val_if_fail (E_IS_SOURCE_MAIL_SUBMISSION (extension), NULL);
223 return extension->priv->sent_folder;
227 * e_source_mail_submission_dup_sent_folder:
228 * @extension: an #ESourceMailSubmission
230 * Thread-safe variation of e_source_mail_submission_get_sent_folder().
231 * Use this function when accessing @extension from multiple threads.
233 * The returned string should be freed with g_free() when no longer needed.
235 * Returns: a newly-allocated copy of #ESourceMailSubmission:sent-folder
240 e_source_mail_submission_dup_sent_folder (ESourceMailSubmission *extension)
242 const gchar *protected;
245 g_return_val_if_fail (E_IS_SOURCE_MAIL_SUBMISSION (extension), NULL);
247 g_mutex_lock (&extension->priv->property_lock);
249 protected = e_source_mail_submission_get_sent_folder (extension);
250 duplicate = g_strdup (protected);
252 g_mutex_unlock (&extension->priv->property_lock);
258 * e_source_mail_submission_set_sent_folder:
259 * @extension: an #ESourceMailSubmission
260 * @sent_folder: (allow-none): an identifier for the preferred sent folder,
263 * Sets the preferred folder for sent messages by an identifier string.
264 * The format of the identifier string is defined by the client application.
266 * The internal copy of @sent_folder is automatically stripped of leading
267 * and trailing whitespace. If the resulting string is empty, %NULL is set
273 e_source_mail_submission_set_sent_folder (ESourceMailSubmission *extension,
274 const gchar *sent_folder)
276 g_return_if_fail (E_IS_SOURCE_MAIL_SUBMISSION (extension));
278 g_mutex_lock (&extension->priv->property_lock);
280 if (g_strcmp0 (extension->priv->sent_folder, sent_folder) == 0) {
281 g_mutex_unlock (&extension->priv->property_lock);
285 g_free (extension->priv->sent_folder);
286 extension->priv->sent_folder = e_util_strdup_strip (sent_folder);
288 g_mutex_unlock (&extension->priv->property_lock);
290 g_object_notify (G_OBJECT (extension), "sent-folder");
294 * e_source_mail_submission_get_transport_uid:
295 * @extension: an #ESourceMailSubmission
297 * Returns the #ESource:uid of the #ESource that describes the mail
298 * transport to be used for outgoing messages.
300 * Returns: the mail transport #ESource:uid
305 e_source_mail_submission_get_transport_uid (ESourceMailSubmission *extension)
307 g_return_val_if_fail (E_IS_SOURCE_MAIL_SUBMISSION (extension), NULL);
309 return extension->priv->transport_uid;
313 * e_source_mail_submission_dup_transport_uid:
314 * @extension: an #ESourceMailSubmission
316 * Thread-safe variation of e_source_mail_submission_get_transport_uid().
317 * Use this function when accessing @extension from multiple threads.
319 * The returned string should be freed with g_free() when no longer needed.
321 * Returns: a newly-allocated copy of #ESourceMailSubmission:transport-uid
326 e_source_mail_submission_dup_transport_uid (ESourceMailSubmission *extension)
328 const gchar *protected;
331 g_return_val_if_fail (E_IS_SOURCE_MAIL_SUBMISSION (extension), NULL);
333 g_mutex_lock (&extension->priv->property_lock);
335 protected = e_source_mail_submission_get_transport_uid (extension);
336 duplicate = g_strdup (protected);
338 g_mutex_unlock (&extension->priv->property_lock);
344 * e_source_mail_submission_set_transport_uid:
345 * @extension: an #ESourceMailSubmission
346 * @transport_uid: (allow-none): the mail transport #ESource:uid, or %NULL
348 * Sets the #ESource:uid of the #ESource that describes the mail
349 * transport to be used for outgoing messages.
354 e_source_mail_submission_set_transport_uid (ESourceMailSubmission *extension,
355 const gchar *transport_uid)
357 g_return_if_fail (E_IS_SOURCE_MAIL_SUBMISSION (extension));
359 g_mutex_lock (&extension->priv->property_lock);
361 if (g_strcmp0 (extension->priv->transport_uid, transport_uid) == 0) {
362 g_mutex_unlock (&extension->priv->property_lock);
366 g_free (extension->priv->transport_uid);
367 extension->priv->transport_uid = g_strdup (transport_uid);
369 g_mutex_unlock (&extension->priv->property_lock);
371 g_object_notify (G_OBJECT (extension), "transport-uid");
375 * e_source_mail_submission_get_replies_to_origin_folder:
376 * @extension: an #ESourceMailSubmission
378 * Returns whether save replies in the folder of the message
379 * being replied to, instead of the Sent folder.
381 * Returns: whether save replies in the folder of the message being replied to
386 e_source_mail_submission_get_replies_to_origin_folder (ESourceMailSubmission *extension)
388 g_return_val_if_fail (E_IS_SOURCE_MAIL_SUBMISSION (extension), FALSE);
390 return extension->priv->replies_to_origin_folder;
394 * e_source_mail_submission_set_replies_to_origin_folder:
395 * @extension: an #ESourceMailSubmission
396 * @replies_to_origin_folder: new value
398 * Sets whether save replies in the folder of the message
399 * being replied to, instead of the Sent folder.
404 e_source_mail_submission_set_replies_to_origin_folder (ESourceMailSubmission *extension,
405 gboolean replies_to_origin_folder)
407 g_return_if_fail (E_IS_SOURCE_MAIL_SUBMISSION (extension));
409 if (extension->priv->replies_to_origin_folder == replies_to_origin_folder)
412 extension->priv->replies_to_origin_folder = replies_to_origin_folder;
414 g_object_notify (G_OBJECT (extension), "replies-to-origin-folder");