diff options
Diffstat (limited to 'calendar/gui')
-rw-r--r-- | calendar/gui/dialogs/meeting-page.c | 99 | ||||
-rw-r--r-- | calendar/gui/e-itip-control.c | 215 |
2 files changed, 228 insertions, 86 deletions
diff --git a/calendar/gui/dialogs/meeting-page.c b/calendar/gui/dialogs/meeting-page.c index b02efe4735..55ca96975c 100644 --- a/calendar/gui/dialogs/meeting-page.c +++ b/calendar/gui/dialogs/meeting-page.c @@ -78,9 +78,9 @@ struct attendee { char *address; char *member; - CalComponentCUType cutype; - CalComponentRole role; - CalComponentPartStat status; + icalparameter_cutype cutype; + icalparameter_role role; + icalparameter_partstat status; gboolean rsvp; char *delto; @@ -562,32 +562,32 @@ get_widgets (MeetingPage *mpage) } -static CalComponentCUType +static icalparameter_cutype text_to_type (const char *type) { if (!g_strcasecmp (type, _("Individual"))) - return CAL_COMPONENT_CUTYPE_INDIVIDUAL; + return ICAL_CUTYPE_INDIVIDUAL; else if (!g_strcasecmp (type, _("Group"))) - return CAL_COMPONENT_CUTYPE_GROUP; + return ICAL_CUTYPE_GROUP; else if (!g_strcasecmp (type, _("Resource"))) - return CAL_COMPONENT_CUTYPE_RESOURCE; + return ICAL_CUTYPE_RESOURCE; else if (!g_strcasecmp (type, _("Room"))) - return CAL_COMPONENT_CUTYPE_ROOM; + return ICAL_CUTYPE_ROOM; else - return CAL_COMPONENT_ROLE_UNKNOWN; + return ICAL_CUTYPE_NONE; } static char * -type_to_text (CalComponentCUType type) +type_to_text (icalparameter_cutype type) { switch (type) { - case CAL_COMPONENT_CUTYPE_INDIVIDUAL: + case ICAL_CUTYPE_INDIVIDUAL: return _("Individual"); - case CAL_COMPONENT_CUTYPE_GROUP: + case ICAL_CUTYPE_GROUP: return _("Group"); - case CAL_COMPONENT_CUTYPE_RESOURCE: + case ICAL_CUTYPE_RESOURCE: return _("Resource"); - case CAL_COMPONENT_CUTYPE_ROOM: + case ICAL_CUTYPE_ROOM: return _("Room"); default: return _("Unknown"); @@ -597,32 +597,32 @@ type_to_text (CalComponentCUType type) } -static CalComponentRole +static icalparameter_role text_to_role (const char *role) { if (!g_strcasecmp (role, _("Chair"))) - return CAL_COMPONENT_ROLE_CHAIR; + return ICAL_ROLE_CHAIR; else if (!g_strcasecmp (role, _("Required Participant"))) - return CAL_COMPONENT_ROLE_REQUIRED; + return ICAL_ROLE_REQPARTICIPANT; else if (!g_strcasecmp (role, _("Optional Participant"))) - return CAL_COMPONENT_ROLE_OPTIONAL; + return ICAL_ROLE_OPTPARTICIPANT; else if (!g_strcasecmp (role, _("Non-Participant"))) - return CAL_COMPONENT_ROLE_NON; + return ICAL_ROLE_NONPARTICIPANT; else - return CAL_COMPONENT_ROLE_UNKNOWN; + return ICAL_ROLE_NONE; } static char * -role_to_text (CalComponentRole role) +role_to_text (icalparameter_role role) { switch (role) { - case CAL_COMPONENT_ROLE_CHAIR: + case ICAL_ROLE_CHAIR: return _("Chair"); - case CAL_COMPONENT_ROLE_REQUIRED: + case ICAL_ROLE_REQPARTICIPANT: return _("Required Participant"); - case CAL_COMPONENT_ROLE_OPTIONAL: + case ICAL_ROLE_OPTPARTICIPANT: return _("Optional Participant"); - case CAL_COMPONENT_ROLE_NON: + case ICAL_ROLE_NONPARTICIPANT: return _("Non-Participant"); default: return _("Unknown"); @@ -649,46 +649,45 @@ boolean_to_text (gboolean b) return _("No"); } -static CalComponentPartStat +static icalparameter_partstat text_to_partstat (const char *partstat) { if (!g_strcasecmp (partstat, _("Needs Action"))) - return CAL_COMPONENT_PARTSTAT_NEEDSACTION; + return ICAL_PARTSTAT_NEEDSACTION; else if (!g_strcasecmp (partstat, _("Accepted"))) - return CAL_COMPONENT_PARTSTAT_ACCEPTED; + return ICAL_PARTSTAT_ACCEPTED; else if (!g_strcasecmp (partstat, _("Declined"))) - return CAL_COMPONENT_PARTSTAT_DECLINED; + return ICAL_PARTSTAT_DECLINED; else if (!g_strcasecmp (partstat, _("Tentative"))) - return CAL_COMPONENT_PARTSTAT_TENTATIVE; + return ICAL_PARTSTAT_TENTATIVE; else if (!g_strcasecmp (partstat, _("Delegated"))) - return CAL_COMPONENT_PARTSTAT_DELEGATED; + return ICAL_PARTSTAT_DELEGATED; else if (!g_strcasecmp (partstat, _("Completed"))) - return CAL_COMPONENT_PARTSTAT_COMPLETED; + return ICAL_PARTSTAT_COMPLETED; else if (!g_strcasecmp (partstat, _("In Process"))) - return CAL_COMPONENT_PARTSTAT_INPROCESS; + return ICAL_PARTSTAT_INPROCESS; else - return CAL_COMPONENT_PARTSTAT_UNKNOWN; + return ICAL_PARTSTAT_NONE; } static char * -partstat_to_text (CalComponentPartStat partstat) +partstat_to_text (icalparameter_partstat partstat) { switch (partstat) { - case CAL_COMPONENT_PARTSTAT_NEEDSACTION: + case ICAL_PARTSTAT_NEEDSACTION: return _("Needs Action"); - case CAL_COMPONENT_PARTSTAT_ACCEPTED: + case ICAL_PARTSTAT_ACCEPTED: return _("Accepted"); - case CAL_COMPONENT_PARTSTAT_DECLINED: + case ICAL_PARTSTAT_DECLINED: return _("Declined"); - case CAL_COMPONENT_PARTSTAT_TENTATIVE: + case ICAL_PARTSTAT_TENTATIVE: return _("Tentative"); - case CAL_COMPONENT_PARTSTAT_DELEGATED: + case ICAL_PARTSTAT_DELEGATED: return _("Delegated"); - case CAL_COMPONENT_PARTSTAT_COMPLETED: + case ICAL_PARTSTAT_COMPLETED: return _("Completed"); - case CAL_COMPONENT_PARTSTAT_INPROCESS: + case ICAL_PARTSTAT_INPROCESS: return _("In Process"); - case CAL_COMPONENT_PARTSTAT_UNKNOWN: default: return _("Unknown"); } @@ -778,13 +777,13 @@ invite_entry_changed (BonoboListener *listener, g_free (str); if (!strcmp (section, _("Chair Persons"))) - a->role = CAL_COMPONENT_ROLE_CHAIR; + a->role = ICAL_ROLE_CHAIR; else if (!strcmp (section, _("Required Participants"))) - a->role = CAL_COMPONENT_ROLE_REQUIRED; + a->role = ICAL_ROLE_REQPARTICIPANT; else if (!strcmp (section, _("Optional Participants"))) - a->role = CAL_COMPONENT_ROLE_OPTIONAL; + a->role = ICAL_ROLE_OPTPARTICIPANT; else if (!strcmp (section, _("Non-Participants"))) - a->role = CAL_COMPONENT_ROLE_NON; + a->role = ICAL_ROLE_NONPARTICIPANT; str = init_value (NULL, MEETING_RSVP_COL, mpage); a->rsvp = text_to_boolean (str); @@ -1417,6 +1416,9 @@ popup_delegate_cb (GtkWidget *widget, gpointer data) row_cnt = row_count (priv->model, mpage) - 1; e_table_model_row_changed (priv->model, priv->row); e_table_model_row_inserted (priv->model, row_cnt); + + comp_editor_page_notify_needs_send (COMP_EDITOR_PAGE (mpage)); + comp_editor_page_notify_changed (COMP_EDITOR_PAGE (mpage)); } cleanup: @@ -1462,6 +1464,9 @@ popup_delete_cb (GtkWidget *widget, gpointer data) e_table_model_row_deleted (priv->model, pos); + comp_editor_page_notify_needs_send (COMP_EDITOR_PAGE (mpage)); + comp_editor_page_notify_changed (COMP_EDITOR_PAGE (mpage)); + if (a->delto != NULL) b = find_match (mpage, a->delto, &pos); a = b; diff --git a/calendar/gui/e-itip-control.c b/calendar/gui/e-itip-control.c index 88745ff654..1d54fb6a01 100644 --- a/calendar/gui/e-itip-control.c +++ b/calendar/gui/e-itip-control.c @@ -98,7 +98,7 @@ struct _EItipControlPrivate { <input TYPE=Submit name=\"ok\" value=\"OK\"></form>" #define REPLY_OPTIONS "<form><b>Choose an action:</b><select NAME=\"action\" SIZE=\"1\"> \ -<option VALUE=\"R\">Update</option></select>    \ +<option VALUE=\"R\">Update respondent status</option></select>    \ <input TYPE=Submit name=\"ok\" value=\"OK\"></form>" #define REFRESH_OPTIONS "<form><b>Choose an action:</b><select NAME=\"action\" SIZE=\"1\"> \ @@ -348,7 +348,7 @@ find_my_address (EItipControl *itip, icalcomponent *ical_comp) for (l = priv->addresses; l != NULL; l = l->next) { ItipAddress *a = l->data; - if (strcmp (a->address, text)) { + if (!strcmp (a->address, text)) { priv->my_address = a->address; return; } @@ -357,7 +357,7 @@ find_my_address (EItipControl *itip, icalcomponent *ical_comp) } static icalproperty * -find_attendee (icalcomponent *ical_comp, char *address) +find_attendee (icalcomponent *ical_comp, const char *address) { icalproperty *prop; const char *attendee, *text; @@ -376,13 +376,30 @@ find_attendee (icalcomponent *ical_comp, char *address) attendee = icalvalue_get_string (value); text = itip_strip_mailto (attendee); - if (!strstr (text, address)) + if (strstr (text, address)) break; } return prop; } +static icalparameter_partstat +find_attendee_partstat (icalcomponent *ical_comp, const char *address) +{ + icalproperty *prop; + + prop = find_attendee (ical_comp, address); + if (prop != NULL) { + icalparameter *param; + + param = icalproperty_get_first_parameter (prop, ICAL_PARTSTAT_PARAMETER); + if (param != NULL) + return icalparameter_get_partstat (param); + } + + return ICAL_PARTSTAT_NONE; +} + static void set_label (EItipControl *itip) { @@ -512,7 +529,8 @@ write_html (EItipControl *itip, gchar *itip_desc, gchar *itip_title, gchar *opti GtkHTMLStream *html_stream; CalComponentText text; CalComponentOrganizer organizer; - GSList *l = NULL; + CalComponentAttendee *attendee; + GSList *attendees, *l = NULL; gchar *html; priv = itip->priv; @@ -535,7 +553,7 @@ write_html (EItipControl *itip, gchar *itip_desc, gchar *itip_title, gchar *opti g_free (html); /* The image */ - html = g_strdup ("<img src=\"/talking-heads.png\"></td>"); + html = g_strdup ("<img src=\"/meeting-request.png\"></td>"); gtk_html_write (GTK_HTML (priv->html), html_stream, html, strlen(html)); g_free (html); @@ -543,15 +561,38 @@ write_html (EItipControl *itip, gchar *itip_desc, gchar *itip_title, gchar *opti gtk_html_write (GTK_HTML (priv->html), html_stream, html, strlen(html)); g_free (html); - /* The organizer */ - cal_component_get_organizer (priv->comp, &organizer); - if (organizer.value != NULL) { - html = g_strdup_printf (itip_desc, - organizer.cn ? organizer.cn : itip_strip_mailto (organizer.value)); - gtk_html_write (GTK_HTML (priv->html), html_stream, html, strlen(html)); - g_free (html); + switch (priv->method) { + case ICAL_METHOD_REFRESH: + case ICAL_METHOD_REPLY: + /* An attendee sent this */ + cal_component_get_attendee_list (priv->comp, &attendees); + if (attendees != NULL) { + attendee = attendees->data; + html = g_strdup_printf (itip_desc, + attendee->cn ? + attendee->cn : + itip_strip_mailto (attendee->value)); + } else { + html = g_strdup_printf (itip_desc, "An unknown person"); + } + break; + case ICAL_METHOD_PUBLISH: + case ICAL_METHOD_REQUEST: + case ICAL_METHOD_ADD: + case ICAL_METHOD_CANCEL: + default: + /* The organizer sent this */ + cal_component_get_organizer (priv->comp, &organizer); + if (organizer.value != NULL) + html = g_strdup_printf (itip_desc, + organizer.cn ? + organizer.cn : + itip_strip_mailto (organizer.value)); + break; } - + gtk_html_write (GTK_HTML (priv->html), html_stream, html, strlen(html)); + g_free (html); + /* Describe what the user can do */ html = U_("<br> Please review the following information, " "and then select an action from the menu below."); @@ -916,6 +957,22 @@ e_itip_control_get_from_address (EItipControl *itip) return priv->from_address; } + +static void +change_status (icalcomponent *ical_comp, const char *address, icalparameter_partstat status) +{ + icalproperty *prop; + + prop = find_attendee (ical_comp, address); + if (prop) { + icalparameter *param; + + icalproperty_remove_parameter (prop, ICAL_PARTSTAT_PARAMETER); + param = icalparameter_new_partstat (status); + icalproperty_add_parameter (prop, param); + } +} + static void update_item (EItipControl *itip) { @@ -937,7 +994,7 @@ update_item (EItipControl *itip) icalcomponent_add_component (priv->top_level, clone); if (!cal_client_update_objects (client, priv->top_level)) - dialog = gnome_warning_dialog (_("I couldn't update your calendar file!\n")); + dialog = gnome_warning_dialog (_("Calendar file could not be updated!\n")); else dialog = gnome_ok_dialog (_("Update complete\n")); gnome_dialog_run_and_close (GNOME_DIALOG (dialog)); @@ -946,6 +1003,65 @@ update_item (EItipControl *itip) } static void +update_attendee_status (EItipControl *itip) +{ + EItipControlPrivate *priv; + CalClient *client; + CalClientGetStatus status; + CalComponent *comp; + CalComponentVType type; + const char *uid; + GtkWidget *dialog; + + priv = itip->priv; + + type = cal_component_get_vtype (priv->comp); + if (type == CAL_COMPONENT_TODO) + client = priv->task_client; + else + client = priv->event_client; + + /* Obtain our version */ + cal_component_get_uid (priv->comp, &uid); + status = cal_client_get_object (client, uid, &comp); + + if (status == CAL_CLIENT_GET_SUCCESS) { + GSList *attendees; + + cal_component_get_attendee_list (priv->comp, &attendees); + if (attendees != NULL) { + CalComponentAttendee *a = attendees->data; + icalparameter_partstat partstat; + + partstat = find_attendee_partstat (priv->ical_comp, itip_strip_mailto (a->value)); + + if (partstat != ICAL_PARTSTAT_NONE) { + change_status (cal_component_get_icalcomponent (comp), + itip_strip_mailto (a->value), + partstat); + } else { + dialog = gnome_warning_dialog (_("Attendee status could " + "not be updated because " + "of an invalid status!\n")); + goto cleanup; + } + } + + if (!cal_client_update_object (client, comp)) + dialog = gnome_warning_dialog (_("Attendee status ould not be updated!\n")); + else + dialog = gnome_ok_dialog (_("Attendee status updated\n")); + } else { + dialog = gnome_warning_dialog (_("Attendee status can not be updated " + "because the item no longer exists")); + } + + cleanup: + gtk_object_unref (GTK_OBJECT (comp)); + gnome_dialog_run_and_close (GNOME_DIALOG (dialog)); +} + +static void remove_item (EItipControl *itip) { EItipControlPrivate *priv; @@ -1034,24 +1150,6 @@ send_freebusy (EItipControl *itip) } static void -change_status (EItipControl *itip, gchar *address, icalparameter_partstat status) -{ - EItipControlPrivate *priv; - icalproperty *prop; - - priv = itip->priv; - - prop = find_attendee (priv->ical_comp, address); - if (prop) { - icalparameter *param; - - icalproperty_remove_parameter (prop, ICAL_PARTSTAT_PARAMETER); - param = icalparameter_new_partstat (status); - icalproperty_add_parameter (prop, param); - } -} - -static void prev_clicked_cb (GtkWidget *widget, gpointer data) { EItipControl *itip = E_ITIP_CONTROL (data); @@ -1136,22 +1234,22 @@ ok_clicked_cb (GtkHTML *html, const gchar *method, const gchar *url, const gchar update_item (itip); break; case 'A': - change_status (itip, priv->my_address, ICAL_PARTSTAT_ACCEPTED); + change_status (priv->ical_comp, priv->my_address, ICAL_PARTSTAT_ACCEPTED); update_item (itip); break; case 'T': - change_status (itip, priv->my_address, ICAL_PARTSTAT_TENTATIVE); + change_status (priv->ical_comp, priv->my_address, ICAL_PARTSTAT_TENTATIVE); update_item (itip); break; case 'D': - change_status (itip, priv->my_address, ICAL_PARTSTAT_DECLINED); + change_status (priv->ical_comp, priv->my_address, ICAL_PARTSTAT_DECLINED); update_item (itip); break; case 'F': send_freebusy (itip); break; case 'R': - update_item (itip); + update_attendee_status (itip); break; case 'S': send_item (itip); @@ -1171,6 +1269,45 @@ ok_clicked_cb (GtkHTML *html, const gchar *method, const gchar *url, const gchar } g_strfreev (fields); - if (rsvp) - itip_send_comp (CAL_COMPONENT_METHOD_REPLY, priv->comp); + if (rsvp) { + CalComponent *comp = NULL; + + comp = cal_component_clone (priv->comp); + if (comp == NULL) + return; + + if (priv->my_address != NULL) { + icalcomponent *ical_comp; + icalproperty *prop; + const char *attendee, *text; + icalvalue *value; + + ical_comp = cal_component_get_icalcomponent (comp); + + for (prop = icalcomponent_get_first_property (ical_comp, ICAL_ATTENDEE_PROPERTY); + prop != NULL; + prop = icalcomponent_get_next_property (ical_comp, ICAL_ATTENDEE_PROPERTY)) + { + value = icalproperty_get_value (prop); + if (!value) + continue; + + attendee = icalvalue_get_string (value); + text = itip_strip_mailto (attendee); + + if (!strstr (text, priv->my_address)) { + icalcomponent_remove_property (ical_comp, prop); + icalproperty_free (prop); + } + } + itip_send_comp (CAL_COMPONENT_METHOD_REPLY, comp); + } else { + GtkWidget *dialog; + + dialog = gnome_warning_dialog (_("Unable to find any of your identities" + "in the attendees list!\n")); + gnome_dialog_run_and_close (GNOME_DIALOG (dialog)); + } + gtk_object_unref (GTK_OBJECT (comp)); + } } |