execute method
Implementation
@override
Tuple2<SCardResult, List<SCardReaderState>> execute(_PcscContext ctx) {
final nativeNames = states.map((s) => _NativeUtils.allocateString(s.szReader)).toList();
final nativeStates = calloc<SCARD_READERSTATE>(states.length);
try {
for (int i = 0; i < states.length; i++) {
nativeStates[i].szReader = nativeNames[i];
nativeStates[i].dwCurrentState = states[i].dwCurrentState;
nativeStates[i].dwEventState = 0;
nativeStates[i].cbAtr = MAX_ATR_SIZE;
// Copy existing ATR if any
for (int j = 0; j < states[i].rgbAtr.length && j < MAX_ATR_SIZE; j++) {
nativeStates[i].rgbAtr[j] = states[i].rgbAtr[j];
}
}
final ret = ctx.winscard.SCardGetStatusChange(hContext, dwTimeout, nativeStates, states.length);
final result = SCardResult(ret);
if (!result.isSuccess) return Tuple2(result, []);
final updated = <SCardReaderState>[];
for (int i = 0; i < states.length; i++) {
final atrLen = nativeStates[i].cbAtr;
final atr = <int>[];
for (int j = 0; j < atrLen && j < MAX_ATR_SIZE; j++) {
atr.add(nativeStates[i].rgbAtr[j]);
}
updated.add(SCardReaderState(
_NativeUtils.convertString(nativeStates[i].szReader),
nativeStates[i].dwCurrentState,
nativeStates[i].dwEventState,
atr
));
}
return Tuple2(result, updated);
} finally {
for (var ptr in nativeNames) calloc.free(ptr);
calloc.free(nativeStates);
}
}