< prev index next >

src/java.desktop/windows/native/libawt/windows/ShellFolder2.cpp

Print this page

        

@@ -1261,7 +1261,140 @@
     }
 
     return 0;
 }
 
+/*
+ * Class:     sun_awt_shell_Win32ShellFolder2
+ * Method:    loadKnownFolders
+ * Signature: (V)[BLsun/awt/shell/Win32ShellFolder2$KnownfolderDefenition;
+ */
+JNIEXPORT jobjectArray JNICALL Java_sun_awt_shell_Win32ShellFolder2_loadKnownFolders
+    (JNIEnv* env, jclass cls )
+{
+    CoInitialize(NULL);
+    IKnownFolderManager* pkfm = NULL;
+    HRESULT hr = CoCreateInstance(CLSID_KnownFolderManager, NULL,
+                                CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pkfm));
+    if(!SUCCEEDED(hr)) return NULL;
+
+    jclass cl = env->FindClass("sun/awt/shell/Win32ShellFolder2$KnownfolderDefenition");
+    jfieldID field_guid = env->GetFieldID(cl, "guid", "Ljava/lang/String;");
+    jfieldID field_name = env->GetFieldID(cl, "name", "Ljava/lang/String;");
+    jfieldID field_description = env->GetFieldID(cl, "description", "Ljava/lang/String;");
+    jfieldID field_parent = env->GetFieldID(cl, "parent", "Ljava/lang/String;");
+    jfieldID field_relativePath = env->GetFieldID(cl, "relativePath", "Ljava/lang/String;");
+    jfieldID field_parsingName = env->GetFieldID(cl, "parsingName", "Ljava/lang/String;");
+    jfieldID field_tooltip = env->GetFieldID(cl, "tooltip", "Ljava/lang/String;");
+    jfieldID field_localizedName = env->GetFieldID(cl, "localizedName", "Ljava/lang/String;");
+    jfieldID field_icon = env->GetFieldID(cl, "icon", "Ljava/lang/String;");
+    jfieldID field_security = env->GetFieldID(cl, "security", "Ljava/lang/String;");
+    jfieldID field_path = env->GetFieldID(cl, "path", "Ljava/lang/String;");
+    jfieldID field_saveLocation = env->GetFieldID(cl, "saveLocation", "Ljava/lang/String;");
+    jfieldID field_category = env->GetFieldID(cl, "category", "I");
+    jfieldID field_attributes = env->GetFieldID(cl, "attributes", "J");
+    jfieldID field_defenitionFlags = env->GetFieldID(cl, "defenitionFlags", "I");
+    jfieldID field_ftidType = env->GetFieldID(cl, "ftidType", "Ljava/lang/String;");
+
+    jobjectArray result;
+        KNOWNFOLDERID* pFoldersIds = NULL;
+        UINT count = 0;
+        if(SUCCEEDED(pkfm->GetFolderIds(&pFoldersIds, &count))) {
+            result = env->NewObjectArray(count, cl, NULL);
+        jmethodID initMethod = env->GetMethodID(cl, "<init>", "()V");
+        for(UINT i = 0; i < count; ++i)
+        {
+                jobject fld = env->NewObject(cl, initMethod);
+                env->SetObjectArrayElement(result, i, fld);
+
+            const KNOWNFOLDERID& folderId = pFoldersIds[i];
+            LPOLESTR guid = NULL;
+            if(SUCCEEDED(StringFromCLSID(folderId, &guid))) {
+                env->SetObjectField(fld, field_guid, JNU_NewStringPlatform(env, guid));
+                CoTaskMemFree(guid);
+            }
+
+            IKnownFolder* pFolder = NULL;
+            if(SUCCEEDED(pkfm->GetFolder(folderId, &pFolder))) {
+                KNOWNFOLDER_DEFINITION kfDef;
+                if(SUCCEEDED(pFolder->GetFolderDefinition(&kfDef)))
+                {
+                    env->SetObjectField(fld, field_name,
+                               JNU_NewStringPlatform(env, kfDef.pszName));
+                    if(kfDef.pszDescription)
+                        env->SetObjectField(fld, field_description,
+                               JNU_NewStringPlatform(env, kfDef.pszDescription));
+                    if(SUCCEEDED(StringFromCLSID(kfDef.fidParent, &guid))) {
+                        env->SetObjectField(fld, field_parent,
+                                    JNU_NewStringPlatform(env, guid));
+                        CoTaskMemFree(guid);
+                    }
+                    if(kfDef.pszRelativePath)
+                        env->SetObjectField(fld, field_relativePath,
+                                    JNU_NewStringPlatform(env, kfDef.pszRelativePath));
+                    if(kfDef.pszParsingName)
+                        env->SetObjectField(fld, field_parsingName,
+                                    JNU_NewStringPlatform(env, kfDef.pszParsingName));
+                    if(kfDef.pszTooltip)
+                        env->SetObjectField(fld, field_tooltip,
+                                    JNU_NewStringPlatform(env, kfDef.pszTooltip));
+                    if(kfDef.pszLocalizedName)
+                        env->SetObjectField(fld, field_localizedName,
+                                    JNU_NewStringPlatform(env, kfDef.pszLocalizedName));
+                    if(kfDef.pszIcon)
+                        env->SetObjectField(fld, field_icon,
+                                    JNU_NewStringPlatform(env, kfDef.pszIcon));
+                    if(kfDef.pszSecurity)
+                        env->SetObjectField(fld, field_security,
+                                    JNU_NewStringPlatform(env, kfDef.pszSecurity));
+                    if(SUCCEEDED(StringFromCLSID(kfDef.ftidType, &guid))) {
+                        env->SetObjectField(fld, field_ftidType,
+                                    JNU_NewStringPlatform(env, guid));
+                        CoTaskMemFree(guid);
+                    }
+                    env->SetIntField(fld, field_category, kfDef.category);
+                    env->SetIntField(fld, field_defenitionFlags, kfDef.kfdFlags);
+                    env->SetLongField(fld, field_attributes, kfDef.dwAttributes);
+                    FreeKnownFolderDefinitionFields(&kfDef);
+
+                    LPWSTR folderPath = NULL;
+                    if(SUCCEEDED(pFolder->GetPath(KF_FLAG_NO_ALIAS, &folderPath))
+                                && folderPath) {
+                        env->SetObjectField(fld, field_path,
+                               JNU_NewStringPlatform(env, folderPath));
+                        CoTaskMemFree(folderPath);
+                    }
+
+                    IShellLibrary *plib = NULL;
+                    hr = CoCreateInstance(CLSID_ShellLibrary, NULL,
+                                     CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&plib));
+                    if(SUCCEEDED(hr)) {
+                        hr = plib->LoadLibraryFromKnownFolder(folderId, STGM_READWRITE);
+                        if(SUCCEEDED(hr)) {
+                            IShellItem *item = NULL;
+                            hr = plib->GetDefaultSaveFolder(DSFT_DETECT,
+                                    IID_PPV_ARGS(&item));
+                            if(SUCCEEDED(hr) && item) {
+                                LPWSTR loc = NULL;
+                                hr = item->GetDisplayName(SIGDN_FILESYSPATH, &loc);
+                                if(SUCCEEDED(hr) && loc)
+                                {
+                                    env->SetObjectField(fld, field_saveLocation,
+                                            JNU_NewStringPlatform(env, loc));
+                                    CoTaskMemFree(loc);
+                                }
+                                item->Release();
+                            }
+                        }
+                        plib->Release();
+                    }
+                }
+            }
+            pFolder->Release();
+        }
+        CoTaskMemFree(pFoldersIds);
+        }
+    pkfm->Release();
+    return result;
+}
 
 } // extern "C"
< prev index next >