示例#1
0
        private void StartMonitor()
        {
            monitoring = true;

            SCardReaderState[] state = new SCardReaderState[readernames.Length];

            for (int i = 0; i < readernames.Length; i++)
            {
                state[i]              = new SCardReaderState();
                state[i].ReaderName   = readernames[i];
                state[i].CurrentState = SCRState.Unaware; /* force SCardGetStatusChange to return
                                                           * immediately with the current reader state */
            }

            SCardError rc = context.GetStatusChange(IntPtr.Zero, state);

            if (rc == SCardError.Success)
            {
                // initialize event
                if (Initialized != null)
                {
                    for (int i = 0; i < state.Length; i++)
                    {
                        Initialized(this,
                                    new CardStatusEventArgs(readernames[i],
                                                            (state[i].EventState & (~(SCRState.Changed))),
                                                            state[i].ATR));
                        previousState[i]      = state[i].EventState & (~(SCRState.Changed)); // remove "Changed"
                        previousStateValue[i] = state[i].EventStateValue;
                    }
                }

                while (true)
                {
                    for (int i = 0; i < state.Length; i++)
                    {
                        state[i].CurrentStateValue = previousStateValue[i];
                    }

                    // block until status change occurs
                    rc = context.GetStatusChange(SCardReader.Infinite, state);

                    // Cancel?
                    if (rc != SCardError.Success)
                    {
                        break;
                    }

                    for (int i = 0; i < state.Length; i++)
                    {
                        SCRState newState = state[i].EventState;
                        newState &= (~(SCRState.Changed)); // remove "Changed"

                        byte[] Atr = state[i].ATR;

                        // Status change
                        if (StatusChanged != null &&
                            (previousState[i] != newState))
                        {
                            StatusChanged(this,
                                          new StatusChangeEventArgs(readernames[i],
                                                                    previousState[i],
                                                                    newState,
                                                                    Atr));
                        }

                        // Card inserted
                        if (((newState & SCRState.Present) == SCRState.Present) &&
                            ((previousState[i] & SCRState.Empty) == SCRState.Empty))
                        {
                            if (CardInserted != null)
                            {
                                CardInserted(this,
                                             new CardStatusEventArgs(readernames[i],
                                                                     newState,
                                                                     Atr));
                            }
                        }

                        // Card removed
                        if (((newState & SCRState.Empty) == SCRState.Empty) &&
                            ((previousState[i] & SCRState.Present) == SCRState.Present))
                        {
                            if (CardRemoved != null)
                            {
                                CardRemoved(this,
                                            new CardStatusEventArgs(readernames[i],
                                                                    newState,
                                                                    Atr));
                            }
                        }

                        previousState[i]      = newState;
                        previousStateValue[i] = state[i].EventStateValue;
                    }
                }
            }

            monitoring = false;

            if (rc != SCardError.Cancelled)
            {
                if (MonitorException != null)
                {
                    MonitorException(this, new PCSCException(rc,
                                                             "An error occured during SCardGetStatusChange(..)."));
                }
            }
        }