diff -r 000000000000 -r 3da2a79470a7 testexecmgmt/ucc/Source/SerialTcpRelay/SerialTcpRelay.cpp --- /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 +#include +#include +#include + + +/************************************************************************************* + * + * 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 \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 ); +} + + +