Ejemplo n.º 1
0
        protected async override Task ExecuteEncodeAsync(ImageConfiguration configuration, Stream output)
        {
            var chunkLayoutBuilder = new ChunkLayoutBuilder();

            var chunkWriter = new ChunkWriter(EncodingConfiguration);

            chunkLayoutBuilder.Append(
                GenerateChunk(StructureType.Metadata, configuration, new Metadata(configuration.Metadata)), chunkWriter,
                new MetadataSerializer());

            IList <IList <File> > groupedFiles = _fileGroupingService.GroupFiles(configuration.Files, EncodingConfiguration.FileGroupSize);

            IDictionary <File, Output.File> mappedFiles       = MapFiles(configuration.Files);
            ICollection <Directory>         mappedDirectories = MapDirectories(mappedFiles, configuration.Directories).Values;

            var fileGroupSerializer = new FileGroupContentsSerializer(EncodingConfiguration);
            var fileGroups          = new List <FileGroup>();
            var fileStreams         = new List <Stream>();

            foreach (var group in groupedFiles)
            {
                fileGroups.Add(new FileGroup(group.Select(file => mappedFiles[file])));
                var fileGroupStreams = group.Select(file => file.GetStream()).ToList();
                fileStreams.AddRange(fileGroupStreams);
                chunkLayoutBuilder.Append(GenerateChunk(
                                              StructureType.FileGroupContents,
                                              configuration,
                                              new FileGroupContents(new CombinedStream(fileGroupStreams))),
                                          chunkWriter,
                                          fileGroupSerializer);
            }

            chunkLayoutBuilder.Prepend(
                GenerateChunk(StructureType.FileLayout, configuration, new FileLayout(mappedDirectories, fileGroups)), chunkWriter,
                new FileLayoutSerializer());


            ChunkLayout chunkLayout = await chunkLayoutBuilder.BuildAsync();

            var chunkLayoutBytes = await new ChunkLayoutSerializer().SerializeToBytesAsync(chunkLayout);

            long totalLength = CalculateTotalLength(chunkLayoutBytes, chunkLayout) + 1; //Plus one to force room for padding

            using (Stream imageStream = await CreateImageWriterStreamAsync(configuration, output, totalLength))
            {
                await WriteBodyData(imageStream, chunkLayoutBytes, chunkLayoutBuilder);
            }

            fileStreams.ForEach(stream => stream.Close());
        }
Ejemplo n.º 2
0
        private async Task <Chunk <TBody> > ReadDataChunkAsync <TBody>(
            Stream imageReaderStream,
            ChunkLayout chunkLayout,
            StructureType type,
            Serializer <TBody> serializer,
            int index,
            string invalidChunkMessage) where TBody : class
        {
            var chunkInfo = chunkLayout.OrderedChunkInfo.ElementAt(index);

            if (chunkInfo.Type != type)
            {
                throw new InvalidFormatException(invalidChunkMessage);
            }

            return(await _chunkReader.ReadChunkAsync(imageReaderStream, chunkInfo, serializer));
        }
Ejemplo n.º 3
0
        protected override async Task <DataInfo> _ReadDataInfoAsync(Stream imageReaderStream)
        {
            ChunkLayout chunkLayout = await new ChunkLayoutSerializer().DeserializeAsync(imageReaderStream);

            Chunk <FileLayout> fileLayout = await ReadDataChunkAsync(
                imageReaderStream,
                chunkLayout,
                StructureType.FileLayout,
                new FileLayoutSerializer(),
                0, "The first chunk must contain the file layout");

            Chunk <Metadata> metadata = await ReadDataChunkAsync(
                imageReaderStream,
                chunkLayout,
                StructureType.Metadata,
                new MetadataSerializer(),
                1, "The second chunk must contain metadata");

            return(new DataInfo(chunkLayout, fileLayout.Body, metadata.Body));
        }
Ejemplo n.º 4
0
 protected virtual long CalculateTotalLength(byte[] chunkLayoutBytes, ChunkLayout chunkLayout)
 {
     return(HeaderBytes.LongLength + chunkLayoutBytes.LongLength + chunkLayout.TotalProcessedLength);
 }
Ejemplo n.º 5
0
 public DataInfo(ChunkLayout chunkLayout, FileLayout fileLayout, Metadata metadata)
 {
     _chunkLayout = chunkLayout;
     _fileLayout  = fileLayout;
     _metadata    = metadata;
 }