using System.Collections.Generic;
using System.Linq;
using gmslLibrary.Services;
using gmslLibrary.Model;
using gmslLibrary.Enums;
using GM = gmslAPI;
namespace gmUpgrade
{
public static class Program
{
const string taskArg = "TaskInfo=";
const string startupArg = "startup=";
[System.STAThread] // faster using STA
static void Main(string[] args)
{
string cmlStartup = System.Array.Find(args, str => str.StartsWith(startupArg));
string startupPath = null;
if (cmlStartup == null)
{
// default startup file path
startupPath = gmslAPI.Common.DefaultStartUpFile;
}
else
{
// parse startup path from the command line, and remove it from the list of arguments
int i = 0;
foreach (string arg in args)
{
if (arg.StartsWith(startupArg))
{
args[i] = "";
startupPath = arg.Split('=')[1];
}
i++;
}
}
// When started by gmStudio, TaskInfo argument is passed on the command line.
// The TaskInfo XML file is generated by gmStudio. It contains details about
// the upgrade task and the upgrade environment.
// For debugging or direct operation, load upgrade tasks here.
// Note: you can redirect the output of this to the log file for
// debugging (> log) in project properties, but doing so will block
// gmStudio from running the EXE running when VS is open.
string cmlTask = System.Array.Find(args, str => str.StartsWith(taskArg));
List<string> taskList = new List<string>();
if (cmlTask == null)
{
// batch
taskList.Add(taskArg + @"C:\gmSpec\Util\APITest\proj\log\APITest-APITest-exe-csh.TRAN.Xml");
}
else
{
// parse taskarg item from the command line
int i = 0;
foreach (string arg in args)
{
if (arg.StartsWith(taskArg))
{
args[i] = "";
taskList.Add(arg);
}
i++;
}
}
if (taskList.Count == 0)
{
System.Console.Write("USAGE: " + args[0] + " " + taskArg + " TaskInfoFilePath");
System.Environment.Exit(1);
}
RunAllTranslations(taskList, startupPath, args);
System.Environment.Exit(0);
}
static void RunAllTranslations(List<string> taskList, string startupPath, string[] args)
{
GM.Common.LoadLicense(logInfo: true);
string taskInfoPath = "";
foreach (string arg in taskList)
{
if (arg.StartsWith(taskArg))
{
taskInfoPath = arg.Split('=')[1];
if (!System.IO.File.Exists(taskInfoPath))
{
System.Console.WriteLine("ERROR: TaskInfo File Not Found:" + taskInfoPath);
System.Environment.Exit(999);
}
else
{
repair(taskInfoPath);
GM.gmStudioTask task = GM.Common.Load(taskInfoPath);
RunUpgrade(task, startupPath, args);
}
}
}
}
private static void RunUpgrade(gmslAPI.gmStudioTask task, string startupPath, string[] args)
{
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
// Go to Upgrade project working folder so relative file references are correct
System.IO.Directory.SetCurrentDirectory(task.WorkFolder);
System.Console.WriteLine("Loaded task:" + task.JobId);
string projectStartup = @"C:\Program Files (x86)\GreatMigrations\gmStudio\support\tools\gmBasic.xml";
if (!System.IO.File.Exists(projectStartup)) projectStartup = null;
gmBasic.StartUp(projectStartup, null, args);
// Detailed translation rules are stored in a ScriptRules.xml
// This format can be used by both XML-based and API-based upgrade tasks
// The ScriptRules class makes these rules available to API calls.
GM.ScriptRules rules = new GM.ScriptRules(@"..\usr\ScriptRules.xml");
rules.AddRules(task, "BasicRules");
rules.logEnable = true;
log(rules.logEnable, rules.AllRulesReport());
log(rules.logEnable, "Startup(ms):" + sw.ElapsedMilliseconds);
Execute.Storage(action: "Create", identifier: task.JobId);
if (rules.OptionRules != 0)
{
Execute.gmPL(commands: rules.OptionRules);
log(rules.logEnable, "Options(ms):" + sw.ElapsedMilliseconds);
}
bool useWPF = Select.SubSystem == Dialects.wpf;
log(rules.logEnable, "GUI: " + (useWPF ? "WPF" : "WinForms"));
Execute.Load(project: task.SrcPath, sourcecode: "on");
AddCommentOnErrorHandlers();
Execute.Compile(resx: task.ResxFolder, commands: rules.CompileRules);
//Execute.Compile(project: task.SrcPath, resx: task.ResxFolder, commands: rules.CompileRules);
log(rules.logEnable, "Compile(ms):" + sw.ElapsedMilliseconds);
if (rules.PreAnalyseRules != 0)
{
Execute.gmPL(commands: rules.PreAnalyseRules);
log(rules.logEnable, "PreAnalyse(ms):" + sw.ElapsedMilliseconds);
}
Execute.Analyse();
log(rules.logEnable, "Analyze(ms):" + sw.ElapsedMilliseconds);
if (rules.PostAnalyseRules != 0)
{
Execute.gmPL(commands: rules.PostAnalyseRules);
log(rules.logEnable, "PostAnalyse(ms):" + sw.ElapsedMilliseconds);
}
Execute.Output(status: "New", filename: task.BndPath);
Execute.Author(commands: rules.AuthorRules);
log(rules.logEnable, "Author(ms):" + sw.ElapsedMilliseconds);
Execute.Output(status: "Close");
if (rules.PostAuthorRules != 0)
{
Execute.gmPL(commands: rules.PostAuthorRules);
log(rules.logEnable, "PostAuthor(ms):" + sw.ElapsedMilliseconds);
}
Execute.Storage(action: "Close");
gmBasic.Terminate();
log(rules.logEnable, "Total(ms):" + sw.ElapsedMilliseconds);
}
private static void log(bool doLog, string msg)
{
if (doLog) System.Console.WriteLine(msg);
}
private static void repair(string taskInfoPath)
{
string data = System.IO.File.ReadAllText(taskInfoPath);
data = data.Replace("UsrCm nt=", "UsrCmnt= ");
data = data.Replace("UsrDes c=", "UsrDesc= ");
System.IO.File.WriteAllText(taskInfoPath, data);
}
private static void AddCommentOnErrorHandlers()
{
int[] levels = new int[19];
int iRoot;
tInfoFile formFile;
Text textStream;
int nRecord;
int curRecord;
int length = 0;
int rai = 0;
string record;
for (iRoot = Store.FindFirstChild(levels, 0); iRoot != 0; iRoot = Store.FindNextChild(levels))
{
if (Store.GetObjectType(iRoot) != ObjectType.FormFile) continue;
string name = Symbol.FullName(iRoot, 0);
FileSystem.LogMessage("name=" + name);
formFile = new tInfoFile(iRoot);
if (formFile.textBase == 0) continue;
FileSystem.LogMessage("formFile.textBase=" + formFile.textBase);
textStream = new Text(formFile.textBase);
FileSystem.LogMessage("textStream=" + textStream);
// sample code changes lines ending with ":" to lines ending with ": 'TEST"
nRecord = textStream.Maximum();
curRecord = 0;
while (curRecord < nRecord)
{
curRecord = curRecord + 1;
textStream.Position(curRecord);
record = textStream.Access(ref length, ref rai);
if (length < 2) continue;
string last = Character.Substr(record, length - 1, 1);
if (last == ":")
{
// Inserts a record after the current record and sets Position to new record
textStream.Insert(record + " ' TEST");
// reset position to original record
textStream.Position(curRecord);
// delete original record
textStream.Delete();
continue;
}
}
textStream.Close();
}
}
}
}
|