1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_webdav.hxx"
26
27 #include <stdio.h>
28 #include <osl/time.h>
29 #include <com/sun/star/util/DateTime.hpp>
30 #include "DateTimeHelper.hxx"
31
32 using namespace com::sun::star::util;
33 using namespace rtl;
34
35 using namespace http_dav_ucp;
36
ISO8601_To_DateTime(const OUString & s,DateTime & dateTime)37 bool DateTimeHelper::ISO8601_To_DateTime (const OUString& s,
38 DateTime& dateTime)
39 {
40 OString aDT (s.getStr(), s.getLength(), RTL_TEXTENCODING_ASCII_US);
41
42 int year, month, day, hours, minutes, off_hours, off_minutes, fix;
43 double seconds;
44
45 // 2001-01-01T12:30:00Z
46 int n = sscanf( aDT.getStr(), "%04d-%02d-%02dT%02d:%02d:%lfZ",
47 &year, &month, &day, &hours, &minutes, &seconds );
48 if ( n == 6 )
49 {
50 fix = 0;
51 }
52 else
53 {
54 // 2001-01-01T12:30:00+03:30
55 n = sscanf( aDT.getStr(), "%04d-%02d-%02dT%02d:%02d:%lf+%02d:%02d",
56 &year, &month, &day, &hours, &minutes, &seconds,
57 &off_hours, &off_minutes );
58 if ( n == 8 )
59 {
60 fix = - off_hours * 3600 - off_minutes * 60;
61 }
62 else
63 {
64 // 2001-01-01T12:30:00-03:30
65 n = sscanf( aDT.getStr(), "%04d-%02d-%02dT%02d:%02d:%lf-%02d:%02d",
66 &year, &month, &day, &hours, &minutes, &seconds,
67 &off_hours, &off_minutes );
68 if ( n == 8 )
69 {
70 fix = off_hours * 3600 + off_minutes * 60;
71 }
72 else
73 {
74 return false;
75 }
76 }
77 }
78
79 // Convert to local time...
80
81 oslDateTime aDateTime;
82 aDateTime.NanoSeconds = 0;
83 aDateTime.Seconds = sal::static_int_cast< sal_uInt16 >(seconds); // 0-59
84 aDateTime.Minutes = sal::static_int_cast< sal_uInt16 >(minutes); // 0-59
85 aDateTime.Hours = sal::static_int_cast< sal_uInt16 >(hours); // 0-23
86 aDateTime.Day = sal::static_int_cast< sal_uInt16 >(day); // 1-31
87 aDateTime.DayOfWeek = 0; // 0-6, 0 = Sunday
88 aDateTime.Month = sal::static_int_cast< sal_uInt16 >(month); // 1-12
89 aDateTime.Year = sal::static_int_cast< sal_uInt16 >(year);
90
91 TimeValue aTimeValue;
92 if ( osl_getTimeValueFromDateTime( &aDateTime, &aTimeValue ) )
93 {
94 aTimeValue.Seconds += fix;
95
96 if ( osl_getLocalTimeFromSystemTime( &aTimeValue, &aTimeValue ) )
97 {
98 if ( osl_getDateTimeFromTimeValue( &aTimeValue, &aDateTime ) )
99 {
100 dateTime.Year = aDateTime.Year;
101 dateTime.Month = aDateTime.Month;
102 dateTime.Day = aDateTime.Day;
103 dateTime.Hours = aDateTime.Hours;
104 dateTime.Minutes = aDateTime.Minutes;
105 dateTime.Seconds = aDateTime.Seconds;
106
107 return true;
108 }
109 }
110 }
111
112 return false;
113 }
114
115 /*
116 sal_Int32 DateTimeHelper::convertDayToInt (const OUString& day)
117 {
118 if (day.compareToAscii ("Sun") == 0)
119 return 0;
120 else if (day.compareToAscii ("Mon") == 0)
121 return 1;
122 else if (day.compareToAscii ("Tue") == 0)
123 return 2;
124 else if (day.compareToAscii ("Wed") == 0)
125 return 3;
126 else if (day.compareToAscii ("Thu") == 0)
127 return 4;
128 else if (day.compareToAscii ("Fri") == 0)
129 return 5;
130 else if (day.compareToAscii ("Sat") == 0)
131 return 6;
132 else
133 return -1;
134 }
135 */
136
convertMonthToInt(const OUString & month)137 sal_Int32 DateTimeHelper::convertMonthToInt (const OUString& month)
138 {
139 if (month.compareToAscii ("Jan") == 0)
140 return 1;
141 else if (month.compareToAscii ("Feb") == 0)
142 return 2;
143 else if (month.compareToAscii ("Mar") == 0)
144 return 3;
145 else if (month.compareToAscii ("Apr") == 0)
146 return 4;
147 else if (month.compareToAscii ("May") == 0)
148 return 5;
149 else if (month.compareToAscii ("Jun") == 0)
150 return 6;
151 else if (month.compareToAscii ("Jul") == 0)
152 return 7;
153 else if (month.compareToAscii ("Aug") == 0)
154 return 8;
155 else if (month.compareToAscii ("Sep") == 0)
156 return 9;
157 else if (month.compareToAscii ("Oct") == 0)
158 return 10;
159 else if (month.compareToAscii ("Nov") == 0)
160 return 11;
161 else if (month.compareToAscii ("Dec") == 0)
162 return 12;
163 else
164 return 0;
165 }
166
RFC2068_To_DateTime(const OUString & s,DateTime & dateTime)167 bool DateTimeHelper::RFC2068_To_DateTime (const OUString& s,
168 DateTime& dateTime)
169 {
170 int year;
171 int day;
172 int hours;
173 int minutes;
174 int seconds;
175 sal_Char string_month[3 + 1];
176 sal_Char string_day[3 + 1];
177
178 sal_Int32 found = s.indexOf (',');
179 if (found != -1)
180 {
181 OString aDT (s.getStr(), s.getLength(), RTL_TEXTENCODING_ASCII_US);
182
183 // RFC 1123
184 found = sscanf (aDT.getStr(), "%3s, %2d %3s %4d %2d:%2d:%2d GMT",
185 string_day, &day, string_month, &year, &hours, &minutes, &seconds);
186 if (found != 7)
187 {
188 // RFC 1036
189 found = sscanf (aDT.getStr(), "%3s, %2d-%3s-%2d %2d:%2d:%2d GMT",
190 string_day, &day, string_month, &year, &hours, &minutes, &seconds);
191 }
192 found = (found == 7) ? 1 : 0;
193 }
194 else
195 {
196 OString aDT (s.getStr(), s.getLength(), RTL_TEXTENCODING_ASCII_US);
197
198 // ANSI C's asctime () format
199 found = sscanf (aDT.getStr(), "%3s %3s %d %2d:%2d:%2d %4d",
200 string_day, string_month,
201 &day, &hours, &minutes, &seconds, &year);
202 found = (found == 7) ? 1 : 0;
203 }
204
205 if (found)
206 {
207 found = 0;
208
209 int month = DateTimeHelper::convertMonthToInt (
210 OUString::createFromAscii (string_month));
211 if (month)
212 {
213 // Convert to local time...
214
215 oslDateTime aDateTime;
216 aDateTime.NanoSeconds = 0;
217 aDateTime.Seconds = sal::static_int_cast< sal_uInt16 >(seconds);
218 // 0-59
219 aDateTime.Minutes = sal::static_int_cast< sal_uInt16 >(minutes);
220 // 0-59
221 aDateTime.Hours = sal::static_int_cast< sal_uInt16 >(hours);
222 // 0-23
223 aDateTime.Day = sal::static_int_cast< sal_uInt16 >(day);
224 // 1-31
225 aDateTime.DayOfWeek = 0; //dayofweek; // 0-6, 0 = Sunday
226 aDateTime.Month = sal::static_int_cast< sal_uInt16 >(month);
227 // 1-12
228 aDateTime.Year = sal::static_int_cast< sal_uInt16 >(year);
229
230 TimeValue aTimeValue;
231 if ( osl_getTimeValueFromDateTime( &aDateTime,
232 &aTimeValue ) )
233 {
234 if ( osl_getLocalTimeFromSystemTime( &aTimeValue,
235 &aTimeValue ) )
236 {
237 if ( osl_getDateTimeFromTimeValue( &aTimeValue,
238 &aDateTime ) )
239 {
240 dateTime.Year = aDateTime.Year;
241 dateTime.Month = aDateTime.Month;
242 dateTime.Day = aDateTime.Day;
243 dateTime.Hours = aDateTime.Hours;
244 dateTime.Minutes = aDateTime.Minutes;
245 dateTime.Seconds = aDateTime.Seconds;
246
247 found = 1;
248 }
249 }
250 }
251 }
252 }
253
254 return (found) ? true : false;
255 }
256
convert(const OUString & s,DateTime & dateTime)257 bool DateTimeHelper::convert (const OUString& s, DateTime& dateTime)
258 {
259 if (ISO8601_To_DateTime (s, dateTime))
260 return true;
261 else if (RFC2068_To_DateTime (s, dateTime))
262 return true;
263 else
264 return false;
265 }
266
267