/*
- * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2007 Colin Leroy <colin@colino.net> and
- * the Claws Mail team
+ * Claws Mail -- a GTK based, lightweight, and fast e-mail client
+ * Copyright (C) 1999-2023 the Claws Mail team and Colin Leroy <colin@colino.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#ifdef USE_PTHREAD
#include <pthread.h>
#endif
-#include <ical.h>
+#include <libical/ical.h>
#include "vcalendar.h"
#include "vcal_folder.h"
#include "vcal_manager.h"
#include <time.h>
#include "folder.h"
#include "quoted-printable.h"
+#include "file-utils.h"
#include "utils.h"
+#include "defs.h"
#ifdef G_OS_WIN32
#define getuid() 0
Answer *answer_new(const gchar *attendee,
const gchar *name,
- enum icalparameter_partstat ans,
- enum icalparameter_cutype cutype)
+ icalparameter_partstat ans,
+ icalparameter_cutype cutype)
{
Answer *answer = g_new0(Answer, 1);
answer->attendee = g_strdup(attendee);
dest->answers = g_slist_reverse(dest->answers);
}
-gchar *vcal_manager_answer_get_text(enum icalparameter_partstat ans)
+gchar *vcal_manager_answer_get_text(icalparameter_partstat ans)
{
static gchar *replies[5]={
N_("accepted"),
case ICAL_PARTSTAT_X:
case ICAL_PARTSTAT_INPROCESS:
case ICAL_PARTSTAT_NONE:
+ case ICAL_PARTSTAT_FAILED:
return _(replies[4]);
break;
}
return NULL;
}
-gchar *vcal_manager_cutype_get_text(enum icalparameter_cutype type)
+gchar *vcal_manager_cutype_get_text(icalparameter_cutype type)
{
static gchar *replies[5]={
N_("individual"),
return new;
}
-enum icalparameter_partstat vcal_manager_get_reply_for_attendee(VCalEvent *event, const gchar *att)
+icalparameter_partstat vcal_manager_get_reply_for_attendee(VCalEvent *event, const gchar *att)
{
Answer *a = answer_new(att, NULL, 0, 0);
GSList *ans = answer_find(event, a);
- enum icalparameter_partstat res = 0;
+ icalparameter_partstat res = 0;
if (ans) {
Answer *b = (Answer *)ans->data;
res = b->answer;
gchar *vcal_manager_get_cutype_text_for_attendee(VCalEvent *event, const gchar *att)
{
- enum icalparameter_cutype status = vcal_manager_get_cutype_for_attendee(event, att);
+ icalparameter_cutype status = vcal_manager_get_cutype_for_attendee(event, att);
gchar *res = NULL;
if (status != 0)
res = g_strdup(vcal_manager_cutype_get_text(status));
return res;
}
-enum icalparameter_partstat vcal_manager_get_cutype_for_attendee(VCalEvent *event, const gchar *att)
+icalparameter_cutype vcal_manager_get_cutype_for_attendee(VCalEvent *event, const gchar *att)
{
Answer *a = answer_new(att, NULL, 0, 0);
GSList *ans = answer_find(event, a);
- enum icalparameter_cutype res = 0;
+ icalparameter_cutype res = 0;
if (ans) {
Answer *b = (Answer *)ans->data;
res = b->cutype;
gchar *vcal_manager_get_reply_text_for_attendee(VCalEvent *event, const gchar *att)
{
- enum icalparameter_partstat status = vcal_manager_get_reply_for_attendee(event, att);
+ icalparameter_partstat status = vcal_manager_get_reply_for_attendee(event, att);
gchar *res = NULL;
if (status != 0)
res = g_strdup(vcal_manager_answer_get_text(status));
icalcomponent *calendar, *ievent, *timezone, *tzc;
icalproperty *attprop;
icalproperty *orgprop;
- enum icalparameter_partstat status = ICAL_PARTSTAT_NEEDSACTION;
+ icalparameter_partstat status = ICAL_PARTSTAT_NEEDSACTION;
gchar *sanitized_uid = g_strdup(event->uid);
subst_for_filename(sanitized_uid);
);
if (!calendar) {
- g_warning ("can't generate calendar");
+ g_warning("can't generate calendar");
g_free(organizer);
g_free(tmpfile);
g_free(attendee);
ICAL_VEVENT_COMPONENT, (void*)0);
if (!ievent) {
- g_warning ("can't generate event");
+ g_warning("can't generate event");
g_free(organizer);
g_free(tmpfile);
g_free(attendee);
icalcomponent_add_property(ievent,
icalproperty_new_uid(event->uid));
icalcomponent_add_property(ievent,
- icalproperty_vanew_dtstamp(icaltime_from_timet(time(NULL), TRUE), (void*)0));
+ icalproperty_vanew_dtstamp(icaltime_from_timet_with_zone(time(NULL), TRUE, NULL), (void*)0));
icalcomponent_add_property(ievent,
icalproperty_vanew_dtstart((icaltime_from_string(event->dtstart)), (void*)0));
icalcomponent_add_property(ievent,
icalcomponent_add_property(ievent,
icalproperty_new_sequence(modif && !is_reply ? event->sequence + 1 : event->sequence));
icalcomponent_add_property(ievent,
- icalproperty_new_class("PUBLIC"));
+ icalproperty_new_class(ICAL_CLASS_PUBLIC));
icalcomponent_add_property(ievent,
- icalproperty_new_transp("OPAQUE"));
+ icalproperty_new_transp(ICAL_TRANSP_OPAQUE));
if (event->location && *event->location)
icalcomponent_add_property(ievent,
icalproperty_new_location(event->location));
icalcomponent_add_property(ievent,
icalproperty_new_status(ICAL_STATUS_CONFIRMED));
icalcomponent_add_property(ievent,
- icalproperty_vanew_created(icaltime_from_timet(time(NULL), TRUE), (void*)0));
+ icalproperty_vanew_created(icaltime_from_timet_with_zone(time(NULL), TRUE, NULL), (void*)0));
icalcomponent_add_property(ievent,
- icalproperty_vanew_lastmodified(icaltime_from_timet(time(NULL), TRUE), (void*)0));
+ icalproperty_vanew_lastmodified(icaltime_from_timet_with_zone(time(NULL), TRUE, NULL), (void*)0));
icalcomponent_add_property(ievent,
orgprop);
"\n"
"%s", headers, icalcomponent_as_ical_string(calendar));
- if (str_write_to_file(body, tmpfile) < 0) {
+ if (str_write_to_file(body, tmpfile, FALSE) < 0) {
g_free(tmpfile);
tmpfile = NULL;
}
struct tm buft2;
lt = localtime_r(&t, &buft2);
- sscanf(asctime_r(lt, buft1), "%3s %3s %d %d:%d:%d %d\n",
- day, mon, &dd, &hh, &mm, &ss, &yyyy);
+ if (sscanf(asctime_r(lt, buft1), "%3s %3s %d %d:%d:%d %d\n",
+ day, mon, &dd, &hh, &mm, &ss, &yyyy) != 7)
+ g_warning("failed reading date/time");
g_snprintf(buf, len, "%s, %d %s %d %02d:%02d:%02d %s",
day, dd, mon, yyyy, hh, mm, ss, tzoffset(&t));
#else
GDateTime *dt = g_date_time_new_from_unix_local(t);
- gchar *buf2 = g_date_time_format(dt, "%a, %e %b %Y %H:%M:%S %z");
+ if (dt == NULL) {
+ g_warning("failed getting date/time");
+ g_snprintf(buf, len, "(NULL)");
+ return;
+ }
+
+ gchar *ret = g_date_time_format(dt, "%a, %e %b %Y %T %z");
g_date_time_unref(dt);
- strncpy(buf, buf2, len);
- g_free(buf2);
+
+ if (ret == NULL) {
+ g_warning("failed formatting date/time");
+ g_snprintf(buf, len, "(NULL)");
+ return;
+ }
+
+ g_snprintf(buf, len, ret);
+ g_free(ret);
#endif
}
{
gchar subject[512];
gchar *t_subject;
- gchar date[128];
+ gchar date[RFC822_DATE_BUFFSIZE];
time_t t;
struct tm lt;
"\n"
"%s", headers, lines);
g_free(lines);
- if (str_write_to_file(body, tmpfile) < 0) {
+ if (str_write_to_file(body, tmpfile, FALSE) < 0) {
g_free(tmpfile);
tmpfile = NULL;
} else
);
if (!calendar) {
- g_warning ("can't generate calendar");
+ g_warning("can't generate calendar");
g_free(tmpfile);
icalcomponent_free(ievent);
return NULL;
"\n"
"%s", headers, qpbody);
- if (str_write_to_file(body, tmpfile) < 0) {
+ if (str_write_to_file(body, tmpfile, FALSE) < 0) {
g_free(tmpfile);
tmpfile = NULL;
} else
const gchar *recur,
const gchar *tzid,
const gchar *url,
- enum icalproperty_method method,
+ icalproperty_method method,
gint sequence,
- enum icalcomponent_kind type)
+ icalcomponent_kind type)
{
VCalEvent *event = g_new0(VCalEvent, 1);
if (dtend && *(dtend)) {
time_t tmp = icaltime_as_timet((icaltime_from_string(dtend)));
-#ifdef G_OS_WIN32
GDateTime *dt = g_date_time_new_from_unix_local(tmp);
- event->end = g_date_time_format(dt, "%a, %e %b %Y %H:%M:%S %z");
+ event->end = g_date_time_format(dt, "%a, %e %b %Y %H:%M:%S %Z");
g_date_time_unref(dt);
-#else
- gchar buft[512];
- tzset();
- event->end = g_strdup(ctime_r(&tmp, buft));
-#endif
}
if (dtstart && *(dtstart)) {
time_t tmp = icaltime_as_timet((icaltime_from_string(dtstart)));
-#ifdef G_OS_WIN32
GDateTime *dt = g_date_time_new_from_unix_local(tmp);
- event->start = g_date_time_format(dt, "%a, %e %b %Y %H:%M:%S %z");
+ event->start = g_date_time_format(dt, "%a, %e %b %Y %H:%M:%S %Z");
g_date_time_unref(dt);
-#else
- gchar buft[512];
- tzset();
- event->start = g_strdup(ctime_r(&tmp, buft));
-#endif
}
event->dtstart = g_strdup(dtstart?dtstart:"");
event->dtend = g_strdup(dtend?dtend:"");
xml_tag_add_attr(tag, xml_attr_new("type", tmp));
g_free(tmp);
- tmp = g_strdup_printf("%lld", (long long)event->postponed);
+ tmp = g_strdup_printf("%"CM_TIME_FORMAT, event->postponed);
xml_tag_add_attr(tag, xml_attr_new("postponed", tmp));
g_free(tmp);
xml_free_tree(rootnode);
if (prefs_file_close(pfile) < 0) {
- g_warning("failed to write event.");
+ g_warning("failed to write event");
return;
}
gchar *dtstart = NULL, *dtend = NULL, *tzid = NULL;
gchar *description = NULL, *url = NULL, *recur = NULL;
VCalEvent *event = NULL;
- enum icalproperty_method method = ICAL_METHOD_REQUEST;
- enum icalcomponent_kind type = ICAL_VEVENT_COMPONENT;
+ icalproperty_method method = ICAL_METHOD_REQUEST;
+ icalcomponent_kind type = ICAL_VEVENT_COMPONENT;
gint sequence = 0, rec_occurrence = 0;
time_t postponed = (time_t)0;
g_return_val_if_fail(node->data != NULL, NULL);
xmlnode = node->data;
- if (strcmp2(xmlnode->tag->tag, "event") != 0) {
+ if (g_strcmp0(xmlnode->tag->tag, "event") != 0) {
g_warning("tag name != \"event\"");
return NULL;
}
while (node != NULL) {
gchar *attendee = NULL;
gchar *name = NULL;
- enum icalparameter_partstat answer = ICAL_PARTSTAT_NEEDSACTION;
- enum icalparameter_cutype cutype = ICAL_CUTYPE_INDIVIDUAL;
+ icalparameter_partstat answer = ICAL_PARTSTAT_NEEDSACTION;
+ icalparameter_cutype cutype = ICAL_CUTYPE_INDIVIDUAL;
xmlnode = node->data;
- if (strcmp2(xmlnode->tag->tag, "answer") != 0) {
+ if (g_strcmp0(xmlnode->tag->tag, "answer") != 0) {
g_warning("tag name != \"answer\"");
return event;
}
void vcal_manager_update_answer (VCalEvent *event,
const gchar *attendee,
const gchar *name,
- enum icalparameter_partstat ans,
- enum icalparameter_cutype cutype)
+ icalparameter_partstat ans,
+ icalparameter_cutype cutype)
{
Answer *answer = NULL;
GSList *existing = NULL;
gboolean is_pseudo_display)
{
gchar *subject = NULL;
- gchar date[128];
+ gchar date[RFC822_DATE_BUFFSIZE];
gchar *save_folder = NULL;
gchar *result = NULL;
gchar *queue_headers = NULL;
gchar *method_str = NULL;
gchar *attendees = NULL;
- enum icalparameter_partstat status;
+ icalparameter_partstat status;
gchar *prefix = NULL;
gchar enc_subject[512], enc_from[512], *from = NULL;
gchar *msgid;
gchar *orga)
{
gchar subject[512];
- gchar date[128];
+ gchar date[RFC822_DATE_BUFFSIZE];
gchar *result = NULL;
gchar *method_str = NULL;
gchar *summary = NULL;
memset(date, 0, sizeof(date));
prop = icalcomponent_get_first_property(ievent, ICAL_SUMMARY_PROPERTY);
- if (prop) {
- summary = g_strdup(icalproperty_get_summary(prop));
- icalproperty_free(prop);
- } else {
- summary = g_strdup("");
- }
+ summary = g_strdup(icalproperty_get_summary(prop));
+ icalproperty_free(prop);
+ if (!summary)
+ summary = g_strdup(_("[no summary]"));
while (strchr(summary, '\n'))
*(strchr(summary, '\n')) = ' ';
g_free(msgpath);
folder = folder_find_from_name ("vCalendar", vcal_folder_get_class());
- if (folder)
+ if (folder) {
folder_item_scan(folder->inbox);
-
- vcalviewer_reload(folder->inbox);
+ vcalviewer_reload(folder->inbox);
+ } else
+ g_warning("couldn't find vCalendar folder class");
return TRUE;
}