public bool IsNewerThan(ProgramVersion ver) { if (ver == null) { return true; } if (Major < ver.Major) { return false; } else if (Major > ver.Major) { return true; } if (Minor < ver.Minor) { return false; } else if (Minor > ver.Minor) { return true; } if (Maintenance < ver.Maintenance) { return false; } else if (Maintenance > ver.Maintenance) { return true; } if (Build < ver.Build) { return false; } else if (Build < ver.Build) { return true; } return true; }
private void backgroundWorkerUpdate_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { if (StatusProcessor.Status != (int) StatusProcessor.StatusCodes.Updating) { e.Cancel = true; return; } BackgroundWorker backgroundWorker = sender as BackgroundWorker; if (backgroundWorker != null) { String checksum = ""; String DL = GuiController.PATCHURL + GuiController.PATCHER; String ChksumDL = DL + ".md5"; String Local = Controller.SwgSavePath + @"\" + GuiController.PATCHER; String LocalTmp = Local + ".part"; String lpatchsrv = ""; WebClient wc = new WebClient(); using (StreamReader upstreamVersionStreamReader = new StreamReader(wc.OpenRead(GuiController.PATCHURL + "lpatchinst.cfg"))) { int i = 0; while (lpatchsrv == "" && i < 20 && !backgroundWorker.CancellationPending) { backgroundWorker.ReportProgress( 1, "Debug Try determine remote patcher version"); backgroundWorker.ReportProgress( 1, " Try determine remote patcher version"); lpatchsrv = upstreamVersionStreamReader.ReadToEnd(); i++; } } lpatchsrv = lpatchsrv.Trim(); if (lpatchsrv == "") { e.Cancel = true; return; } ProgramVersion ThisVersion = new ProgramVersion(Controller.GetProgramVersion()); ProgramVersion ServerVersion = new ProgramVersion(lpatchsrv); backgroundWorker.ReportProgress(2,"Debug Local Launcher Version" + Controller.GetProgramVersion() + "|" + ThisVersion.ToCompactString() + " |" + ThisVersion.ToString()); backgroundWorker.ReportProgress(2,"Debug Server Launcher Version" + lpatchsrv + "|" + ServerVersion.ToCompactString() + " |" + ServerVersion.ToString()); if (ThisVersion.IsNewerThan(ServerVersion)) { backgroundWorker.ReportProgress(99,"Debug Launcher is uptodate, updating finished."); backgroundWorker.ReportProgress(100,"Updating finished."); return; } using (StreamReader upstreamVersionStreamReader = new StreamReader(wc.OpenRead(ChksumDL))) { int i = 0; while (checksum == "" && i < 20 && !backgroundWorker.CancellationPending) { backgroundWorker.ReportProgress( 3, "Debug Try DL updater checksums"); backgroundWorker.ReportProgress( 3, "Try DL updater Checksums"); checksum = Regex.Replace(upstreamVersionStreamReader.ReadToEnd(),"\n",""); i++; } } if (checksum == "") { backgroundWorker.ReportProgress( 3, "Debug problem DL'ing updater checksums!"); e.Cancel = true; return; } backgroundWorker.ReportProgress( 4, "Debug downloaded updater checksums!"); backgroundWorker.ReportProgress( 4, "Debug Looking for...." + Local); if (File.Exists(Local)) { if (SWGFile.MatchChecksum(Local,checksum)){ backgroundWorker.ReportProgress(99,"Debug Found local file, matching."); backgroundWorker.ReportProgress(100,"installer available"); return; } backgroundWorker.ReportProgress(5,"Debug Found local file, but it did not match."); } else { backgroundWorker.ReportProgress( 5, "Debug No luck, updater needs downloading"); } try { backgroundWorker.ReportProgress(5,"downloading installer"); backgroundWorker.ReportProgress(5,"Debug downloading installer"); wc.OpenRead(DL); Int64 targetsize = Convert.ToInt64(wc.ResponseHeaders["Content-Length"]); long Filesize = 0; long offset = 0; while (Filesize < targetsize && !backgroundWorker.CancellationPending) { int progress = ((int) (100/targetsize * offset) ); HTTPDownload(LocalTmp, DL, offset, backgroundWorker, progress, true); if (File.Exists(LocalTmp)) { FileInfo f = new FileInfo(LocalTmp); Filesize = f.Length; offset = Filesize; } } if (SWGFile.MatchChecksum(LocalTmp,checksum) ) { backgroundWorker.ReportProgress(99, "Debug " + "Downloaded " + LocalTmp); if (File.Exists(Local)) { File.Delete(Local); } File.Move(LocalTmp, Local); backgroundWorker.ReportProgress(100, "installer available"); return; } else { e.Cancel = true; backgroundWorker.ReportProgress(99, "Debug " + "Postpatch checksum mismatch " + LocalTmp); } } catch (Exception ex) { e.Cancel = true; backgroundWorker.ReportProgress(99, "Debug " + "Error patching " + LocalTmp + " " + ex); } } if(backgroundWorker.CancellationPending) { e.Cancel = true; } else { backgroundWorker.ReportProgress(100,"Updating finished."); } }