#pragma once

#include <vector>
#include "cryptoki.h"
#include "P11Objects.h"
#include "ObjList.h"

class CSlot;
class CCommunicator;

using namespace std;

class CP15File
{
public:
	CP15File(CSlot & slot);
	CP15File(void);
	~CP15File(void);

	// Método para asignar el tipo de ASN1 del DF
	void SetASN1Type(int iASN1Type);

	// Método para asignar el tipo de codificación del Path (BIN/ASCII)
	void SetPathEncodingType(int iPathEncodingType);
	
	// Método para devolver el tipo de ASN1 del DF
	int GetASN1Type(void);

	// Método para devolver el tipo de codificación del Path (BIN/ASCII)
	int GetPathEncodingType(void);

	// Método que devuelve el identificador de fichero
	ushort GetFileId() const;

	// Método para liberar los objetos y el vector que los contiene
	void FreeObjects(void);

	// Método para incluir los objetos PKCS11 en la lista de objetos
	void AddObjects2List(CObjList & objList);

	// Método para eliminar los objetos PKCS11 de la lista de objetos
	void DeleteObjectFromList(CPKCS11Object *pObject);

	// Indicará si el fichero P15 ha sido cargado.
	bool m_loaded;

	// Identificador de fichero
	ushort m_ushFileId;

	// Método para decodificar los objetos. 
	// Además, excepto para el caso del TokenInfo, los deja almacenados en una estructura P11
	virtual int DecodeObject(byteBuffer & cdfEntry) = 0;

	// Método para realizar la codificación ASN1 de objetos PKCS#11
	virtual int EncodeASN1( CPKCS11Object *pObj11, byteBuffer & efEncoded );

	// Método para leer el contenido del DF
	virtual void LoadP15File(CCommunicator & comm);

	// Método para leer el contenido del DF
	virtual void WriteP15File(CCommunicator * comm);

	// Vector con los objetos PKCS#11 leídos del fichero P15
	vector<CPKCS11Object *> m_P11Objects;

private:
	
	// Indicará el tamaño de los datos escritos en el DF
	int m_maxDataLen;
	
	// Indicará si el fichero P15 está codificado en ASN1 ISO o CERES
	int m_asn1Type;

	// Indicará si el Path está codificado en binario o en ASCII
	int m_pathEncodingType;

protected:

};
