updated changelog
[platform/upstream/evolution-data-server.git] / libedataserver / e-source-mail-submission.c
1 /*
2  * e-source-mail-submission.c
3  *
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.
7  *
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
11  * for more details.
12  *
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/>.
15  *
16  */
17
18 /**
19  * SECTION: e-source-mail-submission
20  * @include: libedataserver/libedataserver.h
21  * @short_description: #ESource extension for submitting emails
22  *
23  * The #ESourceMailSubmission extension tracks settings to be applied
24  * when submitting a mail message for delivery.
25  *
26  * Access the extension as follows:
27  *
28  * |[
29  *   #include <libedataserver/libedataserver.h>
30  *
31  *   ESourceMailSubmission *extension;
32  *
33  *   extension = e_source_get_extension (source, E_SOURCE_EXTENSION_MAIL_SUBMISSION);
34  * ]|
35  **/
36
37 #include "e-source-mail-submission.h"
38
39 #include <libedataserver/e-data-server-util.h>
40
41 #define E_SOURCE_MAIL_SUBMISSION_GET_PRIVATE(obj) \
42         (G_TYPE_INSTANCE_GET_PRIVATE \
43         ((obj), E_TYPE_SOURCE_MAIL_SUBMISSION, ESourceMailSubmissionPrivate))
44
45 struct _ESourceMailSubmissionPrivate {
46         GMutex property_lock;
47         gchar *sent_folder;
48         gchar *transport_uid;
49         gboolean replies_to_origin_folder;
50 };
51
52 enum {
53         PROP_0,
54         PROP_SENT_FOLDER,
55         PROP_TRANSPORT_UID,
56         PROP_REPLIES_TO_ORIGIN_FOLDER
57 };
58
59 G_DEFINE_TYPE (
60         ESourceMailSubmission,
61         e_source_mail_submission,
62         E_TYPE_SOURCE_EXTENSION)
63
64 static void
65 source_mail_submission_set_property (GObject *object,
66                                      guint property_id,
67                                      const GValue *value,
68                                      GParamSpec *pspec)
69 {
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));
75                         return;
76
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));
81                         return;
82
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));
87                         return;
88         }
89
90         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
91 }
92
93 static void
94 source_mail_submission_get_property (GObject *object,
95                                      guint property_id,
96                                      GValue *value,
97                                      GParamSpec *pspec)
98 {
99         switch (property_id) {
100                 case PROP_SENT_FOLDER:
101                         g_value_take_string (
102                                 value,
103                                 e_source_mail_submission_dup_sent_folder (
104                                 E_SOURCE_MAIL_SUBMISSION (object)));
105                         return;
106
107                 case PROP_TRANSPORT_UID:
108                         g_value_take_string (
109                                 value,
110                                 e_source_mail_submission_dup_transport_uid (
111                                 E_SOURCE_MAIL_SUBMISSION (object)));
112                         return;
113
114                 case PROP_REPLIES_TO_ORIGIN_FOLDER:
115                         g_value_set_boolean (
116                                 value,
117                                 e_source_mail_submission_get_replies_to_origin_folder (
118                                 E_SOURCE_MAIL_SUBMISSION (object)));
119                         return;
120         }
121
122         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
123 }
124
125 static void
126 source_mail_submission_finalize (GObject *object)
127 {
128         ESourceMailSubmissionPrivate *priv;
129
130         priv = E_SOURCE_MAIL_SUBMISSION_GET_PRIVATE (object);
131
132         g_mutex_clear (&priv->property_lock);
133
134         g_free (priv->sent_folder);
135         g_free (priv->transport_uid);
136
137         /* Chain up to parent's finalize() method. */
138         G_OBJECT_CLASS (e_source_mail_submission_parent_class)->
139                 finalize (object);
140 }
141
142 static void
143 e_source_mail_submission_class_init (ESourceMailSubmissionClass *class)
144 {
145         GObjectClass *object_class;
146         ESourceExtensionClass *extension_class;
147
148         g_type_class_add_private (
149                 class, sizeof (ESourceMailSubmissionPrivate));
150
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;
155
156         extension_class = E_SOURCE_EXTENSION_CLASS (class);
157         extension_class->name = E_SOURCE_EXTENSION_MAIL_SUBMISSION;
158
159         g_object_class_install_property (
160                 object_class,
161                 PROP_SENT_FOLDER,
162                 g_param_spec_string (
163                         "sent-folder",
164                         "Sent Folder",
165                         "Preferred folder for sent messages",
166                         NULL,
167                         G_PARAM_READWRITE |
168                         G_PARAM_CONSTRUCT |
169                         G_PARAM_STATIC_STRINGS |
170                         E_SOURCE_PARAM_SETTING));
171
172         g_object_class_install_property (
173                 object_class,
174                 PROP_TRANSPORT_UID,
175                 g_param_spec_string (
176                         "transport-uid",
177                         "Transport UID",
178                         "ESource UID of a Mail Transport",
179                         NULL,
180                         G_PARAM_READWRITE |
181                         G_PARAM_CONSTRUCT |
182                         G_PARAM_STATIC_STRINGS |
183                         E_SOURCE_PARAM_SETTING));
184
185         g_object_class_install_property (
186                 object_class,
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",
193                         FALSE,
194                         G_PARAM_READWRITE |
195                         G_PARAM_CONSTRUCT |
196                         G_PARAM_STATIC_STRINGS |
197                         E_SOURCE_PARAM_SETTING));
198 }
199
200 static void
201 e_source_mail_submission_init (ESourceMailSubmission *extension)
202 {
203         extension->priv = E_SOURCE_MAIL_SUBMISSION_GET_PRIVATE (extension);
204         g_mutex_init (&extension->priv->property_lock);
205 }
206
207 /**
208  * e_source_mail_submission_get_sent_folder:
209  * @extension: an #ESourceMailSubmission
210  *
211  * Returns a string identifying the preferred folder for sent messages.
212  * The format of the identifier string is defined by the client application.
213  *
214  * Returns: an identifier for the preferred sent folder
215  *
216  * Since: 3.6
217  **/
218 const gchar *
219 e_source_mail_submission_get_sent_folder (ESourceMailSubmission *extension)
220 {
221         g_return_val_if_fail (E_IS_SOURCE_MAIL_SUBMISSION (extension), NULL);
222
223         return extension->priv->sent_folder;
224 }
225
226 /**
227  * e_source_mail_submission_dup_sent_folder:
228  * @extension: an #ESourceMailSubmission
229  *
230  * Thread-safe variation of e_source_mail_submission_get_sent_folder().
231  * Use this function when accessing @extension from multiple threads.
232  *
233  * The returned string should be freed with g_free() when no longer needed.
234  *
235  * Returns: a newly-allocated copy of #ESourceMailSubmission:sent-folder
236  *
237  * Since: 3.6
238  **/
239 gchar *
240 e_source_mail_submission_dup_sent_folder (ESourceMailSubmission *extension)
241 {
242         const gchar *protected;
243         gchar *duplicate;
244
245         g_return_val_if_fail (E_IS_SOURCE_MAIL_SUBMISSION (extension), NULL);
246
247         g_mutex_lock (&extension->priv->property_lock);
248
249         protected = e_source_mail_submission_get_sent_folder (extension);
250         duplicate = g_strdup (protected);
251
252         g_mutex_unlock (&extension->priv->property_lock);
253
254         return duplicate;
255 }
256
257 /**
258  * e_source_mail_submission_set_sent_folder:
259  * @extension: an #ESourceMailSubmission
260  * @sent_folder: (allow-none): an identifier for the preferred sent folder,
261  *               or %NULL
262  *
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.
265  *
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
268  * instead.
269  *
270  * Since: 3.6
271  **/
272 void
273 e_source_mail_submission_set_sent_folder (ESourceMailSubmission *extension,
274                                           const gchar *sent_folder)
275 {
276         g_return_if_fail (E_IS_SOURCE_MAIL_SUBMISSION (extension));
277
278         g_mutex_lock (&extension->priv->property_lock);
279
280         if (g_strcmp0 (extension->priv->sent_folder, sent_folder) == 0) {
281                 g_mutex_unlock (&extension->priv->property_lock);
282                 return;
283         }
284
285         g_free (extension->priv->sent_folder);
286         extension->priv->sent_folder = e_util_strdup_strip (sent_folder);
287
288         g_mutex_unlock (&extension->priv->property_lock);
289
290         g_object_notify (G_OBJECT (extension), "sent-folder");
291 }
292
293 /**
294  * e_source_mail_submission_get_transport_uid:
295  * @extension: an #ESourceMailSubmission
296  *
297  * Returns the #ESource:uid of the #ESource that describes the mail
298  * transport to be used for outgoing messages.
299  *
300  * Returns: the mail transport #ESource:uid
301  *
302  * Since: 3.6
303  **/
304 const gchar *
305 e_source_mail_submission_get_transport_uid (ESourceMailSubmission *extension)
306 {
307         g_return_val_if_fail (E_IS_SOURCE_MAIL_SUBMISSION (extension), NULL);
308
309         return extension->priv->transport_uid;
310 }
311
312 /**
313  * e_source_mail_submission_dup_transport_uid:
314  * @extension: an #ESourceMailSubmission
315  *
316  * Thread-safe variation of e_source_mail_submission_get_transport_uid().
317  * Use this function when accessing @extension from multiple threads.
318  *
319  * The returned string should be freed with g_free() when no longer needed.
320  *
321  * Returns: a newly-allocated copy of #ESourceMailSubmission:transport-uid
322  *
323  * Since: 3.6
324  **/
325 gchar *
326 e_source_mail_submission_dup_transport_uid (ESourceMailSubmission *extension)
327 {
328         const gchar *protected;
329         gchar *duplicate;
330
331         g_return_val_if_fail (E_IS_SOURCE_MAIL_SUBMISSION (extension), NULL);
332
333         g_mutex_lock (&extension->priv->property_lock);
334
335         protected = e_source_mail_submission_get_transport_uid (extension);
336         duplicate = g_strdup (protected);
337
338         g_mutex_unlock (&extension->priv->property_lock);
339
340         return duplicate;
341 }
342
343 /**
344  * e_source_mail_submission_set_transport_uid:
345  * @extension: an #ESourceMailSubmission
346  * @transport_uid: (allow-none): the mail transport #ESource:uid, or %NULL
347  *
348  * Sets the #ESource:uid of the #ESource that describes the mail
349  * transport to be used for outgoing messages.
350  *
351  * Since: 3.6
352  **/
353 void
354 e_source_mail_submission_set_transport_uid (ESourceMailSubmission *extension,
355                                             const gchar *transport_uid)
356 {
357         g_return_if_fail (E_IS_SOURCE_MAIL_SUBMISSION (extension));
358
359         g_mutex_lock (&extension->priv->property_lock);
360
361         if (g_strcmp0 (extension->priv->transport_uid, transport_uid) == 0) {
362                 g_mutex_unlock (&extension->priv->property_lock);
363                 return;
364         }
365
366         g_free (extension->priv->transport_uid);
367         extension->priv->transport_uid = g_strdup (transport_uid);
368
369         g_mutex_unlock (&extension->priv->property_lock);
370
371         g_object_notify (G_OBJECT (extension), "transport-uid");
372 }
373
374 /**
375  * e_source_mail_submission_get_replies_to_origin_folder:
376  * @extension: an #ESourceMailSubmission
377  *
378  * Returns whether save replies in the folder of the message
379  * being replied to, instead of the Sent folder.
380  *
381  * Returns: whether save replies in the folder of the message being replied to
382  *
383  * Since: 3.8
384  **/
385 gboolean
386 e_source_mail_submission_get_replies_to_origin_folder (ESourceMailSubmission *extension)
387 {
388         g_return_val_if_fail (E_IS_SOURCE_MAIL_SUBMISSION (extension), FALSE);
389
390         return extension->priv->replies_to_origin_folder;
391 }
392
393 /**
394  * e_source_mail_submission_set_replies_to_origin_folder:
395  * @extension: an #ESourceMailSubmission
396  * @replies_to_origin_folder: new value
397  *
398  * Sets whether save replies in the folder of the message
399  * being replied to, instead of the Sent folder.
400  *
401  * Since: 3.8
402  **/
403 void
404 e_source_mail_submission_set_replies_to_origin_folder (ESourceMailSubmission *extension,
405                                                        gboolean replies_to_origin_folder)
406 {
407         g_return_if_fail (E_IS_SOURCE_MAIL_SUBMISSION (extension));
408
409         if (extension->priv->replies_to_origin_folder == replies_to_origin_folder)
410                 return;
411
412         extension->priv->replies_to_origin_folder = replies_to_origin_folder;
413
414         g_object_notify (G_OBJECT (extension), "replies-to-origin-folder");
415 }