static void vcal_folder_set_batch (Folder *folder,
FolderItem *item,
gboolean batch);
+static void convert_to_utc(icalcomponent *calendar);
gboolean vcal_subscribe_uri(Folder *folder, const gchar *uri);
static FolderViewPopup vcal_popup =
{
- "vCalendar",
+ PLUGIN_NAME,
"<vCalendar>",
vcal_popup_entries,
G_N_ELEMENTS(vcal_popup_entries),
void vcal_folder_refresh_cal(FolderItem *item)
{
- Folder *folder = folder_find_from_name ("vCalendar", vcal_folder_get_class());
+ Folder *folder = folder_find_from_name (PLUGIN_NAME, vcal_folder_get_class());
if (item->folder != folder)
return;
if (((VCalFolderItem *)(item))->dw)
if (vcal_class.idstr == NULL) {
debug_print("register class\n");
vcal_class.type = F_UNKNOWN;
- vcal_class.idstr = "vCalendar";
- vcal_class.uistr = "vCalendar";
+ vcal_class.idstr = PLUGIN_NAME;
+ vcal_class.uistr = PLUGIN_NAME;
/* Folder functions */
vcal_class.new_folder = vcal_folder_new;
}
if (rprop && ritr) {
struct icaldurationtype ical_dur;
- struct icaltimetype dtstart, dtend;
+ struct icaltimetype dtstart = icaltime_null_time();
+ struct icaltimetype dtend = icaltime_null_time();
evt = icalcomponent_new_clone(evt);
prop = icalcomponent_get_first_property(evt, ICAL_RRULE_PROPERTY);
if (prop) {
prop = icalcomponent_get_first_property(evt, ICAL_DTSTART_PROPERTY);
if (prop)
dtstart = icalproperty_get_dtstart(prop);
+ else
+ debug_print("event has no DTSTART!\n");
prop = icalcomponent_get_first_property(evt, ICAL_DTEND_PROPERTY);
if (prop)
dtend = icalproperty_get_dtend(prop);
+ else
+ debug_print("event has no DTEND!\n");
ical_dur = icaltime_subtract(dtend, dtstart);
next = icalrecur_iterator_next(ritr);
if (!icaltime_is_null_time(next) &&
next = icalrecur_iterator_next(ritr);
debug_print("next time is %snull\n", icaltime_is_null_time(next)?"":"not ");
while (!icaltime_is_null_time(next) && i < 100) {
- gchar *new_start = NULL, *new_end = NULL;
+ const gchar *new_start = NULL, *new_end = NULL;
VCalEvent *nevent = NULL;
gchar *uid = g_strdup_printf("%s-%d", event->uid, i);
new_start = icaltime_as_ical_string(next);
GSList * vcal_folder_get_waiting_events(void)
{
- Folder *folder = folder_find_from_name ("vCalendar", vcal_folder_get_class());
+ Folder *folder = folder_find_from_name (PLUGIN_NAME, vcal_folder_get_class());
return vcal_get_events_list(folder->inbox);
}
GSList * vcal_folder_get_webcal_events(void)
{
GetWebcalData *data = g_new0(GetWebcalData, 1);
- Folder *folder = folder_find_from_name ("vCalendar", vcal_folder_get_class());
+ Folder *folder = folder_find_from_name (PLUGIN_NAME, vcal_folder_get_class());
GSList *list = NULL;
data->item = NULL;
g_node_traverse(folder->node, G_PRE_ORDER,
void vcal_folder_free_data(void)
{
- Folder *folder = folder_find_from_name ("vCalendar", vcal_folder_get_class());
+ Folder *folder = folder_find_from_name (PLUGIN_NAME, vcal_folder_get_class());
g_node_traverse(folder->node, G_PRE_ORDER,
G_TRAVERSE_ALL, -1, vcal_free_data_func, NULL);
GSList * vcal_folder_get_webcal_events_for_folder(FolderItem *item)
{
GetWebcalData *data = g_new0(GetWebcalData, 1);
- Folder *folder = folder_find_from_name ("vCalendar", vcal_folder_get_class());
+ Folder *folder = folder_find_from_name (PLUGIN_NAME, vcal_folder_get_class());
GSList *list = NULL;
data->item = item;
g_node_traverse(folder->node, G_PRE_ORDER,
static FolderItem *get_folder_item_for_uri(const gchar *uri)
{
- Folder *root = folder_find_from_name ("vCalendar", vcal_folder_get_class());
+ Folder *root = folder_find_from_name (PLUGIN_NAME, vcal_folder_get_class());
gpointer d[2];
if (root == NULL)
static void update_subscription_finish(const gchar *uri, gchar *feed, gboolean verbose, gchar *error)
{
- Folder *root = folder_find_from_name ("vCalendar", vcal_folder_get_class());
+ Folder *root = folder_find_from_name (PLUGIN_NAME, vcal_folder_get_class());
FolderItem *item = NULL;
icalcomponent *cal = NULL;
}
if (feed == NULL) {
+ gchar *err_msg = _("Could not retrieve the Webcal URL:\n%s:\n\n%s");
+
if (verbose && manual_update) {
- gchar *tmp;
- tmp = g_strdup(uri);
+ gchar *tmp = g_strdup(uri);
if (strlen(uri) > 61) {
tmp[55]='[';
tmp[56]='.';
tmp[59]=']';
tmp[60]='\0';
}
- alertpanel_error(_("Could not retrieve the Webcal URL:\n%s:\n\n%s"),
- tmp, error ? error:_("Unknown error"));
+ alertpanel_error(err_msg, tmp, error ? error:_("Unknown error"));
g_free(tmp);
} else {
- log_error(LOG_PROTOCOL, _("Could not retrieve the Webcal URL:\n%s:\n\n%s\n"),
- uri, error ? error:_("Unknown error"));
+ gchar *msg = g_strdup_printf("%s\n", err_msg);
+ log_error(LOG_PROTOCOL, msg, uri, error ? error:_("Unknown error"));
+ g_free(msg);
}
main_window_cursor_normal(mainwindow_get_mainwindow());
g_free(feed);
return;
}
if (strncmp(feed, "BEGIN:VCALENDAR", strlen("BEGIN:VCALENDAR"))) {
+ gchar *err_msg = _("This URL does not look like a Webcal URL:\n%s\n%s");
+
if (verbose && manual_update) {
- alertpanel_error(_("This URL does not look like a Webcal URL:\n%s\n%s"),
- uri, error ? error:_("Unknown error"));
+ alertpanel_error(err_msg, uri, error ? error:_("Unknown error"));
} else {
- log_error(LOG_PROTOCOL, _("This URL does not look like a Webcal URL:\n%s\n%s\n"),
- uri, error ? error:_("Unknown error"));
+ gchar *msg = g_strdup_printf("%s\n", err_msg);
+ log_error(LOG_PROTOCOL, msg, uri, error ? error:_("Unknown error"));
+ g_free(msg);
}
g_free(feed);
main_window_cursor_normal(mainwindow_get_mainwindow());
/* if title differs, update it */
}
cal = icalparser_parse_string(feed);
+
+ convert_to_utc(cal);
if (((VCalFolderItem *)item)->cal)
icalcomponent_free(((VCalFolderItem *)item)->cal);
static void check_subs_cb(GtkAction *action, gpointer data)
{
- Folder *root = folder_find_from_name ("vCalendar", vcal_folder_get_class());
+ Folder *root = folder_find_from_name (PLUGIN_NAME, vcal_folder_get_class());
if (prefs_common_get_prefs()->work_offline &&
!inc_offline_should_override(TRUE,
return email;
}
-static void adjust_for_local_time_zone(icalproperty *eventtime, icalproperty *tzoffsetto, int dtstart)
+static void convert_to_utc(icalcomponent *calendar)
{
- int tzoffset;
- int loctzoffset;
- time_t loctime, gmttime, evttime;
- struct icaltimetype icaltime;
-
- /* calculate local UTC offset */
- loctime = time(NULL);
- loctime = mktime(localtime(&loctime));
- gmttime = mktime(gmtime(&loctime));
- loctzoffset = loctime - gmttime;
-
- if (eventtime && tzoffsetto) {
- tzoffset = icalproperty_get_tzoffsetto(tzoffsetto);
- if (dtstart) {
- evttime = icaltime_as_timet(icalproperty_get_dtstart(eventtime));
- }
- else {
- evttime = icaltime_as_timet(icalproperty_get_dtend(eventtime));
+ icalcomponent *event;
+ icaltimezone *tz, *tzutc = icaltimezone_get_utc_timezone();
+ icalproperty *prop;
+ icalparameter *tzid;
+
+ cm_return_if_fail(calendar != NULL);
+
+ for (
+ event = icalcomponent_get_first_component(calendar,
+ ICAL_VEVENT_COMPONENT);
+ event != NULL;
+ event = icalcomponent_get_next_component(calendar,
+ ICAL_VEVENT_COMPONENT)) {
+
+ /* DTSTART */
+ if ((prop = icalcomponent_get_first_property(event, ICAL_DTSTART_PROPERTY)) != NULL
+ && (tzid = icalproperty_get_first_parameter(prop, ICAL_TZID_PARAMETER)) != NULL) {
+ /* Event has its DTSTART with a timezone specification, let's convert
+ * to UTC and remove the TZID parameter. */
+
+ tz = icalcomponent_get_timezone(calendar, icalparameter_get_iana_value(tzid));
+ if (tz != NULL) {
+ debug_print("Converting DTSTART to UTC.\n");
+ icaltimetype t = icalproperty_get_dtstart(prop);
+ icaltimezone_convert_time(&t, tz, tzutc);
+ icalproperty_set_dtstart(prop, t);
+ icalproperty_remove_parameter_by_ref(prop, tzid);
+ }
}
- /* convert to UTC */
- evttime -= tzoffset;
- /* and adjust for local time zone */
- evttime += loctzoffset;
- icaltime = icaltime_from_timet(evttime, 0);
-
- if (dtstart) {
- icalproperty_set_dtstart(eventtime, icaltime);
+ /* DTEND */
+ if ((prop = icalcomponent_get_first_property(event, ICAL_DTEND_PROPERTY)) != NULL
+ && (tzid = icalproperty_get_first_parameter(prop, ICAL_TZID_PARAMETER)) != NULL) {
+ /* Event has its DTEND with a timezone specification, let's convert
+ * to UTC and remove the TZID parameter. */
+
+ tz = icalcomponent_get_timezone(calendar, icalparameter_get_iana_value(tzid));
+ if (tz != NULL) {
+ debug_print("Converting DTEND to UTC.\n");
+ icaltimetype t = icalproperty_get_dtend(prop);
+ icaltimezone_convert_time(&t, tz, tzutc);
+ icalproperty_set_dtend(prop, t);
+ icalproperty_remove_parameter_by_ref(prop, tzid);
+ }
}
- else {
- icalproperty_set_dtend(eventtime, icaltime);
- }
}
}
gchar *int_ical = g_strdup(ical);
icalcomponent *comp = icalcomponent_new_from_string(int_ical);
icalcomponent *inner = NULL;
- icalcomponent *tzcomp = NULL;
icalproperty *prop = NULL;
GSList *list = NULL, *cur = NULL;
gchar *uid = NULL;
TO_UTF8(summary);
icalproperty_free(prop);
}
- tzcomp = icalcomponent_get_first_component(comp, ICAL_VTIMEZONE_COMPONENT);
- if (tzcomp) {
- icalproperty *evtstart = NULL;
- icalproperty *evtend = NULL;
- icalproperty *tzoffsetto = NULL;
- icalcomponent *tzstd = NULL;
-
- tzstd = icalcomponent_get_first_component(tzcomp, ICAL_XSTANDARD_COMPONENT);
- tzoffsetto = icalcomponent_get_first_property(tzstd, ICAL_TZOFFSETTO_PROPERTY);
- GET_PROP(comp, evtstart, ICAL_DTSTART_PROPERTY);
- adjust_for_local_time_zone(evtstart, tzoffsetto, TRUE);
+ convert_to_utc(comp);
- GET_PROP(comp, evtend, ICAL_DTEND_PROPERTY);
- adjust_for_local_time_zone(evtend, tzoffsetto, FALSE);
-
- if (tzoffsetto)
- icalproperty_free(tzoffsetto);
- if (evtstart)
- icalproperty_free(evtstart);
- if (evtend)
- icalproperty_free(evtend);
- if (tzstd)
- icalcomponent_free(tzstd);
- }
GET_PROP(comp, prop, ICAL_DTSTART_PROPERTY);
if (prop) {
dtstart = g_strdup(icaltime_as_ical_string(icalproperty_get_dtstart(prop)));
gboolean vcal_event_exists(const gchar *id)
{
MsgInfo *info = NULL;
- Folder *folder = folder_find_from_name ("vCalendar", vcal_folder_get_class());
+ Folder *folder = folder_find_from_name (PLUGIN_NAME, vcal_folder_get_class());
if (!folder)
return FALSE;
gboolean vcal_delete_event(const gchar *id)
{
MsgInfo *info = NULL;
- Folder *folder = folder_find_from_name ("vCalendar", vcal_folder_get_class());
+ Folder *folder = folder_find_from_name (PLUGIN_NAME, vcal_folder_get_class());
if (!folder)
return FALSE;
{
VCalEvent *event = vcal_get_event_from_ical(vevent, NULL);
gchar *retVal = NULL;
- Folder *folder = folder_find_from_name ("vCalendar", vcal_folder_get_class());
+ Folder *folder = folder_find_from_name (PLUGIN_NAME, vcal_folder_get_class());
if (!folder)
return NULL;