#include <sys/types.h>
#include <time.h>

#include "TCPSocket.h"
#include "client.h"


int client::query(const char *hostName, const char *serviceName,
	time_t timeOut,
	const void *pParam, long lParamSize, 
	void **ppResult, long *plResultSize)
{
	time_t	maxTime, timeNow;
	int	timeRemaining = 0;
		
	timeNow = time();
	maxTime = time() + timeout;

	while (TRUE) {
		timeRemaining = maxTime - time(NULL);
		if (timeRemaining <= 0)
			break;

		TCPSocket conn;

		if (conn.init(hostName, serviceName) == FALSE) {
			cerr << conn.ErrorMessage() << endl;
			sleep(1);
			continue;
		}
	
		if (conn.Connect() == FALSE) {
			cerr << conn.ErrorMessage() << endl;
			sleep(1);
			continue;
		}
			
		if (conn.Send((const char *)pParam, lParamSize) == FALSE) {
			cerr << conn.ErrorMessage() << endl;
			conn.Close();
			sleep(1);
			continue;
		}

		timeRemaining = maxTime - time(NULL);
		timeRemaining = timeRemaining > 0 ? timeRemaining : 0;

		if (conn.Poll(timeRemaining, TRUE) == FALSE) {
			cerr  << conn.ErrorMessage() << endl;
			conn.Close();
			sleep(1);
			continue;
		}

		if (conn.RecvAll(ppResult, plResultSize) == FALSE) {
			cerr << conn.ErrorMessage() << endl;
			conn.Close();
			sleep(1);
			continue;
		}
		return TRUE;
	}
}
