Added Dokany Support

fixes #207
This commit is contained in:
Sebastian Stenzel
2018-06-17 13:59:28 +02:00
parent 873e438759
commit aed35c17c8
10 changed files with 95 additions and 37 deletions

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

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

View File

@@ -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());
}
}

View File

@@ -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>

View File

@@ -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>
</dependency>
<dependency>
<groupId>org.cryptomator</groupId>
<artifactId>jni</artifactId>
</dependency>
<dependency>
<groupId>org.cryptomator</groupId>
<artifactId>keychain</artifactId>
<artifactId>fuse-nio-adapter</artifactId>
</dependency>
<dependency>
<groupId>org.cryptomator</groupId>
<artifactId>fuse-nio-adapter</artifactId>
<artifactId>dokany-nio-adapter</artifactId>
</dependency>
<dependency>
<groupId>org.cryptomator</groupId>
<artifactId>webdav-nio-adapter</artifactId>
</dependency>
<!-- CryptoLib -->

View File

@@ -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());
}

View File

@@ -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);

View File

@@ -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();
}
}

View File

@@ -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;
}
}