xref: /aoo42x/main/tools/source/fsys/fstat.cxx (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 // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_tools.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #ifdef UNX
32*cdf0e10cSrcweir #include <errno.h>
33*cdf0e10cSrcweir #endif
34*cdf0e10cSrcweir 
35*cdf0e10cSrcweir #include <limits.h>
36*cdf0e10cSrcweir #include <string.h>
37*cdf0e10cSrcweir 
38*cdf0e10cSrcweir #include "comdep.hxx"
39*cdf0e10cSrcweir #include <tools/fsys.hxx>
40*cdf0e10cSrcweir 
41*cdf0e10cSrcweir /*************************************************************************
42*cdf0e10cSrcweir |*
43*cdf0e10cSrcweir |*    FileStat::FileStat()
44*cdf0e10cSrcweir |*
45*cdf0e10cSrcweir |*    Beschreibung      FSYS.SDW
46*cdf0e10cSrcweir |*    Ersterstellung    MI 11.06.91
47*cdf0e10cSrcweir |*    Letzte Aenderung  MI 11.06.91
48*cdf0e10cSrcweir |*
49*cdf0e10cSrcweir *************************************************************************/
50*cdf0e10cSrcweir 
51*cdf0e10cSrcweir FileStat::FileStat()
52*cdf0e10cSrcweir :	// don't use Default-Ctors!
53*cdf0e10cSrcweir 	aDateCreated( sal_uIntPtr(0) ),
54*cdf0e10cSrcweir 	aTimeCreated( sal_uIntPtr(0) ),
55*cdf0e10cSrcweir 	aDateModified( sal_uIntPtr(0) ),
56*cdf0e10cSrcweir 	aTimeModified( sal_uIntPtr(0) ),
57*cdf0e10cSrcweir 	aDateAccessed( sal_uIntPtr(0) ),
58*cdf0e10cSrcweir 	aTimeAccessed( sal_uIntPtr(0) )
59*cdf0e10cSrcweir {
60*cdf0e10cSrcweir     nSize = 0;
61*cdf0e10cSrcweir     nKindFlags = FSYS_KIND_UNKNOWN;
62*cdf0e10cSrcweir     nError = FSYS_ERR_OK;
63*cdf0e10cSrcweir }
64*cdf0e10cSrcweir 
65*cdf0e10cSrcweir /*************************************************************************
66*cdf0e10cSrcweir |*
67*cdf0e10cSrcweir |*    FileStat::FileStat()
68*cdf0e10cSrcweir |*
69*cdf0e10cSrcweir |*    Beschreibung      FSYS.SDW
70*cdf0e10cSrcweir |*    Ersterstellung    MI 11.06.91
71*cdf0e10cSrcweir |*    Letzte Aenderung  MI 11.06.91
72*cdf0e10cSrcweir |*
73*cdf0e10cSrcweir *************************************************************************/
74*cdf0e10cSrcweir 
75*cdf0e10cSrcweir FileStat::FileStat( const DirEntry& rDirEntry, FSysAccess nAccess )
76*cdf0e10cSrcweir :	// don't use Default-Ctors!
77*cdf0e10cSrcweir 	aDateCreated( sal_uIntPtr(0) ),
78*cdf0e10cSrcweir 	aTimeCreated( sal_uIntPtr(0) ),
79*cdf0e10cSrcweir 	aDateModified( sal_uIntPtr(0) ),
80*cdf0e10cSrcweir 	aTimeModified( sal_uIntPtr(0) ),
81*cdf0e10cSrcweir 	aDateAccessed( sal_uIntPtr(0) ),
82*cdf0e10cSrcweir 	aTimeAccessed( sal_uIntPtr(0) )
83*cdf0e10cSrcweir {
84*cdf0e10cSrcweir 	sal_Bool bCached = FSYS_ACCESS_CACHED == (nAccess & FSYS_ACCESS_CACHED);
85*cdf0e10cSrcweir 	sal_Bool bFloppy = FSYS_ACCESS_FLOPPY == (nAccess & FSYS_ACCESS_FLOPPY);
86*cdf0e10cSrcweir 
87*cdf0e10cSrcweir #ifdef FEAT_FSYS_DOUBLESPEED
88*cdf0e10cSrcweir 	const FileStat *pStatFromDir = bCached ? rDirEntry.ImpGetStat() : 0;
89*cdf0e10cSrcweir 	if ( pStatFromDir )
90*cdf0e10cSrcweir 	{
91*cdf0e10cSrcweir 		nError = pStatFromDir->nError;
92*cdf0e10cSrcweir     	nKindFlags = pStatFromDir->nKindFlags;
93*cdf0e10cSrcweir     	nSize = pStatFromDir->nSize;
94*cdf0e10cSrcweir     	aCreator = pStatFromDir->aCreator;
95*cdf0e10cSrcweir     	aType = pStatFromDir->aType;
96*cdf0e10cSrcweir 		aDateCreated = pStatFromDir->aDateCreated;
97*cdf0e10cSrcweir     	aTimeCreated = pStatFromDir->aTimeCreated;
98*cdf0e10cSrcweir     	aDateModified = pStatFromDir->aDateModified;
99*cdf0e10cSrcweir     	aTimeModified = pStatFromDir->aTimeModified;
100*cdf0e10cSrcweir 		aDateAccessed = pStatFromDir->aDateAccessed;
101*cdf0e10cSrcweir     	aTimeAccessed = pStatFromDir->aTimeAccessed;
102*cdf0e10cSrcweir 	}
103*cdf0e10cSrcweir 	else
104*cdf0e10cSrcweir #endif
105*cdf0e10cSrcweir     	Update( rDirEntry, bFloppy );
106*cdf0e10cSrcweir }
107*cdf0e10cSrcweir 
108*cdf0e10cSrcweir /*************************************************************************
109*cdf0e10cSrcweir |*
110*cdf0e10cSrcweir |*    FileStat::IsYounger()
111*cdf0e10cSrcweir |*
112*cdf0e10cSrcweir |*    Beschreibung      FSYS.SDW
113*cdf0e10cSrcweir |*    Ersterstellung    MA 11.11.91
114*cdf0e10cSrcweir |*    Letzte Aenderung  MA 11.11.91
115*cdf0e10cSrcweir |*
116*cdf0e10cSrcweir *************************************************************************/
117*cdf0e10cSrcweir 
118*cdf0e10cSrcweir // sal_True  wenn die Instanz j"unger als rIsOlder ist.
119*cdf0e10cSrcweir // sal_False wenn die Instanz "alter oder gleich alt wie rIsOlder ist.
120*cdf0e10cSrcweir 
121*cdf0e10cSrcweir sal_Bool FileStat::IsYounger( const FileStat& rIsOlder ) const
122*cdf0e10cSrcweir {
123*cdf0e10cSrcweir     if ( aDateModified > rIsOlder.aDateModified )
124*cdf0e10cSrcweir         return sal_True;
125*cdf0e10cSrcweir     if ( ( aDateModified == rIsOlder.aDateModified ) &&
126*cdf0e10cSrcweir          ( aTimeModified > rIsOlder.aTimeModified ) )
127*cdf0e10cSrcweir         return sal_True;
128*cdf0e10cSrcweir 
129*cdf0e10cSrcweir     return sal_False;
130*cdf0e10cSrcweir }
131*cdf0e10cSrcweir 
132*cdf0e10cSrcweir /*************************************************************************
133*cdf0e10cSrcweir |*
134*cdf0e10cSrcweir |*    FileStat::IsKind()
135*cdf0e10cSrcweir |*
136*cdf0e10cSrcweir |*    Ersterstellung    MA 11.11.91 (?)
137*cdf0e10cSrcweir |*    Letzte Aenderung  KH 16.01.95
138*cdf0e10cSrcweir |*
139*cdf0e10cSrcweir *************************************************************************/
140*cdf0e10cSrcweir 
141*cdf0e10cSrcweir sal_Bool FileStat::IsKind( DirEntryKind nKind ) const
142*cdf0e10cSrcweir {
143*cdf0e10cSrcweir     sal_Bool bRet = ( ( nKind == FSYS_KIND_UNKNOWN ) &&
144*cdf0e10cSrcweir 				  ( nKindFlags == FSYS_KIND_UNKNOWN ) ) ||
145*cdf0e10cSrcweir            		( ( nKindFlags & nKind ) == nKind );
146*cdf0e10cSrcweir     return bRet;
147*cdf0e10cSrcweir }
148*cdf0e10cSrcweir 
149*cdf0e10cSrcweir /*************************************************************************
150*cdf0e10cSrcweir |*
151*cdf0e10cSrcweir |*    FileStat::HasReadOnlyFlag()
152*cdf0e10cSrcweir |*
153*cdf0e10cSrcweir |*    Ersterstellung    MI 06.03.97
154*cdf0e10cSrcweir |*    Letzte Aenderung  UT 01.07.98
155*cdf0e10cSrcweir |*
156*cdf0e10cSrcweir *************************************************************************/
157*cdf0e10cSrcweir 
158*cdf0e10cSrcweir sal_Bool FileStat::HasReadOnlyFlag()
159*cdf0e10cSrcweir {
160*cdf0e10cSrcweir #if defined WNT || defined UNX || defined OS2
161*cdf0e10cSrcweir 	return sal_True;
162*cdf0e10cSrcweir #else
163*cdf0e10cSrcweir 	return sal_False;
164*cdf0e10cSrcweir #endif
165*cdf0e10cSrcweir }
166*cdf0e10cSrcweir 
167*cdf0e10cSrcweir /*************************************************************************
168*cdf0e10cSrcweir |*
169*cdf0e10cSrcweir |*    FileStat::GetReadOnlyFlag()
170*cdf0e10cSrcweir |*
171*cdf0e10cSrcweir |*    Ersterstellung    MI 06.03.97
172*cdf0e10cSrcweir |*    Letzte Aenderung  UT 02.07.98
173*cdf0e10cSrcweir |*
174*cdf0e10cSrcweir *************************************************************************/
175*cdf0e10cSrcweir 
176*cdf0e10cSrcweir sal_Bool FileStat::GetReadOnlyFlag( const DirEntry &rEntry )
177*cdf0e10cSrcweir {
178*cdf0e10cSrcweir 
179*cdf0e10cSrcweir 	ByteString aFPath(rEntry.GetFull(), osl_getThreadTextEncoding());
180*cdf0e10cSrcweir #if defined WNT
181*cdf0e10cSrcweir 	DWORD nRes = GetFileAttributes( (LPCTSTR) aFPath.GetBuffer() );
182*cdf0e10cSrcweir 	return ULONG_MAX != nRes &&
183*cdf0e10cSrcweir 		   ( FILE_ATTRIBUTE_READONLY & nRes ) == FILE_ATTRIBUTE_READONLY;
184*cdf0e10cSrcweir #elif defined OS2
185*cdf0e10cSrcweir 	FILESTATUS3 aFileStat;
186*cdf0e10cSrcweir 	APIRET nRet = DosQueryPathInfo( (PSZ)aFPath.GetBuffer(), 1, &aFileStat, sizeof(aFileStat) );
187*cdf0e10cSrcweir 	switch ( nRet )
188*cdf0e10cSrcweir 	{
189*cdf0e10cSrcweir 		case NO_ERROR:
190*cdf0e10cSrcweir 			return FILE_READONLY == ( aFileStat.attrFile & FILE_READONLY );
191*cdf0e10cSrcweir 		default:
192*cdf0e10cSrcweir 			return sal_False;
193*cdf0e10cSrcweir 	}
194*cdf0e10cSrcweir #elif defined UNX
195*cdf0e10cSrcweir 	/* could we stat the object? */
196*cdf0e10cSrcweir 	struct stat aBuf;
197*cdf0e10cSrcweir 	if (stat(aFPath.GetBuffer(), &aBuf))
198*cdf0e10cSrcweir 		return sal_False;
199*cdf0e10cSrcweir 	/* jupp, is writable for user? */
200*cdf0e10cSrcweir 	return((aBuf.st_mode & S_IWUSR) != S_IWUSR);
201*cdf0e10cSrcweir #else
202*cdf0e10cSrcweir 	return sal_False;
203*cdf0e10cSrcweir #endif
204*cdf0e10cSrcweir }
205*cdf0e10cSrcweir 
206*cdf0e10cSrcweir /*************************************************************************
207*cdf0e10cSrcweir |*
208*cdf0e10cSrcweir |*    FileStat::SetReadOnlyFlag()
209*cdf0e10cSrcweir |*
210*cdf0e10cSrcweir |*    Ersterstellung    MI 06.03.97
211*cdf0e10cSrcweir |*    Letzte Aenderung  UT 01.07.98
212*cdf0e10cSrcweir |*
213*cdf0e10cSrcweir *************************************************************************/
214*cdf0e10cSrcweir 
215*cdf0e10cSrcweir sal_uIntPtr FileStat::SetReadOnlyFlag( const DirEntry &rEntry, sal_Bool bRO )
216*cdf0e10cSrcweir {
217*cdf0e10cSrcweir 
218*cdf0e10cSrcweir 	ByteString aFPath(rEntry.GetFull(), osl_getThreadTextEncoding());
219*cdf0e10cSrcweir 
220*cdf0e10cSrcweir #if defined WNT
221*cdf0e10cSrcweir 	DWORD nRes = GetFileAttributes( (LPCTSTR) aFPath.GetBuffer() );
222*cdf0e10cSrcweir 	if ( ULONG_MAX != nRes )
223*cdf0e10cSrcweir 		nRes = SetFileAttributes( (LPCTSTR) aFPath.GetBuffer(),
224*cdf0e10cSrcweir 					( nRes & ~FILE_ATTRIBUTE_READONLY ) |
225*cdf0e10cSrcweir 					( bRO ? FILE_ATTRIBUTE_READONLY : 0 ) );
226*cdf0e10cSrcweir 	return ( ULONG_MAX == nRes ) ? ERRCODE_IO_UNKNOWN : 0;
227*cdf0e10cSrcweir #elif defined OS2
228*cdf0e10cSrcweir 	FILESTATUS3 aFileStat;
229*cdf0e10cSrcweir 	APIRET nRet = DosQueryPathInfo( (PSZ)aFPath.GetBuffer(), 1, &aFileStat, sizeof(aFileStat) );
230*cdf0e10cSrcweir 	if ( !nRet )
231*cdf0e10cSrcweir 	{
232*cdf0e10cSrcweir 		aFileStat.attrFile = ( aFileStat.attrFile & ~FILE_READONLY ) |
233*cdf0e10cSrcweir 							 ( bRO ? FILE_READONLY : 0 );
234*cdf0e10cSrcweir 		nRet = DosSetPathInfo( (PSZ)aFPath.GetBuffer(), 1, &aFileStat, sizeof(aFileStat), 0 );
235*cdf0e10cSrcweir 	}
236*cdf0e10cSrcweir 	switch ( nRet )
237*cdf0e10cSrcweir 	{
238*cdf0e10cSrcweir 		case NO_ERROR:
239*cdf0e10cSrcweir 			return ERRCODE_NONE;
240*cdf0e10cSrcweir 
241*cdf0e10cSrcweir 		case ERROR_SHARING_VIOLATION:
242*cdf0e10cSrcweir 			return ERRCODE_IO_LOCKVIOLATION;
243*cdf0e10cSrcweir 
244*cdf0e10cSrcweir 		default:
245*cdf0e10cSrcweir 			return ERRCODE_IO_NOTEXISTS;
246*cdf0e10cSrcweir 	}
247*cdf0e10cSrcweir #elif defined UNX
248*cdf0e10cSrcweir 	/* first, stat the object to get permissions */
249*cdf0e10cSrcweir 	struct stat aBuf;
250*cdf0e10cSrcweir 	if (stat(aFPath.GetBuffer(), &aBuf))
251*cdf0e10cSrcweir 		return ERRCODE_IO_NOTEXISTS;
252*cdf0e10cSrcweir 	/* set or clear write bit for user */
253*cdf0e10cSrcweir 	mode_t nMode;
254*cdf0e10cSrcweir 	if (bRO)
255*cdf0e10cSrcweir     {
256*cdf0e10cSrcweir 		nMode = aBuf.st_mode & ~S_IWUSR;
257*cdf0e10cSrcweir 		nMode = aBuf.st_mode & ~S_IWGRP;
258*cdf0e10cSrcweir 		nMode = aBuf.st_mode & ~S_IWOTH;
259*cdf0e10cSrcweir     }
260*cdf0e10cSrcweir 	else
261*cdf0e10cSrcweir 		nMode = aBuf.st_mode | S_IWUSR;
262*cdf0e10cSrcweir 	/* change it on fs */
263*cdf0e10cSrcweir 	if (chmod(aFPath.GetBuffer(), nMode))
264*cdf0e10cSrcweir 	{
265*cdf0e10cSrcweir 		switch (errno)
266*cdf0e10cSrcweir 		{
267*cdf0e10cSrcweir 			case EPERM :
268*cdf0e10cSrcweir 			case EROFS :
269*cdf0e10cSrcweir 				return ERRCODE_IO_ACCESSDENIED;
270*cdf0e10cSrcweir 			default    :
271*cdf0e10cSrcweir 				return ERRCODE_IO_NOTEXISTS;
272*cdf0e10cSrcweir 		}
273*cdf0e10cSrcweir 	}
274*cdf0e10cSrcweir 	else
275*cdf0e10cSrcweir 		return ERRCODE_NONE;
276*cdf0e10cSrcweir #else
277*cdf0e10cSrcweir 	return ERRCODE_IO_NOTSUPPORTED;
278*cdf0e10cSrcweir #endif
279*cdf0e10cSrcweir }
280*cdf0e10cSrcweir 
281*cdf0e10cSrcweir /*************************************************************************
282*cdf0e10cSrcweir |*
283*cdf0e10cSrcweir |*    FileStat::SetDateTime
284*cdf0e10cSrcweir |*
285*cdf0e10cSrcweir |*    Ersterstellung	PB  27.06.97
286*cdf0e10cSrcweir |*    Letzte Aenderung
287*cdf0e10cSrcweir |*
288*cdf0e10cSrcweir *************************************************************************/
289*cdf0e10cSrcweir #if defined WNT || defined OS2
290*cdf0e10cSrcweir 
291*cdf0e10cSrcweir void FileStat::SetDateTime( const String& rFileName,
292*cdf0e10cSrcweir 							const DateTime& rNewDateTime )
293*cdf0e10cSrcweir {
294*cdf0e10cSrcweir 	ByteString aFileName(rFileName, osl_getThreadTextEncoding());
295*cdf0e10cSrcweir 
296*cdf0e10cSrcweir 	Date aNewDate = rNewDateTime;
297*cdf0e10cSrcweir 	Time aNewTime = rNewDateTime;
298*cdf0e10cSrcweir 
299*cdf0e10cSrcweir #if defined WNT
300*cdf0e10cSrcweir 	TIME_ZONE_INFORMATION aTZI;
301*cdf0e10cSrcweir 	DWORD dwTZI = GetTimeZoneInformation( &aTZI );
302*cdf0e10cSrcweir 
303*cdf0e10cSrcweir 	if ( dwTZI != (DWORD)-1 && dwTZI != TIME_ZONE_ID_UNKNOWN )
304*cdf0e10cSrcweir 	{
305*cdf0e10cSrcweir 		// 1. Korrektur der Zeitzone
306*cdf0e10cSrcweir 		LONG nDiff = aTZI.Bias;
307*cdf0e10cSrcweir 		Time aOldTime = aNewTime; // alte Zeit merken
308*cdf0e10cSrcweir 
309*cdf0e10cSrcweir 		// 2. evt. Korrektur Sommer-/Winterzeit
310*cdf0e10cSrcweir 		if ( dwTZI == TIME_ZONE_ID_DAYLIGHT )
311*cdf0e10cSrcweir 			nDiff += aTZI.DaylightBias;
312*cdf0e10cSrcweir 
313*cdf0e10cSrcweir 		Time aDiff( abs( nDiff / 60 /*Min -> Std*/ ), 0 );
314*cdf0e10cSrcweir 
315*cdf0e10cSrcweir 		if ( nDiff > 0 )
316*cdf0e10cSrcweir 		{
317*cdf0e10cSrcweir 			aNewTime += aDiff;					// Stundenkorrektur
318*cdf0e10cSrcweir 
319*cdf0e10cSrcweir 			// bei "Uberlauf korrigieren
320*cdf0e10cSrcweir 			if ( aNewTime >= Time( 24, 0 ) )
321*cdf0e10cSrcweir 				aNewTime -= Time( 24, 0 );
322*cdf0e10cSrcweir 
323*cdf0e10cSrcweir 			// Tages"uberlauf?
324*cdf0e10cSrcweir 			if ( aOldTime == Time( 0, 0 ) ||	// 00:00 -> 01:00
325*cdf0e10cSrcweir 				 aNewTime < aOldTime ) 			// 23:00 -> 00:00 | 01:00 ...
326*cdf0e10cSrcweir 				aNewDate++;
327*cdf0e10cSrcweir 		}
328*cdf0e10cSrcweir 		else if ( nDiff < 0 )
329*cdf0e10cSrcweir 		{
330*cdf0e10cSrcweir 			aNewTime -= aDiff;					// Stundenkorrektur
331*cdf0e10cSrcweir 
332*cdf0e10cSrcweir 			// negative Zeit (-1:00) korrigieren: 23:00
333*cdf0e10cSrcweir 			if (aNewTime < Time( 0, 0 ) )
334*cdf0e10cSrcweir 				aNewTime += Time( 24, 0 );
335*cdf0e10cSrcweir 
336*cdf0e10cSrcweir 			// Tagesunterlauf ?
337*cdf0e10cSrcweir 			if ( aOldTime == Time( 0, 0 ) ||	// 00:00 -> 23:00
338*cdf0e10cSrcweir 				 aNewTime > aOldTime )			// 01:00 -> 23:00 | 22:00 ...
339*cdf0e10cSrcweir 				aNewDate--;
340*cdf0e10cSrcweir 		}
341*cdf0e10cSrcweir 	}
342*cdf0e10cSrcweir 
343*cdf0e10cSrcweir 
344*cdf0e10cSrcweir 	SYSTEMTIME aTime;
345*cdf0e10cSrcweir 	aTime.wYear = aNewDate.GetYear();
346*cdf0e10cSrcweir 	aTime.wMonth = aNewDate.GetMonth();
347*cdf0e10cSrcweir 	aTime.wDayOfWeek = 0;
348*cdf0e10cSrcweir 	aTime.wDay = aNewDate.GetDay();
349*cdf0e10cSrcweir 	aTime.wHour = aNewTime.GetHour();
350*cdf0e10cSrcweir 	aTime.wMinute = aNewTime.GetMin();
351*cdf0e10cSrcweir 	aTime.wSecond = aNewTime.GetSec();
352*cdf0e10cSrcweir 	aTime.wMilliseconds = 0;
353*cdf0e10cSrcweir 	FILETIME aFileTime;
354*cdf0e10cSrcweir 	SystemTimeToFileTime( &aTime, &aFileTime );
355*cdf0e10cSrcweir 
356*cdf0e10cSrcweir 	HANDLE hFile = CreateFile( aFileName.GetBuffer(), GENERIC_WRITE, 0, 0,
357*cdf0e10cSrcweir 							   OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 );
358*cdf0e10cSrcweir 
359*cdf0e10cSrcweir 	if ( hFile != INVALID_HANDLE_VALUE )
360*cdf0e10cSrcweir 	{
361*cdf0e10cSrcweir 		SetFileTime( hFile, &aFileTime, &aFileTime, &aFileTime );
362*cdf0e10cSrcweir 		CloseHandle( hFile );
363*cdf0e10cSrcweir 	}
364*cdf0e10cSrcweir #elif defined OS2
365*cdf0e10cSrcweir 
366*cdf0e10cSrcweir 	// open file
367*cdf0e10cSrcweir 	ULONG nAction = FILE_EXISTED;
368*cdf0e10cSrcweir 	HFILE hFile = 0;
369*cdf0e10cSrcweir 	ULONG nFlags = OPEN_FLAGS_WRITE_THROUGH	|
370*cdf0e10cSrcweir 				   OPEN_FLAGS_FAIL_ON_ERROR	| OPEN_FLAGS_NO_CACHE	|
371*cdf0e10cSrcweir 				   OPEN_FLAGS_RANDOM		| OPEN_FLAGS_NOINHERIT	|
372*cdf0e10cSrcweir 				   OPEN_SHARE_DENYNONE		| OPEN_ACCESS_READWRITE;
373*cdf0e10cSrcweir 
374*cdf0e10cSrcweir 	APIRET nRet = DosOpen((PSZ)aFileName.GetBuffer(), &hFile, (PULONG)&nAction,
375*cdf0e10cSrcweir 						  0/*size*/, FILE_NORMAL,
376*cdf0e10cSrcweir 						  OPEN_ACTION_FAIL_IF_NEW | OPEN_ACTION_OPEN_IF_EXISTS,
377*cdf0e10cSrcweir 						  nFlags, 0/*ea*/);
378*cdf0e10cSrcweir 
379*cdf0e10cSrcweir 	if ( nRet == 0 )
380*cdf0e10cSrcweir 	{
381*cdf0e10cSrcweir 	    FILESTATUS3 FileInfoBuffer;
382*cdf0e10cSrcweir 
383*cdf0e10cSrcweir 	    nRet = DosQueryFileInfo(
384*cdf0e10cSrcweir 			hFile, 1, &FileInfoBuffer, sizeof(FileInfoBuffer));
385*cdf0e10cSrcweir 
386*cdf0e10cSrcweir 	    if ( nRet == 0 )
387*cdf0e10cSrcweir 	    {
388*cdf0e10cSrcweir 	        FDATE aNewDate;
389*cdf0e10cSrcweir 	        FTIME aNewTime;
390*cdf0e10cSrcweir 
391*cdf0e10cSrcweir 	         // create date and time words
392*cdf0e10cSrcweir 	        aNewDate.day     = rNewDateTime.GetDay();
393*cdf0e10cSrcweir 	        aNewDate.month   = rNewDateTime.GetMonth();
394*cdf0e10cSrcweir 	        aNewDate.year    = rNewDateTime.GetYear() - 1980;
395*cdf0e10cSrcweir 	        aNewTime.twosecs = rNewDateTime.GetSec() / 2;
396*cdf0e10cSrcweir 	        aNewTime.minutes = rNewDateTime.GetMin();
397*cdf0e10cSrcweir 	        aNewTime.hours   = rNewDateTime.GetHour();
398*cdf0e10cSrcweir 
399*cdf0e10cSrcweir 	        // set file date and time
400*cdf0e10cSrcweir 	        FileInfoBuffer.fdateCreation   = aNewDate;
401*cdf0e10cSrcweir 	        FileInfoBuffer.ftimeCreation   = aNewTime;
402*cdf0e10cSrcweir 	        FileInfoBuffer.fdateLastAccess = aNewDate;
403*cdf0e10cSrcweir 	        FileInfoBuffer.ftimeLastAccess = aNewTime;
404*cdf0e10cSrcweir 	        FileInfoBuffer.fdateLastWrite  = aNewDate;
405*cdf0e10cSrcweir 	        FileInfoBuffer.ftimeLastWrite  = aNewTime;
406*cdf0e10cSrcweir 
407*cdf0e10cSrcweir 	        DosSetFileInfo(hFile, 1, &FileInfoBuffer, sizeof(FileInfoBuffer));
408*cdf0e10cSrcweir 	    }
409*cdf0e10cSrcweir 	    DosClose(hFile);
410*cdf0e10cSrcweir 	}
411*cdf0e10cSrcweir #endif
412*cdf0e10cSrcweir 
413*cdf0e10cSrcweir }
414*cdf0e10cSrcweir #endif
415