Beispiel #1
0
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;
}
Beispiel #2
0
//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;
}
Beispiel #3
0
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;
}
Beispiel #4
0
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;
}
Beispiel #5
0
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;
}
Beispiel #6
0
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;
}
Beispiel #7
0
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;
}
Beispiel #8
0
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;
}
Beispiel #9
0
// 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;

}
Beispiel #10
0
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;
}
Beispiel #11
0
inline jstring ToJavaString(JNIEnv * env, string const & s)
{
    return ToJavaString(env, s.c_str());
}