JNIEXPORT jobject JNICALL Java_com_intellij_openapi_vfs_impl_win32_IdeaWin32_getInfo(JNIEnv *env, jobject method, jstring path) {
    WIN32_FIND_DATA data;
    HANDLE h = FindFileInner(env, path, &data);
    if (h == INVALID_HANDLE_VALUE) {
        return NULL;
    }
    FindClose(h);	
    jclass infoClass = env->FindClass("com/intellij/openapi/vfs/impl/win32/FileInfo");
    return CreateFileInfo(env, path, false, &data, infoClass);
}
Beispiel #2
0
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) {
        return NULL;
    }

    jclass fileInfoClass = getFileInfoClass(env);
    if (fileInfoClass == NULL) {
        return NULL;
    }

    jobjectArray rv, old;
    int len = 0, maxlen = 16;
    rv = env->NewObjectArray(maxlen, fileInfoClass, NULL);
    if (rv == NULL) {
        goto error;
    }

    do {
        if (len == maxlen) {
            old = rv;
            rv = env->NewObjectArray(maxlen <<= 1, fileInfoClass, NULL);
            if (rv == NULL || !CopyObjectArray(env, rv, old, len)) {
                goto error;
            }
            env->DeleteLocalRef(old);
        }
        jobject o = CreateFileInfo(env, path, true, &data, fileInfoClass);
        env->SetObjectArrayElement(rv, len++, o);
        env->DeleteLocalRef(o);
    }
    while (FindNextFile(h, &data));

    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);	
    return NULL;
}
Beispiel #3
0
JNIEXPORT jstring JNICALL Java_com_intellij_openapi_util_io_win32_IdeaWin32_resolveSymLink0(JNIEnv *env, jobject method, jstring path) {
    if (__GetFinalPathNameByHandle == NULL) {
        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;
    }

    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);
                if (len > 0) {
                    result = env->NewString((jchar *)name, len);
                }
                free(name);
            }
        }
    }

    CloseHandle(th);
    return result;
}
Beispiel #4
0
JNIEXPORT jobject JNICALL Java_com_intellij_openapi_util_io_win32_IdeaWin32_getInfo0(JNIEnv *env, jobject method, jstring path) {
    bool isDrive = false;
    if (env->GetStringLength(path) == 2) {
        const jchar* str = env->GetStringChars(path, NULL);
        isDrive = (str[1] == ':');
        env->ReleaseStringChars(path, str);
    }

    WIN32_FIND_DATA data;
    HANDLE h = INVALID_HANDLE_VALUE;

    if (!isDrive) {
        h = FindFileInner(env, path, &data);
        if (h == INVALID_HANDLE_VALUE && GetLastError() != ERROR_ACCESS_DENIED) {
            return NULL;
        }
    }

    if (h == INVALID_HANDLE_VALUE) {
        WIN32_FILE_ATTRIBUTE_DATA attrData;
        const jchar* str = env->GetStringChars(path, 0);
        BOOL res = GetFileAttributesEx((LPCWSTR)str, GetFileExInfoStandard, &attrData);
        env->ReleaseStringChars(path, str);
        if (!res) {
            return NULL;
        }

        data.dwFileAttributes = attrData.dwFileAttributes;
        data.dwReserved0 = 0;
        data.ftLastWriteTime = attrData.ftLastWriteTime;
        data.nFileSizeLow = attrData.nFileSizeLow;
        data.nFileSizeHigh = attrData.nFileSizeHigh;
    }
    else {
        FindClose(h);
    }

    jclass fileInfoClass = getFileInfoClass(env);
    if (fileInfoClass == NULL) {
        return NULL;
    }

    return CreateFileInfo(env, path, false, &data, fileInfoClass);
}
Beispiel #5
0
JNIEXPORT jobject JNICALL Java_com_intellij_openapi_util_io_win32_IdeaWin32_getInfo0(JNIEnv *env, jobject method, jstring path) {
    WIN32_FILE_ATTRIBUTE_DATA attrData;
    const jchar* str = env->GetStringChars(path, 0);
    BOOL res = GetFileAttributesEx((LPCWSTR)str, GetFileExInfoStandard, &attrData);
    env->ReleaseStringChars(path, str);
    if (!res) {
        return NULL;
    }

    WIN32_FIND_DATA data;
    data.dwFileAttributes = attrData.dwFileAttributes;
    data.dwReserved0 = 0;
    data.ftLastWriteTime = attrData.ftLastWriteTime;
    data.nFileSizeLow = attrData.nFileSizeLow;
    data.nFileSizeHigh = attrData.nFileSizeHigh;

    if (IS_SET(attrData.dwFileAttributes, FILE_ATTRIBUTE_REPARSE_POINT)) {
        WIN32_FIND_DATA findData;
        HANDLE h = FindFileInner(env, path, &findData);
        if (h != INVALID_HANDLE_VALUE) {
            FindClose(h);
            data.dwFileAttributes = findData.dwFileAttributes;
            data.dwReserved0 = findData.dwReserved0;
            data.ftLastWriteTime = findData.ftLastWriteTime;
            data.nFileSizeLow = findData.nFileSizeLow;
            data.nFileSizeHigh = findData.nFileSizeHigh;
        }
    }

    jclass fileInfoClass = getFileInfoClass(env);
    if (fileInfoClass == NULL) {
        return NULL;
    }

    return CreateFileInfo(env, path, false, &data, fileInfoClass);
}