]> err.no Git - scalable-opengroupware.org/blob - SOPE/NGCards/iCalDateTime.m
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1304 d1b88da0-ebda-0310...
[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 <NGExtensions/NSObject+Logs.h>
27
28 #import "NSCalendarDate+NGCards.h"
29 #import "NSString+NGCards.h"
30
31 #import "iCalCalendar.h"
32 #import "iCalTimeZone.h"
33
34 #import "iCalDateTime.h"
35
36 // static NSTimeZone *localTimeZone = nil;
37
38 @implementation iCalDateTime
39
40 // + (void) initialize
41 // {
42 //   if (!localTimeZone)
43 //     {
44 //       localTimeZone = [NSTimeZone defaultTimeZone];
45 //       [localTimeZone retain];
46 //     }
47 // }
48
49 // + (void) setLocalTimeZone: (NSTimeZone *) aTimeZone
50 // {
51 //   [localTimeZone release];
52 //   localTimeZone = aTimeZone;
53 //   [localTimeZone retain];
54 // }
55
56 - (void) setTimeZone: (iCalTimeZone *) iTZ
57 {
58   iCalCalendar *calendar;
59   NSCalendarDate *dateTime;
60   NSString *newTZId;
61
62   dateTime = [self dateTime];
63   if (iTZ)
64     {
65       calendar
66         = (iCalCalendar *) [self searchParentOfClass: [iCalCalendar class]];
67       if (calendar)
68         [calendar addTimeZone: iTZ];
69       newTZId = [iTZ tzId];
70     }
71   else
72     newTZId = nil;
73
74   [self setValue: 0 ofAttribute: @"tzid" to: newTZId];
75   [self setDateTime: dateTime];
76 }
77
78 - (iCalTimeZone *) timeZone
79 {
80   iCalCalendar *calendar;
81   NSString *tzId;
82   iCalTimeZone *timeZone;
83
84   timeZone = nil;
85
86   tzId = [self value: 0 ofAttribute: @"tzid"];
87   if ([tzId length])
88     {
89       calendar
90         = (iCalCalendar *) [self searchParentOfClass: [iCalCalendar class]];
91       timeZone = [calendar timeZoneWithId: tzId];
92       if (!timeZone)
93         [self logWithFormat: @"timezone '%@' not found in calendar", tzId];
94     }
95
96   return timeZone;
97 }
98
99 /* TODO: should implement the case where the TZ would be implicitly local
100    (no TZID and no UTC) */
101 - (void) _setDateTime: (NSCalendarDate *) dateTime
102       forAllDayEntity: (BOOL) forAllDayEntity
103 {
104   NSCalendarDate *tmpTime;
105   NSTimeZone *utcTZ;
106   NSString *timeString;
107   iCalTimeZone *tz;
108
109   if (dateTime)
110     {
111       tz = [self timeZone];
112       if (tz)
113         {
114           if (forAllDayEntity)
115             timeString = [tz dateStringForDate: dateTime];
116           else
117             timeString = [tz dateTimeStringForDate: dateTime];
118         }
119       else
120         {
121           utcTZ = [NSTimeZone timeZoneWithName: @"GMT"];
122
123           tmpTime = [dateTime copy];
124           [tmpTime setTimeZone: utcTZ];
125           if (forAllDayEntity)
126             timeString = [tmpTime iCalFormattedDateString];
127           else
128             timeString = [NSString stringWithFormat: @"%@Z",
129                                    [tmpTime iCalFormattedDateTimeString]];
130           [tmpTime release];
131         }
132     }
133   else
134     timeString = @"";
135
136   [self setValue: 0 to: timeString];
137 }
138
139 - (void) setDateTime: (NSCalendarDate *) dateTime
140 {
141   [self _setDateTime: dateTime forAllDayEntity: NO];
142 }
143
144 - (void) setDate: (NSCalendarDate *) dateTime
145 {
146   [self _setDateTime: dateTime forAllDayEntity: YES];
147 }
148
149 - (NSCalendarDate *) dateTime
150 {
151   iCalTimeZone *iTZ;
152   NSString *date;
153   NSCalendarDate *initialDate, *dateTime;
154   NSTimeZone *tz;
155
156   date = [self value: 0];
157   iTZ = [self timeZone];
158   if (iTZ)
159     dateTime = [iTZ dateForDateTimeString: date];
160   else
161     {
162       initialDate = [date asCalendarDate];
163       if (initialDate)
164         {
165           if ([date hasSuffix: @"Z"] || [date hasSuffix: @"z"])
166             dateTime = initialDate;
167           else
168             {
169               /* same TODO as above */
170               tz = [NSTimeZone defaultTimeZone];
171               dateTime = [initialDate addYear: 0 month: 0 day: 0
172                                       hour: 0 minute: 0
173                                       second: -[tz secondsFromGMT]];
174             }
175         }
176       else
177         dateTime = nil;
178     }
179
180   return dateTime;
181 }
182
183 - (BOOL) isAllDay
184 {
185   return [[self value: 0] isAllDayDate];
186 }
187
188 @end