1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- using Invercargill;
- using Gee;
- namespace Ppub {
- public class Builder {
- private Invercargill.Sequence<BuilderAsset> 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<string>(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;}
- }
- }
|