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