private bool GetLocalVersion(out ELEMENT_VER version) { bool success = false; version = new ELEMENT_VER(0, 0, 0, 0); string strLine; try { StreamReader reader = FileOperate.OpenTextFile(strGameOldVerFile); if (reader == null) { goto END; } strLine = reader.ReadLine(); reader.Close(); if (strLine != null) { if (version.Parse(strLine)) { success = true; } } } catch (Exception) { goto END; } END: return(success); }
public long CalcSize(ELEMENT_VER verFrom, ELEMENT_VER verTo) { if (verFrom == verTo || verFrom > verTo) { return(0); } VER_PAIR verPair; if (!FindVersionPair(verFrom, out verPair)) { return(-1); } long sizeOverAll = 0; while (verPair.VerTo == verTo || verPair.VerTo < verTo) { sizeOverAll += verPair.size; if (!FindVersionPair(verPair.VerTo, out verPair)) { break; } } return(sizeOverAll); }
public int CalcPackCount(ELEMENT_VER verFrom, ELEMENT_VER verTo) { if (verFrom == verTo || verFrom > verTo) { return(0); } VER_PAIR verPair; if (!FindVersionPair(verFrom, out verPair)) { return(0); } int packCount = 0; while (verPair.VerTo == verTo || verPair.VerTo < verTo) { ++packCount; if (!FindVersionPair(verPair.VerTo, out verPair)) { break; } } return(packCount); }
public bool FindVersionPair(ELEMENT_VER curVer, out VER_PAIR verPair) { if (_VersionPairs.Count == 0 || curVer == _VerLatest || curVer > _VerLatest || curVer < _VerSperate) { verPair = new VER_PAIR(); return(false); } //找起始点版本 ELEMENT_VER verOld = new ELEMENT_VER(-1, 0, 0, 0); for (int i = 0; i < _VersionPairs.Count; ++i) { var pair = _VersionPairs[i]; if (curVer == pair.VerFrom) { verOld = pair.VerFrom; break; } } if (verOld.iVer0 < 0) //没有找到 { verPair = new VER_PAIR(); return(false); } //找最高的目标版本 int iVer = -1; ELEMENT_VER verNew = _VerSperate; for (int i = 0; i < _VersionPairs.Count; ++i) { if (_VersionPairs[i].VerFrom != verOld) { continue; } if (_VersionPairs[i].VerTo > verNew) { iVer = i; verNew = _VersionPairs[i].VerTo; } } if (iVer < 0) //没有找到 { verPair = new VER_PAIR(); return(false); } else { verPair = _VersionPairs[iVer]; return(true); } }
public VersionMan() { _ProjectName = ""; _Loaded = false; _VerLatest = new ELEMENT_VER(0, 0, 0, 0); _VerSperate = new ELEMENT_VER(0, 0, 0, 0); _VersionPairs = new List <VER_PAIR>(); }
public long GetDownloadTotalSize() { ELEMENT_VER verBegin = Patcher.Instance.m_CurrentVersion; ELEMENT_VER verLatest = Patcher.Instance.m_VersionMan.VerLastest; //检查磁盘空间 long packSizeOverAll = Patcher.Instance.m_VersionMan.CalcSize(verBegin, verLatest); return(packSizeOverAll); }
public static void SetVersion(UPDATE_VERSION which, ELEMENT_VER version) { if (which == UPDATE_VERSION.Local) { Patcher.Instance.UpdateInfo.curVersion = version.ToString(); } else if (which == UPDATE_VERSION.Server) { Patcher.Instance.UpdateInfo.serverVersion = version.ToString(); } }
public bool SetFirstVersion(string strVer, bool bForceWrite) { ELEMENT_VER ver = new ELEMENT_VER(); if (!ver.Parse(strVer)) { LogString(HobaText.Format("[SetFirstVersion] Version Parse Failed! {0}", strVer)); ver.Set(0, 0, 0, 0); } return(SetFirstVersion(ver, bForceWrite)); }
//如果本地文件不存在,设置为初始版本, 如果当前版本 < 初始版本,则写新版本, ret是否新写入baseVersion public bool SetFirstVersion(ELEMENT_VER ver, bool bForceWrite) { m_baseVer = ver; if (bForceWrite || !FileOperate.IsFileExist(strGameOldVerFile)) { if (!FileOperate.MakeDir(strGameOldVerFile)) { LogString(HobaText.Format("[SetFirstVersion] MakeDir {0} Failed!", strGameOldVerFile)); } UpdateRetCode ret = SetLocalVersion(ver); if (ret != UpdateRetCode.success) { LogString(HobaText.Format("[SetFirstVersion] SetLocalVersion {0} Failed!", strGameOldVerFile)); } else { return(true); } } else { ELEMENT_VER localVersion; if (GetLocalVersion(out localVersion) && localVersion < m_baseVer) { LogString(HobaText.Format("[SetFirstVersion] Local Version File Exist {0}! Write New Version From: {1} To {2}", strGameOldVerFile, localVersion.ToString(), ver.ToString())); if (!FileOperate.MakeDir(strGameOldVerFile)) { LogString(HobaText.Format("[SetFirstVersion] MakeDir {0} Failed2!", strGameOldVerFile)); } UpdateRetCode ret = SetLocalVersion(ver); if (ret != UpdateRetCode.success) { LogString(HobaText.Format("[SetFirstVersion] SetLocalVersion {0} Failed2!", strGameOldVerFile)); } else { return(true); } } else { LogString(HobaText.Format("[SetFirstVersion] Local Version File Exist {0}!", strGameOldVerFile)); } } return(false); }
//删除所有更新文件,返回到基础版本 public bool CleanAllUpdatesReturnToBase(ELEMENT_VER baseVer) { this.ReleasePackages(); //释放pck环境 LuaDLL.HOBA_DeleteFilesInDirectory(this.strLibDir); bool ret1 = LuaDLL.HOBA_HasFilesInDirectory(this.strLibDir); if (ret1) { this.LogString(HobaText.Format("[CleanAllUpdatesReturnToBase] Cannot Delete Files in {0}", this.strLibDir)); } this.SetFirstVersion(baseVer, true); return(true); }
//写本地版本文件 public UpdateRetCode SetLocalVersion(ELEMENT_VER ver) { try { StreamWriter writer = FileOperate.CreateTextFile(strGameOldVerFile); if (writer == null) { return(UpdateRetCode.file_err); } writer.WriteLine(ver.ToString()); writer.Close(); } catch (Exception) { return(UpdateRetCode.file_err); } return(UpdateRetCode.success); }
//从本地版本文件读取当前版本 public UpdateRetCode GetLocalVersion() { string strLine = null; try { StreamReader reader = FileOperate.OpenTextFile(strGameOldVerFile); if (reader == null) { return(UpdateRetCode.element_no_ver_file); } strLine = reader.ReadLine(); if (strLine == null) { reader.Close(); return(UpdateRetCode.file_read_err); } reader.Close(); } catch (Exception) { return(UpdateRetCode.fail); } ELEMENT_VER ver = new ELEMENT_VER(0, 0, 0, 0); if (!ver.Parse(strLine)) { return(UpdateRetCode.fail); } m_CurrentVersion = ver; return(UpdateRetCode.success); }
public UpdateRetCode ReadIncFileList(string strFile, out FileIncList fileIncList, out ELEMENT_VER newVer) { UpdateRetCode ret = UpdateRetCode.success; newVer = new ELEMENT_VER(); fileIncList = new FileIncList(); using (StreamReader reader = FileOperate.OpenTextFile(strFile)) { ELEMENT_VER verFrom = new ELEMENT_VER(); ELEMENT_VER verTo = new ELEMENT_VER(); //read header //"# %d.%d.%d %d.%d.%d %s %d" try { var strLine = reader.ReadLine(); if (string.IsNullOrEmpty(strLine)) { return(UpdateRetCode.patcher_invalid_ver_file); } char[] split = { ' ', '\t' }; { var arr = strLine.Split(split); if (arr.Length >= 5 && arr[0] == "#") { verFrom.Parse(arr[1]); verTo.Parse(arr[2]); //projName = arr[3]; //nUpdateSize = Int32.Parse(arr[4]); } else { return(UpdateRetCode.patcher_invalid_ver_file); } } //检查版本 if (m_CurrentVersion < verFrom) { return(UpdateRetCode.patcher_version_too_new); } if (m_CurrentVersion > verTo || m_CurrentVersion == verTo) { return(UpdateRetCode.patcher_version_too_old); } newVer = verTo; //设置新版本 while (true) { strLine = reader.ReadLine(); if (strLine == null) { break; } if (strLine[0] == '#') { continue; } var arr = strLine.Split(split); if (arr.Length >= 2) { string md5 = arr[0]; string filename = arr[1]; fileIncList.AddFile(md5, filename); } else { return(UpdateRetCode.patcher_invalid_ver_file); } } } catch (Exception) { return(UpdateRetCode.fail); } } return(ret); }
public bool CanAutoUpdate(ELEMENT_VER ver) { return(VerSeperate < ver); }
//第二阶段更新,下载更新包 public static IEnumerable UpdateCoroutinePhase2() { UpdateRetCode code = UpdateRetCode.success; if (EntryPoint.Instance.SkipUpdate) //配置跳过更新 { yield return(code); } if (Patcher.Instance.IsWritingPackFileExist()) { code = UpdateRetCode.pack_err; UpdateInfoUtil.SetCanPlay(false); UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateStatus_LastWritePackErr); Patcher.Instance.LogString("Last IsWritingPackFileExist!"); yield return(code); } //初始化pck环境 code = Patcher.Instance.InitPackages(); if (code != UpdateRetCode.success) { Patcher.Instance.ReleasePackages(); //释放pck环境 UpdateInfoUtil.SetCanPlay(false); UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateState_OpenPackFileErr); Patcher.Instance.LogString("InitPackages Failed!"); yield return(code); } //清除写包标志,如果成功打开包 Patcher.Instance.WritePacking(false); yield return(null); // ELEMENT_VER verBegin = Patcher.Instance.m_CurrentVersion; ELEMENT_VER verLatest = Patcher.Instance.m_VersionMan.VerLastest; //检查磁盘空间 long packSizeOverAll = Patcher.Instance.m_VersionMan.CalcSize(verBegin, verLatest); code = Patcher.Instance.CheckDiskFreeSpace(packSizeOverAll + 100 * 1024 * 1024); if (code != UpdateRetCode.success) { UpdateInfoUtil.SetCanPlay(false); yield return(new WaitForSeconds(1.0f)); UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateState_DiskSpaceFullErr); Patcher.Instance.LogString("CheckDiskFreeSpace Failed!"); yield return(code); } while (true) { if (Patcher.Instance.m_CurrentVersion == verLatest || //更新完成 Patcher.Instance.m_CurrentVersion > verLatest) { Patcher.Instance.ReleasePackages(); code = UpdateRetCode.success; UpdateInfoUtil.SetProgress(UPDATE_PROGRESS.Total, 1.0f); UpdateInfoUtil.SetProgress(UPDATE_PROGRESS.File, 1.0f); UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateState_Success); yield return(code); //退出coroutine } else if (Patcher.Instance.m_CurrentVersion < Patcher.Instance.m_VersionMan.VerSeperate) //本地版本过旧 { Patcher.Instance.ReleasePackages(); code = UpdateRetCode.patcher_version_too_new; UpdateInfoUtil.SetCanPlay(false); yield return(new WaitForSeconds(1.0f)); UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateState_LocalVersionTooOldErr); yield return(code); //退出coroutine } //找到版本pair code = Patcher.Instance.FindVersionPair(); if (code != UpdateRetCode.success) { Patcher.Instance.ReleasePackages(); UpdateInfoUtil.SetCanPlay(false); yield return(new WaitForSeconds(1.0f)); UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateState_ServerMaintananceErr); Patcher.Instance.LogString("FindVersionPair Failed!"); yield return(code); //退出coroutine } else { //当前version_pair Patcher.Instance.LogString(HobaText.Format("Will update from {0} to {1}", Patcher.Instance.m_PackFileVer.VerFrom.ToString(), Patcher.Instance.m_PackFileVer.VerTo.ToString())); } yield return(null); //更新 foreach (var item in Patcher.Instance.UpdateAutoCoroutine(verBegin, verLatest)) { if (item is UpdateRetCode) { code = (UpdateRetCode)item; break; } yield return(item); } if (code != UpdateRetCode.success) { break; } } switch (code) { case UpdateRetCode.success: { UpdateInfoUtil.SetProgress(UPDATE_PROGRESS.Total, 1.0f); UpdateInfoUtil.SetProgress(UPDATE_PROGRESS.File, 1.0f); yield return(null); } break; case UpdateRetCode.md5_not_match: { Patcher.Instance.LogString(HobaText.Format("AutoUpdate Failed! {0}", code)); UpdateInfoUtil.SetCanPlay(false); UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateState_NetUnstable); yield return(null); } break; case UpdateRetCode.connect_fail: { Patcher.Instance.LogString(HobaText.Format("AutoUpdate Failed! {0}", code)); UpdateInfoUtil.SetCanPlay(false); UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateState_NetConnectionErr); yield return(null); } break; default: { Patcher.Instance.LogString(HobaText.Format("AutoUpdate Failed! {0}", code)); UpdateInfoUtil.SetCanPlay(false); UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateState_AutoUpdateErr); yield return(null); } break; } Patcher.Instance.ReleasePackages(); //释放pck环境 Patcher.Instance.CleanPatcherTmpDir(); //清除Tmp目录 yield return(code); }
public IEnumerable DoUpdateFrom7zCoroutine(string strPack, ELEMENT_VER verBegin, ELEMENT_VER verLatest) { //this.LogString(HobaText.Format("DoUpdateFrom7zCoroutine: {0}, {1}, {2}", strPack, verBegin.ToString(), verLatest.ToString())); UpdateRetCode code = UpdateRetCode.success; SevenZReader reader = new SevenZReader(); if (!reader.Init(strPack)) { code = UpdateRetCode.pack_file_broken; reader.Release(); yield return(code); // } int fileCount = reader.GetFileCount(); if (fileCount > 0) { GameUpdateMan.Instance.HotUpdateViewer.SetInstallProgress(1, fileCount); yield return(null); } FileIncList fileIncList = new FileIncList(); //找到7z包中的版本文件, inc, 得到版本 bool bIncValid = false; for (int iFile = 0; iFile < fileCount; ++iFile) { string name = reader.GetFileName(iFile); // LogString(HobaString.Format("7z pack file: {0}: {1}", iFile, name)); if (name == "") { this.LogString(HobaText.Format("Fail to get file name: {0}", iFile)); code = UpdateRetCode.pack_file_broken; reader.Release(); yield return(code); // } if (!bIncValid && name == "inc") { bIncValid = true; //读取 ExtractPackThreadInfo threadInfo = ExtractFileFrom7zReader(reader, iFile); while (threadInfo.IsRunning) { yield return(_ShortWait); } OnExtractFileComplete(); int dataSize = threadInfo.DataSize; IntPtr pData = threadInfo.Pointer; if (pData == IntPtr.Zero) { this.LogString(HobaText.Format("Fail to extract file name: {0}", iFile)); code = UpdateRetCode.pack_file_broken; reader.Release(); yield return(code); // } //写入 if (!FileOperate.MakeDir(this.strUpdateIncFile)) { LogString(HobaText.Format("[UpdateAutoCoroutine] MakeDir {0} Failed!", this.strUpdateIncFile)); } byte[] pText = new byte[dataSize]; Marshal.Copy(pData, pText, 0, dataSize); char[] text = Encoding.UTF8.GetChars(pText); bool ret = FileOperate.WriteToTextFile(this.strUpdateIncFile, text, text.Length); if (!ret) { this.LogString(HobaText.Format("Fail to write inc file name: %d", iFile)); code = UpdateRetCode.file_write_err; reader.Release(); yield return(code); // } //读取inc内容 code = ReadIncFileList(this.strUpdateIncFile, out fileIncList, out m_currentNewVer); //删除本地inc文件 FileOperate.DeleteFile(this.strUpdateIncFile); } if (bIncValid) { break; } } if (!bIncValid || code != UpdateRetCode.success) //找不到inc文件 { this.LogString("Pack has no list file: " + strPack); code = UpdateRetCode.pack_file_broken; reader.Release(); yield return(code); // } //计算进度 long packSizeOverAll = m_VersionMan.CalcSize(verBegin, verLatest); if (packSizeOverAll <= 0) { packSizeOverAll = 1; } long packFinishedSize = m_VersionMan.CalcSize(verBegin, m_CurrentVersion); long packNextFinishSize = m_VersionMan.CalcSize(verBegin, m_currentNewVer); float fFileProgress = 0.0f; float fTotalProgress = (float)((packFinishedSize + (packNextFinishSize - packFinishedSize) * (double)fFileProgress) / (double)packSizeOverAll); UpdateInfoUtil.SetProgress(UPDATE_PROGRESS.File, fFileProgress); UpdateInfoUtil.SetProgress(UPDATE_PROGRESS.Total, fTotalProgress); //UpdateInfoUtil.SetWritingPackStatusString(fFileProgress); //新UI fileCount = reader.GetFileCount(); if (fileCount > 0) { GameUpdateMan.Instance.HotUpdateViewer.SetInstallProgress(1, fileCount); } else { GameUpdateMan.Instance.HotUpdateViewer.SetInstallPercent(-1.0f); } yield return(null); //读取patch文件列表 for (int iFile = 0; iFile < fileCount; ++iFile) { //新UI GameUpdateMan.Instance.HotUpdateViewer.SetInstallProgress(iFile + 1, fileCount); yield return(null); if (reader.IsDir(iFile)) { continue; } string name = reader.GetFileName(iFile); // LogString(HobaString.Format("7z pack file: {0}: {1}", iFile, name)); if (string.IsNullOrEmpty(name)) { this.LogString(HobaText.Format("Fail to get file name: {0}", iFile)); code = UpdateRetCode.pack_file_broken; reader.Release(); yield return(code); // } if (name == "inc") //skip inc { continue; } string strMd5; if (!fileIncList.GetFileMd5(name, out strMd5)) { this.LogString(HobaText.Format("Fail to get file md5: {0} {1}", iFile, name)); code = UpdateRetCode.pack_file_broken; reader.Release(); yield return(code); // } bool bInPack = PackFunc.IsFileInPack(name); //是否属于指定的包 bool bSameFileExist = false; if (bInPack) //在包里的文件是否和更新文件md5一致,如果是则跳过更新 { if (PackFunc.CalcPackFileMd5(name) == strMd5) { bSameFileExist = true; } } if (bSameFileExist) { //if (iFile % (10 * 3) == 0) { fFileProgress = (float)(iFile + 1) / fileCount; fTotalProgress = (float)(packFinishedSize + (packNextFinishSize - packFinishedSize) * fFileProgress) / packSizeOverAll; UpdateInfoUtil.SetProgress(UPDATE_PROGRESS.File, fFileProgress); UpdateInfoUtil.SetProgress(UPDATE_PROGRESS.Total, fTotalProgress); //UpdateInfoUtil.SetWritingPackStatusString(fFileProgress); GameUpdateMan.Instance.HotUpdateViewer.SetInstallProgress(fileCount, fileCount); yield return(null); } continue; } //读取patch文件 ExtractPackThreadInfo threadInfo = ExtractFileFrom7zReader(reader, iFile); while (threadInfo.IsRunning) { yield return(_ShortWait); } OnExtractFileComplete(); int dataSize = threadInfo.DataSize; IntPtr pData = threadInfo.Pointer; if (pData == IntPtr.Zero) { this.LogString(HobaText.Format("Fail to extract file name: {0}", iFile)); code = UpdateRetCode.pack_file_broken; reader.Release(); yield return(code); // } //检查md5 //string memMd5 = FileOperate.CalcMemMd5(pData, dataSize); CalcMd5ThreadInfo calcMd5Info = CalcMemMd5(pData, dataSize); while (calcMd5Info.IsRunning) { yield return(_ShortWait); } OnCalcMd5Complete(); string memMd5 = calcMd5Info.Md5; if (memMd5 != strMd5) { this.LogString(HobaText.Format("File md5 mismatch: {0} {1}", iFile, name)); code = UpdateRetCode.pack_file_broken; reader.Release(); yield return(code); // } if (dataSize < 4) //不是压缩文件 { this.LogString(HobaText.Format("Compressed file has no header {0} {1}", iFile, name)); code = UpdateRetCode.pack_file_broken; reader.Release(); yield return(code); // } if (bInPack) //add to package { this.WritePacking(true); bool retFlag = PackFunc.AddCompressedDataToPack(name, pData, dataSize); if (!retFlag) { this.LogString(HobaText.Format("Update fail to add file: {0} {1}", iFile, name)); code = UpdateRetCode.pack_file_broken; reader.Release(); yield return(code); // } else { // this.LogString(HobaString.Format("Success to add pack file: {0} {1}", iFile, name)); code = UpdateRetCode.success; } } else //解压,写文件 { //使用更新目录, 将 AssetBundle/<Plaform> 和 AssetBundle/<Plaform>/Update 整合成AssetBundle string actualName; if (PackFunc.IsFileInAssetBundles(name)) { actualName = PackFunc.MakeShortAssetBundlesFileName(name); // this.LogString(HobaString.Format("MakeShortAssetBundlesFileName: {0} {1} TO {2}", iFile, name, actualName)); } else { actualName = name; } UncompressToSepFileThreadInfo uncompressInfo = UncompressToSepFile(actualName, pData, dataSize); while (uncompressInfo.IsRunning) { yield return(_ShortWait); } OnUncompressToSepFileComplete(); bool retFlag = uncompressInfo.RetFlag; if (!retFlag) { this.LogString(HobaText.Format("Update fail to uncompress file: {0} {1}", iFile, actualName)); code = UpdateRetCode.pack_file_broken; reader.Release(); yield return(code); // } else { // this.LogString(HobaString.Format("Success to add sep file: {0} {1}", iFile, name)); code = UpdateRetCode.success; } } } reader.Release(); PackFunc.FlushWritePack(); if (!PackFunc.SaveAndOpenUpdatePack()) { this.LogString(HobaText.Format("PackFunc.SaveAndOpenUpdatePack() Failed!!! {0}", strPack)); } else { this.WritePacking(false); //清除写包标志 } yield return(code); // }
public IEnumerable UpdateFileFromPackCoroutine(string strPackFile, ELEMENT_VER verBegin, ELEMENT_VER verLatest) { UpdateRetCode code = UpdateRetCode.success; if (this.m_CurrentVersion.IsValid()) { code = GetLocalVersion(); if (code != UpdateRetCode.success) { yield return(UpdateRetCode.element_ver_err); } } UpdateInfoUtil.SetProgress(UPDATE_PROGRESS.File, 0.0f); UpdateInfoUtil.SetWritingPackStatusString(0.0f); //新UI GameUpdateMan.Instance.HotUpdateViewer.SetInstallPercent(-1); yield return(null); //code = DoUpdateFrom7z(strPackFile); foreach (var item in this.DoUpdateFrom7zCoroutine(strPackFile, verBegin, verLatest)) { if (item is UpdateRetCode) { code = (UpdateRetCode)item; break; } yield return(null); } if (code != UpdateRetCode.success) { FileOperate.DeleteFile(strUpdateIncFile); //删除inc.sw文件 } else //更新成功,写新版本 { if (m_currentNewVer < BaseVersion) { code = UpdateRetCode.patcher_version_too_old; } else { ELEMENT_VER newVer = m_currentNewVer; UpdateInfoUtil.SetProgress(UPDATE_PROGRESS.File, 1.0f); //UpdateInfoUtil.SetWritingPackStatusString(1.0f); //新UI //GameUpdateMan.Instance.HotUpdateViewer.SetInstallPercent(1.0f); yield return(null); long sizeAdd = this.m_VersionMan.CalcSize(m_CurrentVersion, m_currentNewVer); UpdateInfoUtil.AddDownloadedSize(sizeAdd); //更新本地版本 SetLocalVersion(newVer); m_CurrentVersion = newVer; VER_PAIR verPair = m_PackFileVer; //更新m_PackFileVer,避免重复下载,下一个版本pair需要FindVersionPair verPair.VerTo = newVer; verPair.VerFrom = newVer; m_PackFileVer = verPair; } } yield return(code); }
public IEnumerable UpdateAutoCoroutine(ELEMENT_VER verBegin, ELEMENT_VER verLatest) { long packSizeOverAll = m_VersionMan.CalcSize(verBegin, verLatest); if (packSizeOverAll <= 0) { packSizeOverAll = 1; } long packFinishedSize = m_VersionMan.CalcSize(verBegin, m_PackFileVer.VerFrom); int nTotalPack = m_VersionMan.CalcPackCount(verBegin, verLatest); int nCurrentPack = m_VersionMan.CalcPackCount(verBegin, m_PackFileVer.VerTo); GameUpdateMan.Instance.HotUpdateViewer.SetPackageNum(nCurrentPack, nTotalPack); UpdateInfoUtil.SetProgress(UPDATE_PROGRESS.Total, (float)((double)packFinishedSize / (double)packSizeOverAll)); UpdateInfoUtil.SetProgress(UPDATE_PROGRESS.File, 0.0f); UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateStatus_BeginUpdate); yield return(null); UpdateRetCode ret = UpdateRetCode.success; string strMd5 = this.m_PackFileVer.md5; //要下载的路径 this.strDownloadUPackName = HobaText.Format( "{0}-{1}.jup", this.m_PackFileVer.VerFrom.ToString(), this.m_PackFileVer.VerTo.ToString()); string strDownloadUPack = this.strDownloadPath + this.strDownloadUPackName; //计时 float nStartTime = Time.time; float nLasTime = nStartTime; float nNowTime = nStartTime; //准备下载 using (DownloadMan downloadMan = new DownloadMan(this.strDownloadPath)) //DownloadMan { downloadMan.TaskEndEvent += delegate { this.IsDownloadDone = true; }; int nTryTimes = 0; bool bFileEqual = false; while (!bFileEqual) { if (ret == UpdateRetCode.net_err || ret == UpdateRetCode.io_err || ret == UpdateRetCode.urlarg_error) { ++nTryTimes; //重连次数超过 if (nTryTimes > UpdateConfig.TotalReconnectTime) { ret = UpdateRetCode.connect_fail; break; //这次更新错误,等待选择重试 } //重连,间隔一定时间 do { yield return(new WaitForSeconds(1.0f)); nNowTime = Time.time; }while (nNowTime - nLasTime <= UpdateConfig.ReconnectTime); nLasTime = nNowTime; this.LogString(HobaText.Format("DownloadMan net_err begin retry {0} ... file: {1}", nTryTimes, this.strDownloadUPackName)); } else { nTryTimes = 0; } if (ret == UpdateRetCode.md5_not_match || ret == UpdateRetCode.download_fail) { break; } //如果文件已存在,判断md5 if (FileOperate.IsFileExist(strDownloadUPack)) { yield return(new WaitForSeconds(0.01f)); UpdateInfoUtil.SetProgress(UPDATE_PROGRESS.File, 100.0f); UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateStatus_CheckingExistPack); yield return(null); //string md5_exist = FileOperate.CalcFileMd5(strDownloadUPack); CalcMd5ThreadInfo calcMd5Info = CalcFileMd5(strDownloadUPack); while (calcMd5Info.IsRunning) { yield return(_ShortWait); } OnCalcMd5Complete(); string md5_exist = calcMd5Info.Md5; if (md5_exist == strMd5) { bFileEqual = true; break; } FileOperate.DeleteFile(strDownloadUPack); //删除旧文件 } //重新开始下载 this.IsDownloadDone = false; if (!FileOperate.MakeDir(strDownloadUPack)) { LogString(HobaText.Format("[UpdateAutoCoroutine] MakeDir {0} Failed!", strDownloadUPack)); } // UpdateInfoUtil.SetProgress(UPDATE_PROGRESS.File, 0.0f); UpdateInfoUtil.SetDownStatusString(0.0f); GameUpdateMan.Instance.HotUpdateViewer.SetDownloadInfo_TextUpate(UpdateInfoUtil.GetStateString(UPDATE_STATE.UpdateString_TextUpdate)); yield return(null); // foreach (var item in FetchPackByUrlCoroutine(downloadMan, // this.strUpdateServerDir1, this.strUpdateServerHostName1, this.strDownloadUPackName, strMd5)) foreach (var item in FetchPackCoroutine(downloadMan, this.strUpdateServerDir1, this.strUpdateServerHostName1, this.strUpdateServerDir2, this.strUpdateServerHostName2, this.strUpdateServerDir3, this.strUpdateServerHostName3, this.strDownloadUPackName, strMd5)) { if (item is UpdateRetCode) { ret = (UpdateRetCode)item; break; } else { yield return(item); } } if (ret != UpdateRetCode.success) { bFileEqual = false; } } if (bFileEqual) { ret = UpdateRetCode.success; } } if (ret == UpdateRetCode.success) //下载成功 { UpdateInfoUtil.bShowWritingPack = true; //设置本地包路径 strLocalPackFileName = strDownloadPath + strDownloadUPackName; UpdateInfoUtil.SetProgress(UPDATE_PROGRESS.File, 0.0f); yield return(null); //打开本地包,更新... //提示正在写包 GameUpdateMan.Instance.HotUpdateViewer.SetInstallInfo(UpdateInfoUtil.GetStateString(UPDATE_STATE.UpdateStatus_WritingPack)); GameUpdateMan.Instance.HotUpdateViewer.SetInstallPercent(-1.0f); foreach (var item in UpdateFileFromPackCoroutine(strLocalPackFileName, verBegin, verLatest)) { if (item is UpdateRetCode) { ret = (UpdateRetCode)item; break; } yield return(item); } //关闭临时包 FileOperate.DeleteFile(this.strLocalPackFileName); this.strLocalPackFileName = ""; UpdateInfoUtil.bShowWritingPack = false; } if (ret == UpdateRetCode.invalid_param) { ret = UpdateRetCode.cancel; yield return(ret); } else if (ret == UpdateRetCode.pack_file_broken || ret == UpdateRetCode.net_err || ret == UpdateRetCode.connect_fail || ret == UpdateRetCode.md5_not_match || ret == UpdateRetCode.io_err || ret == UpdateRetCode.urlarg_error || ret == UpdateRetCode.download_fail) { yield return(ret); } else if (ret != UpdateRetCode.success) { ret = UpdateRetCode.fail; yield return(ret); } //写入本地版本 UpdateInfoUtil.SetVersion(UPDATE_VERSION.Local, this.m_CurrentVersion); yield return(UpdateRetCode.success); }
public bool IsVersionComplete() { ELEMENT_VER verLatest = Patcher.Instance.m_VersionMan.VerLastest; return(Patcher.Instance.m_CurrentVersion == verLatest || Patcher.Instance.m_CurrentVersion > verLatest); }