182 lines
5.8 KiB
C#
182 lines
5.8 KiB
C#
|
//-----------------------------------------------------------------------------
|
||
|
// 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<MappableLocation> 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<MappableLocation> SerializedMappableLocations
|
||
|
{
|
||
|
get { return this.mappableLocations; }
|
||
|
set { this.mappableLocations = value; }
|
||
|
}
|
||
|
|
||
|
public IDictionary<string, LocationInfo> GatherMappableVariables()
|
||
|
{
|
||
|
Dictionary<string, LocationInfo> result = null;
|
||
|
if (this.mappableLocations != null && this.mappableLocations.Count > 0)
|
||
|
{
|
||
|
result = new Dictionary<string, LocationInfo>(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<MappableLocation>();
|
||
|
}
|
||
|
|
||
|
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; }
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|