File: System\ServiceModel\Dispatcher\ClientOperation.cs
Project: ndp\cdf\src\WCF\ServiceModel\System.ServiceModel.csproj (System.ServiceModel)

//-----------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//-----------------------------------------------------------------------------
 
namespace System.ServiceModel.Dispatcher
{
    using System;
    using System.Reflection;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Diagnostics.CodeAnalysis;
 
    [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Compat", Justification = "Compat is an accepted abbreviation")]
    [EditorBrowsable(EditorBrowsableState.Never)]
    public class ClientOperationCompatBase
    {
        internal ClientOperationCompatBase() { }
        [EditorBrowsable(EditorBrowsableState.Never)]
        [Obsolete("This API supports the .NET Framework infrastructure and is not intended to be used directly from your code.", true)]
        public IList<IParameterInspector> ParameterInspectors
        {
            get
            {
                return this.parameterInspectors;
            }
        }
        internal SynchronizedCollection<IParameterInspector> parameterInspectors;
    }
 
    public sealed class ClientOperation : ClientOperationCompatBase
    {
        string action;
        SynchronizedCollection<FaultContractInfo> faultContractInfos;
        bool serializeRequest;
        bool deserializeReply;
        IClientMessageFormatter formatter;
        IClientFaultFormatter faultFormatter;
        bool isInitiating = true;
        bool isOneWay;
        bool isTerminating;
        bool isSessionOpenNotificationEnabled;
        string name;
 
        ClientRuntime parent;
        string replyAction;
        MethodInfo beginMethod;
        MethodInfo endMethod;
        MethodInfo syncMethod;
        MethodInfo taskMethod;
        Type taskTResult;
        bool isFaultFormatterSetExplicit = false;
 
        public ClientOperation(ClientRuntime parent, string name, string action)
            : this(parent, name, action, null)
        {
        }
 
        public ClientOperation(ClientRuntime parent, string name, string action, string replyAction)
        {
            if (parent == null)
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("parent");
 
            if (name == null)
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("name");
 
            this.parent = parent;
            this.name = name;
            this.action = action;
            this.replyAction = replyAction;
 
            this.faultContractInfos = parent.NewBehaviorCollection<FaultContractInfo>();
            this.parameterInspectors = parent.NewBehaviorCollection<IParameterInspector>();
        }
 
        public string Action
        {
            get { return this.action; }
        }
 
        public SynchronizedCollection<FaultContractInfo> FaultContractInfos
        {
            get { return this.faultContractInfos; }
        }
 
        public MethodInfo BeginMethod
        {
            get { return this.beginMethod; }
            set
            {
                lock (this.parent.ThisLock)
                {
                    this.parent.InvalidateRuntime();
                    this.beginMethod = value;
                }
            }
        }
 
        public MethodInfo EndMethod
        {
            get { return this.endMethod; }
            set
            {
                lock (this.parent.ThisLock)
                {
                    this.parent.InvalidateRuntime();
                    this.endMethod = value;
                }
            }
        }
 
        public MethodInfo SyncMethod
        {
            get { return this.syncMethod; }
            set
            {
                lock (this.parent.ThisLock)
                {
                    this.parent.InvalidateRuntime();
                    this.syncMethod = value;
                }
            }
        }
        
        public IClientMessageFormatter Formatter
        {
            get { return this.formatter; }
            set
            {
                lock (this.parent.ThisLock)
                {
                    this.parent.InvalidateRuntime();
                    this.formatter = value;
                }
            }
        }
        
        internal IClientFaultFormatter FaultFormatter
        {
            get 
            {
                if (this.faultFormatter == null)
                {
                    this.faultFormatter = new DataContractSerializerFaultFormatter(this.faultContractInfos);
                }
                return this.faultFormatter; 
            }
            set
            {
                lock (this.parent.ThisLock)
                {
                    this.parent.InvalidateRuntime();
                    this.faultFormatter = value;
                    this.isFaultFormatterSetExplicit = true;
                }
            }
        }
 
        internal bool IsFaultFormatterSetExplicit
        {
            get 
            {
                return this.isFaultFormatterSetExplicit; 
            }
        }
 
        internal IClientMessageFormatter InternalFormatter
        {
            get { return this.formatter; }
            set { this.formatter = value; }
        }
 
        public bool IsInitiating
        {
            get { return this.isInitiating; }
            set
            {
                lock (this.parent.ThisLock)
                {
                    this.parent.InvalidateRuntime();
                    this.isInitiating = value;
                }
            }
        }
 
        public bool IsOneWay
        {
            get { return this.isOneWay; }
            set
            {
                lock (this.parent.ThisLock)
                {
                    this.parent.InvalidateRuntime();
                    this.isOneWay = value;
                }
            }
        }
 
        public bool IsTerminating
        {
            get { return this.isTerminating; }
            set
            {
                lock (this.parent.ThisLock)
                {
                    this.parent.InvalidateRuntime();
                    this.isTerminating = value;
                }
            }
        }
 
        public string Name
        {
            get { return this.name; }
        }
 
        public ICollection<IParameterInspector> ClientParameterInspectors
        {
            get { return this.ParameterInspectors; }
        }
 
        [EditorBrowsable(EditorBrowsableState.Never)]
        public new SynchronizedCollection<IParameterInspector> ParameterInspectors
        {
            get { return this.parameterInspectors; }
        }
 
        public ClientRuntime Parent
        {
            get { return this.parent; }
        }
 
        public string ReplyAction
        {
            get { return this.replyAction; }
        }
 
        public bool SerializeRequest
        {
            get { return this.serializeRequest; }
            set
            {
                lock (this.parent.ThisLock)
                {
                    this.parent.InvalidateRuntime();
                    this.serializeRequest = value;
                }
            }
        }
 
        public bool DeserializeReply
        {
            get { return this.deserializeReply; }
            set
            {
                lock (this.parent.ThisLock)
                {
                    this.parent.InvalidateRuntime();
                    this.deserializeReply = value;
                }
            }
        }
 
        public MethodInfo TaskMethod 
        {
            get { return this.taskMethod; }
            set
            {
                lock (this.parent.ThisLock)
                {
                    this.parent.InvalidateRuntime();
                    this.taskMethod = value;
                }
            } 
        }
 
        public Type TaskTResult 
        {
            get { return this.taskTResult; }
            set
            {
                lock (this.parent.ThisLock)
                {
                    this.parent.InvalidateRuntime();
                    this.taskTResult = value;
                }
            }  
        }
 
        internal bool IsSessionOpenNotificationEnabled
        {
            get { return this.isSessionOpenNotificationEnabled; }
            set
            {
                lock (this.parent.ThisLock)
                {
                    this.parent.InvalidateRuntime();
                    this.isSessionOpenNotificationEnabled = value;
                }
            }
        }
 
    }
}