CombinationSelection_C(EMVTerminalPreProcessingStateEnum parent) { Tuple <EMVTerminalProcessingOutcome, EMVSelectApplicationResponse, TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination, List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> > > result; switch (parent) { case EMVTerminalPreProcessingStateEnum.Preprocessing_StartA: result = EMVContactCombinationSelection.CombinationSelection_FromA(cardQProcessor, uiProvider); lastCandidateSelected = Tuple.Create(result.Item1, result.Item2, result.Item3, result.Item4); break; case EMVTerminalPreProcessingStateEnum.ProtocolActivation_StartB: result = EMVContactCombinationSelection.CombinationSelection_FromB(cardQProcessor, lastCandidateSelected, candidates, uiProvider); break; case EMVTerminalPreProcessingStateEnum.CombinationSelection_StartC: preProcessingValues.RemoveAll(x => ((TerminalSupportedContactKernelAidTransactionTypeCombination)x.Item1).AIDEnum == ((TerminalSupportedContactKernelAidTransactionTypeCombination)lastCandidateSelected.Item3).AIDEnum); candidates.RemoveAll(x => ((TerminalSupportedContactKernelAidTransactionTypeCombination)x.Item1).AIDEnum == ((TerminalSupportedContactKernelAidTransactionTypeCombination)lastCandidateSelected.Item3).AIDEnum); result = EMVContactCombinationSelection.CombinationSelection_FromC(cardQProcessor, candidates, uiProvider); lastCandidateSelected = Tuple.Create(result.Item1, result.Item2, result.Item3, result.Item4); break; default: throw new EMVProtocolException("unimplemeted TerminalPreProcessingStateEnum in CombinationSelection"); } if (result.Item1.NextProcessState == EMVTerminalPreProcessingStateEnum.EndProcess) { return(Tuple.Create(result.Item1, (EMVSelectApplicationResponse)null, (TerminalSupportedKernelAidTransactionTypeCombination)null, (CardKernelAidCombination)null, (EntryPointPreProcessingIndicators)null)); } candidates = result.Item5; TerminalSupportedKernelAidTransactionTypeCombination terminalCombinationForSelected = result.Item3; List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, EntryPointPreProcessingIndicators> > filteredIndicators = preProcessingValues.Where(x => (((TerminalSupportedContactKernelAidTransactionTypeCombination)x.Item1).AIDEnum == ((TerminalSupportedContactKernelAidTransactionTypeCombination)terminalCombinationForSelected).AIDEnum)).ToList(); if (filteredIndicators.Count == 0) { result.Item1.NextProcessState = EMVTerminalPreProcessingStateEnum.EndProcess; return(Tuple.Create(result.Item1, result.Item2, result.Item3, result.Item4, (EntryPointPreProcessingIndicators)null)); } EntryPointPreProcessingIndicators processingIndicatorsForSelected = filteredIndicators.Select(x => x.Item2).ToList().First(); return(Tuple.Create(result.Item1, result.Item2, result.Item3, result.Item4, processingIndicatorsForSelected)); }
protected override void DoEntryPointC(EMVTerminalPreProcessingStateEnum source) { Tuple <EMVTerminalProcessingOutcome, EMVSelectApplicationResponse, TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination, EntryPointPreProcessingIndicators> indicators = CombinationSelection_C(source); switch (indicators.Item1.NextProcessState) { case EMVTerminalPreProcessingStateEnum.EndProcess: OnProcessCompleted(indicators.Item1); break; case EMVTerminalPreProcessingStateEnum.KernelActivation_StartD: DoEntryPointD(indicators); break; default: throw new EMVProtocolException("unimplemeted TerminalPreProcessingStateEnum in DoEntryPointC"); } }
protected override void DoEntryPointB(EMVTerminalPreProcessingStateEnum parent) { Task.Run(() => { try { ProtocolActivation_B().ContinueWith((parentTask) => { try { if (cancellationTokenForPreProcessing.Token.IsCancellationRequested) { cancellationTokenForPreProcessing.Dispose(); return; } switch (parent) { case EMVTerminalPreProcessingStateEnum.Preprocessing_StartA: case EMVTerminalPreProcessingStateEnum.ProtocolActivation_StartB: DoEntryPointC(parent); break; default: throw new EMVProtocolException("unimplemeted TerminalPreProcessingStateEnum in DoEntryPointB"); } } catch (Exception ex) { OnExceptionOccured(ex); } }, TaskContinuationOptions.OnlyOnRanToCompletion); } catch (Exception ex) { OnExceptionOccured(ex); } }); }
protected abstract void DoEntryPointC(EMVTerminalPreProcessingStateEnum source);
protected abstract void DoEntryPointB(EMVTerminalPreProcessingStateEnum parent);