ContextHookAttribute.cs 4.7 KB

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