瀏覽代碼

Added Dokany Support
fixes #207

Sebastian Stenzel 6 年之前
父節點
當前提交
aed35c17c8

+ 5 - 5
main/commons/src/main/java/org/cryptomator/common/settings/Settings.java

@@ -26,7 +26,7 @@ public class Settings {
 	public static final int DEFAULT_NUM_TRAY_NOTIFICATIONS = 3;
 	public static final String DEFAULT_GVFS_SCHEME = "dav";
 	public static final boolean DEFAULT_DEBUG_MODE = false;
-	public static final VolumeImpl DEFAULT_VOLUME_IMPL = VolumeImpl.FUSE;
+	public static final VolumeImpl DEFAULT_PREFERRED_VOLUME_IMPL = System.getProperty("os.name").toLowerCase().contains("windows") ? VolumeImpl.DOKANY : VolumeImpl.FUSE;
 
 	private final ObservableList<VaultSettings> directories = FXCollections.observableArrayList(VaultSettings::observables);
 	private final BooleanProperty askedForUpdateCheck = new SimpleBooleanProperty(DEFAULT_ASKED_FOR_UPDATE_CHECK);
@@ -35,7 +35,7 @@ public class Settings {
 	private final IntegerProperty numTrayNotifications = new SimpleIntegerProperty(DEFAULT_NUM_TRAY_NOTIFICATIONS);
 	private final StringProperty preferredGvfsScheme = new SimpleStringProperty(DEFAULT_GVFS_SCHEME);
 	private final BooleanProperty debugMode = new SimpleBooleanProperty(DEFAULT_DEBUG_MODE);
-	private final ObjectProperty<VolumeImpl> volumeImpl = new SimpleObjectProperty<>(DEFAULT_VOLUME_IMPL);
+	private final ObjectProperty<VolumeImpl> preferredVolumeImpl = new SimpleObjectProperty<>(DEFAULT_PREFERRED_VOLUME_IMPL);
 
 	private Consumer<Settings> saveCmd;
 
@@ -50,7 +50,7 @@ public class Settings {
 		numTrayNotifications.addListener(this::somethingChanged);
 		preferredGvfsScheme.addListener(this::somethingChanged);
 		debugMode.addListener(this::somethingChanged);
-		volumeImpl.addListener(this::somethingChanged);
+		preferredVolumeImpl.addListener(this::somethingChanged);
 	}
 
 	void setSaveCmd(Consumer<Settings> saveCmd) {
@@ -97,8 +97,8 @@ public class Settings {
 		return debugMode;
 	}
 
-	public ObjectProperty<VolumeImpl> volumeImpl() {
-		return volumeImpl;
+	public ObjectProperty<VolumeImpl> preferredVolumeImpl() {
+		return preferredVolumeImpl;
 	}
 
 }

+ 5 - 5
main/commons/src/main/java/org/cryptomator/common/settings/SettingsJsonAdapter.java

@@ -33,7 +33,7 @@ public class SettingsJsonAdapter extends TypeAdapter<Settings> {
 		out.name("numTrayNotifications").value(value.numTrayNotifications().get());
 		out.name("preferredGvfsScheme").value(value.preferredGvfsScheme().get());
 		out.name("debugMode").value(value.debugMode().get());
-		out.name("volumeImpl").value(value.volumeImpl().get().name());
+		out.name("preferredVolumeImpl").value(value.preferredVolumeImpl().get().name());
 		out.endObject();
 	}
 
@@ -74,8 +74,8 @@ public class SettingsJsonAdapter extends TypeAdapter<Settings> {
 				case "debugMode":
 					settings.debugMode().set(in.nextBoolean());
 					break;
-				case "volumeImpl":
-					settings.volumeImpl().set(parseNioAdapterName(in.nextString()));
+				case "preferredVolumeImpl":
+					settings.preferredVolumeImpl().set(parsePreferredVolumeImplName(in.nextString()));
 					break;
 				default:
 					LOG.warn("Unsupported vault setting found in JSON: " + name);
@@ -87,11 +87,11 @@ public class SettingsJsonAdapter extends TypeAdapter<Settings> {
 		return settings;
 	}
 
-	private VolumeImpl parseNioAdapterName(String nioAdapterName) {
+	private VolumeImpl parsePreferredVolumeImplName(String nioAdapterName) {
 		try {
 			return VolumeImpl.valueOf(nioAdapterName);
 		} catch (IllegalArgumentException e) {
-			return Settings.DEFAULT_VOLUME_IMPL;
+			return Settings.DEFAULT_PREFERRED_VOLUME_IMPL;
 		}
 	}
 

+ 2 - 1
main/commons/src/main/java/org/cryptomator/common/settings/VolumeImpl.java

@@ -4,7 +4,8 @@ import java.util.Arrays;
 
 public enum VolumeImpl {
 	WEBDAV("WebDAV"),
-	FUSE("FUSE");
+	FUSE("FUSE"),
+	DOKANY("DOKANY");
 
 	private String displayName;
 

+ 2 - 2
main/commons/src/test/java/org/cryptomator/common/settings/SettingsJsonAdapterTest.java

@@ -22,7 +22,7 @@ public class SettingsJsonAdapterTest {
 				+ "\"checkForUpdatesEnabled\": true,"//
 				+ "\"port\": 8080,"//
 				+ "\"numTrayNotifications\": 42,"//
-				+ "\"volumeImpl\": \"FUSE\"}";
+				+ "\"preferredVolumeImpl\": \"FUSE\"}";
 
 		Settings settings = adapter.fromJson(json);
 
@@ -31,7 +31,7 @@ public class SettingsJsonAdapterTest {
 		Assert.assertEquals(8080, settings.port().get());
 		Assert.assertEquals(42, settings.numTrayNotifications().get());
 		Assert.assertEquals("dav", settings.preferredGvfsScheme().get());
-		Assert.assertEquals(VolumeImpl.FUSE, settings.volumeImpl().get());
+		Assert.assertEquals(VolumeImpl.FUSE, settings.preferredVolumeImpl().get());
 	}
 
 }

+ 7 - 1
main/pom.xml

@@ -26,9 +26,10 @@
 		<!-- dependency versions -->
 		<cryptomator.cryptolib.version>1.2.0</cryptomator.cryptolib.version>
 		<cryptomator.cryptofs.version>1.5.2</cryptomator.cryptofs.version>
-		<cryptomator.webdav.version>1.0.4</cryptomator.webdav.version>
 		<cryptomator.jni.version>2.0.0</cryptomator.jni.version>
 		<cryptomator.fuse.version>0.1.5</cryptomator.fuse.version>
+		<cryptomator.dokany.version>0.1.0</cryptomator.dokany.version>
+		<cryptomator.webdav.version>1.0.4</cryptomator.webdav.version>
 
 		<commons-io.version>2.5</commons-io.version>
 		<commons-lang3.version>3.6</commons-lang3.version>
@@ -105,6 +106,11 @@
 				<artifactId>fuse-nio-adapter</artifactId>
 				<version>${cryptomator.fuse.version}</version>
 			</dependency>
+			<dependency>
+				<groupId>org.cryptomator</groupId>
+				<artifactId>dokany-nio-adapter</artifactId>
+				<version>${cryptomator.dokany.version}</version>
+			</dependency>
 			<dependency>
 				<groupId>org.cryptomator</groupId>
 				<artifactId>webdav-nio-adapter</artifactId>

+ 9 - 4
main/ui/pom.xml

@@ -10,29 +10,34 @@
 	<name>Cryptomator GUI</name>
 
 	<dependencies>
+		<dependency>
+			<groupId>org.cryptomator</groupId>
+			<artifactId>keychain</artifactId>
+		</dependency>
 		<dependency>
 			<groupId>org.cryptomator</groupId>
 			<artifactId>commons</artifactId>
 		</dependency>
+
 		<dependency>
 			<groupId>org.cryptomator</groupId>
 			<artifactId>cryptofs</artifactId>
 		</dependency>
 		<dependency>
 			<groupId>org.cryptomator</groupId>
-			<artifactId>webdav-nio-adapter</artifactId>
+			<artifactId>jni</artifactId>
 		</dependency>
 		<dependency>
 			<groupId>org.cryptomator</groupId>
-			<artifactId>jni</artifactId>
+			<artifactId>fuse-nio-adapter</artifactId>
 		</dependency>
 		<dependency>
 			<groupId>org.cryptomator</groupId>
-			<artifactId>keychain</artifactId>
+			<artifactId>dokany-nio-adapter</artifactId>
 		</dependency>
 		<dependency>
 			<groupId>org.cryptomator</groupId>
-			<artifactId>fuse-nio-adapter</artifactId>
+			<artifactId>webdav-nio-adapter</artifactId>
 		</dependency>
 
 		<!-- CryptoLib -->

+ 2 - 2
main/ui/src/main/java/org/cryptomator/ui/controllers/SettingsController.java

@@ -97,7 +97,7 @@ public class SettingsController implements ViewController {
 
 		//NIOADAPTER
 		volume.getItems().addAll(getSupportedAdapters());
-		volume.setValue(settings.volumeImpl().get());
+		volume.setValue(settings.preferredVolumeImpl().get());
 		volume.setVisible(true);
 		volume.setConverter(new NioAdapterImplStringConverter());
 
@@ -127,7 +127,7 @@ public class SettingsController implements ViewController {
 
 		settings.checkForUpdates().bind(checkForUpdatesCheckbox.selectedProperty());
 		settings.preferredGvfsScheme().bind(prefGvfsScheme.valueProperty());
-		settings.volumeImpl().bind(volume.valueProperty());
+		settings.preferredVolumeImpl().bind(volume.valueProperty());
 		settings.debugMode().bind(debugModeCheckbox.selectedProperty());
 	}
 

+ 1 - 1
main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockController.java

@@ -181,7 +181,7 @@ public class UnlockController implements ViewController {
 			winDriveLetterLabel.setManaged(false);
 			winDriveLetter.setVisible(false);
 			winDriveLetter.setManaged(false);
-			if (VolumeImpl.WEBDAV.equals(settings.volumeImpl().get())) {
+			if (VolumeImpl.WEBDAV.equals(settings.preferredVolumeImpl().get())) {
 				useOwnMountPath.setVisible(false);
 				useOwnMountPath.setManaged(false);
 				mountPathLabel.setManaged(false);

+ 51 - 0
main/ui/src/main/java/org/cryptomator/ui/model/DokanyVolume.java

@@ -0,0 +1,51 @@
+package org.cryptomator.ui.model;
+
+import javax.inject.Inject;
+import java.util.concurrent.ExecutorService;
+
+import org.cryptomator.common.settings.VaultSettings;
+import org.cryptomator.cryptofs.CryptoFileSystem;
+import org.cryptomator.frontend.dokany.Mount;
+import org.cryptomator.frontend.dokany.MountFactory;
+
+@VaultModule.PerVault
+public class DokanyVolume implements Volume {
+
+	private static final String FS_TYPE_NAME = "Cryptomator File System";
+
+	private final VaultSettings vaultSettings;
+	private final MountFactory mountFactory;
+	private Mount mount;
+
+	@Inject
+	public DokanyVolume(VaultSettings vaultSettings, ExecutorService executorService) {
+		this.vaultSettings = vaultSettings;
+		this.mountFactory = new MountFactory(executorService);
+	}
+
+
+	@Override
+	public boolean isSupported() {
+		return MountFactory.isApplicable();
+	}
+
+	@Override
+	public void mount(CryptoFileSystem fs) {
+		char driveLetter = vaultSettings.winDriveLetter().get().charAt(0);
+		String mountName = vaultSettings.mountName().get();
+		this.mount = mountFactory.mount(fs.getPath("/"), driveLetter, mountName, FS_TYPE_NAME);
+	}
+
+	@Override
+	public void reveal() throws VolumeException {
+		boolean success = mount.reveal();
+		if (!success) {
+			throw new VolumeException("Reveal failed.");
+		}
+	}
+
+	@Override
+	public void unmount() {
+		mount.close();
+	}
+}

+ 9 - 14
main/ui/src/main/java/org/cryptomator/ui/model/VaultModule.java

@@ -43,20 +43,15 @@ public class VaultModule {
 
 	@Provides
 	@PerVault
-	public Volume provideNioAdpater(Settings settings, WebDavVolume webDavVolume, FuseVolume fuseVolume) {
-		VolumeImpl impl = settings.volumeImpl().get();
-		switch (impl) {
-			case FUSE:
-				if (fuseVolume.isSupported()) {
-					return fuseVolume;
-				} else {
-					settings.volumeImpl().set(VolumeImpl.WEBDAV);
-					// fallthrough to WEBDAV
-				}
-			case WEBDAV:
-				return webDavVolume;
-			default:
-				throw new IllegalStateException("Unsupported NioAdapter: " + impl);
+	public Volume provideVolume(Settings settings, WebDavVolume webDavVolume, FuseVolume fuseVolume, DokanyVolume dokanyVolume) {
+		VolumeImpl impl = settings.preferredVolumeImpl().get();
+		if (VolumeImpl.DOKANY == impl && dokanyVolume.isSupported()) {
+			return dokanyVolume;
+		} else if (VolumeImpl.FUSE == impl && fuseVolume.isSupported()) {
+			return fuseVolume;
+		} else {
+			assert webDavVolume.isSupported();
+			return webDavVolume;
 		}
 	}