idlefw/plugins/devicestatus/src/aidevicestatusplugin.cpp
changeset 0 79c6a41cd166
child 8 d0529222e3f0
--- /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 <ecom/ecom.h>
+#include <ecom/implementationproxy.h>
+#include <coemain.h>
+#include <data_caging_path_literals.hrh>
+#include <bautils.h>
+#include <aiutility.h>
+#include <featmgr.h>
+#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<MAiPropertyExtension*>(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<MAiContentItemIterator*>(iContent);
+
+        case EAiPublisherResources:
+            return static_cast<MAiContentItemIterator*>(iResources);
+
+        case EAiContentRequest:
+            return static_cast<MAiContentRequest*>(this);
+        }
+
+    return NULL;
+    }
+
+void CAiDeviceStatusPlugin::SetPropertyL(TInt aProperty, TAny* aValue)
+    {
+    if( aProperty == EAiPublisherInfo )
+        {
+        ASSERT( aValue );
+        
+        const TAiPublisherInfo* info( 
+                static_cast<const TAiPublisherInfo*>( 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;
+    }