idlehomescreen/xmluicontroller/src/contentrenderer.cpp
branchRCL_3
changeset 9 f966699dea19
parent 4 4d54b72983ae
child 30 b8fae6b8a148
--- a/idlehomescreen/xmluicontroller/src/contentrenderer.cpp	Tue Feb 02 00:04:13 2010 +0200
+++ b/idlehomescreen/xmluicontroller/src/contentrenderer.cpp	Fri Feb 19 22:42:37 2010 +0200
@@ -16,289 +16,91 @@
 */
 
 // System includes
-#include    <e32hashtab.h>
-#include    <utf.h>
-#include    <gulicon.h>
+#include <e32hashtab.h>
+#include <utf.h>
+#include <gulicon.h>
 
 // User includes
-
-#include    "contentrenderer.h"
-#include    "appui.h"
-#include    "activetransactionstack.h"
-#include    "transactionfactoryimpl.h"
-#include    "mtransaction.h"
-#include    "mtransactionelement.h"
-#include    "aixmluiutils.h"
-#include    "xmluicontroller.h"
-#include    "xmlnodeidgenerator.h"
-#include    "aixmluiconstants.h"
-#include    "aifweventhandler.h"
-#include    "databuffertransactionelement.h"
-#include    "newstickercallbackhandler.h"
-#include    "newstickertransactionelement.h"
-#include    "csspropertymap.h"
-#include    "policyevaluator.h"
-#include    "debug.h"
-#include    "xnuiengineappif.h"
-#include    "xnnodeappif.h"
-#include    "xnproperty.h"
-#include    "mxncomponentinterface.h"
-#include    "xntext.h"
-#include    "xnbitmap.h"
-#include    "xntype.h"
-#include    "xnmenuadapter.h"
-#include    "xnlistquerydialogadapter.h"
-#include    "mxncomponentinterface.h"
-#include    "aistrcnv.h"
-#include    "contentprioritymap.h"
-#include    "ainativeuiplugins.h"
+#include <hscontentpublisher.h>
+#include <hspublisherinfo.h>
+#include "contentrenderer.h"
+#include "appui.h"
+#include "activetransactionstack.h"
+#include "transactionfactoryimpl.h"
+#include "mtransaction.h"
+#include "mtransactionelement.h"
+#include "aixmluiutils.h"
+#include "xmluicontroller.h"
+#include "xmlnodeidgenerator.h"
+#include "aixmluiconstants.h"
+#include "aifweventhandler.h"
+#include "databuffertransactionelement.h"
+#include "newstickercallbackhandler.h"
+#include "newstickertransactionelement.h"
+#include "csspropertymap.h"
+#include "policyevaluator.h"
+#include "debug.h"
+#include "xnuiengineappif.h"
+#include "xnnodeappif.h"
+#include "xncomponentnodeimpl.h"
+#include "xnproperty.h"
+#include "mxncomponentinterface.h"
+#include "xntext.h"
+#include "xnbitmap.h"
+#include "xntype.h"
+#include "xnmenuadapter.h"
+#include "xnlistquerydialogadapter.h"
+#include "mxncomponentinterface.h"
+#include "aistrcnv.h"
+#include "contentprioritymap.h"
+#include "ainativeuiplugins.h"
 
 using namespace AiXmlUiController;
 using namespace AiUiDef::xml;
 using namespace XnTextInterface;
 using namespace XnImageInterface;
 
-namespace
+/**
+ * Cleanup item for cleanup of TPtrHashMapIter
+ */            
+class TMapCleanupItem
     {
-    typedef RPointerArray<CXnNodeAppIf> RXnNodeArray;
-
-    /**
-     * Gets content item iterator.
-     *
-     * @param aPlugin plugin to fetch the iterator
-     * @param aContentType type of iterator (content/resource/event)
-     * @return the iterator
-     * @leave KErrNotSupported if plugin does not provide iterator
-     */ 
-    static MAiContentItemIterator& ContentItemIteratorL( MAiPropertyExtension& aPlugin,
-                                                         TInt aContentType )
-        {
-        MAiContentItemIterator* iter =
-            static_cast< MAiContentItemIterator* >( aPlugin.GetPropertyL( aContentType ) );
-
-        if ( !iter )
-            {
-            User::Leave( KErrNotSupported );
-            }
-
-        return *iter;
-        }
-
-    /**
-     * Gets the content priority associated in the property element.
-     *
-     * @param aPropertyElement the property element
-     * @return priority value or KErrNotFound for non-prioritized element
-     */
-    TInt GetContentPriority( CXnNodeAppIf& aPropertyElement )
-        {
-        TInt32 priority( KErrNotFound );
-        
-        const TDesC8* name = PropertyValue( aPropertyElement,
-                                            property::KName );
-                                            
-        
-        if ( name && *name == name::KPriority )
-            {
-            const TDesC8* value = PropertyValue( aPropertyElement,
-                                                 property::KValue );
-            if ( value )
-                {
-                AiUtility::ParseInt( priority, *value );
-                }
-            }
-            
-        return priority;
-        }
-    
+public:
     /**
-     * Remove elements from array which do not contain priority or priority is not lower than
-     * the given value.
-     * 
-     * @param aElements array of elements
-     * @param aLastPriority upper bound of priority value (excluded from the array)
+     * C++ consturctor
      */
-    void RemoveNonPriorityElements( RPointerArray< CXnNodeAppIf>& aElements,
-                                    TInt aLastPriority )
-        {
-        //  Remove non priority elements and higher priority elements
-
-        TInt elementCount = aElements.Count();    
-        for ( TInt i = 0; i < elementCount; )
-            {
-            CXnNodeAppIf* current = aElements[i];
-            
-            // Check name attribute
-            const TDesC8* name = PropertyValue( *current, property::KName );
-            
-            if ( !name || *name != name::KPriority )
-                {
-                // Remove current
-                aElements.Remove( i );
-                --elementCount;
-                }
-            else
-                {
-                // Check current priority
-                const TDesC8* value = PropertyValue( *current, property::KValue );
-                
-                if ( !value ) // value not present
-                    {
-                    aElements.Remove( i );
-                    --elementCount;
-                    continue;
-                    }
-                
-                TInt32 currentPriority( KErrNotFound );
-                if ( AiUtility::ParseInt( currentPriority, *value ) != KErrNone )
-                    {
-                    // value is not integer
-                    aElements.Remove( i );
-                    --elementCount;
-                    continue;
-                    }
-                    
-                if ( currentPriority < aLastPriority )
-                    {
-                    // Keep element and iterate further
-                    ++i;
-                    }
-                else
-                    {
-                    // priority is too high
-                    aElements.Remove( i );
-                    --elementCount;
-                    }
-                }
-            }
-        }
+    TMapCleanupItem( TPtrHashMapIter< TDesC, TInt >& aIterator );
     
     /**
-     * Descending priority order for prioritized content selectors.
-     *
-     * @param aNode1 First node to compare
-     * @param aNode2 Second node to compare
-     * @return 0 nodes have equal priority
-     * @return >0 aNode1 has lower priority
-     * @return <0 aNode2 has lower priority
-     */
-    TInt DescendingPriorityOrder( const CXnNodeAppIf& aNode1,
-                                  const CXnNodeAppIf& aNode2 )
-        {
-        // Array content has been validated, so no checks are needed
-        const TDesC8* value1 = PropertyValue( aNode1,
-                                              property::KValue );
-        
-        const TDesC8* value2 = PropertyValue( aNode2,
-                                              property::KValue );
-        
-        TInt32 priority1( KErrNotFound );
-        AiUtility::ParseInt( priority1, *value1 );
-        
-        TInt32 priority2( KErrNotFound );
-        AiUtility::ParseInt( priority2, *value2 );
-        
-        if ( priority1 == priority2 )
-            {
-            return 0;
-            }
+     * Removes the pointers in the map and deletes the objects
+     * referenced by the pointers.
+     */ 
+    void Release();
             
-        return ( priority1 < priority2 ) ? 1 : -1;
-        }
-    
-    /**
-     * Removes duplicate entries in content change array
-     */
-    void RemoveDuplicateContentChangesL( RAiPolicyElementArray& aArray )
-        {
-        for ( TInt i = 0; i < aArray.Count(); ++i )
-            {
-            HBufC* id = PropertyValueL( aArray[i].Target(), 
-                                            AiUiDef::xml::property::KId );
-            if ( id )
-                {
-                CleanupStack::PushL( id );
-                for ( TInt j = i; j < aArray.Count(); ++j )
-                    {
-                    HBufC* id2 = PropertyValueL( aArray[j].Target(), 
-                                                           AiUiDef::xml::property::KId );
-                    if ( id2)
-                        {
-                        CleanupStack::PushL( id2 );
-                        // Same id and same policy
-                        if ( i != j &&
-                             id->Compare( *id2 ) == 0 && 
-                             ( aArray[i].Policy().Compare( aArray[j].Policy()) == 0) 
-                                )
-                            {
-                            aArray.Remove( j );
-                            --j;
-                            }
-                        }
-                    CleanupStack::PopAndDestroy( id2 );
-                    
-                    }
-                CleanupStack::PopAndDestroy( id );
-                }
-            }
-        }
-    /**
-     * Cleanup item for cleanup of TPtrHashMapIter
-     */            
-    class TMapCleanupItem
-        {
-    public:
-        
-        TMapCleanupItem( TPtrHashMapIter< TDesC, TInt >& aIterator );
-        
-        /**
-         * Removes the pointers in the map and deletes the objects
-         * referenced by the pointers.
-         */ 
-        void Release();
-                
-    private:
-            
-        TPtrHashMapIter< TDesC, TInt > iIterator;
-        
-        };
+private:        
+    TPtrHashMapIter< TDesC, TInt > iIterator;    
+    };
 
-    /**
-     * Helper to handle cleanup of map iterator
-     * @param aMapCleanupItem 
-     */
-    void CleanupRelease( TAny* aMapCleanupItem )
-        {
-        if ( aMapCleanupItem )
-            {
-            static_cast< TMapCleanupItem* >( aMapCleanupItem )->Release();
-            }
-        }
-
-    /**
-     * Helper to push map iterator into cleanup stack.
-     *
-     * @param aCleanupItem item to push into cleanup stack
-     **/
-    void CleanupReleasePushL( TMapCleanupItem& aCleanupItem )
-        {
-        CleanupStack::PushL( TCleanupItem( CleanupRelease,
-                                           &aCleanupItem ) );
-        }
-
-    
-    }
-
+// ----------------------------------------------------------------------------
+// TMapCleanupItem::TMapCleanupItem
+//  
+// ----------------------------------------------------------------------------
+//
 TMapCleanupItem::TMapCleanupItem( TPtrHashMapIter< TDesC, TInt >& aIterator )
     : iIterator( aIterator )
     {
     }
 
+// ----------------------------------------------------------------------------
+// TMapCleanupItem::Release
+//  
+// ----------------------------------------------------------------------------
+//
 void TMapCleanupItem::Release()
     {
     // Delete current key and value
-    const TDesC* key = iIterator.CurrentKey();
-    const TInt* value = iIterator.CurrentValue();
+    const TDesC* key( iIterator.CurrentKey() );
+    const TInt* value( iIterator.CurrentValue() );
     
     delete key;
     delete value;
@@ -307,15 +109,228 @@
     iIterator.RemoveCurrent();
     }
 
+// ============================ LOCAL FUNCTIONS ===============================
 
+// ----------------------------------------------------------------------------
+// ContentItemIterator
+// Gets content item iterator
+// ----------------------------------------------------------------------------
+//
+static MAiContentItemIterator* ContentItemIterator( CHsContentPublisher& aPlugin,
+    CHsContentPublisher::TProperty aType )
+    {       
+    return static_cast< 
+        MAiContentItemIterator* >( aPlugin.GetProperty( aType ) );                                     
+    }
+
+// ----------------------------------------------------------------------------
+// ContentPriority
+// Gets the content priority associated in the property element
+// ----------------------------------------------------------------------------
+//
+static TInt ContentPriority( CXnNodeAppIf& aPropertyElement )
+    {
+    TInt32 priority( KErrNotFound );
+    
+    const TDesC8* name( 
+        PropertyValue( aPropertyElement, property::KName ) );
+                                                                                   
+    if ( name && *name == name::KPriority )
+        {
+        const TDesC8* value( 
+            PropertyValue( aPropertyElement, property::KValue ) );
+                                             
+        if ( value )
+            {
+            AiUtility::ParseInt( priority, *value );
+            }
+        }
+        
+    return priority;
+    }
+    
+// ----------------------------------------------------------------------------
+// RemoveNonPriorityElements
+// Remove elements from array which do not contain priority or priority is 
+// not lower than the given value.
+// ----------------------------------------------------------------------------
+//
+static void RemoveNonPriorityElements( RPointerArray< CXnNodeAppIf>& aElements,
+    TInt aLastPriority )
+    {
+    //  Remove non priority elements and higher priority elements
+    TInt elementCount( aElements.Count() );    
+    
+    for ( TInt i = 0; i < elementCount; )
+        {
+        CXnNodeAppIf* current( aElements[i] );
+        
+        // Check name attribute
+        const TDesC8* name( PropertyValue( *current, property::KName ) );
+        
+        if ( !name || *name != name::KPriority )
+            {
+            // Remove current
+            aElements.Remove( i );
+            --elementCount;
+            }
+        else
+            {
+            // Check current priority
+            const TDesC8* value( 
+                PropertyValue( *current, property::KValue ) );
+            
+            if ( !value ) // value not present
+                {
+                aElements.Remove( i );
+                --elementCount;
+                continue;
+                }
+            
+            TInt32 currentPriority( KErrNotFound );
+            
+            if ( AiUtility::ParseInt( currentPriority, *value ) != KErrNone )
+                {
+                // value is not integer
+                aElements.Remove( i );
+                --elementCount;
+                continue;
+                }
+                
+            if ( currentPriority < aLastPriority )
+                {
+                // Keep element and iterate further
+                ++i;
+                }
+            else
+                {
+                // priority is too high
+                aElements.Remove( i );
+                --elementCount;
+                }
+            }
+        }
+    }
+    
+// ----------------------------------------------------------------------------
+// DescendingPriorityOrder
+// Descending priority order for prioritized content selectors. 
+// ----------------------------------------------------------------------------
+//
+static TInt DescendingPriorityOrder( const CXnNodeAppIf& aNode1,
+    const CXnNodeAppIf& aNode2 )
+    {
+    /*
+    * @param aNode1 First node to compare
+    * @param aNode2 Second node to compare
+    * @return 0 nodes have equal priority
+    * @return >0 aNode1 has lower priority
+    * @return <0 aNode2 has lower priority
+    */
+    // Array content has been validated, so no checks are needed
+    const TDesC8* value1( 
+        PropertyValue( aNode1, property::KValue ) );
+                                              
+    const TDesC8* value2( 
+        PropertyValue( aNode2, property::KValue ) );
+                                              
+    TInt32 priority1( KErrNotFound );
+    AiUtility::ParseInt( priority1, *value1 );
+    
+    TInt32 priority2( KErrNotFound );
+    AiUtility::ParseInt( priority2, *value2 );
+    
+    if ( priority1 == priority2 )
+        {
+        return 0;
+        }
+        
+    return ( priority1 < priority2 ) ? 1 : -1;
+    }
+
+// ----------------------------------------------------------------------------
+// RemoveDuplicateContentChangesL
+// Removes duplicate entries in content change array 
+// ----------------------------------------------------------------------------
+//
+static void RemoveDuplicateContentChangesL( RAiPolicyElementArray& aArray )
+    {
+    for ( TInt i = 0; i < aArray.Count(); ++i )
+        {
+        HBufC* id( PropertyValueL( aArray[i].Target(),  
+            AiUiDef::xml::property::KId ) ); 
+                                        
+        if ( id )
+            {
+            CleanupStack::PushL( id );
+            
+            for ( TInt j = i; j < aArray.Count(); ++j )
+                {
+                HBufC* id2( PropertyValueL( aArray[j].Target(), 
+                   AiUiDef::xml::property::KId ) );
+                
+                if ( id2 )
+                    {
+                    CleanupStack::PushL( id2 );
+                
+                    // Same id and same policy
+                    if ( i != j && id->Compare( *id2 ) == 0 &&                          
+                     ( aArray[i].Policy().Compare( aArray[j].Policy()) == 0 ) ) 
+                            
+                        {
+                        aArray.Remove( j );
+                        --j;
+                        }
+                    }
+                
+                CleanupStack::PopAndDestroy( id2 );                
+                }
+            
+            CleanupStack::PopAndDestroy( id );
+            }
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CleanupReleaseMapItem
+// Helper to handle cleanup of map iterator 
+// ----------------------------------------------------------------------------
+//
+static void CleanupReleaseMapItem( TAny* aMapCleanupItem )
+    {
+    if ( aMapCleanupItem )
+        {
+        static_cast< TMapCleanupItem* >( aMapCleanupItem )->Release();
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CleanupReleasePushL
+// Helper to push map iterator into cleanup stack. 
+// ----------------------------------------------------------------------------
+//
+static void CleanupReleasePushL( TMapCleanupItem& aCleanupItem )
+    {
+    CleanupStack::PushL( TCleanupItem( CleanupReleaseMapItem, &aCleanupItem ) );
+    }
 
 // ============================ MEMBER FUNCTIONS ===============================
 
+// ----------------------------------------------------------------------------
+// CContentRenderer::CContentRenderer
+// 
+// ----------------------------------------------------------------------------
+//
 CContentRenderer::CContentRenderer( CAppUi& aAppUi )
     : iAppUi( aAppUi )
     {
     }
 
+// ----------------------------------------------------------------------------
+// CContentRenderer::ConstructL
+// 
+// ----------------------------------------------------------------------------
+//
 void CContentRenderer::ConstructL()
     {
     iContentPriorityMap = AiUtility::CContentPriorityMap::NewL();
@@ -328,17 +343,27 @@
     iPolicyEvaluator = CPolicyEvaluator::NewL();
     }
 
+// ----------------------------------------------------------------------------
+// CContentRenderer::NewL
+// 
+// ----------------------------------------------------------------------------
+//
 CContentRenderer* CContentRenderer::NewL( CAppUi& aAppUi )
     {
     CContentRenderer* self = new( ELeave ) CContentRenderer( aAppUi );
 
     CleanupStack::PushL( self );
     self->ConstructL();
-    CleanupStack::Pop();
+    CleanupStack::Pop( self );
 
     return self;
     }
 
+// ----------------------------------------------------------------------------
+// CContentRenderer::~CContentRenderer
+// 
+// ----------------------------------------------------------------------------
+//
 CContentRenderer::~CContentRenderer()
     {
     delete iPolicyEvaluator;
@@ -374,46 +399,27 @@
     delete iCallbackHandler;
     }
 
+// ----------------------------------------------------------------------------
+// CContentRenderer::SetEventHandler
+// 
+// ----------------------------------------------------------------------------
+//
 void CContentRenderer::SetEventHandler( MAiFwEventHandler& aFwEventHandler )
     {
     iFwEventHandler = &aFwEventHandler;
     }
 
-void CContentRenderer::Reset()
-    {
-    iContentPriorityMap->Reset();
-    iPropertyMap->Reset();
-    }
-
-void CContentRenderer::CleanPluginFromUi( MAiPropertyExtension& aPlugin )
-    {
-    // Create transaction to clean UI
-    TInt txId = reinterpret_cast< TInt >( &aPlugin );
-    
-    TBool txCreated = ( StartTransaction( txId ) == KErrNone );
-    
-    // Clean plugin
-    TRAPD( cleanError, CleanPluginFromUiL( aPlugin ) );
-    
-    // Commit transaction
-    if ( txCreated )
-        {
-        if (cleanError )
-            {
-            CancelTransaction( txId );
-            }
-        else
-            {
-            Commit( txId );
-            }
-        }
-    }
-
+// ----------------------------------------------------------------------------
+// CContentRenderer::StartTransaction
+// 
+// ----------------------------------------------------------------------------
+//
 TInt CContentRenderer::StartTransaction( TInt aTxId )
     {
     __PRINT(__DBG_FORMAT("\t[I]\tXML UI: Start transaction id=%d"), aTxId);
     __HEAP("XML UI: Start transaction");
     __TICK("XML UI: Start transaction");
+    
     TRAPD( error, DoStartTransactionL( aTxId ) );
 
     if ( error )
@@ -424,10 +430,15 @@
     return error;
     }
 
+// ----------------------------------------------------------------------------
+// CContentRenderer::Commit
+// 
+// ----------------------------------------------------------------------------
+//
 TInt CContentRenderer::Commit( TInt aTxId )
     {
     // Remove transaction with aTxId from stack
-    MTransaction* tr = iStack->Remove( aTxId );
+    MTransaction* tr( iStack->Remove( aTxId ) );
 
     if ( tr )
         {
@@ -437,10 +448,12 @@
         TBool layoutChanged( EFalse );
         
         TRAPD( error, tr->CommitL( layoutChanged, propertyHashMap ) );
+
         if( error == KErrNone )
             {
             TRAP_IGNORE( SetPropertyArraysL( propertyHashMap ) );
             }
+        
         propertyHashMap.Close();
 
         __TICK("XML UI: Commit transaction");
@@ -464,9 +477,14 @@
     return KErrNotSupported;
     }
 
+// ----------------------------------------------------------------------------
+// CContentRenderer::ProcessContentChangesL
+// 
+// ----------------------------------------------------------------------------
+//
 void CContentRenderer::ProcessContentChangesL( MTransaction& aTr )
     {
-    TDblQueIter<CTransactionElement> iter = aTr.ElementIter();
+    TDblQueIter<CTransactionElement> iter( aTr.ElementIter() );
     RAiPolicyElementArray contentChangedArray;
     CleanupClosePushL( contentChangedArray );
 
@@ -479,7 +497,7 @@
           iPolicyEvaluator->EvaluateContentChangedPolicyL( target, 
                   contentChangedArray);
 
-          iPolicyEvaluator->EvaluateContentChangedPolicyL( *(target.ParentL()), 
+          iPolicyEvaluator->EvaluateContentChangedPolicyL( *(target.ParentL() ), 
                   contentChangedArray);
           }
        
@@ -489,16 +507,25 @@
         {
         ProcessContentChangeL( contentChangedArray[i] );
         }
+    
     CleanupStack::PopAndDestroy();
     }
 
+// ----------------------------------------------------------------------------
+// CContentRenderer::ProcessContentChangeL
+// 
+// ----------------------------------------------------------------------------
+//
 void CContentRenderer::ProcessContentChangeL( TAiPolicyElement& aElement )
     {
-    const TDesC8* id = PropertyValue( aElement.Target(), 
-                                AiUiDef::xml::property::KId );
+    const TDesC8* id( PropertyValue( 
+        aElement.Target(), AiUiDef::xml::property::KId ) ); 
+                                
     if ( id )
         {
-        CXnNodeAppIf* targetNode = FindNodeByIdL( *id, aElement.Target().Namespace() );
+        CXnNodeAppIf* targetNode( 
+            FindNodeByIdL( *id, aElement.Target().Namespace() ) );
+        
         if ( targetNode )
             {                     
             if ( aElement.Policy() == AiUiDef::xml::value::KShowTooltips )
@@ -509,10 +536,15 @@
         }
     }
 
+// ----------------------------------------------------------------------------
+// CContentRenderer::CancelTransaction
+// 
+// ----------------------------------------------------------------------------
+//
 TInt CContentRenderer::CancelTransaction( TInt aTxId )
     {
     // Remove transaction with aTxId from stack
-    MTransaction* tr = iStack->Remove( aTxId );
+    MTransaction* tr( iStack->Remove( aTxId ) );
 
     if ( tr )
         {
@@ -529,12 +561,17 @@
     return KErrNotSupported;
     }
 
-TBool CContentRenderer::CanPublish( MAiPropertyExtension& aPlugin,
-                                    TInt aContent,
-                                    TInt aIndex )
+// ----------------------------------------------------------------------------
+// CContentRenderer::CanPublish
+// 
+// ----------------------------------------------------------------------------
+//
+TBool CContentRenderer::CanPublish( CHsContentPublisher& aPlugin,
+    TInt aContent, TInt aIndex )                                   
     {
     TInt error( KErrNone );
     TInt retval( KErrNone );
+    
     __PRINTS("*** UC: Init - Content Validation ***");
 	__TIME("UC: Content Validation",
         TRAP( error, retval = CanPublishL( aPlugin, aContent, aIndex ) );
@@ -545,13 +582,17 @@
     return ( error == KErrNone && retval == KErrNone );
     }
 
-TInt CContentRenderer::Publish( MAiPropertyExtension& aPlugin,
-                                TInt aContent,
-                                TInt aResource,
-                                TInt aIndex )
+// ----------------------------------------------------------------------------
+// CContentRenderer::Publish
+// 
+// ----------------------------------------------------------------------------
+//
+TInt CContentRenderer::Publish( CHsContentPublisher& aPlugin, TInt aContent, 
+    TInt aResource, TInt aIndex )
     {
 	TInt error( KErrNone );
 	TInt retval( KErrNone );
+	
 	__PRINTS("*** UC: Init - Content Publishing (Resource) ***");
 	__TIME("UC: Content Publishing (Resource)",
     	TRAP( error, retval = DoPublishL( aPlugin, aContent, aResource, aIndex ) );
@@ -567,10 +608,13 @@
     return error;
     }
 
-TInt CContentRenderer::Publish( MAiPropertyExtension& aPlugin,
-                                TInt aContent,
-                                const TDesC16& aText,
-                                TInt aIndex )
+// ----------------------------------------------------------------------------
+// CContentRenderer::Publish
+// 
+// ----------------------------------------------------------------------------
+//
+TInt CContentRenderer::Publish( CHsContentPublisher& aPlugin, TInt aContent, 
+    const TDesC16& aText, TInt aIndex )
     {
     TInt error( KErrNone );
     TInt retval( KErrNone );
@@ -590,10 +634,13 @@
     return error;
     }
 
-TInt CContentRenderer::Publish( MAiPropertyExtension& aPlugin,
-                                TInt aContent,
-                                const TDesC8& aBuf,
-                                TInt aIndex )
+// ----------------------------------------------------------------------------
+// CContentRenderer::Publish
+// 
+// ----------------------------------------------------------------------------
+//
+TInt CContentRenderer::Publish( CHsContentPublisher& aPlugin, TInt aContent, 
+    const TDesC8& aBuf, TInt aIndex )
     {
     TInt error( KErrNone );
     TInt retval( KErrNone );
@@ -613,10 +660,13 @@
     return error;
     }
 
-TInt CContentRenderer::Publish( MAiPropertyExtension& aPlugin,
-                                TInt aContent,
-                                RFile& aFile,
-                                TInt aIndex )
+// ----------------------------------------------------------------------------
+// CContentRenderer::Publish
+// 
+// ----------------------------------------------------------------------------
+//
+TInt CContentRenderer::Publish( CHsContentPublisher& aPlugin, TInt aContent,                                
+    RFile& aFile, TInt aIndex )                                
     {
     TInt error( KErrNone );
     TInt retval( KErrNone );
@@ -636,7 +686,13 @@
     return error;
     }
 
-TInt CContentRenderer::Clean( MAiPropertyExtension& aPlugin, TInt aContent, TInt aIndex )
+// ----------------------------------------------------------------------------
+// CContentRenderer::Clean
+// 
+// ----------------------------------------------------------------------------
+//
+TInt CContentRenderer::Clean( CHsContentPublisher& aPlugin, TInt aContent, 
+    TInt aIndex )
     {
     TInt error( KErrNone );
     TInt retval( KErrNone );
@@ -656,16 +712,26 @@
     return error;
     }
 
+// ----------------------------------------------------------------------------
+// CContentRenderer::CContentRenderer
+// 
+// ----------------------------------------------------------------------------
+//
 TAny* CContentRenderer::Extension( TUid /*aUid*/ )
     {
     // No extensions supported
     return NULL;
     }
 
+// ----------------------------------------------------------------------------
+// CContentRenderer::RequiresSubscription
+// 
+// ----------------------------------------------------------------------------
+//
 TBool CContentRenderer::RequiresSubscription( 
-    const TAiPublisherInfo& aPublisherInfo ) const
+    const THsPublisherInfo& aPublisherInfo ) const
     {
-    if ( aPublisherInfo.iNamespace == KNativeUiNamespace )
+    if ( aPublisherInfo.Namespace() == KNativeUiNamespace )
         {
         // Not targeted to this content renderer
         return EFalse;
@@ -674,21 +740,867 @@
     return ETrue;
     }
 
-TInt CContentRenderer::SetProperty( MAiPropertyExtension& aPlugin,
-        const TDesC8& aElementId,
-        const TDesC8& aPropertyName,
-        const TDesC8& aPropertyValue ) 
+// ----------------------------------------------------------------------------
+// CContentRenderer::DoStartTransactionL
+// 
+// ----------------------------------------------------------------------------
+//
+void CContentRenderer::DoStartTransactionL( TInt aTxId )
+    {
+    MTransaction* tr( iFactory->CreateTransactionL( aTxId ) );
+    iStack->Push( tr );
+    
+    SetImmediateMode( EFalse );
+    }
+
+// ----------------------------------------------------------------------------
+// CContentRenderer::CanPublishL
+// 
+// ----------------------------------------------------------------------------
+//
+TInt CContentRenderer::CanPublishL( CHsContentPublisher& aPlugin,
+    TInt aContent, TInt aIndex )                                    
+    {
+    // Get content item for aContent
+    MAiContentItemIterator* iter( ContentItemIterator(  
+        aPlugin, CHsContentPublisher::EPublisherContent ) );
+    
+    if ( !iter )
+        {
+        return KErrNotSupported;
+        }
+
+    const TAiContentItem& item( iter->ItemL( aContent ) );
+
+    // Lookup ui element
+    const TDesC& nodeId( iNodeIdGenerator->ContentNodeIdL( aPlugin, item ) );
+
+    CXnNodeAppIf* property( FindNodeByClassL( nodeId, aIndex, 
+        aPlugin.PublisherInfo().Namespace() ) ); 
+ 
+    if( !property )
+        {
+        return KErrNotFound;
+        }
+    
+    // Check content priority
+    TInt priority( ContentPriority( *property ) );
+
+    CXnNodeAppIf* target( property->ParentL() );
+    
+    if( !target )
+        {
+        return KErrNotSupported;
+        }
+
+    if ( !AllowPublishByPriority( *target, priority ) )
+        {
+        return KErrAccessDenied;        
+        }
+
+    // Check if content type is supported by target
+    const TDesC8& contentType( ContentType( item ) );
+
+    if ( !iFactory->IsSupported( *target, contentType ) &&
+        target->Type()->Type() != XnPropertyNames::listquerydialog::KListQueryDialog )
+        {
+        return KErrNotSupported;
+        }
+    
+    return KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// CContentRenderer::DoPublishL
+// 
+// ----------------------------------------------------------------------------
+//
+TInt CContentRenderer::DoPublishL( CHsContentPublisher& aPlugin, TInt aContent,
+    TInt aResource, TInt aIndex )                                  
+    {
+    TInt retval( KErrNotSupported );
+    
+    const THsPublisherInfo& info( aPlugin.PublisherInfo() );
+
+    // Read ref value.
+    MAiContentItemIterator* resIter( ContentItemIterator( 
+        aPlugin, CHsContentPublisher::EPublisherResources ) );
+    
+    if ( !resIter )
+        {
+        return retval;
+        }
+    
+    const TAiContentItem& ref( resIter->ItemL( aResource ) );
+
+    const TDesC8& refType( ContentType( ref ) );
+
+    // Resolve source node
+    const TDesC& nodeId( iNodeIdGenerator->ResourceNodeIdL( aPlugin, ref ) );
+    
+    HBufC8* nodeId8( CnvUtfConverter::ConvertFromUnicodeToUtf8L( nodeId ) );
+    CleanupStack::PushL( nodeId8 );
+    
+    CXnNodeAppIf* source( NULL );
+    
+    __TIME_MARK( xmlOverhead );
+    
+    source = FindNodeByIdL( *nodeId8, info.Namespace() );
+    
+    __TIME_ENDMARK("XML UI: Lookup node by id", xmlOverhead);
+    __PRINT(__DBG_FORMAT("\t[I]\tXML UI: Lookup node by id=%S"), &nodeId);
+    
+    CleanupStack::PopAndDestroy( nodeId8 );
+    
+    // Fetch content id
+    MAiContentItemIterator* iter( ContentItemIterator( 
+       aPlugin, CHsContentPublisher::EPublisherContent ) );
+    
+    if ( !iter )
+        {
+        return retval;
+        }
+    
+    const TAiContentItem& item( iter->ItemL( aContent ) );
+
+    const TDesC& targetId( iNodeIdGenerator->ContentNodeIdL( aPlugin, item ) );
+    
+    // Check types
+    if ( refType == KContentTypeText )
+        {
+        // Fetch text
+        const TDesC8& text( source->GetPCData() );
+        
+        // Delegate to data publishing function
+        retval = PublishDataL( aPlugin,
+                               targetId,
+                               text,
+                               refType,
+                               aIndex,
+                               source );
+        }
+    else if ( refType.Find( KContentTypeImage ) != KErrNotFound )
+        {
+        // Fetch icon
+        CGulIcon* icon( LoadIconLC( *source ) ); 
+        
+       // Delegate to icon publishing function
+        retval = PublishIconL( aPlugin,
+                               targetId,
+                               icon,
+                               aIndex,
+                               source );
+        
+        CleanupStack::Pop( icon );
+        }
+    
+    return retval;
+    }
+
+// ----------------------------------------------------------------------------
+// CContentRenderer::DoPublishL
+// 
+// ----------------------------------------------------------------------------
+//
+TInt CContentRenderer::DoPublishL( CHsContentPublisher& aPlugin, TInt aContent,                                  
+    const TDesC16& aText, TInt aIndex )                                   
+    {
+    const THsPublisherInfo& info( aPlugin.PublisherInfo() );
+
+    // Resolve content item
+    MAiContentItemIterator* iter( ContentItemIterator( 
+        aPlugin, CHsContentPublisher::EPublisherContent ) ); 
+            
+    if ( !iter )
+        {
+        return KErrNotSupported;
+        }
+    
+    const TAiContentItem& item( iter->ItemL( aContent ) );
+
+    const TDesC8& type( ContentType( item ) );
+
+    if ( type == KContentTypeText )
+        {
+        // Find ui element
+        const TDesC& nodeId( 
+            iNodeIdGenerator->ContentNodeIdL( aPlugin, item ) ); 
+            
+        __TIME_MARK( xmlOverhead );
+
+        CXnNodeAppIf* property( FindNodeByClassL(  
+            nodeId, aIndex, info.Namespace() ) );
+
+        if( !property )
+            {
+            return KErrNotFound;
+            }
+        
+        TInt priority( ContentPriority( *property ) );
+        
+        __TIME_ENDMARK("XML UI: Lookup node by class", xmlOverhead);
+    	__PRINT(__DBG_FORMAT("\t[I]\tXML UI: Lookup node by class=%S"), &nodeId);
+
+        //Navigate to parent
+        CXnNodeAppIf* target( property->ParentL() );
+
+        if( !target )
+            {
+            return KErrNotSupported;
+            }
+        
+        // Check priority
+        if ( AllowPublishByPriority( *target, priority ) )
+            {
+            // Check if target is newsticker
+            MTransactionElement* element( NULL );
+            
+            if ( IsParentNewsticker( *target ) )
+                {
+                // Register callback interface for newsticker
+                CXnNodeAppIf *parent( target->ParentL() );
+                
+                if( !parent )
+                    {
+                    return KErrNotFound;
+                    }
+                                
+                RegisterNewstickerCallbackInterfaceL( *parent );
+                                               
+                iNTPublisher.Set( info.Name() );
+                iNTClass = AiUtility::CopyToBufferL( iNTClass, nodeId );
+                
+                element = iFactory->CreateNewsTickerTransactionElementL( 
+                        *target, aText, priority, aIndex );
+                }
+            else if( target->Type()->Type() == 
+                     XnListQueryDialogInterface::MXnListQueryDialogInterface::Type())
+                {
+                // Get the data interface for dialog and publish data
+                XnListQueryDialogInterface::MXnListQueryDialogInterface* listQuery( NULL );
+                XnComponentInterface::MakeInterfaceL( listQuery, *target );
+                LeaveIfNull( listQuery, KErrNotSupported );
+                listQuery->ReplaceItemL( aText, aIndex -1 );// plugins publish ordinals not indexes
+                return KErrNone;
+                }
+            else
+                {
+                // Create transaction element for text
+                // Not put to cleanupstack, because element is from our pool!
+                element = iFactory->CreateTextTransactionElementL( *target,
+                                                                    aText,
+                                                                    priority );
+                }
+            
+            iPolicyEvaluator->EvaluateContentPolicyL( 
+                    *target, element->PolicyArray() );
+                                                     
+            iPolicyEvaluator->EvaluateVisibilityPolicyL( 
+                    *target, element->PolicyArray() );
+                                                         
+            ProcessTransactionElementL( element );
+            }
+        else
+            {
+            return KErrAccessDenied;            
+            }
+        }
+    else
+        {
+        return KErrNotSupported;
+        }
+    
+    return KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// CContentRenderer::DoPublishL
+// 
+// ----------------------------------------------------------------------------
+//
+TInt CContentRenderer::DoPublishL( CHsContentPublisher& aPlugin, TInt aContent,
+    const TDesC8& aBuf, TInt aIndex )                                   
+    {
+    TInt retval( KErrNotSupported );
+    
+    // resolve content item
+    MAiContentItemIterator* iter( ContentItemIterator( 
+        aPlugin, CHsContentPublisher::EPublisherContent ) ); 
+            
+    if ( !iter )
+        {
+        return retval;
+        }
+    
+    const TAiContentItem& item( iter->ItemL( aContent ) );
+
+    const TDesC8& type( ContentType( item ) );
+    
+    const TDesC& nodeId( iNodeIdGenerator->ContentNodeIdL( aPlugin, item ) );
+
+    if( type == KContentTypeBitmap )
+        {
+        // Unpack icon from pointer
+        CGulIcon* icon( LeaveIfNull( UnpackPtr<CGulIcon>( aBuf ), KErrArgument ) );
+                
+        // Publish icon
+        retval = PublishIconL( aPlugin, nodeId, icon, aIndex );
+        }
+    else if ( type == KContentTypeImageSvg ||
+        type == KContentTypeData )
+        {
+        // Publish data
+        retval = PublishDataL( aPlugin, nodeId, aBuf, type, aIndex );
+        }
+
+    return retval;
+    }
+
+// ----------------------------------------------------------------------------
+// CContentRenderer::DoPublishL
+// 
+// ----------------------------------------------------------------------------
+//
+TInt CContentRenderer::DoPublishL( CHsContentPublisher& aPlugin, TInt aContent,
+    RFile& aFile, TInt aIndex )                                   
+    {
+    const THsPublisherInfo& info( aPlugin.PublisherInfo() );
+    
+    //Resolve content item
+    MAiContentItemIterator* iter( ContentItemIterator( 
+        aPlugin, CHsContentPublisher::EPublisherContent ) ); 
+
+    if ( !iter )
+        {
+        return KErrNotSupported;
+        }
+    
+    const TAiContentItem& item( iter->ItemL( aContent ) );
+
+    const TDesC8& type( ContentType( item ) );
+
+    // Image support
+    if ( type.Find( KContentTypeImage ) != KErrNotFound )
+        {
+        // Find ui element
+        const TDesC& nodeId( iNodeIdGenerator->ContentNodeIdL( aPlugin, item ) );
+
+        CXnNodeAppIf* property( FindNodeByClassL( 
+            nodeId, aIndex, info.Namespace() ) );
+                                        
+        if( !property )
+            {
+            return KErrNotFound;
+            }
+        
+        // Check priority
+        TInt priority( ContentPriority( *property ) );
+        
+        CXnNodeAppIf* target( property->ParentL() );
+        
+        if( !target )
+            {
+            return KErrNotSupported;
+            }
+
+        if ( AllowPublishByPriority( *target, priority ) )
+            {
+            // Check if target is newsticker
+            if ( IsParentNewsticker( *target ) )
+                {
+                // Register callback interface
+                CXnNodeAppIf *parent( target->ParentL() );
+                
+                if( !parent )
+                    {
+                    return KErrNotFound;
+                    }
+                                
+                RegisterNewstickerCallbackInterfaceL( *parent );
+                
+                iNTPublisher.Set( info.Name() );
+                iNTClass = AiUtility::CopyToBufferL( iNTClass, nodeId );           
+                }
+            
+            // Create transaction element for file
+            MTransactionElement* element =
+                iFactory->CreateImageTransactionElementL( 
+                        *target, aFile, priority );
+                                                          
+            iPolicyEvaluator->EvaluateContentPolicyL( 
+                    *target, element->PolicyArray() );
+                                                      
+            iPolicyEvaluator->EvaluateVisibilityPolicyL( 
+                    *target, element->PolicyArray() );
+                                                                     
+            ProcessTransactionElementL( element );
+            }
+        else
+            {
+            return KErrAccessDenied;
+            }
+        }
+    else 
+        {
+        return KErrNotSupported;        
+        }
+    
+    return KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// CContentRenderer::DoCleanL
+// 
+// ----------------------------------------------------------------------------
+//
+TInt CContentRenderer::DoCleanL( CHsContentPublisher& aPlugin, TInt aContent,
+    TInt aIndex )                                                
+    {
+    const THsPublisherInfo& info( aPlugin.PublisherInfo() );
+    
+    // Resolve content item
+    MAiContentItemIterator* iter( ContentItemIterator( 
+        aPlugin, CHsContentPublisher::EPublisherContent ) ); 
+            
+    if ( !iter )
+        {
+        return KErrNotSupported;
+        }
+    
+    const TAiContentItem& item( iter->ItemL( aContent ) );
+
+    const TDesC& nodeId( iNodeIdGenerator->ContentNodeIdL( aPlugin, item ) );
+
+    CXnNodeAppIf* property( FindNodeByClassL( 
+        nodeId, aIndex, info.Namespace() ) ); 
+            
+    if( !property )
+        {
+        return KErrNotFound;
+        }
+    
+    TInt priority( ContentPriority( *property ) );
+
+    // Navigate to parent
+    CXnNodeAppIf* target( property->ParentL() );
+
+    if( !target )
+        {
+        return KErrNotSupported;
+        }
+    
+    if ( !AllowPublishByPriority( *target, priority ) )
+        {
+        return KErrAccessDenied;
+        }
+
+    if ( IsParentNewsticker( *target ) )
+        {
+        CXnNodeAppIf *parent( target->ParentL() );
+        
+        if( !parent )
+            {
+            return KErrNotFound;
+            }
+               
+        RegisterNewstickerCallbackInterfaceL( *parent );
+        
+        iNTPublisher.Set( info.Name() );
+        iNTClass = AiUtility::CopyToBufferL( iNTClass, nodeId );
+        }
+    
+    if( target->Type()->Type() ==
+        XnListQueryDialogInterface::MXnListQueryDialogInterface::Type())
+        {
+        // Get the data interface for dialog and delete data
+        XnListQueryDialogInterface::MXnListQueryDialogInterface* listQuery( NULL );
+        XnComponentInterface::MakeInterfaceL( listQuery, *target );
+        LeaveIfNull( listQuery, KErrNotSupported );
+        listQuery->DeleteItem( aIndex -1 );// plugins publish ordinals not indexes
+        return KErrNone;
+        }
+    
+    // Create transaction element for empty content
+    MTransactionElement* element =
+        iFactory->CreateEmptyContentTransactionElementL( 
+                *target, aIndex );
+
+    iPolicyEvaluator->EvaluateEmptyContentPolicyL( 
+            *target, element->PolicyArray() );
+                                                   
+    iPolicyEvaluator->EvaluateVisibilityPolicyL( 
+            *target, element->PolicyArray() );
+                                                   
+    ProcessTransactionElementL( element );
+      
+    if ( priority > KErrNotFound ) // Only for prioritized elements
+        {
+        // Add current ui element into content refresh map
+        HBufC* uiElementId( PropertyValueL( 
+            *target, XnPropertyNames::common::KId ) );
+                                         
+        return RefreshContentL( uiElementId, priority );
+        }
+    
+    return KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// CContentRenderer::SetImmediateMode
+// 
+// ----------------------------------------------------------------------------
+//
+void CContentRenderer::SetImmediateMode( TBool aImmediateMode )
+    {
+    iImmediateMode = aImmediateMode;
+    }
+
+// ----------------------------------------------------------------------------
+// CContentRenderer::IsImmediateMode
+// 
+// ----------------------------------------------------------------------------
+//
+TBool CContentRenderer::IsImmediateMode() const
+    {
+    return iImmediateMode;
+    }
+
+// ----------------------------------------------------------------------------
+// CContentRenderer::ProcessTransactionElementL
+// 
+// ----------------------------------------------------------------------------
+//
+void CContentRenderer::ProcessTransactionElementL( 
+    MTransactionElement* aElement )
+    {
+    LeaveIfNull( aElement, KErrArgument );
+    
+    if ( IsImmediateMode() || iStack->IsEmpty() )
+        {
+        // No transaction. Commit element immediately
+        TBool layoutChanged( EFalse );
+        
+        RPropertyHashMap propertyHashMap;
+        CleanupClosePushL( propertyHashMap );
+        
+        aElement->CommitL( layoutChanged, propertyHashMap );
+        SetPropertyArraysL( propertyHashMap );
+        
+        CleanupStack::PopAndDestroy( &propertyHashMap );
+        
+        iFactory->ReleaseTransactionElement( aElement );
+        StartContentRefresh();
+        
+        // Re-layout
+        iAppUi.UiEngineL()->RenderUIL();
+        }
+    else
+        {
+        // Append transaction element to transaction
+        MTransaction* tr( iStack->Top() );
+        tr->Append( *aElement );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CContentRenderer::FindNodeByClassL
+// 
+// ----------------------------------------------------------------------------
+//
+CXnNodeAppIf* CContentRenderer::FindNodeByClassL( const TDesC& aCid,
+    TInt aIndex, const TDesC8& aNs )                                                  
+    {
+    // Find node
+    HBufC8* classId( CnvUtfConverter::ConvertFromUnicodeToUtf8L( aCid ) );
+    CleanupStack::PushL( classId );
+    
+    RPointerArray<CXnNodeAppIf> nodes( 
+        iAppUi.UiEngineL()->FindNodeByClassL( *classId, aNs ) );
+
+    CleanupStack::PopAndDestroy( classId );
+
+    CleanupClosePushL( nodes );
+
+    for ( TInt i = 0; i < nodes.Count(); ++i )
+        {
+        CXnNodeAppIf* node = nodes[i];
+
+        const TDesC8* name(
+            PropertyValue( *node, AiUiDef::xml::property::KName ) );
+
+        if ( name && ( *name == AiUiDef::xml::name::KOrdinal ) )
+            {
+            const TDesC8* value(
+                PropertyValue( *node, AiUiDef::xml::property::KValue ) );
+
+            if ( value )
+                {
+                // Try to parse index from string either
+                TInt32 index( 0 );
+
+                User::LeaveIfError( AiUtility::ParseInt( index, *value ) );
+
+                if ( index == aIndex )
+                    {
+                    CleanupStack::PopAndDestroy( &nodes );
+                    
+                    return node;
+                    }
+                }
+            }
+        else if ( name && ( *name == AiUiDef::xml::name::KTarget ) )
+            {            
+            const TDesC8* target(
+               PropertyValue( *node, AiUiDef::xml::property::KValue ) );
+            
+            CXnNodeAppIf* targetNode( 
+                FindNodeByIdL( *target, node->Namespace() ) );
+            
+            if ( targetNode )
+                {
+                CleanupStack::PopAndDestroy( &nodes );
+                
+                return targetNode;
+                }
+            }
+        else if ( nodes.Count() == 1 ) // Only one node in class
+            {
+            node = nodes[ 0 ];
+            
+            // No ordinal specified			
+			CleanupStack::PopAndDestroy( &nodes );
+			
+            return node;
+            }
+        }
+    
+    CleanupStack::PopAndDestroy( &nodes );
+    
+    return NULL; // Never reached. Needed to omit compiler warning
+    }
+
+// ----------------------------------------------------------------------------
+// CContentRenderer::FindNodeByIdL
+// 
+// ----------------------------------------------------------------------------
+//
+CXnNodeAppIf* CContentRenderer::FindNodeByIdL( const TDesC& aCid, 
+    const TDesC& aNs )
+    {
+    // Find node
+    return LeaveIfNull( 
+        iAppUi.UiEngineL()->FindNodeByIdL( aCid, aNs ), KErrNotFound );                        
+    }
+
+// ----------------------------------------------------------------------------
+// CContentRenderer::FindNodeByIdL
+// 
+// ----------------------------------------------------------------------------
+//
+CXnNodeAppIf* CContentRenderer::FindNodeByIdL( const TDesC8& aCid, 
+    const TDesC8& aNs )
+    {
+    // Find node
+    return LeaveIfNull( 
+        iAppUi.UiEngineL()->FindNodeByIdL( aCid, aNs ), KErrNotFound );                        
+    }
+
+// ----------------------------------------------------------------------------
+// CContentRenderer::PublishIconL
+// 
+// ----------------------------------------------------------------------------
+//
+TInt CContentRenderer::PublishIconL( CHsContentPublisher& aPlugin,
+    const TDesC& aCid, CGulIcon* aIcon, TInt aIndex, CXnNodeAppIf* aResource )
+    {
+    const THsPublisherInfo& info( aPlugin.PublisherInfo() );
+    
+    // Find proiperty element by class
+    CXnNodeAppIf* property( 
+        FindNodeByClassL( aCid, aIndex, info.Namespace() ) );                             
+    
+    if( !property )
+        {
+        return KErrNotFound;
+        }
+    
+    // Get priority information
+    TInt priority( ContentPriority( *property ) );
+    
+    // Navigate to parent
+    CXnNodeAppIf* target( property->ParentL() );
+    
+    if( !target )
+        {
+        return KErrNotFound;
+        }
+
+    // Check priority
+    if ( !AllowPublishByPriority( *target, priority ) )
+        {
+        return KErrAccessDenied;        
+        }
+    
+    // Special handling of newsticker
+    if ( IsParentNewsticker( *target ) )
+        {
+        // Register callback interface
+        CXnNodeAppIf *parent( target->ParentL() );
+        
+        if( !parent )
+            {
+            return KErrNotFound;
+            }
+                
+        RegisterNewstickerCallbackInterfaceL( *parent );
+        
+        iNTPublisher.Set( info.Name() );
+        iNTClass = AiUtility::CopyToBufferL( iNTClass, aCid );
+        }
+
+    MTransactionElement* element =
+        iFactory->CreateImageTransactionElementL( 
+            *target, aIcon, priority );
+
+    if ( aResource )
+        {
+        iPolicyEvaluator->EvaluateResourcePolicyL( 
+            *target, *aResource, element->PolicyArray() );
+
+        iPolicyEvaluator->EvaluateContentPolicyL( 
+            *target, element->PolicyArray() );
+                                                  
+        iPolicyEvaluator->EvaluateVisibilityPolicyL( 
+            *target, element->PolicyArray() );                                                     
+        }
+
+    else
+        {
+        iPolicyEvaluator->EvaluateContentPolicyL( 
+            *target, element->PolicyArray() );
+                                                  
+        iPolicyEvaluator->EvaluateVisibilityPolicyL( 
+            *target, element->PolicyArray() );                                                    
+        }
+
+    ProcessTransactionElementL( element );
+    
+    return KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// CContentRenderer::PublishDataL
+// 
+// ----------------------------------------------------------------------------
+//
+TInt CContentRenderer::PublishDataL( CHsContentPublisher& aPlugin,
+    const TDesC& aCid, const TDesC8& aData, const TDesC8& aContentType,
+    TInt aIndex, CXnNodeAppIf* aResource )                                     
+    {
+    const THsPublisherInfo& info( aPlugin.PublisherInfo() );
+    
+    CXnNodeAppIf* property( 
+        FindNodeByClassL( aCid, aIndex, info.Namespace() ) );                             
+
+    if( !property )
+        {
+        return KErrNotFound;
+        }
+    
+    TInt priority( ContentPriority( *property ) );
+    
+    // Navigate to parent
+    CXnNodeAppIf* target( property->ParentL() );
+    
+    if( !target )
+        {
+        return KErrNotFound;
+        }
+
+    if ( !AllowPublishByPriority( *target, priority ) )
+        {
+        return KErrAccessDenied;        
+        }
+
+    if( aContentType == KContentTypeData )
+        {
+        CXnComponent& component( target->ParentL()->Component() );
+        component.SetDataL( aData, aCid, aIndex );
+        return KErrNone;
+        }
+
+    if ( !CDataBufferTransactionElement::IsSupported( *target, aContentType ) )
+        {
+        return KErrNotSupported;        
+        }
+        
+    // Handle newsticker 
+    if ( IsParentNewsticker( *target ) )
+        {
+        CXnNodeAppIf *parent( target->ParentL() );
+        
+        if( !parent )
+            {
+            return KErrNotFound;
+            }
+                
+        RegisterNewstickerCallbackInterfaceL( *parent );
+        
+        iNTPublisher.Set( info.Name() );
+        iNTClass = AiUtility::CopyToBufferL( iNTClass, aCid );
+        }
+        
+    MTransactionElement* element =
+        iFactory->CreateDataBufferTransactionElementL( 
+            *target, aData, priority );
+                                                       
+    if ( aResource )
+        {
+        iPolicyEvaluator->EvaluateResourcePolicyL( 
+            *target, *aResource, element->PolicyArray() );
+                                                   
+        iPolicyEvaluator->EvaluateContentPolicyL( 
+            *target, element->PolicyArray() );
+                                                  
+        iPolicyEvaluator->EvaluateVisibilityPolicyL( 
+            *target, element->PolicyArray() );                                                     
+        }
+    else
+        {
+        iPolicyEvaluator->EvaluateContentPolicyL( 
+            *target, element->PolicyArray() );
+                                                  
+        iPolicyEvaluator->EvaluateVisibilityPolicyL( 
+            *target, element->PolicyArray() );                                                     
+        }
+
+    ProcessTransactionElementL( element );
+    
+    return KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// CContentRenderer::SetProperty
+// 
+// ----------------------------------------------------------------------------
+//
+TInt CContentRenderer::SetProperty( CHsContentPublisher& aPlugin,
+    const TDesC8& aElementId, const TDesC8& aPropertyName, 
+    const TDesC8& aPropertyValue )
     {
    return ( SetProperty( aPlugin, aElementId, 
                aPropertyName, aPropertyValue,
                MAiContentObserver::EValueString ) );
     }
 
-TInt CContentRenderer::SetProperty( MAiPropertyExtension& aPlugin,
-        const TDesC8& aElementId,
-        const TDesC8& aPropertyName,
-        const TDesC8& aPropertyValue,
-        MAiContentObserver::TValueType aValueType) 
+// ----------------------------------------------------------------------------
+// CContentRenderer::SetProperty
+// 
+// ----------------------------------------------------------------------------
+//
+TInt CContentRenderer::SetProperty( CHsContentPublisher& aPlugin,
+    const TDesC8& aElementId, const TDesC8& aPropertyName,        
+    const TDesC8& aPropertyValue, MAiContentObserver::TValueType aValueType )     
     {
     TInt error( KErrNone );
     TInt retval( KErrNone );
@@ -704,15 +1616,21 @@
     return error;
     }
 
-TInt CContentRenderer::SetPropertyL( MAiPropertyExtension& aPlugin,
-        const TDesC8& aElementId,
-        const TDesC8& aPropertyName,
-        const TDesC8& aPropertyValue,
-        MAiContentObserver::TValueType aValueType) 
+// ----------------------------------------------------------------------------
+// CContentRenderer::SetPropertyL
+// 
+// ----------------------------------------------------------------------------
+//
+TInt CContentRenderer::SetPropertyL( CHsContentPublisher& aPlugin,
+    const TDesC8& aElementId, const TDesC8& aPropertyName,    
+    const TDesC8& aPropertyValue, MAiContentObserver::TValueType aValueType )         
     {
-    TInt err = KErrNone;
+    TInt err( KErrNone ); 
     // Find node
-    CXnNodeAppIf* targetNode = FindNodeByIdL( aElementId, aPlugin.PublisherInfoL()->iNamespace );
+    
+    CXnNodeAppIf* targetNode( 
+        FindNodeByIdL( aElementId, aPlugin.PublisherInfo().Namespace() ) );
+    
     if ( targetNode )
        {
        CXnDomStringPool& sp( targetNode->UiEngineL()->StringPool() );
@@ -732,16 +1650,21 @@
        {
        err = KErrNotFound;
        }
+    
     return err;
     }
 
-
-CXnDomPropertyValue::TPrimitiveValueType 
-    CContentRenderer::DomPropertyValueType(
-            MAiContentObserver::TValueType aValueType)
+// ----------------------------------------------------------------------------
+// CContentRenderer::DomPropertyValueType
+// 
+// ----------------------------------------------------------------------------
+//
+CXnDomPropertyValue::TPrimitiveValueType CContentRenderer::DomPropertyValueType(     
+    MAiContentObserver::TValueType aValueType )
     {
-    CXnDomPropertyValue::TPrimitiveValueType type = 
-            CXnDomPropertyValue::EUnknown;
+    CXnDomPropertyValue::TPrimitiveValueType type(
+            CXnDomPropertyValue::EUnknown );
+    
     switch ( aValueType )
         {
         case MAiContentObserver::EValueNumber :
@@ -779,755 +1702,37 @@
             type = CXnDomPropertyValue::EUnknown;
             }
         }
+    
     return type;
     }
 
-void CContentRenderer::DoStartTransactionL( TInt aTxId )
-    {
-    MTransaction* tr = iFactory->CreateTransactionL( aTxId );
-    iStack->Push(tr);
-    SetImmediateMode(EFalse);
-    }
-
-TInt CContentRenderer::CanPublishL( MAiPropertyExtension& aPlugin,
-                                    TInt aContent,
-                                    TInt aIndex )
-    {
-    // Get content item for aContent
-    MAiContentItemIterator& iter( 
-            ContentItemIteratorL( aPlugin, EAiPublisherContent ) );
-    
-    const TAiContentItem& item( iter.ItemL( aContent ) );
-
-    // Lookup ui element
-    const TDesC& nodeId( iNodeIdGenerator->ContentNodeIdL( aPlugin, item ) );
-
-    CXnNodeAppIf* property( FindNodeByClassL( nodeId, aIndex, 
-                            aPlugin.PublisherInfoL()->iNamespace ) ); 
- 
-    if( !property )
-        {
-        return KErrNotFound;
-        }
-    
-    // Check content priority
-    TInt priority( GetContentPriority( *property ) );
-
-    CXnNodeAppIf* target( property->ParentL() );
-    
-    if( !target )
-        {
-        return KErrNotSupported;
-        }
-
-    if ( !AllowPublishByPriority( *target, priority ) )
-        {
-        return KErrAccessDenied;        
-        }
-
-    // Check if content type is supported by target
-    const TDesC8& contentType( ContentType( item ) );
-
-    if ( !iFactory->IsSupported( *target, contentType ) &&
-          target->Type()->Type() != XnPropertyNames::listquerydialog::KListQueryDialog )
-        {
-        return KErrNotSupported;
-        }
-    
-    return KErrNone;
-    }
-
-TInt CContentRenderer::DoPublishL( MAiPropertyExtension& aPlugin,
-                                   TInt aContent,
-                                   TInt aResource,
-                                   TInt aIndex )
-    {
-    TAiPublisherInfo *info = static_cast<TAiPublisherInfo*>(aPlugin.GetPropertyL( EAiPublisherInfo ));
-    if (!info)
-        {
-        return KErrNotFound;
-        }
-    // Read ref value.
-    MAiContentItemIterator& refIter( ContentItemIteratorL( aPlugin, EAiPublisherResources ) );
-    const TAiContentItem& ref( refIter.ItemL( aResource ) );
-
-    const TDesC8& refType( ContentType( ref ) );
-
-    // Resolve source node
-    const TDesC& nodeId = iNodeIdGenerator->ResourceNodeIdL(aPlugin, ref);
-    HBufC8* nodeId8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L(nodeId);
-    CleanupStack::PushL(nodeId8);
-    CXnNodeAppIf* source = NULL;
-    __TIME_MARK(xmlOverhead);
-    source = FindNodeByIdL( *nodeId8, info->iNamespace );
-    __TIME_ENDMARK("XML UI: Lookup node by id", xmlOverhead);
-    __PRINT(__DBG_FORMAT("\t[I]\tXML UI: Lookup node by id=%S"), &nodeId);
-    
-    CleanupStack::PopAndDestroy(nodeId8);
-    
-    // Fetch content id
-    MAiContentItemIterator& iter = ContentItemIteratorL( aPlugin, EAiPublisherContent );
-    const TAiContentItem& item = iter.ItemL( aContent );
-
-    const TDesC& targetId = iNodeIdGenerator->ContentNodeIdL(aPlugin, item);
-
-    TInt retval( KErrNotSupported );
-
-    // Check types
-    if ( refType == KContentTypeText )
-        {
-        // Fetch text
-        const TDesC8& text = source->GetPCData();
-        
-        // Delegate to data publishing function
-        retval = PublishDataL( aPlugin,
-                               targetId,
-                               text,
-                               refType,
-                               aIndex,
-                               source );
-        }
-    else if ( refType.Find( KContentTypeImage ) != KErrNotFound )
-        {
-        // Fetch icon
-        CGulIcon* icon = LoadIconLC( *source ); 
-        
-       // Delegate to icon publishing function
-        retval = PublishIconL( aPlugin,
-                               targetId,
-                               icon,
-                               aIndex,
-                               source );
-        
-        CleanupStack::Pop( icon );
-        }
-    
-    return retval;
-    }
-
-TInt CContentRenderer::DoPublishL( MAiPropertyExtension& aPlugin,
-                                   TInt aContent,
-                                   const TDesC16& aText,
-                                   TInt aIndex )
-    {
-    // Resolve content item
-    MAiContentItemIterator& iter( 
-            ContentItemIteratorL( aPlugin, EAiPublisherContent ) );
-    
-    const TAiContentItem& item( iter.ItemL( aContent ) );
-
-    const TDesC8& type( ContentType( item ) );
-
-    if ( type == KContentTypeText )
-        {
-        // Find ui element
-        const TDesC& nodeId = iNodeIdGenerator->ContentNodeIdL( aPlugin, item );
-
-        __TIME_MARK(xmlOverhead);
-
-        CXnNodeAppIf* property( FindNodeByClassL( nodeId, aIndex, 
-                                                  aPlugin.PublisherInfoL()->iNamespace ) );
-
-        if( !property )
-            {
-            return KErrNotFound;
-            }
-        
-        TInt priority( GetContentPriority( *property ) );
-        
-        __TIME_ENDMARK("XML UI: Lookup node by class", xmlOverhead);
-    	__PRINT(__DBG_FORMAT("\t[I]\tXML UI: Lookup node by class=%S"), &nodeId);
-
-        //Navigate to parent
-        CXnNodeAppIf* target( property->ParentL() );
-
-        if( !target )
-            {
-            return KErrNotSupported;
-            }
-        
-        // Check priority
-        if ( AllowPublishByPriority( *target, priority ) )
-            {
-            // Check if target is newsticker
-            MTransactionElement* element( NULL );
-            
-            if ( IsParentNewsticker( *target ) )
-                {
-                // Register callback interface for newsticker
-                CXnNodeAppIf *parent( target->ParentL() );
-                
-                if( !parent )
-                    {
-                    return KErrNotFound;
-                    }
-                                
-                RegisterNewstickerCallbackInterfaceL( *parent );
-                
-                const TAiPublisherInfo* info( aPlugin.PublisherInfoL() );
-                
-                if ( info )
-                    {
-                    iNTPublisher.Set( info->iName );
-                    iNTClass = AiUtility::CopyToBufferL( iNTClass, nodeId );
-                    }
-                
-                element = iFactory->CreateNewsTickerTransactionElementL( *target,
-                                                                    aText,
-                                                                    priority, 
-                                                                    aIndex );
-                }
-            else if( target->Type()->Type() == 
-                     XnListQueryDialogInterface::MXnListQueryDialogInterface::Type())
-                {
-                // Get the data interface for dialog and publish data
-                XnListQueryDialogInterface::MXnListQueryDialogInterface* listQuery( NULL );
-                XnComponentInterface::MakeInterfaceL( listQuery, *target );
-                LeaveIfNull( listQuery, KErrNotSupported );
-                listQuery->ReplaceItemL( aText, aIndex -1 );// plugins publish ordinals not indexes
-                return KErrNone;
-                }
-            else
-                {
-                // Create transaction element for text
-                // Not put to cleanupstack, because element is from our pool!
-                element = iFactory->CreateTextTransactionElementL( *target,
-                                                                    aText,
-                                                                    priority );
-                }
-            
-            iPolicyEvaluator->EvaluateContentPolicyL( *target,
-                                                      element->PolicyArray() );
-            iPolicyEvaluator->EvaluateVisibilityPolicyL( *target,
-                                                         element->PolicyArray() );
-
-            ProcessTransactionElementL( element );
-            }
-        else
-            {
-            return KErrAccessDenied;            
-            }
-        }
-    else
-        {
-        return KErrNotSupported;
-        }
-    
-    return KErrNone;
-    }
-
-TInt CContentRenderer::DoPublishL( MAiPropertyExtension& aPlugin,
-                                   TInt aContent,
-                                   const TDesC8& aBuf,
-                                   TInt aIndex )
-    {
-    // resolve content item
-    MAiContentItemIterator& iter( 
-            ContentItemIteratorL( aPlugin, EAiPublisherContent ) );
-    
-    const TAiContentItem& item( iter.ItemL( aContent ) );
-
-    const TDesC8& type( ContentType( item ) );
-
-    TInt retval( KErrNotSupported );
-    
-    if( type == KContentTypeBitmap )
-        {
-        // Unpack icon from pointer
-        CGulIcon* icon( LeaveIfNull( UnpackPtr<CGulIcon>( aBuf ), KErrArgument ) );
-
-        const TDesC& nodeId( iNodeIdGenerator->ContentNodeIdL( aPlugin, item ) );
-        
-        // Publish icon
-        retval = PublishIconL( aPlugin, nodeId, icon, aIndex );
-        }
-    else if ( type == KContentTypeImageSvg )
-        {
-        // Get node id
-        const TDesC& nodeId( iNodeIdGenerator->ContentNodeIdL( aPlugin, item ) );
-        
-        // Publish SVG data
-        retval = PublishDataL( aPlugin, nodeId, aBuf, KContentTypeImageSvg, aIndex );
-        }
-
-    return retval;
-    }
-
-TInt CContentRenderer::DoPublishL( MAiPropertyExtension& aPlugin,
-                                   TInt aContent,
-                                   RFile& aFile,
-                                   TInt aIndex)
-    {
-    //Resolve content item
-    MAiContentItemIterator& iter( 
-            ContentItemIteratorL( aPlugin, EAiPublisherContent ) );
-    
-    const TAiContentItem& item( iter.ItemL( aContent ) );
-
-    const TDesC8& type( ContentType( item ) );
-
-    // Image support
-    if ( type.Find( KContentTypeImage ) != KErrNotFound )
-        {
-        // Find ui element
-        const TDesC& nodeId( iNodeIdGenerator->ContentNodeIdL( aPlugin, item ) );
-
-        CXnNodeAppIf* property( FindNodeByClassL( nodeId, aIndex, 
-                                aPlugin.PublisherInfoL()->iNamespace ) );
-        
-        if( !property )
-            {
-            return KErrNotFound;
-            }
-        
-        // Check priority
-        TInt priority( GetContentPriority( *property ) );
-        
-        CXnNodeAppIf* target( property->ParentL() );
-        
-        if( !target )
-            {
-            return KErrNotSupported;
-            }
-
-        if ( AllowPublishByPriority( *target, priority ) )
-            {
-            // Check if target is newsticker
-            if ( IsParentNewsticker( *target ) )
-                {
-                // Register callback interface
-                CXnNodeAppIf *parent( target->ParentL() );
-                
-                if( !parent )
-                    {
-                    return KErrNotFound;
-                    }
-                                
-                RegisterNewstickerCallbackInterfaceL( *parent );
-                
-                const TAiPublisherInfo* info( aPlugin.PublisherInfoL() );
-                
-                if( info )
-                    {
-                    iNTPublisher.Set( info->iName );
-                    iNTClass = AiUtility::CopyToBufferL( iNTClass, nodeId );
-                    }
-                }
-            
-            // Create transaction element for file
-            MTransactionElement* element =
-                iFactory->CreateImageTransactionElementL( *target,
-                                                          aFile,
-                                                          priority );
-            
-            iPolicyEvaluator->EvaluateContentPolicyL( *target,
-                                                      element->PolicyArray() );
-            iPolicyEvaluator->EvaluateVisibilityPolicyL( *target,
-                                                         element->PolicyArray() );
-            
-            ProcessTransactionElementL( element );
-            }
-        else
-            {
-            return KErrAccessDenied;
-            }
-        }
-    else 
-        {
-        return KErrNotSupported;        
-        }
-    
-    return KErrNone;
-    }
-
-TInt CContentRenderer::DoCleanL( MAiPropertyExtension& aPlugin,
-                                 TInt aContent,
-                                 TInt aIndex )
-    {
-    // Resolve content item
-    MAiContentItemIterator& iter( 
-            ContentItemIteratorL( aPlugin, EAiPublisherContent ) );
-    
-    const TAiContentItem& item( iter.ItemL( aContent ) );
-
-    const TDesC& nodeId( iNodeIdGenerator->ContentNodeIdL( aPlugin, item ) );
-
-    CXnNodeAppIf* property( FindNodeByClassL( nodeId, aIndex, 
-                            aPlugin.PublisherInfoL()->iNamespace ) );
-
-    if( !property )
-        {
-        return KErrNotFound;
-        }
-    
-    TInt priority( GetContentPriority( *property ) );
-
-    // Navigate to parent
-    CXnNodeAppIf* target( property->ParentL() );
-
-    if( !target )
-        {
-        return KErrNotSupported;
-        }
-    
-    if ( !AllowPublishByPriority( *target, priority ) )
-        {
-        return KErrAccessDenied;
-        }
-
-    if ( IsParentNewsticker( *target ) )
-        {
-        CXnNodeAppIf *parent( target->ParentL() );
-        
-        if( !parent )
-            {
-            return KErrNotFound;
-            }
-               
-        RegisterNewstickerCallbackInterfaceL( *parent );
-        
-        const TAiPublisherInfo* info( aPlugin.PublisherInfoL() );
-        
-        if( info )
-            {
-            iNTPublisher.Set( info->iName );
-            iNTClass = AiUtility::CopyToBufferL( iNTClass, nodeId );
-            }
-        }
-    if( target->Type()->Type() ==
-        XnListQueryDialogInterface::MXnListQueryDialogInterface::Type())
-        {
-        // Get the data interface for dialog and delete data
-        XnListQueryDialogInterface::MXnListQueryDialogInterface* listQuery( NULL );
-        XnComponentInterface::MakeInterfaceL( listQuery, *target );
-        LeaveIfNull( listQuery, KErrNotSupported );
-        listQuery->DeleteItem( aIndex -1 );// plugins publish ordinals not indexes
-        return KErrNone;
-        }
-    
-    // Create transaction element for empty content
-    MTransactionElement* element =
-        iFactory->CreateEmptyContentTransactionElementL( *target, aIndex );
-
-    iPolicyEvaluator->EvaluateEmptyContentPolicyL( *target,
-                                                   element->PolicyArray() );
-    iPolicyEvaluator->EvaluateVisibilityPolicyL( *target,
-                                                   element->PolicyArray() );
-
-    ProcessTransactionElementL( element );
-      
-    if ( priority > KErrNotFound ) // Only for prioritized elements
-        {
-        // Add current ui element into content refresh map
-        HBufC* uiElementId = PropertyValueL( *target,
-                                         XnPropertyNames::common::KId );
-        return RefreshContentL( uiElementId, priority );
-        }
-    
-    return KErrNone;
-    }
-
-void CContentRenderer::SetImmediateMode( TBool aImmediateMode )
-    {
-    iImmediateMode = aImmediateMode;
-    }
-
-TBool CContentRenderer::IsImmediateMode() const
-    {
-    return iImmediateMode;
-    }
-
-void CContentRenderer::ProcessTransactionElementL( MTransactionElement* aElement )
-    {
-    LeaveIfNull( aElement, KErrArgument );
-    
-    if ( IsImmediateMode() || iStack->IsEmpty() )
-        {
-        // No transaction. Commit element immediately
-        TBool layoutChanged = EFalse;
-        
-        RPropertyHashMap propertyHashMap;
-        aElement->CommitL(layoutChanged, propertyHashMap);
-        SetPropertyArraysL( propertyHashMap );
-        propertyHashMap.Close();
-        
-        iFactory->ReleaseTransactionElement( aElement );
-        StartContentRefresh();
-        
-        // Re-layout
-        iAppUi.UiEngineL()->RenderUIL();
-        }
-    else
-        {
-        // Append transaction element to transaction
-        MTransaction* tr = iStack->Top();
-        tr->Append( *aElement );
-        }
-    }
-
-CXnNodeAppIf* CContentRenderer::FindNodeByClassL( const TDesC& aCid,
-                                                  TInt aIndex,
-                                                  const TDesC8& aNs )
-    {
-    // Find node
-    HBufC8* classId = CnvUtfConverter::ConvertFromUnicodeToUtf8L(aCid);
-    CleanupStack::PushL(classId);
-    
-    RPointerArray<CXnNodeAppIf> nodes = iAppUi.UiEngineL()->FindNodeByClassL( *classId, aNs );
-
-    CleanupStack::PopAndDestroy(classId);
-
-    CleanupClosePushL( nodes );
-
-    for ( TInt i = 0; i < nodes.Count(); ++i )
-        {
-        CXnNodeAppIf* node = nodes[i];
-
-        const TDesC8* name =
-            PropertyValue( *node, AiUiDef::xml::property::KName );
-
-        if ( name && ( *name == AiUiDef::xml::name::KOrdinal ) )
-            {
-            const TDesC8* value =
-                PropertyValue( *node, AiUiDef::xml::property::KValue );
-
-            if ( value )
-                {
-                // Try to parse index from string either
-
-                TInt32 index( 0 );
-                User::LeaveIfError( AiUtility::ParseInt( index, *value ) );
-
-                if ( index == aIndex )
-                    {
-                    CleanupStack::PopAndDestroy(&nodes);
-                    return node;
-                    }
-                }
-            }
-        else if ( name && ( *name == AiUiDef::xml::name::KTarget ) )
-            {            
-            const TDesC8* target =
-                           PropertyValue( *node, AiUiDef::xml::property::KValue );
-            
-            CXnNodeAppIf* targetNode = FindNodeByIdL( *target, node->Namespace() );
-            if ( targetNode )
-                {
-                CleanupStack::PopAndDestroy( &nodes );
-                return targetNode;
-                }
-            }
-        else if ( nodes.Count() == 1 ) // Only one node in class
-            {
-            // No ordinal specified
-			node = nodes[ 0 ];
-			CleanupStack::PopAndDestroy(&nodes);
-            return node;
-            }
-        }
-    
-    CleanupStack::PopAndDestroy( &nodes );
-    
-    return NULL; // Never reached. Needed to omit compiler warning
-    }
-
-CXnNodeAppIf* CContentRenderer::FindNodeByIdL( const TDesC& aCid, const TDesC& aNs )
-    {
-    // Find node
-    return LeaveIfNull( iAppUi.UiEngineL()->FindNodeByIdL( aCid, aNs ),
-                        KErrNotFound );
-    }
-
-CXnNodeAppIf* CContentRenderer::FindNodeByIdL( const TDesC8& aCid, const TDesC8& aNs )
-    {
-    // Find node
-    return LeaveIfNull( iAppUi.UiEngineL()->FindNodeByIdL( aCid, aNs ),
-                        KErrNotFound );
-    }
-
-TInt CContentRenderer::PublishIconL( MAiPropertyExtension& aPlugin,
-                                     const TDesC& aCid,
-                                     CGulIcon* aIcon,
-                                     TInt aIndex,
-                                     CXnNodeAppIf* aResource )
-    {
-    // Find proiperty element by class
-    CXnNodeAppIf* property( FindNodeByClassL( aCid, aIndex, 
-                            aPlugin.PublisherInfoL()->iNamespace ) );
-    
-    if( !property )
-        {
-        return KErrNotFound;
-        }
-    
-    // Get priority information
-    TInt priority( GetContentPriority( *property ) );
-    
-    // Navigate to parent
-    CXnNodeAppIf* target( property->ParentL() );
-    
-    if( !target )
-        {
-        return KErrNotFound;
-        }
-
-    // Check priority
-    if ( !AllowPublishByPriority( *target, priority ) )
-        {
-        return KErrAccessDenied;        
-        }
-    
-    // Special handling of newsticker
-    if ( IsParentNewsticker( *target ) )
-        {
-        // Register callback interface
-        CXnNodeAppIf *parent( target->ParentL() );
-        
-        if( !parent )
-            {
-            return KErrNotFound;
-            }
-                
-        RegisterNewstickerCallbackInterfaceL( *parent );
-        
-        const TAiPublisherInfo* info( aPlugin.PublisherInfoL() );
-        
-        if( info )
-            {
-            iNTPublisher.Set( info->iName );
-            iNTClass = AiUtility::CopyToBufferL( iNTClass, aCid );
-            }
-        }
-
-    MTransactionElement* element =
-        iFactory->CreateImageTransactionElementL( *target,
-                                                  aIcon,
-                                                  priority );
-
-    if ( aResource )
-        {
-        iPolicyEvaluator->EvaluateResourcePolicyL( *target,
-                                                   *aResource,
-                                                   element->PolicyArray() );
-        iPolicyEvaluator->EvaluateContentPolicyL( *target,
-                                                  element->PolicyArray() );
-        iPolicyEvaluator->EvaluateVisibilityPolicyL( *target,
-                                                     element->PolicyArray() );
-        }
-
-    else
-        {
-        iPolicyEvaluator->EvaluateContentPolicyL( *target,
-                                                  element->PolicyArray() );
-        iPolicyEvaluator->EvaluateVisibilityPolicyL( *target,
-                                                     element->PolicyArray() );
-        }
-
-    ProcessTransactionElementL( element );
-    
-    return KErrNone;
-    }
-
-TInt CContentRenderer::PublishDataL( MAiPropertyExtension& aPlugin,
-                                     const TDesC& aCid,
-                                     const TDesC8& aData,
-                                     const TDesC8& aContentType,
-                                     TInt aIndex,
-                                     CXnNodeAppIf* aResource )
-    {
-    CXnNodeAppIf* property( FindNodeByClassL( aCid, aIndex, 
-                            aPlugin.PublisherInfoL()->iNamespace ) );
-
-    if( !property )
-        {
-        return KErrNotFound;
-        }
-    
-    TInt priority( GetContentPriority( *property ) );
-    
-    // Navigate to parent
-    CXnNodeAppIf* target( property->ParentL() );
-    
-    if( !target )
-        {
-        return KErrNotFound;
-        }
-
-    if ( !AllowPublishByPriority( *target, priority ) )
-        {
-        return KErrAccessDenied;        
-        }
-
-    if ( !CDataBufferTransactionElement::IsSupported( *target, aContentType ) )
-        {
-        return KErrNotSupported;        
-        }
-        
-    // Handle newsticker 
-    if ( IsParentNewsticker( *target ) )
-        {
-        CXnNodeAppIf *parent( target->ParentL() );
-        
-        if( !parent )
-            {
-            return KErrNotFound;
-            }
-                
-        RegisterNewstickerCallbackInterfaceL( *parent );
-        
-        const TAiPublisherInfo* info( aPlugin.PublisherInfoL() );
-        
-        if( info )
-            {
-            iNTPublisher.Set( info->iName );
-            iNTClass = AiUtility::CopyToBufferL( iNTClass, aCid );
-            }
-        }
-        
-    MTransactionElement* element =
-        iFactory->CreateDataBufferTransactionElementL( *target,
-                                                       aData,
-                                                       priority );
-    
-    if ( aResource )
-        {
-        iPolicyEvaluator->EvaluateResourcePolicyL( *target,
-                                                   *aResource,
-                                                   element->PolicyArray() );
-        iPolicyEvaluator->EvaluateContentPolicyL( *target,
-                                                  element->PolicyArray() );
-        iPolicyEvaluator->EvaluateVisibilityPolicyL( *target,
-                                                     element->PolicyArray() );
-        }
-    else
-        {
-        iPolicyEvaluator->EvaluateContentPolicyL( *target,
-                                                  element->PolicyArray() );
-        iPolicyEvaluator->EvaluateVisibilityPolicyL( *target,
-                                                     element->PolicyArray() );
-        }
-
-    ProcessTransactionElementL( element );
-    
-    return KErrNone;
-    }
-
+// ----------------------------------------------------------------------------
+// CContentRenderer::AllowPublishByPriority
+// 
+// ----------------------------------------------------------------------------
+//
 TBool CContentRenderer::AllowPublishByPriority( CXnNodeAppIf& aUiElement,
-                                                TInt aPriority ) const
+    TInt aPriority ) const
     {
     // Get ui element id
-    const TDesC8* uiElementId = PropertyValue( aUiElement,
-                                               XnPropertyNames::common::KId );
-                                         
+    const TDesC8* uiElementId( 
+        PropertyValue( aUiElement, XnPropertyNames::common::KId ) );
+                                                                                        
     if ( uiElementId )
         {
         // compare given priority with the current value of ui element
         return iContentPriorityMap->OverrideContent( *uiElementId, aPriority );
         }
     
-    return EFalse; // priority cannot be used, because ui element does not have id
+    // priority cannot be used, because ui element does not have id
+    return EFalse; 
     }
 
+// ----------------------------------------------------------------------------
+// CContentRenderer::StartContentRefresh
+// 
+// ----------------------------------------------------------------------------
+//
 void CContentRenderer::StartContentRefresh()
     {
     // Cancel ongoing refresh
@@ -1542,14 +1747,13 @@
         }
     }
 
-/**
- * Adds ui element to list of refreshable elements
- *
- * @param aUiElementId ui element id
- * @param aOldPriority old priority value
- */                         
+// ----------------------------------------------------------------------------
+// CContentRenderer::RefreshContentL
+// 
+// ----------------------------------------------------------------------------
+//
 TInt CContentRenderer::RefreshContentL( HBufC* aUiElementId,
-                                        TInt aOldPriority )
+    TInt aOldPriority )
     {
     if( !aUiElementId )
         {
@@ -1563,11 +1767,12 @@
         {
         // Content refresh event cannot be sent
         CleanupStack::PopAndDestroy( aUiElementId );
+    
         return KErrNotReady;
         }
     
     // Find current mapping
-    TInt* oldPriority = iRefreshableUiElements.Find( *aUiElementId );
+    TInt* oldPriority( iRefreshableUiElements.Find( *aUiElementId ) );
     
     if ( oldPriority )
         {
@@ -1590,9 +1795,11 @@
     return KErrNone;
     }
 
-/**
- * Callback function to make content refreshing asynchronous
- */    
+// ----------------------------------------------------------------------------
+// CContentRenderer::RefreshContentCallback
+// 
+// ----------------------------------------------------------------------------
+//
 TInt CContentRenderer::RefreshContentCallback( TAny* aContentRenderer )
     {
     if ( !aContentRenderer )
@@ -1600,18 +1807,27 @@
         return KErrArgument;
         }
         
-    CContentRenderer* renderer = static_cast< CContentRenderer* >( aContentRenderer );
-    TRAP_IGNORE( renderer->SendRefreshContentEventL() );
+    CContentRenderer* self = 
+        static_cast< CContentRenderer* >( aContentRenderer );
+    
+    TRAP_IGNORE( self->SendRefreshContentEventL() );
+    
     return KErrNone;
     }
 
-/**
- * Sends Refresh content event to framework.
- * Event is sent for content selectors with lower priority than the
- * last content which has been cleaned from ui element.
- */ 
+// ----------------------------------------------------------------------------
+// CContentRenderer::SendRefreshContentEventL
+// 
+// ----------------------------------------------------------------------------
+//
 void CContentRenderer::SendRefreshContentEventL()
     {
+    /**
+     * Sends Refresh content event to framework.
+     * Event is sent for content selectors with lower priority than the
+     * last content which has been cleaned from ui element.
+     */ 
+
     // Cancel periodic timer.
     iTimer->Cancel();
     
@@ -1619,21 +1835,21 @@
     TPtrHashMapIter< TDesC, TInt> iter( iRefreshableUiElements );
     iter.Reset();
     
-    const TDesC* uiElementId = iter.NextKey(); // Never NULL
-    TInt priority = *( iter.CurrentValue() );
+    const TDesC* uiElementId( iter.NextKey() ); // Never NULL
+    TInt priority( *( iter.CurrentValue() ) );
     
     //  Cleanup item for iterator 
     TMapCleanupItem cleanup( iter );
     CleanupReleasePushL( cleanup );
     
     // Lookup ui element
-    CXnNodeAppIf* uiElement = FindNodeByIdL( *uiElementId );
+    CXnNodeAppIf* uiElement( FindNodeByIdL( *uiElementId ) );
     
     // Remove current ui element from the map
     CleanupStack::PopAndDestroy( &cleanup );
     
     // Find lower priority content elements associated to this ui element
-    RPointerArray< CXnNodeAppIf > children = uiElement->ChildrenL();
+    RPointerArray< CXnNodeAppIf > children( uiElement->ChildrenL() );
     
     // Remove higher priority content elements
     RemoveNonPriorityElements( children, priority );
@@ -1645,13 +1861,14 @@
     // Continue until first content gets published or array exhausts.
     for ( TInt i = 0; i < children.Count(); ++i )
         {
-        CXnNodeAppIf* current = children[ i ];
+        CXnNodeAppIf* current( children[ i ] );
         
         // Get content selector
-        const HBufC* contentSelector = PropertyValueL( *current,
-                                                       XnPropertyNames::common::KClass );
-        
-        if ( contentSelector && iFwEventHandler->RefreshContent( *contentSelector ))
+        const HBufC* contentSelector( 
+            PropertyValueL( *current, XnPropertyNames::common::KClass ) );
+                                                               
+        if ( contentSelector && 
+            iFwEventHandler->RefreshContent( *contentSelector ) )
             {
             break;
             }
@@ -1664,133 +1881,82 @@
     StartContentRefresh();    
     }
 
+// ----------------------------------------------------------------------------
+// CContentRenderer::TitleScrolled
+// 
+// ----------------------------------------------------------------------------
+//
 void CContentRenderer::TitleScrolled( TInt aTitleIndex )
     {
     if ( iCallbackHandler )
         {
-        TRAP_IGNORE( iCallbackHandler->TitleScrolledL( iNTPublisher,
-                                                       *iNTClass,
-                                                       aTitleIndex ) );
+        TRAP_IGNORE( iCallbackHandler->TitleScrolledL( 
+            iNTPublisher, *iNTClass, aTitleIndex ) );
         }
     }
-    
+
+// ----------------------------------------------------------------------------
+// CContentRenderer::TitleToScroll
+// 
+// ----------------------------------------------------------------------------
+//
 void CContentRenderer::TitleToScroll( TInt aTitleIndex )
     {
     if ( iCallbackHandler )
         {
-        TRAP_IGNORE( iCallbackHandler->TitleToScrollL( iNTPublisher,
-                                                       *iNTClass,
-                                                       aTitleIndex ) );        
+        TRAP_IGNORE( iCallbackHandler->TitleToScrollL( 
+            iNTPublisher, *iNTClass, aTitleIndex ) );
         }
     }
 
+// ----------------------------------------------------------------------------
+// CContentRenderer::IsParentNewsticker
+// 
+// ----------------------------------------------------------------------------
+//
 TBool CContentRenderer::IsParentNewsticker( CXnNodeAppIf& aTarget )
     {
-    CXnNodeAppIf* parent = NULL;
+    CXnNodeAppIf* parent( NULL );
+    
     TRAP_IGNORE( parent = aTarget.ParentL() );
+    
     if ( !parent )
         {
         return EFalse;
         }
-    CXnType* typeInfo = parent->Type();
     
-    if ( !typeInfo )
-        {
-        return EFalse;
-        }
-        
-    return ( typeInfo->Type() == XnNewstickerInterface::MXnNewstickerInterface::Type());
+    const TDesC8& type( parent->Type()->Type() ) ;
+            
+    return ( type == XnNewstickerInterface::MXnNewstickerInterface::Type() );
     }
     
-void CContentRenderer::RegisterNewstickerCallbackInterfaceL( CXnNodeAppIf& aTarget )
+// ----------------------------------------------------------------------------
+// CContentRenderer::RegisterNewstickerCallbackInterfaceL
+// 
+// ----------------------------------------------------------------------------
+//
+void CContentRenderer::RegisterNewstickerCallbackInterfaceL( 
+    CXnNodeAppIf& aTarget )
     {
     if ( !iCallbackHandler )
         {
         // Instantiate callback handler
-        CNewstickerCallbackHandler* handler = CNewstickerCallbackHandler::NewLC( *iFwEventHandler );
+        CNewstickerCallbackHandler* handler = 
+            CNewstickerCallbackHandler::NewLC( *iFwEventHandler );
 
         // Set callback handler
         iCallbackHandler = handler;
         CleanupStack::Pop( handler );
         }
-        // Obtain newsticker component interface
-        XnNewstickerInterface::MXnNewstickerInterface* newsticker = NULL;
-        XnComponentInterface::MakeInterfaceL( newsticker, aTarget );
-        
-        LeaveIfNull( newsticker, KErrGeneral );
-        
-        // Set callback interface
-        newsticker->SetCallbackInterfaceL( this );
-    }
 
-void CContentRenderer::CleanPluginFromUiL( MAiPropertyExtension& aPlugin )
-    {
-    TInt itemCount = 0;
-    
-    // Resolve content items
-    MAiContentItemIterator& iter = ContentItemIteratorL( aPlugin, EAiPublisherContent );
-    iter.Reset();
+    // Obtain newsticker component interface
+    XnNewstickerInterface::MXnNewstickerInterface* newsticker( NULL );
+    XnComponentInterface::MakeInterfaceL( newsticker, aTarget );
     
-    // Clean all content items
-    while ( iter.HasNext() )
-        {
-        const TAiContentItem& item = iter.NextL();
-
-        const TDesC& nodeId = iNodeIdGenerator->ContentNodeIdL( aPlugin, item );
-        
-        // Find nodes
-        HBufC8* nodeId8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L(nodeId);
-        CleanupStack::PushL(nodeId8);
-
-        RPointerArray<CXnNodeAppIf> nodes = iAppUi.UiEngineL()->FindNodeByClassL( 
-            *nodeId8, aPlugin.PublisherInfoL()->iNamespace );
-
-        CleanupStack::PopAndDestroy(nodeId8);
-
-        itemCount += nodes.Count(); 
-        
-        CleanupClosePushL( nodes );
-
-        for ( TInt i = 0; i < nodes.Count(); ++i )
-            {
-            CXnNodeAppIf* property = nodes[i];
-            
-            TInt priority = GetContentPriority( *property );
-
-            // Navigate to parent
-            CXnNodeAppIf* target = LeaveIfNull( property->ParentL(), KErrNotFound );
-
-            if ( AllowPublishByPriority( *target, priority ) )
-                {
-                // Create transaction element for empty content
-                MTransactionElement* element =
-                    iFactory->CreateEmptyContentTransactionElementL( *target, 0 );
-
-                iPolicyEvaluator->EvaluateEmptyContentPolicyL( *target,
-                                                               element->PolicyArray() );
-                iPolicyEvaluator->EvaluateVisibilityPolicyL( *target,
-                                                               element->PolicyArray() );
-                                                      
-                ProcessTransactionElementL( element );
-                  
-                if ( priority > KErrNotFound ) // Only for prioritized elements
-                    {
-                    // Add current ui element into content refresh map
-                    HBufC* uiElementId = PropertyValueL( *target,
-                                                         XnPropertyNames::common::KId );
-                    RefreshContentL( uiElementId, priority );
-                    }
-                }
-            }
-            
-        CleanupStack::PopAndDestroy(&nodes);
-        }
-        
-    if ( itemCount == 0 )
-        {
-        //Nothing to clean from UI. Cancel transaction outside current trap harness
-        User::Leave( KErrNotFound );
-        }
+    LeaveIfNull( newsticker, KErrGeneral );
+    
+    // Set callback interface
+    newsticker->SetCallbackInterfaceL( this );
     }
 
 //  End of File