execute method

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

Implementation

@override
Tuple2<SCardResult, List<int>> execute(_PcscContext ctx) {
  final sendBuf = _NativeUtils.allocateBytes(pbSendBuffer);
  final recvBuf = calloc<BYTE>(MAX_BUFFER_SIZE);
  final bytesRet = calloc<DWORD>()..value = MAX_BUFFER_SIZE;

  ffi.Pointer<SCARD_IO_REQUEST> pci;
  if (pioSendPci == SCARD_PROTOCOL_T0) pci = ctx.scardT0Pci;
  else if (pioSendPci == SCARD_PROTOCOL_T1) pci = ctx.scardT1Pci;
  else pci = ctx.nullptr.cast();

  try {
    final ret = ctx.winscard.SCardTransmit(hCard, pci, sendBuf.cast<BYTE>(), pbSendBuffer.length, ctx.nullptr.cast(), recvBuf, bytesRet);
    final result = SCardResult(ret);
    if (!result.isSuccess) return Tuple2(result, []);
    return Tuple2(result, _NativeUtils.convertBytes(recvBuf.cast<ffi.Uint8>(), bytesRet.value));
  } finally {
    calloc.free(sendBuf);
    calloc.free(recvBuf);
    calloc.free(bytesRet);
  }
}