xref: /aoo42x/main/sal/osl/w32/time.c (revision cdf0e10c)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir #include "system.h"
29*cdf0e10cSrcweir 
30*cdf0e10cSrcweir #include <osl/diagnose.h>
31*cdf0e10cSrcweir #include <osl/time.h>
32*cdf0e10cSrcweir #include <sys/timeb.h>
33*cdf0e10cSrcweir 
34*cdf0e10cSrcweir extern sal_Bool TimeValueToFileTime(const TimeValue *cpTimeVal, FILETIME *pFTime);
35*cdf0e10cSrcweir 
36*cdf0e10cSrcweir extern BOOL FileTimeToTimeValue( const FILETIME *cpFTime, TimeValue *pTimeVal );
37*cdf0e10cSrcweir 
38*cdf0e10cSrcweir //--------------------------------------------------
39*cdf0e10cSrcweir // osl_getSystemTime
40*cdf0e10cSrcweir //--------------------------------------------------
41*cdf0e10cSrcweir 
42*cdf0e10cSrcweir sal_Bool SAL_CALL osl_getSystemTime(TimeValue* pTimeVal)
43*cdf0e10cSrcweir {
44*cdf0e10cSrcweir 	SYSTEMTIME SystemTime;
45*cdf0e10cSrcweir 	FILETIME   CurTime, OffTime;
46*cdf0e10cSrcweir 	__int64	   Value;
47*cdf0e10cSrcweir 
48*cdf0e10cSrcweir 	OSL_ASSERT(pTimeVal != 0);
49*cdf0e10cSrcweir 
50*cdf0e10cSrcweir 	GetSystemTime(&SystemTime);
51*cdf0e10cSrcweir 	SystemTimeToFileTime(&SystemTime, &CurTime);
52*cdf0e10cSrcweir 
53*cdf0e10cSrcweir 	SystemTime.wYear         = 1970;
54*cdf0e10cSrcweir 	SystemTime.wMonth        = 1;
55*cdf0e10cSrcweir     SystemTime.wDayOfWeek    = 0;
56*cdf0e10cSrcweir     SystemTime.wDay          = 1;
57*cdf0e10cSrcweir     SystemTime.wHour         = 0;
58*cdf0e10cSrcweir     SystemTime.wMinute       = 0;
59*cdf0e10cSrcweir     SystemTime.wSecond       = 0;
60*cdf0e10cSrcweir     SystemTime.wMilliseconds = 0;
61*cdf0e10cSrcweir 
62*cdf0e10cSrcweir 	SystemTimeToFileTime(&SystemTime, &OffTime);
63*cdf0e10cSrcweir 
64*cdf0e10cSrcweir 	Value = *((__int64 *)&CurTime) - *((__int64 *)&OffTime);
65*cdf0e10cSrcweir 
66*cdf0e10cSrcweir 	pTimeVal->Seconds  = (unsigned long) (Value / 10000000L);
67*cdf0e10cSrcweir 	pTimeVal->Nanosec  = (unsigned long)((Value % 10000000L) * 100);
68*cdf0e10cSrcweir 
69*cdf0e10cSrcweir 	return (sal_True);
70*cdf0e10cSrcweir }
71*cdf0e10cSrcweir 
72*cdf0e10cSrcweir //--------------------------------------------------
73*cdf0e10cSrcweir // osl_getDateTimeFromTimeValue
74*cdf0e10cSrcweir //--------------------------------------------------
75*cdf0e10cSrcweir 
76*cdf0e10cSrcweir sal_Bool SAL_CALL osl_getDateTimeFromTimeValue( TimeValue* pTimeVal, oslDateTime* pDateTime )
77*cdf0e10cSrcweir {
78*cdf0e10cSrcweir 	FILETIME	aFileTime;
79*cdf0e10cSrcweir 	SYSTEMTIME	aSystemTime;
80*cdf0e10cSrcweir 
81*cdf0e10cSrcweir 	if ( TimeValueToFileTime(pTimeVal, &aFileTime) )
82*cdf0e10cSrcweir 	{
83*cdf0e10cSrcweir 		if ( FileTimeToSystemTime( &aFileTime, &aSystemTime ) )
84*cdf0e10cSrcweir 		{
85*cdf0e10cSrcweir 			pDateTime->NanoSeconds	=	pTimeVal->Nanosec;
86*cdf0e10cSrcweir 
87*cdf0e10cSrcweir 			pDateTime->Seconds		=	aSystemTime.wSecond;
88*cdf0e10cSrcweir 			pDateTime->Minutes		=	aSystemTime.wMinute;
89*cdf0e10cSrcweir 			pDateTime->Hours		=	aSystemTime.wHour;
90*cdf0e10cSrcweir 			pDateTime->Day			=	aSystemTime.wDay;
91*cdf0e10cSrcweir 			pDateTime->DayOfWeek	=	aSystemTime.wDayOfWeek;
92*cdf0e10cSrcweir 			pDateTime->Month		=	aSystemTime.wMonth;
93*cdf0e10cSrcweir 			pDateTime->Year			=	aSystemTime.wYear;
94*cdf0e10cSrcweir 
95*cdf0e10cSrcweir 			return sal_True;
96*cdf0e10cSrcweir 		}
97*cdf0e10cSrcweir 	}
98*cdf0e10cSrcweir 
99*cdf0e10cSrcweir 	return sal_False;
100*cdf0e10cSrcweir }
101*cdf0e10cSrcweir 
102*cdf0e10cSrcweir //--------------------------------------------------
103*cdf0e10cSrcweir // osl_getTimeValueFromDateTime
104*cdf0e10cSrcweir //--------------------------------------------------
105*cdf0e10cSrcweir 
106*cdf0e10cSrcweir sal_Bool SAL_CALL osl_getTimeValueFromDateTime( oslDateTime* pDateTime, TimeValue* pTimeVal )
107*cdf0e10cSrcweir {
108*cdf0e10cSrcweir 	FILETIME	aFileTime;
109*cdf0e10cSrcweir 	SYSTEMTIME	aSystemTime;
110*cdf0e10cSrcweir 
111*cdf0e10cSrcweir 	aSystemTime.wMilliseconds	=	0;
112*cdf0e10cSrcweir 	aSystemTime.wSecond			=	pDateTime->Seconds;
113*cdf0e10cSrcweir 	aSystemTime.wMinute			=	pDateTime->Minutes;
114*cdf0e10cSrcweir 	aSystemTime.wHour			=	pDateTime->Hours;
115*cdf0e10cSrcweir 	aSystemTime.wDay			=	pDateTime->Day;
116*cdf0e10cSrcweir 	aSystemTime.wDayOfWeek		=	pDateTime->DayOfWeek;
117*cdf0e10cSrcweir 	aSystemTime.wMonth			=	pDateTime->Month;
118*cdf0e10cSrcweir 	aSystemTime.wYear			=	pDateTime->Year;
119*cdf0e10cSrcweir 
120*cdf0e10cSrcweir 	if ( SystemTimeToFileTime( &aSystemTime, &aFileTime ) )
121*cdf0e10cSrcweir 	{
122*cdf0e10cSrcweir 		if (FileTimeToTimeValue( &aFileTime, pTimeVal  ) )
123*cdf0e10cSrcweir 		{
124*cdf0e10cSrcweir 			pTimeVal->Nanosec = pDateTime->NanoSeconds;
125*cdf0e10cSrcweir 			return sal_True;
126*cdf0e10cSrcweir 		}
127*cdf0e10cSrcweir 	}
128*cdf0e10cSrcweir 
129*cdf0e10cSrcweir 	return sal_False;
130*cdf0e10cSrcweir }
131*cdf0e10cSrcweir 
132*cdf0e10cSrcweir 
133*cdf0e10cSrcweir //--------------------------------------------------
134*cdf0e10cSrcweir // osl_getLocalTimeFromSystemTime
135*cdf0e10cSrcweir //--------------------------------------------------
136*cdf0e10cSrcweir 
137*cdf0e10cSrcweir sal_Bool SAL_CALL osl_getLocalTimeFromSystemTime( TimeValue* pSystemTimeVal, TimeValue* pLocalTimeVal )
138*cdf0e10cSrcweir {
139*cdf0e10cSrcweir 	TIME_ZONE_INFORMATION aTimeZoneInformation;
140*cdf0e10cSrcweir 	DWORD Success;
141*cdf0e10cSrcweir 	sal_Int64	bias;
142*cdf0e10cSrcweir 
143*cdf0e10cSrcweir 	// get timezone information
144*cdf0e10cSrcweir 	if ( ( Success=GetTimeZoneInformation( &aTimeZoneInformation ) ) != TIME_ZONE_ID_INVALID)
145*cdf0e10cSrcweir 	{
146*cdf0e10cSrcweir 		bias=aTimeZoneInformation.Bias;
147*cdf0e10cSrcweir 
148*cdf0e10cSrcweir 		// add bias for daylight saving time
149*cdf0e10cSrcweir 		if ( Success== TIME_ZONE_ID_DAYLIGHT )
150*cdf0e10cSrcweir 			bias+=aTimeZoneInformation.DaylightBias;
151*cdf0e10cSrcweir 
152*cdf0e10cSrcweir 		if ( (sal_Int64) pSystemTimeVal->Seconds > ( bias * 60 ) )
153*cdf0e10cSrcweir 		{
154*cdf0e10cSrcweir 			pLocalTimeVal->Seconds = (sal_uInt32) (pSystemTimeVal->Seconds - ( bias * 60) );
155*cdf0e10cSrcweir 			pLocalTimeVal->Nanosec = pSystemTimeVal->Nanosec;
156*cdf0e10cSrcweir 
157*cdf0e10cSrcweir 			return sal_True;
158*cdf0e10cSrcweir 		}
159*cdf0e10cSrcweir 	}
160*cdf0e10cSrcweir 
161*cdf0e10cSrcweir 	return sal_False;
162*cdf0e10cSrcweir }
163*cdf0e10cSrcweir 
164*cdf0e10cSrcweir //--------------------------------------------------
165*cdf0e10cSrcweir // osl_getSystemTimeFromLocalTime
166*cdf0e10cSrcweir //--------------------------------------------------
167*cdf0e10cSrcweir 
168*cdf0e10cSrcweir sal_Bool SAL_CALL osl_getSystemTimeFromLocalTime( TimeValue* pLocalTimeVal, TimeValue* pSystemTimeVal )
169*cdf0e10cSrcweir {
170*cdf0e10cSrcweir 	TIME_ZONE_INFORMATION aTimeZoneInformation;
171*cdf0e10cSrcweir 	DWORD Success;
172*cdf0e10cSrcweir 	sal_Int64	bias;
173*cdf0e10cSrcweir 
174*cdf0e10cSrcweir 	// get timezone information
175*cdf0e10cSrcweir 	if ( ( Success=GetTimeZoneInformation( &aTimeZoneInformation ) ) != TIME_ZONE_ID_INVALID)
176*cdf0e10cSrcweir 	{
177*cdf0e10cSrcweir 		bias=aTimeZoneInformation.Bias;
178*cdf0e10cSrcweir 
179*cdf0e10cSrcweir 		// add bias for daylight saving time
180*cdf0e10cSrcweir 		if ( Success== TIME_ZONE_ID_DAYLIGHT )
181*cdf0e10cSrcweir 			bias+=aTimeZoneInformation.DaylightBias;
182*cdf0e10cSrcweir 
183*cdf0e10cSrcweir 		if ( (sal_Int64) pLocalTimeVal->Seconds + ( bias * 60 ) > 0 )
184*cdf0e10cSrcweir 		{
185*cdf0e10cSrcweir 			pSystemTimeVal->Seconds = (sal_uInt32) ( pLocalTimeVal->Seconds + ( bias * 60) );
186*cdf0e10cSrcweir 			pSystemTimeVal->Nanosec = pLocalTimeVal->Nanosec;
187*cdf0e10cSrcweir 
188*cdf0e10cSrcweir 			return sal_True;
189*cdf0e10cSrcweir 		}
190*cdf0e10cSrcweir 	}
191*cdf0e10cSrcweir 
192*cdf0e10cSrcweir 	return sal_False;
193*cdf0e10cSrcweir }
194*cdf0e10cSrcweir 
195*cdf0e10cSrcweir 
196*cdf0e10cSrcweir static struct _timeb startTime;
197*cdf0e10cSrcweir static sal_Bool bGlobalTimer = sal_False;
198*cdf0e10cSrcweir 
199*cdf0e10cSrcweir sal_uInt32 SAL_CALL osl_getGlobalTimer(void)
200*cdf0e10cSrcweir {
201*cdf0e10cSrcweir   struct _timeb currentTime;
202*cdf0e10cSrcweir   sal_uInt32 nSeconds;
203*cdf0e10cSrcweir 
204*cdf0e10cSrcweir   if ( bGlobalTimer == sal_False )
205*cdf0e10cSrcweir   {
206*cdf0e10cSrcweir       _ftime( &startTime );
207*cdf0e10cSrcweir       bGlobalTimer=sal_True;
208*cdf0e10cSrcweir   }
209*cdf0e10cSrcweir 
210*cdf0e10cSrcweir   _ftime( &currentTime );
211*cdf0e10cSrcweir 
212*cdf0e10cSrcweir   nSeconds = (sal_uInt32)( currentTime.time - startTime.time );
213*cdf0e10cSrcweir 
214*cdf0e10cSrcweir   return ( nSeconds * 1000 ) + (long)( currentTime.millitm - startTime.millitm );
215*cdf0e10cSrcweir }
216*cdf0e10cSrcweir 
217