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

Telnet服务器

开发平台:

C#

  1. /*
  2. * Copyright (c) 2005 Poderosa Project, All Rights Reserved.
  3. * $Id: CommandTarget.cs,v 1.2 2005/04/20 08:45:46 okajima Exp $
  4. */
  5. using System;
  6. using System.Collections;
  7. using System.IO;
  8. using System.Diagnostics;
  9. using System.Text;
  10. using System.Threading;
  11. using System.Windows.Forms;
  12. using Poderosa.Terminal;
  13. using Poderosa.Connection;
  14. using Poderosa.Communication;
  15. using Poderosa.Text;
  16. using Poderosa.Config;
  17. using Poderosa.Forms;
  18. using Poderosa.Toolkit;
  19. namespace Poderosa {
  20. public enum CommandResult {
  21. Success,
  22. Failed,
  23. Denied,
  24. Cancelled,
  25. Ignored,
  26. NOP
  27. }
  28. public class GlobalCommandTarget {
  29. public GlobalCommandTarget() {
  30. }
  31. public CommandResult Copy() {
  32. if(!GEnv.TextSelection.IsEmpty) {
  33. string t = GEnv.TextSelection.GetSelectedText();
  34. if(t.Length > 0)
  35. CopyToClipboard(t);
  36. return CommandResult.Success;
  37. }
  38. else
  39. return CommandResult.Ignored;
  40. }
  41. public CommandResult CopyAsLook() {
  42. if(!GEnv.TextSelection.IsEmpty) {
  43. string t = GEnv.TextSelection.GetSelectedTextAsLook();
  44. if(t.Length > 0)
  45. CopyToClipboard(t);
  46. return CommandResult.Success;
  47. }
  48. else
  49. return CommandResult.Ignored;
  50. }
  51. private void CopyToClipboard(string data) {
  52. try {
  53. Clipboard.SetDataObject(data, false);
  54. }
  55. catch(Exception ex) {
  56. //偒傢傔偰婬偵偩偑偙偙偱幐攕偡傞傜偟偄
  57. GUtil.Warning(GEnv.Frame, ex.Message);
  58. }
  59. }
  60. public void AddNewTerminal(ConnectionTag ct) {
  61. GEnv.Connections.Add(ct);
  62. AddNewTerminalInternal(ct);
  63. ct.Receiver.Listen();
  64. }
  65. protected virtual void AddNewTerminalInternal(ConnectionTag ct) {
  66. }
  67. public virtual CommandResult SetConnectionLocation(ConnectionTag ct, TerminalPane pane) {
  68. return CommandResult.Ignored;
  69. }
  70. }
  71. public class ConnectionCommandTarget {
  72. protected TerminalConnection _connection;
  73. public ConnectionCommandTarget(TerminalConnection con) {
  74. _connection = con;
  75. }
  76. public TerminalConnection Connection {
  77. get {
  78. return _connection;
  79. }
  80. }
  81. public CommandResult Disconnect() {
  82. if(_connection.IsClosed) return CommandResult.Ignored;
  83. if(GEnv.Options.CloseOnDisconnect) 
  84. Close();
  85. else {
  86. _connection.Disconnect();
  87. _connection.Close();
  88. GEnv.Frame.RefreshConnection(GEnv.Connections.FindTag(_connection));
  89. }
  90. return CommandResult.Success;
  91. }
  92. public CommandResult Close() {
  93. try {
  94. _connection.Disconnect();
  95. _connection.Close();
  96. }
  97. catch(Exception ex) {
  98. //偙偙偱僄儔乕偑敪惗偟偰傕張棟偼懕峴偟偰傾僾儕帺懱偼幚峴傪宲懕
  99. GUtil.Warning(GEnv.Frame, GEnv.Strings.GetString("Message.ConnectionCommandTarget.CloseError")+ex.Message);
  100. }
  101. bool active = _connection==GEnv.Connections.ActiveConnection;
  102. ConnectionTag ct = GEnv.Connections.FindTag(_connection);
  103. //Debug.WriteLine("ct==null? " + (ct==null));
  104. if(ct==null) return CommandResult.Ignored;
  105. TerminalPane pane = ct.AttachedPane;
  106. ct.IsTerminated = true;
  107. GEnv.Frame.RemoveConnection(ct);
  108. ConnectionTag next = GEnv.Connections.GetCandidateOfActivation(ct.PositionIndex, ct);
  109. GEnv.Connections.Remove(_connection);
  110. if(next!=null) {
  111. if(pane!=null) pane.Attach(next);
  112. if(active)
  113. GEnv.Frame.ActivateConnection(next); //傕偲傕偲傾僋僥傿僽偱側偄愙懕偑愗傟偨偲偒偼曄峏偟側偄
  114. }
  115. else {
  116. if(pane!=null) {
  117. pane.FakeVisible = false;
  118. pane.Detach();
  119. }
  120. GEnv.Frame.RefreshConnection(null);
  121. }
  122. if(GEnv.Options.QuitAppWithLastPane && GEnv.Connections.Count==0)
  123. GEnv.Frame.AsForm().Close();
  124. return CommandResult.Success;
  125. }
  126. public CommandResult Resize(int width, int height) {
  127. if(_connection.IsClosed) return CommandResult.Ignored;
  128.             // this line was aborting up the resize event
  129.             // What is it for?
  130. //if(GEnv.Connections.FindTag(_connection).ModalTerminalTask!=null) return CommandResult.Denied;
  131. _connection.TextLogger.TerminalResized(width, height);
  132. _connection.Resize(width, height);
  133. return CommandResult.Success;
  134. }
  135. public CommandResult Focus() {
  136. ConnectionTag tag = GEnv.Connections.FindTag(_connection);
  137. GEnv.Frame.ActivateConnection(tag);
  138. if(tag.Pane==null)
  139. return CommandResult.Failed;
  140. else {
  141. tag.Pane.AsControl().Focus();
  142. return CommandResult.Success;
  143. }
  144. }
  145. public CommandResult ClearScreen() {
  146. ConnectionTag tag = GEnv.Connections.FindTag(_connection);
  147. TerminalDocument doc = tag.Document;
  148. lock(doc) {
  149. GLine l = doc.TopLine;
  150. int top_id = l.ID;
  151. int limit = l.ID + _connection.TerminalHeight;
  152. while(l!=null && l.ID<limit) {
  153. l.Clear();
  154. l = l.NextLine;
  155. }
  156. doc.CurrentLineNumber = top_id;
  157. doc.CaretColumn = 0;
  158. doc.InvalidateAll();
  159. if(tag.Pane!=null) {
  160. GEnv.TextSelection.Clear();
  161. tag.Pane.Invalidate();
  162. }
  163. }
  164. return CommandResult.Success;
  165. }
  166. public CommandResult ClearBuffer() {
  167. ConnectionTag tag = GEnv.Connections.FindTag(_connection);
  168. TerminalDocument doc = tag.Document;
  169. lock(doc) {
  170. doc.Clear();
  171. tag.Receiver.AdjustTransientScrollBar();
  172. if(tag.Pane!=null) {
  173. GEnv.TextSelection.Clear();
  174. tag.Pane.CommitTransientScrollBar();
  175. tag.Pane.Invalidate();
  176. }
  177. }
  178. return CommandResult.Success;
  179. }
  180. public CommandResult SelectAll() {
  181. ConnectionTag tag = GEnv.Connections.FindTag(_connection);
  182. GEnv.TextSelection.SelectAll(tag.Pane);
  183. tag.Pane.AsControl().Invalidate();
  184. return CommandResult.Success;
  185. }
  186. public CommandResult ToggleFreeSelectionMode() {
  187. TerminalPane p = GEnv.Connections.FindTag(_connection).Pane;
  188. if(p==null) return CommandResult.Ignored;
  189. p.ToggleFreeSelectionMode();
  190. return CommandResult.Success;
  191. }
  192. public CommandResult AreYouThere() {
  193. if(_connection.IsClosed) return CommandResult.Ignored;
  194. if(GEnv.Connections.FindTag(_connection).ModalTerminalTask!=null) return CommandResult.Denied;
  195. try {
  196. _connection.AreYouThere();
  197. return CommandResult.Success;
  198. }
  199. catch(NotSupportedException) {
  200. GUtil.Warning(GEnv.Frame, GEnv.Strings.GetString("Message.ConnectionCommandTarget.AreYouThereCondition"));
  201. return CommandResult.Failed;
  202. }
  203. }
  204. public CommandResult SendBreak() {
  205. if(_connection.IsClosed) return CommandResult.Ignored;
  206. if(GEnv.Connections.FindTag(_connection).ModalTerminalTask!=null) return CommandResult.Denied;
  207. try {
  208. _connection.SendBreak();
  209. return CommandResult.Success;
  210. }
  211. catch(NotSupportedException) {
  212. GUtil.Warning(GEnv.Frame, GEnv.Strings.GetString("Message.ConnectionCommandTarget.BreakCondition"));
  213. return CommandResult.Failed;
  214. }
  215. }
  216. public CommandResult ResetTerminal() {
  217. GEnv.Connections.FindTag(_connection).Terminal.FullReset();
  218. return CommandResult.Success;
  219. }
  220. public virtual CommandResult Paste() {
  221. string value = (string)Clipboard.GetDataObject().GetData("Text");
  222. if(value==null || value.Length==0) return CommandResult.Ignored;
  223. ConnectionTag tag = GEnv.Connections.FindTag(_connection);
  224. if(tag.ModalTerminalTask!=null) return CommandResult.Denied;
  225. return PasteMain(value);
  226. }
  227. protected CommandResult PasteMain(string value) {
  228. ConnectionTag tag = GEnv.Connections.FindTag(_connection);
  229. PasteProcessor p = new PasteProcessor(tag, value);
  230. try {
  231. p.Perform();
  232. return CommandResult.Success;
  233. }
  234. catch(Exception ex) {
  235. Debug.WriteLine(ex.StackTrace);
  236. GUtil.Warning(GEnv.Frame, GEnv.Strings.GetString("Message.ConnectionCommandTarget.SendError") + ex.Message);
  237. return CommandResult.Failed;
  238. }
  239. }
  240. public CommandResult DumpText() {
  241. GEnv.Connections.FindTag(_connection).Document.Dump("COMMAND");
  242. return CommandResult.Success;
  243. }
  244. }
  245. }