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

Telnet服务器

开发平台:

C#

  1. /*
  2. * Copyright (c) 2005 Poderosa Project, All Rights Reserved.
  3. * $Id: MacroModule.cs,v 1.2 2005/04/20 08:45:45 okajima Exp $
  4. */
  5. using System;
  6. using System.Reflection;
  7. using System.Text;
  8. using System.Diagnostics;
  9. using System.IO;
  10. using System.Collections;
  11. using System.Windows.Forms;
  12. using Poderosa.Config;
  13. using Poderosa.Communication;
  14. using Poderosa.Connection;
  15. using Poderosa.UI;
  16. namespace Poderosa.MacroEnv
  17. {
  18. internal enum MacroType {
  19. Unknown,
  20. JavaScript,
  21. Assembly
  22. }
  23. internal interface IMacroEventListener {
  24. void IndicateMacroStarted();
  25. void IndicateMacroFinished();
  26. }
  27. internal class MacroModule : ICloneable {
  28. private MacroType _type;
  29. private string _path;
  30. private string _title;
  31. private string[] _additionalAssemblies;
  32. private bool _debugMode;
  33. private int _index;
  34. public MacroModule(int index) {
  35. _index = index;
  36. _additionalAssemblies = new string[0];
  37. }
  38. public int Index {
  39. get {
  40. return _index;
  41. }
  42. set {
  43. _index = value;
  44. }
  45. }
  46. public object Clone() {
  47. MacroModule m = new MacroModule(_index);
  48. m._type = _type;
  49. m._path = _path;
  50. m._title = _title;
  51. m._additionalAssemblies = _additionalAssemblies;
  52. m._debugMode = _debugMode;
  53. return m;
  54. }
  55. public MacroType Type {
  56. get {
  57. return _type;
  58. }
  59. }
  60. public string Path {
  61. get {
  62. return _path;
  63. }
  64. set {
  65. _path = value;
  66. string t = System.IO.Path.GetExtension(_path).ToLower();
  67. if(t.EndsWith("js"))
  68. _type = MacroType.JavaScript;
  69. else if(t.EndsWith("exe") || t.EndsWith("dll"))
  70. _type = MacroType.Assembly;
  71. else
  72. _type = MacroType.Unknown;
  73. }
  74. }
  75. public string Title {
  76. get {
  77. return _title;
  78. }
  79. set {
  80. _title = value;
  81. }
  82. }
  83. public CID CommandID {
  84. get {
  85. return CID.ExecMacro +_index;
  86. }
  87. }
  88. public Keys ShortCut {
  89. get {
  90. Commands.Entry e = GApp.Options.Commands.FindMacroEntry(this.Index);
  91. return e==null? Keys.None : (e.Modifiers | e.Key);
  92. }
  93. }
  94. public string[] AdditionalAssemblies {
  95. get {
  96. return _additionalAssemblies;
  97. }
  98. set {
  99. _additionalAssemblies = value;
  100. }
  101. }
  102. public bool DebugMode {
  103. get {
  104. return _debugMode;
  105. }
  106. set {
  107. _debugMode = value;
  108. }
  109. }
  110. public void Load(ConfigNode sec) {
  111. Path = sec["path"];
  112. _title = sec["title"];
  113. _debugMode = GUtil.ParseBool(sec["debug"], false);
  114. Keys shortcut = Keys.None;
  115. string t = sec["shortcut"];
  116. if(t!=null) shortcut = GUtil.ParseKey(t.Split(','));
  117. GApp.Options.Commands.AddEntry(new Commands.MacroEntry(_title, shortcut & Keys.Modifiers, shortcut & Keys.KeyCode, _index));
  118. _additionalAssemblies = sec["additional-assemblies"].Split(',');
  119. }
  120. public void Save(ConfigNode parent) {
  121. ConfigNode node = new ConfigNode("module");
  122. node["path"] = _path;
  123. node["title"] = _title;
  124. node["debug"] = _debugMode.ToString();
  125. Commands.Entry e = GApp.Options.Commands.FindMacroEntry(this.Index);
  126. if(e!=null)
  127. node["shortcut"] = UILibUtil.KeyString(e.Modifiers, e.Key, ',');
  128. node["additional-assemblies"] = Concat(_additionalAssemblies);
  129. parent.AddChild(node);
  130. }
  131. private string Concat(string[] v) {
  132. if(v==null) return "";
  133. StringBuilder b = new StringBuilder();
  134. foreach(string t in v) {
  135. if(b.Length>0) b.Append(';');
  136. b.Append(t);
  137. }
  138. return b.ToString();
  139. }
  140. }
  141. internal class MacroManager {
  142. private ArrayList _entries;
  143. private Hashtable _environmentVariables;
  144. private MacroExecutor _runningMacro;
  145. private IMacroEventListener _macroListener;
  146. public MacroManager() {
  147. _entries = new ArrayList();
  148. _environmentVariables = new Hashtable();
  149. }
  150. public IEnumerable Modules {
  151. get {
  152. return _entries;
  153. }
  154. }
  155. public int ModuleCount {
  156. get {
  157. return _entries.Count;
  158. }
  159. }
  160. public IDictionaryEnumerator EnvironmentVariables {
  161. get {
  162. return _environmentVariables.GetEnumerator();
  163. }
  164. }
  165. public string GetVariable(string name, string defaultvalue) {
  166. object t = _environmentVariables[name];
  167. return t==null? defaultvalue : (string)t;
  168. }
  169. public void ResetEnvironmentVariables(Hashtable newmap) {
  170. _environmentVariables = newmap;
  171. }
  172. public bool MacroIsRunning {
  173. get {
  174. return _runningMacro!=null;
  175. }
  176. }
  177. public MacroModule CurrentMacro {
  178. get {
  179. return _runningMacro.Module;
  180. }
  181. }
  182. public void SetMacroEventListener(IMacroEventListener f) {
  183. _macroListener = f;
  184. }
  185. public void Execute(IWin32Window parent, MacroModule mod) {
  186. if(_runningMacro!=null) {
  187. GUtil.Warning(parent, GApp.Strings.GetString("Message.MacroModule.AlreadyRunning"));
  188. return;
  189. }
  190. if(mod.Type==MacroType.Unknown) {
  191. GUtil.Warning(parent, GApp.Strings.GetString("Message.MacroModule.UnknownModuleType"));
  192. return;
  193. }
  194. else {
  195. try {
  196. GApp.Frame.Cursor = Cursors.WaitCursor;
  197. Assembly asm = MacroUtil.LoadMacroAssembly(mod);
  198. MethodInfo ep = asm.EntryPoint;
  199. if(ep==null)
  200. throw new Exception(GApp.Strings.GetString("Message.MacroModule.NoEntryPoint"));
  201. _runningMacro = new MacroExecutor(mod, ep);
  202. IndicateMacroStarted();
  203. _runningMacro.AsyncExec();
  204. }
  205. catch(Exception ex) {
  206. GUtil.Warning(parent, ex.Message);
  207. }
  208. finally {
  209. GApp.Frame.Cursor = Cursors.Default;
  210. }
  211. }
  212. }
  213. public void StopMacro() {
  214. if(_runningMacro==null) return;
  215. _runningMacro.Abort();
  216. }
  217. public MacroModule GetModule(int index) {
  218. return (MacroModule)_entries[index];
  219. }
  220. public void AddModule(MacroModule mod) {
  221. _entries.Add(mod);
  222. }
  223. public void RemoveModule(MacroModule mod) {
  224. _entries.Remove(mod);
  225. }
  226. public void RemoveAt(int n) {
  227. _entries.RemoveAt(n);
  228. }
  229. public void InsertModule(int n, MacroModule mod) {
  230. _entries.Insert(n, mod);
  231. }
  232. public void ReplaceModule(MacroModule old, MacroModule module) {
  233. int i = _entries.IndexOf(old);
  234. Debug.Assert(i!=-1);
  235. _entries[i] = module;
  236. }
  237. //奐巒偼Execute偺拞偐傜屇偽傟丄廔椆偼InterThreadUIService宱桼偱捠抦偝傟傞
  238. private void IndicateMacroStarted() {
  239. GApp.Frame.RefreshConnection(GEnv.Connections.ActiveTag);
  240. GApp.Frame.MenuMacroStop.Enabled = true;
  241. if(_macroListener!=null)
  242. _macroListener.IndicateMacroStarted();
  243. }
  244. public void IndicateMacroFinished() {
  245. _runningMacro = null;
  246. GApp.Frame.RefreshConnection(GEnv.Connections.ActiveTag);
  247. GApp.Frame.MenuMacroStop.Enabled = false;
  248. if(_macroListener!=null)
  249. _macroListener.IndicateMacroFinished();
  250. foreach(ConnectionTag ct in GEnv.Connections)
  251. ct.Terminal.ClearMacroBuffer();
  252. }
  253. public void Load(ConfigNode parent) {
  254. ConfigNode node = parent.FindChildConfigNode("macro");
  255. if(node==null)
  256. SetDefault();
  257. else {
  258. ConfigNode var = node.FindChildConfigNode("variables");
  259. if(var!=null) 
  260. _environmentVariables = var.InnerHashtable;
  261. foreach(ConfigNode ch in node.Children) {
  262. if(ch.Name=="module") {
  263. MacroModule m = new MacroModule(_entries.Count);
  264. m.Load(ch);
  265. _entries.Add(m);
  266. }
  267. }
  268. }
  269. }
  270. public void SetDefault() {
  271. InitSample();
  272. }
  273. public void Save(ConfigNode parent) {
  274. ConfigNode node = new ConfigNode("macro");
  275. if(_environmentVariables.Count>0) {
  276. ConfigNode variables = new ConfigNode("variables");
  277. IDictionaryEnumerator de = _environmentVariables.GetEnumerator();
  278. while(de.MoveNext())
  279. variables[(string)de.Key] = (string)de.Value;
  280. node.AddChild(variables);
  281. }
  282. foreach(MacroModule mod in _entries)
  283. mod.Save(node);
  284. parent.AddChild(node);
  285. }
  286. private void InitSample() {
  287. string b = AppDomain.CurrentDomain.BaseDirectory + "macrosample\";
  288. MacroModule hello = new MacroModule(0);
  289. hello.Title = GApp.Strings.GetString("Caption.MacroModule.SampleTitleHelloWorld");
  290. hello.Path = b + "helloworld.js";
  291. GApp.Options.Commands.AddEntry(new Commands.MacroEntry(hello.Title, Keys.None, Keys.None, hello.Index));
  292. _entries.Add(hello);
  293. MacroModule telnet = new MacroModule(1);
  294. telnet.Title = GApp.Strings.GetString("Caption.MacroModule.SampleTitleAutoTelnet");
  295. telnet.Path = b + "telnet.js";
  296. GApp.Options.Commands.AddEntry(new Commands.MacroEntry(telnet.Title, Keys.None, Keys.None, telnet.Index));
  297. _entries.Add(telnet);
  298. MacroModule bashrc = new MacroModule(2);
  299. bashrc.Title = GApp.Strings.GetString("Caption.MacroModule.SampleTitleOpenBashrc");
  300. bashrc.Path = b + "bashrc.js";
  301. GApp.Options.Commands.AddEntry(new Commands.MacroEntry(bashrc.Title, Keys.None, Keys.None, bashrc.Index));
  302. _entries.Add(bashrc);
  303. }
  304. public void ReloadLanguage() {
  305. string b = AppDomain.CurrentDomain.BaseDirectory + "macrosample\";
  306. string helloworld = b + "helloworld.js";
  307. string autotelnet = b + "telnet.js";
  308. string openbashrc = b + "bashrc.js";
  309. foreach(MacroModule mod in _entries) {
  310. if(mod.Path==helloworld)
  311. mod.Title = GApp.Strings.GetString("Caption.MacroModule.SampleTitleHelloWorld");
  312. else if(mod.Path==autotelnet)
  313. mod.Title = GApp.Strings.GetString("Caption.MacroModule.SampleTitleAutoTelnet");
  314. else if(mod.Path==openbashrc)
  315. mod.Title = GApp.Strings.GetString("Caption.MacroModule.SampleTitleOpenBashrc");
  316. }
  317. }
  318. }
  319. }