testexecmgmt/ucc/Source/SerialTcpRelay/SerialTcpRelay.cpp
changeset 0 3da2a79470a7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/testexecmgmt/ucc/Source/SerialTcpRelay/SerialTcpRelay.cpp	Mon Mar 08 15:04:18 2010 +0800
@@ -0,0 +1,211 @@
+/*
+* 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:  
+* System Includes
+*
+*/
+
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+
+/*************************************************************************************
+ *
+ * Local Includes
+ *
+ ************************************************************************************/
+#include "CSerialTcpRelay.h"
+
+
+/*************************************************************************************
+ *
+ * Definitions
+ *
+ ************************************************************************************/
+#define TO_RETRY					(1000)
+#define TO_TIMEWAIT					(3000)
+#define INITIALSTRINGBUFFERSIZE		(64)
+
+
+/*************************************************************************************
+ *
+ * Prototypes
+ *
+ ************************************************************************************/
+void Relay( SOCKADDR_IN aSocketAddress, char *aSerialPortName );
+void RelaySession( SOCKADDR_IN aSocketAddress, CSerialPort *aSerialPort );
+void PrintRelayError( TRelayError aRelayError, int aErrCode );
+
+
+/*************************************************************************************
+ *
+ * main()
+ *
+ ************************************************************************************/
+int main( int argc, char *argv[] )
+{
+	char *serial_port_name;
+	SOCKADDR_IN socket_address;
+	WORD version;
+	WSADATA wsaData;
+	int err;
+
+	// check params
+	if( argc < 3 ) {
+		fprintf( stderr, "usage: %s <tcp_host> <tcp_port> <serial_port>\n", argv[0] );
+		return -1;
+	}
+
+	// process the params
+	memset( &socket_address, 0, sizeof(socket_address) );
+	socket_address.sin_family = AF_INET;
+	socket_address.sin_port = htons( atoi(argv[2]) );
+	socket_address.sin_addr.S_un.S_addr = inet_addr( argv[1] );
+	serial_port_name = argv[3];
+
+	// start the socket subsystem
+	version = MAKEWORD( 2, 2 );
+	err = WSAStartup( version, &wsaData );
+	assert( err == 0 );
+
+	// start the relay
+	Relay( socket_address, serial_port_name );
+
+	// done
+	WSACleanup();
+	return 0;
+}
+
+
+/*************************************************************************************
+ *
+ * Relay()
+ *
+ ************************************************************************************/
+void Relay( SOCKADDR_IN aSocketAddress, char *aSerialPortName )
+{
+	int err;
+	CSerialPort serial_port;
+
+	// repeat...
+	while( 1 ) {
+
+		// open the serial port - if this fails then pause and retry
+		err = serial_port.OpenPort( aSerialPortName );
+		if( err != 0 ) {
+			fprintf( stderr, "Failed to open serial port %s (%d)\n", aSerialPortName, err );
+			Sleep( TO_RETRY );
+			continue;
+		}
+
+		// try and establish a session (might succeed, might fail, makes no difference here)
+		RelaySession( aSocketAddress, &serial_port );
+
+		// close the port
+		serial_port.ClosePort();
+	}
+
+	// done
+	return;
+}
+
+
+/*************************************************************************************
+ *
+ * RelaySession()
+ *
+ ************************************************************************************/
+void RelaySession( SOCKADDR_IN aSocketAddress, CSerialPort *aSerialPort )
+{
+	char recv_buffer;
+	int err, errcode, bytes_read = 0, slen, initial_string_buffer_length;
+	CSerialTcpRelay relay;
+	TRelayError rerr;
+
+	int current_at_state = 0;
+	char expected_at_char[] = { 'A', 'T', 0x0d, 0 };
+	char initial_string_buffer[INITIALSTRINGBUFFERSIZE] = { 0 };
+
+	// wait for some bytes to arrive on the port
+	fprintf( stdout, "Waiting for new session\n" );
+	while( 1 ) {
+
+		// read from the serial port - if there is an error then exit
+		bytes_read = 1;
+		err = aSerialPort->ReceiveBytes( &recv_buffer, &bytes_read );
+		if( err != 0 ) {
+			fprintf( stderr, "Error reading from the serial port (%s)\n", strerror(err) );
+			break;
+		}
+
+		// if nothing was read then just continue
+		if( bytes_read == 0 ) {
+			continue;
+		}
+
+		// if we read a char that does not match the ignore string then try and
+		// create a session
+		if( recv_buffer != expected_at_char[current_at_state] ) {
+			strncpy( initial_string_buffer, expected_at_char, INITIALSTRINGBUFFERSIZE );
+			initial_string_buffer[current_at_state] = 0;
+			slen = strlen( initial_string_buffer );
+			assert( slen < (INITIALSTRINGBUFFERSIZE-2) );
+			initial_string_buffer[slen] = recv_buffer;
+			initial_string_buffer[slen+1] = 0;
+			initial_string_buffer_length = strlen( initial_string_buffer );
+			break;
+		}
+
+		// otherwise update the at_state
+		current_at_state += 1;
+		current_at_state = ((expected_at_char[current_at_state] == 0) ? 0 : current_at_state);
+	}
+	
+	// some data was received - try and start a session
+	rerr = relay.InitialiseRelay( aSerialPort, aSocketAddress, initial_string_buffer, initial_string_buffer_length, &errcode );
+	if( rerr != RE_SUCCESS ) {
+		PrintRelayError( rerr, errcode );
+		return;
+	}
+	fprintf( stdout, "Session established\n" );
+
+	// session established - execute
+	rerr = relay.ExecuteRelay();
+	if( rerr != RE_SUCCESS ) {
+		fprintf( stderr, "ExecuteRelay returned %d\n", rerr );
+	}
+	fprintf( stdout, "Session closed\n" );
+	
+	// do time-wait 
+	Sleep( TO_TIMEWAIT );
+}
+
+
+/*************************************************************************************
+ *
+ * PrintRelayError()
+ *
+ ************************************************************************************/
+void PrintRelayError( TRelayError aRelayError, int aErrCode )
+{
+	char *relay_error_string[] = { NULL, "socket() failed", "connect() failed", "initial send() failed" };
+	fprintf( stderr, "Failed to initialise the relay - %s - %d\n", relay_error_string[aRelayError], aErrCode );
+}
+
+
+