private OperationResult DisconnectCardMultiHandlesAware(Card cardForDisconnect)
{
var currentHandle = cardForDisconnect.ConnectionHandle;
// disconnect first (current) handle
var mainReturnCode = WinscardWrapper.SCardDisconnect(cardForDisconnect.ConnectionHandle, WinscardWrapper.SCARD_LEAVE_CARD);
var mainDisconnectResult = ReturnCodeManager.GetErrorMessage(mainReturnCode);
Logger.TraceEvent(TraceEventType.Verbose, 0, "First handler disconnect result: {0}", mainDisconnectResult.StatusDescription);
// disconnect the rest handles
if (mainDisconnectResult.IsSuccessful)
{
var restHandlers = _cardConnectionManager.GetConnections(cardForDisconnect.InternalUid);
Logger.TraceEvent(TraceEventType.Verbose, 0, "Card has {0} handlers", restHandlers.Length);
foreach (var handleToDisconnect in restHandlers.Where(x => x != currentHandle))
{
var returnCode = WinscardWrapper.SCardDisconnect(handleToDisconnect, WinscardWrapper.SCARD_LEAVE_CARD);
var result = ReturnCodeManager.GetErrorMessage(returnCode);
Logger.TraceEvent(TraceEventType.Verbose, 0, "Card handler disconnect result: {0}", result.StatusDescription);
}
_cardConnectionManager.CardDisconnected(cardForDisconnect.InternalUid);
}
cardForDisconnect.ConnectionHandle = IntPtr.Zero;
return mainDisconnectResult;
}