Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / clr / src / BCL / System / Runtime / Remoting / RemotingSurrogateSelector.cs / 1 / RemotingSurrogateSelector.cs
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
namespace System.Runtime.Remoting.Messaging {
using System;
using System.Runtime.InteropServices;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Metadata;
using System.Runtime.Remoting.Activation;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters;
using System.Text;
using System.Reflection;
using System.Threading;
using System.Globalization;
using System.Collections;
using System.Security.Permissions;
[System.Runtime.InteropServices.ComVisible(true)]
public delegate bool MessageSurrogateFilter(String key, Object value);
[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.Infrastructure)]
[SecurityPermissionAttribute(SecurityAction.InheritanceDemand, Flags=SecurityPermissionFlag.Infrastructure)]
[System.Runtime.InteropServices.ComVisible(true)]
public class RemotingSurrogateSelector : ISurrogateSelector
{
// Private static data
private static Type s_IMethodCallMessageType = typeof(IMethodCallMessage);
private static Type s_IMethodReturnMessageType = typeof(IMethodReturnMessage);
private static Type s_ObjRefType = typeof(ObjRef);
// Private member data
private Object _rootObj = null;
private ISurrogateSelector _next = null;
private RemotingSurrogate _remotingSurrogate = new RemotingSurrogate();
private ObjRefSurrogate _objRefSurrogate = new ObjRefSurrogate();
private ISerializationSurrogate _messageSurrogate = null;
private MessageSurrogateFilter _filter = null;
public RemotingSurrogateSelector()
{
_messageSurrogate = new MessageSurrogate(this);
}
public MessageSurrogateFilter Filter
{
set { _filter = value; }
get { return _filter; }
}
public void SetRootObject(Object obj)
{
if (obj == null)
{
throw new ArgumentNullException("obj");
}
_rootObj = obj;
SoapMessageSurrogate soapMsg = _messageSurrogate as SoapMessageSurrogate;
if (null != soapMsg)
{
soapMsg.SetRootObject(_rootObj);
}
}
public Object GetRootObject()
{
return _rootObj;
}
// Specifies the next ISurrogateSelector to be examined for surrogates if the current
// instance doesn't have a surrogate for the given type and assembly in the given context.
[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.SerializationFormatter)]
public virtual void ChainSelector(ISurrogateSelector selector) {_next = selector;}
// Returns the appropriate surrogate for the given type in the given context.
[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.SerializationFormatter)]
public virtual ISerializationSurrogate GetSurrogate(Type type, StreamingContext context, out ISurrogateSelector ssout)
{
if (type == null)
{
throw new ArgumentNullException("type");
}
Message.DebugOut("Entered GetSurrogate for " + type.FullName + "\n");
if (type.IsMarshalByRef)
{
Message.DebugOut("Selected surrogate for " + type.FullName);
ssout = this;
return _remotingSurrogate;
}
else if (s_IMethodCallMessageType.IsAssignableFrom(type) ||
s_IMethodReturnMessageType.IsAssignableFrom(type))
{
ssout = this;
return _messageSurrogate;
}
else if (s_ObjRefType.IsAssignableFrom(type))
{
ssout = this;
return _objRefSurrogate;
}
else if (_next != null)
{
return _next.GetSurrogate(type, context, out ssout);
}
else
{
ssout = null;
return null;
}
} // GetSurrogate
[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.SerializationFormatter)]
public virtual ISurrogateSelector GetNextSelector() { return _next;}
public virtual void UseSoapFormat()
{
_messageSurrogate = new SoapMessageSurrogate(this);
((SoapMessageSurrogate)_messageSurrogate).SetRootObject(_rootObj);
}
}
internal class RemotingSurrogate : ISerializationSurrogate
{
[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.SerializationFormatter)]
public virtual void GetObjectData(Object obj, SerializationInfo info, StreamingContext context)
{
if (obj == null)
{
throw new ArgumentNullException("obj");
}
if (info==null) {
throw new ArgumentNullException("info");
}
//
// This code is to special case marshalling types inheriting from RemotingClientProxy
// Check whether type inherits from RemotingClientProxy and serialize the correct ObjRef
// after getting the correct proxy to the actual server object
//
Message.DebugOut("RemotingSurrogate::GetObjectData obj.Type: " + obj.GetType().FullName + " \n");
if(RemotingServices.IsTransparentProxy(obj))
{
RealProxy rp = RemotingServices.GetRealProxy(obj);
rp.GetObjectData(info, context);
}
else
{
RemotingServices.GetObjectData(obj, info, context);
}
}
[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.SerializationFormatter)]
public virtual Object SetObjectData(Object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)
{
throw new NotSupportedException(Environment.GetResourceString("NotSupported_PopulateData"));
}
} // class RemotingSurrogate
internal class ObjRefSurrogate : ISerializationSurrogate
{
[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.SerializationFormatter)]
public virtual void GetObjectData(Object obj, SerializationInfo info, StreamingContext context)
{
if (obj == null)
{
throw new ArgumentNullException("obj");
}
if (info==null) {
throw new ArgumentNullException("info");
}
//
// This code is to provide special handling for ObjRef's that are supposed
// to be passed as parameters.
//
((ObjRef)obj).GetObjectData(info, context);
// add flag indicating the ObjRef was passed as a parameter
info.AddValue("fIsMarshalled", 0);
} // GetObjectData
[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.SerializationFormatter)]
public virtual Object SetObjectData(Object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)
{
throw new NotSupportedException(Environment.GetResourceString("NotSupported_PopulateData"));
}
} // class ObjRefSurrogate
internal class SoapMessageSurrogate : ISerializationSurrogate
{
// Private static data
private static Type _voidType = typeof(void);
private static Type _soapFaultType = typeof(SoapFault);
// Member data
String DefaultFakeRecordAssemblyName = "http://schemas.microsoft.com/urt/SystemRemotingSoapTopRecord";
Object _rootObj = null;
RemotingSurrogateSelector _ss;
internal SoapMessageSurrogate(RemotingSurrogateSelector ss)
{
_ss = ss;
}
internal void SetRootObject(Object obj)
{
_rootObj = obj;
}
internal virtual String[] GetInArgNames(IMethodCallMessage m, int c)
{
String[] names = new String[c];
for (int i = 0; i < c; i++)
{
String name = m.GetInArgName(i);
if (name == null)
{
name = "__param" + i;
}
names[i] = name;
}
return names;
}
internal virtual String[] GetNames(IMethodCallMessage m, int c)
{
String[] names = new String[c];
for (int i = 0; i < c; i++)
{
String name = m.GetArgName(i);
if (name == null)
{
name = "__param" + i;
}
names[i] = name;
}
return names;
}
[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.SerializationFormatter)]
public virtual void GetObjectData(Object obj, SerializationInfo info, StreamingContext context)
{
if (info==null)
{
throw new ArgumentNullException("info");
}
if ( (obj!=null) && (obj !=_rootObj))
{
(new MessageSurrogate(_ss)).GetObjectData(obj, info, context);
}
else
{
IMethodReturnMessage msg = obj as IMethodReturnMessage;
if(null != msg)
{
if (msg.Exception == null)
{
String responseElementName;
String responseElementNS;
String returnElementName;
// obtain response element name namespace
MethodBase mb = msg.MethodBase;
SoapMethodAttribute attr = (SoapMethodAttribute)InternalRemotingServices.GetCachedSoapAttribute(mb);
responseElementName = attr.ResponseXmlElementName;
responseElementNS = attr.ResponseXmlNamespace;
returnElementName = attr.ReturnXmlElementName;
ArgMapper mapper = new ArgMapper(msg, true /*fOut*/);
Object[] args = mapper.Args;
info.FullTypeName = responseElementName;
info.AssemblyName = responseElementNS;
Type retType = ((MethodInfo)mb).ReturnType;
if (!((retType == null) || (retType == _voidType)))
{
info.AddValue(returnElementName, msg.ReturnValue, retType);
}
if (args != null)
{
Type[] types = mapper.ArgTypes;
for (int i=0; i
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- Vector.cs
- StorageEntityTypeMapping.cs
- ToolbarAUtomationPeer.cs
- LocatorPart.cs
- MultiBinding.cs
- ChooseAction.cs
- TableLayoutColumnStyleCollection.cs
- path.cs
- HostedElements.cs
- BooleanAnimationBase.cs
- ApplicationFileCodeDomTreeGenerator.cs
- LicenseManager.cs
- StorageEntityContainerMapping.cs
- GlyphRunDrawing.cs
- SeekStoryboard.cs
- ListViewItem.cs
- BamlMapTable.cs
- Compiler.cs
- Button.cs
- DiscreteKeyFrames.cs
- DummyDataSource.cs
- ConsoleCancelEventArgs.cs
- DataServiceStreamProviderWrapper.cs
- WaitHandle.cs
- IResourceProvider.cs
- TextElementEnumerator.cs
- UnauthorizedAccessException.cs
- FixedTextView.cs
- MsmqInputChannelListener.cs
- DataGridViewCheckBoxCell.cs
- JavaScriptObjectDeserializer.cs
- DynamicControlParameter.cs
- DirectoryInfo.cs
- ToolboxComponentsCreatingEventArgs.cs
- Zone.cs
- XmlSecureResolver.cs
- InvalidEnumArgumentException.cs
- PriorityChain.cs
- Brush.cs
- TemplateControlParser.cs
- FrameworkElementFactoryMarkupObject.cs
- EntityClassGenerator.cs
- FixedDSBuilder.cs
- SpecialNameAttribute.cs
- CodeAttributeArgumentCollection.cs
- Rule.cs
- SimpleHandlerBuildProvider.cs
- FieldBuilder.cs
- ListViewVirtualItemsSelectionRangeChangedEvent.cs
- UidManager.cs
- storepermission.cs
- BinaryOperationBinder.cs
- HtmlButton.cs
- PropertyIdentifier.cs
- QilScopedVisitor.cs
- CharacterBufferReference.cs
- Int32AnimationUsingKeyFrames.cs
- ViewStateException.cs
- CodeDOMProvider.cs
- OleDbErrorCollection.cs
- SequentialOutput.cs
- PropertyEmitter.cs
- StrokeCollectionDefaultValueFactory.cs
- CodeBinaryOperatorExpression.cs
- HttpTransportBindingElement.cs
- AccessText.cs
- DebuggerAttributes.cs
- CalendarTable.cs
- NativeMethods.cs
- SafePEFileHandle.cs
- SafeRightsManagementEnvironmentHandle.cs
- FrameSecurityDescriptor.cs
- ContainsSearchOperator.cs
- Registry.cs
- IChannel.cs
- CultureInfo.cs
- ChannelFactory.cs
- RootContext.cs
- RulePatternOps.cs
- ToolStripOverflowButton.cs
- SystemIPInterfaceProperties.cs
- AutomationEventArgs.cs
- ControlUtil.cs
- IndexedEnumerable.cs
- FixedTextSelectionProcessor.cs
- SynchronizedDispatch.cs
- TypeBuilder.cs
- Subtree.cs
- _RegBlobWebProxyDataBuilder.cs
- AttachedProperty.cs
- objectresult_tresulttype.cs
- StickyNote.cs
- OracleFactory.cs
- AsyncOperationContext.cs
- ItemChangedEventArgs.cs
- XmlSerializerSection.cs
- TextClipboardData.cs
- GeometryDrawing.cs
- HierarchicalDataTemplate.cs
- TabletCollection.cs