547 lines
16 KiB
C#
547 lines
16 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace RunNxUpdate
|
|
{
|
|
/// <summary>
|
|
/// Description of NX_Version.
|
|
/// </summary>
|
|
class NxVersion
|
|
{
|
|
#region Define Type
|
|
/// <summary>
|
|
/// NX Version. E.g.: NX 10.0.3.5
|
|
/// </summary>
|
|
public string NXversion { get; set; }
|
|
|
|
/// <summary>
|
|
/// NX Phase. E.g.: 5 of NX 10.0.3.5
|
|
/// </summary>
|
|
public int NXphase { get; set; }
|
|
|
|
/// <summary>
|
|
/// NX Patch. E.g.: NX 10.0.3.5 MP4
|
|
/// </summary>
|
|
public string NXpatch { get; set; }
|
|
|
|
|
|
/// <summary>
|
|
/// UGII_PRODUCT_NAME. E.g.: NX of NX 10.0.3.5
|
|
/// </summary>
|
|
public string UgiiProductName { get; set; }
|
|
|
|
/// <summary>
|
|
/// UGII_VERSION. E.g.: v10 of NX 10.0.3.5
|
|
/// </summary>
|
|
public string UgiiVersion { get; set; }
|
|
|
|
/// <summary>
|
|
/// UGII_FULL_VERSION. E.g.: v10.0.3.5
|
|
/// </summary>
|
|
public string UgiiFullVersion { get; set; }
|
|
|
|
/// <summary>
|
|
/// UGII_MAJOR_VERSION. E.g.: 10 of NX 10.0.3.5
|
|
/// </summary>
|
|
public int UgiiMajorVersion { get; set; }
|
|
|
|
/// <summary>
|
|
/// UGII_MINOR_VERSION. E.g.: 0 of NX 10.0.3.5
|
|
/// </summary>
|
|
public int UgiiMinorVersion { get; set; }
|
|
|
|
/// <summary>
|
|
/// UGII_SUBMINOR_VERSION. E.g.: 3 of NX 10.0.3.5
|
|
/// </summary>
|
|
public int UgiiSubminorVersion { get; set; }
|
|
|
|
|
|
/// <summary>
|
|
/// NX_VERSION_STRING. E.g.: V28.0.3.5 instead of NX 10.0.3.5 MP4
|
|
/// </summary>
|
|
public string NxVersionString { get; set; }
|
|
|
|
/// <summary>
|
|
/// NX_MAJOR_STRING. E.g.: V28 of V28.0.3.5
|
|
/// </summary>
|
|
public string NxMajorVersionString { get; set; }
|
|
|
|
/// <summary>
|
|
/// NX_MINOR_STRING. E.g.: 0 of V28.0.3.5
|
|
/// </summary>
|
|
public int NxMinorVersionString { get; set; }
|
|
|
|
/// <summary>
|
|
/// NX_SUBMINOR_STRING. E.g.: 3 of V28.0.3.5
|
|
/// </summary>
|
|
public int NxSubminorVersionString { get; set; }
|
|
|
|
/// <summary>
|
|
/// NX_PHASE_STRING. E.g.: 5 of V28.0.3.5
|
|
/// </summary>
|
|
public int NxPhaseString { get; set; }
|
|
|
|
|
|
/// <summary>
|
|
/// Maintenance Release. E.g.: 10.0.3.5 of NX 10.0.3.5 MP4
|
|
/// </summary>
|
|
public string MaintenanceRelease { get; set; }
|
|
|
|
/// <summary>
|
|
/// Maintenance Pack. E.g.: MP4 of NX 10.0.3.5 MP4
|
|
/// </summary>
|
|
public string MaintenancePack { get; set; }
|
|
|
|
/// <summary>
|
|
/// Maintenance Pack Number. E.g.: 4 of NX 10.0.3.5 MP4
|
|
/// </summary>
|
|
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
|
|
/// <summary>
|
|
/// Compares two NX-Versions.
|
|
/// </summary>
|
|
/// <param name="version">A valid NX-Version.</param>
|
|
/// <returns>0 = equal, 1 = first version newer, 2 = second version newer, -1 = An error is happened.</returns>
|
|
public int Compare(NxVersion version)
|
|
{
|
|
return Compare(this, version);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Compares two NX-Versions.
|
|
/// </summary>
|
|
/// <param name="majorVersion">A valid major version. E.g.: 10 of NX 10.0.3.5 MP4</param>
|
|
/// <param name="minorVersion">A valid minor version. E.g.: 0 of NX 10.0.3.5 MP4</param>
|
|
/// <param name="subminorVersion">A valid subminor version. E.g.: 3 of NX 10.0.3.5 MP4</param>
|
|
/// <param name="phase">A valid phase. E.g.: 5 of NX 10.0.3.5 MP4</param>
|
|
/// <param name="mp">A valid maintenance pack number. E.g.: 4 of NX 10.0.3.5 MP4</param>
|
|
/// <returns></returns>
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Converts a NxPatch string to NxVersion
|
|
/// </summary>
|
|
/// <param name="nxPatch">A valid NxPatch. E.g.: NX 10.0.3.5 MP4</param>
|
|
/// <returns></returns>
|
|
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
|
|
}
|