1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
// Example of how to monitor card & card reader state changes.
use pcsc::*;
fn main() {
let ctx = Context::establish(Scope::User).expect("failed to establish context");
let mut readers_buf = [0; 2048];
let mut reader_states = vec![
// Listen for reader insertions/removals, if supported.
ReaderState::new(PNP_NOTIFICATION(), State::UNAWARE),
];
loop {
// Remove dead readers.
fn is_dead(rs: &ReaderState) -> bool {
rs.event_state().intersects(State::UNKNOWN | State::IGNORE)
}
for rs in &reader_states {
if is_dead(rs) {
println!("Removing {:?}", rs.name());
}
}
reader_states.retain(|rs| !is_dead(rs));
// Add new readers.
let names = ctx.list_readers(&mut readers_buf).expect("failed to list readers");
for name in names {
if !reader_states.iter().any(|rs| rs.name() == name) {
println!("Adding {:?}", name);
reader_states.push(ReaderState::new(name, State::UNAWARE));
}
}
// Update the view of the state to wait on.
for rs in &mut reader_states {
rs.sync_current_state();
}
// Wait until the state changes.
ctx.get_status_change(None, &mut reader_states)
.expect("failed to get status change");
// Print current state.
println!();
for rs in &reader_states {
if rs.name() != PNP_NOTIFICATION() {
println!("{:?} {:?} {:?}", rs.name(), rs.event_state(), rs.atr());
}
}
}
}
|