Subversion Repositories general

Rev

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