#include "StdAfx.h"
#include "control_usu_con.h"
#include "_error.h"
#include "b_file.h"
//*****************************************************************
Ccontrol_usu_con::Ccontrol_usu_con(void)
{
	na=nb=0;
}
//*****************************************************************
Ccontrol_usu_con::~Ccontrol_usu_con(void)
{
}
//*****************************************************************
int Ccontrol_usu_con::lee( char* path, C_error *er )
{
	return 0;
}
//*****************************************************************
BOOL Ccontrol_usu_con::guarda( char*path ,C_error *er )
{
	/*Head_usuario_conex_0 head;
	Cb_file file;
	if(!file.abre(path,2,TRUE))
	{
		return FALSE;
	}*/


	return 0;
}
//*****************************************************************
int Ccontrol_usu_con::add( Usuario_conx_0 *user )
{
	int ind;
	cerrojo.entro();
	//revisa si repe------------------------
	if (get(user->nombre))
	{
		cerrojo.salgo();
		return -1;
	}
	//lo pone en lista----------------------
	ind=pon(user);
	cerrojo.salgo();
	return ind;
}
//*****************************************************************
Usuario_conx_0* Ccontrol_usu_con::conecta( char*nombre, char* key,int*err )
{
	Usuario_conx_0 *u, *user=(Usuario_conx_0*)malloc(sizeof(Usuario_conx_0));
	*err=0;
	cerrojo.entro();
	u=get(nombre);
	if (!u)
	{
		*err=1;
		goto va_mal;
	}
	if (u->flags & FLAG_USUARIO_CONEXION_BLOQ)
	{
		*err=3;
		goto va_mal;
	}
	else if ((u->flags & FLAG_USUARIO_CONEXION_EN_USO) && (u->flags & FLAG_USUARIO_CONEXION_INDI))
	{
		*err=4;
		goto va_mal;
	}
	else if (strcmp(u->clave,key))
	{
		*err=2;
		goto va_mal;
	}
	u->flags=u->flags | FLAG_USUARIO_CONEXION_EN_USO;
	u->ncon++;
	na++;
	memcpy(user,u,sizeof(Usuario_conx_0));
	cerrojo .salgo();
	return user;
va_mal:
	cerrojo .salgo();
	free(user);
	return NULL;
}
//*****************************************************************
BOOL Ccontrol_usu_con::desconecta( Usuario_conx_0 *user )
{
	Usuario_conx_0 *u;
	int af,an;
	cerrojo.entro();
	if (user->id>=us.n)
	{
		cerrojo.salgo();
		return FALSE;
	}
	u=&us[user->id];
	af=u->flags;
	an=u->ncon-1;
	*u=*user;
	u->ncon=an;
	if (an)
		u->flags=af;
	else
		u->flags=af & ~FLAG_USUARIO_CONEXION_EN_USO;
	na--;
	cerrojo.salgo();
	free(user);
	return TRUE;
}
//*****************************************************************
BOOL Ccontrol_usu_con::borra( Usuario_conx_0 *user )
{
	cerrojo.entro();
	if (user->id>=us.n)
	{
		cerrojo.salgo();
		return FALSE;
	}
	us[user->id].flags=us[user->id].flags & FLAG_USUARIO_CONEXION_VACIO;
	nb++;
	cerrojo.salgo();
	return TRUE;
}
//*****************************************************************
int Ccontrol_usu_con::esta( char *nombre )
{
	return 0;
}
//*****************************************************************
BYTE* Ccontrol_usu_con::get_copy( int*nu,int modo/*=0 */ )
{
	return NULL;
}
//*****************************************************************
void Ccontrol_usu_con::verifica()
{

}
//*****************************************************************
int Ccontrol_usu_con::pon(Usuario_conx_0 *u)
{
	if (nb && us.n)
	{
		//hay vacios
		for (int i=0; i<us.n; i++)
		{
			if (us[i].flags & FLAG_USUARIO_CONEXION_VACIO)
			{
				nb--;
				memcpy(&us[i],u,sizeof(Usuario_conx_0));
				us[i].id=i;
				return i;
			}
		}
	}
	us+*u;
	us[us.n-1].id=us.n-1;
	return us.n-1;
}
//********************************************************************
Usuario_conx_0* Ccontrol_usu_con::get( char* nombre )
{
	if (us.n<=0)
		return NULL;
	for (int i=0; i<us.n; i++)
	{
		if (us[i].flags & FLAG_USUARIO_CONEXION_VACIO)
			continue;
		if (strcmp(nombre, us[i].nombre)==0)
			return &us[i];
	}
	return NULL;
}
//*****************************************************************