Merge pull request #2034 from alexrp/ctx-cleanup
[mono.git] / mcs / class / System.Runtime.Remoting / Test / ContextHookAttribute.cs
1 //\r
2 // MonoTests.Remoting.ContextHookAttribute.cs\r
3 //\r
4 // Author: Lluis Sanchez Gual (lluis@ximian.com)\r
5 //\r
6 // 2003 (C) Copyright, Ximian, Inc.\r
7 //\r
8 \r
9 using System;\r
10 using System.Runtime.Remoting.Contexts;\r
11 using System.Runtime.Remoting.Activation;\r
12 using System.Runtime.Remoting.Messaging;\r
13 using System.Runtime.Remoting.Proxies;\r
14 using System.Runtime.Remoting;\r
15 using System.Threading;\r
16 \r
17 namespace MonoTests.Remoting\r
18 {\r
19         [Serializable,AttributeUsage(AttributeTargets.Class)]\r
20         public class ContextHookAttribute: Attribute, IContextAttribute, IContextProperty, IContributeObjectSink, IContributeServerContextSink, IContributeEnvoySink, IContributeClientContextSink\r
21         {\r
22                 bool newContext = false;\r
23 \r
24                 string id = "";\r
25                 public ContextHookAttribute()\r
26                 {\r
27                 }\r
28 \r
29                 public ContextHookAttribute(string idp, bool newContext)\r
30                 {\r
31                         id = idp;\r
32                         if (id != "") id += ".";\r
33                         id += "d" + CallSeq.CommonDomainId;\r
34                         this.newContext = newContext;\r
35                 }\r
36 \r
37                 public override object TypeId\r
38                 {\r
39 \r
40                         get { return "ContextHook"; }\r
41                 }\r
42 \r
43                 bool IContextAttribute.IsContextOK(Context ctx, IConstructionCallMessage ctor)\r
44                 {\r
45                         CallSeq.Add("ContextHookAttribute(" + id + ").IsContextOK");\r
46                         return !newContext;\r
47                 }\r
48 \r
49                 public bool IsNewContextOK(Context ctx)\r
50                 {\r
51                         CallSeq.Add("ContextHookAttribute(" + id + ").IsNewContextOK");\r
52                         return true;\r
53                 }\r
54 \r
55                 public void Freeze(Context ctx)\r
56                 {\r
57                         CallSeq.Add("ContextHookAttribute(" + id + ").Freeze");\r
58                 }\r
59 \r
60                 public String Name\r
61                 {\r
62                         get { return "ContextHook(" + id + ")"; }\r
63                 }\r
64         \r
65 \r
66                 void IContextAttribute.GetPropertiesForNewContext(IConstructionCallMessage ctor)\r
67                 {\r
68                         CallSeq.Add("IContextAttribute(" + id + ").GetPropertiesForNewContext");\r
69                         ctor.ContextProperties.Add(this);\r
70                 }       \r
71 \r
72                 IMessageSink IContributeObjectSink.GetObjectSink(MarshalByRefObject o, IMessageSink next)\r
73                 {\r
74                         CallSeq.Add("IContributeObjectSink(" + id + ").GetObjectSink");\r
75                         return new GenericMessageSink(o,next,"ObjectSink(" + id + ")");\r
76                 }\r
77                 \r
78                 IMessageSink IContributeServerContextSink.GetServerContextSink(IMessageSink next)\r
79                 {\r
80                         CallSeq.Add("IContributeServerContextSink(" + id + ").GetServerContextSink");\r
81                         return new GenericMessageSink(null,next,"ServerContextSink(" + id + ")");\r
82                 }\r
83 \r
84                 IMessageSink IContributeEnvoySink.GetEnvoySink(MarshalByRefObject obj, IMessageSink nextSink)\r
85                 {\r
86                         CallSeq.Add("IContributeEnvoySink(" + id + ").GetEnvoySink");\r
87                         return new GenericMessageSink(obj,nextSink,"EnvoySink(" + id + ")");\r
88                 }\r
89 \r
90                 IMessageSink IContributeClientContextSink.GetClientContextSink (IMessageSink nextSink )\r
91                 {\r
92                         CallSeq.Add("IContributeClientContextSink(" + id + ").GetClientContextSink");\r
93                         return new GenericMessageSink(null,nextSink,"ClientContextSink(" + id + ")");\r
94                 }\r
95         }\r
96 \r
97         [Serializable]\r
98         class GenericMessageSink: IMessageSink\r
99         {\r
100                 IMessageSink _next;\r
101                 string _type;\r
102 \r
103                 public GenericMessageSink(MarshalByRefObject obj, IMessageSink nextSink, string type)\r
104                 {\r
105                         _type = type;\r
106                         _next = nextSink;\r
107                 }\r
108 \r
109                 public IMessageSink NextSink \r
110                 {       \r
111                         get { return _next; }\r
112                 }\r
113 \r
114                 public IMessage SyncProcessMessage(IMessage imCall)\r
115                 {\r
116                         CallSeq.Add("--> " + _type + " SyncProcessMessage " + imCall.Properties["__MethodName"]);\r
117                         IMessage ret = _next.SyncProcessMessage(imCall);\r
118                         CallSeq.Add("<-- " + _type + " SyncProcessMessage " + imCall.Properties["__MethodName"]);\r
119                         return ret;\r
120                 }\r
121 \r
122                 public IMessageCtrl AsyncProcessMessage(IMessage im, IMessageSink ims)\r
123                 {\r
124                         CallSeq.Add("--> " + _type + " AsyncProcessMessage " + im.Properties["__MethodName"]);\r
125                         IMessageCtrl ret = _next.AsyncProcessMessage(im, ims);\r
126                         CallSeq.Add("<-- " + _type + " AsyncProcessMessage " + im.Properties["__MethodName"]);\r
127                         return ret;\r
128                 }\r
129         }\r
130 \r
131         [Serializable]\r
132         class GenericDynamicSink: IDynamicMessageSink\r
133         {\r
134                 string _name;\r
135                 \r
136                 public GenericDynamicSink (string name)\r
137                 {\r
138                         _name = name;\r
139                 }\r
140 \r
141                 void IDynamicMessageSink.ProcessMessageFinish(IMessage replyMsg, bool bCliSide, bool bAsync)\r
142                 {\r
143                         CallSeq.Add("<-> " + _name + " DynamicSink Finish " + replyMsg.Properties["__MethodName"] + " client:" + bCliSide);\r
144                 }\r
145 \r
146                 void IDynamicMessageSink.ProcessMessageStart(IMessage replyMsg, bool bCliSide, bool bAsync)\r
147                 {\r
148                         CallSeq.Add("<-> " + _name + " DynamicSink Start " + replyMsg.Properties["__MethodName"] + " client:" + bCliSide);\r
149                 }\r
150         }\r
151 \r
152         public class DynProperty: IDynamicProperty, IContributeDynamicSink\r
153         {\r
154                 string _name;\r
155                 public DynProperty (string name)\r
156                 {\r
157                         _name = name;\r
158                 }\r
159 \r
160                 public string Name\r
161                 {\r
162                         get { return _name; }\r
163                 }\r
164 \r
165                 public IDynamicMessageSink GetDynamicSink()\r
166                 {\r
167                         CallSeq.Add("IContributeDynamicSink(" + _name + ").GetDynamicSink");\r
168                         return new GenericDynamicSink(_name);\r
169                 }\r
170         }\r
171 }\r