void CardRemove(CardPollingEventArg e) { if (OnCardFound == null) { return; } OnCardRemoved(this, e); }
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); } }
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) { } }