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; }