WingMan – Blame information for rev 4

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 office 1 using System;
4 office 2 using System.Collections.Concurrent;
1 office 3 using System.Collections.Generic;
4 using System.ComponentModel;
5 using System.Data;
6 using System.Drawing;
7 using System.Globalization;
8 using System.Linq;
9 using System.Net;
4 office 10 using System.Resources;
1 office 11 using System.Text;
12 using System.Threading;
13 using System.Threading.Tasks;
14 using System.Windows.Forms;
4 office 15 using Gma.System.MouseKeyHook;
1 office 16 using WingMan.Communication;
17 using WingMan.Host;
18  
19 namespace WingMan
20 {
2 office 21 public partial class WingManForm : Form
1 office 22 {
2 office 23 private MQTTServer MQTTServer { get; set; }
1 office 24  
2 office 25 private MQTTClient MQTTClient { get; set; }
1 office 26  
27 private SemaphoreSlim MQTTServerSemaphore {get; set;} = new SemaphoreSlim(1, 1);
28  
29 private SemaphoreSlim MQTTClientSemaphore { get; set; } = new SemaphoreSlim(1, 1);
30  
4 office 31 private static IKeyboardMouseEvents MouseKeyApplicationHook { get; set; }
32  
33 private static IKeyboardMouseEvents MouseKeyGlobalHook { get; set; }
34  
35 private List<string> MouseKeyCombo { get; set; }
36  
37 private HelmBindings HelmBindings { get; set; }
38  
39 private BindingSource HelmBindingSource { get; set; }
40  
41 public ConcurrentDictionary<string, HelmBindings> WingBindings { get; set; }
42  
2 office 43 public WingManForm()
1 office 44 {
45 InitializeComponent();
2 office 46  
4 office 47 MouseKeyGlobalHook = Hook.GlobalEvents();
48  
2 office 49 MQTTClient = new MQTTClient(this);
50 MQTTServer = new MQTTServer(this);
4 office 51  
52 HelmBindings = new HelmBindings();
53 HelmBindings.Bindings = new List<HelmBinding>();
54  
55 HelmBindingSource = new BindingSource();
56 HelmBindingSource.DataSource = HelmBindings.Bindings;
57  
58 HelmBindingsListBox.DisplayMember = "DisplayName";
59 HelmBindingsListBox.ValueMember = "Keys";
60 HelmBindingsListBox.DataSource = HelmBindingSource;
61  
62 WingBindings = new ConcurrentDictionary<string, HelmBindings>();
1 office 63 }
64  
65 private void AddressTextBoxClick(object sender, EventArgs e)
66 {
67 Address.BackColor = Color.Empty;
68 }
69  
70 private void PortTextBoxClick(object sender, EventArgs e)
71 {
72 Port.BackColor = Color.Empty;
73 }
74  
75 private async void HostButtonClickAsync(object sender, EventArgs e)
76 {
77 // Stop the MQTT server if it is running.
78 if (MQTTServer.ServerRunning)
79 {
80 await StopServer();
81 toolStripStatusLabel.Text = Properties.Strings.Server_stopped;
82 HostButton.BackColor = Color.Empty;
83  
3 office 84 // Enable controls.
1 office 85 ConnectButton.Enabled = true;
3 office 86 EnableConnectionControls();
1 office 87 return;
88 }
89  
2 office 90 if (!ValidateAddressPort(out var ipAddress, out var port, out var nick))
1 office 91 return;
92  
93 // Start the MQTT server.
2 office 94 await StartServer(ipAddress, port, nick);
1 office 95 toolStripStatusLabel.Text = Properties.Strings.Server_started;
96 HostButton.BackColor = Color.Aquamarine;
97  
3 office 98 // Disable controls
1 office 99 ConnectButton.Enabled = false;
3 office 100 DisableConnectionControls();
1 office 101 }
102  
3 office 103 private void DisableConnectionControls()
104 {
105 Address.Enabled = false;
106 Port.Enabled = false;
107 Nick.Enabled = false;
108 }
109  
110 private void EnableConnectionControls()
111 {
112 Address.Enabled = true;
113 Port.Enabled = true;
114 Nick.Enabled = true;
115 }
116  
2 office 117 private bool ValidateAddressPort(out IPAddress address, out int port, out string nick)
1 office 118 {
119 address = IPAddress.Any;
120 port = 0;
2 office 121 nick = string.Empty;
1 office 122  
123 if (string.IsNullOrEmpty(Address.Text) &&
2 office 124 string.IsNullOrEmpty(Port.Text) &&
125 string.IsNullOrEmpty(Nick.Text))
1 office 126 {
127 Address.BackColor = Color.LightPink;
128 Port.BackColor = Color.LightPink;
2 office 129 Nick.BackColor = Color.LightPink;
1 office 130 return false;
131 }
132  
133 if (!IPAddress.TryParse(Address.Text, out address))
134 {
135 Address.BackColor = Color.LightPink;
136 return false;
137 }
138  
139 if (!uint.TryParse(Port.Text, out var uPort))
140 {
141 Port.BackColor = Color.LightPink;
142 return false;
143 }
144  
145 port = (int) uPort;
146  
2 office 147 if (string.IsNullOrEmpty(Nick.Text))
148 {
149 Nick.BackColor = Color.LightPink;
150 return false;
151 }
152  
153 nick = Nick.Text;
154  
1 office 155 Address.BackColor = Color.Empty;
156 Port.BackColor = Color.Empty;
2 office 157 Nick.BackColor = Color.Empty;
1 office 158  
159 return true;
160 }
161  
2 office 162 private async Task StartServer(IPAddress ipAddress, int port, string nick)
1 office 163 {
164 await MQTTServerSemaphore.WaitAsync();
165 try
166 {
2 office 167 await MQTTServer.Start(ipAddress, port, nick);
1 office 168 }
169 finally
170 {
171 MQTTServerSemaphore.Release();
172 }
173 }
174  
175 private async Task StopServer()
176 {
177 await MQTTServerSemaphore.WaitAsync();
178 try
179 {
180 await MQTTServer.Stop();
181 }
182 finally
183 {
184 MQTTServerSemaphore.Release();
185 }
186 }
187  
188 private async void ConnectButtonClickAsync(object sender, EventArgs e)
189 {
190 if (MQTTClient.ClientRunning)
191 {
192 await StopClient();
193 ConnectButton.Text = Properties.Strings.Connect;
194 ConnectButton.BackColor = Color.Empty;
195  
3 office 196 EnableConnectionControls();
1 office 197 HostButton.Enabled = true;
198 return;
199 }
200  
2 office 201 if (!ValidateAddressPort(out var ipAddress, out var port, out var nick))
1 office 202 return;
203  
2 office 204 await StartClient(ipAddress, port, nick);
1 office 205  
206 toolStripStatusLabel.Text = Properties.Strings.Client_started;
207 ConnectButton.Text = Properties.Strings.Disconnect;
208 ConnectButton.BackColor = Color.Aquamarine;
209  
210 HostButton.Enabled = false;
3 office 211 DisableConnectionControls();
1 office 212 }
213  
214 private async Task StopClient()
215 {
216 await MQTTClientSemaphore.WaitAsync();
217 try
218 {
219 await MQTTClient.Stop();
220 }
221 finally
222 {
223 MQTTClientSemaphore.Release();
224 }
225 }
226  
2 office 227 private async Task StartClient(IPAddress ipAddress, int port, string nick)
1 office 228 {
229 await MQTTClientSemaphore.WaitAsync();
230 try
231 {
2 office 232 await MQTTClient.Start(ipAddress, port, nick);
1 office 233 }
234 finally
235 {
236 MQTTClientSemaphore.Release();
237 }
238 }
2 office 239  
240 private async void LobbySayTextBoxKeyDown(object sender, KeyEventArgs e)
241 {
242 if (e.KeyCode != Keys.Enter)
243 return;
244  
245 if (MQTTServer.ServerRunning)
246 {
247 await MQTTServer.BroadcastLobbyMessage(LobbySayTextBox.Text);
248 }
249  
250 if (MQTTClient.ClientRunning)
251 {
252 await MQTTClient.BroadcastLobbyMessage(LobbySayTextBox.Text);
253 }
254  
255 }
4 office 256  
257 private void HelmAddButtonClick(object sender, EventArgs e)
258 {
259 if (string.IsNullOrEmpty(HelmNameTextBox.Text))
260 {
261 HelmNameTextBox.BackColor = Color.LightPink;
262 return;
263 }
264  
265 HelmAddButton.Enabled = false;
266  
267 MouseKeyCombo = new List<string>();
268  
269 MouseKeyApplicationHook = Hook.AppEvents();
270 MouseKeyApplicationHook.MouseDown += MouseKeyHookOnMouseDown;
271 MouseKeyApplicationHook.KeyUp += MouseKeyHookOnKeyUp;
272 MouseKeyApplicationHook.KeyDown += MouseKeyHookOnKeyDown;
273 MouseKeyApplicationHook.MouseUp += MouseKeyHookOnMouseUp;
274  
275 }
276  
277 private void MouseKeyHookOnKeyUp(object sender, KeyEventArgs e)
278 {
279 HelmBindings.Bindings.Add(new HelmBinding
280 {
281 Keys = MouseKeyCombo,
282 Name = HelmNameTextBox.Text
283 });
284  
285 HelmBindingSource.ResetBindings(false);
286  
287 MouseKeyApplicationHook.KeyDown -= MouseKeyHookOnKeyDown;
288 MouseKeyApplicationHook.KeyUp -= MouseKeyHookOnKeyUp;
289  
290 MouseKeyApplicationHook.Dispose();
291  
292 HelmNameTextBox.Text = string.Empty;
293 HelmAddButton.Enabled = true;
294 }
295  
296 private void MouseKeyHookOnMouseUp(object sender, MouseEventArgs e)
297 {
298 HelmBindings.Bindings.Add(new HelmBinding
299 {
300 Keys = MouseKeyCombo,
301 Name = HelmNameTextBox.Text
302 });
303  
304 HelmBindingSource.ResetBindings(false);
305  
306 MouseKeyApplicationHook.KeyDown -= MouseKeyHookOnKeyDown;
307 MouseKeyApplicationHook.KeyUp -= MouseKeyHookOnKeyUp;
308  
309 MouseKeyApplicationHook.Dispose();
310  
311 HelmNameTextBox.Text = string.Empty;
312 HelmAddButton.Enabled = true;
313 }
314  
315  
316 private void MouseKeyHookOnMouseDown(object sender, MouseEventArgs e)
317 {
318 MouseKeyCombo.Add(MouseButtonToName(e.Button));
319 }
320  
321 private void MouseKeyHookOnKeyDown(object sender, KeyEventArgs e)
322 {
323 e.SuppressKeyPress = true;
324  
325 MouseKeyCombo.Add(KeyCodeToName((int) e.KeyCode));
326 }
327  
328 private void HelmNameTextBoxClick(object sender, EventArgs e)
329 {
330 HelmNameTextBox.BackColor = Color.Empty;
331 }
332  
333 private string MouseButtonToName(MouseButtons button)
334 {
335 var mouseButton = string.Empty;
336 switch (button)
337 {
338 case MouseButtons.Left:
339 mouseButton = "Left Mouse Button";
340 break;
341 case MouseButtons.Middle:
342 mouseButton = "Middle Mouse Button";
343 break;
344 case MouseButtons.Right:
345 mouseButton = "Right Mouse Button";
346 break;
347 }
348  
349 return mouseButton;
350 }
351  
352 private string KeyCodeToName(int code)
353 {
354 var keyString = string.Empty;
355 switch (code)
356 {
357 case 0:
358 break;
359 case 1:
360 keyString = "Mouse Left";
361 break;
362 case 2:
363 keyString = "Mouse Right";
364 break;
365 case 3:
366 keyString = "Cancel";
367 break;
368 case 4:
369 keyString = "Mouse Middle";
370 break;
371 case 5:
372 keyString = "Special 1";
373 break;
374 case 6:
375 keyString = "Special 2";
376 break;
377 case 8:
378 keyString = "Back";
379 break;
380 case 9:
381 keyString = "TAB";
382 break;
383 case 12:
384 keyString = "Clear";
385 break;
386 case 13:
387 keyString = "Enter";
388 break;
389 case 16:
390 keyString = "Shift";
391 break;
392 case 17:
393 keyString = "Ctrl";
394 break;
395 case 18:
396 keyString = "Menu";
397 break;
398 case 19:
399 keyString = "Pause";
400 break;
401 case 20:
402 keyString = "Caps Lock";
403 break;
404 case 21:
405 keyString = "Kana/Hangul";
406 break;
407 case 23:
408 keyString = "Junja";
409 break;
410 case 24:
411 keyString = "Final";
412 break;
413 case 25:
414 keyString = "Hanja/Kanji";
415 break;
416 case 27:
417 keyString = "Esc";
418 break;
419 case 28:
420 keyString = "Convert";
421 break;
422 case 29:
423 keyString = "NonConvert";
424 break;
425 case 30:
426 keyString = "Accept";
427 break;
428 case 31:
429 keyString = "Mode";
430 break;
431 case 32:
432 keyString = "Space";
433 break;
434 case 33:
435 keyString = "Page Up";
436 break;
437 case 34:
438 keyString = "Page Down";
439 break;
440 case 35:
441 keyString = "End";
442 break;
443 case 36:
444 keyString = "Home";
445 break;
446 case 37:
447 keyString = "Left";
448 break;
449 case 38:
450 keyString = "Up";
451 break;
452 case 39:
453 keyString = "Right";
454 break;
455 case 40:
456 keyString = "Down";
457 break;
458 case 41:
459 keyString = "Select";
460 break;
461 case 42:
462 keyString = "Print";
463 break;
464 case 43:
465 keyString = "Execute";
466 break;
467 case 44:
468 keyString = "Snapshot";
469 break;
470 case 45:
471 keyString = "Insert";
472 break;
473 case 46:
474 keyString = "Delete";
475 break;
476 case 47:
477 keyString = "Help";
478 break;
479 case 48:
480 keyString = "Num 0";
481 break;
482 case 49:
483 keyString = "Num 1";
484 break;
485 case 50:
486 keyString = "Num 2";
487 break;
488 case 51:
489 keyString = "Num 3";
490 break;
491 case 52:
492 keyString = "Num 4";
493 break;
494 case 53:
495 keyString = "Num 5";
496 break;
497 case 54:
498 keyString = "Num 6";
499 break;
500 case 55:
501 keyString = "Num 7";
502 break;
503 case 56:
504 keyString = "Num 8";
505 break;
506 case 57:
507 keyString = "Num 9";
508 break;
509 case 65:
510 keyString = "A";
511 break;
512 case 66:
513 keyString = "B";
514 break;
515 case 67:
516 keyString = "C";
517 break;
518 case 68:
519 keyString = "D";
520 break;
521 case 69:
522 keyString = "E";
523 break;
524 case 70:
525 keyString = "F";
526 break;
527 case 71:
528 keyString = "G";
529 break;
530 case 72:
531 keyString = "H";
532 break;
533 case 73:
534 keyString = "I";
535 break;
536 case 74:
537 keyString = "J";
538 break;
539 case 75:
540 keyString = "K";
541 break;
542 case 76:
543 keyString = "L";
544 break;
545 case 77:
546 keyString = "M";
547 break;
548 case 78:
549 keyString = "N";
550 break;
551 case 79:
552 keyString = "O";
553 break;
554 case 80:
555 keyString = "P";
556 break;
557 case 81:
558 keyString = "Q";
559 break;
560 case 82:
561 keyString = "R";
562 break;
563 case 83:
564 keyString = "S";
565 break;
566 case 84:
567 keyString = "T";
568 break;
569 case 85:
570 keyString = "U";
571 break;
572 case 86:
573 keyString = "V";
574 break;
575 case 87:
576 keyString = "W";
577 break;
578 case 88:
579 keyString = "X";
580 break;
581 case 89:
582 keyString = "Y";
583 break;
584 case 90:
585 keyString = "Z";
586 break;
587 case 91:
588 keyString = "Windows Left";
589 break;
590 case 92:
591 keyString = "Windows Right";
592 break;
593 case 93:
594 keyString = "Application";
595 break;
596 case 95:
597 keyString = "Sleep";
598 break;
599 case 96:
600 keyString = "NumPad 0";
601 break;
602 case 97:
603 keyString = "NumPad 1";
604 break;
605 case 98:
606 keyString = "NumPad 2";
607 break;
608 case 99:
609 keyString = "NumPad 3";
610 break;
611 case 100:
612 keyString = "NumPad 4";
613 break;
614 case 101:
615 keyString = "NumPad 5";
616 break;
617 case 102:
618 keyString = "NumPad 6";
619 break;
620 case 103:
621 keyString = "NumPad 7";
622 break;
623 case 104:
624 keyString = "NumPad 8";
625 break;
626 case 105:
627 keyString = "NumPad 9";
628 break;
629 case 106:
630 keyString = "NumPad *";
631 break;
632 case 107:
633 keyString = "NumPad +";
634 break;
635 case 108:
636 keyString = "NumPad .";
637 break;
638 case 109:
639 keyString = "NumPad -";
640 break;
641 case 110:
642 keyString = "NumPad ,";
643 break;
644 case 111:
645 keyString = "NumPad /";
646 break;
647 case 112:
648 keyString = "F1";
649 break;
650 case 113:
651 keyString = "F2";
652 break;
653 case 114:
654 keyString = "F3";
655 break;
656 case 115:
657 keyString = "F4";
658 break;
659 case 116:
660 keyString = "F5";
661 break;
662 case 117:
663 keyString = "F6";
664 break;
665 case 118:
666 keyString = "F7";
667 break;
668 case 119:
669 keyString = "F8";
670 break;
671 case 120:
672 keyString = "F9";
673 break;
674 case 121:
675 keyString = "F10";
676 break;
677 case 122:
678 keyString = "F11";
679 break;
680 case 123:
681 keyString = "F12";
682 break;
683 case 124:
684 keyString = "F13";
685 break;
686 case 125:
687 keyString = "F14";
688 break;
689 case 126:
690 keyString = "F15";
691 break;
692 case 127:
693 keyString = "F16";
694 break;
695 case 128:
696 keyString = "F17";
697 break;
698 case 129:
699 keyString = "F18";
700 break;
701 case 130:
702 keyString = "F19";
703 break;
704 case 131:
705 keyString = "F20";
706 break;
707 case 132:
708 keyString = "F21";
709 break;
710 case 133:
711 keyString = "F22";
712 break;
713 case 134:
714 keyString = "F23";
715 break;
716 case 135:
717 keyString = "F24";
718 break;
719 case 144:
720 keyString = "Num lock";
721 break;
722 case 145:
723 keyString = "Scroll";
724 break;
725 case 160:
726 keyString = "Shift Left";
727 break;
728 case 161:
729 keyString = "Shift Right";
730 break;
731 case 162:
732 keyString = "Ctrl Left";
733 break;
734 case 163:
735 keyString = "Ctrl Right";
736 break;
737 case 164:
738 keyString = "Menu Left";
739 break;
740 case 165:
741 keyString = "Menu Right";
742 break;
743 default:
744 break;
745 }
746  
747 return keyString;
748 }
749  
750 private void HelmRemoveButtonClick(object sender, EventArgs e)
751 {
752 var helmBinding = (HelmBinding)HelmBindingsListBox.SelectedItem;
753 if (helmBinding == null)
754 return;
755  
756 HelmBindings.Bindings.Remove(helmBinding);
757 HelmBindingSource.ResetBindings(false);
758 }
1 office 759 }
760 }