execute method

  1. @override
Tuple2<SCardResult, List<SCardReaderState>> execute(
  1. _PcscContext ctx
)
override

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);
  }
}