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

Telnet服务器

开发平台:

C#

  1. /*
  2. * Copyright (c) 2005 Poderosa Project, All Rights Reserved.
  3. * $Id: Paste.cs,v 1.2 2005/04/20 08:45:47 okajima Exp $
  4. */
  5. using System;
  6. using System.Collections;
  7. using System.IO;
  8. using System.Diagnostics;
  9. using System.Threading;
  10. using Poderosa.Connection;
  11. using Poderosa.ConnectionParam;
  12. namespace Poderosa.Terminal
  13. {
  14. public class PasteProcessor : IModalTerminalTask {
  15. private ArrayList _data;
  16. private ConnectionTag _tag;
  17. private int _length;
  18. private bool _async;
  19. private bool _abortFlag;
  20. public delegate void EventHandler(int param);
  21. public void Input(byte[] data, int offset, int length) {
  22. }
  23. public bool CanReceive {
  24. get {
  25. return false;
  26. }
  27. }
  28. public string Caption {
  29. get {
  30. return GEnv.Strings.GetString("Caption.ConnectionCommandTarget.DuringPaste");
  31. }
  32. }
  33. public int LineCount {
  34. get {
  35. return _data.Count;
  36. }
  37. }
  38. public event EventHandler LineProcessed;
  39. public PasteProcessor(ConnectionTag tag, string text) {
  40. _tag = tag;
  41. StringReader r = new StringReader(text);
  42. Fill(r);
  43. r.Close();
  44. }
  45. public PasteProcessor(ConnectionTag tag, TextReader reader) {
  46. _tag = tag;
  47. Fill(reader);
  48. }
  49. private void Fill(TextReader reader) {
  50. _data = new ArrayList();
  51. string l = reader.ReadLine();
  52. while(l!=null) {
  53. _data.Add(l);
  54. _length += l.Length;
  55. l = reader.ReadLine();
  56. }
  57. }
  58. public CommandResult Perform() {
  59. int lim = _tag.Connection.Param is SFUTerminalParam? 250 : 1000;
  60. if(_length < lim) { //1000帤埲壓側傜捈峴曋偱傗偭偮偗傞
  61. _async = false;
  62. return Paste();
  63. }
  64. else {
  65. _async = true;
  66. _tag.ModalTerminalTask = this;
  67. new Thread(new ThreadStart(Run)).Start();
  68. return CommandResult.Success;
  69. }
  70. }
  71. private void Run() {
  72. try {
  73. Paste();
  74. }
  75. catch(Exception ex) {
  76. Debug.WriteLine(ex.StackTrace);
  77. GEnv.InterThreadUIService.Warning(GEnv.Strings.GetString("Message.ConnectionCommandTarget.SendError") + ex.Message);
  78. }
  79. }
  80. public void SetAbortFlag() {
  81. _abortFlag = true;
  82. }
  83. private CommandResult Paste() {
  84. //夵峴偼憲傝愭儁僀儞偺夵峴愝掕偵崌傢偣偰憲傜傟傞丅偨偩偟丄嵟廔梫慺偼夵峴暥帤偱廔傢偭偰偄傞偐斲偐偱嫇摦偑曄傢傞
  85. if(_async) 
  86. RefreshConnection();
  87. for(int i=0; i<_data.Count-1; i++) {
  88. SendLine((string)_data[i], true);
  89. if(_abortFlag) return CommandResult.Cancelled;
  90. if(this.LineProcessed!=null) LineProcessed(i);
  91. }
  92. string lastline = (string)_data[_data.Count-1];
  93. char last = lastline.Length==0? '' : lastline[lastline.Length-1];
  94. if(last=='n' || last=='r')
  95. SendLine(lastline, true);
  96. else
  97. SendLine(lastline, false);
  98. if(_async) {
  99. _tag.ModalTerminalTask = null;
  100. RefreshConnection();
  101. }
  102. if(this.LineProcessed!=null) LineProcessed(-1);
  103. return CommandResult.Success;
  104. }
  105. private void SendLine(string line, bool appendnl) {
  106. if(_tag.Connection.IsClosed || GEnv.Frame.MacroIsRunning) return;
  107. //GEnv.Frame.StatusBar.IndicateSendData();
  108. if(appendnl)
  109. line += new string(TerminalUtil.NewLineChars(_tag.Connection.Param.TransmitNL));
  110. char[] chars = line.ToCharArray();
  111. if(_tag.Connection.Param.LocalEcho) {
  112. lock(_tag.Document) {
  113. _tag.Terminal.Input(chars, 0, chars.Length);
  114. }
  115. }
  116. if(_tag.Connection.Param is SFUTerminalParam) { //SFU偼傑偲傔偰憲怣偡傞偲庢傝偙傏偟偑偱偰偟傑偆丅暢傔丅
  117. int x = 0;
  118. while(x < chars.Length) {
  119. _tag.Connection.WriteChar(chars[x++]);
  120. if((x % 100)==0) Thread.Sleep(100);
  121. }
  122. Thread.Sleep(100);
  123. }
  124. else
  125. _tag.Connection.WriteChars(chars);
  126. }
  127. private void RefreshConnection() {
  128. //InterThread偼傕偲傕偲昤夋僗儗僢僪偐傜屇傇偨傔偺傕偺偱丄Document傪儘僢僋偟偰偄傞偺偑慜採丅側偺偱偁偊偰儘僢僋偟偰偐傜屇傃偵偄偔偙偲偱挷惍傪偲傞
  129. lock(_tag.Document) {
  130. GEnv.InterThreadUIService.RefreshConnection(_tag);
  131. }
  132. }
  133. }
  134. }