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

Telnet服务器

开发平台:

C#

  1. /*
  2. * Copyright (c) 2005 Poderosa Project, All Rights Reserved.
  3. * $Id: ContainerCommandTarget.cs,v 1.2 2005/04/20 08:45:44 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.Runtime.InteropServices;
  11. using System.Windows.Forms;
  12. using System.Xml;
  13. using Microsoft.Win32;
  14. using Poderosa.Connection;
  15. using Poderosa.ConnectionParam;
  16. using Poderosa.LocalShell;
  17. using Poderosa.Debugging;
  18. using Poderosa.Terminal;
  19. using Poderosa.Communication;
  20. using Poderosa.Text;
  21. using Poderosa.Config;
  22. using Poderosa.Forms;
  23. using Poderosa.Toolkit;
  24. namespace Poderosa
  25. {
  26. /// <summary>
  27. /// 傾僾儕働乕僔儑儞慡懱偵娭傢傞奺庬僐儅儞僪偺幚峴傪峴偆丅僣乕儖僶乕丄儊僯儏乕丄僉乕儃乕僪僔儑乕僩僇僢僩偼
  28. /// 嵟廔揑偵偙偙傪屇傇偙偲偵側傞丅
  29. /// </summary>
  30. internal class ContainerGlobalCommandTarget : GlobalCommandTarget
  31.     {
  32.         #region poderosa stuff
  33.         private GFrame _frame;
  34. private bool _activationBlockFlag;
  35. public void Init(GFrame f) {
  36. _frame = f;
  37. }
  38. public CommandResult NewConnectionWithDialog(TCPTerminalParam param) {
  39. if(!CheckPaneCount()) return CommandResult.Denied;
  40. ConnectionHistory hst = GApp.ConnectionHistory;
  41. LoginDialog dlg = new LoginDialog();
  42. if(param!=null)
  43. dlg.ApplyParam(param);
  44. else
  45. dlg.ApplyParam(hst.TopTCPParam);
  46. if(GCUtil.ShowModalDialog(_frame, dlg)==DialogResult.OK) { //僟僀傾儘僌傪弌偝側偄側傜柍忦審偱愙懕傪奐偔
  47. AddNewTerminal(dlg.Result);
  48. return CommandResult.Success;
  49. }
  50. else
  51. return CommandResult.Cancelled;
  52. }
  53. public CommandResult NewConnection(TerminalParam p) {
  54. if(!CheckPaneCount()) return CommandResult.Denied;
  55. ConnectionTag con = null;
  56. if(p is TCPTerminalParam) {
  57. TCPTerminalParam param = (TCPTerminalParam)p;
  58. if(param.IsSSH) {
  59. SSHShortcutLoginDialog dlg = new SSHShortcutLoginDialog((SSHTerminalParam)param);
  60. if(GCUtil.ShowModalDialog(_frame, dlg)==DialogResult.OK)
  61. con = dlg.Result;
  62. }
  63. else
  64. con = CommunicationUtil.CreateNewConnection(param);
  65. }
  66. else if(p is SerialTerminalParam) {
  67. SerialTerminalParam param = (SerialTerminalParam)p;
  68. con = CommunicationUtil.CreateNewSerialConnection(_frame, param);
  69. }
  70. else if(p is LocalShellTerminalParam) {
  71. LocalShellTerminalParam param = (LocalShellTerminalParam)p;
  72. con = CommunicationUtil.CreateNewLocalShellConnection(_frame, param);
  73. }
  74. if(con!=null) {
  75. AddNewTerminal(con);
  76. return CommandResult.Success;
  77. }
  78. else
  79. return CommandResult.Cancelled;
  80. }
  81. public CommandResult NewSerialConnectionWithDialog(SerialTerminalParam param) {
  82. if(!CheckPaneCount()) return CommandResult.Denied;
  83. SerialLoginDialog dlg = new SerialLoginDialog();
  84. if(param!=null)
  85. dlg.ApplyParam(param);
  86. else
  87. dlg.ApplyParam(GApp.ConnectionHistory.TopSerialParam);
  88. if(GCUtil.ShowModalDialog(_frame, dlg)==DialogResult.OK) {
  89. ConnectionTag con = dlg.Result;
  90. if(con!=null) {
  91. AddNewTerminal(con);
  92. return CommandResult.Success;
  93. }
  94. }
  95. return CommandResult.Cancelled;
  96. //XModemReceiver xmodem = new XModemReceiver(GEnv.Connections.ActiveTag, "C:\IOPort\xmodemresult.txt");
  97. //XModemSender xmodem = new XModemSender(GEnv.Connections.ActiveTag, "C:\IOPort\xslt.cs");
  98. //xmodem.Start();
  99. //return CommandResult.Success;
  100. }
  101. public CommandResult NewCygwinConnectionWithDialog(CygwinTerminalParam param) {
  102. if(!CheckPaneCount()) return CommandResult.Denied;
  103. if(CygwinUtil.GuessRootDirectory().Length==0) return CommandResult.Failed;
  104. LocalShellLoginDialog dlg = new LocalShellLoginDialog();
  105. if(param!=null)
  106. dlg.ApplyParam(param);
  107. else
  108. dlg.ApplyParam(GApp.ConnectionHistory.TopCygwinParam);
  109. CommandResult res = CommandResult.Cancelled;
  110. if(GCUtil.ShowModalDialog(_frame, dlg)==DialogResult.OK) {
  111. ConnectionTag con = dlg.Result;
  112. if(con!=null) {
  113. AddNewTerminal(con);
  114. res = CommandResult.Success;
  115. }
  116. }
  117. dlg.Dispose();
  118. return res;
  119. }
  120. public CommandResult NewSFUConnectionWithDialog(SFUTerminalParam param) {
  121. if(!CheckPaneCount()) return CommandResult.Denied;
  122. if(SFUUtil.GuessRootDirectory().Length==0) return CommandResult.Failed;
  123. LocalShellLoginDialog dlg = new LocalShellLoginDialog();
  124. if(param!=null)
  125. dlg.ApplyParam(param);
  126. else
  127. dlg.ApplyParam(GApp.ConnectionHistory.TopSFUParam);
  128. if(GCUtil.ShowModalDialog(_frame, dlg)==DialogResult.OK) {
  129. ConnectionTag con = dlg.Result;
  130. if(con!=null) {
  131. AddNewTerminal(con);
  132. return CommandResult.Success;
  133. }
  134. }
  135. return CommandResult.Cancelled;
  136. }
  137. public ConnectionTag SilentNewConnection(TerminalParam p) {
  138. if(!CheckPaneCount()) return null;
  139. ConnectionTag con = null;
  140. if(p is SSHTerminalParam) {
  141. SSHTerminalParam tp = (SSHTerminalParam)p;
  142. con = CommunicationUtil.CreateNewConnection(tp, null);
  143. }
  144. else if(p is TelnetTerminalParam) {
  145. TelnetTerminalParam tp = (TelnetTerminalParam)p;
  146. con = CommunicationUtil.CreateNewConnection(tp);
  147. }
  148. else if(p is SerialTerminalParam) {
  149. SerialTerminalParam tp = (SerialTerminalParam)p;
  150. con = CommunicationUtil.CreateNewSerialConnection(_frame, tp);
  151. }
  152. else if(p is LocalShellTerminalParam) {
  153. LocalShellTerminalParam tp = (LocalShellTerminalParam)p;
  154. con = CommunicationUtil.CreateNewLocalShellConnection(_frame, tp);
  155. }
  156. if(con!=null)
  157.             {
  158. AddNewTerminal(con);
  159.             }
  160. return con;
  161. }
  162. //TerminalConnection
  163. protected override void AddNewTerminalInternal(ConnectionTag con) {
  164. GApp.ConnectionHistory.Update(con.Connection.Param);
  165. _frame.AddConnection(con);
  166. _frame.AdjustMRUMenu();
  167. ActivateConnection(con.Connection);
  168. _frame.RefreshConnection(con);
  169. }
  170. internal bool CheckPaneCount() {
  171. if(GEnv.Connections.Count>=32) {
  172. GUtil.Warning(_frame, GApp.Strings.GetString("Messages.ConnectionLimitExceeds"));
  173. return false;
  174. }
  175. else
  176. return true;
  177. }
  178. public CommandResult EmulateUsingLog() {
  179. OpenFileDialog dlg = new OpenFileDialog();
  180. dlg.Title = "Emulation Using Log";
  181. dlg.Multiselect = false;
  182. if(GCUtil.ShowModalDialog(_frame, dlg)==DialogResult.OK) {
  183. //僄儈儏儗乕僩偵傛傞僥僗僩
  184. FakeConnection fc = new FakeConnection(TCPTerminalParam.Fake);
  185. //!!new ConnectionTag()偼public偵偟偨偔側偄 
  186. AddNewTerminal(new ConnectionTag(fc));
  187. TestUtil.EmulateWithLog(dlg.FileName, GEnv.Connections.FindTag(fc));
  188. return CommandResult.Success;
  189. }
  190. return CommandResult.Cancelled;
  191. }
  192. public CommandResult OpenShortCutWithDialog() {
  193. OpenFileDialog dlg = new OpenFileDialog();
  194. dlg.Title = GApp.Strings.GetString("Util.OpenShortcutFile");
  195. dlg.Multiselect = false;
  196. dlg.InitialDirectory = GApp.Options.DefaultFileDir;
  197. dlg.DefaultExt = "gts";
  198. dlg.AddExtension = true;
  199. dlg.Filter = "Terminal Shortcut(*.gts)|*.gts|All Files(*.*)|*.*";
  200. if(GCUtil.ShowModalDialog(_frame, dlg)==DialogResult.OK) {
  201. GApp.Options.DefaultFileDir = GUtil.FileToDir(dlg.FileName);
  202. return OpenShortCut(dlg.FileName);
  203. }
  204. return CommandResult.Cancelled;
  205. }
  206. public CommandResult OpenShortCut(string filename) {
  207. try {
  208. if(GApp.Frame.WindowState==FormWindowState.Minimized) GApp.Frame.WindowState = FormWindowState.Normal;
  209. ConfigNode cn = DOMNodeConverter.Read(XMLUtil.FileToDOM(filename).DocumentElement);
  210. TerminalParam param = TerminalParam.CreateFromConfigNode(cn);
  211. param.FeedLogOption();
  212. NewConnection(param);
  213. return CommandResult.Success;
  214. }
  215. catch(Exception ex) {
  216. GUtil.Warning(_frame, ex.Message);
  217. return CommandResult.Failed;
  218. }
  219. }
  220. public ConnectionTag SilentOpenShortCut(string filename) {
  221. XmlReader r = null;
  222. try {
  223. if(GApp.Frame.WindowState==FormWindowState.Minimized) GApp.Frame.WindowState = FormWindowState.Normal;
  224. ConfigNode cn = DOMNodeConverter.Read(XMLUtil.FileToDOM(filename).DocumentElement);
  225. TerminalParam param = TerminalParam.CreateFromConfigNode(cn);
  226. param.FeedLogOption();
  227. return SilentNewConnection(param);
  228. }
  229. catch(Exception ex) {
  230. GUtil.Warning(_frame, ex.Message);
  231. }
  232. finally {
  233. if(r!=null) r.Close();
  234. }
  235. return null;
  236. }
  237. public CommandResult MoveToPrevPane() {
  238. Connections cc = GEnv.Connections;
  239. TerminalConnection a = cc.ActiveConnection;
  240. if(a==null) return CommandResult.Ignored;
  241. ActivateConnection(cc.PrevConnection(cc.FindTag(a)).Connection);
  242. return CommandResult.Success;
  243. }
  244. public CommandResult MoveToNextPane() {
  245. Connections cc = GEnv.Connections;
  246. TerminalConnection a = cc.ActiveConnection;
  247. if(a==null) return CommandResult.Ignored;
  248. ActivateConnection(cc.NextConnection(cc.FindTag(a)).Connection);
  249. return CommandResult.Success;
  250. }
  251. public CommandResult MoveTabToNext() {
  252. return MoveTab(1);
  253. }
  254. public CommandResult MoveTabToPrev() {
  255. return MoveTab(-1);
  256. }
  257. private CommandResult MoveTab(int d) {
  258. ConnectionTag ct = GEnv.Connections.ActiveTag;
  259. int index = GEnv.Connections.IndexOf(ct);
  260. int newindex = index + d;
  261. if(newindex>=0 && newindex < GEnv.Connections.Count) {
  262. GEnv.Connections.Reorder(index, newindex);
  263. GApp.Frame.ReorderWindowMenu(index, newindex, GEnv.Connections.ActiveTag);
  264. return CommandResult.Success;
  265. }
  266. else
  267. return CommandResult.Ignored;
  268. }
  269. public CommandResult ToggleFreeSelectionMode() {
  270. ConnectionTag ct = GEnv.Connections.ActiveTag;
  271. if(ct==null) return CommandResult.Ignored;
  272. IPoderosaTerminalPane p = ct.AttachedPane;
  273. if(p==null) return CommandResult.Failed;
  274. p.ToggleFreeSelectionMode();
  275. return CommandResult.Success;
  276. }
  277. public CommandResult ToggleAutoSelectionMode() {
  278. ConnectionTag ct = GEnv.Connections.ActiveTag;
  279. if(ct==null) return CommandResult.Ignored;
  280. IPoderosaTerminalPane p = ct.AttachedPane;
  281. if(p==null) return CommandResult.Failed;
  282. p.ToggleAutoSelectionMode();
  283. return CommandResult.Success;
  284. }
  285. public CommandResult CloseAll() {
  286. if(GApp.Options.AskCloseOnExit && GEnv.Connections.LiveConnectionsExist)
  287. if(GUtil.AskUserYesNo(_frame, GApp.Strings.GetString("Message.AskExitEvenIfConnected"), MessageBoxIcon.Exclamation)==DialogResult.No) return CommandResult.Cancelled;
  288. GEnv.Connections.CloseAllConnections();
  289. _frame.RemoveAllConnections();
  290. _frame.AdjustTerminalUI(false, null);
  291. GEnv.Connections.Clear();
  292. return CommandResult.Success;
  293. }
  294. public CommandResult CloseAllDisconnected() {
  295. foreach(ConnectionTag ct in GEnv.Connections.GetSnapshot()) {
  296. if(ct.Connection.IsClosed) {
  297. GApp.GetConnectionCommandTarget(ct).Close();
  298. }
  299. }
  300. GApp.Frame.RefreshConnection(GEnv.Connections.ActiveTag);
  301. return CommandResult.Success;
  302. }
  303. public CommandResult MoveActivePane(Keys direction) {
  304. GEnv.TextSelection.Clear();
  305. _frame.PaneContainer.MoveActivePane(direction);
  306. return CommandResult.Success;
  307. }
  308. public CommandResult CopyToFile() {
  309. if(GEnv.TextSelection.IsEmpty) return CommandResult.Ignored;
  310. SaveFileDialog dlg = new SaveFileDialog();
  311. dlg.InitialDirectory = GApp.Options.DefaultFileDir;
  312. dlg.Title = GApp.Strings.GetString("Util.DestinationToSave");
  313. dlg.Filter = "All Files(*.*)|*.*";
  314. string selectedtext = GEnv.TextSelection.GetSelectedText(); //偙偺僼傽僀儖慖戰僟僀傾儘僌傪暵偠偨捈屻偵OnGotFocus偑敪惗偟丄僥僉僗僩慖戰偑僋儕傾偝傟傞偙偲偑偁傞偺偱帠慜偵庢摼偟偰偍偔
  315. if(GCUtil.ShowModalDialog(_frame, dlg)==DialogResult.OK) {
  316. GApp.Options.DefaultFileDir = GUtil.FileToDir(dlg.FileName);
  317. try {
  318. StreamWriter wr = new StreamWriter(new FileStream(dlg.FileName, FileMode.Create), Encoding.Default);
  319. wr.Write(selectedtext);
  320. wr.Close();
  321. return CommandResult.Success;
  322. }
  323. catch(Exception ex) {
  324. GUtil.Warning(GApp.Frame, ex.Message);
  325. return CommandResult.Failed;
  326. }
  327. }
  328. else
  329. return CommandResult.Cancelled;
  330. }
  331. public CommandResult QuitApp() {
  332. CloseAll();
  333. _frame.Close();
  334. return CommandResult.Success;
  335. }
  336. //Activate偺張棟拞偼丄GEnc.Coonections偐傜庢傟傞ActiveConnection偼屆偄傗偮偱偁傞丅
  337. public CommandResult ActivateConnection(TerminalConnection con) {
  338. if(con==GEnv.Connections.ActiveConnection) {
  339. IPoderosaTerminalPane p = GEnv.Connections.FindTag(con).AttachedPane;
  340. if(p!=null && !p.AsControl().Focused) p.AsControl().Focus(); //!!傾僋僥傿僽側僐僱僋僔儑儞偩偐傜Pane偑null偭偰偙偲偼側偄偼偢偩偑丄偦偆側偭偰偟傑偆働乕僗偑偁傞傛偆偩丅恀偺尨場偼暿偵偁傞偼偢偩偑枹夝柧
  341. return CommandResult.Success;
  342. }
  343. return ActivateConnection2(con==null? null : GEnv.Connections.FindTag(con));
  344. }
  345. //偙偺拞偱懡廳偵Activate偝傟偰偔傞偙偲偑偁傞
  346. internal CommandResult ActivateConnection2(ConnectionTag ct) {
  347. //Debug.WriteLine("Activating " + GEnv.Connections.IndexOf(ct));
  348. if(_activationBlockFlag || ct==null) return CommandResult.Ignored;
  349. _activationBlockFlag = true;
  350. GEnv.TextSelection.Clear();
  351. GEnv.Connections.BringToActivationOrderTop(ct);
  352. _frame.ActivateConnection(ct);
  353. _activationBlockFlag = false;
  354. return CommandResult.Success;
  355. }
  356. public CommandResult SetFocusToActiveConnection() {
  357. ConnectionTag tag = GEnv.Connections.ActiveTag;
  358. if(tag==null || tag.AttachedPane==null) return CommandResult.Ignored;
  359. //傾僋僥傿僽偵偟偨偲偒偵僋儔僢僔儏偡傞偺偼偙偺Focus屇傃弌偟偑擹岤丅偙偙偼GFrame.OnActivated偐傜屇偽傟偰偄傞
  360. //tag.AttachedPane.AsControl().Focus(); //僞僀僩儖僶乕傪僋儕僢僋偡傞側偳偡傞偲儁僀儞偵僼僅乕僇僗偑側偄
  361. return CommandResult.Success;
  362. }
  363. public CommandResult SetFrameStyle(GFrameStyle fs) {
  364. if(fs==GApp.Options.FrameStyle) return CommandResult.Ignored;
  365. GEnv.TextSelection.Clear();
  366. ContainerOptions opt = (ContainerOptions)GApp.Options.Clone();
  367. opt.FrameStyle = fs;
  368. GApp.UpdateOptions(opt);
  369. return CommandResult.Success;
  370. }
  371. public CommandResult ResetAllRenderProfiles(RenderProfile prof) {
  372. GEnv.DefaultRenderProfile = prof;
  373. foreach(ConnectionTag ct in GEnv.Connections) {
  374. ct.RenderProfile = null;
  375. if(ct.AttachedPane!=null) ct.AttachedPane.ApplyRenderProfile(prof);
  376. }
  377. return CommandResult.Success;
  378. }
  379. public CommandResult ExpandPane(bool expand) {
  380. GApp.Frame.PaneContainer.ResizeSplitterByFocusedPane(expand);
  381. return CommandResult.Success;
  382. }
  383. public CommandResult ShowOptionDialog() {
  384. OptionDialog dlg = new OptionDialog();
  385. GCUtil.ShowModalDialog(_frame, dlg);
  386. return CommandResult.Success;
  387. }
  388. public CommandResult ShowKeyGenWizard() {
  389. KeyGenWizard dlg = new KeyGenWizard();
  390. GCUtil.ShowModalDialog(_frame, dlg);
  391. return CommandResult.Success;
  392. }
  393. public CommandResult ShowChangePassphraseDialog() {
  394. ChangePassphrase dlg = new ChangePassphrase();
  395. GCUtil.ShowModalDialog(_frame, dlg);
  396. return CommandResult.Success;
  397. }
  398. public CommandResult ShowReceiveFileDialog() {
  399. if(_frame.XModemDialog!=null) {
  400. if(_frame.XModemDialog.Receiving)
  401. return CommandResult.Ignored;
  402. else {
  403. GUtil.Warning(GEnv.Frame, GApp.Strings.GetString("Message.NowFileSending"));
  404. return CommandResult.Failed;
  405. }
  406. }
  407. if(GEnv.Connections.ActiveTag==null) return CommandResult.Failed;
  408. XModemDialog dlg = new XModemDialog();
  409. dlg.Owner = _frame;
  410. dlg.Receiving = true;
  411. dlg.ConnectionTag = GEnv.Connections.ActiveTag;
  412. _frame.CenteringDialog(dlg);
  413. dlg.Show();
  414. _frame.XModemDialog = dlg;
  415. return CommandResult.Success;
  416. }
  417. public CommandResult ShowSendFileDialog() {
  418. if(_frame.XModemDialog!=null) {
  419. if(!_frame.XModemDialog.Receiving)
  420. return CommandResult.Ignored;
  421. else {
  422. GUtil.Warning(GEnv.Frame, GApp.Strings.GetString("Message.NowFileReceiving"));
  423. return CommandResult.Failed;
  424. }
  425. }
  426. if(GEnv.Connections.ActiveTag==null) return CommandResult.Failed;
  427. XModemDialog dlg = new XModemDialog();
  428. dlg.Owner = _frame;
  429. dlg.Receiving = false;
  430. dlg.ConnectionTag = GEnv.Connections.ActiveTag;
  431. _frame.CenteringDialog(dlg);
  432. dlg.Show();
  433. _frame.XModemDialog = dlg;
  434. return CommandResult.Success;
  435. }
  436. public CommandResult ShowMacroConfigDialog() {
  437. MacroList dlg = new MacroList();
  438. GCUtil.ShowModalDialog(_frame, dlg);
  439. return CommandResult.Success;
  440. }
  441. public CommandResult StopMacro() {
  442. if(GApp.MacroManager.MacroIsRunning) {
  443. GApp.MacroManager.StopMacro();
  444. return CommandResult.Success;
  445. }
  446. else
  447. return CommandResult.Ignored;
  448. }
  449. public CommandResult ShowAboutBox() {
  450. AboutBox dlg = new AboutBox();
  451. GCUtil.ShowModalDialog(_frame, dlg);
  452. if(dlg.CreditButtonClicked)
  453. GCUtil.ShowModalDialog(_frame, new Credits());
  454. return CommandResult.Success;
  455. }
  456. public CommandResult ShowWelcomeDialog() {
  457. WelcomeDialog dlg = new WelcomeDialog();
  458. DialogResult r = GCUtil.ShowModalDialog(_frame, dlg);
  459. if(r==DialogResult.OK) {
  460. if(dlg.CID!=CID.NOP) GApp.GlobalCommandTarget.Exec(dlg.CID);
  461. }
  462. return CommandResult.Success;
  463. }
  464. public CommandResult ShowProductWeb() {
  465. try {
  466. Process p = Process.Start(GCConst.PRODUCT_WEB);
  467. return p==null? CommandResult.Failed : CommandResult.Success;
  468. }
  469. catch(Exception) {
  470. return CommandResult.Failed;
  471. }
  472. }
  473. public CommandResult LaunchPortforwarding() {
  474. try {
  475. Process p = Process.Start(GApp.BaseDirectory + "\portforwarding.exe");
  476. if(p==null) {
  477. GUtil.Warning(GApp.Frame, GApp.Strings.GetString("Message.PFLaunchFailed"));
  478. return CommandResult.Failed;
  479. }
  480. else
  481. return CommandResult.Success;
  482. }
  483. catch(Exception ex) {
  484. GUtil.Warning(GApp.Frame, GApp.Strings.GetString("Message.PFLaunchFailed")+"n" + ex.Message);
  485. return CommandResult.Failed;
  486. }
  487. }
  488. public override CommandResult SetConnectionLocation(ConnectionTag ct, TerminalPane pane) {
  489. if(ct.AttachedPane==pane) return CommandResult.Ignored;
  490. _frame.PaneContainer.SetConnectionLocation(ct, pane);
  491. return CommandResult.Success;
  492. }
  493. public CommandResult Exec(Commands.Entry ent) {
  494. if(ent.Category==Commands.Category.Fixed) {
  495. int n = (int)(ent.CID - CID.ActivateConnection0);
  496. if(n < GEnv.Connections.Count)
  497. return ActivateConnection2(GEnv.Connections.TagAt(n));
  498. else
  499. return CommandResult.Ignored;
  500. }
  501. else if(ent.Category==Commands.Category.Macro)
  502. return ExecMacro(((Commands.MacroEntry)ent).Index);
  503. else
  504. return Exec(ent.CID);
  505. }
  506. public CommandResult ExecMacro(int index) {
  507. if(index < GApp.MacroManager.ModuleCount) {
  508. GApp.MacroManager.Execute(GApp.Frame, GApp.MacroManager.GetModule(index));
  509. return CommandResult.Success;
  510. }
  511. else
  512. return CommandResult.Ignored;
  513. }
  514.         #endregion
  515.         [DllImport("MSVCRT.DLL")]
  516.         public static extern void time(ref long t);
  517. public CommandResult Exec(CID id) {
  518. switch(id) {
  519.                 #region Poderosa stuff
  520.                 case CID.PrevPane:
  521. return MoveToPrevPane();
  522. case CID.NextPane:
  523. return MoveToNextPane();
  524. case CID.MoveTabToPrev:
  525. return MoveTabToPrev();
  526. case CID.MoveTabToNext:
  527. return MoveTabToNext();
  528. case CID.MovePaneUp:
  529. return MoveActivePane(Keys.Up);
  530. case CID.MovePaneDown:
  531. return MoveActivePane(Keys.Down);
  532. case CID.MovePaneLeft:
  533. return MoveActivePane(Keys.Left);
  534. case CID.MovePaneRight:
  535. return MoveActivePane(Keys.Right);
  536. case CID.FrameStyleSingle:
  537. return SetFrameStyle(GFrameStyle.Single);
  538. case CID.FrameStyleDivHorizontal:
  539. return SetFrameStyle(GFrameStyle.DivHorizontal);
  540. case CID.FrameStyleDivVertical:
  541. return SetFrameStyle(GFrameStyle.DivVertical);
  542. case CID.FrameStyleDivHorizontal3:
  543. return SetFrameStyle(GFrameStyle.DivHorizontal3);
  544. case CID.FrameStyleDivVertical3:
  545. return SetFrameStyle(GFrameStyle.DivVertical3);
  546. case CID.NewConnection:
  547. return NewConnectionWithDialog(null);
  548. case CID.NewSerialConnection:
  549. return NewSerialConnectionWithDialog(null);
  550. case CID.NewCygwinConnection:
  551. return NewCygwinConnectionWithDialog(null);
  552. case CID.NewSFUConnection:
  553. return NewSFUConnectionWithDialog(null);
  554. case CID.OpenShortcut:
  555. return OpenShortCutWithDialog();
  556. case CID.Copy:
  557. return Copy();
  558. case CID.CopyAsLook:
  559. return CopyAsLook();
  560. case CID.CopyToFile:
  561. return CopyToFile();
  562. case CID.ToggleFreeSelectionMode:
  563. return ToggleFreeSelectionMode();
  564. case CID.ToggleAutoSelectionMode:
  565. return ToggleAutoSelectionMode();
  566. case CID.OptionDialog:
  567. return ShowOptionDialog();
  568. case CID.KeyGen:
  569. return ShowKeyGenWizard();
  570. case CID.ChangePassphrase:
  571. return ShowChangePassphraseDialog();
  572. case CID.Portforwarding:
  573. return LaunchPortforwarding();
  574. case CID.MacroConfig:
  575. return ShowMacroConfigDialog();
  576. case CID.StopMacro:
  577. return StopMacro();
  578. case CID.ReceiveFile:
  579. return ShowReceiveFileDialog();
  580. case CID.SendFile:
  581. return ShowSendFileDialog();
  582. case CID.AboutBox:
  583. return ShowAboutBox();
  584. case CID.ShowWelcomeDialog:
  585. return ShowWelcomeDialog();
  586. case CID.CloseAll:
  587. return CloseAll();
  588. case CID.CloseAllDisconnected:
  589. return CloseAllDisconnected();
  590. case CID.ExpandPane:
  591. return ExpandPane(true);
  592. case CID.ShrinkPane:
  593. return ExpandPane(false);
  594. case CID.Quit:
  595. return QuitApp();
  596. #if DEBUG
  597. case CID.EmulateLog:
  598. return EmulateUsingLog();
  599. #endif
  600. case CID.ProductWeb:
  601. return ShowProductWeb();
  602. case CID.NOP:
  603. return CommandResult.Ignored;
  604. default:
  605. int n = id - CID.ExecMacro;
  606. if(n>=0 && n<100)
  607. return ExecMacro(n);
  608. else {
  609. Debug.WriteLine("unknown connection command "+id);
  610. return CommandResult.Ignored;
  611.                     }
  612.                 #endregion
  613.             }
  614.         }
  615.         #region other stuff
  616.         //Menu / ToolBar偐傜偺僐儅儞僪偺夞旔嶔
  617. private CID _delayed_command_id;
  618. private string _delayed_string_data;
  619. public void DelayedExec(CID id) {
  620. _delayed_command_id = id;
  621. Win32.PostMessage(GApp.Frame.Handle, GConst.WMG_DELAYED_COMMAND, IntPtr.Zero, IntPtr.Zero);
  622. }
  623. public void DelayedOpenShortcut(string fn) {
  624. _delayed_command_id = CID.OpenShortcut;
  625. _delayed_string_data = fn;
  626. Win32.PostMessage(GApp.Frame.Handle, GConst.WMG_DELAYED_COMMAND, IntPtr.Zero, IntPtr.Zero);
  627. }
  628. public void DoDelayedExec() {
  629. if(_delayed_command_id==CID.OpenShortcut)
  630. OpenShortCut(_delayed_string_data);
  631. else
  632. Exec(_delayed_command_id);
  633.         }
  634.         #endregion
  635.     }
  636. internal class ContainerConnectionCommandTarget : ConnectionCommandTarget {
  637.         #region poderosa stuff
  638. public ContainerConnectionCommandTarget(TerminalConnection con) : base(con) {
  639. }
  640. public CommandResult Reproduce() {
  641. if(!GApp.GlobalCommandTarget.CheckPaneCount()) return CommandResult.Failed;
  642. try {
  643. ConnectionTag con = _connection.Reproduce();
  644. if(con==null) return CommandResult.Failed; //愙懕幐攕帪偼偙偺拞偱儊僢僙乕僕偑弌偰偄傞
  645. if(_connection.IsClosed) { //嵞愙懕
  646. ConnectionTag old = GEnv.Connections.FindTag(_connection);
  647. con.Document.InsertBefore(old.Document, _connection.TerminalHeight);
  648. GEnv.Connections.Replace(old, con);
  649. con.ImportProperties(old);
  650. if(old.AttachedPane!=null) {
  651. old.AttachedPane.Attach(con);
  652. }
  653. con.Receiver.Listen();
  654. GApp.Frame.ReplaceConnection(old, con);
  655. GApp.Frame.RefreshConnection(con);
  656. GApp.GlobalCommandTarget.ActivateConnection(con.Connection);
  657. }
  658. else
  659. GApp.GlobalCommandTarget.AddNewTerminal(con);
  660. return CommandResult.Success;
  661. }
  662. catch(Exception ex) {
  663. GUtil.Warning(GApp.Frame, ex.Message);
  664. return CommandResult.Failed;
  665. }
  666. }
  667. public CommandResult SetTransmitNewLine(NewLine nl) {
  668. //Set Value
  669. _connection.Param.TransmitNL = nl;
  670. GFrame f = GApp.Frame;
  671. //ToolBar
  672. if(GApp.Options.ShowToolBar) {
  673. f.ToolBar.NewLineBox.SelectedIndex = (int)nl;
  674. f.ToolBar.Invalidate(true);
  675. }
  676. //Menu
  677. f.MenuNewLineCR.Checked   = nl==NewLine.CR;
  678. f.MenuNewLineLF.Checked   = nl==NewLine.LF;
  679. f.MenuNewLineCRLF.Checked = nl==NewLine.CRLF;
  680. return CommandResult.Success;
  681. }
  682. public CommandResult SetLocalEcho(bool enabled) {
  683. //Set Value
  684. _connection.Param.LocalEcho = enabled;
  685. GFrame f = GApp.Frame;
  686. //ToolBar
  687. if(GApp.Options.ShowToolBar) {
  688. f.ToolBar.LocalEchoButton.Checked = enabled;
  689. f.ToolBar.Invalidate(true);
  690. }
  691. //Menu
  692. f.MenuLocalEcho.Checked = enabled;
  693. return CommandResult.Success;
  694. }
  695. public CommandResult ShowLineFeedRuleDialog() {
  696. LineFeedStyleDialog dlg = new LineFeedStyleDialog(_connection);
  697. if(GCUtil.ShowModalDialog(GApp.Frame, dlg)==DialogResult.OK)
  698. _connection.Param.LineFeedRule = dlg.LineFeedRule;
  699. return CommandResult.Success;
  700. }
  701. public CommandResult SetLogSuspended(bool suspended) {
  702. //Set Value
  703. _connection.LogSuspended = suspended;
  704. GFrame f = GApp.Frame;
  705. //ToolBar
  706. if(GApp.Options.ShowToolBar) {
  707. f.ToolBar.SuspendLogButton.Checked = suspended;
  708. f.ToolBar.Invalidate(true);
  709. }
  710. //Menu
  711. f.MenuSuspendLog.Checked = suspended;
  712. return CommandResult.Success;
  713. }
  714. public CommandResult SetEncoding(EncodingProfile enc) {
  715. ConnectionTag ct = GEnv.Connections.FindTag(_connection);
  716. _connection.Param.EncodingProfile = enc;
  717. ct.Terminal.Reset();
  718. GApp.Frame.AdjustTerminalUI(true, ct);
  719. return CommandResult.Success;
  720. }
  721. public CommandResult EditRenderProfile() {
  722. ConnectionTag tag = GEnv.Connections.FindTag(_connection);
  723. EditRenderProfile dlg = new EditRenderProfile(tag.RenderProfile);
  724. if(GCUtil.ShowModalDialog(GApp.Frame, dlg)==DialogResult.OK) {
  725. tag.RenderProfile = dlg.Result;
  726. GApp.ConnectionHistory.ReplaceIdenticalParam(tag.Connection.Param);
  727. if(tag.AttachedPane!=null) tag.AttachedPane.ApplyRenderProfile(dlg.Result);
  728. GApp.Frame.AdjustMRUMenu();
  729. return CommandResult.Success;
  730. }
  731. else
  732. return CommandResult.Cancelled;
  733. }
  734. public CommandResult ChangeLogWithDialog() {
  735. ChangeLogDialog dlg = new ChangeLogDialog(_connection);
  736. if(GCUtil.ShowModalDialog(GApp.Frame, dlg)==DialogResult.OK) {
  737. GApp.Frame.AdjustTerminalUI(true, GEnv.Connections.FindTag(_connection));
  738. return CommandResult.Success;
  739. }
  740. else
  741. return CommandResult.Cancelled;
  742. }
  743. public CommandResult CommentLog() {
  744. LogNoteForm dlg = new LogNoteForm();
  745. if(GCUtil.ShowModalDialog(GApp.Frame, dlg)==DialogResult.OK) {
  746. _connection.CommentLog(dlg.ResultText);
  747. return CommandResult.Success;
  748. }
  749. else
  750. return CommandResult.Cancelled;
  751. }
  752. public CommandResult ShowServerInfo() {
  753. ServerInfo dlg = new ServerInfo(_connection);
  754. GCUtil.ShowModalDialog(GApp.Frame, dlg);
  755. return CommandResult.Success;
  756. }
  757. public CommandResult RenameTab() {
  758. try {
  759. InputBox box = new InputBox();
  760. box.AllowsZeroLenString = false;
  761. box.Text = GApp.Strings.GetString("Util.RenameTab");
  762. box.Content = _connection.Param.Caption;
  763. if(GCUtil.ShowModalDialog(GApp.Frame, box)==DialogResult.OK) {
  764. _connection.Param.Caption = box.Content;
  765. GApp.ConnectionHistory.ReplaceIdenticalParam(_connection.Param);
  766. GApp.Frame.AdjustMRUMenu();
  767. GApp.Frame.RefreshConnection(GEnv.Connections.FindTag(_connection));
  768. return CommandResult.Success;
  769. }
  770. else
  771. return CommandResult.Cancelled;
  772. }
  773. catch(Exception ex) {
  774. Debug.WriteLine(ex.StackTrace);
  775. GUtil.Warning(GApp.Frame, ex.Message);
  776. return CommandResult.Failed;
  777. }
  778. }
  779. public CommandResult SerialConfig() {
  780. SerialTerminalConnection stc = _connection as SerialTerminalConnection;
  781. if(stc==null) return CommandResult.Failed;
  782. try {
  783. SerialConfigForm f = new SerialConfigForm();
  784. f.ApplyParam(stc);
  785. if(GCUtil.ShowModalDialog(GApp.Frame, f)==DialogResult.OK)
  786. return CommandResult.Success;
  787. else
  788. return CommandResult.Cancelled;
  789. }
  790. catch(NotSupportedException) {
  791. GUtil.Warning(GApp.Frame, GApp.Strings.GetString("Message.SerialConfigIsSerialOnly"));
  792. return CommandResult.Failed;
  793. }
  794. }
  795. public CommandResult SaveShortCut() {
  796. //僐僱僋僔儑儞偑偁傟偽僼傽僀儖傪恞偹傞
  797. SaveFileDialog dlg = new SaveFileDialog();
  798. dlg.Title = GApp.Strings.GetString("Util.SaveShortcut");
  799. dlg.InitialDirectory = GApp.Options.DefaultFileDir;
  800. dlg.DefaultExt = "gts";
  801. dlg.AddExtension = true;
  802. dlg.Filter = "Terminal Shortcut(*.gts)|*.gts";
  803. if(GCUtil.ShowModalDialog(GApp.Frame, dlg)==DialogResult.OK) {
  804. try {
  805. ConfigNode cn = new ConfigNode("poderosa-shortcut");
  806. _connection.Param.Export(cn);
  807. XmlWriter wr = XMLUtil.CreateDefaultWriter(dlg.FileName);
  808. DOMNodeConverter.Write(wr, cn);
  809. wr.WriteEndDocument();
  810. wr.Close();
  811. GApp.Options.DefaultFileDir = GUtil.FileToDir(dlg.FileName);
  812. return CommandResult.Success;
  813. }
  814. catch(Exception ex) {
  815. MessageBox.Show(GEnv.Frame, ex.Message, GApp.Strings.GetString("Message.SaveError"), MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
  816. return CommandResult.Failed;
  817. }
  818. }
  819. else
  820. return CommandResult.Cancelled;
  821. }
  822. public override CommandResult Paste() {
  823. string value = (string)Clipboard.GetDataObject().GetData("Text");
  824. if(value==null || value.Length==0) return CommandResult.Ignored;
  825. ConnectionTag ct = GEnv.Connections.FindTag(_connection);
  826. if(ct.ModalTerminalTask!=null) return CommandResult.Denied;
  827. if(value.Length>0x1000) {
  828. SendingLargeText dlg = new SendingLargeText(new PasteProcessor(ct, value));
  829. if(GCUtil.ShowModalDialog(GApp.Frame, dlg)==DialogResult.OK)
  830. return CommandResult.Success;
  831. else
  832. return CommandResult.Cancelled;
  833. }
  834. else
  835. return PasteMain(value);
  836. }
  837. public CommandResult PasteFromFile() {
  838. OpenFileDialog dlg = new OpenFileDialog();
  839. dlg.InitialDirectory = GApp.Options.DefaultFileDir;
  840. dlg.Title = GApp.Strings.GetString("Util.SourceToLoad");
  841. dlg.Filter = "All Files(*.*)|*.*";
  842. ConnectionTag ct = GEnv.Connections.FindTag(_connection);
  843. if(ct.ModalTerminalTask!=null) return CommandResult.Denied;
  844. if(GCUtil.ShowModalDialog(GApp.Frame, dlg)==DialogResult.OK) {
  845. GApp.Options.DefaultFileDir = GUtil.FileToDir(dlg.FileName);
  846. try {
  847. StreamReader re = new StreamReader(new FileStream(dlg.FileName, FileMode.Open, FileAccess.Read), _connection.Param.EncodingProfile.Encoding);
  848. if(new FileInfo(dlg.FileName).Length > 0x1000) { //4KB埲忋偼旕摨婜
  849. SendingLargeText dlg2 = new SendingLargeText(new PasteProcessor(ct, re));
  850. re.Close();
  851. if(GCUtil.ShowModalDialog(GApp.Frame, dlg2)==DialogResult.OK)
  852. return CommandResult.Success;
  853. else
  854. return CommandResult.Cancelled;
  855. }
  856. else {
  857. PasteProcessor p = new PasteProcessor(ct, re);
  858. p.Perform();
  859. re.Close();
  860. }
  861. //GEnv.Frame.StatusBar.IndicateSendData();
  862. return CommandResult.Success;
  863. }
  864. catch(Exception ex) {
  865. GUtil.Warning(GEnv.Frame, ex.Message);
  866. return CommandResult.Failed;
  867. }
  868. }
  869. else
  870. return CommandResult.Cancelled;
  871. }
  872. public CommandResult Exec(CID id) {
  873. switch(id) {
  874. case CID.Close:
  875. return Close();
  876. case CID.Reproduce:
  877. return Reproduce();
  878. case CID.SaveShortcut:
  879. return SaveShortCut();
  880. case CID.ShowServerInfo:
  881. return ShowServerInfo();
  882. case CID.RenameTab:
  883. return RenameTab();
  884. case CID.Paste:
  885. return Paste();
  886. case CID.PasteFromFile:
  887. return PasteFromFile();
  888. case CID.ClearScreen:
  889. return ClearScreen();
  890. case CID.ClearBuffer:
  891. return ClearBuffer();
  892. case CID.SelectAll:
  893. return SelectAll();
  894. case CID.ToggleNewLine:
  895. return SetTransmitNewLine(TerminalUtil.NextNewLineOption(_connection.Param.TransmitNL));
  896. case CID.ToggleLocalEcho:
  897. return SetLocalEcho(!_connection.Param.LocalEcho);
  898. case CID.LineFeedRule:
  899. return ShowLineFeedRuleDialog();
  900. case CID.ToggleLogSuspension:
  901. return SetLogSuspended(!_connection.LogSuspended);
  902. case CID.EditRenderProfile:
  903. return EditRenderProfile();
  904. case CID.ChangeLogFile:
  905. return ChangeLogWithDialog();
  906. case CID.CommentLog:
  907. return CommentLog();
  908. case CID.SendBreak:
  909. return SendBreak();
  910. case CID.AreYouThere:
  911. return AreYouThere();
  912. case CID.SerialConfig:
  913. return SerialConfig();
  914. case CID.ResetTerminal:
  915. return ResetTerminal();
  916. #if DEBUG
  917. case CID.DumpText:
  918. return DumpText();
  919. #endif
  920. case CID.NOP:
  921. return CommandResult.Ignored;
  922. default:
  923. Debug.WriteLine("unknown connection command "+id);
  924. return CommandResult.Ignored;
  925. }
  926.         }
  927.         #endregion
  928.     }
  929. }