testexecmgmt/ucc/RemoteInterface/src/CRemoteInterface.cpp
changeset 0 3da2a79470a7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/testexecmgmt/ucc/RemoteInterface/src/CRemoteInterface.cpp	Mon Mar 08 15:04:18 2010 +0800
@@ -0,0 +1,203 @@
+/*
+* 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: 
+*
+*/
+
+
+
+#include <math.h>
+
+#include "CRemoteInterface.h"
+#include "CTCPTransport.h"
+
+// Constant values
+const char	KSpace[]				= { " " };
+const char	KQuote[]				= { "\"" };
+const char	KEquals[]				= { "=" };
+const char	KRunCmd[]				= { "runcmd" };
+const char	KServiceName[]			= { "svcname" };
+const char	KCall[]					= { "call" };
+const char	KMethodID[]				= { "methodid" };
+const char	KStartServiceID[]		= { "1" };
+const char	KStopServiceID[]		= { "2" };
+const char	KDefaultMethodID[]		= { "10" };
+
+CRemoteInterface::CRemoteInterface( const string &aDestination )
+	: iTransport(NULL), iIsSetup(false), iDestination(aDestination), iConnected(false)
+	{
+	iRandomSeed = rand();
+	}
+
+CRemoteInterface::~CRemoteInterface()
+	{
+	if( iTransport )
+		{
+		iTransport->Disconnect();
+		delete iTransport;
+		iTransport = NULL;
+		iConnected = false;
+		}
+	}
+
+void CRemoteInterface::SetupStartService( const string &aServiceName )
+	{
+	// Setup the default start to the command line
+	DefaultSetupCall( aServiceName, KStartServiceID );
+
+	// The command line is now setup
+	iIsSetup = true;
+	}
+
+void CRemoteInterface::SetupStopService( const string &aServiceName )
+	{
+	// Setup the default start to the command line
+	DefaultSetupCall( aServiceName, KStopServiceID );
+
+	// The command line is now setup
+	iIsSetup = true;
+	}
+
+void CRemoteInterface::SetupCall( const string &aServiceName, const string &aCall )
+	{
+	// Setup the default start to the command line
+	DefaultSetupCall( aServiceName, KDefaultMethodID );
+
+	// Add the call
+	iCommandLine += KCall;
+	iCommandLine += KEquals;
+	iCommandLine += KQuote;
+	iCommandLine += aCall;
+	iCommandLine += KQuote;
+	iCommandLine += KSpace;
+
+	// The command line is now setup
+	iIsSetup = true;
+	}
+
+void CRemoteInterface::AddParam( const string &aName, const string &aValue )
+	{
+	// If the command line is setup append the next parameter
+	if( iIsSetup )
+		{
+		iCommandLine += aName;
+		iCommandLine += KEquals;
+		iCommandLine += KQuote;
+		iCommandLine += aValue;
+		iCommandLine += KQuote;
+		iCommandLine += KSpace;
+		}
+	}
+
+int CRemoteInterface::Send()
+	{
+	int ret = 0;
+
+	if( !iTransport )
+		{
+		iTransport = new CTCPTransport();
+		}
+
+	// If the command line is setup then continue with the send
+	if( iIsSetup && iTransport)
+		{
+		if( !iConnected )
+			{
+			// Connect to the UCC
+			ret = iTransport->Connect( iDestination );
+			iConnected = true;
+			}
+		if( !ret )
+			{
+			if ( iCommandLine.size() > MAXCOMMANDLINELEN )
+				{
+				ret = TRI_COMMANDLINETOOLONG;
+				}
+			else
+				{
+				TRunCommandRequest* run_req = new TRunCommandRequest();
+				if( run_req != NULL )
+					{
+					memset( run_req->iCommandLine, 0x00, sizeof(run_req->iCommandLine) );
+					memcpy( run_req->iCommandLine, iCommandLine.c_str(), iCommandLine.size());
+
+					TPHeader header;
+					header.iCmdID = CMD_REQ_RUNCOMMAND;
+					header.iDataLen = sizeof(*run_req);
+					header.iUid = (int)iRand_UID;
+
+					// Send the header first
+					ret = iTransport->RequestSend( (char*)&header, sizeof(header) );
+					ret?ret=TRI_ERRSENDING:ret=0;
+					if( !ret )
+						{
+						// Now send the rest of the data
+						ret = iTransport->RequestSend( (char*)run_req, sizeof(*run_req) );
+						ret?ret=TRI_ERRSENDING:ret=0;
+						}
+
+					// Cleanup
+					delete run_req;
+					}
+				else
+					{
+					ret = TRI_ERRINTIALISING;
+					}
+				}
+			}
+		if( !ret )
+			{
+			// Retrieve the header
+			TPHeader header;
+			ret = iTransport->RequestReceive( (char*)&header, sizeof(header) );
+
+			if( !ret )
+				{
+				TRunCommandReply run_rep;
+				// Retrieve the result
+				ret = iTransport->RequestReceive( (char*)&run_rep, sizeof(run_rep) );
+				ret?ret=TRI_ERRRECV:ret=run_rep.iResult;
+				}
+			}
+		}
+
+	return ret;
+	}
+
+void CRemoteInterface::DefaultSetupCall( const string &aServiceName, const string &aMethodID )
+	{
+	// New call started so clear out the command line buffer
+	iCommandLine.erase();
+
+	// Add the runcmd
+	iCommandLine += KRunCmd;
+	iCommandLine += KSpace;
+
+	// Add the service name
+	iCommandLine += KServiceName;
+	iCommandLine += KEquals;
+	iCommandLine += KQuote;
+	iCommandLine += aServiceName;
+	iCommandLine += KQuote;
+	iCommandLine += KSpace;
+
+	// Append the methodid to the command line
+	iCommandLine += KSpace;
+	iCommandLine += KMethodID;
+	iCommandLine += KEquals;
+	iCommandLine += KQuote;
+	iCommandLine += aMethodID;
+	iCommandLine += KQuote;
+	iCommandLine += KSpace;
+	}