e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
229 lines
6.7 KiB
C#
229 lines
6.7 KiB
C#
//------------------------------------------------------------
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//------------------------------------------------------------
|
|
namespace System.ServiceModel.Description
|
|
{
|
|
using System.Collections.Generic;
|
|
using System.ServiceModel.Channels;
|
|
using System.ServiceModel;
|
|
using System.Xml;
|
|
using System.Runtime.Serialization;
|
|
using System.Diagnostics;
|
|
using System.Net.Security;
|
|
using System.ServiceModel.Security;
|
|
using System.ComponentModel;
|
|
|
|
[DebuggerDisplay("Action={action}, Direction={direction}, MessageType={messageType}")]
|
|
public class MessageDescription
|
|
{
|
|
static Type typeOfUntypedMessage;
|
|
string action;
|
|
MessageDirection direction;
|
|
MessageDescriptionItems items;
|
|
XmlName messageName;
|
|
Type messageType;
|
|
XmlQualifiedName xsdType;
|
|
ProtectionLevel protectionLevel;
|
|
bool hasProtectionLevel;
|
|
|
|
public MessageDescription(string action, MessageDirection direction) : this(action, direction, null) { }
|
|
internal MessageDescription(string action, MessageDirection direction, MessageDescriptionItems items)
|
|
{
|
|
if (!MessageDirectionHelper.IsDefined(direction))
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("direction"));
|
|
|
|
this.action = action;
|
|
this.direction = direction;
|
|
this.items = items;
|
|
}
|
|
|
|
internal MessageDescription(MessageDescription other)
|
|
{
|
|
this.action = other.action;
|
|
this.direction = other.direction;
|
|
this.Items.Body = other.Items.Body.Clone();
|
|
foreach (MessageHeaderDescription mhd in other.Items.Headers)
|
|
{
|
|
this.Items.Headers.Add(mhd.Clone() as MessageHeaderDescription);
|
|
}
|
|
foreach (MessagePropertyDescription mpd in other.Items.Properties)
|
|
{
|
|
this.Items.Properties.Add(mpd.Clone() as MessagePropertyDescription);
|
|
}
|
|
this.MessageName = other.MessageName;
|
|
this.MessageType = other.MessageType;
|
|
this.XsdTypeName = other.XsdTypeName;
|
|
this.hasProtectionLevel = other.hasProtectionLevel;
|
|
this.ProtectionLevel = other.ProtectionLevel;
|
|
}
|
|
|
|
internal MessageDescription Clone()
|
|
{
|
|
return new MessageDescription(this);
|
|
}
|
|
|
|
public string Action
|
|
{
|
|
get { return action; }
|
|
internal set { action = value; }
|
|
}
|
|
|
|
public MessageBodyDescription Body
|
|
{
|
|
get { return Items.Body; }
|
|
}
|
|
|
|
public MessageDirection Direction
|
|
{
|
|
get { return direction; }
|
|
}
|
|
|
|
public MessageHeaderDescriptionCollection Headers
|
|
{
|
|
get { return Items.Headers; }
|
|
}
|
|
|
|
public MessagePropertyDescriptionCollection Properties
|
|
{
|
|
get { return Items.Properties; }
|
|
}
|
|
|
|
internal MessageDescriptionItems Items
|
|
{
|
|
get
|
|
{
|
|
if (items == null)
|
|
items = new MessageDescriptionItems();
|
|
return items;
|
|
}
|
|
}
|
|
|
|
public ProtectionLevel ProtectionLevel
|
|
{
|
|
get { return this.protectionLevel; }
|
|
set
|
|
{
|
|
if (!ProtectionLevelHelper.IsDefined(value))
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("value"));
|
|
this.protectionLevel = value;
|
|
this.hasProtectionLevel = true;
|
|
}
|
|
}
|
|
|
|
public bool ShouldSerializeProtectionLevel()
|
|
{
|
|
return this.HasProtectionLevel;
|
|
}
|
|
|
|
public bool HasProtectionLevel
|
|
{
|
|
get { return this.hasProtectionLevel; }
|
|
}
|
|
|
|
internal static Type TypeOfUntypedMessage
|
|
{
|
|
get
|
|
{
|
|
if (typeOfUntypedMessage == null)
|
|
{
|
|
typeOfUntypedMessage = typeof(Message);
|
|
}
|
|
return typeOfUntypedMessage;
|
|
}
|
|
}
|
|
|
|
internal XmlName MessageName
|
|
{
|
|
get { return messageName; }
|
|
set { messageName = value; }
|
|
}
|
|
|
|
// Not serializable on purpose, metadata import/export cannot
|
|
// produce it, only available when binding to runtime
|
|
[DefaultValue(null)]
|
|
public Type MessageType
|
|
{
|
|
get { return messageType; }
|
|
set { messageType = value; }
|
|
}
|
|
|
|
internal bool IsTypedMessage
|
|
{
|
|
get
|
|
{
|
|
return messageType != null;
|
|
}
|
|
}
|
|
|
|
internal bool IsUntypedMessage
|
|
{
|
|
get
|
|
{
|
|
return (Body.ReturnValue != null && Body.Parts.Count == 0 && Body.ReturnValue.Type == TypeOfUntypedMessage) ||
|
|
(Body.ReturnValue == null && Body.Parts.Count == 1 && Body.Parts[0].Type == TypeOfUntypedMessage);
|
|
}
|
|
}
|
|
|
|
internal bool IsVoid
|
|
{
|
|
get
|
|
{
|
|
return !IsTypedMessage && Body.Parts.Count == 0 && (Body.ReturnValue == null || Body.ReturnValue.Type == typeof(void));
|
|
}
|
|
}
|
|
|
|
internal XmlQualifiedName XsdTypeName
|
|
{
|
|
get { return xsdType; }
|
|
set { xsdType = value; }
|
|
}
|
|
|
|
internal void ResetProtectionLevel()
|
|
{
|
|
this.protectionLevel = ProtectionLevel.None;
|
|
this.hasProtectionLevel = false;
|
|
}
|
|
}
|
|
|
|
internal class MessageDescriptionItems
|
|
{
|
|
MessageHeaderDescriptionCollection headers;
|
|
MessageBodyDescription body;
|
|
MessagePropertyDescriptionCollection properties;
|
|
|
|
internal MessageBodyDescription Body
|
|
{
|
|
get
|
|
{
|
|
if (body == null)
|
|
body = new MessageBodyDescription();
|
|
return body;
|
|
}
|
|
set
|
|
{
|
|
this.body = value;
|
|
}
|
|
}
|
|
|
|
internal MessageHeaderDescriptionCollection Headers
|
|
{
|
|
get
|
|
{
|
|
if (headers == null)
|
|
headers = new MessageHeaderDescriptionCollection();
|
|
return headers;
|
|
}
|
|
}
|
|
|
|
internal MessagePropertyDescriptionCollection Properties
|
|
{
|
|
get
|
|
{
|
|
if (properties == null)
|
|
properties = new MessagePropertyDescriptionCollection();
|
|
return properties;
|
|
}
|
|
}
|
|
}
|
|
}
|