[Pcsclite-cvs-commit] PCSC/src winscard.c,1.37,1.38

rousseau@haydn.debian.org rousseau@haydn.debian.org


Update of /cvsroot/pcsclite/PCSC/src
In directory haydn:/tmp/cvs-serv32343

Modified Files:
	winscard.c 
Log Message:
SCardControl() (new API) can now be used with a IFDHandler v2.0 or v3.0.
The previous code was broken and only worked an IFDHandler v3.0 (crashed
with a v2.0).


Index: winscard.c
===================================================================
RCS file: /cvsroot/pcsclite/PCSC/src/winscard.c,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -d -r1.37 -r1.38
--- winscard.c	29 Jun 2004 08:31:40 -0000	1.37
+++ winscard.c	6 Jul 2004 06:52:04 -0000	1.38
@@ -1109,8 +1109,19 @@
 	if (cbSendLength > MAX_BUFFER_SIZE)
 		return SCARD_E_INSUFFICIENT_BUFFER;
 
-	return IFDControl(rContext, dwControlCode, pbSendBuffer, cbSendLength,
-			pbRecvBuffer, cbRecvLength, lpBytesReturned);
+	if (IFD_HVERSION_2_0 == rContext->dwVersion)
+	{
+		/* we must wrap a API 3.0 client in an API 2.0 driver */
+		*lpBytesReturned = cbRecvLength;
+		return IFDControl_v2(rContext, (PUCHAR)pbSendBuffer,
+			cbSendLength, pbRecvBuffer, lpBytesReturned);
+	}
+	else
+		if (IFD_HVERSION_3_0 == rContext->dwVersion)
+			return IFDControl(rContext, dwControlCode, pbSendBuffer,
+				cbSendLength, pbRecvBuffer, cbRecvLength, lpBytesReturned);
+		else
+			return SCARD_E_UNSUPPORTED_FEATURE;
 }
 
 LONG SCardGetAttrib(SCARDHANDLE hCard, DWORD dwAttrId,