Exemplo n.º 1
0
 protected virtual async Task WriteChunkData(Stream imageStream, ChunkLayoutBuilder chunkLayoutBuilder)
 {
     foreach (KeyValuePair <ChunkInfo, Stream> chunkData in await chunkLayoutBuilder.LoadChunksAsync())
     {
         Stream dataStream = chunkData.Value;
         dataStream.Position = 0;
         await dataStream.CopyToAsync(imageStream, EncodingConfiguration.BufferSize);
     }
 }
Exemplo n.º 2
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());
        }
Exemplo n.º 3
0
        protected override async Task WriteBodyData(Stream imageStream, byte[] chunkLayoutBytes, ChunkLayoutBuilder chunkLayoutBuilder)
        {
            await imageStream.WriteAsync(chunkLayoutBytes, 0, chunkLayoutBytes.Length);

            await WriteChunkData(imageStream, chunkLayoutBuilder);

            var pixelStorageStream = imageStream as PixelStorageWriterStream;

            if (pixelStorageStream != null)
            {
                await WriteEmbeddedImagePaddingAsync(pixelStorageStream);
            }
            else
            {
                await new IsoPadding(EncodingConfiguration.BufferSize).PadDataAsync(imageStream);
            }
        }
Exemplo n.º 4
0
        protected virtual async Task WriteBodyData(Stream imageStream, byte[] chunkLayoutBytes, ChunkLayoutBuilder chunkLayoutBuilder)
        {
            await imageStream.WriteAsync(chunkLayoutBytes, 0, chunkLayoutBytes.Length);

            await WriteChunkData(imageStream, chunkLayoutBuilder);

            await WritePaddingAsync(imageStream);
        }