提交 9ddae00e 编写于 作者: A alexp

Merge

...@@ -201,6 +201,8 @@ public abstract class ShellFolder extends File { ...@@ -201,6 +201,8 @@ public abstract class ShellFolder extends File {
private static ShellFolderManager shellFolderManager; private static ShellFolderManager shellFolderManager;
private static Invoker invoker;
static { static {
String managerClassName = (String)Toolkit.getDefaultToolkit(). String managerClassName = (String)Toolkit.getDefaultToolkit().
getDesktopProperty("Shell.shellFolderManager"); getDesktopProperty("Shell.shellFolderManager");
...@@ -225,6 +227,8 @@ public abstract class ShellFolder extends File { ...@@ -225,6 +227,8 @@ public abstract class ShellFolder extends File {
throw new Error ("Could not access Shell Folder Manager: " throw new Error ("Could not access Shell Folder Manager: "
+ managerClass.getName()); + managerClass.getName());
} }
invoker = shellFolderManager.createInvoker();
} }
/** /**
...@@ -486,21 +490,6 @@ public abstract class ShellFolder extends File { ...@@ -486,21 +490,6 @@ public abstract class ShellFolder extends File {
return null; return null;
} }
private static Invoker invoker;
/**
* Provides the single access point to the {@link Invoker}. It is guaranteed that the value
* returned by this method will be always the same.
*
* @return the singleton instance of {@link Invoker}
*/
public static Invoker getInvoker() {
if (invoker == null) {
invoker = shellFolderManager.createInvoker();
}
return invoker;
}
/** /**
* Invokes the {@code task} which doesn't throw checked exceptions * Invokes the {@code task} which doesn't throw checked exceptions
* from its {@code call} method. If invokation is interrupted then Thread.currentThread().isInterrupted() will * from its {@code call} method. If invokation is interrupted then Thread.currentThread().isInterrupted() will
...@@ -522,7 +511,7 @@ public abstract class ShellFolder extends File { ...@@ -522,7 +511,7 @@ public abstract class ShellFolder extends File {
public static <T, E extends Throwable> T invoke(Callable<T> task, Class<E> exceptionClass) public static <T, E extends Throwable> T invoke(Callable<T> task, Class<E> exceptionClass)
throws InterruptedException, E { throws InterruptedException, E {
try { try {
return getInvoker().invoke(task); return invoker.invoke(task);
} catch (Exception e) { } catch (Exception e) {
if (e instanceof RuntimeException) { if (e instanceof RuntimeException) {
// Rethrow unchecked exceptions // Rethrow unchecked exceptions
......
...@@ -693,29 +693,32 @@ final class Win32ShellFolder2 extends ShellFolder { ...@@ -693,29 +693,32 @@ final class Win32ShellFolder2 extends ShellFolder {
ArrayList<Win32ShellFolder2> list = new ArrayList<Win32ShellFolder2>(); ArrayList<Win32ShellFolder2> list = new ArrayList<Win32ShellFolder2>();
long pEnumObjects = getEnumObjects(includeHiddenFiles); long pEnumObjects = getEnumObjects(includeHiddenFiles);
if (pEnumObjects != 0) { if (pEnumObjects != 0) {
long childPIDL; try {
int testedAttrs = ATTRIB_FILESYSTEM | ATTRIB_FILESYSANCESTOR; long childPIDL;
do { int testedAttrs = ATTRIB_FILESYSTEM | ATTRIB_FILESYSANCESTOR;
childPIDL = getNextChild(pEnumObjects); do {
boolean releasePIDL = true; childPIDL = getNextChild(pEnumObjects);
if (childPIDL != 0 && boolean releasePIDL = true;
(getAttributes0(pIShellFolder, childPIDL, testedAttrs) & testedAttrs) != 0) { if (childPIDL != 0 &&
Win32ShellFolder2 childFolder; (getAttributes0(pIShellFolder, childPIDL, testedAttrs) & testedAttrs) != 0) {
if (Win32ShellFolder2.this.equals(desktop) Win32ShellFolder2 childFolder;
&& personal != null if (Win32ShellFolder2.this.equals(desktop)
&& pidlsEqual(pIShellFolder, childPIDL, personal.disposer.relativePIDL)) { && personal != null
childFolder = personal; && pidlsEqual(pIShellFolder, childPIDL, personal.disposer.relativePIDL)) {
} else { childFolder = personal;
childFolder = new Win32ShellFolder2(Win32ShellFolder2.this, childPIDL); } else {
releasePIDL = false; childFolder = new Win32ShellFolder2(Win32ShellFolder2.this, childPIDL);
releasePIDL = false;
}
list.add(childFolder);
} }
list.add(childFolder); if (releasePIDL) {
} releasePIDL(childPIDL);
if (releasePIDL) { }
releasePIDL(childPIDL); } while (childPIDL != 0 && !Thread.currentThread().isInterrupted());
} } finally {
} while (childPIDL != 0 && !Thread.currentThread().isInterrupted()); releaseEnumObjects(pEnumObjects);
releaseEnumObjects(pEnumObjects); }
} }
return Thread.currentThread().isInterrupted() return Thread.currentThread().isInterrupted()
? new File[0] ? new File[0]
......
...@@ -79,9 +79,12 @@ public class Win32ShellFolderManager2 extends ShellFolderManager { ...@@ -79,9 +79,12 @@ public class Win32ShellFolderManager2 extends ShellFolderManager {
// Shouldn't happen but watch for it anyway // Shouldn't happen but watch for it anyway
throw new FileNotFoundException("File " + file.getAbsolutePath() + " not found"); throw new FileNotFoundException("File " + file.getAbsolutePath() + " not found");
} }
Win32ShellFolder2 folder = createShellFolderFromRelativePIDL(parent, pIDL);
Win32ShellFolder2.releasePIDL(pIDL); try {
return folder; return createShellFolderFromRelativePIDL(parent, pIDL);
} finally {
Win32ShellFolder2.releasePIDL(pIDL);
}
} }
static Win32ShellFolder2 createShellFolderFromRelativePIDL(Win32ShellFolder2 parent, long pIDL) static Win32ShellFolder2 createShellFolderFromRelativePIDL(Win32ShellFolder2 parent, long pIDL)
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
*/ */
import sun.awt.shell.ShellFolder; import sun.awt.shell.ShellFolder;
import sun.awt.OSInfo;
import java.io.File; import java.io.File;
import java.lang.reflect.Field; import java.lang.reflect.Field;
...@@ -43,6 +44,12 @@ public class bug6741890 { ...@@ -43,6 +44,12 @@ public class bug6741890 {
private static final int COUNT = 100000; private static final int COUNT = 100000;
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
if (OSInfo.getOSType() != OSInfo.OSType.WINDOWS) {
System.out.println("The test is applicable only for Windows. Skipped.");
return;
}
String tmpDir = System.getProperty("java.io.tmpdir"); String tmpDir = System.getProperty("java.io.tmpdir");
if (tmpDir.length() == 0) { //'java.io.tmpdir' isn't guaranteed to be defined if (tmpDir.length() == 0) { //'java.io.tmpdir' isn't guaranteed to be defined
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册