2 // MonoTests.Remoting.ContextHookAttribute.cs
\r
4 // Author: Lluis Sanchez Gual (lluis@ximian.com)
\r
6 // 2003 (C) Copyright, Ximian, Inc.
\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
17 namespace MonoTests.Remoting
\r
19 [Serializable,AttributeUsage(AttributeTargets.Class)]
\r
20 public class ContextHookAttribute: Attribute, IContextAttribute, IContextProperty, IContributeObjectSink, IContributeServerContextSink, IContributeEnvoySink, IContributeClientContextSink
\r
22 bool newContext = false;
\r
25 public ContextHookAttribute()
\r
29 public ContextHookAttribute(string idp, bool newContext)
\r
32 if (id != "") id += ".";
\r
33 id += "d" + CallSeq.CommonDomainId;
\r
34 this.newContext = newContext;
\r
37 public override object TypeId
\r
40 get { return "ContextHook"; }
\r
43 bool IContextAttribute.IsContextOK(Context ctx, IConstructionCallMessage ctor)
\r
45 CallSeq.Add("ContextHookAttribute(" + id + ").IsContextOK");
\r
49 public bool IsNewContextOK(Context ctx)
\r
51 CallSeq.Add("ContextHookAttribute(" + id + ").IsNewContextOK");
\r
55 public void Freeze(Context ctx)
\r
57 CallSeq.Add("ContextHookAttribute(" + id + ").Freeze");
\r
62 get { return "ContextHook(" + id + ")"; }
\r
66 void IContextAttribute.GetPropertiesForNewContext(IConstructionCallMessage ctor)
\r
68 CallSeq.Add("IContextAttribute(" + id + ").GetPropertiesForNewContext");
\r
69 ctor.ContextProperties.Add(this);
\r
72 IMessageSink IContributeObjectSink.GetObjectSink(MarshalByRefObject o, IMessageSink next)
\r
74 CallSeq.Add("IContributeObjectSink(" + id + ").GetObjectSink");
\r
75 return new GenericMessageSink(o,next,"ObjectSink(" + id + ")");
\r
78 IMessageSink IContributeServerContextSink.GetServerContextSink(IMessageSink next)
\r
80 CallSeq.Add("IContributeServerContextSink(" + id + ").GetServerContextSink");
\r
81 return new GenericMessageSink(null,next,"ServerContextSink(" + id + ")");
\r
84 IMessageSink IContributeEnvoySink.GetEnvoySink(MarshalByRefObject obj, IMessageSink nextSink)
\r
86 CallSeq.Add("IContributeEnvoySink(" + id + ").GetEnvoySink");
\r
87 return new GenericMessageSink(obj,nextSink,"EnvoySink(" + id + ")");
\r
90 IMessageSink IContributeClientContextSink.GetClientContextSink (IMessageSink nextSink )
\r
92 CallSeq.Add("IContributeClientContextSink(" + id + ").GetClientContextSink");
\r
93 return new GenericMessageSink(null,nextSink,"ClientContextSink(" + id + ")");
\r
98 class GenericMessageSink: IMessageSink
\r
100 IMessageSink _next;
\r
103 public GenericMessageSink(MarshalByRefObject obj, IMessageSink nextSink, string type)
\r
109 public IMessageSink NextSink
\r
111 get { return _next; }
\r
114 public IMessage SyncProcessMessage(IMessage imCall)
\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
122 public IMessageCtrl AsyncProcessMessage(IMessage im, IMessageSink ims)
\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
132 class GenericDynamicSink: IDynamicMessageSink
\r
136 public GenericDynamicSink (string name)
\r
141 void IDynamicMessageSink.ProcessMessageFinish(IMessage replyMsg, bool bCliSide, bool bAsync)
\r
143 CallSeq.Add("<-> " + _name + " DynamicSink Finish " + replyMsg.Properties["__MethodName"] + " client:" + bCliSide);
\r
146 void IDynamicMessageSink.ProcessMessageStart(IMessage replyMsg, bool bCliSide, bool bAsync)
\r
148 CallSeq.Add("<-> " + _name + " DynamicSink Start " + replyMsg.Properties["__MethodName"] + " client:" + bCliSide);
\r
152 public class DynProperty: IDynamicProperty, IContributeDynamicSink
\r
155 public DynProperty (string name)
\r
162 get { return _name; }
\r
165 public IDynamicMessageSink GetDynamicSink()
\r
167 CallSeq.Add("IContributeDynamicSink(" + _name + ").GetDynamicSink");
\r
168 return new GenericDynamicSink(_name);
\r