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