write method

Future<void> write(
  1. GpsPointsView<GpsPoint> view,
  2. StreamSink<List<int>> targetSink
)

Writes view to targetSink in binary format.

Implementation

Future<void> write(
    GpsPointsView view, StreamSink<List<int>> targetSink) async {
  final sink = StreamSinkWriter(targetSink);

  // Write the signature and version of the persistence system.
  sink.writeString(_signatureAndVersion.signature);
  sink.writeUint16(_signatureAndVersion.version);

  final persister = getPersister(view);

  // Write the signature and version information of the persister.
  sink.writeString(persister.signature);
  sink.writeUint16(persister.version);

  // Write the metadata of the persister.
  final metadata = persister.getMetadata(view) ?? ByteData(0);
  if (metadata.lengthInBytes > maxMetadataLength) {
    throw (InvalidMetadataException(
        'Incorrect meta information length. Expected max $maxMetadataLength '
        'but provided with ${metadata.lengthInBytes} bytes.'));
  }
  // First the size of the metadata...
  sink.writeUint8(metadata.lengthInBytes);
  // ...then the metadata...
  sink.writeBytes(metadata.buffer.asUint8List());
  // ...and finally any necessary all-zero padding.
  sink.writeBytes(
      List<int>.filled(maxMetadataLength - metadata.lengthInBytes, 0));

  // Write the view.
  return targetSink.addStream(persister.writeViewToStream(view));
}