summaryrefslogtreecommitdiff
path: root/mcs/class/Microsoft.Build/Microsoft.Build.Execution/HostServices.cs
diff options
context:
space:
mode:
Diffstat (limited to 'mcs/class/Microsoft.Build/Microsoft.Build.Execution/HostServices.cs')
-rw-r--r--mcs/class/Microsoft.Build/Microsoft.Build.Execution/HostServices.cs109
1 files changed, 81 insertions, 28 deletions
diff --git a/mcs/class/Microsoft.Build/Microsoft.Build.Execution/HostServices.cs b/mcs/class/Microsoft.Build/Microsoft.Build.Execution/HostServices.cs
index 2389bdf330..e68755affe 100644
--- a/mcs/class/Microsoft.Build/Microsoft.Build.Execution/HostServices.cs
+++ b/mcs/class/Microsoft.Build/Microsoft.Build.Execution/HostServices.cs
@@ -26,42 +26,95 @@
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
-using Microsoft.Build.Framework;
using System;
+using System.Collections.Generic;
+using System.Linq;
+using Microsoft.Build.Framework;
namespace Microsoft.Build.Execution
{
- public class HostServices
- {
- public ITaskHost GetHostObject (string projectFile, string targetName, string taskName)
- {
- throw new NotImplementedException ();
- }
+ public class HostServices
+ {
+ class HostObjectRegistration
+ {
+ public string ProjectFile { get; set; }
+ public string TargetName { get; set; }
+ public string TaskName { get; set; }
+ public ITaskHost HostObject { get; set; }
+ }
+
+ readonly List<HostObjectRegistration> hosts = new List<HostObjectRegistration> ();
+ readonly Dictionary<string,NodeAffinity> node_affinities = new Dictionary<string, NodeAffinity> ();
+
+ HostObjectRegistration GetHostRegistration (string projectFile, string targetName, string taskName)
+ {
+ if (projectFile == null)
+ throw new ArgumentNullException ("projectFile");
+ if (targetName == null)
+ throw new ArgumentNullException ("targetName");
+ if (taskName == null)
+ throw new ArgumentNullException ("taskName");
+ return hosts.FirstOrDefault (h =>
+ string.Equals (projectFile, h.ProjectFile, StringComparison.OrdinalIgnoreCase) &&
+ string.Equals (targetName, h.TargetName, StringComparison.OrdinalIgnoreCase) &&
+ string.Equals (taskName, h.TaskName, StringComparison.OrdinalIgnoreCase));
+ }
+
+ public ITaskHost GetHostObject (string projectFile, string targetName, string taskName)
+ {
+ var reg = GetHostRegistration (projectFile, targetName, taskName);
+ return reg != null ? reg.HostObject : null;
+ }
- public NodeAffinity GetNodeAffinity (string projectFile)
- {
- throw new NotImplementedException ();
- }
+ public NodeAffinity GetNodeAffinity (string projectFile)
+ {
+ if (projectFile == null)
+ throw new ArgumentNullException ("projectFile");
+ NodeAffinity na;
+ return node_affinities.TryGetValue (projectFile, out na) ? na : NodeAffinity.Any;
+ }
+
+ IEnumerable<HostObjectRegistration> GetRegistrationsByProject (string project)
+ {
+ return hosts.Where (h => string.Equals (project, h.ProjectFile, StringComparison.OrdinalIgnoreCase));
+ }
- public void OnRenameProject (string oldFullPath, string newFullPath)
- {
- throw new NotImplementedException ();
- }
+ public void OnRenameProject (string oldFullPath, string newFullPath)
+ {
+ if (oldFullPath == null)
+ throw new ArgumentNullException ("oldFullPath");
+ if (newFullPath == null)
+ throw new ArgumentNullException ("newFullPath");
+ foreach (var reg in GetRegistrationsByProject (oldFullPath))
+ reg.ProjectFile = newFullPath;
+ }
- public void RegisterHostObject (string projectFile, string targetName, string taskName, ITaskHost hostObject)
- {
- throw new NotImplementedException ();
- }
+ public void RegisterHostObject (string projectFile, string targetName, string taskName, ITaskHost hostObject)
+ {
+ if (hostObject == null)
+ throw new ArgumentNullException ("hostObject");
+ var reg = GetHostRegistration (projectFile, targetName, taskName);
+ if (reg != null)
+ reg.HostObject = hostObject;
+ else
+ hosts.Add (new HostObjectRegistration () { ProjectFile = projectFile, TargetName = targetName, TaskName = taskName, HostObject = hostObject });
+ }
- public void SetNodeAffinity (string projectFile, NodeAffinity nodeAffinity)
- {
- throw new NotImplementedException ();
- }
+ public void SetNodeAffinity (string projectFile, NodeAffinity nodeAffinity)
+ {
+ if (projectFile == null)
+ throw new ArgumentNullException ("projectFile");
+ node_affinities [projectFile] = nodeAffinity;
+ }
- public void UnregisterProject (string projectFullPath)
- {
- throw new NotImplementedException ();
- }
- }
+ public void UnregisterProject (string projectFullPath)
+ {
+ if (projectFullPath == null)
+ throw new ArgumentNullException ("projectFullPath");
+ var removed = GetRegistrationsByProject (projectFullPath).ToArray ();
+ foreach (var r in removed)
+ hosts.Remove (r);
+ }
+ }
}