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

Telnet服务器

开发平台:

C#

  1. /*
  2. * Copyright (c) 2005 Poderosa Project, All Rights Reserved.
  3. * $Id: Util.cs,v 1.2 2005/04/20 08:45:48 okajima Exp $
  4. */
  5. using System;
  6. using System.Collections;
  7. using System.Drawing;
  8. using System.Diagnostics;
  9. using System.Text;
  10. using System.Text.RegularExpressions;
  11. using System.Windows.Forms;
  12. using System.Runtime.InteropServices;
  13. using System.IO;
  14. using System.Globalization;
  15. using System.Threading;
  16. using Poderosa.Config;
  17. using Granados.SSHC;
  18. using Granados.PKI;
  19. namespace Poderosa
  20. {
  21. public class GUtil {
  22. public static bool ParseBool(string value, bool defaultvalue) {
  23. try {
  24. return Boolean.Parse(value);
  25. }
  26. catch(Exception) {
  27. return defaultvalue;
  28. }
  29. }
  30. public static byte ParseByte(string value, byte defaultvalue) {
  31. try {
  32. return Byte.Parse(value);
  33. }
  34. catch(Exception) {
  35. return defaultvalue;
  36. }
  37. }
  38. public static int ParseInt(string value, int defaultvalue) {
  39. try {
  40. return Int32.Parse(value);
  41. }
  42. catch(Exception) {
  43. return defaultvalue;
  44. }
  45. }
  46. public static float ParseFloat(string value, float defaultvalue) {
  47. try {
  48. return Single.Parse(value);
  49. }
  50. catch(Exception) {
  51. return defaultvalue;
  52. }
  53. }
  54. public static int ParseHexInt(string value, int defaultvalue) {
  55. try {
  56. return Int32.Parse(value, System.Globalization.NumberStyles.HexNumber);
  57. }
  58. catch(Exception) {
  59. return defaultvalue;
  60. }
  61. }
  62. public static Color ParseColor(string t, Color defaultvalue) {
  63. if(t==null || t.Length==0)
  64. return defaultvalue;
  65. else {
  66. if(t.Length==8) { //16恑偱曐懚偝傟偰偄傞偙偲傕偁傞丅媷梋偺嶔偱偙偺傛偆偵
  67. try {
  68. int v = Int32.Parse(t, System.Globalization.NumberStyles.HexNumber);
  69. return Color.FromArgb(v);
  70. }
  71. catch(Exception) {
  72. }
  73. }
  74. return Color.FromName(t);
  75. }
  76. }
  77. public static ValueType ParseEnum(Type enumtype, string t, ValueType defaultvalue) {
  78. try {
  79. if(t==null || t.Length==0)
  80. return (ValueType)Enum.ToObject(enumtype, (int)defaultvalue);
  81. else
  82. return (ValueType)Enum.Parse(enumtype, t, false);
  83. }
  84. catch(Exception) {
  85. return (ValueType)Enum.ToObject(enumtype, (int)defaultvalue);
  86. }
  87. }
  88. public static ValueType ParseMultipleEnum(Type enumtype, string t, ValueType defaultvalue) {
  89. try {
  90. int r = 0;
  91. foreach(string a in t.Split(','))
  92. r |= (int)Enum.Parse(enumtype, a, false);
  93. return r;
  94. }
  95. catch(FormatException) {
  96. return defaultvalue;
  97. }
  98. }
  99. public static Language CurrentLanguage {
  100. get {
  101. return CultureInfo.CurrentUICulture.Name.StartsWith("ja")? Language.Japanese : Language.English;
  102. }
  103. }
  104. public static Font CreateFont(string name, float size) {
  105. bool flag = false;
  106. do {
  107. try {
  108. return new Font(name, size);
  109. }
  110. catch(ArithmeticException) {
  111. //JSPager偺審偱懳墳丅msvcr71偑儘乕僪偱偒側偄娐嫬傕偁傞偐傕偟傟側偄偺偱椺奜傪傕傜偭偰偼偠傔偰屇傇傛偆偵偡傞
  112. if(!flag) {
  113. Win32.ClearFPUOverflowFlag();
  114. flag = true;
  115. }
  116. else //婛偵幚峴偟偰偩傔側傜偁偒傜傔傞
  117. throw;
  118. }
  119. } while(true);
  120. }
  121. public static string FileToDir(string filename) {
  122. int n = filename.LastIndexOf('\');
  123. if(n==-1) throw new FormatException("filename does not include \");
  124. return filename.Substring(0, n);
  125. }
  126. public static void Warning(IWin32Window owner, string msg, string caption) {
  127. MessageBox.Show(owner, msg, caption, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
  128. }
  129. public static void Warning(IWin32Window owner, string msg, MessageBoxIcon icon) {
  130. MessageBox.Show(owner, msg, GEnv.Strings.GetString("Common.MessageBoxTitle"), MessageBoxButtons.OK, icon);
  131. }
  132. public static void Warning(IWin32Window owner, string msg) {
  133. MessageBox.Show(owner, msg, GEnv.Strings.GetString("Common.MessageBoxTitle"), MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
  134. }
  135. public static DialogResult AskUserYesNo(IWin32Window owner, string msg) {
  136. return MessageBox.Show(owner, msg, GEnv.Strings.GetString("Common.MessageBoxTitle"), MessageBoxButtons.YesNo, MessageBoxIcon.Question);
  137. }
  138. public static DialogResult AskUserYesNo(IWin32Window owner, string msg, MessageBoxIcon icon) {
  139. return MessageBox.Show(owner, msg, GEnv.Strings.GetString("Common.MessageBoxTitle"), MessageBoxButtons.YesNo, icon);
  140. }
  141. public static void ReportCriticalError(Exception ex) {
  142. InternalReportCriticalError(" [regular] ", ex);
  143. }
  144. public static void ReportThreadException(Exception ex) {
  145. InternalReportCriticalError(" [ThreadException] ", ex);
  146. }
  147. private static void InternalReportCriticalError(string remark, Exception ex) {
  148. Debug.WriteLine(remark);
  149. Debug.WriteLine(ex.Message);
  150. Debug.WriteLine(ex.StackTrace);
  151. //僄儔乕僼傽僀儖偵捛婰
  152. string dir = null;
  153. StreamWriter sw = GetDebugLog(ref dir);
  154. sw.WriteLine(DateTime.Now.ToString() + remark + ex.Message);
  155. sw.WriteLine(ex.StackTrace);
  156. //inner exception傪弴師
  157. Exception i = ex.InnerException;
  158. while(i!=null) {
  159. sw.WriteLine("[inner] " + i.Message);
  160. sw.WriteLine(i.StackTrace);
  161. i = i.InnerException;
  162. }
  163. sw.Close();
  164. //儊僢僙乕僕儃僢僋僗偱捠抦丅
  165. //偩偑偙偺拞偱椺奜偑敪惗偡傞偙偲偑SP1偱偼偁傞傜偟偄丅偟偐傕偦偆側傞偲傾僾儕偑嫮惂廔椆偩丅
  166. //Win32偺儊僢僙乕僕儃僢僋僗傪弌偟偰傕摨偠丅僗僥乕僞僗僶乕側傜戝忎晇偺傛偆偩
  167. //...偟偐偟丄偦傟偱傕NullReferenceException偁傞偄偼ExecutionEngineException(!)偑敪惗偡傞応崌偑偁傞丅Win32屇傃弌偟偱傕偩傔偩偲傕偆庤弌偟偱偒傫側丅偁偒傜傔偰僐儊儞僩傾僂僩
  168. try {
  169. string msg = String.Format(GEnv.Strings.GetString("Message.GUtil.InternalError"), dir, ex.Message);
  170. //MessageBox.Show(GEnv.Frame, String.Format(GEnv.Strings.GetString("Message.GUtil.InternalError"), dir, ex.Message), "Poderosa", MessageBoxButtons.OK, MessageBoxIcon.Stop);
  171. //Win32.MessageBox(IntPtr.Zero, msg, "Poderosa", 0x00000010/*MB_HAND*/);
  172. GEnv.Frame.SetStatusBarText(msg);
  173. }
  174. catch(Exception ex2) {
  175. Debug.WriteLine(ex2.Message);
  176. Debug.WriteLine(ex2.StackTrace);
  177. }
  178. }
  179. private static StreamWriter GetDebugLog(ref string dir) {
  180. try {
  181. dir = AppDomain.CurrentDomain.BaseDirectory;
  182. return new StreamWriter(dir + "\error.log", true, Encoding.Default);
  183. }
  184. catch(Exception) {
  185. dir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\Poderosa";
  186. if(!Directory.Exists(dir)) Directory.CreateDirectory(dir);
  187. return new StreamWriter(dir + "\error.log", true, Encoding.Default);
  188. }
  189. }
  190. private static StreamWriter _debugLog = null;
  191. public static void WriteDebugLog(string data) {
  192. string dir = null;
  193. if(_debugLog==null) _debugLog = GetDebugLog(ref dir);
  194. _debugLog.WriteLine(data);
  195. _debugLog.Flush();
  196. }
  197. //師偵愝掕偡傋偒儘僌偺僼傽僀儖柤 host偑null偩偲偦偙偼嬻敀偵側傞
  198. public static string CreateLogFileName(string host) {
  199. DateTime now = DateTime.Now;
  200. string date = String.Format("{0}{1,2:D2}{2,2:D2}", now.Year, now.Month, now.Day);
  201. string basefile;
  202. if(host==null || host.Length==0)
  203. basefile = String.Format("{0}\{1}", GEnv.Options.DefaultLogDirectory, date);
  204. else {
  205. if(host.StartsWith("rsp://"))
  206. host = host.Substring(6); //rsp://偺偁偲偺暥帤楍
  207. basefile = String.Format("{0}\{1}_{2}", GEnv.Options.DefaultLogDirectory, ReplaceBadPathChar(host), date);
  208. }
  209. int n = 1;
  210. do {
  211. string filename;
  212. if(n==1)
  213. filename = String.Format("{0}.log", basefile);
  214. else
  215. filename = String.Format("{0}_{1}.log", basefile, n);
  216. if(!File.Exists(filename))
  217. return filename;
  218. else
  219. n++;
  220. } while(true);
  221. }
  222. public static string ReplaceBadPathChar(string src) {
  223. char ch = '_';
  224. return src.Replace('\', ch).Replace('/', ch).Replace(':', ch).Replace(';', ch).
  225. Replace(',', ch).Replace('*', ch).Replace('?', ch).Replace('"', ch).
  226. Replace('<', ch).Replace('>', ch).Replace('|', ch);
  227. }
  228. public static void WriteNameValue(TextWriter wr, string name, string value) {
  229. wr.Write(name);
  230. wr.Write('=');
  231. wr.WriteLine(value);
  232. }
  233. public static string[] EncodingDescription(Encoding[] src) {
  234. string[] t = new string[src.Length];
  235. for(int i=0; i<src.Length; i++)
  236. t[i] = src[i].WebName;
  237. return t;
  238. }
  239. public static bool IsCursorKey(Keys key) {
  240. return key==Keys.Left || key==Keys.Right || key==Keys.Up || key==Keys.Down;
  241. }
  242. //KeyString偺媡曄姺丂KeyConverter偺幚憰偼巰偸傎偳抶偄
  243. public static Keys ParseKey(string s) {
  244. if(s.Length==0)
  245. return Keys.None;
  246. else if(s.Length==1) {
  247. char ch = s[0];
  248. if('0'<=ch && ch<='9')
  249. return Keys.D0 + (ch - '0');
  250. else
  251. return (Keys)Enum.Parse(typeof(Keys), s);
  252. }
  253. else
  254. return (Keys)Enum.Parse(typeof(Keys), s);
  255. }
  256. public static Keys ParseKey(string[] value) { //modifier崬傒偱僷乕僗
  257. Keys modifier = Keys.None;
  258. for(int i=0; i<value.Length-1; i++) { //嵟屻埲奜
  259. string m = value[i];
  260. if(m=="Alt") modifier |= Keys.Alt;
  261. else if(m=="Shift") modifier |= Keys.Shift;
  262. else if(m=="Ctrl")  modifier |= Keys.Control;
  263. else throw new Exception(m + " is unknown modifier");
  264. }
  265. return modifier | GUtil.ParseKey(value[value.Length-1]);
  266. }
  267. //僉乕偐傜懳墳偡傞僐儞僩儘乕儖僐乕僪(ASCII 0 偐傜 31傑偱)偵曄姺偡傞丅懳墳偡傞傕偺偑側偗傟偽-1
  268. public static int KeyToControlCode(Keys key) {
  269. Keys modifiers = key & Keys.Modifiers;
  270. Keys body      = key & Keys.KeyCode;
  271. if(modifiers == Keys.Control) {
  272. int ib = (int)body;
  273. if((int)Keys.A <= ib && ib <= (int)Keys.Z)
  274. return ib - (int)Keys.A + 1;
  275. else if(body==Keys.Space)
  276. return 0;
  277. else
  278. return -1;
  279. }
  280. else
  281. return -1;
  282. }
  283. public static Thread CreateThread(ThreadStart st) {
  284. Thread t = new Thread(st);
  285. //t.ApartmentState = ApartmentState.STA;
  286.             t.SetApartmentState(ApartmentState.STA);
  287. return t;
  288. }
  289. public static DialogResult ShowModalDialog(IPoderosaContainer c, Form dialog) {
  290. Form parent = c.AsForm();
  291. parent.Enabled = false;
  292. DialogResult r = dialog.ShowDialog(parent);
  293. parent.Enabled = true;
  294. dialog.Dispose();
  295. return r;
  296. }
  297. }
  298. }