//----------------------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.Activities.Runtime { using System.Activities.Hosting; using System.Collections.Generic; using System.Globalization; using System.Runtime; using System.Runtime.Serialization; using System.Xml.Linq; [DataContract] class MappableObjectManager { List mappableLocations; public MappableObjectManager() { } public int Count { get { int result = 0; if (this.mappableLocations != null) { result += this.mappableLocations.Count; } return result; } } [DataMember(EmitDefaultValue = false, Name = "mappableLocations")] internal List SerializedMappableLocations { get { return this.mappableLocations; } set { this.mappableLocations = value; } } public IDictionary GatherMappableVariables() { Dictionary result = null; if (this.mappableLocations != null && this.mappableLocations.Count > 0) { result = new Dictionary(this.mappableLocations.Count); for (int locationIndex = 0; locationIndex < this.mappableLocations.Count; locationIndex++) { MappableLocation mappableLocation = this.mappableLocations[locationIndex]; result.Add(mappableLocation.MappingKeyName, new LocationInfo(mappableLocation.Name, mappableLocation.OwnerDisplayName, mappableLocation.Location.Value)); } } return result; } public void Register(Location location, Activity activity, LocationReference locationOwner, ActivityInstance activityInstance) { Fx.Assert(location.CanBeMapped, "should only register mappable locations"); if (this.mappableLocations == null) { this.mappableLocations = new List(); } this.mappableLocations.Add(new MappableLocation(locationOwner, activity, activityInstance, location)); } public void Unregister(Location location) { Fx.Assert(location.CanBeMapped, "should only register mappable locations"); int mappedLocationsCount = this.mappableLocations.Count; for (int i = 0; i < mappedLocationsCount; i++) { if (object.ReferenceEquals(this.mappableLocations[i].Location, location)) { this.mappableLocations.RemoveAt(i); break; } } Fx.Assert(this.mappableLocations.Count == mappedLocationsCount - 1, "can only unregister locations that have been registered"); } [DataContract] internal class MappableLocation { string mappingKeyName; string name; string ownerDisplayName; Location location; public MappableLocation(LocationReference locationOwner, Activity activity, ActivityInstance activityInstance, Location location) { this.Name = locationOwner.Name; this.OwnerDisplayName = activity.DisplayName; this.Location = location; this.MappingKeyName = string.Format(CultureInfo.InvariantCulture, "activity.{0}-{1}_{2}", activity.Id, locationOwner.Id, activityInstance.Id); } internal string MappingKeyName { get { return this.mappingKeyName; } private set { this.mappingKeyName = value; } } public string Name { get { return this.name; } private set { this.name = value; } } public string OwnerDisplayName { get { return this.ownerDisplayName; } private set { this.ownerDisplayName = value; } } internal Location Location { get { return this.location; } private set { this.location = value; } } [DataMember(Name = "MappingKeyName")] internal string SerializedMappingKeyName { get { return this.MappingKeyName; } set { this.MappingKeyName = value; } } [DataMember(Name = "Name")] internal string SerializedName { get { return this.Name; } set { this.Name = value; } } [DataMember(EmitDefaultValue = false, Name = "OwnerDisplayName")] internal string SerializedOwnerDisplayName { get { return this.OwnerDisplayName; } set { this.OwnerDisplayName = value; } } [DataMember(Name = "Location")] internal Location SerializedLocation { get { return this.Location; } set { this.Location = value; } } } } }