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
,