1 // 2 // Copyright (c) 2010-2024 Antmicro 3 // Copyright (c) 2011-2015 Realtime Embedded 4 // 5 // This file is licensed under the MIT License. 6 // Full license text is available in 'licenses/MIT.txt'. 7 // 8 using System; 9 using Antmicro.Migrant; 10 using System.Collections.Generic; 11 using System.IO; 12 13 namespace Antmicro.Renode.Utilities 14 { 15 public class BlobManager 16 { BlobManager()17 public BlobManager() 18 { 19 providers = new List<IBlobProvider>(); 20 } 21 Load(Stream stream, string streamName)22 public void Load(Stream stream, string streamName) 23 { 24 using (var reader = new PrimitiveReader(stream, false)) 25 { 26 foreach(var provider in providers) 27 { 28 var tempFile = TemporaryFilesManager.Instance.GetTemporaryFile(); 29 if(ConfigurationManager.Instance.Get("file-system", "use-cow", false)) 30 { 31 FileCopier.Copy(streamName, tempFile, true); 32 33 var size = reader.ReadInt64(); 34 var localPosition = stream.Position; 35 reader.ReadBytes((int)size); 36 provider.BlobIsReady(tempFile, localPosition, size); 37 } 38 else 39 { 40 var size = reader.ReadInt64(); 41 using(var fileStream = new FileStream(tempFile, FileMode.OpenOrCreate)) 42 { 43 reader.CopyTo(fileStream, size); 44 } 45 provider.BlobIsReady(tempFile, 0, size); 46 } 47 } 48 } 49 } 50 Register(IBlobProvider provider)51 public void Register(IBlobProvider provider) 52 { 53 providers.Add(provider); 54 } 55 Save(Stream stream)56 public void Save(Stream stream) 57 { 58 using(var writer = new PrimitiveWriter(stream, false)) 59 { 60 foreach(var provider in providers) 61 { 62 var descriptor = provider.GetBlobDescriptor(); 63 writer.Write(descriptor.Size); 64 writer.CopyFrom(descriptor.Stream, descriptor.Size); 65 } 66 } 67 } 68 69 [Constructor] 70 private readonly List<IBlobProvider> providers; 71 } 72 } 73 74