//=============================================================================
// The User Interface (GUI) to Remoting Probe built as a Remoting Analyzer.
// (C) Copyright 2002, Roman Kiss (rkiss@pathcom.com)
// All rights reserved.
// The code and information is provided "as-is" without waranty of any kind,
// either expresed or implied.
//-----------------------------------------------------------------------------
// History:
// 08/26/2002 Roman Kiss Initial Revision
//=============================================================================
//
using System;
using System.Drawing;
using System.Diagnostics;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Text;
using System.IO;
using System.Xml;
using System.Threading;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Binary;
using System.Reflection;
using System.Runtime.Remoting.Activation;
//
using RKiss.MessageProbe;
namespace RemotingAnalyzerStudio
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
#region Private Members
private System.Windows.Forms.StatusBar statusBar1;
private System.Windows.Forms.Splitter splitter1;
private System.Windows.Forms.ImageList imageListSamples;
private System.ComponentModel.IContainer components;
private System.Windows.Forms.TreeView treeViewProbes;
private System.Windows.Forms.ContextMenu contextMenuSamples;
private System.Windows.Forms.MenuItem menuItemSamplesClearAll;
//delegates
private DelegateWriteLogMessage m_DelegateWriteLogMessage = null;
private delegate int AddToTreeView(TreeNode node);
private delegate string DelegateControlProbe(string objectUrl, string key, string ctrl);
//
private Process m_thisProcess = Process.GetCurrentProcess();
private string m_thisComputer = Environment.MachineName;
private int m_numberOfSamples = 0;
private TreeNode m_MarkedNode = null;
private Icon m_IconSamplePrecall = null;
private Icon m_IconSamplePostcall = null;
private Icon m_IconSampleError = null;
private TraceBuffer m_tracebuf = new TraceBuffer();
//
private Subscriber subscriber = null;
private System.Windows.Forms.StatusBarPanel statusBarPanelMode;
private System.Windows.Forms.StatusBarPanel statusBarPanelNumOfSamples;
private System.Windows.Forms.TabPage tabPageProbes;
private System.Windows.Forms.TabPage tabPageScanning;
private System.Windows.Forms.TreeView treeViewUrls;
private System.Windows.Forms.ContextMenu contextMenuUrls;
private System.Windows.Forms.MenuItem menuItemUrlsNew;
private System.Windows.Forms.MenuItem menuItemUrlsScan;
private System.Windows.Forms.MenuItem menuItemUrlsScanAll;
private System.Windows.Forms.MenuItem menuItemUrlsDelete;
private System.Windows.Forms.MenuItem menuItemUrlsDeleteAll;
private System.Windows.Forms.ContextMenu contextMenuProbes;
private System.Windows.Forms.MenuItem menuItemProbesRefresh;
private System.Windows.Forms.MenuItem menuItemProbesDisable;
private System.Windows.Forms.MenuItem menuItemProbesEnable;
private System.Windows.Forms.ImageList imageListProbes;
private System.Windows.Forms.TabControl tabControlLeft;
private System.Windows.Forms.StatusBarPanel statusBarPanelResponse;
private System.Windows.Forms.Button buttonMode;
private System.Windows.Forms.TreeView treeViewSamples;
private System.Windows.Forms.ImageList imageListUrls;
private System.Windows.Forms.MenuItem menuItemSamplesMark;
private System.Windows.Forms.ToolTip toolTipSamples;
private System.Windows.Forms.StatusBarPanel statusBarPanelDeltaTime;
private System.Windows.Forms.MenuItem menuItemSamplesTrace;
private System.Windows.Forms.StatusBarPanel statusBarPanelTrace;
private System.Windows.Forms.MenuItem menuItemSamplesTraceExit;
private System.Windows.Forms.MenuItem menuItemSamplesMarkExit;
private System.Windows.Forms.ToolTip toolTipButtonMode;
private System.Windows.Forms.ContextMenu contextMenuStatusBar;
private System.Windows.Forms.MenuItem menuItemStatusBarClearAll;
private System.Windows.Forms.MenuItem menuItemStatusBarMarkExit;
private System.Windows.Forms.MenuItem menuItemStatusBarTraceExit;
private System.Windows.Forms.ContextMenu contextMenuSimulator;
private System.Windows.Forms.MenuItem menuItemSimulatorRun;
private System.Windows.Forms.MenuItem menuItemSimulatorDelete;
private System.Windows.Forms.MenuItem menuItemSimulatorDeleteAll;
private System.Windows.Forms.TabPage tabPageSimulation;
private System.Windows.Forms.TreeView treeViewSimulator;
private System.Windows.Forms.ToolTip toolTipSimulator;
private System.Windows.Forms.ToolTip toolTipUrls;
#endregion
public Form1()
{
InitializeComponent();
#region Initialize Application
statusBarPanelResponse.Text = "Loading config ...";
treeViewSamples.Nodes[0].Expand();
treeViewSimulator.Tag = "?";
//some icon
m_IconSamplePrecall = Icon.FromHandle(new Bitmap(imageListSamples.Images[10]).GetHicon());
m_IconSamplePostcall = Icon.FromHandle(new Bitmap(imageListSamples.Images[11]).GetHicon());
m_IconSampleError = Icon.FromHandle(new Bitmap(imageListSamples.Images[12]).GetHicon());
try
{
//--- setup the state
string strApplXmlFile = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "RemotingAnalyzerStudio.xml";
XmlDocument doc = new XmlDocument();
doc.Load(strApplXmlFile);
XmlNodeList NodeList = doc.GetElementsByTagName("UrlAddresses");
treeViewUrls.BeginUpdate();
TreeNode tnRoot = treeViewUrls.Nodes[0];
for(int ii = 0; ii < NodeList.Count; ii++)
{
XmlNode url = NodeList.Item(ii);
foreach(XmlNode n in url.ChildNodes)
{
tnRoot.Nodes.Add(n.Attributes.Item(0).Value);
}
}
treeViewUrls.EndUpdate();
}
catch(Exception ex)
{
statusBarPanelResponse.Text = ex.Message;
}
//scanning probes based on the url list
statusBarPanelResponse.Text = "Scanning probes ...";
menuItemUrlsScanAll_Click(null, null);
treeViewProbes.Nodes[0].Expand();
treeViewProbes.Nodes[0].Nodes[0].Expand();
//subscriptions
try
{
statusBarPanelResponse.Text = "Connecting Analyzer ...";
m_DelegateWriteLogMessage = new DelegateWriteLogMessage(OnWriteLogMessage);
subscriber = new Subscriber();
subscriber.Activate(m_DelegateWriteLogMessage);
buttonMode.Text = "OFF";
buttonMode.ImageIndex = 2;
statusBarPanelResponse.Text = "Analyzer has been connected to the ES";
toolTipButtonMode.SetToolTip(buttonMode, "Analyzer is hooked to the probes");
}
catch(Exception ex)
{
buttonMode.Text = "ON";
buttonMode.ImageIndex = 1;
string promptText = "Analyzer has a problem with subscribeing to the Event System.\n" +
"Check the RemotingProbeEventClass in the COM+ Catalogue.\n" +
"Error = " + ex.Message;
statusBarPanelResponse.Text = promptText;
toolTipButtonMode.SetToolTip(buttonMode, promptText);
}
//simulation
try
{
string configFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
RemotingConfiguration.Configure(configFile);
}
catch(Exception ex)
{
statusBarPanelResponse.Text = ex.Message;
}
statusBarPanelResponse.ToolTipText = statusBarPanelResponse.Text;
#endregion
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form1));
this.statusBar1 = new System.Windows.Forms.StatusBar();
this.contextMenuStatusBar = new System.Windows.Forms.ContextMenu();
this.menuItemStatusBarTraceExit = new System.Windows.Forms.MenuItem();
this.menuItemStatusBarMarkExit = new System.Windows.Forms.MenuItem();
this.menuItemStatusBarClearAll = new System.Windows.Forms.MenuItem();
this.statusBarPanelMode = new System.Windows.Forms.StatusBarPanel();
this.statusBarPanelNumOfSamples = new System.Windows.Forms.StatusBarPanel();
this.statusBarPanelDeltaTime = new System.Windows.Forms.StatusBarPanel();
this.statusBarPanelTrace = new System.Windows.Forms.StatusBarPanel();
this.statusBarPanelResponse = new System.Windows.Forms.StatusBarPanel();
this.tabControlLeft = new System.Windows.Forms.TabControl();
this.tabPageProbes = new System.Windows.Forms.TabPage();
this.treeViewProbes = new System.Windows.Forms.TreeView();
this.contextMenuProbes = new System.Windows.Forms.ContextMenu();
this.menuItemProbesRefresh = new System.Windows.Forms.MenuItem();
this.menuItemProbesDisable = new System.Windows.Forms.MenuItem();
this.menuItemProbesEnable = new System.Windows.Forms.MenuItem();
this.imageListProbes = new System.Windows.Forms.ImageList(this.components);
this.tabPageScanning = new System.Windows.Forms.TabPage();
this.treeViewUrls = new System.Windows.Forms.TreeView();
this.contextMenuUrls = new System.Windows.Forms.ContextMenu();
this.menuItemUrlsNew = new System.Windows.Forms.MenuItem();
this.menuItemUrlsScan = new System.Windows.Forms.MenuItem();
this.menuItemUrlsScanAll = new System.Windows.Forms.MenuItem();
this.menuItemUrlsDelete = new System.Windows.Forms.MenuItem();
this.menuItemUrlsDeleteAll = new System.Windows.Forms.MenuItem();
this.imageListUrls = new System.Windows.Forms.ImageList(this.components);
this.tabPageSimulation = new System.Windows.Forms.TabPage();
this.treeViewSimulator = new System.Windows.Forms.TreeView();
this.contextMenuSimulator = new System.Windows.Forms.ContextMenu();
this.menuItemSimulatorRun = new System.Windows.Forms.MenuItem();
this.menuItemSimulatorDelete = new System.Windows.Forms.MenuItem();
this.menuItemSimulatorDeleteAll = new System.Windows.Forms.MenuItem();
this.imageListSamples = new System.Windows.Forms.ImageList(this.components);
this.splitter1 = new System.Windows.Forms.Splitter();
this.contextMenuSamples = new System.Windows.Forms.ContextMenu();
this.menuItemSamplesClearAll = new System.Windows.Forms.MenuItem();
this.menuItemSamplesMark = new System.Windows.Forms.MenuItem();
this.menuItemSamplesTrace = new System.Windows.Forms.MenuItem();
this.menuItemSamplesTraceExit = new System.Windows.Forms.MenuItem();
this.menuItemSamplesMarkExit = new System.Windows.Forms.MenuItem();
this.buttonMode = new System.Windows.Forms.Button();
this.treeViewSamples = new System.Windows.Forms.TreeView();
this.toolTipUrls = new System.Windows.Forms.ToolTip(this.components);
this.toolTipSamples = new System.Windows.Forms.ToolTip(this.components);
this.toolTipButtonMode = new System.Windows.Forms.ToolTip(this.components);
this.toolTipSimulator = new System.Windows.Forms.ToolTip(this.components);
((System.ComponentModel.ISupportInitialize)(this.statusBarPanelMode)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.statusBarPanelNumOfSamples)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.statusBarPanelDeltaTime)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.statusBarPanelTrace)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.statusBarPanelResponse)).BeginInit();
this.tabControlLeft.SuspendLayout();
this.tabPageProbes.SuspendLayout();
this.tabPageScanning.SuspendLayout();
this.tabPageSimulation.SuspendLayout();
this.SuspendLayout();
//
// statusBar1
//
this.statusBar1.ContextMenu = this.contextMenuStatusBar;
this.statusBar1.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.2F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.statusBar1.Location = new System.Drawing.Point(0, 480);
this.statusBar1.Name = "statusBar1";
this.statusBar1.Panels.AddRange(new System.Windows.Forms.StatusBarPanel[] {
this.statusBarPanelMode,
this.statusBarPanelNumOfSamples,
this.statusBarPanelDeltaTime,
this.statusBarPanelTrace,
this.statusBarPanelResponse});
this.statusBar1.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.statusBar1.ShowPanels = true;
this.statusBar1.Size = new System.Drawing.Size(910, 22);
this.statusBar1.TabIndex = 0;
this.statusBar1.Text = "statusBar1";
this.statusBar1.PanelClick += new System.Windows.Forms.StatusBarPanelClickEventHandler(this.statusBar1_PanelClick);
//
// contextMenuStatusBar
//
this.contextMenuStatusBar.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.menuItemStatusBarTraceExit,
this.menuItemStatusBarMarkExit,
this.menuItemStatusBarClearAll});
//
// menuItemStatusBarTraceExit
//
this.menuItemStatusBarTraceExit.Index = 0;
this.menuItemStatusBarTraceExit.Text = "TraceExit";
this.menuItemStatusBarTraceExit.Click += new System.EventHandler(this.menuItemSamplesTraceExit_Click);
//
// menuItemStatusBarMarkExit
//
this.menuItemStatusBarMarkExit.Index = 1;
this.menuItemStatusBarMarkExit.Text = "MarkExit";
this.menuItemStatusBarMarkExit.Click += new System.EventHandler(this.menuItemSamplesMarkExit_Click);
//
// menuItemStatusBarClearAll
//
this.menuItemStatusBarClearAll.Index = 2;
this.menuItemStatusBarClearAll.Text = "ClearAll";
this.menuItemStatusBarClearAll.Click += new System.EventHandler(this.menuItemSamplesClearAll_Click);
//
// statusBarPanelMode
//
this.statusBarPanelMode.BorderStyle = System.Windows.Forms.StatusBarPanelBorderStyle.None;
this.statusBarPanelMode.Icon = ((System.Drawing.Icon)(resources.GetObject("statusBarPanelMode.Icon")));
this.statusBarPanelMode.Style = System.Windows.Forms.StatusBarPanelStyle.OwnerDraw;
this.statusBarPanelMode.Width = 60;
//
// statusBarPanelNumOfSamples
//
this.statusBarPanelNumOfSamples.AutoSize = System.Windows.Forms.StatusBarPanelAutoSize.Contents;
this.statusBarPanelNumOfSamples.Icon = ((System.Drawing.Icon)(resources.GetObject("statusBarPanelNumOfSamples.Icon")));
this.statusBarPanelNumOfSamples.MinWidth = 50;
this.statusBarPanelNumOfSamples.Text = "0";
this.statusBarPanelNumOfSamples.ToolTipText = "Number of samples";
this.statusBarPanelNumOfSamples.Width = 50;
//
// statusBarPanelDeltaTime
//
this.statusBarPanelDeltaTime.AutoSize = System.Windows.Forms.StatusBarPanelAutoSize.Contents;
this.statusBarPanelDeltaTime.Icon = ((System.Drawing.Icon)(resources.GetObject("statusBarPanelDeltaTime.Icon")));
this.statusBarPanelDeltaTime.MinWidth = 80;
this.statusBarPanelDeltaTime.Text = "0";
this.statusBarPanelDeltaTime.ToolTipText = "Delta time from the marked sample.";
this.statusBarPanelDeltaTime.Width = 80;
//
// statusBarPanelTrace
//
this.statusBarPanelTrace.Text = "Tracer is off ";
this.statusBarPanelTrace.ToolTipText = "Trace message in the session.";
this.statusBarPanelTrace.Width = 115;
//
// statusBarPanelResponse
//
this.statusBarPanelResponse.AutoSize = System.Windows.Forms.StatusBarPanelAutoSize.Spring;
this.statusBarPanelResponse.Text = "Ready";
this.statusBarPanelResponse.ToolTipText = "Status of the operation";
this.statusBarPanelResponse.Width = 589;
//
// tabControlLeft
//
this.tabControlLeft.Alignment = System.Windows.Forms.TabAlignment.Bottom;
this.tabControlLeft.AllowDrop = true;
this.tabControlLeft.Controls.AddRange(new System.Windows.Forms.Control[] {
this.tabPageProbes,
this.tabPageScanning,
this.tabPageSimulation});
this.tabControlLeft.Dock = System.Windows.Forms.DockStyle.Left;
this.tabControlLeft.Name = "tabControlLeft";
this.tabControlLeft.SelectedIndex = 0;
this.tabControlLeft.ShowToolTips = true;
this.tabControlLeft.Size = new System.Drawing.Size(282, 480);
this.tabControlLeft.TabIndex = 2;
this.tabControlLeft.DragEnter += new System.Windows.Forms.DragEventHandler(this.tabControlLeft_DragEnter);
//
// tabPageProbes
//
this.tabPageProbes.AutoScroll = true;
this.tabPageProbes.Controls.AddRange(new System.Windows.Forms.Control[] {
this.treeViewProbes});
this.tabPageProbes.ImageIndex = 0;
this.tabPageProbes.Location = new System.Drawing.Point(4, 4);
this.tabPageProbes.Name = "tabPageProbes";
this.tabPageProbes.Size = new System.Drawing.Size(274, 451);
this.tabPageProbes.TabIndex = 0;
this.tabPageProbes.Text = "Probes";
this.tabPageProbes.ToolTipText = "List of the accessable probes.";
//
// treeViewProbes
//
this.treeViewProbes.ContextMenu = this.contextMenuProbes;
this.treeViewProbes.Dock = System.Windows.Forms.DockStyle.Fill;
this.treeViewProbes.ImageList = this.imageListProbes;
this.treeViewProbes.Name = "treeViewProbes";
this.treeViewProbes.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
new System.Windows.Forms.TreeNode("Remoting Probes", new System.Windows.Forms.TreeNode[] {
new System.Windows.Forms.TreeNode("Computers", 7, 7, new System.Windows.Forms.TreeNode[] {
new System.Windows.Forms.TreeNode("My Computer (Local)", 3, 3)})})});
this.treeViewProbes.Size = new System.Drawing.Size(274, 451);
this.treeViewProbes.TabIndex = 0;
this.treeViewProbes.Click += new System.EventHandler(this.treeViewProbes_Click);
this.treeViewProbes.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.treeViewProbes_AfterLabelEdit);
this.treeViewProbes.MouseMove += new System.Windows.Forms.MouseEventHandler(this.treeViewProbes_MouseMove);
//
// contextMenuProbes
//
this.contextMenuProbes.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.menuItemProbesRefresh,
this.menuItemProbesDisable,
this.menuItemProbesEnable});
//
// menuItemProbesRefresh
//
this.menuItemProbesRefresh.Index = 0;
this.menuItemProbesRefresh.Text = "Refresh";
this.menuItemProbesRefresh.Click += new System.EventHandler(this.menuItemProbesRefresh_Click);
//
// menuItemProbesDisable
//
this.menuItemProbesDisable.Index = 1;
this.menuItemProbesDisable.Text = "Disable";
this.menuItemProbesDisable.Click += new System.EventHandler(this.menuItemProbesDisable_Click);
//
// menuItemProbesEnable
//
this.menuItemProbesEnable.Index = 2;
this.menuItemProbesEnable.Text = "Enable";
this.menuItemProbesEnable.Click += new System.EventHandler(this.menuItemProbesEnable_Click);
//
// imageListProbes
//
this.imageListProbes.ColorDepth = System.Windows.Forms.ColorDepth.Depth16Bit;
this.imageListProbes.ImageSize = new System.Drawing.Size(16, 16);
this.imageListProbes.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageListProbes.ImageStream")));
this.imageListProbes.TransparentColor = System.Drawing.Color.Transparent;
//
// tabPageScanning
//
this.tabPageScanning.Controls.AddRange(new System.Windows.Forms.Control[] {
this.treeViewUrls});
this.tabPageScanning.ImageIndex = 1;
this.tabPageScanning.Location = new System.Drawing.Point(4, 4);
this.tabPageScanning.Name = "tabPageScanning";
this.tabPageScanning.Size = new System.Drawing.Size(274, 451);
this.tabPageScanning.TabIndex = 1;
this.tabPageScanning.Text = "Scanning";
this.tabPageScanning.ToolTipText = "Scanning Probes based on the url address.";
//
// treeViewUrls
//
this.treeViewUrls.ContextMenu = this.contextMenuUrls;
this.treeViewUrls.Dock = System.Windows.Forms.DockStyle.Fill;
this.treeViewUrls.ImageList = this.imageListUrls;
this.treeViewUrls.LabelEdit = true;
this.treeViewUrls.Name = "treeViewUrls";
this.treeViewUrls.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
new System.Windows.Forms.TreeNode("Urls")});
this.treeViewUrls.Size = new System.Drawing.Size(274, 451);
this.treeViewUrls.TabIndex = 0;
this.treeViewUrls.Click += new System.EventHandler(this.treeViewUrls_Click);
this.treeViewUrls.MouseMove += new System.Windows.Forms.MouseEventHandler(this.treeViewUrls_MouseMove);
this.treeViewUrls.BeforeLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.treeViewUrls_BeforeLabelEdit);
//
// contextMenuUrls
//
this.contextMenuUrls.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.menuItemUrlsNew,
this.menuItemUrlsScan,
this.menuItemUrlsScanAll,
this.menuItemUrlsDelete,
this.menuItemUrlsDeleteAll});
//
// menuItemUrlsNew
//
this.menuItemUrlsNew.Index = 0;
this.menuItemUrlsNew.Text = "New";
this.menuItemUrlsNew.Click += new System.EventHandler(this.menuItemUrlsNew_Click);
//
// menuItemUrlsScan
//
this.menuItemUrlsScan.Index = 1;
this.menuItemUrlsScan.Text = "Scan";
this.menuItemUrlsScan.Click += new System.EventHandler(this.menuItemUrlsScan_Click);
//
// menuItemUrlsScanAll
//
this.menuItemUrlsScanAll.Index = 2;
this.menuItemUrlsScanAll.Text = "Scan All";
this.menuItemUrlsScanAll.Click += new System.EventHandler(this.menuItemUrlsScanAll_Click);
//
// menuItemUrlsDelete
//
this.menuItemUrlsDelete.Index = 3;
this.menuItemUrlsDelete.Text = "Delete";
this.menuItemUrlsDelete.Click += new System.EventHandler(this.menuItemUrlsDelete_Click);
//
// menuItemUrlsDeleteAll
//
this.menuItemUrlsDeleteAll.Index = 4;
this.menuItemUrlsDeleteAll.Text = "Delete All";
this.menuItemUrlsDeleteAll.Click += new System.EventHandler(this.menuItemUrlsDeleteAll_Click);
//
// imageListUrls
//
this.imageListUrls.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
this.imageListUrls.ImageSize = new System.Drawing.Size(16, 16);
this.imageListUrls.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageListUrls.ImageStream")));
this.imageListUrls.TransparentColor = System.Drawing.Color.Transparent;
//
// tabPageSimulation
//
this.tabPageSimulation.AllowDrop = true;
this.tabPageSimulation.AutoScroll = true;
this.tabPageSimulation.Controls.AddRange(new System.Windows.Forms.Control[] {
this.treeViewSimulator});
this.tabPageSimulation.Location = new System.Drawing.Point(4, 4);
this.tabPageSimulation.Name = "tabPageSimulation";
this.tabPageSimulation.Size = new System.Drawing.Size(274, 451);
this.tabPageSimulation.TabIndex = 2;
this.tabPageSimulation.Text = "Simulation";
this.tabPageSimulation.ToolTipText = "Simulate Method Calls to the Remote Object.";
//
// treeViewSimulator
//
this.treeViewSimulator.AllowDrop = true;
this.treeViewSimulator.ContextMenu = this.contextMenuSimulator;
this.treeViewSimulator.Dock = System.Windows.Forms.DockStyle.Fill;
this.treeViewSimulator.ImageList = this.imageListSamples;
this.treeViewSimulator.Name = "treeViewSimulator";
this.treeViewSimulator.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
new System.Windows.Forms.TreeNode("MethodCallSimulator")});
this.treeViewSimulator.Size = new System.Drawing.Size(274, 451);
this.treeViewSimulator.TabIndex = 0;
this.treeViewSimulator.Tag = "";
this.treeViewSimulator.MouseDown += new System.Windows.Forms.MouseEventHandler(this.treeViewSimulator_MouseDown);
this.treeViewSimulator.Click += new System.EventHandler(this.treeViewSimulator_Click);
this.treeViewSimulator.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.treeViewSimulator_AfterLabelEdit);
this.treeViewSimulator.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeViewSimulator_DragEnter);
this.treeViewSimulator.MouseMove += new System.Windows.Forms.MouseEventHandler(this.treeViewSimulator_MouseMove);
this.treeViewSimulator.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeViewSimulator_DragDrop);
//
// contextMenuSimulator
//
this.contextMenuSimulator.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.menuItemSimulatorRun,
this.menuItemSimulatorDelete,
this.menuItemSimulatorDeleteAll});
//
// menuItemSimulatorRun
//
this.menuItemSimulatorRun.Index = 0;
this.menuItemSimulatorRun.Text = "Run";
this.menuItemSimulatorRun.Visible = false;
this.menuItemSimulatorRun.Click += new System.EventHandler(this.menuItemSimulatorRun_Click);
//
// menuItemSimulatorDelete
//
this.menuItemSimulatorDelete.Index = 1;
this.menuItemSimulatorDelete.Text = "Delete";
this.menuItemSimulatorDelete.Visible = false;
this.menuItemSimulatorDelete.Click += new System.EventHandler(this.menuItemSimulatorDelete_Click);
//
// menuItemSimulatorDeleteAll
//
this.menuItemSimulatorDeleteAll.Index = 2;
this.menuItemSimulatorDeleteAll.Text = "DeleteAll";
this.menuItemSimulatorDeleteAll.Visible = false;
this.menuItemSimulatorDeleteAll.Click += new System.EventHandler(this.menuItemSimulatorDeleteAll_Click);
//
// imageListSamples
//
this.imageListSamples.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
this.imageListSamples.ImageSize = new System.Drawing.Size(16, 16);
this.imageListSamples.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageListSamples.ImageStream")));
this.imageListSamples.TransparentColor = System.Drawing.Color.Transparent;
//
// splitter1
//
this.splitter1.Location = new System.Drawing.Point(282, 0);
this.splitter1.Name = "splitter1";
this.splitter1.Size = new System.Drawing.Size(3, 480);
this.splitter1.TabIndex = 3;
this.splitter1.TabStop = false;
//
// contextMenuSamples
//
this.contextMenuSamples.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.menuItemSamplesClearAll,
this.menuItemSamplesMark,
this.menuItemSamplesTrace,
this.menuItemSamplesTraceExit,
this.menuItemSamplesMarkExit});
//
// menuItemSamplesClearAll
//
this.menuItemSamplesClearAll.Index = 0;
this.menuItemSamplesClearAll.Text = "Clear All";
this.menuItemSamplesClearAll.Visible = false;
this.menuItemSamplesClearAll.Click += new System.EventHandler(this.menuItemSamplesClearAll_Click);
//
// menuItemSamplesMark
//
this.menuItemSamplesMark.Index = 1;
this.menuItemSamplesMark.Shortcut = System.Windows.Forms.Shortcut.F9;
this.menuItemSamplesMark.Text = "Mark";
this.menuItemSamplesMark.Click += new System.EventHandler(this.menuItemSamplesMark_Click);
//
// menuItemSamplesTrace
//
this.menuItemSamplesTrace.Index = 2;
this.menuItemSamplesTrace.Shortcut = System.Windows.Forms.Shortcut.F5;
this.menuItemSamplesTrace.Text = "Trace";
this.menuItemSamplesTrace.Click += new System.EventHandler(this.menuItemSamplesTrace_Click);
//
// menuItemSamplesTraceExit
//
this.menuItemSamplesTraceExit.Index = 3;
this.menuItemSamplesTraceExit.Shortcut = System.Windows.Forms.Shortcut.CtrlF5;
this.menuItemSamplesTraceExit.Text = "TraceExit";
this.menuItemSamplesTraceExit.Visible = false;
this.menuItemSamplesTraceExit.Click += new System.EventHandler(this.menuItemSamplesTraceExit_Click);
//
// menuItemSamplesMarkExit
//
this.menuItemSamplesMarkExit.Index = 4;
this.menuItemSamplesMarkExit.Shortcut = System.Windows.Forms.Shortcut.CtrlF9;
this.menuItemSamplesMarkExit.Text = "MarkExit";
this.menuItemSamplesMarkExit.Visible = false;
this.menuItemSamplesMarkExit.Click += new System.EventHandler(this.menuItemSamplesMarkExit_Click);
//
// buttonMode
//
this.buttonMode.Anchor = (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left);
this.buttonMode.BackColor = System.Drawing.Color.CornflowerBlue;
this.buttonMode.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.buttonMode.ForeColor = System.Drawing.SystemColors.HighlightText;
this.buttonMode.Image = ((System.Drawing.Bitmap)(resources.GetObject("buttonMode.Image")));
this.buttonMode.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.buttonMode.ImageIndex = 1;
this.buttonMode.ImageList = this.imageListProbes;
this.buttonMode.Location = new System.Drawing.Point(0, 482);
this.buttonMode.Name = "buttonMode";
this.buttonMode.Size = new System.Drawing.Size(58, 20);
this.buttonMode.TabIndex = 6;
this.buttonMode.Text = " ON";
this.buttonMode.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
this.buttonMode.Click += new System.EventHandler(this.buttonMode_Click);
//
// treeViewSamples
//
this.treeViewSamples.ContextMenu = this.contextMenuSamples;
this.treeViewSamples.Dock = System.Windows.Forms.DockStyle.Fill;
this.treeViewSamples.HideSelection = false;
this.treeViewSamples.ImageList = this.imageListSamples;
this.treeViewSamples.Location = new System.Drawing.Point(285, 0);
this.treeViewSamples.Name = "treeViewSamples";
this.treeViewSamples.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
new System.Windows.Forms.TreeNode("Samples")});
this.treeViewSamples.Size = new System.Drawing.Size(625, 480);
this.treeViewSamples.TabIndex = 4;
this.treeViewSamples.MouseDown += new System.Windows.Forms.MouseEventHandler(this.treeViewSamples_MouseDown);
this.treeViewSamples.Click += new System.EventHandler(this.treeViewSamples_Click);
this.treeViewSamples.BeforeSelect += new System.Windows.Forms.TreeViewCancelEventHandler(this.treeViewSamples_BeforeSelect);
this.treeViewSamples.MouseMove += new System.Windows.Forms.MouseEventHandler(this.treeViewSamples_MouseMove);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
this.ClientSize = new System.Drawing.Size(910, 502);
this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.buttonMode,
this.treeViewSamples,
this.splitter1,
this.tabControlLeft,
this.statusBar1});
this.Name = "Form1";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Remoting Analyzer Studio [rkiss@pathcom.com]";
this.Closing += new System.ComponentModel.CancelEventHandler(this.OnClosingForm);
((System.ComponentModel.ISupportInitialize)(this.statusBarPanelMode)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.statusBarPanelNumOfSamples)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.statusBarPanelDeltaTime)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.statusBarPanelTrace)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.statusBarPanelResponse)).EndInit();
this.tabControlLeft.ResumeLayout(false);
this.tabPageProbes.ResumeLayout(false);
this.tabPageScanning.ResumeLayout(false);
this.tabPageSimulation.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
#region Probe Panel
private void AddProbe(DateTime timestamp, string strSource, string strMsgId, object objMsgBody)
{
try
{
Hashtable htSrc = new Hashtable();
//create probe node
TreeNode tnProbe = new TreeNode("Probe_" + strMsgId, 0, 0);
tnProbe.Tag = strMsgId;
//probe location
TreeNode tnSource = new TreeNode("Location", 3, 3);
foreach(string prop in strSource.Split(','))
{
tnSource.Nodes.Add(new TreeNode(prop, 4, 4));
string[] nameval = prop.Split('=');
htSrc.Add(nameval[0].Trim(), nameval[1].Trim());
}
tnProbe.Nodes.Add(tnSource);
if(objMsgBody is IDictionary)
{
IDictionary dic = objMsgBody as IDictionary;
IDictionaryEnumerator e = (IDictionaryEnumerator)dic.GetEnumerator();
while(e.MoveNext())
{
if(e.Value is string || e.Value is int)
{
TreeNode tnStr = new TreeNode(e.Key.ToString(), 0, 0);
tnStr.Nodes.Add(Convert.ToString(e.Value));
tnProbe.Nodes.Add(tnStr);
}
else
if(e.Value is string[])
{
TreeNode tnStrArr = new TreeNode(e.Key.ToString(), 5, 5);
foreach(object item in e.Value as Array)
{
tnStrArr.Nodes.Add(Convert.ToString(item));
}
tnProbe.Nodes.Add(tnStrArr);
}
else
{
tnProbe.Nodes.Add(string.Format("{0} {1}", e.Key, Convert.ToString(e.Value)));
}
}
}
//set the state
tnProbe.ImageIndex = IsProbeEnable(tnProbe) ? 2 : 1;
tnProbe.SelectedImageIndex = tnProbe.ImageIndex;
// find an entry node in the Probe Layout, if it doesn't exist, create one.
string machine = htSrc["machine"].ToString();
string computer = (m_thisComputer == machine) ? "My Computer (Local)" : machine;
string process = string.Format("{0}_{1}", htSrc["process"], htSrc["processId"]);
TreeNode tnRoot = treeViewProbes.Nodes[0].Nodes[0]; //Computers
bool IsAdded = false;
foreach(TreeNode tnComp in tnRoot.Nodes)
{
if(tnComp.Text == computer)
{
foreach(TreeNode tnProcess in tnComp.Nodes)
{
if(tnProcess.Text == process)
{
IsAdded = AddToTheTreeViewCollection(tnProcess.Nodes, tnProbe);
break;
}
}
if(IsAdded == false)
{
TreeNode tnProcess = new TreeNode(process, 6, 6);
tnProcess.Nodes.Add(tnProbe);
IsAdded = AddToTheTreeViewCollection(tnComp.Nodes, tnProcess);
}
tnComp.Expand();
break;
}
}
if(IsAdded == false)
{
TreeNode tnComputer = new TreeNode(computer, 3, 3);
TreeNode tnProcess = new TreeNode(process, 6, 6);
tnProcess.Nodes.Add(tnProbe);
tnComputer.Nodes.Add(tnProcess);
tnComputer.Expand();
AddToTheTreeViewCollection(tnRoot.Nodes, tnComputer);
}
}
catch(Exception ex)
{
Trace.WriteLine(ex.Message);
}
}
private TreeNode FindProbe(string strMsgId)
{
TreeNode tnRetVal = null;
try
{
TreeNode tnComputers = treeViewProbes.Nodes[0].Nodes[0]; //Computers
if(tnComputers != null && strMsgId != null)
{
foreach(TreeNode tnComputer in tnComputers.Nodes)
{
foreach(TreeNode tnProcess in tnComputer.Nodes)
{
foreach(TreeNode tnProbe in tnProcess.Nodes)
{
if(tnProbe.Tag is string)
{
string tag = tnProbe.Tag as string;
if(tag.StartsWith(strMsgId))
{
tnRetVal = tnProbe;
break;
}
}
}
}
}
}
}
catch(Exception ex)
{
Trace.WriteLine(ex.Message);
}
return tnRetVal;
}
private void RemoveProbe(string strMsgId)
{
try
{
treeViewProbes.BeginUpdate();
TreeNode tnProbe = FindProbe(strMsgId);
if(tnProbe.Parent.Nodes.Count == 1)
{
tnProbe.Parent.Remove();
}
else
{
tnProbe.Remove();
}
}
catch(Exception ex)
{
Trace.WriteLine(ex.Message);
}
finally
{
treeViewProbes.EndUpdate();
}
}
private void PingProbe(string strMsgId, object objMsgBody)
{
try
{
TreeNode tnProbe = FindProbe(strMsgId);
if(objMsgBody is Hashtable)
{
Hashtable ht = objMsgBody as Hashtable;
string status = Convert.ToString(ht["ProbeStatus"]);
string ping = Convert.ToString(ht["ProbePing"]);
string url = Convert.ToString(((string[])ht["Urls"])[0]);
UpdateProbe(strMsgId, url, status, ping);
}
}
catch(Exception ex)
{
Trace.WriteLine(ex.Message);
}
}
private bool UpdateProbe(string id, string url, string status, string ping)
{
bool retVal = false;
TreeNode tnProbe = FindProbe(id);
if(tnProbe != null)
{
foreach(TreeNode tn in tnProbe.Nodes)
{
if(tn.Text == "ProbeStatus" && status != null)
tn.Nodes[0].Text = status;
else
if(tn.Text == "Urls" && url != null)
tn.Nodes[0].Text = url;
else
if(tn.Text == "ProbePing" && ping != null)
{
tn.ImageIndex = tn.ImageIndex == 8 ? 9 : 8; //rotator
tn.SelectedImageIndex = tn.ImageIndex;
tn.Nodes[0].Text = ping;
}
}
treeViewProbes.BeginUpdate();
tnProbe.ImageIndex = IsProbeEnable(tnProbe) ? 2 : 1;
tnProbe.SelectedImageIndex = tnProbe.ImageIndex;
treeViewProbes.EndUpdate();
retVal = true;
}
return retVal;
}
private bool AddToTheTreeViewCollection(TreeNodeCollection col, TreeNode tn)
{
//insert to the treeview
treeViewProbes.BeginUpdate();
if(treeViewProbes.InvokeRequired == true) // check if we running within the same thread
treeViewProbes.Invoke(new AddToTreeView(col.Add), new object[] {tn});
else
col.Add(tn);
treeViewProbes.EndUpdate();
return true;
}
private string GetProbeUrl()
{
TreeNode tnProbe = treeViewProbes.SelectedNode;
foreach(TreeNode tn in tnProbe.Nodes)
{
if(tn.Text == "Urls")
{
string path = tn.FullPath;
return tn.Nodes[0].Text;
}
}
return null;
}
private string GetProbeUrl(string source)
{
//parse the source for probeId
string probeId = null;
string[] src = source.Split(new Char[]{'=', ','});
for(int ii=0; ii<src.Length; ii++)
{
if(src[ii++].Trim() == "probeId")
{
probeId = src[ii].Trim();
}
}
TreeNode tnProbe = FindProbe(probeId);
if(tnProbe != null)
{
foreach(TreeNode tn in tnProbe.Nodes)
{
if(tn.Text == "Urls")
{
return tn.Nodes[0].Text;
}
}
}
return null;
}
private string GetProbeId()
{
TreeNode tnProbeRoot = treeViewProbes.SelectedNode;
string path = tnProbeRoot.FullPath;
return tnProbeRoot.Tag as string;
}
private bool IsProbeEnable(TreeNode tnProbe)
{
foreach(TreeNode tn in tnProbe.Nodes)
{
if(tn.Text == "ProbeStatus")
{
string status = tn.Nodes[0].Text;
string[] checkpoint = status.Split(',');
return checkpoint[0].Trim().EndsWith("True") ||
checkpoint[1].Trim().EndsWith("True") ||
checkpoint[2].Trim().EndsWith("True");
}
}
return false;
}
private string ControlProbe(string objectUrl, string key, string ctrl)
{
string result = null;
try
{
//
ProbeLogicalCallContext plcc = new ProbeLogicalCallContext();
plcc.Key = key;
plcc.Ctrl = ctrl;
CallContext.SetData(ProbeCallContext.name, plcc);
//
Type interfaceType = typeof(IRemotingProbe);
IRemotingProbe robj = (IRemotingProbe)Activator.GetObject(interfaceType, objectUrl);
robj.WriteLogMessage(DateTime.Now, " ", " ", " ", " ");
}
catch(Exception ex)
{
if(ex.Message != ProbeCallContext.exceptionMsg)
{
string msg = string.Format("[{0}]: probeId={1}, url={2}; msg={3}",
DateTime.Now.ToString(), key, objectUrl, ex.Message);
RemoveProbe(key);
//update status bar pannel
statusBarPanelResponse.Text = "Error = " + ex.Message;
statusBarPanelResponse.ToolTipText = statusBarPanelResponse.Text;
//
result = ex.Message;
}
else
{
//the source property holds the probe's message
if(ex.Source != null)
{
string[] strProbes = ex.Source.Split(';');
if(strProbes != null)
{
foreach(string s in strProbes)
{
string[] strProbe = s.Split(new char[]{'='}, 2);
if(strProbe != null)
{
for(int ii = 0; ii < strProbe.Length; ii++)
{
string id = strProbe[ii++].Trim();
string[] srcAndstat = strProbe[ii].Split('&');
//
if(UpdateProbe(id, objectUrl, srcAndstat[1].Trim(), null) == false)
{
Hashtable ht = new Hashtable();
ht["ProbeStatus"] = srcAndstat[1].Trim();
ht["Urls"] = new string[]{objectUrl};
ht["ProbePing"] = (int)0;
AddProbe(DateTime.Now, srcAndstat[0].Trim(), id, ht);
}
}
}
}
statusBarPanelResponse.Text = "Done";
statusBarPanelResponse.ToolTipText = statusBarPanelResponse.Text;
}
}
}
}
return result;
}
private void CallbackControlProbe(IAsyncResult iar)
{
object obj = iar.AsyncState;
DelegateControlProbe dcp = (DelegateControlProbe)((AsyncResult)iar).AsyncDelegate;
string result = dcp.EndInvoke(iar);
if(obj is TreeNode)
{
treeViewUrls.BeginUpdate();
TreeNode tnSel = obj as TreeNode;
tnSel.ImageIndex = (result == null) ? 1 : 2;
tnSel.SelectedImageIndex = tnSel.ImageIndex;
tnSel.Tag = result;
treeViewUrls.EndUpdate();
}
}
private void SetProbeMenu(int nodeX, int iconX)
{
//schema (state machine)
if(nodeX == 4) // process
{
menuItemProbesRefresh.Visible = true;
menuItemProbesEnable.Visible = false;
menuItemProbesDisable.Visible = false;
}
else
if(nodeX == 5) // probe
{
if(iconX == 1)
{ // disable
menuItemProbesEnable.Visible = true;
menuItemProbesDisable.Visible = false;
}
else
if(iconX == 2)
{// enable
menuItemProbesEnable.Visible = false;
menuItemProbesDisable.Visible = true;
}
else
{
menuItemProbesEnable.Visible = false;
menuItemProbesDisable.Visible = false;
}
menuItemProbesRefresh.Visible = true;
}
else
{
menuItemProbesRefresh.Visible = false;
menuItemProbesEnable.Visible = false;
menuItemProbesDisable.Visible = false;
}
}
private void treeViewProbes_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
TreeNode currentNode = treeViewProbes.GetNodeAt(treeViewProbes.PointToClient(Cursor.Position));
}
private void treeViewProbes_Click(object sender, System.EventArgs e)
{
treeViewProbes.SelectedNode = treeViewProbes.GetNodeAt(treeViewProbes.PointToClient(Cursor.Position));
statusBarPanelResponse.Text = "?";
statusBarPanelResponse.ToolTipText = statusBarPanelResponse.Text;
string[] path = treeViewProbes.SelectedNode.FullPath.Split('\\');
SetProbeMenu(path.Length, treeViewProbes.SelectedNode.ImageIndex);
if(treeViewProbes.SelectedNode.Parent != null)
{
if(treeViewProbes.SelectedNode.Parent.Text == "ProbeStatus")
treeViewProbes.LabelEdit = true;
}
}
private void menuItemProbesRefresh_Click(object sender, System.EventArgs e)
{
TreeNode tnSel = treeViewProbes.SelectedNode;
if(tnSel.ImageIndex == 6) //host process
{
//refresh all probes in this process
foreach(TreeNode tn in tnSel.Nodes)
{
treeViewProbes.SelectedNode = tn;
RefreshSelectedProbe();
}
treeViewProbes.SelectedNode = tnSel;
if(tnSel.Nodes.Count == 0)
{
//remove this process node (it's empty)
tnSel.Remove();
}
}
else
{
RefreshSelectedProbe();
}
}
private void RefreshSelectedProbe()
{
try
{
string objUrl = GetProbeUrl();
DelegateControlProbe dcp = new DelegateControlProbe(ControlProbe);
dcp.BeginInvoke(objUrl, GetProbeId(), null, null, null);
}
catch(Exception ex)
{
statusBarPanelResponse.Text = ex.Message;
statusBarPanelResponse.ToolTipText = statusBarPanelResponse.Text;
}
}
private void menuItemProbesDisable_Click(object sender, System.EventArgs e)
{
string ctrl = "call = false, return = false, error = false";
DelegateControlProbe dcp = new DelegateControlProbe(ControlProbe);
dcp.BeginInvoke(GetProbeUrl(), GetProbeId(), ctrl, null, null);
}
private void menuItemProbesEnable_Click(object sender, System.EventArgs e)
{
string ctrl = "call = true, return = true, error = true";
DelegateControlProbe dcp = new DelegateControlProbe(ControlProbe);
dcp.BeginInvoke(GetProbeUrl(), GetProbeId(), ctrl, null, null);
}
private void treeViewProbes_AfterLabelEdit(object sender, System.Windows.Forms.NodeLabelEditEventArgs e)
{
string[] cmd = null;
int ii = 0;
treeViewProbes.SelectedNode = e.Node.Parent.Parent;
treeViewProbes.LabelEdit = false;
//update probe
string ctrl = e.Label;
try
{
if(ctrl != null)
{
//validation
cmd = ctrl.Split(new Char[]{'=', ','});
for(; ii < cmd.Length; ii++)
{
bool test = Convert.ToBoolean(cmd[++ii]);
}
DelegateControlProbe dcp = new DelegateControlProbe(ControlProbe);
dcp.BeginInvoke(GetProbeUrl(), GetProbeId(), ctrl, null, null);
}
}
catch(Exception ex)
{
string text = string.Format("{0}... '{1}'\n{2}", ex.Message, cmd[ii], ctrl);
MessageBox.Show(text, m_thisProcess.ProcessName, MessageBoxButtons.OK, MessageBoxIcon.Error);
e.CancelEdit = true;
}
}
#endregion
#region Urls Panel
private void SetUrlMenu(int nodeX, int count)
{
//schema (state machine)
if(nodeX == 1) // parent - root node
{
if(count == 0)
{
menuItemUrlsScanAll.Visible = false;
menuItemUrlsDeleteAll.Visible = false;
}
else
{
menuItemUrlsScanAll.Visible = true;
menuItemUrlsDeleteAll.Visible = true;
}
menuItemUrlsNew.Visible = true;
menuItemUrlsScan.Visible = false;
menuItemUrlsDelete.Visible = false;
}
else
{
menuItemUrlsNew.Visible = false;
menuItemUrlsScanAll.Visible = false;
menuItemUrlsDeleteAll.Visible = false;
menuItemUrlsScan.Visible = true;
menuItemUrlsDelete.Visible = true;
}
}
private void treeViewUrls_Click(object sender, System.EventArgs e)
{
treeViewUrls.SelectedNode = treeViewUrls.GetNodeAt(treeViewUrls.PointToClient(Cursor.Position));
statusBarPanelResponse.Text = "?";
statusBarPanelResponse.ToolTipText = statusBarPanelResponse.Text;
string[] path = treeViewUrls.SelectedNode.FullPath.Split('\\');
SetUrlMenu(path.Length, treeViewUrls.SelectedNode.Nodes.Count);
}
private void treeViewUrls_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
TreeNode currentNode = treeViewUrls.GetNodeAt(treeViewUrls.PointToClient(Cursor.Position));
if(currentNode != null && currentNode.Tag is string)
{
if(toolTipUrls.GetToolTip(treeViewUrls).ToString() != currentNode.Tag.ToString())
{
toolTipUrls.SetToolTip(treeViewUrls, currentNode.Tag.ToString());
toolTipUrls.AutoPopDelay = 3000;
}
}
else
{
toolTipUrls.SetToolTip(treeViewUrls, "");
}
}
private void treeViewUrls_BeforeLabelEdit(object sender, System.Windows.Forms.NodeLabelEditEventArgs e)
{
e.Node.ImageIndex = 4;
e.Node.SelectedImageIndex = e.Node.ImageIndex;
}
private void menuItemUrlsNew_Click(object sender, System.EventArgs e)
{
TreeNode tnRoot = treeViewUrls.Nodes[0];
tnRoot.Nodes.Add(new TreeNode("tcp://localhost:8090/endpoint", 4, 4));
}
private void menuItemUrlsScan_Click(object sender, System.EventArgs e)
{
TreeNode tnSel = treeViewUrls.SelectedNode;
tnSel.ImageIndex = 3;
tnSel.SelectedImageIndex = tnSel.ImageIndex;
//
string objectUrl = tnSel.Text;
AsyncCallback ac = new AsyncCallback(CallbackControlProbe);
DelegateControlProbe dcp = new DelegateControlProbe(ControlProbe);
dcp.BeginInvoke(objectUrl, "?", null, ac, tnSel);
}
private void menuItemUrlsScanAll_Click(object sender, System.EventArgs e)
{
TreeNode tnUrlsRoot = treeViewUrls.Nodes[0];
treeViewUrls.BeginUpdate();
foreach(TreeNode tn in tnUrlsRoot.Nodes)
{
treeViewUrls.SelectedNode = tn;
menuItemUrlsScan_Click(null, null);
}
treeViewUrls.EndUpdate();
}
private void menuItemUrlsDelete_Click(object sender, System.EventArgs e)
{
TreeNode tnSel = treeViewUrls.SelectedNode;
tnSel.Remove();
}
private void menuItemUrlsDeleteAll_Click(object sender, System.EventArgs e)
{
TreeNode tnUrlsRoot = treeViewUrls.Nodes[0];
treeViewUrls.BeginUpdate();
while(tnUrlsRoot.Nodes.Count > 0)
{
tnUrlsRoot.Nodes.RemoveAt(0);
}
treeViewUrls.EndUpdate();
}
#endregion
#region Samples Panel - Incomming samples
public void OnWriteLogMessage(
DateTime timestamp, //timestamp of the sample
string strSource, //sourcer
string strMsgType, //type
string strMsgId, //identifier
object objMsgBody //message body
)
{
//provider messages
if(strMsgType.StartsWith(ProbeType.create))
{
AddProbe(timestamp, strSource, strMsgId, objMsgBody);
return;
}
else
if(strMsgType.StartsWith(ProbeType.close))
{
RemoveProbe(strMsgId);
return;
}
else
if(strMsgType.StartsWith(ProbeType.ping))
{
PingProbe(strMsgId, objMsgBody);
return;
}
//samples
TreeNode tnRoot = treeViewSamples.Nodes[0];
StringBuilder sbSampleName = new StringBuilder();
try
{
TreeNode tnSample = new TreeNode();
tnSample.Tag = new SampleState(timestamp, strSource, strMsgType, strMsgId);
//message source node
TreeNode tnSource = new TreeNode("Source", 13, 13);
foreach(string prop in strSource.Split(','))
{
tnSource.Nodes.Add(new TreeNode(prop, 14, 14));
}
tnSample.Nodes.Add(tnSource);
//message body node
if(objMsgBody is byte[])
{
AddRemotingMessageToNode(tnSample, objMsgBody as byte[]);
sbSampleName.AppendFormat("{0}: {1}_{2}",tnSample.Text, strMsgType, strMsgId);
}
else
{
AddMessageToNode(tnSample, objMsgBody);
sbSampleName.AppendFormat("{0}: {1}_{2}", timestamp.ToString(), strMsgType, strMsgId);
}
//icon state
if(strMsgType.StartsWith(ProbeType.precall) || strMsgType.StartsWith(ProbeType.oneway))
{
tnSample.ImageIndex = 10;
}
else
if(strMsgType.StartsWith(ProbeType.postcall))
{
tnSample.ImageIndex = 11;
}
else
if(strMsgType.StartsWith(ProbeType.error))
{
tnSample.ImageIndex = 12;
}
tnSample.SelectedImageIndex = tnSample.ImageIndex;
//sample label
tnSample.Text = sbSampleName.ToString();
//treeview
//treeViewSamples.BeginUpdate();
if(treeViewSamples.InvokeRequired == true) // check if we running within the same thread
treeViewSamples.Invoke(new AddToTreeView(tnRoot.Nodes.Add), new object[] {tnSample});
else
tnRoot.Nodes.Add(tnSample);
//treeViewSamples.EndUpdate();
statusBarPanelNumOfSamples.Text = Convert.ToString(++m_numberOfSamples);
}
catch(Exception ex)
{
Trace.WriteLine(ex.Message);
statusBarPanelResponse.Text = "Error: " + ex.Message;
statusBarPanelResponse.ToolTipText = statusBarPanelResponse.Text;
}
}
private void AddMessageToNode(TreeNode node, object obj)
{
TreeNode tnMsg = new TreeNode("Message", 0, 0);
AddTypeValueNode(tnMsg, obj);
node.Nodes.Add(tnMsg);
}
private void AddRemotingMessageToNode(TreeNode node, byte[] byteMsg)
{
LogicalCallContext lcc = null;
//decoding text back to the stream
MemoryStream stream = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
stream.Write(byteMsg, 0, byteMsg.Length);
stream.Position = 0;
IMessage msg = (IMessage)bf.Deserialize(stream);
stream.Close();
TreeNode tnMB = new TreeNode(msg.GetType().Name, 0, 0);
SampleState ss = node.Tag as SampleState;
if(msg is IMethodCallMessage)
{
IMethodCallMessage mcm = msg as IMethodCallMessage;
mcm.Properties["__Uri"] = msg.Properties["__ObjUri"]; // workaround!
lcc = mcm.LogicalCallContext;
//save IMessage for the CallMethod simulation
tnMB.Tag = mcm;
//sample label
node.Text = mcm.TypeName.Split(new char[]{','}, 2)[0].Trim();
//destination
tnMB.Nodes.Add(new TreeNode(string.Format("uri = {0}", mcm.Uri), 17, 17));
tnMB.Nodes.Add(new TreeNode(string.Format("type = {0}", mcm.TypeName),3, 3));
//method
TreeNode tnMethod = new TreeNode(mcm.MethodName, 26, 26);
//arguments
if(mcm.Args != null)
{
Array sign = mcm.MethodSignature as Array;
if(mcm.MethodName.StartsWith(".ctor"))
{
int ii = 0;
foreach(object obj in mcm.Args)
{
TreeNode tnArg = new TreeNode(string.Format("Arg[{0}]", ii), 2, 2);
AddTypeValueNode(tnArg, obj);
tnArg.Nodes[0].Text = (sign.GetValue(ii++) as Type).Name;
tnMethod.Nodes.Add(tnArg);
}
}
else
{
int ii = 0;
foreach(object obj in mcm.Args)
{
TreeNode tnArg = new TreeNode(mcm.GetArgName(ii), 2, 2);
AddTypeValueNode(tnArg, obj);
tnArg.Nodes[0].Text = (sign.GetValue(ii++) as Type).Name;
tnMethod.Nodes.Add(tnArg);
}
}
tnMB.Nodes.Add(tnMethod);
}
//sample state
ss.Text = mcm.Uri;
ss.Type = mcm.TypeName;
ss.Method = mcm.MethodName;
}
else
if(msg is IMethodReturnMessage)
{
//workaround to pass the following properties through Binary Serializer
string strUri = msg.Properties["___Uri"].ToString();
string strTypeName = msg.Properties["___TypeName"].ToString();
string strMethodName = msg.Properties["___MethodName"].ToString();
//destination
tnMB.Nodes.Add(new TreeNode(string.Format("uri = {0}",strUri), 17, 17));
tnMB.Nodes.Add(new TreeNode(string.Format("type = {0}", strTypeName),3, 3));
//sample label
node.Text = strTypeName.Split(',')[0].Trim();
//method
TreeNode tnMethod = new TreeNode(strMethodName, 26, 26);
IMethodReturnMessage mrm = msg as IMethodReturnMessage;
lcc = mrm.LogicalCallContext;
if(mrm.Exception == null)
{
//out arguments
if(mrm.ArgCount > 0)
{
int ii = 0;
foreach(object obj in mrm.Args)
{
if(obj != null) //skip the in args
{
TreeNode tnArg = new TreeNode(string.Format("OutArg[{0}] {1}&", ii, obj.GetType()), 2, 2);
AddTypeValueNode(tnArg, obj);
tnMethod.Nodes.Add(tnArg);
}
ii++;
}
}
//return
//workaround to recognize a __TransparentProxy type
object retval = null;
try {
Convert.ToString(mrm.ReturnValue);
retval = mrm.ReturnValue;
}catch(Exception ex) { retval = Type.GetType("System.Runtime.Remoting.ObjRef"); }
TreeNode tnRet = new TreeNode("Return", 20, 20);
AddTypeValueNode(tnRet, retval);
tnMethod.Nodes.Add(tnRet);
tnMB.Nodes.Add(tnMethod);
//sample state
ss.Text = string.Format("Return = {0}", retval);
ss.Type = strTypeName;
ss.Method = strMethodName;
}
else
{
//exception
TreeNode tnEx = new TreeNode(mrm.Exception.Message, 21, 21);
tnEx.ForeColor = Color.Red;
//is the ProbeCallContext?
if(mrm.Exception.Message == ProbeCallContext.exceptionMsg)
{
string[] probes = mrm.Exception.Source.Split(';');
TreeNode tnStatus = new TreeNode("Status", 22, 22);
foreach(string probe in probes)
{
string[] status = probe.Split(new char[]{'='}, 2);
TreeNode tnId = new TreeNode(status[0], 17, 17);
string[] stat = status[1].Split('&');
tnId.Nodes.Add(new TreeNode(stat[0], 15, 15));
tnId.Nodes.Add(new TreeNode(stat[1], 17, 17));
tnStatus.Nodes.Add(tnId);
}
tnEx.Nodes.Add(tnStatus);
}
else
{
tnEx.Nodes.Add(new TreeNode(mrm.Exception.Source, 22, 22));
}
//stack trace
if(mrm.Exception.StackTrace != null)
{
TreeNode tnExStack = new TreeNode("StackTrace", 13, 13);
string[] stacktrace = mrm.Exception.StackTrace.Split(new Char[]{(char)10});
foreach(string s in stacktrace)
{
string text = s.TrimEnd(new Char[]{(char)13});
tnExStack.Nodes.Add(new TreeNode(text, 23,23));
}
tnExStack.LastNode.ImageIndex = 24;
tnExStack.LastNode.SelectedImageIndex = tnExStack.LastNode.ImageIndex;
tnEx.Nodes.Add(tnExStack);
}
//inner exception
if(mrm.Exception.InnerException != null)
{
string err = string.Format("InnerException = {0}", mrm.Exception.InnerException.Message);
tnEx.Nodes.Add(new TreeNode(err, 21, 21));
}
//additional info: method call
TreeNode tnCallInfo = new TreeNode("Caller", 13, 13);
tnCallInfo.Nodes.Add(new TreeNode(string.Format("uri = {0}", strUri), 17, 17));
tnCallInfo.Nodes.Add(new TreeNode(string.Format("type = {0}", strTypeName),3, 3));
//method & arguments
TreeNode tnCallerMethod = new TreeNode(strMethodName, 26, 26);
object objArgs = msg.Properties["___Args"];
if(objArgs != null)
{
AddTypeValueNode(tnCallerMethod, objArgs);
tnCallInfo.Nodes.Add(tnCallerMethod);
}
tnEx.Nodes.Add(tnCallInfo);
//sample state
ss.Text = string.Format("Exception = {0}", mrm.Exception.Message);
ss.Type = strTypeName;
ss.Method = strMethodName;
//add all of them
tnMB.Nodes.Add(tnEx);
}
}
//logical call context
if(lcc != null && lcc.HasInfo)
{
TreeNode tnLcc = new TreeNode("CallContext", 27, 27);
//retrieve a Datastore of the LogicalCallContext
Type typeLcc = lcc.GetType();
BindingFlags bindflags = BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance;
PropertyInfo mi = typeLcc.GetProperty("Datastore", bindflags);
object obj = mi.GetValue(lcc, null);
IDictionary dic = obj as IDictionary;
IDictionaryEnumerator e = (IDictionaryEnumerator)dic.GetEnumerator();
while(e.MoveNext())
{
TreeNode tnEntry = new TreeNode(Convert.ToString(e.Key), 29, 29);
TreeNode tnObj = new TreeNode(Convert.ToString(e.Value), 28, 28);
foreach(PropertyInfo pi in e.Value.GetType().GetProperties())
{
TreeNode tnProp = new TreeNode(pi.Name, 25, 25);
AddTypeValueNode(tnProp, pi.GetValue(e.Value, null));
tnObj.Nodes.Add(tnProp);
}
tnEntry.Nodes.Add(tnObj);
tnLcc.Nodes.Add(tnEntry);
}
tnMB.Nodes.Insert(0, tnLcc);
}
node.Nodes.Add(tnMB);
}
private void AddTypeValueNode(TreeNode node, object obj)
{
if(obj == null)
{
node.Nodes.Add(new TreeNode("null", 4, 4));
}
else
if(obj is string)
{
AddText(node, obj);
}
else
if(obj is Array)
{
Array array = obj as Array;
if(array.Length == 0)
{
node.Nodes.Add(new TreeNode(obj.GetType().Name, 3, 3));
node.Nodes.Add(new TreeNode("empty", 4, 4));
}
else
{
int ii = 0;
foreach(object item in array)
{
TreeNode tnStrArr = new TreeNode(string.Format("[{0}]", ii++), 2, 2);
AddTypeValueNode(tnStrArr, item);
node.Nodes.Add(tnStrArr);
}
}
}
else
if(obj is DataSet)
{
AddDataset(node, obj);
}
else
if(obj is IDictionary)
{
IDictionary dic = obj as IDictionary;
IDictionaryEnumerator e = (IDictionaryEnumerator)dic.GetEnumerator();
while(e.MoveNext())
{
TreeNode tnProp = new TreeNode(e.Key.ToString(), 0, 0);
AddTypeValueNode(tnProp, e.Value);
node.Nodes.Add(tnProp);
}
}
else
{
AddObject(node, obj);
}
}
private void AddText(TreeNode tn, object obj)
{
string s = obj as string;
if(s.StartsWith("<?xml version="))
{
AddXmlFormattedText(tn, s);
}
else
if(s.StartsWith("<SOAP-ENV:"))
{
AddSoapFormattedText(tn, s);
}
else
{
tn.Nodes.Add(new TreeNode(obj.GetType().Name, 3, 3));
tn.Nodes.Add(new TreeNode(s, 4, 4));
}
}
private void AddSoapFormattedText(TreeNode tn, string strVal)
{
TreeNode tnVal = new TreeNode("SOAP", 4, 4);
string[] strArrayXmlLines = strVal.Split(new Char[]{(char)10});
string[] strArrayNS = strArrayXmlLines[0].Split(' ');
foreach(string sNS in strArrayNS)
{
tnVal.Nodes.Add(new TreeNode(sNS.TrimEnd(new Char[]{(char)13}), 16, 16));
}
for(int ii = 1; ii < strArrayXmlLines.Length; ii++)
{
if(strArrayXmlLines[ii] != null)
tnVal.Nodes.Add(new TreeNode(strArrayXmlLines[ii].TrimEnd(new Char[]{(char)13}), 16,16));
}
tn.Nodes.Add(new TreeNode(strVal.GetType().Name, 3, 3));
tn.Nodes.Add(tnVal);
}
private void AddXmlFormattedText(TreeNode tn, string strVal)
{
TreeNode tnVal = new TreeNode("Xml", 4, 4);
string[] strArrayXmlLines = strVal.Split(new Char[]{(char)10});
foreach(string s in strArrayXmlLines)
{
if(s != null)
tnVal.Nodes.Add(new TreeNode(s.TrimEnd(new Char[]{(char)13}), 19, 19)); ///
}
tn.Nodes.Add(new TreeNode(strVal.GetType().Name, 3, 3));
tn.Nodes.Add(tnVal);
}
private void AddDataset(TreeNode tn, object obj)
{
DataSet ds = obj as DataSet;
TreeNode tnVal = new TreeNode(ds.DataSetName, 4, 4);
foreach(DataTable dt in ds.Tables)
{
TreeNode tnTable = new TreeNode(string.Format("Table[{0}]", dt.TableName), 7, 7);
int ii = 0;
foreach(DataRow dr in dt.Rows)
{
TreeNode tnRow = new TreeNode(string.Format("row[{0}]", ii++), 8, 8);
foreach(DataColumn dc in dt.Columns)
{
TreeNode tnColumm = new TreeNode(dc.ColumnName, 9, 9);
tnColumm.Nodes.Add(new TreeNode(Convert.ToString(dc.DataType),3, 3));
tnColumm.Nodes.Add(new TreeNode(Convert.ToString(dr[dc]), 4, 4));
tnRow.Nodes.Add(tnColumm);
}
tnTable.Nodes.Add(tnRow);
}
tnVal.Nodes.Add(tnTable);
}
tn.Nodes.Add(new TreeNode(obj.GetType().Name, 3, 3));
tn.Nodes.Add(tnVal);
}
private void AddObject(TreeNode tn, object obj)
{
if(obj == null)
{
tn.Nodes.Add(new TreeNode("null", 4, 4));
}
else
{
tn.Nodes.Add(new TreeNode(obj.GetType().Name, 3, 3));
tn.Nodes.Add(new TreeNode(Convert.ToString(obj), 4, 4));
}
}
#endregion
#region Samples Panel - Users Control
private void menuItemSamplesClearAll_Click(object sender, System.EventArgs e)
{
string promptText = "Are you sure to delete all samples?";
if(MessageBox.Show(promptText, m_thisProcess.ProcessName, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
{
return;
}
m_MarkedNode = null;
menuItemSamplesTraceExit_Click(null, null);
statusBarPanelDeltaTime.Text = "off";
TreeNode tnRoot = treeViewSamples.Nodes[0];
if(tnRoot != null)
{
statusBarPanelResponse.Text = "Processing ...";
treeViewSamples.BeginUpdate();
while(tnRoot.Nodes.Count > 0)
{
tnRoot.Nodes.RemoveAt(0);
statusBarPanelNumOfSamples.Text = Convert.ToString(--m_numberOfSamples);
}
treeViewSamples.EndUpdate();
statusBarPanelResponse.Text = "Done";
statusBarPanelResponse.ToolTipText = statusBarPanelResponse.Text;
}
//status bar
statusBarPanelTrace.Text = "Tracer is off";
statusBarPanelTrace.Icon = null;
//state
menuItemSamplesClearAll.Visible = false;
}
private void treeViewSamples_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
string tooltiptext = "";
try
{
TreeNode currentNode = treeViewSamples.GetNodeAt(treeViewSamples.PointToClient(Cursor.Position));
if(currentNode != null && currentNode.Tag is SampleState &&
m_MarkedNode != null && m_MarkedNode.Tag is SampleState)
{
//make the tooltip text
SampleState ssSel = currentNode.Tag as SampleState;
SampleState ssMarked = m_MarkedNode.Tag as SampleState;
long deltatime = (ssSel.MsgTimeStamp.Ticks - ssMarked.MsgTimeStamp.Ticks)/10000;
//
StringBuilder sb = new StringBuilder();
sb.AppendFormat("{0} [ms], {1}", deltatime, ssSel.MsgTimeStamp.ToString());
if(ssSel.MsgSource != null)
{
string[] src = ssSel.MsgSource.Split(new Char[]{'=', ','});
for(int ii=0; ii<src.Length; ii++)
{
string name = src[ii++].Trim();
if(name == "process")
sb.AppendFormat("\nhost process={0}.exe", src[ii]);
else
if(name == "processId")
sb.AppendFormat("/{0}",src[ii]);
}
}
if(ssSel.Text != null)
sb.AppendFormat("\n{0}",ssSel.Text);
if(ssSel.Type != null)
sb.AppendFormat("\ntype={0}", ssSel.Type.Split(new Char[]{','}, 2)[0]);
if(ssSel.Method != null)
sb.AppendFormat("\nmethod={0}", ssSel.Method);
tooltiptext = sb.ToString();
}
}
catch(Exception ex)
{
Trace.WriteLine(ex.Message);
tooltiptext = string.Format("Internal error exception: {0}", ex.Message);
}
finally
{
//show
toolTipSamples.SetToolTip(treeViewSamples, tooltiptext);
}
}
private void treeViewSamples_Click(object sender, System.EventArgs e)
{
treeViewSamples.SelectedNode = treeViewSamples.GetNodeAt(treeViewSamples.PointToClient(Cursor.Position));
}
private void treeViewSamples_BeforeSelect(object sender, System.Windows.Forms.TreeViewCancelEventArgs e)
{
TreeNode currentNode = e.Node;
//find the sample root
while(currentNode != null && currentNode.Tag is SampleState == false)
{
currentNode = currentNode.Parent;
}
if(currentNode != null && currentNode.Tag is SampleState)
{
SampleStatus(currentNode, (m_MarkedNode == null) ? m_tracebuf.Start as TreeNode : m_MarkedNode);
}
}
private void menuItemSamplesMark_Click(object sender, System.EventArgs e)
{
TreeNode tnSel = treeViewSamples.SelectedNode;
if(tnSel != null && tnSel.Tag is SampleState)
{
if(m_MarkedNode != null)
{
m_MarkedNode.BackColor = Color.White;
}
if(m_MarkedNode != treeViewSamples.SelectedNode)
{
m_MarkedNode = treeViewSamples.SelectedNode;
m_MarkedNode.BackColor = Color.Yellow;
statusBarPanelDeltaTime.Text = "0";
}
else
{
m_MarkedNode = null;
statusBarPanelDeltaTime.Text = "off";
}
}
}
private void menuItemSamplesMarkExit_Click(object sender, System.EventArgs e)
{
if(m_MarkedNode != null)
{
m_MarkedNode.BackColor = Color.White;
statusBarPanelDeltaTime.Text = "off";
m_MarkedNode = null;
}
}
private void menuItemSamplesTrace_Click(object sender, System.EventArgs e)
{
TreeNode tnRoot = treeViewSamples.Nodes[0];
TreeNode tnSel = treeViewSamples.SelectedNode;
//find the sample root
while(tnSel != null && tnSel.Tag is SampleState == false)
{
tnSel = tnSel.Parent;
}
if(tnSel != null && tnSel.Tag is SampleState)
{
string key = (tnSel.Tag as SampleState).MsgId;
TreeNode tnTrace = m_tracebuf.Current as TreeNode;
if(tnTrace == null || (tnTrace.Tag as SampleState).MsgId != key)
{
menuItemSamplesTraceExit_Click(null, null);
foreach(TreeNode tn in tnRoot.Nodes)
{
SampleState ss = tn.Tag as SampleState;
if(ss.MsgId == key)
{
treeViewSamples.BeginUpdate();
if(ss.MsgType == ProbeType.precall || ss.MsgType == ProbeType.oneway)
{
m_tracebuf.Push(ss.MsgCheckpoint, tn);
}
else
{
int retcheckpoint = (ss.MsgCheckpoint + 1) * -1;
m_tracebuf.Push(retcheckpoint, tn);
}
tn.ForeColor = Color.Blue;
tn.Expand();
tn.Nodes[1].Expand();
foreach(TreeNode node in tn.Nodes[1].Nodes)
{
//expand method and exception node
if(node.ImageIndex == 26 || node.ImageIndex == 21)
node.Expand();
}
treeViewSamples.EndUpdate();
}
}
tnTrace = m_tracebuf.Start as TreeNode;
tnTrace.BackColor = Color.LightBlue;
(m_tracebuf.End as TreeNode).ForeColor = Color.Blue;
}
else
if(tnTrace != null && (tnTrace.Tag as SampleState).MsgId == key)
{
tnTrace = m_tracebuf.NextFrom(tnSel) as TreeNode;
}
if(tnTrace != null)
{
SampleState ssTrace = tnTrace.Tag as SampleState;
treeViewSamples.SelectedNode = tnTrace;
}
}
}
private void menuItemSamplesTraceExit_Click(object sender, System.EventArgs e)
{
statusBarPanelResponse.Text = "Tracer is Off";
object node = null;
treeViewSamples.BeginUpdate();
while((node = m_tracebuf.Pull()) != null)
{
TreeNode tn = node as TreeNode;
tn.Collapse();
tn.ForeColor = Color.Black;
tn.BackColor = Color.White;
}
treeViewSamples.EndUpdate();
if(m_MarkedNode == null)
{
statusBarPanelDeltaTime.Text = "off";
}
m_tracebuf.Flush();
}
private void treeViewSamples_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
treeViewSamples.SelectedNode = treeViewSamples.GetNodeAt(treeViewSamples.PointToClient(Cursor.Position));
TreeNode tnSel = treeViewSamples.SelectedNode;
if(e.Button == MouseButtons.Right)
{
//prepare state
if(tnSel != null && tnSel.Tag is SampleState)
{
menuItemSamplesTrace.Visible = true;
menuItemSamplesMark.Visible = true;
menuItemSamplesClearAll.Visible = false;
SampleStatus(tnSel, (m_MarkedNode == null) ? m_tracebuf.Start as TreeNode : m_MarkedNode);
menuItemSamplesTraceExit.Visible = m_tracebuf.Current == null ? false : true;
menuItemSamplesMarkExit.Visible = m_MarkedNode == null ? false : true;
}
else
{
if(tnSel != null && tnSel.Parent == null)
{
menuItemSamplesTraceExit.Visible = m_tracebuf.Current == null ? false : true;
menuItemSamplesMarkExit.Visible = m_MarkedNode == null ? false : true;
menuItemSamplesClearAll.Visible = treeViewSamples.Nodes[0].Nodes.Count == 0 ? false : true;
}
else
{
menuItemSamplesTraceExit.Visible = false;
menuItemSamplesMarkExit.Visible = false;
menuItemSamplesClearAll.Visible = false;
}
menuItemSamplesTrace.Visible = false;
menuItemSamplesMark.Visible = false;
}
}
else
if(tnSel != null && tnSel.Tag is IMethodCallMessage)
{
//drag&drop (not avalaible for client-activated object)
IMethodCallMessage mcm = tnSel.Tag as IMethodCallMessage;
if(mcm.MethodName != ".ctor")
{
treeViewSamples.DoDragDrop(tnSel, DragDropEffects.All);
}
}
}
#endregion
#region Status Pannel
private void buttonMode_Click(object sender, System.EventArgs e)
{
string promptText = "?";
try
{
if(buttonMode.Text == "OFF")
{
statusBarPanelResponse.Text = "Processing ...";
subscriber.Deactivate(m_DelegateWriteLogMessage);
buttonMode.Text = "ON";
buttonMode.ImageIndex = 1;
promptText = "Analyzer has been disconnected from the Probes";
}
else
if(buttonMode.Text == "ON")
{
statusBarPanelResponse.Text = "Processing ...";
subscriber.Activate(m_DelegateWriteLogMessage);
buttonMode.Text = "OFF";
buttonMode.ImageIndex = 2;
promptText = "Analyzer has been connected to the Probes";
}
}
catch(Exception ex)
{
promptText = "Analyzer has a problem with subscribeing to the Event System.\n" +
"Check the RemotingProbeEventClass in the COM+ Catalogue.\n" +
"Error = " + ex.Message;
}
finally
{
statusBarPanelResponse.Text = promptText;
statusBarPanelResponse.ToolTipText = promptText;
toolTipButtonMode.SetToolTip(buttonMode, promptText);
}
}
private void SampleStatus(TreeNode nodeSel, TreeNode nodeMarked)
{
if(nodeSel != null && nodeSel.Tag is SampleState)
{
SampleState ssSel = nodeSel.Tag as SampleState;
if(nodeMarked != null && nodeMarked.Tag is SampleState)
{
SampleState ssMarked = nodeMarked.Tag as SampleState;
long deltatime = (ssSel.MsgTimeStamp.Ticks - ssMarked.MsgTimeStamp.Ticks)/10000;
string text = string.Format("{0} [ms]", deltatime);
statusBarPanelDeltaTime.Text = text;
}
//
StringBuilder sb = new StringBuilder();
sb.AppendFormat("{0}: {1}", ssSel.MsgTimeStamp.ToString(), ssSel.Text);
if(ssSel.MsgSource != null)
{
string[] src = ssSel.MsgSource.Split(new Char[]{'=', ','});
for(int ii=0; ii<src.Length; ii++)
{
string name = src[ii++].Trim();
if(name == "process")
sb.AppendFormat(", host process={0}.exe",src[ii]);
else
if(name == "processId")
sb.AppendFormat("/{0}",src[ii]);
}
}
if(ssSel.Type != null)
sb.AppendFormat(", type={0}", ssSel.Type.Split(new Char[]{','}, 2)[0]);
if(ssSel.Method != null)
sb.AppendFormat(", method={0}", ssSel.Method);
statusBarPanelResponse.Text = sb.ToString();
statusBarPanelResponse.ToolTipText = statusBarPanelResponse.Text;
//
Icon icon = (ssSel.MsgType == ProbeType.precall || ssSel.MsgType == ProbeType.oneway) ? m_IconSamplePrecall :
(ssSel.MsgType == ProbeType.postcall) ? m_IconSamplePostcall : m_IconSampleError;
statusBarPanelTrace.Text = string.Format("{0}_{1}", ssSel.MsgType, ssSel.MsgCheckpoint);
statusBarPanelTrace.Icon = icon;
}
}
private void statusBar1_PanelClick(object sender, System.Windows.Forms.StatusBarPanelClickEventArgs e)
{
if(e.StatusBarPanel == statusBarPanelNumOfSamples && treeViewSamples.Nodes[0].Nodes.Count > 0)
{
menuItemStatusBarClearAll.Visible = true;
menuItemStatusBarMarkExit.Visible = false;
menuItemStatusBarTraceExit.Visible = false;
}
else
if(e.StatusBarPanel == statusBarPanelDeltaTime && m_MarkedNode != null)
{
menuItemStatusBarClearAll.Visible = false;
menuItemStatusBarMarkExit.Visible = true;
menuItemStatusBarTraceExit.Visible = false;
}
else
if(e.StatusBarPanel == statusBarPanelTrace && m_tracebuf.Current != null)
{
menuItemStatusBarClearAll.Visible = false;
menuItemStatusBarMarkExit.Visible = false;
menuItemStatusBarTraceExit.Visible = true;
}
else
{
menuItemStatusBarClearAll.Visible = false;
menuItemStatusBarMarkExit.Visible = false;
menuItemStatusBarTraceExit.Visible = false;
}
}
#endregion
#region Simulator Panel
private void treeViewSimulator_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
treeViewSimulator.SelectedNode = treeViewSimulator.GetNodeAt(treeViewSimulator.PointToClient(Cursor.Position));
TreeNode tnSel = treeViewSimulator.SelectedNode;
if(e.Button == MouseButtons.Right)
{
//prepare state
if(tnSel != null && tnSel.Tag is IMethodCallMessage)
{
menuItemSimulatorRun.Visible = true;
menuItemSimulatorDelete.Visible = true;
menuItemSimulatorDeleteAll.Visible = false;
}
else
if(tnSel != null && tnSel.Parent == null)
{
menuItemSimulatorRun.Visible = false;
menuItemSimulatorDelete.Visible = false;
menuItemSimulatorDeleteAll.Visible = tnSel.Nodes.Count == 0 ? false : true;
}
else
{
menuItemSimulatorRun.Visible = false;
menuItemSimulatorDelete.Visible = false;
menuItemSimulatorDeleteAll.Visible = false;
}
}
else
{
menuItemSimulatorRun.Visible = false;
menuItemSimulatorDelete.Visible = false;
menuItemSimulatorDeleteAll.Visible = false;
}
}
private void menuItemSimulatorRun_Click(object sender, System.EventArgs e)
{
TreeNode tnSel = treeViewSimulator.SelectedNode;
IMethodReturnMessage responseMsg = null;
try
{
if(tnSel.Tag is IMethodCallMessage)
{
IMethodCallMessage requestMsg = tnSel.Tag as IMethodCallMessage;
string strDummy = null;
IMessageSink iMsgSink = null;
string strObjUrl = "?";
foreach(TreeNode tnUri in tnSel.Nodes)
{
if(tnUri.Tag is string)
{
strObjUrl = tnUri.Tag as string;
}
}
//create a checkpoint id in the IMessage
requestMsg.Properties[ProbeTicket.id] = Guid.NewGuid();
requestMsg.Properties[ProbeTicket.checkpoint] = (int)1000;
//find the properly outgoing channel registered in this process
foreach(IChannel channel in ChannelServices.RegisteredChannels)
{
if(channel is IChannelSender)
{
iMsgSink = (channel as IChannelSender).CreateMessageSink(strObjUrl, null, out strDummy);
if(iMsgSink != null)
break;
}
}
if(iMsgSink == null)
{
throw new Exception("There is no properly channel to invoke the remote method");
}
else
{
//Pass the IMessage to the following channel based on the method's attribute
//The SyncProcessMessage can not be done on the OneWay attributed method (deadlock process)
if(RemotingServices.IsOneWay(requestMsg.MethodBase) == true)
{
iMsgSink.AsyncProcessMessage(requestMsg, null);
}
else
{
responseMsg = (IMethodReturnMessage)iMsgSink.SyncProcessMessage(requestMsg);
}
if(responseMsg != null && responseMsg.Exception == null)
{
statusBarPanelResponse.Text = "Done";
}
else
if(responseMsg != null && responseMsg.Exception != null)
{
throw responseMsg.Exception;
}
}
}
}
catch(Exception ex)
{
statusBarPanelResponse.Text = "Error: " + ex.Message;
statusBarPanelResponse.ToolTipText = statusBarPanelResponse.Text;
}
}
private void menuItemSimulatorDelete_Click(object sender, System.EventArgs e)
{
TreeNode tnSel = treeViewSimulator.SelectedNode;
if(tnSel.Tag is IMethodCallMessage)
{
tnSel.Remove();
}
}
private void menuItemSimulatorDeleteAll_Click(object sender, System.EventArgs e)
{
TreeNode tnRoot = treeViewSimulator.SelectedNode;
if(tnRoot != null)
{
statusBarPanelResponse.Text = "Processing ...";
treeViewSimulator.BeginUpdate();
while(tnRoot.Nodes.Count > 0)
{
tnRoot.Nodes.RemoveAt(0);
}
treeViewSimulator.EndUpdate();
statusBarPanelResponse.Text = "Done";
statusBarPanelResponse.ToolTipText = statusBarPanelResponse.Text;
}
}
private void treeViewSimulator_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
TreeNode tnSel = treeViewSamples.SelectedNode;
if(tnSel != null && tnSel.Tag is IMethodCallMessage)
{
TreeNode tnSimul = (TreeNode)tnSel.Clone();
//modify labels of the method and url nodes
foreach(TreeNode node in tnSimul.Nodes)
{
if(node.ImageIndex == 3) // type
{
string[] type = node.Text.Split(new char[]{'='}, 2);
node.Text = type[1].Trim();
}
else
if(node.ImageIndex == 26) // method
{
tnSimul.Text += "_" + node.Text;
}
else
if(node.ImageIndex == 17) // url
{
if(tnSel.Parent != null && tnSel.Parent.Tag is SampleState)
{
string probeUri = GetProbeUrl((tnSel.Parent.Tag as SampleState).MsgSource);
if(probeUri != null)
{
//replace uri based on the probe and sample
int poschar = probeUri.LastIndexOf('/');
node.Tag = probeUri.Substring(0, ++poschar);
node.Tag += node.Text.Split('=')[1].Trim().TrimStart('/');
}
else
{
//probe is not in the catalogue
string[] uri = node.Text.Split(new char[]{'='}, 2);
node.Tag = uri[1].Trim();
}
node.Text = node.Tag.ToString();
}
}
}
treeViewSimulator.Nodes[0].Nodes.Add(tnSimul);
}
treeViewSimulator.Nodes[0].Expand();
}
private void tabControlLeft_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
{
tabControlLeft.SelectedIndex = 2;
}
private void treeViewSimulator_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
{
e.Effect = DragDropEffects.Copy;
}
private void treeViewSimulator_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
string tooltiptext = "";
try
{
TreeNode currentNode = treeViewSimulator.GetNodeAt(treeViewSimulator.PointToClient(Cursor.Position));
if(currentNode != null && currentNode.Tag is IMethodCallMessage)
{
//make the tooltip text
StringBuilder sb = new StringBuilder();
foreach(TreeNode tn in currentNode.Nodes)
{
if(tn.ImageIndex == 26) // method
{
sb.AppendFormat("\nmethod = {0}",tn.Text);
}
else
if(tn.ImageIndex == 17) // uri
{
sb.AppendFormat("uri = {0}", tn.Tag as string);
}
else
if(tn.ImageIndex == 3) // type
{
sb.AppendFormat("\ntype = {0}", (tn.Text as string).Split(new char[]{','}, 2));
}
}
tooltiptext = sb.ToString();
if(toolTipSimulator.GetToolTip(treeViewSimulator) != tooltiptext)
{
toolTipSimulator.SetToolTip(treeViewSimulator, tooltiptext);
toolTipSimulator.AutoPopDelay = 4000;
}
}
else
{
toolTipSimulator.SetToolTip(treeViewSimulator, "");
}
}
catch(Exception ex)
{
Trace.WriteLine(ex.Message);
statusBarPanelResponse.Text = string.Format("Internal error exception: {0}", ex.Message);
}
}
private void treeViewSimulator_Click(object sender, System.EventArgs e)
{
treeViewSimulator.SelectedNode = treeViewSimulator.GetNodeAt(treeViewSimulator.PointToClient(Cursor.Position));
TreeNode tnSel = treeViewSimulator.SelectedNode;
//check node for uri or method
if((tnSel != null && tnSel.ImageIndex == 17) || (tnSel != null && tnSel.Tag is IMethodCallMessage))
treeViewSimulator.LabelEdit = true;
else
treeViewSimulator.LabelEdit = false;
}
private void treeViewSimulator_AfterLabelEdit(object sender, System.Windows.Forms.NodeLabelEditEventArgs e)
{
if(e.Node.Tag is IMethodCallMessage == false && e.Label != null)
{
e.Node.Tag = e.Label;
}
treeViewSimulator.LabelEdit = false;
}
#endregion
#region Closing
private void OnClosingForm(object sender, System.ComponentModel.CancelEventArgs e)
{
if(subscriber != null)
{
subscriber.Deactivate(m_DelegateWriteLogMessage);
}
XmlTextWriter tw = null;
Stream stream = null;
try
{
string strApplXmlFile = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "RemotingAnalyzerStudio.xml";
stream = new FileStream(strApplXmlFile, FileMode.Create, FileAccess.Write);
StreamWriter sw = new StreamWriter(stream);
tw = new XmlTextWriter(sw);
tw.Formatting = Formatting.Indented;
//create XML stream
tw.WriteStartDocument();
tw.WriteComment(string.Format("List of Url addresses for searching the Probes, {0}", DateTime.Now));
tw.WriteStartElement("UrlAddresses");
tw.WriteAttributeString("name", treeViewUrls.Nodes[0].Text);
foreach(TreeNode tnUrl in treeViewUrls.Nodes[0].Nodes)
{
tw.WriteStartElement("Url");
tw.WriteAttributeString("name", tnUrl.Text);
tw.WriteEndElement();
}
tw.WriteEndElement();
tw.WriteEndDocument();
}
catch(Exception objEx)
{
Trace.WriteLine(string.Format("OnFormClosing catch = {0}", objEx.Message));
}
finally
{
if(tw != null)
{
tw.Flush();
tw.Close();
}
if(stream != null)
stream.Close();
}
}
#endregion
}
}