blob: 7269a805853607a9c950e265c1dc49799bbf5f06 [file] [log] [blame]
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +01001package eu.mulk.jgvariant.ostree;
2
3import eu.mulk.jgvariant.core.Decoder;
Matthias Andreas Benkard05114642021-12-29 21:51:29 +01004import java.nio.ByteBuffer;
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +01005import java.nio.ByteOrder;
Matthias Andreas Benkard05114642021-12-29 21:51:29 +01006import java.util.ArrayList;
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +01007import java.util.List;
8
9/**
10 * An entry in a {@link DeltaSuperblock}.
11 *
12 * <p>Reference: {@code ostree-repo-static-delta-private.h#OSTREE_STATIC_DELTA_META_ENTRY_FORMAT}
Matthias Andreas Benkard05114642021-12-29 21:51:29 +010013 *
14 * @param version the version corresponding to the version of {@link DeltaPartPayload}; always 0.
15 * @param checksum the checksum of the {@link DeltaPartPayload}.
16 * @param compressedSize the total compressed size of the delta.
17 * @param uncompressedSize the total uncompressed size of the files generated by the delta.
18 * @param objects a list of objects generated by the delta payload.
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +010019 */
20public record DeltaMetaEntry(
Matthias Andreas Benkard05114642021-12-29 21:51:29 +010021 int version,
22 Checksum checksum,
23 long compressedSize,
24 long uncompressedSize,
25 List<DeltaObject> objects) {
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +010026
Matthias Andreas Benkard05114642021-12-29 21:51:29 +010027 /**
28 * A reference to an object generated by a {@link DeltaPartPayload}.
29 *
30 * @param objectType the file type.
31 * @param checksum the checksum of the resulting file.
32 */
33 public record DeltaObject(ObjectType objectType, Checksum checksum) {
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +010034
35 private static final Decoder<DeltaObject> DECODER =
Matthias Andreas Benkard05114642021-12-29 21:51:29 +010036 Decoder.ofStructure(
37 DeltaObject.class, Decoder.ofByte().map(ObjectType::valueOf), Checksum.decoder());
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +010038
Matthias Andreas Benkard05114642021-12-29 21:51:29 +010039 /**
40 * Acquires a {@link Decoder} for the enclosing type.
41 *
42 * @return a possibly shared {@link Decoder}.
43 */
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +010044 public static Decoder<DeltaObject> decoder() {
45 return DECODER;
46 }
47 }
48
49 private static final Decoder<DeltaMetaEntry> DECODER =
50 Decoder.ofStructure(
51 DeltaMetaEntry.class,
Matthias Andreas Benkarda8514a32021-12-30 21:01:48 +010052 Decoder.ofInt(),
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +010053 Checksum.decoder(),
Matthias Andreas Benkarda8514a32021-12-30 21:01:48 +010054 Decoder.ofLong(),
55 Decoder.ofLong(),
Matthias Andreas Benkard05114642021-12-29 21:51:29 +010056 Decoder.ofByteArray().map(DeltaMetaEntry::parseObjectList));
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +010057
Matthias Andreas Benkard05114642021-12-29 21:51:29 +010058 private static List<DeltaObject> parseObjectList(byte[] bytes) {
59 var byteBuffer = ByteBuffer.wrap(bytes);
60 List<DeltaObject> objects = new ArrayList<>();
61
62 while (byteBuffer.hasRemaining()) {
63 var type = ObjectType.valueOf(byteBuffer.get());
64 var checksum = Checksum.readFrom(byteBuffer);
65 objects.add(new DeltaObject(type, checksum));
66 }
67
68 return objects;
69 }
70
71 /**
72 * Acquires a {@link Decoder} for the enclosing type.
73 *
Matthias Andreas Benkarda8514a32021-12-30 21:01:48 +010074 * <p><strong>Note:</strong> This decoder has an unspecified {@link ByteOrder}.
75 *
Matthias Andreas Benkard05114642021-12-29 21:51:29 +010076 * @return a possibly shared {@link Decoder}.
77 */
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +010078 public static Decoder<DeltaMetaEntry> decoder() {
79 return DECODER;
80 }
Matthias Andreas Benkarda8514a32021-12-30 21:01:48 +010081
82 DeltaMetaEntry byteSwapped() {
83 // FIXME
84 return new DeltaMetaEntry(version, checksum, compressedSize, uncompressedSize, objects);
85 }
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +010086}