TestUtil.cs
上传用户:szltgg
上传日期:2019-05-16
资源大小:604k
文件大小:4k
源码类别:

Telnet服务器

开发平台:

C#

  1. /*
  2. * Copyright (c) 2005 Poderosa Project, All Rights Reserved.
  3. * $Id: TestUtil.cs,v 1.2 2005/04/20 08:45:48 okajima Exp $
  4. */
  5. using System;
  6. using System.Xml;
  7. using System.Text;
  8. using System.IO;
  9. using System.Diagnostics;
  10. using System.Threading;
  11. using Poderosa.Text;
  12. using Poderosa.Terminal;
  13. using Poderosa.Connection;
  14. //Debug namespace偩偲System.Diagnostics.Debug偲僐儞僷僀儔偑崿摨偟偰偟傑偆
  15. namespace Poderosa.Debugging
  16. {
  17. /// <summary>
  18. /// 僥僗僩偵昁梫側奺庬偺儊僜僢僪廂榐
  19. /// </summary>
  20. public class TestUtil
  21. {
  22. public static void EmulateWithLog(string filename, ConnectionTag tag) {
  23. _filename = filename;
  24. _tag = tag;
  25. //XmlTextReader r = new XmlTextReader(filename);
  26. //EmulateWithLog(r, tag);
  27. //r.Close();
  28. Thread th = new Thread(new ThreadStart(Run));
  29. th.Start();
  30. }
  31. private static string _filename;
  32. private static ConnectionTag _tag;
  33. private static void Run() {
  34. XmlTextReader r = new XmlTextReader(_filename);
  35. lock(_tag.Document) {
  36. EmulateWithLog(r, _tag);
  37. }
  38. r.Close();
  39. }
  40. //僨僶僢僌梡偵丄奜晹偺XML宍幃儘僌傪撉傫偱僄儈儏儗乕僩傪偡傞
  41. public static void EmulateWithLog(XmlReader reader, ConnectionTag tag) {
  42. ITerminal term = tag.Terminal;
  43. TerminalDocument doc = tag.Document;
  44. StringBuilder buf = new StringBuilder();
  45. reader.ReadStartElement("terminal-log");
  46. try {
  47. do {
  48. if(reader.NodeType==XmlNodeType.Text || reader.NodeType==XmlNodeType.Whitespace)
  49. buf.Append(reader.Value);
  50. else if(reader.NodeType==XmlNodeType.Element) {
  51. if(reader.Name=="ESC") {
  52. buf.Append((char)0x1B);
  53. buf.Append(reader.GetAttribute("seq"));
  54. }
  55. else if(reader.Name=="BS")
  56. buf.Append((char)0x8);
  57. else if(reader.Name=="BEL")
  58. buf.Append((char)0x7);
  59. else if(reader.Name=="dump") {
  60. buf = Flush(tag, buf);
  61. doc.Dump(reader.GetAttribute("title"));
  62. }
  63. else if(reader.Name=="comment") {
  64. buf = Flush(tag, buf);
  65. while(reader.NodeType!=XmlNodeType.EndElement || reader.Name!="comment") {
  66. reader.Read();
  67. if(reader.NodeType==XmlNodeType.Text)
  68. GEnv.InterThreadUIService.Warning(doc, reader.Value);
  69. }
  70. }
  71. else if(reader.Name=="break") {
  72. Debug.WriteLine("BREAK "+reader.GetAttribute("title"));
  73. Debugger.Break();
  74. buf = Flush(tag, buf);
  75. }
  76. else if(reader.Name=="PD") {
  77. buf = Flush(tag, buf);
  78. }
  79. else if(reader.Name=="pause") {
  80. buf = Flush(tag, buf);
  81. GEnv.InterThreadUIService.Warning(doc, reader.GetAttribute("title")); 
  82. }
  83. else if(reader.Name!="SI" && reader.Name!="SO" && reader.Name!="NUL" && reader.Name!="terminal-size")
  84. Debug.WriteLine("Unsupported element "+reader.Name);
  85. }
  86. else if(reader.NodeType==XmlNodeType.EndElement) {
  87. if(reader.Name=="terminal-log") {
  88. Flush(tag, buf);
  89. }
  90. }
  91. } while(reader.Read());
  92. }
  93. catch(Exception ex) {
  94. Debug.WriteLine(ex.Message);
  95. Debug.WriteLine(ex.StackTrace);
  96. }
  97. }
  98. private static StringBuilder Flush(ConnectionTag tag, StringBuilder buf) {
  99. char[] data = buf.ToString().ToCharArray();
  100. tag.Terminal.Input(data, 0, data.Length);
  101. tag.Pane.DataArrived();
  102. return new StringBuilder();
  103. }
  104. }
  105. internal class DebugUtil {
  106. public static string DumpByteArray(byte[] data) {
  107. return DumpByteArray(data, 0, data.Length);
  108. }
  109. public static string DumpByteArray(byte[] data, int offset, int length) {
  110. StringBuilder bld = new StringBuilder();
  111. for(int i=0; i<length; i++) {
  112. bld.Append(data[offset+i].ToString("X2"));
  113. if((i % 4)==3) bld.Append(' ');
  114. }
  115. return bld.ToString();
  116. }
  117. }
  118. }