diff --git a/main/filesystem-api/src/main/java/org/cryptomator/filesystem/ReadableFile.java b/main/filesystem-api/src/main/java/org/cryptomator/filesystem/ReadableFile.java index a7e64cadb..634ede5d6 100644 --- a/main/filesystem-api/src/main/java/org/cryptomator/filesystem/ReadableFile.java +++ b/main/filesystem-api/src/main/java/org/cryptomator/filesystem/ReadableFile.java @@ -29,8 +29,16 @@ public interface ReadableFile extends ReadableByteChannel { * if an {@link IOException} occurs while reading from this * {@code ReadableBytes} */ + @Override int read(ByteBuffer target) throws UncheckedIOException; + /** + * @return The current size of the file. This value is a snapshot and might have been changed by concurrent modifications. + * @throws UncheckedIOException + * if an {@link IOException} occurs + */ + long size() throws UncheckedIOException; + /** *
* Fast-forwards or rewinds the file to the specified position.
diff --git a/main/filesystem-api/src/main/java/org/cryptomator/filesystem/delegating/DelegatingReadableFile.java b/main/filesystem-api/src/main/java/org/cryptomator/filesystem/delegating/DelegatingReadableFile.java
index b41382433..68a41234e 100644
--- a/main/filesystem-api/src/main/java/org/cryptomator/filesystem/delegating/DelegatingReadableFile.java
+++ b/main/filesystem-api/src/main/java/org/cryptomator/filesystem/delegating/DelegatingReadableFile.java
@@ -42,6 +42,11 @@ public class DelegatingReadableFile implements ReadableFile {
return delegate.read(target);
}
+ @Override
+ public long size() throws UncheckedIOException {
+ return delegate.size();
+ }
+
@Override
public void position(long position) throws UncheckedIOException {
delegate.position(position);
diff --git a/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoReadableFile.java b/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoReadableFile.java
index 82d72be56..f7f72e1b7 100644
--- a/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoReadableFile.java
+++ b/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoReadableFile.java
@@ -61,6 +61,12 @@ class CryptoReadableFile implements ReadableFile {
}
}
+ @Override
+ public long size() throws UncheckedIOException {
+ assert decryptor != null : "decryptor is always being set during position(long)";
+ return decryptor.contentLength();
+ }
+
@Override
public void position(long position) throws UncheckedIOException {
if (readAheadTask != null) {
diff --git a/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoWritableFile.java b/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoWritableFile.java
index 443bd6737..c71eba542 100644
--- a/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoWritableFile.java
+++ b/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoWritableFile.java
@@ -109,6 +109,7 @@ class CryptoWritableFile implements WritableFile {
encryptor.append(FileContentCryptor.EOF);
writeTask.get();
writeHeader();
+ // TODO append padding
} catch (ExecutionException e) {
if (e.getCause() instanceof UncheckedIOException) {
throw (UncheckedIOException) e.getCause();
diff --git a/main/filesystem-inmemory/src/main/java/org/cryptomator/filesystem/inmem/InMemoryReadableFile.java b/main/filesystem-inmemory/src/main/java/org/cryptomator/filesystem/inmem/InMemoryReadableFile.java
index ff69ddfea..19dc10040 100644
--- a/main/filesystem-inmemory/src/main/java/org/cryptomator/filesystem/inmem/InMemoryReadableFile.java
+++ b/main/filesystem-inmemory/src/main/java/org/cryptomator/filesystem/inmem/InMemoryReadableFile.java
@@ -55,6 +55,11 @@ class InMemoryReadableFile implements ReadableFile {
}
}
+ @Override
+ public long size() throws UncheckedIOException {
+ return contentGetter.get().limit();
+ }
+
@Override
public void position(long position) throws UncheckedIOException {
assert position < Integer.MAX_VALUE : "Can not use that big in-memory files.";
diff --git a/main/filesystem-inmemory/src/test/java/org/cryptomator/filesystem/inmem/InMemoryFileSystemTest.java b/main/filesystem-inmemory/src/test/java/org/cryptomator/filesystem/inmem/InMemoryFileSystemTest.java
index 0225601fc..9c20c9709 100644
--- a/main/filesystem-inmemory/src/test/java/org/cryptomator/filesystem/inmem/InMemoryFileSystemTest.java
+++ b/main/filesystem-inmemory/src/test/java/org/cryptomator/filesystem/inmem/InMemoryFileSystemTest.java
@@ -103,6 +103,11 @@ public class InMemoryFileSystemTest {
}
Assert.assertTrue(fooFile.exists());
+ // check if size = 11 bytes
+ try (ReadableFile readable = fooFile.openReadable()) {
+ Assert.assertEquals(11, readable.size());
+ }
+
// copy foo to bar
File barFile = fs.file("bar.txt");
try (WritableFile writable = barFile.openWritable()) {
diff --git a/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/ReadableNioFile.java b/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/ReadableNioFile.java
index 6b107360c..c98b2222e 100644
--- a/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/ReadableNioFile.java
+++ b/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/ReadableNioFile.java
@@ -45,6 +45,11 @@ class ReadableNioFile implements ReadableFile {
return open;
}
+ @Override
+ public long size() throws UncheckedIOException {
+ return channel.size();
+ }
+
@Override
public void position(long position) throws UncheckedIOException {
assertOpen();
@@ -73,7 +78,7 @@ class ReadableNioFile implements ReadableFile {
target.ensureChannelIsOpened();
SharedFileChannel targetChannel = target.channel();
targetChannel.truncate(0);
- long size = channel.size();
+ long size = size();
long transferred = 0;
while (transferred < size) {
transferred += channel.transferTo(transferred, size - transferred, targetChannel, transferred);
diff --git a/main/filesystem-nio/src/test/java/org/cryptomator/filesystem/nio/ReadableNioFileTest.java b/main/filesystem-nio/src/test/java/org/cryptomator/filesystem/nio/ReadableNioFileTest.java
index d83acee82..3ca8d26a0 100644
--- a/main/filesystem-nio/src/test/java/org/cryptomator/filesystem/nio/ReadableNioFileTest.java
+++ b/main/filesystem-nio/src/test/java/org/cryptomator/filesystem/nio/ReadableNioFileTest.java
@@ -88,6 +88,16 @@ public class ReadableNioFileTest {
inTest.position(-1);
}
+ @Test
+ public void testSizeReturnsSizeOfChannel() {
+ long expectedSize = 85472;
+ when(channel.size()).thenReturn(expectedSize);
+
+ long actualSize = inTest.size();
+
+ assertThat(actualSize, is(expectedSize));
+ }
+
@Test
public void testReadDelegatesToChannelReadFullyWithZeroPositionIfNotSet() {
ByteBuffer buffer = mock(ByteBuffer.class);
diff --git a/main/jackrabbit-filesystem-adapter/src/main/java/org/cryptomator/webdav/jackrabbitservlet/DavFile.java b/main/jackrabbit-filesystem-adapter/src/main/java/org/cryptomator/webdav/jackrabbitservlet/DavFile.java
index 40facff16..8f21c51b6 100644
--- a/main/jackrabbit-filesystem-adapter/src/main/java/org/cryptomator/webdav/jackrabbitservlet/DavFile.java
+++ b/main/jackrabbit-filesystem-adapter/src/main/java/org/cryptomator/webdav/jackrabbitservlet/DavFile.java
@@ -28,6 +28,8 @@ import org.cryptomator.filesystem.jackrabbit.FileLocator;
class DavFile extends DavNode