1 /* 2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 #include "jni.h" 27 #include "jni_util.h" 28 29 extern jfieldID IO_fd_fdID; 30 extern jfieldID IO_handle_fdID; 31 32 #ifdef _ALLBSD_SOURCE 33 #include <fcntl.h> 34 #ifndef O_SYNC 35 #define O_SYNC O_FSYNC 36 #endif 37 #ifndef O_DSYNC 38 #define O_DSYNC O_FSYNC 39 #endif 40 #elif !defined(O_DSYNC) || !defined(O_SYNC) 41 #define O_SYNC (0x0800) 42 #define O_DSYNC (0x2000) 43 #endif 44 45 /* 46 * IO helper functions 47 */ 48 49 jint readSingle(JNIEnv *env, jobject this, jfieldID fid); 50 jint readBytes(JNIEnv *env, jobject this, jbyteArray bytes, jint off, 51 jint len, jfieldID fid); 52 void writeSingle(JNIEnv *env, jobject this, jint byte, jboolean append, jfieldID fid); 53 void writeBytes(JNIEnv *env, jobject this, jbyteArray bytes, jint off, 54 jint len, jboolean append, jfieldID fid); 55 // Android-removed: Open files using IoBridge to share BlockGuard & StrictMode logic. http://b/112107427 56 // void fileOpen(JNIEnv *env, jobject this, jstring path, jfieldID fid, int flags); 57 void throwFileNotFoundException(JNIEnv *env, jstring path); 58 59 60 /* 61 * Macros for managing platform strings. The typical usage pattern is: 62 * 63 * WITH_PLATFORM_STRING(env, string, var) { 64 * doSomethingWith(var); 65 * } END_PLATFORM_STRING(env, var); 66 * 67 * where env is the prevailing JNIEnv, 68 * string is a JNI reference to a java.lang.String object, and 69 * var is the char * variable that will point to the string, 70 * after being converted into the platform encoding. 71 * 72 * The related macro WITH_FIELD_PLATFORM_STRING first extracts the string from 73 * a given field of a given object: 74 * 75 * WITH_FIELD_PLATFORM_STRING(env, object, id, var) { 76 * doSomethingWith(var); 77 * } END_PLATFORM_STRING(env, var); 78 * 79 * where env is the prevailing JNIEnv, 80 * object is a jobject, 81 * id is the field ID of the String field to be extracted, and 82 * var is the char * variable that will point to the string. 83 * 84 * Uses of these macros may be nested as long as each WITH_.._STRING macro 85 * declares a unique variable. 86 */ 87 88 #define WITH_PLATFORM_STRING(env, strexp, var) \ 89 if (1) { \ 90 const char *var; \ 91 jstring _##var##str = (strexp); \ 92 if (_##var##str == NULL) { \ 93 JNU_ThrowNullPointerException((env), NULL); \ 94 goto _##var##end; \ 95 } \ 96 var = JNU_GetStringPlatformChars((env), _##var##str, NULL); \ 97 if (var == NULL) goto _##var##end; 98 99 #define WITH_FIELD_PLATFORM_STRING(env, object, id, var) \ 100 WITH_PLATFORM_STRING(env, \ 101 ((object == NULL) \ 102 ? NULL \ 103 : (*(env))->GetObjectField((env), (object), (id))), \ 104 var) 105 106 #define END_PLATFORM_STRING(env, var) \ 107 JNU_ReleaseStringPlatformChars(env, _##var##str, var); \ 108 _##var##end: ; \ 109 } else ((void)NULL) 110 111 112 /* Macros for transforming Java Strings into native Unicode strings. 113 * Works analogously to WITH_PLATFORM_STRING. 114 */ 115 116 #define WITH_UNICODE_STRING(env, strexp, var) \ 117 if (1) { \ 118 const jchar *var; \ 119 jstring _##var##str = (strexp); \ 120 if (_##var##str == NULL) { \ 121 JNU_ThrowNullPointerException((env), NULL); \ 122 goto _##var##end; \ 123 } \ 124 var = (*(env))->GetStringChars((env), _##var##str, NULL); \ 125 if (var == NULL) goto _##var##end; 126 127 #define END_UNICODE_STRING(env, var) \ 128 (*(env))->ReleaseStringChars(env, _##var##str, var); \ 129 _##var##end: ; \ 130 } else ((void)NULL) 131