X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem.Runtime.Remoting%2FObjRef.cs;h=7c5edb0a859d0465b0bfa07685fe61a2bae3d44b;hb=9e1f34dd2d7be45b2a3a6b1c133a4a1de8c3d864;hp=f4e9f0eadc92f1e952747559229819e80830c19d;hpb=f69d6386e19c2b8b822b9b9062b9a45891537cfa;p=mono.git diff --git a/mcs/class/corlib/System.Runtime.Remoting/ObjRef.cs b/mcs/class/corlib/System.Runtime.Remoting/ObjRef.cs index f4e9f0eadc9..7c5edb0a859 100644 --- a/mcs/class/corlib/System.Runtime.Remoting/ObjRef.cs +++ b/mcs/class/corlib/System.Runtime.Remoting/ObjRef.cs @@ -10,69 +10,114 @@ // (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.Runtime.Serialization; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Messaging; using System.Runtime.Remoting.Proxies; +using System.Runtime.ConstrainedExecution; + namespace System.Runtime.Remoting { [Serializable] + [System.Runtime.InteropServices.ComVisible (true)] public class ObjRef : IObjectReference, ISerializable { IChannelInfo channel_info; string uri; IRemotingTypeInfo typeInfo; IEnvoyInfo envoyInfo; - [NonSerialized] bool marshalledValue = true; + int flags; + Type _serverType; + + static int MarshalledObjectRef = 1; + static int WellKnowObjectRef = 2; public ObjRef () { // no idea why this needs to be public - channel_info = new ChannelInfoStore (); + + UpdateChannelInfo(); } - internal bool IsPossibleToCAD () { - // we should check if this obj ref belongs to a cross app context - return true; + internal ObjRef (string typeName, string uri, IChannelInfo cinfo) + { + this.uri = uri; + channel_info = cinfo; + typeInfo = new TypeInfo (Type.GetType (typeName, true)); } - internal ObjRef (ObjRef o) { + internal ObjRef (ObjRef o, bool unmarshalAsProxy) { channel_info = o.channel_info; uri = o.uri; typeInfo = o.typeInfo; envoyInfo = o.envoyInfo; - marshalledValue = true; + flags = o.flags; + if (unmarshalAsProxy) flags |= MarshalledObjectRef; } - - public ObjRef (MarshalByRefObject mbr, Type type) + + public ObjRef (MarshalByRefObject o, Type requestedType) { - if (mbr == null) - throw new ArgumentNullException ("mbr"); + if (o == null) + throw new ArgumentNullException ("o"); - if (type == null) - throw new ArgumentNullException ("type"); + if (requestedType == null) + throw new ArgumentNullException ("requestedType"); - // The ObjRef can only be constructed if the given mbr + // The ObjRef can only be constructed if the given o // has already been marshalled using RemotingServices.Marshall - uri = RemotingServices.GetObjectUri(mbr); + uri = RemotingServices.GetObjectUri (o); + typeInfo = new TypeInfo (requestedType); + + if (!requestedType.IsInstanceOfType (o)) + throw new RemotingException ("The server object type cannot be cast to the requested type " + requestedType.FullName); + + UpdateChannelInfo(); + } + + internal ObjRef (Type type, string url, object remoteChannelData) + { + uri = url; typeInfo = new TypeInfo(type); - if (!typeInfo.CanCastTo(mbr.GetType(), mbr)) - throw new RemotingException ("The server object type cannot be cast to the requested type " + type.FullName + "."); + if (remoteChannelData != null) + channel_info = new ChannelInfo (remoteChannelData); - channel_info = new ChannelInfoStore (); + flags |= WellKnowObjectRef; } - protected ObjRef (SerializationInfo si, StreamingContext sc) + protected ObjRef (SerializationInfo info, StreamingContext context) { - SerializationInfoEnumerator en = si.GetEnumerator(); + SerializationInfoEnumerator en = info.GetEnumerator(); // Info to serialize: uri, objrefFlags, typeInfo, envoyInfo, channelInfo - marshalledValue = true; + bool marshalledValue = true; while (en.MoveNext ()) { switch (en.Name) { @@ -91,24 +136,40 @@ namespace System.Runtime.Remoting { case "fIsMarshalled": int status; Object o = en.Value; - if (o.GetType().Equals(typeof(String))) - status = ((IConvertible) o).ToInt32(null); - else - status = (int) o; + if (o is string) + status = ((IConvertible) o).ToInt32(null); + else + status = (int) o; if (status == 0) marshalledValue = false; break; - case "objrefFlags": // FIXME: do something with this + case "objrefFlags": + flags = Convert.ToInt32 (en.Value); break; default: throw new NotSupportedException (); } } + if (marshalledValue) flags |= MarshalledObjectRef; } - public virtual IChannelInfo ChannelInfo { + internal bool IsPossibleToCAD () + { + // we should check if this obj ref belongs to a cross app context. + // Return false. If not, serialization of this ObjRef will not work + // on the target AD. + return false; + } + + internal bool IsReferenceToWellKnow + { + get { return (flags & WellKnowObjectRef) > 0; } + } + + public virtual IChannelInfo ChannelInfo { + [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)] get { return channel_info; } @@ -118,17 +179,15 @@ namespace System.Runtime.Remoting { } } - [MonoTODO] public virtual IEnvoyInfo EnvoyInfo { get { - throw new NotImplementedException (); + return envoyInfo; } set { - throw new NotImplementedException (); + envoyInfo = value; } } - [MonoTODO] public virtual IRemotingTypeInfo TypeInfo { get { return typeInfo; @@ -147,20 +206,20 @@ namespace System.Runtime.Remoting { } } - public virtual void GetObjectData (SerializationInfo si, StreamingContext sc) + public virtual void GetObjectData (SerializationInfo info, StreamingContext context) { - si.SetType (GetType()); - si.AddValue ("uri", uri); - si.AddValue ("typeInfo", typeInfo, typeof (IRemotingTypeInfo)); - si.AddValue ("envoyInfo", envoyInfo, typeof (IEnvoyInfo)); - si.AddValue ("channelInfo", channel_info, typeof(IChannelInfo)); - si.AddValue ("objrefFlags", 0); + info.SetType (GetType()); + info.AddValue ("uri", uri); + info.AddValue ("typeInfo", typeInfo, typeof (IRemotingTypeInfo)); + info.AddValue ("envoyInfo", envoyInfo, typeof (IEnvoyInfo)); + info.AddValue ("channelInfo", channel_info, typeof(IChannelInfo)); + info.AddValue ("objrefFlags", flags); } - public virtual object GetRealObject (StreamingContext sc) + public virtual object GetRealObject (StreamingContext context) { - if (marshalledValue) - return RemotingServices.GetRemoteObject(Type.GetType(typeInfo.TypeName), null, channel_info.ChannelData, uri); + if ((flags & MarshalledObjectRef) > 0) + return RemotingServices.Unmarshal (this); else return this; } @@ -173,18 +232,32 @@ namespace System.Runtime.Remoting { return identity.IsFromThisAppDomain; } - [MonoTODO] + [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)] public bool IsFromThisProcess () { - // as yet we do not consider this optimization - return false; + foreach (object data in channel_info.ChannelData) + { + if (data is CrossAppDomainData) + { + string refProcId = ((CrossAppDomainData)data).ProcessID; + return (refProcId == RemotingConfiguration.ProcessId); + } + } + + return true; } - internal object GetInternalObject () { - if (!marshalledValue) - return this; - else { - return RemotingServices.Unmarshal (this); + internal void UpdateChannelInfo() + { + channel_info = new ChannelInfo (); + } + + internal Type ServerType + { + get + { + if (_serverType == null) _serverType = Type.GetType (typeInfo.TypeName); + return _serverType; } } }