diff -r 530bb21f57f9 -r fae9f7c22dbd FileStream.st --- a/FileStream.st Tue Jul 28 12:32:54 2009 +0200 +++ b/FileStream.st Tue Jul 28 13:32:44 2009 +0200 @@ -1011,11 +1011,11 @@ %{ HFILE f; - HFILE fopen(); + int pass = 0; retry: - if (__isNonNilObject(pathName) && __isString(openmode)) + if (__isNonNilObject(pathName) && (__isStringLike(openmode) || __isArray(openmode))) #ifdef __VMS__ if (__qClass(pathName)==String) { do { @@ -1140,49 +1140,131 @@ #else /* not VMS */ # ifdef WIN32 - - if (__qClass(pathName)==String) { - { - char _aPathName[MAXPATHLEN]; - char _openMode[64]; + { + DWORD share = 0, access = 0, create = 0, attr = 0; + int numAttrib, i; + OBJ *ap; + char * __openmode; + HANDLE handle; - strncpy(_aPathName, __stringVal(pathName), MAXPATHLEN-1); _aPathName[MAXPATHLEN-1] = '\0'; - strncpy(_openMode, __stringVal(openmode), sizeof(_openMode)-1); _openMode[sizeof(_openMode)-1] = '\0'; - do { - __threadErrno = 0; - f = STX_C_CALL2( "fopen", fopen, _aPathName, _openMode); - if (__threadErrno == EINTR) { - f = NULL; - } - } while ((f == NULL) && (__threadErrno == EINTR)); - } - } else if (__qClass(pathName)==Unicode16String) { - { - wchar_t _aPathName[MAXPATHLEN+1]; - wchar_t _openMode[64]; - int i, l; + if (__isStringLike(openmode)) { + share = FILE_SHARE_READ|FILE_SHARE_WRITE; + __openmode = __stringVal(openmode); + if (strcmp(__openmode, "rb") == 0) { + access = GENERIC_READ; + create = OPEN_EXISTING; + } else if (strcmp(__openmode, "rb+") == 0) { + access = GENERIC_READ | GENERIC_WRITE; + create = OPEN_ALWAYS; + } else if (strcmp(__openmode, "wb") == 0) { + access = GENERIC_WRITE; + create = CREATE_ALWAYS; + } else if (strcmp(__openmode, "wb+") == 0) { + access = GENERIC_READ | GENERIC_WRITE; + create = CREATE_ALWAYS; + } else if (strcmp(__openmode, "ab") == 0) { + access = FILE_APPEND_DATA|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA| + STANDARD_RIGHTS_WRITE|SYNCHRONIZE; + create = OPEN_ALWAYS; + } else if (strcmp(__openmode, "ab+") == 0) { + access = GENERIC_READ |FILE_APPEND_DATA|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA| + STANDARD_RIGHTS_WRITE|SYNCHRONIZE; + create = OPEN_ALWAYS; + } else { + console_fprintf(stderr, "Win32OS [warning]: unsupported open mode\n"); + } + } else if (__isArrayLike(openmode)) { + ap = __ArrayInstPtr(attributeSpec)->a_element; + numAttrib = __arraySize(attributeSpec); + __openmode = "rb+"; + + for (i=0; i MAXPATHLEN) l = MAXPATHLEN; - for (i=0; i 64) l = 64; - for (i=0; i MAXPATHLEN) l = MAXPATHLEN; + for (i=0; i %x\n", __stringVal(pathName), f); @@ -1558,7 +1641,7 @@ !FileStream class methodsFor:'documentation'! version - ^ '$Header: /cvs/stx/stx/libbasic/FileStream.st,v 1.131 2009-01-14 20:01:21 stefan Exp $' + ^ '$Header: /cvs/stx/stx/libbasic/FileStream.st,v 1.132 2009-07-28 11:32:44 stefan Exp $' ! ! FileStream initialize!