idlefw/plugins/profileplugin/src/caiprofileplugin.cpp
branchRCL_3
changeset 114 a5a39a295112
child 122 6cadd6867c17
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlefw/plugins/profileplugin/src/caiprofileplugin.cpp	Wed Sep 01 12:22:09 2010 +0100
@@ -0,0 +1,450 @@
+/*
+* 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:  Profile plug-in publisher
+*
+*/
+
+// System includes
+#include <ecom/ecom.h>
+#include <ecom/implementationproxy.h>
+#include <PUAcodes.hrh>
+#include <AknUtils.h>
+
+// User includes
+#include <aiprofilepluginuids.hrh>
+#include <aicontentobserver.h>
+#include <aiutility.h>
+
+#include "aiprofileplugincontentmodel.h"
+#include "caiprofileplugin.h"
+#include "caiprofileengine.h"
+#include "aipluginsettings.h"
+
+// Constants
+
+// PUA code for the timed profile, missing from PUAcodes.hrh
+#define KAiTimedProfilePUA 0xF815
+#define KAiRTL 0x200F
+
+const TImplementationProxy KImplementationTable[] =
+    {
+    IMPLEMENTATION_PROXY_ENTRY( KImplUidProfilePlugin, CAiProfilePlugin::NewL ) 
+    };
+
+// ======== LOCAL FUNCTIONS ========
+
+// ======== MEMBER FUNCTIONS ========
+// ---------------------------------------------------------------------------
+// CAiProfilePlugin::NewL
+//
+// ---------------------------------------------------------------------------
+//
+CAiProfilePlugin* CAiProfilePlugin::NewL()
+    {
+    CAiProfilePlugin* self = new ( ELeave ) CAiProfilePlugin;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+ 
+    return self;
+    }
+    
+// ---------------------------------------------------------------------------
+// CAiProfilePlugin::CAiProfilePlugin()
+// 
+// ---------------------------------------------------------------------------
+//
+CAiProfilePlugin::CAiProfilePlugin()
+    {
+    }
+    
+// ---------------------------------------------------------------------------
+// CAiProfilePlugin::ConstructL
+// 
+// ---------------------------------------------------------------------------
+//
+void CAiProfilePlugin::ConstructL()
+    { 
+    iContent = 
+        AiUtility::CreateContentItemArrayIteratorL( KAiProfileContent );
+    
+    iEvents = 
+        AiUtility::CreateContentItemArrayIteratorL( KAiProfileEvents );
+    
+    iResources = 
+        AiUtility::CreateContentItemArrayIteratorL( KAiProfileResources );
+    
+    iEngine = CAiProfileEngine::NewL( this );
+    
+    iEngine->UpdateProfileNamesL();        
+    }
+    
+// ---------------------------------------------------------------------------
+// CAiProfilePlugin::~CAiProfilePlugin
+// Deletes all data created to heap
+// ---------------------------------------------------------------------------
+//
+CAiProfilePlugin::~CAiProfilePlugin()
+    {    	
+    Release( iContent );
+    Release( iEvents );
+    Release( iResources );
+    
+    delete iActiveProfileAndChar;
+    delete iPreviousProfileNameAndChar;
+    delete iEngine;
+    
+    iObservers.Close();
+    }
+
+// ---------------------------------------------------------------------------
+// CAiProfilePlugin::PublishL
+// Publishes the profiles
+// ---------------------------------------------------------------------------
+//
+void CAiProfilePlugin::PublishL()
+    {
+    TInt err( KErrNone );
+    TInt observers( iObservers.Count() );        
+    TInt transactionId ( reinterpret_cast<TInt>( this ) );
+
+    iCurrentCount = iEngine->NumberOfProfiles();
+    
+    for ( TInt i = 0; i < observers; i++ )
+        {
+        MAiContentObserver* observer( iObservers[i] );
+        
+        err = observer->StartTransaction( transactionId );
+		
+		if ( err == KErrNotSupported )
+            {
+            // The observer does not support transactions, check for real errors.
+            return;
+            }
+        
+        //Active Profile name    
+        if ( observer->CanPublish( *this, EAiProfileContentActiveProfileName, EAiProfileContentActiveProfileName ) )
+        	{        	
+       		observer->Publish( *this, EAiProfileContentActiveProfileName, iEngine->ActiveProfileName(), EAiProfileContentActiveProfileName );
+        	}
+        
+        if ( observer->CanPublish( *this, EAiProfileActiveProfileNameAndIconChar, 0 ) )
+            {
+            delete iActiveProfileAndChar;
+            iActiveProfileAndChar = NULL;
+            
+            // silent/non-silent icon + timed icon + space + possible RTL*2 = 5
+            TInt maxChars( iEngine->ActiveProfileName().Length() + 5 );
+            
+            iActiveProfileAndChar = HBufC::NewL( maxChars );
+            TPtr profileNamePtr( iActiveProfileAndChar->Des() );
+           
+            if( AknLayoutUtils::LayoutMirrored() )
+                {
+                profileNamePtr.Append( KAiRTL );
+                }
+
+            if ( iEngine->IsActiveProfileTimedL() )
+                {
+                profileNamePtr.Append( KAiTimedProfilePUA );                
+                }
+            
+            if ( iEngine->IsActiveProfileSilentL() )
+                {                
+                profileNamePtr.Append( KPuaCodeSilentSymbol );
+                }
+            else
+                {
+                profileNamePtr.Append( KPuaCodeAprofSound );
+                }
+            
+            _LIT( KSpace, " " ); 
+            
+            profileNamePtr.Append( KSpace );
+            
+            if ( AknLayoutUtils::LayoutMirrored() )
+                {
+                profileNamePtr.Append( KAiRTL );
+                }
+            
+            profileNamePtr.Append( iEngine->ActiveProfileName() );
+                        
+            if ( !iPreviousProfileNameAndChar || 
+                    iPreviousProfileNameAndChar->CompareC( *iActiveProfileAndChar ) != 0 )
+                {
+                delete iPreviousProfileNameAndChar;
+                iPreviousProfileNameAndChar = NULL;
+                observer->Publish( *this, EAiProfileActiveProfileNameAndIconChar, profileNamePtr, 0 );
+                
+                iPreviousProfileNameAndChar = iActiveProfileAndChar->AllocL();
+                }
+            }
+        
+        //Swap Profile name ( 1.phase: General or Silent )
+       	if ( observer->CanPublish( *this, EAiProfileContentSwapProfileName, EAiProfileContentSwapProfileName ) )
+        	{
+        	observer->Publish( *this, EAiProfileContentSwapProfileName, iEngine->SwapProfileName(), EAiProfileContentSwapProfileName );
+        	}      
+          
+		//All profile names
+       	// clean profiles that are already deleted.
+       	// Cleans the array blindly from the end, because in the next
+       	// step all the profiles are republished
+        if ( iPreviousCount > iCurrentCount )
+            {
+            for( TInt k = iCurrentCount; k < iPreviousCount; k++ )
+                {
+                observer->Clean( *this, EAiProfileContentProfileName, k + 1 );
+                }
+            }
+        
+		for ( TInt j = 0; j < iCurrentCount; j++ )
+			{
+			if ( observer->CanPublish( *this, EAiProfileContentProfileName, j + 1 ) )
+				{
+				observer->Publish(*this, EAiProfileContentProfileName, iEngine->ProfileNameByIndex( j ), j + 1 );
+				}
+			}
+      	
+      	//Active Profile silent indicator char
+        if ( observer->CanPublish( *this, EAiProfileActiveProfileSilentChar, EAiProfileActiveProfileSilentChar ) )
+        	{
+        	if ( iEngine->IsActiveProfileSilentL() )
+        		{
+        		TBuf<1> silent; // one character
+        		silent.Append( KPuaCodeSilentSymbol );
+        		
+        		observer->Publish( *this, EAiProfileActiveProfileSilentChar, silent, EAiProfileActiveProfileSilentChar );
+        		}
+        	else
+        		{
+        		observer->Clean( *this, EAiProfileActiveProfileSilentChar, EAiProfileActiveProfileSilentChar );
+        		}
+        	}
+        
+        //Active Profile silent indicator resource
+        if ( observer->CanPublish( *this, EAiProfileActiveProfileIcon, EAiProfileActiveProfileIcon ) )
+        	{
+    		observer->Clean( *this, EAiProfileActiveProfileIcon, EAiProfileActiveProfileSilentIconResource );
+    		observer->Clean( *this, EAiProfileActiveProfileIcon, EAiProfileActiveProfileGeneralIconResource );
+    		observer->Clean( *this, EAiProfileActiveProfileIcon, EAiProfileActiveProfileTimedIconResource );
+        	
+    		if ( iEngine->IsActiveProfileTimedL() )
+        		{
+        		observer->Publish( *this, 
+        							EAiProfileActiveProfileIcon, 
+        							EAiProfileActiveProfileTimedIconResource, 
+        							EAiProfileActiveProfileTimedIconResource );
+        		}
+        	else if ( iEngine->IsActiveProfileSilentL() )
+        		{
+        		observer->Publish( *this, 
+        							EAiProfileActiveProfileIcon, 
+        							EAiProfileActiveProfileSilentIconResource, 
+        							EAiProfileActiveProfileSilentIconResource );
+        		}
+        	else
+        		{
+        		observer->Publish( *this, 
+        							EAiProfileActiveProfileIcon, 
+        							EAiProfileActiveProfileGeneralIconResource, 
+        							EAiProfileActiveProfileGeneralIconResource );
+        		}
+        	}
+
+		// in case of Offline profile profile indicator is not shown
+        if ( observer->CanPublish( *this, EAiProfileContentActiveProfileName, EAiProfileContentActiveProfileName ) &&
+        		iEngine->IsOffline() )
+        	{
+    		observer->Clean( *this, EAiProfileActiveProfileSilentChar, EAiProfileActiveProfileSilentChar );
+    		observer->Clean( *this, EAiProfileActiveProfileIcon, 1 );
+    		observer->Clean( *this, EAiProfileActiveProfileIcon, 2 );
+            
+    		// uncomment also this and respective policy lines in profiles.xml if whole widget needs to be hidden in AI3 
+    		//observer->Clean( *this, EAiProfileContentActiveProfileName, EAiProfileContentActiveProfileName );        		    		
+    		}
+        
+        if ( err == KErrNone )
+            {
+            err = observer->Commit( transactionId );
+            
+            if ( err == KErrNotSupported)
+                {
+                return;
+                }
+            }                
+        }
+    
+    iPreviousCount = iCurrentCount;
+    }
+    
+// ---------------------------------------------------------------------------
+// CAiProfilePlugin::Start
+// 
+// ---------------------------------------------------------------------------
+//
+void CAiProfilePlugin::Start( TStartReason /*aReason*/ )
+    {   
+    iPublishRequired = ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// CAiProfilePlugin::Stop
+// 
+// ---------------------------------------------------------------------------
+//
+void CAiProfilePlugin::Stop( TStopReason /*aReason*/ )
+    {    
+    CleanPublishedProfileNames();
+    }
+
+// ---------------------------------------------------------------------------
+// CAiProfilePlugin::Resume
+// 
+// ---------------------------------------------------------------------------
+//
+void CAiProfilePlugin::Resume( TResumeReason aReason )
+    {
+    if ( aReason == EForeground )
+        {
+        TRAP_IGNORE( DoResumeL() );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CAiProfilePlugin::Suspend
+// 
+// ---------------------------------------------------------------------------
+//
+void CAiProfilePlugin::Suspend( TSuspendReason /*aReason*/ )
+    {    
+    }
+
+// ---------------------------------------------------------------------------
+// CAiProfilePlugin::SubscribeL
+// 
+// ---------------------------------------------------------------------------
+//
+void CAiProfilePlugin::SubscribeL( MAiContentObserver& aObserver )
+    {
+    iObservers.AppendL( &aObserver );
+    }
+
+// ---------------------------------------------------------------------------
+// CAiProfilePlugin::ConfigureL
+// 
+// ---------------------------------------------------------------------------
+//
+void CAiProfilePlugin::ConfigureL( RAiSettingsItemArray& /*aSettings*/ )
+    {    
+    }
+
+// ---------------------------------------------------------------------------
+// CAiProfilePlugin::GetProperty
+// 
+// ---------------------------------------------------------------------------
+//
+TAny* CAiProfilePlugin::GetProperty( TProperty aProperty )
+    {
+    if ( aProperty == EPublisherContent )
+        {
+        return static_cast< MAiContentItemIterator* >( iContent );        
+        }
+    else if ( aProperty == EPublisherEvents )
+        {
+        return static_cast< MAiContentItemIterator* >( iEvents );
+        }
+    else if ( aProperty == EPublisherResources )
+        {
+        return static_cast< MAiContentItemIterator* >( iResources );        
+        }
+
+    return NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CAiProfilePlugin::HandleEvent
+// 
+// ---------------------------------------------------------------------------
+//
+void CAiProfilePlugin::HandleEvent( TInt aEvent, const TDesC& aParam )
+    {    
+    TRAP_IGNORE( iEngine->HandleAiEventL( aEvent, aParam ) );    
+    }
+
+// ---------------------------------------------------------------------------
+// CAiProfilePlugin::DoResumeL
+//
+// ---------------------------------------------------------------------------
+//
+void CAiProfilePlugin::DoResumeL()
+    {
+    if ( iPublishRequired )
+        {
+        iPublishRequired = EFalse;
+        
+        PublishL();
+        }
+    }
+ 
+// ---------------------------------------------------------------------------
+// CAiProfilePlugin::NotifyContentUpdate()
+// This method is called from the engine, when the profile data has changed
+// ---------------------------------------------------------------------------
+//
+void CAiProfilePlugin::NotifyContentUpdate()
+    {        
+    iPublishRequired = ETrue;
+    
+    TRAP_IGNORE( DoResumeL() );
+    }
+
+// ---------------------------------------------------------------------------
+// CAiProfilePlugin::CleanPublishedProfileNames
+// Clean profile names from content
+// ---------------------------------------------------------------------------
+//    
+void CAiProfilePlugin::CleanPublishedProfileNames()
+    {
+    TInt obsCount( iObservers.Count() );
+    
+    for ( TInt i( 0 ); i < obsCount; i++ )
+        {
+        MAiContentObserver* observer( iObservers[i] );
+        
+        for ( TInt j( 0 ); j < iCurrentCount && observer; j++ )
+            {
+            observer->Clean( *this, EAiProfileContentProfileName, j + 1 );
+            }
+        }
+    
+    delete iPreviousProfileNameAndChar;
+    iPreviousProfileNameAndChar = NULL;
+    
+    iPreviousCount = 0;
+    }
+
+// ======== GLOBAL FUNCTIONS ========
+// ---------------------------------------------------------------------------
+// Constructs and returns an application object.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy( 
+    TInt& aTableCount )
+    {
+    aTableCount = sizeof( KImplementationTable ) / 
+        sizeof( TImplementationProxy );
+    
+    return KImplementationTable;
+    }