Click here to Skip to main content
15,897,518 members
Articles / Programming Languages / C#

Remoting Probe

Rate me:
Please Sign up or sign in to vote.
4.96/5 (29 votes)
10 Sep 200216 min read 196.6K   2.2K   98  
Using the remoting probe to publish details of the "talking" between the remoting object and its consumer. Here is its design, implementation and usage in the Remoting Analyzer Studio.
//=============================================================================
//	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

	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Software Developer (Senior)
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions