309 lines
10 KiB
C#
309 lines
10 KiB
C#
//------------------------------------------------------------
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//------------------------------------------------------------
|
|
|
|
namespace System.Workflow.Activities
|
|
{
|
|
using System;
|
|
using System.ComponentModel;
|
|
using System.Drawing.Design;
|
|
using System.Diagnostics.CodeAnalysis;
|
|
using System.Net.Security;
|
|
using System.Reflection;
|
|
using System.ServiceModel;
|
|
using System.Workflow.Activities.Design;
|
|
using System.Workflow.ComponentModel;
|
|
using System.Workflow.ComponentModel.Compiler;
|
|
|
|
[Obsolete("The System.Workflow.* types are deprecated. Instead, please use the new types from System.Activities.*")]
|
|
public sealed class OperationInfo : OperationInfoBase
|
|
{
|
|
[SuppressMessage("Microsoft.Security", "CA2104:DoNotDeclareReadOnlyMutableReferenceTypes")]
|
|
internal static readonly DependencyProperty ContractNameProperty =
|
|
DependencyProperty.Register("ContractName",
|
|
typeof(string), typeof(OperationInfo),
|
|
new PropertyMetadata(null, DependencyPropertyOptions.Metadata));
|
|
|
|
[SuppressMessage("Microsoft.Security", "CA2104:DoNotDeclareReadOnlyMutableReferenceTypes")]
|
|
internal static readonly DependencyProperty IsOneWayProperty =
|
|
DependencyProperty.Register("IsOneWay",
|
|
typeof(bool), typeof(OperationInfo),
|
|
new PropertyMetadata(false, DependencyPropertyOptions.Metadata));
|
|
|
|
[SuppressMessage("Microsoft.Security", "CA2104:DoNotDeclareReadOnlyMutableReferenceTypes")]
|
|
internal static readonly DependencyProperty ParametersProperty =
|
|
DependencyProperty.Register("Parameters",
|
|
typeof(OperationParameterInfoCollection), typeof(OperationInfo),
|
|
new PropertyMetadata(null, DependencyPropertyOptions.Metadata | DependencyPropertyOptions.ReadOnly,
|
|
new Attribute[] {
|
|
new DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Content)
|
|
}
|
|
));
|
|
|
|
[SuppressMessage("Microsoft.Security", "CA2104:DoNotDeclareReadOnlyMutableReferenceTypes")]
|
|
internal static readonly DependencyProperty ProtectionLevelProperty =
|
|
DependencyProperty.Register("ProtectionLevel",
|
|
typeof(ProtectionLevel?), typeof(OperationInfo),
|
|
new PropertyMetadata(null, DependencyPropertyOptions.Metadata));
|
|
|
|
public OperationInfo()
|
|
{
|
|
this.SetReadOnlyPropertyValue(OperationInfo.ParametersProperty,
|
|
new OperationParameterInfoCollection(this));
|
|
}
|
|
|
|
public string ContractName
|
|
{
|
|
get
|
|
{
|
|
return (string) this.GetValue(OperationInfo.ContractNameProperty);
|
|
}
|
|
set
|
|
{
|
|
this.SetValue(OperationInfo.ContractNameProperty, value);
|
|
}
|
|
}
|
|
|
|
[DefaultValue(false)]
|
|
public bool HasProtectionLevel
|
|
{
|
|
get
|
|
{
|
|
return (this.ProtectionLevel != null);
|
|
}
|
|
}
|
|
|
|
[DefaultValue(false)]
|
|
public bool IsOneWay
|
|
{
|
|
get
|
|
{
|
|
return (bool) this.GetValue(OperationInfo.IsOneWayProperty);
|
|
}
|
|
set
|
|
{
|
|
this.SetValue(OperationInfo.IsOneWayProperty, value);
|
|
}
|
|
}
|
|
|
|
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
|
|
public OperationParameterInfoCollection Parameters
|
|
{
|
|
get
|
|
{
|
|
return (OperationParameterInfoCollection) this.GetValue(OperationInfo.ParametersProperty);
|
|
}
|
|
}
|
|
|
|
[DefaultValue(null)]
|
|
public ProtectionLevel? ProtectionLevel
|
|
{
|
|
get
|
|
{
|
|
return (ProtectionLevel?) this.GetValue(OperationInfo.ProtectionLevelProperty);
|
|
}
|
|
set
|
|
{
|
|
this.SetValue(OperationInfo.ProtectionLevelProperty, value);
|
|
}
|
|
}
|
|
|
|
public override OperationInfoBase Clone()
|
|
{
|
|
OperationInfo clonedOperation = (OperationInfo) base.Clone();
|
|
clonedOperation.ContractName = this.ContractName;
|
|
clonedOperation.IsOneWay = this.IsOneWay;
|
|
if (this.HasProtectionLevel)
|
|
{
|
|
clonedOperation.ProtectionLevel = this.ProtectionLevel;
|
|
}
|
|
|
|
foreach (OperationParameterInfo parameter in this.Parameters)
|
|
{
|
|
clonedOperation.Parameters.Add(parameter.Clone());
|
|
}
|
|
|
|
return clonedOperation;
|
|
}
|
|
|
|
public override bool Equals(object obj)
|
|
{
|
|
if (!base.Equals(obj))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
OperationInfo operationInfo = obj as OperationInfo;
|
|
if (operationInfo == null)
|
|
{
|
|
return false;
|
|
}
|
|
if (String.Compare(operationInfo.ContractName, this.ContractName, StringComparison.Ordinal) != 0)
|
|
{
|
|
return false;
|
|
}
|
|
if (operationInfo.IsOneWay != this.IsOneWay)
|
|
{
|
|
return false;
|
|
}
|
|
if (operationInfo.HasProtectionLevel != this.HasProtectionLevel)
|
|
{
|
|
return false;
|
|
}
|
|
if (operationInfo.ProtectionLevel != this.ProtectionLevel)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (operationInfo.Parameters.Count != this.Parameters.Count)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
foreach (OperationParameterInfo parameter in operationInfo.Parameters)
|
|
{
|
|
OperationParameterInfo correspondingParameter = this.Parameters[parameter.Name];
|
|
if (correspondingParameter == null)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (!parameter.Equals(correspondingParameter))
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public override int GetHashCode()
|
|
{
|
|
return base.GetHashCode();
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
string returnValue = string.Empty;
|
|
if (!string.IsNullOrEmpty(this.Name))
|
|
{
|
|
returnValue = this.Name;
|
|
|
|
if (!string.IsNullOrEmpty(this.ContractName))
|
|
{
|
|
returnValue = this.ContractName + "." + returnValue;
|
|
}
|
|
}
|
|
|
|
return returnValue;
|
|
}
|
|
|
|
protected internal override string GetContractFullName(IServiceProvider provider)
|
|
{
|
|
return this.ContractName;
|
|
}
|
|
|
|
protected internal override Type GetContractType(IServiceProvider provider)
|
|
{
|
|
Type contractType = DynamicContractTypeBuilder.GetContractType(this, this.ParentDependencyObject as ReceiveActivity);
|
|
if (contractType == null && !this.IsReadOnly)
|
|
{
|
|
Activity owner = this.ParentDependencyObject as Activity;
|
|
if (owner != null)
|
|
{
|
|
owner.RootActivity.RemoveProperty(DynamicContractTypeBuilder.DynamicContractTypesProperty);
|
|
}
|
|
|
|
contractType = DynamicContractTypeBuilder.GetContractType(this, this.ParentDependencyObject as ReceiveActivity);
|
|
}
|
|
return contractType;
|
|
}
|
|
|
|
internal protected override bool GetIsOneWay(IServiceProvider provider)
|
|
{
|
|
return this.IsOneWay;
|
|
}
|
|
|
|
internal protected override MethodInfo GetMethodInfo(IServiceProvider provider)
|
|
{
|
|
if (string.IsNullOrEmpty(this.Name))
|
|
{
|
|
return null;
|
|
}
|
|
|
|
MethodInfo methodInfo = null;
|
|
if (this.IsReadOnly)
|
|
{
|
|
if (this.UserData.Contains(OperationInfoBase.MethodInfoProperty))
|
|
{
|
|
methodInfo = this.UserData[OperationInfoBase.MethodInfoProperty] as MethodInfo;
|
|
}
|
|
|
|
if (methodInfo != null)
|
|
{
|
|
return methodInfo;
|
|
}
|
|
}
|
|
|
|
methodInfo = InternalGetMethodInfo(provider);
|
|
if (methodInfo == null && !this.IsReadOnly)
|
|
{
|
|
Activity owner = this.ParentDependencyObject as Activity;
|
|
if (owner != null)
|
|
{
|
|
owner.RootActivity.RemoveProperty(DynamicContractTypeBuilder.DynamicContractTypesProperty);
|
|
}
|
|
methodInfo = InternalGetMethodInfo(provider);
|
|
}
|
|
|
|
if (this.IsReadOnly)
|
|
{
|
|
this.UserData[OperationInfoBase.MethodInfoProperty] = methodInfo;
|
|
}
|
|
|
|
return methodInfo;
|
|
}
|
|
|
|
internal protected override OperationParameterInfoCollection GetParameters(IServiceProvider provider)
|
|
{
|
|
return this.Parameters;
|
|
}
|
|
|
|
internal void ResetProtectionLevel()
|
|
{
|
|
this.ProtectionLevel = null;
|
|
}
|
|
|
|
MethodInfo InternalGetMethodInfo(IServiceProvider provider)
|
|
{
|
|
Type type = this.GetContractType(provider);
|
|
if (type != null)
|
|
{
|
|
foreach (MethodInfo methodInfo in type.GetMethods())
|
|
{
|
|
object[] operationContractAttribs =
|
|
methodInfo.GetCustomAttributes(typeof(OperationContractAttribute), true);
|
|
|
|
if (operationContractAttribs != null && operationContractAttribs.Length > 0)
|
|
{
|
|
string operationName =
|
|
((OperationContractAttribute) operationContractAttribs[0]).Name;
|
|
|
|
if (string.IsNullOrEmpty(operationName) &&
|
|
string.Compare(methodInfo.Name, this.Name, StringComparison.Ordinal) == 0)
|
|
{
|
|
return methodInfo;
|
|
}
|
|
else if (string.Compare(operationName, this.Name, StringComparison.Ordinal) == 0)
|
|
{
|
|
return methodInfo;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|
|
}
|