Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / whidbey / NetFxQFE / 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
- SettingsBindableAttribute.cs
- GeometryHitTestParameters.cs
- HtmlFormWrapper.cs
- FileDialogPermission.cs
- HwndProxyElementProvider.cs
- WinFormsComponentEditor.cs
- SHA1CryptoServiceProvider.cs
- BindingExpression.cs
- PersonalizableAttribute.cs
- ZipIOLocalFileHeader.cs
- Overlapped.cs
- ParallelDesigner.cs
- GenericEnumConverter.cs
- Expander.cs
- DesignerDataView.cs
- SQLConvert.cs
- VerificationAttribute.cs
- PowerStatus.cs
- CodeDomComponentSerializationService.cs
- Validator.cs
- FormViewPagerRow.cs
- LogAppendAsyncResult.cs
- TeredoHelper.cs
- Dispatcher.cs
- EntitySetDataBindingList.cs
- WsiProfilesElement.cs
- ObjectStateManagerMetadata.cs
- Serializer.cs
- ConsoleTraceListener.cs
- JavaScriptSerializer.cs
- HttpRequestWrapper.cs
- SafeCryptoHandles.cs
- WindowsGraphics2.cs
- PlatformCulture.cs
- HttpListenerRequest.cs
- NameValueSectionHandler.cs
- BasePattern.cs
- HtmlTextArea.cs
- ProfessionalColorTable.cs
- GenericTypeParameterBuilder.cs
- ConnectionInterfaceCollection.cs
- TextInfo.cs
- DoubleLinkList.cs
- ScrollContentPresenter.cs
- _LazyAsyncResult.cs
- RenamedEventArgs.cs
- BinaryObjectReader.cs
- DelegateArgumentReference.cs
- WindowsFormsDesignerOptionService.cs
- VirtualPathUtility.cs
- ParallelTimeline.cs
- SoapAttributeAttribute.cs
- VisualStyleElement.cs
- CodeDOMProvider.cs
- TypeDescriptor.cs
- SlipBehavior.cs
- ResourceContainer.cs
- SoapExtensionImporter.cs
- AppDomain.cs
- SoapSchemaImporter.cs
- SerializationException.cs
- GeometryModel3D.cs
- Attachment.cs
- XamlGridLengthSerializer.cs
- ReferencedCollectionType.cs
- Hex.cs
- PermissionListSet.cs
- CachedFontFamily.cs
- PrimaryKeyTypeConverter.cs
- XsltLoader.cs
- MetadataHelper.cs
- DataBoundControl.cs
- ModuleElement.cs
- EncodingDataItem.cs
- DesignerOptionService.cs
- HttpInputStream.cs
- TypeElement.cs
- DataListItemCollection.cs
- ResizeGrip.cs
- DocumentReferenceCollection.cs
- FormClosingEvent.cs
- HybridDictionary.cs
- FragmentQueryProcessor.cs
- StaticContext.cs
- PingOptions.cs
- XNodeValidator.cs
- Int64Storage.cs
- WizardStepBase.cs
- SoapReflectionImporter.cs
- SafeRegistryHandle.cs
- ApplicationManager.cs
- ClientProxyGenerator.cs
- SerializableAttribute.cs
- DataControlField.cs
- BulletedList.cs
- XmlSchemaNotation.cs
- ApplicationDirectoryMembershipCondition.cs
- StringSorter.cs
- XmlNodeWriter.cs
- CodeArrayCreateExpression.cs