diff -r 000000000000 -r 79c6a41cd166 idlefw/plugins/devicestatus/src/aidevicestatusplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/idlefw/plugins/devicestatus/src/aidevicestatusplugin.cpp Thu Dec 17 08:54:17 2009 +0200 @@ -0,0 +1,307 @@ +/* +* Copyright (c) 2005-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: Device status plugin interface. +* +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include "aidevicestatusplugin.h" +#include "aidevicestatuspluginengine.h" +#include "aipublishprioritizer.h" +#include "aidevicestatuscontentmodel.h" +#include "aimulticontentobserver.h" +#include "aipluginsettings.h" +#include "ainetworkinfolistener.h" + +_LIT( KResourceDrive, "Z:" ); +_LIT( KResourceFile, "aidevstaplgres.rsc" ); +#define KResourcePath KDC_APP_RESOURCE_DIR + +// ECOM implementation table +const TImplementationProxy KImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY(KImplUidDevStaPlugin, CAiDeviceStatusPlugin::NewL) + }; + + +// ======== MEMBER FUNCTIONS ======== + +CAiDeviceStatusPlugin::CAiDeviceStatusPlugin() : + iResourceOffset( KErrNotFound ) + { + } + + +void CAiDeviceStatusPlugin::ConstructL() + { + iInfo.iUid.iUid = AI_UID_ECOM_IMPLEMENTATION_CONTENTPUBLISHER_DEVSTAPLUGIN; + + FeatureManager::InitializeLibL(); + + // Create master instance to prevent deletion on Stop() + iListener = CAiNetworkInfoListener::InstanceL(); + + //Create content here since this is needed in optimization phase. + iContent = AiUtility::CreateContentItemArrayIteratorL( KAiDeviceStatusContent ); + iResources = AiUtility::CreateContentItemArrayIteratorL( KAiDeviceStatusResources ); + iContentObservers = CAiMultiContentObserver::NewL(); + iPrioritizer = CAiPublishPrioritizer::NewL( *iContentObservers, *this ); + } + + +CAiDeviceStatusPlugin* CAiDeviceStatusPlugin::NewL() + { + CAiDeviceStatusPlugin* self = CAiDeviceStatusPlugin::NewLC(); + CleanupStack::Pop( self ); + return self; + } + + +CAiDeviceStatusPlugin* CAiDeviceStatusPlugin::NewLC() + { + CAiDeviceStatusPlugin* self = new( ELeave ) CAiDeviceStatusPlugin; + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + + +CAiDeviceStatusPlugin::~CAiDeviceStatusPlugin() + { + delete iPrioritizer; + FreeResources(); + delete iContentObservers; + Release( iResources ); + Release( iContent ); + FeatureManager::UnInitializeLib(); + if( iListener ) + { + iListener->Release(); + } + } + + +/** + * Allocates all resourcers required for plug-in operation. + */ +void CAiDeviceStatusPlugin::AllocateResourcesL() + { + //create engine + if( !iEngine ) + { + iEngine = CAiDeviceStatusPluginEngine::NewL( *iContentObservers, + *this, + *iPrioritizer); + } + + if( iResourceOffset < 0 ) + { + CCoeEnv* coe = CCoeEnv::Static(); + + if( !coe ) + { + User::Leave( KErrNotReady ); + } + + //Add resource file to cone + TFullName resourceFile( KResourceDrive ); + resourceFile.Append( KResourcePath ); + resourceFile.Append( KResourceFile ); + BaflUtils::NearestLanguageFile( CCoeEnv::Static()->FsSession(), resourceFile ); + iResourceOffset = coe->AddResourceFileL( resourceFile ); + } + } + + +/** + * Frees all allocated resources. + */ +void CAiDeviceStatusPlugin::FreeResources() + { + if( iResourceOffset >= 0 ) + { + CCoeEnv* coe = CCoeEnv::Static(); + //If device status plugin is created when CCoeEnv is available and + //destroyed when it is not anymore available, cone will inform about + //resource leak. + if ( coe ) + { + coe->DeleteResourceFile( iResourceOffset ); + iResourceOffset = KErrNotFound; + } + } + + delete iEngine; + iEngine = NULL; + } + + +void CAiDeviceStatusPlugin::Resume(TAiTransitionReason aReason) + { + if( IgnoreReason( aReason ) ) + { + return; + } + // resume all publishers only in startup + if( iEngine ) + { + if ( aReason == EAiIdleForeground || aReason == EAiKeylockDisabled ) + { + // not much can be done if some publisher cannot be refreshed + TRAP_IGNORE( iEngine->RefreshPublishersL( + EAiDeviceStatusContentNetworkIdentity, ETrue ) ); + + TRAP_IGNORE( iEngine->RefreshPublishersL( + EAiDeviceStatusContentCUGMCNIndicator, ETrue ) ); + } + // if layout changed republish some information + else if ( aReason == EAiScreenLayoutChanged ) + { + TRAP_IGNORE( iEngine->RefreshPublishersL( EAiDeviceStatusContentDate, ETrue )); + TRAP_IGNORE( iEngine->RefreshPublishersL( EAiDeviceStatusContentCUGMCNIndicator, ETrue )); + TRAP_IGNORE( iEngine->RefreshPublishersL( EAiDeviceStatusContentVHZText, ETrue )); + TRAP_IGNORE( iEngine->RefreshPublishersL( EAiDeviceStatusContentNetworkIdentity, ETrue )); + } + return; + } + // If engine has been deleted. create it again. + else + { + iContentObservers->StartTransaction( KImplUidDevStaPlugin ); + + TRAPD( err, DoResumeL(aReason) ); + + if( err == KErrNone ) + { + iContentObservers->Commit( KImplUidDevStaPlugin ); + } + else + { + iContentObservers->CancelTransaction( KImplUidDevStaPlugin ); + } + } + } + + +void CAiDeviceStatusPlugin::DoResumeL(TAiTransitionReason /*aReason*/) + { + AllocateResourcesL( ); + iEngine->ResumePublishersL(); + iEngine->RefreshPublishersL( EFalse ); + } + + +TBool CAiDeviceStatusPlugin::IgnoreReason( TAiTransitionReason aReason ) + { + switch( aReason ) + { + case EAiBacklightOff: + return ETrue; + } + return EFalse; + } + + +void CAiDeviceStatusPlugin::Stop(TAiTransitionReason /*aReason*/) + { + FreeResources(); + } + + +void CAiDeviceStatusPlugin::Suspend(TAiTransitionReason /*aReason*/) + { + } + + +void CAiDeviceStatusPlugin::SubscribeL(MAiContentObserver& aObserver) + { + iContentObservers->AddObserverL( aObserver ); + } + + +TAny* CAiDeviceStatusPlugin::Extension(TUid aUid) + { + //Access to extensions + if( aUid == KExtensionUidProperty ) + { + return static_cast(this); + } + + return NULL; + } + + +void CAiDeviceStatusPlugin::ConfigureL(RAiSettingsItemArray& aSettings) + { + aSettings.ResetAndDestroy(); + } + +TAny* CAiDeviceStatusPlugin::GetPropertyL(TInt aProperty) + { + //Return properties. + switch (aProperty) + { + case EAiPublisherInfo: + return &iInfo; + + case EAiPublisherContent: + return static_cast(iContent); + + case EAiPublisherResources: + return static_cast(iResources); + + case EAiContentRequest: + return static_cast(this); + } + + return NULL; + } + +void CAiDeviceStatusPlugin::SetPropertyL(TInt aProperty, TAny* aValue) + { + if( aProperty == EAiPublisherInfo ) + { + ASSERT( aValue ); + + const TAiPublisherInfo* info( + static_cast( aValue ) ); + + iInfo = *info; + } + } + +TBool CAiDeviceStatusPlugin::RefreshContent( TInt aContentId ) + { + TBool result = EFalse; + + TRAP_IGNORE( result = iEngine->RefreshPublishersL( aContentId, EFalse ) ); + return result; + } + + +/** + * ECom component entry point. + */ +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount ) + { + aTableCount = sizeof(KImplementationTable) / sizeof(TImplementationProxy); + return KImplementationTable; + }