contextframework/cfwplugins/ApplicationStateSourcePlugIn/src/ApplicationStateSourcePlugin.cpp
changeset 0 2e3d3ce01487
child 1 0fdb7f6b0309
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contextframework/cfwplugins/ApplicationStateSourcePlugIn/src/ApplicationStateSourcePlugin.cpp	Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,747 @@
+/*
+* Copyright (c) 2002-2009 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:  ?Description
+*
+*/
+
+
+// INCLUDE FILES
+#include <cfcontextinterface.h>
+#include <cfcontextsourcesetting.h>
+#include <cfcontextsourcesettingarray.h>
+#include <cfcontextsourcesettingparameter.h>
+#include <cfkeyvaluepair.h>
+#include <centralrepository.h>
+#include <apgwgnam.h>
+#include <applicationorientation.h>
+#include <aknappui.h>
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <vwsdefpartner.h>
+#endif
+
+#include "ApplicationStateSourcePlugin.h"
+#include "ApplicationStateSourceContextDef.h"
+#include "ContextFrameworkPrivateCRKeys.h"
+#include "trace.h"
+
+// CONSTANTS
+
+#ifdef _DEBUG
+// Panic codes
+enum TPanicCode
+    {
+    EInvalidUid,
+    EInvalidAttribute
+    };
+#endif
+
+_LIT( KDefaultApplicationName,  "DefaultAppName" );
+_LIT( KDefaultViewName,         "DefaultViewName" );
+_LIT( KAttributeAppUid,         "AppUid" );
+_LIT( KAttributeAppName,        "AppName" );
+_LIT( KTagView,                 "View" );
+_LIT( KAttributeUid,            "Uid" );
+_LIT( KAttributeName,           "Name" );
+
+const TUint KLimit = 0xFFFFFFFF;
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CApplicationStateSourcePlugIn::CApplicationStateSourcePlugIn
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CApplicationStateSourcePlugIn::CApplicationStateSourcePlugIn( TContextSourceInitParams* aParams ):
+    CCFContextSourcePlugIn( aParams ),
+    iDefStateSetManyTimes( 0 )
+    {
+    FUNC_LOG;
+    }
+
+// -----------------------------------------------------------------------------
+// CApplicationStateSourcePlugIn::ConstructL
+// Symbian second-phase constructor that may leave.
+// -----------------------------------------------------------------------------
+//
+void CApplicationStateSourcePlugIn::ConstructL()
+    {
+    FUNC_LOG;
+
+    iDefaultAppName = KApplicationStateDefaultValue().AllocL();
+    iDefaultViewName = KApplicationStateDefaultValue().AllocL();
+    iContext = CCFContextObject::NewL();
+    }
+
+// -----------------------------------------------------------------------------
+// CApplicationStateSourcePlugIn::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CApplicationStateSourcePlugIn* CApplicationStateSourcePlugIn::NewL(
+    TContextSourceInitParams* aParams )
+    {
+    FUNC_LOG;
+
+    CApplicationStateSourcePlugIn* self = CApplicationStateSourcePlugIn::NewLC(
+        aParams );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CApplicationStateSourcePlugIn::NewLC
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CApplicationStateSourcePlugIn* CApplicationStateSourcePlugIn::NewLC(
+    TContextSourceInitParams* aParams )
+    {
+    FUNC_LOG;
+
+    CApplicationStateSourcePlugIn* self = new( ELeave ) CApplicationStateSourcePlugIn(
+        aParams );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+// Destructor
+CApplicationStateSourcePlugIn::~CApplicationStateSourcePlugIn()
+    {
+    FUNC_LOG;
+
+    if( iCRAppOrientationListener )
+        {
+        iCRAppOrientationListener->StopListening();
+        delete iCRAppOrientationListener;
+        }
+    iUidOrientationList.Close();    
+    delete iCRAppOrientation;
+    iApplicationSettings.ResetAndDestroy();
+    delete iSettings;
+    delete iVws;
+    delete iDefaultViewName;
+    delete iDefaultAppName;
+    delete iApplDefaultState;
+    delete iContext;
+    }
+
+// -----------------------------------------------------------------------------
+// CApplicationStateSourcePlugIn::HandleSettingL
+// -----------------------------------------------------------------------------
+//
+void CApplicationStateSourcePlugIn::HandleSettingL(
+    CCFContextSourceSettingArray* aSettingList )
+    {
+    FUNC_LOG;
+
+    // Take ownership from settings
+    iSettings = aSettingList;
+    }
+
+// -----------------------------------------------------------------------------
+// CApplicationStateSourcePlugIn::DefineContextsL
+// -----------------------------------------------------------------------------
+//
+void CApplicationStateSourcePlugIn::DefineContextsL()
+    {
+    FUNC_LOG;
+
+    // Define contexts here
+    _LIT_SECURITY_POLICY_C2(
+        appStatePolicy, ECapabilitySwEvent, ECapabilityUserEnvironment );
+
+    TInt err = iCF.DefineContext( KApplicationStateSource,
+       KApplicationStateForegroundApplicationType,
+       appStatePolicy );
+    User::LeaveIfError( err );
+    
+    err = iCF.DefineContext( KApplicationStateSource,
+       KApplicationStateForegroundApplicationViewType,
+       appStatePolicy );
+    User::LeaveIfError( err );
+
+    err = iCF.DefineContext( KApplicationStateSource,
+       KApplicationStateBackgroundApplicationType,
+       appStatePolicy );
+    User::LeaveIfError( err );
+    
+    err = iCF.DefineContext( KApplicationStateSource,
+        KFgApplicationOrientation,
+        KFgApplicationOrientationSec );
+    User::LeaveIfError( err );
+    }
+
+// -----------------------------------------------------------------------------
+// CApplicationStateSourcePlugIn::InitializeL
+// -----------------------------------------------------------------------------
+//
+void CApplicationStateSourcePlugIn::InitializeL()
+    {
+    FUNC_LOG;
+
+    iContext->SetSourceL( KApplicationStateSource );
+
+    // Get default app orientation
+    CRepository* cenRep = CRepository::NewL( KCRUidCFApplDefaultState );
+    TInt err = cenRep->Get( KApplDefaultState, iDefaultFgAppOrientation );
+    if( err != KErrNone )
+        {
+        ERROR( err, "Failed to get default fg app orientation" );
+        iDefaultFgAppOrientation = 0;
+        }
+    delete cenRep;
+    cenRep = NULL;
+
+    // Create KCRUidDefaultAppOrientation repository for default app orientation
+    iCRAppOrientation = CRepository::NewL( KCRUidDefaultAppOrientation ); 
+    
+    // Create KCRUidDefaultAppOrientation repository listener
+    iCRAppOrientationListener = CCenRepNotifyHandler::NewL(
+        *this, *iCRAppOrientation );
+    iCRAppOrientationListener->StartListeningL();
+        
+    if( iSettings )
+        {
+        InitializeApplicationsFromXMLL();
+        InitializeFgApplicationL();
+
+        // Free memory allocated for settings since we don't need them anymore
+        delete iSettings;
+        iSettings = NULL;
+        }
+
+    iVws = CVwsSessionWrapper::NewL( *this );
+    iVws->NotifyNextActivation();
+    }
+
+// -----------------------------------------------------------------------------
+// CApplicationStateSourcePlugIn::InitializeApplicationsFromXMLL
+// -----------------------------------------------------------------------------
+//
+void CApplicationStateSourcePlugIn::InitializeApplicationsFromXMLL()
+    {
+    FUNC_LOG;
+
+     for( TInt i = 0; i < iSettings->Count(); ++i )
+        {
+        // Check attributes
+        TBool defaultValueDefinitions = EFalse;
+        TPtrC appUid( KNullDesC );
+        TPtrC appName( KNullDesC );
+        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( KAttributeAppUid ) == KErrNone )
+                {
+                appUid.Set( value );
+                }
+            else if( key.CompareF( KAttributeAppName ) == KErrNone )
+                {
+                appName.Set( value );
+                }
+            else if( key.CompareF( KDefaultApplicationName ) == KErrNone )
+                {
+                delete iDefaultAppName;
+                iDefaultAppName = NULL;
+                iDefaultAppName = value.AllocL();
+                defaultValueDefinitions = ETrue;
+                }
+            else if( key.CompareF( KDefaultViewName ) == KErrNone )
+                {
+                delete iDefaultViewName;
+                iDefaultViewName = NULL;
+                iDefaultViewName = value.AllocL();
+                defaultValueDefinitions = ETrue;
+                }
+            }
+
+        if ( defaultValueDefinitions )
+            {
+            continue; // Default value definitions contain only attributes.
+            }
+
+        if ( appUid.Length() == 0 || appName.Length() == 0 )
+            {
+            ERROR_GEN( "Either AppUid or AppName tag (or both) not found, skipping" );
+            continue; // Skip this definition.
+            }
+
+        TUint32 uid = 0;
+        TInt err = ConvertToHex( appUid, uid );
+        if( err != KErrNone )
+            {
+            ERROR_1( err, "Invalid uid [%S] for an application, skipping", &appUid );
+            continue; // Skip this definition.
+            }
+
+        // below:                                  CLEANUP<< appStateSettings
+        CCFApplicationStateSettings* appStateSettings
+            = CCFApplicationStateSettings::NewLC( TUid::Uid( uid ), appName );
+
+        // Check parameters
+        const RSettingParameterArray& parameters = iSettings->Item( i ).Parameters();
+        for( TInt j = 0; j < parameters.Count(); ++j )
+            {
+            if ( parameters[ j ]->Name() != KTagView )
+                {
+                continue; // At the moment, handle only view tags
+                }
+
+            TPtrC viewUid( KNullDesC );
+            TPtrC viewName( KNullDesC );
+            const RKeyValueArray& paramAttr = parameters[ j ]->Attributes();
+            for( TInt k = 0; k < paramAttr.Count(); ++k )
+                {
+                TPtrC key( paramAttr[ k ]->Key() );
+                TPtrC value( paramAttr[ k ]->Value() );
+
+                // Check view uid
+                if( key.CompareF( KAttributeUid ) == KErrNone )
+                    {
+                    viewUid.Set( value );
+                    }
+                // Check view name
+                else if( key.CompareF( KAttributeName ) == KErrNone )
+                    {
+                    viewName.Set( value );
+                    }
+                }
+
+            if ( viewUid.Length() == 0 || viewName.Length() == 0 )
+                {
+                ERROR_GEN( "Either View's Uid or Name tag (or both) not found, skipping" );
+                continue; // Skip this definition.
+                }
+
+            uid = 0;
+            TInt err = ConvertToHex( viewUid, uid );
+            if( err != KErrNone )
+                {
+                ERROR_1( err, "Invalid view uid [%S], skipping", &viewUid );
+                continue; // Skip this definition.
+                }
+
+            // below:                              CLEANUP<< viewUidName
+            CCFUidNamePair* viewUidName
+                = CCFUidNamePair::NewLC( TUid::Uid( uid ), viewName );
+            appStateSettings->AddViewSettingsL( viewUidName );
+            CleanupStack::Pop( viewUidName );   // CLEANUP>> viewUidName
+            }
+
+        iApplicationSettings.AppendL( appStateSettings );
+        CleanupStack::Pop( appStateSettings );  // CLEANUP>> appStateSettings
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CApplicationStateSourcePlugIn::HandleViewEventL
+// Maps view activations to contexts.
+// -----------------------------------------------------------------------------
+//
+void CApplicationStateSourcePlugIn::HandleViewEventL(
+    const TVwsViewEvent& aEvent )
+    {
+    FUNC_LOG;
+
+    // Renew listening
+    iVws->NotifyNextActivation();
+
+    // Handle the view server event
+    DoHandleViewEventL( aEvent );
+
+    // Log event members!
+    INFO_1( "HandleViewEventL: eventType: [%d]", aEvent.iEventType );
+    
+    INFO_2( "HandleViewEventL: viewOne [appUid:%S] [viewUid%S]",
+        &(const TDesC&)aEvent.iViewOneId.iAppUid.Name(),
+        &(const TDesC&)aEvent.iViewOneId.iViewUid.Name() );
+    
+    INFO_2( "HandleViewEventL: viewTwo [appUid:%S] [viewUid%S]",
+        &(const TDesC&)aEvent.iViewTwoId.iAppUid.Name(),
+        &(const TDesC&)aEvent.iViewTwoId.iViewUid.Name() );
+    }
+
+//------------------------------------------------------------------------------
+// CApplicationStateSourcePlugIn::HandleNotifyGeneric
+//------------------------------------------------------------------------------
+//
+void CApplicationStateSourcePlugIn::HandleNotifyGeneric( TUint32 aId )
+    {
+    FUNC_LOG;
+
+    // Get the new value from cenrep
+    TInt val = 0;
+    TInt err = iCRAppOrientation->Get( aId, val );
+    if( err == KErrNone )
+        {
+        // New value found, check if the element is found from cache
+        TInt index = FindByUid( TUid::Uid( aId ) );
+        if( index != KErrNotFound )
+            {
+            // Update cache element
+            TUidOrientationPair& pair = iUidOrientationList[index];
+            pair.iOrientation = val;
+            INFO_2( "Updated cache uid: [0x%x] to orientation: [%d]", pair.iUid.iUid, val );
+            }
+        else
+            {
+            // Add new cache element
+            TUidOrientationPair pair( TUid::Uid( aId ), val );
+            err = iUidOrientationList.Append( pair );
+            if( err == KErrNone )
+                {
+                INFO_2( "Added cache uid: [0x%x], orientation: [%d]", pair.iUid.iUid, val );
+                }
+            else
+                {
+                ERROR_1( err, "Failed to add cache uid: [0x%x]", pair.iUid.iUid );
+                }
+            }
+        }
+    else
+        {
+        ERROR_1( err, "Failed to get new value from CR key: [0x%x]", aId );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CApplicationStateSourcePlugIn::DoHandleViewEventL
+// Maps view activations to contexts.
+// -----------------------------------------------------------------------------
+//
+void CApplicationStateSourcePlugIn::DoHandleViewEventL(
+    const TVwsViewEvent& aEvent )
+    {
+    FUNC_LOG;
+
+    TPtrC bgApp( *iDefaultAppName );
+    TPtrC fgApp( *iDefaultAppName );
+    TPtrC fgView( *iDefaultViewName );
+    TBool bgFound( EFalse );
+    TBool fgFound( EFalse );
+
+    if ( aEvent.iViewTwoId.iAppUid == TUid::Null() )
+        {
+        // Previous foreground application was closed, get the stored name for
+        // background application's name.
+        bgFound = ETrue;
+        bgApp.Set( iPreviousForegroundApplication );
+        }
+
+    for ( TInt i = 0; i < iApplicationSettings.Count(); ++i )
+        {
+        CCFApplicationStateSettings* appSettings = iApplicationSettings[ i ];
+        if ( !fgFound && aEvent.iViewOneId.iAppUid == appSettings->Uid() )
+            {
+            fgApp.Set( appSettings->Name() );
+            appSettings->GetViewName( aEvent.iViewOneId.iViewUid, fgView );
+            fgFound = ETrue;
+            }
+        if ( !bgFound && aEvent.iViewTwoId.iAppUid == appSettings->Uid() )
+            {
+            bgApp.Set( appSettings->Name() );
+            bgFound = ETrue;
+            }
+        if ( bgFound && fgFound )
+            {
+            break;
+            }
+        }
+
+    TBool publishFgApp( EFalse );
+    TBool publishFgView( EFalse );
+    TBool publishBgApp( EFalse );
+
+    if ( iPreviousForegroundApplication.Compare( fgApp ) != 0 )
+        {
+        publishFgApp = ETrue;
+        }
+    else if ( iPreviousForegroundView.Compare( fgView ) != 0 )
+        {
+        publishFgView = ETrue;
+        }
+
+    if ( bgApp != fgApp )
+        {
+        publishBgApp = ETrue;
+        }
+
+    iPreviousForegroundApplication.Set( fgApp ); // Store for next round
+    iPreviousForegroundView.Set( fgView );
+
+    // Publish foreground application and view contexts.
+    RThread thread;
+
+    if ( publishFgApp )
+        {
+        iContext->SetTypeL( KApplicationStateForegroundApplicationType );
+        iContext->SetValueL( fgApp );
+        iCF.PublishContext( *iContext, thread );
+        }
+
+    if ( publishFgApp || publishFgView )
+        {
+        iContext->SetTypeL( KApplicationStateForegroundApplicationViewType );
+        iContext->SetValueL( fgView );
+        iCF.PublishContext( *iContext, thread );
+        }
+
+    if ( publishBgApp )
+        {
+        iContext->SetTypeL( KApplicationStateBackgroundApplicationType );
+        iContext->SetValueL( bgApp );
+        iCF.PublishContext( *iContext, thread );
+        }
+    
+    // Publish foreground application orientation context
+    TPtrC fgAppOrientation( ResolveFgAppOrientation( aEvent.iViewOneId.iAppUid ) );
+    if( fgAppOrientation.Length() )
+        {
+        // Fg app found
+        if( fgAppOrientation.Compare( iPreviousOrientation ) != KErrNone )
+            {
+            // Update for next round
+            iPreviousOrientation.Set( fgAppOrientation );
+            
+            // Fg app orientation changed, publish new context
+            iContext->SetTypeL( KFgApplicationOrientation );
+            iContext->SetValueL( fgAppOrientation );
+            iCF.PublishContext( *iContext, thread );
+            }
+        }
+
+    thread.Close();
+    }
+
+//------------------------------------------------------------------------------
+// CApplicationStateSourcePlugIn::ResolveFgAppOrientation
+//------------------------------------------------------------------------------
+//
+TPtrC CApplicationStateSourcePlugIn::ResolveFgAppOrientation(
+    const TUid& aUid )
+    {
+    FUNC_LOG;
+    
+    TPtrC fgAppOrientation( KNullDesC );
+    TInt val = 0;
+    
+    // Check cache first
+    TInt index = FindByUid( aUid );
+    if( index != KErrNotFound )
+        {
+        // App found from cache
+        val = iUidOrientationList[index].iOrientation;
+        }
+    else
+        {
+        // Get the SID from cenrep and update cache
+        TInt err = iCRAppOrientation->Get( aUid.iUid, val );
+        if( err != KErrNone )
+            {
+            INFO_1( "Application uid: [0x%x] not found, using default orientation",
+                aUid.iUid );
+            val = iDefaultFgAppOrientation;
+            }
+        
+        // Update cache
+        TUidOrientationPair pair( aUid, val );
+        err = iUidOrientationList.Append( pair );
+        if( err != KErrNone )
+            {
+            ERROR_2( err, "Failed to add uid: [0x%x], orientation: [%d] pair in cache",
+                aUid.iUid, val );
+            }
+        }
+    
+    // Resolve context value
+    if( val == CAknAppUiBase::EAppOrientationPortrait )
+        {
+        // Portrait
+        fgAppOrientation.Set( TPtrC(
+            KFgApplicationOrientationVal[EFgApplicationOrientationPortrait] ) );
+        }
+    else if( val == CAknAppUiBase::EAppOrientationLandscape )
+        {
+        // Landscape
+        fgAppOrientation.Set( TPtrC(
+            KFgApplicationOrientationVal[EFgApplicationOrientationLandscape] ) );
+        }
+    else
+        {
+        // Automatic
+        fgAppOrientation.Set( TPtrC(
+            KFgApplicationOrientationVal[EFgApplicationOrientationAutomatic] ) );
+        }
+    
+    return fgAppOrientation;
+    }
+
+// -----------------------------------------------------------------------------
+// CApplicationStateSourcePlugIn::InitializeFgApplicationL
+// -----------------------------------------------------------------------------
+//
+void CApplicationStateSourcePlugIn::InitializeFgApplicationL()
+    {
+    FUNC_LOG;
+
+    RWsSession wsSession;
+    User::LeaveIfError( wsSession.Connect() );
+    CleanupClosePushL( wsSession );
+    TUid appUid( TUid::Null() );
+
+    TInt focScr( wsSession.GetFocusScreen() );
+    TInt focWndGrp( wsSession.GetFocusWindowGroup() );
+    TInt wndGrpPrio( wsSession.GetWindowGroupOrdinalPriority( focWndGrp ) );
+    
+    INFO_1( "CApplicationStateSourcePlugIn::focScr     = [%d]", focScr );
+    INFO_1( "CApplicationStateSourcePlugIn::focWndGrp  = [%d]", focWndGrp );
+    INFO_1( "CApplicationStateSourcePlugIn::wndGrpPrio = [%d]", wndGrpPrio );
+
+    CApaWindowGroupName* wndGrpName = CApaWindowGroupName::NewL( wsSession );
+    CleanupStack::PushL( wndGrpName );
+
+    wndGrpName->ConstructFromWgIdL( focWndGrp );
+
+    TPtrC appCaption = wndGrpName->Caption();
+    TPtrC appName = wndGrpName->AppUid().Name();
+
+    // if focScr == 0 it's not CoverUi
+    // if focScr != 0 it's CoverUi
+
+    // if wndGrpPrio == 0 it's S60 application
+
+    if ( ( focScr != 0 ) || ( ( focScr == 0 ) && ( wndGrpPrio == 0 ) ) )
+        {
+        INFO( "CApplicationStateSourcePlugIn::It's CoverUi or S60 application" );
+        // It is CoverUi
+        // or
+        // It is Not CoverUi and it is S60 application
+
+        appUid = wndGrpName->AppUid();
+        INFO_1( "appUid = [0x%x]", appUid.iUid );
+        }
+    else
+        {
+        // Default values will still be published
+        TUid tmpAppUid( TUid::Null() );
+        tmpAppUid = wndGrpName->AppUid();
+
+        INFO( "CApplicationStateSourcePlugIn::It's neiher CoverUi nor S60 application" );
+        INFO_1( "appUid = [0x%x]", tmpAppUid.iUid );
+        }
+
+    INFO_1( "appCaption = [%S]", &appCaption );
+    INFO_1( "appName    = [%S]", &appName );
+
+    CleanupStack::PopAndDestroy( wndGrpName );
+    CleanupStack::PopAndDestroy( &wsSession );
+
+    TPtrC bgApp( *iDefaultAppName );
+    TPtrC fgApp( *iDefaultAppName );
+    TPtrC fgView( *iDefaultViewName );
+
+    if ( appUid != TUid::Null() )
+        {
+        for ( TInt i = 0; i < iApplicationSettings.Count(); ++i )
+            {
+            CCFApplicationStateSettings* appSettings = iApplicationSettings[ i ];
+            if ( appUid == appSettings->Uid() )
+                {
+                fgApp.Set( appSettings->Name() );
+                break;
+                }
+            }
+        }
+
+    iPreviousForegroundApplication.Set( fgApp ); // Store for next round
+    iPreviousForegroundView.Set( fgView );
+
+    RThread thread;
+
+    // Publish foreground application
+    iContext->SetTypeL( KApplicationStateForegroundApplicationType );
+    iContext->SetValueL( fgApp );
+    iCF.PublishContext( *iContext, thread );
+
+    // Publish  foreground view
+    iContext->SetTypeL( KApplicationStateForegroundApplicationViewType );
+    iContext->SetValueL( fgView );
+    iCF.PublishContext( *iContext, thread );
+
+    // Publish background application
+    iContext->SetTypeL( KApplicationStateBackgroundApplicationType );
+    iContext->SetValueL( bgApp );
+    iCF.PublishContext( *iContext, thread );
+    
+    // Publish foreground application orientation
+    TPtrC fgAppOrientation( ResolveFgAppOrientation( appUid ) );
+    iContext->SetTypeL( KFgApplicationOrientation );
+    iContext->SetValueL( fgAppOrientation );
+    iCF.PublishContext( *iContext, thread );
+    
+    // Store for next round
+    iPreviousOrientation.Set( fgAppOrientation );
+
+    thread.Close();
+    }
+
+
+//-----------------------------------------------------------------------------
+// CApplicationStateSourcePlugIn::ConvertToHex
+//-----------------------------------------------------------------------------
+//
+TInt CApplicationStateSourcePlugIn::ConvertToHex( const TDesC& aString,
+    TUint32& aValue )
+    {
+    FUNC_LOG;
+
+    TInt err = KErrNone;
+    TLex lex( aString );
+
+    // Get rid of '0x'
+    const TInt skip = 2;
+    lex.Inc( skip );
+    if( lex.BoundedVal( aValue, EHex, KLimit ) != KErrNone )
+        {
+        err = KErrNotFound;
+        }
+    return err;
+    }
+
+//------------------------------------------------------------------------------
+// CApplicationStateSourcePlugIn::FindByUid
+//------------------------------------------------------------------------------
+//
+TInt CApplicationStateSourcePlugIn::FindByUid( const TUid& aUid ) const
+    {
+    FUNC_LOG;
+    
+    TInt index = KErrNotFound;
+    for( TInt i = 0; i < iUidOrientationList.Count(); i++ )
+        {
+        if( iUidOrientationList[i].iUid == aUid )
+            {
+            index = i;
+            break;
+            }
+        }
+    return index;
+    }