#include "ClientReceiver.h"
#include "utils.h"


ClientReceiver::ClientReceiver( LoggingMgr *lm )
{
	ServPort = 8006;
	m_pLogger = lm;
}



ClientReceiver::~ClientReceiver( void )
{
	ShutdownWinsock( );
}


ClientReceiver::StartWinsock( void )
{
   wVersionRequested = MAKEWORD(2, 0);   /* Request Winsock v2.0 */
    if (WSAStartup(wVersionRequested, &wsaData) != 0) /* Load Winsock DLL */
    {
        m_pLogger->PrintOut( "ERROR: couldn't load Winsock DLL" );
        SLEEP_TILL_DEATH( );
    }
}




ClientReceiver::ShutdownWinsock( void )
{
	WSACleanup( );
}




ClientReceiver::InitializeReceiver( void )
{
	
	if ((sock = socket( PF_INET,SOCK_DGRAM,IPPROTO_UDP)) < 0 )
	{
		m_pLogger->PrintOut( "socket creation failed in receiver" );
		SLEEP_TILL_DEATH( );
	}

	memset( &ServAddr, 0, sizeof( ServAddr ));
	ServAddr.sin_family = AF_INET;
	ServAddr.sin_addr.s_addr = htonl( INADDR_ANY );
	ServAddr.sin_port = htons( ServPort );


	if ( bind( sock, (struct sockaddr *) &ServAddr,sizeof( ServAddr )) < 0)
	{
		m_pLogger->PrintOut( "ERROR: couldn't bind in receiver" );
		SLEEP_TILL_DEATH( );
	}
	
	m_pLogger->PrintOut( "ClientReceiver initialized successfully" );
}



ClientReceiver::ListenEternally( void )
{
	char *pclient;

	m_pLogger->PrintOut("ClientReceiver now listening eternally...");
	
	ClientAddrLen = sizeof( ClientAddr );

	for( EVER )
	{
		if (( RecvMsgSize = recvfrom( sock, Buffer,MAXCLIENTLEN,0,\
			(struct sockaddr *) &ClientAddr, &ClientAddrLen )) < 0 )
		{
			m_pLogger->PrintOut("ERROR: couldn't receive message in receiver");
			SLEEP_TILL_DEATH( );
		}
		
		pclient = inet_ntoa( ClientAddr.sin_addr );
	
		m_pLogger->PrintOut2( QString( Buffer ) + QString(" ( ") + QString( pclient ) + QString(" )") );
		//m_pLogger->PrintOut2( QString( pclient )+ QString( GetHostByAddr( pclient )));
		
	}
}



char * ClientReceiver::GetHostByAddr( char *addr )
{
	struct hostent *phost = gethostbyaddr( addr, strlen(addr),AF_INET);
	if ( phost == NULL )
		return NULL;
	
	return phost->h_name;
	
}