1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
4 * JP Rosevear <jpr@ximian.com>
5 * Rodrigo Moya <rodrigo@ximian.com>
7 * Copyright 2003, Novell, Inc.
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of version 2 of the GNU Lesser General Public
11 * License as published by the Free Software Foundation.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
28 #include "e-gw-connection.h"
29 #include "e-gw-sendoptions.h"
30 #include "e-gw-message.h"
32 struct _EGwSendOptionsPrivate {
33 EGwSendOptionsGeneral *gopts;
34 EGwSendOptionsStatusTracking *mopts;
35 EGwSendOptionsStatusTracking *copts;
36 EGwSendOptionsStatusTracking *topts;
39 static GObjectClass *parent_class = NULL;
41 static gboolean e_gw_sendoptions_store_settings (SoupSoapParameter *param, EGwSendOptions *opts);
42 static void e_gw_sendoptions_init (GObject *object);
43 static void e_gw_sendoptions_class_init (GObjectClass *klass);
44 static void e_gw_sendoptions_dispose (GObject *object);
45 static void e_gw_sendoptions_finalize (GObject *object);
47 EGwSendOptionsGeneral*
48 e_gw_sendoptions_get_general_options (EGwSendOptions *opts)
50 g_return_val_if_fail (opts != NULL || E_IS_GW_SENDOPTIONS (opts), NULL);
52 return opts->priv->gopts;
55 EGwSendOptionsStatusTracking*
56 e_gw_sendoptions_get_status_tracking_options (EGwSendOptions *opts, char *type)
58 g_return_val_if_fail (opts != NULL || E_IS_GW_SENDOPTIONS (opts), NULL);
59 g_return_val_if_fail (type != NULL, NULL);
61 if (!g_ascii_strcasecmp (type, "mail"))
62 return opts->priv->mopts;
63 else if (!g_ascii_strcasecmp (type, "calendar"))
64 return opts->priv->copts;
65 else if (!g_ascii_strcasecmp (type, "task"))
66 return opts->priv->topts;
72 e_gw_sendoptions_dispose (GObject *object)
74 EGwSendOptions *opts = (EGwSendOptions *) object;
76 g_return_if_fail (E_IS_GW_SENDOPTIONS (opts));
78 if (parent_class->dispose)
79 (* parent_class->dispose) (object);
83 e_gw_sendoptions_finalize (GObject *object)
85 EGwSendOptions *opts = (EGwSendOptions *) object;
86 EGwSendOptionsPrivate *priv;
88 g_return_if_fail (E_IS_GW_SENDOPTIONS (opts));
103 g_free (priv->copts);
108 g_free (priv->topts);
117 if (parent_class->finalize)
118 (* parent_class->finalize) (object);
122 e_gw_sendoptions_class_init (GObjectClass *klass)
124 GObjectClass *object_class = G_OBJECT_CLASS (klass);
126 parent_class = g_type_class_peek_parent (klass);
128 object_class->dispose = e_gw_sendoptions_dispose;
129 object_class->finalize = e_gw_sendoptions_finalize;
133 e_gw_sendoptions_init (GObject *object)
135 EGwSendOptions *opts;
136 EGwSendOptionsPrivate *priv;
138 opts = E_GW_SENDOPTIONS (object);
140 /* allocate internal structure */
141 priv = g_new0 (EGwSendOptionsPrivate, 1);
142 priv->gopts = g_new0 (EGwSendOptionsGeneral, 1);
143 priv->mopts = g_new0 (EGwSendOptionsStatusTracking, 1);
144 priv->copts = g_new0 (EGwSendOptionsStatusTracking, 1);
145 priv->topts = g_new0 (EGwSendOptionsStatusTracking, 1);
150 e_gw_sendoptions_get_type (void)
152 static GType type = 0;
155 static GTypeInfo info = {
156 sizeof (EGwSendOptionsClass),
159 (GClassInitFunc) e_gw_sendoptions_class_init,
161 sizeof (EGwSendOptions),
163 (GInstanceInitFunc) e_gw_sendoptions_init,
166 type = g_type_register_static (G_TYPE_OBJECT, "EGwSendOptions", &info, 0);
173 parse_status_tracking_options (SoupSoapParameter *group_param, guint i, EGwSendOptionsStatusTracking *sopts)
175 SoupSoapParameter *subparam, *field_param, *val_param;
177 for (subparam = soup_soap_parameter_get_first_child_by_name(group_param, "setting") ;
179 subparam = soup_soap_parameter_get_next_child_by_name (subparam, "setting")) {
181 char *field = NULL, *val = NULL;
182 field_param = soup_soap_parameter_get_first_child_by_name (subparam, "field");
183 val_param = soup_soap_parameter_get_first_child_by_name (subparam, "value");
186 field = soup_soap_parameter_get_string_value (field_param);
192 if (!g_ascii_strcasecmp (field + i, "StatusInfo")) {
194 val = soup_soap_parameter_get_string_value (val_param);
197 sopts->tracking_enabled = TRUE;
198 if (!strcmp (val, "Delivered"))
199 sopts->track_when = E_GW_DELIVERED;
200 if (!strcmp (val, "DeliveredAndOpened"))
201 sopts->track_when = E_GW_DELIVERED_OPENED;
202 if (!strcmp (val, "Full"))
203 sopts->track_when = E_GW_ALL;
204 if (!strcmp (val, "None"))
205 sopts->tracking_enabled = FALSE;
207 sopts->tracking_enabled = FALSE;
209 } else if (!g_ascii_strcasecmp (field + i, "AutoDelete")) {
211 val = soup_soap_parameter_get_string_value (val_param);
214 if (!strcmp (val, "1"))
215 sopts->autodelete = TRUE;
217 sopts->autodelete = FALSE;
219 sopts->autodelete = FALSE;
221 } else if (!g_ascii_strcasecmp (field + i, "ReturnOpen")) {
223 val_param = soup_soap_parameter_get_first_child_by_name (val_param, "mail");
225 val = soup_soap_parameter_get_string_value (val_param);
227 if (val && !strcmp (val, "1")) {
228 sopts->opened = E_GW_RETURN_NOTIFY_MAIL;
230 sopts->opened = E_GW_RETURN_NOTIFY_NONE;
233 } else if (!g_ascii_strcasecmp (field + i, "ReturnDelete")) {
235 val_param = soup_soap_parameter_get_first_child_by_name (val_param, "mail");
238 val = soup_soap_parameter_get_string_value (val_param);
240 if (val && !strcmp (val, "1")) {
241 sopts->declined = E_GW_RETURN_NOTIFY_MAIL;
243 sopts->declined = E_GW_RETURN_NOTIFY_NONE;
245 } else if (!g_ascii_strcasecmp (field + i, "ReturnAccept")) {
247 val_param = soup_soap_parameter_get_first_child_by_name (val_param, "mail");
250 val = soup_soap_parameter_get_string_value (val_param);
252 if (val && !strcmp (val, "1")) {
253 sopts->accepted = E_GW_RETURN_NOTIFY_MAIL;
255 sopts->accepted = E_GW_RETURN_NOTIFY_NONE;
258 } else if (!g_ascii_strcasecmp (field + i, "ReturnCompleted")) {
260 val_param = soup_soap_parameter_get_first_child_by_name (val_param, "mail");
263 val = soup_soap_parameter_get_string_value (val_param);
265 if (val && !strcmp (val, "1")) {
266 sopts->completed = E_GW_RETURN_NOTIFY_MAIL;
268 sopts->completed = E_GW_RETURN_NOTIFY_NONE;
276 /* These are not actually general Options. These can be configured seperatly for
277 each component. Since win32 shows them as general options, we too do the same
278 way. So the Options are take from the mail setttings */
281 parse_general_options (SoupSoapParameter *group_param, EGwSendOptionsGeneral *gopts)
283 SoupSoapParameter *subparam, *field_param, *val_param;
285 for (subparam = soup_soap_parameter_get_first_child_by_name(group_param, "setting") ;
287 subparam = soup_soap_parameter_get_next_child_by_name (subparam, "setting")) {
288 char *field = NULL, *val = NULL;
289 field_param = soup_soap_parameter_get_first_child_by_name (subparam, "field");
290 val_param = soup_soap_parameter_get_first_child_by_name (subparam, "value");
293 field = soup_soap_parameter_get_string_value (field_param);
299 if (!g_ascii_strcasecmp (field, "mailPriority")) {
301 val = soup_soap_parameter_get_string_value (val_param);
304 if (!g_ascii_strcasecmp (val, "High"))
305 gopts->priority = E_GW_PRIORITY_HIGH;
306 else if (!g_ascii_strcasecmp (val, "Standard")) {
307 gopts->priority = E_GW_PRIORITY_STANDARD;
308 } else if (!g_ascii_strcasecmp (val, "Low"))
309 gopts->priority = E_GW_PRIORITY_LOW;
311 gopts->priority = E_GW_PRIORITY_UNDEFINED;
314 gopts->priority = E_GW_PRIORITY_UNDEFINED;
315 } else if (!g_ascii_strcasecmp (field, "mailReplyRequested")) {
317 val = soup_soap_parameter_get_string_value (val_param);
320 if (!g_ascii_strcasecmp (val, "None"))
321 gopts->reply_enabled = FALSE;
322 else if (!g_ascii_strcasecmp (val, "WhenConvenient")) {
323 gopts->reply_enabled = TRUE;
324 gopts->reply_convenient = TRUE;
329 val_param = soup_soap_parameter_get_first_child_by_name (val_param, "WithinNDays");
330 temp = soup_soap_parameter_get_string_value (val_param);
335 gopts->reply_within = i;
336 gopts->reply_enabled = TRUE;
340 } else if (!g_ascii_strcasecmp (field, "mailExpireDays")) {
342 val = soup_soap_parameter_get_string_value (val_param);
347 gopts->expiration_enabled = TRUE;
349 gopts->expiration_enabled = FALSE;
351 gopts->expire_after = i;
353 gopts->expiration_enabled = FALSE;
360 /* These settings are common to all components */
363 parse_advanced_settings (SoupSoapParameter *group_param, EGwSendOptionsGeneral *gopts)
365 SoupSoapParameter *subparam, *field_param, *val_param;
367 for (subparam = soup_soap_parameter_get_first_child_by_name(group_param, "setting") ;
369 subparam = soup_soap_parameter_get_next_child_by_name (subparam, "setting")) {
370 char *field = NULL, *val = NULL;
371 field_param = soup_soap_parameter_get_first_child_by_name (subparam, "field");
372 val_param = soup_soap_parameter_get_first_child_by_name (subparam, "value");
375 field = soup_soap_parameter_get_string_value (field_param);
381 if (!g_ascii_strcasecmp (field, "delayDelivery")) {
383 val = soup_soap_parameter_get_string_value (val_param);
387 gopts->delay_enabled = TRUE;
388 gopts->delay_until = i;
390 gopts->delay_enabled = FALSE;
392 gopts->delay_enabled = FALSE;
397 /* TODO have to handle the locked settings */
399 e_gw_sendoptions_store_settings (SoupSoapParameter *param, EGwSendOptions *opts)
401 SoupSoapParameter *group_param;
402 EGwSendOptionsPrivate *priv;
406 for (group_param = soup_soap_parameter_get_first_child_by_name(param, "group") ;
407 group_param != NULL ;
408 group_param = soup_soap_parameter_get_next_child_by_name (group_param, "group")) {
411 temp = soup_soap_parameter_get_property (group_param, "type");
416 if (!g_ascii_strcasecmp (temp, "MailMessageSettings")) {
417 parse_status_tracking_options (group_param, 4, priv->mopts);
418 parse_general_options (group_param, priv->gopts);
421 if (!g_ascii_strcasecmp (temp, "AppointmentMessageSettings")) {
422 parse_status_tracking_options (group_param, 11, priv->copts);
424 if (!g_ascii_strcasecmp (temp, "TaskMessageSettings"))
425 parse_status_tracking_options (group_param, 4, priv->topts);
427 if (!g_ascii_strcasecmp (temp, "AdvancedSettings"))
428 parse_advanced_settings (group_param, priv->gopts);
437 e_gw_sendoptions_write_settings (SoupSoapMessage *msg, char *field_name, char *value, char *value_name, gboolean value_direct)
439 soup_soap_message_start_element (msg, "setting", NULL, NULL);
441 soup_soap_message_start_element (msg, "field", NULL, NULL);
442 soup_soap_message_write_string (msg, field_name);
443 soup_soap_message_end_element (msg);
445 soup_soap_message_start_element (msg, "value", NULL, NULL);
448 e_gw_message_write_string_parameter (msg, value_name, NULL, value);
450 soup_soap_message_write_string (msg, value);
452 soup_soap_message_end_element (msg);
454 soup_soap_message_end_element (msg);
458 set_status_tracking_changes (SoupSoapMessage *msg, EGwSendOptionsStatusTracking *n_sopts, EGwSendOptionsStatusTracking *o_sopts, char *comp)
460 char *value, *comp_name = NULL;
462 if (n_sopts->tracking_enabled != o_sopts->tracking_enabled || n_sopts->track_when != o_sopts->track_when) {
463 if (n_sopts->tracking_enabled) {
464 if (n_sopts->track_when == E_GW_DELIVERED)
465 value = g_strdup ("Delivered");
466 else if (n_sopts->track_when == E_GW_DELIVERED_OPENED)
467 value = g_strdup ("DeliveredAndOpened");
469 value = g_strdup ("Full");
471 value = g_strdup ("None");
472 comp_name = g_strconcat (comp, "StatusInfo", NULL);
473 e_gw_sendoptions_write_settings (msg, comp_name, value, NULL, TRUE);
474 g_free (comp_name), comp_name = NULL;
475 g_free (value), value = NULL;
478 if (!strcmp (comp, "mail")) {
479 if (n_sopts->autodelete != o_sopts->autodelete) {
480 if (n_sopts->autodelete)
481 value = g_strdup ("1");
483 value = g_strdup ("0");
484 comp_name = g_strconcat (comp, "AutoDelete", NULL);
485 e_gw_sendoptions_write_settings (msg, comp_name, value, NULL, TRUE);
486 g_free (comp_name), comp_name = NULL;
487 g_free (value), value = NULL;
491 if (n_sopts->opened != o_sopts->opened) {
492 comp_name = g_strconcat (comp, "ReturnOpen", NULL);
493 if (n_sopts->opened == E_GW_RETURN_NOTIFY_MAIL) {
494 value = g_strdup ("1");
495 e_gw_sendoptions_write_settings (msg, comp_name, value, "mail", FALSE);
497 value = g_strdup ("None");
498 e_gw_sendoptions_write_settings (msg, comp_name, value, NULL, TRUE);
501 g_free (comp_name), comp_name = NULL;
502 g_free (value), value = NULL;
505 if (n_sopts->declined != o_sopts->declined) {
506 comp_name = g_strconcat (comp, "ReturnDelete", NULL);
507 if (n_sopts->declined == E_GW_RETURN_NOTIFY_MAIL) {
508 value = g_strdup ("1");
509 e_gw_sendoptions_write_settings (msg, comp_name, value, "mail", FALSE);
511 value = g_strdup ("None");
512 e_gw_sendoptions_write_settings (msg, comp_name, value, NULL, TRUE);
515 g_free (comp_name), comp_name = NULL;
516 g_free (value), value = NULL;
519 if (!strcmp (comp, "appointment") || !strcmp (comp, "task")) {
520 if (n_sopts->accepted != o_sopts->accepted) {
521 comp_name = g_strconcat (comp, "ReturnAccept", NULL);
522 if (n_sopts->accepted == E_GW_RETURN_NOTIFY_MAIL) {
523 value = g_strdup ("1");
524 e_gw_sendoptions_write_settings (msg, comp_name, value, "mail", FALSE);
526 value = g_strdup ("None");
527 e_gw_sendoptions_write_settings (msg, comp_name, value, NULL, TRUE);
530 g_free (comp_name), comp_name = NULL;
531 g_free (value), value = NULL;
535 if (!strcmp (comp, "task")) {
536 if (n_sopts->completed != o_sopts->completed) {
537 comp_name = g_strconcat (comp, "ReturnCompleted", NULL);
538 if (n_sopts->completed == E_GW_RETURN_NOTIFY_MAIL) {
539 value = g_strdup ("1");
540 e_gw_sendoptions_write_settings (msg, comp_name, value, "mail", FALSE);
542 value = g_strdup ("None");
543 e_gw_sendoptions_write_settings (msg, comp_name, value, NULL, TRUE);
546 g_free (comp_name), comp_name = NULL;
547 g_free (value), value = NULL;
554 set_general_options_changes (SoupSoapMessage *msg, EGwSendOptionsGeneral *n_gopts, EGwSendOptionsGeneral *o_gopts)
558 if (n_gopts->priority != o_gopts->priority) {
559 if (n_gopts->priority == E_GW_PRIORITY_HIGH)
560 value = g_strdup ("High");
561 else if (n_gopts->priority == E_GW_PRIORITY_STANDARD)
562 value = g_strdup ("Standard");
563 else if (n_gopts->priority == E_GW_PRIORITY_LOW)
564 value = g_strdup ("Low");
567 e_gw_sendoptions_write_settings (msg, "mailPriority", value, NULL, TRUE);
568 e_gw_sendoptions_write_settings (msg, "appointmentPriority", value, NULL, TRUE);
569 e_gw_sendoptions_write_settings (msg, "taskPriority", value, NULL, TRUE);
570 g_free (value), value = NULL;
573 if (n_gopts->reply_enabled != o_gopts->reply_enabled || n_gopts->reply_convenient != o_gopts->reply_convenient ||
574 n_gopts->reply_within != o_gopts->reply_within) {
576 if (n_gopts->reply_enabled) {
577 if (n_gopts->reply_convenient)
578 value = g_strdup ("WhenConvenient");
580 value = g_strdup_printf ("%d", n_gopts->reply_within);
582 value = g_strdup ("None");
584 if (n_gopts->reply_enabled && !n_gopts->reply_convenient)
585 e_gw_sendoptions_write_settings (msg, "mailReplyRequested", value, "WithinNDays" , FALSE);
587 e_gw_sendoptions_write_settings (msg, "mailReplyRequested", value, NULL, TRUE);
589 g_free (value), value = NULL;
592 if (n_gopts->expiration_enabled != o_gopts->expiration_enabled || n_gopts->expire_after != o_gopts->expire_after) {
593 if (n_gopts->expiration_enabled) {
594 value = g_strdup_printf ("%d", n_gopts->expire_after);
596 value = g_strdup ("0");
598 e_gw_sendoptions_write_settings (msg, "mailExpireDays", value, NULL, TRUE);
599 g_free (value), value = NULL;
602 if (n_gopts->delay_enabled != o_gopts->delay_enabled || n_gopts->delay_until != o_gopts->delay_until) {
603 if (n_gopts->delay_enabled) {
604 value = g_strdup_printf ("%d", n_gopts->delay_until);
606 value = g_strdup ("-1");
608 e_gw_sendoptions_write_settings (msg, "delayDelivery", value, NULL, TRUE);
609 g_free (value), value = NULL;
613 /* n_opts has the new options, o_opts has the old options settings */
615 e_gw_sendoptions_form_message_to_modify (SoupSoapMessage *msg, EGwSendOptions *n_opts, EGwSendOptions *o_opts)
617 g_return_val_if_fail (n_opts != NULL || o_opts != NULL, FALSE);
618 g_return_val_if_fail (E_IS_GW_SENDOPTIONS (n_opts) || E_IS_GW_SENDOPTIONS (o_opts), FALSE);
620 soup_soap_message_start_element (msg, "settings", NULL, NULL);
622 set_general_options_changes (msg, n_opts->priv->gopts, o_opts->priv->gopts);
623 set_status_tracking_changes (msg, n_opts->priv->mopts, o_opts->priv->mopts, "mail");
624 set_status_tracking_changes (msg, n_opts->priv->copts, o_opts->priv->copts, "appointment");
625 set_status_tracking_changes (msg, n_opts->priv->topts, o_opts->priv->topts, "task");
627 soup_soap_message_end_element (msg);
633 e_gw_sendoptions_new (void)
635 EGwSendOptions *opts;
637 opts = g_object_new (E_TYPE_GW_SENDOPTIONS, NULL);
643 e_gw_sendoptions_new_from_soap_parameter (SoupSoapParameter *param)
645 EGwSendOptions *opts;
647 g_return_val_if_fail (param != NULL, NULL);
649 opts = g_object_new (E_TYPE_GW_SENDOPTIONS, NULL);
651 if (!e_gw_sendoptions_store_settings (param, opts)){
652 g_object_unref (opts);