1 // 2 // Copyright (c) 2010-2018 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 Antmicro.Renode.Core.Structure; 9 using System.Collections.Generic; 10 using System.Linq; 11 using System; 12 using Antmicro.Migrant; 13 using Antmicro.Renode.Peripherals; 14 using Antmicro.Renode.Exceptions; 15 using Antmicro.Renode.UserInterface; 16 17 namespace Antmicro.Renode.Core 18 { 19 [Icon("comp")] 20 [ControllerMask(typeof(IExternal))] 21 public class HostMachine : IExternal, IHasChildren<IHostMachineElement>, IDisposable 22 { HostMachine()23 public HostMachine() 24 { 25 hostEmulationElements = new Dictionary<string, IHostMachineElement>(); 26 } 27 AddHostMachineElement(IHostMachineElement element, string name)28 public void AddHostMachineElement(IHostMachineElement element, string name) 29 { 30 if(hostEmulationElements.ContainsKey(name)) 31 { 32 throw new RecoverableException("Element with the same name already exists"); 33 } 34 35 hostEmulationElements.Add(name, element); 36 37 var elementAsIHasOwnLife = element as IHasOwnLife; 38 if(elementAsIHasOwnLife != null) 39 { 40 EmulationManager.Instance.CurrentEmulation.ExternalsManager.RegisterIHasOwnLife(elementAsIHasOwnLife); 41 } 42 43 var cc = ContentChanged; 44 if(cc != null) 45 { 46 cc(); 47 } 48 } 49 RemoveHostMachineElement(string name)50 public void RemoveHostMachineElement(string name) 51 { 52 RemoveHostMachineElement(hostEmulationElements[name]); 53 } 54 RemoveHostMachineElement(IHostMachineElement element)55 public void RemoveHostMachineElement(IHostMachineElement element) 56 { 57 var elementAsIHasOwnLife = element as IHasOwnLife; 58 if(elementAsIHasOwnLife != null) 59 { 60 EmulationManager.Instance.CurrentEmulation.ExternalsManager.UnregisterIHasOwnLife(elementAsIHasOwnLife); 61 } 62 63 var key = hostEmulationElements.SingleOrDefault(x => x.Value == element).Key; 64 hostEmulationElements.Remove(key); 65 66 var cc = ContentChanged; 67 if(cc != null) 68 { 69 cc(); 70 } 71 72 } 73 GetNames()74 public IEnumerable<string> GetNames() 75 { 76 return hostEmulationElements.Keys; 77 } 78 TryGetByName(string name, out bool success)79 public IHostMachineElement TryGetByName(string name, out bool success) 80 { 81 IHostMachineElement value; 82 success = hostEmulationElements.TryGetValue(name, out value); 83 return value; 84 } 85 TryGetName(IHostMachineElement element, out string name)86 public bool TryGetName(IHostMachineElement element, out string name) 87 { 88 var pair = hostEmulationElements.SingleOrDefault(x => x.Value == element); 89 if(pair.Value == element) 90 { 91 name = pair.Key; 92 return true; 93 } 94 95 name = null; 96 return false; 97 } 98 99 #region IDisposable implementation 100 Dispose()101 public void Dispose() 102 { 103 foreach(var element in hostEmulationElements) 104 { 105 var disposable = element.Value as IDisposable; 106 if(disposable != null) 107 { 108 disposable.Dispose(); 109 } 110 } 111 } 112 113 #endregion 114 115 [field: Transient] 116 public event Action ContentChanged; 117 118 private readonly Dictionary<string, IHostMachineElement> hostEmulationElements; 119 120 public const string HostMachineName = "host"; 121 } 122 } 123 124