unicode support for removeFile, removeDirectory, createFile and createDirectory
authorClaus Gittinger <cg@exept.de>
Fri, 06 Mar 2009 00:42:31 +0100
changeset 11617 0b0ea0b5235e
parent 11616 0ca41183ee3e
child 11618 4164f09b7248
unicode support for removeFile, removeDirectory, createFile and createDirectory
Win32OperatingSystem.st
--- 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!