/// <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) { }
 }
Ejemplo n.º 7
0
        //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);
                }
            }
        }