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