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;
}
}
}