Example #1
0
        public InclusionTask(NetworkViewPoint network, IAddRemoveNode addRemoveNode, bool IsSmartStart)
            : base(false, null)
        {
            _network      = network;
            _isSmartStart = IsSmartStart;
            if (addRemoveNode is AddNodeOperation)
            {
                _mode = (addRemoveNode as AddNodeOperation).InitMode;
                _nodeStatusCallback = (addRemoveNode as AddNodeOperation).NodeStatusCallback;
                _timeoutMs          = (addRemoveNode as AddNodeOperation).TimeoutMs;
            }
            else
            {
                _mode      = Modes.NodeAny;
                _timeoutMs = TIMEOUT;
            }

            _peerFilter = new FilterAchOperation();
            _peerFilter.SetFilterNodeId(0xFF);
            _addNode = addRemoveNode;
            _addNode.NodeStatusCallback = OnNodeStatus;

            _memoryGetId = new MemoryGetIdOperation();

            _getSucNodeId             = new GetSucNodeIdOperation();
            _isFailedSucNodeOperation = new IsFailedNodeOperation(0);
            _getSucNodeInfo           = new RequestNodeInfoOperation(0);
            _requestSucNodeInfoGroup  = new ActionSerialGroup(OnSucNodeInfoCompletedGroup, _getSucNodeId, _isFailedSucNodeOperation, _getSucNodeInfo)
            {
                Name = "RequestSucNodeInfoGroup (InclusionController)",
                CompletedCallback = OnRequestSucNodeInfoGroupCompleted
            };

            _setupNodeLifelineTask = new SetupNodeLifelineTask(_network);

            _requestInclusionController = new InclusionController.Initiate(0, 0, _txOptions, 240000)
            {
                Name = "ReguestData (InclusionController)"
            };
            _serialApiGetInitData = new SerialApiGetInitDataOperation();

            SpecificResult.AddRemoveNode     = _addNode.SpecificResult;
            SpecificResult.MemoryGetId       = _memoryGetId.SpecificResult;
            SpecificResult.GetSucNodeId      = _getSucNodeId.SpecificResult;
            SpecificResult.NodeInfo          = _setupNodeLifelineTask.SpecificResult.NodeInfo;
            SpecificResult.SetWakeUpInterval = _setupNodeLifelineTask.SpecificResult.SetWakeUpInterval;

            _isFailedNodeOperation       = new IsFailedNodeOperation(_addNode.SpecificResult.Id);
            _removeFailedNodeIdOperation = new RemoveFailedNodeIdOperation(_addNode.SpecificResult.Id);
            if (!_isSmartStart)
            {
                _isFailedNodeOperation.Token.SetCancelled();
                _removeFailedNodeIdOperation.Token.SetCancelled();
            }

            Actions = new ActionBase[]
            {
                _peerFilter,
                new ActionSerialGroup(OnActionCompleted,
                                      _memoryGetId,
                                      _requestSucNodeInfoGroup,
                                      _serialApiGetInitData,
                                      (ActionBase)_addNode,
                                      _isFailedNodeOperation,
                                      _removeFailedNodeIdOperation,
                                      _requestInclusionController,
                                      _setupNodeLifelineTask
                                      )
                {
                    Name = "Inclusion (Group)"
                }
            };
        }
Example #2
0
        private void OnActionCompleted(ActionBase action, ActionResult result)
        {
            if (result is MemoryGetIdResult && result)
            {
                _setupNodeLifelineTask.NodeId = _memoryGetId.SpecificResult.NodeId;
            }
            else if (result is SerialApiGetInitDataResult && result)
            {
                if (_addNode is AddNodeOperation)
                {
                    (_addNode as AddNodeOperation).NodesBefore = (result as SerialApiGetInitDataResult).IncludedNodes;
                }
            }
            else if (result is AddRemoveNodeResult)
            {
                if (result)
                {
                    _setupNodeLifelineTask.TargetNodeId    = _addNode.SpecificResult.Id;
                    _setupNodeLifelineTask.BasicDeviceType = _addNode.SpecificResult.Basic;

                    if (_addNode.SpecificResult.Id == _getSucNodeId.SpecificResult.SucNodeId)
                    {
                        _requestInclusionController.Token.SetCancelled();
                    }
                    else
                    {
                        if (_addNode.SpecificResult.AddRemoveNodeStatus == AddRemoveNodeStatuses.Replicated)
                        {
                            _setupNodeLifelineTask.Token.SetCancelled();
                            _requestInclusionController.Token.SetCancelled();
                        }
                        else
                        {
                            byte stepId = _addNode.SpecificResult.AddRemoveNodeStatus == AddRemoveNodeStatuses.Replaced ? PROXY_INCLUSION_REPLACE : PROXY_INCLUSION;
                            _requestInclusionController.SetCommandParameters(_addNode.SpecificResult.Id, stepId);
                        }
                    }

                    if ((result as AddRemoveNodeResult).SubstituteStatus == SubstituteStatuses.Failed && _isSmartStart)
                    {
                        if (_isFailedNodeOperation != null)
                        {
                            _isFailedNodeOperation.NodeId = _addNode.SpecificResult.Id;
                        }
                        else
                        {
                            _isFailedNodeOperation = new IsFailedNodeOperation(_addNode.SpecificResult.Id);
                        }
                    }
                    else
                    {
                        _isFailedNodeOperation.Token.SetCancelled();
                        _removeFailedNodeIdOperation.Token.SetCancelled();
                    }
                }
                else
                {
                    //this.Token.Result.TraceLog.Add(result.TraceLog);
                    _setupNodeLifelineTask.Token.SetCancelled();
                    _requestInclusionController.Token.SetCancelled();
                    //if (result.State == ActionStates.Failed)
                    //{
                    //    SetStateFailed(null);
                    //}
                    //else if (result.State == ActionStates.Expired)
                    //{
                    //    SetStateExpired(null);
                    //}
                }
            }
            else if (result is RequestDataResult && result)
            {
                var requestRes = (RequestDataResult)result;
                if (requestRes.Command != null && requestRes.Command.Length > 2 &&
                    requestRes.Command[0] == COMMAND_CLASS_INCLUSION_CONTROLLER.ID &&
                    requestRes.Command[1] == COMMAND_CLASS_INCLUSION_CONTROLLER.COMPLETE.ID)
                {
                    COMMAND_CLASS_INCLUSION_CONTROLLER.COMPLETE cmd = requestRes.Command;
                    if (cmd.status == 0x01)
                    {
                        SpecificResult.AddRemoveNode.SubstituteStatus = SubstituteStatuses.Done;
                    }
                }
            }
            else if (result is IsFailedNodeResult)
            {
                if ((result as IsFailedNodeResult).RetValue)
                {
                    _setupNodeLifelineTask.Token.SetCancelled();
                    SpecificResult.AddRemoveNode.AddRemoveNodeStatus = AddRemoveNodeStatuses.None;
                    if (_removeFailedNodeIdOperation != null)
                    {
                        _removeFailedNodeIdOperation.ReplacedNodeId = _addNode.SpecificResult.Id;
                    }
                    else
                    {
                        _removeFailedNodeIdOperation = new RemoveFailedNodeIdOperation(_addNode.SpecificResult.Id);
                    }
                }
                else
                {
                    _removeFailedNodeIdOperation.Token.SetCancelled();
                }
            }
        }