--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/testexecfw/tef/utils/src/tefscriptutils.cpp Mon Mar 08 15:03:44 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:
+* Implementation for utitity class used for parsing script files
+* Collect details on counts of test steps and test cases in a script file
+*
+*/
+
+
+
+/**
+ @file TEFScriptUtils.cpp
+*/
+
+#include "TEFScriptUtils.h"
+
+/**
+ * CScriptPreProcess(const TDesC aScriptFilePath, TCommandForCounting* aCommandsAndCounts, TInt aStructSize) - Constructor
+ * Overloaded constructor used for collecting the script file path along with the structure array and size for storing count values
+ * @param aScriptFilePath - Path of the script file to be loaded for reading
+ * @param aCommandsAndCounts - Pointer to array of TCommandForCounting structures for collecting counts of commands
+ * @param aStructSize - Integer value representing the size of the structure array passed in
+ */
+CScriptPreProcess::CScriptPreProcess(const TDesC& aScriptFilePath, TPtrC aCommandList[KTEFCommandCountsStructSize])
+: iScriptFilePath(aScriptFilePath), iStructSize(KTEFCommandCountsStructSize), iScriptData(NULL)
+ {
+ for (TInt index=0; index < iStructSize; index++)
+ {
+ iCommandsAndCounts[index].iCommandName.Copy(aCommandList[index]);
+ iCommandsAndCounts[index].iCommandCount = KTEFZeroValue;
+ }
+ }
+
+/**
+ * ~CScriptPreProcess() - Destructor
+ * Deallocates heap allocation if done
+ */
+CScriptPreProcess::~CScriptPreProcess()
+ {
+ if (iScriptData != 0)
+ {
+ delete iScriptData;
+ }
+ }
+
+/**
+ * CountNoOfOccurences()
+ * Member function used for parsing each of the script line
+ * Updates the structure array for any command of interest found during parsing
+ * @return TInt - Return system-wide error codes
+ */
+TInt CScriptPreProcess::CountNoOfOccurences()
+ {
+ // Construct the buffer with contents of script file
+ TRAPD(err,CreateScriptDataFromScriptFileL());
+ if (err != KErrNone)
+ {
+ // Return the error value, if the we fail to retieve the script file contents
+ return err;
+ }
+
+ TBool statusOfWhile=ETrue;
+ while (statusOfWhile)
+ {
+ // Get the individual script line contents until EOF
+ statusOfWhile=GetNextScriptLine();
+
+ // If the script line is available, parse it and update the command counts in the structure array, if any
+ if (statusOfWhile)
+ {
+ UpdateCommandCounts();
+ }
+ }
+ // Return KErrNone if the process is completed safely
+ return KErrNone;
+ }
+
+/**
+ * CreateScriptDataFromScriptFileL()
+ * Funtion used to copy the contents of the script file to a buffer for reading
+ */
+void CScriptPreProcess::CreateScriptDataFromScriptFileL()
+ {
+ // Create a file session and connect
+ RFs fS;
+ User::LeaveIfError(fS.Connect());
+ CleanupClosePushL(fS);
+
+ // Create a file object and try to open the script file for reading
+ RFile scriptFile;
+ User::LeaveIfError(scriptFile.Open(fS,iScriptFilePath,EFileRead | EFileShareAny));
+ CleanupClosePushL(scriptFile);
+
+ // Extract the size of the script file and create a heap buffer to the particular size
+ TInt fileSize;
+ User::LeaveIfError(scriptFile.Size(fileSize));
+
+ // Create a 16bit heap buffer
+ iScriptData = HBufC::NewL(fileSize);
+
+ // Create a 8 bit heap buffer for temporily copying the contents of the script file from the file object
+ HBufC8* narrowData = HBufC8::NewL(fileSize);
+ CleanupStack::PushL(narrowData);
+ TPtr8 narrowPtr=narrowData->Des();
+ // Read the file into an 8bit heap buffer
+ User::LeaveIfError(scriptFile.Read(narrowPtr));
+
+ TPtr widePtr(iScriptData->Des());
+ // Copy it to the 16bit buffer
+ widePtr.Copy(narrowData->Des());
+
+ // Cleanup all heap allocations
+ CleanupStack::PopAndDestroy(narrowData);
+ CleanupStack::Pop(2);
+
+ // Close the file object and file session
+ scriptFile.Close();
+ fS.Close();
+
+ // Set up the instance token parser
+ iScriptLex = iScriptData->Des();
+ }
+
+/**
+ * GetNextScriptLine()
+ * Funtion used to retrieve individual script line and store them to a member buffer for parsing
+ * @return TBool - Returns EFalse if the cursor position reaches end of file. ETrue otherwise
+ */
+TBool CScriptPreProcess::GetNextScriptLine()
+ {
+ // Place the lex marker for the next read
+ while(!iScriptLex.Eos())
+ {
+ // Peek and place the cursor position to the end of line
+ TChar peek = iScriptLex.Peek();
+ if(peek == '\n')
+ {
+ iScriptLex.Inc();
+ break;
+ }
+ else
+ {
+ iScriptLex.Inc();
+ }
+ }
+
+ // Store the current line to a member variable
+ iCurrentScriptLine.Set(iScriptLex.MarkedToken());
+ iScriptLex.Mark();
+ // Replace the remainder of the script contents into the original buffer
+ // This is done to enable retrieving of next line during successive calls to the same function
+ iScriptLex.Assign(iScriptLex.RemainderFromMark());
+
+ // Check for end of file and return status accordingly
+ if(iCurrentScriptLine.Length() || !iScriptLex.Eos())
+ {
+ return ETrue;
+ }
+ else
+ {
+ return EFalse;
+ }
+ }
+
+/**
+ * UpdateCommandCounts()
+ * Funtion used to parse the script line and update the the command struture with incrementing counts within the structure array
+ */
+void CScriptPreProcess::UpdateCommandCounts()
+ {
+ // Copy the current script line contents to a TLex for parsing
+ TLex scriptLine(iCurrentScriptLine);
+
+ // Extract the first token from the current script line lex
+ TPtrC commandName(scriptLine.NextToken());
+
+ // Run through a loop and check if the first token of the current script line
+ // matches the command names provided in the structure array
+ // If it matches any of the commands in array, increment the counter correspondingly
+ for (TInt index=0;index<iStructSize;index++)
+ {
+ if (iCommandsAndCounts[index].iCommandName.CompareF(commandName) == 0)
+ {
+ iCommandsAndCounts[index].iCommandCount++;
+ }
+ }
+ }
+
+/**
+ * RetrieveCount(TInt& aIndex, TDes& aCommandName, TInt& aCommandCount)
+ * Funtion used to retrieve individual command counts from the structure array and store them to reference parameters
+ * @param aIndex - TInt value representing the aray index whose details needs to be fetched
+ * @param aCommandName - Reference to a buffer used to retrieve the command whose count is being updated
+ * @param aCount - Reference to TInt descriptor used to retrieve the counts of the command from script file
+ */
+void CScriptPreProcess::RetrieveValues(TInt& aIndex, TDes& aCommandName, TInt& aCommandCount)
+ {
+ aCommandName.Copy(iCommandsAndCounts[aIndex].iCommandName);
+ aCommandCount = iCommandsAndCounts[aIndex].iCommandCount;
+ }