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 #include "system.h"
25
26 #include <osl/diagnose.h>
27 #include <osl/time.h>
28 #include <sys/timeb.h>
29
30 extern sal_Bool TimeValueToFileTime(const TimeValue *cpTimeVal, FILETIME *pFTime);
31
32 extern BOOL FileTimeToTimeValue( const FILETIME *cpFTime, TimeValue *pTimeVal );
33
34 //--------------------------------------------------
35 // osl_getSystemTime
36 //--------------------------------------------------
37
osl_getSystemTime(TimeValue * pTimeVal)38 sal_Bool SAL_CALL osl_getSystemTime(TimeValue* pTimeVal)
39 {
40 SYSTEMTIME SystemTime;
41 FILETIME CurTime, OffTime;
42 __int64 Value;
43
44 OSL_ASSERT(pTimeVal != 0);
45
46 GetSystemTime(&SystemTime);
47 SystemTimeToFileTime(&SystemTime, &CurTime);
48
49 SystemTime.wYear = 1970;
50 SystemTime.wMonth = 1;
51 SystemTime.wDayOfWeek = 0;
52 SystemTime.wDay = 1;
53 SystemTime.wHour = 0;
54 SystemTime.wMinute = 0;
55 SystemTime.wSecond = 0;
56 SystemTime.wMilliseconds = 0;
57
58 SystemTimeToFileTime(&SystemTime, &OffTime);
59
60 Value = *((__int64 *)&CurTime) - *((__int64 *)&OffTime);
61
62 pTimeVal->Seconds = (unsigned long) (Value / 10000000L);
63 pTimeVal->Nanosec = (unsigned long)((Value % 10000000L) * 100);
64
65 return (sal_True);
66 }
67
68 //--------------------------------------------------
69 // osl_getDateTimeFromTimeValue
70 //--------------------------------------------------
71
osl_getDateTimeFromTimeValue(TimeValue * pTimeVal,oslDateTime * pDateTime)72 sal_Bool SAL_CALL osl_getDateTimeFromTimeValue( TimeValue* pTimeVal, oslDateTime* pDateTime )
73 {
74 FILETIME aFileTime;
75 SYSTEMTIME aSystemTime;
76
77 if ( TimeValueToFileTime(pTimeVal, &aFileTime) )
78 {
79 if ( FileTimeToSystemTime( &aFileTime, &aSystemTime ) )
80 {
81 pDateTime->NanoSeconds = pTimeVal->Nanosec;
82
83 pDateTime->Seconds = aSystemTime.wSecond;
84 pDateTime->Minutes = aSystemTime.wMinute;
85 pDateTime->Hours = aSystemTime.wHour;
86 pDateTime->Day = aSystemTime.wDay;
87 pDateTime->DayOfWeek = aSystemTime.wDayOfWeek;
88 pDateTime->Month = aSystemTime.wMonth;
89 pDateTime->Year = aSystemTime.wYear;
90
91 return sal_True;
92 }
93 }
94
95 return sal_False;
96 }
97
98 //--------------------------------------------------
99 // osl_getTimeValueFromDateTime
100 //--------------------------------------------------
101
osl_getTimeValueFromDateTime(oslDateTime * pDateTime,TimeValue * pTimeVal)102 sal_Bool SAL_CALL osl_getTimeValueFromDateTime( oslDateTime* pDateTime, TimeValue* pTimeVal )
103 {
104 FILETIME aFileTime;
105 SYSTEMTIME aSystemTime;
106
107 aSystemTime.wMilliseconds = 0;
108 aSystemTime.wSecond = pDateTime->Seconds;
109 aSystemTime.wMinute = pDateTime->Minutes;
110 aSystemTime.wHour = pDateTime->Hours;
111 aSystemTime.wDay = pDateTime->Day;
112 aSystemTime.wDayOfWeek = pDateTime->DayOfWeek;
113 aSystemTime.wMonth = pDateTime->Month;
114 aSystemTime.wYear = pDateTime->Year;
115
116 if ( SystemTimeToFileTime( &aSystemTime, &aFileTime ) )
117 {
118 if (FileTimeToTimeValue( &aFileTime, pTimeVal ) )
119 {
120 pTimeVal->Nanosec = pDateTime->NanoSeconds;
121 return sal_True;
122 }
123 }
124
125 return sal_False;
126 }
127
128
129 //--------------------------------------------------
130 // osl_getLocalTimeFromSystemTime
131 //--------------------------------------------------
132
osl_getLocalTimeFromSystemTime(TimeValue * pSystemTimeVal,TimeValue * pLocalTimeVal)133 sal_Bool SAL_CALL osl_getLocalTimeFromSystemTime( TimeValue* pSystemTimeVal, TimeValue* pLocalTimeVal )
134 {
135 TIME_ZONE_INFORMATION aTimeZoneInformation;
136 DWORD Success;
137 sal_Int64 bias;
138
139 // get timezone information
140 if ( ( Success=GetTimeZoneInformation( &aTimeZoneInformation ) ) != TIME_ZONE_ID_INVALID)
141 {
142 bias=aTimeZoneInformation.Bias;
143
144 // add bias for daylight saving time
145 if ( Success== TIME_ZONE_ID_DAYLIGHT )
146 bias+=aTimeZoneInformation.DaylightBias;
147
148 if ( (sal_Int64) pSystemTimeVal->Seconds > ( bias * 60 ) )
149 {
150 pLocalTimeVal->Seconds = (sal_uInt32) (pSystemTimeVal->Seconds - ( bias * 60) );
151 pLocalTimeVal->Nanosec = pSystemTimeVal->Nanosec;
152
153 return sal_True;
154 }
155 }
156
157 return sal_False;
158 }
159
160 //--------------------------------------------------
161 // osl_getSystemTimeFromLocalTime
162 //--------------------------------------------------
163
osl_getSystemTimeFromLocalTime(TimeValue * pLocalTimeVal,TimeValue * pSystemTimeVal)164 sal_Bool SAL_CALL osl_getSystemTimeFromLocalTime( TimeValue* pLocalTimeVal, TimeValue* pSystemTimeVal )
165 {
166 TIME_ZONE_INFORMATION aTimeZoneInformation;
167 DWORD Success;
168 sal_Int64 bias;
169
170 // get timezone information
171 if ( ( Success=GetTimeZoneInformation( &aTimeZoneInformation ) ) != TIME_ZONE_ID_INVALID)
172 {
173 bias=aTimeZoneInformation.Bias;
174
175 // add bias for daylight saving time
176 if ( Success== TIME_ZONE_ID_DAYLIGHT )
177 bias+=aTimeZoneInformation.DaylightBias;
178
179 if ( (sal_Int64) pLocalTimeVal->Seconds + ( bias * 60 ) > 0 )
180 {
181 pSystemTimeVal->Seconds = (sal_uInt32) ( pLocalTimeVal->Seconds + ( bias * 60) );
182 pSystemTimeVal->Nanosec = pLocalTimeVal->Nanosec;
183
184 return sal_True;
185 }
186 }
187
188 return sal_False;
189 }
190
191
192 static struct _timeb startTime;
193 static sal_Bool bGlobalTimer = sal_False;
194
osl_getGlobalTimer(void)195 sal_uInt32 SAL_CALL osl_getGlobalTimer(void)
196 {
197 struct _timeb currentTime;
198 sal_uInt32 nSeconds;
199
200 if ( bGlobalTimer == sal_False )
201 {
202 _ftime( &startTime );
203 bGlobalTimer=sal_True;
204 }
205
206 _ftime( ¤tTime );
207
208 nSeconds = (sal_uInt32)( currentTime.time - startTime.time );
209
210 return ( nSeconds * 1000 ) + (long)( currentTime.millitm - startTime.millitm );
211 }
212
213