X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem.Runtime.Remoting.Proxies%2FRemotingProxy.cs;h=02f6d2b8d36d11ca09a33e65473967fe7f14211c;hb=311746b41cf500aef15a68bf4a37bddcbba86ef4;hp=52a7dce3faed710cfaeeee2863be7d6d536245a6;hpb=1c807cb26316b6c9e1bd7b7f064673c528a1057d;p=mono.git diff --git a/mcs/class/corlib/System.Runtime.Remoting.Proxies/RemotingProxy.cs b/mcs/class/corlib/System.Runtime.Remoting.Proxies/RemotingProxy.cs index 52a7dce3fae..02f6d2b8d36 100644 --- a/mcs/class/corlib/System.Runtime.Remoting.Proxies/RemotingProxy.cs +++ b/mcs/class/corlib/System.Runtime.Remoting.Proxies/RemotingProxy.cs @@ -8,6 +8,29 @@ // (C) 2001 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.Reflection; using System.Runtime.Remoting.Messaging; @@ -21,7 +44,7 @@ using System.Threading; namespace System.Runtime.Remoting.Proxies { - internal class RemotingProxy : RealProxy + internal class RemotingProxy : RealProxy, IRemotingTypeInfo { static MethodInfo _cache_GetTypeMethod = typeof(System.Object).GetMethod("GetType"); static MethodInfo _cache_GetHashCodeMethod = typeof(System.Object).GetMethod("GetHashCode"); @@ -29,7 +52,6 @@ namespace System.Runtime.Remoting.Proxies IMessageSink _sink; bool _hasEnvoySink; ConstructionCall _ctorCall; - string _targetUri; internal RemotingProxy (Type type, ClientIdentity identity) : base (type, identity) { @@ -46,22 +68,21 @@ namespace System.Runtime.Remoting.Proxies public override IMessage Invoke (IMessage request) { - MonoMethodMessage mMsg = (MonoMethodMessage) request; - - if (mMsg.CallType == CallType.EndInvoke) - return mMsg.AsyncResult.EndInvoke (); - - if (mMsg.MethodBase.IsConstructor) - return ActivateRemoteObject (mMsg); - - if (mMsg.MethodBase == _cache_GetHashCodeMethod) - return new MethodResponse(ObjectIdentity.GetHashCode(), null, null, request as IMethodCallMessage); - - if (mMsg.MethodBase == _cache_GetTypeMethod) - return new MethodResponse(GetProxiedType(), null, null, request as IMethodCallMessage); - - mMsg.Uri = _targetUri; - ((IInternalMessage)mMsg).TargetIdentity = _objectIdentity; + IMethodCallMessage mm = request as IMethodCallMessage; + + if (mm != null) { + if (mm.MethodBase == _cache_GetHashCodeMethod) + return new MethodResponse(ObjectIdentity.GetHashCode(), null, null, mm); + + if (mm.MethodBase == _cache_GetTypeMethod) + return new MethodResponse(GetProxiedType(), null, null, mm); + } + + IInternalMessage im = request as IInternalMessage; + if (im != null) { + if (im.Uri == null) im.Uri = _targetUri; + im.TargetIdentity = _objectIdentity; + } _objectIdentity.NotifyClientDynamicSinks (true, request, true, false); @@ -74,11 +95,12 @@ namespace System.Runtime.Remoting.Proxies else sink = _sink; - if (mMsg.CallType == CallType.Sync) + MonoMethodMessage mMsg = request as MonoMethodMessage; + if (mMsg == null || mMsg.CallType == CallType.Sync) response = sink.SyncProcessMessage (request); else { - AsyncResult ares = ((MonoMethodMessage)request).AsyncResult; + AsyncResult ares = mMsg.AsyncResult; IMessageCtrl mctrl = sink.AsyncProcessMessage (request, ares); if (ares != null) ares.SetMessageCtrl (mctrl); response = new ReturnMessage (null, new object[0], 0, null, mMsg); @@ -98,6 +120,7 @@ namespace System.Runtime.Remoting.Proxies ClientActivatedIdentity cai = (ClientActivatedIdentity)identity; _targetContext = cai.Context; AttachServer (cai.GetServerObject ()); + cai.SetClientProxy ((MarshalByRefObject) GetTransparentProxy()); } if (identity is ClientIdentity) @@ -119,7 +142,7 @@ namespace System.Runtime.Remoting.Proxies _ctorCall = null; // Object already constructed } - IMessage ActivateRemoteObject (IMethodMessage request) + internal IMessage ActivateRemoteObject (IMethodMessage request) { if (_ctorCall == null) // It must be a WKO return new ConstructionResponse (this, null, (IMethodCallMessage) request); // Ignore constructor call for WKOs @@ -127,6 +150,33 @@ namespace System.Runtime.Remoting.Proxies _ctorCall.CopyFrom (request); return ActivationServices.Activate (this, _ctorCall); } + + public string TypeName + { + get + { + if (_objectIdentity is ClientIdentity) { + ObjRef oref = _objectIdentity.CreateObjRef (null); + if (oref.TypeInfo != null) return oref.TypeInfo.TypeName; + } + return GetProxiedType().AssemblyQualifiedName; + } + + set + { + throw new NotSupportedException (); + } + } + + public bool CanCastTo (Type fromType, object o) + { + if (_objectIdentity is ClientIdentity) { + ObjRef oref = _objectIdentity.CreateObjRef (null); + if (oref.IsReferenceToWellKnow && (fromType.IsInterface || GetProxiedType() == typeof(MarshalByRefObject))) return true; + if (oref.TypeInfo != null) return oref.TypeInfo.CanCastTo (fromType, o); + } + return fromType.IsAssignableFrom (GetProxiedType()); + } ~RemotingProxy() {