Example #1
0
        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();
                }
            }
        }
Example #2
0
 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();
             }
         }
     }
 }
Example #3
0
        /// <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);
        }
Example #4
0
        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."));
        }
Example #6
0
 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);
         }
     }
 }
Example #7
0
 private void RefreshBootloader()
 {
     executor.Fastboot();
 }