//-------------------------------------------------------------------
// This is abstract class for Reader Interface
// Specific interfaces should use it as a parent device
// Author: Sergey Ivanov
// Log:
//		11/09/99	-	implemented	
//-------------------------------------------------------------------
#ifndef __READER_INTERFACE__
#define __READER_INTERFACE__

#include "generic.h"
#include "kernel.h"
#include "rdrconfig.h"


#define READER_INTERFACE_GEMCORE	1
#define READER_INTERFACE_OROS		2
#define READER_INTERFACE_USB		3
#define READER_INTERFACE_GPR		4

#define READER_MODE_NATIVE			1
#define READER_MODE_ROS				2
#define READER_MODE_TLP				3

#define INTERFACE_OUTPUT_BUFFER_SIZE	0x1000
#define INTERFACE_INPUT_BUFFER_SIZE	    0x1000

#define VERSION_STRING_MAX_LENGTH   16
class CProtocol;
class CDebug;
class CMemory;
class CIoPacket;
#pragma PAGEDCODE
class CReaderInterface
{
public:
	NTSTATUS m_Status;
	SAFE_DESTRUCTORS();
	virtual VOID dispose(){self_delete();};
protected:
	// Internal buffers to manage Xfers...
    ULONG  OutputBufferLength;
    PUCHAR pOutputBuffer;
    ULONG  InputBufferLength;
    PUCHAR pInputBuffer;

	CDebug*	 debug;
	CProtocol* protocol;
	CMemory* memory;

	BOOL     Initialized;
	UCHAR    Version[VERSION_STRING_MAX_LENGTH];
	ULONG    Mode;
protected:
	CReaderInterface();
	virtual ~CReaderInterface();
public:	

	CReaderInterface(CProtocol* protocol);

	virtual  ReaderConfig	getConfiguration() 
	{ReaderConfig c;
		c.Type = 0;
		c.PresenceDetection = 0;
		c.Vpp = 0;
		c.Voltage = 0;
		c.PTSMode = 0;
		c.PTS0 = 0;
		c.PTS1 = 0;
		c.PTS2 = 0;
		c.PTS3 = 0;
		c.ActiveProtocol = 0;
		c.PowerTimeOut = 0;
		return c;
	};
	virtual  NTSTATUS  setConfiguration(ReaderConfig configuration) {return STATUS_SUCCESS;};
	virtual  NTSTATUS  setTransparentConfig(PSCARD_CARD_CAPABILITIES cardCapabilities, BYTE NewWtx) {return STATUS_SUCCESS;};
	virtual  NTSTATUS  getReaderVersion(PUCHAR pVersion, PULONG pLength) {return STATUS_SUCCESS;};
	virtual  ULONG     getReaderState()   {return 0;};
	virtual  NTSTATUS  setReaderMode(ULONG mode) {return STATUS_SUCCESS;};
	virtual  BOOL      isInitialized(){return Initialized;};
	virtual  NTSTATUS  initialize() {return STATUS_SUCCESS;};

		// Pure virtual functions will be implemented by specific interfaces (expl: CGemCore)...
	virtual  NTSTATUS  read(CIoPacket* Irp)  {return STATUS_SUCCESS;};
	virtual  NTSTATUS  write(CIoPacket* Irp) {return STATUS_SUCCESS;};
	virtual  NTSTATUS  readAndWait(PUCHAR pRequest,ULONG RequestLength,PUCHAR pReply,ULONG* pReplyLength) {return STATUS_SUCCESS;};
	virtual  NTSTATUS  writeAndWait(PUCHAR pRequest,ULONG RequestLength,PUCHAR pReply,ULONG* pReplyLength) {return STATUS_SUCCESS;};
    virtual  NTSTATUS  ioctl(ULONG ControlCode,PUCHAR pRequest,ULONG RequestLength,PUCHAR pReply,ULONG* pReplyLength) {return STATUS_SUCCESS;};
	virtual  NTSTATUS  SwitchSpeed(ULONG ControlCode,PUCHAR pRequest,ULONG RequestLength,PUCHAR pReply,ULONG* pReplyLength) {return STATUS_SUCCESS;};
	virtual  NTSTATUS  VendorAttribute(ULONG ControlCode,PUCHAR pRequest,ULONG RequestLength,PUCHAR pReply,ULONG* pReplyLength) {return STATUS_SUCCESS;};
    virtual  NTSTATUS  power(ULONG ControlCode,PUCHAR pReply,ULONG* pReplyLength, BOOLEAN Specific) {return STATUS_SUCCESS;};
	virtual  NTSTATUS  setProtocol(ULONG ProtocolRequested) {return STATUS_SUCCESS;};

	virtual  NTSTATUS translate_request(BYTE * pRequest,ULONG RequestLength,BYTE * pReply,ULONG* pReplyLength, PSCARD_CARD_CAPABILITIES cardCapabilities, BYTE NewWtx)  {return STATUS_SUCCESS;};
	virtual  NTSTATUS translate_response(BYTE * pRequest,ULONG RequestLength,BYTE * pReply,ULONG* pReplyLength) {return STATUS_SUCCESS;};

	virtual  VOID	   cancel() {};
};
#endif