int DOKAN_CALLBACK OnMoveFile( LPCWSTR ExistingFileName, LPCWSTR NewFileName, BOOL ReplaceExisiting, PDOKAN_FILE_INFO DokanFileInfo ) { LOG( L"[OnMoveFile] ExistingFileName = %s\n", ExistingFileName ); JNIEnv* env = get_env(); //jvm->AttachCurrentThread((void **)&env, NULL); int result = -ERROR_GEN_FAILURE; try { jstring jExistingFileName = ToJavaString( env, ExistingFileName ); jstring jNewFileName = ToJavaString( env, NewFileName ); jobject jdokanFileInfo = ToDokanFileInfoJavaObject( env, DokanFileInfo ); env->CallVoidMethod( gOperations, onMoveFileID, jExistingFileName, jNewFileName, ReplaceExisiting, jdokanFileInfo ); result = GetOperationResult( env ); } catch ( const char* msg ) { LOGA( "[OnMoveFile] %s\n", msg ); } release_env( env ); return result; }
//You should implement either FindFires or FindFilesWithPattern int DOKAN_CALLBACK OnFindFilesWithPattern( LPCWSTR PathName, LPCWSTR SearchPattern, PFillFindData pFillFindData, // call this function with PWIN32_FIND_DATAW PDOKAN_FILE_INFO DokanFileInfo ) { LOG( L"[OnFindFilesWithPattern] PathName = %s\n", PathName ); JNIEnv* env = get_env(); //jvm->AttachCurrentThread((void **)&env, NULL); int result = -ERROR_GEN_FAILURE; try { jstring jpathName = ToJavaString( env, PathName ); jstring jsearchPattern = ToJavaString( env, SearchPattern ); jobject jdokanFileInfo = ToDokanFileInfoJavaObject( env, DokanFileInfo ); jobjectArray ary = ( jobjectArray )env->CallObjectMethod( gOperations, onFindFilesWithPatternID, jpathName, jsearchPattern, jdokanFileInfo ); result = GetOperationResult( env ); if ( result == 0 && ary != NULL && pFillFindData != NULL ) { for ( int i = 0; i < env->GetArrayLength( ary ); i++ ) { WIN32_FIND_DATAW win32FindData; ToWin32FindData( env, env->GetObjectArrayElement( ary, i ), &win32FindData ); pFillFindData( &win32FindData, DokanFileInfo ); } } } catch ( const char* msg ) { LOGA( "[OnFindFilesWithPattern] %s\n", msg ); } release_env( env ); return result; }
int DOKAN_CALLBACK OnCreateFile( LPCWSTR FileName, DWORD DesiredAccess, DWORD ShareMode, DWORD CreationDisposition, DWORD FlagsAndAttributes, //HANDLE, // TemplateFile PDOKAN_FILE_INFO DokanFileInfo ) { LOG( L"[OnCreateFile] FileName = %s\n", FileName ); JNIEnv* env = get_env(); //jvm->AttachCurrentThread((void **)&env, NULL); int result = -ERROR_GEN_FAILURE; try { jstring jfileName = ToJavaString( env, FileName ); jobject jdokanFileInfo = ToDokanFileInfoJavaObject( env, DokanFileInfo ); jlong handle = env->CallLongMethod( gOperations, onCreateFileID, jfileName, DesiredAccess, ShareMode, CreationDisposition, FlagsAndAttributes, jdokanFileInfo ); result = GetOperationResult( env ); if ( result == 0 ) { DokanFileInfo->Context = handle; } LOG( L"[OnCreateFile] result = %d, handle = %d\n", result, handle ); } catch ( const char* msg ) { LOGA( "[OnCreateFile] %s\n", msg ); } release_env( env ); return result; }
int DOKAN_CALLBACK OnSetFileTime( LPCWSTR FileName, CONST FILETIME* CreationTime, CONST FILETIME* LastAccessTime, CONST FILETIME* LastWriteTime, PDOKAN_FILE_INFO DokanFileInfo ) { LOG( L"[OnSetFileTime] FileName = %s\n", FileName ); JNIEnv* env = get_env(); //jvm->AttachCurrentThread((void **)&env, NULL); int result = -ERROR_GEN_FAILURE; try { jstring jfileName = ToJavaString( env, FileName ); jobject jdokanFileInfo = ToDokanFileInfoJavaObject( env, DokanFileInfo ); env->CallVoidMethod( gOperations, onSetFileTimeID, jfileName, FileTime2LongLong( CreationTime ), FileTime2LongLong( LastAccessTime ), FileTime2LongLong( LastWriteTime ), jdokanFileInfo ); result = GetOperationResult( env ); } catch ( const char* msg ) { LOGA( "[OnSetFileTime] %s\n", msg ); } release_env( env ); return result; }
int DOKAN_CALLBACK OnReadFile( LPCWSTR FileName, LPVOID Buffer, DWORD NumberOfBytesToRead, LPDWORD NumberOfBytesRead, LONGLONG Offset, PDOKAN_FILE_INFO DokanFileInfo ) { LOG( L"[OnReadFile] FileName = %s, Offset = %lld, NumberOfBytesToRead = %d\n", FileName, Offset, NumberOfBytesToRead ); JNIEnv* env = get_env(); //jvm->AttachCurrentThread((void **)&env, NULL); int result = -ERROR_GEN_FAILURE; try { jstring jfileName = ToJavaString( env, FileName ); jobject jdokanFileInfo = ToDokanFileInfoJavaObject( env, DokanFileInfo ); DWORD readed = env->CallIntMethod( gOperations, onReadFileID, jfileName, env->NewDirectByteBuffer( Buffer, NumberOfBytesToRead ), Offset, jdokanFileInfo ); if ( NumberOfBytesRead ) *NumberOfBytesRead = readed; result = GetOperationResult( env ); if ( result != 0 ) { LOGA( "[OnReadFile] result = %d\n", result ); } } catch ( const char* msg ) { LOGA( "[OnReadFile] %s\n", msg ); } release_env( env ); return result; }
int DOKAN_CALLBACK OnOpenDirectory( LPCWSTR FileName, PDOKAN_FILE_INFO DokanFileInfo ) { LOG( L"[OnOpenDirectory] FileName = %s\n", FileName ); JNIEnv* env = get_env(); //jvm->AttachCurrentThread((void **)&env, NULL); int result = -ERROR_GEN_FAILURE; try { jstring jfileName = ToJavaString( env, FileName ); jobject jdokanFileInfo = ToDokanFileInfoJavaObject( env, DokanFileInfo ); jlong handle = env->CallLongMethod( gOperations, onOpenDirectoryID, jfileName, jdokanFileInfo ); result = GetOperationResult( env ); if ( result == 0 ) { DokanFileInfo->Context = handle; } } catch ( const char* msg ) { LOGA( "[OnOpenDirectory] %s\n", msg ); } release_env( env ); return result; }
int DOKAN_CALLBACK OnWriteFile( LPCWSTR FileName, LPCVOID Buffer, DWORD NumberOfBytesToWrite, LPDWORD NumberOfBytesWritten, LONGLONG Offset, PDOKAN_FILE_INFO DokanFileInfo ) { LOG( L"[OnWriteFile] FileName = %s, Offset = %lld, NumberOfBytesToWrite = %d\n", FileName, Offset, NumberOfBytesToWrite ); JNIEnv* env = get_env(); //jvm->AttachCurrentThread((void **)&env, NULL); int result = -ERROR_GEN_FAILURE; try { jstring jfileName = ToJavaString( env, FileName ); jobject jdokanFileInfo = ToDokanFileInfoJavaObject( env, DokanFileInfo ); // Some one please modify here for the faster way !! LPVOID tmpBuffer = malloc( NumberOfBytesToWrite ); if ( tmpBuffer == NULL ) throw "Cannot allocate memory"; CopyMemory( tmpBuffer, Buffer, NumberOfBytesToWrite ); DWORD written = env->CallIntMethod( gOperations, onWriteFileID, jfileName, env->NewDirectByteBuffer( tmpBuffer, NumberOfBytesToWrite ), Offset, jdokanFileInfo ); free( tmpBuffer ); if ( NumberOfBytesWritten ) *NumberOfBytesWritten = written; result = GetOperationResult( env ); if ( result != 0 ) { LOGA( "[OnWriteFile] ERROR result = %d\n", result ); } else { LOGA( "[OnWriteFile] written = %d\n", written ); } } catch ( const char* msg ) { LOGA( "[OnWriteFile] %s\n", msg ); } release_env( env ); return result; }
int DOKAN_CALLBACK OnGetFileInformation( LPCWSTR FileName, LPBY_HANDLE_FILE_INFORMATION ByHandleFileInfo, PDOKAN_FILE_INFO DokanFileInfo ) { LOG( L"[OnGetFileInformation] FileName = %s\n", FileName ); JNIEnv* env = get_env(); //jvm->AttachCurrentThread((void **)&env, NULL); int result = -ERROR_GEN_FAILURE; try { jstring jfileName = ToJavaString( env, FileName ); jobject jdokanFileInfo = ToDokanFileInfoJavaObject( env, DokanFileInfo ); jobject jobj = env->CallObjectMethod( gOperations, onGetFileInformationID, jfileName, jdokanFileInfo ); result = GetOperationResult( env ); if ( result == 0 ) { ToByHandleFileInfo( env, jobj, ByHandleFileInfo ); LOGA( "[OnGetFileInformation] %d %d %d\n", ByHandleFileInfo->dwFileAttributes, ByHandleFileInfo->nFileSizeHigh, ByHandleFileInfo->nFileSizeLow ); LOGA( "[OnGetFileInformation] CreationTime: %d %d\n", ByHandleFileInfo->ftCreationTime.dwHighDateTime, ByHandleFileInfo->ftCreationTime.dwLowDateTime ); LOGA( "[OnGetFileInformation] LastAccess: %d %d\n", ByHandleFileInfo->ftLastAccessTime.dwHighDateTime, ByHandleFileInfo->ftLastAccessTime.dwLowDateTime ); LOGA( "[OnGetFileInformation] LastWrite: %d %d\n", ByHandleFileInfo->ftLastWriteTime.dwHighDateTime, ByHandleFileInfo->ftLastWriteTime.dwLowDateTime ); } } catch ( const char* msg ) { LOGA( "[OnGetFileInformation] %s\n", msg ); } release_env( env ); return result; }
// see Win32 API GetVolumeInformation int DOKAN_CALLBACK OnGetVolumeInformation( LPWSTR VolumeNameBuffer, DWORD VolumeNameSize, LPDWORD VolumeSerialNumber, LPDWORD MaximumComponentLength, LPDWORD FileSystemFlags, LPWSTR FileSystemNameBuffer, DWORD FileSystemNameSize, PDOKAN_FILE_INFO DokanFileInfo ) { LOG( L"[OnGetVolumeInformation]\n" ); JNIEnv* env = get_env(); //jvm->AttachCurrentThread((void **)&env, NULL); int result = -ERROR_GEN_FAILURE; try { jstring jvolumeName = ToJavaString( env, L"dokan" ); jobject jdokanFileInfo = ToDokanFileInfoJavaObject( env, DokanFileInfo ); jobject jvolumeInfo= env->CallObjectMethod( gOperations, onGetVolumeInformationID, jvolumeName, jdokanFileInfo ); result = GetOperationResult( env ); if ( VolumeSerialNumber ) *VolumeSerialNumber = env->GetIntField( jvolumeInfo, volumeSerialNumberID ); if ( MaximumComponentLength ) *MaximumComponentLength = env->GetIntField( jvolumeInfo, maximumComponentLengthID ); if ( FileSystemFlags ) *FileSystemFlags = env->GetIntField( jvolumeInfo, fileSystemFlagsID ); // VolumeName, FileSystemName CopyStringField( env, jvolumeInfo, volumeNameID, VolumeNameBuffer, VolumeNameSize ); CopyStringField( env, jvolumeInfo, fileSystemNameID, FileSystemNameBuffer, FileSystemNameSize ); } catch ( const char* msg ) { LOGA( "[OnGetVolumeInformation] %s\n", msg ); } release_env( env ); return result; }
int DOKAN_CALLBACK OnFlushFileBuffers( LPCWSTR FileName, PDOKAN_FILE_INFO DokanFileInfo ) { LOG( L"[OnFlushFileBuffers] FileName = %s\n", FileName ); JNIEnv* env = get_env(); //jvm->AttachCurrentThread((void **)&env, NULL); int result = -ERROR_GEN_FAILURE; try { jstring jfileName = ToJavaString( env, FileName ); jobject jdokanFileInfo = ToDokanFileInfoJavaObject( env, DokanFileInfo ); env->CallVoidMethod( gOperations, onFlushFileBuffersID, jfileName, jdokanFileInfo ); result = GetOperationResult( env ); } catch ( const char* msg ) { LOGA( "[OnFlushFileBuffers] %s\n", msg ); } release_env( env ); return result; }
inline jstring ToJavaString(JNIEnv * env, string const & s) { return ToJavaString(env, s.c_str()); }