Esempio n. 1
0
        void CardRemove(CardPollingEventArg e)
        {
            if (OnCardFound == null)
            {
                return;
            }

            OnCardRemoved(this, e);
        }
Esempio n. 2
0
        void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            if (e.ProgressPercentage >= 0)
            {
                CardPollingEventArg arg = (CardPollingEventArg)e.UserState;
                //lock (threadpollStatusLock)
                threadPollCardStatus[arg.reader] = arg.status;
                switch (arg.status)
                {
                case CARD_STATUS.CARD_FOUND: CardFound(arg); break;

                case CARD_STATUS.CARD_NOT_FOUND: CardRemove(arg); break;
                }
            }
            else if (e.ProgressPercentage == -1)
            {
                CardPollingErrorEventArg arg = (CardPollingErrorEventArg)e.UserState;
                //lock (threadpollStatusLock)
                threadPollCardStatus[arg.reader] = CARD_STATUS.ERROR;
                CardError(arg);
            }
        }
Esempio n. 3
0
        void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                int    retCode;
                IntPtr hContext         = new IntPtr();
                CardPollingEventArg arg = new CardPollingEventArg();
                arg.reader = e.Argument.ToString();
                arg.status = CARD_STATUS.UNKNOWN;

                retCode = PcscProvider.SCardEstablishContext(PcscProvider.SCARD_SCOPE_USER, 0, 0, ref hContext);
                if (retCode != PcscProvider.SCARD_S_SUCCESS)
                {
                    throw new Exception("Unable to establish context", new Exception(PcscProvider.GetScardErrMsg(retCode)));
                }

                BackgroundWorker bwOwner = (BackgroundWorker)sender;


                while (!bwOwner.CancellationPending)
                {
                    PcscProvider.SCARD_READERSTATE state = new PcscProvider.SCARD_READERSTATE();
                    state.szReader = e.Argument.ToString();

                    retCode = PcscProvider.SCardGetStatusChange(hContext, 3000, ref state, 1);
                    if (retCode != 0)
                    {
                        if (arg.status != CARD_STATUS.ERROR)
                        {
                            arg.status = CARD_STATUS.ERROR;
                            CardPollingErrorEventArg errorArg = new CardPollingErrorEventArg();
                            errorArg.errorCode    = retCode;
                            errorArg.errorMessage = PcscProvider.GetScardErrMsg(retCode);
                            errorArg.reader       = e.Argument.ToString();
                            bwOwner.ReportProgress(-1, errorArg);
                        }
                    }
                    else
                    {
                        //state.dwCurrentState >>= 32;
                        if ((state.dwEventState & PcscProvider.SCARD_STATE_PRESENT) == PcscProvider.SCARD_STATE_PRESENT)
                        {
                            if (arg.status != CARD_STATUS.CARD_FOUND)
                            {
                                arg.status = CARD_STATUS.CARD_FOUND;
                                arg.atr    = state.rgbAtr.Take(state.cbAtr).ToArray();
                                bwOwner.ReportProgress(0, arg);
                            }
                        }
                        else
                        {
                            if (arg.status != CARD_STATUS.CARD_NOT_FOUND)
                            {
                                arg.status = CARD_STATUS.CARD_NOT_FOUND;
                                bwOwner.ReportProgress(0, arg);
                            }
                        }
                    }

                    System.Threading.Thread.Sleep(500);
                }

                PcscProvider.SCardReleaseContext(hContext);
            }
            catch (Exception ex)
            {
            }
        }