using CefSharp; using Client.Config; using Client.Config.SubModels; using Client2020.BrowserTools.Models; using Client2020.BrowserTools.Models.Errors; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Threading; using System.Windows.Forms; namespace Client2020.BrowserTools { public class BrowserJSObject { private Form mainForm; private static readonly string[] _validExtensions = { ".json", ".rcp", ".tpl" }; //private static readonly string[] _validExtensions = { "", ".txt", ".cnc", ".cn", ".cno", ".ini", ".mpf", ".spf", ".tap", ".anc", ".iso" }; private static readonly string[] _validImages = { ".svg" }; private static string jobPath = ""; private static Dictionary _editorOpened = new Dictionary(); public static string RECENT_FOLDER_KEY = "RECENT"; private const string THERMO_RECIPE_PATH = @"C:\CMS\Recipes"; private const string THERMO_RECIPE_FOLDER_NAME = @"Recipes"; private const string THERMO_SCREENSHOT_PATH = @"C:\CMS\Screenshots"; private const string CMS_PATH = @"C:\CMS"; #region CONSTRUCTOR_METHOD public BrowserJSObject(Form f) { mainForm = f; } #endregion CONSTRUCTOR_METHOD #region FORM_BEHAVIOUR_METHODS public void minimizeForm() { //Invoke method if is needed or call the method in STD mode if (mainForm.InvokeRequired) mainForm.Invoke((MethodInvoker)delegate () { mainForm.WindowState = FormWindowState.Minimized; }); else { mainForm.WindowState = FormWindowState.Minimized; } } // Maximize Main Window public void maximizeForm() { //Invoke method if is needed or call the method in STD mode if (mainForm.InvokeRequired) mainForm.Invoke((MethodInvoker)delegate () { mainForm.WindowState = FormWindowState.Maximized; }); else { mainForm.WindowState = FormWindowState.Maximized; } } // Close Main Window public void closeForm() { //If the mainform is disposed do nothing if (mainForm.IsDisposed) return; //Invoke method if is needed or call the method in STD mode Application.Exit(); } public string takeScreenshot(string RecipeName) { string path = THERMO_SCREENSHOT_PATH + "\\" + RecipeName; string pathFile = THERMO_SCREENSHOT_PATH + "\\" + RecipeName + "\\" + DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss") + ".jpg"; try { if (!Directory.Exists(path)) Directory.CreateDirectory(path); Bitmap captureBitmap = new Bitmap(1920, 1080, PixelFormat.Format32bppArgb); Rectangle captureRectangle = Screen.AllScreens[0].Bounds; Graphics captureGraphics = Graphics.FromImage(captureBitmap); captureGraphics.CopyFromScreen(captureRectangle.Left, captureRectangle.Top, 0, 0, captureRectangle.Size); captureBitmap.Save(pathFile, ImageFormat.Jpeg); } catch (Exception ex) { return (JsonConvert.SerializeObject(new ErrorContainer("cannot_create_image"))); } return (JsonConvert.SerializeObject(new ScreenshotController(pathFile))); ; } #endregion FORM_BEHAVIOUR_METHODS #region NC_BEHAVIOUR_METHODS public void setNcWindowState(int val) { } public int getNcWindowState() { return 0; } public string getScreenBase64() { return ""; } #endregion NC_BEHAVIOUR_METHODS #region CHROMIUM_METHODS // Get the Version of Chromium public string getChromiumVersion() { return Cef.ChromiumVersion + " (" + Application.ProductVersion + ")"; } #endregion CHROMIUM_METHODS #region STEP_METHODS // Get the ID of STEP Client public int getClientID() { return Config.ConnectionConfig.Id; } public void forceStepFocus() { } public void forceNcFocus() { } public void forceProdFocus() { } // Get the option of virtual Keyb configured public bool isVirtualKeybConfigured() { return Config.ClientConfig.ShowVirtualKeyboard; } // Get the option of virtual Keyb configured public bool isHMIenabled() { return Config.VendorHmiConfig.Enabled; } // Get the option of PROD Enabled public bool isPRODenabled() { return Config.ProdSoftwareConfig.Enabled; } // Get the SCM option public bool isSCMVisualStyle() { return Config.ClientConfig.IsSCM; } public string openExternalBrowser(string proc) { Process.Start(proc); return ""; } #endregion STEP_METHODS #region PROCESSES_METHODS // Read all configured processes public string getConfiguredProcesses() { return JsonConvert.SerializeObject(Config.ExtSoftwaresConfig.Where(X => X.inMainMenuBar == false)); } // Read all configured processes in main menu public string getConfiguredProcessesInMainMenu() { return JsonConvert.SerializeObject(Config.ExtSoftwaresConfig.Where(X => X.inMainMenuBar == true)); } // Start a new process public void startNewProcess(string proc) { Thread t = new Thread(new ParameterizedThreadStart(OpenNew)); t.Start(proc); } // Open the last window or Start a new process public void openOrStartProcess(string proc) { Thread t = new Thread(new ParameterizedThreadStart(OpenStartNew)); t.Start(proc); } // Function used in Thread private void OpenStartNew(object id) { Software sft = Config.ExtSoftwaresConfig.FirstOrDefault(X => X.id == (string)id); if (sft != null && File.Exists(sft.path)) { Process[] p = Process.GetProcessesByName(Path.GetFileNameWithoutExtension(sft.path)).OrderByDescending(X => X.StartTime).ToArray(); if (p.Count() > 0 && p[0].MainWindowHandle != IntPtr.Zero) NcWindow.ForceExtFocus(p[0].MainWindowHandle, 0, 0, 0, 0); else { ProcessStartInfo PS = new ProcessStartInfo(sft.path, sft.arguments); PS.WorkingDirectory = new FileInfo(sft.path).Directory.FullName; Process.Start(PS); } } } // Function used in Thread private void OpenNew(object id) { Software sft = Config.ExtSoftwaresConfig.FirstOrDefault(X => X.id == (string)id); if (sft != null) { ProcessStartInfo PS = new ProcessStartInfo(sft.path, sft.arguments); PS.WorkingDirectory = new FileInfo(sft.path).Directory.FullName; Process.Start(PS); } } #endregion PROCESSES_METHODS #region FILESYSTEM_METHODS public string getOSdriveList() { List drivelist = new List(); if (Directory.Exists(THERMO_RECIPE_PATH)) { drivelist.Add(new Drive() { Name = ElaborateName("Recipes", "", DriveType.Unknown), Path = THERMO_RECIPE_PATH + "\\", Type = "SPFO" }); } return JsonConvert.SerializeObject(drivelist); } public string getOSextDriveList() { List drivelist = new List(); // USB & HD Drives foreach (var drive in DriveInfo.GetDrives()) { if (drive.IsReady) { //Filter NC Address if (drive.DriveType != DriveType.Network && drive.DriveType == DriveType.Removable) { drivelist.Add(new Drive() { Name = ElaborateName(drive.VolumeLabel, drive.Name.TrimEnd('\\'), drive.DriveType), Path = drive.RootDirectory.ToString(), Type = ElaborateType(drive.DriveType) }); } } } return JsonConvert.SerializeObject(drivelist); } public string backupRecipes(String p) { if (!Directory.Exists(p)) { return (JsonConvert.SerializeObject(new ErrorContainer("path_not_exists"))); } try { string finalPath = p + "Backup_Recipes_" + DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss"); Directory.CreateDirectory(finalPath); this.CopyFilesRecursively(new DirectoryInfo(THERMO_RECIPE_PATH),new DirectoryInfo(finalPath)); Process.Start(finalPath); } catch (Exception e) { return (JsonConvert.SerializeObject(new ErrorContainer("error_during_backup"))); } return JsonConvert.SerializeObject(""); } public string backupSubRecipes(String p, String folder) { if (!Directory.Exists(p)) { return (JsonConvert.SerializeObject(new ErrorContainer("path_not_exists"))); } folder = folder.Remove(0,THERMO_RECIPE_FOLDER_NAME.Length); try { string finalPath = p + "Backup_Recipes_" + DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss"); Directory.CreateDirectory(finalPath); this.CopyFilesRecursively(new DirectoryInfo(THERMO_RECIPE_PATH + folder), new DirectoryInfo(finalPath)); File.WriteAllText(finalPath + "\\data.json", JsonConvert.SerializeObject(new FolderBackup(folder))); Process.Start(finalPath); } catch (Exception e) { return (JsonConvert.SerializeObject(new ErrorContainer("error_during_backup"))); } return JsonConvert.SerializeObject(""); } // Read all files in directory public string getFileList(string p) { List filelist = new List(); if (p != RECENT_FOLDER_KEY && !Directory.Exists(p)) { return (JsonConvert.SerializeObject(new ErrorContainer("file_not_exists"))); } try { if (p == RECENT_FOLDER_KEY) { filelist = new List(); } else { // Add directories foreach (string item in Directory.GetDirectories(p)) { filelist.Add(new FileModel { Name = Path.GetFileName(item), AbsolutePath = Path.GetFullPath(item), Path = Path.GetFullPath(item), IsDirectory = true, FileExist = true, IsMain = false }); } // Add files foreach (string item in Directory.GetFiles(p)) { if (_validExtensions.Contains(Path.GetExtension(item).ToLower())) { bool isJob = false; filelist.Add(new FileModel { Name = Path.GetFileName(item), AbsolutePath = Path.GetFullPath(item), Path = Path.GetFullPath(item), IsDirectory = false, IsJob = isJob, IsMain = false, FileExist = true }); } } } } catch { } return (JsonConvert.SerializeObject(filelist)); } // Read info of a file public string getProgramInfo(string p) { string imagePath, imageDirectory; if (!File.Exists(p)) { return (JsonConvert.SerializeObject(new InfoFile())); } FileInfo f = new FileInfo(p); InfoFile file = new InfoFile { Name = f.Name, CreationDate = f.CreationTime, LastModDate = f.LastAccessTime, AbsolutePath = p, CanEdit = !f.IsReadOnly }; imagePath = Path.GetFileNameWithoutExtension(p); imageDirectory = Path.GetDirectoryName(p); file.SheetX = ""; file.SheetY = ""; file.SheetZ = ""; file.Annotation = ""; try { dynamic content = JsonConvert.DeserializeObject(File.ReadAllText(p)); if (content != null && content.RecipeParameters != null) { if (content.RecipeParameters.general_sizes_sheet_dim_x != null) file.SheetX = content.RecipeParameters.general_sizes_sheet_dim_x; if (content.RecipeParameters.general_sizes_sheet_dim_y != null) file.SheetY = content.RecipeParameters.general_sizes_sheet_dim_y; if (content.RecipeParameters.general_sizes_sheet_thickness != null) file.SheetZ = content.RecipeParameters.general_sizes_sheet_thickness; if (content.recipeNotes != null) file.Annotation = content.recipeNotes; } foreach (string ext in _validImages) { if (File.Exists(imageDirectory + "/" + imagePath + ext)) { if (ext.ToLower().Equals(".svg")) file.PreviewBase64 = File.ReadAllText(imageDirectory + "/" + imagePath + ext); else file.PreviewBase64 = "data:image/" + ext + ";base64," + Convert.ToBase64String(File.ReadAllBytes(imageDirectory + "/" + imagePath + ext)); break; } } } catch (Exception ex) { } return (JsonConvert.SerializeObject(file)); } public string duplicateRecipe(string p1, string p2) { string oldFile = CMS_PATH + "\\" + p1 + ".rcp"; string newFile = CMS_PATH + "\\" + p2 + ".rcp"; string oldImage = CMS_PATH + "\\" + p1 + ".svg"; string newImage = CMS_PATH + "\\" + p2 + ".svg"; if (!File.Exists(oldFile)) { return (JsonConvert.SerializeObject(new ErrorContainer("file_not_found"))); } if (File.Exists(newFile)) { return (JsonConvert.SerializeObject(new ErrorContainer("file_already_exists"))); } try { File.Copy(oldFile, newFile, true); if (File.Exists(oldImage)) { File.Copy(oldImage, newImage, true); } } catch (Exception ex) { return(JsonConvert.SerializeObject(new ErrorContainer("cannot_copy_file"))); } return ""; } public string getAllRecipeDirectories() { List dirs = this.DirSearch(THERMO_RECIPE_PATH); for (int i = 0; i < dirs.Count; i++) { dirs[i] = dirs[i].Remove(0, CMS_PATH.Length + 1); } return(JsonConvert.SerializeObject(dirs)); } public string deleteFile(string p) { FileAttributes attr = File.GetAttributes(p); if (!File.Exists(p) || attr.HasFlag(FileAttributes.Directory)) { return (JsonConvert.SerializeObject(new ErrorContainer("file_not_found"))); } if (attr.HasFlag(FileAttributes.ReadOnly)) { return (JsonConvert.SerializeObject(new ErrorContainer("file_not_editable"))); } try { File.Delete(p); string images = Path.ChangeExtension(p, "svg"); if (File.Exists(images)) { File.Delete(images); } } catch (Exception ex) { return (JsonConvert.SerializeObject(new ErrorContainer("cannot_delete_file"))); } return ""; } public string deleteFolder(string p) { FileAttributes attr = File.GetAttributes(p); if (!Directory.Exists(p) || !attr.HasFlag(FileAttributes.Directory)) { return (JsonConvert.SerializeObject(new ErrorContainer("directory_not_found"))); } if (attr.HasFlag(FileAttributes.ReadOnly)) { return (JsonConvert.SerializeObject(new ErrorContainer("directory_not_editable"))); } try { Directory.Delete(p, true); } catch (Exception ex) { return (JsonConvert.SerializeObject(new ErrorContainer("cannot_delete_directory"))); } return ""; } public string createFolder(string path) { if (Directory.Exists(path)) { return (JsonConvert.SerializeObject(new ErrorContainer("directory_already_exists"))); } try { Directory.CreateDirectory(path); } catch (Exception ex) { return (JsonConvert.SerializeObject(new ErrorContainer("cannot_delete_directory"))); } return ""; } // Private functions private string ElaborateType(DriveType type) { switch (type) { case DriveType.Fixed: return "HD"; case DriveType.Removable: return "USB"; case DriveType.Network: return "NTW"; } return "SPFO"; } private string ElaborateName(string name, string letter, DriveType type) { var retName = ""; if (!string.IsNullOrWhiteSpace(name)) retName = name; else { switch (type) { case DriveType.Fixed: retName = "Hard_Disk"; break; case DriveType.Removable: retName = "Usb_Disk"; break; case DriveType.Network: retName = "Netword_Disk"; break; default: retName = "Undefined"; break; } } if (!string.IsNullOrWhiteSpace(letter)) retName = retName + " (" + letter + ")"; return retName; } public void CopyFilesRecursively(DirectoryInfo source, DirectoryInfo target) { foreach (DirectoryInfo dir in source.GetDirectories()) CopyFilesRecursively(dir, target.CreateSubdirectory(dir.Name)); foreach (FileInfo file in source.GetFiles()) file.CopyTo(Path.Combine(target.FullName, file.Name)); } private List DirSearch(string sDir) { List files = new List(); try { files.Add(sDir); foreach (string d in Directory.GetDirectories(sDir)) { files.AddRange(DirSearch(d)); } } catch (System.Exception excpt) { MessageBox.Show(excpt.Message); } return files; } public void cleanFileWatcher() { } #endregion FILESYSTEM_METHODS } }