X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem.Runtime.Remoting%2FObjRef.cs;h=e73e956afac7db3334d38c6503153c878b588d00;hb=f567c2e5ebed86f2f50c6f356f39934064ab6653;hp=2bd66f451662bdcb5a3272baf6b52d8364afa6f7;hpb=e51a9b6ba1a93bc981639a706c93bee413099fd6;p=mono.git diff --git a/mcs/class/corlib/System.Runtime.Remoting/ObjRef.cs b/mcs/class/corlib/System.Runtime.Remoting/ObjRef.cs index 2bd66f45166..e73e956afac 100644 --- a/mcs/class/corlib/System.Runtime.Remoting/ObjRef.cs +++ b/mcs/class/corlib/System.Runtime.Remoting/ObjRef.cs @@ -34,18 +34,18 @@ // using System; +using System.IO; 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] + [System.Runtime.InteropServices.ComVisible (true)] public class ObjRef : IObjectReference, ISerializable { IChannelInfo channel_info; @@ -65,14 +65,34 @@ namespace System.Runtime.Remoting { UpdateChannelInfo(); } - internal ObjRef (string typeName, string uri, IChannelInfo cinfo) + internal ObjRef (string uri, IChannelInfo cinfo) { this.uri = uri; - channel_info = cinfo; - typeInfo = new TypeInfo (Type.GetType (typeName, true)); + this.channel_info = cinfo; } - internal ObjRef (ObjRef o, bool unmarshalAsProxy) { + internal ObjRef DeserializeInTheCurrentDomain (int domainId, byte[] tInfo) + { + string local_uri = string.Copy (this.uri); + ChannelInfo cinfo = new ChannelInfo (new CrossAppDomainData (domainId)); + ObjRef res = new ObjRef (local_uri, cinfo); + IRemotingTypeInfo typeInfo = (IRemotingTypeInfo)CADSerializer.DeserializeObjectSafe (tInfo); + res.typeInfo = typeInfo; + return res; + } + + internal byte[] SerializeType () + { + // FIXME: Assert self and typeinfo in same domain + if (typeInfo == null) + throw new Exception ("Attempt to serialize a null TypeInfo."); + + MemoryStream stm = CADSerializer.SerializeObject (typeInfo); + return stm.GetBuffer (); + } + + internal ObjRef (ObjRef o, bool unmarshalAsProxy) + { channel_info = o.channel_info; uri = o.uri; @@ -82,22 +102,22 @@ namespace System.Runtime.Remoting { 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); - typeInfo = new TypeInfo(type); + uri = RemotingServices.GetObjectUri (o); + typeInfo = new TypeInfo (requestedType); - if (!type.IsInstanceOfType (mbr)) - throw new RemotingException ("The server object type cannot be cast to the requested type " + type.FullName + "."); + if (!requestedType.IsInstanceOfType (o)) + throw new RemotingException ("The server object type cannot be cast to the requested type " + requestedType.FullName); UpdateChannelInfo(); } @@ -113,9 +133,9 @@ namespace System.Runtime.Remoting { 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 bool marshalledValue = true; @@ -170,9 +190,7 @@ namespace System.Runtime.Remoting { } public virtual IChannelInfo ChannelInfo { -#if NET_2_0 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)] -#endif get { return channel_info; } @@ -209,17 +227,17 @@ 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", flags); + 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 ((flags & MarshalledObjectRef) > 0) return RemotingServices.Unmarshal (this); @@ -235,9 +253,7 @@ namespace System.Runtime.Remoting { return identity.IsFromThisAppDomain; } -#if NET_2_0 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)] -#endif public bool IsFromThisProcess () { foreach (object data in channel_info.ChannelData) @@ -265,5 +281,9 @@ namespace System.Runtime.Remoting { return _serverType; } } + + internal void SetDomainID (int id) + { + } } }