|
Lucene example source code file (WindowsDirectory.cpp)
The Lucene WindowsDirectory.cpp source code/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with this * work for additional information regarding copyright ownership. The ASF * licenses this file to You under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ #include <jni.h> #include "windows.h" /** * Windows Native IO methods. */ extern "C" { /** * Utility to format a Windows system error code into an exception. */ void throwIOException(JNIEnv *env, DWORD error) { jclass ioex; char *msg; ioex = env->FindClass("java/io/IOException"); if (ioex != NULL) { FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &msg, 0, NULL ); env->ThrowNew(ioex, msg); LocalFree(msg); } } /** * Utility to throw Exceptions on bad input */ void throwException(JNIEnv *env, const char *clazz, const char *msg) { jclass exc = env->FindClass(clazz); if (exc != NULL) { env->ThrowNew(exc, msg); } } /** * Opens a handle to a file. * * Class: org_apache_lucene_store_WindowsDirectory * Method: open * Signature: (Ljava/lang/String;)J */ JNIEXPORT jlong JNICALL Java_org_apache_lucene_store_WindowsDirectory_open (JNIEnv *env, jclass ignored, jstring filename) { char *fname; HANDLE handle; if (filename == NULL) { throwException(env, "java/lang/NullPointerException", "filename cannot be null"); return -1; } fname = (char *) env->GetStringUTFChars(filename, NULL); if (fname == NULL) { throwException(env, "java/lang/IllegalArgumentException", "invalid filename"); return -1; } handle = CreateFile(fname, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, NULL); env->ReleaseStringUTFChars(filename, fname); if (handle == INVALID_HANDLE_VALUE) { throwIOException(env, GetLastError()); return -1; } return (jlong) handle; } /** * Reads data into the byte array, starting at offset, for length characters. * The read is positioned at pos. * * Class: org_apache_lucene_store_WindowsDirectory * Method: read * Signature: (J[BIIJ)I */ JNIEXPORT jint JNICALL Java_org_apache_lucene_store_WindowsDirectory_read (JNIEnv *env, jclass ignored, jlong fd, jbyteArray bytes, jint offset, jint length, jlong pos) { OVERLAPPED io = { 0 }; DWORD numRead = -1; io.Offset = (DWORD) (pos & 0xFFFFFFFF); io.OffsetHigh = (DWORD) ((pos >> 0x20) & 0x7FFFFFFF); if (bytes == NULL) { throwException(env, "java/lang/NullPointerException", "bytes cannot be null"); return -1; } if (length <= 4096) { /* For small buffers, avoid GetByteArrayElements' copy */ char buffer[length]; if (ReadFile((HANDLE) fd, &buffer, length, &numRead, &io)) { env->SetByteArrayRegion(bytes, offset, numRead, (const jbyte *) buffer); } else { throwIOException(env, GetLastError()); numRead = -1; } } else { jbyte *buffer = env->GetByteArrayElements (bytes, NULL); if (!ReadFile((HANDLE) fd, (void *)(buffer+offset), length, &numRead, &io)) { throwIOException(env, GetLastError()); numRead = -1; } env->ReleaseByteArrayElements(bytes, buffer, numRead == 0 || numRead == -1 ? JNI_ABORT : 0); } return numRead; } /** * Closes a handle to a file * * Class: org_apache_lucene_store_WindowsDirectory * Method: close * Signature: (J)V */ JNIEXPORT void JNICALL Java_org_apache_lucene_store_WindowsDirectory_close (JNIEnv *env, jclass ignored, jlong fd) { if (!CloseHandle((HANDLE) fd)) { throwIOException(env, GetLastError()); } } /** * Returns the length in bytes of a file. * * Class: org_apache_lucene_store_WindowsDirectory * Method: length * Signature: (J)J */ JNIEXPORT jlong JNICALL Java_org_apache_lucene_store_WindowsDirectory_length (JNIEnv *env, jclass ignored, jlong fd) { BY_HANDLE_FILE_INFORMATION info; if (GetFileInformationByHandle((HANDLE) fd, (LPBY_HANDLE_FILE_INFORMATION) &info)) { return (jlong) (((DWORDLONG) info.nFileSizeHigh << 0x20) + info.nFileSizeLow); } else { throwIOException(env, GetLastError()); return -1; } } } /* extern "C" */ Other Lucene examples (source code examples)Here is a short list of links related to this Lucene WindowsDirectory.cpp source code file: |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.