/// <summary> /// Executes behavior with given context /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override BehaviorReturnCode Behave(IBehaviorContext context) { PlayerBehaviorContext playerContext = context as PlayerBehaviorContext; if (playerContext == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } if (playerContext.Unit == null || playerContext.UnitUpgrade == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } UpgradeTask task = new UpgradeTask(playerContext.Unit, playerContext.UnitUpgrade); task.Execute(); if (task.IsTaskFinished) { returnCode = BehaviorReturnCode.Success; return(returnCode); } returnCode = BehaviorReturnCode.Failure; return(returnCode); }
private async Task InsertNewUpgradeTaskAsync(Device device) { var job = new UpgradeTask(); job.DeviceID = device.id; job.UpgradeID = this._upgradeFile.id; await this._upgradeTaskDataModel.InsertAsync(job); }
private void PutUpgradeTaskInWorkingQueue( IUpgradeTasksModel dataModel, UpgradeTask task) { task.Status = UpgradeStatus.InProgress; task.LastStartTime = task.LastUpdateTime = DateTime.Now; task.SentDataBytes = 0; try { dataModel.UpdateAsync( task, t => t.Status, t => t.LastStartTime, t => t.LastUpdateTime, t => t.SentDataBytes).Wait(); } catch (Exception) { } Func <string, string, string, CancellationToken, Task <bool> > SendNotificationFunc = null; switch (task.UpgradeFile.filetype) { case (int)UpgradeFileType.SoftwareUpgrade: SendNotificationFunc = HttpClient.SendFirmwareUpgradeNotificationAsync; break; case (int)UpgradeFileType.AddressBookUpgrade: SendNotificationFunc = HttpClient.SendAddressBookUpgradeNotificationAsync; break; case (int)UpgradeFileType.ScreenSaverUpgrade: SendNotificationFunc = HttpClient.SendResourceUpgradeNotificationAsync; break; case (int)UpgradeFileType.SecurityCardListUpgrade: SendNotificationFunc = HttpClient.SendCardListUpgradeNotificationAsync; break; } if (SendNotificationFunc != null) { this.Add(new NetworkTask { IP = task.Device.ip, TaskFunc = async() => { if (!await SendNotificationFunc(task.Device.ip, Config.Instance.LocalIP, task.UpgradeFile.filepath, default(CancellationToken)).ConfigureAwait(false)) { MarkUpgradeTaskTBD(dataModel, task); return; } UpdateUpgradeTaskLastUpdateTime(dataModel, task); } }); } }
private void UpdateUpgradeTaskLastUpdateTime( IUpgradeTasksModel dataModel, UpgradeTask task) { task.LastUpdateTime = DateTime.Now; try { dataModel.UpdateAsync( task, t => t.LastUpdateTime).Wait(); } catch (Exception) { } }
private void MarkUpgradeTaskRemoved( IUpgradeTasksModel dataModel, UpgradeTask task) { task.Status = UpgradeStatus.Removed; try { //if (!task.DeletedByUser) dataModel.UpdateAsync(task, t => t.Status).Wait(); //else // dataModel.Delete(task); } catch (Exception) { } }
private void MarkUpgradeTaskComplete( IUpgradeTasksModel dataModel, UpgradeTask task) { task.Status = UpgradeStatus.Complete; task.LastUpdateTime = DateTime.Now; try { //if (!task.DeletedByUser) dataModel.UpdateAsync( task, t => t.Status, t => t.LastUpdateTime).Wait(); //else // dataModel.Delete(task); } catch (Exception) { } }
//whenever a task launcher is added or removed, this method will be called to add/remove it to/from the upgrade tasks list: public void UpdateUpgradeTasks(TaskLauncher taskLauncher, bool add, Upgrade upgrade = null) { //if taskID is set to -1 and add = false, then all the tasks with the assigned task launcher will be removed //if taskID >= 0 is valid, then only the upgrade task with taskID in the task launcher will be removed. if (add == false) //if this task launcher is getting removed. { int i = 0; //go through all registerd task launchers in this component while (i < upgradeTasks.Count) { if (upgradeTasks[i].taskLauncher == taskLauncher || (upgrade != null && IsUpgradeMatch(upgradeTasks[i].taskLauncher, upgradeTasks[i].taskID, upgrade) == true)) //if the task launcher matches: //remove it: { upgradeTasks.RemoveAt(i); } else { i++; //move on } } } else if (taskLauncher.GetTasksCount() > 0) //if we're adding tasks and this task launcher has tasks. { //loop through the task launcher's task for (int taskID = 0; taskID < taskLauncher.GetTasksCount(); taskID++) { //if this is the upgrade task that we're looking for. if (taskLauncher.GetTask(taskID).GetTaskType() == TaskTypes.upgrade) { //go ahead and add it: UpgradeTask newUpgradeTask = new UpgradeTask { taskLauncher = taskLauncher, taskID = taskID }; //add it to the list: upgradeTasks.Add(newUpgradeTask); //and activate the upgrade manager: Activate(); } } } }
private void MarkUpgradeTaskTBD( IUpgradeTasksModel dataModel, UpgradeTask task) { task.Status = UpgradeStatus.TBD; task.LastStartTime = task.LastUpdateTime = null; task.SentDataBytes = 0; try { //if (!task.DeletedByUser) dataModel.UpdateAsync( task, t => t.Status, t => t.LastStartTime, t => t.LastUpdateTime, t => t.SentDataBytes).Wait(); //else // dataModel.Delete(task); } catch (Exception) { } }
// ConcurrentQueue<Task> updateTaskQueueForUpgradeTask = new ConcurrentQueue<Task>(); private void UpgradeTaskForEachDevice(IUpgradeTasksModel upgradeTaskDataModel, Device device, CancellationToken cancelToken) { // 刪除被使用者標記要刪除且非運行中的 Task //var tasksToBeRemoved = upgradeTaskDataModel.Data.Where( var tasksToBeRemoved = upgradeTaskDataModel.Select( t => t.DeletedByUser && t.Status != UpgradeStatus.InProgress).ToList(); if (tasksToBeRemoved != null) { upgradeTaskDataModel.Delete(tasksToBeRemoved); } //var updateTasksPerDevice = upgradeTaskDataModel.Data.Where( // t => t.DeviceID == device.id && t.Status != UpgradeStatus.Removed var updateTasksPerDevice = upgradeTaskDataModel.Select( t => t.DeviceID == device.id && t.Status != UpgradeStatus.Removed, t => t.Device, t => t.UpgradeFile ).OrderByDescending(t => t.UpgradeFile.filetype); UpgradeTask candidateTask = null; bool stopTrace = false; try { foreach (var task in updateTasksPerDevice) { if (candidateTask == null || candidateTask.UpgradeFile.filetype != task.UpgradeFile.filetype) { //if (candidateTask != null && candidateTask.Status == UpgradeStatus.TBD) //{ // put candidateTask to working queue //PutUpgradeTaskInWorkingQueue(upgradeTaskDataModel, candidateTask); //} candidateTask = task; stopTrace = false; } else if (!stopTrace) { // similar tasks: // case 1.1: (x, T) // remove // (1, T) // pick // case 1.2: (1, C or W) // (1, T) // remove // case 1.3: (1, C or W) // (2, T) // pick if 1 is C // case 2.1: (x, T) // remove // (x, T) // remove // (1, T) // pick // case 2.2: (1, C or W) // (x, T) // remove // (1, T) // remove // case 2.3: (1, C or W) // (x, T) // remove // (2, T) // pick if 1 is C if (task.Status == UpgradeStatus.TBD) { MarkUpgradeTaskRemoved(upgradeTaskDataModel, task); } else { // Complete or Working if (candidateTask.UpgradeID == task.UpgradeID) { MarkUpgradeTaskRemoved(upgradeTaskDataModel, candidateTask); } else { if (task.Status != UpgradeStatus.Complete) { candidateTask = task; } } stopTrace = true; } } } } catch (Exception) { return; } //if (candidateTask != null && candidateTask.Status == UpgradeStatus.TBD) //{ // // put candidateTask to working queue // //PutUpgradeTaskInWorkingQueue(upgradeTaskDataModel, candidateTask); //} if (device.online == 0) { return; } var taskInProgress = (from t in updateTasksPerDevice.AsParallel() where t.Status == UpgradeStatus.InProgress select t).FirstOrDefault(); if (taskInProgress == null) { candidateTask = (from t in updateTasksPerDevice.AsParallel() where t.Status == UpgradeStatus.TBD && !t.DeletedByUser orderby t.ID select t).FirstOrDefault(); if (candidateTask != null) { PutUpgradeTaskInWorkingQueue(upgradeTaskDataModel, candidateTask); } } }