From 3bb10fdd0588c6f7e42ab9f56066dbe5c11a92b9 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Sun, 2 Sep 2012 09:54:39 +0400 Subject: [PATCH] Fix listing file attributes in IdeaWin32 --- bin/win/IdeaWin32.dll | Bin 35840 -> 35840 bytes bin/win/IdeaWin64.dll | Bin 41984 -> 42496 bytes native/IdeaWin32/IdeaWin32.cpp | 104 +++++++++--------- .../vfs/local/SymlinkHandlingTest.java | 13 ++- .../openapi/util/io/win32/IdeaWin32.java | 3 +- .../util/io/FileAttributesReadingTest.java | 39 ++++++- 6 files changed, 102 insertions(+), 57 deletions(-) diff --git a/bin/win/IdeaWin32.dll b/bin/win/IdeaWin32.dll index bb9c214e8025bf8c5e5dd8506fd8b3a2e557135d..16c7b25be82f67fc0b26954e6ba7eaa951d5cc90 100644 GIT binary patch delta 2155 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 diff --git a/bin/win/IdeaWin64.dll b/bin/win/IdeaWin64.dll index 18b3e1493336b26100be5770b0ac1b5c6db05560..e5e8896b45503e7a9734705a3bb44e4f48b983a7 100644 GIT binary patch delta 9210 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 SYjvJ*JID~~Y3+Z`;QPNon|Bug diff --git a/native/IdeaWin32/IdeaWin32.cpp b/native/IdeaWin32/IdeaWin32.cpp index 838bc76460a0..276e50329d38 100644 --- a/native/IdeaWin32/IdeaWin32.cpp +++ b/native/IdeaWin32/IdeaWin32.cpp @@ -31,13 +31,6 @@ static jclass getFileInfoClass(JNIEnv *env) { return env->FindClass("com/intellij/openapi/util/io/win32/FileInfo"); } -static HANDLE FindFileInner(JNIEnv *env, jstring path, LPWIN32_FIND_DATA lpData) { - const jchar* str = env->GetStringChars(path, 0); - const HANDLE h = FindFirstFile((LPCWSTR)str, lpData); - env->ReleaseStringChars(path, str); - return h; -} - static bool CopyObjectArray(JNIEnv *env, jobjectArray dst, jobjectArray src, jint count) { for (int i = 0; i < count; i++) { jobject p = env->GetObjectArrayElement(src, i); @@ -142,11 +135,12 @@ JNIEXPORT void JNICALL Java_com_intellij_openapi_util_io_win32_IdeaWin32_initIDs JNIEXPORT jobject JNICALL Java_com_intellij_openapi_util_io_win32_IdeaWin32_getInfo0(JNIEnv *env, jobject method, jstring path) { + const jchar* pathStr = env->GetStringChars(path, 0); + WIN32_FILE_ATTRIBUTE_DATA attrData; - const jchar* str = env->GetStringChars(path, 0); - BOOL res = GetFileAttributesEx((LPCWSTR)str, GetFileExInfoStandard, &attrData); - env->ReleaseStringChars(path, str); + BOOL res = GetFileAttributesEx((LPCWSTR)pathStr, GetFileExInfoStandard, &attrData); if (!res) { + env->ReleaseStringChars(path, pathStr); return NULL; } @@ -159,7 +153,7 @@ JNIEXPORT jobject JNICALL Java_com_intellij_openapi_util_io_win32_IdeaWin32_getI if (IS_SET(attrData.dwFileAttributes, FILE_ATTRIBUTE_REPARSE_POINT)) { WIN32_FIND_DATA findData; - HANDLE h = FindFileInner(env, path, &findData); + HANDLE h = FindFirstFile((LPCWSTR)pathStr, &findData); if (h != INVALID_HANDLE_VALUE) { FindClose(h); data.dwFileAttributes = findData.dwFileAttributes; @@ -170,6 +164,8 @@ JNIEXPORT jobject JNICALL Java_com_intellij_openapi_util_io_win32_IdeaWin32_getI } } + env->ReleaseStringChars(path, pathStr); + jclass fileInfoClass = getFileInfoClass(env); if (fileInfoClass == NULL) { return NULL; @@ -184,58 +180,65 @@ JNIEXPORT jstring JNICALL Java_com_intellij_openapi_util_io_win32_IdeaWin32_reso return NULL; // XP } - WIN32_FIND_DATA data; - HANDLE h = FindFileInner(env, path, &data); - if (h == INVALID_HANDLE_VALUE) { - return NULL; - } - FindClose(h); - - if (!IS_SET(data.dwFileAttributes, FILE_ATTRIBUTE_REPARSE_POINT) || !IS_SET(data.dwReserved0, IO_REPARSE_TAG_SYMLINK)) { - return NULL; - } - - const jchar* str = env->GetStringChars(path, 0); - HANDLE th = CreateFile((LPCWSTR)str, 0, FILE_SHARE_ATTRIBUTES, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); - env->ReleaseStringChars(path, str); - if (th == INVALID_HANDLE_VALUE) { - return NULL; - } - + const jchar* pathStr = env->GetStringChars(path, 0); jstring result = NULL; - TCHAR name[MAX_PATH]; - DWORD len = __GetFinalPathNameByHandle(th, name, MAX_PATH, 0); - if (len > 0) { - if (len < MAX_PATH) { - result = env->NewString((jchar *)name, len); - } - else { - TCHAR *name = (TCHAR *)malloc(sizeof(TCHAR) * (len + 1)); - if (name != NULL) { - len = __GetFinalPathNameByHandle(th, name, len, 0); + WIN32_FIND_DATA data; + HANDLE h = FindFirstFile((LPCWSTR)pathStr, &data); + if (h != INVALID_HANDLE_VALUE) { + FindClose(h); + + if (IS_SET(data.dwFileAttributes, FILE_ATTRIBUTE_REPARSE_POINT) && IS_SET(data.dwReserved0, IO_REPARSE_TAG_SYMLINK)) { + HANDLE th = CreateFile((LPCWSTR)pathStr, 0, FILE_SHARE_ATTRIBUTES, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); + if (th != INVALID_HANDLE_VALUE) { + TCHAR name[MAX_PATH]; + DWORD len = __GetFinalPathNameByHandle(th, name, MAX_PATH, 0); if (len > 0) { - result = env->NewString((jchar *)name, len); + if (len < MAX_PATH) { + result = env->NewString((jchar *)name, len); + } + else { + TCHAR *name = (TCHAR *)malloc(sizeof(TCHAR) * (len + 1)); + if (name != NULL) { + len = __GetFinalPathNameByHandle(th, name, len, 0); + if (len > 0) { + result = env->NewString((jchar *)name, len); + } + free(name); + } + } } - free(name); + CloseHandle(th); + } } } - CloseHandle(th); + env->ReleaseStringChars(path, pathStr); return result; } JNIEXPORT jobjectArray JNICALL Java_com_intellij_openapi_util_io_win32_IdeaWin32_listChildren0(JNIEnv *env, jobject method, jstring path) { - WIN32_FIND_DATA data; - HANDLE h = FindFileInner(env, path, &data); - if (h == INVALID_HANDLE_VALUE) { + jclass fileInfoClass = getFileInfoClass(env); + if (fileInfoClass == NULL) { return NULL; } - jclass fileInfoClass = getFileInfoClass(env); - if (fileInfoClass == NULL) { + size_t pathLen = env->GetStringLength(path) + 3; + wchar_t* pathStr = (wchar_t *)malloc(pathLen * sizeof(wchar_t)); + if (pathStr == NULL) { + return NULL; + } + const jchar* str = env->GetStringChars(path, 0); + wcscpy_s(pathStr, pathLen, (LPCWSTR)str); + wcscat_s(pathStr, pathLen, L"\\*"); + env->ReleaseStringChars(path, str); + + WIN32_FIND_DATA data; + HANDLE h = FindFirstFile((LPCWSTR)pathStr, &data); + if (h == INVALID_HANDLE_VALUE) { + free(pathStr); return NULL; } @@ -261,17 +264,20 @@ JNIEXPORT jobjectArray JNICALL Java_com_intellij_openapi_util_io_win32_IdeaWin32 } while (FindNextFile(h, &data)); - FindClose(h); + free(pathStr); + FindClose(h); old = rv; rv = env->NewObjectArray(len, fileInfoClass, NULL); if (rv == NULL || !CopyObjectArray(env, rv, old, len)) { goto error; } + return rv; error: - FindClose(h); + free(pathStr); + FindClose(h); return NULL; } diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/SymlinkHandlingTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/SymlinkHandlingTest.java index eae60f9a094c..b52cdd0cfd94 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/SymlinkHandlingTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/SymlinkHandlingTest.java @@ -109,11 +109,14 @@ public class SymlinkHandlingTest extends LightPlatformLangTestCase { assertEquals(upDir.getPath(), upLinkVFile.getCanonicalPath()); assertVisitedPaths(upDir.getPath(), upLinkVFile.getPath()); - final File nestedLinksFile = new File(upDir.getPath() + StringUtil.repeat(File.separator + upLinkFile.getName(), 4)); - assertTrue(nestedLinksFile.getPath(), nestedLinksFile.isDirectory()); - final VirtualFile nestedLinksVFile = refreshAndFind(nestedLinksFile); - assertNotNull(nestedLinksFile.getPath(), nestedLinksVFile); - assertEquals(upLinkVFile.getCanonicalFile(), nestedLinksVFile.getCanonicalFile()); + final File repeatedLinksFile = new File(upDir.getPath() + StringUtil.repeat(File.separator + upLinkFile.getName(), 4)); + assertTrue(repeatedLinksFile.getPath(), repeatedLinksFile.isDirectory()); + final VirtualFile repeatedLinksVFile = refreshAndFind(repeatedLinksFile); + assertNotNull(repeatedLinksFile.getPath(), repeatedLinksVFile); + assertTrue(repeatedLinksVFile.isSymLink()); + assertTrue(repeatedLinksVFile.isDirectory()); + assertEquals(upDir.getPath(), repeatedLinksVFile.getCanonicalPath()); + assertEquals(upLinkVFile.getCanonicalFile(), repeatedLinksVFile.getCanonicalFile()); } public void testMutualRecursiveLinks() throws Exception { diff --git a/platform/util/src/com/intellij/openapi/util/io/win32/IdeaWin32.java b/platform/util/src/com/intellij/openapi/util/io/win32/IdeaWin32.java index 6ac6deaf17c6..9aa1cc66fa0e 100644 --- a/platform/util/src/com/intellij/openapi/util/io/win32/IdeaWin32.java +++ b/platform/util/src/com/intellij/openapi/util/io/win32/IdeaWin32.java @@ -36,7 +36,6 @@ public class IdeaWin32 { private static final String PATH_PREFIX = "\\\\?\\"; private static final int PREFIX_SIZE = PATH_PREFIX.length(); - private static final String PATH_SUFFIX = "\\*.*"; private static final int MAX_PATH = 260; private static final IdeaWin32 ourInstance; @@ -111,7 +110,7 @@ public class IdeaWin32 { @Nullable public FileInfo[] listChildren(@NotNull final String path) { LogUtil.debug(LOG, "list(%s)", path); - return listChildren0(path(path) + PATH_SUFFIX); + return listChildren0(path(path)); } private static String path(final String path) { diff --git a/platform/util/testSrc/com/intellij/openapi/util/io/FileAttributesReadingTest.java b/platform/util/testSrc/com/intellij/openapi/util/io/FileAttributesReadingTest.java index e4f70421b128..da4a1973cc69 100644 --- a/platform/util/testSrc/com/intellij/openapi/util/io/FileAttributesReadingTest.java +++ b/platform/util/testSrc/com/intellij/openapi/util/io/FileAttributesReadingTest.java @@ -208,6 +208,22 @@ public class FileAttributesReadingTest { assertNull(target); } + @Test + public void selfLink() throws Exception { + assumeTrue(SystemInfo.areSymLinksSupported); + + final File dir = FileUtil.createTempDirectory(myTempDirectory, "test.", ".dir"); + final File link = IoTestUtil.createTempLink(dir.getPath(), new File(dir, "link").getPath()); + + final FileAttributes attributes = getAttributes(link); + assertEquals(FileAttributes.Type.DIRECTORY, attributes.type); + assertEquals(FileAttributes.SYM_LINK, attributes.flags); + assertTimestampsEqual(dir.lastModified(), attributes.lastModified); + + final String target = FileSystemUtil.resolveSymLink(link); + assertEquals(dir.getPath(), target); + } + @Test public void junction() throws Exception { assumeTrue(SystemInfo.isWindows); @@ -235,7 +251,7 @@ public class FileAttributesReadingTest { final File file = new File("C:\\Documents and Settings\\desktop.ini"); assumeTrue(file.exists()); - final FileAttributes attributes = getAttributes(file); + final FileAttributes attributes = getAttributes(file, false); assertEquals(FileAttributes.Type.FILE, attributes.type); assertEquals(FileAttributes.HIDDEN, attributes.flags); assertEquals(file.length(), attributes.length); @@ -302,9 +318,30 @@ public class FileAttributesReadingTest { @NotNull private static FileAttributes getAttributes(@NotNull final File file) { + return getAttributes(file, true); + } + + @NotNull + private static FileAttributes getAttributes(@NotNull final File file, final boolean checkList) { final FileAttributes attributes = FileSystemUtil.getAttributes(file); assertNotNull(attributes); System.out.println(attributes); + + if (SystemInfo.isWindows && checkList) { + final String parent = file.getParent(); + if (parent != null) { + final FileInfo[] infos = IdeaWin32.getInstance().listChildren(parent); + assertNotNull(infos); + for (FileInfo info : infos) { + if (file.getName().equals(info.getName())) { + assertEquals(attributes, info.toFileAttributes()); + return attributes; + } + } + fail(file + " not listed"); + } + } + return attributes; }