Builder.vala 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. using Invercargill;
  2. using Gee;
  3. namespace Ppub {
  4. public class Builder {
  5. private Invercargill.Sequence<BuilderAsset> assets {get; set;}
  6. private uint64 position = 0;
  7. public void add_metadata(Metadata metadata) {
  8. var data = (uint8[])metadata.to_string().to_utf8();
  9. var mis = new MemoryInputStream.from_data(data);
  10. add_asset("metadata", "application/x-ppub-metadata", mis, data.length);
  11. }
  12. public void add_asset(string name, string mimetype, InputStream stream, uint64 size) {
  13. lock(assets) {
  14. var asset = new BuilderAsset();
  15. asset.name = name;
  16. asset.start_location = position;
  17. asset.end_location = position + size;
  18. asset.mimetype = mimetype;
  19. asset.stream = stream;
  20. position += size;
  21. assets.add(asset);
  22. }
  23. }
  24. public void write(OutputStream stream) throws IOError {
  25. var index_entries = assets.select<string>(a => a.to_string() + "\n").to_array();
  26. var index_data = (uint8[])string.join("", index_entries).to_utf8();
  27. var header_data = (uint8[])(@"$(index_data.length)\n".to_utf8());
  28. stream.write(header_data);
  29. stream.write(index_data);
  30. foreach (var asset in assets.as_iterable()) {
  31. stream.splice(asset.stream, OutputStreamSpliceFlags.CLOSE_SOURCE);
  32. }
  33. }
  34. }
  35. public class BuilderAsset : Asset {
  36. public InputStream stream {get; set;}
  37. }
  38. }