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

Telnet服务器

开发平台:

C#

  1. /*
  2. * Copyright (c) 2005 Poderosa Project, All Rights Reserved.
  3. * $Id: Log.cs,v 1.2 2005/04/20 08:45:46 okajima Exp $
  4. */
  5. using System;
  6. using System.IO;
  7. using System.Xml;
  8. using System.Text;
  9. using Poderosa.ConnectionParam;
  10. using Poderosa.Communication;
  11. using Poderosa.Text;
  12. namespace Poderosa.Log {
  13. public interface ITerminalLogger {
  14. void Comment(string comment);
  15. void Flush();
  16. void Close();
  17. bool IsActive { get; }
  18. }
  19. public interface ITerminalTextLogger : ITerminalLogger {
  20. void Append(char ch);
  21. void Append(char[] ch);
  22. void Append(char[] ch, int offset, int length);
  23. void BeginEscapeSequence();
  24. void CommitEscapeSequence();
  25. void AbortEscapeSequence();
  26. void PacketDelimiter();
  27. void TerminalResized(int width, int height);
  28. //幚偺偲偙傠昗弨僞僀僾偺傒桳岠
  29. void WriteLine(GLine line);
  30. }
  31. public interface ITerminalBinaryLogger : ITerminalLogger {
  32. void Append(byte[] data, int offset, int length);
  33. }
  34. internal abstract class TerminalLoggerBase : ITerminalTextLogger {
  35. private StringBuilder _escapesequence;
  36. public void Append(char[] ch) {
  37. Append(ch, 0, ch.Length);
  38. }
  39. public void Append(char[] ch, int offset, int length) {
  40. for(int i=0; i<length; i++) {
  41. Append(ch[offset+i]);
  42. }
  43. }
  44. public void Append(char ch) {
  45. if(_escapesequence==null)
  46. WriteChar(ch);
  47. else
  48. _escapesequence.Append(ch);
  49. }
  50. //ITerminalLogger偱偼側偔TerminalLoggerBase撈帺偺儊僜僢僪
  51. public abstract void WriteChar(char ch);
  52. public abstract void WriteEscapeSequence(string seq);
  53. //!!峴扨埵偺彂偒崬傒 幚偼昗弨偲偦傟埲奜偱偼儘僌偺埖偄曽偵嫟捠揰偑偁傑傝側偄偺偵嫮堷偵堦偮偺僋儔僗偵傑偲傔傛偆偲偟偰儃儘偑偱偨
  54. public virtual void WriteLine(GLine line) {} 
  55. public void BeginEscapeSequence() {
  56. if(_escapesequence!=null) throw new InvalidOperationException("duplicated BeginEscapeSequence");
  57. _escapesequence = new StringBuilder();
  58. }
  59. public void CommitEscapeSequence() {
  60. WriteEscapeSequence(_escapesequence.ToString());
  61. _escapesequence = null;
  62. }
  63. public void AbortEscapeSequence() {
  64. _escapesequence = null;
  65. }
  66. public abstract void Flush();
  67. public abstract void Close();
  68. public abstract void Comment(string comment);
  69. public virtual void PacketDelimiter() {}
  70. public virtual void TerminalResized(int width, int height) {}
  71. public virtual bool IsActive { get { return true; } } //Active傪曉偡偺偑僨僼僅儖僩偺嫇摦
  72. }
  73. internal class NullTextLogger : ITerminalTextLogger {
  74. public void Append(char ch) {}
  75. public void Append(char[] ch) {}
  76. public void Append(char[] ch, int offset, int length) {}
  77. public void BeginEscapeSequence() {}
  78. public void CommitEscapeSequence() {}
  79. public void AbortEscapeSequence() {}
  80. public void Flush() {}
  81. public void Close() {}
  82. public void Comment(string comment) {}
  83. public bool IsActive {
  84. get {
  85. return false;
  86. }
  87. }
  88. public void PacketDelimiter() {}
  89. public void TerminalResized(int width, int height) {}
  90. public void WriteLine(GLine line) {}
  91. }
  92. internal class NullBinaryLogger : ITerminalBinaryLogger {
  93. public void Append(byte[] data, int offset, int length) {}
  94. public void Comment(string comment) {}
  95. public void Flush() {}
  96. public void Close() {}
  97. public bool IsActive {
  98. get {
  99. return false;
  100. }
  101. }
  102. }
  103. internal class BinaryLogger : ITerminalBinaryLogger {
  104. private Stream _strm;
  105. public BinaryLogger(Stream s) {
  106. _strm = s;
  107. }
  108. public void Append(byte[] data, int offset, int length) {
  109. _strm.Write(data, offset, length);
  110. }
  111. public void Comment(string comment) {
  112. byte[] r = Encoding.Default.GetBytes(comment);
  113. _strm.Write(r,0,r.Length);
  114. }
  115. public void Flush() {
  116. _strm.Flush();
  117. }
  118. public void Close() {
  119. _strm.Close();
  120. }
  121. public bool IsActive {
  122. get {
  123. return true;
  124. }
  125. }
  126. }
  127. internal class DefaultLogger : TerminalLoggerBase {
  128. private StreamWriter _writer;
  129. public DefaultLogger(StreamWriter w) {
  130. _writer = w;
  131. }
  132. public override void WriteLine(GLine line) {
  133. char[] t = line.Text;
  134. for(int i=0; i<line.CharLength; i++) {
  135. char ch = t[i];
  136. if(ch!=GLine.WIDECHAR_PAD) _writer.Write(ch);
  137. }
  138. _writer.WriteLine();
  139. //_writer.WriteLine(line.Text, 0, line.CharLength);
  140. }
  141. public override void WriteChar(char ch) {
  142. //ignore
  143. }
  144. public override void WriteEscapeSequence(string v) {
  145. //ignore
  146. }
  147. public override void Flush() {
  148. _writer.Flush();
  149. }
  150. public override void Close() {
  151. _writer.Close();
  152. }
  153. public override void Comment(string comment) {
  154. _writer.Write(comment);
  155. }
  156. }
  157. internal class XmlLogger : TerminalLoggerBase {
  158. private XmlWriter _writer;
  159. public XmlLogger(StreamWriter w, TerminalParam p) {
  160. _writer = new XmlTextWriter(w);
  161. _writer.WriteStartDocument();
  162. _writer.WriteStartElement("terminal-log");
  163. //愙懕帪偺傾僩儕價儏乕僩傪彂偒崬傓
  164. _writer.WriteAttributeString("time", DateTime.Now.ToString());
  165. }
  166. public override void WriteChar(char ch) {
  167. switch(ch) {
  168. case (char)0:
  169. WriteSPChar("NUL");
  170. break;
  171. case (char)1:
  172. WriteSPChar("SOH");
  173. break;
  174. case (char)2:
  175. WriteSPChar("STX");
  176. break;
  177. case (char)3:
  178. WriteSPChar("ETX");
  179. break;
  180. case (char)4:
  181. WriteSPChar("EOT");
  182. break;
  183. case (char)5:
  184. WriteSPChar("ENQ");
  185. break;
  186. case (char)6:
  187. WriteSPChar("ACK");
  188. break;
  189. case (char)7:
  190. WriteSPChar("BEL");
  191. break;
  192. case (char)8:
  193. WriteSPChar("BS");
  194. break;
  195. case (char)11:
  196. WriteSPChar("VT");
  197. break;
  198. case (char)12:
  199. WriteSPChar("FF");
  200. break;
  201. case (char)14:
  202. WriteSPChar("SO");
  203. break;
  204. case (char)15:
  205. WriteSPChar("SI");
  206. break;
  207. case (char)16:
  208. WriteSPChar("DLE");
  209. break;
  210. case (char)17:
  211. WriteSPChar("DC1");
  212. break;
  213. case (char)18:
  214. WriteSPChar("DC2");
  215. break;
  216. case (char)19:
  217. WriteSPChar("DC3");
  218. break;
  219. case (char)20:
  220. WriteSPChar("DC4");
  221. break;
  222. case (char)21:
  223. WriteSPChar("NAK");
  224. break;
  225. case (char)22:
  226. WriteSPChar("SYN");
  227. break;
  228. case (char)23:
  229. WriteSPChar("ETB");
  230. break;
  231. case (char)24:
  232. WriteSPChar("CAN");
  233. break;
  234. case (char)25:
  235. WriteSPChar("EM");
  236. break;
  237. case (char)26:
  238. WriteSPChar("SUB");
  239. break;
  240. case (char)27:
  241. WriteSPChar("ESC");
  242. break;
  243. case (char)28:
  244. WriteSPChar("FS");
  245. break;
  246. case (char)29:
  247. WriteSPChar("GS");
  248. break;
  249. case (char)30:
  250. WriteSPChar("RS");
  251. break;
  252. case (char)31:
  253. WriteSPChar("US");
  254. break;
  255. default:
  256. _writer.WriteChars(new char[1] {ch},0,1);
  257. break;
  258. }
  259. }
  260. public override void WriteEscapeSequence(string v) {
  261. lock(this) {
  262. _writer.WriteStartElement("ESC");
  263. _writer.WriteAttributeString("seq", v);
  264. _writer.WriteEndElement();
  265. }
  266. }
  267. public override void Flush() {
  268. _writer.Flush();
  269. }
  270. public override void Close() {
  271. _writer.WriteEndElement();
  272. _writer.WriteEndDocument();
  273. _writer.Close();
  274. }
  275. public override void Comment(string comment) {
  276. lock(this) {
  277. _writer.WriteElementString("comment", comment);
  278. }
  279. }
  280. public override void PacketDelimiter() {
  281. //WriteSPChar("EOP");
  282. }
  283. private void WriteSPChar(string name) {
  284. lock(this) {
  285. _writer.WriteElementString(name, "");
  286. }
  287. }
  288. //儕僒僀僘偼儊僀儞僗儗僢僪偐傜婰擖偡傞偺偱丄摨婜偟側偄偲曄側偙偲偑婲偙傝偐偹側偄
  289. public override void TerminalResized(int width, int height) {
  290. lock(this) {
  291. _writer.WriteStartElement("terminal-size");
  292. _writer.WriteAttributeString("width", width.ToString());
  293. _writer.WriteAttributeString("height", height.ToString());
  294. _writer.WriteEndElement();
  295. }
  296. }
  297. }
  298. }