using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace RunNxUpdate { /// /// Description of NX_Version. /// class NxVersion { #region Define Type /// /// NX Version. E.g.: NX 10.0.3.5 /// public string NXversion { get; set; } /// /// NX Phase. E.g.: 5 of NX 10.0.3.5 /// public int NXphase { get; set; } /// /// NX Patch. E.g.: NX 10.0.3.5 MP4 /// public string NXpatch { get; set; } /// /// UGII_PRODUCT_NAME. E.g.: NX of NX 10.0.3.5 /// public string UgiiProductName { get; set; } /// /// UGII_VERSION. E.g.: v10 of NX 10.0.3.5 /// public string UgiiVersion { get; set; } /// /// UGII_FULL_VERSION. E.g.: v10.0.3.5 /// public string UgiiFullVersion { get; set; } /// /// UGII_MAJOR_VERSION. E.g.: 10 of NX 10.0.3.5 /// public int UgiiMajorVersion { get; set; } /// /// UGII_MINOR_VERSION. E.g.: 0 of NX 10.0.3.5 /// public int UgiiMinorVersion { get; set; } /// /// UGII_SUBMINOR_VERSION. E.g.: 3 of NX 10.0.3.5 /// public int UgiiSubminorVersion { get; set; } /// /// NX_VERSION_STRING. E.g.: V28.0.3.5 instead of NX 10.0.3.5 MP4 /// public string NxVersionString { get; set; } /// /// NX_MAJOR_STRING. E.g.: V28 of V28.0.3.5 /// public string NxMajorVersionString { get; set; } /// /// NX_MINOR_STRING. E.g.: 0 of V28.0.3.5 /// public int NxMinorVersionString { get; set; } /// /// NX_SUBMINOR_STRING. E.g.: 3 of V28.0.3.5 /// public int NxSubminorVersionString { get; set; } /// /// NX_PHASE_STRING. E.g.: 5 of V28.0.3.5 /// public int NxPhaseString { get; set; } /// /// Maintenance Release. E.g.: 10.0.3.5 of NX 10.0.3.5 MP4 /// public string MaintenanceRelease { get; set; } /// /// Maintenance Pack. E.g.: MP4 of NX 10.0.3.5 MP4 /// public string MaintenancePack { get; set; } /// /// Maintenance Pack Number. E.g.: 4 of NX 10.0.3.5 MP4 /// public int MaintenancePackNumber { get; set; } #endregion #region GetVersion public NxVersion GetNxVersion(string ugii_base_dir) { //Version die als Updatedatei übergeben wurde string RefVer = Program.UpdateDir.Remove(0, Program.UpdateDir.IndexOf("nx-") + 3); RefVer = RefVer.Remove(RefVer.IndexOf(".")); if (String.IsNullOrEmpty(RefVer)) { //NX Version ist neuer als 'NX12' //TODO: Was hier passieren muss ist noch nicht bekannt, weil es für 'NX1847' noch kein Update gibt } //Version die in UGII_BASE_DIR übergeben wurde string CompVer = ugii_base_dir.Remove(0, ugii_base_dir.IndexOf("NX") + 2); if (String.IsNullOrEmpty(CompVer)) { //NX Version ist neuer als 'NX12' //TODO: Was hier passieren muss noch nicht bekannt, weil es für 'NX1847' noch kein Update gibt } else { //NX Version ist bis 'NX12' if (CompVer.Contains(".")) { CompVer = CompVer.Remove(CompVer.IndexOf(".")); } } //Wenn eine andere UGII_BASE_DIR gesetzt ist als upgedatet werden soll, dann UGII_BASE_DIR zur Laufzeit richtig stellen if (RefVer != CompVer) { //UGII_BASE_DIR neu aufbauen string baseDir = ugii_base_dir; if (ugii_base_dir.EndsWith("NX")) { //UGII_BASE_DIR ist neuer gesetzt als 'NX12', das muss geändert werden baseDir = String.Concat(ugii_base_dir, RefVer); } if (Convert.ToUInt16(RefVer) < Convert.ToUInt16(CompVer)) { //UGII_BASE_DIR ist neuer als die Updatedateien baseDir = String.Concat(ugii_base_dir.Remove(ugii_base_dir.LastIndexOf("NX") + 2), RefVer); } Environment.SetEnvironmentVariable("UGII_BASE_DIR", baseDir); ugii_base_dir = baseDir; } NxVersion nxVersion = new NxVersion(); string tempVersion = ""; if (Directory.Exists(ugii_base_dir)) { //Wenn 'ugii_base_dir' existiert, dann die Werte ermitteln} tempVersion = ReadProcessOutput(ugii_base_dir, "-m"); if (tempVersion != null) { //Wert auflösen string[] versionSegments = new string[6]; versionSegments = SeperateVersionCode(tempVersion); if (versionSegments != null) { //NX-Version setzen nxVersion = AssignVersionSegments(versionSegments); if (nxVersion == null) { //Fehler passiert throw new NoNXversionException("It was inpossible to generate NX Version."); } } else { //Fehler passiert throw new NoNXversionException("It was inpossible to generate NX Version."); } } return nxVersion; } else { return null; //Wenn 'ugii_base_dir' nicht existiert, dann 'null' zurückgeben } } public NxVersion GetNxVersion(int majorVersion, int minorVersion, int subminorVersion, int phase, int mp) { NxVersion nxVersion = new NxVersion(); string[] versionSegments = new string[6]; versionSegments[0] = "NX"; versionSegments[1] = majorVersion.ToString(); versionSegments[2] = minorVersion.ToString(); versionSegments[3] = subminorVersion.ToString(); versionSegments[4] = phase.ToString(); versionSegments[5] = "MP" + mp.ToString(); //NX-Version setzen return AssignVersionSegments(versionSegments); } #endregion #region Compare /// /// Compares two NX-Versions. /// /// A valid NX-Version. /// 0 = equal, 1 = first version newer, 2 = second version newer, -1 = An error is happened. public int Compare(NxVersion version) { return Compare(this, version); } /// /// Compares two NX-Versions. /// /// A valid major version. E.g.: 10 of NX 10.0.3.5 MP4 /// A valid minor version. E.g.: 0 of NX 10.0.3.5 MP4 /// A valid subminor version. E.g.: 3 of NX 10.0.3.5 MP4 /// A valid phase. E.g.: 5 of NX 10.0.3.5 MP4 /// A valid maintenance pack number. E.g.: 4 of NX 10.0.3.5 MP4 /// public int Compare(int majorVersion, int minorVersion, int subminorVersion, int phase, int mp) { NxVersion nxVersion = new NxVersion(); string[] versionSegments = new string[6]; versionSegments[0] = "NX"; versionSegments[1] = majorVersion.ToString(); versionSegments[2] = minorVersion.ToString(); versionSegments[3] = subminorVersion.ToString(); versionSegments[4] = phase.ToString(); versionSegments[5] = "MP" + mp.ToString(); //NX-Version setzen return Compare(this, AssignVersionSegments(versionSegments)); } private int Compare(NxVersion version1, NxVersion version2) { if (version1.NXpatch == version2.NXpatch) { return 0; //Versionen gleich } if (version1.UgiiMajorVersion < version2.UgiiMajorVersion) { return 2; //Version 1 ist älter als Version 2 } if (version1.UgiiMajorVersion > version2.UgiiMajorVersion) { return 1; //Version 1 ist neuer als Version 2 } if (version1.UgiiMinorVersion < version2.UgiiMinorVersion) { return 2; //Version 1 ist älter als Version 2 } if (version1.UgiiMinorVersion > version2.UgiiMinorVersion) { return 1; //Version 1 ist neuer als Version 2 } if (version1.UgiiSubminorVersion < version2.UgiiSubminorVersion) { return 2; //Version 1 ist älter als Version 2 } if (version1.UgiiSubminorVersion > version2.UgiiSubminorVersion) { return 1; //Version 1 ist neuer als Version 2 } if (version1.NXphase < version2.NXphase) { return 2; //Version 1 ist älter als Version 2 } if (version1.NXphase > version2.NXphase) { return 1; //Version 1 ist neuer als Version 2 } if (version1.MaintenancePackNumber < version2.MaintenancePackNumber) { return 2; //Version 1 ist älter als Version 2 } if (version1.MaintenancePackNumber > version2.MaintenancePackNumber) { return 1; //Version 1 ist neuer als Version 2 } return -1; //Fehler passiert } #endregion #region CommonMethodes static string ReadProcessOutput(string ugii_base_dir, string arguments) { // Liest die Daten nach beenden der Prozess-Ausgabe aus // Tritt ein Fehler auf, liefert die Funktion null zurück //Überprüfen ob auf alle notwendigen Dateien (env_print.exe, libpatch.dll, libsyss.dll) zugegriffen werden kann ExecutablesExists(ugii_base_dir); string stdOut; Process process = new Process(); try { if (ugii_base_dir.EndsWith("\\")) { process.StartInfo.FileName = "\"" + ugii_base_dir + "UGII\\env_print.exe\""; } else { process.StartInfo.FileName = "\"" + ugii_base_dir + "\\UGII\\env_print.exe\""; } process.StartInfo.Arguments = arguments; process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.CreateNoWindow = true; process.Start(); process.WaitForExit(); stdOut = process.StandardOutput.ReadToEnd(); } catch { stdOut = null; } finally { process.Close(); } return stdOut; } static void ExecutablesExists(string ugii_base_dir) { //Wenn eine der drei Dateien nicht existiert, dann eine Exception werfen if (!File.Exists(String.Concat(ugii_base_dir, "\\UGII\\env_print.exe"))) throw new NoEnvPrintExeException("Unable to find EnvPrint.exe"); if (!ugii_base_dir.EndsWith("NX")) { if (Convert.ToInt32(ugii_base_dir.Remove(0, ugii_base_dir.LastIndexOf("NX") + 2)) < 12) { if (!File.Exists(String.Concat(ugii_base_dir, "\\UGII\\libpatch.dll"))) throw new NoLibPatchDllException("Unable to find LibPatch.dll"); } } if (!File.Exists(String.Concat(ugii_base_dir, "\\UGII\\libsyss.dll"))) throw new NoLibSysDllException("Unable to find LibSys.dll"); } private string[] SeperateVersionCode(string tempVersion) { if (tempVersion.Contains(",")) { //Den restlichen Text von der Version abtrennen (NX 10.0.3.5 MP4, 30Mar16. See Maintenance Pack letter for detailed list of fixes.\r\n) tempVersion = tempVersion.Remove(tempVersion.IndexOf(",")); } //Alle Trennzeichen durch ',' ersetzen tempVersion = tempVersion.Replace(" ", "."); //Die einzelnen Segmente herauslösen string[] versionSegments = tempVersion.Split(new Char[] { '.' }); if (versionSegments.Length != 6) { if (versionSegments.Length == 4) { //Phase und MP fehlen versionSegments[4] = "0"; versionSegments[5] = "MP0"; } else if (versionSegments.Length == 5) { //Phase oder MP fehlen if (versionSegments[4].StartsWith("MP")) { //Phase fehlt versionSegments[5] = versionSegments[4]; versionSegments[4] = "0"; } else { //MP fehlt versionSegments[5] = "MP0"; } } else { //Unbekannte Version versionSegments = null; } } return versionSegments; } private NxVersion AssignVersionSegments(string[] versionSegments) { NxVersion nxVersion = new NxVersion(); // NX_VERSION. E.g.: NX 10.0.3.5 nxVersion.NXversion = versionSegments[0] + " " + versionSegments[1] + "." + versionSegments[2] + "." + versionSegments[3] + "." + versionSegments[4]; NXversion = nxVersion.NXversion; // NX_PHASE. E.g.: 5 of NX 10.0.3.5 nxVersion.NXphase = Convert.ToInt16(versionSegments[4]); NXphase = nxVersion.NXphase; // NX_PATCH. E.g.: NX 10.0.3.5 MP4 nxVersion.NXpatch = nxVersion.NXversion + " " + versionSegments[5]; NXpatch = nxVersion.NXpatch; if (NXpatch.Contains("MP0")) { NXpatch = NXpatch.Replace("MP0", "MP"); } // UGII_PRODUCT_NAME. E.g.: NX of NX 10.0.3.5 nxVersion.UgiiProductName = versionSegments[0]; UgiiProductName = nxVersion.UgiiProductName; // UGII_VERSION. E.g.: v10 of NX 10.0.3.5 nxVersion.UgiiVersion = "v" + versionSegments[1]; UgiiVersion = nxVersion.UgiiVersion; // UGII_FULL_VERSION. E.g.: v10.0.3.5 nxVersion.UgiiFullVersion = "v" + versionSegments[1] + "." + versionSegments[2] + "." + versionSegments[3] + "." + versionSegments[4]; UgiiFullVersion = nxVersion.UgiiFullVersion; // UGII_MAJOR_VERSION. E.g.: 10 of NX 10.0.3.5 nxVersion.UgiiMajorVersion = Convert.ToInt16(versionSegments[1]); UgiiMajorVersion = nxVersion.UgiiMajorVersion; // UGII_MINOR_VERSION. E.g.: 0 of NX 10.0.3.5 nxVersion.UgiiMinorVersion = Convert.ToInt16(versionSegments[2]); UgiiMinorVersion = nxVersion.UgiiMinorVersion; // UGII_SUBMINOR_VERSION. E.g.: 3 of NX 10.0.3.5 nxVersion.UgiiSubminorVersion = Convert.ToInt16(versionSegments[3]); UgiiSubminorVersion = nxVersion.UgiiSubminorVersion; // NX_VERSION_STRING. E.g.: V28.0.3.5 instead of NX 10.0.3.5 MP4 nxVersion.NxVersionString = "v" + (Convert.ToInt16(versionSegments[1]) + 18).ToString() + "." + versionSegments[2] + "." + versionSegments[3] + "." + versionSegments[4]; NxVersionString = nxVersion.NxVersionString; // NX_MAJOR_STRING. E.g.: V28 of V28.0.3.5 nxVersion.NxMajorVersionString = "v" + (Convert.ToInt16(versionSegments[1]) + 18).ToString(); NxMajorVersionString = nxVersion.NxMajorVersionString; // NX_MINOR_STRING. E.g.: 0 of V28.0.3.5 nxVersion.NxMinorVersionString = Convert.ToInt16(versionSegments[2]); NxMinorVersionString = nxVersion.NxMinorVersionString; // NX_SUBMINOR_STRING. E.g.: 3 of V28.0.3.5 nxVersion.NxSubminorVersionString = Convert.ToInt16(versionSegments[3]); NxSubminorVersionString = nxVersion.NxSubminorVersionString; // NX_PHASE_STRING. E.g.: 5 of V28.0.3.5 nxVersion.NxPhaseString = Convert.ToInt16(versionSegments[4]); NxPhaseString = nxVersion.NxPhaseString; // Maintenance Release. E.g.: 10.0.3.5 of NX 10.0.3.5 MP4 nxVersion.MaintenanceRelease = versionSegments[1] + "." + versionSegments[2] + "." + versionSegments[3] + "." + versionSegments[4]; MaintenanceRelease = nxVersion.MaintenanceRelease; // Maintenance Pack. E.g.: MP4 of NX 10.0.3.5 MP4 nxVersion.MaintenancePack = versionSegments[5]; MaintenancePack = nxVersion.MaintenancePack; // Maintenance Pack Number. E.g.: 4 of NX 10.0.3.5 MP4 nxVersion.MaintenancePackNumber = Convert.ToInt16(nxVersion.MaintenancePack.Remove(0, nxVersion.MaintenancePack.IndexOf("MP") + 2)); MaintenancePackNumber = nxVersion.MaintenancePackNumber; return nxVersion; } /// /// Converts a NxPatch string to NxVersion /// /// A valid NxPatch. E.g.: NX 10.0.3.5 MP4 /// public NxVersion ConvertStringPatchToNxVersionPatch(string nxPatch) { return AssignVersionSegments(SeperateVersionCode(nxPatch)); } #endregion } #region Exception class NoNXversionException : ApplicationException { public NoNXversionException() { } public NoNXversionException(string message) : base(message) { } public NoNXversionException(string message, Exception inner) : base(message, inner) { } } class NoEnvPrintExeException : ApplicationException { public NoEnvPrintExeException() { } public NoEnvPrintExeException(string message) : base(message) { } public NoEnvPrintExeException(string message, Exception inner) : base(message, inner) { } } class NoLibPatchDllException : ApplicationException { public NoLibPatchDllException() { } public NoLibPatchDllException(string message) : base(message) { } public NoLibPatchDllException(string message, Exception inner) : base(message, inner) { } } class NoLibSysDllException : ApplicationException { public NoLibSysDllException() { } public NoLibSysDllException(string message) : base(message) { } public NoLibSysDllException(string message, Exception inner) : base(message, inner) { } } #endregion }