1246 Java_sun_awt_shell_Win32ShellFolder2_compareIDsByColumn 1247 (JNIEnv* env, jclass cls, jlong jpParentIShellFolder, 1248 jlong pIDL1, jlong pIDL2, jint columnIdx) 1249 { 1250 IShellFolder* pParentIShellFolder = (IShellFolder*)jpParentIShellFolder; 1251 if (pParentIShellFolder == NULL) { 1252 return 0; 1253 } 1254 1255 HRESULT hr = pParentIShellFolder->CompareIDs( 1256 (UINT) columnIdx, 1257 (LPCITEMIDLIST) pIDL1, 1258 (LPCITEMIDLIST) pIDL2); 1259 if (SUCCEEDED (hr)) { 1260 return (jint) (short) HRESULT_CODE(hr); 1261 } 1262 1263 return 0; 1264 } 1265 1266 1267 } // extern "C" | 1246 Java_sun_awt_shell_Win32ShellFolder2_compareIDsByColumn 1247 (JNIEnv* env, jclass cls, jlong jpParentIShellFolder, 1248 jlong pIDL1, jlong pIDL2, jint columnIdx) 1249 { 1250 IShellFolder* pParentIShellFolder = (IShellFolder*)jpParentIShellFolder; 1251 if (pParentIShellFolder == NULL) { 1252 return 0; 1253 } 1254 1255 HRESULT hr = pParentIShellFolder->CompareIDs( 1256 (UINT) columnIdx, 1257 (LPCITEMIDLIST) pIDL1, 1258 (LPCITEMIDLIST) pIDL2); 1259 if (SUCCEEDED (hr)) { 1260 return (jint) (short) HRESULT_CODE(hr); 1261 } 1262 1263 return 0; 1264 } 1265 1266 /* 1267 * Class: sun_awt_shell_Win32ShellFolder2 1268 * Method: loadKnownFolders 1269 * Signature: (V)[BLsun/awt/shell/Win32ShellFolder2$KnownfolderDefenition; 1270 */ 1271 JNIEXPORT jobjectArray JNICALL Java_sun_awt_shell_Win32ShellFolder2_loadKnownFolders 1272 (JNIEnv* env, jclass cls ) 1273 { 1274 CoInitialize(NULL); 1275 IKnownFolderManager* pkfm = NULL; 1276 HRESULT hr = CoCreateInstance(CLSID_KnownFolderManager, NULL, 1277 CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pkfm)); 1278 if(!SUCCEEDED(hr)) return NULL; 1279 1280 jclass cl = env->FindClass("sun/awt/shell/Win32ShellFolder2$KnownfolderDefenition"); 1281 jfieldID field_guid = env->GetFieldID(cl, "guid", "Ljava/lang/String;"); 1282 jfieldID field_name = env->GetFieldID(cl, "name", "Ljava/lang/String;"); 1283 jfieldID field_description = env->GetFieldID(cl, "description", "Ljava/lang/String;"); 1284 jfieldID field_parent = env->GetFieldID(cl, "parent", "Ljava/lang/String;"); 1285 jfieldID field_relativePath = env->GetFieldID(cl, "relativePath", "Ljava/lang/String;"); 1286 jfieldID field_parsingName = env->GetFieldID(cl, "parsingName", "Ljava/lang/String;"); 1287 jfieldID field_tooltip = env->GetFieldID(cl, "tooltip", "Ljava/lang/String;"); 1288 jfieldID field_localizedName = env->GetFieldID(cl, "localizedName", "Ljava/lang/String;"); 1289 jfieldID field_icon = env->GetFieldID(cl, "icon", "Ljava/lang/String;"); 1290 jfieldID field_security = env->GetFieldID(cl, "security", "Ljava/lang/String;"); 1291 jfieldID field_path = env->GetFieldID(cl, "path", "Ljava/lang/String;"); 1292 jfieldID field_saveLocation = env->GetFieldID(cl, "saveLocation", "Ljava/lang/String;"); 1293 jfieldID field_category = env->GetFieldID(cl, "category", "I"); 1294 jfieldID field_attributes = env->GetFieldID(cl, "attributes", "J"); 1295 jfieldID field_defenitionFlags = env->GetFieldID(cl, "defenitionFlags", "I"); 1296 jfieldID field_ftidType = env->GetFieldID(cl, "ftidType", "Ljava/lang/String;"); 1297 1298 jobjectArray result; 1299 KNOWNFOLDERID* pFoldersIds = NULL; 1300 UINT count = 0; 1301 if(SUCCEEDED(pkfm->GetFolderIds(&pFoldersIds, &count))) { 1302 result = env->NewObjectArray(count, cl, NULL); 1303 jmethodID initMethod = env->GetMethodID(cl, "<init>", "()V"); 1304 for(UINT i = 0; i < count; ++i) 1305 { 1306 jobject fld = env->NewObject(cl, initMethod); 1307 env->SetObjectArrayElement(result, i, fld); 1308 1309 const KNOWNFOLDERID& folderId = pFoldersIds[i]; 1310 LPOLESTR guid = NULL; 1311 if(SUCCEEDED(StringFromCLSID(folderId, &guid))) { 1312 env->SetObjectField(fld, field_guid, JNU_NewStringPlatform(env, guid)); 1313 CoTaskMemFree(guid); 1314 } 1315 1316 IKnownFolder* pFolder = NULL; 1317 if(SUCCEEDED(pkfm->GetFolder(folderId, &pFolder))) { 1318 KNOWNFOLDER_DEFINITION kfDef; 1319 if(SUCCEEDED(pFolder->GetFolderDefinition(&kfDef))) 1320 { 1321 env->SetObjectField(fld, field_name, 1322 JNU_NewStringPlatform(env, kfDef.pszName)); 1323 if(kfDef.pszDescription) 1324 env->SetObjectField(fld, field_description, 1325 JNU_NewStringPlatform(env, kfDef.pszDescription)); 1326 if(SUCCEEDED(StringFromCLSID(kfDef.fidParent, &guid))) { 1327 env->SetObjectField(fld, field_parent, 1328 JNU_NewStringPlatform(env, guid)); 1329 CoTaskMemFree(guid); 1330 } 1331 if(kfDef.pszRelativePath) 1332 env->SetObjectField(fld, field_relativePath, 1333 JNU_NewStringPlatform(env, kfDef.pszRelativePath)); 1334 if(kfDef.pszParsingName) 1335 env->SetObjectField(fld, field_parsingName, 1336 JNU_NewStringPlatform(env, kfDef.pszParsingName)); 1337 if(kfDef.pszTooltip) 1338 env->SetObjectField(fld, field_tooltip, 1339 JNU_NewStringPlatform(env, kfDef.pszTooltip)); 1340 if(kfDef.pszLocalizedName) 1341 env->SetObjectField(fld, field_localizedName, 1342 JNU_NewStringPlatform(env, kfDef.pszLocalizedName)); 1343 if(kfDef.pszIcon) 1344 env->SetObjectField(fld, field_icon, 1345 JNU_NewStringPlatform(env, kfDef.pszIcon)); 1346 if(kfDef.pszSecurity) 1347 env->SetObjectField(fld, field_security, 1348 JNU_NewStringPlatform(env, kfDef.pszSecurity)); 1349 if(SUCCEEDED(StringFromCLSID(kfDef.ftidType, &guid))) { 1350 env->SetObjectField(fld, field_ftidType, 1351 JNU_NewStringPlatform(env, guid)); 1352 CoTaskMemFree(guid); 1353 } 1354 env->SetIntField(fld, field_category, kfDef.category); 1355 env->SetIntField(fld, field_defenitionFlags, kfDef.kfdFlags); 1356 env->SetLongField(fld, field_attributes, kfDef.dwAttributes); 1357 FreeKnownFolderDefinitionFields(&kfDef); 1358 1359 LPWSTR folderPath = NULL; 1360 if(SUCCEEDED(pFolder->GetPath(KF_FLAG_NO_ALIAS, &folderPath)) 1361 && folderPath) { 1362 env->SetObjectField(fld, field_path, 1363 JNU_NewStringPlatform(env, folderPath)); 1364 CoTaskMemFree(folderPath); 1365 } 1366 1367 IShellLibrary *plib = NULL; 1368 hr = CoCreateInstance(CLSID_ShellLibrary, NULL, 1369 CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&plib)); 1370 if(SUCCEEDED(hr)) { 1371 hr = plib->LoadLibraryFromKnownFolder(folderId, STGM_READWRITE); 1372 if(SUCCEEDED(hr)) { 1373 IShellItem *item = NULL; 1374 hr = plib->GetDefaultSaveFolder(DSFT_DETECT, 1375 IID_PPV_ARGS(&item)); 1376 if(SUCCEEDED(hr) && item) { 1377 LPWSTR loc = NULL; 1378 hr = item->GetDisplayName(SIGDN_FILESYSPATH, &loc); 1379 if(SUCCEEDED(hr) && loc) 1380 { 1381 env->SetObjectField(fld, field_saveLocation, 1382 JNU_NewStringPlatform(env, loc)); 1383 CoTaskMemFree(loc); 1384 } 1385 item->Release(); 1386 } 1387 } 1388 plib->Release(); 1389 } 1390 } 1391 } 1392 pFolder->Release(); 1393 } 1394 CoTaskMemFree(pFoldersIds); 1395 } 1396 pkfm->Release(); 1397 return result; 1398 } 1399 1400 } // extern "C" |