#include "client.h"

#include "../drivers/net/util.h"

#define SOCKET_ERROR -1

int cli_sendBuffer(Client* cli,void* pBuffer, unsigned int bufferlen)
{
	int iResult;
	ClientEventArgs e;
	//abfragen ob client existiert!! wichtig
	if (cli->sSocket != SOCKET_ERROR)
	{
		iResult= send(cli->sSocket,(char*)pBuffer,bufferlen,0);
		if (cli->_OnWrite != 0)
		{
			e.dwLen = iResult;
			e.pBuffer = pBuffer;
			cli->_OnWrite(&e);
		}
		return iResult;
	}
	else
		return -1;
	}

int cli_ConnectTo(Client* cli,char * pAdresse,unsigned short Port,int webAdresse)
{
        ClientEventArgs	e;
        cli->sSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);		// Einen Socket erstellen
        cli->wPort=Port;
        cli->adAddr.sin_port = htons(cli->wPort);
	

        if (webAdresse)											//Fall es sich um eine Internet Adresse Handelt
                return -1;
        else													//Fall es sich um eine LAN Adresse im 127.0.0.1 Stil handelt
                cli->adAddr.sin_addr.s_addr = inet_addr(pAdresse);

        if (connect(cli->sSocket,(const struct sockaddr*)&cli->adAddr, sizeof(cli->adAddr))==0)
        {

                create_kernel_task(&cli->bThread,cli_WaitForPacket,cli);
	
                if (cli->_OnConnect != 0)
                {
                        e.dwLen = 0;
                        e.pBuffer = 0;
                        cli->_OnConnect(&e);
                }
                return 0;
        }
        else
                return -1;
};

int cli_DisconnectFrom(Client* cli)
{
	shutdown(cli->sSocket,2);
	closesocket(cli->sSocket);
	cli->sSocket = SOCKET_ERROR;
	return 0;
}

void cli_WaitForPacket(Client* cli)
{
	int iResult=1;
	char pTmpBuffer[DEF_BUFFERSIZE+1];
	ClientEventArgs	e;

	while (iResult > 0)
	{
		iResult = recv(cli->sSocket ,pTmpBuffer, DEF_BUFFERSIZE, 0);
		if (iResult > 0)
		{
			pTmpBuffer[iResult]='\0';
			if (cli->_OnRead != 0) 
			{
				e.dwLen = iResult;
				e.pBuffer = pTmpBuffer;
				cli->_OnRead( &e);
			}
		}
		else 			//Verbindung geschlossen
		{
			cli->sSocket=SOCKET_ERROR;
			if (cli->_OnDisconnect != 0) 
			{	
				e.dwLen = 0;
				e.pBuffer = 0;
				cli->_OnDisconnect( &e);
			}
		}

	}
};


int cli_init(Client* cli)						
{

	cli->_OnConnect = 0;
	cli->_OnWrite = 0;
        cli->_OnRead = 0;
        cli->_OnDisconnect = 0;

	cli->adAddr.sin_addr.s_addr = INADDR_ANY;				// IP'S die der Client annehmen soll
	cli->adAddr.sin_family = AF_INET;							// AdressFamilie (TCP/IP)
//	adAddr.sin_port = htons(iPort);						// Port auf dem der Client erreichbar seien soll

	return NULL;
}

int cli_destroy(Client* cli)
{
	closesocket(cli->sSocket);;
	return NULL;
}