private void SessionOnDisconnected(bool unexpected)
        {
            SendOutMessage(new DisconnectMessage
            {
                Error = unexpected ? new InvalidOperationException(LocalizedStrings.Str2551) : null
            });

            _client = null;
        }
		/// <summary>
		/// Send message.
		/// </summary>
		/// <param name="message">Message.</param>
		protected override void OnSendInMessage(Message message)
		{
			switch (message.Type)
			{
				case MessageTypes.Reset:
				{
					_subscriptions.Clear();

					if (_client != null)
					{
						try
						{
							DisposeClient();
						}
						catch (Exception ex)
						{
							SendOutError(ex);
						}

						_client = null;
					}

					SendOutMessage(new ResetMessage());

					break;
				}

				case MessageTypes.Connect:
				{
					if (_client != null)
						throw new InvalidOperationException(LocalizedStrings.Str1619);

					_subscriptions.Clear();

					switch (Remoting)
					{
						case OpenECryRemoting.None:
						case OpenECryRemoting.Primary:
							_client = new OECClient(new InPlaceThreadPolicy())
							{
								UUID = Uuid,
								EventBatchInterval = 0,
								RemoteHostingEnabled = Remoting == OpenECryRemoting.Primary,
								//PriceHost = "",
								//AutoSubscribe = false
							};
							break;
						case OpenECryRemoting.Secondary:
							_client = OECClient.CreateInstance(true);
							break;
						default:
							throw new ArgumentOutOfRangeException();
					}

					if (EnableOECLogging)
					{
						if (Remoting == OpenECryRemoting.Secondary)
						{
							this.AddWarningLog(LocalizedStrings.Str2552);
						}
						else
						{
							OEC.Log.ConsoleOutput = false;
							_client.SetLoggingConfig(new LoggingConfiguration { Level = OEC.API.LogLevel.All });
							OEC.Log.Initialize(new OECLogger(this));
							OEC.Log.Start();
						}
					}

					_client.OnLoginComplete += SessionOnLoginComplete;
					_client.OnLoginFailed += SessionOnLoginFailed;
					_client.OnDisconnected += SessionOnDisconnected;
					_client.OnBeginEvents += SessionOnBeginEvents;
					_client.OnEndEvents += SessionOnEndEvents;
					_client.OnError += SessionOnError;

					_client.OnAccountRiskLimitChanged += SessionOnAccountRiskLimitChanged;
					_client.OnAccountSummaryChanged += SessionOnAccountSummaryChanged;
					_client.OnAllocationBlocksChanged += SessionOnAllocationBlocksChanged;
					_client.OnAvgPositionChanged += SessionOnAvgPositionChanged;
					_client.OnBalanceChanged += SessionOnBalanceChanged;
					_client.OnCommandUpdated += SessionOnCommandUpdated;
					_client.OnCompoundPositionGroupChanged += SessionOnCompoundPositionGroupChanged;
					_client.OnOrderConfirmed += SessionOnOrderConfirmed;
					_client.OnOrderFilled += SessionOnOrderFilled;
					_client.OnOrderStateChanged += SessionOnOrderStateChanged;
					_client.OnDetailedPositionChanged += SessionOnDetailedPositionChanged;
					_client.OnMarginCalculationCompleted += SessionOnMarginCalculationCompleted;
					_client.OnPortfolioMarginChanged += SessionOnPortfolioMarginChanged;
					_client.OnPostAllocation += SessionOnPostAllocation;
					_client.OnRiskLimitDetailsReceived += SessionOnRiskLimitDetailsReceived;

					_client.OnBarsReceived += SessionOnBarsReceived;
					_client.OnContinuousContractRuleChanged += SessionOnContinuousContractRuleChanged;
					_client.OnContractChanged += SessionOnContractChanged;
					_client.OnContractCreated += SessionOnContractCreated;
					_client.OnContractRiskLimitChanged += SessionOnContractRiskLimitChanged;
					_client.OnContractsChanged += SessionOnContractsChanged;
					_client.OnCurrencyPriceChanged += SessionOnCurrencyPriceChanged;
					_client.OnDOMChanged += SessionOnDomChanged;
					_client.OnDealQuoteUpdated += SessionOnDealQuoteUpdated;
					_client.OnHistogramReceived += SessionOnHistogramReceived;
					_client.OnHistoryReceived += SessionOnHistoryReceived;
					_client.OnIndexComponentsReceived += SessionOnIndexComponentsReceived;
					_client.OnLoggedUserClientsChanged += SessionOnLoggedUserClientsChanged;
					_client.OnNewsMessage += SessionOnNewsMessage;
					_client.OnOsmAlgoListLoaded += SessionOnOsmAlgoListLoaded;
					_client.OnOsmAlgoListUpdated += SessionOnOsmAlgoListUpdated;
					_client.OnPitGroupsChanged += SessionOnPitGroupsChanged;
					_client.OnPriceChanged += SessionOnPriceChanged;
					_client.OnPriceTick += SessionOnPriceTick;
					_client.OnProductCalendarUpdated += SessionOnProductCalendarUpdated;
					_client.OnQuoteDetailsChanged += SessionOnQuoteDetailsChanged;
					_client.OnRelationsChanged += SessionOnRelationsChanged;
					_client.OnSymbolLookupReceived += SessionOnSymbolLookupReceived;
					_client.OnTicksReceived += SessionOnTicksReceived;
					_client.OnTradersChanged += SessionOnTradersChanged;
					_client.OnUserMessage += SessionOnUserMessage;
					_client.OnUserStatusChanged += SessionOnUserStatusChanged;

					_client.Connect(Address.GetHost(), Address.GetPort(), Login, Password.To<string>(), UseNativeReconnect);

					break;
				}

				case MessageTypes.Disconnect:
				{
					if (_client == null)
						throw new InvalidOperationException(LocalizedStrings.Str1856);

					DisposeClient();
					_client.Disconnect();
					break;
				}

				case MessageTypes.SecurityLookup:
				{
					ProcessSecurityLookup((SecurityLookupMessage)message);
					break;
				}

				case MessageTypes.OrderRegister:
				{
					ProcessOrderRegister((OrderRegisterMessage)message);
					break;
				}

				case MessageTypes.OrderCancel:
				{
					ProcessOrderCancel((OrderCancelMessage)message);
					break;
				}

				case MessageTypes.OrderReplace:
				{
					ProcessOrderReplace((OrderReplaceMessage)message);
					break;
				}

				case MessageTypes.PortfolioLookup:
				{
					ProcessPortfolioLookupMessage((PortfolioLookupMessage)message);
					break;
				}

				case MessageTypes.OrderStatus:
				{
					ProcessOrderStatusMessage();
					break;
				}

				case MessageTypes.MarketData:
				{
					ProcessMarketDataMessage((MarketDataMessage)message);
					break;
				}

				case MessageTypes.News:
				{
					var newsMsg = (Messages.NewsMessage)message;
					_client.SendMessage(_client.Users[newsMsg.Source], newsMsg.Headline);
					break;
				}
			}
		}
		private void SessionOnDisconnected(bool unexpected)
		{
			SendOutMessage(new DisconnectMessage
			{
				Error = unexpected ? new InvalidOperationException(LocalizedStrings.Str2551) : null
			});

			_client = null;
		}
        /// <summary>
        /// Send message.
        /// </summary>
        /// <param name="message">Message.</param>
        protected override void OnSendInMessage(Message message)
        {
            switch (message.Type)
            {
            case MessageTypes.Reset:
            {
                _subscriptions.Clear();

                if (_client != null)
                {
                    try
                    {
                        DisposeClient();
                    }
                    catch (Exception ex)
                    {
                        SendOutError(ex);
                    }

                    _client = null;
                }

                SendOutMessage(new ResetMessage());

                break;
            }

            case MessageTypes.Connect:
            {
                if (_client != null)
                {
                    throw new InvalidOperationException(LocalizedStrings.Str1619);
                }

                _subscriptions.Clear();

                switch (Remoting)
                {
                case OpenECryRemoting.None:
                case OpenECryRemoting.Primary:
                    _client = new OECClient(new InPlaceThreadPolicy())
                    {
                        UUID = Uuid,
                        EventBatchInterval   = 0,
                        RemoteHostingEnabled = Remoting == OpenECryRemoting.Primary,
                        //PriceHost = "",
                        //AutoSubscribe = false
                    };
                    break;

                case OpenECryRemoting.Secondary:
                    _client = OECClient.CreateInstance(true);
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }

                if (EnableOECLogging)
                {
                    if (Remoting == OpenECryRemoting.Secondary)
                    {
                        this.AddWarningLog(LocalizedStrings.Str2552);
                    }
                    else
                    {
                        OEC.Log.ConsoleOutput = false;
                        _client.SetLoggingConfig(new LoggingConfiguration {
                                Level = OEC.API.LogLevel.All
                            });
                        OEC.Log.Initialize(new OECLogger(this));
                        OEC.Log.Start();
                    }
                }

                _client.OnLoginComplete += SessionOnLoginComplete;
                _client.OnLoginFailed   += SessionOnLoginFailed;
                _client.OnDisconnected  += SessionOnDisconnected;
                _client.OnBeginEvents   += SessionOnBeginEvents;
                _client.OnEndEvents     += SessionOnEndEvents;
                _client.OnError         += SessionOnError;

                _client.OnAccountRiskLimitChanged      += SessionOnAccountRiskLimitChanged;
                _client.OnAccountSummaryChanged        += SessionOnAccountSummaryChanged;
                _client.OnAllocationBlocksChanged      += SessionOnAllocationBlocksChanged;
                _client.OnAvgPositionChanged           += SessionOnAvgPositionChanged;
                _client.OnBalanceChanged               += SessionOnBalanceChanged;
                _client.OnCommandUpdated               += SessionOnCommandUpdated;
                _client.OnCompoundPositionGroupChanged += SessionOnCompoundPositionGroupChanged;
                _client.OnOrderConfirmed               += SessionOnOrderConfirmed;
                _client.OnOrderFilled                += SessionOnOrderFilled;
                _client.OnOrderStateChanged          += SessionOnOrderStateChanged;
                _client.OnDetailedPositionChanged    += SessionOnDetailedPositionChanged;
                _client.OnMarginCalculationCompleted += SessionOnMarginCalculationCompleted;
                _client.OnPortfolioMarginChanged     += SessionOnPortfolioMarginChanged;
                _client.OnPostAllocation             += SessionOnPostAllocation;
                _client.OnRiskLimitDetailsReceived   += SessionOnRiskLimitDetailsReceived;

                _client.OnBarsReceived += SessionOnBarsReceived;
                _client.OnContinuousContractRuleChanged += SessionOnContinuousContractRuleChanged;
                _client.OnContractChanged          += SessionOnContractChanged;
                _client.OnContractCreated          += SessionOnContractCreated;
                _client.OnContractRiskLimitChanged += SessionOnContractRiskLimitChanged;
                _client.OnContractsChanged         += SessionOnContractsChanged;
                _client.OnCurrencyPriceChanged     += SessionOnCurrencyPriceChanged;
                _client.OnDOMChanged               += SessionOnDomChanged;
                _client.OnDealQuoteUpdated         += SessionOnDealQuoteUpdated;
                _client.OnHistogramReceived        += SessionOnHistogramReceived;
                _client.OnHistoryReceived          += SessionOnHistoryReceived;
                _client.OnIndexComponentsReceived  += SessionOnIndexComponentsReceived;
                _client.OnLoggedUserClientsChanged += SessionOnLoggedUserClientsChanged;
                _client.OnNewsMessage              += SessionOnNewsMessage;
                _client.OnOsmAlgoListLoaded        += SessionOnOsmAlgoListLoaded;
                _client.OnOsmAlgoListUpdated       += SessionOnOsmAlgoListUpdated;
                _client.OnPitGroupsChanged         += SessionOnPitGroupsChanged;
                _client.OnPriceChanged             += SessionOnPriceChanged;
                _client.OnPriceTick += SessionOnPriceTick;
                _client.OnProductCalendarUpdated += SessionOnProductCalendarUpdated;
                _client.OnQuoteDetailsChanged    += SessionOnQuoteDetailsChanged;
                _client.OnRelationsChanged       += SessionOnRelationsChanged;
                _client.OnSymbolLookupReceived   += SessionOnSymbolLookupReceived;
                _client.OnTicksReceived          += SessionOnTicksReceived;
                _client.OnTradersChanged         += SessionOnTradersChanged;
                _client.OnUserMessage            += SessionOnUserMessage;
                _client.OnUserStatusChanged      += SessionOnUserStatusChanged;

                _client.Connect(Address.GetHost(), Address.GetPort(), Login, Password.To <string>(), UseNativeReconnect);

                break;
            }

            case MessageTypes.Disconnect:
            {
                if (_client == null)
                {
                    throw new InvalidOperationException(LocalizedStrings.Str1856);
                }

                DisposeClient();
                _client.Disconnect();
                break;
            }

            case MessageTypes.SecurityLookup:
            {
                ProcessSecurityLookup((SecurityLookupMessage)message);
                break;
            }

            case MessageTypes.OrderRegister:
            {
                ProcessOrderRegister((OrderRegisterMessage)message);
                break;
            }

            case MessageTypes.OrderCancel:
            {
                ProcessOrderCancel((OrderCancelMessage)message);
                break;
            }

            case MessageTypes.OrderReplace:
            {
                ProcessOrderReplace((OrderReplaceMessage)message);
                break;
            }

            case MessageTypes.PortfolioLookup:
            {
                ProcessPortfolioLookupMessage((PortfolioLookupMessage)message);
                break;
            }

            case MessageTypes.OrderStatus:
            {
                ProcessOrderStatusMessage();
                break;
            }

            case MessageTypes.MarketData:
            {
                ProcessMarketDataMessage((MarketDataMessage)message);
                break;
            }

            case MessageTypes.News:
            {
                var newsMsg = (Messages.NewsMessage)message;
                _client.SendMessage(_client.Users[newsMsg.Source], newsMsg.Headline);
                break;
            }
            }
        }
        /// <summary>
        /// Отправить сообщение.
        /// </summary>
        /// <param name="message">Сообщение.</param>
        protected override void OnSendInMessage(Message message)
        {
            switch (message.Type)
            {
            case MessageTypes.Connect:
            {
                _subscriptions.Clear();

                if (SessionHolder.Session == null)
                {
                    _isSessionOwner = true;

                    switch (SessionHolder.Remoting)
                    {
                    case OpenECryRemoting.None:
                    case OpenECryRemoting.Primary:
                        SessionHolder.Session = new OECClient(new InPlaceThreadPolicy())
                        {
                            UUID = SessionHolder.Uuid,
                            EventBatchInterval   = 0,
                            RemoteHostingEnabled = SessionHolder.Remoting == OpenECryRemoting.Primary,
                            //PriceHost = "",
                            //AutoSubscribe = false
                        };
                        break;

                    case OpenECryRemoting.Secondary:
                        SessionHolder.Session = OECClient.CreateInstance(true);
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }

                    if (SessionHolder.EnableOECLogging)
                    {
                        if (SessionHolder.Remoting == OpenECryRemoting.Secondary)
                        {
                            SessionHolder.AddWarningLog(LocalizedStrings.Str2552);
                        }
                        else
                        {
                            Log.ConsoleOutput = false;
                            SessionHolder.Session.SetLoggingConfig(new LoggingConfiguration {
                                    Level = LogLevel.All
                                });
                            Log.Initialize(new OECLogger(SessionHolder));
                            Log.Start();
                        }
                    }

                    SessionHolder.Session.Connect(SessionHolder.Address.GetHost(), SessionHolder.Address.GetPort(), SessionHolder.Login, SessionHolder.Password.To <string>(), SessionHolder.UseNativeReconnect);
                }
                else
                {
                    SendOutMessage(new ConnectMessage());
                }

                break;
            }

            case MessageTypes.Disconnect:
            {
                if (_isSessionOwner)
                {
                    SessionHolder.Session.Disconnect();
                }
                else
                {
                    SendOutMessage(new DisconnectMessage());
                }

                break;
            }

            case MessageTypes.SecurityLookup:
            {
                ProcessSecurityLookup((SecurityLookupMessage)message);
                break;
            }

            case MessageTypes.OrderRegister:
            {
                ProcessOrderRegister((OrderRegisterMessage)message);
                break;
            }

            case MessageTypes.OrderCancel:
            {
                ProcessOrderCancel((OrderCancelMessage)message);
                break;
            }

            case MessageTypes.OrderReplace:
            {
                ProcessOrderReplace((OrderReplaceMessage)message);
                break;
            }

            case MessageTypes.PortfolioLookup:
            {
                ProcessPortfolioLookupMessage((PortfolioLookupMessage)message);
                break;
            }

            case MessageTypes.OrderStatus:
            {
                ProcessOrderStatusMessage();
                break;
            }

            case MessageTypes.MarketData:
            {
                ProcessMarketDataMessage((MarketDataMessage)message);
                break;
            }

            case MessageTypes.News:
            {
                var newsMsg = (Messages.NewsMessage)message;
                SessionHolder.Session.SendMessage(SessionHolder.Session.Users[newsMsg.Source], newsMsg.Headline);
                break;
            }
            }
        }