aboutsummaryrefslogtreecommitdiff
path: root/jgvariant-ostree/src
diff options
context:
space:
mode:
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;
}