1 //
2 // Copyright (c) 2010-2023 Antmicro
3 //
4 // This file is licensed under the MIT License.
5 // Full license text is available in 'licenses/MIT.txt'.
6 //
7 using System.Collections.Generic;
8 using System.IO;
9 using System.Linq;
10 using Antmicro.Renode.Core;
11 using Antmicro.Renode.UserInterface;
12 
13 namespace Antmicro.Renode.PlatformDescription.UserInterface
14 {
15     public static class PlatformDescriptionMachineExtensions
16     {
LoadPlatformDescription(this Machine machine, string platformDescriptionFile)17         public static void LoadPlatformDescription(this Machine machine, string platformDescriptionFile)
18         {
19             PrepareDriver(machine).ProcessFile(platformDescriptionFile);
20         }
21 
LoadPlatformDescriptionFromString(this Machine machine, string platformDescription)22         public static void LoadPlatformDescriptionFromString(this Machine machine, string platformDescription)
23         {
24             PrepareDriver(machine).ProcessDescription(platformDescription);
25         }
26 
27         public class UsingResolver : IUsingResolver
28         {
UsingResolver(IEnumerable<string> pathPrefixes)29             public UsingResolver(IEnumerable<string> pathPrefixes)
30             {
31                 this.pathPrefixes = pathPrefixes;
32             }
33 
Resolve(string argument, string includingFile)34             public string Resolve(string argument, string includingFile)
35             {
36                 // Handle absolute paths
37                 if(Path.IsPathRooted(argument))
38                 {
39                     return Path.GetFullPath(argument); // No existence check, but resolve "a/../b" and the like
40                 }
41 
42                 // Handle relative paths
43                 var components = argument.Split(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
44                 var firstComponent = components.FirstOrDefault();
45                 if(firstComponent == "." || firstComponent == "..")
46                 {
47                     var includingFileDirectory = Path.GetDirectoryName(includingFile);
48                     var relativePath = Path.Combine(includingFileDirectory, argument);
49                     return Path.GetFullPath(relativePath); // No existence check, the path was resolved
50                 }
51 
52                 foreach (var prefix in pathPrefixes)
53                 {
54                     var fullPath = Path.GetFullPath(Path.Combine(prefix, argument));
55                     if(File.Exists(fullPath))
56                     {
57                         return fullPath;
58                     }
59                 }
60                 return null;
61             }
62 
63             private readonly IEnumerable<string> pathPrefixes;
64         }
65 
PrepareDriver(Machine machine)66         private static CreationDriver PrepareDriver(Machine machine)
67         {
68             var monitor = ObjectCreator.Instance.GetSurrogate<Monitor>();
69             var usingResolver = new UsingResolver(monitor.CurrentPathPrefixes);
70             var monitorInitHandler = new MonitorInitHandler(machine, monitor);
71             var driver = new CreationDriver(machine, usingResolver, monitorInitHandler);
72             return driver;
73         }
74     }
75 }
76