From 5189bc24c75b009f53ffc28c024337b81eb46a1c Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Mon, 22 Mar 2010 12:49:06 +0300 Subject: [PATCH] symbolic links support --- bin/win/IdeaWin32.dll | Bin 7680 -> 9216 bytes native/IdeaWin32/IdeaWin32.cpp | 9 +++++++++ native/IdeaWin32/IdeaWin32.vcproj | 13 ++++++------- .../openapi/vfs/impl/win32/IdeaWin32.java | 2 ++ .../openapi/vfs/impl/win32/Win32Kernel.java | 2 +- .../vfs/impl/win32/Win32LocalFileSystem.java | 3 ++- 6 files changed, 20 insertions(+), 9 deletions(-) diff --git a/bin/win/IdeaWin32.dll b/bin/win/IdeaWin32.dll index a610544ab33ced3278608dec333228f4b774db39..fc8c95a97aeb2daa19a41ca11aec96fb9d8240e1 100644 GIT binary patch literal 9216 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 literal 7680 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 diff --git a/native/IdeaWin32/IdeaWin32.cpp b/native/IdeaWin32/IdeaWin32.cpp index 18cb2870dad7..11d96a8f0f6c 100644 --- a/native/IdeaWin32/IdeaWin32.cpp +++ b/native/IdeaWin32/IdeaWin32.cpp @@ -72,6 +72,15 @@ JNIEXPORT jobject JNICALL Java_com_intellij_openapi_vfs_impl_win32_IdeaWin32_get return CreateFileInfo(env, &data, infoClass); } +JNIEXPORT jboolean JNICALL Java_com_intellij_openapi_vfs_impl_win32_IdeaWin32_checkExist(JNIEnv *env, jobject method, jstring path) { + jint result = 0; + WIN32_FILE_ATTRIBUTE_DATA wfad; + const jchar* str = env->GetStringChars(path, 0); + + if (GetFileAttributesEx((LPCWSTR)path, GetFileExInfoStandard, &wfad)) return JNI_TRUE; + return JNI_FALSE; +} + JNIEXPORT jobjectArray JNICALL Java_com_intellij_openapi_vfs_impl_win32_IdeaWin32_listChildren(JNIEnv *env, jobject method, jstring path) { diff --git a/native/IdeaWin32/IdeaWin32.vcproj b/native/IdeaWin32/IdeaWin32.vcproj index 5a8310e4d77d..af41a3c0f8c9 100644 --- a/native/IdeaWin32/IdeaWin32.vcproj +++ b/native/IdeaWin32/IdeaWin32.vcproj @@ -1,11 +1,12 @@ - @@ -139,6 +139,8 @@ SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" + RandomizedBaseAddress="1" + DataExecutionPrevention="0" TargetMachine="1" /> - diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/win32/IdeaWin32.java b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/win32/IdeaWin32.java index b041683762de..32327f9f7f1c 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/win32/IdeaWin32.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/win32/IdeaWin32.java @@ -22,5 +22,7 @@ public class IdeaWin32 { public native FileInfo getInfo(String path); + public native boolean checkExist(String path); + public native FileInfo[] listChildren(String path); } diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/win32/Win32Kernel.java b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/win32/Win32Kernel.java index 66d976010ac4..73496eb28736 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/win32/Win32Kernel.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/win32/Win32Kernel.java @@ -67,7 +67,7 @@ public class Win32Kernel { return true; } catch (FileNotFoundException e) { - return false; + return myKernel.checkExist(path); } } diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/win32/Win32LocalFileSystem.java b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/win32/Win32LocalFileSystem.java index 85c336ad16db..ad8b87d77682 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/win32/Win32LocalFileSystem.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/win32/Win32LocalFileSystem.java @@ -56,13 +56,14 @@ public class Win32LocalFileSystem extends LocalFileSystemBase { }; public static Win32LocalFileSystem getWin32Instance() { + if (!isAvailable()) throw new RuntimeException("dll is not loaded"); Win32LocalFileSystem fileSystem = THREAD_LOCAL.get(); fileSystem.myKernel.clearCache(); return fileSystem; } private final Win32Kernel myKernel = new Win32Kernel(); - private boolean checkMe = false; + public static boolean checkMe = false; private Win32LocalFileSystem() { }