diff options
| author | membar <membar@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-08-29 04:21:01 +0000 |
|---|---|---|
| committer | membar <membar@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-08-29 04:21:01 +0000 |
| commit | d291d8b244efc66333a228e5013a5afd80c87f6d (patch) | |
| tree | 236d99541a3b4c358a6a326abd76276ce8557c33 /libjava/java/io/natFileDescriptorWin32.cc | |
| parent | 46b3a6c280f750712a0f95311fc3678f390ba5d9 (diff) | |
| download | gcc-d291d8b244efc66333a228e5013a5afd80c87f6d.tar.gz | |
* win32.cc: fixed tab, indentation and whitespace
inconsistencies
removed jvm.h include
added includes java/lang/UnsupportedOperationException.h,
java/io/IOException.h, java/net/SocketException.h
(WSAEventWrapper): class implementation
(_Jv_WinStrError): implemented both overloads
(_Jv_ThrowIOException): implemented both overloads
(_Jv_ThrowSocketException): implemented both overloads
(_Jv_select): implemented
* include/win32.h: fixed tab, indentation and whitespace
inconsistencies
wrapped <windows.h> include with #define WIN32_LEAN_AND_MEAN
added jvm.h include
(WSAEventWrapper): added class declaration
(_Jv_WinStrError): added both overload declarations
(_Jv_ThrowIOException): added both overload declarations
(_Jv_ThrowSocketException): added both overload declarations
removed ENOTCONN, ECONNRESET and ENOPROTOOPT defines
(_Jv_select): added declaration
(_Jv_socket): removed
(_Jv_connect): removed
(_Jv_close): removed
(_Jv_bind): removed
(_Jv_accept): removed
(_Jv_listen): removed
(_Jv_write): removed
(_Jv_read): removed
* java/io/natFileDescriptorWin32.cc: fixed tab, indentation and
whitespace inconsistencies
replaced <windows.h> #include with <platform.h>
removed jvm.h include
(testCanUseGetHandleInfo): new function which tests whether Win32
GetHandleInformation() call can be used with console buffer handles
(only supported on >=WinNT 5.0)
(winerr): removed (superseded by _Jv_WinStrError in include/win32.h)
(valid): rewrote implementation using GetHandleInformation()
(sync): changed exception throwing to use error string and exception
helper methods declared in include/win32.h
(open): likewise
(write): likewise
(setLength): likewise
(close): likewise
(seek): likewise
(getFilePointer): likewise
(read): likewise
* java/io/natFileWin32.cc: fixed tab, indentation and
whitespace inconsistencies
replaced <windows.h> #include with <platform.h>
removed jvm.h include
(_access): use JV_TEMP_UTF_STRING
(_stat): likewise
(performMkDir): use JV_TEMP_UTF_STRING
(performRenameTo): likewise
(performDelete): likewise
(performCreate): likewise
(performSetReadOnly): likewise
(performSetLastModified): likewise
* java/lang/natWin32Process.cc: fixed tab, indentation and
whitespace inconsistencies
replaced <windows.h> #include with <platform.h>
removed includes gcj/cni.h, jvm.h
(new_string): removed
(startProcess): use JV_TEMP_UTF_STRING,
changed exception throwing to use error string and exception
helper methods declared in include/win32.h
* java/net/natInetAddressWin32.cc: fixed tab, indentation and
whitespace inconsistencies
replaced <windows.h> #include with <platform.h>
removed jvm.h include
removed DISABLE_JAVA_NET conditional code
removed POSIX conditional code not relevant to Win32
(aton): use JV_TEMP_UTF_STRING
removed POSIX conditional code not relevant to Win32
(lookup): likewise
(getLocalHostName): likewise
* java/net/natNetworkInterfaceWin32.cc: fixed tab, indentation and
whitespace inconsistencies
removed unnecessary windows.h, winsock.h and gcj/cni.h includes
removed DISABLE_JAVA_NET conditional code
removed POSIX conditional code not relevant to Win32
(winsock2GetRealNetworkInterfaces): new function to compute network
interfaces via Winsock2 API
(determineGetRealNetworkInterfacesFN): new function for returning
a function pointer to the function used to compute network interfaces.
(getRealNetworkInterfaces): implemented
* java/net/natPlainDatagramSocketImplWin32.cc: fixed tab, indentation and
whitespace inconsistencies
removed gcj/cni.h include
removed DISABLE_JAVA_NET conditional code
removed POSIX conditional code not relevant to Win32
changed net POSIXisms to Win32isms
replaced _Jv socket-related calls with their real Win32 equivalents
changed exception throwing to use error string and exception
helper methods declared in include/win32.h
(peekData): implemented timeout support
(receive): likewise
* java/net/natPlainSocketImplWin32.cc: fixed tab, indentation and
whitespace inconsistencies
removed gcj/cni.h and gcj/javaprims.h includes
removed DISABLE_JAVA_NET conditional code
removed POSIX conditional code not relevant to Win32
changed net POSIXisms to Win32isms
replaced _Jv socket-related calls with their real Win32
equivalents
changed exception throwing to use error string and exception
helper methods declared in include/win32.h
(throwConnectException): helper function for connect()
(connect): implemented timeout support
(accept): likewise
(doRead): new helper function common to both read() method overloads,
includes timeout support
(read): implemented both overloads in terms of doRead()
(available): implemented using ioctlsocket()
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@70904 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/java/io/natFileDescriptorWin32.cc')
| -rw-r--r-- | libjava/java/io/natFileDescriptorWin32.cc | 141 |
1 files changed, 70 insertions, 71 deletions
diff --git a/libjava/java/io/natFileDescriptorWin32.cc b/libjava/java/io/natFileDescriptorWin32.cc index 50669875ea1..1891bf78e42 100644 --- a/libjava/java/io/natFileDescriptorWin32.cc +++ b/libjava/java/io/natFileDescriptorWin32.cc @@ -13,15 +13,13 @@ details. */ // need to change to use the windows asynchronous IO functions #include <config.h> +#include <platform.h> #include <stdio.h> #include <string.h> -#include <windows.h> #undef STRICT -#include <gcj/cni.h> -#include <jvm.h> #include <java/io/FileDescriptor.h> #include <java/io/SyncFailedException.h> #include <java/io/IOException.h> @@ -33,6 +31,16 @@ details. */ #include <java/lang/Thread.h> #include <java/io/FileNotFoundException.h> +static bool testCanUseGetHandleInfo() +{ + /* Test to see whether GetHandleInformation can be used + for console input or screen buffers. This is better + a kludgy OS version check. */ + DWORD dwFlags; + return GetHandleInformation (GetStdHandle (STD_INPUT_HANDLE), + &dwFlags) != 0; +} + // FIXME: casting a FILE (pointer) to a jint will not work on Win64 -- // we should be using gnu.gcj.RawData's. @@ -44,41 +52,32 @@ java::io::FileDescriptor::init(void) err = new java::io::FileDescriptor((jint)(GetStdHandle (STD_ERROR_HANDLE))); } -static char * -winerr (void) -{ - static LPVOID last = NULL; - LPVOID old = NULL; - - if (last) - old = last; - - FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - GetLastError(), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) &last, - 0, - NULL); - - if (old) - LocalFree (old); - - return (char *)last; -} - jboolean java::io::FileDescriptor::valid (void) { - BY_HANDLE_FILE_INFORMATION info; - return GetFileInformationByHandle ((HANDLE)fd, &info) != 0; + static bool bCanUseGetHandleInfo = testCanUseGetHandleInfo(); + if (bCanUseGetHandleInfo) + { + /* As with UNIX, a "file" descriptor can be one of + a gazillion possible underlying things like a pipe + or socket, so we can't get too fancy here. */ + DWORD dwFlags; + HANDLE h = (HANDLE) fd; + return GetHandleInformation (h, &dwFlags) != 0; + } + else + { + /* Can't use GetHandleInformation() for console handles on < WinNT 5. */ + return true; + } } void java::io::FileDescriptor::sync (void) { if (! FlushFileBuffers ((HANDLE)fd)) - throw new SyncFailedException (JvNewStringLatin1 (winerr ())); + { + DWORD dwErrorCode = GetLastError (); + throw new SyncFailedException (_Jv_WinStrError (dwErrorCode)); + } } jint @@ -87,10 +86,8 @@ java::io::FileDescriptor::open (jstring path, jint jflags) { HANDLE handle = NULL; DWORD access = 0; DWORD create = OPEN_EXISTING; - char buf[MAX_PATH] = ""; - - jsize total = JvGetStringUTFRegion(path, 0, path->length(), buf); - buf[total] = '\0'; + + JV_TEMP_UTF_STRING(cpath, path) JvAssert((jflags & READ) || (jflags & WRITE)); @@ -98,9 +95,9 @@ java::io::FileDescriptor::open (jstring path, jint jflags) { { access = GENERIC_READ | GENERIC_WRITE; if (jflags & EXCL) - create = CREATE_NEW; // this will raise error if file exists. + create = CREATE_NEW; // this will raise error if file exists. else - create = OPEN_ALWAYS; // equivalent to O_CREAT + create = OPEN_ALWAYS; // equivalent to O_CREAT } else if (jflags & READ) { @@ -111,20 +108,19 @@ java::io::FileDescriptor::open (jstring path, jint jflags) { { access = GENERIC_WRITE; if (jflags & EXCL) - create = CREATE_NEW; + create = CREATE_NEW; else if (jflags & APPEND) - create = OPEN_ALWAYS; + create = OPEN_ALWAYS; else - create = CREATE_ALWAYS; + create = CREATE_ALWAYS; } - handle = CreateFile(buf, access, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, create, 0, NULL); + handle = CreateFile(cpath, access, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, create, 0, NULL); if (handle == INVALID_HANDLE_VALUE) { - char msg[MAX_PATH + 1000]; - sprintf (msg, "%s: %s", buf, winerr ()); - throw new FileNotFoundException (JvNewStringLatin1 (msg)); + DWORD dwErrorCode = GetLastError (); + throw new FileNotFoundException (_Jv_WinStrError (cpath, dwErrorCode)); } // For APPEND mode, move the file pointer to the end of the file. @@ -132,7 +128,10 @@ java::io::FileDescriptor::open (jstring path, jint jflags) { { DWORD low = SetFilePointer (handle, 0, NULL, FILE_END); if ((low == 0xffffffff) && (GetLastError () != NO_ERROR)) - throw new FileNotFoundException (JvNewStringLatin1 (winerr ())); + { + DWORD dwErrorCode = GetLastError (); + throw new FileNotFoundException (_Jv_WinStrError (cpath, dwErrorCode)); + } } return (jint)handle; } @@ -149,13 +148,13 @@ java::io::FileDescriptor::write (jint b) { InterruptedIOException *iioe = new InterruptedIOException (JvNewStringLatin1 ("write interrupted")); iioe->bytesTransferred = bytesWritten; - throw iioe; + throw iioe; } if (bytesWritten != 1) - throw new IOException (JvNewStringLatin1 (winerr ())); + _Jv_ThrowIOException (); } else - throw new IOException (JvNewStringLatin1 (winerr ())); + _Jv_ThrowIOException (); // FIXME: loop until bytesWritten == 1 } @@ -175,11 +174,11 @@ java::io::FileDescriptor::write(jbyteArray b, jint offset, jint len) { InterruptedIOException *iioe = new InterruptedIOException (JvNewStringLatin1 ("write interrupted")); iioe->bytesTransferred = bytesWritten; - throw iioe; + throw iioe; } } else - throw new IOException (JvNewStringLatin1 (winerr ())); + _Jv_ThrowIOException (); // FIXME: loop until bytesWritten == len } @@ -189,7 +188,7 @@ java::io::FileDescriptor::close (void) HANDLE save = (HANDLE)fd; fd = (jint)INVALID_HANDLE_VALUE; if (! CloseHandle (save)) - throw new IOException (JvNewStringLatin1 (winerr ())); + _Jv_ThrowIOException (); } void @@ -201,46 +200,46 @@ java::io::FileDescriptor::setLength(jlong pos) // Get the original file pointer. if (SetFilePointer((HANDLE) fd, (LONG) 0, &liOrigFilePointer, - FILE_CURRENT) != (BOOL) 0 + FILE_CURRENT) != (BOOL) 0 && (GetLastError() != NO_ERROR)) - throw new IOException (JvNewStringLatin1 (winerr ())); + _Jv_ThrowIOException (); // Get the length of the file. if (SetFilePointer((HANDLE) fd, (LONG) 0, &liEndFilePointer, - FILE_END) != (BOOL) 0 + FILE_END) != (BOOL) 0 && (GetLastError() != NO_ERROR)) - throw new IOException (JvNewStringLatin1 (winerr ())); + _Jv_ThrowIOException (); if ((jlong)liEndFilePointer == pos) { // Restore the file pointer. if (liOrigFilePointer != liEndFilePointer) - { - if (SetFilePointer((HANDLE) fd, liOrigFilePointer, &liNewFilePointer, - FILE_BEGIN) != (BOOL) 0 - && (GetLastError() != NO_ERROR)) - throw new IOException (JvNewStringLatin1 (winerr ())); - } + { + if (SetFilePointer((HANDLE) fd, liOrigFilePointer, &liNewFilePointer, + FILE_BEGIN) != (BOOL) 0 + && (GetLastError() != NO_ERROR)) + _Jv_ThrowIOException (); + } return; } // Seek to the new end of file. if (SetFilePointer((HANDLE) fd, (LONG) pos, &liNewFilePointer, - FILE_BEGIN) != (BOOL) 0 + FILE_BEGIN) != (BOOL) 0 && (GetLastError() != NO_ERROR)) - throw new IOException (JvNewStringLatin1 (winerr ())); + _Jv_ThrowIOException (); // Truncate the file at this point. if (SetEndOfFile((HANDLE) fd) != (BOOL) 0 && (GetLastError() != NO_ERROR)) - throw new IOException (JvNewStringLatin1 (winerr ())); + _Jv_ThrowIOException (); if (liOrigFilePointer < liNewFilePointer) { // Restore the file pointer. if (SetFilePointer((HANDLE) fd, liOrigFilePointer, &liNewFilePointer, - FILE_BEGIN) != (BOOL) 0 - && (GetLastError() != NO_ERROR)) - throw new IOException (JvNewStringLatin1 (winerr ())); + FILE_BEGIN) != (BOOL) 0 + && (GetLastError() != NO_ERROR)) + _Jv_ThrowIOException (); } } @@ -262,7 +261,7 @@ java::io::FileDescriptor::seek (jlong pos, jint whence, jboolean eof_trunc) LONG high = pos >> 32; DWORD low = SetFilePointer ((HANDLE)fd, (DWORD)(0xffffffff & pos), &high, whence == SET ? FILE_BEGIN : FILE_CURRENT); if ((low == 0xffffffff) && (GetLastError () != NO_ERROR)) - throw new IOException (JvNewStringLatin1 (winerr ())); + _Jv_ThrowIOException (); return low; } @@ -272,7 +271,7 @@ java::io::FileDescriptor::getFilePointer(void) LONG high = 0; DWORD low = SetFilePointer ((HANDLE)fd, 0, &high, FILE_CURRENT); if ((low == 0xffffffff) && (GetLastError() != NO_ERROR)) - throw new IOException (JvNewStringLatin1 (winerr ())); + _Jv_ThrowIOException (); return (((jlong)high) << 32L) | (jlong)low; } @@ -298,7 +297,7 @@ java::io::FileDescriptor::read(void) if (GetLastError () == ERROR_BROKEN_PIPE) return -1; else - throw new IOException (JvNewStringLatin1 (winerr ())); + _Jv_ThrowIOException (); } if (! read) @@ -329,7 +328,7 @@ java::io::FileDescriptor::read(jbyteArray buffer, jint offset, jint count) if (GetLastError () == ERROR_BROKEN_PIPE) return -1; else - throw new IOException (JvNewStringLatin1 (winerr ())); + _Jv_ThrowIOException (); } if (read == 0) return -1; |
