--- a/Win32OperatingSystem.st Thu Mar 05 20:13:39 2009 +0100
+++ b/Win32OperatingSystem.st Fri Mar 06 00:42:31 2009 +0100
@@ -3872,23 +3872,48 @@
%{
if (__isString(aPathName)) {
- int ret;
- SECURITY_ATTRIBUTES sa;
-
- sa.nLength = sizeof( sa );
- sa.lpSecurityDescriptor = NULL;
- sa.bInheritHandle = TRUE;
-
- ret = CreateDirectory(__stringVal(aPathName), &sa);
- if (ret != TRUE) {
- __threadErrno = __WIN32_ERR(GetLastError());
- @global(LastErrorNumber) = __mkSmallInteger(__threadErrno);
- RETURN (false);
- }
- RETURN (true);
- }
-%}.
- self primitiveFailed
+ int ret;
+ SECURITY_ATTRIBUTES sa;
+
+ sa.nLength = sizeof( sa );
+ sa.lpSecurityDescriptor = NULL;
+ sa.bInheritHandle = TRUE;
+
+ ret = CreateDirectoryA(__stringVal(aPathName), &sa);
+ if (ret != TRUE) {
+ __threadErrno = __WIN32_ERR(GetLastError());
+ @global(LastErrorNumber) = __mkSmallInteger(__threadErrno);
+ RETURN (false);
+ }
+ RETURN (true);
+ }
+ if (__isUnicode16String(aPathName)) {
+ int ret;
+ SECURITY_ATTRIBUTES sa;
+ wchar_t _wPathName[MAXPATHLEN+1];
+ int i, l;
+
+ l = __unicode16StringSize(aPathName);
+ if (l > MAXPATHLEN) l = MAXPATHLEN;
+ for (i=0; i<l; i++) {
+ _wPathName[i] = __unicode16StringVal(aPathName)[i];
+ }
+ _wPathName[i] = 0;
+
+ sa.nLength = sizeof( sa );
+ sa.lpSecurityDescriptor = NULL;
+ sa.bInheritHandle = TRUE;
+
+ ret = CreateDirectoryW(_wPathName, &sa);
+ if (ret != TRUE) {
+ __threadErrno = __WIN32_ERR(GetLastError());
+ @global(LastErrorNumber) = __mkSmallInteger(__threadErrno);
+ RETURN (false);
+ }
+ RETURN (true);
+ }
+%}.
+ ^ self primitiveFailed
"
OperatingSystem createDirectory:'foo'
@@ -4030,23 +4055,32 @@
%{
HANDLE h;
char *name;
+ wchar_t _wPathName[MAXPATHLEN+1];
OBJ *ap = __ArrayInstPtr(attributeSpec)->a_element;
int numAttrib = __arraySize(attributeSpec);
- int i;
+ int i, l;
DWORD access, share, create, attr;
- if (! __isString(pathName)) {
- fileHandle = nil;
- argumentError = @symbol(badPathName);
- goto badArgument;
+ if (__isString(pathName)) {
+ name = __stringVal(pathName);
+ } else if (__isUnicode16String(pathName)) {
+ l = __unicode16StringSize(pathName);
+ if (l > MAXPATHLEN) l = MAXPATHLEN;
+ for (i=0; i<l; i++) {
+ _wPathName[i] = __unicode16StringVal(pathName)[i];
+ }
+ _wPathName[i] = 0;
+ } else {
+ fileHandle = nil;
+ argumentError = @symbol(badPathName);
+ goto badArgument;
}
if (! __isArrayLike(attributeSpec)) {
- fileHandle = nil;
- argumentError = @symbol(badAttributeSpec);
- goto badArgument;
- }
-
- name = __stringVal(pathName);
+ fileHandle = nil;
+ argumentError = @symbol(badAttributeSpec);
+ goto badArgument;
+ }
+
share = 0;
access = 0;
@@ -4054,72 +4088,77 @@
attr = 0;
for (i=0; i<numAttrib;i++) {
- OBJ attrSym = ap[i];
-
- if (attrSym == @symbol(FILE_SHARE_READ)) {
- share |= FILE_SHARE_READ;
- } else if (attrSym == @symbol(FILE_SHARE_WRITE)) {
- share |= FILE_SHARE_WRITE;
-
- } else if (attrSym == @symbol(GENERIC_READ)) {
- access |= GENERIC_READ;
- } else if (attrSym == @symbol(GENERIC_WRITE)) {
- access |= GENERIC_WRITE;
-
- } else if (attrSym == @symbol(CREATE_NEW)) {
- create |= CREATE_NEW;
- } else if (attrSym == @symbol(CREATE_ALWAYS)) {
- create |= CREATE_ALWAYS;
- } else if (attrSym == @symbol(OPEN_EXISTING)) {
- create |= OPEN_EXISTING;
- } else if (attrSym == @symbol(OPEN_ALWAYS)) {
- create |= OPEN_ALWAYS;
- } else if (attrSym == @symbol(TRUNCATE_EXISTING)) {
- create |= TRUNCATE_EXISTING;
-
- } else if (attrSym == @symbol(FILE_ATTRIBUTE_HIDDEN)) {
- attr |= FILE_ATTRIBUTE_HIDDEN;
- } else if (attrSym == @symbol(FILE_ATTRIBUTE_READONLY)) {
- attr |= FILE_ATTRIBUTE_READONLY;
- } else if (attrSym == @symbol(FILE_ATTRIBUTE_READONLY)) {
- attr |= FILE_ATTRIBUTE_READONLY;
- } else if (attrSym == @symbol(FILE_FLAG_WRITE_THROUGH)) {
- attr |= FILE_FLAG_WRITE_THROUGH;
- } else if (attrSym == @symbol(FILE_FLAG_SEQUENTIAL_SCAN)) {
- attr |= FILE_FLAG_SEQUENTIAL_SCAN;
- } else if (attrSym == @symbol(FILE_FLAG_DELETE_ON_CLOSE)) {
- attr |= FILE_FLAG_DELETE_ON_CLOSE;
- } else {
- console_fprintf(stderr, "Win32OS [warning]: unsupported open mode\n");
- }
+ OBJ attrSym = ap[i];
+
+ if (attrSym == @symbol(FILE_SHARE_READ)) {
+ share |= FILE_SHARE_READ;
+ } else if (attrSym == @symbol(FILE_SHARE_WRITE)) {
+ share |= FILE_SHARE_WRITE;
+
+ } else if (attrSym == @symbol(GENERIC_READ)) {
+ access |= GENERIC_READ;
+ } else if (attrSym == @symbol(GENERIC_WRITE)) {
+ access |= GENERIC_WRITE;
+
+ } else if (attrSym == @symbol(CREATE_NEW)) {
+ create |= CREATE_NEW;
+ } else if (attrSym == @symbol(CREATE_ALWAYS)) {
+ create |= CREATE_ALWAYS;
+ } else if (attrSym == @symbol(OPEN_EXISTING)) {
+ create |= OPEN_EXISTING;
+ } else if (attrSym == @symbol(OPEN_ALWAYS)) {
+ create |= OPEN_ALWAYS;
+ } else if (attrSym == @symbol(TRUNCATE_EXISTING)) {
+ create |= TRUNCATE_EXISTING;
+
+ } else if (attrSym == @symbol(FILE_ATTRIBUTE_HIDDEN)) {
+ attr |= FILE_ATTRIBUTE_HIDDEN;
+ } else if (attrSym == @symbol(FILE_ATTRIBUTE_READONLY)) {
+ attr |= FILE_ATTRIBUTE_READONLY;
+ } else if (attrSym == @symbol(FILE_ATTRIBUTE_READONLY)) {
+ attr |= FILE_ATTRIBUTE_READONLY;
+ } else if (attrSym == @symbol(FILE_FLAG_WRITE_THROUGH)) {
+ attr |= FILE_FLAG_WRITE_THROUGH;
+ } else if (attrSym == @symbol(FILE_FLAG_SEQUENTIAL_SCAN)) {
+ attr |= FILE_FLAG_SEQUENTIAL_SCAN;
+ } else if (attrSym == @symbol(FILE_FLAG_DELETE_ON_CLOSE)) {
+ attr |= FILE_FLAG_DELETE_ON_CLOSE;
+ } else {
+ console_fprintf(stderr, "Win32OS [warning]: unsupported open mode\n");
+ }
}
if (create == 0) {
- fileHandle = nil;
- argumentError = @symbol(missingCreateMode);
- goto badArgument;
+ fileHandle = nil;
+ argumentError = @symbol(missingCreateMode);
+ goto badArgument;
}
#ifdef PROCESSDEBUGWIN32
console_fprintf(stderr, "name:<%s> access:%x share:%x create:%x attr:%x\n",
- name, access, share, create, attr);
-#endif
- h = CreateFile(name, access, share, 0 /* sa */, create, attr, 0 /* hTempl */);
+ name, access, share, create, attr);
+#endif
+ if (__isString(pathName)) {
+ h = CreateFileA(name, access, share, 0 /* sa */, create, attr, 0 /* hTempl */);
+ } else {
+ h = CreateFileW(_wPathName, access, share, 0 /* sa */, create, attr, 0 /* hTempl */);
+ }
+
if (h != INVALID_HANDLE_VALUE) {
- __externalAddressVal(fileHandle) = (void *)h;
+ __externalAddressVal(fileHandle) = (void *)h;
} else {
- fileHandle = nil;
- errorNumber = __mkSmallInteger( __WIN32_ERR(GetLastError()) );
+ fileHandle = nil;
+ errorNumber = __mkSmallInteger( __WIN32_ERR(GetLastError()) );
}
badArgument: ;
%}.
fileHandle notNil ifTrue:[
- fileHandle registerForFinalization.
- ^ fileHandle.
+ fileHandle registerForFinalization.
+ ^ fileHandle.
].
errorNumber isNil ifTrue:[
- self error:'invalid argument(s): ', argumentError.
+ self error:'invalid argument(s): ', argumentError.
] ifFalse:[
- (self errorHolderForNumber:errorNumber) reportError
+ (self errorHolderForNumber:errorNumber) reportError
].
!
@@ -4167,24 +4206,51 @@
if (__isString(fullPathName)) {
#ifdef DO_WRAP_CALLS
- {
- char _aPathName[MAXPATHLEN];
-
- strncpy(_aPathName, __stringVal(fullPathName), MAXPATHLEN-1); _aPathName[MAXPATHLEN-1] = '\0';
- do {
- __threadErrno = 0;
- ret = STX_API_CALL1( "RemoveDirectory", RemoveDirectory, _aPathName);
- } while ((ret < 0) && (__threadErrno == EINTR));
- }
-#else
- ret = RemoveDirectory((char *)__stringVal(fullPathName));
- __threadErrno = __WIN32_ERR(GetLastError());
-#endif
- if (ret != TRUE) {
- @global(LastErrorNumber) = __mkSmallInteger(__threadErrno);
- RETURN (false);
- }
- RETURN (true);
+ {
+ char _aPathName[MAXPATHLEN];
+
+ strncpy(_aPathName, __stringVal(fullPathName), MAXPATHLEN-1); _aPathName[MAXPATHLEN-1] = '\0';
+ do {
+ __threadErrno = 0;
+ ret = STX_API_CALL1( "RemoveDirectoryA", RemoveDirectoryA, _aPathName);
+ } while ((ret < 0) && (__threadErrno == EINTR));
+ }
+#else
+ ret = RemoveDirectoryA((char *)__stringVal(fullPathName));
+ __threadErrno = __WIN32_ERR(GetLastError());
+#endif
+ if (ret != TRUE) {
+ @global(LastErrorNumber) = __mkSmallInteger(__threadErrno);
+ RETURN (false);
+ }
+ RETURN (true);
+ }
+ if (__isUnicode16String(fullPathName)) {
+#ifdef DO_WRAP_CALLS
+ {
+ wchar_t _wPathName[MAXPATHLEN+1];
+ int i, l;
+
+ l = __unicode16StringSize(fullPathName);
+ if (l > MAXPATHLEN) l = MAXPATHLEN;
+ for (i=0; i<l; i++) {
+ _wPathName[i] = __unicode16StringVal(fullPathName)[i];
+ }
+ _wPathName[i] = 0;
+ do {
+ __threadErrno = 0;
+ ret = STX_API_CALL1( "RemoveDirectoryW", RemoveDirectoryW, _wPathName);
+ } while ((ret < 0) && (__threadErrno == EINTR));
+ }
+#else
+ ret = RemoveDirectoryW((char *)__stringVal(fullPathName));
+ __threadErrno = __WIN32_ERR(GetLastError());
+#endif
+ if (ret != TRUE) {
+ @global(LastErrorNumber) = __mkSmallInteger(__threadErrno);
+ RETURN (false);
+ }
+ RETURN (true);
}
%}.
"/
@@ -4208,25 +4274,53 @@
if (__isString(fullPathName)) {
#ifdef DO_WRAP_CALLS
- {
- char _aPathName[MAXPATHLEN];
-
- strncpy(_aPathName, __stringVal(fullPathName), MAXPATHLEN-1); _aPathName[MAXPATHLEN-1] = '\0';
- do {
- __threadErrno = 0;
- ret = STX_API_CALL1( "DeleteFile", DeleteFile, _aPathName);
- } while ((ret < 0) && (__threadErrno == EINTR));
- }
-#else
- ret = DeleteFile((char *)__stringVal(fullPathName));
- __threadErrno = __WIN32_ERR(GetLastError());
-#endif
- if (ret != TRUE) {
- @global(LastErrorNumber) = __mkSmallInteger(__threadErrno);
- RETURN (false);
- }
- RETURN (true);
- }
+ {
+ char _aPathName[MAXPATHLEN];
+
+ strncpy(_aPathName, __stringVal(fullPathName), MAXPATHLEN-1); _aPathName[MAXPATHLEN-1] = '\0';
+ do {
+ __threadErrno = 0;
+ ret = STX_API_CALL1( "DeleteFileA", DeleteFileA, _aPathName);
+ } while ((ret < 0) && (__threadErrno == EINTR));
+ }
+#else
+ ret = DeleteFileA((char *)__stringVal(fullPathName));
+ __threadErrno = __WIN32_ERR(GetLastError());
+#endif
+ if (ret != TRUE) {
+ @global(LastErrorNumber) = __mkSmallInteger(__threadErrno);
+ RETURN (false);
+ }
+ RETURN (true);
+ }
+ if (__isUnicode16String(fullPathName)) {
+#ifdef DO_WRAP_CALLS
+ {
+ wchar_t _wPathName[MAXPATHLEN+1];
+ int i, l;
+
+ l = __unicode16StringSize(fullPathName);
+ if (l > MAXPATHLEN) l = MAXPATHLEN;
+ for (i=0; i<l; i++) {
+ _wPathName[i] = __unicode16StringVal(fullPathName)[i];
+ }
+ _wPathName[i] = 0;
+ do {
+ __threadErrno = 0;
+ ret = STX_API_CALL1( "DeleteFileW", DeleteFileW, _wPathName);
+ } while ((ret < 0) && (__threadErrno == EINTR));
+ }
+#else
+ ret = DeleteFileW((char *)__stringVal(fullPathName));
+ __threadErrno = __WIN32_ERR(GetLastError());
+#endif
+ if (ret != TRUE) {
+ @global(LastErrorNumber) = __mkSmallInteger(__threadErrno);
+ RETURN (false);
+ }
+ RETURN (true);
+ }
+
%}.
^ self primitiveFailed
!
@@ -15971,7 +16065,7 @@
!Win32OperatingSystem class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/Win32OperatingSystem.st,v 1.362 2009-03-02 17:38:18 mb Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/Win32OperatingSystem.st,v 1.363 2009-03-05 23:42:31 cg Exp $'
! !
Win32OperatingSystem initialize!