public static bool ClearAllUpdateFiles(string localUpdatePath, UpdaterHandler handler = null) { //if (Directory.Exists(KEnv.PatchResourcesDirPath)) // { // 可以断定是重新安装了客户端,删掉patch_resources // var waitDelete = true; // string deleteDirError = null; // ThreadPool.QueueUserWorkItem((_) => // { try { if (Directory.Exists(localUpdatePath)) { Directory.Delete(localUpdatePath, true); } if (ClearAllUpdateFilesHook != null) { ClearAllUpdateFilesHook(); } } catch (Exception e) { OnError(handler, e.Message); return(false); } // finally // { // waitDelete = false; // } // }); // while (waitDelete) // yield return null; // if (!string.IsNullOrEmpty(deleteDirError)) // { // KLog.Err(deleteDirError); // } // 清理过后,进行刷新热更新脚本列表 // Reload(); // } return(true); }
/// <summary> /// Error handler /// </summary> /// <param name="message"></param> protected static void OnError(UpdaterHandler handler, string message, params object[] args) { if (handler != null) { handler.AppendLog(message, args); } var errMsg = string.Format(message, args); if (handler != null) { handler.Error = new UpdaterException(errMsg); handler.IsFinished = true; } if (CustomOnError != null) { CustomOnError(errMsg); } // else // throw new UpdaterException(errMsg); }
protected internal override UpdaterHandler OnTransition(UpdaterHandler[] all, UpdaterHandler next) { if (LocalVersion == RemoteVersion) { return(null); // over, no next any more } if (LocalVersion > RemoteVersion) { AppendLog("Local version greater than remote version! clear local all!"); // clear all, re update all UpdaterVerifyFileHandler.ClearAllUpdateFiles(_localUpdaterPath, this); // IMPOSSIBLE! local version cannot greater than Remote version! this must be a revert operation LocalVersion = 0; } if (RemoteVersion == 0) // no update! over now! { return(null); } AppendLog("Local version {0}, Remote Version {1}, do update!", LocalVersion, RemoteVersion); // default, next go return(next); }
/// <summary> /// Decide transition to which next handler /// </summary> /// <param name="all"></param> /// <param name="next"></param> /// <returns></returns> protected internal virtual UpdaterHandler OnTransition(UpdaterHandler[] all, UpdaterHandler next) { return(next); }
/// <summary> /// Thread function /// </summary> /// <param name="state"></param> private void _StartThread(object state) { for (var i = 0; i < _handlers.Length; i++) { var handler = _handlers[i]; CurrentHandler = handler; handler.Start(); var currentHandlerStartTime = DateTime.Now; DateTime?fullProgressStarTime = null; var otherError = false; while (!handler.IsFinished) { if ((DateTime.Now - currentHandlerStartTime).TotalSeconds > UpdaterHandlerTimeout) { Error = new TimeoutException(string.Format("UpdaterHandler {0} Timeout over {1}s", handler, UpdaterHandlerTimeout)); otherError = true; break; } if (handler.Progress >= 1) { if (fullProgressStarTime == null) { fullProgressStarTime = DateTime.Now; } if ((DateTime.Now - fullProgressStarTime.Value).TotalSeconds > UpdaterHandlerFullProgressTimeout) { Error = new TimeoutException( string.Format("UpdaterHandler {0} Progress 100% but timeout over {1}s", handler, UpdaterHandlerFullProgressTimeout)); otherError = true; break; } } Thread.Sleep(1); } if (otherError) { ErrorHandler = handler; break; } if (handler.IsError) { Error = handler.Error; ErrorHandler = handler; break; } // next transition if ((i + 1) < _handlers.Length) { var next = _handlers[i + 1]; if (OnTransitionEvent != null) { OnTransitionEvent(CurrentHandler, next); } if (handler.OnTransition(_handlers, next) == null) { break; // if null, break next } } } CurrentHandler = null; IsDone = true; if (FinishCallback != null) { FinishCallback(this); } }