예제 #1
0
            public GridRow(ConnectorInfo info, IMessageAdapter adapter /*, IMessageAdapter innerAdapter*/)
            {
                if (info == null)
                {
                    throw new ArgumentNullException(nameof(info));
                }

                if (adapter == null)
                {
                    throw new ArgumentNullException(nameof(adapter));
                }

                //if (innerAdapter == null)
                //	throw new ArgumentNullException("innerAdapter");

                Info    = info;
                Adapter = adapter;
                //InnerAdapter = innerAdapter;
                SupportedMessages = adapter.GetType().CreateInstance <IMessageAdapter>(adapter.TransactionIdGenerator).SupportedMessages.Select(m => new SupportedMessage(adapter, m)).ToArray();
                SupportedMessages.ForEach(m => m.SelectedChanged += () =>
                {
                    NotifyChanged("IsTransactionEnabled");
                    NotifyChanged("IsMarketDataEnabled");
                });
                Icon = adapter.GetType().GetIconUrl();
            }
예제 #2
0
        private void ProcessDisconnectMessage(IMessageAdapter innerAdapter, DisconnectMessage message)
        {
            if (message.Error != null)
            {
                this.AddErrorLog(LocalizedStrings.Str627Params, innerAdapter.GetType().Name, message.Error);
            }

            SendOutMessage(message);
        }
예제 #3
0
        internal static Type GetOrderConditionType(this IMessageAdapter adapter)
        {
            if (adapter == null)
            {
                throw new ArgumentNullException(nameof(adapter));
            }

            return(adapter
                   .GetType()
                   .GetAttribute <OrderConditionAttribute>()?
                   .ConditionType);
        }
        private ConnectorInfo GetInfo(IMessageAdapter adapter)
        {
            if (adapter == null)
            {
                throw new ArgumentNullException("adapter");
            }

            var info = ConnectorsInfo.FirstOrDefault(i => i.TransactionAdapterType.IsInstanceOfType(adapter) || i.MarketDataAdapterType.IsInstanceOfType(adapter));

            if (info == null)
            {
                throw new ArgumentException(LocalizedStrings.Str1553Params.Put(adapter.GetType()), "adapter");
            }

            return(info);
        }
        private void ProcessConnectMessage(IMessageAdapter innerAdapter, ConnectMessage message)
        {
            if (message.Error != null)
            {
                this.AddErrorLog(LocalizedStrings.Str625Params, innerAdapter.GetType().Name, message.Error);
            }

            var adapter = _hearbeatAdapters[innerAdapter];

            foreach (var supportedMessage in adapter.SupportedMessages)
            {
                _connectedAdapters.SafeAdd(supportedMessage).Add(adapter);
            }

            SendOutMessage(message);
        }
예제 #6
0
        private void ProcessInnerAdapterConnectMessage(IMessageAdapter innerAdapter, ConnectMessage message)
        {
            if (message.Error != null)
            {
                SessionHolder.AddErrorLog(LocalizedStrings.Str625Params, innerAdapter.GetType().Name, message.Error);
            }

            Exception error = null;

            var canProcess = _innerAdapters.SyncGet(c =>
            {
                var connected = message.Error == null;

                _adapterStates[innerAdapter] = new RefPair <bool, Exception>(connected, message.Error);

                if (_canRaiseConnected && connected)
                {
                    _canRaiseConnected    = false;
                    _canRaiseDisconnected = true;

                    ResetConnectionErrors();

                    return(true);
                }

                if (_adapterStates.Count == c.Count)
                {
                    // произошла ошибка и нет ни одного подключенного коннектора
                    if (_adapterStates.Values.All(p => !p.First))
                    {
                        error = new AggregateException(LocalizedStrings.Str626, _adapterStates.Values.Select(p => p.Second));
                        return(true);
                    }

                    ResetConnectionErrors();
                }

                return(false);
            });

            if (canProcess)
            {
                SendOutMessage(new ConnectMessage {
                    Error = error
                });
            }
        }
예제 #7
0
        private void ProcessInnerAdapterDisconnectMessage(IMessageAdapter innerAdapter, DisconnectMessage message)
        {
            if (message.Error != null)
            {
                SessionHolder.AddErrorLog(LocalizedStrings.Str627Params, innerAdapter.GetType().Name, message.Error);
            }

            Exception error = null;

            var canProcess = _innerAdapters.SyncGet(c =>
            {
                _adapterStates[innerAdapter] = new RefPair <bool, Exception>(false, message.Error);

                if (_canRaiseDisconnected && _adapterStates.Values.All(p => !p.First))
                {
                    _canRaiseConnected    = true;
                    _canRaiseDisconnected = false;

                    var errors = _adapterStates.Values.Where(p => p.Second != null).Select(p => p.Second).ToArray();

                    if (errors.Length != 0)
                    {
                        error = new AggregateException(LocalizedStrings.Str628, errors);
                        ResetConnectionErrors();
                    }

                    DisposeInnerAdapters();

                    return(true);
                }

                return(false);
            });

            if (canProcess)
            {
                SendOutMessage(new DisconnectMessage {
                    Error = error
                });
            }
        }