using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Xml;
using TradeIdeas.TIProData;
using TradeIdeas.TIProData.Interfaces;
using TradeIdeas.TIProGUI.AI;
using TradeIdeas.TIProGUI;
using TradeIdeas.ServerConnection;
using TradeIdeas.XML;
using TradeIdeas.MiscSupport;
namespace TIProDevExtension
{
public partial class ServerSubscriptionTester : Form
{
private readonly IConnectionMaster _connectionMaster;
private TalkWithServer.CancelToken _cancelToken;
///
/// Provides access to the AiData object for each AiSegment.
///
private Dictionary _aiSegmentData = new Dictionary();
///
/// The main AI data manager object. All AI data for all segments is managed by this object.
///
private AiDataManager _aiDataManager = null;
///
/// The overarching AiData object that requests segments. New AiData objects are spawned for each segment.
///
private IAiData _aiDataMain = null;
private Dictionary _strategyCodes = new Dictionary();
private List _strategies = new List();
private string _segmentCode = "all";
private List _segments = new List();
private AiLongTermManager _aiLongTermManager = null;
private IAiLongTermData _aiLongTermDataMain = null;
private string _serverCommand = GuiEnvironment.GlobalSettings.Node("AI_LONG_TERM").Node("AI_LONG_TERM_COMMAND").Property("VALUE", "ai_long_term");
public ServerSubscriptionTester()
{
InitializeComponent();
_connectionMaster = ConnectionMaster.First;
cboResponseParameterType.SelectedIndex = 0;
}
private void RetrieveAiSegments()
{
_aiDataManager = AiDataManager.Instance();
_aiDataMain = _aiDataManager.GetAiData("main");
_aiDataMain.AiSegmentsReceived -= AiData_AiSegmentsReceived;
_aiDataMain.AiSegmentsReceived += AiData_AiSegmentsReceived;
_aiDataMain.RequestSegments();
}
private void AiData_AiSegmentsReceived(List segments)
{
ClearAiConnections();
_aiSegmentData.Clear();
_strategies.Clear();
foreach (AiSegment aiSegment in segments)
{
if (_segmentCode == "all" || aiSegment.Code == _segmentCode)
{
IAiData aiData = _aiDataManager.GetAiData(aiSegment.Code);
aiData.AiStrategiesReceived -= AiData_AiStrategiesReceived;
aiData.AiStrategiesReceived += AiData_AiStrategiesReceived;
//Debug.WriteLine("[AiSegmentReceived] Requesting strategies for " + aiSegment.Code);
aiData.RequestStrategies(aiSegment.Code);
aiData.AiUpdateReceived -= AiData_AiUpdateReceived;
aiData.AiUpdateReceived += AiData_AiUpdateReceived;
aiData.AiRefreshReceived -= AiData_AiRefreshReceived;
aiData.AiRefreshReceived += AiData_AiRefreshReceived;
aiData.SubscribeToUpdates(aiSegment.Code);
_aiSegmentData.Add(aiSegment, aiData);
}
}
_segments = segments;
}
///
/// Unsubscribe to all segment updates and clear the _aiSegmentData dictionary.
///
private void ClearAiConnections()
{
//Debug.WriteLine("Called ClearAiConnections");
if (_aiSegmentData.Keys.Count > 0)
{
foreach (AiSegment aiSegment in _aiSegmentData.Keys)
{
IAiData aiData = _aiSegmentData[aiSegment];
aiData.UnsubscribeToUpdates();
aiData.AiSegmentsReceived -= AiData_AiSegmentsReceived;
aiData.AiStrategiesReceived -= AiData_AiStrategiesReceived;
aiData.AiUpdateReceived -= AiData_AiUpdateReceived;
aiData.AiRefreshReceived -= AiData_AiRefreshReceived;
aiData = null;
}
_aiSegmentData.Clear();
}
}
private void AiData_AiStrategiesReceived(IAiData sender, string xml, string segment, string windowId)
{
int id = 0;
List strategies = AiUtils.GetStrategiesFromResponse(xml, segment, _segments);
AddServerResponse("AI Strategy:\r\n" + xml);
foreach (AIStrategy strategy in strategies)
{
string strategyCode = id + "-" + segment;
AddStrategy(strategy, strategyCode);
id++;
}
}
private void AddStrategy(AIStrategy strategy, string strategyCode)
{
_strategyCodes[strategyCode] = strategy;
_strategies.Add(strategy);
}
private void AiData_AiUpdateReceived(IAiData sender, string csv, int epoch, string segment, string windowId)
{
//Debug.WriteLine("Got AiUpdateReceived from segment " + segment + " windowId " + windowId);
if (segment != "" && segment != _segmentCode && _segmentCode != "all")
return;
AddServerResponse("Strategy Trades:\r\n" + csv);
}
private void AiData_AiRefreshReceived()
{
//Debug.WriteLine("[StrategyTradesForm AiRefreshReceived] Calling RefreshAiData after receiving refresh code from the server. Title=" + Text);
//GuiEnvironment.LogMessage("[StrategyTradesForm AiRefreshReceived] Calling RefreshAiData after receiving refresh code from the server. Title=" + Text);
RefreshAiData();
}
private void RefreshAiData()
{
try
{
//Debug.WriteLine("[StrategyTradesForm RefreshAiData] Calling RefreshAiData after receiving refresh code from the server. Title=" + Text);
ClearAiConnections();
RetrieveAiSegments();
}
catch// (Exception e)
{
//GuiEnvironment.LogMessage("[StrategyTradesForm RefreshAiData] Got exception in window " + Text + ": " + e.Message + ", st=" + e.StackTrace);
}
}
private void AddServerResponse(string response)
{
this.InvokeIfRequired(delegate
{
txtServerResponses.AppendText(response + "\r\n\r\n");
});
}
private void ServerSubscriptionTester_FormClosing(object sender, FormClosingEventArgs e)
{
ClearAiConnections();
CancelPreviousListenerCallback();
UnsubscribeAiLtUpdates();
}
private Dictionary CreateMessageToSend()
{
Dictionary messageToSend = null;
if (!string.IsNullOrEmpty(txtCommand.Text) && !string.IsNullOrEmpty(txtSubCommand.Text))
{
// Create base message with command and subcommand.
List message = new List
{
"command", txtCommand.Text,
"subcommand", txtSubCommand.Text
};
// Add parameters if any.
if (lstParameters.Items.Count > 0)
{
foreach (ListViewItem listViewItem in lstParameters.Items)
{
message.Add(listViewItem.Text);
message.Add(listViewItem.SubItems[1].Text);
}
}
messageToSend = TalkWithServer.CreateMessage(message.ToArray