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