contextframework/cfw/src/cfcontextsourcesettingsmanager/cfcontextsourcesettingsmanagerimpl.cpp
Rework addition of Symbian splash screen to reduce the source impact (uses SVG from Bug 2414)
Notes: by using the OPTION SOURCEDIR parameter in the mifconv extension instructions, I can
arrange to use the same source file name in sfimage, without having to export over the original
Nokia file. This means that the name inside splashscreen.mbg is the same, which removes the need
for the conditional compilation in SplashScreen.cpp, and gets rid of sf_splashscreen.mmp.
/*
* Copyright (c) 2002-2006 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: CFContextSourceSettingsManagerImpl class implementation.
*
*/
// INCLUDE FILES
#include "cfcontextsourcesettingsmanagerimpl.h"
#include <gmxmldocument.h>
#include <gmxmlelement.h>
#include "cfcontextsourcesettingimpl.h"
#include "cfcontextsourcesettingparameterimpl.h"
#include "cfcontextsourcesettingarrayimpl.h"
#include "cftrace.h"
// CONSTANTS
// Root node name
_LIT( KRootNode, "ContextSourceSettings" );
// MEMBER FUNCTIONS
EXPORT_C CCFContextSourceSettingsManagerImpl* CCFContextSourceSettingsManagerImpl::NewL(
RFs& aFs )
{
FUNC_LOG;
CCFContextSourceSettingsManagerImpl* self =
CCFContextSourceSettingsManagerImpl::NewLC( aFs );
CleanupStack::Pop( self );
return self;
}
EXPORT_C CCFContextSourceSettingsManagerImpl* CCFContextSourceSettingsManagerImpl::NewLC(
RFs& aFs )
{
FUNC_LOG;
CCFContextSourceSettingsManagerImpl* self =
new( ELeave ) CCFContextSourceSettingsManagerImpl( aFs );
CleanupStack::PushL( self );
self->ConstructL();
return self;
}
EXPORT_C CCFContextSourceSettingsManagerImpl::~CCFContextSourceSettingsManagerImpl()
{
FUNC_LOG;
if( iWait )
{
if( iWait->IsStarted() )
{
iWait->AsyncStop();
}
delete iWait;
}
delete iParser;
}
CCFContextSourceSettingsManagerImpl::CCFContextSourceSettingsManagerImpl(
RFs& aFs ):
iFs( aFs )
{
FUNC_LOG;
}
void CCFContextSourceSettingsManagerImpl::ConstructL()
{
FUNC_LOG;
iParser = CMDXMLParser::NewL( this );
iWait = new( ELeave ) CActiveSchedulerWait;
}
// METHODS
//----------------------------------------------------------------------------
// CCFContextSourceSettingsManagerImpl::ParseSettingsL
//----------------------------------------------------------------------------
//
void CCFContextSourceSettingsManagerImpl::ParseSettingsL(
const TDesC& aSettingsFile,
CCFContextSourceSettingArray& aSettings )
{
FUNC_LOG;
INFO_1( "Started parsing context source setting file: %S",
&aSettingsFile );
TIMESTAMP( "Context source setting file parse start" );
TInt err = iParser->ParseFile( iFs, aSettingsFile );
if( err == KErrNone )
{
iSettings =
static_cast<CCFContextSourceSettingArrayImpl*>( &aSettings );
iWait->Start();
}
}
//----------------------------------------------------------------------------
// CCFContextSourceSettingsManagerImpl::ParseSettingsL
//----------------------------------------------------------------------------
//
void CCFContextSourceSettingsManagerImpl::ParseSettingsL( RFile& aSettingsFile,
CCFContextSourceSettingArray& aSettings )
{
FUNC_LOG;
INFO( "Started parsing context source setting file from open file handle" );
TIMESTAMP( "Context source setting file parse start" );
TInt err = iParser->ParseFile( aSettingsFile );
if( err == KErrNone )
{
iSettings =
static_cast<CCFContextSourceSettingArrayImpl*>( &aSettings );
iWait->Start();
}
}
//----------------------------------------------------------------------------
// CCFContextSourceSettingsManagerImpl::ParseFileCompleteL
//----------------------------------------------------------------------------
//
void CCFContextSourceSettingsManagerImpl::ParseFileCompleteL()
{
FUNC_LOG;
TIMESTAMP( "Context source setting file parse stop" );
CMDXMLDocument* document = iParser->DetachXMLDoc();
if( document )
{
CMDXMLElement* documentElement = document->DocumentElement();
if( documentElement )
{
// Get first node
CMDXMLNode* root = documentElement->FirstChild();
if( root )
{
// Check that we have a correct root
if( root->NodeName().CompareF( KRootNode ) == KErrNone )
{
// Start parsing setting blocks
CMDXMLNode* child = root->FirstChild();
while( child )
{
// Parse current child and check if we have more
// settings defined
if( child->NodeType() == CMDXMLNode::EElementNode )
{
CMDXMLElement* element =
static_cast<CMDXMLElement*>( child );
// Trap possible leaves so that we can still
// stop wait
TRAP_IGNORE( ParseSettingBlockL( *element ) );
}
child = child->NextSibling();
}
}
}
}
}
delete document;
// We have completed, stop wait and continue
iWait->AsyncStop();
}
//----------------------------------------------------------------------------
// CCFContextSourceSettingsManagerImpl::ParseSettingBlockL
//----------------------------------------------------------------------------
//
void CCFContextSourceSettingsManagerImpl::ParseSettingBlockL(
CMDXMLElement& aElement )
{
FUNC_LOG;
TPtrC nodeName( aElement.NodeName() );
INFO_1( "Found setting item: [%S]", &nodeName );
// Check that we really have an element
CCFContextSourceSettingImpl* setting =
CCFContextSourceSettingImpl::NewLC();
// Set plug-in name
setting->SetNameL( nodeName );
// Set attributes
ParseAttributesL( aElement, *setting );
// Set parameters
CMDXMLNode* child = aElement.FirstChild();
while( child )
{
// Parse current child and check if we have more
// settings defined
if( child->NodeType() == CMDXMLNode::EElementNode )
{
CMDXMLElement* element =
static_cast<CMDXMLElement*>( child );
ParseParametersL( *element, *setting );
}
child = child->NextSibling();
}
// Save setting
iSettings->AppendItemL( setting );
CleanupStack::Pop( setting );
}
//----------------------------------------------------------------------------
// CCFContextSourceSettingsManagerImpl::ParseAttributesL
//----------------------------------------------------------------------------
//
void CCFContextSourceSettingsManagerImpl::ParseAttributesL(
CMDXMLElement& aElement,
CCFContextSourceSettingImpl& aSetting )
{
FUNC_LOG;
TInt numOfAttributes = aElement.NumAttributes();
TPtrC attributeName( KNullDesC );
TPtrC attributeValue( KNullDesC );
for( TInt i = 0; i < numOfAttributes; i++ )
{
if( aElement.AttributeDetails(
i, attributeName, attributeValue ) == KErrNone )
{
INFO_2( "Found attribute: '%S'='%S'",
&attributeName,
&attributeValue );
CCFKeyValuePair* keyValue = CCFKeyValuePair::NewLC(
attributeName,
attributeValue );
aSetting.AddAttributeL( keyValue );
CleanupStack::Pop( keyValue );
}
}
}
//----------------------------------------------------------------------------
// CCFContextSourceSettingsManagerImpl::ParseParametersL
//----------------------------------------------------------------------------
//
void CCFContextSourceSettingsManagerImpl::ParseParametersL(
CMDXMLElement& aElement,
CCFContextSourceSettingImpl& aSetting )
{
FUNC_LOG;
TPtrC nodeName( aElement.NodeName() );
INFO_1( "Found parameter item: [%S]", &nodeName );
CCFContextSourceSettingParameterImpl* param =
CCFContextSourceSettingParameterImpl::NewLC();
// Set parameter block name
param->SetNameL( nodeName );
// Set attributes for the parameter block
TInt numOfAttributes = aElement.NumAttributes();
TPtrC attributeName( KNullDesC );
TPtrC attributeValue( KNullDesC );
for( TInt i = 0; i < numOfAttributes; i++ )
{
if( aElement.AttributeDetails(
i, attributeName, attributeValue ) == KErrNone )
{
INFO_2( "Found parameter attribute: '%S'='%S'",
&attributeName,
&attributeValue );
CCFKeyValuePair* keyValue = CCFKeyValuePair::NewLC(
attributeName,
attributeValue );
param->AddAttributeL( keyValue );
CleanupStack::Pop( keyValue );
}
}
aSetting.AddParameterL( param );
CleanupStack::Pop( param );
}