implement HostServices, not sure if we're going to use it though.
authorAtsushi Eno <atsushieno@veritas-vos-liberabit.com>
Fri, 15 Nov 2013 17:15:06 +0000 (02:15 +0900)
committerAtsushi Eno <atsushieno@veritas-vos-liberabit.com>
Tue, 3 Dec 2013 07:51:35 +0000 (16:51 +0900)
mcs/class/Microsoft.Build/Microsoft.Build.Execution/HostServices.cs

index 2389bdf3309cb3440e875d4e7f59ad16d212c48f..e68755affeea6e50762384b827eb0871189e8c10 100644 (file)
 // 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);
+               }
+       }
 }