///<summary>Copies or downloads the file and opens it. acutalFileName should be a full path, displayedFileName should be a file name only. ///</summary> public static void OpenFile(string actualFilePath, string displayedFileName = "") { try { string tempFile; if (displayedFileName == "") { tempFile = ODFileUtils.CombinePaths(PrefC.GetTempFolderPath(), Path.GetFileName(actualFilePath)); } else { tempFile = ODFileUtils.CombinePaths(PrefC.GetTempFolderPath(), displayedFileName); } if (CloudStorage.IsCloudStorage) { FormProgress FormP = CreateFormProgress("Downloading..."); OpenDentalCloud.Core.TaskStateDownload state = CloudStorage.DownloadAsync(Path.GetDirectoryName(actualFilePath), Path.GetFileName(actualFilePath), new OpenDentalCloud.ProgressHandler(FormP.OnProgress)); FormP.ShowDialog(); if (FormP.DialogResult == DialogResult.Cancel) { state.DoCancel = true; return; } File.WriteAllBytes(tempFile, state.FileContent); } else //Not Cloud //We have to create a copy of the file because the name is different. //There is also a high probability that the attachment no longer exists if //images are stored in the database, since the file will have originally been //placed in the temporary directory. { File.Copy(actualFilePath, tempFile, true); } if (ODBuild.IsWeb()) { ThinfinityUtils.HandleFile(tempFile); } else { Process.Start(tempFile); } } catch (Exception ex) { MessageBox.Show(ex.Message); } }
///<summary>The first parameter, 'sourceFileName', must be a file that exists.</summary> public static void Copy(string sourceFileName, string destinationFileName, FileAtoZSourceDestination sourceDestination, string uploadMessage = "Copying file...", bool isFolder = false) { if (CloudStorage.IsCloudStorage) { sourceFileName = CloudStorage.PathTidy(sourceFileName); destinationFileName = CloudStorage.PathTidy(destinationFileName); FormProgress FormP = CreateFormProgress(uploadMessage, isFolder); OpenDentalCloud.TaskState state; if (sourceDestination == FileAtoZSourceDestination.AtoZToAtoZ) { state = CloudStorage.CopyAsync(sourceFileName, destinationFileName, new OpenDentalCloud.ProgressHandler(FormP.OnProgress)); } else if (sourceDestination == FileAtoZSourceDestination.LocalToAtoZ) { state = CloudStorage.UploadAsync(Path.GetDirectoryName(destinationFileName), Path.GetFileName(destinationFileName), File.ReadAllBytes(sourceFileName), new OpenDentalCloud.ProgressHandler(FormP.OnProgress)); } else if (sourceDestination == FileAtoZSourceDestination.AtoZToLocal) { state = CloudStorage.DownloadAsync(Path.GetDirectoryName(sourceFileName), Path.GetFileName(sourceFileName), new OpenDentalCloud.ProgressHandler(FormP.OnProgress)); } else { throw new Exception("Unsupported " + nameof(FileAtoZSourceDestination) + ": " + sourceDestination); } FormP.ShowDialog(); if (FormP.DialogResult == DialogResult.Cancel) { state.DoCancel = true; return; } if (sourceDestination == FileAtoZSourceDestination.AtoZToLocal) { File.WriteAllBytes(destinationFileName, ((OpenDentalCloud.Core.TaskStateDownload)state).FileContent); } } else //Not cloud { File.Copy(sourceFileName, destinationFileName); } }
///<summary>Writes or uploads the text to the specified file name.</summary> public static void WriteAllText(string fileName, string textForFile, string uploadMessage = "Uploading file") { if (CloudStorage.IsCloudStorage) { FormProgress FormP = CreateFormProgress(uploadMessage); OpenDentalCloud.Core.TaskStateUpload state = CloudStorage.UploadAsync(Path.GetDirectoryName(fileName), Path.GetFileName(fileName), Encoding.UTF8.GetBytes(textForFile), new OpenDentalCloud.ProgressHandler(FormP.OnProgress)); FormP.ShowDialog(); if (FormP.DialogResult == DialogResult.Cancel) { state.DoCancel = true; return; } } else //Not cloud { File.WriteAllText(fileName, textForFile); } }
///<summary>Returns the string contents of the file.</summary> public static string ReadAllText(string fileName) { if (CloudStorage.IsCloudStorage) { FormProgress FormP = CreateFormProgress("Downloading..."); OpenDentalCloud.Core.TaskStateDownload state = CloudStorage.DownloadAsync(Path.GetDirectoryName(fileName), Path.GetFileName(fileName), new OpenDentalCloud.ProgressHandler(FormP.OnProgress)); FormP.ShowDialog(); if (FormP.DialogResult == DialogResult.Cancel) { state.DoCancel = true; return(""); } return(Encoding.UTF8.GetString(state.FileContent)); } else //Not cloud { return(File.ReadAllText(fileName)); } }
private void butOpen_Click(object sender, EventArgs e) { if (PrefC.AtoZfolderUsed == DataStorageType.LocalAtoZ) { System.Diagnostics.Process.Start("Explorer", Path.GetDirectoryName(textFileName.Text)); } else if (CloudStorage.IsCloudStorage) //First download, then open { FormProgress FormP = new FormProgress(); FormP.DisplayText = "Downloading..."; FormP.NumberFormat = "F"; FormP.NumberMultiplication = 1; FormP.MaxVal = 100; //Doesn't matter what this value is as long as it is greater than 0 FormP.TickMS = 1000; string patFolder; if (!TryGetPatientFolder(out patFolder, false)) { return; } OpenDentalCloud.Core.TaskStateDownload state = CloudStorage.DownloadAsync(patFolder , DocCur.FileName , new OpenDentalCloud.ProgressHandler(FormP.OnProgress)); FormP.ShowDialog(); if (FormP.DialogResult == DialogResult.Cancel) { state.DoCancel = true; return; } //Create temp file here or create the file with the actual name? Changes made when opening the file won't be saved, so I think temp file is best. string tempFile = PrefC.GetRandomTempFile(Path.GetExtension(DocCur.FileName)); File.WriteAllBytes(tempFile, state.FileContent); if (ODBuild.IsWeb()) { ThinfinityUtils.HandleFile(tempFile); } else { System.Diagnostics.Process.Start(tempFile); } } }
///<summary>Runs the file. Downloads it from the cloud if necessary.</summary> public static void StartProcess(string fileName) { string filePathToOpen; if (CloudStorage.IsCloudStorage) { FormProgress FormP = CreateFormProgress("Downloading..."); OpenDentalCloud.Core.TaskStateDownload state = CloudStorage.DownloadAsync(Path.GetDirectoryName(fileName), Path.GetFileName(fileName), new OpenDentalCloud.ProgressHandler(FormP.OnProgress)); FormP.ShowDialog(); if (FormP.DialogResult == DialogResult.Cancel) { state.DoCancel = true; return; } filePathToOpen = PrefC.GetRandomTempFile(Path.GetExtension(fileName)); File.WriteAllBytes(filePathToOpen, state.FileContent); } else { filePathToOpen = fileName; } Process.Start(filePathToOpen); }
private void butDownload_Click(object sender, System.EventArgs e) { File.Delete(PrefB.GetString("DocPath") + "Setup.exe"); //fixes a minor bug string remoteUri = textWebsitePath.Text + textRegMain.Text + "/"; //WebClient myWebClient=new WebClient(); myStringWebResource = remoteUri + "Setup.exe"; WriteToFile = PrefB.GetString("DocPath") + "Setup.exe"; WebRequest wr = WebRequest.Create(myStringWebResource); WebResponse webResp = wr.GetResponse(); int fileSize = (int)webResp.ContentLength / 1024; //start the thread that will perform the download Thread workerThread = new Thread(new ThreadStart(InstanceMethod)); workerThread.Start(); //display the progress dialog to the user: FormP = new FormProgress(); FormP.MaxVal = (double)fileSize / 1024; FormP.NumberMultiplication = 100; FormP.DisplayText = "?currentVal MB of ?maxVal MB copied"; FormP.NumberFormat = "F"; FormP.ShowDialog(); if (FormP.DialogResult == DialogResult.Cancel) { workerThread.Abort(); return; } MsgBox.Show(this, "Download succeeded. Setup program will now begin. When done, restart the program on this computer, then on the other computers."); try{ Process.Start(PrefB.GetString("DocPath") + "Setup.exe"); Application.Exit(); } catch { MsgBox.Show(this, "Could not launch setup"); } }
private void butBackup_Click(object sender, System.EventArgs e) { if (!IsBackupTabValid()) { return; } //Ensure that the backup from and backup to paths are different. This is to prevent the live database //from becoming corrupt. if (this.textBackupFromPath.Text.Trim().ToLower() == this.textBackupToPath.Text.Trim().ToLower()) { MsgBox.Show(this, "The backup from path and backup to path must be different."); return; } //test saving defaults if (textBackupFromPath.Text != PrefC.GetString(PrefName.BackupFromPath) || textBackupToPath.Text != PrefC.GetString(PrefName.BackupToPath) || textBackupRestoreFromPath.Text != PrefC.GetString(PrefName.BackupRestoreFromPath) || textBackupRestoreToPath.Text != PrefC.GetString(PrefName.BackupRestoreToPath) || textBackupRestoreAtoZToPath.Text != PrefC.GetString(PrefName.BackupRestoreAtoZToPath)) { if (MsgBox.Show(this, MsgBoxButtons.YesNo, "Set as default?") && SaveTabPrefs()) { DataValid.SetInvalid(InvalidType.Prefs); } } string dbName = MiscData.GetCurrentDatabase(); if (InnoDb.HasInnoDbTables(dbName)) { //Database has innodb tables. Backup tool does not work on dbs with InnoDb tables. MsgBox.Show(this, "InnoDb tables detected. Backup tool cannot run with InnoDb tables."); return; } if (!Directory.Exists(ODFileUtils.CombinePaths(textBackupFromPath.Text, dbName))) // C:\mysql\data\opendental { MsgBox.Show(this, "Backup FROM path is invalid."); return; } if (!Directory.Exists(textBackupToPath.Text)) // D:\ { MsgBox.Show(this, "Backup TO path is invalid."); return; } _errorMessage = ""; FormP = new FormProgress(); FormP.MaxVal = 100; //We will be setting maxVal from worker thread. (double)fileSize/1024; FormP.NumberMultiplication = 100; FormP.DisplayText = ""; //We will set the text from the worker thread. FormP.NumberFormat = "N1"; //start the thread that will perform the database copy Thread workerThread = new Thread(new ThreadStart(InstanceMethodBackup)); workerThread.Start(); //display the progress dialog to the user: FormP.ShowDialog(); if (FormP.DialogResult == DialogResult.Cancel) { workerThread.Abort(); return; } if (_errorMessage == "") { SecurityLogs.MakeLogEntry(Permissions.Backup, 0, Lan.g(this, "Database backup created at ") + textBackupToPath.Text); MessageBox.Show(Lan.g(this, "Backup complete.")); } else //Backup failed for some reason. { MessageBox.Show(_errorMessage); } Close(); }
/// <summary>destinationPath includes filename (Setup.exe). destinationPath2 will create a second copy at the specified path/filename, or it will be skipped if null or empty.</summary> public static void DownloadInstallPatchFromURI(string downloadUri,string destinationPath,bool runSetupAfterDownload,bool showShutdownWindow,string destinationPath2) { string[] dblist=PrefC.GetString(PrefName.UpdateMultipleDatabases).Split(new string[] {","},StringSplitOptions.RemoveEmptyEntries); if(showShutdownWindow) { //Even if updating multiple databases, extra shutdown signals are not needed. FormShutdown FormSD=new FormShutdown(); FormSD.IsUpdate=true; FormSD.ShowDialog(); if(FormSD.DialogResult==DialogResult.OK) { //turn off signal reception for 5 seconds so this workstation will not shut down. FormOpenDental.signalLastRefreshed=MiscData.GetNowDateTime().AddSeconds(5); Signalod sig=new Signalod(); sig.ITypes=((int)InvalidType.ShutDownNow).ToString(); sig.SigType=SignalType.Invalid; Signalods.Insert(sig); Computers.ClearAllHeartBeats(Environment.MachineName);//always assume success //SecurityLogs.MakeLogEntry(Permissions.Setup,0,"Shutdown all workstations.");//can't do this because sometimes no user. } //continue on even if user clicked cancel //no other workstation will be able to start up until this value is reset. Prefs.UpdateString(PrefName.UpdateInProgressOnComputerName,Environment.MachineName); } MiscData.LockWorkstationsForDbs(dblist);//lock workstations for other db's. File.Delete(destinationPath); WebRequest wr=WebRequest.Create(downloadUri); WebResponse webResp=null; try{ webResp=wr.GetResponse(); } catch(Exception ex){ CodeBase.MsgBoxCopyPaste msgbox=new MsgBoxCopyPaste(ex.Message+"\r\nUri: "+downloadUri); msgbox.ShowDialog(); MiscData.UnlockWorkstationsForDbs(dblist);//unlock workstations since nothing was actually done. return; } int fileSize=(int)webResp.ContentLength/1024; FormProgress FormP=new FormProgress(); //start the thread that will perform the download System.Threading.ThreadStart downloadDelegate= delegate { DownloadInstallPatchWorker(downloadUri,destinationPath,ref FormP); }; Thread workerThread=new System.Threading.Thread(downloadDelegate); workerThread.Start(); //display the progress dialog to the user: FormP.MaxVal=(double)fileSize/1024; FormP.NumberMultiplication=100; FormP.DisplayText="?currentVal MB of ?maxVal MB copied"; FormP.NumberFormat="F"; FormP.ShowDialog(); if(FormP.DialogResult==DialogResult.Cancel) { workerThread.Abort(); MiscData.UnlockWorkstationsForDbs(dblist);//unlock workstations since nothing was actually done. return; } //copy to second destination directory if(destinationPath2!=null && destinationPath2!=""){ if(File.Exists(destinationPath2)){ File.Delete(destinationPath2); } File.Copy(destinationPath,destinationPath2); } //copy the Setup.exe to the AtoZ folders for the other db's. List<string> atozNameList=MiscData.GetAtoZforDb(dblist); for(int i=0;i<atozNameList.Count;i++) { if(destinationPath==Path.Combine(atozNameList[i],"Setup.exe")) {//if they are sharing an AtoZ folder. continue; } if(Directory.Exists(atozNameList[i])) { File.Copy(destinationPath,//copy the Setup.exe that was just downloaded to this AtoZ folder Path.Combine(atozNameList[i],"Setup.exe"),//to the other atozFolder true);//overwrite } } if(!runSetupAfterDownload) { return; } string msg=Lan.g("FormUpdate","Download succeeded. Setup program will now begin. When done, restart the program on this computer, then on the other computers."); if(dblist.Length > 0){ msg="Download succeeded. Setup file probably copied to other AtoZ folders as well. Setup program will now begin. When done, restart the program for each database on this computer, then on the other computers."; } if(MessageBox.Show(msg,"",MessageBoxButtons.OKCancel) !=DialogResult.OK){ //Clicking cancel gives the user a chance to avoid running the setup program, Prefs.UpdateString(PrefName.UpdateInProgressOnComputerName,"");//unlock workstations, since nothing was actually done. return; } try{ Process.Start(destinationPath); Application.Exit(); } catch{ Prefs.UpdateString(PrefName.UpdateInProgressOnComputerName,"");//unlock workstations, since nothing was actually done. MsgBox.Show(FormP,"Could not launch setup"); } }
///<summary>Uses sheet framework to generate a PDF file, save it to patient's image folder, and attempt to launch file with defualt reader. ///If using ImagesStoredInDB it will not launch PDF. If no valid patient is selected you cannot perform this action.</summary> private void butPDF_Click(object sender, EventArgs e) { if (PatCur == null) //not attached to a patient when form loaded and they haven't selected a patient to attach to yet { MsgBox.Show(this, "The Medical Lab must be attached to a patient before the PDF can be saved."); return; } if (PatCur.PatNum > 0 && _medLabCur.PatNum != PatCur.PatNum) //save the current patient attached to the MedLab if it has been changed { MoveLabsAndImagesHelper(); } Cursor = Cursors.WaitCursor; SheetDef sheetDef = SheetUtil.GetMedLabResultsSheetDef(); Sheet sheet = SheetUtil.CreateSheet(sheetDef, _medLabCur.PatNum); SheetFiller.FillFields(sheet, null, null, _medLabCur); //create the file in the temp folder location, then import so it works when storing images in the db string tempPath = ODFileUtils.CombinePaths(PrefC.GetTempFolderPath(), _medLabCur.PatNum.ToString() + ".pdf"); SheetPrinting.CreatePdf(sheet, tempPath, null, _medLabCur); HL7Def defCur = HL7Defs.GetOneDeepEnabled(true); long category = defCur.LabResultImageCat; if (category == 0) { category = Defs.GetFirstForCategory(DefCat.ImageCats, true).DefNum; //put it in the first category. } //create doc-------------------------------------------------------------------------------------- OpenDentBusiness.Document docc = null; try { docc = ImageStore.Import(tempPath, category, Patients.GetPat(_medLabCur.PatNum)); } catch (Exception ex) { ex.DoNothing(); Cursor = Cursors.Default; MsgBox.Show(this, "Error saving document."); return; } finally { //Delete the temp file since we don't need it anymore. try { File.Delete(tempPath); } catch { //Do nothing. This file will likely get cleaned up later. } } docc.Description = Lan.g(this, "MedLab Result"); docc.DateCreated = DateTime.Now; Documents.Update(docc); string filePathAndName = ""; if (PrefC.AtoZfolderUsed == DataStorageType.LocalAtoZ) { string patFolder = ImageStore.GetPatientFolder(Patients.GetPat(_medLabCur.PatNum), ImageStore.GetPreferredAtoZpath()); filePathAndName = ODFileUtils.CombinePaths(patFolder, docc.FileName); } else if (CloudStorage.IsCloudStorage) { FormProgress FormP = new FormProgress(); FormP.DisplayText = "Downloading..."; FormP.NumberFormat = "F"; FormP.NumberMultiplication = 1; FormP.MaxVal = 100; //Doesn't matter what this value is as long as it is greater than 0 FormP.TickMS = 1000; OpenDentalCloud.Core.TaskStateDownload state = CloudStorage.DownloadAsync( ImageStore.GetPatientFolder(Patients.GetPat(_medLabCur.PatNum), ImageStore.GetPreferredAtoZpath()) , docc.FileName , new OpenDentalCloud.ProgressHandler(FormP.OnProgress)); if (FormP.ShowDialog() == DialogResult.Cancel) { state.DoCancel = true; return; } filePathAndName = PrefC.GetRandomTempFile(Path.GetExtension(docc.FileName)); File.WriteAllBytes(filePathAndName, state.FileContent); } Cursor = Cursors.Default; if (filePathAndName != "") { Process.Start(filePathAndName); } SecurityLogs.MakeLogEntry(Permissions.SheetEdit, sheet.PatNum, sheet.Description + " from " + sheet.DateTimeSheet.ToShortDateString() + " pdf was created"); DialogResult = DialogResult.OK; }
private void butImport_Click(object sender, EventArgs e) { OpenFileDialog dlg = new OpenFileDialog(); dlg.Multiselect = false; if (dlg.ShowDialog() != DialogResult.OK) { return; } if (!File.Exists(dlg.FileName)) { MsgBox.Show(this, "File does not exist."); return; } if (!ImageHelper.HasImageExtension(dlg.FileName)) { MsgBox.Show(this, "Only allowed to import an image."); return; } string newName = dlg.FileName; if (PrefC.AtoZfolderUsed == DataStorageType.LocalAtoZ) { newName = ODFileUtils.CombinePaths(SheetUtil.GetImagePath(), Path.GetFileName(dlg.FileName)); if (File.Exists(newName)) { MsgBox.Show(this, "A file of that name already exists in SheetImages. Please rename the file before importing."); return; } File.Copy(dlg.FileName, newName); } else if (CloudStorage.IsCloudStorage) { if (CloudStorage.FileExists(ODFileUtils.CombinePaths(SheetUtil.GetImagePath(), Path.GetFileName(dlg.FileName)))) { MsgBox.Show(this, "A file of that name already exists in SheetImages. Please rename the file before importing."); return; } FormProgress FormP = new FormProgress(); FormP.DisplayText = Lan.g(CloudStorage.LanThis, "Uploading..."); FormP.NumberFormat = "F"; FormP.NumberMultiplication = 1; FormP.MaxVal = 100; //Doesn't matter what this value is as long as it is greater than 0 FormP.TickMS = 1000; OpenDentalCloud.Core.TaskStateUpload state = CloudStorage.UploadAsync(SheetUtil.GetImagePath(), Path.GetFileName(dlg.FileName) , File.ReadAllBytes(dlg.FileName) , new OpenDentalCloud.ProgressHandler(FormP.OnProgress)); if (FormP.ShowDialog() == DialogResult.Cancel) { state.DoCancel = true; return; } newName = Path.GetFileName(dlg.FileName); //It would be nice to save the image somewhere so that we don't have to download it again. } FillCombo(); for (int i = 0; i < comboFieldName.Items.Count; i++) { if (comboFieldName.Items[i].ToString() == Path.GetFileName(newName)) { comboFieldName.SelectedIndex = i; comboFieldName.Text = Path.GetFileName(newName); FillImage(); ShrinkToFit(); } } }
private void butRestore_Click(object sender, System.EventArgs e) { if(textBackupRestoreFromPath.Text!="" && !textBackupRestoreFromPath.Text.EndsWith(""+Path.DirectorySeparatorChar)){ MessageBox.Show(Lan.g(this,"Paths must end with ")+Path.DirectorySeparatorChar+"."); return; } if(textBackupRestoreToPath.Text!="" && !textBackupRestoreToPath.Text.EndsWith(""+Path.DirectorySeparatorChar)){ MessageBox.Show(Lan.g(this,"Paths must end with ")+Path.DirectorySeparatorChar+"."); return; } if(ShouldUseAtoZFolder()) { if(textBackupRestoreAtoZToPath.Text!="" && !textBackupRestoreAtoZToPath.Text.EndsWith(""+Path.DirectorySeparatorChar)){ MessageBox.Show(Lan.g(this,"Paths must end with ")+Path.DirectorySeparatorChar+"."); return; } } if(Environment.OSVersion.Platform!=PlatformID.Unix){ //dmg This check will not work on Linux, because mapped drives exist as regular (mounted) paths. Perhaps there //is another way to check for this on Linux. if(textBackupRestoreToPath.Text!="" && textBackupRestoreToPath.Text.StartsWith(""+Path.DirectorySeparatorChar)){ MsgBox.Show(this,"The restore database TO folder must be on this computer."); return; } } //pointless to save defaults string dbName=MiscData.GetCurrentDatabase(); if(!Directory.Exists(ODFileUtils.CombinePaths(textBackupRestoreFromPath.Text,dbName))){// D:\opendental MessageBox.Show(Lan.g(this,"Restore FROM path is invalid. Unable to find folder named ")+dbName); return; } if(!Directory.Exists(ODFileUtils.CombinePaths(textBackupRestoreToPath.Text,dbName))) {// C:\mysql\data\opendental MessageBox.Show(Lan.g(this,"Restore TO path is invalid. Unable to find folder named ")+dbName); return; } if(ShouldUseAtoZFolder()) { if(!Directory.Exists(textBackupRestoreAtoZToPath.Text)) {// C:\OpenDentalData\ MsgBox.Show(this,"Restore A-Z images TO path is invalid."); return; } string atozFull=textBackupRestoreAtoZToPath.Text;// C:\OpenDentalData\ //remove the trailing \ atozFull=atozFull.Substring(0,atozFull.Length-1);// C:\OpenDentalData string atozDir=atozFull.Substring(atozFull.LastIndexOf(Path.DirectorySeparatorChar)+1);// OpenDentalData if(!Directory.Exists(ODFileUtils.CombinePaths(textBackupRestoreFromPath.Text,atozDir))){// D:\OpenDentalData MsgBox.Show(this,"Restore A-Z images FROM path is invalid."); return; } } string fromPath=ODFileUtils.CombinePaths(new string[] {textBackupRestoreFromPath.Text,dbName,""});// D:\opendental\ DirectoryInfo dirInfo=new DirectoryInfo(fromPath);//does not check to see if dir exists if(MessageBox.Show(Lan.g(this,"Restore from backup created on")+"\r\n" +dirInfo.LastWriteTime.ToString("dddd")+" "+dirInfo.LastWriteTime.ToString() ,"",MessageBoxButtons.OKCancel,MessageBoxIcon.Question)==DialogResult.Cancel) { return; } Cursor=Cursors.WaitCursor; //stop the service-------------------------------------------------------------------------------------- ServiceController sc=new ServiceController("MySQL"); try{ sc.Stop(); sc.WaitForStatus(ServiceControllerStatus.Stopped,new TimeSpan(0,0,10)); } catch{ MsgBox.Show(this,"Unable to stop MySQL service."); return; } //rename the current database--------------------------------------------------------------------------- //Get a name for the new directory string newDb=dbName+"backup_"+DateTime.Today.ToString("MM_dd_yyyy"); if(Directory.Exists(ODFileUtils.CombinePaths(textBackupRestoreToPath.Text,newDb))){//if the new database name already exists //find a unique one int uniqueID=1; string originalNewDb=newDb; do{ newDb=originalNewDb+"_"+uniqueID.ToString(); uniqueID++; } while(Directory.Exists(ODFileUtils.CombinePaths(textBackupRestoreToPath.Text,newDb))); } //move the current db (rename) Directory.Move(ODFileUtils.CombinePaths(textBackupRestoreToPath.Text,dbName),// C:\mysql\data\opendental ODFileUtils.CombinePaths(textBackupRestoreToPath.Text,newDb));// C:\mysql\data\opendentalbackup_03_25_2006 //Restore---------------------------------------------------------------------------------------------- string toPath=textBackupRestoreToPath.Text;// C:\mysql\data\ Directory.CreateDirectory(ODFileUtils.CombinePaths(toPath,dirInfo.Name)); FileInfo[] files=dirInfo.GetFiles(); curVal=0;//curVal gets increased for(int i=0;i<files.Length;i++){ File.Copy(files[i].FullName,ODFileUtils.CombinePaths(new string[] {toPath,dirInfo.Name,files[i].Name})); } //start the service-------------------------------------------------------------------------------------- try{ sc.Start(); sc.WaitForStatus(ServiceControllerStatus.Running,new TimeSpan(0,0,10)); } catch{ //do nothing } Cursor=Cursors.Default; //restore A-Z folder, and give user a chance to cancel it. if(ShouldUseAtoZFolder()) { FormP=new FormProgress(); FormP.MaxVal=100;//We will be setting maxVal from worker thread. (double)fileSize/1024; FormP.NumberMultiplication=100; FormP.DisplayText="";//We will set the text from the worker thread. FormP.NumberFormat="N1"; //start the thread that will perform the database copy Thread workerThread=new Thread(new ThreadStart(InstanceMethodRestore)); workerThread.Start(); //display the progress dialog to the user: FormP.ShowDialog(); if(FormP.DialogResult==DialogResult.Cancel){ workerThread.Abort(); return; } } MsgBox.Show(this,"Done"); PrefL.CheckProgramVersion();//this might force program to close if version mismatch could not be resolved. Close(); }
private void butBackup_Click(object sender, System.EventArgs e) { //test for trailing slashes if(textBackupFromPath.Text!="" && !textBackupFromPath.Text.EndsWith(""+Path.DirectorySeparatorChar)){ MsgBox.Show(this,"Paths must end with "+Path.DirectorySeparatorChar+"."); return; } if(textBackupToPath.Text!="" && !textBackupToPath.Text.EndsWith(""+Path.DirectorySeparatorChar)){ MsgBox.Show(this,"Paths must end with "+Path.DirectorySeparatorChar+"."); return; } if(textBackupRestoreFromPath.Text!="" && !textBackupRestoreFromPath.Text.EndsWith(""+Path.DirectorySeparatorChar)) { MsgBox.Show(this,"Paths must end with "+Path.DirectorySeparatorChar+"."); return; } if(textBackupRestoreToPath.Text!="" && !textBackupRestoreToPath.Text.EndsWith(""+Path.DirectorySeparatorChar)) { MsgBox.Show(this,"Paths must end with "+Path.DirectorySeparatorChar+"."); return; } if(textBackupRestoreAtoZToPath.Text!="" && !textBackupRestoreAtoZToPath.Text.EndsWith(""+Path.DirectorySeparatorChar)) { MsgBox.Show(this,"Paths must end with "+Path.DirectorySeparatorChar+"."); return; } //Ensure that the backup from and backup to paths are different. This is to prevent the live database //from becoming corrupt. if(this.textBackupFromPath.Text.Trim().ToLower()==this.textBackupToPath.Text.Trim().ToLower()) { MsgBox.Show(this,"The backup from path and backup to path must be different."); return; } //test saving defaults if(textBackupFromPath.Text!=PrefC.GetString(PrefName.BackupFromPath) || textBackupToPath.Text!=PrefC.GetString(PrefName.BackupToPath) || textBackupRestoreFromPath.Text!=PrefC.GetString(PrefName.BackupRestoreFromPath) || textBackupRestoreToPath.Text!=PrefC.GetString(PrefName.BackupRestoreToPath) || textBackupRestoreAtoZToPath.Text!=PrefC.GetString(PrefName.BackupRestoreAtoZToPath)) { if(MsgBox.Show(this,true,"Set as default?")){ Prefs.UpdateString(PrefName.BackupFromPath,textBackupFromPath.Text); Prefs.UpdateString(PrefName.BackupToPath,textBackupToPath.Text); Prefs.UpdateString(PrefName.BackupRestoreFromPath,textBackupRestoreFromPath.Text); Prefs.UpdateString(PrefName.BackupRestoreToPath,textBackupRestoreToPath.Text); Prefs.UpdateString(PrefName.BackupRestoreAtoZToPath,textBackupRestoreAtoZToPath.Text); DataValid.SetInvalid(InvalidType.Prefs); } } string dbName=MiscData.GetCurrentDatabase(); if(!Directory.Exists(ODFileUtils.CombinePaths(textBackupFromPath.Text,dbName))){// C:\mysql\data\opendental MsgBox.Show(this,"Backup FROM path is invalid."); return; } if(!Directory.Exists(textBackupToPath.Text)){// D:\ MsgBox.Show(this,"Backup TO path is invalid."); return; } FormP=new FormProgress(); FormP.MaxVal=100;//We will be setting maxVal from worker thread. (double)fileSize/1024; FormP.NumberMultiplication=100; FormP.DisplayText="";//We will set the text from the worker thread. FormP.NumberFormat="N1"; //start the thread that will perform the database copy Thread workerThread=new Thread(new ThreadStart(InstanceMethodBackup)); workerThread.Start(); //display the progress dialog to the user: FormP.ShowDialog(); if(FormP.DialogResult==DialogResult.Cancel){ workerThread.Abort(); return; } SecurityLogs.MakeLogEntry(Permissions.Copy,0,"Database backup created at "+PrefC.GetString(PrefName.BackupToPath)); MessageBox.Show(Lan.g(this,"Backup complete.")); Close(); }
private void butDownloadClaimform_Click(object sender, EventArgs e) { Cursor = Cursors.WaitCursor; //Application.DoEvents(); string remoteUri = textWebsitePath.Text + textRegClaimform.Text + "/"; WebRequest wr; WebResponse webResp; //int fileSize; //copy image file------------------------------------------------------------------------------- if (BackgroundImg != "") { myStringWebResource = remoteUri + BackgroundImg; WriteToFile = PrefB.GetString("DocPath") + BackgroundImg; if (File.Exists(WriteToFile)) { File.Delete(WriteToFile); } wr = WebRequest.Create(myStringWebResource); int fileSize; try{ webResp = wr.GetResponse(); fileSize = (int)webResp.ContentLength / 1024; } catch (Exception ex) { Cursor = Cursors.Default; MessageBox.Show("Error downloading " + BackgroundImg + ". " + ex.Message); return; //fileSize=0; } if (fileSize > 0) { //start the thread that will perform the download Thread workerThread = new Thread(new ThreadStart(InstanceMethod)); workerThread.Start(); //display the progress dialog to the user: FormP = new FormProgress(); FormP.MaxVal = (double)fileSize / 1024; FormP.NumberMultiplication = 100; FormP.DisplayText = "?currentVal MB of ?maxVal MB copied"; FormP.NumberFormat = "F"; FormP.ShowDialog(); if (FormP.DialogResult == DialogResult.Cancel) { workerThread.Abort(); Cursor = Cursors.Default; return; } MsgBox.Show(this, "Image file downloaded successfully."); } } Cursor = Cursors.WaitCursor; //have to do this again for some reason. //Import ClaimForm.xml---------------------------------------------------------------------------------- myStringWebResource = remoteUri + "ClaimForm.xml"; WriteToFile = PrefB.GetString("DocPath") + "ClaimForm.xml"; if (File.Exists(WriteToFile)) { File.Delete(WriteToFile); } try{ InstanceMethod(); } catch { } int rowsAffected; if (File.Exists(WriteToFile)) { int newclaimformnum = 0; try{ newclaimformnum = FormClaimForms.ImportForm(WriteToFile, true); } catch (ApplicationException ex) { Cursor = Cursors.Default; MessageBox.Show(ex.Message); return; } finally{ File.Delete(WriteToFile); } if (newclaimformnum != 0) { Prefs.UpdateInt("DefaultClaimForm", newclaimformnum); } //switch all insplans over to new claimform ClaimForm oldform = null; for (int i = 0; i < ClaimForms.ListLong.Length; i++) { if (ClaimForms.ListLong[i].UniqueID == OldClaimFormID) { oldform = ClaimForms.ListLong[i]; } } if (oldform != null) { rowsAffected = InsPlans.ConvertToNewClaimform(oldform.ClaimFormNum, newclaimformnum); MessageBox.Show("Number of insurance plans changed to new form: " + rowsAffected.ToString()); } DataValid.SetInvalid(InvalidTypes.ClaimForms | InvalidTypes.Prefs); } //Import ProcCodes.xml------------------------------------------------------------------------------------ myStringWebResource = remoteUri + "ProcCodes.xml"; WriteToFile = PrefB.GetString("DocPath") + "ProcCodes.xml"; if (File.Exists(WriteToFile)) { File.Delete(WriteToFile); } try { InstanceMethod(); } catch { } if (File.Exists(WriteToFile)) { //move T codes over to a new "Obsolete" category which is hidden ProcedureCodes.TcodesMove(); rowsAffected = 0; try { rowsAffected = FormProcCodes.ImportProcCodes(WriteToFile, false); } catch (ApplicationException ex) { Cursor = Cursors.Default; MessageBox.Show(ex.Message); return; } finally { File.Delete(WriteToFile); } ProcedureCodes.Refresh(); //? MessageBox.Show("Procedure codes inserted: " + rowsAffected.ToString()); //Change all procbuttons and autocodes from T to D. ProcedureCodes.TcodesAlter(); DataValid.SetInvalid(InvalidTypes.AutoCodes | InvalidTypes.Defs | InvalidTypes.ProcCodes | InvalidTypes.ProcButtons); } MsgBox.Show(this, "Done"); Cursor = Cursors.Default; }
private void butRestore_Click(object sender, System.EventArgs e) { if (textBackupRestoreFromPath.Text != "" && !textBackupRestoreFromPath.Text.EndsWith("" + Path.DirectorySeparatorChar)) { MessageBox.Show(Lan.g(this, "Paths must end with ") + Path.DirectorySeparatorChar + "."); return; } if (textBackupRestoreToPath.Text != "" && !textBackupRestoreToPath.Text.EndsWith("" + Path.DirectorySeparatorChar)) { MessageBox.Show(Lan.g(this, "Paths must end with ") + Path.DirectorySeparatorChar + "."); return; } if (ShouldUseAtoZFolder()) { if (textBackupRestoreAtoZToPath.Text != "" && !textBackupRestoreAtoZToPath.Text.EndsWith("" + Path.DirectorySeparatorChar)) { MessageBox.Show(Lan.g(this, "Paths must end with ") + Path.DirectorySeparatorChar + "."); return; } } if (Environment.OSVersion.Platform != PlatformID.Unix) { //dmg This check will not work on Linux, because mapped drives exist as regular (mounted) paths. Perhaps there //is another way to check for this on Linux. if (textBackupRestoreToPath.Text != "" && textBackupRestoreToPath.Text.StartsWith("" + Path.DirectorySeparatorChar)) { MsgBox.Show(this, "The restore database TO folder must be on this computer."); return; } } //pointless to save defaults string dbName = MiscData.GetCurrentDatabase(); if (InnoDb.HasInnoDbTables(dbName)) { //Database has innodb tables. Restore tool does not work on dbs with InnoDb tables. MsgBox.Show(this, "InnoDb tables detected. Restore tool cannot run with InnoDb tables."); return; } if (!Directory.Exists(ODFileUtils.CombinePaths(textBackupRestoreFromPath.Text, dbName))) // D:\opendental { MessageBox.Show(Lan.g(this, "Restore FROM path is invalid. Unable to find folder named ") + dbName); return; } if (!Directory.Exists(ODFileUtils.CombinePaths(textBackupRestoreToPath.Text, dbName))) // C:\mysql\data\opendental { MessageBox.Show(Lan.g(this, "Restore TO path is invalid. Unable to find folder named ") + dbName); return; } if (ShouldUseAtoZFolder()) { if (!Directory.Exists(textBackupRestoreAtoZToPath.Text)) // C:\OpenDentalData\ { MsgBox.Show(this, "Restore A-Z images TO path is invalid."); return; } string atozFull = textBackupRestoreAtoZToPath.Text; // C:\OpenDentalData\ //remove the trailing \ atozFull = atozFull.Substring(0, atozFull.Length - 1); // C:\OpenDentalData string atozDir = atozFull.Substring(atozFull.LastIndexOf(Path.DirectorySeparatorChar) + 1); // OpenDentalData if (!Directory.Exists(ODFileUtils.CombinePaths(textBackupRestoreFromPath.Text, atozDir))) // D:\OpenDentalData { MsgBox.Show(this, "Restore A-Z images FROM path is invalid."); return; } } string fromPath = ODFileUtils.CombinePaths(new string[] { textBackupRestoreFromPath.Text, dbName, "" }); // D:\opendental\ DirectoryInfo dirInfo = new DirectoryInfo(fromPath); //does not check to see if dir exists if (MessageBox.Show(Lan.g(this, "Restore from backup created on") + "\r\n" + dirInfo.LastWriteTime.ToString("dddd") + " " + dirInfo.LastWriteTime.ToString() , "", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.Cancel) { return; } Cursor = Cursors.WaitCursor; //stop the service-------------------------------------------------------------------------------------- ServiceController sc = new ServiceController("MySQL"); if (!ServicesHelper.Stop(sc)) { MsgBox.Show(this, "Unable to stop MySQL service."); Cursor = Cursors.Default; return; } //rename the current database--------------------------------------------------------------------------- //Get a name for the new directory string newDb = dbName + "backup_" + DateTime.Today.ToString("MM_dd_yyyy"); if (Directory.Exists(ODFileUtils.CombinePaths(textBackupRestoreToPath.Text, newDb))) //if the new database name already exists //find a unique one { int uniqueID = 1; string originalNewDb = newDb; do { newDb = originalNewDb + "_" + uniqueID.ToString(); uniqueID++; }while(Directory.Exists(ODFileUtils.CombinePaths(textBackupRestoreToPath.Text, newDb))); } //move the current db (rename) Directory.Move(ODFileUtils.CombinePaths(textBackupRestoreToPath.Text, dbName) , ODFileUtils.CombinePaths(textBackupRestoreToPath.Text, newDb)); //Restore---------------------------------------------------------------------------------------------- string toPath = textBackupRestoreToPath.Text; // C:\mysql\data\ Directory.CreateDirectory(ODFileUtils.CombinePaths(toPath, dirInfo.Name)); FileInfo[] files = dirInfo.GetFiles(); curVal = 0; //curVal gets increased for (int i = 0; i < files.Length; i++) { File.Copy(files[i].FullName, ODFileUtils.CombinePaths(new string[] { toPath, dirInfo.Name, files[i].Name })); } //start the service-------------------------------------------------------------------------------------- ServicesHelper.Start(sc); Cursor = Cursors.Default; //restore A-Z folder, and give user a chance to cancel it. if (ShouldUseAtoZFolder()) { FormP = new FormProgress(); FormP.MaxVal = 100; //We will be setting maxVal from worker thread. (double)fileSize/1024; FormP.NumberMultiplication = 100; FormP.DisplayText = ""; //We will set the text from the worker thread. FormP.NumberFormat = "N1"; //start the thread that will perform the database copy Thread workerThread = new Thread(new ThreadStart(InstanceMethodRestore)); workerThread.Start(); //display the progress dialog to the user: FormP.ShowDialog(); if (FormP.DialogResult == DialogResult.Cancel) { workerThread.Abort(); return; } } Version programVersionDb = new Version(PrefC.GetStringNoCache(PrefName.ProgramVersion)); Version programVersionCur = new Version(Application.ProductVersion); if (programVersionDb != programVersionCur) { MsgBox.Show(this, "The restored database version is different than the version installed and requires a restart. The program will now close."); FormOpenDental.S_ProcessKillCommand(); return; } else { DataValid.SetInvalid(Cache.GetAllCachedInvalidTypes().ToArray()); } MsgBox.Show(this, "Done"); Close(); return; }
private void FillImage() { if (comboFieldName.Text == "") { return; } if (CloudStorage.IsCloudStorage) { textFullPath.Text = CloudStorage.PathTidy(ODFileUtils.CombinePaths(SheetUtil.GetImagePath(), comboFieldName.Text)); } else { textFullPath.Text = ODFileUtils.CombinePaths(SheetUtil.GetImagePath(), comboFieldName.Text); } if (PrefC.AtoZfolderUsed == DataStorageType.LocalAtoZ && File.Exists(textFullPath.Text)) { GC.Collect(); try { pictureBox.Image = Image.FromFile(textFullPath.Text); } catch { pictureBox.Image = null; MsgBox.Show(this, "Invalid image type."); } } else if (comboFieldName.Text == "Patient Info.gif") //Interal image { pictureBox.Image = OpenDentBusiness.Properties.Resources.Patient_Info; textFullPath.Text = "Patient Info.gif (internal)"; } else if (CloudStorage.IsCloudStorage) { if (comboFieldName.Text == SheetFieldDefCur.FieldName && SheetFieldDefCur.ImageField != null) { pictureBox.Image = SheetFieldDefCur.ImageField; } else { FormProgress FormP = new FormProgress(); FormP.DisplayText = Lan.g(CloudStorage.LanThis, "Downloading..."); FormP.NumberFormat = "F"; FormP.NumberMultiplication = 1; FormP.MaxVal = 100; //Doesn't matter what this value is as long as it is greater than 0 FormP.TickMS = 1000; OpenDentalCloud.Core.TaskStateDownload state = CloudStorage.DownloadAsync(SheetUtil.GetImagePath(), comboFieldName.Text, new OpenDentalCloud.ProgressHandler(FormP.OnProgress)); if (FormP.ShowDialog() == DialogResult.Cancel) { state.DoCancel = true; return; } if (state == null || state.FileContent == null) { pictureBox.Image = null; } else { using (MemoryStream stream = new MemoryStream(state.FileContent)) { pictureBox.Image = new Bitmap(Image.FromStream(stream)); } } } } else { pictureBox.Image = null; } if (pictureBox.Image == null) { textWidth2.Text = ""; textHeight2.Text = ""; } else { textWidth2.Text = pictureBox.Image.Width.ToString(); textHeight2.Text = pictureBox.Image.Height.ToString(); } }
private void butMerge_Click(object sender, EventArgs e) { if (_patTo.PatNum == _patFrom.PatNum) { MsgBox.Show(this, "Cannot merge a patient account into itself. Please select a different patient to merge from."); return; } string msgText = ""; if (_patFrom.FName.Trim().ToLower() != _patTo.FName.Trim().ToLower() || _patFrom.LName.Trim().ToLower() != _patTo.LName.Trim().ToLower() || _patFrom.Birthdate != _patTo.Birthdate) { //mismatch msgText = Lan.g(this, "The two patients do not have the same first name, last name, and birthdate."); if (Programs.UsingEcwTightOrFullMode()) { msgText += "\r\n" + Lan.g(this, "The patients must first be merged from within eCW, then immediately merged in the same order in Open Dental. " + "If the patients are not merged in this manner, some information may not properly bridge between eCW and Open Dental."); } msgText += "\r\n\r\n" + Lan.g(this, "Into patient name") + ": " + Patients.GetNameFLnoPref(_patTo.LName, _patTo.FName, "") + ", " //using Patients.GetNameFLnoPref to omit MiddleI + Lan.g(this, "Into patient birthdate") + ": " + _patTo.Birthdate.ToShortDateString() + "\r\n" + Lan.g(this, "From patient name") + ": " + Patients.GetNameFLnoPref(_patFrom.LName, _patFrom.FName, "") + ", " //using Patients.GetNameFLnoPref to omit MiddleI + Lan.g(this, "From patient birthdate") + ": " + _patFrom.Birthdate.ToShortDateString() + "\r\n\r\n" + Lan.g(this, "Merge the patient on the bottom into the patient shown on the top?"); if (MessageBox.Show(msgText, "", MessageBoxButtons.YesNo) != DialogResult.Yes) { return; //The user chose not to merge } } else //name and bd match { if (!MsgBox.Show(this, MsgBoxButtons.YesNo, "Merge the patient at the bottom into the patient shown at the top?")) { return; //The user chose not to merge. } } if (_patFrom.PatNum == _patFrom.Guarantor) { Family fam = Patients.GetFamily(_patFrom.PatNum); if (fam.ListPats.Length > 1) { msgText = Lan.g(this, "The patient you have chosen to merge from is a guarantor. Merging this patient into another account will cause all " + "family members of the patient being merged from to be moved into the same family as the patient account being merged into.") + "\r\n" + Lan.g(this, "Do you wish to continue with the merge?"); if (MessageBox.Show(msgText, "", MessageBoxButtons.YesNo) != DialogResult.Yes) { return; //The user chose not to merge. } } } Cursor = Cursors.WaitCursor; List <Task> listPatientTasks = Tasks.RefreshPatientTickets(_patFrom.PatNum); //Get this before the merge, because the merge updates Task.KeyNum. bool isSuccessfulMerge = false; try { isSuccessfulMerge = Patients.MergeTwoPatients(_patTo.PatNum, _patFrom.PatNum); } catch (Exception ex) { SecurityLogs.MakeLogEntry(Permissions.PatientMerge, _patTo.PatNum, "Error occurred while merging Patient: " + _patFrom.GetNameFL() + "\r\nPatNum From: " + _patFrom.PatNum + "\r\nPatNum To: " + _patTo.PatNum); Cursor = Cursors.Default; FriendlyException.Show(Lan.g(this, "Unable to fully merge patients. Contact support."), ex); } if (isSuccessfulMerge) { //The patient has been successfully merged. #region Refresh Patient's Tasks List <Signalod> listSignals = new List <Signalod>(); foreach (Task task in listPatientTasks) { Signalod signal = new Signalod(); signal.IType = InvalidType.Task; signal.FKeyType = KeyType.Task; signal.FKey = task.TaskNum; signal.DateViewing = DateTime.MinValue; //Mimics Signalods.SetInvalid() listSignals.Add(signal); } Signalods.SetInvalid(InvalidType.TaskPatient, KeyType.Undefined, _patTo.PatNum); //Ensure anyone viewing Patient tab of new pat gets refreshed. Signalods.Insert(listSignals.ToArray()); //Refreshes existing tasks in all other tabs. //Causes Task area and open Task Edit windows to refresh immediately. No popups, alright to pass empty lists for listRefreshedTaskNotes and //listBlockedTaskLists. FormOpenDental.S_HandleRefreshedTasks(listSignals, listPatientTasks.Select(x => x.TaskNum).ToList(), listPatientTasks, new List <TaskNote>() , new List <UserOdPref>()); #endregion //Now copy the physical images from the old patient to the new if they are using an AtoZ image share. //This has to happen in the UI because the middle tier server might not have access to the image share. //If the users are storing images within the database, those images have already been taken care of in the merge method above. int fileCopyFailures = 0; if (PrefC.AtoZfolderUsed == DataStorageType.LocalAtoZ) { #region Copy AtoZ Documents //Move the patient documents within the 'patFrom' A to Z folder to the 'patTo' A to Z folder. //We have to be careful here of documents with the same name. We have to rename such documents //so that no documents are overwritten/lost. string atoZpath = ImageStore.GetPreferredAtoZpath(); string atozFrom = ImageStore.GetPatientFolder(_patFrom, atoZpath); string atozTo = ImageStore.GetPatientFolder(_patTo, atoZpath); string[] fromFiles = Directory.GetFiles(atozFrom); if (atozFrom == atozTo) { //Very rarely, two patients have the same image folder. PatFrom and PatTo both have Documents that point to the same file. Since we //are about to copy the image file for PatFrom to PatTo's directory and delete the file from PatFrom's directory, we would break the //file reference for PatTo's Document. In this case, skip deleting the original file, since PatTo's Document still references it. Documents.MergePatientDocuments(_patFrom.PatNum, _patTo.PatNum); } else { foreach (string fileCur in fromFiles) { string fileName = Path.GetFileName(fileCur); string destFileName = fileName; string destFilePath = ODFileUtils.CombinePaths(atozTo, fileName); if (File.Exists(destFilePath)) { //The file being copied has the same name as a possibly different file within the destination a to z folder. //We need to copy the file under a unique file name and then make sure to update the document table to reflect //the change. destFileName = _patFrom.PatNum.ToString() + "_" + fileName; destFilePath = ODFileUtils.CombinePaths(atozTo, destFileName); while (File.Exists(destFilePath)) { destFileName = _patFrom.PatNum.ToString() + "_" + fileName + "_" + DateTime.Now.ToString("yyyyMMddhhmmss"); destFilePath = ODFileUtils.CombinePaths(atozTo, destFileName); } } try { File.Copy(fileCur, destFilePath); //Will throw exception if file already exists. } catch (Exception ex) { ex.DoNothing(); fileCopyFailures++; continue; //copy failed, increment counter and move onto the next file } //If the copy did not fail, try to delete the old file. //We can now safely update the document FileName and PatNum to the "to" patient. Documents.MergePatientDocument(_patFrom.PatNum, _patTo.PatNum, fileName, destFileName); try { File.Delete(fileCur); } catch (Exception ex) { ex.DoNothing(); //If we were unable to delete the file then it is probably because someone has the document open currently. //Just skip deleting the file. This means that occasionally there will be an extra file in their backup //which is just clutter but at least the merge is guaranteed this way. } } } #endregion Copy AtoZ Documents } //end if AtoZFolderUsed else if (CloudStorage.IsCloudStorage) { string atozFrom = ImageStore.GetPatientFolder(_patFrom, ""); string atozTo = ImageStore.GetPatientFolder(_patTo, ""); if (atozFrom == atozTo) { //Very rarely, two patients have the same image folder. PatFrom and PatTo both have Documents that point to the same file. Since we //are about to copy the image file for PatFrom to PatTo's directory and delete the file from PatFrom's directory, we would break the //file reference for PatTo's Document. In this case, skip deleting the original file, since PatTo's Document still references it. Documents.MergePatientDocuments(_patFrom.PatNum, _patTo.PatNum); } else { FormProgress FormP = new FormProgress(); FormP.DisplayText = "Moving Documents..."; FormP.NumberFormat = "F"; FormP.NumberMultiplication = 1; FormP.MaxVal = 100; //Doesn't matter what this value is as long as it is greater than 0 FormP.TickMS = 1000; OpenDentalCloud.Core.TaskStateMove state = CloudStorage.MoveAsync(atozFrom , atozTo , new OpenDentalCloud.ProgressHandler(FormP.OnProgress)); if (FormP.ShowDialog() == DialogResult.Cancel) { state.DoCancel = true; fileCopyFailures = state.CountTotal - state.CountSuccess; } else { fileCopyFailures = state.CountFailed; } } } Cursor = Cursors.Default; if (fileCopyFailures > 0) { MessageBox.Show(Lan.g(this, "Some files belonging to the from patient were not copied.") + "\r\n" + Lan.g(this, "Number of files not copied") + ": " + fileCopyFailures); } //Make log entry here not in parent form because we can merge multiple patients at a time. SecurityLogs.MakeLogEntry(Permissions.PatientMerge, _patTo.PatNum, "Patient: " + _patFrom.GetNameFL() + "\r\nPatNum From: " + _patFrom.PatNum + "\r\nPatNum To: " + _patTo.PatNum); textPatientIDFrom.Text = ""; textPatientNameFrom.Text = ""; textPatFromBirthdate.Text = ""; //This will cause CheckUIState() to disabled the merge button until the user selects a new _patFrom. _patFrom = null; CheckUIState(); MsgBox.Show(this, "Patients merged successfully."); } //end MergeTwoPatients Cursor = Cursors.Default; }
private void SaveAttachment() { Patient PatCur = Patients.GetPat(PatNum); //if(PatCur.ImageFolder=="") { // MsgBox.Show(this,"Invalid patient image folder."); // return; //} if (PrefC.AtoZfolderUsed == DataStorageType.InDatabase) { MsgBox.Show(this, "Error. Not using AtoZ images folder."); return; } string patfolder = ImageStore.GetPatientFolder(PatCur, ImageStore.GetPreferredAtoZpath()); //ODFileUtils.CombinePaths( //FormPath.GetPreferredImagePath(),PatCur.ImageFolder.Substring(0,1).ToUpper(),PatCur.ImageFolder); //if(!Directory.Exists(patfolder)) { // MsgBox.Show(this,"Patient folder not found in AtoZ folder."); // return; //} Document doc = Docs[gridMain.GetSelectedIndex()]; if (!ImageHelper.HasImageExtension(doc.FileName)) { MsgBox.Show(this, "Invalid file. Only images may be attached, no other file format."); return; } string oldPath = ODFileUtils.CombinePaths(patfolder, doc.FileName); Random rnd = new Random(); string newName = DateTime.Now.ToString("yyyyMMdd") + "_" + DateTime.Now.TimeOfDay.Ticks.ToString() + rnd.Next(1000).ToString() + Path.GetExtension(oldPath); string attachPath = EmailAttaches.GetAttachPath(); string newPath = ODFileUtils.CombinePaths(attachPath, newName); if (CloudStorage.IsCloudStorage) { oldPath = oldPath.Replace("\\", "/"); newPath = newPath.Replace("\\", "/"); } try { if (ImageHelper.HasImageExtension(oldPath)) { if (doc.CropH != 0 || doc.CropW != 0 || doc.CropX != 0 || doc.CropY != 0 || doc.DegreesRotated != 0 || doc.IsFlipped || doc.WindowingMax != 0 || doc.WindowingMin != 0 || CloudStorage.IsCloudStorage) { //this does result in a significantly larger images size if jpg. A later optimization would recompress it. Bitmap bitmapold = null; if (PrefC.AtoZfolderUsed == DataStorageType.LocalAtoZ) { bitmapold = (Bitmap)Bitmap.FromFile(oldPath); Bitmap bitmapnew = ImageHelper.ApplyDocumentSettingsToImage(doc, bitmapold, ImageSettingFlags.ALL); bitmapnew.Save(newPath); } else if (CloudStorage.IsCloudStorage) { //First, download the file. FormProgress FormP = new FormProgress(); FormP.DisplayText = "Downloading Image..."; FormP.NumberFormat = "F"; FormP.NumberMultiplication = 1; FormP.MaxVal = 100; //Doesn't matter what this value is as long as it is greater than 0 FormP.TickMS = 1000; OpenDentalCloud.Core.TaskStateDownload state = CloudStorage.DownloadAsync(patfolder , doc.FileName , new OpenDentalCloud.ProgressHandler(FormP.OnProgress)); FormP.ShowDialog(); if (FormP.DialogResult == DialogResult.Cancel) { state.DoCancel = true; return; } //Successfully downloaded, now do stuff with state.FileContent FormP = new FormProgress(); FormP.DisplayText = "Uploading Image for Claim Attach..."; FormP.NumberFormat = "F"; FormP.NumberMultiplication = 1; FormP.MaxVal = 100; //Doesn't matter what this value is as long as it is greater than 0 FormP.TickMS = 1000; OpenDentalCloud.Core.TaskStateUpload state2 = CloudStorage.UploadAsync(attachPath , newName , state.FileContent , new OpenDentalCloud.ProgressHandler(FormP.OnProgress)); FormP.ShowDialog(); if (FormP.DialogResult == DialogResult.Cancel) { state2.DoCancel = true; return; } //Upload was successful } } else { File.Copy(oldPath, newPath); } } else { File.Copy(oldPath, newPath); } ClaimAttachNew = new ClaimAttach(); ClaimAttachNew.DisplayedFileName = Docs[gridMain.GetSelectedIndex()].FileName; ClaimAttachNew.ActualFileName = newName; DialogResult = DialogResult.OK; } catch (FileNotFoundException ex) { MessageBox.Show(Lan.g(this, "File not found: ") + ex.Message); return; } catch (Exception ex) { MessageBox.Show(ex.Message); } }
/// <summary>destinationPath includes filename (Setup.exe). destinationPath2 will create a second copy at the specified path/filename, or it will be skipped if null or empty.</summary> public static void DownloadInstallPatchFromURI(string downloadUri,string destinationPath,bool runSetupAfterDownload,bool showShutdownWindow,string destinationPath2){ string[] dblist=PrefC.GetString(PrefName.UpdateMultipleDatabases).Split(new string[] {","},StringSplitOptions.RemoveEmptyEntries); if(showShutdownWindow) { //Even if updating multiple databases, extra shutdown signals are not needed. FormShutdown FormSD=new FormShutdown(); FormSD.IsUpdate=true; FormSD.ShowDialog(); if(FormSD.DialogResult==DialogResult.OK) { //turn off signal reception for 5 seconds so this workstation will not shut down. FormOpenDental.signalLastRefreshed=MiscData.GetNowDateTime().AddSeconds(5); Signalod sig=new Signalod(); sig.ITypes=((int)InvalidType.ShutDownNow).ToString(); sig.SigType=SignalType.Invalid; Signalods.Insert(sig); Computers.ClearAllHeartBeats(Environment.MachineName);//always assume success //SecurityLogs.MakeLogEntry(Permissions.Setup,0,"Shutdown all workstations.");//can't do this because sometimes no user. } //continue on even if user clicked cancel //no other workstation will be able to start up until this value is reset. Prefs.UpdateString(PrefName.UpdateInProgressOnComputerName,Environment.MachineName); } MiscData.LockWorkstationsForDbs(dblist);//lock workstations for other db's. File.Delete(destinationPath); WebRequest wr=WebRequest.Create(downloadUri); WebResponse webResp=null; try{ webResp=wr.GetResponse(); } catch(Exception ex){ CodeBase.MsgBoxCopyPaste msgbox=new MsgBoxCopyPaste(ex.Message+"\r\nUri: "+downloadUri); msgbox.ShowDialog(); MiscData.UnlockWorkstationsForDbs(dblist);//unlock workstations since nothing was actually done. return; } int fileSize=(int)webResp.ContentLength/1024; FormProgress FormP=new FormProgress(); //start the thread that will perform the download System.Threading.ThreadStart downloadDelegate= delegate { DownloadInstallPatchWorker(downloadUri,destinationPath,ref FormP); }; Thread workerThread=new System.Threading.Thread(downloadDelegate); workerThread.Start(); //display the progress dialog to the user: FormP.MaxVal=(double)fileSize/1024; FormP.NumberMultiplication=100; FormP.DisplayText="?currentVal MB of ?maxVal MB copied"; FormP.NumberFormat="F"; FormP.ShowDialog(); if(FormP.DialogResult==DialogResult.Cancel) { workerThread.Abort(); MiscData.UnlockWorkstationsForDbs(dblist);//unlock workstations since nothing was actually done. return; } //copy to second destination directory if(destinationPath2!=null && destinationPath2!=""){ if(File.Exists(destinationPath2)){ File.Delete(destinationPath2); } File.Copy(destinationPath,destinationPath2); } //copy the Setup.exe to the AtoZ folders for the other db's. List<string> atozNameList=MiscData.GetAtoZforDb(dblist); for(int i=0;i<atozNameList.Count;i++) { if(destinationPath==Path.Combine(atozNameList[i],"Setup.exe")) {//if they are sharing an AtoZ folder. continue; } if(Directory.Exists(atozNameList[i])) { File.Copy(destinationPath,//copy the Setup.exe that was just downloaded to this AtoZ folder Path.Combine(atozNameList[i],"Setup.exe"),//to the other atozFolder true);//overwrite } } if(!runSetupAfterDownload) { return; } string msg=Lan.g("FormUpdate","Download succeeded. Setup program will now begin. When done, restart the program on this computer, then on the other computers."); if(dblist.Length > 0){ msg="Download succeeded. Setup file probably copied to other AtoZ folders as well. Setup program will now begin. When done, restart the program for each database on this computer, then on the other computers."; } if(MessageBox.Show(msg,"",MessageBoxButtons.OKCancel) !=DialogResult.OK){ //Clicking cancel gives the user a chance to avoid running the setup program, Prefs.UpdateString(PrefName.UpdateInProgressOnComputerName,"");//unlock workstations, since nothing was actually done. return; } #region Stop OpenDent Services //If the update has been initiated from the designated update server then try and stop all "OpenDent..." services. //They will be automatically restarted once Open Dental has successfully upgraded. if(PrefC.GetString(PrefName.WebServiceServerName)!="" && ODEnvironment.IdIsThisComputer(PrefC.GetString(PrefName.WebServiceServerName))) { List<ServiceController> listServices=ODEnvironment.GetAllOpenDentServices(); StringBuilder strBuilder=new StringBuilder(); if(listServices.Count>0) { FormAlertSimple FormAS=new FormAlertSimple(Lan.g("FormUpdate","Stopping services...")); FormAS.Show(); Application.DoEvents();//Allows the form to show up on top of FormUpdate right away. //Loop through all Open Dental services and stop them if they have not stopped or are not pending a stop so that their binaries can be updated. for(int i=0;i<listServices.Count;i++) { if(listServices[i].Status==ServiceControllerStatus.Stopped || listServices[i].Status==ServiceControllerStatus.StopPending) { continue;//Already stopped. Calling Stop again will guarantee an exception is thrown. Do not try calling Stop on a stopped service. } try { listServices[i].Stop(); listServices[i].WaitForStatus(ServiceControllerStatus.Stopped,new TimeSpan(0,0,7)); } catch { //An InvalidOperationException will get thrown if the service could not stop. E.g. the user is not running Open Dental as an administrator. strBuilder.AppendLine(listServices[i].DisplayName); } } FormAS.Close(); //Notify the user to go manually stop the services that could not automatically stop. if(strBuilder.ToString()!="") { MsgBoxCopyPaste msgBCP=new MsgBoxCopyPaste(Lan.g("FormUpdate","The following services could not be stopped. You need to manually stop them before continuing.") +"\r\n"+strBuilder.ToString()); msgBCP.ShowDialog(); } } } #endregion try { Process.Start(destinationPath); Application.Exit(); } catch{ Prefs.UpdateString(PrefName.UpdateInProgressOnComputerName,"");//unlock workstations, since nothing was actually done. MsgBox.Show(FormP,"Could not launch setup"); } }
///<summary>Moves all MedLab objects and any embedded PDFs tied to the MedLabResults to the PatCur. ///If the MedLab objects were not originally attached to a patient, any embedded PDFs will be in the image folder in a directory called ///"MedLabEmbeddedFiles" and will be moved to PatCur's image folder. ///If PatCur is null or the MedLabs are already attached to PatCur, does nothing.</summary> private void MoveLabsAndImagesHelper() { //if they have selected the same patient, nothing to do if (PatCur == null || PatCur.PatNum == _medLabCur.PatNum) { return; } //if the MedLab object(s) were attached to a patient and they are being moved to another patient, move the associated documents Patient patOld = Patients.GetPat(_medLabCur.PatNum); MedLabs.UpdateAllPatNums(ListMedLabs.Select(x => x.MedLabNum).ToList(), PatCur.PatNum); string atozFrom = ""; string atozTo = ""; if (PrefC.AtoZfolderUsed == DataStorageType.LocalAtoZ) { string atozPath = ImageStore.GetPreferredAtoZpath(); //if patOld is null, the file was placed into the image folder in a directory named MedLabEmbeddedFiles, not a patient's image folder if (patOld == null) { atozFrom = ODFileUtils.CombinePaths(atozPath, "MedLabEmbeddedFiles"); } else { atozFrom = ImageStore.GetPatientFolder(patOld, atozPath); } atozTo = ImageStore.GetPatientFolder(PatCur, atozPath); } else if (CloudStorage.IsCloudStorage) { atozFrom = ODFileUtils.CombinePaths(ImageStore.GetPreferredAtoZpath(), "MedLabEmbeddedFiles", '/'); atozTo = ImageStore.GetPatientFolder(PatCur, ""); } //get list of all DocNums of files referenced by MedLabResults which were embedded in the MedLab HL7 message as base64 text //in order to move the file (if not storing images in db) and assign (or reassign) the FileName List <long> listDocNums = ListMedLabs .SelectMany(x => x.ListMedLabResults .Select(y => y.DocNum) .Where(y => y > 0)) .Distinct().ToList(); List <Document> listDocs = Documents.GetByNums(listDocNums); int fileMoveFailures = 0; for (int i = 0; i < listDocs.Count; i++) { Document doc = listDocs[i]; string destFileName = Documents.GetUniqueFileNameForPatient(PatCur, doc.DocNum, Path.GetExtension(doc.FileName)); if (PrefC.AtoZfolderUsed == DataStorageType.LocalAtoZ) { string fromFilePath = ODFileUtils.CombinePaths(atozFrom, doc.FileName); if (!File.Exists(fromFilePath)) { //the DocNum in the MedLabResults table is pointing to a file that either doesn't exist or is not accessible, can't move/copy it fileMoveFailures++; continue; } string destFilePath = ODFileUtils.CombinePaths(atozTo, destFileName); if (File.Exists(destFilePath)) //should never happen, since we already got a unique file name, but just in case //The file being copied has the same name as a file that exists in the destination folder, use a unique file name and update document table { destFileName = patOld.PatNum.ToString() + "_" + doc.FileName; //try to prepend patient's PatNum to the original file name destFilePath = ODFileUtils.CombinePaths(atozTo, destFileName); while (File.Exists(destFilePath)) { //if still not unique, try appending date/time to seconds precision until the file name is unique destFileName = patOld.PatNum.ToString() + "_" + Path.GetFileNameWithoutExtension(doc.FileName) + "_" + DateTime.Now.ToString("yyyyMMddhhmmss") + Path.GetExtension(doc.FileName); destFilePath = ODFileUtils.CombinePaths(atozTo, destFileName); } } try { File.Copy(fromFilePath, destFilePath); } catch (Exception ex) { ex.DoNothing(); fileMoveFailures++; continue; } //try to delete the original file try { File.Delete(fromFilePath); } catch (Exception ex) { ex.DoNothing(); //If we cannot delete the file, could be a permission issue or someone has the file open currently //Just skip deleting the file, which means there could be an image in the old pat's folder that may need to be deleted manually fileMoveFailures++; } } else if (CloudStorage.IsCloudStorage) { //move files around in the cloud FormProgress FormP = new FormProgress(false); FormP.DisplayText = "Uploading..."; FormP.NumberFormat = "F"; FormP.NumberMultiplication = 1; FormP.MaxVal = 100; //Doesn't matter what this value is as long as it is greater than 0 FormP.TickMS = 1000; OpenDentalCloud.Core.TaskStateMove state = CloudStorage.MoveAsync(atozFrom , atozTo , new OpenDentalCloud.ProgressHandler(FormP.OnProgress)); FormP.ShowDialog(); //Don't allow users to cancel from here due to the limitations of the current feature for figuring out which files were moved successfully. } //if we get here the file was copied successfully or not storing images in the database, so update the document row //Safe to update the document FileName and PatNum to PatCur and new file name doc.PatNum = PatCur.PatNum; doc.FileName = destFileName; Documents.Update(doc); } ListMedLabs.ForEach(x => x.PatNum = PatCur.PatNum); //update local list, done after moving files _medLabCur = ListMedLabs[0]; if (fileMoveFailures > 0) //will never be > 0 if storing images in the db { MessageBox.Show(Lan.g(this, "Some files attached to the MedLab objects could not be moved.") + "\r\n" + Lan.g(this, "This could be due to a missing file, a file being open, or a permission issue on the file which is preventing the move.") + "\r\n" + Lan.g(this, "The file(s) will have to be moved manually from the Image module.") + "\r\n" + Lan.g(this, "Number of files not moved") + ": " + fileMoveFailures.ToString()); } }
private void butMerge_Click(object sender, EventArgs e) { if (_patTo.PatNum == _patFrom.PatNum) { MsgBox.Show(this, "Cannot merge a patient account into itself. Please select a different patient to merge from."); return; } string msgText = ""; if (_patFrom.FName.Trim().ToLower() != _patTo.FName.Trim().ToLower() || _patFrom.LName.Trim().ToLower() != _patTo.LName.Trim().ToLower() || _patFrom.Birthdate != _patTo.Birthdate) { //mismatch msgText = Lan.g(this, "The two patients do not have the same first name, last name, and birthdate."); if (Programs.UsingEcwTightOrFullMode()) { msgText += "\r\n" + Lan.g(this, "The patients must first be merged from within eCW, then immediately merged in the same order in Open Dental. " + "If the patients are not merged in this manner, some information may not properly bridge between eCW and Open Dental."); } msgText += "\r\n\r\n" + Lan.g(this, "Into patient name") + ": " + Patients.GetNameFLnoPref(_patTo.LName, _patTo.FName, "") + ", " //using Patients.GetNameFLnoPref to omit MiddleI + Lan.g(this, "Into patient birthdate") + ": " + _patTo.Birthdate.ToShortDateString() + "\r\n" + Lan.g(this, "From patient name") + ": " + Patients.GetNameFLnoPref(_patFrom.LName, _patFrom.FName, "") + ", " //using Patients.GetNameFLnoPref to omit MiddleI + Lan.g(this, "From patient birthdate") + ": " + _patFrom.Birthdate.ToShortDateString() + "\r\n\r\n" + Lan.g(this, "Merge the patient on the bottom into the patient shown on the top?"); if (MessageBox.Show(msgText, "", MessageBoxButtons.YesNo) != DialogResult.Yes) { return; //The user chose not to merge } } else //name and bd match { if (!MsgBox.Show(this, MsgBoxButtons.YesNo, "Merge the patient at the bottom into the patient shown at the top?")) { return; //The user chose not to merge. } } if (_patFrom.PatNum == _patFrom.Guarantor) { Family fam = Patients.GetFamily(_patFrom.PatNum); if (fam.ListPats.Length > 1) { msgText = Lan.g(this, "The patient you have chosen to merge from is a guarantor. Merging this patient into another account will cause all " + "family members of the patient being merged from to be moved into the same family as the patient account being merged into.") + "\r\n" + Lan.g(this, "Do you wish to continue with the merge?"); if (MessageBox.Show(msgText, "", MessageBoxButtons.YesNo) != DialogResult.Yes) { return; //The user chose not to merge. } } } Cursor = Cursors.WaitCursor; if (Patients.MergeTwoPatients(_patTo.PatNum, _patFrom.PatNum)) { //The patient has been successfully merged. //Now copy the physical images from the old patient to the new if they are using an AtoZ image share. //This has to happen in the UI because the middle tier server might not have access to the image share. //If the users are storing images within the database, those images have already been taken care of in the merge method above. int fileCopyFailures = 0; if (PrefC.AtoZfolderUsed == DataStorageType.LocalAtoZ) { #region Copy AtoZ Documents //Move the patient documents within the 'patFrom' A to Z folder to the 'patTo' A to Z folder. //We have to be careful here of documents with the same name. We have to rename such documents //so that no documents are overwritten/lost. string atoZpath = ImageStore.GetPreferredAtoZpath(); string atozFrom = ImageStore.GetPatientFolder(_patFrom, atoZpath); string atozTo = ImageStore.GetPatientFolder(_patTo, atoZpath); string[] fromFiles = Directory.GetFiles(atozFrom); foreach (string fileCur in fromFiles) { string fileName = Path.GetFileName(fileCur); string destFileName = fileName; string destFilePath = ODFileUtils.CombinePaths(atozTo, fileName); if (File.Exists(destFilePath)) { //The file being copied has the same name as a possibly different file within the destination a to z folder. //We need to copy the file under a unique file name and then make sure to update the document table to reflect //the change. destFileName = _patFrom.PatNum.ToString() + "_" + fileName; destFilePath = ODFileUtils.CombinePaths(atozTo, destFileName); while (File.Exists(destFilePath)) { destFileName = _patFrom.PatNum.ToString() + "_" + fileName + "_" + DateTime.Now.ToString("yyyyMMddhhmmss"); destFilePath = ODFileUtils.CombinePaths(atozTo, destFileName); } } try { File.Copy(fileCur, destFilePath); //Will throw exception if file already exists. } catch (Exception ex) { ex.DoNothing(); fileCopyFailures++; continue; //copy failed, increment counter and move onto the next file } //If the copy did not fail, try to delete the old file. //We can now safely update the document FileName and PatNum to the "to" patient. Documents.MergePatientDocument(_patFrom.PatNum, _patTo.PatNum, fileName, destFileName); try { File.Delete(fileCur); } catch (Exception ex) { ex.DoNothing(); //If we were unable to delete the file then it is probably because someone has the document open currently. //Just skip deleting the file. This means that occasionally there will be an extra file in their backup //which is just clutter but at least the merge is guaranteed this way. } } #endregion Copy AtoZ Documents } //end if AtoZFolderUsed else if (CloudStorage.IsCloudStorage) { string atozFrom = ImageStore.GetPatientFolder(_patFrom, ""); string atozTo = ImageStore.GetPatientFolder(_patTo, ""); FormProgress FormP = new FormProgress(); FormP.DisplayText = "Moving Documents..."; FormP.NumberFormat = "F"; FormP.NumberMultiplication = 1; FormP.MaxVal = 100; //Doesn't matter what this value is as long as it is greater than 0 FormP.TickMS = 1000; OpenDentalCloud.Core.TaskStateMove state = CloudStorage.MoveAsync(atozFrom , atozTo , new OpenDentalCloud.ProgressHandler(FormP.OnProgress)); if (FormP.ShowDialog() == DialogResult.Cancel) { state.DoCancel = true; fileCopyFailures = state.CountTotal - state.CountSuccess; } else { fileCopyFailures = state.CountFailed; } } Cursor = Cursors.Default; if (fileCopyFailures > 0) { MessageBox.Show(Lan.g(this, "Some files belonging to the from patient were not copied.") + "\r\n" + Lan.g(this, "Number of files not copied") + ": " + fileCopyFailures); } textPatientIDFrom.Text = ""; textPatientNameFrom.Text = ""; textPatFromBirthdate.Text = ""; CheckUIState(); //Make log entry here not in parent form because we can merge multiple patients at a time. SecurityLogs.MakeLogEntry(Permissions.PatientMerge, _patTo.PatNum, "Patient: " + _patFrom.GetNameFL() + "\r\nPatNum From: " + _patFrom.PatNum + "\r\nPatNum To: " + _patTo.PatNum); MsgBox.Show(this, "Patients merged successfully."); } //end MergeTwoPatients Cursor = Cursors.Default; }
private void ShowProgressForm(DateTime changedSince){ if(checkTroubleshooting.Checked) { IsTroubleshootMode=true; } else { IsTroubleshootMode=false; } DateTime timeSynchStarted=MiscData.GetNowDateTime(); FormP=new FormProgress(); FormP.MaxVal=100;//to keep the form from closing until the real MaxVal is set. FormP.NumberMultiplication=1; FormP.DisplayText="Preparing records for upload."; FormP.NumberFormat="F0"; //start the thread that will perform the upload ThreadStart uploadDelegate= delegate { UploadWorker(changedSince,timeSynchStarted); }; Thread workerThread=new Thread(uploadDelegate); workerThread.Start(); //display the progress dialog to the user: FormP.ShowDialog(); if(FormP.DialogResult==DialogResult.Cancel) { workerThread.Abort(); } changed=true; textDateTimeLastRun.Text=PrefC.GetDateT(PrefName.MobileSyncDateTimeLastRun).ToShortDateString()+" "+PrefC.GetDateT(PrefName.MobileSyncDateTimeLastRun).ToShortTimeString(); }
private void butPickRxListImage_Click(object sender, EventArgs e) { if (PrefC.AtoZfolderUsed == DataStorageType.InDatabase) { MsgBox.Show(this, "This option is not supported with images stored in the database."); return; } FormImageSelect formIS = new FormImageSelect(); formIS.PatNum = PatCur.PatNum; formIS.ShowDialog(); if (formIS.DialogResult != DialogResult.OK) { return; } string patFolder = ImageStore.GetPatientFolder(PatCur, ImageStore.GetPreferredAtoZpath()); Document doc = Documents.GetByNum(formIS.SelectedDocNum); if (!ImageStore.HasImageExtension(doc.FileName)) { MsgBox.Show(this, "The selected file is not a supported image type."); return; } textDocDateDesc.Text = doc.DateTStamp.ToShortDateString() + " - " + doc.Description.ToString(); if (BitmapOriginal != null) { BitmapOriginal.Dispose(); } if (PrefC.AtoZfolderUsed == DataStorageType.LocalAtoZ) { BitmapOriginal = ImageStore.OpenImage(doc, patFolder); } else { FormProgress FormP = new FormProgress(); FormP.DisplayText = "Downloading Image..."; FormP.NumberFormat = "F"; FormP.NumberMultiplication = 1; FormP.MaxVal = 100; //Doesn't matter what this value is as long as it is greater than 0 FormP.TickMS = 1000; OpenDentalCloud.Core.TaskStateDownload state = CloudStorage.DownloadAsync(patFolder , doc.FileName , new OpenDentalCloud.ProgressHandler(FormP.OnProgress)); FormP.ShowDialog(); if (FormP.DialogResult == DialogResult.Cancel) { state.DoCancel = true; return; } else { using (MemoryStream ms = new MemoryStream(state.FileContent)) { BitmapOriginal = new Bitmap(ms); } } } Bitmap bitmap = ImageHelper.ApplyDocumentSettingsToImage(doc, BitmapOriginal, ImageSettingFlags.ALL); pictBox.BackgroundImage = bitmap; resizePictBox(); }