X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem.Runtime.Remoting%2FObjRef.cs;h=ad2fde125b27799abe3685ae6dc5ff22989282a0;hb=948dbf8d4581ac17f5420cc4f7dc375e3c502576;hp=210f34e8dfcab3ce8d8937056db88777afffc6cd;hpb=2e4f40e23d9adbecc8242c42031b6e94f4191b89;p=mono.git diff --git a/mcs/class/corlib/System.Runtime.Remoting/ObjRef.cs b/mcs/class/corlib/System.Runtime.Remoting/ObjRef.cs index 210f34e8dfc..ad2fde125b2 100644 --- a/mcs/class/corlib/System.Runtime.Remoting/ObjRef.cs +++ b/mcs/class/corlib/System.Runtime.Remoting/ObjRef.cs @@ -4,70 +4,199 @@ // Author: // Miguel de Icaza (miguel@ximian.com) // Dietmar Maurer (dietmar@ximian.com) +// Lluis Sanchez Gual (lluis@ideary.com) +// Patrik Torstensson // // (C) Ximian, Inc. http://www.ximian.com // + +// +// Copyright (C) 2004 Novell, Inc (http://www.novell.com) // -// FIXME: This is just a skeleton for practical purposes. +// 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; + +#if NET_2_0 +using System.Runtime.ConstrainedExecution; +#endif namespace System.Runtime.Remoting { [Serializable] - public class ObjRef : IObjectReference, ISerializable { - MarshalByRefObject mbr; - SerializationInfo si; + public class ObjRef : IObjectReference, ISerializable + { + IChannelInfo channel_info; string uri; - Type type; + IRemotingTypeInfo typeInfo; + IEnvoyInfo envoyInfo; + int flags; + Type _serverType; + + static int MarshalledObjectRef = 1; + static int WellKnowObjectRef = 2; public ObjRef () { + // no idea why this needs to be public + + UpdateChannelInfo(); } - + + internal ObjRef (string typeName, string uri, IChannelInfo cinfo) + { + this.uri = uri; + channel_info = cinfo; + typeInfo = new TypeInfo (Type.GetType (typeName)); + } + + internal ObjRef (ObjRef o, bool unmarshalAsProxy) { + channel_info = o.channel_info; + uri = o.uri; + + typeInfo = o.typeInfo; + envoyInfo = o.envoyInfo; + flags = o.flags; + if (unmarshalAsProxy) flags |= MarshalledObjectRef; + } + public ObjRef (MarshalByRefObject mbr, Type type) { - this.mbr = mbr; - this.type = type; + if (mbr == null) + throw new ArgumentNullException ("mbr"); + + if (type == null) + throw new ArgumentNullException ("type"); + + // The ObjRef can only be constructed if the given mbr + // has already been marshalled using RemotingServices.Marshall + + uri = RemotingServices.GetObjectUri(mbr); + typeInfo = new TypeInfo(type); + + if (!type.IsInstanceOfType (mbr)) + throw new RemotingException ("The server object type cannot be cast to the requested type " + type.FullName + "."); + + UpdateChannelInfo(); + } + + internal ObjRef (Type type, string url, object remoteChannelData) + { + uri = url; + typeInfo = new TypeInfo(type); + + if (remoteChannelData != null) + channel_info = new ChannelInfo (remoteChannelData); + + flags |= WellKnowObjectRef; } - [MonoTODO] protected ObjRef (SerializationInfo si, StreamingContext sc) { - // FIXME: Implement. - // - // This encarnates the object from serialized data. + SerializationInfoEnumerator en = si.GetEnumerator(); + // Info to serialize: uri, objrefFlags, typeInfo, envoyInfo, channelInfo + + bool marshalledValue = true; + + while (en.MoveNext ()) { + switch (en.Name) { + case "uri": + uri = (string)en.Value; + break; + case "typeInfo": + typeInfo = (IRemotingTypeInfo)en.Value; + break; + case "channelInfo": + channel_info = (IChannelInfo)en.Value; + break; + case "envoyInfo": + envoyInfo = (IEnvoyInfo)en.Value; + break; + case "fIsMarshalled": + int status; + Object o = en.Value; + if (o is string) + status = ((IConvertible) o).ToInt32(null); + else + status = (int) o; + + if (status == 0) + marshalledValue = false; + break; + case "objrefFlags": + flags = Convert.ToInt32 (en.Value); + break; + default: + throw new NotSupportedException (); + } + } + if (marshalledValue) flags |= MarshalledObjectRef; + } + + 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; } } - [MonoTODO] public virtual IChannelInfo ChannelInfo { +#if NET_2_0 + [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)] +#endif get { - throw new NotImplementedException (); + return channel_info; } + set { - throw new NotImplementedException (); + channel_info = value; } } - [MonoTODO] public virtual IEnvoyInfo EnvoyInfo { get { - throw new NotImplementedException (); + return envoyInfo; } set { - throw new NotImplementedException (); + envoyInfo = value; } } - [MonoTODO] public virtual IRemotingTypeInfo TypeInfo { get { - throw new NotImplementedException (); + return typeInfo; } set { - throw new NotImplementedException (); + typeInfo = value; } } @@ -80,34 +209,61 @@ namespace System.Runtime.Remoting { } } - [MonoTODO] public virtual void GetObjectData (SerializationInfo si, StreamingContext sc) { - // FIXME: + 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", flags); } - [MonoTODO] public virtual object GetRealObject (StreamingContext sc) { - // FIXME: - - return null; + if ((flags & MarshalledObjectRef) > 0) + return RemotingServices.Unmarshal (this); + else + return this; } - [MonoTODO] public bool IsFromThisAppDomain () { - // FIXME: - - return true; + Identity identity = RemotingServices.GetIdentityForUri (uri); + if (identity == null) return false; // URI not registered in this domain + + return identity.IsFromThisAppDomain; } - [MonoTODO] +#if NET_2_0 + [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)] +#endif public bool IsFromThisProcess () { - // FIXME: + foreach (object data in channel_info.ChannelData) + { + if (data is CrossAppDomainData) + { + string refProcId = ((CrossAppDomainData)data).ProcessID; + return (refProcId == RemotingConfiguration.ProcessId); + } + } return true; } + + internal void UpdateChannelInfo() + { + channel_info = new ChannelInfo (); + } + + internal Type ServerType + { + get + { + if (_serverType == null) _serverType = Type.GetType (typeInfo.TypeName); + return _serverType; + } + } } }