8 HANDLE FindFileInner(JNIEnv *env, jstring path, LPWIN32_FIND_DATA lpData) {
9 const jchar* str = env->GetStringChars(path, 0);
10 HANDLE h = FindFirstFile((LPCWSTR)str, lpData);
11 env->ReleaseStringChars(path, str);
15 bool CopyObjectArray(JNIEnv *env, jobjectArray dst, jobjectArray src,
19 for (i=0; i<count; i++) {
20 jobject p = env->GetObjectArrayElement(src, i);
21 env->SetObjectArrayElement(dst, i, p);
22 env->DeleteLocalRef(p);
28 fileTimeToInt64 (const FILETIME * time)
32 _time.LowPart = time->dwLowDateTime;
33 _time.HighPart = time->dwHighDateTime;
35 return _time.QuadPart;
39 jfieldID attributesID;
42 jobject CreateFileInfo(JNIEnv *env, LPWIN32_FIND_DATA lpData, jclass cls) {
44 jobject o = env->AllocObject(cls);
48 jstring fileName = env->NewString((jchar*)lpData->cFileName, (jsize)wcslen(lpData->cFileName));
49 if (fileName == NULL) {
52 env->SetObjectField(o, nameID, fileName);
53 env->SetIntField(o, attributesID, lpData->dwFileAttributes);
54 env->SetLongField(o, timestampID, fileTimeToInt64(&lpData->ftLastWriteTime));
58 JNIEXPORT void JNICALL Java_com_intellij_openapi_vfs_impl_win32_FileInfo_initIDs(JNIEnv *env, jclass cls) {
59 nameID = env->GetFieldID(cls, "name", "Ljava/lang/String;");
60 attributesID = env->GetFieldID(cls, "attributes", "I");
61 timestampID = env->GetFieldID(cls, "timestamp", "J");
64 JNIEXPORT jobject JNICALL Java_com_intellij_openapi_vfs_impl_win32_IdeaWin32_getInfo(JNIEnv *env, jobject method, jstring path) {
66 HANDLE h = FindFileInner(env, path, &data);
67 if (h == INVALID_HANDLE_VALUE) {
71 jclass infoClass = env->FindClass("com/intellij/openapi/vfs/impl/win32/FileInfo");
72 return CreateFileInfo(env, &data, infoClass);
75 JNIEXPORT jobjectArray JNICALL Java_com_intellij_openapi_vfs_impl_win32_IdeaWin32_listChildren(JNIEnv *env, jobject method, jstring path)
79 HANDLE h = FindFileInner(env, path, &data);
80 if (h == INVALID_HANDLE_VALUE) {
89 jclass infoClass = env->FindClass("com/intellij/openapi/vfs/impl/win32/FileInfo");
90 rv = env->NewObjectArray(maxlen, infoClass, NULL);
91 if (rv == NULL) goto error;
95 rv = env->NewObjectArray(maxlen <<= 1,
97 if (rv == NULL) goto error;
98 if (!CopyObjectArray(env, rv, old, len)) goto error;
99 env->DeleteLocalRef(old);
101 jobject o = CreateFileInfo(env, &data, infoClass);
102 env->SetObjectArrayElement(rv, len++, o);
103 env->DeleteLocalRef(o);
105 while (FindNextFile(h, &data));
110 rv = env->NewObjectArray(len, infoClass, NULL);
111 if (rv == NULL) goto error;
112 if (!CopyObjectArray(env, rv, old, len)) goto error;
121 BOOL APIENTRY DllMain( HMODULE hModule,
122 DWORD ul_reason_for_call,