#pragma once
#include "P15File.h"
#include "byteBuffer.h"

static const char RUTA_PUBLIC_DF []   = "6061";
static const char RUTA_PRIVATE_DF []  = "6081";

class CP15EFUS :
	public CP15File
{
public:
	CP15EFUS(void);
	~CP15EFUS(void);

	vector<byteBuffer *> m_pbListaEFUS;

	// Métodos para gestionar las entradas al vector de ficheros del EFUS
	void InsertFileEFUSlist( byteBuffer & entryEFUS );
	bool DeleteFileEFUSlist( CCommunicator  * comm,
							 int			  indexEFUS );

	bool AddFileEFUSlist( CCommunicator * comm,
						  byteBuffer	* filePath,
						  int			* fileIndex,
						  int			* fileLen );

	// Método de carga del fichero P15, sobrecargado para mantener los datos en memoria.
	void LoadP15File(CCommunicator & comm);

	// Método de escritura del fichero P15
	void WriteP15File(CCommunicator * comm);

	// Método para codificar una cadena de bytes y convertirla a formato ASN1
	int EncodeASN1( byteBuffer & efEntry, byteBuffer & efEncoded );

	// Método para pasar los certificados a P11
	int DecodeObject(byteBuffer & EFUSentry);

	// Busca un fichero en la lista del EFUS que cumpla las características indicadas
	//int FindValidFile( bool isPrivate, int iFileLen, byteBuffer &pbPath);
	int FindValidFile( CCommunicator  * comm, bool isPrivate, int iFileLen, byteBuffer & pbPath );

	// Método para obtener el siguiente identificador de fichero a utilizar.
	int GetNewID(CCommunicator * comm);
	
	bool esObjPrivado (byteBuffer EFUSentry);

	// Accedentes a los datos de cada entrada del EFUS
	byteBuffer *GetFilePath ( byteBuffer entradaEFUS );
	int GetFileLength (byteBuffer entradaEFUS);
	int GetFileIndex (byteBuffer entradaEFUS);

	int GetBinaryPath (byteBuffer entradaEFUS, byteBuffer & path);

	byteBuffer *GetAuthID ( byteBuffer entradaEFUS );
	
private:	
	// Indicará el tamaño de los datos escritos en el DF
	int m_maxDataLen;
};
