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) 2006-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: CPSStateSourcePlugIn class implementation.
*
*/
#define __INCLUDE_CAPABILITY_NAMES__
#include <cfcontextinterface.h>
#include <cfcontextsourcesettingarray.h>
#include <e32capability.h>
#include "psstatesourceappstatedomainpskeys.h"
#include "psstatesourceplugin.h"
#include "psstatemapper.h"
#include "psstatemapperint.h"
#include "psstatemappertext.h"
const TUint KLimit = 0xFFFFFFFF;
_LIT (KAttrMapper, "mapper" );
_LIT (KAttrCategory, "category" );
_LIT (KAttrKey, "key" );
_LIT (KAttrCapability, "capability" );
_LIT (KAttrSource, "source" );
_LIT (KAttrType, "type" );
_LIT (KAttrPassThrough, "passthrough" );
_LIT (KValueInt, "int" );
_LIT (KValueText, "text" );
_LIT (KValueTrue, "true" );
_LIT (KTagIntMapping, "IntMapping");
_LIT (KTagTextMapping, "TextMapping");
_LIT (KAttributePSValue, "psvalue");
_LIT (KAttributeContextValue, "contextvalue");
//namespace PSSOURCE
// {
// // Panic category
// _LIT( KPanicCat, "PSStateSrc" );
//
// // Panic codes
// enum TPanicReason
// {
// EInvalidPSKey
// };
//
// // Local panic function
// LOCAL_C void Panic( TInt aCode )
// {
// User::Panic( KPanicCat, aCode );
// }
// }
//
//using namespace PSSOURCE;
CPSStateSourcePlugIn* CPSStateSourcePlugIn::NewL(
TContextSourceInitParams* aParams )
{
CPSStateSourcePlugIn* self = CPSStateSourcePlugIn::NewLC( aParams );
CleanupStack::Pop();
return self;
}
CPSStateSourcePlugIn* CPSStateSourcePlugIn::NewLC(
TContextSourceInitParams* aParams )
{
CPSStateSourcePlugIn* self =
new( ELeave ) CPSStateSourcePlugIn( aParams );
CleanupStack::PushL( self );
return self;
}
// Destructor
CPSStateSourcePlugIn::~CPSStateSourcePlugIn()
{
delete iSettings;
iMappers.ResetAndDestroy();
}
CPSStateSourcePlugIn::CPSStateSourcePlugIn(
TContextSourceInitParams* aParams ):
CCFContextSourcePlugIn( aParams )
{
}
// METHODS
//-----------------------------------------------------------------------------
// CPSStateSourcePlugIn::HandleSettingL
//-----------------------------------------------------------------------------
//
void CPSStateSourcePlugIn::HandleSettingL(
CCFContextSourceSettingArray* aSettingList )
{
iSettings = aSettingList;
for (TInt i = 0; i < iSettings->Count(); i++ )
{
CPSStateMapper* mapper = NULL;
const RKeyValueArray& attributes = iSettings->Item( i ).Attributes();
// Check application and view names (also default values)
for( TInt j = 0; j < attributes.Count(); j++ )
{
TPtrC key( attributes[ j ]->Key() );
TPtrC value( attributes[ j ]->Value() );
if( key.CompareF( KAttrMapper ) == KErrNone )
{
if (value.CompareF( KValueInt) == KErrNone )
{
CPSStateMapperInt* intmapper
= CPSStateMapperInt::NewL( iCF );
mapper = (CPSStateMapper*) intmapper;
}
else if (value.CompareF( KValueText) == KErrNone )
{
CPSStateMapperText* textmapper
= CPSStateMapperText::NewL( iCF );
mapper = (CPSStateMapper*) textmapper;
}
}
}
// Leave from here if PS state mapper is NULL.This may happen if none of the attributes' key value matches with the state mapper
if ( mapper == NULL)
User::LeaveIfError(KErrArgument);
for( TInt j = 0; j < attributes.Count(); j++ )
{
TPtrC key( attributes[ j ]->Key() );
TPtrC value( attributes[ j ]->Value() );
if( key.CompareF( KAttrCategory ) == KErrNone )
{
TUint32 category;
TInt err = ConvertHexToTUint( value, category );
mapper->SetPSCategory(TUid::Uid(category));
}
else if( key.CompareF( KAttrKey ) == KErrNone )
{
TUint32 key;
TInt err = ConvertHexToTUint( value, key );
mapper->SetPSKey(key);
}
else if( key.CompareF( KAttrCapability ) == KErrNone )
{
TSecurityPolicy policy;
ConvertDescToSecurityPolicy( value, policy );
mapper->SetSecurityPolicy( policy );
}
else if( key.CompareF( KAttrSource ) == KErrNone )
{
mapper->SetSourceL(value);
}
else if( key.CompareF( KAttrType ) == KErrNone )
{
mapper->SetTypeL(value);
}
else if( key.CompareF( KAttrPassThrough ) == KErrNone )
{
if (value.CompareF( KValueTrue ) == KErrNone )
{
mapper->SetPassThrough(ETrue);
} else
{
mapper->SetPassThrough(EFalse);
}
}
}
const RSettingParameterArray& parameters
= iSettings->Item( i ).Parameters();
switch (mapper->MapperType())
{
case CPSStateMapper::EPSIntMapper:
{
ParseIntMapperParamsL(*mapper, parameters);
break;
}
case CPSStateMapper::EPSTextMapper:
{
ParseTextMapperParamsL(*mapper, parameters);
break;
}
}
iMappers.AppendL( mapper );
}
}
void CPSStateSourcePlugIn::ParseIntMapperParamsL(CPSStateMapper& aMapper,
const RSettingParameterArray& aParameters)
{
CPSStateMapperInt* intmapper = (CPSStateMapperInt*) &aMapper;
for( TInt j = 0; j < aParameters.Count(); ++j )
{
if ( aParameters[ j ]->Name() != KTagIntMapping )
{
continue;
}
TPtrC psValueDesc( KNullDesC );
TPtrC contextValue( KNullDesC );
const RKeyValueArray& paramAttr = aParameters[ j ]->Attributes();
for( TInt k = 0; k < paramAttr.Count(); ++k )
{
TPtrC key( paramAttr[ k ]->Key() );
TPtrC value( paramAttr[ k ]->Value() );
if( key.CompareF( KAttributePSValue ) == KErrNone )
{
psValueDesc.Set( value );
}
else if( key.CompareF( KAttributeContextValue ) == KErrNone )
{
contextValue.Set( value );
}
}
TInt psValue;
TLex lex( psValueDesc );
lex.Val(psValue);
intmapper->AddMappingL(psValue, contextValue);
}
}
void CPSStateSourcePlugIn::ParseTextMapperParamsL(CPSStateMapper& aMapper,
const RSettingParameterArray& aParameters)
{
CPSStateMapperText* textmapper = (CPSStateMapperText*) &aMapper;
for( TInt j = 0; j < aParameters.Count(); ++j )
{
if ( aParameters[ j ]->Name() != KTagTextMapping )
{
continue;
}
TPtrC psValueDesc( KNullDesC );
TPtrC contextValue( KNullDesC );
const RKeyValueArray& paramAttr = aParameters[ j ]->Attributes();
for( TInt k = 0; k < paramAttr.Count(); ++k )
{
TPtrC key( paramAttr[ k ]->Key() );
TPtrC value( paramAttr[ k ]->Value() );
if( key.CompareF( KAttributePSValue ) == KErrNone )
{
psValueDesc.Set( value );
}
else if( key.CompareF( KAttributeContextValue ) == KErrNone )
{
contextValue.Set( value );
}
}
textmapper->AddMappingL(psValueDesc, contextValue);
}
}
//-----------------------------------------------------------------------------
// CPSStateSourcePlugIn::DefineContextsL
//-----------------------------------------------------------------------------
//
void CPSStateSourcePlugIn::DefineContextsL()
{
for (TInt i = 0; i < iMappers.Count(); i++)
{
iMappers[i]->Define();
}
}
//-----------------------------------------------------------------------------
// CPSStateSourcePlugIn::InitializeL
//-----------------------------------------------------------------------------
//
void CPSStateSourcePlugIn::InitializeL()
{
for (TInt i = 0; i < iMappers.Count(); i++)
{
iMappers[i]->InitializeL();
}
}
//-----------------------------------------------------------------------------
// CPSStateSourcePlugIn::ConvertHexToTUint
//-----------------------------------------------------------------------------
//
TInt CPSStateSourcePlugIn::ConvertHexToTUint( const TDesC& aString,
TUint32& aValue )
{
TInt err = KErrNone;
TLex lex( aString );
// Get rid of '0x'
lex.Inc( 2 );
if( lex.BoundedVal( aValue, EHex, KLimit ) != KErrNone )
{
err = KErrNotFound;
}
return err;
}
//-----------------------------------------------------------------------------
// CPSStateSourcePlugIn::ConvertDescToSecurityPolicy
//-----------------------------------------------------------------------------
//
void CPSStateSourcePlugIn::ConvertDescToSecurityPolicy( const TDesC& aString,
TSecurityPolicy& aSecurityPolicy )
{
TCapability capabilities[7] =
{
ECapability_None,
ECapability_None,
ECapability_None,
ECapability_None,
ECapability_None,
ECapability_None,
ECapability_None
};
TLex lexer( aString );
TInt tokenLength = 0;
TInt i = 0;
do {
lexer.SkipSpace();
lexer.Mark();
lexer.SkipCharacters();
tokenLength = lexer.TokenLength();
if (tokenLength != 0)
{
TPtrC token = lexer.MarkedToken();
if ( i < 7 )
{
capabilities[i++] = ConvertToCapabilityNumber( token );
}
else
{
// TSecurityPolicy can hold maximum of 7 capabilities
// if more are given, we make a security policy
// that always fails.
capabilities[0] = ECapability_Denied;
}
}
}
while( tokenLength != 0 );
TSecurityPolicy policy (
capabilities[0],
capabilities[1],
capabilities[2],
capabilities[3],
capabilities[4],
capabilities[5],
capabilities[6] );
aSecurityPolicy = policy;
}
//-----------------------------------------------------------------------------
// CPSStateSourcePlugIn::ConvertDescToSecurityPolicy
//-----------------------------------------------------------------------------
//
TCapability CPSStateSourcePlugIn::ConvertToCapabilityNumber(
const TDesC& aString )
{
for( TInt i = 0; i < ECapability_Limit; i++ )
{
const TPtrC8 capName8
= TPtrC8( (const unsigned char*) CapabilityNames[i] );
TBuf<20> capName;
capName.Copy( capName8 );
if ( aString.CompareF( capName ) == KErrNone )
{
return (TCapability) i;
}
}
// In the case the capability is not found from the list
// a capability that always fail is returned.
return ECapability_Denied;
}