private void butRecopy_Click(object sender, EventArgs e) { Version versionCurrent = new Version(Application.ProductVersion); string folderUpdate = ""; if (PrefC.AtoZfolderUsed) { folderUpdate = ODFileUtils.CombinePaths(ImageStore.GetPreferredAtoZpath(), "UpdateFiles"); } else //db { folderUpdate = ODFileUtils.CombinePaths(Path.GetTempPath(), "UpdateFiles"); if (Directory.Exists(folderUpdate)) { Directory.Delete(folderUpdate, true); } DocumentMisc docmisc = DocumentMiscs.GetUpdateFilesZip(); if (docmisc != null) { byte[] rawBytes = Convert.FromBase64String(docmisc.RawBase64); using (ZipFile unzipped = ZipFile.Read(rawBytes)) { unzipped.ExtractAll(folderUpdate); } } } //identify the ideal situation where everything is already in place and no copy is needed. if (Directory.Exists(folderUpdate)) { string filePath = ODFileUtils.CombinePaths(folderUpdate, "Manifest.txt"); if (File.Exists(filePath)) { string fileText = File.ReadAllText(filePath); if (fileText == versionCurrent.ToString(3)) { if (!MsgBox.Show(this, MsgBoxButtons.YesNo, "According to the information in UpdateFiles\\Manifest.txt, the UpdateFiles folder is current. Recopy anyway?")) { return; } } } } Cursor = Cursors.WaitCursor; if (!PrefL.CopyFromHereToUpdateFiles(versionCurrent)) { Cursor = Cursors.Default; return; } Cursor = Cursors.Default; MsgBox.Show(this, "Recopied."); }
public static bool CopyFromHereToUpdateFiles(Version versionCurrent) { string folderUpdate = ""; if (PrefC.AtoZfolderUsed) { folderUpdate = ODFileUtils.CombinePaths(ImageStore.GetPreferredAtoZpath(), "UpdateFiles"); } else { folderUpdate = ODFileUtils.CombinePaths(Path.GetTempPath(), "UpdateFiles"); } if (Directory.Exists(folderUpdate)) { try { Directory.Delete(folderUpdate, true); } catch { MessageBox.Show(Lan.g("Prefs", "Please delete this folder and then re-open the program: ") + folderUpdate); return(false); } //wait a bit so that CreateDirectory won't malfunction. DateTime now = DateTime.Now; while (Directory.Exists(folderUpdate) && DateTime.Now < now.AddSeconds(10)) //up to 10 seconds { Application.DoEvents(); } if (Directory.Exists(folderUpdate)) { MessageBox.Show(Lan.g("Prefs", "Please delete this folder and then re-open the program: ") + folderUpdate); return(false); } } Directory.CreateDirectory(folderUpdate); DirectoryInfo dirInfo = new DirectoryInfo(Application.StartupPath); FileInfo[] appfiles = dirInfo.GetFiles(); for (int i = 0; i < appfiles.Length; i++) { if (appfiles[i].Name == "FreeDentalConfig.xml") { continue; //skip this one. } if (appfiles[i].Name == "OpenDentalServerConfig.xml") { continue; //skip also } if (appfiles[i].Name.StartsWith("openlog")) { continue; //these can be big and are irrelevant } if (appfiles[i].Name.Contains("__")) //double underscore { continue; //So that plugin dlls can purposely skip the file copy. } //include UpdateFileCopier File.Copy(appfiles[i].FullName, ODFileUtils.CombinePaths(folderUpdate, appfiles[i].Name)); } //Create a simple manifest file so that we know what version the files are for. File.WriteAllText(ODFileUtils.CombinePaths(folderUpdate, "Manifest.txt"), versionCurrent.ToString(3)); if (PrefC.AtoZfolderUsed) { //nothing more to do } else { //zip and save to db ZipFile zipFile = new ZipFile(); zipFile.AddDirectory(folderUpdate); MemoryStream memStream = new MemoryStream(); zipFile.Save(memStream); zipFile.Dispose(); memStream.Position = 0; byte[] zipFileBytes = memStream.GetBuffer(); string zipFileBytesBase64 = Convert.ToBase64String(zipFileBytes); memStream.Dispose(); int length = zipFileBytesBase64.Length; DocumentMiscs.SetUpdateFilesZip(zipFileBytesBase64); } return(true); }
///<summary>Called in two places. Once from FormOpenDental.PrefsStartup, and also from FormBackups after a restore.</summary> public static bool CheckProgramVersion() { if (PrefC.GetBool(PrefName.UpdateWindowShowsClassicView)) { return(CheckProgramVersionClassic()); } Version storedVersion = new Version(PrefC.GetString(PrefName.ProgramVersion)); Version currentVersion = new Version(Application.ProductVersion); string database = ""; //string command=""; if (DataConnection.DBtype == DatabaseType.MySql) { database = MiscData.GetCurrentDatabase(); } if (storedVersion < currentVersion) { //There are two different situations where this might happen. if (PrefC.GetString(PrefName.UpdateInProgressOnComputerName) == "") //1. Just performed an update from this workstation on another database. //This is very common for admins when viewing slighly older databases. //There should be no annoying behavior here. So do nothing. { #if !DEBUG //Excluding this in debug allows us to view slightly older databases without accidentally altering them. Prefs.UpdateString(PrefName.ProgramVersion, currentVersion.ToString()); Cache.Refresh(InvalidType.Prefs); #endif return(true); } //and 2a. Just performed an update from this workstation on this database. //or 2b. Just performed an update from this workstation for multiple databases. //In both 2a and 2b, we already downloaded Setup file to correct location for this db, so skip 1 above. //This computer just performed an update, but none of the other computers has updated yet. //So attempt to stash all files that are in the Application directory. if (!CopyFromHereToUpdateFiles(currentVersion)) { Application.Exit(); return(false); } Prefs.UpdateString(PrefName.ProgramVersion, currentVersion.ToString()); Prefs.UpdateString(PrefName.UpdateInProgressOnComputerName, ""); //now, other workstations will be allowed to update. Cache.Refresh(InvalidType.Prefs); } if (storedVersion > currentVersion) { //This is the update sequence for both a direct workstation, and for a ClientWeb workstation. string folderUpdate = ""; if (PrefC.AtoZfolderUsed) { folderUpdate = ODFileUtils.CombinePaths(ImageStore.GetPreferredAtoZpath(), "UpdateFiles"); } else //images in db { folderUpdate = ODFileUtils.CombinePaths(Path.GetTempPath(), "UpdateFiles"); if (Directory.Exists(folderUpdate)) { Directory.Delete(folderUpdate, true); } DocumentMisc docmisc = DocumentMiscs.GetUpdateFilesZip(); if (docmisc != null) { byte[] rawBytes = Convert.FromBase64String(docmisc.RawBase64); using (ZipFile unzipped = ZipFile.Read(rawBytes)) { unzipped.ExtractAll(folderUpdate); } } } //look at the manifest to see if it's the version we need string manifestVersion = ""; try { manifestVersion = File.ReadAllText(ODFileUtils.CombinePaths(folderUpdate, "Manifest.txt")); } catch { //fail silently } if (manifestVersion != storedVersion.ToString(3)) //manifest version is wrong //No point trying the Setup.exe because that's probably wrong too. //Just go straight to downloading and running the Setup.exe. { string manpath = ODFileUtils.CombinePaths(folderUpdate, "Manifest.txt"); if (MessageBox.Show(Lan.g("Prefs", "The expected version information was not found in this file: ") + manpath + ". " + Lan.g("Prefs", "There is probably a permission issue on that folder which should be fixed. ") + "\r\n\r\n" + Lan.g("Prefs", "The suggested solution is to return to the computer where the update was just run. Go to Help | Update | Setup, and click the Recopy button.") + "\r\n\r\n" + Lan.g("Prefs", "If, instead, you click OK in this window, then a fresh Setup file will be downloaded and run."), "", MessageBoxButtons.OKCancel) != DialogResult.OK) //they don't want to download again. { Application.Exit(); return(false); } DownloadAndRunSetup(storedVersion, currentVersion); Application.Exit(); return(false); } //manifest version matches if (MessageBox.Show(Lan.g("Prefs", "Files will now be copied.") + "\r\n" + Lan.g("Prefs", "Workstation version will be updated from ") + currentVersion.ToString(3) + Lan.g("Prefs", " to ") + storedVersion.ToString(3), "", MessageBoxButtons.OKCancel) != DialogResult.OK) //they don't want to update for some reason. { Application.Exit(); return(false); } string tempDir = Path.GetTempPath(); //copy UpdateFileCopier.exe to the temp directory File.Copy(ODFileUtils.CombinePaths(folderUpdate, "UpdateFileCopier.exe"), //source ODFileUtils.CombinePaths(tempDir, "UpdateFileCopier.exe"), //dest true); //overwrite //wait a moment to make sure the file was copied Thread.Sleep(500); //launch UpdateFileCopier to copy all files to here. int processId = Process.GetCurrentProcess().Id; string appDir = Application.StartupPath; string startFileName = ODFileUtils.CombinePaths(tempDir, "UpdateFileCopier.exe"); string arguments = "\"" + folderUpdate + "\"" //pass the source directory to the file copier. + " " + processId.ToString() //and the processId of Open Dental. + " \"" + appDir + "\""; //and the directory where OD is running Process.Start(startFileName, arguments); Application.Exit(); //always exits, whether launch of setup worked or not return(false); } return(true); }