testexecmgmt/ucc/Source/CSProtocolLibrary/cprotocol/CXClient.cpp
changeset 0 3da2a79470a7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/testexecmgmt/ucc/Source/CSProtocolLibrary/cprotocol/CXClient.cpp	Mon Mar 08 15:04:18 2010 +0800
@@ -0,0 +1,235 @@
+/*
+* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+* Filename: CXClient.cpp
+* Author: Sanjeet Matharu 
+* This is the client side of the protocol which takes name/value pairs and does stuff
+* System Includes
+*
+*/
+
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <memory.h>
+#include <string.h>
+#include <assert.h>
+
+#ifdef WIN32
+#include <winsock2.h>
+#include <windows.h>
+#else
+#include <sys/types.h>
+#include <sys/socket.h>
+#endif
+
+/*******************************************************************************
+ *
+ * Local Includes
+ *
+ ******************************************************************************/
+#include "cxclient.h"
+
+#define MAXRETRIES		5
+
+//------------------------------------------------------------------------------
+//constructor
+CXClient::CXClient()
+{
+	iClientStatus = SENDING_HELLO;
+
+	sprintf(hellobuffer, "%s", "HELLO");
+	sprintf(goodbyebuffer, "%s", "GOODBYE");
+}
+
+//------------------------------------------------------------------------------
+//destructor
+CXClient::~CXClient()
+{
+	
+}
+
+//------------------------------------------------------------------------------
+//this function adds the specified value into the list of name value pairs
+int CXClient::OnExecute(int handle, char* cValue, int dim1, int dim2)
+{
+	int error = 0;
+	int localsocket = handle;
+	int counter = 0;
+
+	if(localsocket != 0)
+	{
+		error = SendData(localsocket, hellobuffer);
+		//send the hello to the server side first
+		if( error != OK_DATATRANSFER)
+		{
+			//give up and return a message
+			printf("There was a problem saying hello...\n");
+			return -1;
+		}
+	}
+	else
+	{
+		printf("There was a problem with the socket...\n");
+		return -1;
+	}
+
+	//go through the valuebuffer and send the data
+	for(counter = 0; counter < dim1; counter++)
+	{
+		error = SendData(localsocket, &cValue[counter*dim2]);
+		if( error != OK_DATATRANSFER)
+		{
+			//give up and return a message
+			printf("There was a problem sending the data...\n");
+			return -1;
+		}
+	}
+
+	//send the goodbye to the server side 
+	if(localsocket != 0)
+	{
+		error = SendData(localsocket, goodbyebuffer);
+		if( error != OK_DATATRANSFER )
+		{
+			//give up and return a message
+			printf("There was a problem when saying goodbye...\n");
+			return -1;
+		}
+	}
+	else
+	{
+		printf("There was a problem with the socket...\n");
+		return -1;
+	}
+
+	return 0;
+}
+
+//------------------------------------------------------------------------------
+//this sends the hello command to the client over the specified socket to initiate comms
+int CXClient::SendData(int handle, char* aValue)
+{
+	char c;		//this is the buffer that is used to receive the data from across the link
+	char receivebuffer[MAXBUFFERLEN];
+
+	int counter = 0;
+	int bufferlength = 0;
+	int sendcounter = 0;
+	int err = -1;
+	
+	bool success = false;
+	memset(receivebuffer, 0, sizeof(receivebuffer));		//initialise
+
+	bufferlength = strlen(aValue);
+
+	//send the data
+	while( sendcounter < MAXRETRIES ) 
+	{
+		//write to the socket
+		err = WriteClient( handle, HT_SOCKET, aValue, bufferlength );
+
+		//if unable to send for some reason (verify that the error code is the length of one char)
+		if( err != bufferlength )
+		{
+			printf("Data %s sending failed %d...\n", aValue, err);
+			sendcounter++;
+		}
+		else	//print ok 
+		{
+			printf("Data %s sending ok %d chars sent...\n", aValue, bufferlength);
+			sendcounter = MAXRETRIES;
+			//send an end of string character so the server can evaluate what has been received
+			WriteClient( handle, HT_SOCKET, "", 1 );
+		}
+	}
+
+	//receive the reply ONLY if send has succeeded (hence inside the maxretries limit)
+	if( ( sendcounter <= MAXRETRIES ) )
+	{
+		while( 1 )
+		{
+			err = ReadClient( handle, HT_SOCKET, &c );
+
+			if( strcmp( &c, "" ) == 0)
+			{
+				//if there was a problem with the read (i.e. invalid command received from server, knackered link)
+				if( ( err <= 0 ) || ( strcmp(receivebuffer, aValue) != 0 ) )
+				{
+					printf("Data read failed ( device returned %s and receive code was %d )...\n", receivebuffer, err);
+					memset(receivebuffer, 0, sizeof(receivebuffer));		//reset
+					return ERROR_DATATRANSFER;
+				}
+				else
+				{
+					printf("Data read succeeded ( device returned %s )...\n", receivebuffer);
+					memset(receivebuffer, 0, sizeof(receivebuffer));		//reset
+					counter = 0;	//reset
+					break;
+				}
+			}	//if
+
+			receivebuffer[counter++] = c;
+		}		//while
+	}
+	
+	return OK_DATATRANSFER;
+}
+//------------------------------------------------------------------------------
+int CXClient::ReadClient(int handle, int handletype, char* c)
+{
+	int err;
+	
+	assert( c != NULL );
+	
+	// socket handles
+	if( handletype == HT_SOCKET ) 
+	{
+		err = recv( handle, c, 1, 0 );
+		if( err != 1 ) //if the single char has not been received
+		{
+			err = GetLastError();
+			return err;
+		}
+	}
+
+	// success
+	return err;
+}
+
+//------------------------------------------------------------------------------
+int CXClient::WriteClient(int handle, int handletype, char *buff, int bufflen )
+{
+	int err = 0;
+	unsigned long bytes_written = 0;
+
+	assert( buff != NULL );
+
+	// socket handles
+	if( handletype == HT_SOCKET ) 
+	{
+		err = send( handle, buff, bufflen, 0 );
+		if( err != bufflen ) 
+		{
+			err = GetLastError();
+			return err;
+		}
+	}
+
+	return err;	
+}
+
+//------------------------------------------------------------------------------