using System; using System.Collections; using System.Globalization; using System.IO; using System.Text; namespace Microsoft.Globalization.Tools.KeyboardLayoutCreator { internal class KeyboardTextFile { private string[] KeyWords = new string[] { "KBD", "VERSION", "COPYRIGHT", "COMPANY", "LOCALEID", "LOCALENAME", "MODIFIERS", "SHIFTSTATE", "ATTRIBUTES", "LAYOUT", "DEADKEY", "LIGATURE", "KEYNAME", "KEYNAME_EXT", "KEYNAME_DEAD", "DESCRIPTIONS", "LANGUAGENAMES", "ENDKBD" }; private string m_stFileName; private string m_stFile = ""; private string m_stCompany; private string m_stCopyright; private string m_stLocaleId; private string m_stLocaleName; private string m_stVersion; private string m_stName; private string m_stDescription; private ArrayList m_alModifiers = new ArrayList(); private ArrayList m_alKeyName = new ArrayList(); private ArrayList m_alKeyName_Ext = new ArrayList(); private ArrayList m_alKeyName_Dead = new ArrayList(); private ArrayList m_alShiftState; private ArrayList m_alLigature; private ArrayList m_alAttributes; private ArrayList m_alDeadKeys; private ArrayList m_alDescriptions; private ArrayList m_alLanguageNames; private SortedList m_slLayout = new SortedList(); internal string LOCALEID { get { if (this.m_stLocaleId == null || this.m_stLocaleId.Length == 0) { this.m_stLocaleId = ""; int length = "LOCALEID".Length; int num = this.m_stFile.IndexOf("LOCALEID"); if (num != -1) { int num2 = this.m_stFile.IndexOf('\r', num + 1); if (num2 != -1) { string text = this.m_stFile.Substring(num + length, num2 - num - length); this.m_stLocaleId = text.Trim(new char[] { ' ', '"' }); } } this.m_stLocaleId = "00000000" + this.m_stLocaleId; this.m_stLocaleId = this.m_stLocaleId.Substring(this.m_stLocaleId.Length - 8); } return this.m_stLocaleId; } } internal string LOCALENAME { get { if (this.m_stLocaleName == null) { int length = "LOCALENAME".Length; int num = this.m_stFile.IndexOf("LOCALENAME"); if (num != -1) { int num2 = this.m_stFile.IndexOf('\r', num + 1); if (num2 != -1) { string text = this.m_stFile.Substring(num + length, num2 - num - length); this.m_stLocaleName = text.Trim(new char[] { ' ', '"' }); } } if (this.m_stLocaleName == null) { this.m_stLocaleName = ""; } } return this.m_stLocaleName; } } internal string COPYRIGHT { get { if (this.m_stCopyright == null) { int length = "COPYRIGHT".Length; int num = this.m_stFile.IndexOf("COPYRIGHT"); if (num != -1) { int num2 = this.m_stFile.IndexOf('\r', num + 1); if (num2 != -1) { string text = this.m_stFile.Substring(num + length, num2 - num - length); this.m_stCopyright = text.Trim(new char[] { ' ', '"' }); } } if (this.m_stCopyright == null) { this.m_stCopyright = ""; } } return this.m_stCopyright; } } internal string COMPANY { get { if (this.m_stCompany == null) { int length = "COMPANY".Length; int num = this.m_stFile.IndexOf("COMPANY"); if (num != -1) { int num2 = this.m_stFile.IndexOf('\r', num + 1); if (num2 != -1) { string text = this.m_stFile.Substring(num + length, num2 - num - length); this.m_stCompany = text.Trim(new char[] { ' ', '"' }); } } if (this.m_stCompany == null) { this.m_stCompany = ""; } } return this.m_stCompany; } } internal string VERSION { get { if (this.m_stVersion == null) { int length = "VERSION".Length; int num = this.m_stFile.IndexOf("VERSION"); if (num != -1) { int num2 = this.m_stFile.IndexOf('\r', num + 1); if (num2 != -1) { string text = this.m_stFile.Substring(num + length, num2 - num - length); this.m_stVersion = text.Trim(new char[] { ' ', '"' }); } } if (this.m_stVersion == null) { this.m_stVersion = ""; } } return this.m_stVersion; } } internal string NAME { get { if (this.m_stName == null) { this.FillHeaderVariables(); } return this.m_stName; } } internal string DESCRIPTION { get { if (this.m_stDescription == null) { this.FillHeaderVariables(); } return this.m_stDescription; } } internal ArrayList MODIFIERS { get { if (this.m_alModifiers == null || this.m_alModifiers.Count == 0) { int length = "MODIFIERS".Length; int num = this.m_stFile.IndexOf("MODIFIERS"); if (num != -1) { int num2 = this.NextKeyword(num + length); if (num2 != -1) { string text = this.m_stFile.Substring(num + length, num2 - num - length); do { int num3 = text.IndexOf(' '); if (num3 != -1) { this.m_alModifiers.Add(new ValuePair(text.Substring(0, num3 - 1).TrimStart(new char[0]), text.Substring(num3 + 1).Trim(new char[] { ' ', '"' }))); } text = text.Substring(text.IndexOf('\r') + 2); } while (text.Length > 0); } } int arg_E0_0 = this.m_alModifiers.Count; } return this.m_alModifiers; } } internal ArrayList SHIFTSTATE { get { if (this.m_alShiftState == null || this.m_alShiftState.Count == 0) { int length = "SHIFTSTATE".Length; int num = this.m_stFile.IndexOf("SHIFTSTATE"); this.m_alShiftState = new ArrayList(); if (num != -1) { int num2 = this.NextKeyword(num + length); if (num2 != -1) { string text = this.m_stFile.Substring(num + length, num2 - num - length); string[] array = text.Split(new char[] { '\r' }); for (int i = 0; i < array.Length; i++) { array[i] = array[i].Trim(); if (array[i] != null && array[i].Length > 0) { int num3 = array[i].IndexOf(";"); if (num3 != -1 && num3 != 0) { array[i] = array[i].Substring(0, num3 - 1); this.m_alShiftState.Add(Convert.ToByte(array[i], Utilities.s_nfi)); } else { this.m_alShiftState.Add(Convert.ToByte(array[i], Utilities.s_nfi)); } } } this.m_alShiftState.TrimToSize(); } } int arg_145_0 = this.m_alShiftState.Count; } return this.m_alShiftState; } } internal SortedList LAYOUT { get { if (this.m_slLayout == null || this.m_slLayout.Count == 0) { int length = "LAYOUT".Length; int num = this.m_stFile.IndexOf("LAYOUT"); if (num != -1) { int num2 = this.NextKeyword(num + length); if (num2 != -1) { string text = this.m_stFile.Substring(num + length, num2 - num - length); string[] array = text.Split(new char[] { '\r' }); for (int i = 0; i < array.Length; i++) { array[i] = array[i].Trim(); if (array[i].Length > 0 && array[i][0] != ';') { string[] array2 = array[i].Split(new char[] { ' ' }); if (array2.Length >= 2) { LayoutRow layoutRow = null; if (array2.Length > 2) { layoutRow = new LayoutRow(array2[1], array2[0]); if (array2[2].Equals("SGCap")) { layoutRow.CapsInfo = 0; layoutRow.SGCap = true; } else { layoutRow.CapsInfo = byte.Parse(array2[2], NumberStyles.AllowHexSpecifier, Utilities.s_nfi); } for (int j = 3; j < array2.Length; j++) { layoutRow.AddCharValue(array2[j]); } if (layoutRow.SGCap) { layoutRow.AddCharValue(65535u); i++; string[] array3 = array[i].TrimStart(new char[] { ' ' }).Split(new char[] { ' ' }); for (int k = 3; k < array3.Length; k++) { if (array3[k].Length > 0) { layoutRow.AddCharValue(array3[k]); } } } } if (layoutRow != null && !this.m_slLayout.ContainsKey(layoutRow.Vk) && array2.Length > 2) { this.m_slLayout.Add(layoutRow.Vk, layoutRow); } } } } } } if (this.m_slLayout != null) { int arg_227_0 = this.m_slLayout.Count; } } return this.m_slLayout; } } internal ArrayList LIGATURE { get { if (this.m_alLigature == null || this.m_alLigature.Count == 0) { int length = "LIGATURE".Length; int num = this.m_stFile.IndexOf("LIGATURE"); this.m_alLigature = new ArrayList(); if (num != -1) { int num2 = this.NextKeyword(num + length); if (num2 != -1) { string text = this.m_stFile.Substring(num + length, num2 - num - length); string[] array = text.Split(new char[] { '\r' }); for (int i = 0; i < array.Length; i++) { array[i] = array[i].Trim(); if (array[i].Length > 0 && array[i][0] != ';') { string[] array2 = array[i].Split(new char[] { ' ' }); if (array2.Length >= 4) { byte mod = (byte)this.SHIFTSTATE[(int)byte.Parse(array2[1], CultureInfo.InvariantCulture)]; LigatureRow value; if (array2.Length == 4) { value = new LigatureRow(array2[0], mod, new string[] { array2[2], array2[3] }); } else { if (array2.Length == 5) { value = new LigatureRow(array2[0], mod, new string[] { array2[2], array2[3], array2[4] }); } else { value = new LigatureRow(array2[0], mod, new string[] { array2[2], array2[3], array2[4], array2[5] }); } } this.m_alLigature.Add(value); } } } this.m_alLigature.TrimToSize(); } } int arg_1D6_0 = this.m_alLigature.Count; } return this.m_alLigature; } } internal ArrayList ATTRIBUTES { get { if (this.m_alAttributes == null || this.m_alAttributes.Count == 0) { int length = "ATTRIBUTES".Length; int num = this.m_stFile.IndexOf("ATTRIBUTES"); this.m_alAttributes = new ArrayList(); if (num != -1) { int num2 = this.NextKeyword(num + length); if (num2 != -1) { string text = this.m_stFile.Substring(num + length, num2 - num - length); string[] array = text.Split(new char[] { '\r' }); for (int i = 0; i < array.Length; i++) { array[i] = array[i].Trim(); if (array[i].Length > 0 && array[i][0] != ';') { this.m_alAttributes.Add(array[i]); } } this.m_alAttributes.TrimToSize(); } } int arg_E8_0 = this.m_alAttributes.Count; } return this.m_alAttributes; } } internal ArrayList KEYNAME { get { if (this.m_alKeyName == null) { this.m_alKeyName = new ArrayList(); } if (this.m_stFile.Length > 0 && this.m_alKeyName.Count == 0) { int length = "KEYNAME".Length; int num = this.m_stFile.IndexOf("KEYNAME"); if (num != -1) { int num2 = this.NextKeyword(num + length); if (num2 != -1) { string text = this.m_stFile.Substring(num + length, num2 - num - length); string[] array = text.Split(new char[] { '\r' }); for (int i = 0; i < array.Length; i++) { array[i] = array[i].Trim(); if (array[i].Length > 0 && array[i][0] != ';') { int num3 = array[i].IndexOf(' ', 1); if (num3 != -1) { this.m_alKeyName.Add(new ValuePair(array[i].Substring(0, num3), array[i].Substring(num3 + 1).Trim(new char[] { ' ' }))); } } } } } } if (this.m_alKeyName.Count == 0) { this.m_alKeyName.Add(new ValuePair("01", "Esc")); this.m_alKeyName.Add(new ValuePair("0e", "Backspace")); this.m_alKeyName.Add(new ValuePair("0f", "Tab")); this.m_alKeyName.Add(new ValuePair("1c", "Enter")); this.m_alKeyName.Add(new ValuePair("1d", "Ctrl")); this.m_alKeyName.Add(new ValuePair("2a", "Shift")); this.m_alKeyName.Add(new ValuePair("36", "\"Right Shift\"")); this.m_alKeyName.Add(new ValuePair("37", "\"Num *\"")); this.m_alKeyName.Add(new ValuePair("38", "Alt")); this.m_alKeyName.Add(new ValuePair("39", "Space")); this.m_alKeyName.Add(new ValuePair("3a", "\"Caps Lock\"")); this.m_alKeyName.Add(new ValuePair("3b", "F1")); this.m_alKeyName.Add(new ValuePair("3c", "F2")); this.m_alKeyName.Add(new ValuePair("3d", "F3")); this.m_alKeyName.Add(new ValuePair("3e", "F4")); this.m_alKeyName.Add(new ValuePair("3f", "F5")); this.m_alKeyName.Add(new ValuePair("40", "F6")); this.m_alKeyName.Add(new ValuePair("41", "F7")); this.m_alKeyName.Add(new ValuePair("42", "F8")); this.m_alKeyName.Add(new ValuePair("43", "F9")); this.m_alKeyName.Add(new ValuePair("44", "F10")); this.m_alKeyName.Add(new ValuePair("45", "Pause")); this.m_alKeyName.Add(new ValuePair("46", "\"Scroll Lock\"")); this.m_alKeyName.Add(new ValuePair("47", "\"Num 7\"")); this.m_alKeyName.Add(new ValuePair("48", "\"Num 8\"")); this.m_alKeyName.Add(new ValuePair("49", "\"Num 9\"")); this.m_alKeyName.Add(new ValuePair("4a", "\"Num -\"")); this.m_alKeyName.Add(new ValuePair("4b", "\"Num 4\"")); this.m_alKeyName.Add(new ValuePair("4c", "\"Num 5\"")); this.m_alKeyName.Add(new ValuePair("4d", "\"Num 6\"")); this.m_alKeyName.Add(new ValuePair("4e", "\"Num +\"")); this.m_alKeyName.Add(new ValuePair("4f", "\"Num 1\"")); this.m_alKeyName.Add(new ValuePair("50", "\"Num 2\"")); this.m_alKeyName.Add(new ValuePair("51", "\"Num 3\"")); this.m_alKeyName.Add(new ValuePair("52", "\"Num 0\"")); this.m_alKeyName.Add(new ValuePair("53", "\"Num Del\"")); this.m_alKeyName.Add(new ValuePair("54", "\"Sys Req\"")); this.m_alKeyName.Add(new ValuePair("57", "F11")); this.m_alKeyName.Add(new ValuePair("58", "F12")); this.m_alKeyName.Add(new ValuePair("7c", "F13")); this.m_alKeyName.Add(new ValuePair("7d", "F14")); this.m_alKeyName.Add(new ValuePair("7e", "F15")); this.m_alKeyName.Add(new ValuePair("7f", "F16")); this.m_alKeyName.Add(new ValuePair("80", "F17")); this.m_alKeyName.Add(new ValuePair("81", "F18")); this.m_alKeyName.Add(new ValuePair("82", "F19")); this.m_alKeyName.Add(new ValuePair("83", "F20")); this.m_alKeyName.Add(new ValuePair("84", "F21")); this.m_alKeyName.Add(new ValuePair("85", "F22")); this.m_alKeyName.Add(new ValuePair("86", "F23")); this.m_alKeyName.Add(new ValuePair("87", "F24")); } return this.m_alKeyName; } } internal ArrayList KEYNAME_EXT { get { if (this.m_alKeyName_Ext == null) { this.m_alKeyName_Ext = new ArrayList(); } if (this.m_stFile.Length > 0 && this.m_alKeyName_Ext.Count == 0) { int length = "KEYNAME_EXT".Length; int num = this.m_stFile.IndexOf("KEYNAME_EXT"); if (num != -1) { int num2 = this.NextKeyword(num + length); if (num2 != -1) { string text = this.m_stFile.Substring(num + length, num2 - num - length); string[] array = text.Split(new char[] { '\r' }); for (int i = 0; i < array.Length; i++) { array[i] = array[i].Trim(); if (array[i].Length > 0 && array[i][0] != ';') { int num3 = array[i].IndexOf(' ', 1); if (num3 != -1) { this.m_alKeyName_Ext.Add(new ValuePair(array[i].Substring(0, num3), array[i].Substring(num3 + 1).Trim(new char[] { ' ' }))); } } } } } } if (this.m_alKeyName_Ext.Count == 0) { this.m_alKeyName_Ext.Add(new ValuePair("1c", "\"Num Enter\"")); this.m_alKeyName_Ext.Add(new ValuePair("1d", "\"Right Ctrl\"")); this.m_alKeyName_Ext.Add(new ValuePair("35", "\"Num /\"")); this.m_alKeyName_Ext.Add(new ValuePair("37", "\"Prnt Scrn\"")); this.m_alKeyName_Ext.Add(new ValuePair("38", "\"Right Alt\"")); this.m_alKeyName_Ext.Add(new ValuePair("45", "\"Num Lock\"")); this.m_alKeyName_Ext.Add(new ValuePair("46", "Break")); this.m_alKeyName_Ext.Add(new ValuePair("47", "Home")); this.m_alKeyName_Ext.Add(new ValuePair("48", "Up")); this.m_alKeyName_Ext.Add(new ValuePair("49", "\"Page Up\"")); this.m_alKeyName_Ext.Add(new ValuePair("4b", "Left")); this.m_alKeyName_Ext.Add(new ValuePair("4d", "Right")); this.m_alKeyName_Ext.Add(new ValuePair("4f", "End")); this.m_alKeyName_Ext.Add(new ValuePair("50", "Down")); this.m_alKeyName_Ext.Add(new ValuePair("51", "\"Page Down\"")); this.m_alKeyName_Ext.Add(new ValuePair("52", "Insert")); this.m_alKeyName_Ext.Add(new ValuePair("53", "Delete")); this.m_alKeyName_Ext.Add(new ValuePair("54", "<00>")); this.m_alKeyName_Ext.Add(new ValuePair("56", "Help")); this.m_alKeyName_Ext.Add(new ValuePair("5b", "\"Left Windows\"")); this.m_alKeyName_Ext.Add(new ValuePair("5c", "\"Right Windows\"")); this.m_alKeyName_Ext.Add(new ValuePair("5d", "Application")); } return this.m_alKeyName_Ext; } } internal ArrayList KEYNAME_DEAD { get { if (this.m_stFile.Length > 0 && this.m_alKeyName_Dead.Count == 0) { int length = "KEYNAME_DEAD".Length; int num = this.m_stFile.IndexOf("KEYNAME_DEAD"); if (num != -1) { int num2 = this.NextKeyword(num + length); if (num2 != -1) { string text = this.m_stFile.Substring(num + length, num2 - num - length); string[] array = text.Split(new char[] { '\r' }); for (int i = 0; i < array.Length; i++) { array[i] = array[i].Trim(); if (array[i].Length > 0 && array[i][0] != ';') { int num3 = array[i].IndexOf(' '); if (num3 > 0) { this.m_alKeyName_Dead.Add(new ValuePair(array[i].Substring(0, num3).Trim(), array[i].Substring(num3 + 1).Trim(new char[] { '"' }))); } } } } } if (this.m_alKeyName_Dead.Count == 0) { int arg_138_0 = this.DEADKEYS.Count; } } return this.m_alKeyName_Dead; } } internal ArrayList DEADKEYS { get { if (this.m_alDeadKeys == null || this.m_alDeadKeys.Count == 0) { int length = "DEADKEY".Length; int num = this.m_stFile.IndexOf("DEADKEY"); this.m_alDeadKeys = new ArrayList(); while (num != -1) { int num2 = this.NextKeyword(num + 1); string value = this.m_stFile.Substring(num + length, num2 - num - length); DeadKeyTable value2 = new DeadKeyTable(value); this.m_alDeadKeys.Add(value2); int startIndex = num2 - 1; num = this.m_stFile.IndexOf("DEADKEY", startIndex); } } int arg_99_0 = this.m_alDeadKeys.Count; return this.m_alDeadKeys; } } internal ArrayList DESCRIPTIONS { get { if (this.m_alDescriptions == null || this.m_alDescriptions.Count == 0) { this.m_alDescriptions = new ArrayList(); } if (this.m_stFile.Length > 0 && this.m_alDescriptions.Count == 0) { int length = "DESCRIPTIONS".Length; int num = this.m_stFile.IndexOf("DESCRIPTIONS"); if (num != -1) { int num2 = this.NextKeyword(num + length); if (num2 != -1) { string text = this.m_stFile.Substring(num + length, num2 - num - length); string[] array = text.Split(new char[] { '\r' }); for (int i = 0; i < array.Length; i++) { array[i] = array[i].Trim(); if (array[i].Length > 0 && array[i][0] != ';') { int num3 = array[i].IndexOf(' ', 1); if (num3 != -1) { this.m_alDescriptions.Add(new ValuePair(array[i].Substring(0, num3), array[i].Substring(num3 + 1).Trim(new char[] { ' ' }))); } } } } } } int arg_145_0 = this.m_alDescriptions.Count; return this.m_alDescriptions; } } internal ArrayList LANGUAGENAMES { get { if (this.m_alLanguageNames == null || this.m_alLanguageNames.Count == 0) { this.m_alLanguageNames = new ArrayList(); } if (this.m_stFile.Length > 0 && this.m_alLanguageNames.Count == 0) { int length = "LANGUAGENAMES".Length; int num = this.m_stFile.IndexOf("LANGUAGENAMES"); if (num != -1) { int num2 = this.NextKeyword(num + length); if (num2 != -1) { string text = this.m_stFile.Substring(num + length, num2 - num - length); string[] array = text.Split(new char[] { '\r' }); for (int i = 0; i < array.Length; i++) { array[i] = array[i].Trim(); if (array[i].Length > 0 && array[i][0] != ';') { int num3 = array[i].IndexOf(' ', 1); if (num3 != -1) { this.m_alLanguageNames.Add(new ValuePair(array[i].Substring(0, num3), array[i].Substring(num3 + 1).Trim(new char[] { ' ' }))); } } } } } } int arg_145_0 = this.m_alLanguageNames.Count; return this.m_alLanguageNames; } } internal KeyboardTextFile(string fileName, string name, string description, CultureInfo culture, string company, string copyright, UIntPtr localeId, VirtualKey[] vks, ArrayList alNames, ArrayList alExtNames, ArrayList alAttributes, ArrayList alDesciptions, ArrayList alLanguageNames) { int[] array = new int[] { -1, -1, -1, -1, -1, -1 }; bool[] array2 = new bool[256]; bool flag = false; StringBuilder stringBuilder = null; StringBuilder stringBuilder2 = null; StringBuilder stringBuilder3 = null; StringBuilder stringBuilder4 = null; StringBuilder stringBuilder5 = null; StringBuilder stringBuilder6 = null; SortedList sortedList = new SortedList(); int num = 0; this.m_alAttributes = alAttributes; this.m_alKeyName = alNames; this.m_alKeyName_Ext = alExtNames; this.m_alDescriptions = alDesciptions; this.m_alLanguageNames = alLanguageNames; if (fileName.Length == 0) { this.m_stFileName = name + ".txt"; } else { this.m_stFileName = fileName; } if (File.Exists(this.m_stFileName)) { File.Delete(this.m_stFileName); } StreamWriter streamWriter = new StreamWriter(this.m_stFileName, false, Encoding.Unicode); streamWriter.Write("KBD\t"); streamWriter.Write(name); streamWriter.Write("\t\""); streamWriter.Write(description); streamWriter.Write("\"\r\n"); streamWriter.WriteLine(); if (copyright.Length > 0) { streamWriter.Write("COPYRIGHT\t\""); streamWriter.Write(copyright); streamWriter.Write("\"\r\n"); streamWriter.WriteLine(); } streamWriter.Write("COMPANY\t\""); streamWriter.Write(company); streamWriter.Write("\"\r\n"); streamWriter.WriteLine(); streamWriter.Write("LOCALENAME\t\""); streamWriter.Write(culture.Name); streamWriter.Write("\"\r\n"); streamWriter.WriteLine(); streamWriter.Write("LOCALEID\t\""); streamWriter.Write(localeId.ToUInt32().ToString("x8", Utilities.s_nfi)); streamWriter.Write("\"\r\n"); streamWriter.WriteLine(); streamWriter.WriteLine("VERSION\t1.0\r\n"); if (this.m_alAttributes != null && this.m_alAttributes.Count > 0) { streamWriter.WriteLine("ATTRIBUTES"); for (int i = 0; i < this.m_alAttributes.Count; i++) { streamWriter.WriteLine((string)this.m_alAttributes[i]); } streamWriter.WriteLine(); } for (int j = 0; j < vks.Length; j++) { array2[j] = false; for (int k = 0; k < array.Length; k++) { ShiftState shiftState = vks[j].State(k); if (shiftState != null && shiftState.IsDefined) { if (shiftState.Characters.Length > 1 && shiftState.GetLayoutChar(num) == "%%") { flag = true; } array[k] = 0; array2[j] = true; if (num < k) { num = k; } } } string key = vks[j].ScanCode.ToString("x2", Utilities.s_nfi); if (array2[j] && !sortedList.ContainsKey(key)) { sortedList.Add(key, vks[j]); } } streamWriter.WriteLine("SHIFTSTATE\r\n"); int num2 = 3; stringBuilder3 = new StringBuilder(); stringBuilder4 = new StringBuilder(); if (-1 != array[0]) { num2++; stringBuilder3.Append("\t0"); stringBuilder4.Append("\t----"); streamWriter.Write("0\t//Column "); streamWriter.Write(num2.ToString(Utilities.s_nfi)); streamWriter.WriteLine(); } if (-1 != array[1]) { num2++; stringBuilder3.Append("\t1"); stringBuilder4.Append("\t----"); streamWriter.Write("1\t//Column "); streamWriter.Write(num2.ToString(Utilities.s_nfi)); streamWriter.Write(" : Shft"); streamWriter.WriteLine(); } array[2] = 0; if (-1 != array[2]) { num2++; stringBuilder3.Append("\t2"); stringBuilder4.Append("\t----"); streamWriter.Write("2\t//Column "); streamWriter.Write(num2.ToString(Utilities.s_nfi)); streamWriter.Write(" : Ctrl"); streamWriter.WriteLine(); } if (-1 != array[3]) { num2++; stringBuilder3.Append("\t3"); stringBuilder4.Append("\t----"); streamWriter.Write("3\t//Column "); streamWriter.Write(num2.ToString(Utilities.s_nfi)); streamWriter.Write(" : Shft Ctrl"); streamWriter.WriteLine(); } if (-1 != array[4]) { num2++; stringBuilder3.Append("\t6"); stringBuilder4.Append("\t----"); streamWriter.Write("6\t//Column "); streamWriter.Write(num2.ToString(Utilities.s_nfi)); streamWriter.Write(" : Ctrl Alt"); streamWriter.WriteLine(); } if (-1 != array[5]) { num2++; stringBuilder3.Append("\t7"); stringBuilder4.Append("\t----"); streamWriter.Write("7\t//Column "); streamWriter.Write(num2.ToString(Utilities.s_nfi)); streamWriter.Write(" : Shft Ctrl Alt"); streamWriter.WriteLine(); } streamWriter.WriteLine(); int num3 = 0; for (int l = 0; l < array.Length; l++) { if (-1 != array[l]) { array[l] = num3; num3++; } } streamWriter.WriteLine("LAYOUT\t\t;an extra '@' at the end is a dead key\r\n"); streamWriter.Write("//SC\tVK_\t\tCap"); streamWriter.Write(stringBuilder3.ToString()); streamWriter.WriteLine(); streamWriter.Write("//--\t----\t\t----"); streamWriter.Write(stringBuilder4.ToString()); streamWriter.WriteLine(); streamWriter.WriteLine(); VirtualKey virtualKey; for (int m = 0; m < sortedList.Count; m++) { virtualKey = (VirtualKey)sortedList.GetByIndex(m); if (virtualKey.VK != 110 && array2[(int)virtualKey.VK]) { stringBuilder3 = new StringBuilder(); stringBuilder3.Append(virtualKey.ScanCode.ToString("x2", Utilities.s_nfi)); stringBuilder3.Append('\t'); string text = Utilities.VkStringOfIvk((int)virtualKey.VK); stringBuilder3.Append(text); stringBuilder3.Append('\t'); if (text.Length < 6) { stringBuilder3.Append('\t'); } if (virtualKey.IsSgCaps || virtualKey.IsShiftSgCaps) { stringBuilder3.Append("SGCap"); stringBuilder4 = new StringBuilder(); stringBuilder4.Append("-1\t-1\t0\t"); } else { stringBuilder3.Append(((virtualKey.CapLok ? 1 : 0) + (virtualKey.AltGrCapLock ? 4 : 0)).ToString(Utilities.s_nfi)); } stringBuilder3.Append('\t'); stringBuilder = new StringBuilder(); stringBuilder.Append("// "); stringBuilder2 = new StringBuilder(); if (virtualKey.IsSgCaps || virtualKey.IsShiftSgCaps) { stringBuilder2.Append("// "); } for (int n = 0; n < array.Length; n++) { if (-1 != array[n]) { ShiftState shiftState = virtualKey.State(n); stringBuilder3.Append(shiftState.GetLayoutChar(num)); if (shiftState.IsDeadKey) { stringBuilder3.Append('@'); if (stringBuilder6 == null) { stringBuilder6 = new StringBuilder(); } stringBuilder6.Append(((ushort)shiftState.Characters[0]).ToString("x4", Utilities.s_nfi)); stringBuilder6.Append('\t'); stringBuilder6.Append('"'); stringBuilder6.Append(shiftState.CharacterName); stringBuilder6.Append('"'); stringBuilder6.Append("\r\n"); if (stringBuilder5 == null) { stringBuilder5 = new StringBuilder(); } stringBuilder5.Append("DEADKEY\t"); stringBuilder5.Append(((ushort)shiftState.Characters[0]).ToString("x4", Utilities.s_nfi)); stringBuilder5.Append("\r\n\r\n"); if (shiftState.DeadKeyPairs != null) { foreach (ValuePair valuePair in shiftState.DeadKeyPairs) { ushort value = Convert.ToUInt16(valuePair.Name, Utilities.s_nfi); ushort value2 = Convert.ToUInt16(valuePair.Value, Utilities.s_nfi); stringBuilder5.Append(value.ToString("x4", Utilities.s_nfi)); stringBuilder5.Append('\t'); stringBuilder5.Append(value2.ToString("x4", Utilities.s_nfi)); stringBuilder5.Append('\t'); stringBuilder5.Append("// "); stringBuilder5.Append((char)value); stringBuilder5.Append(" -> "); stringBuilder5.Append((char)value2); stringBuilder5.Append("\r\n"); } stringBuilder5.Append("\r\n"); } } stringBuilder3.Append('\t'); if (stringBuilder.Length > 3) { stringBuilder.Append(", "); } if (shiftState.CharacterName != null && shiftState.CharacterName.Length > 0) { stringBuilder.Append(shiftState.CharacterName); } else { stringBuilder.Append(""); } if ((virtualKey.IsSgCaps && n == 0) || (virtualKey.IsShiftSgCaps && n == 1)) { ShiftState shiftState2 = virtualKey.State((VirtualKey.SSEnum)(n + 8)); if (shiftState2 == null || shiftState2.Characters.Length == 0) { stringBuilder4.Append(shiftState.GetLayoutChar(num)); } else { stringBuilder4.Append(shiftState2.GetLayoutChar(num)); if (shiftState2.IsDeadKey) { stringBuilder4.Append('@'); if (stringBuilder6 == null) { stringBuilder6 = new StringBuilder(); } stringBuilder6.Append(((ushort)shiftState2.Characters[0]).ToString("x4", Utilities.s_nfi)); stringBuilder6.Append('\t'); stringBuilder6.Append('"'); stringBuilder6.Append(shiftState2.CharacterName); stringBuilder6.Append('"'); stringBuilder6.Append("\r\n"); if (stringBuilder5 == null) { stringBuilder5 = new StringBuilder(); } stringBuilder5.Append("DEADKEY\t"); stringBuilder5.Append(((ushort)shiftState2.Characters[0]).ToString("x4", Utilities.s_nfi)); stringBuilder5.Append("\r\n\r\n"); if (shiftState2.DeadKeyPairs != null) { foreach (ValuePair valuePair2 in shiftState2.DeadKeyPairs) { ushort value3 = Convert.ToUInt16(valuePair2.Name, Utilities.s_nfi); ushort value4 = Convert.ToUInt16(valuePair2.Value, Utilities.s_nfi); stringBuilder5.Append(value3.ToString("x4", Utilities.s_nfi)); stringBuilder5.Append('\t'); stringBuilder5.Append(value4.ToString("x4", Utilities.s_nfi)); stringBuilder5.Append('\t'); stringBuilder5.Append("// "); stringBuilder5.Append((char)value3); stringBuilder5.Append(" -> "); stringBuilder5.Append((char)value4); stringBuilder5.Append("\r\n"); } stringBuilder5.Append("\r\n"); } } if (virtualKey.IsSgCaps || virtualKey.IsShiftSgCaps) { stringBuilder4.Append('\t'); if (stringBuilder2.Length > 3) { stringBuilder2.Append(", "); } if (shiftState2.CharacterName != null && shiftState2.CharacterName.Length > 0) { stringBuilder2.Append(shiftState2.CharacterName); } else { stringBuilder.Append(""); } } } } } } streamWriter.Write(stringBuilder3.ToString()); streamWriter.Write('\t'); streamWriter.Write(stringBuilder.ToString()); streamWriter.WriteLine(); if (virtualKey.IsSgCaps || virtualKey.IsShiftSgCaps) { streamWriter.Write(stringBuilder4.ToString()); streamWriter.Write('\t'); streamWriter.Write(stringBuilder2.ToString()); streamWriter.WriteLine(); } } } virtualKey = vks[110]; stringBuilder3 = new StringBuilder(); stringBuilder3.Append(virtualKey.ScanCode.ToString("x2", Utilities.s_nfi)); stringBuilder3.Append('\t'); stringBuilder3.Append(Utilities.VkStringOfIvk((int)virtualKey.VK)); stringBuilder3.Append('\t'); stringBuilder3.Append(((virtualKey.CapLok ? 1 : 0) + (virtualKey.AltGrCapLock ? 4 : 0)).ToString(Utilities.s_nfi)); stringBuilder3.Append('\t'); stringBuilder = new StringBuilder(); for (int num4 = 0; num4 < array.Length; num4++) { if (-1 != array[num4]) { ShiftState shiftState = virtualKey.State(num4); stringBuilder3.Append(shiftState.GetLayoutChar(num)); if (shiftState.IsDeadKey) { stringBuilder3.Append('@'); } stringBuilder3.Append('\t'); if (stringBuilder.Length > 3) { stringBuilder.Append(", "); } if (shiftState.CharacterName.Length > 0) { stringBuilder.Append(shiftState.CharacterName); } if (shiftState.IsDeadKey) { stringBuilder6.Append(((ushort)shiftState.Characters[0]).ToString("x4", Utilities.s_nfi)); stringBuilder6.Append("\t\""); stringBuilder6.Append(shiftState.CharacterName); stringBuilder6.Append("\"\r\n"); } } } streamWriter.Write(stringBuilder3.ToString()); streamWriter.Write('\t'); streamWriter.Write("// "); streamWriter.Write(stringBuilder.ToString()); streamWriter.Write("\r\n"); streamWriter.WriteLine(); if (flag) { NlsConvert nlsConvert = new NlsConvert(); streamWriter.WriteLine("LIGATURE\r\n"); streamWriter.WriteLine("//VK_\tMod#\tChar0\tChar1\tChar2\tChar3"); streamWriter.WriteLine("//----\t\t----\t----\t----\t----\t----\r\n"); for (int num5 = 0; num5 < vks.Length; num5++) { if (array2[num5]) { for (int num6 = 0; num6 < array.Length; num6++) { virtualKey = vks[num5]; ShiftState shiftState = virtualKey.State(num6); if (shiftState != null && shiftState.Characters != null && shiftState.Characters.Length > 1) { string characters = shiftState.Characters; if (!shiftState.IsSurrogate) { stringBuilder3 = new StringBuilder(); stringBuilder3.Append(Utilities.VkStringOfIvk(num5)); stringBuilder3.Append("\t\t"); stringBuilder3.Append(array[num6]); stringBuilder3.Append('\t'); stringBuilder = new StringBuilder(); stringBuilder.Append("// "); for (int num7 = 0; num7 < characters.Length; num7++) { stringBuilder3.Append(((ushort)characters[num7]).ToString("x4", Utilities.s_nfi)); stringBuilder3.Append('\t'); if (nlsConvert.FromCharacter(shiftState.Characters.Substring(num7, 1))) { if (stringBuilder.Length > 3) { stringBuilder.Append(" + "); } if (shiftState.CharacterName.Length > 0) { stringBuilder.Append(nlsConvert.ToCharacterName()); } } } streamWriter.Write(stringBuilder3.ToString()); streamWriter.Write('\t'); streamWriter.Write(stringBuilder.ToString()); streamWriter.WriteLine(); } } } } } } streamWriter.WriteLine(); if (stringBuilder5 != null) { streamWriter.WriteLine(stringBuilder5.ToString()); } streamWriter.WriteLine("KEYNAME\r\n"); foreach (ValuePair valuePair3 in this.KEYNAME) { streamWriter.Write(valuePair3.Name); streamWriter.Write('\t'); streamWriter.Write(valuePair3.Value); streamWriter.WriteLine(); } streamWriter.WriteLine(); streamWriter.WriteLine("KEYNAME_EXT\r\n"); foreach (ValuePair valuePair4 in this.KEYNAME_EXT) { streamWriter.Write(valuePair4.Name); streamWriter.Write('\t'); streamWriter.Write(valuePair4.Value); streamWriter.WriteLine(); } streamWriter.WriteLine(); if (stringBuilder6 != null) { streamWriter.WriteLine("KEYNAME_DEAD\r\n"); streamWriter.WriteLine(stringBuilder6.ToString()); streamWriter.WriteLine(); } streamWriter.WriteLine("DESCRIPTIONS\r\n"); if (this.DESCRIPTIONS.Count == 0) { streamWriter.Write("0409"); streamWriter.Write('\t'); streamWriter.Write(description); streamWriter.WriteLine(); } else { foreach (ValuePair valuePair5 in this.DESCRIPTIONS) { streamWriter.Write(valuePair5.Name); streamWriter.Write('\t'); streamWriter.Write(valuePair5.Value); streamWriter.WriteLine(); } streamWriter.WriteLine(); } streamWriter.WriteLine("LANGUAGENAMES\r\n"); if (this.LANGUAGENAMES.Count == 0) { streamWriter.Write("0409"); streamWriter.Write('\t'); streamWriter.Write(culture.EnglishName); streamWriter.WriteLine(); } else { foreach (ValuePair valuePair6 in this.LANGUAGENAMES) { streamWriter.Write(valuePair6.Name); streamWriter.Write('\t'); streamWriter.Write(valuePair6.Value); streamWriter.WriteLine(); } streamWriter.WriteLine(); } streamWriter.WriteLine("ENDKBD"); streamWriter.Flush(); streamWriter.Close(); } internal KeyboardTextFile(string FileName) { this.m_stFileName = FileName; StreamReader streamReader = new StreamReader(File.OpenRead(FileName)); string stIn = streamReader.ReadToEnd(); streamReader.DiscardBufferedData(); streamReader.Close(); string text = this.StripAllComments(stIn).Replace('\n', ' '); int length = text.IndexOf("ENDKBD") - 1; this.m_stFile = this.RemoveWhiteSpace(text.Substring(0, length)); } internal DeadKeyTable DeadKeyTableOfDeadKey(char dk) { for (int i = 0; i < this.DEADKEYS.Count; i++) { DeadKeyTable deadKeyTable = (DeadKeyTable)this.DEADKEYS[i]; if (deadKeyTable.DK.Equals(dk)) { return deadKeyTable; } } return null; } private int NextKeyword(int ichStart) { int num = this.m_stFile.Length; for (int i = 0; i < this.KeyWords.Length; i++) { int num2 = this.m_stFile.IndexOf(this.KeyWords[i], ichStart); if (num2 != -1 && num2 < num) { num = num2; } } return num; } private string StripAllComments(string stIn) { string[] array = stIn.Split(new char[] { '\r' }); for (int i = 0; i < array.Length; i++) { if (array[i].Length > 0) { if (array[i][0] == ';') { array[i] = ""; } else { int num = array[i].IndexOf("//"); if (num == 0) { array[i] = ""; } else { if (num != -1) { array[i] = array[i].Substring(0, num - 1); } } } } } return string.Join("\r", array); } private void FillHeaderVariables() { int length = "KBD".Length; int num = this.m_stFile.IndexOf("KBD"); if (num != -1) { int num2 = this.m_stFile.IndexOf('\r', num + 1); if (num2 != -1) { string text = this.m_stFile.Substring(num + length, num2 - num - length); text = text.TrimStart(new char[0]); int num3 = text.IndexOf(' '); if (num3 != -1) { this.m_stName = text.Substring(0, num3).Trim(new char[] { ' ', '"' }); this.m_stDescription = text.Substring(num3 + 1).Trim(new char[] { ' ', '"' }); } } } if (this.m_stName == null) { this.m_stName = ""; } if (this.m_stDescription == null) { this.m_stDescription = ""; } } private string RemoveWhiteSpace(string stIn) { string text = stIn.Replace('\t', ' '); int num; do { num = text.IndexOf(" "); if (num >= 0) { text = text.Replace(" ", " "); } } while (num >= 0); return text; } } }