X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem.Runtime.Remoting.Messaging%2FMonoMethodMessage.cs;h=3b324d1eab7076389642e0a1776b0343f9366ada;hb=22448831bbcc3d170f80ae5e3cc02fccd39ff970;hp=1f677e168a12b49ad5a9c06b1083acd3019d4238;hpb=a07c9658be361c8908e3d9007d3a5b7e3a540dd3;p=mono.git diff --git a/mcs/class/corlib/System.Runtime.Remoting.Messaging/MonoMethodMessage.cs b/mcs/class/corlib/System.Runtime.Remoting.Messaging/MonoMethodMessage.cs index 1f677e168a1..3b324d1eab7 100644 --- a/mcs/class/corlib/System.Runtime.Remoting.Messaging/MonoMethodMessage.cs +++ b/mcs/class/corlib/System.Runtime.Remoting.Messaging/MonoMethodMessage.cs @@ -8,36 +8,66 @@ // (C) Ximian, Inc. http://www.ximian.com // +// +// Copyright (C) 2004 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + using System; using System.Collections; using System.Reflection; using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; namespace System.Runtime.Remoting.Messaging { [Serializable] - public class MonoMethodMessage : IMethodCallMessage, IMethodReturnMessage { + [StructLayout (LayoutKind.Sequential)] + internal class MonoMethodMessage : IMethodCallMessage, IMethodReturnMessage, IInternalMessage { +#pragma warning disable 649 + #region keep in sync with MonoMessage in object-internals.h MonoMethod method; - object [] args; - string [] names; - - byte [] arg_types; /* 1 == IN; 2 == OUT ; 3 = INOUT */ - + byte [] arg_types; /* 1 == IN; 2 == OUT; 3 == INOUT; 4 == COPY OUT */ public LogicalCallContext ctx; - public object rval; - public Exception exc; + AsyncResult asyncResult; + CallType call_type; + #endregion +#pragma warning restore 649 string uri; - InternalDictionary properties; + MCMDictionary properties; Type[] methodSignature; + Identity identity; + + internal static String CallContextKey = "__CallContext"; + internal static String UriKey = "__Uri"; + [MethodImplAttribute(MethodImplOptions.InternalCall)] internal extern void InitMessage (MonoMethod method, object [] out_args); @@ -64,13 +94,16 @@ namespace System.Runtime.Remoting.Messaging { public IDictionary Properties { get { - if (properties == null) properties = new InternalDictionary (this); + if (properties == null) properties = new MCMDictionary (this); return properties; } } public int ArgCount { get { + if (CallType == CallType.EndInvoke) + return -1; + if (null == args) return 0; @@ -94,6 +127,10 @@ namespace System.Runtime.Remoting.Messaging { get { return ctx; } + + set { + ctx = value; + } } public MethodBase MethodBase { @@ -160,6 +197,9 @@ namespace System.Runtime.Remoting.Messaging { public int InArgCount { get { + if (CallType == CallType.EndInvoke) + return -1; + if (null == args) return 0; @@ -287,19 +327,59 @@ namespace System.Runtime.Remoting.Messaging { return null; } - [Serializable] - class InternalDictionary : MethodCallDictionary - { - public InternalDictionary(MonoMethodMessage message) : base (message) - { - } + Identity IInternalMessage.TargetIdentity + { + get { return identity; } + set { identity = value; } + } + + bool IInternalMessage.HasProperties() + { + return properties != null; + } + + public bool IsAsync + { + get { return asyncResult != null; } + } + + public AsyncResult AsyncResult + { + get { return asyncResult; } + } - protected override void SetMethodProperty (string key, object value) + internal CallType CallType + { + get { - if (key == "__Uri") ((MonoMethodMessage)_message).Uri = (string)value; - else base.SetMethodProperty (key, value); + // FIXME: ideally, the OneWay type would be set by the runtime + + if (call_type == CallType.Sync && RemotingServices.IsOneWay (method)) + call_type = CallType.OneWay; + return call_type; } } + + public bool NeedsOutProcessing (out int outCount) { + bool res = false; + outCount = 0; + foreach (byte t in arg_types) { + if ((t & 2) != 0) + outCount++; + else if ((t & 4) != 0) + res = true; + } + return outCount > 0 || res; + } + + } + internal enum CallType: int + { + Sync = 0, + BeginInvoke = 1, + EndInvoke = 2, + OneWay = 3 } } +