848 LPITEMIDLIST pidl = (LPITEMIDLIST)relativePIDL;
849 if (pIShellIcon == NULL && pidl == NULL) {
850 return 0;
851 }
852
853 INT index = -1;
854
855 HRESULT hres;
856 // http://msdn.microsoft.com/library/en-us/shellcc/platform/Shell/programmersguide/shell_int/shell_int_programming/std_ifaces.asp
857 if (pIShellIcon != NULL) {
858 hres = pIShellIcon->GetIconOf(pidl, GIL_FORSHELL, &index);
859 }
860
861 return (jint)index;
862 }
863
864
865 /*
866 * Class: sun_awt_shell_Win32ShellFolder2
867 * Method: extractIcon
868 * Signature: (JJZ)J
869 */
870 JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_extractIcon
871 (JNIEnv* env, jclass cls, jlong pIShellFolderL, jlong relativePIDL, jboolean getLargeIcon)
872 {
873 IShellFolder* pIShellFolder = (IShellFolder*)pIShellFolderL;
874 LPITEMIDLIST pidl = (LPITEMIDLIST)relativePIDL;
875 if (pIShellFolder == NULL || pidl == NULL) {
876 return 0;
877 }
878
879 HICON hIcon = NULL;
880
881 HRESULT hres;
882 IExtractIconW* pIcon;
883 hres = pIShellFolder->GetUIObjectOf(NULL, 1, const_cast<LPCITEMIDLIST*>(&pidl),
884 IID_IExtractIconW, NULL, (void**)&pIcon);
885 if (SUCCEEDED(hres)) {
886 WCHAR szBuf[MAX_PATH];
887 INT index;
888 UINT flags;
889 hres = pIcon->GetIconLocation(GIL_FORSHELL, szBuf, MAX_PATH, &index, &flags);
890 if (SUCCEEDED(hres)) {
891 HICON hIconLarge;
892 hres = pIcon->Extract(szBuf, index, &hIconLarge, &hIcon, (16 << 16) + 32);
893 if (SUCCEEDED(hres)) {
894 if (getLargeIcon) {
895 fn_DestroyIcon((HICON)hIcon);
896 hIcon = hIconLarge;
897 } else {
898 fn_DestroyIcon((HICON)hIconLarge);
899 }
900 }
901 }
902 pIcon->Release();
903 }
904 return (jlong)hIcon;
905 }
906
907
908 /*
909 * Class: sun_awt_shell_Win32ShellFolder2
910 * Method: disposeIcon
911 * Signature: (J)V
912 */
913 JNIEXPORT void JNICALL Java_sun_awt_shell_Win32ShellFolder2_disposeIcon
914 (JNIEnv* env, jclass cls, jlong hicon)
915 {
916 fn_DestroyIcon((HICON)hicon);
917 }
918
919 /*
920 * Class: sun_awt_shell_Win32ShellFolder2
1264
1265 HRESULT hr = pParentIShellFolder->CompareIDs(
1266 (UINT) columnIdx,
1267 (LPCITEMIDLIST) pIDL1,
1268 (LPCITEMIDLIST) pIDL2);
1269 if (SUCCEEDED (hr)) {
1270 return (jint) (short) HRESULT_CODE(hr);
1271 }
1272
1273 return 0;
1274 }
1275
1276 /*
1277 * Class: sun_awt_shell_Win32ShellFolder2
1278 * Method: loadKnownFolders
1279 * Signature: (V)[BLsun/awt/shell/Win32ShellFolder2$KnownfolderDefenition;
1280 */
1281 JNIEXPORT jobjectArray JNICALL Java_sun_awt_shell_Win32ShellFolder2_loadKnownFolders
1282 (JNIEnv* env, jclass cls )
1283 {
1284 CoInitialize(NULL);
1285 IKnownFolderManager* pkfm = NULL;
1286 HRESULT hr = CoCreateInstance(CLSID_KnownFolderManager, NULL,
1287 CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pkfm));
1288 if (!SUCCEEDED(hr)) return NULL;
1289
1290 TRY;
1291
1292 jclass cl = env->FindClass("sun/awt/shell/Win32ShellFolder2$KnownFolderDefinition");
1293 CHECK_NULL_RETURN(cl, NULL);
1294 DEFINE_FIELD_ID(field_guid, cl, "guid", "Ljava/lang/String;")
1295 DEFINE_FIELD_ID(field_name, cl, "name", "Ljava/lang/String;");
1296 DEFINE_FIELD_ID(field_description, cl, "description", "Ljava/lang/String;");
1297 DEFINE_FIELD_ID(field_parent, cl, "parent", "Ljava/lang/String;");
1298 DEFINE_FIELD_ID(field_relativePath, cl, "relativePath", "Ljava/lang/String;");
1299 DEFINE_FIELD_ID(field_parsingName, cl, "parsingName", "Ljava/lang/String;");
1300 DEFINE_FIELD_ID(field_tooltip, cl, "tooltip", "Ljava/lang/String;");
1301 DEFINE_FIELD_ID(field_localizedName, cl, "localizedName", "Ljava/lang/String;");
1302 DEFINE_FIELD_ID(field_icon, cl, "icon", "Ljava/lang/String;");
1303 DEFINE_FIELD_ID(field_security, cl, "security", "Ljava/lang/String;");
1304 DEFINE_FIELD_ID(field_path, cl, "path", "Ljava/lang/String;");
|
848 LPITEMIDLIST pidl = (LPITEMIDLIST)relativePIDL;
849 if (pIShellIcon == NULL && pidl == NULL) {
850 return 0;
851 }
852
853 INT index = -1;
854
855 HRESULT hres;
856 // http://msdn.microsoft.com/library/en-us/shellcc/platform/Shell/programmersguide/shell_int/shell_int_programming/std_ifaces.asp
857 if (pIShellIcon != NULL) {
858 hres = pIShellIcon->GetIconOf(pidl, GIL_FORSHELL, &index);
859 }
860
861 return (jint)index;
862 }
863
864
865 /*
866 * Class: sun_awt_shell_Win32ShellFolder2
867 * Method: extractIcon
868 * Signature: (JJZZ)J
869 */
870 JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_extractIcon
871 (JNIEnv* env, jclass cls, jlong pIShellFolderL, jlong relativePIDL,
872 jboolean getLargeIcon, jboolean getDefaultIcon)
873 {
874 IShellFolder* pIShellFolder = (IShellFolder*)pIShellFolderL;
875 LPITEMIDLIST pidl = (LPITEMIDLIST)relativePIDL;
876 if (pIShellFolder == NULL || pidl == NULL) {
877 return 0;
878 }
879
880 HICON hIcon = NULL;
881
882 HRESULT hres;
883 IExtractIconW* pIcon;
884 hres = pIShellFolder->GetUIObjectOf(NULL, 1, const_cast<LPCITEMIDLIST*>(&pidl),
885 IID_IExtractIconW, NULL, (void**)&pIcon);
886 if (SUCCEEDED(hres)) {
887 WCHAR szBuf[MAX_PATH];
888 INT index;
889 UINT flags;
890 UINT uFlags = getDefaultIcon ? GIL_DEFAULTICON : GIL_FORSHELL | GIL_ASYNC;
891 hres = pIcon->GetIconLocation(uFlags, szBuf, MAX_PATH, &index, &flags);
892 if (SUCCEEDED(hres)) {
893 HICON hIconLarge;
894 hres = pIcon->Extract(szBuf, index, &hIconLarge, &hIcon, (16 << 16) + 32);
895 if (SUCCEEDED(hres)) {
896 if (getLargeIcon) {
897 fn_DestroyIcon((HICON)hIcon);
898 hIcon = hIconLarge;
899 } else {
900 fn_DestroyIcon((HICON)hIconLarge);
901 }
902 }
903 } else if (hres == E_PENDING) {
904 pIcon->Release();
905 return E_PENDING;
906 }
907 pIcon->Release();
908 }
909 return (jlong)hIcon;
910 }
911
912
913 /*
914 * Class: sun_awt_shell_Win32ShellFolder2
915 * Method: disposeIcon
916 * Signature: (J)V
917 */
918 JNIEXPORT void JNICALL Java_sun_awt_shell_Win32ShellFolder2_disposeIcon
919 (JNIEnv* env, jclass cls, jlong hicon)
920 {
921 fn_DestroyIcon((HICON)hicon);
922 }
923
924 /*
925 * Class: sun_awt_shell_Win32ShellFolder2
1269
1270 HRESULT hr = pParentIShellFolder->CompareIDs(
1271 (UINT) columnIdx,
1272 (LPCITEMIDLIST) pIDL1,
1273 (LPCITEMIDLIST) pIDL2);
1274 if (SUCCEEDED (hr)) {
1275 return (jint) (short) HRESULT_CODE(hr);
1276 }
1277
1278 return 0;
1279 }
1280
1281 /*
1282 * Class: sun_awt_shell_Win32ShellFolder2
1283 * Method: loadKnownFolders
1284 * Signature: (V)[BLsun/awt/shell/Win32ShellFolder2$KnownfolderDefenition;
1285 */
1286 JNIEXPORT jobjectArray JNICALL Java_sun_awt_shell_Win32ShellFolder2_loadKnownFolders
1287 (JNIEnv* env, jclass cls )
1288 {
1289 IKnownFolderManager* pkfm = NULL;
1290 HRESULT hr = CoCreateInstance(CLSID_KnownFolderManager, NULL,
1291 CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pkfm));
1292 if (!SUCCEEDED(hr)) return NULL;
1293
1294 TRY;
1295
1296 jclass cl = env->FindClass("sun/awt/shell/Win32ShellFolder2$KnownFolderDefinition");
1297 CHECK_NULL_RETURN(cl, NULL);
1298 DEFINE_FIELD_ID(field_guid, cl, "guid", "Ljava/lang/String;")
1299 DEFINE_FIELD_ID(field_name, cl, "name", "Ljava/lang/String;");
1300 DEFINE_FIELD_ID(field_description, cl, "description", "Ljava/lang/String;");
1301 DEFINE_FIELD_ID(field_parent, cl, "parent", "Ljava/lang/String;");
1302 DEFINE_FIELD_ID(field_relativePath, cl, "relativePath", "Ljava/lang/String;");
1303 DEFINE_FIELD_ID(field_parsingName, cl, "parsingName", "Ljava/lang/String;");
1304 DEFINE_FIELD_ID(field_tooltip, cl, "tooltip", "Ljava/lang/String;");
1305 DEFINE_FIELD_ID(field_localizedName, cl, "localizedName", "Ljava/lang/String;");
1306 DEFINE_FIELD_ID(field_icon, cl, "icon", "Ljava/lang/String;");
1307 DEFINE_FIELD_ID(field_security, cl, "security", "Ljava/lang/String;");
1308 DEFINE_FIELD_ID(field_path, cl, "path", "Ljava/lang/String;");
|