diff -r 000000000000 -r 3da2a79470a7 testexecmgmt/ucc/Source/Uccs.v2/ServiceStubs/CommonServiceStub/CServiceAgentBase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/testexecmgmt/ucc/Source/Uccs.v2/ServiceStubs/CommonServiceStub/CServiceAgentBase.cpp Mon Mar 08 15:04:18 2010 +0800 @@ -0,0 +1,359 @@ +/* +* 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 + +/******************************************************************************* + * + * Local Includes + * + ******************************************************************************/ +#include "CServiceAgentBase.h" +#include "../../Core/UCCS_ServiceValues.h" +#include "../../Core/UCCS_ErrorCodes.h" +#include "../../../SocketLibrary/socket_helper.h" +#include "../../../include/penstd.h" + + +/******************************************************************************* + * + * Definitions + * + ******************************************************************************/ +#define MAXBUFFERSIZE 2048 + + +/******************************************************************************* + * + * Macro Functions + * + ******************************************************************************/ + + +/******************************************************************************* + * + * Constructor / Destructor + * + ******************************************************************************/ +CServiceAgentBase::CServiceAgentBase() +{ +} + + +CServiceAgentBase::~CServiceAgentBase() +{ +} + + +/******************************************************************************* + * + * SECTION: Methods to construct and manipulated the reply + * + ******************************************************************************/ +/******************************************************************************* + * + * PROTECTED METHOD: CreateBaseReply -- IService::IssueCommand() is required to + * return a valid request reply record. This record MUST MUST MUST contain a + * set of basic fields. This method creates _all_ the basic fields, some will + * have to be updated later. + * + ******************************************************************************/ +CDataRecord *CServiceAgentBase::CreateBaseReply( CDataRecord *aRequest ) +{ + CDataRecord *service_request_reply; + int err; + int service_id; + int method_id; + char *service_host; + char *service_name; + char *call; + + // check params + assert( aRequest != NULL ); + + // create the reply object + service_request_reply = new CDataRecord(); + assert( service_request_reply != NULL ); + + // get the service name + err = aRequest->GetFieldAsString( "SVCNAME", &service_name ); + if( err != UCCS_OK ) + { + // If the service name does not exist then resort to the legacy method + + // get the service id + err = aRequest->GetFieldAsInt( "SVCID", &service_id ); + assert( err == UCCS_OK ); + err = aRequest->GetFieldAsString( "SVCHOST", &service_host ); + assert( err == UCCS_OK ); + service_request_reply->NewField( STD_REPLY_FIELD_SERVICE_ID, service_id ); + service_request_reply->NewField( STD_REPLY_FIELD_SERVICE_HOST, service_host ); + } + else + { + service_request_reply->NewField( STD_REPLY_FIELD_SERVICE_NAME, service_name ); + } + + // get the methodid -- default to -1 if not there -- error must be caught by caller + method_id = -1; + aRequest->GetFieldAsInt( "METHODID", &method_id ); + + // now set all the values + service_request_reply->NewField( STD_REPLY_FIELD_METHODID, method_id ); + service_request_reply->NewField( STD_REPLY_FIELD_REQUESTCOMPLETIONCODE, ERR_INVALID_ERROR_CODE); + service_request_reply->NewField( STD_REPLY_FIELD_REQUESTCOMPLETIONDESC, GetPenstdErrorString(ERR_INVALID_ERROR_CODE) ); + + // Check to see if this request is a new generic stub call and log the CALL value + err = aRequest->GetFieldAsString( "CALL", &call ); + if( err == UCCS_OK ) + { + service_request_reply->NewField( STD_REPLY_FIELD_CALL, call ); + } + + return service_request_reply; +} + + +/******************************************************************************* + * + * PROTECTED METHOD: UpdateCompletionCode + * + ******************************************************************************/ +void CServiceAgentBase::UpdateCompletionCode( CDataRecord *aReply, int aError ) +{ + int completion_code, err, rpc_error_int; + char *rpc_error_string; + + // verify params + assert( aReply != NULL ); + + // a reply can only have it's completion code set once + err = aReply->GetFieldAsInt( "REQUESTCOMPLETIONCODE", &completion_code ); + assert( err == UCCS_OK ); + assert( completion_code == ERR_INVALID_ERROR_CODE ); + + // now update the record + err = aReply->ChangeFieldData( STD_REPLY_FIELD_REQUESTCOMPLETIONCODE, aError ); + assert( err == UCCS_OK ); + err = aReply->ChangeFieldData( STD_REPLY_FIELD_REQUESTCOMPLETIONDESC, GetPenstdErrorString(aError) ); + assert( err == UCCS_OK ); + + // add any custom fields + if( aError == ERR_RPC_ERROR ) { + rpc_error_string = GetLastRPCError( &rpc_error_int ); + aReply->NewField( "RPC_ERROR_STRING", rpc_error_string ); + aReply->NewField( "RPC_ERROR_INT", rpc_error_int ); + } +} + + +/******************************************************************************* + * + * PROTECTED METHOD: GetLastRPCError + * + ******************************************************************************/ +char *CServiceAgentBase::GetLastRPCError( int *aIntError ) +{ + *aIntError = NULL; + return "(unimplemented)"; +} + + +/******************************************************************************* + * + * SECTION: Stub Helpers + * + ******************************************************************************/ + + +/******************************************************************************* + * + * PROTECTED METHOD: GetStringArgument + * + ******************************************************************************/ +int CServiceAgentBase::GetStringArgument( char *aFieldName, char **aOutput, int aParamIndex, int aOptional, CDataRecord *aRequest, CDataRecord *aReply ) +{ + int err; + + // check params + assert( aFieldName != NULL ); + assert( aOutput != NULL ); + + // get the field + err = aRequest->GetFieldAsString( aFieldName, aOutput ); + + // if missing and optional then ok -- DEFAULT IS ALWAYS BE NULL + if( (err != UCCS_OK) && (aOptional != 0) ) { + *aOutput = NULL; + return 0; + } + + // otherwise a missing value is not allowed + if( err != UCCS_OK ) { + aReply->NewField( "MISSINGPARAMINDEX", aParamIndex ); + UpdateCompletionCode( aReply, ERR_MISSING_PARAMETER ); + return -1; + } + + // otherwise return OK + return 0; +} + + +/******************************************************************************* + * + * PROTECTED METHOD: GetIntegerArgument + * + ******************************************************************************/ +int CServiceAgentBase::GetIntegerArgument( char *aFieldName, int *aOutput, int aParamIndex, int aOptional, CDataRecord *aRequest, CDataRecord *aReply ) +{ + int err; + + // check params + assert( aFieldName != NULL ); + assert( aOutput != NULL ); + + // get the field + err = aRequest->GetFieldAsInt( aFieldName, aOutput ); + + // if missing and optional then ok -- DEFAULT MUST ALWAYS BE NULL + if( (err != UCCS_OK) && (aOptional != 0) ) { + *aOutput = NULL; + return 0; + } + + // otherwise a missing value is not allowed + if( err != UCCS_OK ) { + aReply->NewField( "MISSINGPARAMINDEX", aParamIndex ); + UpdateCompletionCode( aReply, ERR_MISSING_PARAMETER ); + return -1; + } + + // otherwise return OK + return 0; +} + +/******************************************************************************* + * + * PROTECTED METHOD: AddIteratedIntegerFieldName + * + ******************************************************************************/ +void CServiceAgentBase::AddIteratedIntegerFieldName( char *aFieldname, int aIndex, int aValue, CDataRecord *aReply ) +{ + int err; + char fieldname[MAXBUFFERSIZE]; + + sprintf( fieldname, "%s_%d", aFieldname, aIndex ); + err = aReply->NewField( fieldname, aValue ); + assert( err == UCCS_OK ); +} + + +/******************************************************************************* + * + * PROTECTED METHOD: AddIteratedStringFieldName + * + ******************************************************************************/ +void CServiceAgentBase::AddIteratedStringFieldName( char *aFieldname, int aIndex, char *aValue, CDataRecord *aReply ) +{ + int err; + char fieldname[MAXBUFFERSIZE]; + + sprintf( fieldname, "%s_%d", aFieldname, aIndex ); + err = aReply->NewField( fieldname, aValue ); + assert( err == UCCS_OK ); +} + + +/******************************************************************************* + * + * PROTECTED METHOD: AddressToInt + * + ******************************************************************************/ +int CServiceAgentBase::AddressToInt( char *aAddress ) +{ + int is_ip, addr; + struct hostent *hostname; + + // see if this is an IP address - if so then convert it and return + is_ip = is_ip_address( aAddress ); + if( is_ip != 0 ) { + return inet_addr(aAddress); + } + + // otherwise try and resolve it as a hostname (must be ipv4) + hostname = gethostbyname( aAddress ); + if( hostname != NULL ) { + if( hostname->h_length == 4 ) { + addr = *((int*)(hostname->h_addr)); + return addr; + } + } + + // if this doesn't work then we just send zero to let if fail + return 0; +} + + +/******************************************************************************* + * + * PROTECTED METHOD: IntToAddress + * + ******************************************************************************/ +char *CServiceAgentBase::IntToAddress( int aAddr ) +{ + int haddr = ntohl(aAddr); + sprintf( iAddressString, "%d.%d.%d.%d", ((haddr>>24)&0x000000FF), + ((haddr>>16)&0x000000FF), + ((haddr>>8)&0x000000FF), + ((haddr>>0)&0x000000FF) ); + return iAddressString; +} + + +/******************************************************************************* + * + * PROTECTED METHOD: XdrFree + * + ******************************************************************************/ +void CServiceAgentBase::XdrFree( char **ptr, int *len ) +{ + XDR x; + + // check params + assert( ptr != NULL ); + assert( *ptr!= NULL ); + assert( len != NULL ); + + // set the operation + x.x_op = XDR_FREE; + + // now call the free function + xdr_bytes( &x, ptr, len, 0xFFFFFFFF ); + + // done + *ptr = NULL; + *len = 0; + return; +} + +