CombinationSelection_FromB(CardQProcessor cardInterfaceManager, Tuple <EMVTerminalProcessingOutcome, EMVSelectApplicationResponse, TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> lastCandidateSelected, List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> > candidates, IUICallbackProvider uiProvider) { return(CombinationSelection_FromA(cardInterfaceManager, uiProvider)); }
public EMVTxCtl() { InitializeComponent(); QRMetaDataSourceSingleton.Instance.DataSource = new EMVQRMetaDataSource(); TLVMetaDataSourceSingleton.Instance.DataSource = new EMVTLVMetaDataSource(); uiProvider = new UICallbackProvider(ContactApp_DisplayAppsOnCard); totalAmount = new TotalAmountViewModel(); totalAmount.Total = ""; txtAmount.BindingContext = totalAmount; lblTotal.BindingContext = totalAmount; totalAmount.Total = "1000"; //if(!String.IsNullOrEmpty(totalAmount.Total)) //{ // CmdNextToPaymentApp_Clicked(null,null); //} //else //{ lblStatusAskAmount.Text = "Enter the amount below"; //} }
public EMVContactTerminalApplication(CardQProcessor cardQProcessor, IConfigurationProvider configProvider, IUICallbackProvider uiProvider) : base(cardQProcessor, configProvider) { this.uiProvider = uiProvider; }
CombinationSelection_FromA(CardQProcessor cardInterfaceManager, IUICallbackProvider uiProvider) { List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> > candidates = new List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> >(); #region 12.3.2 Book1 12.2.2 and 12.3.2 Step 1 EMVSelectPPSEResponse responsePPSE = SelectPSEApplication(cardInterfaceManager); //card blocked if (responsePPSE.SW1 == 0x6A && responsePPSE.SW2 == 0x81) { return(Tuple.Create( new EMVTerminalProcessingOutcome() { NextProcessState = EMVTerminalPreProcessingStateEnum.EndProcess, UIRequestOnOutcomePresent = true, UserInterfaceRequest = new UserInterfaceRequest() { MessageIdentifier = MessageIdentifiersEnum.InsertSwipeOrTryAnotherCard, Status = StatusEnum.ReadyToRead }, UIRequestOnRestartPresent = false, }, (EMVSelectApplicationResponse)null, (TerminalSupportedKernelAidTransactionTypeCombination)null, (CardKernelAidCombination)null, (List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> >)null)); } #endregion //cards supports selection by PSE if (responsePPSE.Succeeded && responsePPSE.GetSFI_88() != null) { #region 12.3.2 12.3.2 Book1 Step 2 TLVList records = ReadAllPSERecords(responsePPSE.GetSFI_88(), cardInterfaceManager); #endregion //do matching #region 12.3.2 Book1 12.3.2 Step 3 candidates = CreateCandidateListFromPSERecords(records); #endregion #region 12.3.2 Book1 Step 4 and 5 if (candidates.Count != 0) { return(ProcessCandidates(cardInterfaceManager, candidates, uiProvider)); } #endregion } candidates = CreateCandidateListByDirMethod(cardInterfaceManager); if (candidates.Count == 0) { return(Tuple.Create( new EMVTerminalProcessingOutcome() { NextProcessState = EMVTerminalPreProcessingStateEnum.EndProcess, UIRequestOnOutcomePresent = true, UserInterfaceRequest = new UserInterfaceRequest() { MessageIdentifier = MessageIdentifiersEnum.TryAnotherCard, Status = StatusEnum.ReadyToRead }, UIRequestOnRestartPresent = false, }, (EMVSelectApplicationResponse)null, (TerminalSupportedKernelAidTransactionTypeCombination)null, (CardKernelAidCombination)null, (List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> >)null)); } return(ProcessCandidates(cardInterfaceManager, candidates, uiProvider)); }
CandidatesPrioritizeAndPromptUser(List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> > candidateList, IUICallbackProvider uiProvider) { if (candidateList.Count == 1) { #region 12.3.2 Book1 12.4 Step 2 if ((candidateList.ElementAt(0).Item2.ApplicationPriorityIndicatorTag.Value[0] & 0x80) == 0x00) { return(Optional <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> > .Create(new Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination>(candidateList.ElementAt(0).Item1, candidateList.ElementAt(0).Item2))); } #endregion } #region 12.3.2 Book1 12.4 Step 4 List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> > filteredNoZero = candidateList.Where(x => { if (x.Item2.ApplicationPriorityIndicatorTag != null) { if ((x.Item2.ApplicationPriorityIndicatorTag.Value[0] & 0x0F) != 0x00) //0 = no priority { return(true); } else { return(false); } } else { return(false); } }).OrderBy(y => y.Item2.ApplicationPriorityIndicatorTag.Value[0] & 0x0F).ToList(); List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> > filteredZero = candidateList.Where(x => { if (x.Item2.ApplicationPriorityIndicatorTag == null) { return(true); } else if ((x.Item2.ApplicationPriorityIndicatorTag.Value[0] & 0x0F) == 0x00) { return(true); } else { return(false); } }).ToList(); List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> > result = new List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> >(); result.AddRange(filteredNoZero); result.AddRange(filteredZero); #endregion #region 12.3.2 Book1 12.4 Step 3 return(AskCardHolderToSelect(result, uiProvider)); #endregion }
private static Optional <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> > AskCardHolderToSelect(List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> > candidateList, IUICallbackProvider uiProvider) { List <String> candidatesStrings = candidateList.Select(x => Formatting.ByteArrayToASCIIString(x.Item2.ApplicationLabel.Value) + ":" + Formatting.ByteArrayToHexString(x.Item2.AdfNameTag.Value)).ToList(); String selected = uiProvider.DisplayApplicationList(candidatesStrings); if (!string.IsNullOrEmpty(selected)) { Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> selectedTuple = candidateList.Where(x => Formatting.ByteArrayToHexString(x.Item2.AdfNameTag.Value) == selected).First(); return(Optional <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> > .Create(selectedTuple)); } else { return(Optional <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> > .CreateEmpty()); } }
ProcessCandidates(CardQProcessor cardInterfaceManager, List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> > candidates, IUICallbackProvider uiProvider) { if (candidates.Count == 0) { return(Tuple.Create( new EMVTerminalProcessingOutcome() { NextProcessState = EMVTerminalPreProcessingStateEnum.EndProcess, UIRequestOnOutcomePresent = true, UserInterfaceRequest = new UserInterfaceRequest() { MessageIdentifier = MessageIdentifiersEnum.InsertSwipeOrTryAnotherCard, Status = StatusEnum.ReadyToRead }, UIRequestOnRestartPresent = false, }, (EMVSelectApplicationResponse)null, (TerminalSupportedKernelAidTransactionTypeCombination)null, (CardKernelAidCombination)null, (List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> >)null)); } BackToStep3: //prioritize if more than 1 candidate Optional <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> > candidate = CandidatesPrioritizeAndPromptUser(candidates, uiProvider); if (!candidate.IsPresent()) { return(Tuple.Create( new EMVTerminalProcessingOutcome() { NextProcessState = EMVTerminalPreProcessingStateEnum.EndProcess, UIRequestOnOutcomePresent = true, UserInterfaceRequest = new UserInterfaceRequest() { MessageIdentifier = MessageIdentifiersEnum.InsertSwipeOrTryAnotherCard, Status = StatusEnum.ReadyToRead }, UIRequestOnRestartPresent = false, }, (EMVSelectApplicationResponse)null, (TerminalSupportedKernelAidTransactionTypeCombination)null, (CardKernelAidCombination)null, (List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> >)null)); } //select the application Tuple <EMVTerminalProcessingOutcome, EMVSelectApplicationResponse, TerminalSupportedKernelAidTransactionTypeCombination> result = SelectAppChosen(cardInterfaceManager, candidate.Get().Item1, candidate.Get().Item2); if (result.Item1.NextProcessState == EMVTerminalPreProcessingStateEnum.CombinationSelection_StartC) { candidates.Remove(candidate.Get()); if (candidates.Count == 0) { return(Tuple.Create( new EMVTerminalProcessingOutcome() { NextProcessState = EMVTerminalPreProcessingStateEnum.EndProcess, UIRequestOnOutcomePresent = true, UserInterfaceRequest = new UserInterfaceRequest() { MessageIdentifier = MessageIdentifiersEnum.InsertSwipeOrTryAnotherCard, Status = StatusEnum.ReadyToRead }, UIRequestOnRestartPresent = false, }, (EMVSelectApplicationResponse)null, (TerminalSupportedKernelAidTransactionTypeCombination)null, (CardKernelAidCombination)null, (List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> >)null)); } else { goto BackToStep3; } } return(Tuple.Create(result.Item1, result.Item2, result.Item3, candidate.Get().Item2, candidates)); }
CombinationSelection_FromC(CardQProcessor cardInterfaceManager, List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> > candidates, IUICallbackProvider uiProvider) { return(ProcessCandidates(cardInterfaceManager, candidates, uiProvider)); }