1 // Copyright (c) Microsoft Corp., 2004. All rights reserved. 2 #region Using directives 3 4 using System; 5 using System.Workflow.Runtime; 6 using System.Collections.Generic; 7 using System.Workflow.ComponentModel; 8 using System.Workflow.ComponentModel.Design; 9 10 #endregion 11 12 namespace System.Workflow.Runtime.DebugEngine 13 { 14 // 15 // IMPORTANT: Do not edit this file without consulting Break Safe Synchronization.doc! 16 // 17 18 #region interface IInstanceTable 19 20 [Obsolete("The System.Workflow.* types are deprecated. Instead, please use the new types from System.Activities.*")] 21 public interface IInstanceTable 22 { GetActivity(string instanceId, string activityName)23 Activity GetActivity(string instanceId, string activityName); 24 } 25 26 #endregion 27 28 #region Class InstanceData 29 30 internal sealed class InstanceData : ICloneable 31 { 32 Activity rootActivity; 33 34 public Activity RootActivity 35 { 36 get 37 { 38 return this.rootActivity; 39 } 40 set 41 { 42 this.rootActivity = value; 43 } 44 } 45 InstanceData(Activity rootActivity)46 public InstanceData(Activity rootActivity) 47 { 48 this.rootActivity = rootActivity; 49 } 50 ICloneable.Clone()51 object ICloneable.Clone() 52 { 53 InstanceData instanceData = new InstanceData(this.rootActivity); 54 return instanceData; 55 } 56 } 57 58 internal sealed class InstanceMap : Dictionary<Guid, InstanceData>, ICloneable 59 { ICloneable.Clone()60 object ICloneable.Clone() 61 { 62 InstanceMap data = new InstanceMap(); 63 foreach (Guid instsanceId in Keys) 64 data.Add(instsanceId, (InstanceData)(((ICloneable)(this[instsanceId])).Clone())); 65 66 return data; 67 } 68 } 69 70 #endregion 71 72 #region Class InstanceTable 73 74 internal sealed class InstanceTable : BreakSafeBase<InstanceMap>, IInstanceTable 75 { InstanceTable(int controllerManagedThreadId)76 public InstanceTable(int controllerManagedThreadId) 77 : base(controllerManagedThreadId) 78 { } 79 80 // Controller invoked. AddInstance(Guid instanceId, Activity rootActivity)81 public void AddInstance(Guid instanceId, Activity rootActivity) 82 { 83 try 84 { 85 Lock(); 86 87 InstanceMap instanceMap = GetWriterData(); 88 instanceMap[instanceId] = new InstanceData(rootActivity); 89 SaveData(instanceMap); 90 } 91 finally 92 { 93 Unlock(); 94 } 95 } 96 97 // Controller invoked. RemoveInstance(Guid instanceId)98 public void RemoveInstance(Guid instanceId) 99 { 100 try 101 { 102 Lock(); 103 104 InstanceMap instanceMap = GetWriterData(); 105 instanceMap.Remove(instanceId); 106 SaveData(instanceMap); 107 } 108 finally 109 { 110 Unlock(); 111 } 112 } 113 114 // Controller invoked during Dynamic Update notification subscription changes. GetRootActivity(Guid instanceId)115 public Activity GetRootActivity(Guid instanceId) 116 { 117 try 118 { 119 Lock(); 120 121 return GetReaderData()[instanceId].RootActivity; 122 } 123 finally 124 { 125 Unlock(); 126 } 127 } 128 129 // Controller invoked during Dynamic Update notification subscription changes. UpdateRootActivity(Guid instanceId, Activity rootActivity)130 public void UpdateRootActivity(Guid instanceId, Activity rootActivity) 131 { 132 try 133 { 134 Lock(); 135 136 InstanceMap instanceMap = GetWriterData(); 137 instanceMap[instanceId].RootActivity = rootActivity; 138 SaveData(instanceMap); 139 } 140 finally 141 { 142 Unlock(); 143 } 144 } 145 146 // DE invoked for watches through expression evaluation. IInstanceTable.GetActivity(string instanceId, string activityQualifiedName)147 Activity IInstanceTable.GetActivity(string instanceId, string activityQualifiedName) 148 { 149 try 150 { 151 Lock(); 152 153 154 Activity rootActivity = GetReaderData()[new Guid(instanceId)].RootActivity; 155 return DebuggerHelpers.ParseActivity(rootActivity, activityQualifiedName); 156 } 157 finally 158 { 159 Unlock(); 160 } 161 } 162 } 163 164 #endregion 165 } 166