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