|
@@ -30,6 +30,7 @@ import org.cryptomator.ui.util.command.Script;
|
|
|
final class WindowsWebDavMounter implements WebDavMounterStrategy {
|
|
|
|
|
|
private static final Pattern WIN_MOUNT_DRIVELETTER_PATTERN = Pattern.compile("\\s*([A-Z]:)\\s*");
|
|
|
+ private static final int MAX_MOUNT_ATTEMPTS = 10;
|
|
|
|
|
|
@Override
|
|
|
public boolean shouldWork() {
|
|
@@ -50,11 +51,28 @@ final class WindowsWebDavMounter implements WebDavMounterStrategy {
|
|
|
|
|
|
@Override
|
|
|
public WebDavMount mount(URI uri, String name) throws CommandFailedException {
|
|
|
- final Script mountScript = fromLines("net use * http://0--1.ipv6-literal.net:%PORT%%DAV_PATH% /persistent:no")
|
|
|
- .addEnv("PORT", String.valueOf(uri.getPort()))
|
|
|
- .addEnv("DAV_PATH", uri.getRawPath());
|
|
|
- final CommandResult mountResult = mountScript.execute(30, TimeUnit.SECONDS);
|
|
|
- final String driveLetter = getDriveLetter(mountResult.getStdOut());
|
|
|
+ final Script mountScript = fromLines("net use * http://0--1.ipv6-literal.net:%PORT%%DAV_PATH% /persistent:no");
|
|
|
+ mountScript.addEnv("PORT", String.valueOf(uri.getPort())).addEnv("DAV_PATH", uri.getRawPath());
|
|
|
+ String driveLetter = null;
|
|
|
+ // The ugliness of the following 20 lines is solely windows' fault. Deal with it.
|
|
|
+ for (int i = 0; i < MAX_MOUNT_ATTEMPTS; i++) {
|
|
|
+ try {
|
|
|
+ final CommandResult mountResult = mountScript.execute(10, TimeUnit.SECONDS);
|
|
|
+ driveLetter = getDriveLetter(mountResult.getStdOut());
|
|
|
+ break;
|
|
|
+ } catch (CommandFailedException ex) {
|
|
|
+ if (i == MAX_MOUNT_ATTEMPTS - 1) {
|
|
|
+ throw ex;
|
|
|
+ } else {
|
|
|
+ try {
|
|
|
+ // retry after 500ms
|
|
|
+ Thread.sleep(500);
|
|
|
+ } catch (InterruptedException e) {
|
|
|
+ Thread.currentThread().interrupt();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
final Script openExplorerScript = fromLines("start explorer.exe " + driveLetter);
|
|
|
openExplorerScript.execute();
|
|
|
final Script unmountScript = fromLines("net use " + driveLetter + " /delete").addEnv("DRIVE_LETTER", driveLetter);
|