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