1 // natFileDescriptorWin32.cc - Native part of FileDescriptor class.
3 /* Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc.
5 This file is part of libgcj.
7 This software is copyrighted work licensed under the terms of the
8 Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
11 // FIXME: In order to support interrupting of IO operations, we
12 // need to change to use the windows asynchronous IO functions
23 #include <java/io/FileDescriptor.h>
24 #include <java/io/SyncFailedException.h>
25 #include <java/io/IOException.h>
26 #include <java/io/InterruptedIOException.h>
27 #include <java/io/EOFException.h>
28 #include <java/lang/ArrayIndexOutOfBoundsException.h>
29 #include <java/lang/NullPointerException.h>
30 #include <java/lang/String.h>
31 #include <java/lang/Thread.h>
32 #include <java/io/FileNotFoundException.h>
37 static LPVOID last = NULL;
43 FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |
44 FORMAT_MESSAGE_FROM_SYSTEM |
45 FORMAT_MESSAGE_IGNORE_INSERTS,
48 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
60 java::io::FileDescriptor::valid (void) {
61 BY_HANDLE_FILE_INFORMATION info;
62 return GetFileInformationByHandle ((HANDLE)fd, &info) != 0;
66 java::io::FileDescriptor::sync (void) {
67 if (! FlushFileBuffers ((HANDLE)fd))
68 throw new SyncFailedException (JvNewStringLatin1 (winerr ()));
72 java::io::FileDescriptor::open (jstring path, jint jflags) {
76 DWORD share = FILE_SHARE_READ;
77 DWORD create = OPEN_EXISTING;
78 char buf[MAX_PATH] = "";
80 jsize total = JvGetStringUTFRegion(path, 0, path->length(), buf);
83 JvAssert((jflags & READ) || (jflags & WRITE));
85 if ((jflags & READ) && (jflags & WRITE))
87 access = GENERIC_READ | GENERIC_WRITE;
92 create = CREATE_ALWAYS;
94 else if(jflags & READ)
95 access = GENERIC_READ;
98 access = GENERIC_WRITE;
101 create = OPEN_ALWAYS;
103 create = CREATE_ALWAYS;
106 handle = CreateFile(buf, access, share, NULL, create, 0, NULL);
108 if (handle == INVALID_HANDLE_VALUE)
110 char msg[MAX_PATH + 1000];
111 sprintf (msg, "%s: %s", buf, winerr ());
112 throw new FileNotFoundException (JvNewStringLatin1 (msg));
119 java::io::FileDescriptor::write (jint b)
122 jbyte buf = (jbyte)b;
124 if (WriteFile ((HANDLE)fd, &buf, 1, &bytesWritten, NULL))
126 if (java::lang::Thread::interrupted())
128 InterruptedIOException *iioe = new InterruptedIOException (JvNewStringLatin1 ("write interrupted"));
129 iioe->bytesTransferred = bytesWritten;
132 if (bytesWritten != 1)
133 throw new IOException (JvNewStringLatin1 (winerr ()));
136 throw new IOException (JvNewStringLatin1 (winerr ()));
137 // FIXME: loop until bytesWritten == 1
141 java::io::FileDescriptor::write(jbyteArray b, jint offset, jint len)
144 throw new java::lang::NullPointerException;
145 if(offset < 0 || len < 0 || offset + len > JvGetArrayLength (b))
146 throw new java::lang::ArrayIndexOutOfBoundsException;
148 jbyte *buf = elements (b) + offset;
150 if (WriteFile ((HANDLE)fd, buf, len, &bytesWritten, NULL))
152 if (java::lang::Thread::interrupted())
154 InterruptedIOException *iioe = new InterruptedIOException (JvNewStringLatin1 ("write interrupted"));
155 iioe->bytesTransferred = bytesWritten;
160 throw new IOException (JvNewStringLatin1 (winerr ()));
161 // FIXME: loop until bytesWritten == len
165 java::io::FileDescriptor::close (void)
167 HANDLE save = (HANDLE)fd;
168 fd = (jint)INVALID_HANDLE_VALUE;
169 if (! CloseHandle (save))
170 throw new IOException (JvNewStringLatin1 (winerr ()));
174 java::io::FileDescriptor::seek (jlong pos, jint whence, jboolean eof_trunc)
176 JvAssert (whence == SET || whence == CUR);
178 jlong len = length();
179 jlong here = getFilePointer();
182 && ((whence == SET && pos > len) || (whence == CUR && here + pos > len)))
188 LONG high = pos >> 32;
189 DWORD low = SetFilePointer ((HANDLE)fd, (DWORD)(0xffffffff & pos), &high, whence == SET ? FILE_BEGIN : FILE_CURRENT);
190 if ((low == 0xffffffff) && (GetLastError () != NO_ERROR))
191 throw new IOException (JvNewStringLatin1 (winerr ()));
196 java::io::FileDescriptor::getFilePointer(void)
199 DWORD low = SetFilePointer ((HANDLE)fd, 0, &high, FILE_CURRENT);
200 if ((low == 0xffffffff) && (GetLastError() != NO_ERROR))
201 throw new IOException (JvNewStringLatin1 (winerr ()));
202 return (((jlong)high) << 32L) | (jlong)low;
206 java::io::FileDescriptor::length(void)
211 low = GetFileSize ((HANDLE)fd, &high);
212 // FIXME: Error checking
213 return (((jlong)high) << 32L) | (jlong)low;
217 java::io::FileDescriptor::read(void)
222 if (! ReadFile ((HANDLE)fd, &buf, 1, &read, NULL))
223 throw new IOException (JvNewStringLatin1 (winerr ()));
227 return (jint)(buf & 0xff);
231 java::io::FileDescriptor::read(jbyteArray buffer, jint offset, jint count)
234 throw new java::lang::NullPointerException;
236 jsize bsize = JvGetArrayLength (buffer);
237 if (offset < 0 || count < 0 || offset + count > bsize)
238 throw new java::lang::ArrayIndexOutOfBoundsException;
240 jbyte *bytes = elements (buffer) + offset;
243 if (! ReadFile((HANDLE)fd, bytes, count, &read, NULL))
244 throw new IOException (JvNewStringLatin1 (winerr ()));
250 java::io::FileDescriptor::available(void)
253 return length() - getFilePointer();