using Invercargill; using Gee; namespace Ppub { public class Builder { private Invercargill.Sequence assets {get; set;} private uint64 position = 0; public void add_metadata(Metadata metadata) { var data = (uint8[])metadata.to_string().to_utf8(); var mis = new MemoryInputStream.from_data(data); add_asset("metadata", "application/x-ppub-metadata", mis, data.length); } public void add_asset(string name, string mimetype, InputStream stream, uint64 size) { lock(assets) { var asset = new BuilderAsset(); asset.name = name; asset.start_location = position; asset.end_location = position + size; asset.mimetype = mimetype; asset.stream = stream; position += size; assets.add(asset); } } public void write(OutputStream stream) throws IOError { var index_entries = assets.select(a => a.to_string() + "\n").to_array(); var index_data = (uint8[])string.join("", index_entries).to_utf8(); var header_data = (uint8[])(@"$(index_data.length)\n".to_utf8()); stream.write(header_data); stream.write(index_data); foreach (var asset in assets.as_iterable()) { stream.splice(asset.stream, OutputStreamSpliceFlags.CLOSE_SOURCE); } } } public class BuilderAsset : Asset { public InputStream stream {get; set;} } }