/*
* Copyright (c) 2008-2010 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: 
* CScrXmlParser - Used to retrieve details from xml files for creating database and 
* Software environment updates.
*
*/


/**
 @file 
 @released
 @internalTechnology
*/

#include "xmlparser.h"
#include "logs.h"
#include "exception.h"
#include "util.h"

#include <xercesc/sax2/XMLReaderFactory.hpp>
#include <xercesc/sax2/DefaultHandler.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/framework/LocalFileInputSource.hpp>
#include <xercesc/util/OutOfMemoryException.hpp>

#include <string>
#include <vector>

#include <memory>
#include <cstdio>

XERCES_CPP_NAMESPACE_USE

// these function pointers are used to call appropriate release methods of XMLString
// present in the xerces library. 
typedef void (*releaseXmlChPtr) (XMLCh** buf);
typedef void (*releaseChPtr) (char** buf);



DllExport CScrXmlParser::CScrXmlParser()
	{}

DllExport CScrXmlParser::~CScrXmlParser()
	{}

/**
	Initializes the xml framework for DOM parsing. Registers an error handler for retrieving
	all errors while xml parsing.
	Retrieves database creation statements from the xml file. The DTD for the same is 
	specified in the xml document.
	
	@param	aDbFile	name of the database file in xml format.

	@return list of database create statements in the form of a vector.
 */

DllExport std::vector<std::string>* CScrXmlParser::ParseDbSchema(const std::string& aDbFile)
	{
	std::vector<std::string>* dbSchema = NULL;
	
	try
		{
		LOGENTER("CScrXmlParser::GetDBSchema()");

		XMLPlatformUtils::Initialize();
		
		std::auto_ptr<xercesc::XercesDOMParser> configFileParser(new XercesDOMParser());

		ConfigDomParser(*configFileParser);
		// set the error handler for the xml parser
		std::auto_ptr<SchemaErrorHandler> errHandler(new SchemaErrorHandler());
		configFileParser->setErrorHandler(errHandler.get());

		fn_auto_ptr<releaseXmlChPtr, XMLCh> tagSQLQuery( &XMLString::release, XMLString::transcode("SQLQuery") );
		fn_auto_ptr<releaseXmlChPtr, XMLCh> dbFileName( &XMLString::release, XMLString::transcode(aDbFile.c_str()) );
		
		dbSchema = new std::vector<std::string>();
			
		LocalFileInputSource dbFile( dbFileName.get() );
		configFileParser->parse(dbFile);
		
		// no need to free this pointer - owned by the parent parser object
		DOMDocument* xmlDoc = configFileParser->getDocument();
		
		// Get the top-level element
		DOMElement* elementRoot = xmlDoc->getDocumentElement();
		
		// Retrieve the nodes for CreateDatabase.
		DOMNodeList* createDbNode = elementRoot->getChildNodes();
		const  XMLSize_t createDbNodeCount = createDbNode->getLength();

		// for each Transaction retrieve all tags
		for( XMLSize_t count = 0; count < createDbNodeCount; ++count )
			{
			DOMNode* currentNode = createDbNode->item(count);
			DOMElement* currentElement = static_cast< xercesc::DOMElement* >( currentNode );
			
			if( XMLString::equals(currentElement->getTagName(), tagSQLQuery.get()))
				{
				fn_auto_ptr<releaseChPtr, char> cleanupText( &XMLString::release, XMLString::transcode( currentElement->getTextContent()) );
				std::string query(cleanupText.get());
				dbSchema->push_back(query);
				}
			
			} // for
		}
	
		catch(XMLException& aXmlException)
			{
			delete dbSchema;
			XMLPlatformUtils::Terminate();
			const XMLCh* msg = aXmlException.getMessage();
			std::string msgStr = XMLString::transcode(msg);
			int errCode = aXmlException.getCode();
			throw CException(msgStr,errCode);
			}
		catch(CException& aXmlException)
			{
			delete dbSchema;
			XMLPlatformUtils::Terminate();
			throw aXmlException;
			}
		
	XMLPlatformUtils::Terminate(); 

	LOGEXIT("CScrXmlParser::GetDBSchema()");
	
	return dbSchema;
	}


/**
	Initializes the xml framework for DOM parsing. Registers an error handler for retrieving
	all errors while xml parsing.

	Retrieves software environment details from the xml file. The DTD for the same is 
	specified in the xml document.
	
	@param	aEnvDetailFile	name of the s/w environment file in xml format.

	@return list of details in the form of a vector.
 */

DllExport std::vector<XmlDetails::TScrEnvironmentDetails>* CScrXmlParser::GetEnvironmentDetails( const std::string aEnvDetailFile )
	{	
	
	std::vector<XmlDetails::TScrEnvironmentDetails>* environmentDetails = NULL;

	try
		{

		LOGENTER("CScrXmlParser::GetEnvironmentDetails()");
		
		XMLPlatformUtils::Initialize();
		
		std::auto_ptr<xercesc::XercesDOMParser> configFileParser(new XercesDOMParser());
		
		ConfigDomParser(*configFileParser);
		// set the error handler for the xml parser
		std::auto_ptr<SchemaErrorHandler> errHandler(new SchemaErrorHandler());
		configFileParser->setErrorHandler(errHandler.get());

		// Tags and attributes used in XML file.
		// Can't call transcode till after Xerces Initialize()
		fn_auto_ptr<releaseXmlChPtr, XMLCh> tagEnvironment( &XMLString::release, XMLString::transcode("Environment") );
		
		environmentDetails = new std::vector<XmlDetails::TScrEnvironmentDetails>();
		
		fn_auto_ptr<releaseXmlChPtr, XMLCh> envFileName( &XMLString::release, XMLString::transcode(aEnvDetailFile.c_str()) );
		LocalFileInputSource envFile( envFileName.get() );
		configFileParser->parse( envFile );
		
		// no need to free this pointer - owned by the parent parser object
		DOMDocument* xmlDoc = configFileParser->getDocument();
		
		// Get the top-level element which is SoftwareEnvironments.
		DOMElement* elementRoot = xmlDoc->getDocumentElement();
		
		// Retrieve the nodes for Environment.
		DOMNodeList* entryNodes = elementRoot->getChildNodes();
		const  XMLSize_t nodeCount = entryNodes->getLength();
		
		// for each Environment retrieve all tags
		for( XMLSize_t xx = 0; xx < nodeCount; ++xx )
			{
			DOMNode* currentNode = entryNodes->item(xx);
			DOMElement* currentElement = static_cast< xercesc::DOMElement* >( currentNode );
			
			// is not null and is an element
			if( XMLString::equals(currentElement->getTagName(), tagEnvironment.get()))
				{
				XmlDetails::TScrEnvironmentDetails scrEnvDetails = GetEnvironmentData(currentElement);
				environmentDetails->push_back(scrEnvDetails);
				}				
			}
		}
		catch(XMLException& aXmlException)
			{
			XMLPlatformUtils::Terminate();
			std::string msgStr = XMLString::transcode(aXmlException.getMessage());
			int errCode = aXmlException.getCode();
			throw CException(msgStr,errCode);
			}
		catch (CException& aXmlException)
			{
			XMLPlatformUtils::Terminate(); 
			delete environmentDetails;
			throw aXmlException;
			}

	XMLPlatformUtils::Terminate(); 

	LOGEXIT("CScrXmlParser::GetEnvironmentDetails()");

	return environmentDetails;
	}


/**
	Retrieves details from the s/w environment xml file. It retrieves details specific
	to the tags as specfied in the DTD which is part of the xml file.
	
	@param	aElement		the current Environment tag being processed.
	@param	aParamDetails	pointer to the vector to be populated with the details.

 */
XmlDetails::TScrEnvironmentDetails CScrXmlParser::GetEnvironmentData( const DOMElement* aEnvironment)
	{
	LOGENTER("CScrXmlParser::GetEnvironmentData()");
	
	XmlDetails::TScrEnvironmentDetails scrEnvDetails;
	
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagSoftwareTypeNames( &XMLString::release, XMLString::transcode("SoftwareTypeNames") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagUniqueSoftwareTypeName( &XMLString::release, XMLString::transcode("UniqueSoftwareTypeName") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagLocalizableSwTypeName( &XMLString::release, XMLString::transcode("LocalizableSoftwareTypeName") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagSifPluginUid( &XMLString::release, XMLString::transcode("SifPluginUid") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagLauncherExecutable( &XMLString::release, XMLString::transcode("LauncherExecutable") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagCustomAcess( &XMLString::release, XMLString::transcode("CustomAcess") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagMIMEDetails( &XMLString::release, XMLString::transcode("MIMEDetails") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagMIMEType( &XMLString::release, XMLString::transcode("MIMEType") );
	
	DOMNodeList* swTypeNames = aEnvironment->getElementsByTagName(tagSoftwareTypeNames.get());
	DOMNode* swTypeNamesRoot	= swTypeNames->item(0);
	DOMElement* swTypeNamesNode = static_cast< xercesc::DOMElement* >( swTypeNamesRoot );
	
	DOMNodeList* uniqueSwTypeName = swTypeNamesNode->getElementsByTagName(tagUniqueSoftwareTypeName.get());
	const XMLCh* textContent = uniqueSwTypeName->item(0)->getTextContent();
	scrEnvDetails.iUniqueSoftwareTypeName = std::wstring(textContent);
	
	DOMNodeList* localizableSwTypeNames = swTypeNamesNode->getElementsByTagName(tagLocalizableSwTypeName.get());
	const  XMLSize_t localizableSwTypeNamesCount = localizableSwTypeNames->getLength();
	for( XMLSize_t count=0 ; count<localizableSwTypeNamesCount ; ++count )
		{
		DOMNode* localizableSwTypeNameRoot = localizableSwTypeNames->item(count);
		DOMElement* localizableSwTypeNameNode = static_cast< xercesc::DOMElement* >( localizableSwTypeNameRoot );
		XmlDetails::TScrEnvironmentDetails::TLocalizedSoftwareTypeName localizedSwTypeName = GetLocalizedSoftwareTypeName(localizableSwTypeNameNode);
		scrEnvDetails.iLocalizedSoftwareTypeNames.push_back(localizedSwTypeName);
		}
	
	DOMNodeList* sifPluginUid = aEnvironment->getElementsByTagName(tagSifPluginUid.get());
	textContent = (sifPluginUid->item(0))->getTextContent();
	fn_auto_ptr<releaseChPtr,char> sifPluginUidText(&XMLString::release, XMLString::transcode(textContent));
	int sifPluginUidValue = 0;
	sscanf(sifPluginUidText.get(),"%x",&sifPluginUidValue);
	scrEnvDetails.iSifPluginUid = sifPluginUidValue;
	
    DOMNodeList* launcherExecutable = aEnvironment->getElementsByTagName(tagLauncherExecutable.get());
    if(0 != launcherExecutable->getLength())
        {
		textContent = launcherExecutable->item(0)->getTextContent();
		fn_auto_ptr<releaseXmlChPtr, XMLCh> launcherExecutableText( &XMLString::release,textContent );
		const XMLCh* launcherExecutableValue = launcherExecutableText.get();
		scrEnvDetails.iLauncherExecutable = launcherExecutableValue;
		}
    DOMNodeList* customAcessList = aEnvironment->getElementsByTagName(tagCustomAcess.get());
	const  XMLSize_t customAcessDataCount = customAcessList->getLength();
	for( XMLSize_t count=0 ; count<customAcessDataCount ; ++count )
		{
		DOMNode* customAcessRoot = customAcessList->item(count);
		DOMElement* customAcessNode = static_cast< xercesc::DOMElement* >( customAcessRoot );
		XmlDetails::TScrEnvironmentDetails::TCustomAcessList customAcessData = GetCustomAcessList(customAcessNode);
		scrEnvDetails.iCustomAcessList.push_back(customAcessData);
		}
	
	DOMNodeList* mimeDetails = aEnvironment->getElementsByTagName(tagMIMEDetails.get());
	DOMNode* mimeDetailRoot	= mimeDetails->item(0);
	DOMElement* mimeDetailNode = static_cast< xercesc::DOMElement* >( mimeDetailRoot );
	DOMNodeList* mimes = mimeDetailNode->getElementsByTagName(tagMIMEType.get());
	const  XMLSize_t mimeCount = mimes->getLength();
	for( XMLSize_t count=0 ; count<mimeCount ; ++count )
		{
		const XMLCh* textContent = mimes->item(count)->getTextContent();
		scrEnvDetails.iMIMEDetails.push_back(textContent);
		}
			
	LOGEXIT("CScrXmlParser::GetEnvironmentData()");
	
	return scrEnvDetails;
	}


XmlDetails::TScrPreProvisionDetail CScrXmlParser::GetPreProvisionDetails( const std::string aPreProvisionFile )	
	{
	XmlDetails::TScrPreProvisionDetail preProvisionDetail;
	try
		{

		LOGENTER("CScrXmlParser::GetPreProvisionDetails()");
		
		XMLPlatformUtils::Initialize();
		
		std::auto_ptr<xercesc::XercesDOMParser> configFileParser(new XercesDOMParser());
		
		ConfigDomParser(*configFileParser);
		// set the error handler for the xml parser
		std::auto_ptr<SchemaErrorHandler> errHandler(new SchemaErrorHandler());
		configFileParser->setErrorHandler(errHandler.get());

		// Tags and attributes used in XML file.
		// Can't call transcode till after Xerces Initialize()
		// root tag
		fn_auto_ptr<releaseXmlChPtr, XMLCh> tagComponent( &XMLString::release, XMLString::transcode("Component") );
		fn_auto_ptr<releaseXmlChPtr, XMLCh> preProvisionFileName( &XMLString::release, XMLString::transcode(aPreProvisionFile.c_str()) );
		
		LocalFileInputSource envFile( preProvisionFileName.get() );
		configFileParser->parse( envFile );
		
		// no need to free this pointer - owned by the parent parser object
		DOMDocument* xmlDoc = configFileParser->getDocument();
		
		// Get the top-level element which is Component.
		DOMElement* elementRoot = xmlDoc->getDocumentElement();
		
		fn_auto_ptr<releaseXmlChPtr, XMLCh> tagSoftwareTypeName( &XMLString::release, XMLString::transcode("SoftwareTypeName") );
	
		DOMNodeList* softwaretype = elementRoot->getElementsByTagName(tagSoftwareTypeName.get());
		const XMLCh* textContent = softwaretype->item(0)->getTextContent();
		preProvisionDetail.iSoftwareTypeName = std::wstring(textContent);
	
		// Retrieve the nodes for Component.
		DOMNodeList* componentNodes = elementRoot->getElementsByTagName(tagComponent.get());
		const  XMLSize_t nodeCount = componentNodes->getLength();
		
		
		// for each Component retrieve all tags
		for( XMLSize_t index = 0; index < nodeCount; ++index )
			{
			DOMNode* currentNode = componentNodes->item(index);
			DOMElement* currentElement = static_cast< xercesc::DOMElement* >( currentNode );
			
			preProvisionDetail.iComponents.push_back(GetPreProvisionData(currentElement));
			}
		}
		catch(XMLException& aXmlException)
			{
			XMLPlatformUtils::Terminate();
			std::string msgStr = XMLString::transcode(aXmlException.getMessage());
			int errCode = aXmlException.getCode();
			throw CException(msgStr,errCode);
			}
		catch (CException& aXmlException)
			{
			XMLPlatformUtils::Terminate(); 
			throw aXmlException;
			}

	XMLPlatformUtils::Terminate(); 

	return preProvisionDetail;
	}

XmlDetails::TScrPreProvisionDetail::TComponent CScrXmlParser::GetPreProvisionData( const DOMElement* aDOMElement)
	{
	LOGENTER("CScrXmlParser::GetPreProvisionData()");
	XmlDetails::TScrPreProvisionDetail::TComponent component;
	
	DOMNodeList* childNodes = aDOMElement->getChildNodes();
	const XMLSize_t nodeCount = childNodes->getLength();
	
	// tags contained in Component
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagComponentLocalizable( &XMLString::release, XMLString::transcode("ComponentLocalizable") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagComponentProperty( &XMLString::release, XMLString::transcode("ComponentProperty") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagComponentFile( &XMLString::release, XMLString::transcode("ComponentFile") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagComponentDetails( &XMLString::release, XMLString::transcode("ComponentDetails") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagComponentDependency( &XMLString::release, XMLString::transcode("ComponentDependency") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagApplicationRegistrationInfo( &XMLString::release, XMLString::transcode("ApplicationRegistrationInfo") );

	XmlDetails::TScrPreProvisionDetail::TComponentDetails componentDetails = GetComponentDetails(aDOMElement);
	component.iComponentDetails = componentDetails;

	// for each ComponentProperty retrieve all tags
	for( XMLSize_t index = 0; index < nodeCount; ++index )
		{
		DOMElement* currentElement = static_cast< xercesc::DOMElement* >( childNodes->item(index) );
		
		// is not null and is an element
		if( XMLString::equals(currentElement->getTagName(), tagComponentLocalizable.get()))
			{
			XmlDetails::TScrPreProvisionDetail::TComponentLocalizable componentLocalizable = GetComponentLocalizable(currentElement);
			component.iComponentLocalizables.push_back(componentLocalizable);
			}
		else if( XMLString::equals(currentElement->getTagName(), tagComponentProperty.get()))
			{
			XmlDetails::TScrPreProvisionDetail::TComponentProperty componentProperty = GetComponentProperty(currentElement);
			component.iComponentProperties.push_back(componentProperty);
			}
		else if( XMLString::equals(currentElement->getTagName(), tagComponentFile.get()))
			{
			XmlDetails::TScrPreProvisionDetail::TComponentFile componentFile = GetComponentFile(currentElement);
			component.iComponentFiles.push_back(componentFile);
			}
		else if( XMLString::equals(currentElement->getTagName(), tagComponentDependency.get()))
			{
			XmlDetails::TScrPreProvisionDetail::TComponentDependency componentDependency = GetComponentDependency(currentElement);
			component.iComponentDependency = componentDependency;
			}
		else if( XMLString::equals(currentElement->getTagName(), tagApplicationRegistrationInfo.get()))
			{
			XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo appRegistrationInfo = GetApplicationRegistrationInfo(currentElement);
			component.iApplicationRegistrationInfo.push_back(appRegistrationInfo);
			}
		}
	LOGEXIT("CScrXmlParser::GetPreProvisionData()");
	return component;
	}

XmlDetails::TScrPreProvisionDetail::TComponentLocalizable CScrXmlParser::GetComponentLocalizable(const DOMElement* aDOMElement)
	{
	LOGENTER("CScrXmlParser::GetComponentLocalizable()");
	// tags in ComponentLocalizable
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagComponentLocalizableLocale( &XMLString::release, XMLString::transcode("ComponentLocalizable_Locale") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagComponentLocalizableName( &XMLString::release, XMLString::transcode("ComponentLocalizable_Name") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagComponentLocalizableVendor( &XMLString::release, XMLString::transcode("ComponentLocalizable_Vendor") );
	
	DOMNodeList* locale = aDOMElement->getElementsByTagName(tagComponentLocalizableLocale.get());
	DOMNodeList* name	= aDOMElement->getElementsByTagName(tagComponentLocalizableName.get());
	DOMNodeList* vendor = aDOMElement->getElementsByTagName(tagComponentLocalizableVendor.get());

	XmlDetails::TScrPreProvisionDetail::TComponentLocalizable componentLocalizable;

	if(locale->getLength() != 0)
		{
		const XMLCh* textLocale = locale->item(0)->getTextContent();
		componentLocalizable.iLocale = Util::WideCharToInteger(textLocale);
		}
	
	const XMLCh* textName = name->item(0)->getTextContent();
	componentLocalizable.iName = textName;

	if(vendor->getLength() != 0)
		{
		const XMLCh* textVendor = vendor->item(0)->getTextContent();
		componentLocalizable.iVendor = textVendor;
		}
	LOGEXIT("CScrXmlParser::GetComponentLocalizable()");
	return componentLocalizable;
	
	}

XmlDetails::TScrPreProvisionDetail::TComponentProperty CScrXmlParser::GetComponentProperty(const DOMElement* aEnvironment)
	{
	LOGENTER("CScrXmlParser::GetComponentProperty()");
	// tags in ComponentProperty
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagComponentPropertyName( &XMLString::release, XMLString::transcode("Name") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagComponentPropertyLocale( &XMLString::release, XMLString::transcode("ComponentProperty_Locale") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagComponentPropertyValue( &XMLString::release, XMLString::transcode("ComponentProperty_Value") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagComponentPropertyIsBinary( &XMLString::release, XMLString::transcode("ComponentProperty_IsBinary") );
		
	// tags of ComponentProperty_Value
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagComponentPropertyIntValue( &XMLString::release, XMLString::transcode("ComponentProperty_IntValue") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagComponentPropertyStrValue( &XMLString::release, XMLString::transcode("ComponentProperty_StrValue") );
	
	// attribute - name
	DOMNamedNodeMap* attributes = aEnvironment->getAttributes();
	DOMNode* name = attributes->getNamedItem(tagComponentPropertyName.get());
		
	DOMNodeList* locale = aEnvironment->getElementsByTagName(tagComponentPropertyLocale.get());
	DOMNodeList* value = aEnvironment->getElementsByTagName(tagComponentPropertyValue.get());
	DOMNodeList* isBinary = aEnvironment->getElementsByTagName(tagComponentPropertyIsBinary.get());
	
	XmlDetails::TScrPreProvisionDetail::TComponentProperty componentProperty;
	
	const XMLCh* textName = name->getTextContent();
	componentProperty.iName	= textName;
	
	if(locale->getLength() != 0)
		{
		const XMLCh* textLocale = locale->item(0)->getTextContent();
		componentProperty.iLocale = Util::WideCharToInteger(textLocale);
		}

	DOMNodeList* childNodes = value->item(0)->getChildNodes();
	const XMLSize_t nodeCount = childNodes->getLength();

	for(int index = 0; index< nodeCount; ++index)
		{
		DOMElement* currentElement = static_cast< xercesc::DOMElement* >( childNodes->item(index) );
		if( XMLString::equals(currentElement->getTagName(), tagComponentPropertyIntValue.get()))
			{
			componentProperty.iIsIntValue = true;
			componentProperty.iValue = currentElement->getTextContent();
			break;
			}
		else if( XMLString::equals(currentElement->getTagName(), tagComponentPropertyStrValue.get()))
			{
			componentProperty.iIsIntValue = false;
			componentProperty.iValue = currentElement->getTextContent();
			break;
			}
		}
		
	if(isBinary->getLength() != 0)
		{
		const XMLCh* textIsBinary = isBinary->item(0)->getTextContent();
		componentProperty.iIsStr8Bit = Util::WideCharToInteger(textIsBinary);		
		}
	LOGEXIT("CScrXmlParser::GetComponentProperty()");
	return componentProperty;
	
	}

XmlDetails::TScrPreProvisionDetail::TComponentFile CScrXmlParser::GetComponentFile( const DOMElement* aDOMElement)
	{
	LOGENTER("CScrXmlParser::GetComponentFile()");
	XmlDetails::TScrPreProvisionDetail::TComponentFile componentFile;
	
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagFileProperty( &XMLString::release, XMLString::transcode("FileProperty") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagLocation( &XMLString::release, XMLString::transcode("Location") );	
	
	DOMNodeList* fileProperties = aDOMElement->getElementsByTagName(tagFileProperty.get());
	const XMLSize_t filePropCount = fileProperties->getLength();

	// for each ComponentFile retrieve all tags
	for( XMLSize_t index = 0; index < filePropCount; ++index )
		{
		DOMElement* currentFileProp = static_cast< xercesc::DOMElement* >( fileProperties->item(index) );
		
		XmlDetails::TScrPreProvisionDetail::TComponentFile::TFileProperty fileProperty = GetFileProperty(currentFileProp);
		componentFile.iFileProperties.push_back(fileProperty);
		}
	
	// attribute - location
	DOMNamedNodeMap* attributes = aDOMElement->getAttributes();
	DOMNode* location = attributes->getNamedItem(tagLocation.get());
	componentFile.iLocation = location->getTextContent();
	LOGEXIT("CScrXmlParser::GetComponentFile()");
	return componentFile;
	}

XmlDetails::TScrPreProvisionDetail::TComponentDependency CScrXmlParser::GetComponentDependency( const XERCES_CPP_NAMESPACE::DOMElement* aDOMElement)
	{
	LOGENTER("CScrXmlParser::GetComponentDependency()");
	XmlDetails::TScrPreProvisionDetail::TComponentDependency componentDependency;
	
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagDepList( &XMLString::release, XMLString::transcode("DependencyList") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagDependentId( &XMLString::release, XMLString::transcode("DependentId") );	
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagSupplierId( &XMLString::release, XMLString::transcode("SupplierId") );	
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagFromVersion( &XMLString::release, XMLString::transcode("FromVersion") );	
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagToVersion( &XMLString::release, XMLString::transcode("ToVersion") );	

	DOMNodeList* depList = aDOMElement->getElementsByTagName(tagDepList.get());
	const XMLSize_t depListCount = depList->getLength();

	// for each ComponentFile retrieve all tags
	for( XMLSize_t index = 0; index < depListCount; ++index )
		{
		XmlDetails::TScrPreProvisionDetail::TComponentDependency::TComponentDependencyDetail componentDependencyDetail;
		DOMElement* currentDepDetail = static_cast< xercesc::DOMElement* >( depList->item(index) );
		
		DOMNodeList* supplierId = currentDepDetail->getElementsByTagName(tagSupplierId.get());
		const XMLCh* textSupplierId = supplierId->item(0)->getTextContent();
		componentDependencyDetail.iSupplierId = std::wstring(textSupplierId);
		
		DOMNodeList* fromVersion = currentDepDetail->getElementsByTagName(tagFromVersion.get());
		const XMLCh* textFromVersion = fromVersion->item(0)->getTextContent();
		componentDependencyDetail.iFromVersion = std::wstring(textFromVersion);

		DOMNodeList* toVersion = currentDepDetail->getElementsByTagName(tagToVersion.get());
		const XMLCh* textToVersion = toVersion->item(0)->getTextContent();
		componentDependencyDetail.iToVersion = std::wstring(textToVersion);

		componentDependency.iComponentDependencyList.push_back(componentDependencyDetail);
		
		}
	
	// attribute - location
	DOMNamedNodeMap* attributes = aDOMElement->getAttributes();
	DOMNode* dependentId = attributes->getNamedItem(tagDependentId.get());
	componentDependency.iDependentId = dependentId->getTextContent();
	LOGEXIT("CScrXmlParser::GetComponentDependency()");
	return componentDependency;
	}

XmlDetails::TScrPreProvisionDetail::TComponentFile::TFileProperty 
	CScrXmlParser::GetFileProperty( const DOMElement* aDOMElement)
	{
	LOGENTER("CScrXmlParser::GetFileProperty()");
	// tag for FileProperty
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagFilePropertyName( &XMLString::release, XMLString::transcode("Name") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagFilePropertyValue( &XMLString::release, XMLString::transcode("FileProperty_Value") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagFilePropertyIsBinary( &XMLString::release, XMLString::transcode("FileProperty_IsBinary") );

	// tags for FileProperty_Value
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagFilePropertyIntValue( &XMLString::release, XMLString::transcode("FileProperty_IntValue") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagFilePropertyStrValue( &XMLString::release, XMLString::transcode("FileProperty_StrValue") );
	
	XmlDetails::TScrPreProvisionDetail::TComponentFile::TFileProperty fileProperty;

	// attribute - name
	DOMNamedNodeMap* attributes = aDOMElement->getAttributes();
	DOMNode* name = attributes->getNamedItem(tagFilePropertyName.get());
		
	DOMNodeList* value = aDOMElement->getElementsByTagName(tagFilePropertyValue.get());
	DOMNodeList* isBinary = aDOMElement->getElementsByTagName(tagFilePropertyIsBinary.get());
	
	const XMLCh* textName = name->getTextContent();
	fileProperty.iName	= textName;
		
	int valueLength = value->getLength();
	if(valueLength != 0)
		{
		for(int valIndex = 0; valIndex< valueLength; ++valIndex)
			{
			DOMElement* currentElement = static_cast< xercesc::DOMElement* >( value->item(valIndex) );
			DOMNodeList* childNodes = currentElement->getChildNodes();
			const XMLSize_t nodeCount = childNodes->getLength();
			for(int index = 0; index< nodeCount; ++index)
				{
				DOMElement* valueElement = static_cast< xercesc::DOMElement* >( childNodes->item(index) );
				if( XMLString::equals(valueElement->getTagName(), tagFilePropertyIntValue.get()))
					{
					fileProperty.iIsIntValue = true;
					fileProperty.iValue = currentElement->getTextContent();
					}
				else if( XMLString::equals(valueElement->getTagName(), tagFilePropertyStrValue.get()))
					{
					fileProperty.iIsIntValue = false;
					fileProperty.iValue = currentElement->getTextContent();
					}
				}
			}
		}
	LOGEXIT("CScrXmlParser::GetFileProperty()");
	return fileProperty;
	}
		
XmlDetails::TScrPreProvisionDetail::TComponentDetails 
	CScrXmlParser::GetComponentDetails( const DOMElement* aDOMElement)
	{
	LOGENTER("CScrXmlParser::GetComponentDetails()");
	// tags for ComponentDetails
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagRomApplication( &XMLString::release, XMLString::transcode("RomApplication") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagRemovable( &XMLString::release, XMLString::transcode("Removable") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagSize( &XMLString::release, XMLString::transcode("Size") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagScomoState( &XMLString::release, XMLString::transcode("ScomoState") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagGlobalId( &XMLString::release, XMLString::transcode("GlobalId") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagVersion( &XMLString::release, XMLString::transcode("Version") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagOriginVerified( &XMLString::release, XMLString::transcode("OriginVerified") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagHidden( &XMLString::release, XMLString::transcode("Hidden") );
	
	XmlDetails::TScrPreProvisionDetail::TComponentDetails componentDetails;
	
	DOMNodeList* romApplication	= aDOMElement->getElementsByTagName(tagRomApplication.get());
	DOMNodeList* removable	= aDOMElement->getElementsByTagName(tagRemovable.get());
	DOMNodeList* size		= aDOMElement->getElementsByTagName(tagSize.get());
	DOMNodeList* scomoState = aDOMElement->getElementsByTagName(tagScomoState.get());
	DOMNodeList* globalId = aDOMElement->getElementsByTagName(tagGlobalId.get());
	DOMNodeList* versionDetail	= aDOMElement->getElementsByTagName(tagVersion.get());
	DOMNodeList* originVerified	= aDOMElement->getElementsByTagName(tagOriginVerified.get());
	DOMNodeList* hidden	= aDOMElement->getElementsByTagName(tagHidden.get());
	
	if( romApplication->getLength() != 0)
		{
		LOGINFO("CScrXmlParser::GetComponentDetails()- rom app");
		const XMLCh* textRomApplication = romApplication->item(0)->getTextContent();
		componentDetails.iIsRomApplication = Util::WideCharToInteger(textRomApplication);
		}

	if( removable->getLength() != 0)
		{
		const XMLCh* textRemovable = removable->item(0)->getTextContent();
		componentDetails.iIsRemovable = Util::WideCharToInteger(textRemovable);
		}
	
	if( size->getLength() != 0)
		{
		const XMLCh* textSize = size->item(0)->getTextContent();
		componentDetails.iSize = Util::WideCharToInteger(textSize);
		}
	
	if( scomoState->getLength() != 0)
		{
		const XMLCh* textScomoState = scomoState->item(0)->getTextContent();
		componentDetails.iScomoState = Util::WideCharToInteger(textScomoState);
		}
	
	if( globalId->getLength() != 0)
		{
		const XMLCh* textGlobalId = globalId->item(0)->getTextContent();
		componentDetails.iGlobalId = textGlobalId;
		}

	if( versionDetail->getLength() != 0)
		{
		// tags for Version
		fn_auto_ptr<releaseXmlChPtr, XMLCh> tagMajor( &XMLString::release, XMLString::transcode("Major") );
		fn_auto_ptr<releaseXmlChPtr, XMLCh> tagMinor( &XMLString::release, XMLString::transcode("Minor") );
		fn_auto_ptr<releaseXmlChPtr, XMLCh> tagBuild( &XMLString::release, XMLString::transcode("Build") );
			
		DOMElement* versionElement = static_cast< xercesc::DOMElement* > (versionDetail->item(0));
		DOMNamedNodeMap* attributes = versionElement->getAttributes();
		DOMNode* major = attributes->getNamedItem(tagMajor.get());
		DOMNode* minor = attributes->getNamedItem(tagMinor.get());
		DOMNode* build = attributes->getNamedItem(tagBuild.get());

		componentDetails.iVersion.iMajor = major->getTextContent();
		componentDetails.iVersion.iMinor = minor->getTextContent();
		componentDetails.iVersion.iBuild = build->getTextContent();
		}
	
	if( originVerified->getLength() != 0)
		{
		const XMLCh* textOriginVerified = originVerified->item(0)->getTextContent();
		componentDetails.iOriginVerified = Util::WideCharToInteger(textOriginVerified);
		}
	
	if( hidden->getLength() != 0)
		{
		const XMLCh* textHidden = hidden->item(0)->getTextContent();
		componentDetails.iIsHidden = Util::WideCharToInteger(textHidden);
		}
	LOGEXIT("CScrXmlParser::GetComponentDetails()");
	return componentDetails;
	}

XmlDetails::TScrEnvironmentDetails::TLocalizedSoftwareTypeName 
	CScrXmlParser::GetLocalizedSoftwareTypeName(const DOMElement* aDOMElement)
	{
	LOGENTER("CScrXmlParser::GetLocalizedSoftwareTypeName()");
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagSwTypeNameLocale( &XMLString::release, XMLString::transcode("Locale") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagSwTypeNameValue( &XMLString::release, XMLString::transcode("Value") );
	
	DOMNamedNodeMap* attributes = aDOMElement->getAttributes();
	DOMNode* locale = attributes->getNamedItem(tagSwTypeNameLocale.get());
	DOMNode* name = attributes->getNamedItem(tagSwTypeNameValue.get());

	XmlDetails::TScrEnvironmentDetails::TLocalizedSoftwareTypeName localizedSwTypeName;

	const XMLCh* textLocale = locale->getTextContent();
	localizedSwTypeName.iLocale = Util::WideCharToInteger(textLocale);
	
	const XMLCh* textName = name->getTextContent();
	localizedSwTypeName.iName = textName;
	LOGEXIT("CScrXmlParser::GetLocalizedSoftwareTypeName()");
	return localizedSwTypeName;
	}

XmlDetails::TScrEnvironmentDetails::TCustomAcessList 
	CScrXmlParser::GetCustomAcessList(const DOMElement* aDOMElement)
	{
	LOGENTER("CScrXmlParser::GetCustomAcessList()");
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagSecureId( &XMLString::release, XMLString::transcode("SecureId") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagAccessMode( &XMLString::release, XMLString::transcode("AccessMode") );
	
	DOMNamedNodeMap* attributes = aDOMElement->getAttributes();
	DOMNode* secureId = attributes->getNamedItem(tagSecureId.get());
	DOMNode* accessMode = attributes->getNamedItem(tagAccessMode.get());
	
	XmlDetails::TScrEnvironmentDetails::TCustomAcessList customAcessList;

	fn_auto_ptr<releaseChPtr,char> textSecureId(&XMLString::release, XMLString::transcode(secureId->getTextContent()));
	int secureIdVal=0;	
	sscanf(textSecureId.get(),"%x",&secureIdVal);
	customAcessList.iSecureId = secureIdVal;
	
	const XMLCh* textAccessMode = accessMode->getTextContent();
	customAcessList.iAccessMode = Util::WideCharToInteger(textAccessMode);
	LOGEXIT("CScrXmlParser::GetCustomAcessList()");
	return customAcessList;
	}

XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo CScrXmlParser::GetApplicationRegistrationInfo(const DOMElement* aDOMElement)
	{
	LOGENTER("CScrXmlParser::GetApplicationRegistrationInfo()");
	// tags in ApplicationRegistrationInfo
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagApplicationRegistrationInfoAppAttribute( &XMLString::release, XMLString::transcode("ApplicationAttribute") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagApplicationRegistrationInfoOpaqueData ( &XMLString::release, XMLString::transcode("OpaqueData") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagApplicationRegistrationInfoFileOwnershipInfo( &XMLString::release, XMLString::transcode("FileOwnershipinfo") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagApplicationRegistrationInfoAppDataType( &XMLString::release, XMLString::transcode("ApplicationDataType") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagApplicationRegistrationInfoAppServiceInfo( &XMLString::release, XMLString::transcode("ApplicationServiceInfo") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagApplicationRegistrationInfoAppLocalizableInfo( &XMLString::release, XMLString::transcode("ApplicationLocalizableInfo") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagApplicationRegistrationInfoAppProperty( &XMLString::release, XMLString::transcode("ApplicationProperty") );

	DOMNodeList* appAttributes = aDOMElement->getElementsByTagName(tagApplicationRegistrationInfoAppAttribute.get());
	const XMLSize_t appAttributeCount = appAttributes->getLength();
	DOMNodeList* OpaqueData	= aDOMElement->getElementsByTagName(tagApplicationRegistrationInfoOpaqueData.get());
	const XMLSize_t OpaqueDataCount = OpaqueData->getLength();
	DOMNodeList* fileOwnershipInfos	= aDOMElement->getElementsByTagName(tagApplicationRegistrationInfoFileOwnershipInfo.get());
	const XMLSize_t fileOwnershipInfoCount = fileOwnershipInfos->getLength();
	DOMNodeList* appServiceInfos = aDOMElement->getElementsByTagName(tagApplicationRegistrationInfoAppServiceInfo.get());
	const XMLSize_t appServiceInfoCount = appServiceInfos->getLength();
	DOMNodeList* appLocalizableInfos	= aDOMElement->getElementsByTagName(tagApplicationRegistrationInfoAppLocalizableInfo.get());
	const XMLSize_t appLocalizableInfoCount = appLocalizableInfos->getLength();
	DOMNodeList* appProperties = aDOMElement->getElementsByTagName(tagApplicationRegistrationInfoAppProperty.get());
	const XMLSize_t appPropertyCount = appProperties->getLength();

	XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo appRegistrationInfo;

	// for each AppAttribute retrieve all tags
	for( XMLSize_t index = 0; index < appAttributeCount; ++index )
		{
		DOMElement* currentappAttribute = static_cast< xercesc::DOMElement* >( appAttributes->item(index) );
		
		XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TAppAttribute appAttribute = GetAppAttribute(currentappAttribute);
		appRegistrationInfo.iApplicationAttribute.push_back(appAttribute);
		}

	// for each OpaqueData retrieve all tags
	for( XMLSize_t index = 0; index < OpaqueDataCount; ++index )
		{
		DOMElement* currentOpaqueData = static_cast< xercesc::DOMElement* >( OpaqueData->item(index) );
		
		XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TAppProperty appProperty;
		XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TOpaqueDataType opaqueDataType = GetOpaqueDataType(currentOpaqueData);

		appProperty.iLocale = opaqueDataType.iLocale;
		appProperty.iName = L"OpaqueData";
		appProperty.iIntValue = 0;
		appProperty.iIsStr8Bit = true;
		appProperty.iServiceUid = 0;
		appProperty.iStrValue = opaqueDataType.iOpaqueData;
		
		appRegistrationInfo.iApplicationProperty.push_back(appProperty);
		}

	// for each FileOwnershipInfo retrieve all tags
	for( XMLSize_t index = 0; index < fileOwnershipInfoCount; ++index )
		{
		DOMElement* currentFileOwnershipInfo = static_cast< xercesc::DOMElement* >( fileOwnershipInfos->item(index) );

		std::wstring file = GetFileOwnershipInfo(currentFileOwnershipInfo);

		appRegistrationInfo.iFileOwnershipInfo.push_back(file);
		}

	// for each appServiceInfo retrieve all tags
	for( XMLSize_t index = 0; index < appServiceInfoCount; ++index )
		{
		DOMElement* currentappServiceInfo = static_cast< xercesc::DOMElement* >( appServiceInfos->item(index) );
		
		XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TAppServiceInfo appServiceInfo = GetAppServiceInfo(currentappServiceInfo, appRegistrationInfo);
		appRegistrationInfo.iApplicationServiceInfo.push_back(appServiceInfo);
		}

	// for each appLocalizableInfo retrieve all tags
	for( XMLSize_t index = 0; index < appLocalizableInfoCount; ++index )
		{
		DOMElement* currentAppLocalizableInfo = static_cast< xercesc::DOMElement* >( appLocalizableInfos->item(index) );
		
		XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TAppLocalizableInfo appLocalizableInfo = GetAppLocalizableInfo(currentAppLocalizableInfo);
		appRegistrationInfo.iApplicationLocalizableInfo.push_back(appLocalizableInfo);
		}

	// for each AppProperty retrieve all tags
	for( XMLSize_t index = 0; index < appPropertyCount; ++index )
		{
		DOMElement* currentAppProperty = static_cast< xercesc::DOMElement* >( appProperties->item(index) );
		
		XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TAppProperty appProperty = GetAppProperty(currentAppProperty);
		appRegistrationInfo.iApplicationProperty.push_back(appProperty);
		}
	LOGEXIT("CScrXmlParser::GetApplicationRegistrationInfo()");
	return appRegistrationInfo;
	}

XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TAppAttribute 
	CScrXmlParser::GetAppAttribute( const DOMElement* aDOMElement)
	{
	LOGENTER("CScrXmlParser::GetAppAttribute()");
	// tags in AppAttribute
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagAppAttributeName( &XMLString::release, XMLString::transcode("Name") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagAppAttributeValue( &XMLString::release, XMLString::transcode("ApplicationAttribute_Value") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagAppAttributeIsBinary( &XMLString::release, XMLString::transcode("ApplicationAttribute_IsBinary") );
		
	// tags of ComponentProperty_Value
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagApplicationAttributeIntValue( &XMLString::release, XMLString::transcode("ApplicationAttribute_IntValue") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagApplicationAttributeStrValue( &XMLString::release, XMLString::transcode("ApplicationAttribute_StrValue") );
	
	// attribute - name
	DOMNamedNodeMap* attributes = aDOMElement->getAttributes();
	DOMNode* name = attributes->getNamedItem(tagAppAttributeName.get());
		
	DOMNodeList* value = aDOMElement->getElementsByTagName(tagAppAttributeValue.get());
	DOMNodeList* isBinary = aDOMElement->getElementsByTagName(tagAppAttributeIsBinary.get());
	
	XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TAppAttribute appAttribute;
	
	const XMLCh* textName = name->getTextContent();
	appAttribute.iName	= textName;
	
	DOMNodeList* childNodes = value->item(0)->getChildNodes();
	const XMLSize_t nodeCount = childNodes->getLength();

	for(int index = 0; index< nodeCount; ++index)
		{
		DOMElement* currentElement = static_cast< xercesc::DOMElement* >( childNodes->item(index) );
		if( XMLString::equals(currentElement->getTagName(), tagApplicationAttributeIntValue.get()))
			{
			appAttribute.iIsIntValue = true;
			appAttribute.iValue = currentElement->getTextContent();
			break;
			}
		else if( XMLString::equals(currentElement->getTagName(), tagApplicationAttributeStrValue.get()))
			{
			appAttribute.iIsIntValue = false;
			appAttribute.iValue = currentElement->getTextContent();
			break;
			}
		}
		
	if(isBinary->getLength() != 0)
		{
		const XMLCh* textIsBinary = isBinary->item(0)->getTextContent();
		appAttribute.iIsStr8Bit = Util::WideCharToInteger(textIsBinary);		
		}
	LOGEXIT("CScrXmlParser::GetAppAttribute()");
	return appAttribute;
	}

std::wstring CScrXmlParser::GetFileOwnershipInfo( const DOMElement* aDOMElement)
	{
	LOGENTER("CScrXmlParser::GetFileOwnershipInfo()");
	// tags in FileOwnershipInfo 
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagFileName( &XMLString::release, XMLString::transcode("FileName") );

	DOMNodeList* fileName = aDOMElement->getElementsByTagName(tagFileName.get());
	
	std::wstring file;

	if( fileName->getLength() != 0)
		{
		const XMLCh* fil = fileName->item(0)->getTextContent();
		file = fil;
		}

	LOGEXIT("CScrXmlParser::GetFileOwnershipInfo()");
	return file;
	}

XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TDataType 
	CScrXmlParser::GetDataType( const DOMElement* aDOMElement)
	{
	LOGENTER("CScrXmlParser::GetDataType()");
	// tags in DataType 
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagDataTypePriority( &XMLString::release, XMLString::transcode("Priority") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagDataType( &XMLString::release, XMLString::transcode("Type") );

	DOMNodeList* priority = aDOMElement->getElementsByTagName(tagDataTypePriority.get());
	DOMNodeList* type = aDOMElement->getElementsByTagName(tagDataType.get());
	
	XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TDataType dataType;

	if( priority->getLength() != 0)
		{
		const XMLCh* pri = priority->item(0)->getTextContent();
		dataType.iPriority = Util::WideCharToInteger(pri);
		}

	if( type->getLength() != 0)
		{
		const XMLCh* typ = type->item(0)->getTextContent();
		dataType.iType = typ;
		}
	LOGEXIT("CScrXmlParser::GetDataType()");
	return dataType;
	}

XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TOpaqueDataType 
	CScrXmlParser::GetOpaqueDataType( const DOMElement* aDOMElement)
	{
	LOGENTER("CScrXmlParser::GetOpaqueDataType()");
	// tags in OpaqueDataType 
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagData( &XMLString::release, XMLString::transcode("Data") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagOpaqueLocale( &XMLString::release, XMLString::transcode("OpaqueLocale") );

	DOMNodeList* Data = aDOMElement->getElementsByTagName(tagData.get());
	DOMNodeList* OpaqueLocale = aDOMElement->getElementsByTagName(tagOpaqueLocale.get());
	
	XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TOpaqueDataType opaqueDataType;

	if( OpaqueLocale->getLength() != 0)
		{
		const XMLCh* pri = OpaqueLocale->item(0)->getTextContent();
		opaqueDataType.iLocale = Util::WideCharToInteger(pri);
		}

	if( Data->getLength() != 0)
		{
		const XMLCh* typ = Data->item(0)->getTextContent();
		opaqueDataType.iOpaqueData = typ;
		}
	LOGEXIT("CScrXmlParser::GetOpaqueDataType()");
	return opaqueDataType;
	}

XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TOpaqueDataType 
	CScrXmlParser::GetServiceOpaqueDataType( const DOMElement* aDOMElement)
	{
	LOGENTER("CScrXmlParser::GetServiceOpaqueDataType()");
	// tags in OpaqueDataType 
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagServiceData( &XMLString::release, XMLString::transcode("ServiceData") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagServiceOpaqueLocale( &XMLString::release, XMLString::transcode("ServiceOpaqueLocale") );

	DOMNodeList* ServiceData = aDOMElement->getElementsByTagName(tagServiceData.get());
	DOMNodeList* ServiceOpaqueLocale = aDOMElement->getElementsByTagName(tagServiceOpaqueLocale.get());
	
	XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TOpaqueDataType opaqueDataType;

	if( ServiceOpaqueLocale->getLength() != 0)
		{
		const XMLCh* pri = ServiceOpaqueLocale->item(0)->getTextContent();
		opaqueDataType.iLocale = Util::WideCharToInteger(pri);
		}

	if( ServiceData->getLength() != 0)
		{
		const XMLCh* typ = ServiceData->item(0)->getTextContent();
		opaqueDataType.iOpaqueData = typ;
		}
	LOGEXIT("CScrXmlParser::GetServiceOpaqueDataType()");
	return opaqueDataType;
	}

XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TAppServiceInfo 
	CScrXmlParser::GetAppServiceInfo( const DOMElement* aDOMElement, XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo& aAppRegistrationInfo )
	{
	LOGENTER("CScrXmlParser::GetAppServiceInfo()");
	// tags in AppServiceInfo
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagAppServiceInfoUid( &XMLString::release, XMLString::transcode("Uid") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagAppServiceAppProperty( &XMLString::release, XMLString::transcode("ServiceOpaqueData") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagAppServiceInfoDataType( &XMLString::release, XMLString::transcode("ApplicationDataType") );

	DOMNodeList* uid = aDOMElement->getElementsByTagName(tagAppServiceInfoUid.get());

	DOMNodeList* ServiceOpaqueData = aDOMElement->getElementsByTagName(tagAppServiceAppProperty.get());
	const XMLSize_t ServiceOpaqueDataCount = ServiceOpaqueData->getLength();
	
	DOMNodeList* dataTypes = aDOMElement->getElementsByTagName(tagAppServiceInfoDataType.get());
	const XMLSize_t dataTypeCount = dataTypes->getLength();

	XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TAppServiceInfo appServiceInfo;

	if( uid->getLength() != 0)
		{
		const XMLCh* priority = uid->item(0)->getTextContent();
		appServiceInfo.iUid = Util::WideCharToInteger(priority);
		}

	// for each OpaqueData retrieve all tags
	for( XMLSize_t index = 0; index < ServiceOpaqueDataCount; ++index )
		{
		DOMElement* currentOpaqueData = static_cast< xercesc::DOMElement* >( ServiceOpaqueData->item(index) );
		
		XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TAppProperty appProperty;
		XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TOpaqueDataType opaqueDataType = GetServiceOpaqueDataType(currentOpaqueData);

		appProperty.iLocale = opaqueDataType.iLocale;
		appProperty.iName = L"OpaqueData";
		appProperty.iIntValue = 0;
		appProperty.iIsStr8Bit = true;
		appProperty.iServiceUid = appServiceInfo.iUid;
		appProperty.iStrValue = opaqueDataType.iOpaqueData;
		
		aAppRegistrationInfo.iApplicationProperty.push_back(appProperty);
		}

	// for each DataType retrieve all tags
	for( XMLSize_t index = 0; index < dataTypeCount; ++index )
		{
		DOMElement* currentDataType = static_cast< xercesc::DOMElement* >( dataTypes->item(index) );
		
		XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TDataType dataType = GetDataType(currentDataType);
		appServiceInfo.iDataType.push_back(dataType);
		}
	LOGEXIT("CScrXmlParser::GetAppServiceInfo()");
	return appServiceInfo;

	}

XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TAppLocalizableInfo 
	CScrXmlParser::GetAppLocalizableInfo( const DOMElement* aDOMElement)
	{
	LOGENTER("CScrXmlParser::GetAppLocalizableInfo()");
	// tags in AppLocalizableInfo  
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagAppLocalizableInfoAttribute( &XMLString::release, XMLString::transcode("LocalizableAttribute") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagAppLocalizableInfoViewData ( &XMLString::release, XMLString::transcode("ViewData") );
	
	DOMNodeList* localizableAttributes = aDOMElement->getElementsByTagName(tagAppLocalizableInfoAttribute.get());
	const XMLSize_t attributeCount = localizableAttributes->getLength();
	DOMNodeList* viewData = aDOMElement->getElementsByTagName(tagAppLocalizableInfoViewData.get());
	const XMLSize_t viewDataCount = viewData->getLength();

	XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TAppLocalizableInfo appLocalizableInfo;

	LOGINFO("for each AppLocalizableInfoAttribute retrieve all tags");
	// for each AppLocalizableInfoAttribute retrieve all tags
	for( XMLSize_t index = 0; index < attributeCount; ++index )
		{
		DOMElement* currentLocalizableAttribute = static_cast< xercesc::DOMElement* >( localizableAttributes->item(index) );
		XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TAppLocalizableInfo::TLocalizableAttribute appLocalizableAttribute = GetAppLocalizableAttribute(currentLocalizableAttribute);
		appLocalizableInfo.iLocalizableAttribute.push_back(appLocalizableAttribute);
		}

	LOGINFO("for each AppLocalizableViewData retrieve all tags");
	// for each AppLocalizableViewData retrieve all tags
	
	for( XMLSize_t index = 0; index < viewDataCount; ++index )
		{
		DOMElement* currentLocalizableViewData = static_cast< xercesc::DOMElement* >( viewData->item(index) );
		XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TAppLocalizableInfo::TViewData appLocalizableViewData = GetAppLocalizableViewData(currentLocalizableViewData);
		LOGINFO("push_back viewdata");
		appLocalizableInfo.iViewData.push_back(appLocalizableViewData);
		}

	LOGEXIT("CScrXmlParser::GetAppLocalizableInfo()");
	return appLocalizableInfo;
	}

XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TAppLocalizableInfo::TLocalizableAttribute 
	CScrXmlParser::GetAppLocalizableAttribute( const DOMElement* aDOMElement)
	{
	LOGENTER("CScrXmlParser::GetAppLocalizableAttribute()");
	// tags in AppLocalizableInfo  
	// tags in AppLocalizableInfoAttribute
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagAppLocalizableInfoAttributeName( &XMLString::release, XMLString::transcode("Name") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagAppLocalizableInfoAttributeValue( &XMLString::release, XMLString::transcode("LocalizableAttribute_Value") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagAppLocalizableInfoAttributeIsBinary( &XMLString::release, XMLString::transcode("LocalizableAttribute_IsBinary") );
		
	// tags of AppLocalizableInfoAttribute_Value
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagAppLocalizableInfoAttributeIntValue( &XMLString::release, XMLString::transcode("LocalizableAttribute_IntValue") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagAppLocalizableInfoAttributeStrValue( &XMLString::release, XMLString::transcode("LocalizableAttribute_StrValue") );
	
	LOGINFO("attribute - name");
	// attribute - name
	DOMNamedNodeMap* attributes = aDOMElement->getAttributes();
	DOMNode* name = attributes->getNamedItem(tagAppLocalizableInfoAttributeName.get());
		
	DOMNodeList* value = aDOMElement->getElementsByTagName(tagAppLocalizableInfoAttributeValue.get());
	DOMNodeList* isBinary = aDOMElement->getElementsByTagName(tagAppLocalizableInfoAttributeIsBinary.get());
	
	XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TAppLocalizableInfo::TLocalizableAttribute appLocalizableAttribute;
	
	LOGINFO("name->getTextContent");
	const XMLCh* textName = name->getTextContent();
	appLocalizableAttribute.iName = textName;
	
	DOMNodeList* childNodes = value->item(0)->getChildNodes();
	const XMLSize_t nodeCount = childNodes->getLength();

	for(int index = 0; index< nodeCount; ++index)
		{
		DOMElement* currentElement = static_cast< xercesc::DOMElement* >( childNodes->item(index) );
		if( XMLString::equals(currentElement->getTagName(), tagAppLocalizableInfoAttributeIntValue.get()))
			{
			appLocalizableAttribute.iIsIntValue = true;
			appLocalizableAttribute.iValue = currentElement->getTextContent();
			break;
			}
		else if( XMLString::equals(currentElement->getTagName(), tagAppLocalizableInfoAttributeStrValue.get()))
			{
			appLocalizableAttribute.iIsIntValue = false;
			appLocalizableAttribute.iValue = currentElement->getTextContent();
			break;
			}
		}
		
	if(isBinary->getLength() != 0)
		{
		const XMLCh* textIsBinary = isBinary->item(0)->getTextContent();
		appLocalizableAttribute.iIsStr8Bit = Util::WideCharToInteger(textIsBinary);		
		}

	LOGEXIT("CScrXmlParser::GetAppLocalizableAttribute()");
	return appLocalizableAttribute;
	}


XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TAppLocalizableInfo::TViewData 
	CScrXmlParser::GetAppLocalizableViewData( const DOMElement* aDOMElement)
	{
	LOGENTER("CScrXmlParser::GetAppLocalizableViewData()");
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagAppLocalizableInfoViewDataAttribute ( &XMLString::release, XMLString::transcode("ViewDataAttribute") );

	DOMNodeList* viewDataAttr = aDOMElement->getElementsByTagName(tagAppLocalizableInfoViewDataAttribute.get());
	const XMLSize_t viewDataAttrCount = viewDataAttr->getLength();
	
	XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TAppLocalizableInfo::TViewData appViewData;

	for( XMLSize_t index = 0; index < viewDataAttrCount; ++index )
	{
		DOMElement* currentLocalizableViewData = static_cast< xercesc::DOMElement* >( viewDataAttr->item(index) );
		XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TAppLocalizableInfo::TViewData::TViewDataAttributes appLocalizableViewData = GetAppLocalizableViewDataAttributes(currentLocalizableViewData);
		LOGINFO("push_back viewdata");
		appViewData.iViewDataAttributes.push_back(appLocalizableViewData);
	}
	LOGEXIT("CScrXmlParser::GetAppLocalizableViewData()");
	return appViewData;
	}

XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TAppLocalizableInfo::TViewData::TViewDataAttributes 
	CScrXmlParser::GetAppLocalizableViewDataAttributes( const DOMElement* aDOMElement)
	{
	LOGENTER("CScrXmlParser::GetAppLocalizableViewDataAttributes()");
	// tags in AppLocalizableViewData
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagAppLocalizableViewDataName( &XMLString::release, XMLString::transcode("Name") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagAppLocalizableViewDataValue( &XMLString::release, XMLString::transcode("ViewData_Value") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagAppLocalizableViewDataIsBinary( &XMLString::release, XMLString::transcode("ViewData_IsBinary") );
		
	// tags of AppLocalizableViewData_Value
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagAppLocalizableViewDataIntValue( &XMLString::release, XMLString::transcode("ViewData_IntValue") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagAppLocalizableViewDataStrValue( &XMLString::release, XMLString::transcode("ViewData_StrValue") );
		
	LOGINFO("attribute - name");
	// attribute - name
	DOMNamedNodeMap* attributes = aDOMElement->getAttributes();
	DOMNode* name = attributes->getNamedItem(tagAppLocalizableViewDataName.get());
		
	DOMNodeList* value = aDOMElement->getElementsByTagName(tagAppLocalizableViewDataValue.get());
	DOMNodeList* isBinary = aDOMElement->getElementsByTagName(tagAppLocalizableViewDataIsBinary.get());
	
	XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TAppLocalizableInfo::TViewData::TViewDataAttributes appLocalizableViewDataAttribute;
	
	LOGINFO("name->getTextContent");
	const XMLCh* textName = name->getTextContent();
	LOGINFO("assign name");
	appLocalizableViewDataAttribute.iName = textName;

	LOGINFO("getChildNodes()");
	DOMNodeList* childNodes = value->item(0)->getChildNodes();
	LOGINFO("childNodes->getLength()");
	const XMLSize_t nodeCount = childNodes->getLength();

	for(int index = 0; index< nodeCount; ++index)
		{
		DOMElement* currentElement = static_cast< xercesc::DOMElement* >( childNodes->item(index) );
		if( XMLString::equals(currentElement->getTagName(), tagAppLocalizableViewDataIntValue.get()))
			{
			LOGINFO("int value");
			appLocalizableViewDataAttribute.iIsIntValue = true;
			appLocalizableViewDataAttribute.iValue = currentElement->getTextContent();
			break;
			}
		else if( XMLString::equals(currentElement->getTagName(), tagAppLocalizableViewDataStrValue.get()))
			{
			LOGINFO("str value");
			appLocalizableViewDataAttribute.iIsIntValue = false;
			appLocalizableViewDataAttribute.iValue = currentElement->getTextContent();
			break;
			}
		}
		
	if(isBinary->getLength() != 0)
		{
		LOGINFO("bin value");
		const XMLCh* textIsBinary = isBinary->item(0)->getTextContent();
		appLocalizableViewDataAttribute.iIsStr8Bit = Util::WideCharToInteger(textIsBinary);		
		}
	LOGEXIT("CScrXmlParser::GetAppLocalizableViewDataAttributes()");
	return appLocalizableViewDataAttribute;
	}


XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TAppProperty 
	CScrXmlParser::GetAppProperty( const DOMElement* aDOMElement)
	{
	LOGENTER("CScrXmlParser::GetAppProperty()");
	// tags in AppProperty
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagAppPropertyLocale( &XMLString::release, XMLString::transcode("Locale") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagAppPropertyName( &XMLString::release, XMLString::transcode("Name") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagAppPropertyIntValue( &XMLString::release, XMLString::transcode("IntValue") );
	fn_auto_ptr<releaseXmlChPtr, XMLCh> tagAppPropertyStrValue( &XMLString::release, XMLString::transcode("StrValue") );

	DOMNodeList* locale = aDOMElement->getElementsByTagName(tagAppPropertyLocale.get());
	DOMNodeList* name = aDOMElement->getElementsByTagName(tagAppPropertyName.get());
	DOMNodeList* intvalue = aDOMElement->getElementsByTagName(tagAppPropertyIntValue.get());
	DOMNodeList* strvalue = aDOMElement->getElementsByTagName(tagAppPropertyStrValue.get());
	
	XmlDetails::TScrPreProvisionDetail::TApplicationRegistrationInfo::TAppProperty appProperty;

	if( locale->getLength() != 0)
		{
		const XMLCh* loc = locale->item(0)->getTextContent();
		appProperty.iLocale = Util::WideCharToInteger(loc);
		}

	if( name->getLength() != 0)
		{
		const XMLCh* nam = name->item(0)->getTextContent();
		appProperty.iName = nam;
		}
	
	if( intvalue->getLength() != 0)
		{
		const XMLCh* intval = intvalue->item(0)->getTextContent();
		appProperty.iIntValue = Util::WideCharToInteger(intval);
		}

	if( strvalue->getLength() != 0)
		{
		const XMLCh* strval = strvalue->item(0)->getTextContent();
		appProperty.iStrValue = strval;
		}
	LOGEXIT("CScrXmlParser::GetAppProperty()");
	return appProperty;
	}

void CScrXmlParser::ConfigDomParser(xercesc::XercesDOMParser& aDomParser)
	{
	aDomParser.setValidationScheme( XercesDOMParser::Val_Always );
	aDomParser.setValidationSchemaFullChecking(true);
	}

/**
 * Handles all warnings received while xml parsing. 
 */
void SchemaErrorHandler::warning (const SAXParseException &exc)
	{
	std::string msg( XMLString::transcode(exc.getMessage()) );
	LOGWARN(msg);
	throw CException(msg,ExceptionCodes::EWarning);
	}

/**
 * Handles all errors received while xml parsing. 
 */
void SchemaErrorHandler::error (const SAXParseException &exc)
	{
	std::string msg( XMLString::transcode(exc.getMessage()) );
	resetErrors();
	LOGERROR(msg);
	throw CException(msg, ExceptionCodes::EParseError);
	}

/**
 * Handles all fatal errors received while xml parsing. 
 */
void SchemaErrorHandler::fatalError (const SAXParseException &exc)
	{
	std::string msg( XMLString::transcode(exc.getMessage()) );
	resetErrors();
	LOGERROR(msg);
	throw CException(msg,ExceptionCodes::EFatalError);
	}

/**
 * Called if an error occurs while reintializing the current xml handler. 
 */
void SchemaErrorHandler::resetErrors ()
	{
	std::string msg( "Resetting error handler object" );
	LOGINFO(msg);
	}
