/*
* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "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:
* Class for processing parameter-file.
* @internalComponent
* @released
*
*/
#include "parameterfileprocessor.h"
/**
Constructor of CParameterFileProcessor class
@param aParamFileName parameter-file name
@internalComponent
@released
*/
CParameterFileProcessor::CParameterFileProcessor(const string& aParamFileName):
iParamFileName(aParamFileName),iNoOfArguments(0),
iParamFileArgs(NULL)
{
}
/**
Function to open parameter-file
@internalComponent
@released
@return True/False depending on the status of parameter-file open statement.
*/
bool CParameterFileProcessor::OpenFile()
{
iParamFile.open(iParamFileName.data(),ios_base::binary);
if (iParamFile.is_open())
return true;
else
{
cout<<"Error: Couldn't open parameter-file for reading:"<<iParamFileName.c_str()<<"\n";
return false;
}
}
/**
Function to parse the parameter-file
@internalComponent
@released
@return True/False depending on the status of parameter-file parsing.
*/
bool CParameterFileProcessor::ParameterFileProcessor()
{
if(OpenFile())
{
while(!iParamFile.eof())
{
// Read the parameter-file line by line.
string line;
getline(iParamFile,line);
// Read the line till the occurence of character ';' or EOL.
unsigned int pos = line.find_first_of(";\r\n");
if (pos != string::npos)
line = line.substr(0,pos);
// Split the line if multiple parameters are provided
// in a single line.
if(!SplitLine(line))
return false;
}
if (SetNoOfArguments() == false)
{
return false;
}
SetParameters();
// Close parameter-file
CloseFile();
return true;
}
else
return false;
}
/**
Function to split line of paramfile-file
@param aLine parameter-file line
@internalComponent
@released
@return True/False depending on the status of spliting.
*/
bool CParameterFileProcessor::SplitLine(string& aLine)
{
unsigned int startPos=0;
unsigned int endPos=0;
// Segregate parameters based on white-space or tabs.
startPos= aLine.find_first_not_of(" \t",endPos);
while(startPos != string::npos)
{
endPos= aLine.find_first_of(" \t",startPos);
string paramStr= aLine.substr(startPos,endPos-startPos);
unsigned int position= aLine.find_first_of("\"",startPos);
// If the parameter contains double quotes('"') then also include the spaces(if provided)
// within the quotes.
if((position!=string::npos) && position<=endPos)
{
endPos= aLine.find_first_of("\"",position+1);
if(endPos!= string::npos)
{
endPos= aLine.find_first_of(" \t",endPos+1);
if(endPos != string::npos)
{
paramStr= aLine.substr(startPos,endPos-startPos);
}
// Remove '"' from parameter
for(unsigned int count =0;count<paramStr.size();count++)
{
if (paramStr.at(count) == '"')
{
paramStr.erase(count,count+1);
}
}
}
// Generate error message if enclosing quotes are not found.
else
{
cout<<"Error while parsing parameter-file"<<iParamFileName.c_str()<<". Closing \"\"\" not found\n";
return false;
}
}
iParameters.push_back(paramStr);
startPos= aLine.find_first_not_of(" \t",endPos);
}
return true;
}
/**
Function to set number of parameters read.
@return false if no parameters are specified in parameter-file, else true
@internalComponent
@released
*/
bool CParameterFileProcessor::SetNoOfArguments()
{
unsigned int noOfArguements = iParameters.size();
if (!noOfArguements)
{
cout<<"Warning: No parameters specified in paramer-file:"<<iParamFileName.data()<<"\n";
return false;
}
iNoOfArguments = noOfArguements+1;
return true;
}
/**
Function to set the value of parameters read in the
form of 2D char array.
@internalComponent
@released
*/
void CParameterFileProcessor::SetParameters()
{
// Store the parameters read in a 2D array of characters
unsigned int paramSize = iParameters.size();
iParamFileArgs=new char*[paramSize+1];
for (unsigned int count=1; count<=paramSize; count++)
{
string param = iParameters.at(count-1);
*(iParamFileArgs+count) = new char[param.size()+1];
strcpy(*(iParamFileArgs+count),param.c_str());
}
}
/**
Function to close parameter-file
@internalComponent
@released
*/
void CParameterFileProcessor::CloseFile()
{
iParamFile.close();
}
/**
Function to return number of parameters read from parameter-file
@internalComponent
@released
@return iNoOfArguments - Number of parameters read from parameter-file
*/
unsigned int CParameterFileProcessor::GetNoOfArguments() const
{
return iNoOfArguments;
}
/**
Function to return parameters read from parameter-file
@internalComponent
@released
@return iParamFileArgs - Parameters read from parameter-file
*/
char** CParameterFileProcessor::GetParameters() const
{
return iParamFileArgs;
}
/**
Destructor of CParameterFileProcessor class
@internalComponent
@released
*/
CParameterFileProcessor::~CParameterFileProcessor()
{
for (unsigned int count=1;count<iNoOfArguments;count++)
delete[] *(iParamFileArgs+count);
}