/********************************************************************************
*********************************************************************************
*Projeto:	server
*Arquivo:	server.c
*Descrição:	Programa que faz a interface entre o usuário e o TCgertec
*Data da Criação:	01/06/2006

*Revisão:	1.0
*Data:		01/06/2006
*Modificações:

**********************************************************************************
**********************************************************************************

Funções e procedimentos utilizados no arquivo

unsigned short ConvertCor(char *cor)
void *Receive_MSG(void *arg)
void Send_MSG()
void TiraTerminacao(char *str)
void TerminalError()
void TerminalNExiste()
void Text()
void Image()
void getConfig()
void setLEC()
void setKey()
void setTime()
void Restart()
void Clear()
void Startloop()
void Stoploop()
void Sendfile()
void ReloadAdv()
void DeleteAdv()
void ReloadPre()
void DeletePre()
void SendConf()
void SendUPD()
void SendParam()
void sendsetup()
void ChangeLanguage()
void Process(char *comando)
int main()

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

/*-------------------------------------------------------------------------------
			INCLUDES
-------------------------------------------------------------------------------*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <sys/msg.h>

#include "libTCgertec.h" //Header da biblioteca libTCgertec
#include "msq.h" // Header com informações para o Message Queue
#include "language.h" // Header par o tratamento dos idiomas

/*-------------------------------------------------------------------------------
			VARIÁVEIS GLOBAIS
-------------------------------------------------------------------------------*/

TabConec tabela; //Recebe a lista de terminais conectados

TEXT textos; // Estrutura para tratar os textos
int names = 0;

int msgkey; //Key para o Message Queue
MSG_DATA toserver; //Mensagem para enviar para o servidor
MSG_DATA toclient; //Mensagem para receber do servidor

ARG_SETUP_TCP setup;
UPDConfig upd;
PARAMConfig param;
Config conf;

int posicoes[MAX_TC];
char line[0xff];

/********************************************************************************
>>>> ConvertCor(char *cor) <<<<
---------------------------------------------------------------------------------
*Função:	unsigned short ConvertCor(char *cor)
*Descrição:	Converte a cor (string com o nome) para o código em hexadecimal

*Entrada:	String com o nome da cor
*Saída:		Retorna o código Hexadecimal da cor

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

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

unsigned short ConvertCor(char *cor)
{
	if (!strncmp(cor,"black",5)) return 0x100;
	else if (!strncmp(cor,"brown",5)) return 0x101;
	else if (!strncmp(cor,"green",5)) return 0x102;
	else if (!strncmp(cor,"olive",5)) return 0x103;
	else if (!strncmp(cor,"navy",4)) return 0x104;
	else if (!strncmp(cor,"purple",6)) return 0x105;
	else if (!strncmp(cor,"teal",4)) return 0x106;
	else if (!strncmp(cor,"gray",4)) return 0x107;
	else if (!strncmp(cor,"silver",6)) return 0x108;
	else if (!strncmp(cor,"red",3)) return 0x109;
	else if (!strncmp(cor,"lime",4)) return 0x10A;
	else if (!strncmp(cor,"yellow",6)) return 0x10B;
	else if (!strncmp(cor,"blue",4)) return 0x10C;
	else if (!strncmp(cor,"fuchsia",7)) return 0x10D;
	else if (!strncmp(cor,"aqua",4)) return 0x10E;
	else if (!strncmp(cor,"white",5)) return 0x10F;
	else return 0x100;
}

/********************************************************************************
>>>> char *TerminalName(char *name) <<<<
---------------------------------------------------------------------------------
*Função:	char *TerminalName(char *name)
*Descrição:	Retorna o tipo de terminal

*Entrada:	String com o tipo retornado da lib
*Saída:		Retorna o nome comercial do terminal

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

********************************************************************************/
char *TerminalName(char *name)
{
	if ( !strncmp(name,"tc501",5) || !strncmp(name,"TC501",5) )
		return "TC501";
	else if ( !strncmp(name,"tc502",5) || !strncmp(name,"TC502",5) )
	{
		if (!strncmp(&name[6],"1",1))
			return "TC502";
		else if (!strncmp(&name[6],"2.0",3))
			return "TC502 (TC505)";
		else if (!strncmp(&name[6],"2.1",3))
			return "Busca Preço";
		else
			return name;
	}
	else if ( !strncmp(name,"tc505",5) || !strncmp(name,"TC505",5) )
	{
		if (!strncmp(&name[6],"1",1))
			return "TC505";
		else
			return name;
	}
	else
		return name;
}

/********************************************************************************
>>>> char *SetTerminalName(char *IP) <<<<
---------------------------------------------------------------------------------
*Função:	char *SetTerminalName(char *IP)
*Descrição:	Procura o apelido do terminal na tabela names.txt

*Entrada:	String com o IP do terminal retornado pela lib
*Saída:		Retorna o apelido do terminal

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

********************************************************************************/
char *SetTerminalName(char *IP)
{
	FILE *fp;
	char aux[0xff];
	char *p;
	int ci;
	
	int achou = 0;
	
	if (names == 1)
	{
		fp = fopen("./tables/names.txt","rt");
		
		if (fp == NULL)
			return IP;
		
		do
		{
			for (ci=0 ; ci<0xff ; ci++)
			{
				if (fread(&line[ci],1,1,fp)==0)
					break;
				if (line[ci]=='\n')
					break;
			}
			
			line[ci] = 0;
			
			if ( !strncmp(line,IP,13) )
			{
				achou = 1;
				strcpy(aux,&line[13]);
				close(fp);
			}
		}while( achou==0 && !feof(fp) );
		
		if (achou == 1)
		{
			bzero(line,sizeof(line));
			p = strchr(&aux[1],'|');
			p--;
			strncpy(line,&aux[1],p-aux);
			return line;
		}
		close(fp);
		return IP;
	}
	else
		return IP;
}

/********************************************************************************
>>>> void *Receive_MSG(void *arg) <<<<
---------------------------------------------------------------------------------
*Função:	void *Receive_MSG(void *arg)
*Descrição:	Thread que trata todas as mensagens vindas do TCgertec

*Entrada:	nenhuma
*Saída:		nenhuma

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

********************************************************************************/
void *Receive_MSG(void *arg)
{
	int i;
	while (1)
	{
		if ( msgrcv(msgkey,&toclient,MSG_LENGHT,2,IPC_NOWAIT) != -1 ) //recebe a mensagem do TCgertec
		{
			switch (toclient.CMD) //verifica o comando
			{
				case TAB_CONEC: //mostra a tabela de terminais conectados
					memmove((char*)&tabela,toclient.data,sizeof(tabela));
					printf("\n%s %d\n",textos.Nterm,tabela.NumTerm);
					printf("==========%s==========\n",textos.Tab);
					printf("POS\tIP\n");
					for (i=0 ; i<tabela.NumTerm ; i++)
						printf("%d\t%s\t( %s )\n" ,i,SetTerminalName(Inet_ntoa(tabela.IP[i])),TerminalName(&tabela.name[i][0]));
					break;
				case GET_CONFIG: //mostra a configuração do terminal solicitado
					switch (tabela.type[toclient.ID]) //seleciona o tipo de configuração a ser mostrada
					{
						case 0:
							memmove((char*)&conf,toclient.data,sizeof(Config));
							memmove((char*)&upd,&toclient.data[sizeof(Config)],sizeof(UPDConfig));
							memmove((char*)&param,
								&toclient.data[sizeof(Config)+sizeof(UPDConfig)],sizeof(PARAMConfig));
							
							printf("\n=============UPD Config=============\n");
							printf("%s %s\n%s %s\n%s %s\n%s %s\n%s %s\n%s %s\n\n", textos.Gateway,upd.gateway,textos.ServName,upd.nameserv,textos.TCname,upd.TCname,textos.UPDServ,upd.UpdServ,textos.User,upd.Updser,textos.Pass,upd.UpdPass);
							printf("=============PARAM Config=============\n");
							printf("%s %c\n%s %c\n\n",textos.Dinamico,param.IPdinamico,textos.BuscaServ,param.BuscaServer);
							printf("=============Config=============\n");
								printf("%s %s\n%s %s\n%s %s\n%s %s\n%s %s\n%s %s\n%s %s\n%s %d\n\n",textos.Serv,conf.host,textos.Addr,conf.address,textos.NetM,conf.netMask,textos.LN1,conf.line1,textos.LN2,conf.line2,textos.LN3,conf.line3,textos.LN4,conf.line4,textos.Tempo,conf.time);
							break;
						case 1:
							memmove((char*)&setup,toclient.data,sizeof(ARG_SETUP_TCP));
							printf("\n=============Setup=============\n");
							printf("%s %s\n",textos.Addr,Inet_ntoa(setup.dwMY_IP_ADD));
							printf("%s %s\n",textos.Serv,Inet_ntoa(setup.dwServer_IP));
							printf("%s %s\n",textos.NetM,Inet_ntoa(setup.dwNetMask));
							printf("%s %s\n",textos.Gateway,Inet_ntoa(setup.dwGateway));
							printf("%s %s\n",textos.ServName,Inet_ntoa(setup.dwNameServer));
							printf("%s %s\n",textos.TCname,setup.TCName);
							printf("%s %d\n",textos.Port,setup.wPortsv);
							printf("%s %s\n",textos.SFTP,setup.FTPs);
							printf("%s %s\n",textos.UFTP,setup.FTPu);
							printf("%s %s\n",textos.PFTP,setup.FTPp);
							printf("%s %d\n",textos.Dinamico,setup.dwDHCP);
							printf("%s %d\n\n",textos.BuscaServ,setup.dwSearchServer);
							break;
					}
			}
		}
	}
}

/********************************************************************************
>>>> void Send_MSG() <<<<
---------------------------------------------------------------------------------
*Função:	void Send_MSG()
*Descrição:	Envia a mensagem para o TCgertec

*Entrada:	nenhuma
*Saída:		nenhuma

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

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

void Send_MSG()
{
	msgsnd(msgkey,&(toserver.type),MSG_LENGHT,0);
}

/********************************************************************************
>>>> void TiraTerminacao(char *str) <<<<
---------------------------------------------------------------------------------
*Função:	void TiraTerminacao(char *str)
*Descrição:	Tira a terminação "\n" da string

*Entrada:	string que será retirada a terminação
*Saída:		string sem a terminação \n

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

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

void TiraTerminacao(char *str)
{
	str[strlen(str)-1] = '\0';
}

/********************************************************************************
>>>> void TerminalError() <<<<
---------------------------------------------------------------------------------
*Função:	void TerminalError()
*Descrição:	imprime na tela a mensagem de terminal não compatível com a função

*Entrada:	nenhuma
*Saída:		nenhuma

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

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

void TerminalError()
{
	printf("\t%s\n",textos.TermNComp);
}

/********************************************************************************
>>>> void TerminalNExiste() <<<<
---------------------------------------------------------------------------------
*Função:	void TerminalNExiste()
*Descrição:	Imprime na tela a mensagem de terminal não existe

*Entrada:	nenhuma
*Saída:		nenhuma

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

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

void TerminalNExiste()
{
	printf("\t%s\n",textos.TermNExiste);
}

void Posicoes(char *comando)
{
	int i;
	char *p;
	char aux[0xff];
	char temp[0xff];
	
	if (comando[1] == 'a' || comando[1] == 'A')
	{
		posicoes[0] = tabela.NumTerm;
		for(i=0 ; i<tabela.NumTerm ; i++)
		{
			posicoes[i+1] = i;
		}
	}
	else
	{
		i = 0;
		strcpy(temp,&comando[1]);
		while ( (p=strchr(temp,';')) != NULL)
		{
			bzero(aux,sizeof(aux));
			strncpy(aux,temp,p-temp);
			strcpy(temp,p+1);
			posicoes[i+1] = atoi(aux);
			i++;
		}
		posicoes[0]=i;
	}
}

int Protocolos()
{
	int prot = 0;
	int j = 0;
	int i = 1;
	int aux;
	int tc501 = 0,tc504 = 0;
	
	while ( (j<posicoes[0]) && (prot != 3) )
	{
		aux = tabela.type[posicoes[i]];
		
		if( (aux == 0) && (tc501 == 0) )
		{
			tc501 = 1;
			prot = prot + 1;
		}
		if( (aux == 1) && (tc504 == 0) )
		{
			tc504 = 1;
			prot = prot + 2;
		}
		i++;
		j++;
	}
	return prot;
}

void CreateText(Texto *texto,ARG_DISPLAY_TEXT *texto_504,int cont)
{
	char lixo[5];
	char cor[11];
	
	bzero(cor,sizeof(cor));
		
	if(cont == 1 || cont == 3)
	{
		printf("\n===== GERTEC 501 =====\n");
		//captura as informações
		printf("%s ",textos.L1); fgets(texto->linha1,25,stdin);
		printf("%s ",textos.L2); fgets(texto->linha2,25,stdin);
		printf("%s ",textos.Tempo); scanf("%d",&texto->tempo);
		fgets(lixo,4,stdin);
	
		TiraTerminacao(texto->linha1);
		TiraTerminacao(texto->linha2);
	}
	if(cont == 2 || cont == 3)
	{
		printf("\n===== GERTEC 504 =====\n");
		printf("%s ",textos.X);scanf("%d",&texto_504->wPosX);
		printf("%s ",textos.Y);scanf("%d",&texto_504->wPosY);
		texto_504->wSize=4;
		
		fgets(lixo,4,stdin);
		
		printf("%s ",textos.Color);fgets(cor,10,stdin);
		TiraTerminacao(cor);
		texto_504->wColor = ConvertCor(cor);
		bzero(cor,sizeof(cor));
		
		printf("%s ",textos.Background);fgets(cor,10,stdin);
		TiraTerminacao(cor);
		texto_504->wBGColor = ConvertCor(cor);
		
		printf("%s ",textos.Texto);fgets(texto_504->sText,127,stdin);
		strcpy(texto_504->sFont,"c:\\fonts\\LUCIDA12.BMP");
	}
}

/********************************************************************************
>>>> void Text() <<<<
---------------------------------------------------------------------------------
*Função:	void Text()
*Descrição:	Pede informações para o usuário e envia a mensagem para o TCgertec com o texto para enviar para o terminal

*Entrada:	nenhuma
*Saída:		nenhuma

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

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

void Text(char *comando)
{
	int aux;
	
	Texto texto;
	ARG_DISPLAY_TEXT texto_504;

	char lixo[5];
	
	if ( comando[0] != ':' )
	{
		toserver.CMD = SEND_TEXT;
		printf("POS: ");scanf("%d",&toserver.ID);
		fgets(lixo,4,stdin);
		
		if (tabela.type[toserver.ID] == 1)
			aux = 2;
		else if (tabela.type[toserver.ID] == 0)
			aux = 1;
		CreateText(&texto,&texto_504,aux);
		
		switch (tabela.type[toserver.ID])
		{
			case 0:
				memmove(&toserver.data,(char*)&texto,sizeof(texto)); //monta a mensagem para o TCgertec
				Send_MSG(); //envia a mensagem para o TCgertec
				break;
			case 1:
				memmove(&toserver.data,(char*)&texto_504,sizeof(texto_504));
				Send_MSG();
				break;
			default:
				printf("( %d )",posicoes[aux]);
				TerminalNExiste();
		}
	}
	
	else
	{
		Posicoes(comando);
		aux = Protocolos();
		CreateText(&texto,&texto_504,aux);
		
		toserver.CMD = SEND_TEXT;
		
		for (aux=1 ; aux<=posicoes[0] ; aux++ )
		{
			toserver.ID = posicoes[aux];
			
			switch (tabela.type[toserver.ID])
			{
				case 0:
					memmove(&toserver.data,(char*)&texto,sizeof(texto)); //monta a mensagem para o TCgertec
					Send_MSG(); //envia a mensagem para o TCgertec
					break;
				case 1:
					memmove(&toserver.data,(char*)&texto_504,sizeof(texto_504));
					Send_MSG();
					break;
				default:
					printf("( %d )",posicoes[aux]);
					TerminalNExiste();
			}
		}
	}
}

void CreateImage(Imagem *image_505,Imagem *image_504,int cont, int *erro)
{
	char lixo[5];
	char img[21];
	FILE* imagem;
	*erro = 0;
	
	bzero(img,sizeof(img));
		
	if(cont == 1 || cont == 3)
	{
		printf("\n===== GERTEC 501 =====\n");
		printf("%s ",textos.Narq);fgets(img,19,stdin);
		TiraTerminacao(img);
		sprintf(image_505->filename,".//images//%s",img);
		
		if ( (imagem = fopen(image_505->filename,"r")) == NULL) //verifica se o arquivo de imagem existe
		{
			printf("%s\n",textos.ArqNExiste);
			*erro = 1;
		}
		else
		{
			fclose(imagem);
			printf("%s ",textos.Tempo); scanf("%d",&(image_505->tempo));
			fgets(lixo,5,stdin);
		}
	}
	if(cont == 2 || cont == 3)
	{
		printf("\n===== GERTEC 504 =====\n");
		printf("%s ",textos.Narq);fgets(img,19,stdin);
		TiraTerminacao(img);
		sprintf(image_504->filename,".//images//%s",img);
		
		if ( (imagem = fopen(image_504->filename,"r")) == NULL) //verifica se o arquivo de imagem existe
		{
			printf("%s\n",textos.ArqNExiste);
			*erro = 1;
		}
		else
		{
			fclose(imagem);
		}
	}
}

/********************************************************************************
>>>> void Image() <<<<
---------------------------------------------------------------------------------
*Função:	void Image()
*Descrição:	Pede infomações para o usuário e envia a mensagem para o TCgertec enviar uma imagem para o terminal

*Entrada:	nenhuma
*Saída:		nenhuma

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

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

void Image(char *comando)
{
	Imagem image_505,image_504;
	int erro;
	int aux;
	char lixo[5];
	
	bzero(&image_505,sizeof(Imagem));
	bzero(&image_504,sizeof(Imagem));
	
	toserver.CMD = SEND_IMAGE;
	
	if (comando[0] != ':')
	{
		printf("POS: ");scanf("%d",&(toserver.ID));fgets(lixo,5,stdin);
		
		if (tabela.type[toserver.ID] == 1)
			aux = 2;
		else if (tabela.type[toserver.ID] == 0)
			aux = 1;
		CreateImage(&image_505,&image_504,aux,&erro);
		if (erro == 0)
		{
			switch (tabela.type[toserver.ID])
			{
				case 0:
					memmove(&toserver.data,(char*)&image_505,sizeof(Imagem));
					Send_MSG();
					break;
				case 1:
					memmove(&toserver.data,(char*)&image_504,sizeof(Imagem));
					Send_MSG();
					break;
				default:
					printf("( %d )",posicoes[aux]);
					TerminalNExiste();
					break;
			}
		}
	}
	else
	{
		Posicoes(comando);
		aux = Protocolos();
		
		CreateImage(&image_504,&image_505,aux,&erro);
		
		if (erro == 0)
		{
			for (aux=1 ; aux<=posicoes[0] ; aux++ )
			{
				toserver.ID = posicoes[aux];
				switch (tabela.type[toserver.ID]) //seleciona o terminal para enviar a imagem
				{
					case 0:
						memmove(&toserver.data,(char*)&image_504,sizeof(Imagem));
						Send_MSG();
						break;
					case 1:
						memmove(&toserver.data,(char*)&image_504,sizeof(Imagem));
						Send_MSG();
						break;
					default:
						printf("( %d )",posicoes[aux]);
						TerminalNExiste();
						break;
				}
			}
		}
	}
}

/********************************************************************************
>>>> void getConfig() <<<<
---------------------------------------------------------------------------------
*Função:	void getConfig()
*Descrição:	envia para o TCgertec a solicitação de configuração de um terminal

*Entrada:	nenhuma
*Saída:		nenhuma

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

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

void getConfig()
{
	int ID;
	char lixo[5];

	toserver.CMD = GET_CONFIG;
	printf("POS: "); scanf("%d",&toserver.ID);
	
	switch (tabela.type[toserver.ID])
	{
		case 0:
		case 1:
			Send_MSG();
			break;
		default:
			TerminalNExiste();
	}
	fgets(lixo,5,stdin);
}

/********************************************************************************
>>>> void setLEC() <<<<
---------------------------------------------------------------------------------
*Função:	void setLEC()
*Descrição:	Envia pra o TCgertec a solicitação para habilitar ou desabilitar o leitor de cartão (TC504)

*Entrada:	nenhuma
*Saída:		nenhuma

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

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

void setLEC(char *comando)
{
	int arg;
	char lixo[5];
	int aux;
	
	toserver.CMD = S_LEC;

	if(comando[0] != ':')
	{
		printf("POS: ");scanf("%d",&posicoes[1]);
		printf("1 = %s, 0 = %s: ",textos.Hab,textos.Des);scanf("%d",&arg);
		posicoes[0] = 1;
	}
	else
	{
		printf("1 = %s, 0 = %s: ",textos.Hab,textos.Des);scanf("%d",&arg);
		Posicoes(comando);
	}
	
	memmove(toserver.data,(char*)&arg,sizeof(int));
	
	for ( aux=1 ; aux<=posicoes[0] ; aux++ )
		{
			toserver.ID = posicoes[aux];
			switch (tabela.type[toserver.ID]) //seleciona o terminal para enviar a imagem
			{
				case 0:
					printf("( %d )",posicoes[aux]);
					TerminalError();
					break;
				case 1:
					Send_MSG();
					break;
				default:
					printf("( %d )",posicoes[aux]);
					TerminalNExiste();
					break;
			}
		}
	fgets(lixo,5,stdin);
}

/********************************************************************************
>>>> void setKey() <<<<
---------------------------------------------------------------------------------
*Função:	void setKey()
*Descrição:	Envia para o TCgertec o pedido para habilitr ou desabilitar o teclado (TC504)

*Entrada:	nenhuma
*Saída:		nenhuma

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

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

void setKey(char *comando)
{
	int arg;
	char lixo[5];
	int aux;
	
	toserver.CMD = S_KEY;

	if(comando[0] != ':')
	{
		printf("POS: ");scanf("%d",&posicoes[1]);
		printf("1 = %s, 0 = %s: ",textos.Hab,textos.Des);scanf("%d",&arg);
		posicoes[0] = 1;
	}
	else
	{
		printf("1 = %s, 0 = %s: ",textos.Hab,textos.Des);scanf("%d",&arg);
		Posicoes(comando);
	}
	
	memmove(toserver.data,(char*)&arg,sizeof(int));
	
	for ( aux=1 ; aux<=posicoes[0] ; aux++ )
		{
			toserver.ID = posicoes[aux];
			switch (tabela.type[toserver.ID]) //seleciona o terminal para enviar a imagem
			{
				case 0:
					printf("( %d )",posicoes[aux]);
					TerminalError();
					break;
				case 1:
					Send_MSG();
					break;
				default:
					printf("( %d )",posicoes[aux]);
					TerminalNExiste();
					break;
			}
		}
	fgets(lixo,5,stdin);
}

/********************************************************************************
>>>> void setTime() <<<<
---------------------------------------------------------------------------------
*Função:	void setTime()
*Descrição:	Solicita para o TCgertec a troca do tempo de exibição de telas (TC504)

*Entrada:	nenhuma
*Saída:		nenhuma

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

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

void setTime(char *comando)
{
	int time;
	char lixo[5];
	int aux;
	
	toserver.CMD = S_TIME;

	if(comando[0] != ':')
	{
		printf("POS: ");scanf("%d",&posicoes[1]);
		printf("%s: ",textos.Tempo);scanf("%d",&time);
		posicoes[0] = 1;
	}
	else
	{
		printf("%s: ",textos.Tempo);scanf("%d",&time);
		Posicoes(comando);
	}
	
	memmove(toserver.data,(char*)&time,sizeof(int));
	
	for ( aux=1 ; aux<=posicoes[0] ; aux++ )
		{
			toserver.ID = posicoes[aux];
			switch (tabela.type[toserver.ID]) //seleciona o terminal para enviar a imagem
			{
				case 0:
					printf("( %d )",posicoes[aux]);
					TerminalError();
					break;
				case 1:
					Send_MSG();
					break;
				default:
					printf("( %d )",posicoes[aux]);
					TerminalNExiste();
					break;
			}
		}
	fgets(lixo,5,stdin);
}

/********************************************************************************
>>>> void Restart() <<<<
---------------------------------------------------------------------------------
*Função:	void Restart()
*Descrição:	Solicita para o TCgertec resetar um terminal

*Entrada:	nenhuma
*Saída:		nenhuma

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

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

void Restart(char *comando)
{
	char lixo[5];
	int aux;
	toserver.CMD = RESTART;
	if(comando[0] != ':')
	{
		printf("POS: ");scanf("%d",&posicoes[1]);
		posicoes[0] = 1;
	}
	else
	{
		Posicoes(comando);
	}
	
	for ( aux=1 ; aux<=posicoes[0] ; aux++ )
		{
			toserver.ID = posicoes[aux];
			switch (tabela.type[toserver.ID]) //seleciona o terminal para enviar a imagem
			{
				case 0:
					Send_MSG();
					break;
				case 1:
					Send_MSG();
					break;
				default:
					printf("( %d )",posicoes[aux]);
					TerminalNExiste();
					break;
			}
		}
	fgets(lixo,5,stdin);
}

/********************************************************************************
>>>> void Clear() <<<<
---------------------------------------------------------------------------------
*Função:	void Clear()
*Descrição:	solicita para o TCgertec a limpeza do display (TC504)

*Entrada:	nenhuma
*Saída:		nenhuma

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

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

void Clear(char *comando)
{
	unsigned short cor;
	char strcor[10];
	char lixo[5];
	int aux;
	
	toserver.CMD = CLEAR;
	
	if(comando[0] != ':')
	{
		printf("POS: ");scanf("%d",&posicoes[1]);
		posicoes[0] = 1;
		fgets(lixo,5,stdin);
	}
	else
	{
		Posicoes(comando);
	}
	
	printf("%s ",textos.Cor);fgets(strcor,9,stdin);
	TiraTerminacao(strcor);
	cor = ConvertCor(strcor);//converte a cor de string para hexadecimal
	memmove(toserver.data,(char*)&cor,sizeof(unsigned short));
	
	for ( aux=1 ; aux<=posicoes[0] ; aux++ )
	{
		toserver.ID = posicoes[aux];
		switch (tabela.type[toserver.ID]) //seleciona o terminal para enviar a imagem
		{
			case 0:
				printf("( %d )",posicoes[aux]);
				TerminalError();
				break;
			case 1:
				Send_MSG();
				break;
			default:
				printf("( %d )",posicoes[aux]);
				TerminalNExiste();
				break;
		}
	}
	fgets(lixo,5,stdin);
}

/********************************************************************************
>>>> void Sendfile() <<<<
---------------------------------------------------------------------------------
*Função:	void Sendfile()
*Descrição:	Solicita para o TCgertec enviar um arquivo para o terminal TC504

*Entrada:	nome: origem do arquivo;
		dest: destino do arquivo;
*Saída:		nenhuma

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

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

void Sendfile(char *nome, char *dest)
{
	Arquivo arquivo;
	FILE *file;
	
	toserver.CMD = SEND_FILE;
	
		strcpy(arquivo.origem,nome);
		if ( (file = fopen(arquivo.origem,"rt")) == NULL) //verifica se o arquivo existe.
			printf("(%s) %s\n",nome,textos.ArqNExiste);
		else
		{
			fclose(file);
			strcpy(arquivo.destino,dest);
			memmove(toserver.data,(char*)&arquivo,sizeof(Arquivo)); //monta a mensagem para o enviar para o TCgertec
			Send_MSG();
		}
}

/********************************************************************************
>>>> void SendAdv() <<<<
---------------------------------------------------------------------------------
*Função:	void SendAdv()
*Descrição:	Lê o arquivo images.cfg e envia as propagandas para o terminal

*Entrada:	nenhuma
*Saída:		nenhuma

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

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

void SendAdv(char *comando)
{
	char lixo[5];
	int i;
	FILE *adv;
	FILE *images;
	Imagem image;
	char linha[100];
	char filename[50];
	char path[100];
	char path2[100];
	char dest[50];
	
	char *p,aux[50];
	
	int pos;
	
	if(comando[0] != ':')
	{
		printf("POS: ");scanf("%d",&posicoes[1]);fgets(lixo,5,stdin);
		posicoes[0] = 1;
	}
	else
	{
		Posicoes(comando);
	}
	
	printf("%s ",textos.Narq);fgets(filename,19,stdin);
	TiraTerminacao(filename);
	sprintf(path2,".//adv//%s.cfg",filename);
	
	if ( (adv = fopen(path2,"r")) == NULL)
	{
		printf("%s\n",textos.ArqNExiste);
	}
	else
	{
		for ( pos=1 ; pos<=posicoes[0] ; pos++ )
		{
			toserver.ID = posicoes[pos];
			switch (tabela.type[toserver.ID]) //seleciona o terminal para enviar a imagem
			{
				case 0:
					printf("( %d )",posicoes[pos]);
					TerminalError();
					break;
				case 1:
					//Envia o comando para parar o loop de propagandas
					toserver.CMD = STOP_LOOP;
					Send_MSG();
						
					//Envia uma imagem para indicar a atualização
					strcpy(image.filename,".//images//UPDADV.BMP");
					memmove(&toserver.data,(char*)&image,sizeof(Imagem));
					toserver.CMD = SEND_IMAGE;
					Send_MSG();
					
					//Exclui as imagens de propagandas atuais
					toserver.CMD = DELETE_ADV;
					Send_MSG();
					
					//Loop Lê o arquivo images.cfg e envia as imagens para o terminal
					do
					{
						fgets(linha,100,adv);
						
						if ( (linha[0] != '<') && (linha[0] != '>') )
						{
							bzero(filename,sizeof(filename));
							bzero(path,sizeof(path));
							
							p = strchr(&linha[1],'|');
							strncpy(filename,&linha[1],p-&linha[1]);
											
							sprintf(path,"./images/%s",filename);
							sprintf(dest,"c:\\images\\%s",filename);
							
							Sendfile(path,dest);
						}
						
					}while (!feof(adv));
					close(adv);
					//Envia o arquivo images.cfg para o terminal de consultas
					Sendfile(path2,"c:\\APPS\\images.cfg");
			
					//Reinicia o terminal
					toserver.CMD = RELOAD_ADV;
					Send_MSG();
					break;
				default:
					printf("( %d )",posicoes[pos]);
					TerminalNExiste();
					break;
			}
		}
	}
}

/********************************************************************************
>>>> CreateFileADV_504() <<<<
---------------------------------------------------------------------------------
*Função:	CreateFileADV_504()
*Descrição:	Cria o arquivo images.cfg

*Entrada:	nenhuma
*Saída:		nenhuma

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

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

void CreateFileADV_504()
{
	FILE *images;
	FILE *file;
	char linha[100];
	char filename[20];
	char path[100];
	char lixo[10];
	int tempo;
	int qtd;
	int i;
	
	printf("%s ",textos.Narq);fgets(filename,19,stdin);
	TiraTerminacao(filename);
	sprintf(path,".//adv//%s.cfg",filename);
	
	images = fopen(path,"w"); // Cria o arquivo images.cfg
	
	fputs("<\n",images); //Escreve "<" no inicio do arquivo
	
	printf("===============================\n");
	//Loop que escreve as configurações para o loop de propagandas
	do
	{
		printf("%s ",textos.NImage);
		fgets(filename,19,stdin);
		TiraTerminacao(filename);
		sprintf(path,".//images//%s",filename);
		
		if ( (file = fopen(path,"r")) != NULL)
		{
			fclose(file);
			printf("%s: ",textos.Tempo); scanf("%d",&tempo);
			printf("%s ",textos.qtd);scanf("%d",&qtd);
			fgets(lixo,5,stdin);
			sprintf(linha,"|%s|%d|%d|\n",filename,tempo,qtd);
			fputs(linha,images);
		}
		else
		{
			printf("%s\n",textos.ArqNExiste);
		}
		
		printf("%s (1 = %s ,0 = %s): ",textos.outroArq,textos.Sim,textos.Nao);
		scanf("%d",&i);fgets(lixo,5,stdin);
	
	}while( i == 1 );

	fputs(">\n",images); // Escreve a terminação do arquivo
	fflush(images);
	close(images);
}

/********************************************************************************
>>>> void CreateFileADV() <<<<
---------------------------------------------------------------------------------
*Função:	void CreateFileADV()
*Descrição:	Cria o arquivo images.txt

*Entrada:	nenhuma
*Saída:		nenhuma

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

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

void CreateFileADV()
{
	FILE *images;
	FILE *file;
	char linha[100];
	char filename[20];
	char path[100];
	char lixo[10];
	int tempo;
	int i;
	
	images = fopen("./images/images.txt","w"); //cria o arquivo para escrever
	
	//loop que pede as configurações para enviar para o terminal as propagandas
	do
	{
		printf("%s ",textos.Narq);
		fgets(filename,19,stdin);
		TiraTerminacao(filename);
		sprintf(path,".//images//%s",filename);
		
		if ( (file = fopen(path,"r")) != NULL)
		{
			fclose(file);
			printf("%s: ",textos.Tempo); scanf("%d",&tempo);
			fgets(lixo,5,stdin);
			sprintf(linha,"%s|%d|5|\n",filename,tempo);
			fputs(linha,images);
		}
		else
		{
			printf("%s\n",textos.ArqNExiste);
		}
		
		printf("%s (1 = %s ,0 = %s): ",textos.outroArq,textos.Sim,textos.Nao);
		scanf("%d",&i);fgets(lixo,5,stdin);
	
	}while( i == 1 );
	
	fflush(images);
	close(images);
}

/********************************************************************************
>>>> void CreateFilePre() <<<<
---------------------------------------------------------------------------------
*Função:	void CreateFilePre()
*Descrição:	Cria o arquivo PREIMG.CFG

*Entrada:	nenhuma
*Saída:		nenhuma

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

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

void CreateFilePre()
{
	FILE *images;
	FILE *file;
	char linha[100];
	char filename[20];
	char path[100];
	char lixo[10];
	int tempo;
	int qtd;
	int i;
	
	printf("%s ",textos.Narq);fgets(filename,19,stdin);
	TiraTerminacao(filename);
	sprintf(path,".//preimg//%s.CFG",filename);
	
	images = fopen(path,"w"); // Cria o arquivo preimages.cfg
	
	fputs("<\n",images); //Escreve "<" no inicio do arquivo
	
	printf("===============================\n");
	//Loop que escreve as preimages
	do
	{
		printf("%s ",textos.NImage);
		fgets(filename,19,stdin);
		TiraTerminacao(filename);
		sprintf(path,".//images//%s",filename);
		
		if ( (file = fopen(path,"r")) != NULL)
		{
			fclose(file);
			sprintf(linha,"%s\n",filename);
			fputs(linha,images);
		}
		else
		{
			printf("%s\n",textos.ArqNExiste);
		}
		
		printf("%s (1 = %s ,0 = %s): ",textos.outroArq,textos.Sim,textos.Nao);
		scanf("%d",&i);fgets(lixo,5,stdin);
	
	}while( i == 1 );

	fputs(">\n",images); // Escreve a terminação do arquivo
	fflush(images);
	close(images);
}

/********************************************************************************
>>>> void SendPre() <<<<
---------------------------------------------------------------------------------
*Função:	void SendPre()
*Descrição:	Lê as pre images do arquivo preimg.cfg e envia para o terminal

*Entrada:	nenhuma
*Saída:		nenhuma

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

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

void SendPre(char *comando)
{
	char lixo[5];
	int i;
	FILE *images;
	FILE *pre;
	Imagem image;
	char filename[50];
	char path[100];
	char path2[100];
	char dest[50];
	
	char *p,aux[50];
	
	int pos;
	
	if(comando[0] != ':')
	{
		printf("POS: ");scanf("%d",&posicoes[1]);fgets(lixo,5,stdin);
		posicoes[0] = 1;
	}
	else
	{
		Posicoes(comando);
	}
	
	printf("%s ",textos.Narq);fgets(filename,19,stdin);
	TiraTerminacao(filename);
	sprintf(path2,".//preimg//%s.CFG",filename);
	
	if ( (pre = fopen(path2,"r")) == NULL)
	{
		printf("%s\n",textos.ArqNExiste);
	}
	else
	{
		for ( pos=1 ; pos<=posicoes[0] ; pos++ )
		{
			toserver.ID = posicoes[pos];
			switch (tabela.type[toserver.ID]) //seleciona o terminal para enviar a imagem
			{
				case 0:
					printf("( %d )",posicoes[pos]);
					TerminalError();
					break;
				case 1:
					//Envia o comando para parar o loop de propagandas
					toserver.CMD = STOP_LOOP;
					Send_MSG();
						
					//Envia uma imagem para indicar a atualização
					strcpy(image.filename,".//images//UPDADV.BMP");
					memmove(&toserver.data,(char*)&image,sizeof(Imagem));
					toserver.CMD = SEND_IMAGE;
					Send_MSG();
					
					//Exclui as imagens de propagandas atuais
					toserver.CMD = DELETE_PRE;
					Send_MSG();
					
					//Loop Lê o arquivo images.cfg e envia as imagens para o terminal
					do
					{
						fgets(filename,50,pre);
						
						if ( (filename[0] != '<') && (filename[0] != '>') )
						{
							bzero(path,sizeof(path));
							TiraTerminacao(filename);
							sprintf(path,"./images/%s",filename);
							sprintf(dest,"c:\\preimg\\%s",filename);
						
							Sendfile(path,dest);
						}
					}while (!feof(pre));
					close(pre);
					//Envia o arquivo images.cfg para o terminal de consultas
					Sendfile(path2,"c:\\APPS\\PREIMG.CFG");
			
					//Reinicia o terminal
					toserver.CMD = RELOAD_PRE;
					Send_MSG();
					break;
				default:
					printf("( %d )",posicoes[pos]);
					TerminalNExiste();
					break;
			}
		}
	}
}

/********************************************************************************
>>>> void SendConf() <<<<
---------------------------------------------------------------------------------
*Função:	void SendConf()
*Descrição:	Envia para o TCgertec as configurações de um terminal(protocolo TC501)

*Entrada:	nenhuma
*Saída:		nenhuma

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

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

void SendConf()
{
	int escolha;
	char lixo[5];
	toserver.CMD = SEND_CONFIG;
	printf("1 = %s ,0 = %s\n\n",textos.Sim,textos.Nao);
	
	//pede para o usuário as informações para a configuração do terminal
	printf("%s %s ?",textos.Serv,conf.host); scanf("%d",&escolha);
	if (escolha == 1)
	{
		fgets(lixo,5,stdin);
		printf("%s: ",textos.Serv);
		fgets(conf.host,21,stdin);
		TiraTerminacao(conf.host);
	}
	printf("%s %s ?",textos.Addr,conf.address); scanf("%d",&escolha);
	if (escolha == 1)
	{
		fgets(lixo,5,stdin);
		printf("%s: ",textos.Addr);
		fgets(conf.address,21,stdin);
		TiraTerminacao(conf.address);
	}
	printf("%s %s ?",textos.NetM,conf.netMask); scanf("%d",&escolha);
	if (escolha == 1)
	{
		fgets(lixo,5,stdin);
		printf("%s: ",textos.NetM);
		fgets(conf.netMask,21,stdin);
		TiraTerminacao(conf.netMask);
	}
	printf("%s %s ?",textos.LN1,conf.line1); scanf("%d",&escolha);
	if (escolha == 1)
	{
		fgets(lixo,5,stdin);
		printf("%s: ",textos.LN1);
		fgets(conf.line1,21,stdin);
		TiraTerminacao(conf.line1);
	}
	printf("%s %s ?",textos.LN2,conf.line2); scanf("%d",&escolha);
	if (escolha == 1)
	{
		fgets(lixo,5,stdin);
		printf("%s: ",textos.LN2);
		fgets(conf.line2,21,stdin);
		TiraTerminacao(conf.line2);
	}
	printf("%s %s ?",textos.LN3,conf.line3); scanf("%d",&escolha);
	if (escolha == 1)
	{
		fgets(lixo,5,stdin);
		printf("%s: ",textos.LN3);
		fgets(conf.line3,21,stdin);
		TiraTerminacao(conf.line3);
	}
	printf("%s %s ?",textos.LN4,conf.line4); scanf("%d",&escolha);
	if (escolha == 1)
	{
		fgets(lixo,5,stdin);
		printf("%s: ",textos.LN4);
		fgets(conf.line4,21,stdin);
		TiraTerminacao(conf.line4);
	}
	printf("%s %d ?",textos.Time,conf.time); scanf("%d",&escolha);
	if (escolha == 1)
	{
		fgets(lixo,5,stdin);
		printf("%s: ",textos.Time);
		scanf("%d",&conf.time);
		fgets(lixo,5,stdin);
	}
	printf("\n");
	printf("========================================\n\n");
	
	printf("%s ",textos.Enviar); scanf("%d",&escolha);
	if (escolha == 1)
	{
		printf("\nPOS: "); scanf("%d",&toserver.ID);
		memmove(toserver.data,(char*)&conf,sizeof(Config));
		if (tabela.type[toserver.ID] == 0)
			Send_MSG();
		else if (tabela.type[toserver.ID] == 1)
			TerminalError();
		else
			TerminalNExiste();
	}
	fgets(lixo,5,stdin);
}

/********************************************************************************
>>>> void SendUPD() <<<<
---------------------------------------------------------------------------------
*Função:	void SendUPD()
*Descrição:	Envia para o TCgertec as novas configurações de atualização de um terminal (protocolo TC501)

*Entrada:	nenhuma
*Saída:		nenhuma

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

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

void SendUPD()
{
	int escolha;
	char lixo[5];
	toserver.CMD = SEND_UPD;
	printf("1 = %s ,0 = %s\n\n",textos.Sim,textos.Nao);
	
	//pede para o usuário as informações para a configuração do terminal
	printf("%s %s ?",textos.Gateway,upd.gateway); scanf("%d",&escolha);
	if (escolha == 1)
	{
		fgets(lixo,5,stdin);
		printf("%s: ",textos.Gateway);
		fgets(upd.gateway,21,stdin);
		TiraTerminacao(upd.gateway);
	}
	printf("%s %s ?",textos.ServName,upd.nameserv); scanf("%d",&escolha);
	if (escolha == 1)
	{
		fgets(lixo,5,stdin);
		printf("%s: ",textos.ServName);
		fgets(upd.nameserv,21,stdin);
		TiraTerminacao(upd.nameserv);
	}
	printf("%s %s ?",textos.TCname,upd.TCname); scanf("%d",&escolha);
	if (escolha == 1)
	{
		fgets(lixo,5,stdin);
		printf("%s: ",textos.TCname);
		fgets(upd.TCname,21,stdin);
		TiraTerminacao(upd.TCname);
	}
	printf("%s %s ?",textos.UPDServ,upd.UpdServ); scanf("%d",&escolha);
	if (escolha == 1)
	{
		fgets(lixo,5,stdin);
		printf("%s: ",textos.UPDServ);
		fgets(upd.UpdServ,99,stdin);
		TiraTerminacao(upd.UpdServ);
	}
	printf("%s %s ?",textos.User,upd.Updser); scanf("%d",&escolha);
	if (escolha == 1)
	{
		fgets(lixo,5,stdin);
		printf("%s: ",textos.User);
		fgets(upd.Updser,21,stdin);
		TiraTerminacao(upd.Updser);
	}
	printf("%s %s ?",textos.Pass,upd.UpdPass); scanf("%d",&escolha);
	if (escolha == 1)
	{
		fgets(lixo,5,stdin);
		printf("%s: ",textos.Pass);
		fgets(upd.UpdPass,21,stdin);
		TiraTerminacao(upd.UpdPass);
	}
	printf("\n");
	printf("========================================\n\n");
	
	printf("%s ",textos.Enviar); scanf("%d",&escolha);
	if (escolha == 1)
	{
		printf("\nPOS: "); scanf("%d",&toserver.ID);
		memmove(toserver.data,(char*)&upd,sizeof(UPDConfig));
		if (tabela.type[toserver.ID] == 0)
			Send_MSG();
		else if (tabela.type[toserver.ID] == 1)
			TerminalError();
		else
			TerminalNExiste();
	}
	fgets(lixo,5,stdin);
}

/********************************************************************************
>>>> void SendParam() <<<<
---------------------------------------------------------------------------------
*Função:	void SendParam()
*Descrição:	Envia para o TCgertec os novos parâmetros de rede de um terminal (protocolo TC501)

*Entrada:	nenhuma
*Saída:		nenhuma

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

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

void SendParam()
{
	int escolha;
	char lixo[5];
	toserver.CMD = SEND_PARAM;
	printf("1 = %s ,0 = %s\n\n",textos.Sim,textos.Nao);
	
	//pede para o usuário as informações para a configuração do terminal
	printf("%s %c ?",textos.Dinamico,param.IPdinamico); scanf("%d",&escolha);
	if (escolha == 1)
	{
		fgets(lixo,5,stdin);
		printf("%s: ",textos.Dinamico);
		param.IPdinamico = fgetc(stdin);
	}
	printf("%s %c ?",textos.BuscaServ,param.BuscaServer); scanf("%d",&escolha);
	if (escolha == 1)
	{
		fgets(lixo,5,stdin);
		printf("%s: ",textos.BuscaServ);
		param.BuscaServer = fgetc(stdin);
	}
	printf("\n");
	printf("========================================\n\n");
	
	printf("%s ",textos.Enviar); scanf("%d",&escolha);
	if (escolha == 1)
	{
		printf("\nPOS: "); scanf("%d",&toserver.ID);
		memmove(toserver.data,(char*)&param,sizeof(PARAMConfig));
		
		//verifica se o terminal é compatível
		if (tabela.type[toserver.ID] == 0)
			Send_MSG();
		else if (tabela.type[toserver.ID] == 1)
			TerminalError();
		else
			TerminalNExiste();
	}
	fgets(lixo,5,stdin);
}

/********************************************************************************
>>>> void sendsetup() <<<<
---------------------------------------------------------------------------------
*Função:	void sendsetup()
*Descrição:	Envia para o TCgertec a nova configuração de um terminal TC504

*Entrada:	
*Saída:		

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

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

void sendsetup()
{
	int escolha;
	char lixo[5];
	char aux[100];
	toserver.CMD = SEND_SETUP;
	printf("1 = %s ,0 = %s\n\n",textos.Sim,textos.Nao);
	//pede para o usuário trocar as informações de configuração
	printf("%s %s ?",textos.Addr,Inet_ntoa(setup.dwMY_IP_ADD)); scanf("%d",&escolha);
	if (escolha == 1)
	{
		fgets(lixo,5,stdin);
		printf("%s: ",textos.Addr);
		fgets(aux,100,stdin);
		TiraTerminacao(aux);
		setup.dwMY_IP_ADD = Inet_addr(aux);
	}
	printf("%s %s ?",textos.Serv,Inet_ntoa(setup.dwServer_IP));scanf("%d",&escolha);
	if (escolha == 1)
	{
		fgets(lixo,5,stdin);
		printf("%s: ",textos.Serv);
		fgets(aux,100,stdin);
		TiraTerminacao(aux);
		setup.dwServer_IP = Inet_addr(aux);
	}
	printf("%s %s ?",textos.NetM,Inet_ntoa(setup.dwNetMask));scanf("%d",&escolha);
	if (escolha == 1)
	{
		fgets(lixo,5,stdin);
		printf("%s: ",textos.NetM);
		fgets(aux,100,stdin);
		TiraTerminacao(aux);
		setup.dwNetMask = Inet_addr(aux);
	}
	printf("%s %s ?",textos.Gateway,Inet_ntoa(setup.dwGateway));scanf("%d",&escolha);
	if (escolha == 1)
	{
		fgets(lixo,5,stdin);
		printf("%s: ",textos.Gateway);
		fgets(aux,100,stdin);
		TiraTerminacao(aux);
		setup.dwGateway = Inet_addr(aux);
	}
	printf("%s %s ?",textos.ServName,Inet_ntoa(setup.dwNameServer));scanf("%d",&escolha);
	if (escolha == 1)
	{
		fgets(lixo,5,stdin);
		printf("%s: ",textos.ServName);
		fgets(aux,100,stdin);
		TiraTerminacao(aux);
		setup.dwNameServer = Inet_addr(aux);
	}
	printf("%s %s ?",textos.TCname,setup.TCName);scanf("%d",&escolha);
	if (escolha == 1)
	{
		fgets(lixo,5,stdin);
		printf("%s: ",textos.TCname);
		fgets(setup.TCName,100,stdin);
		TiraTerminacao(setup.TCName);
	}
	printf("%s %d ?",textos.Port,setup.wPortsv);scanf("%d",&escolha);
	if (escolha == 1)
	{
		printf("%s: ",textos.Port);
		scanf("%d",&setup.wPortsv);
	}
	printf("%s %s ?",textos.SFTP,setup.FTPs);scanf("%d",&escolha);
	if (escolha == 1)
	{
		fgets(lixo,5,stdin);
		printf("%s: ",textos.SFTP);
		fgets(setup.FTPs,100,stdin);
		TiraTerminacao(setup.FTPs);
	}
	printf("%s %s ?",textos.UFTP,setup.FTPu);scanf("%d",&escolha);
	if (escolha == 1)
	{
		fgets(lixo,5,stdin);
		printf("%s: ",textos.UFTP);
		fgets(setup.FTPu,100,stdin);
		TiraTerminacao(setup.FTPu);
	}
	printf("%s %s ?",textos.PFTP,setup.FTPp);scanf("%d",&escolha);
	if (escolha == 1)
	{
		fgets(lixo,5,stdin);
		printf("%s: ",textos.PFTP);
		fgets(setup.FTPp,100,stdin);
		TiraTerminacao(setup.FTPp);
	}
	printf("%s %d ?",textos.Dinamico,setup.dwDHCP);scanf("%d",&escolha);
	if (escolha == 1)
	{
		printf("%s: ",textos.Dinamico);
		scanf("%d",&setup.dwDHCP);
	}
	printf("%s %d ?",textos.BuscaServ,setup.dwSearchServer);scanf("%d",&escolha);
	if (escolha == 1)
	{
		printf("%s: ",textos.BuscaServ);
		scanf("%d",&setup.dwSearchServer);
	}
	printf("\n");
	printf("========================================\n\n");
	
	printf("%s ",textos.Enviar); scanf("%d",&escolha);
	if (escolha == 1)
	{
		printf("\nPOS: "); scanf("%d",&toserver.ID);
		memmove(toserver.data,(char*)&setup,sizeof(ARG_SETUP_TCP));
		
		//verifica se o terminal é compatível
		if (tabela.type[toserver.ID] == 0)
			TerminalError();
		else if (tabela.type[toserver.ID] == 1)
			Send_MSG();//Envia para o TCgertec
		else
			TerminalNExiste();
	}
	fgets(lixo,5,stdin);
}

/********************************************************************************
>>>> void ChangeLanguage() <<<<
---------------------------------------------------------------------------------
*Função:	void ChangeLanguage()
*Descrição:	Troca o idioma do programa server

*Entrada:	nenhuma
*Saída:		nenhuma

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

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

void ChangeLanguage()
{
	FILE *file;
	FILE *padrao;
	
	char string[50];
	char *p;
	int qtd,pos=-1,i = 0;
	char lixo[5];
	
	struct languages
	{
		char nome[50];
		char arquivo[50];
	}idiomas[20];
	
	bzero(idiomas,sizeof(idiomas));
	
	if ( (file=fopen(".//languages//CONFIG.TXT","r")) == NULL )
		return;
	printf("\n==================================\n");
	
	//Monta a lista de idiomas
	while (!feof(file) && i<20)
	{
		fgets(string,50,file);
		
		p = strchr(string,'|');
		
		if (p != NULL)
		{
			strncpy(idiomas[i].nome,string,p-string);
			printf("%s\n",idiomas[i].nome);
			
			strcpy(string,p+1);
			p = strchr(string,'|');
			strncpy(idiomas[i].arquivo,string,p-string);
			i++;
		}
	}
	fclose(file);
	printf("==================================\n");
	qtd = i;
	printf("%s ",textos.escolha);fgets(string,50,stdin);
	TiraTerminacao(string);
	
	//procura o idioma digitado
	for ( i=0 ; i<qtd ; i++)
	{
		if ( !strcmp(string,idiomas[i].nome) )
			pos=i;
	}
	
	if (pos >= 0)
	{
		sprintf(string,".//languages//%s",idiomas[pos].arquivo);
		if (SetLanguage(string,&textos) == 0) // troca as informações do arquivo idioma
			printf("%s \n",textos.erroIdioma);
		else
		{
			printf("%s\n",textos.alterado);
			printf("%s (1 = %s, 0 = %s) ",textos.padrao,textos.Sim,textos.Nao);scanf("%d",&i);
			fgets(lixo,4,stdin);
			//torna o idioma escolhido padrão do programa
			if (i)
			{
				if ( (file=fopen(string,"r")) != NULL )
				{
					padrao=fopen(".//languages//padrao.txt","w");
				
					while (!feof(file))
						fputc(fgetc(file),padrao);
				}
			}
		}
	}
	
	else
		printf("%s \n",textos.ArqNExiste);
}

/********************************************************************************
>>>> void Process(char *comando) <<<<
---------------------------------------------------------------------------------
*Função:	void Process(char *comando)
*Descrição:	processa um comando enviado pelo usuário

*Entrada:	comando: string contendo o comando
*Saída:		nenhuma

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

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

void Process(char *comando)
{
	toserver.type = 1;
	
	if ( !strncmp(comando,"tab",3) )
	{
		toserver.CMD = TAB_CONEC;
		Send_MSG();
	}
	else if ( !strncmp(comando,"names",5) )
	{
		names = (names==0)?1:0;
	}
	else if ( !strncmp(comando,"stopserver",10) )
	{
		toserver.CMD = STOP;
		Send_MSG();
	}
	else if ( !strncmp(comando,"sendtext",8) )
		Text(&comando[8]);
	else if ( !strncmp(comando,"sendimage",9) ) 
		Image(&comando[9]);
	else if ( !strncmp(comando,"getconfig",9) )
		getConfig();
	else if ( !strncmp(comando,"setlec",6) )
		setLEC(&comando[6]);
	else if ( !strncmp(comando,"setkey",6) )
		setKey(&comando[6]);
	else if ( !strncmp(comando,"settime",7) )
		setTime(&comando[7]);
	else if ( !strncmp(comando,"restart",7) )
		Restart(&comando[7]);
	else if ( !strncmp(comando,"cleardisp",9) )
		Clear(&comando[9]);
	else if ( !strncmp(comando,"sendadv",7) )
		SendAdv(&comando[7]);
	else if ( !strncmp(comando,"createadv504",12) )
		CreateFileADV_504();
	else if ( !strncmp(comando,"createadv505",12) )
		CreateFileADV();
	else if ( !strncmp(comando,"createpre504",12) )
		CreateFilePre();
	else if ( !strncmp(comando,"sendpre",7) )
		SendPre(&comando[7]);
	else if ( !strncmp(comando,"sendconfig",10) )
		SendConf();
	else if ( !strncmp(comando,"sendupd",7) )
		SendUPD();
	else if ( !strncmp(comando,"sendparam",9) )
		SendParam();
	else if ( !strncmp(comando,"sendsetup",9) )
		sendsetup();
	else if ( !strncmp(comando,"changelanguage",14) )
		ChangeLanguage();
	else if(!strcmp(comando,"clear"))
		system(comando);
	else
		printf("%s\n",textos.Invalido);
}

/********************************************************************************
>>>> int main() <<<<
---------------------------------------------------------------------------------
*Função:	int main()
*Descrição:	Função principal, conecta o Message Queue, carrega o idioma, controla os processos

*Entrada:	nenhuma
*Saída:		nenhuma

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

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

int main()
{
	int i;
	char comando[100];
	
	msgkey=msgget(MSG_KEY,0); // Se conecta ao TCgertec
	
	printf("Server Version 2.0\n\n");
	
	if ( msgkey == -1) 
	{
		printf("ERROR!!");
		exit(1);
	}
	
	if (SetLanguage(".//languages//padrao.txt",&textos) == 0) //monta a estrutura de idioma
	{
		printf("ERROR!!");
		exit(1);
	}
	
	pthread_t receive;
	pthread_create(&receive,NULL,Receive_MSG,NULL);//inicia a thread que controla as mensagens recebidas pelo TCgertec
	
	// interface com o usuário
	do
	{
		printf("SCGertec-> ");
		fgets(comando,100,stdin);
		comando[strlen(comando)-1]='\0';
		if ( (strcmp(comando,"exit")) && (strcmp(comando,"")) )
			Process(comando);
	}while (strcmp(comando,"exit"));
	
	return 0;
}
