aboutsummaryrefslogtreecommitdiff
path: root/jgvariant-ostree/src
diff options
context:
space:
mode:
authorMatthias Andreas Benkard <code@mail.matthias.benkard.de>2021-12-30 19:13:49 +0100
committerMatthias Andreas Benkard <code@mail.matthias.benkard.de>2021-12-30 19:13:49 +0100
commit50a626db95a56160d8d08a6d0a6bb678b08b78d1 (patch)
tree1f3fcd3c7e789bc296ac55848caefa4bad1bedd1 /jgvariant-ostree/src
parente74b800445cbe502511905105e769a1ca33b8381 (diff)
jgvariant-ostree: DeltaPartPayload: Decompress LZMA if needed.
Change-Id: I4a751b7778c30d2e126a058c766edaef7b641415
Diffstat (limited to 'jgvariant-ostree/src')
-rw-r--r--jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaPartPayload.java25
-rw-r--r--jgvariant-ostree/src/main/java/module-info.java3
2 files changed, 24 insertions, 4 deletions
diff --git a/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaPartPayload.java b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaPartPayload.java
index 99e093d..ed0f4ff 100644
--- a/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaPartPayload.java
+++ b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaPartPayload.java
@@ -1,9 +1,14 @@
package eu.mulk.jgvariant.ostree;
import eu.mulk.jgvariant.core.Decoder;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.UncheckedIOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.List;
+import org.tukaani.xz.XZInputStream;
/**
* A payload file from a static delta.
@@ -37,10 +42,24 @@ public record DeltaPartPayload(
private static ByteBuffer preparse(ByteBuffer byteBuffer) {
byte compressionByte = byteBuffer.get(0);
+ var dataSlice = byteBuffer.slice(1, byteBuffer.limit() - 1);
return switch (compressionByte) {
- case 0 -> byteBuffer.slice(1, byteBuffer.limit());
- case (byte) 'x' -> throw new UnsupportedOperationException(
- "LZMA compression of static deltas is unsupported");
+ case 0 -> dataSlice;
+ case (byte) 'x' -> {
+ try {
+ var dataBytes = new byte[dataSlice.limit()];
+ dataSlice.get(dataBytes);
+ var decompressingInputStream = new XZInputStream(new ByteArrayInputStream(dataBytes));
+
+ var decompressedOutputStream = new ByteArrayOutputStream();
+ decompressingInputStream.transferTo(decompressedOutputStream);
+
+ yield ByteBuffer.wrap(decompressedOutputStream.toByteArray());
+ } catch (IOException e) {
+ // impossible
+ throw new UncheckedIOException(e);
+ }
+ }
default -> throw new IllegalArgumentException(
"unrecognized compression byte '%d'".formatted(compressionByte));
};
diff --git a/jgvariant-ostree/src/main/java/module-info.java b/jgvariant-ostree/src/main/java/module-info.java
index 59b458f..da86412 100644
--- a/jgvariant-ostree/src/main/java/module-info.java
+++ b/jgvariant-ostree/src/main/java/module-info.java
@@ -77,8 +77,9 @@
module eu.mulk.jgvariant.ostree {
requires transitive eu.mulk.jgvariant.core;
requires com.google.errorprone.annotations;
- requires org.jetbrains.annotations;
requires org.apiguardian.api;
+ requires org.jetbrains.annotations;
+ requires org.tukaani.xz;
exports eu.mulk.jgvariant.ostree;
}