--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/nativeuicontroller/src/nativeuicontroller.cpp Wed Sep 01 12:32:46 2010 +0100
@@ -0,0 +1,1068 @@
+/*
+* Copyright (c) 2005-2007 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: Native UI controller.
+*
+*/
+
+// System includes
+#include <startupdomainpskeys.h>
+#include <bautils.h>
+#include <e32property.h>
+#include <ecom/ecom.h>
+#include <ecom/implementationproxy.h>
+#include <centralrepository.h>
+#include <activeidle2domainpskeys.h>
+#include <aipspropertyobserver.h>
+#include <eikstart.h>
+#include <avkondomainpskeys.h>
+#include <AknDlgShut.h>
+#include <aidevicestatuscontentmodel.h>
+
+// User includes
+#include <aifwstatehandler.h>
+#include <aifwpublisherinfo.h>
+#include <hscontentpublisher.h>
+#include "nativeuicontroller.h"
+#include "ainativeui.hrh"
+#include "application.h"
+#include "appui.h"
+#include "aiutility.h"
+#include "aistrparser.h"
+#include "aistatuspanel.h"
+#include "ainativerenderer.h"
+#include "aititlepanerenderer.h"
+#include "ainavipanerenderer.h"
+#include "aidialogrenderer.h"
+#include "aisoftkeyrenderer.h"
+#include "ainotifierrenderer.h"
+#include "ainativeuiplugins.h"
+#include "activeidle2domaincrkeys.h"
+#include "aistatuspanetouchui.h"
+#include "ainativeuistrings.h" // string literals
+#include "aistrcnv.h"
+
+using namespace AiNativeUiController;
+
+// Constants
+_LIT( KResourceDrive, "Z:" );
+_LIT( KResourceFile, "ainativeui.rsc" );
+_LIT( KSettingsDummyData, "" );
+_LIT( KSettingsIdSeparator, "/" );
+_LIT( KSettings, "Settings" );
+
+const TInt KOneSecondInMicroS = 1000*1000;
+const TInt KAI2CrKeyIncrementBy2 = 2;
+
+#define KResourcePath KDC_APP_RESOURCE_DIR
+
+const TImplementationProxy KImplementationTable[] =
+ {
+ IMPLEMENTATION_PROXY_ENTRY(KImplementationUidNativeUiController, CNativeUiController::NewL)
+ };
+
+// ======== LOCAL FUNCTIONS ========
+// ----------------------------------------------------------------------------
+// IsDeviceStatus()
+//
+// ----------------------------------------------------------------------------
+//
+TBool IsDeviceStatus( const THsPublisherInfo& aInfo )
+ {
+ return ( aInfo.Name() == KDeviceStatusPluginName &&
+ aInfo.Uid() == KDeviceStatusPluginUid );
+ }
+
+// ======== MEMBER FUNCTIONS ========
+// ----------------------------------------------------------------------------
+// CNativeUiController::NewL()
+//
+// ----------------------------------------------------------------------------
+//
+CNativeUiController* CNativeUiController::NewL()
+ {
+ CNativeUiController* self = new (ELeave) CNativeUiController;
+
+ CleanupStack::PushL( self );
+
+ // Set Native UI Controller object to TLS for access in static
+ // CNativeUiController::NewApplication
+ User::LeaveIfError( Dll::SetTls( self ) );
+ CleanupStack::Pop( self );
+
+ return self;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::Exit()
+//
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::Exit()
+ {
+ if ( iExitTimer )
+ {
+ iExitTimer->Cancel();
+
+ iExitTimer->Start( 0, KOneSecondInMicroS,
+ TCallBack( ExitTimerCallBack, this ) );
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::ExitTimerCallBack()
+//
+// ----------------------------------------------------------------------------
+//
+TInt CNativeUiController::ExitTimerCallBack( TAny *aSelf )
+ {
+ CNativeUiController* self =
+ static_cast<CNativeUiController*>( aSelf );
+
+ if ( self )
+ {
+ self->iExitTimer->Cancel();
+ self->PrepareToExit();
+ self->iAppUi->Exit();
+ }
+
+ return KErrNone;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::~CNativeUiController()
+//
+// ----------------------------------------------------------------------------
+//
+CNativeUiController::~CNativeUiController()
+ {
+ iPlugins.Reset();
+
+ delete iExitTimer;
+
+ PrepareToExit();
+
+ // Reset TLS pointer to this set in NewL
+ Dll::SetTls( NULL );
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::PrepareToExit()
+//
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::PrepareToExit()
+ {
+ iRenderers.ResetAndDestroy();
+
+ delete iStatusPanel;
+ iStatusPanel = NULL;
+
+ Release( iIdleStatusObserver );
+ iIdleStatusObserver = NULL;
+
+ Release( iKeylockStatusObserver );
+ iKeylockStatusObserver = NULL;
+
+ Release( iExtHsPluginConfChange );
+ iExtHsPluginConfChange = NULL;
+
+ //If we are not the
+ if( !iRunningAsMain && iResourceOffset > 0 )
+ {
+ iCoeEnv->DeleteResourceFile( iResourceOffset );
+ iResourceOffset = KErrNotFound;
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::CNativeUiController()
+//
+// ----------------------------------------------------------------------------
+//
+CNativeUiController::CNativeUiController()
+ : iResourceOffset( KErrNotFound )
+ {
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::SetAppUi()
+//
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::SetAppUi( CAppUi* aAppUi )
+ {
+ iAppUi = aAppUi;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::AddRendererL()
+//
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::AddRendererL( CAiNativeRenderer* aRenderer )
+ {
+ User::LeaveIfError( iRenderers.Append( aRenderer ) );
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::RemoveRenderer()
+//
+// ----------------------------------------------------------------------------
+//
+TBool CNativeUiController::RemoveRenderer( CAiNativeRenderer *aRenderer,
+ TBool aDelete )
+ {
+ for ( TInt i = 0; i < iRenderers.Count(); i++ )
+ {
+ if ( aRenderer == iRenderers[i] )
+ {
+ if ( aDelete )
+ {
+ delete aRenderer;
+ }
+ iRenderers.Remove(i);
+
+ return ETrue;
+ }
+ }
+
+ return EFalse;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::DoPublish()
+//
+// ----------------------------------------------------------------------------
+//
+template<class T>
+TInt CNativeUiController::DoPublish( CHsContentPublisher& aPlugin,
+ TInt aContent, T& aData, TInt aIndex )
+ {
+ const THsPublisherInfo& info( aPlugin.PublisherInfo() );
+
+ if ( !IsDeviceStatus( info ) && info.Namespace() != KNativeUiNamespace )
+ {
+ return KErrNotSupported;
+ }
+
+ const TInt count( iRenderers.Count() );
+ TInt err( KErrNone );
+
+ for( TInt i( 0 ); i < count; i++ )
+ {
+ err = iRenderers[i]->Publish( aPlugin, aContent, aData, aIndex );
+
+ if( err == KErrNone )
+ {
+ //data published
+ return KErrNone;
+ }
+
+ if( err != KErrNotFound )
+ {
+ return err;
+ }
+ }
+
+ return err;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::HandleIdleStateEvent()
+//
+// ----------------------------------------------------------------------------
+//
+TInt CNativeUiController::HandleIdleStateEvent( TAny* aPtr )
+ {
+ CNativeUiController* self =
+ reinterpret_cast< CNativeUiController* >( aPtr );
+
+ if( self )
+ {
+ TInt idleState = EPSAiBackground;
+ self->iIdleStatusObserver->Get( idleState );
+
+ const TInt count = self->iRenderers.Count();
+
+ if( idleState == EPSAiForeground )
+ {
+ for( TInt i( 0 ); i < count; i++ )
+ {
+ TRAP_IGNORE( self->iRenderers[i]->FocusObtainedL() );
+ }
+ }
+ else
+ {
+ for( TInt j( 0 ); j < count; j++ )
+ {
+ TRAP_IGNORE( self->iRenderers[j]->FocusLostL() );
+ }
+ }
+ }
+
+ return KErrNone;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::HandleKeylockStateEvent()
+//
+// ----------------------------------------------------------------------------
+//
+TInt CNativeUiController::HandleKeylockStateEvent( TAny* aPtr )
+ {
+ CNativeUiController* self =
+ reinterpret_cast< CNativeUiController* >( aPtr );
+
+ if( self )
+ {
+ TInt keylockState = EKeyguardNotActive;
+ self->iKeylockStatusObserver->Get( keylockState );
+
+ const TInt count = self->iRenderers.Count();
+
+ if( keylockState != EKeyguardNotActive )
+ {
+ TRAP_IGNORE(
+ // Run dialog shutter to shut any open dialogs
+ AknDialogShutter::ShutDialogsL(
+ *static_cast< CEikonEnv* >( CCoeEnv::Static() ) );
+
+ TKeyEvent key;
+ key.iCode = 0;
+ key.iModifiers = 0;
+ key.iScanCode = EStdKeyNo;
+ CCoeEnv::Static()->SimulateKeyEventL( key, EEventKey );
+ );
+
+ for( TInt i( 0 ); i < count; i++ )
+ {
+ TRAP_IGNORE( self->iRenderers[i]->KeylockEnabledL() );
+ }
+ }
+ else
+ {
+ for( TInt i( 0 ); i < count; i++ )
+ {
+ TRAP_IGNORE( self->iRenderers[i]->KeylockDisabledL() );
+ }
+ }
+ }
+
+ return KErrNone;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::HandlePluginConfChange()
+//
+// ----------------------------------------------------------------------------
+//
+TInt CNativeUiController::HandlePluginConfChange( TAny* aPtr )
+ {
+ CNativeUiController* self =
+ reinterpret_cast< CNativeUiController* >( aPtr );
+
+ TInt value( 0 );
+
+ RProperty::Get( KPSUidAiInformation,
+ KActiveIdleExtHS_PluginConfChange, value );
+
+ if( self && value )
+ {
+ self->iAppUi->ExtHSThemeChanged();
+ }
+
+ return KErrNone;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::LoadUIDefinitionL()
+//
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::LoadUIDefinitionL()
+ {
+ if ( iUiLoaded )
+ {
+ TInt count( iRenderers.Count() );
+
+ for( TInt i( 0 ); i < count; i++ )
+ {
+ iRenderers[i]->LoadUIDefinitionL();
+ }
+ return;
+ }
+
+ if ( !iExitTimer )
+ {
+ iExitTimer = CPeriodic::NewL( CActive::EPriorityStandard );
+ }
+
+ // This method is called upon startup. We'll need to:
+ iRenderers.ResetAndDestroy();
+
+ if( !iStatusPanel )
+ {
+ // 2) Initialize status pane for publishing in general
+ iStatusPanel = CAiStatusPanel::NewL();
+ }
+
+ // 3) Create renderers that handle publishing to title pane...
+ AddRendererL( CAiTitlePaneRenderer::NewLC( *iStatusPanel ) );
+ CleanupStack::Pop();//CAiTitlePaneRenderer
+
+ // ...navi pane...
+ AddRendererL( CAiNaviPaneRenderer::NewLC( *iStatusPanel ) );
+ CleanupStack::Pop();//CAiNaviPaneRenderer
+
+ // ...dialogs and.
+ AddRendererL( CAiDialogRenderer::NewLC() );
+ CleanupStack::Pop();//CAiDialogRenderer
+
+ AddRendererL( CAiNotifierRenderer::NewLC() );
+ CleanupStack::Pop();//CAiNotifierRenderer
+
+ // ...touch ui.
+ AddRendererL( CAiStatusPaneTouchUi::NewLC( *iStatusPanel, *iFwEventHandler ) );
+ CleanupStack::Pop();//CAiStatusPaneTouchUi
+
+ if( iRunningAsMain )
+ {
+ AddRendererL( CAiSoftKeyRenderer::NewLC() );
+ CleanupStack::Pop();//CAiSoftKeyRenderer
+
+ // Toolbar shown only when we are not the main ui controller
+ //DeleteToolbarRenderer();
+
+ THsPublisherInfo deviceStatus( KDeviceStatusPluginUid,
+ KDeviceStatusPluginName, KNativeUiNamespace );
+
+ iPlugins.Append( deviceStatus );
+
+ TAiFwPublisherInfo devstatInfo(
+ deviceStatus, TAiFwCallback(), EAiFwSystemStartup );
+
+ iFwStateHandler->LoadPlugin( devstatInfo );
+
+ THsPublisherInfo profile( KProfilePluginUid,
+ KProfilePluginName, KNativeUiNamespace );
+
+ iPlugins.Append( profile );
+
+ TAiFwPublisherInfo profileInfo(
+ profile, TAiFwCallback(), EAiFwSystemStartup );
+
+ iFwStateHandler->LoadPlugin( profileInfo );
+ }
+
+ // We need to load the resource file here if we are not main controller.
+ // If we are the main controller the loading is done in appui
+ // Also the toolbar renderer is loaded here.
+ else
+ {
+ //Load resources file for resource publishing
+ TFullName resourceFile( KResourceDrive );
+ resourceFile.Append( KResourcePath );
+ resourceFile.Append( KResourceFile );
+ BaflUtils::NearestLanguageFile( CCoeEnv::Static()->FsSession(), resourceFile );
+ if( iCoeEnv && iResourceOffset == KErrNotFound )
+ {
+ iResourceOffset = iCoeEnv->AddResourceFileL( resourceFile );
+ }
+ // Create the toolbar renderer
+ //RecreateToolbarRendererL();
+ }
+
+ // 4) Add an observer that informs us about the focus transition changes
+ if( !iIdleStatusObserver )
+ {
+ iIdleStatusObserver = AiUtility::CreatePSPropertyObserverL(
+ TCallBack( HandleIdleStateEvent, this ),
+ KPSUidAiInformation,
+ KActiveIdleState );
+ }
+ if( !iKeylockStatusObserver )
+ {
+ iKeylockStatusObserver = AiUtility::CreatePSPropertyObserverL(
+ TCallBack( HandleKeylockStateEvent, this ),
+ KPSUidAvkonDomain,
+ KAknKeyguardStatus );
+ }
+ if( !iExtHsPluginConfChange )
+ {
+ iExtHsPluginConfChange = AiUtility::CreatePSPropertyObserverL(
+ TCallBack( HandlePluginConfChange, this ),
+ KPSUidAiInformation,
+ KActiveIdleExtHS_PluginConfChange );
+ }
+
+ iUiLoaded = ETrue;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::GetSettingsL()
+//
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::GetSettingsL( const THsPublisherInfo& aPublisherInfo,
+ RAiSettingsItemArray& aSettings )
+ {
+ if ( aPublisherInfo.Namespace() != KNativeUiNamespace )
+ {
+ return;
+ }
+
+ if( iRunningAsMain && aPublisherInfo.Uid() == KShortcutPluginUid )
+ {
+ RProperty::Set( KPSUidAiInformation, KActiveIdleExtHS_PluginConfChange, 0 );
+
+ MAiPluginSettings* settings = AiUtility::CreatePluginSettingsL();
+ CleanupDeletePushL( settings );
+
+ MAiPluginSettingsItem& item = settings->AiPluginSettingsItem();
+ item.SetPublisherId( aPublisherInfo.Uid() );
+
+ HBufC* appBuf;
+ appBuf = HBufC::NewLC( RProperty::KMaxPropertySize );
+ TPtr appPtr = appBuf->Des();
+ RProperty::Get( KPSUidAiInformation, KActiveIdleExtHS_LSKLocked, appPtr );
+ if( appPtr.Length() > 0 )
+ {
+ item.SetKey( KNativeUiKeyIdLockedLSK );
+ item.SetValueL( appPtr, EFalse );
+ }
+ else
+ {
+ item.SetKey( KNativeUiKeyIdLSK );
+ item.SetValueL( KAiLocalAppAppShell, EFalse );
+ }
+
+ // Append settings into array.
+ // This can not fail because space has been reserved.
+ aSettings.Append( settings );
+
+ CleanupStack::PopAndDestroy( appBuf );
+ appBuf = NULL;
+
+ CleanupStack::Pop( settings );
+
+ settings = AiUtility::CreatePluginSettingsL();
+ CleanupDeletePushL( settings );
+
+ MAiPluginSettingsItem& item2 = settings->AiPluginSettingsItem();
+ item2.SetPublisherId( aPublisherInfo.Uid() );
+
+ HBufC* app2Buf;
+ app2Buf = HBufC::NewLC( RProperty::KMaxPropertySize );
+ TPtr app2Ptr = app2Buf->Des();
+ RProperty::Get( KPSUidAiInformation, KActiveIdleExtHS_RSKLocked, app2Ptr );
+ if( app2Ptr.Length() > 0 )
+ {
+ item2.SetKey( KNativeUiKeyIdLockedRSK );
+ item2.SetValueL( app2Ptr, EFalse );
+ }
+ else
+ {
+ item2.SetKey( KNativeUiKeyIdRSK );
+ item2.SetValueL( KAiLocalAppContacts, EFalse );
+ }
+
+ // Append settings into array.
+ // This can not fail because space has been reserved.
+ aSettings.Append( settings );
+
+ CleanupStack::PopAndDestroy( app2Buf );
+ app2Buf = NULL;
+
+ // In case there are settings in the cenrep the settings
+ // here are overwritten by them
+ GetSettingsFromCRL( aPublisherInfo, aSettings );
+ CleanupStack::Pop( settings );
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::GetSettingsFromCRL()
+//
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::GetSettingsFromCRL(
+ const THsPublisherInfo& aPublisherInfo,
+ RAiSettingsItemArray &aPluginSettings )
+ {
+ if ( aPublisherInfo.Namespace() != KNativeUiNamespace )
+ {
+ return;
+ }
+
+ /*
+ * The settings are stored in the cenrep starting from 0x1000.
+ * 0x1000 is the name of the plugin which this setting belongs to (for example Settings/Shortcut)
+ * 0x1001 is the id of the setting (for example 1)
+ * 0x1002 is the value of the setting (for example localapp:0x012345678)
+ *
+ * So three keys per setting.
+ */
+
+ TUint32 crKey = KAIPluginSettingsKeyRangeStart;
+
+ TBool moreSettings = ETrue;
+
+ HBufC* pluginId = HBufC::NewLC(NCentralRepositoryConstants::KMaxUnicodeStringLength);
+ HBufC* settingValue = HBufC::NewLC(NCentralRepositoryConstants::KMaxUnicodeStringLength);
+ HBufC* settingKey = HBufC::NewLC(NCentralRepositoryConstants::KMaxUnicodeStringLength);
+
+ TPtr pluginIdPtr = pluginId->Des();
+ TPtr settingValuePtr = settingValue->Des();
+ TPtr settingKeyPtr = settingKey->Des();
+
+ TInt32 settingId = 0;
+
+ TInt err = KErrNone;
+ //TBool settingFound = EFalse;
+
+ CRepository *settingsRepository = CRepository::NewLC( TUid::Uid( KCRUidActiveIdleLV ) );
+
+ while ( moreSettings )
+ {
+ //settingFound = EFalse;
+
+ pluginIdPtr.Zero();
+ settingValuePtr.Zero();
+ settingKeyPtr.Zero();
+ //Get the name of plugin with the Settings/ prefix
+ err = settingsRepository->Get(crKey++, pluginIdPtr);
+
+ // remove the Settings/ prefix if it is located at the start of the string
+ if ( pluginIdPtr.FindC(KSettings) == 0 )
+ {
+
+ pluginIdPtr.Delete(0,
+ KSettingsIdSeparator().Length() +
+ KSettings().Length());
+ }
+
+ // does the setting belong to this plugin
+ if ( err == KErrNone && pluginIdPtr == aPublisherInfo.Name() )
+ {
+ // Get the settings id
+ err = settingsRepository->Get(crKey++, settingKeyPtr);
+ if ( err == KErrNone )
+ {
+ err = AiUtility::ParseInt(settingId,settingKeyPtr);
+ }
+ if ( err == KErrNone )
+ {
+ // Get the actual value of the setting
+ err = settingsRepository->Get(crKey++, settingValuePtr);
+
+ // Ignore possible placeholder data in cenrep
+ if ( err == KErrNone && settingValuePtr.Compare( KSettingsDummyData ) != 0 )
+ {
+ // Try to find an existing setting for this
+ for ( TInt j = 0; j < aPluginSettings.Count(); j++ )
+ {
+ MAiPluginSettings *setting = aPluginSettings[j];
+ MAiPluginSettingsItem& item = setting->AiPluginSettingsItem();
+
+ // Existing setting found => replace it
+ if ( item.Key() == settingId && item.PublisherId() == aPublisherInfo.Uid() )
+ {
+ item.SetValueL( settingValuePtr, EFalse );
+ //settingFound = ETrue;
+ break;
+ }
+ }
+ // Existing setting not found => append new one ONLY if we
+ // are dealing with the icon overrides
+ /* NOTE ai_shortcut_command_api has been removed!
+ if ( !settingFound && ( settingId & KScutFlagBitIconOverride ) )
+ {
+ MAiPluginSettings* settings = AiUtility::CreatePluginSettingsL();
+ CleanupDeletePushL( settings );
+ MAiPluginSettingsItem& item = settings->AiPluginSettingsItem();
+
+ item.SetPublisherId( aPublisherInfo.Uid() );
+ item.SetKey( settingId );
+ item.SetValueL( settingValuePtr, EFalse );
+ aPluginSettings.Append( settings );
+
+ CleanupStack::Pop( settings );
+ }
+ */
+ }
+ }
+ }
+ // name of the plugin not found => no more settings
+ else if (err != KErrNone )
+ {
+ moreSettings = EFalse;
+
+ }
+ // not the correct setting for this plugin
+ else
+ {
+ crKey += KAI2CrKeyIncrementBy2;
+ }
+ }
+
+ CleanupStack::PopAndDestroy(settingsRepository);
+ CleanupStack::PopAndDestroy(settingKey);
+ CleanupStack::PopAndDestroy(settingValue);
+ CleanupStack::PopAndDestroy(pluginId);
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::ActivateUI()
+//
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::ActivateUI()
+ {
+ if( iAppUi && iRunningAsMain )
+ {
+ TRAP_IGNORE( iAppUi->StartL() );
+
+ TInt value( EIdlePhase1Ok );
+
+ RProperty::Get( KPSUidStartup, KPSIdlePhase1Ok, value );
+
+ if ( value == EIdlePhase1NOK )
+ {
+ RProperty::Set( KPSUidStartup, KPSIdlePhase1Ok, EIdlePhase1Ok );
+ }
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::GetContentObserver()
+//
+// ----------------------------------------------------------------------------
+//
+MAiContentObserver& CNativeUiController::GetContentObserver()
+ {
+ return *this;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::SetEventHandler()
+//
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::SetEventHandler( MAiFwEventHandler& aEventHandler )
+ {
+ iFwEventHandler = &aEventHandler;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::SetStateHandler()
+//
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::SetStateHandler( MAiFwStateHandler& aStateHandler )
+ {
+ iFwStateHandler = &aStateHandler;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::FwEventHandler()
+//
+// ----------------------------------------------------------------------------
+//
+MAiFwEventHandler* CNativeUiController::FwEventHandler()
+ {
+ return iFwEventHandler;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::MainInterface()
+//
+// ----------------------------------------------------------------------------
+//
+MAiMainUiController* CNativeUiController::MainInterface()
+ {
+ return this;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::SecondaryInterface()
+//
+// ----------------------------------------------------------------------------
+//
+MAiSecondaryUiController* CNativeUiController::SecondaryInterface()
+ {
+ return this;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::RunApplicationL()
+//
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::RunApplicationL()
+ {
+ VariateToMainUiController();
+
+ User::LeaveIfError(
+ EikStart::RunApplication( &CNativeUiController::NewApplication ) );
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::CoeEnv()
+//
+// ----------------------------------------------------------------------------
+//
+CCoeEnv& CNativeUiController::CoeEnv()
+ {
+ return *CCoeEnv::Static();
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::IsMenuOpen()
+//
+// ----------------------------------------------------------------------------
+//
+TBool CNativeUiController::IsMenuOpen()
+ {
+ return iAppUi->IsDisplayingMenuOrDialog();
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::SetCoeEnv()
+//
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::SetCoeEnv( CCoeEnv& aCoeEnv )
+ {
+ iCoeEnv = &aCoeEnv;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::StartTransaction()
+//
+// ----------------------------------------------------------------------------
+//
+TInt CNativeUiController::StartTransaction( TInt /*aTxId*/ )
+ {
+ return KErrNone;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::Commit()
+//
+// ----------------------------------------------------------------------------
+//
+TInt CNativeUiController::Commit( TInt /*aTxId*/ )
+ {
+ TInt result( KErrNone );
+ const TInt count( iRenderers.Count() );
+
+ for( TInt i( 0 ); i < count; i++ )
+ {
+ TRAP( result, iRenderers[i]->TransactionCommittedL() );
+ }
+
+ return result;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::CancelTransaction()
+//
+// ----------------------------------------------------------------------------
+//
+TInt CNativeUiController::CancelTransaction( TInt /*aTxId*/ )
+ {
+ return KErrNone;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::CanPublish()
+//
+// ----------------------------------------------------------------------------
+//
+TBool CNativeUiController::CanPublish( CHsContentPublisher& aPlugin,
+ TInt /*aContent*/, TInt /*aIndex*/ )
+ {
+ const THsPublisherInfo& info( aPlugin.PublisherInfo() );
+
+ if ( IsDeviceStatus( info ) )
+ {
+ return ETrue;
+ }
+
+ if ( info.Namespace() != KNativeUiNamespace )
+ {
+ return EFalse;
+ }
+
+ for( TInt i = 0; i < iPlugins.Count(); i++ )
+ {
+ if ( iPlugins[i] == info )
+ {
+ return ETrue;
+ }
+ }
+
+ return EFalse;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::Publish()
+//
+// ----------------------------------------------------------------------------
+//
+TInt CNativeUiController::Publish( CHsContentPublisher& aPlugin,
+ TInt aContent, TInt aResource, TInt aIndex )
+ {
+ TInt err = DoPublish( aPlugin, aContent, aResource, aIndex );
+ return err;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::Publish()
+//
+// ----------------------------------------------------------------------------
+//
+TInt CNativeUiController::Publish( CHsContentPublisher& aPlugin,
+ TInt aContent, const TDesC16& aText, TInt aIndex )
+ {
+ TInt err = DoPublish( aPlugin, aContent, aText, aIndex );
+ return err;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::Publish()
+//
+// ----------------------------------------------------------------------------
+//
+TInt CNativeUiController::Publish( CHsContentPublisher& aPlugin,
+ TInt aContent, const TDesC8& aBuf, TInt aIndex )
+ {
+ TInt err = DoPublish( aPlugin, aContent, aBuf, aIndex );
+ return err;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::Publish()
+//
+// ----------------------------------------------------------------------------
+//
+TInt CNativeUiController::Publish( CHsContentPublisher& aPlugin,
+ TInt aContent, RFile& aFile, TInt aIndex )
+ {
+ TInt err = DoPublish( aPlugin, aContent, aFile, aIndex );
+ return err;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::Clean()
+//
+// ----------------------------------------------------------------------------
+//
+TInt CNativeUiController::Clean( CHsContentPublisher& aPlugin,
+ TInt aContent, TInt /*aIndex*/ )
+ {
+ const TInt count( iRenderers.Count() );
+
+ for( TInt i( 0 ); i < count; i++ )
+ {
+ iRenderers[i]->Clean( aPlugin, aContent );
+ }
+
+ return KErrNone;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::Extension()
+//
+// ----------------------------------------------------------------------------
+//
+TAny* CNativeUiController::Extension( TUid /*aUid*/ )
+ {
+ return NULL;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::RequiresSubscription()
+//
+// ----------------------------------------------------------------------------
+//
+TBool CNativeUiController::RequiresSubscription(
+ const THsPublisherInfo& aPublisherInfo ) const
+ {
+ if ( IsDeviceStatus( aPublisherInfo ) ||
+ aPublisherInfo.Namespace() == KNativeUiNamespace )
+ {
+ // Targeted to this content renderer
+ return ETrue;
+ }
+
+ return EFalse;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::SetProperty()
+// ----------------------------------------------------------------------------
+//
+TInt CNativeUiController::SetProperty( CHsContentPublisher& /*aPlugin*/,
+ const TDesC8& /*aElementId*/,
+ const TDesC8& /*aPropertyName*/,
+ const TDesC8& /*aPropertyValue*/ )
+ {
+ return KErrNotSupported;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::SetProperty()
+// ----------------------------------------------------------------------------
+//
+TInt CNativeUiController::SetProperty(CHsContentPublisher& /*aPlugin*/,
+ const TDesC8& /*aElementId*/,
+ const TDesC8& /*aPropertyName*/,
+ const TDesC8& /*aPropertyValue*/,
+ MAiContentObserver::TValueType /*aValueType*/)
+ {
+ return KErrNotSupported;
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::NewApplication()
+//
+// ----------------------------------------------------------------------------
+//
+CApaApplication* CNativeUiController::NewApplication()
+ {
+ CNativeUiController* self =
+ static_cast< CNativeUiController* >( Dll::Tls() );
+
+ return CApplication::New( self );
+ }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::VariateToMainUiController()
+//
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::VariateToMainUiController()
+ {
+ iRunningAsMain = ETrue;
+ }
+
+// ======== GLOBAL FUNCTIONS ========
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount )
+ {
+ aTableCount = sizeof( KImplementationTable ) / sizeof( TImplementationProxy );
+ return KImplementationTable;
+ }
+
+// End of File.