示例#1
0
 public InitialisationCommand(IZvtTransport transport, ZVTCommandEnvironment environment)
 {
     _environment        = environment;
     _transport          = transport;
     _initialisation     = new InitialisationApdu();
     _commandTransmitter = new MagicResponseCommandTransmitter(_transport);
     _commandTransmitter.ResponseReceived += new Action <IZvtApdu>(_commandTransmitter_ResponseReceived);
 }
        public InitialisationResult Execute()
        {
            InitialisationResult result = new InitialisationResult();

            result.Success = true;

            try
            {
                if (_environment.RaiseAskOpenConnection())
                {
                    _transport.OpenConnection();
                }

                MagicResponseCommandTransmitter commandTransmitter = new MagicResponseCommandTransmitter(_transport);
                commandTransmitter.ResponseReceived += new Action <IZvtApdu>(commandTransmitter_ResponseReceived);
                commandTransmitter.StatusReceived   += new Action <IntermediateStatusApduResponse>(commandTransmitter_StatusReceived);

                ApduCollection         responses      = commandTransmitter.TransmitAPDU(_registration);
                CompletionApduResponse completionApdu = responses.FindFirstApduOfType <CompletionApduResponse>();

                if (completionApdu == null)
                {
                    throw new NotSupportedException("Did not receive Completion from RegistrationApdu");
                }

                //if statusbyte is not supplied (== null) no extra action need to be performed
                CompletionStatusByteParameter statusByte = completionApdu.FindParameter <CompletionStatusByteParameter>(CompletionApduResponse.ParameterTypeEnum.StatusByte);


                if (statusByte != null && statusByte.InitialisationNecessary)
                {
                    _log.Info("PT needs initialisation");

                    InitialisationApdu init  = new InitialisationApdu();
                    ApduCollection     apdus = commandTransmitter.TransmitAPDU(init);

                    AbortApduResponse abort = apdus.FindFirstApduOfType <AbortApduResponse>();

                    if (abort != null)
                    {
                        _log.Info("Initialisation failed with '{0}({1})'", abort.ResultCode, (byte)abort.ResultCode);

                        result.Success = false;
                        result.ProtocolSpecificErrorCode        = (byte)abort.ResultCode;
                        result.ProtocolSpecificErrorDescription = abort.ResultCode.ToString();
                    }
                }

                if (statusByte != null && statusByte.DiagnosisNecessary && result.Success)
                {
                    _log.Info("PT needs diagnosis");

                    DiagnosisApdu  diag  = new DiagnosisApdu();
                    ApduCollection apdus = commandTransmitter.TransmitAPDU(diag);

                    AbortApduResponse abort = apdus.FindFirstApduOfType <AbortApduResponse>();

                    if (abort != null)
                    {
                        _log.Fatal("Diagnosis failed with '{0}({1})'", abort.ResultCode, (byte)abort.ResultCode);

                        result.Success = false;
                        result.ProtocolSpecificErrorCode        = (byte)abort.ResultCode;
                        result.ProtocolSpecificErrorDescription = abort.ResultCode.ToString();
                    }
                }

                result.PrintDocuments = commandTransmitter.PrintDocuments;
            }
            finally
            {
                if (_environment.RaiseAskCloseConnection())
                {
                    _transport.CloseConnection();
                }
            }


            return(result);
        }