#pragma once

#include <map>
#include <string>
#include <winscard.h>
#include "cryptoki.h"
#include "P11Objects.h"

using namespace std;


/********************************************************************************************

********************************************************************************************/
class CObjList
{

	public:
		// Constructor
		CObjList(void);

		// Destructor
		~CObjList(void);

		// Método que actualiza la lista de objetos del equipo
		//void Update(void);

		// Método para insertar un nuevo objeto PKCS#11 en la lista de objetos
		void Insert( CPKCS11Object* pPKCS11Object );

		// Método para eliminar un objeto PKCS#11 de la lista de objetos
		void Destroy( CPKCS11Object * pPKCS11Object );

		// Método de búsqueda por template de un objeto
		void FindMatchingObjets( CK_ATTRIBUTE_PTR			pSearchTemplate,
								   CK_ULONG					ulCount,
								   CK_BBOOL					soloPublicos,
								   vector<CPKCS11Object *> &	objectsFound );

		// Método que obtiene el número de objetos según la última actualización de la lista
		//unsigned long GetNumberOfSlots(bool bSupportedTokenPresent);

		// Método que genera una lista de los IDs de objetos según la última actualización de la lista
		//void GetSlots(unsigned long * pulSlots, bool bTokenPresent);
		
		// Método que obtiene el lector con un determinado ID
		//CSlot GetSlot(unsigned long ulId);

		ulong GetNumberOfObjets( void );
		CPKCS11Object * GetObjectFromHandle( CK_OBJECT_HANDLE hObject );

		CPKCS11Object & at( ulong idx );
		
	private:

		// Lista de objetos detectados la última vez en el equipo, identificados por su ID
		vector<CPKCS11Object *>	m_objectList;

		map<CK_OBJECT_HANDLE, CPKCS11Object *> m_mapHandle2P11Object;

		// Próximo ID a asignar
//		unsigned long m_ulNextId;

		// Método que obtiene un nuevo ID de lector
//		unsigned long GetNewId();

};
