diff -r 000000000000 -r 3da2a79470a7 testtoolsconn/stat/desktop/source/lib/src/statscriptdecoder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/testtoolsconn/stat/desktop/source/lib/src/statscriptdecoder.cpp Mon Mar 08 15:04:18 2010 +0800 @@ -0,0 +1,353 @@ +/* +* 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 "stdafx.h" +#include "statscriptdecoder.h" + +//---------------------------------------------------------------------------- +// Contructor +CSTATScriptCommand::CSTATScriptCommand() +: cCommandID(0), pCommand(NULL), ulLength(0) +{ +} + +//---------------------------------------------------------------------------- +// Destructor +CSTATScriptCommand::~CSTATScriptCommand() +{ + Reset(); +} + + +//---------------------------------------------------------------------------- +// Set command data +bool CSTATScriptCommand::SetData(const char *pData, const unsigned long theLength) +{ + Reset(); + + if (pData && theLength) + { + pCommand = new char[theLength + 1]; + if (!pCommand) + return false; + + memcpy(pCommand, pData, theLength); + *(pCommand + theLength) = (char)0; + ulLength = theLength; + } + + return true; +} + + +//---------------------------------------------------------------------------- +// Destructor +void CSTATScriptCommand::Reset() +{ + if (pCommand) + { + delete [] pCommand; + pCommand = NULL; + } + + ulLength = 0; +} + + + +//////////////////////////////////////////////////////////////////////////////////////// +// Script Decoder class +//////////////////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------- +// Constructor +CSTATScriptDecoder::CSTATScriptDecoder(CSTATLogFile *theLog) +: lFileLength(0), iCounter(0), + lpBuffer(NULL) +{ + pLog = theLog; +} + + +//---------------------------------------------------------------------------- +// Destructor +CSTATScriptDecoder::~CSTATScriptDecoder() +{ + Release(); +} + + +//---------------------------------------------------------------------------- +// Read the script into memory +int +CSTATScriptDecoder::Initialise(const CString& file, bool bIsFile) +{ + lpBuffer = NULL; + int ret = OPEN_SCRIPT_FILE_COMPLETE_FAILURE; + + // read the commands into memory + if (bIsFile) + { + CFile script_file; + if (script_file.Open(file, CFile::modeRead)) + { + ret = ReadFileIntoMemory(script_file); + script_file.Abort(); + } + } + else + ret = ReadDataIntoMemory(file); + + // make sure we have valid start/end points in the script + if (ret == ITS_OK) + ret = ValidateScript(); + + if (ret == ITS_OK) + { + pLog->WriteTimeToLog(); + + if(bIsFile) + { + CString cBuffer = _T("Script file is : "); + cBuffer += file; + pLog->Write(cBuffer); + } + else + pLog->Write(_T("Interpreting command script...")); + + ret = ITS_OK; + } + else + Release(); + + return ret; +} + + +//---------------------------------------------------------------------------- +// Release resources +void CSTATScriptDecoder::Release() +{ + LastCommand.Reset(); + + // release the script + if (lpBuffer && lFileLength) + { + delete [] lpBuffer; + lpBuffer = NULL; + lFileLength = iCounter = 0; + } +} + + +//---------------------------------------------------------------------------- +// get the contents of a single command +int +CSTATScriptDecoder::GetNextCommand(CSTATScriptCommand **ppCommand) +{ + // get to the start of the command + while (lpBuffer[iCounter] != '<') + { + // comment + if (lpBuffer[iCounter] == '/' && lpBuffer[iCounter + 1] == '*') + { + if (ExtractComment()) + { + *ppCommand = &LastCommand; + return LastCommand.cCommandID; + } + + return 0; + } + + if (!IncrementCounter()) + return 0; + } + + // step over the '<' + if (!IncrementCounter()) + return 0; + + // save the command ID + LastCommand.cCommandID = (char)toupper(lpBuffer[iCounter]); + if (!IncrementCounter()) + return 0; + + // need to step over 'image' with '#image' command + if (LastCommand.cCommandID == '#') + { + while (lpBuffer[iCounter] != ' ') + if (!IncrementCounter()) + return 0; + + // step over the space + if (!IncrementCounter()) + return 0; + } + + int iBeginning = iCounter; + + // extract the command + while (lpBuffer[iCounter] != '>') + if (!IncrementCounter()) + return 0; + + // save our command + LastCommand.SetData(lpBuffer + iBeginning, iCounter - iBeginning); + + // step over the '>' + IncrementCounter(); + + // set pointer to the command + *ppCommand = &LastCommand; + return LastCommand.cCommandID; +} + + +//---------------------------------------------------------------------------- +// PRIVATE METHODS +//---------------------------------------------------------------------------- + +//---------------------------------------------------------------------------- +//reads string data into memory so that it can be decoded +int CSTATScriptDecoder::ReadDataIntoMemory(const CString& commands) +{ + // Convert CString to char * + lFileLength = commands.GetLength(); //set length + lpBuffer = new char [lFileLength + 1]; //allocate temporary buffer + if (lpBuffer) + { + if (!pLog->ToAnsi(commands, + lpBuffer, + lFileLength)) + { + return INTERPRET_COMMANDS_FAILURE; //unable to convert to 8-bit + } + + lpBuffer[lFileLength] = 0; + return ITS_OK; + } + + return E_OUTOFMEM; +} +//---------------------------------------------------------------------------- +//reads file data into memory so that it can be decoded +int CSTATScriptDecoder::ReadFileIntoMemory(CFile& scriptdata) +{ + try + { + lFileLength = scriptdata.GetLength(); //file length + lpBuffer = new char [lFileLength + 1]; //allocate temporary buffer + if (lpBuffer) + { + scriptdata.Read(lpBuffer, lFileLength); //read in from the file and store in the buffer + lpBuffer[lFileLength] = 0; + return ITS_OK; + } + } + catch(CFileException *e) + { + e -> Delete(); + return OPEN_SCRIPT_FILE_COMPLETE_FAILURE; + } + + return E_OUTOFMEM; +} + + +//---------------------------------------------------------------------------- +// checks that start and end codes exist in the script +// on success, iCounter will be left ready for the first STAT command +int CSTATScriptDecoder::ValidateScript() +{ + CSTATScriptCommand *pCommand; + bool bFound = false; + + // reset + iCounter = 0; + + // look for end + while (GetNextCommand(&pCommand)) + { + if (pCommand->cCommandID == 'E') + { + bFound = true; + break; + } + } + + if (bFound) + { + // reset + iCounter = 0; + bFound = false; + + // look for begin + while (GetNextCommand(&pCommand)) + { + if (pCommand->cCommandID == 'B') + { + bFound = true; + iCounter -= 3; // step back so this is the first command sent + break; + } + } + } + + if (!bFound) + return BEGIN_COMMAND_FAILURE; + + return ITS_OK; +} + + +//---------------------------------------------------------------------------- +// get a comment +int +CSTATScriptDecoder::ExtractComment() +{ + int iBeginning = iCounter; + + LastCommand.cCommandID = lpBuffer[iCounter]; + iCounter += 2; + + while (((iCounter + 1) < lFileLength) && + !(lpBuffer[iCounter] == '*' && lpBuffer[iCounter + 1] == '/') ) + { + if (!IncrementCounter()) + return 0; + } + + // get the last bit of the comment '*/' + if ((iCounter + 1) < lFileLength) + iCounter += 2; + + // save our comment + LastCommand.SetData(lpBuffer + iBeginning, iCounter - iBeginning); + return LastCommand.cCommandID; +} + + +//---------------------------------------------------------------------------- +// increment counter but make sure we don't go over the end of the script +bool CSTATScriptDecoder::IncrementCounter(void) +{ + return (++iCounter < lFileLength); +}