unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* [PATCH] icalendar.el: Support timezones without DST
@ 2014-11-09 22:43 Sylvain Chouleur
  2014-11-10 17:09 ` Ulf Jasper
  0 siblings, 1 reply; 5+ messages in thread
From: Sylvain Chouleur @ 2014-11-09 22:43 UTC (permalink / raw)
  To: Emacs developers

[-- Attachment #1: Type: text/plain, Size: 708 bytes --]

Hi,

This patch is here to support vcalendar events which timezone doesn't
have daylight saving time.

I've faced this issue when receiving an event for which displayed
timezone was the sender's one, not mine.
The vcalendar event had DAYLIGHT and STANDARD timezones defined but the
timezones where equal.
The icalendar module couldn't decode the event yet because each timezone
event were missing RRULE value. This is allowed by RFC5545 :
https://tools.ietf.org/html/rfc5545#section-3.6.5

So what I do in this patch is: if RRULE is missing and OFFSETFROM ==
OFFSETTO, then we return a timezone composed only by "STD [+-]XX:XX"
without the recurrence rule part which is added only if OFFSETFROM !=
OFFSETTO


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-icalendar.el-Support-timezones-without-DST.patch --]
[-- Type: text/x-diff, Size: 4431 bytes --]

From 69b73bf2f8d80ac656385e483bac02e904078d5d Mon Sep 17 00:00:00 2001
From: Sylvain Chouleur <sylvain.chouleur@gmail.com>
Date: Fri, 10 Oct 2014 00:05:42 +0200
Subject: [PATCH] * icalendar.el: Support timezones without DST

Some timezone does not define RRULE inside DAYLIGHT or STANDARD
components because they do not have a daylight saving time.
The RFC5545 specify that when no RRULE is specified, the observance is
effective just once.
The current icalendar code doesn't take care of the DTSTART so we can't
apply the RFC here but fortunately, when timezone do not use RRULE, the
TZOFFSETTO and TZOFFSETFROM values are always the same.

Signed-off-by: Sylvain Chouleur <sylvain.chouleur@gmail.com>
---
 ChangeLog                  |  5 +++++
 lisp/calendar/icalendar.el | 53 ++++++++++++++++++++++++----------------------
 2 files changed, 33 insertions(+), 25 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index cdc2a7bae785..4e12c2b1663e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2014-11-09  Sylvain Chouleur  <sylvain.chouleur@gmail.com>
+
+	* calendar/icalendar.el: Support timezone without daylight saving
+	time
+
 2014-11-08  Dani Moncayo  <dmoncayo@gmail.com>
 
 	* build-aux/msys-to-w32: simplify the initial over-engineered
diff --git a/lisp/calendar/icalendar.el b/lisp/calendar/icalendar.el
index 5f89318e139f..b024a38f8095 100644
--- a/lisp/calendar/icalendar.el
+++ b/lisp/calendar/icalendar.el
@@ -485,45 +485,48 @@ children."
 ALIST is an alist entry from a VTIMEZONE, like STANDARD.
 DST-P is non-nil if this is for daylight savings time.
 The strings are suitable for assembling into a TZ variable."
-  (let ((offset (car (cddr (assq 'TZOFFSETTO alist))))
-	(rrule-value (car (cddr (assq 'RRULE alist))))
-	(dtstart (car (cddr (assq 'DTSTART alist)))))
+  (let* ((offsetto (car (cddr (assq 'TZOFFSETTO alist))))
+	 (offsetfrom (car (cddr (assq 'TZOFFSETFROM alist))))
+	 (rrule-value (car (cddr (assq 'RRULE alist))))
+	 (dtstart (car (cddr (assq 'DTSTART alist))))
+	 (no-dst (equal offsetto offsetfrom)))
     ;; FIXME: for now we only handle RRULE and not RDATE here.
-    (when (and offset rrule-value dtstart)
+    (when (and offsetto dtstart (or rrule-value no-dst))
       (let* ((rrule (icalendar--split-value rrule-value))
 	     (freq (cadr (assq 'FREQ rrule)))
 	     (bymonth (cadr (assq 'BYMONTH rrule)))
 	     (byday (cadr (assq 'BYDAY rrule))))
 	;; FIXME: we don't correctly handle WKST here.
-	(if (and (string= freq "YEARLY") bymonth)
+	(if (or no-dst (and (string= freq "YEARLY") bymonth))
 	    (cons
 	     (concat
 	      ;; Fake a name.
 	      (if dst-p "DST" "STD")
 	      ;; For TZ, OFFSET is added to the local time.  So,
 	      ;; invert the values.
-	      (if (eq (aref offset 0) ?-) "+" "-")
-	      (substring offset 1 3)
+	      (if (eq (aref offsetto 0) ?-) "+" "-")
+	      (substring offsetto 1 3)
 	      ":"
-	      (substring offset 3 5))
+	      (substring offsetto 3 5))
 	     ;; The start time.
-	     (let* ((day (icalendar--get-weekday-number (substring byday -2)))
-		    (week (if (eq day -1)
-			      byday
-			    (substring byday 0 -2))))
-               ;; "Translate" the iCalendar way to specify the last
-               ;; (sun|mon|...)day in month to the tzset way.
-               (if (string= week "-1")  ; last day as iCalendar calls it
-                   (setq week "5"))     ; last day as tzset calls it
-	       (concat "M" bymonth "." week "." (if (eq day -1) "0"
-						  (int-to-string day))
-		       ;; Start time.
-		       "/"
-		       (substring dtstart -6 -4)
-		       ":"
-		       (substring dtstart -4 -2)
-		       ":"
-		       (substring dtstart -2)))))))))
+	     (unless no-dst
+	       (let* ((day (icalendar--get-weekday-number (substring byday -2)))
+		      (week (if (eq day -1)
+				byday
+			      (substring byday 0 -2))))
+		 ;; "Translate" the iCalendar way to specify the last
+		 ;; (sun|mon|...)day in month to the tzset way.
+		 (if (string= week "-1")  ; last day as iCalendar calls it
+		     (setq week "5"))     ; last day as tzset calls it
+		 (concat "M" bymonth "." week "." (if (eq day -1) "0"
+						    (int-to-string day))
+			 ;; Start time.
+			 "/"
+			 (substring dtstart -6 -4)
+			 ":"
+			 (substring dtstart -4 -2)
+			 ":"
+			 (substring dtstart -2))))))))))
 
 (defun icalendar--parse-vtimezone (alist)
   "Turn a VTIMEZONE ALIST into a cons (ID . TZ-STRING).
-- 
2.1.1


[-- Attachment #3: Type: text/plain, Size: 20 bytes --]


Regards
--
Sylvain

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] icalendar.el: Support timezones without DST
  2014-11-09 22:43 [PATCH] icalendar.el: Support timezones without DST Sylvain Chouleur
@ 2014-11-10 17:09 ` Ulf Jasper
  2014-11-16 16:33   ` Ulf Jasper
  0 siblings, 1 reply; 5+ messages in thread
From: Ulf Jasper @ 2014-11-10 17:09 UTC (permalink / raw)
  To: Sylvain Chouleur; +Cc: Emacs developers

Sylvain Chouleur <sylvain.chouleur@intel.com> writes:

> This patch is here to support vcalendar events which timezone doesn't
> have daylight saving time.

I'll have a look at the patch.  Thanks.



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] icalendar.el: Support timezones without DST
  2014-11-10 17:09 ` Ulf Jasper
@ 2014-11-16 16:33   ` Ulf Jasper
  2014-11-16 17:19     ` Sylvain Chouleur
  0 siblings, 1 reply; 5+ messages in thread
From: Ulf Jasper @ 2014-11-16 16:33 UTC (permalink / raw)
  To: Sylvain Chouleur; +Cc: Emacs developers

Ulf Jasper <ulf.jasper@web.de> writes:

> Sylvain Chouleur <sylvain.chouleur@intel.com> writes:
>
>> This patch is here to support vcalendar events which timezone doesn't
>> have daylight saving time.
>
> I'll have a look at the patch.  Thanks.

Your patch broke the automatic test!  But that was due to an error in
the test. ;)   After a minor tweak it is working now.  Thanks for the patch!

Could you please provide an anonymized sample so that I can add another "real
world test case"? 






^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] icalendar.el: Support timezones without DST
  2014-11-16 16:33   ` Ulf Jasper
@ 2014-11-16 17:19     ` Sylvain Chouleur
  2014-11-17 16:15       ` Ulf Jasper
  0 siblings, 1 reply; 5+ messages in thread
From: Sylvain Chouleur @ 2014-11-16 17:19 UTC (permalink / raw)
  To: Ulf Jasper; +Cc: Emacs developers

[-- Attachment #1: Type: text/plain, Size: 677 bytes --]

Ulf Jasper <ulf.jasper@web.de> writes:

> Ulf Jasper <ulf.jasper@web.de> writes:
>
>> Sylvain Chouleur <sylvain.chouleur@intel.com> writes:
>>
>>> This patch is here to support vcalendar events which timezone doesn't
>>> have daylight saving time.
>>
>> I'll have a look at the patch.  Thanks.
>
> Your patch broke the automatic test!  But that was due to an error in
> the test. ;)   After a minor tweak it is working now.  Thanks for the patch!
>
> Could you please provide an anonymized sample so that I can add another "real
> world test case"?

Hi,

An example of timezone reproducing the issue is +03:30 Asia/Tehran
I created a sample with http://apps.marudot.com/ical/


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Test.ics --]
[-- Type: text/calendar, Size: 607 bytes --]

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//www.marudot.com//iCal Event Maker
X-WR-CALNAME:Test
CALSCALE:GREGORIAN
BEGIN:VTIMEZONE
TZID:Asia/Tehran
TZURL:http://tzurl.org/zoneinfo-outlook/Asia/Tehran
X-LIC-LOCATION:Asia/Tehran
BEGIN:STANDARD
TZOFFSETFROM:+0330
TZOFFSETTO:+0330
TZNAME:IRST
DTSTART:19700101T000000
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTAMP:20141116T171439Z
UID:20141116T171439Z-678877132@marudot.com
DTSTART;TZID="Asia/Tehran":20141116T070000
DTEND;TZID="Asia/Tehran":20141116T080000
SUMMARY:NoDST
DESCRIPTION:Test event from timezone without DST
LOCATION:Everywhere
END:VEVENT
END:VCALENDAR

[-- Attachment #3: Type: text/plain, Size: 22 bytes --]


Regards,
-- 
Sylvain

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] icalendar.el: Support timezones without DST
  2014-11-16 17:19     ` Sylvain Chouleur
@ 2014-11-17 16:15       ` Ulf Jasper
  0 siblings, 0 replies; 5+ messages in thread
From: Ulf Jasper @ 2014-11-17 16:15 UTC (permalink / raw)
  To: Sylvain Chouleur; +Cc: Emacs developers

Sylvain Chouleur <sylvain.chouleur@intel.com> writes:

> An example of timezone reproducing the issue is +03:30 Asia/Tehran
> I created a sample with http://apps.marudot.com/ical/

Thank you!

Ulf



^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2014-11-17 16:15 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-11-09 22:43 [PATCH] icalendar.el: Support timezones without DST Sylvain Chouleur
2014-11-10 17:09 ` Ulf Jasper
2014-11-16 16:33   ` Ulf Jasper
2014-11-16 17:19     ` Sylvain Chouleur
2014-11-17 16:15       ` Ulf Jasper

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).