예제 #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);
 }
예제 #2
0
        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;
        }