diff -r 000000000000 -r 3da2a79470a7 testexecmgmt/ucc/Source/Uccs.v2/DeviceControlChannel/CUCCSCommandControl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/testexecmgmt/ucc/Source/Uccs.v2/DeviceControlChannel/CUCCSCommandControl.cpp Mon Mar 08 15:04:18 2010 +0800 @@ -0,0 +1,267 @@ +/* +* 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 "CUCCSCommandControl.h" +#include "../Core/UCCS_ErrorCodes.h" + +/********************************************************************************************** + * + * Defines + * + *********************************************************************************************/ + +/********************************************************************************************** + * + * Constructor + * + *********************************************************************************************/ +CUCCSCommandControl::CUCCSCommandControl( MUccsControl *aCallBackService, IOutput *aOutput ) +{ + assert( aCallBackService != NULL ); + assert( aOutput != NULL ); + + iOutput = aOutput; + iCallBackService = aCallBackService; + iStopFlag = 0; +} + +/********************************************************************************************** + * + * Destructor + * + *********************************************************************************************/ +CUCCSCommandControl::~CUCCSCommandControl() +{ +} + +/********************************************************************************************** + * + * Start() -- the main routine called to run the serial listener. + * + *********************************************************************************************/ +TCommandControlError CUCCSCommandControl::Start( TRemoteControlTransport aTransport, char *aPortname, int *aErrorCode, int *aScriptError ) +{ + int dataLength, script_result; + TCommandControlError return_value = EAC_SUCCESS; + int engine_result = 0; + char commandBuffer[KMAXDATALENGTH]; + char *cmdbptr; + TPCommand commandID; + TCPError protErr; + + // Pointers to all structures to receive data for an ID. + TStartUsecaseRequest *startusecase_data; + TSignalRequest *signal_data; + TRendezvousRequest *rendezvous_data; + TWaitRequest *wait_data; + TEndUsecaseRequest *endusecase_data; + TGetVariableNameRequest *variablename_data; + TRunCommandRequest *runcommand_data; + + // Pointers to all structures used in a reply to a request + TStartUsecaseReply startusecase_rep; + TSignalReply signal_rep; + TRendezvousReply rendezvous_rep; + TWaitReply wait_rep; + TEndUsecaseReply endusecase_rep; + TGetVariableNameReply variablename_rep; + TRunCommandReply runcommand_rep; + cmdbptr = &(commandBuffer[0]); + + //Check params + assert ( aPortname != NULL ); + assert ( aErrorCode!= NULL ); + assert ( aScriptError != NULL ); + *aScriptError = 0; + iTransport = aTransport; + + // Initialise the transport + protErr = iProtocol.initialise( aTransport, aPortname, iOutput ); + if (protErr != TCP_SUCCESS) + { + *aErrorCode = protErr; + return EAC_ERRINITTRANSPORT; + } + + // receive bytes -- forever really + while( 1 ) { + + // check the end flag + if( iStopFlag != 0 ) { + break; + } + + // receive the command id and data via iProtocol + dataLength = KMAXDATALENGTH; + protErr = iProtocol.receiveMessage (&commandID, &dataLength, cmdbptr); + + // if there is an error in the protocol we cannot recover. + if (protErr != TCP_SUCCESS) + { + return_value = EAC_RECEIVEBYTESERROR; + *aErrorCode = protErr; + break; + } + + // msg for serial clients + LocalUpdateMessageIn(commandID, cmdbptr); + + // now handle the command + switch( commandID ) { + + case CMD_REQ_STARTUSECASEID: + startusecase_data = (TStartUsecaseRequest*)cmdbptr; + engine_result = iCallBackService->StartUsecase( startusecase_data->iUsecaseID ); + startusecase_rep.iResult = engine_result; + protErr = iProtocol.sendReply(CMD_REP_STARTUSECASEID, sizeof(startusecase_rep), &startusecase_rep); + break; + + case CMD_REQ_SIGNALID: + signal_data = (TSignalRequest*)cmdbptr; + engine_result = iCallBackService->Signal( signal_data->iUsecaseID ); + signal_rep.iResult = engine_result; + protErr = iProtocol.sendReply(CMD_REP_SIGNALID, sizeof(signal_rep), &signal_rep); + break; + + case CMD_REQ_RENDEZVOUSID: + rendezvous_data = (TRendezvousRequest*)cmdbptr; + engine_result = iCallBackService->Rendezvous( rendezvous_data->iUsecaseID ); + rendezvous_rep.iResult = engine_result; + protErr = iProtocol.sendReply(CMD_REP_RENDEZVOUSID, sizeof(rendezvous_rep), &rendezvous_rep); + break; + + case CMD_REQ_WAITID: + wait_data = (TWaitRequest*)cmdbptr; + engine_result = iCallBackService->Wait( wait_data->iUsecaseID ); + wait_rep.iResult = engine_result; + protErr = iProtocol.sendReply(CMD_REP_WAITID, sizeof(wait_rep), &wait_rep); + break; + + case CMD_REQ_ENDUSECASEID: + endusecase_data = (TEndUsecaseRequest*)cmdbptr; + engine_result = iCallBackService->EndUsecase( endusecase_data->iUsecaseID, endusecase_data->iResult, &script_result); + endusecase_rep.iCommandResult = engine_result; + endusecase_rep.iScriptResult = script_result; + protErr = iProtocol.sendReply(CMD_REP_ENDUSECASEID, sizeof(endusecase_rep), &endusecase_rep); + iStopFlag = 1; + break; + + case CMD_REQ_GETVARIABLENAMEID: + variablename_data = (TGetVariableNameRequest*)cmdbptr; + engine_result = iCallBackService->GetEnvVariable(variablename_data->iVariableName, variablename_rep.iVariableValue, MAXVARNAMELEN ); + variablename_rep.iResult = engine_result; + protErr = iProtocol.sendReply(CMD_REP_GETVARIABLENAMEID, sizeof(variablename_rep), &variablename_rep); + break; + + case CMD_QUITID: + protErr = TCP_FAILED; + return_value = EAC_QUIT; + break; + + case CMD_REQ_RUNCOMMAND: + runcommand_data = (TRunCommandRequest*)cmdbptr; + engine_result = iCallBackService->RunCommand( runcommand_data->iCommandLine ); + runcommand_rep.iResult = engine_result; + protErr = iProtocol.sendReply(CMD_REP_RUNCOMMAND, sizeof(runcommand_rep), &runcommand_rep); + break; + + default: + iOutput->Error( UCCS_UNKNOWNCONTROLCOMMAND, NULL ); + protErr = TCP_SUCCESS; + return_value = EAC_SUCCESS; + } + + // print the message + LocalUpdateMessageOut( engine_result ); + + // if there was an error in the transport then exit + if( protErr != TCP_SUCCESS ) { + if( return_value != EAC_QUIT ) { + return_value = EAC_PROCESSINGFAILED; + } + break; + } + } + + // done + iProtocol.disconnect(); + iStopFlag = 0; + *aErrorCode = protErr; + return return_value; + +} + + +/********************************************************************************************** + * + * Helper: Print messages when we are in serial mode + * + *********************************************************************************************/ +void CUCCSCommandControl::LocalUpdateMessageIn(int aCommandId, char *aMsg) +{ + static char *cmdIdStrings[] = + { + "StartUseCase (request)", // CMD_REQ_STARTUSECASEID, + "Signal (request)", // CMD_REQ_SIGNALID, + "Rendezvous (request)", // CMD_REQ_RENDEZVOUSID, + "WaitForSignal (request)", // CMD_REQ_WAITID, + "EndUseCase (request)", // CMD_REQ_ENDUSECASEID, + "GetVariableName (request)", // CMD_REQ_GETVARIABLENAMEID, + "Run (request)", // CMD_REQ_RUNCOMMAND + "StartUseCase (response)", // CMD_REP_STARTUSECASEID, + "Signal (response)" // CMD_REP_SIGNALID, + "Rendezvous (response)", // CMD_REP_RENDEZVOUSID, + "WaitForSignal (response)", // CMD_REP_WAITID, + "EndUseCase (response)", // CMD_REP_ENDUSECASEID, + "GetVariableName (response)", // CMD_REP_GETVARIABLENAMEID, + "Run (response)", // CMD_REP_RUNCOMMAND, + "Quit", // CMD_QUITID, + "Unknown", // CMD_UNKNOWN + }; + + // don't display for console; - consolidate o/p + if (iTransport != RCI_CONSOLE) + { + // display msg - belongs within protocol implementation? + fprintf(stdout, "\n%s\n", aMsg); + + if (aCommandId > CMD_UNKNOWN) + fprintf(stdout, "Error! unsupported command identifier %d\n", aCommandId); + else + fprintf(stdout, " command; \"%s\" (%d)\n", cmdIdStrings[aCommandId], aCommandId); + } +} + +void CUCCSCommandControl::LocalUpdateMessageOut(int aResult) +{ + // don't display for console; - consolidate o/p + if( iTransport != RCI_CONSOLE) + fprintf(stdout, " result; \"%s\" (%d)\n", GetUccsErrorStringI(aResult), aResult); +}