/// /// Copyright (c) 2021 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; using System.IO; using System.Security.Cryptography; using System.Text; using System.Xml.Serialization; namespace OrderManagement { /// /// Class to be serialized to an XML file... /// [XmlRootAttribute("SNPrinting")] public class LocalSettings { static XmlSerializer serializer = XmlSerializer.FromTypes(new[] { typeof(LocalSettings) })[0]; /// Configuration file ecryption/decryption key and initialization vector static byte[] key = new byte[] { 83, 254, 105, 64, 184, 201, 195, 127, 52, 99, 77, 45, 252, 132, 163, 156 }; static byte[] IV = new byte[] { 189, 23, 137, 56, 204, 241, 242, 118, 28, 89, 9, 198, 224, 111, 186, 125 }; public Mode Mode; public string Language; /// User interface language used as CultureInfo(..) constructor argument public bool IsUserLoginRequired; /// true = require user login on program start-up public bool IsShowPredefinedOrders; /// true = show predefined orders with nr. <= 1000 public bool IsShowFinishedOrders; /// true = show finished orders public string TracingDBConnString; /// Connection string to MySQL database with production tracing records public string UsersDBConnString; /// Connection string to MySQL database with authorized users public string[] SapNumberHistory; /// SAP number history public string[] SeparatorHistory; /// Separator history public int CurrentSNTrail; /// Serial number trail to be printed now public int RemainingSNsCount; /// Remaining count of serial numbers to be printed in this session /// Parameterless constructor required by serialization public LocalSettings() { } public LocalSettings(bool createNew) { if (createNew) { Mode = Mode.Standalone; Language = "EN"; IsUserLoginRequired = false; IsShowPredefinedOrders = false; IsShowFinishedOrders = false; #if DEBUG TracingDBConnString = "SERVER=localhost; DATABASE=nanjingshared; UID=root; PASSWORD=kraken; CHARSET=utf8;"; #else TracingDBConnString = "SERVER=10.116.192.200; DATABASE=nanjingshared; UID=nanjingshared; PASSWORD=C1ern4V0d4; CHARSET=utf8;"; #endif UsersDBConnString = TracingDBConnString; SapNumberHistory = new string[] { }; SeparatorHistory = new string[] { "7VQ" }; CurrentSNTrail = 1; RemainingSNsCount = 0; } } /// /// Load public fields of this class from the XML file. /// /// LocalSettings object or null when Load() fails public static LocalSettings Load(string fileName) { try { bool isEncrypted = true; using (StreamReader reader = new StreamReader(fileName)) { isEncrypted = !reader.ReadLine().StartsWith(" /// Save public fields of this class to the XML file. /// public void Save() { try { /// Encrypt and write to file 'Program.LocalSettingsFileName' using (RijndaelManaged aes = new RijndaelManaged { Padding = PaddingMode.Zeros }) { using (FileStream fsCrypt = new FileStream(Program.LocalSettingsFileName, FileMode.Create)) { using (ICryptoTransform encryptor = aes.CreateEncryptor(key, IV)) { using (CryptoStream cs = new CryptoStream(fsCrypt, encryptor, CryptoStreamMode.Write)) { using (MemoryStream mStream = new MemoryStream()) { using (var writer = new StreamWriter(mStream)) { /// Serialize and write settings to a memory stream serializer.Serialize(writer, this); writer.Flush(); mStream.Position = 0; using (var reader = new StreamReader(mStream)) { /// Encrypt and write to file 'Program.LocalSettingsFileName' int data; while ((data = mStream.ReadByte()) != -1) cs.WriteByte((byte)data); } } } } } } } } catch (Exception e) { string msg = e.Message; } } /// /// Updates history stored in a string array by a new latest string. /// /// Last entered string /// true = history updated public static bool UpdateHistory(string lastStrValue, ref string[] history) { const int MaxHistoryLen = 10; if (string.IsNullOrEmpty(lastStrValue)) return false; int currentHistoryLength = (history != null) ? history.Length : 0; int match = -1; for (int i = 0; i < currentHistoryLength; i++) { if (history[i] == lastStrValue) { match = i; break; } } if (match >= 0 || currentHistoryLength >= MaxHistoryLen) { /// History does not have to be extended (because of a match) or should not be extended (because of the lenght) if (match < 0) match = currentHistoryLength - 1; for (int j = match; j > 0; j--) { history[j] = history[j - 1]; } history[0] = lastStrValue; } else { /// History wiil be extended, new item inserted at the beginning string[] newHistory = new string[currentHistoryLength + 1]; newHistory[0] = lastStrValue; for (int j = 1; j <= currentHistoryLength; j++) { newHistory[j] = history[j - 1]; } history = newHistory; } return true; } /// /// Load Purchase order combo box items from the LocalSettings PurchaseOrderHistory array /// /// Puchase order ComboBox public static void PrepareCombo(string[] history, System.Windows.Forms.ComboBox comboBox) { if (history != null) { for (int i = 0; i < history.Length; i++) { comboBox.Items.Add(history[i]); } } if (comboBox.Items.Count > 0) { comboBox.Text = comboBox.Items[0].ToString(); } } } public enum Mode { Standalone, WithDatabase, } }