using System; using System.Collections.Generic; using System.Xml; using TradeIdeas.ServerConnection; using TradeIdeas.TIProData.Interfaces; using TradeIdeas.XML; using static TradeIdeas.TIProGUI.GuiEnvironment; namespace TradeIdeas.TIProGUI { /// /// This manager is the central acts somewhat like AI manager in the web. It manages all incoming Index data from server, /// and has appropriate methods/events in order that other items that need it (e.g. an IndexPanel) can access it. /// This manager utilizes the Singleton design pattern. /// public sealed class IndexManager { private static readonly IndexManager _instance = new IndexManager(); public delegate void ReceiveIndexData(List data); public event ReceiveIndexData receiveIndexEvent; private TalkWithServer.CancelToken _updateMessageId = null; private List _iData = new List(); public IConnectionMaster _connectionMaster; private static bool _isSubscribed = false; static IndexManager() { } private IndexManager() { } public static IndexManager Instance { get { return _instance; } } public static bool IsSubscribed => _isSubscribed; public void setConnectionMaster(IConnectionMaster connectionMaster) { _connectionMaster = connectionMaster; } public void UnsubscribeToUpdates() { _isSubscribed = false; CancelPreviousListenerCallback(); object[] message = new object[] { "command", "indices_command", "subcommand", "indices_remove_listener" }; Dictionary messageToSend = TalkWithServer.CreateMessage(message); _connectionMaster.SendManager.SendMessage(messageToSend); } public void SubscribeToUpdates() { _isSubscribed = true; CancelPreviousListenerCallback(); object[] message = new object[] { "command", "indices_command", "subcommand", "indices_add_listener" }; Dictionary messageToSend = TalkWithServer.CreateMessage(message); _updateMessageId = new TalkWithServer.CancelToken(); _connectionMaster.SendManager.SendMessage(messageToSend, IndicesReceived, true, cancelToken: _updateMessageId); } private void IndicesReceived(byte[] body, object clientId) { if (null == body) SubscribeToUpdates(); else { XmlNode message = XmlHelper.Get(body).Node(0); int? count = XmlHelper.PropertyInt32(message, "COUNT"); if (count != null && count > 0) { _iData.Clear(); _iData = LoadIndexStructList(message, count.Value); if (receiveIndexEvent != null) receiveIndexEvent(_iData); } } } private void CancelPreviousListenerCallback() { if (null != _updateMessageId) { _connectionMaster.SendManager.CancelMessage(_updateMessageId); _updateMessageId = null; } } private List LoadIndexStructList(XmlNode message, int tally) { List temp = new List(); for (int i = 0; i < tally; i++) { String prop = (i + 1).ToString(); IndicesData dat = new IndicesData(); dat.Symbol = XmlHelper.Property(message, "symbol" + prop); dat.Name = XmlHelper.Property(message, "name" + prop); dat.Change = XmlHelper.PropertyDouble(message, "change" + prop); dat.Last = XmlHelper.PropertyDouble(message, "last" + prop); dat.PercentChange = XmlHelper.PropertyDouble(message, "percent_change" + prop); dat.MaxChange = XmlHelper.PropertyDouble(message, "max_change" + prop); dat.MaxPercentChange = XmlHelper.PropertyDouble(message, "max_percent_change" + prop); dat.Hidden = XmlHelper.Property(message, "hidden" + prop, 0.0) == 1; dat.Order = XmlHelper.Property(message, "order" + prop, -1); temp.Add(dat); } return temp; } } }