idlehomescreen/xmluicontroller/src/dynamicthememodifier.cpp
changeset 0 f72a12da539e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/xmluicontroller/src/dynamicthememodifier.cpp	Thu Dec 17 08:40:49 2009 +0200
@@ -0,0 +1,331 @@
+/*
+* Copyright (c) 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:  This module contains the implementation of
+* 					CDynamicThemeModifier class member functions.
+*
+*/
+
+
+
+// INCLUDE FILES
+
+#include "dynamicthememodifier.h"
+#include <aisystemuids.hrh>
+#include "xnodt.h"
+#include "xndomdocument.h"
+#include "xndomattribute.h"
+#include "xndomnode.h"
+#include "xndomlist.h"
+#include "xndomdepthiterator.h"
+#include <activeidle2domaincrkeys.h>
+
+// CONSTANTS
+#define NEWS_TICKER_GENERAL_SETTINGS_UID 0x10207196
+const TUid KCRUidNewsTicker = {NEWS_TICKER_GENERAL_SETTINGS_UID};
+
+/**
+ * KGSNewsTickerStatus
+ * CenRep key for "NewsTicker activated"
+ * Off = 0
+ * On = 1
+ */
+const TUint32 KGSNewsTickerStatus = 0x00000004;
+
+/**
+ * KAINTInTheme
+ * CenRep key for "NewsTicker implemented in AI2 theme"
+ * No = 0
+ * Yes = 1
+ */
+const TUint32 KAiNTInTheme = 0x00000800;
+const TInt KThemeArrayGranularity = 4;
+
+_LIT8( KProperty, "property" );
+_LIT8( KControl, "control" );
+_LIT8( KName, "name" );
+_LIT8( KValue, "value" );
+_LIT8( KBlock, "block" );
+_LIT8( KNone, "none" );
+
+using namespace AiXmlUiController;
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CDynamicThemeModifier::CDynamicThemeModifier
+// -----------------------------------------------------------------------------
+//
+CDynamicThemeModifier::CDynamicThemeModifier()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CDynamicThemeModifier::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CDynamicThemeModifier::ConstructL()
+    {
+    // NT is not shown in theme by default. 
+    // This is overridden later if it really is implemented (some other theme 
+    // Basic activated)
+    iAiCenRep = CRepository::NewL( TUid::Uid( KCRUidActiveIdleLV ) );
+    User::LeaveIfError( iAiCenRep->Set( KAiNTInTheme, 0 ) );
+
+	// Check if NT settings are visible in GS
+    iNTCenRep = CRepository::NewL( KCRUidNewsTicker );
+    User::LeaveIfError( iNTCenRep->Get( KGSNewsTickerStatus, iEnabledInCenRep ) );
+    
+    iNTCenRepObserver = CCenRepNotifyHandler::NewL( *this, 
+                                                *iNTCenRep, 
+                                                CCenRepNotifyHandler::EIntKey, 
+                                                KGSNewsTickerStatus );    
+    iNTCenRepObserver->StartListeningL();
+    
+    LoadThemesL();    
+    }
+
+// -----------------------------------------------------------------------------
+// CDynamicThemeModifier::NewL
+// -----------------------------------------------------------------------------
+//
+CDynamicThemeModifier* CDynamicThemeModifier::NewL()
+    {
+    CDynamicThemeModifier* self = new( ELeave ) CDynamicThemeModifier;
+
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+
+// Destructor
+CDynamicThemeModifier::~CDynamicThemeModifier()
+    {
+    if( iThemeArray )
+	    {
+	    iThemeArray->ResetAndDestroy();
+	    delete iThemeArray;    	
+	    }
+    delete iOdt;
+    delete iDomDocument;
+    delete iXnResult;
+    delete iXnRequestClient;
+    delete iXnContentAccessClient;
+    delete iXnClient;
+    if( iNTCenRepObserver )
+	    {
+	    iNTCenRepObserver->StopListening();	
+	    delete iNTCenRepObserver;
+	    }
+    delete iNTCenRep;
+    delete iAiCenRep;
+    }
+
+// ---------------------------------------------------------------------------
+// CDynamicThemeModifier::LoadThemesL
+// ---------------------------------------------------------------------------
+//
+void CDynamicThemeModifier::LoadThemesL()
+    {
+    const TUid KUidAI2 = TUid::Uid( AI_UID3_AIFW_EXE );
+    
+    iXnClient = CXnClient::NewL( *this );
+    // we're only interested in AI2 themes
+    iXnContentAccessClient = CXnContentAccessClient::NewL( *this,
+    														KUidAI2.iUid );
+    iXnRequestClient = CXnRequestClient::NewL( *this, KUidAI2.iUid );    														
+    iXnResult = CXnResult::NewL();
+
+    CXnODT* odt = CXnODT::NewL();
+    CleanupStack::PushL( odt );
+
+    odt->SetAppUid( KUidAI2.iUid );
+
+    iThemeArray = new( ELeave ) CArrayPtrFlat<CXnODT>( KThemeArrayGranularity );
+
+    // theme array gets filled up by XnClient after this
+    // HandleXnClientMessage() is a callback method that we're interested in
+    TXnServiceCompletedMessage ret =
+    	iXnClient->XnGetListHeaders( *odt, *iThemeArray );
+
+    if( ret == EXnGetListHeadersSuccess || ret == EXnGetListHeadersEmpty )
+        {
+		iXnClient->GetXnResult( *iXnResult );
+		iNumberOfHeaders = iXnResult->iIntValue1;
+        iXnClient->XnGetNextHeader();
+        }
+
+    CleanupStack::PopAndDestroy( odt );
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CDynamicThemeModifier::HandleXnClientMessage
+// -----------------------------------------------------------------------------
+//
+void CDynamicThemeModifier::HandleXnClientMessage(
+									TXnServiceCompletedMessage aMessage )
+    {
+    // wait until all themes are fetched before loading settings
+    if( ( aMessage == EXnGetListHeadersUpdate ) &&
+        ( iThemeArray->Count() == iNumberOfHeaders ) )
+        {
+        TRAP_IGNORE( LoadSettingsFromThemeL() );
+        }
+
+    else if( aMessage == EXnGetListHeadersFailed )
+        {
+        if (iXnClient)
+        	{
+            iXnClient->XnCancelGetListHeaders();
+        	}
+
+        if ( iThemeArray )
+    		{
+    		iThemeArray->ResetAndDestroy();
+    		delete iThemeArray;
+    		iThemeArray = NULL;
+    		}
+        }
+
+    }
+
+
+// -----------------------------------------------------------------------------
+// CDynamicThemeModifier::LoadSettingsFromThemeL
+// -----------------------------------------------------------------------------
+//
+void CDynamicThemeModifier::LoadSettingsFromThemeL()
+    {    
+    for( TInt i = 0; i < iThemeArray->Count(); i++ )
+	    {
+   	   	CXnODT* odt = iThemeArray->At( i );
+
+   	    // activated theme found -> load settings
+   	   	if( odt->Flags() & EXnThemeStatusActive )
+   	   	    {
+   	   	    delete iDomDocument;
+   	   	    iDomDocument = NULL;
+            iDomDocument = CXnDomDocument::NewL();
+
+            TXnServiceCompletedMessage ret = 
+                iXnContentAccessClient->XnLoadSettings( *odt, *iDomDocument );
+        	if( ret == EXnSettingsLoaded )
+        	    {
+        	    delete iOdt;
+        	    iOdt = NULL;
+			    iOdt = odt->CloneL();
+	            odt = NULL;
+	            // update theme to match CenRep value	            
+			    EnableNewsTickerL( TBool( iEnabledInCenRep ) );	
+	            break;	            
+                }
+   	   	    }
+	    }
+    }
+    
+
+// -----------------------------------------------------------------------------
+// CDynamicThemeModifier::EnableNewsTickerL
+// -----------------------------------------------------------------------------
+//
+void CDynamicThemeModifier::EnableNewsTickerL( TBool aEnabled )
+    {
+    TInt found = 0;
+	CXnDomDepthIterator* iterator =
+		CXnDomDepthIterator::NewL( *iDomDocument->RootNode() );
+	CleanupStack::PushL( iterator );
+
+	CXnDomNode* node = iterator->First();
+
+	if( !node )
+	    {
+	    CleanupStack::PopAndDestroy( iterator );
+	    return;
+	    }
+
+	// find <control> tag
+	while( node )
+	    {
+		if( !node->Name().Compare( KControl ) )
+		    {
+			break;
+		    }
+		node = iterator->NextL();
+	    }
+
+	if( !node->Name().Compare( KControl ) )
+	    {
+		node = iterator->NextL();
+
+		while( node )
+    		{
+			// look for <property> tag...
+            if( !node->Name().Compare( KProperty ) )
+    		    {
+				// ...with attribute "value"...
+    			if( !node->AttributeValue( KName ).Compare( KValue ) )
+    			    {
+    			    found = 1;
+    				CXnDomAttribute* attr = static_cast<CXnDomAttribute*>
+    					( node->AttributeList().FindByName( KValue) );
+
+					// ...update it accordingly...
+    				if( aEnabled )
+    				    {
+    				    attr->SetValueL( KBlock );
+    				    }
+                    else
+    				    {
+    				    attr->SetValueL( KNone );
+    				    }
+    		        }
+    		    }
+    	    node = iterator->NextL();
+    		}
+
+		// ...and communicate the changes via Content Access API.		
+        for( TInt i = 0; i < iThemeArray->Count(); i++ )
+    	    {
+       	   	CXnODT* odt = iThemeArray->At( i );
+    		
+			// This might return an error if settings were not found from theme.
+			// However, we don't need to take any actions since appropriate 
+			// theme is left untouched in that case anyway
+            iXnContentAccessClient->XnUpdateSettings( *odt, *iDomDocument );
+    	    }
+
+		// if found == 1, then NT is implemented in theme 
+		// -> NT settings can be shown in GS
+		User::LeaveIfError( iAiCenRep->Set( KAiNTInTheme, found ) );
+		CleanupStack::PopAndDestroy( iterator );
+	    }
+    }
+
+// -----------------------------------------------------------------------------
+//  CDynamicThemeModifier::HandleNotifyInt
+//  Callback method for observing CenRep changes
+// -----------------------------------------------------------------------------
+//
+void CDynamicThemeModifier::HandleNotifyInt( TUint32 /*aId*/, TInt aNewValue )
+    {
+    iEnabledInCenRep = TBool( aNewValue );
+    TRAP_IGNORE( EnableNewsTickerL( iEnabledInCenRep ) );
+    ;
+    }
+
+//  End of File