#include <stdio.h>
#include <winscard.h>

#include <stdlib.h>  
#include "commands.h"
testB(int argc,char** argv ) {
	int i;
myprintf("=======================\nPart B: Checking reader\n=======================\n");
myprintf("Test not ported completely \n");

	(rgReaderStates[0])->dwCurrentState = SCARD_STATE_UNAWARE;
	 rv =SCardGetStatusChange( hContext, INFINITE, rgReaderStates[0], 1 ); 
	 if( (rgReaderStates[0])->dwEventState & SCARD_STATE_PRESENT ) {
		myprintf("<<  Please remove smart card \n");
		(rgReaderStates[0])->dwCurrentState = SCARD_STATE_PRESENT;
	 	rv =SCardGetStatusChange( hContext, INFINITE, rgReaderStates[0], 1 ); 
	 }
	do {
		myprintf("<< Please insert IBM PC/SC test card\n");
		(rgReaderStates[0])->dwCurrentState = SCARD_STATE_EMPTY;
		rv =SCardGetStatusChange( hContext, INFINITE, rgReaderStates[0], 1 );
		rv = SCardConnect(hContext, readerName,
            SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0| SCARD_PROTOCOL_T1,
            &hCard, &dwPref);
     	if ( rv != SCARD_S_SUCCESS ) {
     		SCardReleaseContext( hContext );
    		return -1;
 	 	}                         
		readerlen=100;
		rv = SCardStatus(hCard,readerName,&readerlen,&readerstate,&protocol,r,&atrlen);
		if( checkATR(r,atrlen) != 3 )  { 
			myprintf("ATR Doesn't match \n");
			(rgReaderStates[0])->dwCurrentState = SCARD_STATE_PRESENT;
	        rv =SCardGetStatusChange( hContext, INFINITE, rgReaderStates[0], 1 );	
			continue;
		}
		else {
			cards[3].done=0;
			break;
		}
	} while(1);
	printit("2. Cold reset");
	rv = SCardReconnect(hCard,SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0| SCARD_PROTOCOL_T1,
          SCARD_RESET_CARD , &protocol);
	if( rv == SCARD_S_SUCCESS ) 
		myprintf("Passed\n");
	else {
    	SCardReleaseContext( hContext );
    	myprintf("Failed\n");
    	return -1;
	}                         
	readerlen=100;
	printit("Set protocol to T0 | T1");
	myprintf("Passed\n");
	printit("3.SCARD_ATTR_ATR_STRING");
	rv = SCardStatus(hCard,readerName,&readerlen,&readerstate,&protocol,r,&atrlen);
	if( rv != SCARD_S_SUCCESS  || atrlen == 0 ) {
		myprintf("Failed\n");
		return -1;
	 }
	myprintf("Passed\n");
	if(more_details ) {
		 myprintf("ATR :");
		 for(i=0;i<atrlen;i++) {
			myprintf("%0x ",r[i]);
		 }
		 myprintf("\n");
	 }
	printit("4.SCARD_ATTR_CURRENT_PROTOCOL_TYPE");
	if( protocol == 2 ) myprintf("Passed \n");
	else myprintf("Failed\n");
	myprintf("<<  Please remove smart card\n");
	(rgReaderStates[0])->dwCurrentState = SCARD_STATE_PRESENT;
	rv = SCardGetStatusChange(hContext,INFINITE,rgReaderStates[0],1);	
	myprintf("<<  Please insert smart card BACKWARDS\n");
	(rgReaderStates[0])->dwCurrentState = SCARD_STATE_EMPTY;
	rv = SCardGetStatusChange(hContext,INFINITE,rgReaderStates[0],1);	
	printit("5. IOCTL_SMARTCARD_GET_STATE");
	{
		readerlen=100;
		rv = SCardStatus(hCard,readerName,&readerlen,&readerstate,&protocol,r,&atrlen);
		if( rv == SCARD_S_SUCCESS && atrlen == 0 ) 
			myprintf("Passed\n");
		else
			myprintf("Failed\n");
	}
	printit("6. Cold Reset");
	rv = SCardReconnect(hCard, SCARD_SHARE_SHARED,SCARD_PROTOCOL_T0| SCARD_PROTOCOL_T1,
            SCARD_RESET_CARD, &protocol);
	if(( protocol == 0) || (rv != SCARD_S_SUCCESS) ) myprintf("Passed \n");
	else myprintf("Failed \n");
	return 0;
}


syntax highlighted by Code2HTML, v. 0.9.1