コード例 #1
0
        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));
        }
コード例 #2
0
        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");
            }
        }
コード例 #3
0
        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);
                }
            });
        }
コード例 #4
0
 protected abstract void DoEntryPointC(EMVTerminalPreProcessingStateEnum source);
コード例 #5
0
 protected abstract void DoEntryPointB(EMVTerminalPreProcessingStateEnum parent);