// Patrik Torstensson
//
// (C) 2001 Ximian, Inc. http://www.ximian.com
-//
-
-//
-// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+// Copyright (C) 2004, 2006 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
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
-using System;
using System.Diagnostics;
using System.Text;
using System.Reflection;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
+using System.Runtime.Remoting.Services;
+using System.Security.Permissions;
#if NET_2_0
using System.Runtime.ConstrainedExecution;
ReturnMessage result;
Type tt = target.GetType ();
- MethodBase method = reqMsg.MethodBase.DeclaringType == tt ? reqMsg.MethodBase : tt.GetMethod(reqMsg.MethodName, BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance, null, (Type[]) reqMsg.MethodSignature, null);
+ MethodBase method;
+ if (reqMsg.MethodBase.DeclaringType == tt /*|| reqMsg.MethodBase.DeclaringType.IsInterface*/)
+ method = reqMsg.MethodBase;
+ else
+ method = tt.GetMethod (reqMsg.MethodName, BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance, null, (Type[]) reqMsg.MethodSignature, null);
+
object oldContext = CallContext.SetCurrentCallContext (reqMsg.LogicalCallContext);
try
{
LifetimeServices.StopTrackingLifetime (identity);
DisposeIdentity (identity);
+ TrackingServices.NotifyDisconnectedObject (obj);
return true;
}
}
Type classToProxy = fRefine ? objref.ServerType : typeof (MarshalByRefObject);
if (classToProxy == null) classToProxy = typeof (MarshalByRefObject);
- if (objref.IsReferenceToWellKnow)
- return GetRemoteObject(objref, classToProxy);
+ if (objref.IsReferenceToWellKnow) {
+ object obj = GetRemoteObject(objref, classToProxy);
+ TrackingServices.NotifyUnmarshaledObject (obj, objref);
+ return obj;
+ }
else
{
- if (classToProxy.IsContextful)
- {
+ object obj;
+
+ if (classToProxy.IsContextful) {
// Look for a ProxyAttribute
ProxyAttribute att = (ProxyAttribute) Attribute.GetCustomAttribute (classToProxy, typeof(ProxyAttribute),true);
- if (att != null)
- return att.CreateProxy (objref, classToProxy, null, null).GetTransparentProxy();
+ if (att != null) {
+ obj = att.CreateProxy (objref, classToProxy, null, null).GetTransparentProxy();
+ TrackingServices.NotifyUnmarshaledObject (obj, objref);
+ return obj;
+ }
}
- return GetProxyForRemoteObject (objref, classToProxy);
+ obj = GetProxyForRemoteObject (objref, classToProxy);
+ TrackingServices.NotifyUnmarshaledObject (obj, objref);
+ return obj;
}
}
else if (uri != null)
throw new RemotingException ("It is not possible marshal a proxy of a remote object.");
- return proxy.ObjectIdentity.CreateObjRef(requested_type);
+ ObjRef or = proxy.ObjectIdentity.CreateObjRef(requested_type);
+ TrackingServices.NotifyMarshaledObject (obj, or);
+ return or;
}
}
CreateClientActivatedServerIdentity (obj, requested_type, uri);
}
+ ObjRef oref;
+
if (IsTransparentProxy (obj))
- return RemotingServices.GetRealProxy(obj).ObjectIdentity.CreateObjRef (requested_type);
+ oref = RemotingServices.GetRealProxy(obj).ObjectIdentity.CreateObjRef (requested_type);
else
- return obj.CreateObjRef(requested_type);
+ oref = obj.CreateObjRef(requested_type);
+
+ TrackingServices.NotifyMarshaledObject (obj, oref);
+ return oref;
}
static string NewUri ()
public static bool IsObjectOutOfAppDomain(object tp)
{
+ MarshalByRefObject mbr = tp as MarshalByRefObject;
+
+ if (mbr == null)
+ return false;
+
// TODO: use internal call for better performance
- Identity ident = GetObjectIdentity((MarshalByRefObject)tp);
+ Identity ident = GetObjectIdentity (mbr);
return ident is ClientIdentity;
}
public static bool IsObjectOutOfContext(object tp)
{
+ MarshalByRefObject mbr = tp as MarshalByRefObject;
+
+ if (mbr == null)
+ return false;
+
// TODO: use internal call for better performance
- Identity ident = GetObjectIdentity((MarshalByRefObject)tp);
+ Identity ident = GetObjectIdentity (mbr);
if (ident == null) return false;
ServerIdentity sident = ident as ServerIdentity;
RemotingProxy proxy = new RemotingProxy (type, ChannelServices.CrossContextUrl, activationAttributes);
return proxy.GetTransparentProxy();
}
+
+ internal static object CreateClientProxyForComInterop (Type type)
+ {
+ Mono.Interop.ComInteropProxy proxy = new Mono.Interop.ComInteropProxy (type);
+ return proxy.GetTransparentProxy ();
+ }
internal static Identity GetIdentityForUri (string uri)
{
+ string normUri = GetNormalizedUri (uri);
lock (uri_hash)
{
- return (Identity)uri_hash [GetNormalizedUri(uri)];
+ Identity i = (Identity) uri_hash [normUri];
+
+ if (i == null) {
+ normUri = RemoveAppNameFromUri (uri);
+ if (normUri != null)
+ i = (Identity) uri_hash [normUri];
+ }
+
+ return i;
}
}
+ //
+ // If the specified uri starts with the application name,
+ // RemoveAppNameFromUri returns the uri w/out the leading
+ // application name, otherwise it returns null.
+ //
+ // Assumes that the uri is not normalized.
+ //
+ static string RemoveAppNameFromUri (string uri)
+ {
+ string name = RemotingConfiguration.ApplicationName;
+ if (name == null) return null;
+ name = "/" + name + "/";
+ if (uri.StartsWith (name))
+ return uri.Substring (name.Length);
+ else
+ return null;
+ }
+
internal static Identity GetObjectIdentity (MarshalByRefObject obj)
{
if (IsTransparentProxy(obj))
}
// This method is called by the runtime
+ [SecurityPermission (SecurityAction.Assert, SerializationFormatter = true)] // FIXME: to be reviewed
internal static byte[] SerializeCallData (object obj)
{
LogicalCallContext ctx = CallContext.CreateLogicalCallContext (false);
}
// This method is called by the runtime
+ [SecurityPermission (SecurityAction.Assert, SerializationFormatter = true)] // FIXME: to be reviewed
internal static object DeserializeCallData (byte[] array)
{
if (array == null) return null;
}
// This method is called by the runtime
+ [SecurityPermission (SecurityAction.Assert, SerializationFormatter = true)] // FIXME: to be reviewed
internal static byte[] SerializeExceptionData (Exception ex)
{
try {