using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using System.Windows.Forms.VisualStyles; using System.Xml; using System.Xml.Linq; using DDUtilityApp.TIBRENDEZVOUS.DATA; using JWH; using JWH.DATA; using JWH.TIB; using Telerik.WinControls.UI; namespace DDUtilityApp.TIBRENDEZVOUS { public partial class FrmSimulator01 : Form { #region [ Event ] ===================================================== #endregion #region [ Variable ] ================================================== private Color ButtonActiveColor = Color.LightPink; private List Servers { get; set; } = new List(); private TibRendezvous TibRendezvous { get; set; } = null; private MessageParser Parser { get; set; } = null; private XLogger Logger { get; set; } = null; private string PathTibRendezvous { get; set; } = string.Empty; private string PathTibRendezvousMessage { get; set; } = string.Empty; private string PathTibRendezvousReply { get; set; } = string.Empty; private string PathTibRendezvousInfo { get; set; } = string.Empty; private string PathTibRendezvousValue { get; set; } = string.Empty; private Control BackColorChangeControl { get; set; } = null; private bool SendMultiMessage_Flag { get; set; } = true; private Color ColorOfNormal { get; set; } = ColorTranslator.FromHtml("#808080"); private Color ColorOfSend { get; set; } = ColorTranslator.FromHtml("#000000"); private Color ColorOfRecived { get; set; } = ColorTranslator.FromHtml("#000080"); private Color ColorOfWarn { get; set; } = ColorTranslator.FromHtml("#FF0000"); private Color ColorOfError { get; set; } = ColorTranslator.FromHtml("#800000"); /// /// XLogger.Control에 로그를 출력하지 않을때 사용하는 색 /// private Color ColorOfTransparent { get; set; } = Color.Transparent; #endregion #region [ Constructor ] =============================================== public FrmSimulator01() { InitializeComponent(); this.tboxRcvMessage.ForeColor = this.ColorOfNormal; this.Logger = new XLogger($"TibSimulator"); this.Logger.Control = this.tboxRcvMessage; this.Logger.ControlPatternLayout = "[{0}] {1} {2} {5}"; string path = $"{GlobalVariable.Instance.DefaultPath}"; this.PathTibRendezvous = path; this.PathTibRendezvousInfo = $"{path}TibRendezvousInfo.xml"; this.PathTibRendezvousValue = $"{path}TibRendezvousValues.xml"; this.PathTibRendezvousMessage = $@"{path}TibSimulator"; this.PathTibRendezvousReply = $@"{this.PathTibRendezvousMessage}\Reply"; this.Parser = new MessageParser(); this.Parser.PathMessageReply = this.PathTibRendezvousReply; this.LoadTibRendezvousInfo(this.PathTibRendezvousInfo); this.LoadTibRendezvousValues(this.PathTibRendezvousValue); this.CreateMessageButtons(this.PathTibRendezvousMessage); this.CreateReplyButtons(this.PathTibRendezvousReply); this.SetLayout(); this.SetEventHandler(); if (this.cboxMessages.Items.Count > 0) this.cboxMessages.SelectedIndex = 0; } protected void SetLayout() { this.Text = $"TibSimulator - Ver. {Application.ProductVersion}"; #if DEBUG this.Text += $" : DEBUG"; #endif Font font = new Font("돋움체", 9.0F); #region [ Transport Area ] this.cboxServer.Font = font; this.cboxServer.DisplayMember = "Value"; this.cboxServer.Items.Clear(); this.cboxServer.Items.AddRange(this.Servers.ToArray()); this.cboxTarget.Font = font; this.cboxTarget.DisplayMember = "Value"; this.cboxMode.Font = font; this.cboxMode.DisplayMember = "Value"; this.cboxService.Font = font; this.cboxService.DisplayMember = "Value"; this.cboxNetwork.Font = font; this.cboxNetwork.DisplayMember = "Value"; this.cboxDaemonA.Font = font; this.cboxDaemonA.DisplayMember = "Value"; this.cboxDaemonS.Font = font; this.cboxDaemonS.DisplayMember = "Value"; this.cboxTransportType.Font = font; this.cboxTransportType.Items.Add(TransportType.Reliable.ToString()); this.cboxTransportType.Items.Add(TransportType.Certiry.ToString()); this.cboxTransportType.Items.Add(TransportType.Distributed.ToString()); this.cboxTransportType.SelectedIndex = 0; this.chkDisplaySendRequestTimeout.Checked = false; this.chkDisplaySendReplyTimeout.Checked = true; this.numSendRequestTime.Value = 30; this.numSendReplayTime.Value = 30; this.cboxMessages.Items.Clear(); DirectoryInfo directory = new DirectoryInfo($"{GlobalVariable.Instance.DefaultPath}"); foreach (DirectoryInfo subDirectory in directory.GetDirectories()) if (subDirectory.Name.ToUpper().StartsWith("TIBSIMULATOR")) this.cboxMessages.Items.Add(new KeyValuePair(subDirectory.Name, subDirectory.FullName)); this.cboxMessages.DisplayMember = "Key"; #endregion #region [ Listener Area ] this.cboxSubject.Font = font; this.cboxSubject.DisplayMember = "Value"; this.lviewSubject.Font = font; this.lviewSubject.ShowCheckBoxes = true; this.lviewSubject.AllowEdit = false; #endregion #region [ Control Area ] this.tboxSettingInfo.Font = font; this.tboxSettingInfo.ReadOnly = true; this.chkWordWarp.Checked = false; this.chkDisplay.Checked = true; this.chkGenerateReply.Checked = false; this.chkSendReply.Checked = false; this.chkSendAreYouThereReply.Checked = false; this.chkHideAreYouThere.Checked = true; #endregion #region [ Received Area ] this.chkAutoScroll.Checked = true; this.Logger.OnScrollToCaret = this.chkAutoScroll.Checked; this.tboxRcvMessage.Font = font; this.tboxRcvMessage.MaxLength = 1024 * 1024 * 5; this.tboxRcvMessage.ScrollBars = RichTextBoxScrollBars.Both; this.tboxRcvMessage.WordWrap = this.chkWordWarp.Checked; this.tboxRcvMessage.ForeColor = this.ColorOfNormal; #endregion #region [ Send Area ] this.cboxSendSubject.Font = font; this.cboxSendSubject.DisplayMember = "Value"; this.tboxSendMessage.Font = font; this.tboxSendMessage.MaxLength = 1024 * 1024; #endregion } private void SetEventHandler() { this.FormClosed += this.FrmSimulator01_FormClosed; #region [ Transport Area ] this.cboxServer.SelectedValueChanged += CboxServer_SelectedValueChanged; this.cboxTarget.SelectedValueChanged += CboxTarget_SelectedValueChanged; this.cboxMode.SelectedValueChanged += CboxMode_SelectedValueChanged; this.cboxService.Validated += CboxService_Validated; this.cboxNetwork.Validated += CboxNetwork_Validated; this.cboxDaemonA.Validated += CboxDaemon_Validated; this.cboxMessages.SelectedValueChanged += CboxMessages_SelectedValueChanged; #endregion #region [ Listener Area ] this.cboxSubject.Validated += CboxSubject_Validated; this.btnAddListener.Click += this.BtnAddListener_Click; #endregion #region [ Control Area ] this.btnStart.Click += BtnStart_Click; this.btnStop.Click += BtnStop_Click; this.btnSettingReload.Click += BtnSettingReload_Click; this.btnSettingSave.Click += BtnSettingSave_Click; this.chkDisplay.CheckedChanged += this.ChkDisplay_CheckedChanged; this.chkWordWarp.CheckedChanged += this.ChkWordWarp_CheckedChanged; this.btnSMMBreak.Click += (sender, e) => { this.SendMultiMessage_Flag = false; }; #endregion #region [ Received Area ] this.chkAutoScroll.CheckedChanged += this.ChkAutoScroll_CheckedChanged; #endregion #region [ Send Area ] this.cboxSendSubject.Validated += CboxSendSubject_Validated; this.btnSendRequest.Click += BtnSendRequest_Click; this.btnSend.Click += BtnSend_Click; this.btnSendReply.Click += this.BtnSendReply_Click; #endregion } private void FrmSimulator01_FormClosed(object sender, FormClosedEventArgs e) { try { TibRendezvous.Close(); this.SendMultiMessage_Flag = false; } catch (Exception ex) { XLogger.Instance.Fatal(ex); } } #endregion #region [ Control Events ] ============================================ private void CboxServer_SelectedValueChanged(object sender, EventArgs e) { this.cboxTarget.Items.Clear(); this.cboxMode.Items.Clear(); this.cboxService.Items.Clear(); this.cboxNetwork.Items.Clear(); this.cboxDaemonA.Items.Clear(); this.cboxSubject.Items.Clear(); this.lviewSubject.Items.Clear(); this.cboxSendSubject.Items.Clear(); Server server = this.cboxServer.SelectedItem as Server; if (server == null) return; this.cboxTarget.Items.AddRange(server.TargetServers.ToArray()); if (this.cboxTarget.Items.Count > 0) this.cboxTarget.SelectedIndex = 0; } private void CboxTarget_SelectedValueChanged(object sender, EventArgs e) { this.cboxMode.Items.Clear(); this.cboxService.Items.Clear(); this.cboxNetwork.Items.Clear(); this.cboxDaemonA.Items.Clear(); this.cboxSubject.Items.Clear(); this.lviewSubject.Items.Clear(); this.cboxSendSubject.Items.Clear(); TargetServer target = this.cboxTarget.SelectedItem as TargetServer; if (target == null) return; this.cboxMode.Items.AddRange(target.Modes.ToArray()); if (this.cboxMode.Items.Count > 0) this.cboxMode.SelectedIndex = 0; } private void CboxMode_SelectedValueChanged(object sender, EventArgs e) { this.cboxService.Items.Clear(); this.cboxNetwork.Items.Clear(); this.cboxDaemonA.Items.Clear(); this.cboxSubject.Items.Clear(); this.lviewSubject.Items.Clear(); this.cboxSendSubject.Items.Clear(); Mode mode = this.cboxMode.SelectedItem as Mode; if (mode == null) return; this.cboxService.Items.AddRange(mode.Services.ToArray()); if (this.cboxService.Items.Count > 0) this.cboxService.SelectedIndex = 0; this.cboxNetwork.Items.AddRange(mode.Networks.ToArray()); if (this.cboxNetwork.Items.Count > 0) this.cboxNetwork.SelectedIndex = 0; this.cboxDaemonA.Items.AddRange(mode.Daemons.ToArray()); if (this.cboxDaemonA.Items.Count > 0) this.cboxDaemonA.SelectedIndex = 0; this.cboxDaemonS.Items.AddRange(mode.Daemons.ToArray()); if (this.cboxDaemonS.Items.Count > 1) this.cboxDaemonS.SelectedIndex = 1; else if (this.cboxDaemonS.Items.Count > 0) this.cboxDaemonS.SelectedIndex = 0; this.cboxSubject.Items.AddRange(mode.Subjects.ToArray()); if (this.cboxSubject.Items.Count > 0) this.cboxSubject.SelectedIndex = 0; this.cboxSendSubject.Items.AddRange(mode.SendSubjects.ToArray()); if (this.cboxSendSubject.Items.Count > 0) this.cboxSendSubject.SelectedIndex = 0; } private void CboxService_Validated(object sender, EventArgs e) { ComboBox cbox = sender as ComboBox; Service item = new Service("", cbox.Text); if (cbox.Items.Contains(item)) return; cbox.Items.Add(item); cbox.SelectedItem = item; Mode mode = this.cboxMode.SelectedItem as Mode; mode.Services.Insert(0, item); } private void CboxNetwork_Validated(object sender, EventArgs e) { ComboBox cbox = sender as ComboBox; Network item = new Network("", cbox.Text); if (cbox.Items.Contains(item)) return; cbox.Items.Add(item); cbox.SelectedItem = item; Mode mode = this.cboxMode.SelectedItem as Mode; mode.Networks.Insert(0, item); } private void CboxDaemon_Validated(object sender, EventArgs e) { ComboBox cbox = sender as ComboBox; Daemon item = new Daemon("", cbox.Text); if (cbox.Items.Contains(item)) return; cbox.Items.Add(item); cbox.SelectedItem = item; Mode mode = this.cboxMode.SelectedItem as Mode; mode.Daemons.Insert(0, item); } private void CboxSubject_Validated(object sender, EventArgs e) { ComboBox cbox = sender as ComboBox; Subject item = new Subject("", cbox.Text); if (cbox.Items.Contains(item)) return; cbox.Items.Add(item); cbox.SelectedItem = item; Mode mode = this.cboxMode.SelectedItem as Mode; mode.Subjects.Insert(0, item); } private void BtnAddListener_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(this.cboxSubject.Text)) return; ListViewDataItem item = new ListViewDataItem(this.cboxSubject.Text); item.CheckState = Telerik.WinControls.Enumerations.ToggleState.On; this.lviewSubject.Items.Add(item); } private void CboxSendSubject_Validated(object sender, EventArgs e) { ComboBox cbox = sender as ComboBox; SendSubject item = new SendSubject("", cbox.Text); if (cbox.Items.Contains(item)) return; cbox.Items.Add(item); cbox.SelectedItem = item; Mode mode = this.cboxMode.SelectedItem as Mode; mode.SendSubjects.Insert(0, item); } private void CboxMessages_SelectedValueChanged(object sender, EventArgs e) { KeyValuePair pair = (KeyValuePair)this.cboxMessages.SelectedItem; FileInfo fileInfo = null; this.PathTibRendezvousMessage = pair.Value; this.PathTibRendezvousReply = $@"{this.PathTibRendezvousMessage}\Reply"; DirectoryInfo directoryInfo = new DirectoryInfo(this.PathTibRendezvousMessage); if (directoryInfo.Exists) { fileInfo = directoryInfo.GetFiles($"TibRendezvousInfo.xml").FirstOrDefault(); if (fileInfo != null) this.PathTibRendezvousInfo = fileInfo.FullName; fileInfo = directoryInfo.GetFiles($"TibRendezvousValues.xml").FirstOrDefault(); if (fileInfo != null) this.PathTibRendezvousValue = fileInfo.FullName; this.LoadTibRendezvousInfo(this.PathTibRendezvousInfo); this.LoadTibRendezvousValues(this.PathTibRendezvousValue); this.CreateMessageButtons(this.PathTibRendezvousMessage); this.CreateReplyButtons(this.PathTibRendezvousReply); this.Parser.PathMessageReply = this.PathTibRendezvousReply; } } private void BtnStart_Click(object sender, EventArgs e) { try { Mode mode = this.cboxMode.SelectedItem as Mode; if (mode == null) return; if (mode.Name == "PRO") { TransportType transportType = this.cboxTransportType.Text.ToEnum(TransportType.Reliable); if (transportType != TransportType.Reliable) { if (MessageBox.Show($"운영서버 연결을 시도하셨습니다.\r\n\r\n TransportType='{transportType.ToString()}' 연결을 허용하지 않습니다.", "주의", MessageBoxButtons.OK, MessageBoxIcon.Warning) != DialogResult.OK) return; #if !DEBUG return; #endif } if (this.chkSendAreYouThereReply.Checked || this.chkSendReply.Checked) { if (MessageBox.Show($"운영서버 연결을 시도하셨습니다.\r\n\r\nReply 기능들을 OFF하고 연결합니다.", "주의", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) != DialogResult.OK) return; this.chkGenerateReply.Checked = false; this.chkSendReply.Checked = false; this.chkSendAreYouThereReply.Checked = false; } } this.TibRendezvous_Start(); } catch (Exception ex) { this.Logger.Fatal(ex); } } private void BtnStop_Click(object sender, EventArgs e) { this.TibRendezvous_Stop(); } private void BtnSendRequest_Click(object sender, EventArgs e) { XmlMessage xmlMessage = new XmlMessage(this.tboxSendMessage.Text); xmlMessage.SendSubject = this.cboxSendSubject.Text; xmlMessage.SendRequestFlag = this.chkSendRequstFlag.Checked; this.TibRendezvous.SendRequest(xmlMessage); this.tboxSendMessage.Clear(); } private void BtnSendReply_Click(object sender, EventArgs e) { XmlMessage xmlReply = this.tboxSendMessage.Tag as XmlMessage; XmlMessage xmlMessage = new XmlMessage(this.tboxSendMessage.Text); xmlMessage.SendSubject = this.cboxSendSubject.Text; xmlMessage.RequestMessage = xmlReply.RequestMessage; this.TibRendezvous.SendReply(xmlMessage); this.tboxSendMessage.Clear(); } private void BtnSend_Click(object sender, EventArgs e) { XmlMessage xmlMessage = new XmlMessage(this.tboxSendMessage.Text); xmlMessage.SendSubject = this.cboxSendSubject.Text; xmlMessage.SendRequestFlag = this.chkSendRequstFlag.Checked; this.TibRendezvous.Send(xmlMessage); this.tboxSendMessage.Clear(); } private void ChkAutoScroll_CheckedChanged(object sender, EventArgs e) { if (this.TibRendezvous != null) this.TibRendezvous.Logger.OnScrollToCaret = this.chkAutoScroll.Checked; if (this.Logger != null) this.Logger.OnScrollToCaret = this.chkAutoScroll.Checked; } private void BtnSettingReload_Click(object sender, EventArgs e) { if (TibRendezvous != null) { this.TibRendezvous.Stop(); Thread.Sleep(1000); } this.LoadTibRendezvousInfo(this.PathTibRendezvousInfo); this.LoadTibRendezvousValues(this.PathTibRendezvousValue); this.CreateMessageButtons(this.PathTibRendezvousMessage); this.CreateReplyButtons(this.PathTibRendezvousReply); this.Parser.PathMessageReply = this.PathTibRendezvousReply; this.cboxServer.Items.Clear(); this.cboxServer.Items.AddRange(this.Servers.ToArray()); this.cboxServer.SelectedIndex = 0; } private void BtnSettingSave_Click(object sender, EventArgs e) { string path = $"{GlobalVariable.Instance.DefaultPath}"; this.SaveTibRendezvousInfo(this.PathTibRendezvousInfo); this.SaveTibRendezvousValues(this.PathTibRendezvousValue); } private void ChkDisplay_CheckedChanged(object sender, EventArgs e) { if (this.TibRendezvous != null && this.TibRendezvous.Logger != null) { if (this.chkDisplay.Checked) this.TibRendezvous.Logger.Control = this.tboxRcvMessage; else this.TibRendezvous.Logger.Control = null; } if (this.Logger != null) { if (this.chkDisplay.Checked) this.Logger.Control = this.tboxRcvMessage; else this.Logger.Control = null; } } private void ChkWordWarp_CheckedChanged(object sender, EventArgs e) { this.tboxRcvMessage.WordWrap = this.chkWordWarp.Checked; } #endregion #region [ Public Method ] ============================================= #endregion #region [ Method ] ==================================================== private void SendButtons_Focus(Control control) { this.btnSendRequest.BackColor = SystemColors.Control; this.btnSendReply.BackColor = SystemColors.Control; this.btnSend.BackColor = SystemColors.Control; control.BackColor = this.ButtonActiveColor; control.Focus(); } private string GetComboxValue(ComboBox sender, string propertyName) { DataTableBase data = sender.SelectedItem as DataTableBase; if (data == null) return sender.Text; PropertyInfo propertyInfo = data.GetType().GetProperty(propertyName); if (propertyInfo == null) return sender.Text; return propertyInfo.GetValue(data).ToString(); } #endregion #region [ TibRendezvous ] ============================================= private void LoadTibRendezvousInfo(string fileName) { try { this.Servers.Clear(); XmlDocument document = new XmlDocument(); document.Load(fileName); XmlNode[] nodeArray = null; nodeArray = document.GetNodesByName("Server"); foreach (XmlNode node in nodeArray) this.Servers.Add(new Server(node)); } catch (Exception ex) { this.Logger.Fatal(ex); } } private void SaveTibRendezvousInfo(string fileName) { StringBuilder sb = new StringBuilder(); sb.AppendLine($""); sb.AppendLine($" "); foreach (Server server in this.cboxServer.Items) sb.AppendLine(server.ToXmlString(" ")); sb.AppendLine($" "); sb.AppendLine($""); using (StreamWriter stream = new StreamWriter($"{fileName}")) stream.Write(sb.ToString()); } private void LoadTibRendezvousValues(string fileName) { try { this.Parser.MessageValues.Clear(); XmlDocument document = new XmlDocument(); document.Load(fileName); XmlNode[] nodeArray = null; nodeArray = document.GetNodesByName("Item"); foreach (XmlNode node in nodeArray) this.Parser.MessageValues.Add(new MessageValue(node)); this.gridValue.DataSource = null; this.gridValue.TableElement.RowHeight = 20; this.gridValue.EnableGrouping = false; this.gridValue.AllowAddNewRow = true; this.gridValue.MasterTemplate.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill; this.gridValue.Columns.Clear(); this.gridValue.AddColumn("Name", "", false).MinWidth = 100; this.gridValue.AddColumn("Format", "", false).MinWidth = 100; this.gridValue.AddColumn("Value", "", false); this.gridValue.DataSource = this.Parser.MessageValues; } catch (Exception ex) { this.Logger.Fatal(ex); } } private void SaveTibRendezvousValues(string fileName) { StringBuilder sb = new StringBuilder(); sb.AppendLine($""); foreach (MessageValue msgValue in this.Parser.MessageValues) { sb.Append($" {msgValue.Value}"); sb.AppendLine($""); } sb.AppendLine($""); this.Logger.Debug(sb.ToString()); using (StreamWriter stream = new StreamWriter($"{fileName}")) stream.Write(sb.ToString()); } private void CreateMessageButtons(string path) { try { { foreach (Control control in this.pnlMessage.Controls) control.Click -= this.MessageButton_Click; this.pnlMessage.Controls.Clear(); this.SendMultiMessage_Flag = true; DirectoryInfo directoryInfo = new DirectoryInfo(path); if (directoryInfo.Exists) { foreach (FileInfo fileInfo in directoryInfo.GetFiles($"*.xml")) { if (new string[] { "TibRendezvousInfo.xml".ToLower(), "TibRendezvousValues.xml".ToLower() }.Contains(fileInfo.Name.ToLower())) continue; Button button = new Button(); button.Text = Path.GetFileNameWithoutExtension(fileInfo.Name); button.Tag = fileInfo.FullName; button.AutoSize = true; button.MinimumSize = new Size(160, 23); button.Margin = new Padding(2, 2, 1, 1); button.Click += this.MessageButton_Click; button.MouseUp += this.MessageButton_MouseUp; this.pnlMessage.Controls.Add(button); } } } } catch (Exception ex) { this.Logger.Fatal(ex); } } private void MessageButton_Click(object sender, EventArgs e) { StreamReader reader = null; try { this.tboxSendMessage.Text = string.Empty; Button button = sender as Button; if (button == null || button.Tag == null) return; string filename = button.Tag as string; if (string.IsNullOrEmpty(filename)) return; reader = new StreamReader(filename, Encoding.UTF8, true); string xmlData = reader.ReadToEnd(); XmlMessage xmlMessage = this.Parser.CreateSendMessage(xmlData); this.tboxSendMessage.Text = xmlMessage.XmlData.GetText(); this.tboxSendMessage.Tag = xmlMessage; if (xmlMessage.SendRequestFlag) { this.chkSendRequstFlag.Checked = true; this.SendButtons_Focus(this.btnSend); } else { this.chkSendRequstFlag.Checked = false; this.SendButtons_Focus(this.btnSend); } } catch (Exception ex) { this.Logger.Fatal(ex); } finally { if (reader != null) reader.Close(); } } private void MessageButton_MouseUp(object sender, MouseEventArgs e) { string filename = string.Empty; string sendSubject = this.cboxSendSubject.Text; bool sendRequestFlag = this.chkSendRequstFlag.Checked; int nCount = (int)this.numSMMCount.Value; int nInterval = (int)this.numSMMInterval.Value; if (e.Button != MouseButtons.Right) return; Button button = sender as Button; if (button == null || button.Tag == null) return; filename = button.Tag as string; ; if (string.IsNullOrEmpty(filename)) return; DialogResult result = MessageBox.Show($"{nCount}건의 메시지를 전송합니다. ({nInterval} msec)", "Test", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (result != DialogResult.Yes) return; new Thread(delegate() { if (this.tboxRcvMessage.InvokeRequired) { this.tboxRcvMessage.BeginInvoke(new Action(SendMultiMessage), filename, sendSubject, sendRequestFlag, nCount, nInterval); } else { this.SendMultiMessage(filename, sendSubject, sendRequestFlag, nCount, nInterval); } }).Start(); } private async void SendMultiMessage(string filename, string sendSubject, bool sendRequestFlag, int count = 100, int interval = 10) { if (string.IsNullOrEmpty(filename)) return; this.SendMultiMessage_Flag = true; for (int i = 0; i < count; i++) { StreamReader reader = null; try { if (!this.SendMultiMessage_Flag) break; reader = new StreamReader(filename, Encoding.UTF8, true); string xmlData = reader.ReadToEnd(); XmlMessage xmlMessage = this.Parser.CreateSendMessage(xmlData); xmlMessage.SendSubject = sendSubject; xmlMessage.SendRequestFlag = sendRequestFlag; if (sendRequestFlag) this.TibRendezvous.SendRequest(xmlMessage); else this.TibRendezvous.Send(xmlMessage); await Task.Delay(interval); } catch (Exception ex) { this.Logger.Fatal(ex); } finally { if (reader != null) reader.Close(); } } } private void CreateReplyButtons(string path) { try { { foreach (Control control in this.pnlReply.Controls) control.Click -= this.ReplyButton_Click; this.pnlReply.Controls.Clear(); DirectoryInfo directoryInfo = new DirectoryInfo($@"{path}"); if (directoryInfo.Exists) { foreach (FileInfo fileInfo in directoryInfo.GetFiles($"*.xml")) { Button button = new Button(); button.Text = Path.GetFileNameWithoutExtension(fileInfo.Name); button.Tag = fileInfo.FullName; button.AutoSize = true; button.MinimumSize = new Size(160, 23); button.Margin = new Padding(2, 2, 1, 1); button.Click += this.ReplyButton_Click; //button.MouseDown += this.BtnTibRendezousReply_MouseDown; this.pnlReply.Controls.Add(button); } } } } catch (Exception ex) { this.Logger.Fatal(ex); } } private void ReplyButton_Click(object sender, EventArgs e) { StreamReader reader = null; try { this.tboxSendMessage.Text = string.Empty; Button button = sender as Button; if (button == null || button.Tag == null) return; string filename = button.Tag as string; if (string.IsNullOrEmpty(filename)) return; reader = new StreamReader(filename, Encoding.UTF8, true); //reader = new StreamReader(filename, Encoding.Default, true); string xmlData = reader.ReadToEnd(); XmlMessage xmlMessage = this.Parser.CreateSendMessage(xmlData); this.tboxSendMessage.Text = xmlMessage.XmlData.GetText(); if (xmlMessage.SendRequestFlag) this.SendButtons_Focus(this.btnSendRequest); else this.SendButtons_Focus(this.btnSend); } catch (Exception ex) { this.Logger.Fatal(ex); } finally { if (reader != null) reader.Close(); } } private void TibRendezvous_Start() { try { this.Logger.Info($"Start"); XLogger logger = new XLogger("TibRendzvous"); logger.ControlPatternLayout = "[{0}] {1} {2}.{4}() {5}"; logger.OnScrollToCaret = this.chkAutoScroll.Checked; if (this.chkDisplay.Checked) logger.Control = this.tboxRcvMessage; this.TibRendezvous_Stop(); this.TibRendezvous = new TibRendezvous(); this.TibRendezvous.Logger = logger; this.TibRendezvous.Parent = this; this.TibRendezvous.SendRequestTime = (int)this.numSendRequestTime.Value; this.TibRendezvous.SendReplyTime = (int)this.numSendReplayTime.Value; #region [ Set ServerInfo ] ServerInfo serverInfo = null; TransportType transportType = this.cboxTransportType.Text.ToEnum(TransportType.Reliable); // Active-Server serverInfo = new ServerInfo(); serverInfo.Name = $"{this.GetComboxValue(this.cboxServer, "Value")} to {this.GetComboxValue(this.cboxTarget, "Value")}"; serverInfo.TransportType = transportType; serverInfo.Service = this.GetComboxValue(cboxService, "Value"); serverInfo.Daemon = this.GetComboxValue(cboxDaemonA, "Value"); serverInfo.Network = this.GetComboxValue(cboxNetwork, "Value"); serverInfo.CMName = this.cboxCMName.Text; serverInfo.LedgerName = this.cboxLedger.Text; serverInfo.RequestOld = this.chkRequestOld.Checked; serverInfo.SyncLedger = this.chkSyncLedger.Checked; this.TibRendezvous.ServerInfos.Add(serverInfo); // StandBy-Server serverInfo = new ServerInfo(); serverInfo.Name = $"{this.GetComboxValue(this.cboxServer, "Value")} to {this.GetComboxValue(this.cboxTarget, "Value")}"; serverInfo.TransportType = transportType; serverInfo.Service = this.GetComboxValue(cboxService, "Value"); serverInfo.Daemon = this.GetComboxValue(this.cboxDaemonS, "Value"); serverInfo.Network = this.GetComboxValue(cboxNetwork, "Value"); serverInfo.CMName = this.cboxCMName.Text; serverInfo.LedgerName = this.cboxLedger.Text; serverInfo.RequestOld = this.chkRequestOld.Checked; serverInfo.SyncLedger = this.chkSyncLedger.Checked; this.TibRendezvous.ServerInfos.Add(serverInfo); #endregion #region [ Set ListenerInfo ] ListenerInfo listener = null; foreach(object item in this.lviewSubject.Items) { ListViewDataItem lviewItem = item as ListViewDataItem; if (lviewItem.CheckState != Telerik.WinControls.Enumerations.ToggleState.On) continue; listener = new ListenerData(); listener.Subject = lviewItem.Text; this.TibRendezvous.Listeners.Add(listener); } if (this.TibRendezvous.Listeners.Count < 1) { listener = new ListenerData(); listener.Subject = this.cboxSubject.Text; this.TibRendezvous.Listeners.Add(listener); } #endregion this.TibRendezvous.OnStarted += TibRendezvous_OnStarted; this.TibRendezvous.OnStoped += TibRendezvous_OnStoped; this.TibRendezvous.OnSend += TibRendezvous_OnSend; this.TibRendezvous.OnSent += TibRendezvous_OnSent; this.TibRendezvous.OnReceived += this.TibRendezvous_OnReceived; this.TibRendezvous.OnEvent += this.TibRendezvous_OnEvent; this.TibRendezvous.OnTimeout += this.TibRendezvous_OnTimeout; this.TibRendezvous.Start(); } catch (Exception ex) { this.Logger.Fatal(ex); } } private void TibRendezvous_Stop() { try { if (this.TibRendezvous == null) return; this.Logger.Info($"Stop"); this.TibRendezvous.Stop(); this.TibRendezvous.OnStarted -= TibRendezvous_OnStarted; this.TibRendezvous.OnStoped -= TibRendezvous_OnStoped; this.TibRendezvous.OnSend -= TibRendezvous_OnSend; this.TibRendezvous.OnSent += this.TibRendezvous_OnSent; this.TibRendezvous.OnReceived -= TibRendezvous_OnReceived; this.TibRendezvous.OnTimeout -= this.TibRendezvous_OnTimeout; this.TibRendezvous = null; } catch (Exception ex) { this.Logger.Fatal(ex); } } #endregion #region [ TibRendezvous Events ] ===================================== private void TibRendezvous_OnStarted(object sender, EventArgs e) { StringBuilder sb = new StringBuilder(); sb.Append($"{this.TibRendezvous.Transport.GetType().Name}={{"); sb.Append($"Daemon='{this.TibRendezvous.ServerInfo.Daemon}', "); sb.Append($"Service='{this.TibRendezvous.ServerInfo.Service}', "); sb.Append($"Network='{this.TibRendezvous.ServerInfo.Network}'"); sb.Append($", Listener={{"); string separator = ""; foreach (ListenerInfo info in this.TibRendezvous.Listeners) { sb.Append($"{separator}'{info?.Listener.Subject}'"); separator = ", "; } sb.Append($"}}}}"); this.Logger.Info($"Started"); this.tboxSettingInfo.Text = sb.ToString(); List lstControls = new List(); lstControls.Add(this.gboxTransport.Controls); lstControls.Add(this.gboxListener.Controls); foreach(Control.ControlCollection collection in lstControls) { foreach (Control ctrl in collection) { if (ctrl.GetType() == typeof(Label)) continue; else if (ctrl.GetType() == typeof(TextBox)) ((TextBox)ctrl).ReadOnly = true; else if (ctrl.GetType() == typeof(ComboBox)) { ComboBox cbox = ctrl as ComboBox; cbox.DropDownStyle = ComboBoxStyle.DropDownList; cbox.Enabled = false; } else ctrl.Enabled = false; } } this.btnStart.BackColor = Color.GreenYellow; // MessageValue Setting MessageValue messageValue = null; messageValue = this.Parser.MessageValues.Where(item => string.Compare(item.Name, "SendSubjectName", true) == 0).FirstOrDefault(); if (messageValue != null) messageValue.Value = this.cboxSendSubject.Text; messageValue = this.Parser.MessageValues.Where(item => string.Compare(item.Name, "ReplySubjectName", true) == 0).FirstOrDefault(); if (messageValue != null) messageValue.Value = this.cboxSubject.Text; this.gridValue.DataSource = null; this.gridValue.DataSource = this.Parser.MessageValues; } private void TibRendezvous_OnStoped(object sender, EventArgs e) { this.Logger.Info($"Stoped"); List lstControls = new List(); lstControls.Add(this.gboxTransport.Controls); lstControls.Add(this.gboxListener.Controls); foreach (Control.ControlCollection collection in lstControls) { foreach (Control ctrl in collection) { if (ctrl.GetType() == typeof(Label)) continue; else if (ctrl.GetType() == typeof(TextBox)) ((TextBox)ctrl).ReadOnly = false; else if (ctrl.GetType() == typeof(ComboBox)) { ComboBox cbox = ctrl as ComboBox; cbox.DropDownStyle = ComboBoxStyle.DropDown; cbox.Enabled = true; } else ctrl.Enabled = true; } } this.btnStart.BackColor = SystemColors.Control; this.Text = $"TibSimulator - Ver. {Application.ProductVersion}"; } private void TibRendezvous_OnSend(TibRendezvous sender, XmlMessage xmlMessage) { try { string sendSubject = string.Empty; string msgName = string.Empty; string msgSendSubjectName = string.Empty; string msgReplySubjectName = string.Empty; sendSubject = xmlMessage?.SendSubject; msgName = xmlMessage?.XmlData?.MessageName; msgSendSubjectName = xmlMessage?.XmlData?.SendSubjectName; msgReplySubjectName = xmlMessage?.XmlData?.ReplySubjectName; bool isOnlyHeader = false; if (msgName.ToLower().StartsWith("AreYouThereRequest".ToLower()) && this.chkHideAreYouThere.Checked) isOnlyHeader = true; if (isOnlyHeader) this.Logger.Info($"[S] {msgSendSubjectName} - {msgName}", this.ColorOfSend); else this.Logger.Info($"[S] {msgReplySubjectName}{Environment.NewLine}{xmlMessage.XmlData.GetText()}", this.ColorOfSend); } catch (Exception ex) { this.Logger.Fatal(ex); } } private void TibRendezvous_OnSent(TibRendezvous sender, XmlMessage xmlMessage) { } private void TibRendezvous_OnReceived(ListenerInfo sender, XmlMessage xmlReceived) { try { if (xmlReceived == null) return; string listenerSubject = string.Empty; string msgName = string.Empty; string msgSendSubjectName = string.Empty; string msgReplySubjectName = string.Empty; if (sender != null) listenerSubject = sender.Subject; msgName = xmlReceived?.XmlData?.MessageName; msgSendSubjectName = xmlReceived?.XmlData?.SendSubjectName; msgReplySubjectName = xmlReceived?.XmlData?.ReplySubjectName; // Log Write bool isOnlyHeader = false; if (msgName.ToLower().StartsWith("AreYouThereRequest".ToLower()) && this.chkHideAreYouThere.Checked) isOnlyHeader = true; if (isOnlyHeader) this.Logger.Info($"[R] {msgReplySubjectName} - {msgName}", this.ColorOfRecived); else this.Logger.Info($"[R] {msgReplySubjectName}{Environment.NewLine}{xmlReceived.XmlData.GetText()}", this.ColorOfRecived); // Reply Message bool isReply = false; if (this.chkGenerateReply.Checked == false) return; if (this.TibRendezvous.SendRequestMessages.ContainsKey(xmlReceived.XmlData.TransactionID)) isReply = true; if (xmlReceived.SendRequestFlag) isReply = true; if (xmlReceived.XmlData.MessageName.ToUpper().EndsWith("REQUEST")) isReply = true; if (isReply == false) return; // Create Reply Message XmlMessage[] xmlReplys = this.Parser.CreateSendReplyMessages(xmlReceived); if (xmlReplys == null || xmlReplys.Length <= 0) return; foreach (XmlMessage xmlReply in xmlReplys) { if (xmlReceived.XmlData.MessageName.ToLower().StartsWith("AreYouThereRequest".ToLower())) { if (this.chkSendAreYouThereReply.Checked) { this.TibRendezvous.SendMessage(xmlReply); } else { this.cboxSendSubject.Text = xmlReply.SendSubject; this.tboxSendMessage.Text = xmlReply.XmlData.GetText(); this.tboxSendMessage.Tag = xmlReply; if (xmlReply.IsReply && xmlReply.RequestMessage != null) if (!string.IsNullOrEmpty(xmlReply.RequestMessage.ReplySubject)) this.SendButtons_Focus(this.btnSendReply); else this.SendButtons_Focus(this.btnSend); else this.SendButtons_Focus(this.btnSend); } } else { if (this.chkSendReply.Checked) { this.TibRendezvous.SendMessage(xmlReply); } else { this.cboxSendSubject.Text = xmlReply.SendSubject; this.tboxSendMessage.Text = xmlReply.XmlData.GetText(); this.tboxSendMessage.Tag = xmlReply; if (xmlReply.IsReply && xmlReply.RequestMessage != null) if (!string.IsNullOrEmpty(xmlReply.RequestMessage.ReplySubject)) this.SendButtons_Focus(this.btnSendReply); else this.SendButtons_Focus(this.btnSend); else this.SendButtons_Focus(this.btnSend); } } } } catch (Exception ex) { this.Logger.Fatal(ex); } } private void TibRendezvous_OnEvent(ListenerInfo sender, TibRendezvousEventArgs e) { if (e.Class.Equals("INFO")) { this.Logger.Info($"[R] {e.SendSubject}{Environment.NewLine}{e.ToString()}"); } else if (e.Class.Equals("WARN")) { Color color = this.ColorOfWarn; if (e.Name.Equals("LICENSE.EXPIRE")) color = this.ColorOfTransparent; this.Logger.Warn($"[R] {e.SendSubject}{Environment.NewLine}{e.ToString()}", color); } else if (e.Class.Equals("ERROR")) { this.Logger.Error($"[R] {e.SendSubject}{Environment.NewLine}{e.ToString()}", this.ColorOfError); if (e.Name.Equals("LICENSE.EXPIRE")) this.TibRendezvous.Restart(); } else { this.Logger.Info($"[R] {e.SendSubject}{Environment.NewLine}{e.ToString()}"); } } private void TibRendezvous_OnTimeout(TibRendezvous sender, XmlMessage xmlMessage, Exception exception) { try { StringBuilder sb = new StringBuilder(); sb.AppendLine($"MessageName: {xmlMessage.XmlData.MessageName}"); sb.AppendLine($"TransactionID: {xmlMessage.XmlData.TransactionID}"); sb.Append(exception.ToString()); if (exception.Source == "S10001" /*Source.S10001*/) { Color color = this.ColorOfError; if (!this.chkDisplaySendRequestTimeout.Checked) color = this.ColorOfTransparent; this.Logger.Warn($"[W] {xmlMessage.XmlData.SendSubjectName}{Environment.NewLine}{sb.ToString()}", color); } else if (exception.Source == "S10002" /*Source.S10002*/) { Color color = this.ColorOfError; if (!this.chkDisplaySendReplyTimeout.Checked) color = this.ColorOfTransparent; this.Logger.Warn($"[W] {xmlMessage.XmlData.SendSubjectName}{Environment.NewLine}{sb.ToString()}", color); } else { this.Logger.Warn($"[W] {xmlMessage.XmlData.SendSubjectName}{Environment.NewLine}{sb.ToString()}", this.ColorOfError); } } catch (Exception ex) { this.Logger.Fatal(ex); } } #endregion } }