]> err.no Git - scalable-opengroupware.org/blob - SOPE/NGCards/iCalDateTime.m
b0f1a19f54fcbd5f8e8da48fe173d7be793ac19d
[scalable-opengroupware.org] / SOPE / NGCards / iCalDateTime.m
1 /* iCalDateTime.m - this file is part of SOPE
2  *
3  * Copyright (C) 2006 Inverse groupe conseil
4  *
5  * Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
6  *
7  * This file is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2, or (at your option)
10  * any later version.
11  *
12  * This file is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; see the file COPYING.  If not, write to
19  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20  * Boston, MA 02111-1307, USA.
21  */
22
23 #import <Foundation/NSString.h>
24 #import <Foundation/NSTimeZone.h>
25
26 #import "NSCalendarDate+NGCards.h"
27 #import "NSString+NGCards.h"
28
29 #import "iCalCalendar.h"
30 #import "iCalTimeZone.h"
31
32 #import "iCalDateTime.h"
33
34 // static NSTimeZone *localTimeZone = nil;
35
36 @implementation iCalDateTime
37
38 // + (void) initialize
39 // {
40 //   if (!localTimeZone)
41 //     {
42 //       localTimeZone = [NSTimeZone defaultTimeZone];
43 //       [localTimeZone retain];
44 //     }
45 // }
46
47 // + (void) setLocalTimeZone: (NSTimeZone *) aTimeZone
48 // {
49 //   [localTimeZone release];
50 //   localTimeZone = aTimeZone;
51 //   [localTimeZone retain];
52 // }
53
54 - (void) setTimeZone: (iCalTimeZone *) iTZ
55 {
56   iCalCalendar *calendar;
57   NSCalendarDate *dateTime;
58   NSString *newTZId;
59
60   dateTime = [self dateTime];
61   if (iTZ)
62     {
63       calendar
64         = (iCalCalendar *) [self searchParentOfClass: [iCalCalendar class]];
65       if (calendar)
66         [calendar addTimeZone: iTZ];
67       newTZId = [iTZ tzId];
68     }
69   [self setValue: 0 ofAttribute: @"tzid" to: newTZId];
70   [self setDateTime: dateTime];
71 }
72
73 - (iCalTimeZone *) timeZone
74 {
75   iCalCalendar *calendar;
76   NSString *tzId;
77   iCalTimeZone *timeZone;
78
79   tzId = [self value: 0 ofAttribute: @"tzid"];
80   calendar
81     = (iCalCalendar *) [self searchParentOfClass: [iCalCalendar class]];
82   if ([tzId length] && calendar)
83     timeZone = [calendar timeZoneWithId: tzId];
84   else
85     timeZone = nil;
86
87   return timeZone;
88 }
89
90 /* TODO: should implement the case where the TZ would be implicitly local
91    (no TZID and no UTC) */
92 - (void) setDateTime: (NSCalendarDate *) dateTime
93 {
94   NSCalendarDate *tmpTime;
95   NSTimeZone *utcTZ;
96   NSString *timeString;
97   iCalTimeZone *tz;
98
99   if (dateTime)
100     {
101       tz = [self timeZone];
102       if (tz)
103         timeString = [tz dateTimeStringForDate: dateTime];
104       else
105         {
106           utcTZ = [NSTimeZone timeZoneWithName: @"GMT"];
107
108           tmpTime = [dateTime copy];
109           [tmpTime setTimeZone: utcTZ];
110           timeString = [NSString stringWithFormat: @"%@Z",
111                                  [tmpTime iCalFormattedDateTimeString]];
112           [tmpTime release];
113         }
114     }
115   else
116     timeString = @"";
117
118   [self setValue: 0 to: timeString];
119 }
120
121 - (NSCalendarDate *) dateTime
122 {
123   iCalTimeZone *iTZ;
124   NSString *date;
125   NSCalendarDate *initialDate, *dateTime;
126   NSTimeZone *tz;
127
128   date = [self value: 0];
129   iTZ = [self timeZone];
130   if (iTZ)
131     dateTime = [iTZ dateForDateTimeString: date];
132   else
133     {
134       initialDate = [date asCalendarDate];
135       if (initialDate)
136         {
137           if ([date hasSuffix: @"Z"] || [date hasSuffix: @"z"])
138             dateTime = initialDate;
139           else
140             {
141               /* same TODO as above */
142               tz = [NSTimeZone defaultTimeZone];
143               dateTime = [initialDate addYear: 0 month: 0 day: 0
144                                       hour: 0 minute: 0
145                                       second: -[tz secondsFromGMT]];
146             }
147         }
148       else
149         dateTime = nil;
150     }
151
152   return dateTime;
153 }
154
155 @end