[Vm-dev] VM Maker: FileAttributesPlugin.oscog-AlistairGrant.29.mcz
commits at source.squeak.org
commits at source.squeak.org
Fri Nov 29 20:38:53 UTC 2019
Eliot Miranda uploaded a new version of FileAttributesPlugin to project VM Maker:
http://source.squeak.org/VMMaker/FileAttributesPlugin.oscog-AlistairGrant.29.mcz
==================== Summary ====================
Name: FileAttributesPlugin.oscog-AlistairGrant.29
Author: AlistairGrant
Time: 16 June 2018, 2:49:28.03222 pm
UUID: 9c55f745-9933-4291-abb7-f278da431090
Ancestors: FileAttributesPlugin.oscog-AlistairGrant.28
1.3.0: Change from Unix (UTC) timestamps to Squeak timestamps for file attributes.
The posix routines just don't seem to handle timezones and DST correctly.
=============== Diff against FileAttributesPlugin.oscog-AlistairGrant.28 ===============
Item was changed:
----- Method: FileAttributesPlugin class>>declareCVarsIn: (in category 'translation') -----
declareCVarsIn: cg
self declareC: #('sCLPfn' 'sCOFfn')
as: #'void *'
in: cg.
"Assume the security plugin can be loaded until proven otherwise"
cg var: 'hasSecurityPlugin' declareC: 'int hasSecurityPlugin = 1'.
cg addHeaderFile: '<limits.h>'.
cg addHeaderFile: '<sys/types.h>'.
cg addHeaderFile: '<dirent.h>
#ifdef _WIN32
#include <windows.h>
#include <winbase.h>
#define FAIL() { return -1; }
#include "sqWin32File.h"
+ #else
+ #include "sqMemoryAccess.h"
+ extern sqLong convertToLongSqueakTime(time_t unixTime);
#endif
typedef struct dirptrstruct {
DIR *dp;
int path_len;
char *path_file;
char path[PATH_MAX+4];
} osdir;'.
cg addHeaderFile: '<sys/stat.h>
#if !!defined(HAVE_LSTAT) && !!defined(_WIN32)
#define HAVE_LSTAT 1
#endif'.
cg addHeaderFile: '<unistd.h>
/* AKG 2017 - ', self moduleName, '.c translated from class ', self name, ' */'!
Item was added:
+ ----- Method: FileAttributesPlugin>>convertWinToSqueakTime: (in category 'private - windows') -----
+ convertWinToSqueakTime: st
+ "Convert the supplied Windows SYSTEMTIME to Squeak time"
+ <option: #_WIN32>
+
+ | dy secs nDaysPerMonth |
+
+ <returnTypeC: 'sqLong'>
+ <var: 'st' declareC: 'SYSTEMTIME st'>
+ <var: 'dy' type: 'sqLong'>
+ <var: 'secs' type: 'sqLong'>
+ <var: 'nDaysPerMonth' declareC: 'static sqLong nDaysPerMonth[14] = {
+ 0, 0, 31, 59, 90, 120, 151,
+ 181, 212, 243, 273, 304, 334, 365 }'>
+ self touch: nDaysPerMonth.
+
+ "Squeak epoch is Jan 1, 1901"
+ "compute delta year"
+ dy := (self cCode: 'st.wYear') - 1901.
+ secs := (dy * 365 * 24 * 60 * 60) "base seconds"
+ + ((dy bitShift: -2) * 24 * 60 * 60). "seconds of leap years"
+ "check if month > 2 and current year is a leap year"
+ [ (self cCode: 'st.wMonth') > 2 and: [ (dy bitAnd: 16r0003) = 16r0003 ]] ifTrue: [
+ "add one day"
+ secs := secs + (24 * 60 * 60) ].
+ "add the days from the beginning of the year"
+ secs := secs + (self cCode: '(nDaysPerMonth[st.wMonth] + st.wDay - 1) * 24 * 60 * 60').
+ "add the hours, minutes, and seconds"
+ secs := secs + (self cCode: 'st.wSecond + 60*(st.wMinute + 60*st.wHour)').
+ ^secs
+ !
Item was changed:
----- Method: FileAttributesPlugin>>fileCreationTimeFor:length:to: (in category 'private - windows') -----
fileCreationTimeFor: pathString length: pathLength to: creationDate
+ "Get the creationDate for the supplied file."
+ <inline: #never>
- "Get the creationDate for the supplied file.
- Linux kernel 4.11 should have statx(), so hopefully there will be a cross-platform
- solution soon. Just dump the c-code and hope to remove it soon."
<option: #_WIN32>
+ | winAttrs status |
- | tm winAttrs win32Path sysTime |
<var: 'pathString' type: 'char *'>
+ <var: 'creationDate' type: 'sqLong *'>
- <var: 'creationDate' type: 'time_t *'>
- <var: 'tm' type: 'struct tm'>
<var: 'winAttrs' type: 'WIN32_FILE_ATTRIBUTE_DATA'>
- <var: 'win32Path' type: 'WCHAR *'>
- <var: 'sysTime' type: 'SYSTEMTIME'>
- self touch: winAttrs.
- self touch: sysTime.
- self me: (self addressOf: tm) ms: 0 et: tm sizeof.
- "convert the supplied path name into a wide string"
- self ALLOC_: win32Path WIN32_: pathString PATH: pathLength.
- (self cCode: 'GetFileAttributesExW(win32Path, 0, &winAttrs)') = 0 ifTrue:
- [^self getAttributesFailed].
- (self cCode: 'FileTimeToSystemTime(&winAttrs.ftCreationTime, &sysTime)') = 0 ifTrue:
- [^self timeConversionFailed].
+ "Get the file attributes"
+ status := self winFileAttributesFor: pathString length: pathLength to: (self addressOf: winAttrs).
+ status = 0 ifFalse: [^status].
- self cCode: '
- tm.tm_year = sysTime.wYear - 1900;
- tm.tm_mon = sysTime.wMonth - 1;
- tm.tm_mday = sysTime.wDay;
+ "Set the creationDate"
+ status := self winFileCreationTimeFor: (self addressOf: winAttrs) to: creationDate.
+ status = 0 ifFalse: [^status].
- tm.tm_hour = sysTime.wHour;
- tm.tm_min = sysTime.wMinute;
- tm.tm_sec = sysTime.wSecond;
- tm.tm_isdst = 0;
- *creationDate = mktime(&tm)'.
^0!
Item was added:
+ ----- Method: FileAttributesPlugin>>fileLastAccessTimeFor:length:to: (in category 'private - windows') -----
+ fileLastAccessTimeFor: pathString length: pathLength to: creationDate
+ "Get the creationDate for the supplied file."
+ <inline: #never>
+ <option: #_WIN32>
+ | winAttrs status |
+ <var: 'pathString' type: 'char *'>
+ <var: 'creationDate' type: 'sqLong *'>
+ <var: 'winAttrs' type: 'WIN32_FILE_ATTRIBUTE_DATA'>
+
+ "Get the file attributes"
+ status := self winFileAttributesFor: pathString length: pathLength to: (self addressOf: winAttrs).
+ status = 0 ifFalse: [^status].
+
+ "Set the creationDate"
+ status := self winFileLastAccessTimeFor: (self addressOf: winAttrs) to: creationDate.
+ status = 0 ifFalse: [^status].
+
+ ^0!
Item was added:
+ ----- Method: FileAttributesPlugin>>fileLastWriteTimeFor:length:to: (in category 'private - windows') -----
+ fileLastWriteTimeFor: pathString length: pathLength to: creationDate
+ "Get the creationDate for the supplied file."
+ <inline: #never>
+ <option: #_WIN32>
+ | winAttrs status |
+ <var: 'pathString' type: 'char *'>
+ <var: 'creationDate' type: 'sqLong *'>
+ <var: 'winAttrs' type: 'WIN32_FILE_ATTRIBUTE_DATA'>
+
+ "Get the file attributes"
+ status := self winFileAttributesFor: pathString length: pathLength to: (self addressOf: winAttrs).
+ status = 0 ifFalse: [^status].
+
+ "Set the creationDate"
+ status := self winFileLastWriteTimeFor: (self addressOf: winAttrs) to: creationDate.
+ status = 0 ifFalse: [^status].
+
+ ^0!
Item was removed:
- ----- Method: FileAttributesPlugin>>offsetStatBufTimesForWIN32: (in category 'private - windows') -----
- offsetStatBufTimesForWIN32: statBufPointer
- "Adjust the statBuffer to UTC, see https://msdn.microsoft.com/en-us/library/windows/desktop/ms725481(v=vs.85).aspx"
- <option: #_WIN32>
- <var: 'statBufPointer' type: 'struct stat *'>
- | status dtzi offset |
- <var: 'offset' type: 'long'>
- <var: 'dtzi' type: 'TIME_ZONE_INFORMATION'>
- status := self GetTimeZoneInformation: (self addressOf: dtzi).
- offset := (self cCode: 'dtzi.Bias' inSmalltalk: [0]) * 60.
- "Adjust for DST if required"
- status = 2 ifTrue: [offset := offset - 3600].
- self cCode: 'statBufPointer->st_atime += offset'.
- self cCode: 'statBufPointer->st_mtime += offset'.
- self cCode: 'statBufPointer->st_ctime += offset'.!
Item was removed:
- ----- Method: FileAttributesPlugin>>oopFromTimeT: (in category 'private') -----
- oopFromTimeT: posixSeconds
- "Answer an object representation of the provided time (time_t).
- The size of time_t is platform dependent, so check the size and convert appropriately."
-
- <var: 'posixSeconds' type: 'time_t'>
-
- ^(self sizeof: #time_t) = 4 ifTrue:
- [interpreterProxy signed32BitIntegerFor: posixSeconds]
- ifFalse:
- [interpreterProxy signed64BitIntegerFor: posixSeconds].
- !
Item was added:
+ ----- Method: FileAttributesPlugin>>posixFileTimesFrom:to: (in category 'private - posix') -----
+ posixFileTimesFrom: statBufPointer to: attributeArray
+ "Populate attributeArray with the file times from statBufPointer"
+
+ | attributeDate |
+
+ <var: 'statBufPointer' type: 'struct stat *'>
+ <var: 'attributeDate' type: 'sqLong'>
+
+ self cppIf: #_WIN32 defined ifTrue: [] ifFalse: [
+ attributeDate := self convertToLongSqueakTime: statBufPointer st_atime.
+ interpreterProxy
+ storePointer: 8
+ ofObject: attributeArray
+ withValue: (interpreterProxy signed64BitIntegerFor: attributeDate).
+ attributeDate := self convertToLongSqueakTime: statBufPointer st_mtime.
+ interpreterProxy
+ storePointer: 9
+ ofObject: attributeArray
+ withValue: (interpreterProxy signed64BitIntegerFor: attributeDate).
+ attributeDate := self convertToLongSqueakTime: statBufPointer st_ctime.
+ interpreterProxy
+ storePointer: 10
+ ofObject: attributeArray
+ withValue: (interpreterProxy signed64BitIntegerFor: attributeDate);
+ storePointer: 11
+ ofObject: attributeArray
+ withValue: interpreterProxy nilObject ].
+ ^0!
Item was changed:
----- Method: FileAttributesPlugin>>primitiveFileAttribute (in category 'file primitives') -----
primitiveFileAttribute
"Answer a single file attribute.
primFileAttributes: aString attributeNumber: attributeNumber
aString is the path to the file
attributeNumber identifies which attribute to return:
1 - 12: stat(): name, mode, ino, dev, nlink, uid, gid, size, accessDate, modifiedDate, changeDate, creationDate
13 - 15: access(): R_OK, W_OK, X_OK
16: isSymlink
On error, answer a single element array containing the appropriate error code."
+ | fileName attributeNumber resultOop fileNameOop statBuf cPathName sizeIfFile mode attributeDate status |
- | fileName attributeNumber resultOop fileNameOop statBuf cPathName sizeIfFile mode creationDate status |
<export: true>
<var: 'statBuf' type: 'struct stat'>
<var: 'cPathName' declareC: 'char cPathName[PATH_MAX]'>
+ <var: 'attributeDate' type: 'sqLong'>
- <var: 'creationDate' type: 'time_t'>
fileName := interpreterProxy stackObjectValue: 1.
attributeNumber := interpreterProxy stackIntegerValue: 0.
(interpreterProxy failed
or: [(attributeNumber between: 1 and: 16) not
or: [(interpreterProxy is: fileName KindOf: 'String') not]]) ifTrue:
[^interpreterProxy primitiveFailFor: PrimErrBadArgument].
status := self pathOop: fileName toBuffer: cPathName maxLen: #PATH_MAX.
status ~= 0 ifTrue:
[^interpreterProxy primitiveFailForOSError: status].
resultOop := 0.
attributeNumber < 12 ifTrue:
"Get requested stat entry"
[
status := self
putStatFor: cPathName
intoBuffer: (self addressOf: statBuf)
targetName: (self addressOf: fileNameOop).
status ~= 0 ifTrue:
[^interpreterProxy primitiveFailForOSError: status].
"In C, this would naturally be a switch statement,
but I don't know to mix in the smalltalk code"
attributeNumber = 1 ifTrue: [resultOop := fileNameOop].
attributeNumber = 2 ifTrue:
[resultOop := interpreterProxy positiveMachineIntegerFor: statBuf st_mode].
attributeNumber = 3 ifTrue:
[resultOop := interpreterProxy positive64BitIntegerFor: statBuf st_ino].
attributeNumber = 4 ifTrue:
[resultOop := interpreterProxy positive64BitIntegerFor: statBuf st_dev].
attributeNumber = 5 ifTrue:
[resultOop := interpreterProxy positive64BitIntegerFor: statBuf st_nlink].
attributeNumber = 6 ifTrue:
[resultOop := interpreterProxy positiveMachineIntegerFor: statBuf st_uid].
attributeNumber = 7 ifTrue:
[resultOop := interpreterProxy positiveMachineIntegerFor: statBuf st_gid].
attributeNumber = 8 ifTrue:
[
sizeIfFile := ((self S_ISDIR: statBuf st_mode) = 0)
ifTrue: [statBuf st_size]
ifFalse: [0].
resultOop := interpreterProxy positiveMachineIntegerFor: sizeIfFile
].
+ attributeNumber = 9 ifTrue: [ "Access Time"
+ self cppIf: #_WIN32 defined ifTrue: [
+ status := self fileLastAccessTimeFor: cPathName
+ length: cPathName strlen
+ to: (self addressOf: attributeDate put: [:val| attributeDate := val]).
+ status ~= 0 ifTrue:
+ [^interpreterProxy primitiveFailForOSError: status].
+ resultOop := interpreterProxy signed64BitIntegerFor: attributeDate ]
+ ifFalse: [
+ attributeDate := self convertToLongSqueakTime: statBuf st_atime.
+ resultOop := interpreterProxy signed64BitIntegerFor: attributeDate]].
+ attributeNumber = 10 ifTrue: [ "Modified Time"
+ self cppIf: #_WIN32 defined ifTrue: [
+ status := self fileLastWriteTimeFor: cPathName
+ length: cPathName strlen
+ to: (self addressOf: attributeDate put: [:val| attributeDate := val]).
+ status ~= 0 ifTrue:
+ [^interpreterProxy primitiveFailForOSError: status].
+ resultOop := interpreterProxy signed64BitIntegerFor: attributeDate ]
+ ifFalse: [
+ attributeDate := self convertToLongSqueakTime: statBuf st_mtime.
+ resultOop := interpreterProxy signed64BitIntegerFor: attributeDate]].
+ attributeNumber = 11 ifTrue: [ "Change Time"
+ self cppIf: #_WIN32 defined ifTrue:
+ [resultOop := interpreterProxy nilObject]
+ ifFalse: [
+ attributeDate := self convertToLongSqueakTime: statBuf st_ctime.
+ resultOop := interpreterProxy signed64BitIntegerFor: attributeDate]].
- attributeNumber = 9 ifTrue:
- [resultOop := self oopFromTimeT: statBuf st_atime].
- attributeNumber = 10 ifTrue:
- [resultOop := self oopFromTimeT: statBuf st_mtime].
- attributeNumber = 11 ifTrue:
- [resultOop := self oopFromTimeT: statBuf st_ctime].
]
+ ifFalse: [attributeNumber = 12 ifTrue: [ "Creation Time"
- ifFalse: [attributeNumber = 12 ifTrue:
- [
self cppIf: #_WIN32 defined ifTrue: [
status := self fileCreationTimeFor: cPathName
length: cPathName strlen
+ to: (self addressOf: attributeDate put: [:val| attributeDate := val]).
- to: (self addressOf: creationDate put: [:val| creationDate := val]).
status ~= 0 ifTrue:
[^interpreterProxy primitiveFailForOSError: status].
+ resultOop := interpreterProxy signed64BitIntegerFor: attributeDate ]
- resultOop := self oopFromTimeT: creationDate ]
ifFalse: [
resultOop := interpreterProxy nilObject ]
]
ifFalse: [attributeNumber < 16 ifTrue:
"Get requested access entry"
[
attributeNumber = 13 ifTrue: [mode := self fileReadableFlag].
attributeNumber = 14 ifTrue: [mode := self fileWriteableFlag].
attributeNumber = 15 ifTrue: [mode := self fileExecutableFlag].
resultOop := ((self acc: cPathName ess: mode) = 0)
ifTrue: [interpreterProxy trueObject]
ifFalse: [interpreterProxy falseObject].
]
+ ifFalse: "attributeNumber = 16, #isSymlink"
- ifFalse: "attributeNumber = 16"
[
status := self isSymlink: cPathName boolean: (self addressOf: resultOop put: [:val| resultOop := val]).
status ~= 0 ifTrue:
[^interpreterProxy primitiveFailForOSError: status].
]]].
resultOop = 0
ifTrue: ["It shouldn't be possible to get here"
interpreterProxy primitiveFail]
ifFalse: [interpreterProxy pop: 3 thenPush: resultOop]!
Item was changed:
----- Method: FileAttributesPlugin>>putStatFor:intoBuffer:targetName: (in category 'private - file') -----
putStatFor: cPathName intoBuffer: statBufPointer targetName: fileNameOop
"Call stat() on cPathName, storing the results in
the buffer at statBufPointer."
| status |
<var: 'cPathName' type: 'char *'>
<var: 'statBufPointer' type: 'struct stat *'>
<var: 'fileNameOop' type: 'sqInt *'>
status := self st: cPathName at: statBufPointer.
status ~= 0 ifTrue: [^self cantStatPath].
- self cppIf: #_WIN32 defined
- ifTrue: [self offsetStatBufTimesForWIN32: statBufPointer].
fileNameOop at: 0 put: interpreterProxy nilObject.
^0!
Item was changed:
----- Method: FileAttributesPlugin>>statArrayFor:toArray:from:fileName: (in category 'private - file') -----
statArrayFor: cPathName toArray: attributeArray from: statBufPointer fileName: fileNameOop
"Answer a file entry array from the supplied statBufPointer"
+ | sizeIfFile status |
- | sizeIfFile creationDate status |
<var: 'cPathName' type: 'char *'>
<var: 'statBufPointer' type: 'struct stat *'>
- <var: 'creationDate' type: 'time_t'>
sizeIfFile := (self S_ISDIR: statBufPointer st_mode) = 0
ifTrue: [statBufPointer st_size]
ifFalse: [0].
interpreterProxy
storePointer: 0
ofObject: attributeArray
withValue: fileNameOop;
storePointer: 1
ofObject: attributeArray
withValue: (interpreterProxy positiveMachineIntegerFor: statBufPointer st_mode);
storePointer: 2
ofObject: attributeArray
withValue: (interpreterProxy positive64BitIntegerFor: statBufPointer st_ino);
storePointer: 3
ofObject: attributeArray
withValue: (interpreterProxy positive64BitIntegerFor: statBufPointer st_dev);
storePointer: 4
ofObject: attributeArray
withValue: (interpreterProxy positive64BitIntegerFor: statBufPointer st_nlink);
storePointer: 5
ofObject: attributeArray
withValue: (interpreterProxy positiveMachineIntegerFor: statBufPointer st_uid);
storePointer: 6
ofObject: attributeArray
withValue: (interpreterProxy positiveMachineIntegerFor: statBufPointer st_gid);
storePointer: 7
ofObject: attributeArray
+ withValue: (interpreterProxy positive64BitIntegerFor: sizeIfFile).
+
- withValue: (interpreterProxy positive64BitIntegerFor: sizeIfFile);
- storePointer: 8
- ofObject: attributeArray
- withValue: (self oopFromTimeT: statBufPointer st_atime);
- storePointer: 9
- ofObject: attributeArray
- withValue: (self oopFromTimeT: statBufPointer st_mtime);
- storePointer: 10
- ofObject: attributeArray
- withValue: (self oopFromTimeT: statBufPointer st_ctime).
self cppIf: #_WIN32 defined
+ ifTrue: [ status := self winFileTimesFor: cPathName to: attributeArray ]
+ ifFalse: [ status := self posixFileTimesFrom: statBufPointer to: attributeArray ].
+
+ ^status
+ !
- ifTrue:
- [status := self fileCreationTimeFor: cPathName
- length: cPathName strlen
- to: (self addressOf: creationDate put: [:val| creationDate := val]).
- interpreterProxy
- storePointer: 11
- ofObject: attributeArray
- withValue: (status = 0
- ifTrue: [self oopFromTimeT: creationDate]
- ifFalse: [interpreterProxy nilObject])]
- ifFalse:
- [interpreterProxy
- storePointer: 11
- ofObject: attributeArray
- withValue: interpreterProxy nilObject].
- ^0!
Item was changed:
----- Method: FileAttributesPlugin>>versionString (in category 'version string') -----
versionString
"Answer a string containing the version string for this plugin."
<inline: #always>
+ ^'1.3.0'!
- ^'1.2.6'!
Item was added:
+ ----- Method: FileAttributesPlugin>>winFileAttributesFor:length:to: (in category 'private - windows') -----
+ winFileAttributesFor: pathString length: pathLength to: winAttrs
+ "Populate the supplied Win32 file attribute structure"
+
+ <option: #_WIN32>
+
+ | win32Path |
+ <var: 'pathString' type: 'char *'>
+ <var: 'winAttrs' type: 'WIN32_FILE_ATTRIBUTE_DATA *'>
+ <var: 'win32Path' type: 'WCHAR *'>
+
+ self touch: winAttrs.
+ "convert the supplied path name into a wide string"
+ self ALLOC_: win32Path WIN32_: pathString PATH: pathLength.
+ "Populate the supplied winAttrs structure"
+ (self cCode: 'GetFileAttributesExW(win32Path, GetFileExInfoStandard, winAttrs)') = 0 ifTrue:
+ [^self getAttributesFailed].
+ ^0!
Item was added:
+ ----- Method: FileAttributesPlugin>>winFileCreationTimeFor:to: (in category 'private - windows') -----
+ winFileCreationTimeFor: winAttrs to: creationDate
+ "Set the file creation time from the supplied attributes."
+ <option: #_WIN32>
+
+ | sysTime fileTime |
+
+ <var: 'winAttrs' declareC: 'WIN32_FILE_ATTRIBUTE_DATA *winAttrs'>
+ <var: 'creationDate' declareC: 'sqLong *creationDate'>
+ <var: 'fileTime' type: 'FILETIME'>
+ <var: 'sysTime' type: 'SYSTEMTIME'>
+
+ self touch: winAttrs.
+ self touch: sysTime.
+ self touch: fileTime.
+
+ (self cCode: 'FileTimeToLocalFileTime(&winAttrs->ftCreationTime, &fileTime)') = 0 ifTrue:
+ [^self timeConversionFailed].
+ (self cCode: 'FileTimeToSystemTime(&fileTime, &sysTime)') = 0 ifTrue:
+ [^self timeConversionFailed].
+ self cCode: '*creationDate = convertWinToSqueakTime(sysTime)'.
+
+ ^0!
Item was added:
+ ----- Method: FileAttributesPlugin>>winFileLastAccessTimeFor:to: (in category 'private - windows') -----
+ winFileLastAccessTimeFor: winAttrs to: accessDate
+ "Set the file creation time from the supplied attributes."
+ <option: #_WIN32>
+
+ | sysTime fileTime |
+
+ <var: 'winAttrs' declareC: 'WIN32_FILE_ATTRIBUTE_DATA *winAttrs'>
+ <var: 'accessDate' declareC: 'sqLong *accessDate'>
+ <var: 'fileTime' type: 'FILETIME'>
+ <var: 'sysTime' type: 'SYSTEMTIME'>
+
+ self touch: winAttrs.
+ self touch: sysTime.
+ self touch: fileTime.
+
+ (self cCode: 'FileTimeToLocalFileTime(&winAttrs->ftLastAccessTime, &fileTime)') = 0 ifTrue:
+ [^self timeConversionFailed].
+ (self cCode: 'FileTimeToSystemTime(&fileTime, &sysTime)') = 0 ifTrue:
+ [^self timeConversionFailed].
+ self cCode: '*accessDate = convertWinToSqueakTime(sysTime)'.
+
+ ^0!
Item was added:
+ ----- Method: FileAttributesPlugin>>winFileLastWriteTimeFor:to: (in category 'private - windows') -----
+ winFileLastWriteTimeFor: winAttrs to: writeDate
+ "Set the file write time from the supplied attributes."
+ <option: #_WIN32>
+
+ | sysTime fileTime |
+
+ <var: 'winAttrs' declareC: 'WIN32_FILE_ATTRIBUTE_DATA *winAttrs'>
+ <var: 'writeDate' declareC: 'sqLong *writeDate'>
+ <var: 'fileTime' type: 'FILETIME'>
+ <var: 'sysTime' type: 'SYSTEMTIME'>
+
+ self touch: winAttrs.
+ self touch: sysTime.
+ self touch: fileTime.
+
+ (self cCode: 'FileTimeToLocalFileTime(&winAttrs->ftLastWriteTime, &fileTime)') = 0 ifTrue:
+ [^self timeConversionFailed].
+ (self cCode: 'FileTimeToSystemTime(&fileTime, &sysTime)') = 0 ifTrue:
+ [^self timeConversionFailed].
+ self cCode: '*writeDate = convertWinToSqueakTime(sysTime)'.
+
+ ^0!
Item was added:
+ ----- Method: FileAttributesPlugin>>winFileTimesFor:to: (in category 'private - windows') -----
+ winFileTimesFor: cPathName to: attributeArray
+ <inline: #never>
+ <option: #_WIN32>
+
+ | winAttrs attributeDate status |
+ <var: 'cPathName' declareC: 'char *cPathName'>
+ <var: 'attributeDate' type: 'sqLong'>
+ <var: 'winAttrs' type: 'WIN32_FILE_ATTRIBUTE_DATA'>
+
+ "Get the file attributes"
+ status := self winFileAttributesFor: cPathName
+ length: cPathName strlen
+ to: (self addressOf: winAttrs put: [ :val | winAttrs := val ]).
+ status = 0 ifFalse: [^status].
+
+ "Set the accessDate"
+ status := self winFileLastAccessTimeFor: (self addressOf: winAttrs) to: (self addressOf: attributeDate).
+ status = 0 ifFalse: [^status].
+ interpreterProxy
+ storePointer: 8
+ ofObject: attributeArray
+ withValue: (interpreterProxy signed64BitIntegerFor: attributeDate).
+
+ "Set the accessDate"
+ status := self winFileLastWriteTimeFor: (self addressOf: winAttrs) to: (self addressOf: attributeDate).
+ status = 0 ifFalse: [^status].
+ interpreterProxy
+ storePointer: 9
+ ofObject: attributeArray
+ withValue: (interpreterProxy signed64BitIntegerFor: attributeDate).
+
+ "Set the changeDate"
+ interpreterProxy
+ storePointer: 10
+ ofObject: attributeArray
+ withValue: interpreterProxy nilObject.
+
+ "Set the creationDate"
+ status := self winFileCreationTimeFor: (self addressOf: winAttrs) to: (self addressOf: attributeDate).
+ status = 0 ifFalse: [^status].
+ interpreterProxy
+ storePointer: 11
+ ofObject: attributeArray
+ withValue: (interpreterProxy signed64BitIntegerFor: attributeDate).
+
+ ^0
+ !
More information about the Vm-dev
mailing list