public void Run(ILeafUI ui, ICommandExecutor executor, IDevice device) { using (ui) { ui.Show(); ui.Closing += (s, e) => { executor.Dispose(); return(true); }; executor.OutputReceived += (s, e) => ui.WriteLineToDetails(e.Text); //Checking if device support A/B slot. CommandResult result = executor.Fastboot(device, "getvar current-slot 2"); bool?crtSlot = GetCurrentSlot(result.Output.ToString()); if (crtSlot != null || AskIfContinueWithMayNotSupport(ui)) { //Ask if continue var targetSlot = (bool)crtSlot ? "b" : "a"; if (AskIfContinueToSwitch(ui)) { executor.Fastboot(device, "--set-active=" + targetSlot); } } else { ui.Shutdown(); } } }
public void EntryPoint(ILeafUI ui, IDevice device, ICommandExecutor executor) { using (ui) { using (executor) { var text = ClassTextReaderCache.Acquire <EFlashRecovery>(); ui.Show(); OpenFileDialog fileDialog = new OpenFileDialog(); fileDialog.Reset(); fileDialog.Title = text["Title"]; fileDialog.Filter = text["Filter"]; fileDialog.Multiselect = false; if (fileDialog.ShowDialog() == true) { executor.OutputReceived += (s, e) => ui.WriteLineToDetails(e.Text); executor.Fastboot(device, $"flash recovery \"{fileDialog.FileName}\""); var result = executor.Fastboot(device, $"boot \"{fileDialog.FileName}\""); ui.Finish(result.ExitCode == 0 ? StatusMessages.Success : StatusMessages.Failed); } else { ui.Shutdown(); } } } }
/// <summary> /// 带有超时重试功能的fastboot指令执行器 /// </summary> /// <param name="executor"></param> /// <param name="args"></param> /// <param name="retryTimes"></param> /// <param name="maxTimeout"></param> /// <exception cref="TimeoutException">超过重试次数</exception> /// <exception cref="ArgumentException">参数不合理</exception> /// <returns></returns> public static CommandResult FastbootWithRetry(this ICommandExecutor executor, string args, IDevice?device = null, int retryTimes = 10, int maxTimeout = 300) { if (retryTimes * maxTimeout <= 0) { throw new ArgumentException("retryTimes and maxTimeout should not be smaller than 0"); } const int INTERVAL_BETWEEN_PER_RETRY = 20; /* * 由于某些原因,部分设备上的fastboot指令会有玄学问题 *因此此处实现了一个重试机制,尽可能获取到正确的值 */ CommandResult?result = null; for (int crtTime = 1; crtTime <= retryTimes; crtTime++) { CommandResult routine() { return(device == null?executor.Fastboot(args) : executor.Fastboot(device, args)); } Task.Run(() => { result = routine(); }); Thread.Sleep((int)maxTimeout); if (result != null && !result.Output.Contains("GetVar Variable Not found")) { break; } else { executor.CancelCurrent(); Thread.Sleep(INTERVAL_BETWEEN_PER_RETRY); } } if (result == null) { throw new TimeoutException(); } return(result); }
public void Run(ILeafUI ui, ICommandExecutor executor, IDevice device) { using (ui) { ui.Icon = this.GetIcon(); ui.Show(); ui.Closing += (s, e) => { executor.Dispose(); return(true); }; executor.OutputReceived += (s, e) => ui.WriteLineToDetails(e.Text); //Checking if device support A/B slot. try { ui.StatusInfo = text.RxGetClassText("status_getting_crt_slot"); string slot = device.GetVar("current-slot"); var targetSlot = slot == "a" ? "b" : "a"; if (AskIfContinueToSwitch(ui)) { ui.StatusInfo = text.RxGetClassText("status_switching"); var result = executor.Fastboot(device, "--set-active=" + targetSlot); if (result.ExitCode == 0) { ui.Finish(StatusMessages.Success); } else { ui.Finish(StatusMessages.Failed); } } } catch (Exception e) { DisplayNotSupportMessage(ui); SLogger <ESwitchABSlot> .Warn(e); ui.Shutdown(); } } }
/// <summary> /// 开始执行 /// </summary> /// <exception cref="CommandErrorException">达到重试上限</exception> /// <returns></returns> public CommandResult Execute() { CommandResult?result = null; for (int crtTime = 1; crtTime <= MaxTimes; crtTime++) { Task.Run(() => result = executor.Fastboot(device, command)); Thread.Sleep(WAIT_TIME); if (result == null) { executor.CancelCurrent(); Thread.Sleep(INTERVAL); } else { break; } } return(result ?? throw new CommandErrorException("Reachec limit of try.")); }
public void EntryPoint(ILeafUI ui, IDevice device, ICommandExecutor executor) { using (ui) { using (executor) { var text = ClassTextReaderCache.Acquire <EOemLock>(); ui.Show(); if (!ui.DoYN(text["warn"])) { return; } if (!ui.DoYN(text["warn2"])) { return; } executor.OutputReceived += (s, e) => ui.WriteLineToDetails(e.Text); var exitCode = executor.Fastboot(device, "oem lock").ExitCode; ui.Finish(exitCode == 0 ? StatusMessages.Success : StatusMessages.Failed); } } }
private void RefreshBootloader() { executor.Fastboot(); }