contextframework/cfwplugins/PSStateSourcePlugIn/src/psstatesourceplugin.cpp
changeset 0 2e3d3ce01487
child 18 0818dd463d41
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contextframework/cfwplugins/PSStateSourcePlugIn/src/psstatesourceplugin.cpp	Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,421 @@
+/*
+* 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;
+	}
+