Subversion Repositories general

Rev

Rev 1122 | Rev 1194 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1092 dev 1
using System;
2
using System.Drawing;
3
using System.Collections;
4
using System.Windows.Forms;
5
using System.IO;
6
using System.Net;
7
using System.Text;
8
using System.Text.RegularExpressions;
9
using System.Xml;
10
 
11
// FIXME:
12
//   - add soap validation
13
//   - icons for all items in the tree
14
//   - use pool of threads?
15
//   - do not store intermediate info, just row packets and the parsed fragments to display
16
//   - make the text fragment store switchable
1125 dev 17
//   - save/restore window layout
1092 dev 18
namespace TCPproxy
19
{
20
	public class MainForm : System.Windows.Forms.Form
21
	{
1125 dev 22
		#region private fields
23
 
24
		private TcpListener  tcpListener    = null;
25
		private LogMessages  logMessages    = null;
26
		private Hashtable    treeNodes      = new Hashtable();
27
 
28
		private TcpShowMode  tcpShowMode    = TcpShowMode.ByDirection;
29
		private bool         autoExpand     = true;
30
 
31
		#endregion private fields
32
 
33
		#region web forms fields
1092 dev 34
		private System.ComponentModel.IContainer components;
35
		private System.Windows.Forms.Label label2;
36
		private System.Windows.Forms.Button startButton;
37
		private System.Windows.Forms.MenuItem saveXmlMenuItem;
38
		private System.Windows.Forms.ListBox logBox;
39
		private System.Windows.Forms.MenuItem tcpShowByTimeMenuItem;
40
		private System.Windows.Forms.SaveFileDialog saveLogDialog;
41
		private System.Windows.Forms.MenuItem clearMenuItem;
42
		private System.Windows.Forms.StatusBarPanel connectionStatusBar;
43
		private System.Windows.Forms.Label levelLabel;
44
		private TCPproxy.ViewControl messagesBox;
45
		private System.Windows.Forms.Panel panel3;
46
		private System.Windows.Forms.Button saveButton;
47
		private System.Windows.Forms.MenuItem saveHttpMenuItem;
48
		private System.Windows.Forms.TextBox resendPortBox;
49
		private System.Windows.Forms.MenuItem selectAllmenuItem;
50
		private System.Windows.Forms.Label label1;
51
		private System.Windows.Forms.MenuItem autoExpandMenuItem;
52
		private System.Windows.Forms.MenuItem copyMenuItem;
53
		private System.Windows.Forms.Splitter splitter2;
54
		private System.Windows.Forms.ContextMenu viewContextMenu;
55
		private System.Windows.Forms.TreeView messageView;
56
		private System.Windows.Forms.Splitter splitter1;
57
		private System.Windows.Forms.MenuItem saveTcpMenuItem;
58
		private System.Windows.Forms.Panel panel2;
59
		private System.Windows.Forms.Panel panel1;
60
		private System.Windows.Forms.MenuItem closeConnectionMenuItem;
61
		private System.Windows.Forms.Panel panel4;
62
		private System.Windows.Forms.ImageList saveButtonImageList;
63
		private System.Windows.Forms.StatusBar statusBar;
64
		private System.Windows.Forms.MenuItem saveLogMenuItem;
65
		private System.Windows.Forms.ContextMenu saveLogMenu;
66
		private System.Windows.Forms.Button stopButton;
67
		private System.Windows.Forms.ContextMenu messagesContextMenu;
68
		private System.Windows.Forms.MenuItem tcpShowByDirectionMenuItem;
69
		private System.Windows.Forms.TextBox listenPortBox;
70
		private System.Windows.Forms.ComboBox levelBox;
71
		private System.Windows.Forms.Button clearButton;
72
		private System.Windows.Forms.ImageList treeImageList;
73
		private System.Windows.Forms.MenuItem wordWrapMenuItem;
74
		private System.Windows.Forms.TextBox resendHostBox;
75
		#endregion web forms fields
76
 
77
		#region Windows Form Designer generated code
78
		/// <summary>
79
		/// Required method for Designer support - do not modify
80
		/// the contents of this method with the code editor.
81
		/// </summary>
82
		private void InitializeComponent() {
83
			this.components = new System.ComponentModel.Container();
84
			this.resendHostBox = new System.Windows.Forms.TextBox();
85
			this.wordWrapMenuItem = new System.Windows.Forms.MenuItem();
86
			this.treeImageList = new System.Windows.Forms.ImageList(this.components);
87
			this.clearButton = new System.Windows.Forms.Button();
88
			this.levelBox = new System.Windows.Forms.ComboBox();
89
			this.listenPortBox = new System.Windows.Forms.TextBox();
90
			this.tcpShowByDirectionMenuItem = new System.Windows.Forms.MenuItem();
91
			this.messagesContextMenu = new System.Windows.Forms.ContextMenu();
92
			this.stopButton = new System.Windows.Forms.Button();
93
			this.saveLogMenu = new System.Windows.Forms.ContextMenu();
94
			this.saveLogMenuItem = new System.Windows.Forms.MenuItem();
95
			this.statusBar = new System.Windows.Forms.StatusBar();
96
			this.saveButtonImageList = new System.Windows.Forms.ImageList(this.components);
97
			this.panel4 = new System.Windows.Forms.Panel();
98
			this.closeConnectionMenuItem = new System.Windows.Forms.MenuItem();
99
			this.panel1 = new System.Windows.Forms.Panel();
100
			this.panel2 = new System.Windows.Forms.Panel();
101
			this.saveTcpMenuItem = new System.Windows.Forms.MenuItem();
102
			this.splitter1 = new System.Windows.Forms.Splitter();
103
			this.messageView = new System.Windows.Forms.TreeView();
104
			this.viewContextMenu = new System.Windows.Forms.ContextMenu();
105
			this.splitter2 = new System.Windows.Forms.Splitter();
106
			this.copyMenuItem = new System.Windows.Forms.MenuItem();
107
			this.autoExpandMenuItem = new System.Windows.Forms.MenuItem();
108
			this.label1 = new System.Windows.Forms.Label();
109
			this.selectAllmenuItem = new System.Windows.Forms.MenuItem();
110
			this.resendPortBox = new System.Windows.Forms.TextBox();
111
			this.saveHttpMenuItem = new System.Windows.Forms.MenuItem();
112
			this.saveButton = new System.Windows.Forms.Button();
113
			this.panel3 = new System.Windows.Forms.Panel();
114
			this.messagesBox = new TCPproxy.ViewControl();
115
			this.levelLabel = new System.Windows.Forms.Label();
116
			this.connectionStatusBar = new System.Windows.Forms.StatusBarPanel();
117
			this.clearMenuItem = new System.Windows.Forms.MenuItem();
118
			this.saveLogDialog = new System.Windows.Forms.SaveFileDialog();
119
			this.tcpShowByTimeMenuItem = new System.Windows.Forms.MenuItem();
120
			this.logBox = new System.Windows.Forms.ListBox();
121
			this.saveXmlMenuItem = new System.Windows.Forms.MenuItem();
122
			this.startButton = new System.Windows.Forms.Button();
123
			this.label2 = new System.Windows.Forms.Label();
124
			this.panel4.SuspendLayout();
125
			this.panel1.SuspendLayout();
126
			this.panel2.SuspendLayout();
127
			this.panel3.SuspendLayout();
128
			((System.ComponentModel.ISupportInitialize)(this.connectionStatusBar)).BeginInit();
129
			this.SuspendLayout();
130
			//
131
			// resendHostBox
132
			//
133
			this.resendHostBox.Location = new System.Drawing.Point(88, 48);
134
			this.resendHostBox.Name = "resendHostBox";
135
			this.resendHostBox.TabIndex = 3;
136
			this.resendHostBox.Text = "";
137
			//
138
			// wordWrapMenuItem
139
			//
140
			this.wordWrapMenuItem.Index = 3;
141
			this.wordWrapMenuItem.Text = "Word &Wrap";
142
			this.wordWrapMenuItem.Click += new System.EventHandler(this.wordWrapMenuItem_Click);
143
			//
144
			// treeImageList
145
			//
146
			this.treeImageList.ImageSize = new System.Drawing.Size(16, 16);
147
			this.treeImageList.TransparentColor = System.Drawing.Color.Transparent;
148
			//
149
			// clearButton
150
			//
151
			this.clearButton.Location = new System.Drawing.Point(288, 16);
152
			this.clearButton.Name = "clearButton";
153
			this.clearButton.TabIndex = 6;
154
			this.clearButton.Text = "Clear";
155
			this.clearButton.Click += new System.EventHandler(this.clearButton_Click);
156
			//
157
			// levelBox
158
			//
159
			this.levelBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
160
			this.levelBox.Items.AddRange(new object[] {
161
						"All",
162
						"Info",
163
						"Important"});
164
			this.levelBox.Location = new System.Drawing.Point(472, 16);
165
			this.levelBox.Name = "levelBox";
166
			this.levelBox.Size = new System.Drawing.Size(121, 21);
167
			this.levelBox.TabIndex = 8;
168
			this.levelBox.SelectedIndexChanged += new System.EventHandler(this.levelBox_SelectedIndexChanged);
169
			//
170
			// listenPortBox
171
			//
172
			this.listenPortBox.Location = new System.Drawing.Point(88, 16);
173
			this.listenPortBox.Name = "listenPortBox";
174
			this.listenPortBox.TabIndex = 2;
175
			this.listenPortBox.Text = "";
176
			//
177
			// tcpShowByDirectionMenuItem
178
			//
179
			this.tcpShowByDirectionMenuItem.Checked = true;
180
			this.tcpShowByDirectionMenuItem.Index = 1;
181
			this.tcpShowByDirectionMenuItem.Text = "TCP Show by &Direction";
182
			this.tcpShowByDirectionMenuItem.Click += new System.EventHandler(this.tcpShowByDirectionMenuItem_Click);
183
			//
184
			// messagesContextMenu
185
			//
186
			this.messagesContextMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
187
						this.selectAllmenuItem,
188
						this.copyMenuItem,
189
						this.clearMenuItem,
190
						this.wordWrapMenuItem});
191
			this.messagesContextMenu.Popup += new System.EventHandler(this.messagesContextMenu_Popup);
192
			//
193
			// stopButton
194
			//
195
			this.stopButton.Location = new System.Drawing.Point(192, 16);
196
			this.stopButton.Name = "stopButton";
197
			this.stopButton.TabIndex = 5;
198
			this.stopButton.Text = "Stop";
199
			this.stopButton.Visible = false;
200
			this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
201
			//
202
			// saveLogMenu
203
			//
204
			this.saveLogMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
205
						this.saveLogMenuItem,
206
						this.saveTcpMenuItem,
207
						this.saveHttpMenuItem,
208
						this.saveXmlMenuItem});
209
			//
210
			// saveLogMenuItem
211
			//
212
			this.saveLogMenuItem.Index = 0;
213
			this.saveLogMenuItem.Text = "Save Log";
214
			this.saveLogMenuItem.Click += new System.EventHandler(this.saveLogMenuItem_Click);
215
			//
216
			// statusBar
217
			//
218
			this.statusBar.Location = new System.Drawing.Point(0, 619);
219
			this.statusBar.Name = "statusBar";
220
			this.statusBar.Panels.AddRange(new System.Windows.Forms.StatusBarPanel[] {
221
						this.connectionStatusBar});
222
			this.statusBar.ShowPanels = true;
223
			this.statusBar.Size = new System.Drawing.Size(780, 22);
224
			this.statusBar.TabIndex = 0;
225
			//
226
			// saveButtonImageList
227
			//
228
			this.saveButtonImageList.ImageSize = new System.Drawing.Size(16, 16);
229
			this.saveButtonImageList.TransparentColor = System.Drawing.Color.Transparent;
230
			//
231
			// panel4
232
			//
233
			this.panel4.Controls.Add(this.messagesBox);
234
			this.panel4.Controls.Add(this.splitter2);
235
			this.panel4.Controls.Add(this.logBox);
236
			this.panel4.Dock = System.Windows.Forms.DockStyle.Fill;
237
			this.panel4.Location = new System.Drawing.Point(163, 0);
238
			this.panel4.Name = "panel4";
239
			this.panel4.Size = new System.Drawing.Size(617, 539);
240
			this.panel4.TabIndex = 13;
241
			//
242
			// closeConnectionMenuItem
243
			//
244
			this.closeConnectionMenuItem.Index = 0;
245
			this.closeConnectionMenuItem.Text = "&Close connection";
246
			this.closeConnectionMenuItem.Click += new System.EventHandler(this.closeConnectionMenuItem_Click);
247
			//
248
			// panel1
249
			//
250
			this.panel1.Controls.Add(this.panel3);
251
			this.panel1.Controls.Add(this.panel2);
252
			this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
253
			this.panel1.Location = new System.Drawing.Point(0, 0);
254
			this.panel1.Name = "panel1";
255
			this.panel1.Size = new System.Drawing.Size(780, 619);
256
			this.panel1.TabIndex = 1;
257
			//
258
			// panel2
259
			//
260
			this.panel2.Controls.Add(this.levelLabel);
261
			this.panel2.Controls.Add(this.levelBox);
262
			this.panel2.Controls.Add(this.saveButton);
263
			this.panel2.Controls.Add(this.clearButton);
264
			this.panel2.Controls.Add(this.stopButton);
265
			this.panel2.Controls.Add(this.startButton);
266
			this.panel2.Controls.Add(this.label2);
267
			this.panel2.Controls.Add(this.label1);
268
			this.panel2.Controls.Add(this.resendPortBox);
269
			this.panel2.Controls.Add(this.resendHostBox);
270
			this.panel2.Controls.Add(this.listenPortBox);
271
			this.panel2.Dock = System.Windows.Forms.DockStyle.Bottom;
272
			this.panel2.Location = new System.Drawing.Point(0, 539);
273
			this.panel2.Name = "panel2";
274
			this.panel2.Size = new System.Drawing.Size(780, 80);
275
			this.panel2.TabIndex = 3;
276
			//
277
			// saveTcpMenuItem
278
			//
279
			this.saveTcpMenuItem.Index = 1;
280
			this.saveTcpMenuItem.Text = "Save TCP";
281
			this.saveTcpMenuItem.Click += new System.EventHandler(this.saveTcpMenuItem_Click);
282
			//
283
			// splitter1
284
			//
285
			this.splitter1.Location = new System.Drawing.Point(160, 0);
286
			this.splitter1.Name = "splitter1";
287
			this.splitter1.Size = new System.Drawing.Size(3, 539);
288
			this.splitter1.TabIndex = 12;
289
			this.splitter1.TabStop = false;
290
			//
291
			// messageView
292
			//
293
			this.messageView.ContextMenu = this.viewContextMenu;
294
			this.messageView.Dock = System.Windows.Forms.DockStyle.Left;
295
			this.messageView.HideSelection = false;
296
			this.messageView.ImageList = this.treeImageList;
297
			this.messageView.Location = new System.Drawing.Point(0, 0);
298
			this.messageView.Name = "messageView";
299
			this.messageView.Size = new System.Drawing.Size(160, 539);
300
			this.messageView.TabIndex = 11;
301
			this.messageView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.messageView_AfterSelect);
302
			this.messageView.BeforeSelect += new System.Windows.Forms.TreeViewCancelEventHandler(this.messageView_BeforeSelect);
303
			//
304
			// viewContextMenu
305
			//
306
			this.viewContextMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
307
						this.closeConnectionMenuItem,
308
						this.tcpShowByDirectionMenuItem,
309
						this.tcpShowByTimeMenuItem,
310
						this.autoExpandMenuItem});
311
			this.viewContextMenu.Popup += new System.EventHandler(this.listContextMenu_Popup);
312
			//
313
			// splitter2
314
			//
315
			this.splitter2.Dock = System.Windows.Forms.DockStyle.Bottom;
316
			this.splitter2.Location = new System.Drawing.Point(0, 468);
317
			this.splitter2.Name = "splitter2";
318
			this.splitter2.Size = new System.Drawing.Size(617, 3);
319
			this.splitter2.TabIndex = 9;
320
			this.splitter2.TabStop = false;
321
			//
322
			// copyMenuItem
323
			//
324
			this.copyMenuItem.Index = 1;
325
			this.copyMenuItem.Shortcut = System.Windows.Forms.Shortcut.CtrlC;
326
			this.copyMenuItem.Text = "&Copy";
327
			this.copyMenuItem.Click += new System.EventHandler(this.copyMenuItem_Click);
328
			//
329
			// autoExpandMenuItem
330
			//
331
			this.autoExpandMenuItem.Index = 3;
332
			this.autoExpandMenuItem.Text = "Auto &Expand";
333
			this.autoExpandMenuItem.Click += new System.EventHandler(this.autoExpandMenuItem_Click);
334
			//
335
			// label1
336
			//
337
			this.label1.AutoSize = true;
338
			this.label1.Location = new System.Drawing.Point(8, 20);
339
			this.label1.Name = "label1";
340
			this.label1.Size = new System.Drawing.Size(73, 16);
341
			this.label1.TabIndex = 3;
342
			this.label1.Text = "Listen on port";
343
			//
344
			// selectAllmenuItem
345
			//
346
			this.selectAllmenuItem.Index = 0;
347
			this.selectAllmenuItem.Shortcut = System.Windows.Forms.Shortcut.CtrlA;
348
			this.selectAllmenuItem.Text = "Select &All";
349
			this.selectAllmenuItem.Click += new System.EventHandler(this.selectAllMenuItem_Click);
350
			//
351
			// resendPortBox
352
			//
353
			this.resendPortBox.Location = new System.Drawing.Point(192, 48);
354
			this.resendPortBox.Name = "resendPortBox";
355
			this.resendPortBox.Size = new System.Drawing.Size(72, 20);
356
			this.resendPortBox.TabIndex = 4;
357
			this.resendPortBox.Text = "";
358
			//
359
			// saveHttpMenuItem
360
			//
361
			this.saveHttpMenuItem.Index = 2;
362
			this.saveHttpMenuItem.Text = "Save HTTP";
363
			this.saveHttpMenuItem.Click += new System.EventHandler(this.saveHttpMenuItem_Click);
364
			//
365
			// saveButton
366
			//
367
			this.saveButton.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
368
			this.saveButton.ImageList = this.saveButtonImageList;
369
			this.saveButton.Location = new System.Drawing.Point(288, 48);
370
			this.saveButton.Name = "saveButton";
371
			this.saveButton.TabIndex = 7;
372
			this.saveButton.Text = "Save Log";
373
			this.saveButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
374
			this.saveButton.Click += new System.EventHandler(this.saveButton_Click);
375
			//
376
			// panel3
377
			//
378
			this.panel3.Controls.Add(this.panel4);
379
			this.panel3.Controls.Add(this.splitter1);
380
			this.panel3.Controls.Add(this.messageView);
381
			this.panel3.Dock = System.Windows.Forms.DockStyle.Fill;
382
			this.panel3.Location = new System.Drawing.Point(0, 0);
383
			this.panel3.Name = "panel3";
384
			this.panel3.Size = new System.Drawing.Size(780, 539);
385
			this.panel3.TabIndex = 5;
386
			//
387
			// messagesBox
388
			//
389
			this.messagesBox.ContextMenu = this.messagesContextMenu;
390
			this.messagesBox.Dock = System.Windows.Forms.DockStyle.Fill;
391
			this.messagesBox.Font = new System.Drawing.Font("Courier New", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
392
			this.messagesBox.Location = new System.Drawing.Point(0, 0);
393
			this.messagesBox.Name = "messagesBox";
394
			this.messagesBox.Size = new System.Drawing.Size(617, 468);
395
			this.messagesBox.TabIndex = 7;
396
			this.messagesBox.WordWrap = true;
397
			//
398
			// levelLabel
399
			//
400
			this.levelLabel.AutoSize = true;
401
			this.levelLabel.Location = new System.Drawing.Point(384, 20);
402
			this.levelLabel.Name = "levelLabel";
403
			this.levelLabel.Size = new System.Drawing.Size(86, 16);
404
			this.levelLabel.TabIndex = 9;
405
			this.levelLabel.Text = "Messages Level";
406
			//
407
			// connectionStatusBar
408
			//
409
			this.connectionStatusBar.AutoSize = System.Windows.Forms.StatusBarPanelAutoSize.Spring;
410
			this.connectionStatusBar.Width = 764;
411
			//
412
			// clearMenuItem
413
			//
414
			this.clearMenuItem.Index = 2;
415
			this.clearMenuItem.Shortcut = System.Windows.Forms.Shortcut.CtrlL;
416
			this.clearMenuItem.Text = "C&lear";
417
			this.clearMenuItem.Click += new System.EventHandler(this.clearButton_Click);
418
			//
419
			// saveLogDialog
420
			//
421
			this.saveLogDialog.DefaultExt = "txt";
422
			this.saveLogDialog.Filter = "Text Files|*.txt|All Files|*.*";
423
			this.saveLogDialog.Title = "Save Log";
424
			//
425
			// tcpShowByTimeMenuItem
426
			//
427
			this.tcpShowByTimeMenuItem.Index = 2;
428
			this.tcpShowByTimeMenuItem.Text = "TCP Show by &Time";
429
			this.tcpShowByTimeMenuItem.Click += new System.EventHandler(this.tcpShowByTimeMenuItem_Click);
430
			//
431
			// logBox
432
			//
433
			this.logBox.Dock = System.Windows.Forms.DockStyle.Bottom;
434
			this.logBox.Font = new System.Drawing.Font("Courier New", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
435
			this.logBox.HorizontalScrollbar = true;
436
			this.logBox.ItemHeight = 16;
437
			this.logBox.Location = new System.Drawing.Point(0, 471);
438
			this.logBox.Name = "logBox";
439
			this.logBox.ScrollAlwaysVisible = true;
440
			this.logBox.Size = new System.Drawing.Size(617, 68);
441
			this.logBox.TabIndex = 8;
442
			//
443
			// saveXmlMenuItem
444
			//
445
			this.saveXmlMenuItem.Index = 3;
446
			this.saveXmlMenuItem.Text = "Save XML";
447
			this.saveXmlMenuItem.Click += new System.EventHandler(this.saveXmlMenuItem_Click);
448
			//
449
			// startButton
450
			//
451
			this.startButton.Location = new System.Drawing.Point(192, 16);
452
			this.startButton.Name = "startButton";
453
			this.startButton.TabIndex = 5;
454
			this.startButton.Text = "Start";
455
			this.startButton.Click += new System.EventHandler(this.startButton_Click);
456
			//
457
			// label2
458
			//
459
			this.label2.AutoSize = true;
460
			this.label2.Location = new System.Drawing.Point(8, 52);
461
			this.label2.Name = "label2";
462
			this.label2.Size = new System.Drawing.Size(56, 16);
463
			this.label2.TabIndex = 4;
464
			this.label2.Text = "Resend to";
465
			//
466
			// MainForm
467
			//
468
			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
469
			this.ClientSize = new System.Drawing.Size(780, 641);
470
			this.Controls.Add(this.panel1);
471
			this.Controls.Add(this.statusBar);
472
			this.MinimumSize = new System.Drawing.Size(400, 200);
473
			this.Name = "MainForm";
474
			this.Text = "TCPproxy";
475
			this.panel4.ResumeLayout(false);
476
			this.panel1.ResumeLayout(false);
477
			this.panel2.ResumeLayout(false);
478
			this.panel3.ResumeLayout(false);
479
			((System.ComponentModel.ISupportInitialize)(this.connectionStatusBar)).EndInit();
480
			this.ResumeLayout(false);
481
		}
482
		#endregion
483
 
484
		#region windows forms methods
485
		public MainForm()
486
		{
487
			InitializeComponent();
488
			logMessages = new LogMessages(logBox);
489
			LoadFromRegistry();
490
			if(levelBox.SelectedIndex < 0) levelBox.SelectedIndex = 0;
491
		}
492
 
493
		protected override void Dispose( bool disposing )
494
		{
495
			if(tcpListener != null)
496
			{
497
				tcpListener.StopListening();    // stop listening
498
				tcpListener.CancelAll();        // cancel all open connections
499
			}
500
 
501
			SaveToRegistry();   // save settings
502
 
503
			if( disposing )
504
			{
505
				if (components != null)
506
				{
507
					components.Dispose();
508
				}
509
			}
510
			base.Dispose( disposing );
511
		}
512
 
513
		[STAThread]
514
		static void Main()
515
		{
516
			Application.Run(new MainForm());
517
		}
518
 
519
		private void LoadFromRegistry()
520
		{
521
			Microsoft.Win32.RegistryKey subkey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(
1125 dev 522
				@"Software\Anatoli Klassen\TCPproxy");
1092 dev 523
 
524
			if(subkey != null)
525
			{
526
				listenPortBox.Text     = (string)subkey.GetValue("Listen Port", "");
527
				resendHostBox.Text     = (string)subkey.GetValue("Resend Host", "");
528
				resendPortBox.Text     = (string)subkey.GetValue("Resend Port", "");
529
				levelBox.SelectedIndex = (int)subkey.GetValue("Message Level", 0);
530
				autoExpand             = (int)subkey.GetValue("Auto Expand", 1) == 1;
531
				messagesBox.WordWrap   = (int)subkey.GetValue("Word Wrap", 1) == 1;
532
 
533
				object tcpShowModeStr  = (object)subkey.GetValue("Tcp Show Mode", TcpShowMode.ByDirection);
534
				tcpShowMode            = (tcpShowModeStr as string) == "ByDirection"
535
					? TcpShowMode.ByDirection : TcpShowMode.ByTime;
1125 dev 536
 
537
//				this.Top   = (int)subkey.GetValue("Window.Top", this.Top);
538
//				this.Left  = (int)subkey.GetValue("Window.Left", this.Left);
539
//				this.Hight = (int)subkey.GetValue("Window.Hight", this.Hight);
540
//				this.Width = (int)subkey.GetValue("Window.Width", this.Width);
1092 dev 541
			}
542
		}
543
 
544
		private void SaveToRegistry()
545
		{
546
			Microsoft.Win32.RegistryKey subkey = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(
1125 dev 547
				@"Software\Anatoli Klassen\TCPproxy");
1092 dev 548
 
549
			subkey.SetValue("Listen Port",   listenPortBox.Text);
550
			subkey.SetValue("Resend Host",   resendHostBox.Text);
551
			subkey.SetValue("Resend Port",   resendPortBox.Text);
552
			subkey.SetValue("Message Level", levelBox.SelectedIndex);
553
			subkey.SetValue("Tcp Show Mode", tcpShowMode);
554
			subkey.SetValue("Auto Expand",   autoExpand ? 1 : 0);
555
			subkey.SetValue("Word Wrap",     messagesBox.WordWrap ? 1 : 0);
1125 dev 556
 
557
			subkey.SetValue("Window.Top",    this.Top);
558
			subkey.SetValue("Window.Left",   this.Left);
559
			subkey.SetValue("Window.Hight",  this.Height);
560
			subkey.SetValue("Window.Width",  this.Width);
1092 dev 561
		}
562
 
563
		private void startButton_Click(object sender, System.EventArgs e)
564
		{
565
			int       listenPort     = -1;
566
			IPAddress resendHost;
567
			int       resendPort     = -1;
568
			ArrayList tcpConnections = new ArrayList();
569
 
570
			// parse listen port
571
			try
572
			{
573
				listenPort = int.Parse(listenPortBox.Text);
574
			}
575
			catch(FormatException)
576
			{
577
				MessageBox.Show("Listen port must be an integer number");
578
				return;
579
			}
580
 
581
			// get resend host
582
			if(resendHostBox.Text == "")
583
			{
584
				resendHost = null;
585
			}
586
			else
587
			{
588
				Regex ipRegex = new Regex(@"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$");
589
				if(ipRegex.Match(resendHostBox.Text).Success)
590
				{
591
					try
592
					{
593
						resendHost = IPAddress.Parse(resendHostBox.Text);
594
					}
595
					catch(FormatException)
596
					{
597
						MessageBox.Show("Wrong IP address of the resend host");
598
						return;
599
					}
600
				}
601
				else
602
				{
603
					IPHostEntry hostInfo = Dns.GetHostByName(resendHostBox.Text);
604
 
605
					if(hostInfo.AddressList.Length > 0)
606
					{
607
						resendHost = hostInfo.AddressList[0];
608
					}
609
					else
610
					{
611
						MessageBox.Show("Cannot find IP address of the resend host");
612
						return;
613
					}
614
				}
615
 
616
				// parse resend port
617
				try
618
				{
619
					resendPort = int.Parse(resendPortBox.Text);
620
				}
621
				catch(FormatException)
622
				{
623
					MessageBox.Show("Resend port must be an integer number");
624
					return;
625
				}
626
			}
627
 
628
			// listen to the port
629
			try
630
			{
631
				Start(listenPort, resendHost, resendPort);
632
			}
633
			catch(Exception ex)
634
			{
635
				MessageBox.Show("Cannot start listening: " + ex.Message, "TCPproxy",
636
					MessageBoxButtons.OK, MessageBoxIcon.Error);
637
				Console.WriteLine(ex.Message + " (" + ex.GetType().Name + ")\n" + ex.StackTrace);
638
				return;
639
			}
640
 
641
			startButton.Visible   = false;
642
			stopButton.Visible    = true;
643
			listenPortBox.Enabled = false;
644
			resendHostBox.Enabled = false;
645
			resendPortBox.Enabled = false;
646
		}
647
 
648
		private void stopButton_Click(object sender, System.EventArgs e)
649
		{
650
			if(tcpListener != null) tcpListener.StopListening();
651
 
652
			startButton.Visible   = true;
653
			stopButton.Visible    = false;
654
			listenPortBox.Enabled = true;
655
			resendHostBox.Enabled = true;
656
			resendPortBox.Enabled = true;
657
		}
658
 
659
		private void clearButton_Click(object sender, System.EventArgs e)
660
		{
1125 dev 661
			// close all connetions
662
			foreach(object tcp in treeNodes.Keys)
663
				if(tcp is TcpConnection)
664
					((TcpConnection)tcp).Cancel();
665
 
1092 dev 666
			treeNodes.Clear();
667
			messageView.Nodes.Clear();
668
			messagesBox.Clear();
669
			logMessages.Clear();
670
		}
671
 
672
		private void saveButton_Click(object sender, System.EventArgs e)
673
		{
674
			saveLogMenu.Show(saveButton, new Point(saveButton.Width, 0));
675
		}
676
 
677
		private void messagesContextMenu_Popup(object sender, System.EventArgs e)
678
		{
679
			wordWrapMenuItem.Checked = messagesBox.WordWrap;
680
		}
681
 
682
		private void selectAllMenuItem_Click(object sender, System.EventArgs e)
683
		{
684
			messagesBox.SelectAll();
685
		}
686
 
687
		private void copyMenuItem_Click(object sender, System.EventArgs e)
688
		{
689
			string sel = messagesBox.SelectedText;
690
			if(sel != null) Clipboard.SetDataObject(sel);
691
		}
692
 
693
		private void wordWrapMenuItem_Click(object sender, System.EventArgs e)
694
		{
695
			messagesBox.WordWrap = !messagesBox.WordWrap;
696
		}
697
 
698
		private void autoExpandMenuItem_Click(object sender, System.EventArgs e)
699
		{
700
			autoExpand = !autoExpand;
701
		}
702
 
703
		private void messageView_BeforeSelect(object sender, System.Windows.Forms.TreeViewCancelEventArgs e)
704
		{
705
			if(messageView.SelectedNode == null) return;
706
 
707
			object tag = messageView.SelectedNode.Tag;
708
			if(tag is TreeNodeData)
709
			{
710
				TreeNodeData data = (TreeNodeData)tag;
711
				data.SaveViewState();
712
			}
713
		}
714
 
715
		private void messageView_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
716
		{
717
			if(messageView.SelectedNode == null) return;
718
 
719
			object tag = messageView.SelectedNode.Tag;
720
			if(tag is TreeNodeData)
721
			{
722
				TreeNodeData data = (TreeNodeData)tag;
723
				data.Show();
724
			}
725
		}
726
 
727
		private void closeConnectionMenuItem_Click(object sender, System.EventArgs e)
728
		{
729
			if(messageView.SelectedNode == null) return;
730
 
731
			object tag = messageView.SelectedNode.Tag;
732
			if(tag is TcpNodeData)
733
				CloseTcpConnection(((TcpNodeData)tag).Tcp);
734
			else if(tag is TcpNodeData)
735
				CloseTcpConnection(((TcpNodeData)messageView.SelectedNode.Parent.Tag).Tcp);
736
			else if(tag is XmlNodeData)
737
				CloseTcpConnection(((TcpNodeData)messageView.SelectedNode.Parent.Parent.Tag).Tcp);
738
		}
739
 
740
		private void tcpShowByDirectionMenuItem_Click(object sender, System.EventArgs e)
741
		{
742
			tcpShowMode = TcpShowMode.ByDirection;
743
 
744
			if(messageView.SelectedNode == null) return;
745
 
746
			object tag = messageView.SelectedNode.Tag;
747
			if(tag is TcpNodeData)
748
				UpdateTcpNodeInternal(((TcpNodeData)tag).Tcp);
749
		}
750
 
751
		private void tcpShowByTimeMenuItem_Click(object sender, System.EventArgs e)
752
		{
753
			tcpShowMode = TcpShowMode.ByTime;
754
 
755
			if(messageView.SelectedNode == null) return;
756
 
757
			object tag = messageView.SelectedNode.Tag;
758
			if(tag is TcpNodeData)
759
				UpdateTcpNodeInternal(((TcpNodeData)tag).Tcp);
760
		}
761
 
762
		private void listContextMenu_Popup(object sender, System.EventArgs e)
763
		{
764
			if(tcpShowMode == TcpShowMode.ByDirection)
765
			{
766
				tcpShowByDirectionMenuItem.Checked = true;
767
				tcpShowByTimeMenuItem.Checked      = false;
768
			}
769
			else
770
			{
771
				tcpShowByDirectionMenuItem.Checked = false;
772
				tcpShowByTimeMenuItem.Checked      = true;
773
			}
774
 
775
			autoExpandMenuItem.Checked = autoExpand;
776
		}
777
 
778
		private void saveLogMenuItem_Click(object sender, System.EventArgs e)
779
		{
780
			if(saveLogDialog.ShowDialog() == DialogResult.OK)
781
			{
782
				SaveLog(saveLogDialog.FileName);
783
			}
784
		}
785
 
786
		private void saveTcpMenuItem_Click(object sender, System.EventArgs e)
787
		{
788
			if(saveLogDialog.ShowDialog() == DialogResult.OK)
789
			{
790
				SaveTcp(saveLogDialog.FileName);
791
			}
792
		}
793
 
794
		private void saveHttpMenuItem_Click(object sender, System.EventArgs e)
795
		{
796
			if(saveLogDialog.ShowDialog() == DialogResult.OK)
797
			{
798
				SaveHttp(saveLogDialog.FileName);
799
			}
800
		}
801
 
802
		private void saveXmlMenuItem_Click(object sender, System.EventArgs e)
803
		{
804
			if(saveLogDialog.ShowDialog() == DialogResult.OK)
805
			{
806
				SaveXml(saveLogDialog.FileName);
807
			}
808
		}
809
 
810
		private void levelBox_SelectedIndexChanged(object sender, System.EventArgs e)
811
		{
812
			LogLevel level = LogLevel.Debug;
813
 
814
			if(levelBox.SelectedIndex == 1)
815
				level = LogLevel.Info;
816
			else if(levelBox.SelectedIndex == 2)
817
				level = LogLevel.Important;
818
 
819
			logMessages.Level = level;
820
		}
821
 
822
		#endregion windows forms methods
823
 
824
		#region core methods
825
		private void Start(int listenPort, IPAddress resendHost, int resendPort)
826
		{
827
			if(tcpListener != null) tcpListener.StopListening();
828
 
829
			tcpListener = new TcpListener(listenPort, resendHost, resendPort);
830
			tcpListener.Log    += new TcpLogEventHandler(TcpConnectionLog);
831
			tcpListener.NewTcp += new TcpConnectionEventHandler(AddTcpConnetion);
832
			tcpListener.StartListening();
833
		}
834
 
835
		private void CloseTcpConnection(TcpConnection tcp)
836
		{
837
			if(tcp == null) return;
838
 
839
			tcp.Cancel();
840
		}
841
 
842
		private void SaveLog(string fileName)
843
		{
844
			StreamWriter writer = new StreamWriter(fileName);
845
 
846
			foreach(LogMessage message in logMessages.Messages)
847
			{
848
				writer.WriteLine(message);
849
			}
850
 
851
			writer.Close();
852
		}
853
 
854
		private void SaveTcp(string fileName)
855
		{
856
			StreamWriter writer = new StreamWriter(fileName);
857
 
858
			foreach(TreeNode tcpNode in messageView.Nodes)
859
			{
860
				TcpNodeData data = (TcpNodeData)tcpNode.Tag;
861
				data.WriteLog(writer);
862
			}
863
 
864
			writer.Close();
865
		}
866
 
867
		private void SaveHttp(string fileName)
868
		{
869
			StreamWriter writer = new StreamWriter(fileName);
870
 
871
			foreach(TreeNode tcpNode in messageView.Nodes)
872
			{
873
				foreach(TreeNode httpNode in tcpNode.Nodes)
874
				{
875
					HttpNodeData data = (HttpNodeData)httpNode.Tag;
876
					data.WriteLog(writer);
877
				}
878
			}
879
 
880
			writer.Close();
881
		}
882
 
883
		private void SaveXml(string fileName)
884
		{
885
			StreamWriter writer = new StreamWriter(fileName);
886
 
887
			foreach(TreeNode tcpNode in messageView.Nodes)
888
			{
889
				foreach(TreeNode httpNode in tcpNode.Nodes)
890
				{
891
					foreach(TreeNode xmlNode in httpNode.Nodes)
892
					{
893
						XmlNodeData data = (XmlNodeData)xmlNode.Tag;
894
						data.WriteLog(writer);
895
					}
896
				}
897
			}
898
 
899
			writer.Close();
900
		}
901
 
902
		#endregion core methods
903
 
904
		#region network events handlers
905
		private void TcpConnectionLog(object sender, TcpLogEventArgs e)
906
		{
1125 dev 907
			lock(this)
908
			{
909
				TcpConnection tcp = sender as TcpConnection;
910
				LogMessage message = new LogMessage(tcp, e.Level, e.Message, e.Exception);
1092 dev 911
 
1125 dev 912
				try
913
				{
914
					this.BeginInvoke(new AddLogMessageHandler(AddLogMessageInternal), new object[] { message } );
915
				}
916
				catch(InvalidOperationException ex)
917
				{
918
					if(!this.Disposing && !this.IsDisposed)
919
						Console.WriteLine(ex.Message + " (" + ex.GetType().Name + ")\n" + ex.StackTrace);
920
				}
1092 dev 921
			}
922
		}
923
 
924
		private void AddTcpConnetion(object sender, TcpConnectionEventArgs e)
925
		{
1125 dev 926
			lock(this)
927
			{
928
				e.Tcp.Log     += new TcpLogEventHandler(TcpConnectionLog);
929
				e.Tcp.Update  += new TcpEventHandler(UpdateTcpNode);
930
				e.Tcp.Close   += new TcpEventHandler(UpdateTcpNode);
931
				e.Tcp.NewHttp += new TcpHttpEventHandler(AddHttpMessageNode);
1092 dev 932
 
1125 dev 933
				try
934
				{
935
					this.BeginInvoke(new AddTcpNodeHandler(AddTcpNodeInternal), new object[] { e.Tcp } );
936
				}
937
				catch(InvalidOperationException ex)
938
				{
939
					if(!this.Disposing && !this.IsDisposed)
940
						Console.WriteLine(ex.Message + " (" + ex.GetType().Name + ")\n" + ex.StackTrace);
941
				}
1092 dev 942
			}
943
		}
944
 
945
		private void UpdateTcpNode(object sender, TcpEventArgs e)
946
		{
1125 dev 947
			lock(this)
1092 dev 948
			{
1125 dev 949
				try
950
				{
951
					this.BeginInvoke(new UpdateTcpNodeHandler(UpdateTcpNodeInternal), new object[] { (TcpConnection)sender } );
952
				}
953
				catch(InvalidOperationException ex)
954
				{
955
					if(!this.Disposing && !this.IsDisposed)
956
						Console.WriteLine(ex.Message + " (" + ex.GetType().Name + ")\n" + ex.StackTrace);
957
				}
1092 dev 958
			}
959
		}
960
 
961
		private void AddHttpMessageNode(object sender, TcpHttpEventArgs e)
962
		{
1125 dev 963
			lock(this)
964
			{
965
				e.Http.Update += new TcpEventHandler(UpdateHttpNode);
1092 dev 966
 
1125 dev 967
				try
968
				{
969
					this.BeginInvoke(new AddHttpNodeHandler(AddHttpNodeInternal),
970
						new object[] { (TcpConnection)sender, e.Http } );
971
				}
972
				catch(InvalidOperationException ex)
973
				{
974
					if(!this.Disposing && !this.IsDisposed)
975
						Console.WriteLine(ex.Message + " (" + ex.GetType().Name + ")\n" + ex.StackTrace);
976
				}
1092 dev 977
			}
978
		}
979
 
980
		private void UpdateHttpNode(object sender, TcpEventArgs e)
981
		{
1125 dev 982
			lock(this)
1092 dev 983
			{
1125 dev 984
				try
985
				{
986
					this.BeginInvoke(new UpdateHttpNodeHandler(UpdateHttpNodeInternal), new object[] { (HttpMessage)sender } );
987
				}
988
				catch(InvalidOperationException ex)
989
				{
990
					if(!this.Disposing && !this.IsDisposed)
991
						Console.WriteLine(ex.Message + " (" + ex.GetType().Name + ")\n" + ex.StackTrace);
992
				}
1092 dev 993
			}
994
		}
995
 
996
		#endregion network events handlers
997
 
998
		#region handlers for async GUI events
999
		private delegate void AddLogMessageHandler(LogMessage message);
1000
		private delegate void AddTcpNodeHandler(TcpConnection tcp);
1001
		private delegate void UpdateTcpNodeHandler(TcpConnection tcp);
1002
		private delegate void AddHttpNodeHandler(TcpConnection tcp, HttpMessage http);
1003
		private delegate void UpdateHttpNodeHandler(HttpMessage http);
1004
 
1005
		private void AddLogMessageInternal(LogMessage message)
1006
		{
1007
			logMessages.Add(message);
1008
 
1009
			if(message.Exception != null)
1010
			{
1011
				Console.WriteLine(message.Exception.Message + " (" + message.Exception.GetType().Name
1012
					+ ")\n" + message.Exception.StackTrace);
1013
			}
1014
		}
1015
 
1016
		private void AddTcpNodeInternal(TcpConnection tcp)
1017
		{
1018
			TreeNode    treeNode = new TreeNode(tcp.ToString());
1019
			TcpNodeData data     = new TcpNodeData(this, treeNode);
1020
 
1021
			data.Tcp = tcp;
1022
			treeNode.Tag                = data;
1023
			treeNode.ImageIndex         = 1;
1024
			treeNode.SelectedImageIndex = 1;
1025
			treeNodes[tcp] = data;
1026
 
1027
			messageView.Nodes.Add(treeNode);
1028
			treeNode.EnsureVisible();
1029
		}
1030
 
1031
		private void UpdateTcpNodeInternal(TcpConnection tcp)
1032
		{
1033
			TcpNodeData data = treeNodes[tcp] as TcpNodeData;
1125 dev 1034
			if(data == null) return; // might be call by Cancel
1092 dev 1035
 
1036
			string title = tcp.ToString();
1037
			if(title != data.Node.Text) data.Node.Text = title;
1038
			if(tcp.LocalState == SocketState.Closed && tcp.RemoteState == SocketState.Closed)
1039
			{
1040
				data.Node.ImageIndex         = 2;
1041
				data.Node.SelectedImageIndex = 2;
1042
			}
1043
 
1044
			if(messageView.SelectedNode == null || data != messageView.SelectedNode.Tag)
1045
				data.ViewExpired = true;  // got update for invisible TCP node, update it later
1046
			else
1047
				data.Show();
1048
		}
1049
 
1050
		private void AddHttpNodeInternal(TcpConnection tcp, HttpMessage http)
1051
		{
1052
			TreeNode     treeNode = new TreeNode(http.ToString());
1053
			HttpNodeData data     = new HttpNodeData(this, treeNode);
1054
 
1055
			data.Http = http;
1056
			treeNode.Tag = data;
1057
			treeNodes[http] = data;
1058
 
1059
			TcpNodeData tcpData = treeNodes[tcp] as TcpNodeData;
1060
			if(tcpData == null) throw new ArgumentException("No node found for TCP message");
1061
 
1062
			tcpData.Node.Nodes.Add(treeNode);
1063
			if(autoExpand) tcpData.Node.Expand();
1064
			tcpData.Node.EnsureVisible();
1065
		}
1066
 
1067
		private void UpdateHttpNodeInternal(HttpMessage http)
1068
		{
1069
			HttpNodeData httpData = treeNodes[http] as HttpNodeData;
1125 dev 1070
			if(httpData == null) return; // might be call by Cancel
1092 dev 1071
 
1072
			string title = http.ToString();
1073
			if(httpData.Node.Text != title) httpData.Node.Text = title;
1074
 
1075
			if(!httpData.RequestXmlShown && http.RequestXml != null)
1076
			{
1077
				httpData.RequestXmlShown = true;
1078
				AddXmlNode(httpData.Node, "Request XML", http.RequestXml);
1079
				if(autoExpand) httpData.Node.Expand();
1080
			}
1081
 
1082
			if(!httpData.ResponseXmlShown && http.ResponseXml != null)
1083
			{
1084
				httpData.ResponseXmlShown = true;
1085
				AddXmlNode(httpData.Node, "Response XML", http.ResponseXml);
1086
				if(autoExpand) httpData.Node.Expand();
1087
			}
1088
 
1089
			// update text view
1090
			if(messageView.SelectedNode == null || httpData != messageView.SelectedNode.Tag)
1091
				httpData.ViewExpired = true;
1092
			else
1093
				httpData.Show();
1094
		}
1095
 
1096
		private void AddXmlNode(TreeNode parent, string title, XmlMessage xml)
1097
		{
1098
			TreeNode    treeNode = new TreeNode(title);
1099
			XmlNodeData data = new XmlNodeData(this, treeNode);
1100
 
1101
			data.Xml       = xml;
1102
			treeNode.Tag   = data;
1103
			treeNodes[xml] = data;
1104
 
1105
			parent.Nodes.Add(treeNode);
1106
		}
1107
 
1108
		#endregion handlers for async GUI events
1109
 
1110
		#region node display classes
1111
		private abstract class TreeNodeData
1112
		{
1113
			protected TreeNode node;
1114
			protected object   viewState;
1115
			protected bool     viewExpired;
1116
			protected MainForm owner;
1117
			protected bool     shown = false;
1118
 
1119
			public TreeNode Node
1120
			{
1121
				get { return node; }
1122
			}
1123
 
1124
			public TreeNodeData(MainForm owner, TreeNode node)
1125
			{
1126
				this.owner = owner;
1127
				this.node  = node;
1128
			}
1129
 
1130
			public bool ViewExpired
1131
			{
1132
				get { return viewExpired; }
1133
				set { viewExpired = value; }
1134
			}
1135
 
1136
			public void SaveViewState()
1137
			{
1138
				viewState = owner.messagesBox.SaveState(false);
1139
			}
1140
 
1141
			protected virtual bool ForceInitView()
1142
			{
1143
				return false;
1144
			}
1145
 
1146
			protected abstract void InitView();
1147
			protected abstract void UpdateView();
1148
 
1149
			public void Show()
1150
			{
1151
				if(!shown || viewState == null || ForceInitView())
1152
				{
1153
					InitView();
1154
					shown = true;
1155
					if(viewState == null) viewState = owner.messagesBox.SaveState(false);
1156
				}
1157
				else
1158
				{
1159
					owner.messagesBox.RestoreState(viewState, true);
1160
					if(viewExpired) UpdateView();
1161
				}
1162
			}
1163
 
1164
			public abstract void WriteLog(StreamWriter writer);
1165
		}
1166
 
1167
		private class TcpNodeData : TreeNodeData
1168
		{
1169
			private TcpConnection tcp;
1170
 
1171
			private TcpShowMode lastShowMode;
1172
			private object      localStateMarker  = null;
1173
			private object      remoteStateMarker = null;
1174
			private object      startMarker       = null;
1175
			private object      localEndMarker    = null;
1176
			private object      remoteEndMarker   = null;
1177
			private object      clientMarker      = null;
1178
			private object      serverMarker      = null;
1179
			private object      sentMarker        = null;
1180
			private object      receivedMarker    = null;
1181
			private object      textMarker1       = null;
1182
			private object      textMarker2       = null;
1183
			private IEnumerator messagesEnum      = null;
1184
 
1185
			public TcpConnection Tcp
1186
			{
1187
				get { return tcp; }
1188
				set { tcp = value; }
1189
			}
1190
 
1191
			public TcpNodeData(MainForm owner, TreeNode node)	: base(owner, node)
1192
			{
1193
			}
1194
 
1195
 
1196
			protected override bool ForceInitView()
1197
			{
1198
				return (lastShowMode != owner.tcpShowMode);
1199
			}
1200
 
1201
			protected override void InitView()
1202
			{
1203
				lastShowMode = owner.tcpShowMode;
1204
 
1205
				try
1206
				{
1207
					owner.messagesBox.BeginUpdate();
1208
 
1209
					lock(tcp)
1210
					{
1211
						owner.messagesBox.Clear();
1212
 
1213
						owner.messagesBox.AppendNewLine();
1214
						owner.messagesBox.AppendText("ID:         ",
1215
							Color.DarkRed, Color.Transparent, false, false, 0, 0);
1216
						owner.messagesBox.AppendText(tcp.Id,
1217
							Color.DarkRed, Color.LightGray, false, false, 0, 12);
1218
						owner.messagesBox.AppendNewLine();
1219
 
1220
						owner.messagesBox.AppendText("State:      ",
1221
							Color.DarkRed, Color.Transparent, false, false, 0, 0);
1222
						localStateMarker = owner.messagesBox.BeginMark();
1223
						owner.messagesBox.AppendText(tcp.LocalState.ToString(),
1224
							Color.DarkRed, Color.LightGray, false, false, 0, 12);
1225
						owner.messagesBox.EndMark(localStateMarker);
1226
						owner.messagesBox.AppendText(null,
1227
							Color.DarkRed, Color.Transparent, false, false, 1, 12);
1228
						remoteStateMarker = owner.messagesBox.BeginMark();
1229
						owner.messagesBox.AppendText(tcp.RemoteState.ToString(),
1230
							Color.DarkRed, Color.LightGray, false, false, 0, 12);
1231
						owner.messagesBox.EndMark(remoteStateMarker);
1232
						owner.messagesBox.AppendNewLine();
1233
 
1234
						owner.messagesBox.AppendText("Start:      ",
1235
							Color.DarkRed, Color.Transparent, false, false, 0, 0);
1236
						startMarker = owner.messagesBox.BeginMark();
1237
						owner.messagesBox.AppendText(tcp.StartTimestamp.ToString("HH:mm:ss.ffff"),
1238
							Color.DarkRed, Color.LightGray, false, false, 0, 12);
1239
						owner.messagesBox.EndMark(startMarker);
1240
						owner.messagesBox.AppendNewLine();
1241
						owner.messagesBox.AppendText("Local End:  ",
1242
							Color.DarkRed, Color.Transparent, false, false, 0, 0);
1243
						localEndMarker = owner.messagesBox.BeginMark();
1244
						owner.messagesBox.AppendText(tcp.LocalEndTimestamp.ToString("HH:mm:ss.ffff"),
1245
							Color.DarkRed, Color.LightGray, false, false, 0, 12);
1246
						owner.messagesBox.EndMark(localEndMarker);
1247
						owner.messagesBox.AppendNewLine();
1248
						owner.messagesBox.AppendText("Remote End: ",
1249
							Color.DarkRed, Color.Transparent, false, false, 0, 0);
1250
						remoteEndMarker = owner.messagesBox.BeginMark();
1251
						owner.messagesBox.AppendText(tcp.RemoteEndTimestamp.ToString("HH:mm:ss.ffff"),
1252
							Color.DarkRed, Color.LightGray, false, false, 0, 12);
1253
						owner.messagesBox.EndMark(remoteEndMarker);
1254
						owner.messagesBox.AppendNewLine();
1255
 
1256
						owner.messagesBox.AppendText("Client:     ",
1257
							Color.DarkRed, Color.Transparent, false, false, 0, 0);
1258
						clientMarker = owner.messagesBox.BeginMark();
1259
						owner.messagesBox.AppendText((tcp.LocalPoint == null) ? "" : tcp.LocalPoint.ToString(),
1260
							Color.DarkRed, Color.LightGray, false, false, 0, 12);
1261
						owner.messagesBox.EndMark(clientMarker);
1262
						owner.messagesBox.AppendNewLine();
1263
						owner.messagesBox.AppendText("Server:     ",
1264
							Color.DarkRed, Color.Transparent, false, false, 0, 0);
1265
						serverMarker = owner.messagesBox.BeginMark();
1266
						owner.messagesBox.AppendText((tcp.RemotePoint == null) ? "" : tcp.RemotePoint.ToString(),
1267
							Color.DarkRed, Color.LightGray, false, false, 0, 12);
1268
						owner.messagesBox.EndMark(serverMarker);
1269
						owner.messagesBox.AppendNewLine();
1270
 
1271
						owner.messagesBox.AppendText("Sent:       ",
1272
							Color.DarkRed, Color.Transparent, false, false, 0, 0);
1273
						sentMarker = owner.messagesBox.BeginMark();
1274
						owner.messagesBox.AppendText(tcp.SentBytes.ToString(),
1275
							Color.DarkRed, Color.LightGray, false, false, 0, 12);
1276
						owner.messagesBox.EndMark(sentMarker);
1277
						owner.messagesBox.AppendNewLine();
1278
						owner.messagesBox.AppendText("Received:   ",
1279
							Color.DarkRed, Color.Transparent, false, false, 0, 0);
1280
						receivedMarker = owner.messagesBox.BeginMark();
1281
						owner.messagesBox.AppendText(tcp.ReceivedBytes.ToString(),
1282
							Color.DarkRed, Color.LightGray, false, false, 0, 12);
1283
						owner.messagesBox.EndMark(receivedMarker);
1284
						owner.messagesBox.AppendNewLine();
1285
						owner.messagesBox.AppendNewLine();
1286
 
1287
						messagesEnum = tcp.Messages.GetEnumerator();
1288
 
1289
						textMarker1 = owner.messagesBox.BeginMark();
1290
						owner.messagesBox.EndMark(textMarker1);
1291
 
1292
						owner.messagesBox.AppendNewLine();
1293
						textMarker2 = owner.messagesBox.BeginMark();
1294
						owner.messagesBox.EndMark(textMarker2);
1295
 
1296
						ShowMessages();
1297
					}
1298
				}
1299
				finally
1300
				{
1301
					owner.messagesBox.EndUpdate();
1302
				}
1303
			}
1304
 
1305
			protected override void UpdateView()
1306
			{
1307
				try
1308
				{
1309
					owner.messagesBox.BeginUpdate();
1310
 
1311
					lock(tcp)
1312
					{
1313
						owner.messagesBox.ChangeText(localStateMarker, tcp.LocalState.ToString(),
1314
							Color.DarkRed, Color.LightGray, false, false, 0, 12);
1315
						owner.messagesBox.ChangeText(remoteStateMarker, tcp.RemoteState.ToString(),
1316
							Color.DarkRed, Color.LightGray, false, false, 0, 12);
1317
 
1318
						owner.messagesBox.ChangeText(startMarker, tcp.StartTimestamp.ToString("HH:mm:ss.ffff"),
1319
							Color.DarkRed, Color.LightGray, false, false, 0, 12);
1320
						owner.messagesBox.ChangeText(localEndMarker, tcp.LocalEndTimestamp.ToString("HH:mm:ss.ffff"),
1321
							Color.DarkRed, Color.LightGray, false, false, 0, 12);
1322
						owner.messagesBox.ChangeText(remoteEndMarker, tcp.RemoteEndTimestamp.ToString("HH:mm:ss.ffff"),
1323
							Color.DarkRed, Color.LightGray, false, false, 0, 12);
1324
 
1325
						owner.messagesBox.ChangeText(clientMarker, (tcp.LocalPoint == null) ? "" : tcp.LocalPoint.ToString(),
1326
							Color.DarkRed, Color.LightGray, false, false, 0, 12);
1327
						owner.messagesBox.ChangeText(serverMarker, (tcp.RemotePoint == null) ? "" : tcp.RemotePoint.ToString(),
1328
							Color.DarkRed, Color.LightGray, false, false, 0, 12);
1329
 
1330
						owner.messagesBox.ChangeText(sentMarker, tcp.SentBytes.ToString(),
1331
							Color.DarkRed, Color.LightGray, false, false, 0, 12);
1332
						owner.messagesBox.ChangeText(receivedMarker, tcp.ReceivedBytes.ToString(),
1333
							Color.DarkRed, Color.LightGray, false, false, 0, 12);
1334
 
1335
						ShowMessages();
1336
					}
1337
				}
1338
				finally
1339
				{
1340
					owner.messagesBox.EndUpdate();
1341
				}
1342
			}
1343
 
1344
			private void ShowMessages()
1345
			{
1346
				while(messagesEnum.MoveNext())
1347
				{
1348
					TcpMessage message = (TcpMessage)messagesEnum.Current;
1349
					object     marker  = (owner.tcpShowMode == TcpShowMode.ByTime
1350
						|| message.Direction == TcpMessageDirection.Local) ? textMarker1 : textMarker2;
1351
 
1352
					if(owner.tcpShowMode == TcpShowMode.ByTime)
1353
					{
1354
						owner.messagesBox.InsertText(marker,
1355
							message.Timestamp.ToString("HH:mm:ss.ffff") + " ("	+ message.Length + ")",
1356
							Color.DarkRed, Color.Transparent, false, false, 0, 0);
1357
						owner.messagesBox.InsertNewLine(marker);
1358
					}
1359
 
1360
					string str = Utils.BytesToString(message.Bytes, message.Length);
1361
					ArrayList lines = Utils.SplitLine(str);
1362
					for(int i = 0; i < lines.Count; i++)
1363
					{
1364
						owner.messagesBox.InsertText(marker, (string)lines[i],
1365
							message.Direction == TcpMessageDirection.Local ? Color.Green : Color.Blue,
1366
							Color.LightGray, false, false, 0, 0);
1367
 
1368
						if(owner.tcpShowMode == TcpShowMode.ByTime || i != lines.Count - 1)
1369
							owner.messagesBox.InsertNewLine(marker);
1370
					}
1371
				}
1372
			}
1373
 
1374
			public override void WriteLog(StreamWriter writer)
1375
			{
1376
				writer.WriteLine(
1377
					"Start:      " + tcp.StartTimestamp.ToString("HH:mm:ss.ffff")
1378
					+ "\r\nLocal End:  " + tcp.LocalEndTimestamp.ToString("HH:mm:ss.ffff")
1379
					+ "\r\nRemote End: " + tcp.RemoteEndTimestamp.ToString("HH:mm:ss.ffff")
1380
					+ "\r\nClient:     " + ((tcp.LocalPoint  == null) ? "" : tcp.LocalPoint.ToString())
1381
					+ "\r\nServer:     " + ((tcp.RemotePoint == null) ? "" : tcp.RemotePoint.ToString())
1382
					+ "\r\nSent:       " + tcp.SentBytes
1383
					+ "\r\nReceived:   " + tcp.ReceivedBytes);
1384
 
1385
				foreach(TcpMessage message in tcp.Messages)
1386
				{
1387
					string str = Utils.BytesToString(message.Bytes, message.Length);
1388
					if(!str.EndsWith("\n")) str += "\r\n";
1389
 
1390
					writer.WriteLine();
1391
					if(message.Direction == TcpMessageDirection.Local)
1392
						writer.WriteLine(">>> {0:HH:mm:ss.ffff} >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>", message.Timestamp);
1393
					else
1394
						writer.WriteLine("<<< {0:HH:mm:ss.ffff} <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<", message.Timestamp);
1395
					writer.Write(str);
1396
				}
1397
				writer.WriteLine("===============================================================");
1398
				writer.WriteLine();
1399
			}
1400
		}
1401
 
1402
		private class HttpNodeData : TreeNodeData
1403
		{
1404
			private HttpMessage http;
1405
			private bool        requestXmlShown  = false;
1406
			private bool        responseXmlShown = false;
1407
 
1408
			private object      stateMarker               = null;
1125 dev 1409
			private object      requestStartMarker        = null;
1092 dev 1410
			private object      requestMethodMarker       = null;
1411
			private object      requestUriMarker          = null;
1412
			private object      requestVersionMarker      = null;
1413
			private object      requestLengthMarker       = null;
1414
			private object      requestEncodingMarker     = null;
1415
			private object      requestContentTypeMarker  = null;
1416
			private object      requestCharsetMarker      = null;
1417
			private object      requestHeadersMarker      = null;
1125 dev 1418
			private object      responseStartMarker       = null;
1092 dev 1419
			private object      responseVersionMarker     = null;
1420
			private object      responseStatusMarker      = null;
1421
			private object      responseLengthMarker      = null;
1422
			private object      responseEncodingMarker    = null;
1423
			private object      responseContentTypeMarker = null;
1424
			private object      responseCharsetMarker     = null;
1425
			private object      responseHeadersMarker     = null;
1426
			private object      requestBodyMarker         = null;
1427
			private object      responseBodyMarker        = null;
1428
			private IEnumerator requestHeadersEnum        = null;
1429
			private IEnumerator responseHeadersEnum       = null;
1430
 
1431
			public HttpMessage Http
1432
			{
1433
				get { return http; }
1434
				set { http = value; }
1435
			}
1436
 
1437
			public bool RequestXmlShown
1438
			{
1439
				get { return requestXmlShown; }
1440
				set { requestXmlShown = value; }
1441
			}
1442
 
1443
			public bool ResponseXmlShown
1444
			{
1445
				get { return responseXmlShown; }
1446
				set { responseXmlShown = value; }
1447
			}
1448
 
1449
			public HttpNodeData(MainForm owner, TreeNode node) : base(owner, node)
1450
			{
1451
			}
1452
 
1453
			private string EncodingToString(HttpEncoding encoding)
1454
			{
1455
				switch(encoding)
1456
				{
1457
					case HttpEncoding.Identify: return "identify";
1458
					case HttpEncoding.Gzip:     return "gzip";
1459
					case HttpEncoding.Compress: return "compress";
1460
					case HttpEncoding.Deflate:  return "deflate";
1461
					default:                    return "<unknown>";
1462
				}
1463
			}
1464
 
1465
			protected override void InitView()
1466
			{
1467
				try
1468
				{
1469
					lock(http)
1470
					{
1471
						owner.messagesBox.Clear();
1472
 
1473
						owner.messagesBox.AppendNewLine();
1474
						owner.messagesBox.AppendText("Complete:                  ",
1475
							Color.DarkRed, Color.Transparent, false, false, 0, 0);
1476
						stateMarker = owner.messagesBox.BeginMark();
1477
						owner.messagesBox.AppendText(http.RequestComplete && http.ResponseComplete ? "YES" : "NO",
1478
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1479
						owner.messagesBox.EndMark(stateMarker);
1480
						owner.messagesBox.AppendNewLine();
1481
						owner.messagesBox.AppendNewLine();
1482
 
1483
						// request info
1125 dev 1484
						owner.messagesBox.AppendText("Request Start:             ",
1485
							Color.DarkRed, Color.Transparent, false, false, 0, 0);
1486
						requestStartMarker = owner.messagesBox.BeginMark();
1487
						owner.messagesBox.AppendText(http.RequestStartTimestamp == DateTime.MinValue
1488
							? "<unknown>" : http.RequestStartTimestamp.ToString("HH:mm:ss.ffff"),
1489
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1490
						owner.messagesBox.EndMark(requestStartMarker);
1491
						owner.messagesBox.AppendNewLine();
1492
 
1092 dev 1493
						owner.messagesBox.AppendText("Request Method:            ",
1494
							Color.DarkRed, Color.Transparent, false, false, 0, 0);
1495
						requestMethodMarker = owner.messagesBox.BeginMark();
1496
						owner.messagesBox.AppendText(http.RequestMethod,
1497
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1498
						owner.messagesBox.EndMark(requestMethodMarker);
1499
						owner.messagesBox.AppendNewLine();
1500
 
1501
						owner.messagesBox.AppendText("Request URI:               ",
1502
							Color.DarkRed, Color.Transparent, false, false, 0, 0);
1503
						requestUriMarker = owner.messagesBox.BeginMark();
1504
						owner.messagesBox.AppendText(http.RequestUri,
1505
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1506
						owner.messagesBox.EndMark(requestUriMarker);
1507
						owner.messagesBox.AppendNewLine();
1508
 
1509
						owner.messagesBox.AppendText("Request Version:           ",
1510
							Color.DarkRed, Color.Transparent, false, false, 0, 0);
1511
						requestVersionMarker = owner.messagesBox.BeginMark();
1512
						owner.messagesBox.AppendText(http.RequestVersion == HttpVersion.V0_9 ? "HTTP/0.9"
1513
							: http.RequestVersion == HttpVersion.V1_0 ? "HTTP/1.0" : "HTTP/1.1",
1514
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1515
						owner.messagesBox.EndMark(requestVersionMarker);
1516
						owner.messagesBox.AppendNewLine();
1517
 
1518
						owner.messagesBox.AppendText("Request Content Length:    ",
1519
							Color.DarkRed, Color.Transparent, false, false, 0, 0);
1520
						requestLengthMarker = owner.messagesBox.BeginMark();
1521
						owner.messagesBox.AppendText(http.RequestLength < 0 ? "<unknown>" : http.RequestLength.ToString(),
1522
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1523
						owner.messagesBox.EndMark(requestLengthMarker);
1524
						owner.messagesBox.AppendNewLine();
1525
 
1526
						owner.messagesBox.AppendText("Request Content Encoding:  ",
1527
							Color.DarkRed, Color.Transparent, false, false, 0, 0);
1528
						requestEncodingMarker = owner.messagesBox.BeginMark();
1529
						owner.messagesBox.AppendText(EncodingToString(http.RequestEncoding),
1530
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1531
						owner.messagesBox.EndMark(requestEncodingMarker);
1532
						owner.messagesBox.AppendNewLine();
1533
 
1534
						owner.messagesBox.AppendText("Request Content Type:      ",
1535
							Color.DarkRed, Color.Transparent, false, false, 0, 0);
1536
						requestContentTypeMarker = owner.messagesBox.BeginMark();
1537
						owner.messagesBox.AppendText(http.RequestContentType == null ? "<unknown>"
1538
							: http.RequestContentType + "/" + http.RequestContentSubtype,
1539
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1540
						owner.messagesBox.EndMark(requestContentTypeMarker);
1541
						owner.messagesBox.AppendNewLine();
1542
 
1543
						owner.messagesBox.AppendText("Request Content Charset:   ",
1544
							Color.DarkRed, Color.Transparent, false, false, 0, 0);
1545
						requestCharsetMarker = owner.messagesBox.BeginMark();
1546
						owner.messagesBox.AppendText(http.RequestCharset == null ? "<unknown>" : http.RequestCharset,
1547
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1548
						owner.messagesBox.EndMark(requestCharsetMarker);
1549
						owner.messagesBox.AppendNewLine();
1550
 
1551
						owner.messagesBox.AppendText("Request Headers:",
1552
							Color.DarkRed, Color.Transparent, false, false, 0, 0);
1553
						owner.messagesBox.AppendNewLine();
1554
						requestHeadersMarker = owner.messagesBox.BeginMark();
1555
						owner.messagesBox.EndMark(requestHeadersMarker);
1556
 
1557
						requestHeadersEnum = http.RequestHeaders.GetEnumerator();
1558
						ShowHeaders(requestHeadersEnum, requestHeadersMarker);
1559
 
1560
						// response info
1561
						owner.messagesBox.AppendNewLine();
1125 dev 1562
						owner.messagesBox.AppendText("Response Start:            ",
1563
							Color.DarkRed, Color.Transparent, false, false, 0, 0);
1564
						responseStartMarker = owner.messagesBox.BeginMark();
1565
						owner.messagesBox.AppendText(http.ResponseStartTimestamp == DateTime.MinValue
1566
							? "<unknown>" : http.ResponseStartTimestamp.ToString("HH:mm:ss.ffff"),
1567
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1568
						owner.messagesBox.EndMark(responseStartMarker);
1569
						owner.messagesBox.AppendNewLine();
1570
 
1092 dev 1571
						owner.messagesBox.AppendText("Response Version:          ",
1572
							Color.DarkRed, Color.Transparent, false, false, 0, 0);
1573
						responseVersionMarker = owner.messagesBox.BeginMark();
1574
						owner.messagesBox.AppendText(http.ResponseVersion == HttpVersion.V0_9
1575
							? "HTTP/0.9" : http.ResponseVersion == HttpVersion.V1_0 ? "HTTP/1.0" : "HTTP/1.1",
1576
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1577
						owner.messagesBox.EndMark(responseVersionMarker);
1578
						owner.messagesBox.AppendNewLine();
1579
 
1580
						owner.messagesBox.AppendText("Response Status:           ",
1581
							Color.DarkRed, Color.Transparent, false, false, 0, 0);
1582
						responseStatusMarker = owner.messagesBox.BeginMark();
1583
						owner.messagesBox.AppendText(http.ResponseStatusCode + " " + http.ResponseStatusMessage,
1584
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1585
						owner.messagesBox.EndMark(responseStatusMarker);
1586
						owner.messagesBox.AppendNewLine();
1587
 
1588
						owner.messagesBox.AppendText("Response Content Length:   ",
1589
							Color.DarkRed, Color.Transparent, false, false, 0, 0);
1590
						responseLengthMarker = owner.messagesBox.BeginMark();
1591
						owner.messagesBox.AppendText(http.ResponseLength < 0 ? "<unknown>" : http.ResponseLength.ToString(),
1592
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1593
						owner.messagesBox.EndMark(responseLengthMarker);
1594
						owner.messagesBox.AppendNewLine();
1595
 
1596
						owner.messagesBox.AppendText("Response Content Encoding: ",
1597
							Color.DarkRed, Color.Transparent, false, false, 0, 0);
1598
						responseEncodingMarker = owner.messagesBox.BeginMark();
1599
						owner.messagesBox.AppendText(EncodingToString(http.ResponseEncoding),
1600
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1601
						owner.messagesBox.EndMark(responseEncodingMarker);
1602
						owner.messagesBox.AppendNewLine();
1603
 
1604
						owner.messagesBox.AppendText("Response Content Type:     ",
1605
							Color.DarkRed, Color.Transparent, false, false, 0, 0);
1606
						responseContentTypeMarker = owner.messagesBox.BeginMark();
1607
						owner.messagesBox.AppendText(http.ResponseContentType == null ? "<unknown>"
1608
							: http.ResponseContentType + "/" + http.ResponseContentSubtype,
1609
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1610
						owner.messagesBox.EndMark(responseContentTypeMarker);
1611
						owner.messagesBox.AppendNewLine();
1612
 
1613
						owner.messagesBox.AppendText("Response Content Charset:  ",
1614
							Color.DarkRed, Color.Transparent, false, false, 0, 0);
1615
						responseCharsetMarker = owner.messagesBox.BeginMark();
1616
						owner.messagesBox.AppendText(http.ResponseCharset == null ? "<unknown>" : http.ResponseCharset,
1617
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1618
						owner.messagesBox.EndMark(responseCharsetMarker);
1619
						owner.messagesBox.AppendNewLine();
1620
 
1621
						owner.messagesBox.AppendText("Response Headers:",
1622
							Color.DarkRed, Color.Transparent, false, false, 0, 0);
1623
						owner.messagesBox.AppendNewLine();
1624
						responseHeadersMarker = owner.messagesBox.BeginMark();
1625
						owner.messagesBox.EndMark(responseHeadersMarker);
1626
 
1627
						responseHeadersEnum = http.ResponseHeaders.GetEnumerator();
1628
						ShowHeaders(responseHeadersEnum, responseHeadersMarker);
1629
 
1630
						owner.messagesBox.AppendNewLine();
1631
						requestBodyMarker = owner.messagesBox.BeginMark();
1632
						owner.messagesBox.EndMark(requestBodyMarker);
1633
						ShowBody(requestBodyMarker, http.RequestBody, http.RequestLength, http.RequestText, Color.Green);
1634
 
1635
						owner.messagesBox.AppendNewLine();
1636
						responseBodyMarker = owner.messagesBox.BeginMark();
1637
						owner.messagesBox.EndMark(responseBodyMarker);
1638
						ShowBody(responseBodyMarker, http.ResponseBody, http.ResponseLength, http.ResponseText, Color.Blue);
1639
					}
1640
				}
1641
				finally
1642
				{
1643
					owner.messagesBox.EndUpdate();
1644
				}
1645
			}
1646
 
1647
			protected override void UpdateView()
1648
			{
1649
				try
1650
				{
1651
					owner.messagesBox.BeginUpdate();
1652
 
1653
					lock(http)
1654
					{
1655
						owner.messagesBox.ChangeText(stateMarker, http.RequestComplete && http.ResponseComplete ? "YES" : "NO",
1656
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1657
						owner.messagesBox.ChangeText(requestMethodMarker, http.RequestMethod,
1658
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1659
						owner.messagesBox.ChangeText(requestUriMarker, http.RequestUri,
1660
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1661
						owner.messagesBox.ChangeText(requestVersionMarker, http.RequestVersion == HttpVersion.V0_9 ? "HTTP/0.9"
1662
							: http.RequestVersion == HttpVersion.V1_0 ? "HTTP/1.0" : "HTTP/1.1",
1663
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1664
						owner.messagesBox.ChangeText(requestLengthMarker, http.RequestLength < 0
1665
							? "<unknown>" : http.RequestLength.ToString(),
1666
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1667
						owner.messagesBox.ChangeText(requestEncodingMarker, EncodingToString(http.RequestEncoding),
1668
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1669
						owner.messagesBox.ChangeText(requestContentTypeMarker, http.RequestContentType == null ? "<unknown>"
1670
							: http.RequestContentType + "/" + http.RequestContentSubtype,
1671
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1672
						owner.messagesBox.ChangeText(requestCharsetMarker, http.RequestCharset == null
1673
							? "<unknown>" : http.RequestCharset,
1674
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1675
 
1676
						ShowHeaders(requestHeadersEnum, requestHeadersMarker);
1677
 
1678
						owner.messagesBox.ChangeText(responseVersionMarker, http.ResponseVersion == HttpVersion.V0_9
1679
							? "HTTP/0.9" : http.ResponseVersion == HttpVersion.V1_0 ? "HTTP/1.0" : "HTTP/1.1",
1680
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1681
						owner.messagesBox.ChangeText(responseStatusMarker, http.ResponseStatusCode + " " + http.ResponseStatusMessage,
1682
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1683
						owner.messagesBox.ChangeText(responseLengthMarker, http.ResponseLength < 0
1684
							? "<unknown>" : http.ResponseLength.ToString(),
1685
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1686
						owner.messagesBox.ChangeText(responseEncodingMarker, EncodingToString(http.ResponseEncoding),
1687
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1688
						owner.messagesBox.ChangeText(responseContentTypeMarker, http.ResponseContentType == null ? "<unknown>"
1689
							: http.ResponseContentType + "/" + http.ResponseContentSubtype,
1690
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1691
						owner.messagesBox.ChangeText(responseCharsetMarker, http.ResponseCharset == null
1692
							? "<unknown>" : http.ResponseCharset,
1693
							Color.DarkRed, Color.LightGray, false, false, 0, 27);
1694
 
1695
						ShowHeaders(responseHeadersEnum, responseHeadersMarker);
1696
 
1697
						owner.messagesBox.DeleteText(requestBodyMarker);
1698
						ShowBody(requestBodyMarker, http.RequestBody, http.RequestLength, http.RequestText, Color.Green);
1699
						owner.messagesBox.DeleteText(responseBodyMarker);
1700
						ShowBody(responseBodyMarker, http.ResponseBody, http.ResponseLength, http.ResponseText, Color.Blue);
1701
					}
1702
				}
1703
				finally
1704
				{
1705
					owner.messagesBox.EndUpdate();
1706
				}
1707
			}
1708
 
1709
			private void ShowHeaders(IEnumerator headers, object marker)
1710
			{
1711
				while(headers.MoveNext())
1712
				{
1713
					HttpHeader h = (HttpHeader)headers.Current;
1714
 
1715
					bool first = true;
1716
					foreach(string val in h.Values)
1717
					{
1718
						if(first)
1719
						{
1720
							owner.messagesBox.InsertText(marker, h.Name + ":",
1721
								Color.DarkRed, Color.Transparent, false, false, 4, 4);
1722
							owner.messagesBox.InsertText(marker, null,
1723
								Color.DarkRed, Color.Transparent, false, false, 6 - 4 - 1, 4);
1724
							first = false;
1725
						}
1726
						else
1727
						{
1728
							owner.messagesBox.InsertText(marker, null,
1729
								Color.DarkRed, Color.Transparent, false, false, 6 + h.Name.Length, 6 + h.Name.Length);
1730
						}
1731
						owner.messagesBox.InsertText(marker, val,
1732
							Color.DarkRed, Color.LightGray, false, false, 0, 6 + h.Name.Length);
1733
						owner.messagesBox.InsertNewLine(marker);
1734
					}
1735
				}
1736
			}
1737
 
1738
			private void ShowBody(object marker, byte[] body, int len, string text, Color color)
1739
			{
1740
				if(text != null)
1741
				{
1742
					ArrayList lines = Utils.SplitLine(text);
1743
					for(int i = 0; i < lines.Count; i++)
1744
					{
1745
						owner.messagesBox.InsertText(marker, (string)lines[i], color, Color.LightGray, false, false, 0, 0);
1746
						owner.messagesBox.InsertNewLine(marker);
1747
					}
1748
				}
1749
				else if(body != null)
1750
				{
1751
					ArrayList lines = Utils.SplitLine(Utils.BytesToString(body, len));
1752
					for(int i = 0; i < lines.Count; i++)
1753
					{
1754
						owner.messagesBox.InsertText(marker, (string)lines[i], color, Color.LightGray, false, false, 0, 0);
1755
						owner.messagesBox.InsertNewLine(marker);
1756
					}
1757
				}
1758
			}
1759
 
1760
			public override void WriteLog(StreamWriter writer)
1761
			{
1762
				// request info
1763
				writer.WriteLine(
1764
					"Complete:                  " + (http.RequestComplete && http.ResponseComplete ? "YES" : "NO") + "\r\n"
1765
					+ "\r\nRequest Method:            " + http.RequestMethod
1766
					+ "\r\nRequest URI:               " + http.RequestUri
1767
					+ "\r\nRequest Version:           " + (http.RequestVersion == HttpVersion.V0_9 ? "HTTP/0.9"
1768
						: http.RequestVersion == HttpVersion.V1_0 ? "HTTP/1.0" : "HTTP/1.1")
1769
					+ "\r\nRequest Content Length:    " + (http.RequestLength < 0 ? "<unknown>" : http.RequestLength.ToString())
1770
					+ "\r\nRequest Content Encoding:  " + EncodingToString(http.RequestEncoding)
1771
					+ "\r\nRequest Content Type:      " + (http.RequestContentType == null ? "<unknown>"
1772
						: http.RequestContentType + "/" + http.RequestContentSubtype)
1773
					+ "\r\nRequest Content Charset:   " + (http.RequestCharset == null ? "<unknown>" : http.RequestCharset)
1774
					+ "\r\nRequest Headers:");
1775
 
1776
				foreach(HttpHeader h in http.RequestHeaders)
1777
				{
1778
					int indent = 0;
1779
					foreach(string val in h.Values)
1780
					{
1781
						if(indent == 0)
1782
						{
1783
							writer.WriteLine("    {0}: {1}", h.Name, val);
1784
							indent = 6 + h.Name.Length;
1785
						}
1786
						else
1787
						{
1788
							writer.WriteLine("{0," + indent + "}{1}", " ", val);
1789
						}
1790
					}
1791
				}
1792
 
1793
				// response info
1794
				writer.WriteLine(
1795
					"\r\nResponse Version:          " + (http.ResponseVersion == HttpVersion.V0_9
1796
						? "HTTP/0.9" : http.ResponseVersion == HttpVersion.V1_0 ? "HTTP/1.0" : "HTTP/1.1")
1797
					+ "\r\nResponse Status:           " + http.ResponseStatusCode + " " + http.ResponseStatusMessage
1798
					+ "\r\nResponse Content Length:   " + (http.ResponseLength < 0
1799
						? "<unknown>" : http.ResponseLength.ToString())
1800
					+ "\r\nResponse Content Encoding: " + EncodingToString(http.ResponseEncoding)
1801
					+ "\r\nResponse Content Type:     " + (http.ResponseContentType == null ? "<unknown>"
1802
						: http.ResponseContentType + "/" + http.ResponseContentSubtype)
1803
					+ "\r\nResponse Content Charset:  " + (http.ResponseCharset == null ? "<unknown>" : http.ResponseCharset)
1804
					+ "\r\nResponse Headers:");
1805
 
1806
				foreach(HttpHeader h in http.ResponseHeaders)
1807
				{
1808
					int indent = 0;
1809
					foreach(string val in h.Values)
1810
					{
1811
						if(indent == 0)
1812
						{
1813
							writer.WriteLine("    {0}: {1}", h.Name, val);
1814
							indent = 6 + h.Name.Length;
1815
						}
1816
						else
1817
						{
1818
							writer.WriteLine("{0," + indent + "}{1}", " ", val);
1819
						}
1820
					}
1821
				}
1822
				writer.WriteLine();
1823
 
1824
				// request body
1825
				if(http.RequestText != null)
1826
				{
1827
					writer.WriteLine(http.RequestText);
1828
				}
1829
				else if(http.RequestBody != null)
1830
				{
1831
					writer.WriteLine(Utils.BytesToString(http.RequestBody, http.RequestLength));
1832
				}
1833
 
1834
				// response body
1835
				if(http.ResponseText != null)
1836
				{
1837
					writer.WriteLine(http.ResponseText);
1838
				}
1839
				else if(http.ResponseBody != null)
1840
				{
1841
					writer.WriteLine(Utils.BytesToString(http.ResponseBody, http.ResponseLength));
1842
				}
1843
 
1844
				writer.WriteLine("===============================================================");
1845
				writer.WriteLine();
1846
			}
1847
		}
1848
 
1849
		private class XmlNodeData : TreeNodeData
1850
		{
1851
			private XmlMessage xml;
1852
 
1853
			public XmlMessage Xml
1854
			{
1855
				get { return xml; }
1856
				set { xml = value; }
1857
			}
1858
 
1859
			public XmlNodeData(MainForm owner, TreeNode node) : base(owner, node)
1860
			{
1861
			}
1862
 
1863
			protected override void InitView()
1864
			{
1865
				try
1866
				{
1867
					// update main screen if necessary
1868
					owner.messagesBox.BeginUpdate();
1869
 
1870
					lock(xml)
1871
					{
1872
						owner.messagesBox.Clear();
1873
						if(xml.ParseException != null)
1874
						{
1875
							owner.messagesBox.AppendText("Cannot parse XML:",
1876
								Color.Red, Color.Transparent, false, false, 0, 0);
1877
							owner.messagesBox.AppendNewLine();
1878
							owner.messagesBox.AppendText(xml.ParseException.Message,
1879
								Color.Red, Color.Transparent, false, false, 2, 2);
1880
							owner.messagesBox.AppendNewLine();
1881
						}
1882
						else if(xml.Xml != null)
1883
						{
1884
							ShowXmlNode(xml.Xml, 0);
1885
						}
1886
					}
1887
				}
1888
				finally
1889
				{
1890
					owner.messagesBox.EndUpdate();
1891
				}
1892
			}
1893
 
1894
			protected override void UpdateView()
1895
			{
1896
			}
1897
 
1898
			private void ShowXmlNode(XmlNode node, int indent)
1899
			{
1900
				if(node.NodeType == XmlNodeType.Document)
1901
				{
1902
					foreach(XmlNode subnode in node.ChildNodes)
1903
					{
1904
						ShowXmlNode(subnode, indent);
1905
					}
1906
				}
1907
				else if(node.NodeType == XmlNodeType.XmlDeclaration)
1908
				{
1909
					owner.messagesBox.AppendText("<?" + node.Name + " " + node.Value + " ?>",
1910
						Color.Blue, Color.Transparent, false, false, indent, indent+2);
1911
					owner.messagesBox.AppendNewLine();
1912
				}
1913
				else if(node.NodeType == XmlNodeType.Comment)
1914
				{
1915
					owner.messagesBox.AppendText("<!--", Color.Gray, Color.Transparent, false, false, indent, indent + 2);
1916
					ShowNormalizedXmlValue(node.Value, Color.Gray, Color.Thistle, false, false, indent);
1917
					owner.messagesBox.AppendText("-->", Color.Gray, Color.Transparent, false, false, 0, indent + 2);
1918
					owner.messagesBox.AppendNewLine();
1919
				}
1920
				else if(node.NodeType == XmlNodeType.Element)
1921
				{
1922
					owner.messagesBox.AppendText("<", Color.Blue, Color.Transparent, false, false, indent, indent + 2);
1923
					owner.messagesBox.AppendText(node.Name, Color.DarkRed, Color.Transparent, false, false, 0, indent + 2);
1924
 
1925
					foreach(XmlAttribute attr in node.Attributes)
1926
					{
1927
						bool xmlAttr = attr.Name.StartsWith("xml");
1928
						owner.messagesBox.AppendText(attr.Name, xmlAttr ? Color.Red : Color.DarkRed, Color.Transparent, false, false, 1, indent + 2);
1929
						owner.messagesBox.AppendText("=\"", Color.Blue, Color.Transparent, false, false, 0, indent + 2);
1930
						owner.messagesBox.AppendText(attr.Value, xmlAttr ? Color.Red : Color.DarkRed, Color.Transparent, false, false, 0, indent + 2);
1931
						owner.messagesBox.AppendText("\"", Color.Blue, Color.Transparent, false, false, 0, indent + 2);
1932
					}
1933
 
1934
					if(!node.HasChildNodes)
1935
					{
1936
						owner.messagesBox.AppendText(" />", Color.Blue, Color.Transparent, false, false, 0, indent + 2);
1937
						owner.messagesBox.AppendNewLine();
1938
					}
1939
					else
1940
					{
1941
						owner.messagesBox.AppendText(">", Color.Blue, Color.Transparent, false, false, 0, indent + 2);
1942
 
1943
						bool elementExists = false;
1944
						bool lastText      = true;
1945
						foreach(XmlNode subnode in node.ChildNodes)
1946
						{
1947
							if(subnode.NodeType == XmlNodeType.Text)
1948
							{
1949
								if(elementExists) owner.messagesBox.AppendNewLine();
1950
								ShowNormalizedXmlValue(subnode.Value, Color.Black, Color.LightGray, false, false, indent);
1951
								lastText = true;
1952
							}
1953
							else
1954
							{
1955
								if(lastText) owner.messagesBox.AppendNewLine();
1956
								ShowXmlNode(subnode, indent + 2);
1957
								elementExists = true;
1958
								lastText      = false;
1959
							}
1960
						}
1961
 
1962
						if(elementExists) owner.messagesBox.AppendText(null, Color.Black, Color.Transparent, false, false, indent, indent + 2);
1963
						owner.messagesBox.AppendText("</", Color.Blue, Color.Transparent, false, false, 0, indent + 2);
1964
						owner.messagesBox.AppendText(node.Name, Color.DarkRed, Color.Transparent, false, false, 0, indent + 2);
1965
						owner.messagesBox.AppendText(">", Color.Blue, Color.Transparent, false, false, 0, indent + 2);
1966
						owner.messagesBox.AppendNewLine();
1967
					}
1968
				}
1969
			}
1970
 
1971
			private void ShowNormalizedXmlValue(string s, Color color, Color backColor, bool italic, bool bold, int indent)
1972
			{
1973
				int begin;
1974
				int end;
1975
 
1976
				bool newLineFound = false;
1977
				foreach(char c in s)
1978
				{
1979
					if(c == '\n')
1980
					{
1981
						newLineFound = true;
1982
						break;
1983
					}
1984
				}
1985
 
1986
				if(newLineFound)
1987
				{
1988
					owner.messagesBox.AppendNewLine();
1989
					owner.messagesBox.AppendText(null, color, Color.Transparent, italic, bold, indent, indent);
1990
					owner.messagesBox.AppendText(null, color, backColor, italic, bold, 2, 2);
1991
				}
1992
 
1993
				// trim
1994
				for(begin = 0; begin < s.Length; begin++)
1995
				{
1996
					char c = s[begin];
1997
					if(c != '\n' && c != '\r' && c != '\t' && c != ' ') break;
1998
				}
1999
				for(end = s.Length-1; end >= 0; end--)
2000
				{
2001
					char c = s[end];
2002
					if(c != '\n' && c != '\r' && c != '\t' && c != ' ') break;
2003
				}
2004
 
2005
				StringBuilder b = new StringBuilder(s.Length);
2006
				for(int i = begin; i <= end; i++)
2007
				{
2008
					char c = s[i];
2009
 
2010
					switch(c)
2011
					{
2012
						case '\n':
2013
							if(b.Length > 0)
2014
							{
2015
								owner.messagesBox.AppendText(b.ToString(), color, backColor, italic, bold, 0, indent + 2);
2016
								b.Length = 0;
2017
							}
2018
 
2019
							owner.messagesBox.AppendNewLine();
2020
							owner.messagesBox.AppendText(null, color, Color.Transparent, italic, bold, indent, indent);
2021
							owner.messagesBox.AppendText(null, color, backColor, italic, bold, 2, 2);
2022
							break;
2023
 
2024
						case '\r':
2025
							break;
2026
 
2027
						case '\t':
2028
							b.Append("  ");
2029
							break;
2030
 
2031
						default:
2032
							b.Append(c);
2033
							break;
2034
					}
2035
				}
2036
 
2037
				if(b.Length > 0)
2038
					owner.messagesBox.AppendText(b.ToString(), color, backColor, italic, bold, 0, indent + 2);
2039
 
2040
				if(newLineFound)
2041
				{
2042
					owner.messagesBox.AppendNewLine();
2043
					owner.messagesBox.AppendText(null, color, Color.Transparent, italic, bold, indent, indent + 2);
2044
				}
2045
			}
2046
 
2047
			public override void WriteLog(StreamWriter writer)
2048
			{
2049
				WriteXmlNode(writer, xml.Xml, "");
2050
				writer.WriteLine("===============================================================");
2051
				writer.WriteLine();
2052
			}
2053
 
2054
			private void WriteXmlNode(StreamWriter writer, XmlNode node, string indent)
2055
			{
2056
				if(node.NodeType == XmlNodeType.Document)
2057
				{
2058
					foreach(XmlNode subnode in node.ChildNodes)
2059
					{
2060
						WriteXmlNode(writer, subnode, indent);
2061
					}
2062
				}
2063
				else if(node.NodeType == XmlNodeType.XmlDeclaration)
2064
				{
2065
					writer.WriteLine(indent + "<?" + node.Name + " " + node.Value + " ?>");
2066
				}
2067
				else if(node.NodeType == XmlNodeType.Comment)
2068
				{
2069
					writer.Write(indent + "<!--");
2070
					WriteNormalizedXmlValue(writer, node.Value, indent);
2071
					writer.WriteLine("-->");
2072
				}
2073
				else if(node.NodeType == XmlNodeType.Element)
2074
				{
2075
					writer.Write(indent + "<" + node.Name);
2076
 
2077
					foreach(XmlAttribute attr in node.Attributes)
2078
					{
2079
						bool xmlAttr = attr.Name.StartsWith("xml");
2080
						writer.Write(" " + attr.Name + "=\"" + attr.Value + "\"");
2081
					}
2082
 
2083
					if(!node.HasChildNodes)
2084
					{
2085
						writer.WriteLine(" />");
2086
					}
2087
					else
2088
					{
2089
						writer.Write(">");
2090
 
2091
						bool elementExists = false;
2092
						bool lastText      = true;
2093
						foreach(XmlNode subnode in node.ChildNodes)
2094
						{
2095
							if(subnode.NodeType == XmlNodeType.Text)
2096
							{
2097
								if(elementExists) writer.WriteLine();
2098
								WriteNormalizedXmlValue(writer, subnode.Value, indent);
2099
								lastText = true;
2100
							}
2101
							else
2102
							{
2103
								if(lastText) writer.WriteLine();
2104
								WriteXmlNode(writer, subnode, indent + "  ");
2105
								elementExists = true;
2106
								lastText      = false;
2107
							}
2108
						}
2109
 
2110
						if(elementExists) writer.Write(indent);
2111
						writer.WriteLine("</" + node.Name + ">");
2112
					}
2113
				}
2114
			}
2115
 
2116
			private void WriteNormalizedXmlValue(StreamWriter writer, string s, string indent)
2117
			{
2118
				int begin;
2119
				int end;
2120
 
2121
				bool newLineFound = false;
2122
				foreach(char c in s)
2123
				{
2124
					if(c == '\n')
2125
					{
2126
						newLineFound = true;
2127
						break;
2128
					}
2129
				}
2130
 
2131
				if(newLineFound)
2132
				{
2133
					writer.WriteLine();
2134
					writer.Write(indent + "  ");
2135
				}
2136
 
2137
				// trim
2138
				for(begin = 0; begin < s.Length; begin++)
2139
				{
2140
					char c = s[begin];
2141
					if(c != '\n' && c != '\r' && c != '\t' && c != ' ') break;
2142
				}
2143
				for(end = s.Length-1; end >= 0; end--)
2144
				{
2145
					char c = s[end];
2146
					if(c != '\n' && c != '\r' && c != '\t' && c != ' ') break;
2147
				}
2148
 
2149
				StringBuilder b = new StringBuilder(s.Length);
2150
				for(int i = begin; i <= end; i++)
2151
				{
2152
					char c = s[i];
2153
 
2154
					switch(c)
2155
					{
2156
						case '\n':
2157
							if(b.Length > 0)
2158
							{
2159
								writer.Write(b.ToString());
2160
								b.Length = 0;
2161
							}
2162
 
2163
							writer.WriteLine();
2164
							writer.Write(indent + "  ");
2165
							break;
2166
 
2167
						case '\r':
2168
							break;
2169
 
2170
						case '\t':
2171
							b.Append("  ");
2172
							break;
2173
 
2174
						case '&':
2175
							b.Append("&amp;");
2176
							break;
2177
 
2178
						case '<':
2179
							b.Append("&lt;");
2180
							break;
2181
 
2182
						case '>':
2183
							b.Append("&gt;");
2184
							break;
2185
 
2186
						default:
2187
							b.Append(c);
2188
							break;
2189
					}
2190
				}
2191
 
2192
				if(b.Length > 0)
2193
					writer.Write(b.ToString());
2194
 
2195
				if(newLineFound)
2196
				{
2197
					writer.WriteLine();
2198
					writer.Write(indent + "  ");
2199
				}
2200
			}
2201
		}
2202
 
2203
		#endregion node display classes
2204
 
2205
		#region other classes
2206
		private abstract class Utils
2207
		{
2208
			public static string BytesToString(byte[] bytes, int length)
2209
			{
2210
				if(bytes == null) return null;
2211
 
2212
				char[]  chars   = new char[length + 1];
2213
				Decoder decoder = System.Text.Encoding.UTF8.GetDecoder();
2214
				int     charLen = decoder.GetChars(bytes, 0, length, chars, 0);
2215
 
2216
				for(int i = 0; i < charLen; i++)
2217
				{
2218
					char c = chars[i];
2219
					if(c != '\n' && c != '\r' && Char.IsControl(c)) chars[i] = '.';
2220
				}
2221
 
2222
				return (new System.String(chars)).Substring(0, charLen);
2223
			}
2224
 
2225
			public static ArrayList SplitLine(string line)
2226
			{
2227
				if(line == null) return null;
2228
 
2229
				ArrayList    res = new ArrayList();
2230
				StringBuilder b  = new StringBuilder(200);
2231
 
2232
				foreach(char c in line)
2233
				{
2234
					switch(c)
2235
					{
2236
						case '\r':
2237
							break;
2238
 
2239
						case '\n':
2240
							res.Add(b.ToString());
2241
							b.Length = 0;
2242
							break;
2243
 
2244
						default:
2245
							b.Append(c);
2246
							break;
2247
					}
2248
				}
2249
 
2250
				res.Add(b.ToString());
2251
 
2252
				return res;
2253
			}
2254
		}
2255
		#endregion other classes
2256
	}
2257
 
2258
	public class LogMessages
2259
	{
2260
		private ArrayList messages = new ArrayList();
2261
		private ListBox   logBox;
2262
		private LogLevel  level = LogLevel.Debug;
2263
 
2264
		public LogLevel Level
2265
		{
2266
			get { return level; }
2267
			set { level = value; Update(); }
2268
		}
2269
 
2270
		public LogMessages(ListBox logBox)
2271
		{
2272
			this.logBox = logBox;
2273
		}
2274
 
2275
		public ArrayList Messages
2276
		{
2277
			get { return new ArrayList(messages); }
2278
		}
2279
 
2280
		public void Add(LogMessage message)
2281
		{
2282
			messages.Add(message);
2283
			if(Show(message))
2284
				logBox.TopIndex = logBox.Items.Count - 1;
2285
		}
2286
 
2287
		public void Clear()
2288
		{
2289
			messages.Clear();
2290
			logBox.Items.Clear();
2291
		}
2292
 
2293
		public void Update()
2294
		{
2295
			logBox.BeginUpdate();
2296
 
2297
			logBox.Items.Clear();
2298
			foreach(LogMessage message in messages)
2299
			{
2300
				Show(message);
2301
			}
2302
			logBox.TopIndex = logBox.Items.Count - 1;
2303
 
2304
			logBox.EndUpdate();
2305
		}
2306
 
2307
		private bool Show(LogMessage message)
2308
		{
2309
			if(message.Level > this.level) return false;
2310
 
2311
			try
2312
			{
2313
				logBox.Items.Add(message.ToString());
2314
			}
2315
			catch(ObjectDisposedException) {}
2316
 
2317
			return true;
2318
		}
2319
	}
2320
 
2321
	public class LogMessage
2322
	{
2323
		private TcpConnection tcp;
2324
		private LogLevel      level;
2325
		private string        message;
2326
		private Exception     exception;
2327
		private DateTime      timestamp = DateTime.Now;
2328
 
2329
		public TcpConnection Tcp
2330
		{
2331
			get { return tcp; }
2332
			set { tcp = value; }
2333
		}
2334
 
2335
		public LogLevel Level
2336
		{
2337
			get { return level; }
2338
			set { level = value; }
2339
		}
2340
 
2341
		public string Message
2342
		{
2343
			get { return message; }
2344
			set { message = value; }
2345
		}
2346
 
2347
		public Exception Exception
2348
		{
2349
			get { return exception; }
2350
			set { exception = value; }
2351
		}
2352
 
2353
		public DateTime Timestamp
2354
		{
2355
			get { return timestamp; }
2356
			set { timestamp = value; }
2357
		}
2358
 
2359
		public LogMessage(TcpConnection tcp, LogLevel level, string message, Exception exception)
2360
		{
2361
			this.tcp       = tcp;
2362
			this.level     = level;
2363
			this.message   = message;
2364
			this.exception = exception;
2365
		}
2366
 
2367
		public override string ToString()
2368
		{
2369
			string l = "     ";
2370
			switch(level)
2371
			{
2372
				case LogLevel.Debug:     l = "debug"; break;
2373
				case LogLevel.Info:      l = "info "; break;
2374
				case LogLevel.Important: l = "Imp  "; break;
2375
				case LogLevel.Warning:   l = "Warn "; break;
2376
				case LogLevel.Error:     l = "ERROR"; break;
2377
				case LogLevel.Critical:  l = "CRIT "; break;
2378
			}
2379
 
2380
			return (tcp == null ? "...." : tcp.Id) + " " + l + " " + timestamp.ToString("HH:mm:ss.ffff") + " "
2381
				+ (exception != null ? exception.Message : message);
2382
		}
2383
	}
2384
 
2385
	public enum TcpShowMode
2386
	{
2387
		ByDirection,
2388
		ByTime
2389
	}
2390
}