talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit 93e856cf6e569681ad4c65808d3a136589330cab
parent dd0921d2805f60cbb477c50e419e170253dea242
Author: Colin Leroy-Mira <colin@colino.net>
Date:   Wed, 28 Aug 2024 17:22:49 +0200

Handle CREATED/LAST_MODIFIED correctly

Diffstat:
Msrc/plugins/vcalendar/vcal_folder.c | 21+++++++++++++++++++--
Msrc/plugins/vcalendar/vcal_manager.c | 34+++++++++++++++++++++++++++++-----
Msrc/plugins/vcalendar/vcal_manager.h | 6+++++-
Msrc/plugins/vcalendar/vcal_meeting_gtk.c | 19+++++++++++++++----
Msrc/plugins/vcalendar/vcalendar.c | 6+++++-
5 files changed, 73 insertions(+), 13 deletions(-)

diff --git a/src/plugins/vcalendar/vcal_folder.c b/src/plugins/vcalendar/vcal_folder.c @@ -805,7 +805,8 @@ GSList *vcal_get_events_list(FolderItem *item) event->location, event->summary, event->description, new_start, new_end, NULL, event->tzid, event->url, event->method, - event->sequence, event->type); + event->sequence, event->created, event->last_modified, + event->type); g_free(uid); vcal_manager_copy_attendees(event, nevent); nevent->rec_occurrence = TRUE; @@ -2294,6 +2295,8 @@ VCalEvent *vcal_get_event_from_ical(const gchar *ical, const gchar *charset) gchar *tzid = NULL; gchar *recur = NULL; int sequence = 0; + gchar *created = NULL; + gchar *last_modified = NULL; enum icalproperty_method method = ICAL_METHOD_REQUEST; enum icalcomponent_kind type = ICAL_VEVENT_COMPONENT; GSList *attendees = NULL; @@ -2358,6 +2361,18 @@ VCalEvent *vcal_get_event_from_ical(const gchar *ical, const gchar *charset) sequence = icalproperty_get_sequence(prop); icalproperty_free(prop); } + GET_PROP(comp, prop, ICAL_CREATED_PROPERTY); + if (prop) { + created = g_strdup(icaltime_as_ical_string(icalproperty_get_created(prop))); + TO_UTF8(created); + icalproperty_free(prop); + } + GET_PROP(comp, prop, ICAL_LASTMODIFIED_PROPERTY); + if (prop) { + last_modified = g_strdup(icaltime_as_ical_string(icalproperty_get_lastmodified(prop))); + TO_UTF8(last_modified); + icalproperty_free(prop); + } GET_PROP(comp, prop, ICAL_METHOD_PROPERTY); if (prop) { method = icalproperty_get_method(prop); @@ -2436,13 +2451,15 @@ VCalEvent *vcal_get_event_from_ical(const gchar *ical, const gchar *charset) location, summary, description, dtstart, dtend, recur, tzid, url, - method, sequence, type); + method, sequence, created, last_modified, type); event->answers = attendees; g_free(uid); g_free(location); g_free(summary); g_free(dtstart); g_free(dtend); + g_free(created); + g_free(last_modified); g_free(org_email); g_free(org_name); g_free(description); diff --git a/src/plugins/vcalendar/vcal_manager.c b/src/plugins/vcalendar/vcal_manager.c @@ -414,6 +414,7 @@ gchar *vcal_manager_event_dump(VCalEvent *event, gboolean is_reply, gboolean is_ icalproperty_new_class(ICAL_CLASS_PUBLIC)); icalcomponent_add_property(ievent, icalproperty_new_transp(ICAL_TRANSP_OPAQUE)); + if (event->location && *event->location) icalcomponent_add_property(ievent, icalproperty_new_location(event->location)); @@ -422,10 +423,20 @@ gchar *vcal_manager_event_dump(VCalEvent *event, gboolean is_reply, gboolean is_ icalproperty_new_location("")); icalcomponent_add_property(ievent, icalproperty_new_status(ICAL_STATUS_CONFIRMED)); - icalcomponent_add_property(ievent, - icalproperty_vanew_created(icaltime_from_timet_with_zone(time(NULL), TRUE, NULL), (void*)0)); - icalcomponent_add_property(ievent, - icalproperty_vanew_lastmodified(icaltime_from_timet_with_zone(time(NULL), TRUE, NULL), (void*)0)); + if (event->created != NULL && event->created[0] != '\0') { + icalcomponent_add_property(ievent, + icalproperty_vanew_created(icaltime_from_string(event->created), (void*)0)); + } else { + icalcomponent_add_property(ievent, + icalproperty_vanew_created(icaltime_from_timet_with_zone(time(NULL), FALSE, NULL), (void*)0)); + } + if (event->last_modified != NULL && event->last_modified[0] != '\0' && !modif) { + icalcomponent_add_property(ievent, + icalproperty_vanew_lastmodified(icaltime_from_string(event->last_modified), (void*)0)); + } else { + icalcomponent_add_property(ievent, + icalproperty_vanew_lastmodified(icaltime_from_timet_with_zone(time(NULL), FALSE, NULL), (void*)0)); + } icalcomponent_add_property(ievent, orgprop); @@ -794,6 +805,8 @@ VCalEvent * vcal_manager_new_event (const gchar *uid, const gchar *url, icalproperty_method method, gint sequence, + const gchar *created, + const gchar *last_modified, icalcomponent_kind type) { VCalEvent *event = g_new0(VCalEvent, 1); @@ -825,6 +838,8 @@ VCalEvent * vcal_manager_new_event (const gchar *uid, event->tzid = g_strdup(tzid?tzid:""); event->method = method; event->sequence = sequence; + event->created = g_strdup(created?created:""); + event->last_modified = g_strdup(last_modified?last_modified:""); event->type = type; event->rec_occurrence = FALSE; while (strchr(event->summary, '\n')) @@ -932,6 +947,8 @@ void vcal_manager_save_event (VCalEvent *event, gboolean export_after) tmp = g_strdup_printf("%d", event->sequence); xml_tag_add_attr(tag, xml_attr_new("sequence", tmp)); + xml_tag_add_attr(tag, xml_attr_new("created", event->created)); + xml_tag_add_attr(tag, xml_attr_new("last_modified", event->last_modified)); g_free(tmp); tmp = g_strdup_printf("%d", event->type); @@ -1004,6 +1021,7 @@ static VCalEvent *event_get_from_xml (const gchar *uid, GNode *node) GList *list; gchar *org = NULL, *location = NULL, *summary = NULL, *orgname = NULL; gchar *dtstart = NULL, *dtend = NULL, *tzid = NULL; + gchar *created = NULL, *last_modified = NULL; gchar *description = NULL, *url = NULL, *recur = NULL; VCalEvent *event = NULL; icalproperty_method method = ICAL_METHOD_REQUEST; @@ -1050,6 +1068,10 @@ static VCalEvent *event_get_from_xml (const gchar *uid, GNode *node) method = atoi(attr->value); if (!strcmp(attr->name, "sequence")) sequence = atoi(attr->value); + if (!strcmp(attr->name, "created")) + created = g_strdup(attr->value); + if (!strcmp(attr->name, "last_modified")) + last_modified = g_strdup(attr->value); if (!strcmp(attr->name, "postponed")) postponed = atoi(attr->value); if (!strcmp(attr->name, "rec_occurrence")) @@ -1058,7 +1080,7 @@ static VCalEvent *event_get_from_xml (const gchar *uid, GNode *node) event = vcal_manager_new_event(uid, org, orgname, location, summary, description, dtstart, dtend, recur, tzid, url, method, - sequence, type); + sequence, created, last_modified, type); event->postponed = postponed; event->rec_occurrence = rec_occurrence; @@ -1073,6 +1095,8 @@ static VCalEvent *event_get_from_xml (const gchar *uid, GNode *node) g_free(dtend); g_free(recur); g_free(tzid); + g_free(created); + g_free(last_modified); node = node->children; while (node != NULL) { diff --git a/src/plugins/vcalendar/vcal_manager.h b/src/plugins/vcalendar/vcal_manager.h @@ -49,7 +49,9 @@ struct _VCalEvent gchar *description; GSList *answers; enum icalproperty_method method; - gint sequence; + gint sequence; + gchar *created; + gchar *last_modified; gchar *url; enum icalcomponent_kind type; time_t postponed; @@ -85,6 +87,8 @@ VCalEvent *vcal_manager_new_event (const gchar *uid, const gchar *url, enum icalproperty_method method, gint sequence, + const gchar *created, + const gchar *last_modified, enum icalcomponent_kind type); void vcal_manager_free_event (VCalEvent *event); diff --git a/src/plugins/vcalendar/vcal_meeting_gtk.c b/src/plugins/vcalendar/vcal_meeting_gtk.c @@ -89,6 +89,8 @@ struct _VCalMeeting GtkWidget *total_avail_msg; PrefsAccount *account; gboolean visible; + gchar *created; + gchar *last_modified; }; struct _VCalAttendee { @@ -1242,11 +1244,17 @@ static gboolean send_meeting_cb(GtkButton *widget, gpointer data) location = get_location(meet); summary = get_summary(meet); description = get_description(meet); - + + if (meet->created == NULL) { + meet->created = g_strdup(icaltime_as_ical_string(icaltime_from_timet_with_zone(time(NULL), FALSE, NULL))); + } + if (meet->last_modified == NULL) { + meet->last_modified = g_strdup(icaltime_as_ical_string(icaltime_from_timet_with_zone(time(NULL), FALSE, NULL))); + } event = vcal_manager_new_event(uid, organizer, organizer_name, location, summary, description, dtstart, dtend, NULL, tzid, NULL, meet->method, meet->sequence, - ICAL_VEVENT_COMPONENT); + meet->created, meet->last_modified, ICAL_VEVENT_COMPONENT); vcal_manager_update_answer(event, organizer, organizer_name, ICAL_PARTSTAT_ACCEPTED, @@ -1381,15 +1389,18 @@ static VCalMeeting *vcal_meeting_create_real(VCalEvent *event, gboolean visible) if (event) { meet->uid = g_strdup(event->uid); meet->sequence = event->sequence + 1; + meet->created = event->created ? g_strdup(event->created) : NULL; + meet->last_modified = NULL; /* Make sure to update modification time */ + meet->method = (event->method == ICAL_METHOD_CANCEL ? ICAL_METHOD_CANCEL:ICAL_METHOD_REQUEST); gtk_entry_set_text(GTK_ENTRY(meet->location), event->location); gtk_entry_set_text(GTK_ENTRY(meet->summary), event->summary); gtk_text_buffer_set_text(buffer, event->description, -1); - } else + } else { meet->method = ICAL_METHOD_REQUEST; - + } meet->save_btn = gtk_button_new_with_label(_("Save & Send")); meet->avail_btn = gtk_button_new_with_label(_("Check availability")); diff --git a/src/plugins/vcalendar/vcalendar.c b/src/plugins/vcalendar/vcalendar.c @@ -162,6 +162,8 @@ static void create_meeting_from_message_cb_ui(GtkAction *action, gpointer data) gchar *url = NULL; gint method = ICAL_METHOD_REQUEST; gint sequence = 1; + gchar *created = g_strdup(icaltime_as_ical_string(icaltime_from_timet_with_zone(time(NULL), FALSE, NULL))); + gchar *last_modified = g_strdup(icaltime_as_ical_string(icaltime_from_timet_with_zone(time(NULL), FALSE, NULL))); PrefsAccount *account = NULL; claws_fclose(fp); @@ -182,7 +184,7 @@ static void create_meeting_from_message_cb_ui(GtkAction *action, gpointer data) event = vcal_manager_new_event(uid, org, NULL, NULL/*location*/, summary, description, dtstart, dtend, recur, tzid, url, method, sequence, - ICAL_VTODO_COMPONENT); + created, last_modified, ICAL_VTODO_COMPONENT); g_free(uid); /* hack to get default hours */ @@ -204,6 +206,8 @@ bail: g_free(recur); g_free(tzid); g_free(url); + g_free(created); + g_free(last_modified); } procmsg_msginfo_free(&msginfo);