diff --git a/Client.Utils/Constants.cs b/Client.Utils/Constants.cs index abb3561c..debddba9 100644 --- a/Client.Utils/Constants.cs +++ b/Client.Utils/Constants.cs @@ -20,15 +20,18 @@ namespace Client.Utils public static String CEF_LOCALES_PATH = BASE_PATH + "CEF\\Resources\\locales"; public static String CEF_EXCEPTIONLOG_PATH = BASE_PATH + "ExceptionLog"; public static String errorPageFile = BASE_PATH + "error.pg"; - - - //Config Names + public static String JOB_OPENING_PATH = BASE_PATH + "TempJob\\"; + + + //Config Names public const string CONFIG_KEY = "Config"; public const string CLIENT_CONFIG_KEY = "Client"; public const string CONNECTION_CONFIG_KEY = "Connection"; public const string VENDORHMI_CONFIG_KEY = "VendorHmi"; public const string EXTSFT_CONFIG_KEY = "ExtSoftwares"; public const string SFT_CONFIG_KEY = "Software"; + public const string JOB_MAIN_FILENAME = "main.cnc"; + public const string JOB_METADATA_FILENAME = "metadata.json"; public enum Rendering {GPU = 0, CPU = 1 }; diff --git a/Client/Browser_Tools/BrowserJSObject.cs b/Client/Browser_Tools/BrowserJSObject.cs index 2b6113b2..5758164a 100644 --- a/Client/Browser_Tools/BrowserJSObject.cs +++ b/Client/Browser_Tools/BrowserJSObject.cs @@ -14,6 +14,7 @@ using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.IO; +using System.IO.Compression; using System.Linq; using System.Net.Http; using System.Text; @@ -63,7 +64,9 @@ namespace CMS_Client.Browser_Tools AddFunction("uploadAndActivateProgram").Execute += uploadAndActivateProgram; AddFunction("uploadAndAddToQueue").Execute += uploadAndAddToQueue; - + AddFunction("openJob").Execute += openJob; + AddFunction("saveJob").Execute += saveJob; + } #endregion @@ -603,5 +606,174 @@ namespace CMS_Client.Browser_Tools } #endregion + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + #region JOB_METHODS + + //Read all job + public void openJob(object sender, CfrV8HandlerExecuteEventArgs e) + { + JobToStep job = new JobToStep(); + OpenFileDialog jobOpenFileDialog = new OpenFileDialog(); + jobOpenFileDialog.Filter = "CMS Job Files(*.JOB,*.ZIP)|*.job;*.zip"; + jobOpenFileDialog.Multiselect = false; + + if (jobOpenFileDialog.ShowDialog() == DialogResult.OK) + { + if (!Directory.Exists(JOB_OPENING_PATH)) + Directory.CreateDirectory(JOB_OPENING_PATH); + + ClearTempPath(); + + using (ZipArchive archive = ZipFile.OpenRead(jobOpenFileDialog.FileName)) + { + + //Setup main Fields + job.Name = Path.GetFileName(jobOpenFileDialog.FileName); + job.LastEditTimestamp = new FileInfo(jobOpenFileDialog.FileName).LastAccessTime; + + foreach (ZipArchiveEntry entry in archive.Entries) + { + //Main program + if (entry.Name.Equals(JOB_MAIN_FILENAME, StringComparison.OrdinalIgnoreCase)) + { + using (var reader = new StreamReader(entry.Open())) + { + job.IsoMainProgram = (reader.ReadToEnd()); + } + } + //Add all images + else if (_validImages.Contains(Path.GetExtension(entry.Name).ToLower())) + { + var bytes = default(byte[]); + using (var memstream = new MemoryStream()) + { + entry.Open().CopyTo(memstream); + bytes = memstream.ToArray(); + job.Metadata.Generics.Images.Add("data:image/" + Path.GetExtension(entry.Name).ToLower().TrimStart('.') + ";base64," + Convert.ToBase64String(bytes)); + } + } + //Metadata + else if(entry.Name.Equals(JOB_METADATA_FILENAME, StringComparison.OrdinalIgnoreCase)) + { + MetadataToFile metasFromFile = new MetadataToFile(); + + using (var reader = new StreamReader(entry.Open())) + { + metasFromFile = JsonConvert.DeserializeObject(reader.ReadToEnd()); + if(metasFromFile == null) + { + e.SetReturnValue(null); + return; + } + else + { + job.Metadata.Generics.Description = metasFromFile.Description; + job.Metadata.Generics.ExecutionTime = metasFromFile.ExecutionTime; + job.Metadata.Tools = metasFromFile.Tools; + job.Metadata.Customs = metasFromFile.Customs; + } + } + } + //All other files + else + { + entry.ExtractToFile(JOB_OPENING_PATH + entry.Name, true); + } + } + + } + e.SetReturnValue(JsonConvert.SerializeObject(job)); + return; + } + else + { + e.SetReturnValue(null); + return; + } + } + + + + //Save all job + public void saveJob(object sender, CfrV8HandlerExecuteEventArgs e) + { + MetadataToFile metafile = new MetadataToFile(); + + //check the arguments + if (e.Arguments.Count() == 0) + return; + + //Call Save Dialog + SaveFileDialog jobSaveFileDialog = new SaveFileDialog(); + jobSaveFileDialog.Filter = "CMS Job Files(*.JOB)|*.job|Zip Files(*.ZIP)|*.zip"; + if(jobSaveFileDialog.ShowDialog() == DialogResult.OK) + { + // Job deserialize + JobToStep job = JsonConvert.DeserializeObject(e.Arguments[0].StringValue); + + //Metadata + metafile.Description = job.Metadata.Generics.Description; + metafile.ExecutionTime = job.Metadata.Generics.ExecutionTime; + metafile.Tools = job.Metadata.Tools; + metafile.Customs = job.Metadata.Customs; + using (StreamWriter file = System.IO.File.CreateText(JOB_OPENING_PATH + JOB_METADATA_FILENAME)) + { + JsonSerializer serializer = new JsonSerializer(); + serializer.Formatting = Formatting.Indented; + serializer.Serialize(file, metafile); + } + + //Main Program + System.IO.File.WriteAllText(JOB_OPENING_PATH + JOB_MAIN_FILENAME, job.IsoMainProgram); + + //images + int id = 1; + foreach(string imgs in job.Metadata.Generics.Images) + { + System.IO.File.WriteAllBytes(JOB_OPENING_PATH + "image_"+ id + "." + GetExtensionFromBase64(imgs), Convert.FromBase64String(GetContentFromBase64(imgs))); + id++; + } + + //delete Zip File if exists + if (System.IO.File.Exists(jobSaveFileDialog.FileName)) + System.IO.File.Delete(jobSaveFileDialog.FileName); + + //Create Zip File + ZipFile.CreateFromDirectory(JOB_OPENING_PATH, jobSaveFileDialog.FileName); + + } + + e.SetReturnValue(null); + return; + + } + + + //Clear the temp folder files + private void ClearTempPath() + { + DirectoryInfo di = new DirectoryInfo(JOB_OPENING_PATH); + foreach (FileInfo file in di.GetFiles()) + file.Delete(); + foreach (DirectoryInfo dir in di.GetDirectories()) + dir.Delete(true); + } + + + //Clear the temp folder files + private string GetExtensionFromBase64(string base64img) + { + base64img = base64img.Remove(0,"data:image/".Length); + return base64img.Substring(0, base64img.IndexOf(";base64,")); + } + + + //Clear the temp folder files + private string GetContentFromBase64(string base64img) + { + return base64img.Substring(base64img.IndexOf(";base64,") + ";base64,".Length); + } + #endregion } } diff --git a/Client/Browser_Tools/Models/JobToStep.cs b/Client/Browser_Tools/Models/JobToStep.cs new file mode 100644 index 00000000..502f0db7 --- /dev/null +++ b/Client/Browser_Tools/Models/JobToStep.cs @@ -0,0 +1,22 @@ +using CMS_Client.Browser_Tools.Models.Metadata; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CMS_Client.Browser_Tools.Models +{ + public class JobToStep + { + public string Name; + public DateTime LastEditTimestamp; + public string IsoMainProgram; + public Metas Metadata; + + public JobToStep() + { + Metadata = new Metas(); + } + } +} diff --git a/Client/Browser_Tools/Models/Metadata/Custom_Param.cs b/Client/Browser_Tools/Models/Metadata/Custom_Param.cs new file mode 100644 index 00000000..8ba0f1f2 --- /dev/null +++ b/Client/Browser_Tools/Models/Metadata/Custom_Param.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CMS_Client.Browser_Tools.Models.Metadata +{ + public class Custom_Param + { + public string Name; + public string Type; + public List SelectionList; + + public Custom_Param() + { + SelectionList = new List(); + } + } +} diff --git a/Client/Browser_Tools/Models/Metadata/Generic_Params.cs b/Client/Browser_Tools/Models/Metadata/Generic_Params.cs new file mode 100644 index 00000000..e7674f55 --- /dev/null +++ b/Client/Browser_Tools/Models/Metadata/Generic_Params.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CMS_Client.Browser_Tools.Models.Metadata +{ + public class Generic_Params + { + public List Images; + public string Description; + public TimeSpan ExecutionTime; + + public Generic_Params() + { + Images = new List(); + } + } +} diff --git a/Client/Browser_Tools/Models/Metadata/Metas.cs b/Client/Browser_Tools/Models/Metadata/Metas.cs new file mode 100644 index 00000000..4d2356dc --- /dev/null +++ b/Client/Browser_Tools/Models/Metadata/Metas.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CMS_Client.Browser_Tools.Models.Metadata +{ + public class Metas + { + public Generic_Params Generics; + public List Tools; + public List Customs; + + public Metas() + { + Generics = new Generic_Params(); + Tools = new List(); + Customs = new List(); + } + } +} diff --git a/Client/Browser_Tools/Models/MetadataToFile.cs b/Client/Browser_Tools/Models/MetadataToFile.cs new file mode 100644 index 00000000..94c5d338 --- /dev/null +++ b/Client/Browser_Tools/Models/MetadataToFile.cs @@ -0,0 +1,23 @@ +using CMS_Client.Browser_Tools.Models.Metadata; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CMS_Client.Browser_Tools.Models +{ + public class MetadataToFile + { + public string Description; + public TimeSpan ExecutionTime; + public List Tools; + public List Customs; + + public MetadataToFile() + { + Tools = new List(); + Customs = new List(); + } + } +} diff --git a/Client/Client.csproj b/Client/Client.csproj index 0cd3dfff..e0a7f275 100644 --- a/Client/Client.csproj +++ b/Client/Client.csproj @@ -135,6 +135,8 @@ + + @@ -153,6 +155,11 @@ + + + + + Form