Revision: 201033 RCL_3 PDK_3.0.3
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 14 Sep 2010 21:55:16 +0300
branchRCL_3
changeset 118 8baec10861af
parent 114 a5a39a295112
child 122 6cadd6867c17
Revision: 201033 Kit: 201035
contentcontrolsrv/ccsrv/src/ccsrv.cpp
contentcontrolsrv/ccsrv/src/ccsrvsession.cpp
contentpublishingsrv/contentpublishingserver/cpserver/src/cpactiondatacache.cpp
contentpublishingsrv/contentpublishingutils/pluginvalidator/group/pluginvalidator.mmp
contentpublishingsrv/contentpublishingutils/pluginvalidator/inc/charvesterpluginvalidator.h
contentpublishingsrv/contentpublishingutils/pluginvalidator/inc/chplugindebug.h
contentpublishingsrv/contentpublishingutils/pluginvalidator/inc/cpluginvalidator.h
contentpublishingsrv/contentpublishingutils/pluginvalidator/src/charvesterpluginvalidator.cpp
contentpublishingsrv/contentpublishingutils/pluginvalidator/src/cpluginvalidator.cpp
homescreenpluginsrv/conf/hsps.confml
homescreenpluginsrv/conf/hsps_200159c9.crml
homescreenpluginsrv/conf/hsps_qhd.confml
homescreenpluginsrv/conf/hsps_vga.confml
homescreenpluginsrv/group/bld.inf
homescreenpluginsrv/hspsmanager/inc/hspsconfiguration.h
homescreenpluginsrv/hspsmanager/inc/hspsinstallationhandler.h
homescreenpluginsrv/hspsmanager/inc/hspsmaintenancehandler.h
homescreenpluginsrv/hspsmanager/inc/hspsserverutil.h
homescreenpluginsrv/hspsmanager/src/hspsclientrequesthandler.cpp
homescreenpluginsrv/hspsmanager/src/hspsinstallationhandler.cpp
homescreenpluginsrv/hspsmanager/src/hspsmaintenancehandler.cpp
homescreenpluginsrv/hspsmanager/src/hspsserverutil.cpp
homescreenpluginsrv/hspsmanager/src/hspsthemeserver.cpp
homescreenpluginsrv/hspsmanager/src/hspsthemeserversession.cpp
homescreensrv_plat/ai_variation_api/inc/activeidle2domaincrkeys.h
homescreensrv_plat/hs_widget_publisher_api/src/hswidgetitem.cpp
homescreensrv_plat/hs_widget_publisher_api/tsrc/src/TestHspApiBlocks.cpp
homescreensrv_plat/sapi_homescreenplugin/hspsservice/src/hspsconfigurationservice.cpp
homescreensrv_plat/sapi_homescreenplugin/src/hspsliwutilities.cpp
homescreensrv_plat/sapi_homescreenplugin/tsrc/hspsconfigurationif/group/mt_hspsconfigurationif.mmp
homescreensrv_plat/sapi_homescreenplugin/tsrc/hspsconfigurationif/src/mt_hspsconfigurationif.cpp
idlefw/conf/activeidle2.confml
idlefw/conf/activeidle2_10275102.crml
idlefw/plugins/devicestatus/inc/aimcnpublisher.h
idlefw/plugins/devicestatus/src/aicontentobserveroptimizer.cpp
idlefw/plugins/devicestatus/src/aimcnpublisher.cpp
idlefw/plugins/devicestatus/src/ainetworkinfolistener.cpp
idlefw/plugins/devicestatus/src/ainwspublisher.cpp
idlefw/plugins/devicestatus/src/aioperatornamepublisher.cpp
idlefw/plugins/devicestatus/src/aipublishprioritizer.cpp
idlefw/plugins/mcsplugin/handler/src/mcspluginhandler.cpp
idlefw/plugins/mcsplugin/publisher/inc/mcsplugindata.h
idlefw/plugins/mcsplugin/publisher/inc/mcspluginengine.h
idlefw/plugins/mcsplugin/publisher/src/mcsplugin.cpp
idlefw/plugins/mcsplugin/publisher/src/mcsplugindata.cpp
idlefw/plugins/mcsplugin/publisher/src/mcspluginengine.cpp
idlefw/plugins/mcsplugin/settings/inc/mcspluginsettings.h
idlefw/plugins/mcsplugin/settings/inc/mcspluginsettingsapplist.h
idlefw/plugins/mcsplugin/settings/inc/mcspluginsettingscontainer.h
idlefw/plugins/mcsplugin/settings/inc/mcspluginsettingsmodel.h
idlefw/plugins/mcsplugin/settings/src/mcspluginsettings.cpp
idlefw/plugins/mcsplugin/settings/src/mcspluginsettingsapplist.cpp
idlefw/plugins/mcsplugin/settings/src/mcspluginsettingsbkmlist.cpp
idlefw/plugins/mcsplugin/settings/src/mcspluginsettingscontainer.cpp
idlefw/plugins/mcsplugin/settings/src/mcspluginsettingsmodel.cpp
idlefw/plugins/sapidataplugin/src/sapidataplugin.cpp
idlefw/plugins/wrtdataplugin/src/wrtdataplugin.cpp
idlefw/src/framework/aicpsexecuteparam.cpp
idlefw/src/framework/aipluginfactory.cpp
idlefw/src/framework/aiuicontrollermanager.cpp
idlefw/tsrc/devicestatusplugin/group/MT_DevStaPlg.mmp
idlefw/tsrc/devicestatusplugin/mt_devstaplg/MT_DevStaPlg.cpp
idlefw/tsrc/devicestatusplugin/mt_devstaplg/contentobserver.cpp
idlefw/tsrc/devicestatusplugin/stub/group/devstaplg.mmp
idlefw/tsrc/devicestatusplugin/stub/src/profileengine.cpp
idlefw/tsrc/mcsplugin/ut_mcsplugin/ut_mcspluginpublisher.cpp
layers.sysdef.xml
menucontentsrv/group/mcsmenu.mmp
menucontentsrv/group/mcsmenusrv.mmp
menucontentsrv/srvinc/mcsdrmhandler.h
menucontentsrv/srvinc/mcsinstallnotifier.h
menucontentsrv/srvinc/mcsinstallstrategy.h
menucontentsrv/srvinc/menusrvappscanner.h
menucontentsrv/srvsrc/mcscachehandler.cpp
menucontentsrv/srvsrc/mcsdrmhandler.cpp
menucontentsrv/srvsrc/mcsinstallnotifier.cpp
menucontentsrv/srvsrc/mcsinstallstrategy.cpp
menucontentsrv/srvsrc/menusrvappscanner.cpp
menucontentsrv/srvsrc/menusrveng.cpp
xcfw/src/xcfwlocalizer.cpp
--- a/contentcontrolsrv/ccsrv/src/ccsrv.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/contentcontrolsrv/ccsrv/src/ccsrv.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -251,7 +251,7 @@
     CCcSrv::TCcProvider provider;
     provider.iId = aProvider;
     provider.iSession = aSession;
-    iProviders.Append( provider );
+    iProviders.AppendL( provider );
     
     // Register possible active observers
     for ( TUint32 i = 0; i < iObservers.Count(); i++ )
@@ -283,7 +283,7 @@
     CCcSrv::TCcObserver observer;
     observer.iProviderId = aProvider;
     observer.iObserver = aSession->Id();
-    iObservers.Append( observer );
+    iObservers.AppendL( observer );
     }
 
 // -----------------------------------------------------------------------------
--- a/contentcontrolsrv/ccsrv/src/ccsrvsession.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/contentcontrolsrv/ccsrv/src/ccsrvsession.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -440,18 +440,18 @@
     CCcSrvMsg* message = CCcSrvMsg::NewL();
     CleanupStack::PushL( message );
     message->InternalizeL( stream );
-    message->SetMessage( aMessage );
+    message->SetFunction( aMessage.Function() );
     message->SetSender( iId );
 
+    aMessage.Complete( KErrNone );
+
     // Forward notification to observers
     for ( TInt i = 0; i < iObservers.Count(); i++ )
         {
         message->SetReceiver( iObservers[ i ] );
         Server().SendMsgL( *message );
         }
-    
-    message->Message().Complete( KErrNone );
-    
+        
     CleanupStack::PopAndDestroy( message );
     CleanupStack::PopAndDestroy( msgBuf );
     }
--- a/contentpublishingsrv/contentpublishingserver/cpserver/src/cpactiondatacache.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/contentpublishingsrv/contentpublishingserver/cpserver/src/cpactiondatacache.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -29,14 +29,14 @@
 
 _LIT8(KCachedMap, "cached_map");
 
-static const int KMaxCacheItems = 18; 
+static const int KMaxCacheItems = 24;
 
 
 // ======== MEMBER FUNCTIONS ========
 
 
 // ---------------------------------------------------------------------------
-// 
+//
 // ---------------------------------------------------------------------------
 //
 CCPActionDataCache* CCPActionDataCache::NewL()
@@ -47,7 +47,7 @@
     }
 
 // ---------------------------------------------------------------------------
-// 
+//
 // ---------------------------------------------------------------------------
 //
 CCPActionDataCache* CCPActionDataCache::NewLC()
@@ -59,7 +59,7 @@
     }
 
 // ---------------------------------------------------------------------------
-// 
+//
 // ---------------------------------------------------------------------------
 //
 void CCPActionDataCache::ConstructL( )
@@ -68,7 +68,7 @@
     }
 
 // ---------------------------------------------------------------------------
-// 
+//
 // ---------------------------------------------------------------------------
 //
 CCPActionDataCache::CCPActionDataCache()
@@ -76,7 +76,7 @@
     }
 
 // ---------------------------------------------------------------------------
-// 
+//
 // ---------------------------------------------------------------------------
 //
 CCPActionDataCache::~CCPActionDataCache()
@@ -88,7 +88,7 @@
     }
 
 // ---------------------------------------------------------------------------
-// 
+//
 // ---------------------------------------------------------------------------
 //
 void CCPActionDataCache::HandleCacheRemoveL(const CLiwMap* aMap)
@@ -101,7 +101,7 @@
     }
 
 // ---------------------------------------------------------------------------
-// 
+//
 // ---------------------------------------------------------------------------
 //
 void CCPActionDataCache::AppendL( const CLiwGenericParamList* aParamList)
@@ -122,7 +122,7 @@
         map->InsertL(KCachedMap, TLiwVariant(inputMap));
         iInternalList->AppendL(TLiwVariant(map));
         CleanupStack::PopAndDestroy(map);
-    
+
         if (iInternalList->Count() > KMaxCacheItems)
             {
             iInternalList->Remove(0);
@@ -131,7 +131,7 @@
     }
 
 // ---------------------------------------------------------------------------
-// 
+//
 // ---------------------------------------------------------------------------
 //
 void CCPActionDataCache::AppendEmptyL( const CLiwMap* aIdsMap )
@@ -147,7 +147,7 @@
     }
 
 // ---------------------------------------------------------------------------
-// 
+//
 // ---------------------------------------------------------------------------
 //
 TBool CCPActionDataCache::IsCacheableL(const CLiwMap* aMap)
@@ -171,7 +171,7 @@
     }
 
 // ---------------------------------------------------------------------------
-// 
+//
 // ---------------------------------------------------------------------------
 //
 TBool CCPActionDataCache::ExistL(const CLiwMap* aMap)
@@ -185,7 +185,7 @@
     }
 
 // ---------------------------------------------------------------------------
-// 
+//
 // ---------------------------------------------------------------------------
 //
 void CCPActionDataCache::GetL(const CLiwMap* aMap,
@@ -211,7 +211,7 @@
     }
 
 // ---------------------------------------------------------------------------
-// 
+//
 // ---------------------------------------------------------------------------
 //
 TBool CCPActionDataCache::MatchL(const CLiwMap* aCachedMap,
@@ -244,7 +244,7 @@
     }
 
 // ---------------------------------------------------------------------------
-// 
+//
 // ---------------------------------------------------------------------------
 //
 TBool CCPActionDataCache::TypesMatchL(const CLiwMap* aCachedMap,
@@ -277,7 +277,7 @@
     }
 
 // ---------------------------------------------------------------------------
-// 
+//
 // ---------------------------------------------------------------------------
 //
 void CCPActionDataCache::ExtractRBufL(const TLiwVariant& aVariant, RBuf& aBuf)
@@ -299,7 +299,7 @@
     }
 
 // ---------------------------------------------------------------------------
-// 
+//
 // ---------------------------------------------------------------------------
 //
 TBool CCPActionDataCache::MatchL(const CLiwMap* aLeft, const CLiwMap* aRight,
@@ -320,7 +320,7 @@
     }
 
 // ---------------------------------------------------------------------------
-// 
+//
 // ---------------------------------------------------------------------------
 //
 TBool CCPActionDataCache::IsSpecifiedL(const CLiwMap* aMap,
@@ -339,7 +339,7 @@
     }
 
 // ---------------------------------------------------------------------------
-// 
+//
 // ---------------------------------------------------------------------------
 //
 TInt CCPActionDataCache::FindL(const CLiwMap* aKey)
--- a/contentpublishingsrv/contentpublishingutils/pluginvalidator/group/pluginvalidator.mmp	Wed Sep 01 12:22:09 2010 +0100
+++ b/contentpublishingsrv/contentpublishingutils/pluginvalidator/group/pluginvalidator.mmp	Tue Sep 14 21:55:16 2010 +0300
@@ -22,15 +22,15 @@
 TARGETTYPE      dll
 
 UID             0x1000008D 0x2001CB6C
- 
+
 CAPABILITY      CAP_GENERAL_DLL
 VENDORID 		VID_DEFAULT
 
 LANG 			SC
 
-SOURCEPATH      ../src 
-SOURCE          cpluginvalidator.cpp 
-SOURCE          cblacklisthandler.cpp 
+SOURCEPATH      ../src
+SOURCE          cpluginvalidator.cpp
+SOURCE          cblacklisthandler.cpp
 SOURCE          charvesterpluginvalidator.cpp
 
 USERINCLUDE     ../inc
@@ -39,7 +39,8 @@
 MW_LAYER_SYSTEMINCLUDE
 
 LIBRARY         euser.lib
-LIBRARY	        ecom.lib
-LIBRARY		    estor.lib
-LIBRARY         centralrepository.lib 
+LIBRARY         ecom.lib
+LIBRARY         estor.lib
+LIBRARY         centralrepository.lib
+LIBRARY         flogger.lib
 //end of file
--- a/contentpublishingsrv/contentpublishingutils/pluginvalidator/inc/charvesterpluginvalidator.h	Wed Sep 01 12:22:09 2010 +0100
+++ b/contentpublishingsrv/contentpublishingutils/pluginvalidator/inc/charvesterpluginvalidator.h	Tue Sep 14 21:55:16 2010 +0300
@@ -12,7 +12,7 @@
 * Contributors:
 *
 * Description:
- *
+*
 */
 
 
@@ -100,7 +100,7 @@
      * Callback used for delayed update
      */
     static TInt UpdateCallback( TAny* aValidator );
-    
+
 private:
 
     /**
@@ -114,12 +114,19 @@
      * Own
      */
     RProperty iInProgressProperty;
-    
+
     /*
      * Idle AO used for delayed update
      * Own
      */
     CIdle* iUpdateIdle;
+
+    /**
+     * Array containing plugins to be updated.
+     * Own.
+     */
+    RArray<TPluginInfo> iUpdatePluginArray;
+
     };
 
 #endif // CHARVESTERPLUGINVALIDATOR_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contentpublishingsrv/contentpublishingutils/pluginvalidator/inc/chplugindebug.h	Tue Sep 14 21:55:16 2010 +0300
@@ -0,0 +1,82 @@
+/*
+* Copyright (c) 2006-2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+#ifndef CPSDEBUG_H
+#define CPSDEBUG_H
+
+// INCLUDES
+#include <e32std.h>
+#include <flogger.h>
+
+// Maximum formatted size resulting from a single DEBUG* call
+#ifndef MAX_DEBUG_STRING_LENGTH
+#define MAX_DEBUG_STRING_LENGTH 4096
+#endif
+
+#ifdef _DEBUG
+// ----------------------------------------------------------
+// Debug file - debug output is disabled if the parent dir does not exist
+_LIT(KPerformanceLogDir, "cps");
+_LIT(KPerformanceLogFile, "pluginvalidator_perf.txt");
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+static void DoOutputPerf(TDesC8& aData)
+    {
+    RFileLogger::Write( KPerformanceLogDir,
+                       KPerformanceLogFile,
+                       EFileLoggingModeAppend,
+                       aData );
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+static void DebugStringNarrowPerfL(const char* aFmt, ...)
+    {
+    VA_LIST args;
+    VA_START(args, aFmt);
+
+    TPtrC8 fmt(reinterpret_cast<const unsigned char *>(aFmt));
+    HBufC8* buf = HBufC8::NewLC(MAX_DEBUG_STRING_LENGTH);
+    buf->Des().FormatList(fmt, args);
+    buf->Des().Append('\n');
+
+    TTime timestamp;
+    timestamp.HomeTime();
+
+    TBuf<64> dateTimeString;
+    TBuf8<64> dateTimeString8;
+
+    _LIT(KTimeString, "%:0%J%:1%T%:2%S%.%*C4%:3");
+    timestamp.FormatL(dateTimeString, KTimeString);
+    dateTimeString8.Copy( dateTimeString );
+    buf->Des().Insert( 0, _L8(" -> ") );
+    buf->Des().Insert( 0, dateTimeString8 );
+
+    DoOutputPerf(*buf);
+    CleanupStack::PopAndDestroy(buf);
+
+    VA_END(args);
+    }
+
+#define CPSPERF(x) TRAP_IGNORE( DebugStringNarrowPerfL x )
+#else
+#define CPSPERF(x)
+#endif
+
+#endif // CPSDEBUG_H
\ No newline at end of file
--- a/contentpublishingsrv/contentpublishingutils/pluginvalidator/inc/cpluginvalidator.h	Wed Sep 01 12:22:09 2010 +0100
+++ b/contentpublishingsrv/contentpublishingutils/pluginvalidator/inc/cpluginvalidator.h	Tue Sep 14 21:55:16 2010 +0300
@@ -11,7 +11,7 @@
 *
 * Contributors:
 *
-* Description:  
+* Description:
  *
 */
 
@@ -30,23 +30,23 @@
 /**
  *  Class containing information regarding a plugin
  *
- * 
+ *
  *  @lib cpclient.dll
  *  @since S60 v 5.0
  */
 NONSHARABLE_CLASS( TPluginInfo )
-	{
+    {
 public:
-	TAny* iPlugin; // not own
-	TUid iImplementationUid;
-	TInt iVersion;
-	TUid iDtor_ID_Key;
-	};
+    TAny* iPlugin; // not own
+    TUid iImplementationUid;
+    TInt iVersion;
+    TUid iDtor_ID_Key;
+    };
 
 /**
  *  Class used to maintain required ECOM plugins implementations
  *
- * 
+ *
  *  @lib cpclient.dll
  *  @since S60 v 5.0
  */
@@ -56,15 +56,15 @@
 
     /**
      * Two-phased constructor.
-     * 
-     */     
-    IMPORT_C static CPluginValidator* NewL( TUid aUid, 
+     *
+     */
+    IMPORT_C static CPluginValidator* NewL( TUid aUid,
                                             TAny *aParameter = NULL );
 
     /**
      * Two-phased constructor.
-     * 
-     */     
+     *
+     */
     IMPORT_C static CPluginValidator* NewLC( TUid aUid,
                                              TAny *aParameter = NULL );
 
@@ -73,7 +73,7 @@
      *
      * @param aUid required plugin
      * @return pointer to plugin implementation
-     */   
+     */
     IMPORT_C TAny* GetImplementation( TUid aUid );
 
     /**
@@ -81,19 +81,19 @@
      *
      * @param aIndex index of plugin
      * @return pointer to plugin implementation
-     */   
+     */
     IMPORT_C TAny* GetImplementation( TInt aIndex );
-    
+
     /**
      * Gets number of plugins
      *
      * @return number of plugins
-     */    
+     */
     IMPORT_C TInt GetCount();
-    
+
     /**
      * Desctructor.
-     */     
+     */
     virtual ~CPluginValidator();
 
 protected:
@@ -120,59 +120,59 @@
 
     /**
      * C++ default constructor.
-     */    
+     */
     CPluginValidator( TUid aUid, TAny *aParameter );
 
     /**
      * Perform the second phase construction of a CPluginValidator object.
-     */    
+     */
     void ConstructL();
-    
+
     /*
      * Checks if plugin is present in an array
      */
-    TBool PresentInArrayL( TPluginInfo aPluginInfo, 
-    		const RImplInfoPtrArray& aInfoArray );
+    TBool PresentInArrayL( TPluginInfo aPluginInfo,
+        const RImplInfoPtrArray& aInfoArray );
 
     /*
-     * 
+     *
      */
-    void DestroyPlugin( TInt aIndex );    
-    
+    void DestroyPlugin( TInt aIndex );
+
     /**
      * Cleans plugins table;
-     */    
+     */
     void CleanPluginsTable();
-    
+
     /**
      * Loads or destroys plugins
-     */    
-    virtual void ManagePluginsL();    
+     */
+    virtual void ManagePluginsL();
 
     /**
      * Loads ECOM plugins
-     */    
-    virtual void LoadPluginL( TPluginInfo& aPluginInfo );    
-    
+     */
+    virtual void LoadPluginL( TPluginInfo& aPluginInfo );
+
 protected:
-    
+
     /**
      * ECOM handler
      * Own.
      */
     REComSession* iSession;
-    
+
     /**
      * Array containing plugins
      * Own.
      */
     RArray<TPluginInfo> iPluginArray;
-    
+
     /**
      * UID of the interface
      */
     const TUid iUid;
-        
+
     /**
      * Parameter to pass to the object creation method.
      */
--- a/contentpublishingsrv/contentpublishingutils/pluginvalidator/src/charvesterpluginvalidator.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/contentpublishingsrv/contentpublishingutils/pluginvalidator/src/charvesterpluginvalidator.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -21,6 +21,7 @@
 #include <contentharvesterplugin.h> // harvesting plugin
 #include "charvesterpluginvalidator.h"
 #include "cblacklisthandler.h"
+#include "chplugindebug.h"
 
 const TUint32 KInProgressPropertyKey =
     {
@@ -70,6 +71,7 @@
     iInProgressProperty.Close();
     delete iBlacklist;
     delete iUpdateIdle;
+    iUpdatePluginArray.Close();
     }
 
 // ----------------------------------------------------------------------------
@@ -91,7 +93,6 @@
     {
     iBlacklist = CBlacklistHandler::NewL();
     iUpdateIdle = CIdle::NewL( CActive::EPriorityIdle );
-    iUpdateIdle->Start( TCallBack( UpdateCallback, this ) );
     CPluginValidator::ConstructL();
     }
 
@@ -125,9 +126,13 @@
     iBlacklist->CopyBlacklistL(ETrue);
 
     // set property value to 1 (which means "in progress")
-    iInProgressProperty.Set(TUid::Uid(KHarvesterUid), KInProgressPropertyKey,
-            1);
+    iInProgressProperty.Set( TUid::Uid( KHarvesterUid ),
+            KInProgressPropertyKey, 1 );
     CPluginValidator::ManagePluginsL();
+    if( !iUpdateIdle->IsActive() )
+        {
+        iUpdateIdle->Start( TCallBack( UpdateCallback, this ) );
+        }
     // set property value to 0 (which means "finished")
     iInProgressProperty.Set( TUid::Uid( KHarvesterUid ),
         KInProgressPropertyKey, 0 );
@@ -145,15 +150,23 @@
         iBlacklist->AppendL(aPluginInfo.iImplementationUid);
         TAny* plug(NULL);
         TInt err(KErrNone);
+        CPSPERF( ("CHarvesterPluginValidator::LoadPluginL Uid: 0x%X - START",
+                aPluginInfo.iImplementationUid.iUid) );
             TRAP( err, plug = REComSession::CreateImplementationL(
                             aPluginInfo.iImplementationUid,
                             aPluginInfo.iDtor_ID_Key, iParameter ) );
+        CPSPERF( ("CHarvesterPluginValidator::LoadPluginL - DONE") );
         if (err == KErrNone && plug)
             {
                 TRAP_IGNORE(
                         CleanupStack::PushL( plug );
                         aPluginInfo.iPlugin = plug;
                         iPluginArray.AppendL( aPluginInfo );
+                        if( aPluginInfo.iImplementationUid.iUid
+                                == KADatFactorySettingsServerPluginUid)
+                            iUpdatePluginArray.Insert( aPluginInfo, 0);
+                        else
+                            iUpdatePluginArray.AppendL( aPluginInfo );
                         CleanupStack::Pop( plug );
                 );
             }
@@ -169,40 +182,33 @@
 void CHarvesterPluginValidator::UpdatePluginsL()
     {
     // set property value to 1 (which means "in progress")
-    iInProgressProperty.Set(TUid::Uid(KHarvesterUid), KInProgressPropertyKey, 1);
+    iInProgressProperty.Set( TUid::Uid( KHarvesterUid ),
+            KInProgressPropertyKey, 1 );
     CContentHarvesterPlugin* plugin = NULL;
-    CContentHarvesterPlugin* fsplugin =
-            static_cast<CContentHarvesterPlugin*> (GetImplementation(
-                    TUid::Uid(KADatFactorySettingsServerPluginUid)));
 
-	if (fsplugin)
+    while( iUpdatePluginArray.Count() )
         {
-        iBlacklist->AppendL(TUid::Uid(KADatFactorySettingsServerPluginUid));
-            TRAP_IGNORE( fsplugin->UpdateL() );
-        iBlacklist->RemoveL(TUid::Uid(KADatFactorySettingsServerPluginUid));
-        }
-    for (TInt i = 0; i < iPluginArray.Count(); i++)
-        {
-        plugin
-                = static_cast<CContentHarvesterPlugin*> (iPluginArray[i].iPlugin);
-        if (plugin != fsplugin)
-            {
-            //first we append UID to the blacklist
-            iBlacklist->AppendL(iPluginArray[i].iImplementationUid);
-                TRAP_IGNORE( plugin->UpdateL() );
-            //no panic during update so we can remove UID from blacklist
-            iBlacklist->RemoveL(iPluginArray[i].iImplementationUid);
-            }
+        plugin = static_cast<CContentHarvesterPlugin*> ( iUpdatePluginArray[0].iPlugin );
+        //first we append UID to the blacklist
+        iBlacklist->AppendL( iUpdatePluginArray[0].iImplementationUid );
+        CPSPERF( ("CHarvesterPluginValidator::UpdatePluginsL Uid: 0x%X - START",
+                            iUpdatePluginArray[0].iImplementationUid) );
+        TRAP_IGNORE( plugin->UpdateL() );
+        CPSPERF( ("CHarvesterPluginValidator::UpdatePluginsL - DONE") );
+        //no panic during update so we can remove UID from blacklist
+        iBlacklist->RemoveL( iUpdatePluginArray[0].iImplementationUid );
+        // plugin was updated correctly so we remove it from update plugin array
+        iUpdatePluginArray.Remove( 0 );
         }
     // set property value to 0 (which means "finished")
-    iInProgressProperty.Set(TUid::Uid(KHarvesterUid), KInProgressPropertyKey,
-            0);
+    iInProgressProperty.Set( TUid::Uid( KHarvesterUid ),
+            KInProgressPropertyKey, 0 );
     }
 
 // -----------------------------------------------------------------------------
 //
 // -----------------------------------------------------------------------------
-//  
+//
 TInt CHarvesterPluginValidator::UpdateCallback( TAny* aValidator )
     {
     if ( aValidator )
--- a/contentpublishingsrv/contentpublishingutils/pluginvalidator/src/cpluginvalidator.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/contentpublishingsrv/contentpublishingutils/pluginvalidator/src/cpluginvalidator.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -11,7 +11,7 @@
 *
 * Contributors:
 *
-* Description:  
+* Description:
  *
 */
 
@@ -26,7 +26,7 @@
 //
 // ----------------------------------------------------------------------------
 //
-EXPORT_C CPluginValidator* CPluginValidator::NewL( TUid aUid, 
+EXPORT_C CPluginValidator* CPluginValidator::NewL( TUid aUid,
                                                    TAny *aParameter )
     {
     CPluginValidator* self = CPluginValidator::NewLC( aUid , aParameter );
@@ -41,7 +41,7 @@
 EXPORT_C CPluginValidator* CPluginValidator::NewLC( TUid aUid,
                                                     TAny *aParameter )
     {
-    CPluginValidator* self = new( ELeave ) CPluginValidator( aUid, 
+    CPluginValidator* self = new( ELeave ) CPluginValidator( aUid,
                                                              aParameter );
     CleanupStack::PushL( self );
     self->ConstructL();
@@ -56,8 +56,8 @@
     {
     TPluginInfo pluginInfo;
     pluginInfo.iImplementationUid = aUid;
-    TInt index = iPluginArray.Find( pluginInfo, 
-    			TIdentityRelation< TPluginInfo >(UidMatch) );    
+    TInt index = iPluginArray.Find( pluginInfo,
+          TIdentityRelation< TPluginInfo >(UidMatch) );
     return GetImplementation( index );
     }
 
@@ -67,12 +67,12 @@
 //
 EXPORT_C TAny* CPluginValidator::GetImplementation( TInt aIndex )
     {
-    TAny* ret( NULL ); 
+    TAny* ret( NULL );
     if (( aIndex != KErrNotFound ) && ( aIndex < iPluginArray.Count() ))
-    	{
-    	ret= iPluginArray[aIndex].iPlugin;
-    	}
-    return ret;    
+      {
+      ret= iPluginArray[aIndex].iPlugin;
+      }
+    return ret;
     }
 
 // ----------------------------------------------------------------------------
@@ -98,16 +98,16 @@
         }
     REComSession::FinalClose( );
     }
-    
+
 // ----------------------------------------------------------------------------
 //
 // ----------------------------------------------------------------------------
 //
 void CPluginValidator::RunL()
     {
+    iSession->NotifyOnChange( iStatus );
+    SetActive();
     ManagePluginsL();
-    iSession->NotifyOnChange( iStatus );
-    SetActive();    
     }
 
 // ----------------------------------------------------------------------------
@@ -131,12 +131,12 @@
 //
 // ----------------------------------------------------------------------------
 //
-CPluginValidator::CPluginValidator( TUid aUid, TAny* aParameter ): 
+CPluginValidator::CPluginValidator( TUid aUid, TAny* aParameter ):
                                                   CActive(EPriorityStandard),
                                                   iUid( aUid ),
                                                   iParameter( aParameter )
     {
-    
+
     }
 
 // ----------------------------------------------------------------------------
@@ -156,111 +156,110 @@
 //
 // ----------------------------------------------------------------------------
 //
-TBool CPluginValidator::PresentInArrayL( TPluginInfo aPluginInfo, 
-		const RImplInfoPtrArray& aInfoArray )
-	{
-	TBool result(EFalse);
-	for ( TInt i = 0; i< aInfoArray.Count(); i++ )
-		{
-		if ( aPluginInfo.iImplementationUid.iUid == 
-						aInfoArray[i]->ImplementationUid().iUid)
-			{
-			result = ETrue;
-			break;
-			}
-		}
-	return result;
-	}
-
-// ----------------------------------------------------------------------------
-//
-// ----------------------------------------------------------------------------
-//        
-void CPluginValidator::DestroyPlugin( TInt aIndex )    
+TBool CPluginValidator::PresentInArrayL( TPluginInfo aPluginInfo,
+        const RImplInfoPtrArray& aInfoArray )
     {
-    CBase* plugin = static_cast<CBase*>( iPluginArray[aIndex].iPlugin );
-    delete plugin;
-    REComSession::DestroyedImplementation( 
-    		iPluginArray[aIndex].iDtor_ID_Key );
+    TBool result( EFalse );
+    for( TInt i = 0; i < aInfoArray.Count(); i++ )
+        {
+        if( aPluginInfo.iImplementationUid.iUid
+                == aInfoArray[i]->ImplementationUid().iUid )
+            {
+            result = ETrue;
+            break;
+            }
+        }
+    return result;
     }
 
 // ----------------------------------------------------------------------------
 //
 // ----------------------------------------------------------------------------
-//        
-void CPluginValidator::CleanPluginsTable()    
+//
+void CPluginValidator::DestroyPlugin( TInt aIndex )
     {
-    for ( TInt i = 0; i < iPluginArray.Count(); i++ )
-    	{
-    	DestroyPlugin( i );
-    	}
+    CBase* plugin = static_cast<CBase*>( iPluginArray[aIndex].iPlugin );
+    delete plugin;
+    REComSession::DestroyedImplementation(
+            iPluginArray[aIndex].iDtor_ID_Key );
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+void CPluginValidator::CleanPluginsTable()
+    {
+    for( TInt i = 0; i < iPluginArray.Count(); i++ )
+        {
+        DestroyPlugin( i );
+        }
     }
 
 // ----------------------------------------------------------------------------
 //
 // ----------------------------------------------------------------------------
 //
-void CPluginValidator::ManagePluginsL()    
+void CPluginValidator::ManagePluginsL()
     {
     // Read info about all implementations into infoArray
     RImplInfoPtrArray infoArray;
     CleanupResetAndDestroyPushL( infoArray );
-	
+
     REComSession::ListImplementationsL( iUid , infoArray );
-    TPluginInfo pluginInfo;   
+    TPluginInfo pluginInfo;
     //Load new plugins
     for ( TInt i = 0; i < infoArray.Count( ); i++ )
         {
         pluginInfo.iImplementationUid = infoArray[i]->ImplementationUid( );
         pluginInfo.iVersion = infoArray[i]->Version();
-        
-        TInt index = iPluginArray.Find( pluginInfo, 
-        			TIdentityRelation< TPluginInfo >(UidMatch) );
-        
-        if ( index == KErrNotFound )
-        	{
-        	//plugin wasn't present, we load it now
-			LoadPluginL( pluginInfo );
-        	}
-        else if ( pluginInfo.iVersion > iPluginArray[index].iVersion )
-        	{
-        	//plugin was present but it is a newer version, 
-        	//remove old and load a new one
-			DestroyPlugin( index );
-			iPluginArray.Remove( index );
-			LoadPluginL( pluginInfo );
-        	}
+
+        TInt index = iPluginArray.Find( pluginInfo,
+              TIdentityRelation< TPluginInfo >(UidMatch) );
+
+        if( index == KErrNotFound )
+            {
+            //plugin wasn't present, we load it now
+            LoadPluginL( pluginInfo );
+            }
+        else if( pluginInfo.iVersion > iPluginArray[index].iVersion )
+            {
+            //plugin was present but it is a newer version,
+            //remove old and load a new one
+            DestroyPlugin( index );
+            iPluginArray.Remove( index );
+            LoadPluginL( pluginInfo );
+            }
         }
     //Remove old plugins
-    for ( TInt i = iPluginArray.Count() - 1 ; i >= 0; i-- )
-    	{
-    	pluginInfo = iPluginArray[i];
-    	if ( !PresentInArrayL( pluginInfo, infoArray ) )
-    		{
-    		DestroyPlugin( i );
-    	    iPluginArray.Remove( i );
-    		}
-    	}
-    CleanupStack::PopAndDestroy( &infoArray );    
+    for( TInt i = iPluginArray.Count() - 1; i >= 0; i-- )
+        {
+        pluginInfo = iPluginArray[i];
+        if ( !PresentInArrayL( pluginInfo, infoArray ) )
+            {
+            DestroyPlugin( i );
+            iPluginArray.Remove( i );
+            }
+        }
+        CleanupStack::PopAndDestroy( &infoArray );
     }
 
 // ----------------------------------------------------------------------------
 //
 // ----------------------------------------------------------------------------
 //
-void CPluginValidator::LoadPluginL( TPluginInfo& aPluginInfo )    
+void CPluginValidator::LoadPluginL( TPluginInfo& aPluginInfo )
     {
-	TAny* plug ( NULL );
-	TInt err( KErrNone );
-	TRAP( err, plug = REComSession::CreateImplementationL( 
-										aPluginInfo.iImplementationUid, 
-										aPluginInfo.iDtor_ID_Key, iParameter ) );
-	if( err==KErrNone && plug ) 
-		{
-		CleanupStack::PushL( plug );
-		aPluginInfo.iPlugin = plug;
-		iPluginArray.AppendL( aPluginInfo );
-		CleanupStack::Pop( plug );
-		}
-   	}
-
+    TAny* plug( NULL );
+    TInt err( KErrNone );
+    TRAP( err, plug = REComSession::CreateImplementationL(
+                    aPluginInfo.iImplementationUid,
+                    aPluginInfo.iDtor_ID_Key, iParameter ) );
+    if( err == KErrNone && plug )
+        {
+        CleanupStack::PushL( plug );
+        aPluginInfo.iPlugin = plug;
+        iPluginArray.AppendL( aPluginInfo );
+        CleanupStack::Pop( plug );
+        }
+    }
Binary file homescreenpluginsrv/conf/hsps.confml has changed
Binary file homescreenpluginsrv/conf/hsps_200159c9.crml has changed
Binary file homescreenpluginsrv/conf/hsps_qhd.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenpluginsrv/conf/hsps_vga.confml	Tue Sep 14 21:55:16 2010 +0300
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-16"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="hsps">
+  <feature ref="KhspsThemeStatusRepositoryUid" name="KhspsThemeStatusRepositoryUid">
+    <desc>CenRep keys for Homescreenpluginsrv</desc>    
+    <setting ref="KhspsAI" name="KhspsAI" type="int" required="true">
+      <desc>Holds UID of an active application configuration plugin for AI3 client</desc>
+    </setting>
+    <setting ref="KhspsAI3TestApp" name="KhspsAI3TestApp" type="int" required="true">
+      <desc>Holds UID of an active application configuration plugin for EUnit client</desc>
+    </setting>
+    <setting ref="KhspsDeviceLanguage" name="KhspsDeviceLanguage" type="int" required="true">
+      <desc>Holds device language ID from previous startup</desc>
+    </setting>
+    <setting ref="KhspsFilesInstalled" name="KhspsFilesInstalled" type="string" required="true">
+      <desc>FW version or empty if plugins should be reinstalled in next start up</desc>
+    </setting>
+    <setting ref="KhspsCheckConfigurations" name="KhspsCheckConfigurations" type="int">
+      <desc>Holds information whether configuration states must be checked</desc>
+    </setting>
+    <setting ref="KhspsSecurityControlAccessList" name="KhspsSecurityControlAccessList" type="string" readOnly="true">
+      <desc>Access control for clients which are missing the capablities</desc>
+    </setting>
+  </feature>
+  <data>
+    <KhspsThemeStatusRepositoryUid>
+      <KhspsAI>536999055</KhspsAI>
+      <KhspsAI3TestApp>536916224</KhspsAI3TestApp>
+      <KhspsDeviceLanguage>1</KhspsDeviceLanguage>
+      <KhspsFilesInstalled></KhspsFilesInstalled>
+      <KhspsCheckConfigurations>0</KhspsCheckConfigurations>
+      <KhspsSecurityControlAccessList>0x102750F0;0x200159C6;0x20000FB1;0x10005A32;0x100058EC;0x200159c5;0x200255FF;</KhspsSecurityControlAccessList>
+    </KhspsThemeStatusRepositoryUid>
+  </data>
+  <rfs>
+    <KhspsThemeStatusRepositoryUid>
+      <KhspsAI>true</KhspsAI>
+      <KhspsAI3TestApp>true</KhspsAI3TestApp>
+      <KhspsDeviceLanguage>true</KhspsDeviceLanguage>
+      <KhspsFilesInstalled>true</KhspsFilesInstalled>
+      <KhspsCheckConfigurations>true</KhspsCheckConfigurations>
+      <KhspsSecurityControlAccessList>false</KhspsSecurityControlAccessList>
+    </KhspsThemeStatusRepositoryUid>
+  </rfs>
+</configuration>
--- a/homescreenpluginsrv/group/bld.inf	Wed Sep 01 12:22:09 2010 +0100
+++ b/homescreenpluginsrv/group/bld.inf	Tue Sep 14 21:55:16 2010 +0300
@@ -49,10 +49,14 @@
 
 
 // Generic configuration interface for component cenrep settings  
-../conf/hsps.confml          APP_LAYER_CONFML(hsps.confml)
+#if defined(FF_LAYOUT_480_640_TOUCH_VGA4) || defined(FF_LAYOUT_640_480_TOUCH_VGA4)
+../conf/hsps_vga.confml          APP_LAYER_CONFML(hsps.confml)
+#else
+../conf/hsps_qhd.confml          APP_LAYER_CONFML(hsps.confml)
+#endif
+
 ../conf/hsps_200159c9.crml   APP_LAYER_CRML(hsps_200159c9.crml)
 
-
 // Exports for SAPI impl
 ../inc/hspsdomattribute.h           MW_LAYER_PLATFORM_EXPORT_PATH(hspsdomattribute.h)
 ../inc/mhspsdomlistitem.h           MW_LAYER_PLATFORM_EXPORT_PATH(mhspsdomlistitem.h)
--- a/homescreenpluginsrv/hspsmanager/inc/hspsconfiguration.h	Wed Sep 01 12:22:09 2010 +0100
+++ b/homescreenpluginsrv/hspsmanager/inc/hspsconfiguration.h	Tue Sep 14 21:55:16 2010 +0300
@@ -54,7 +54,7 @@
 
 // Options for the KConfigurationAttrLocking 
 _LIT8( KConfLockingLocked,              "locked" );             // Locked state
-_LIT8( KConfLockingRemovable,           "removable" );          // Removable state
+_LIT8( KConfLockingPermanent,           "permanent" );          // Permanent state (not removable, not movable)
 _LIT8( KConfLockingNone,                "none" );               // Default
 
 // Control element
--- a/homescreenpluginsrv/hspsmanager/inc/hspsinstallationhandler.h	Wed Sep 01 12:22:09 2010 +0100
+++ b/homescreenpluginsrv/hspsmanager/inc/hspsinstallationhandler.h	Tue Sep 14 21:55:16 2010 +0300
@@ -585,6 +585,11 @@
         void AddLocalesL(
                 const TDesC& aPath,
                 const TBool aProcessOnlyDTD );
+                
+        void DoAddLocalesL(
+                const TDesC& aPath, 
+                const TLanguage aLanguage,
+                const TBool aProcessOnlyDTD );
         
         /**
          * Adds localized dtd resources from the provided subdirectory
--- a/homescreenpluginsrv/hspsmanager/inc/hspsmaintenancehandler.h	Wed Sep 01 12:22:09 2010 +0100
+++ b/homescreenpluginsrv/hspsmanager/inc/hspsmaintenancehandler.h	Tue Sep 14 21:55:16 2010 +0300
@@ -725,6 +725,16 @@
             ChspsODT& aOdt );
 
         /**
+         * Activates default configuration defined for the application
+         * @since S60 5.2
+         * @param aHeader application which default configuration is activated
+         * @param aOdt activated application configuration
+         */
+        void ActivateDefaultAppConfL(
+            const ChspsODT& aHeader,
+            ChspsODT& aOdt );
+
+        /**
         * HandleDefinitionRespositoryEventL
         *
         * @since S60 5.0
@@ -742,6 +752,28 @@
                 RArray<ThspsRepositoryInfo>& aNotificationParams);
         
         /**
+        * RemoveAppConfFromRepositoryL
+        * Removes application confguration from definition repository
+        * @since S60 5.2
+        * @param aOdt application configuration to be removed
+        * @param aNotificationParams notifications need to be sent after removal
+        */
+        void RemoveAppConfFromRepositoryL( 
+                const ChspsODT& aOdt,
+                RArray<ThspsRepositoryInfo>& aNotificationParams );
+
+        /**
+        * RemovePluginConfFromRepositoryL
+        * Removes plugin confguration from definition repository
+        * @since S60 5.2
+        * @param aOdt plugin configuration to be removed
+        * @param aNotificationParams notifications need to be sent after removal
+        */
+        void RemovePluginConfFromRepositoryL( 
+                const ChspsODT& aOdt,
+                RArray<ThspsRepositoryInfo>& aNotificationParams );
+
+        /**
         * InvalidateUninstalledPluginInstancesL
         * Removes uninstalled plugin instances from an inactive
         * application configuration by changing them to error state.
--- a/homescreenpluginsrv/hspsmanager/inc/hspsserverutil.h	Wed Sep 01 12:22:09 2010 +0100
+++ b/homescreenpluginsrv/hspsmanager/inc/hspsserverutil.h	Tue Sep 14 21:55:16 2010 +0300
@@ -390,14 +390,18 @@
 
         /**
          * Checks resource files of defined configuration
-         * Function leaves if all resource files cannot be found
+         * Function changes resoure paths according to the current
+         * device language.
+         * Function leaves if all resource files cannot be found.
          * @since S60 5.0
-         * @param aOdt is an instance of the ODT class
-         * @param aConfUid is configuration UID which resources are checked
+         * @param aOdt is the application configuration instance         
+         * @param aPluginHeader is the plugin which should be checked
+         * @param aRfs is an existing file server session
          */
         static void CheckResourceFilesL( 
-            const ChspsODT& aOdt,
-            const TInt aConfUid );
+            ChspsODT& aAppOdt,            
+            const ChspsODT& aPluginHeader,
+            RFs& aRfs );
 
         /**
          * Returns configuration's version string
--- a/homescreenpluginsrv/hspsmanager/src/hspsclientrequesthandler.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/homescreenpluginsrv/hspsmanager/src/hspsclientrequesthandler.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -741,7 +741,13 @@
                                 }
                             else
                                 {
-                                error = KErrCorrupt;
+                                // Child counts should match, set plugin to Error state
+                                const TInt pluginUid = hspsServerUtil::GetPluginUid( parentNode ).iUid;
+                                __ASSERT_DEBUG( pluginUid > 0, User::Leave( KErrCorrupt ) );
+                                AddErrorConfigurationL( 
+                                    appDom,
+                                    *parentNode,
+                                    pluginUid );                                        
                                 }
                             }
                         else
--- a/homescreenpluginsrv/hspsmanager/src/hspsinstallationhandler.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/homescreenpluginsrv/hspsmanager/src/hspsinstallationhandler.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -395,12 +395,22 @@
     TRAPD( err, DoInstallThemeL(aManifestFileName) );
     if( !err )
         {
-        // correct headerdata is in iHeaderData set by CheckHeaderL()
-        aHeaderData = iHeaderData->Des();        
-                   
-        // Set next phase
-        iInstallationPhase = EhspsPhaseCleanup;
-        ret = EhspsInstallThemeSuccess;
+        // correct headerdata is in iHeaderData set by CheckHeaderL(), check space
+        const TUint bytesRequired = iHeaderData->Des().Length(); 
+        const TUint bytesAllocated = aHeaderData.MaxLength();
+        if( bytesRequired <= bytesAllocated )
+            {            
+            aHeaderData = iHeaderData->Des();
+            
+            // Set next phase
+            iInstallationPhase = EhspsPhaseCleanup;
+            ret = EhspsInstallThemeSuccess;
+            }
+        else
+            {
+            err = KErrOverflow;
+            iInstallationPhase = EhspsPhaseIdle;
+            }        
         }
     else
         {     
@@ -1588,8 +1598,8 @@
                 KNullDesC(),
                 (TLanguage)( fullODT->OdtLanguage() ) );
             
-            notifications.Append( info );
-            }        
+            notifications.AppendL( info );
+            }
         
         CleanupStack::PopAndDestroy(); // pluginIds.
         CleanupStack::PopAndDestroy( fullODT );
@@ -2260,11 +2270,11 @@
     TInt drive = hspsServerUtil::GetEmmcDrivePath( iFsSession );
     if ( drive != KErrNotFound )
         {
-        driveArray.Append( drive );
+        driveArray.AppendL( drive );
         }
     
-    driveArray.Append( EDriveC );
-    driveArray.Append( EDriveZ );     
+    driveArray.AppendL( EDriveC );
+    driveArray.AppendL( EDriveZ );     
     
     FindResourceFilesL( aPath, ETrue, driveArray, systemEpocLanguageCodes );
    
@@ -2281,12 +2291,7 @@
 void ChspsInstallationHandler::AddLocalesL(
         const TDesC& aPath,
         const TBool aProcessOnlyDTD )
-    {
-    // Retrieve phone supported language.
-    CArrayFixFlat<TInt>* languageCodes = NULL;
-    hspsServerUtil::GetInstalledLanguagesL( languageCodes );
-    CleanupStack::PushL( languageCodes );     
-    
+    {    
     // Ensure that path contains '\' at the end.
     TFileName pathBase;
     pathBase.Copy( aPath );
@@ -2299,20 +2304,50 @@
             pathBase.Append( KPathDelim );
             }
         }
-            
-    TParsePtrC driveParser( pathBase );
-    TInt driveEnum = KErrNotFound;
+
+#if defined(WINSCW) || defined(__WINS__)
     
-    if( !aProcessOnlyDTD )
+    // Emulator environment supports all languages, include all directories    
+    CDir* dir( NULL );                      
+    TFindFile fileFinder( iFsSession );      
+    fileFinder.SetFindMask( KDriveAttExclude|KDriveAttRemovable|KDriveAttRemote|KDriveAttSubsted );
+    fileFinder.FindWildByPath( aPath, NULL, dir );
+    if ( dir )
         {
-        if( driveParser.DrivePresent() && driveParser.Drive().Length() > 0 )
+        CleanupStack::PushL( dir );
+                
+        for ( TInt i=0; i < dir->Count(); i++ )
             {
-            User::LeaveIfError(
-                    RFs::CharToDrive( ( driveParser.Drive() )[0],
-                            driveEnum ) );
-            }
+            const TEntry& dirEntry = (*dir)[i];
+            if ( dirEntry.IsDir() )
+                {       
+                TInt languageId = KErrNotFound;
+                TLex lex( dirEntry.iName );        
+                if( lex.Val( languageId ) == KErrNone )
+                    {             
+                    TPath path( aPath );
+                    path.Append( dirEntry.iName );
+                    path.Append( KPathDelim );
+                    
+                    DoAddLocalesL(
+                        path, 
+                        (TLanguage)languageId, 
+                        aProcessOnlyDTD );
+                    }                
+                }
+            }                       
+        CleanupStack::PopAndDestroy( dir );
         }
     
+#else        
+    
+    // Devices have less languages, therefore include specific directories only
+    CArrayFixFlat<TInt>* languageCodes = NULL;        
+    hspsServerUtil::GetInstalledLanguagesL( languageCodes );
+    CleanupStack::PushL( languageCodes );
+                       
+    TParsePtrC driveParser( pathBase );
+                        
     _LIT( KFormatNN, "%02d" );    
     TFileName localePath;
     
@@ -2356,38 +2391,57 @@
             }
 
         if( exists )
-            {
-            // If we found the first language specification          
-            if ( !iDefaultSpecificationSet )
-                {
-                // Assume this is the default language shown incase 
-                // there is no locale for the active UI language
-                iDefaultSpecification = (TLanguage)languageCode;
-                iDefaultSpecificationSet = ETrue;
-                }                                                            
-                
-            // Add dtd file if existing.
-            AddDtdFileL( localePath, (TLanguage)languageCode );
-            
-            if( !aProcessOnlyDTD )
-                {
-                // Find localized files from the provided directory
-                RArray<TInt> driveArray;
-                CleanupClosePushL( driveArray );                
-                driveArray.Append( driveEnum );
-                
-                FindResourceFilesL( localePath,
-                                    EFalse,
-                                    driveArray,
-                                    NULL );
-                
-                CleanupStack::PopAndDestroy(); // driveArray
-                }
+            {            
+            DoAddLocalesL(
+                localePath, 
+                (TLanguage)languageCode, 
+                aProcessOnlyDTD );
             }        
         }
     
     CleanupStack::PopAndDestroy( languageCodes );
     languageCodes = NULL;
+#endif   
+    }
+
+void ChspsInstallationHandler::DoAddLocalesL(
+        const TDesC& aPath, 
+        const TLanguage aLanguage,
+        const TBool aProcessOnlyDTD )
+    {   
+    // If we found the first language specification          
+    if ( !iDefaultSpecificationSet )
+        {
+        // Assume this is the default language shown incase 
+        // there is no locale for the active UI language
+        iDefaultSpecification = aLanguage;
+        iDefaultSpecificationSet = ETrue;
+        }                                                            
+        
+    // Add DTD files holding localized widget name and desc
+    AddDtdFileL( aPath, aLanguage );
+        
+    if( !aProcessOnlyDTD )
+        {
+        TParsePtrC driveParser( aPath );
+        TInt driveEnum = KErrNotFound;
+        if( driveParser.DrivePresent() && driveParser.Drive().Length() > 0 )
+            {
+            User::LeaveIfError( RFs::CharToDrive( ( driveParser.Drive() )[0], driveEnum ) );
+            }
+
+        // Find localized resources from the subdirectory
+        RArray<TInt> driveArray;
+        CleanupClosePushL( driveArray );                
+        driveArray.AppendL( driveEnum );
+        
+        FindResourceFilesL( aPath,
+                            EFalse,
+                            driveArray,
+                            NULL );
+        
+        CleanupStack::PopAndDestroy(); // driveArray
+        }
     }
 
 // -----------------------------------------------------------------------------
--- a/homescreenpluginsrv/hspsmanager/src/hspsmaintenancehandler.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/homescreenpluginsrv/hspsmanager/src/hspsmaintenancehandler.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -319,6 +319,7 @@
             CleanupStack::PopAndDestroy(headerdata);
             
             ThspsRepositoryInfo info( EhspsODTActivated );
+            info.iAppUid = odt->RootUid();
             iDefinitionRepository.RegisterNotification( info );
         }
     }
@@ -1865,7 +1866,7 @@
                             TInt pluginCount = pluginsNode->ChildNodes().Length();
                             for( TInt pluginIndex=0; pluginIndex < pluginCount; pluginIndex++ )                                    
                                 {
-                                nodeArray.Append( (ChspsDomNode*)pluginsNode->ChildNodes().Item( pluginIndex ) );
+                                nodeArray.AppendL( (ChspsDomNode*)pluginsNode->ChildNodes().Item( pluginIndex ) );
                                 }                                
                             
                             // Remove the nodes and related resources
@@ -3209,7 +3210,8 @@
     if( !( aSetMask.Flags() & EhspsThemeStatusLicenceeDefault ) )                      
         {       
         RArray<ThspsRepositoryInfo> notifParams;
-        
+        CleanupClosePushL( notifParams );
+
         if( !iDefinitionRepository.Locked() )
             {
             iDefinitionRepository.Lock();
@@ -3221,14 +3223,11 @@
             TInt error( KErrNone );
             if ( aSetMask.ConfigurationType() != EhspsAppConfiguration )
                 {
-                // Fix plugin instances and get notifications from valid cases
-                TRAP( error, RemovePluginFromAppConfsL( aSetMask, notifParams ) );                    
+                TRAP( error, RemovePluginConfFromRepositoryL( aSetMask, notifParams ) );                    
                 }                                
-            
-            if( !error )
+            else
                 {
-                // Remove the actual plugin from file system
-                TRAP( error, RemoveThemeL( aSetMask ) );                
+                TRAP( error, RemoveAppConfFromRepositoryL( aSetMask, notifParams ) );                    
                 }
                                                
             if( !error )
@@ -3257,7 +3256,7 @@
                 }                                                             
             }
         
-        notifParams.Close();
+        CleanupStack::PopAndDestroy( &notifParams );
         }
          
      return ret;
@@ -3272,7 +3271,7 @@
         RArray<ThspsRepositoryInfo>& aNotificationParams )        
     {        
     __ASSERT_DEBUG( aOdt.ThemeUid(), User::Leave( KErrArgument ) );
-           
+    
     // Loop application configurations
     const TInt count = iHeaderListCache.Count();                  
     for ( TInt i = 0; i < count; i++ )
@@ -3360,7 +3359,7 @@
                             lastNotification,
                             aOdt.ThemeFullName(),
                             (TLanguage)( aOdt.OdtLanguage() ) );
-                       aNotificationParams.Append(info);
+                       aNotificationParams.AppendL(info);
                        }
 #ifdef HSPS_LOG_ACTIVE  
                     if( iLogBus )
@@ -3390,18 +3389,59 @@
                         ETrue,
                         aOdt.ThemeFullName(),
                         (TLanguage)( aOdt.OdtLanguage() ) );
-                    aNotificationParams.Append(info);
+                    aNotificationParams.AppendL(info);
                     }
                 }
             
-            pluginIds.Close();
             CleanupStack::PopAndDestroy( 2, appOdt ); // appOdt, pluginIds                         
             appOdt = NULL;             
             
             } // app configuration
         
         } // header loop
-       
+    }
+    
+// -----------------------------------------------------------------------------
+// RemoveAppConfFromRepositoryL
+// -----------------------------------------------------------------------------
+//
+void ChspsMaintenanceHandler::RemoveAppConfFromRepositoryL( 
+    const ChspsODT& aOdt,
+    RArray<ThspsRepositoryInfo>& /* aNotificationParams */ )        
+    {        
+    __ASSERT_DEBUG( aOdt.ThemeUid(), User::Leave( KErrArgument ) );
+    
+    ChspsODT* activeAppConf = ChspsODT::NewL();
+    CleanupStack::PushL( activeAppConf );
+    iThemeServer.GetActivateAppConfigurationL( aOdt.RootUid(), *activeAppConf );
+    if ( aOdt.ThemeUid() == activeAppConf->ThemeUid() )
+        {
+        // Active application configuration removed 
+        ActivateDefaultAppConfL( aOdt, *activeAppConf );
+        }
+
+    CleanupStack::PopAndDestroy( activeAppConf );
+    
+    // Remove the actual application configuration from file system
+    RemoveThemeL( aOdt );
+    
+    }
+
+// -----------------------------------------------------------------------------
+// RemovePluginConfFromRepositoryL
+// -----------------------------------------------------------------------------
+//
+void ChspsMaintenanceHandler::RemovePluginConfFromRepositoryL( 
+    const ChspsODT& aOdt,
+    RArray<ThspsRepositoryInfo>& aNotificationParams )        
+    {        
+    __ASSERT_DEBUG( aOdt.ThemeUid(), User::Leave( KErrArgument ) );
+
+    // Fix plugin instances and get notifications from valid cases
+    RemovePluginFromAppConfsL( aOdt, aNotificationParams );                    
+    
+    // Remove the actual plugin configuration from file system
+    RemoveThemeL( aOdt );                
     }
 
 // -----------------------------------------------------------------------------
@@ -3515,7 +3555,8 @@
         User::LeaveIfError( iDefinitionRepository.GetOdtL( *odt ) );
         
         RArray<ThspsRepositoryInfo> notifParams;
-        
+        CleanupClosePushL( notifParams );
+
         TRAP( errorCode, UpdatePluginFromAppConfsL( *odt, notifParams ));
         
         if( errorCode )
@@ -3540,8 +3581,8 @@
                 }
             
             } 
-        notifParams.Close();
         
+        CleanupStack::PopAndDestroy( &notifParams );
         CleanupStack::PopAndDestroy( odt );
         }
          
@@ -3617,7 +3658,7 @@
                                     status,
                                     aOdt.ThemeFullName(),
                                     (TLanguage)( aOdt.OdtLanguage() ) );
-                        aNotificationParams.Append(info);
+                        aNotificationParams.AppendL(info);
                         }
                     }
 
@@ -3625,7 +3666,6 @@
                 CleanupStack::PopAndDestroy( odt );                                   
                 }
             }
-        
         }
     }
 // -----------------------------------------------------------------------------
@@ -4507,28 +4547,8 @@
     // If active application configuration is not "LicenceeRestorable" 
     if ( !(aHeader->Flags() & EhspsThemeStatusLicenceeRestorable) )
         {        
-        // Try to activate a configuation with the LicenceeRestorable status
-        ChspsODT* searchMask = ChspsODT::NewL();
-        CleanupStack::PushL( searchMask );
-        searchMask->SetRootUid( aHeader->RootUid() );
-        searchMask->SetFamily( aHeader->Family() );
-        searchMask->SetFlags( EhspsThemeStatusLicenceeRestorable );
-        TInt pos( 0 );
-        iThemeServer.GetConfigurationHeader( *searchMask, aHeader, pos );
-        if ( aHeader )
-            {
-            // Activate licensee restorable configuration
-            iThemeServer.ActivateThemeL( *aHeader, aOdt );
-            ThspsRepositoryInfo info( EhspsODTActivated );
-            iDefinitionRepository.RegisterNotification( info );
-            }
-        else
-            {
-            // Licensee restorable configuration not found. There must be  
-            // at least one licensee restorable configuration per application
-            User::Leave( KErrNotFound );
-            }
-        CleanupStack::PopAndDestroy( searchMask );
+        // Try to activate default configuation
+        ActivateDefaultAppConfL( *aHeader, aOdt );
         }
     else
         {        
@@ -4538,6 +4558,39 @@
     }
 
 // -----------------------------------------------------------------------------
+// ChspsMaintenanceHandler::ActivateDefaultAppConfL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void ChspsMaintenanceHandler::ActivateDefaultAppConfL(
+    const ChspsODT& aHeader,
+    ChspsODT& aOdt )
+    {    
+    ChspsODT* searchMask = ChspsODT::NewL();
+    CleanupStack::PushL( searchMask );
+    searchMask->SetRootUid( aHeader.RootUid() );
+    searchMask->SetFamily( aHeader.Family() );
+    searchMask->SetFlags( EhspsThemeStatusLicenceeRestorable );
+    
+    ChspsODT* defaultAppConf( NULL );
+    TInt pos( 0 );
+    iThemeServer.GetConfigurationHeader( *searchMask, defaultAppConf, pos );
+    if ( defaultAppConf )
+        {
+        // Activate licensee restorable configuration
+        iThemeServer.ActivateThemeL( *defaultAppConf, aOdt );
+        }
+    else
+        {
+        // Licensee restorable configuration not found. There must be  
+        // at least one licensee restorable configuration per application
+        User::Leave( KErrNotFound );
+        }
+    
+    CleanupStack::PopAndDestroy( searchMask );
+    }
+
+// -----------------------------------------------------------------------------
 // ChspsMaintenanceHandler::AddErrorConfigurationL()
 // -----------------------------------------------------------------------------
 //
@@ -4841,8 +4894,12 @@
     ChspsDomAttribute* attr = 
         static_cast<ChspsDomAttribute*>( attrList.FindByName( KConfigurationAttrLocking ) );                
     if( attr )
-        {        
-        isLocked = ( attr->Value().CompareF( KConfLockingLocked ) == 0 );
+        {      
+        if( attr->Value().CompareF( KConfLockingLocked ) == 0 ||
+            attr->Value().CompareF( KConfLockingPermanent ) == 0 )
+            {
+            isLocked = ETrue;
+            }
        }
     
     return isLocked;
@@ -4906,7 +4963,7 @@
                     if( !isLocked || foundLocked )
                         {
                         // Mark for removal
-                        nodeArray.Append( pluginNode );
+                        nodeArray.AppendL( pluginNode );
                         }
                     else
                         {
--- a/homescreenpluginsrv/hspsmanager/src/hspsserverutil.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/homescreenpluginsrv/hspsmanager/src/hspsserverutil.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -35,6 +35,7 @@
 
 _LIT(KHspsFolder, "\\200159c0\\themes\\" );
 _LIT(KSourcesFolder, "\\sources\\");
+_LIT(KLocalesFolder, "\\locales\\");
 _LIT( KThemesFolder, "\\themes\\" );
 _LIT( KDoubleBackSlash, "\\" );
 _LIT8( KHexPrefix8, "0x" );
@@ -950,8 +951,10 @@
 void hspsServerUtil::FindUniquePluginsL( 
         ChspsODT& aOdt, 
         RArray<TInt>& aPluginArray )
-    {    
-    aPluginArray.Reset();          
+    {
+    aPluginArray.Reset();
+    CleanupClosePushL( aPluginArray );
+
     ChspsDomDocument& dom = aOdt.DomDocument();
     ChspsDomDepthIterator* iter = ChspsDomDepthIterator::NewL( *dom.RootNode() );
     CleanupStack::PushL( iter );
@@ -959,32 +962,32 @@
     ChspsDomNode* node = iter->First();
     ChspsDomNode* prevNode = NULL;
     while( node && prevNode != node )
-       {                
-       const TDesC8& name = node->Name();
+        {
+        const TDesC8& name = node->Name();
        
-       // Plugin element was found 
-       if ( name == KPluginElement )
-           {           
-           ChspsDomList& attrList = node->AttributeList();                    
-           ChspsDomAttribute* uidAttr = static_cast<ChspsDomAttribute*>( attrList.FindByName(KPluginAttrUid) );            
-           if ( uidAttr )
-               {     
-               // Convert from hex to int
-               const TUid pluginUid = ConvertDescIntoUid( uidAttr->Value() );               
-               if ( pluginUid.iUid > 0 )
-                   {
-                   TBool isUnique = ETrue;
-                   for( TInt i=0; isUnique && i<aPluginArray.Count();i++ )
-                       {
-                       if ( aPluginArray[i] == pluginUid.iUid )
-                           {
-                           isUnique=EFalse;
-                           }
-                       }
-                   if ( isUnique )
-                       {
-                       aPluginArray.Append( pluginUid.iUid );
-                       }
+        // Plugin element was found 
+        if ( name == KPluginElement )
+            {           
+            ChspsDomList& attrList = node->AttributeList();                    
+            ChspsDomAttribute* uidAttr = static_cast<ChspsDomAttribute*>( attrList.FindByName(KPluginAttrUid) );            
+            if ( uidAttr )
+                {     
+                // Convert from hex to int
+                const TUid pluginUid = ConvertDescIntoUid( uidAttr->Value() );               
+                if ( pluginUid.iUid > 0 )
+                    {
+                    TBool isUnique = ETrue;
+                    for( TInt i=0; isUnique && i<aPluginArray.Count();i++ )
+                        {
+                        if ( aPluginArray[i] == pluginUid.iUid )
+                            {
+                            isUnique=EFalse;
+                            }
+                        }
+                    if ( isUnique )
+                        {
+                        aPluginArray.AppendL( pluginUid.iUid );
+                        }
                    }               
                }
            }
@@ -992,8 +995,10 @@
            prevNode = node;        
            node = iter->NextL();        
            }
-   CleanupStack::PopAndDestroy( iter );      
-}
+
+    CleanupStack::PopAndDestroy( iter );
+    CleanupStack::Pop( &aPluginArray );
+    }
 
 //----------------------------------------------------------------------------
 // CHspsServiceUtilities::HexString2Uint
@@ -1275,10 +1280,9 @@
         TFileName file;
         file.Append( aDirName );
         file.Append( fileEntry.iName );
-        aFiles.Append( file );
+        aFiles.AppendL( file );
         }
     CleanupStack::PopAndDestroy( fileList );
-
     CleanupStack::PopAndDestroy(); // fs
     }
 
@@ -1410,41 +1414,93 @@
 // -----------------------------------------------------------------------------
 //
 void hspsServerUtil::CheckResourceFilesL( 
-    const ChspsODT& aOdt,
-    const TInt aConfUid )
+    ChspsODT& aAppOdt,    
+    const ChspsODT& aPluginHeader,
+    RFs& aRfs )
     {
     __UHEAP_MARK;
-
-    // Convert configuration UID to decimal string
-    TBuf<10> confUid; 
-    _LIT( KFormat, "%D" );
-    confUid.AppendFormat( KFormat, aConfUid );
-
-    RFs fs;
-    CleanupClosePushL( fs );
-    User::LeaveIfError( fs.Connect() );
+    
+    // Get all languages which the HW image supports
+    CArrayFixFlat<TInt>* supportedLanguages = NULL;
+    hspsServerUtil::GetInstalledLanguagesL( supportedLanguages );
+    CleanupStack::PushL( supportedLanguages );
+    supportedLanguages->InsertL( 0, ELangNone ); // language independent resources
+    const TInt languagesCount = supportedLanguages->Count();
     
-    TInt resCount = aOdt.ResourceCount();
-    for ( TInt i = 0; i < resCount; i++ )
-        {
-        // Check if resource file belongs to defined configuration
-        // (file path contains configuration UID string)
-        ChspsResource& res = aOdt.ResourceL( i );
-        TPtrC resFile = res.FileName();
-        if ( resFile.FindC( confUid ) != KErrNotFound )
+    // If set, the plug-in resources need to be updated
+    TBool isBroken = EFalse;        
+        
+    // Loop resources from the application configuration and
+    // fix the language specific resources.
+    // Use case: backup has been taken from another variant
+    const TInt count = aAppOdt.ResourceCount();
+    for ( TInt i = 0; i < count; i++ )
+        {        
+        ChspsResource& appResource = aAppOdt.ResourceL( i );
+             
+        // If this resource needs to be checked 
+        if ( appResource.ConfigurationUid() == aPluginHeader.ThemeUid() )
             {
-            // Check that resource files exists
-            if ( !BaflUtils::FileExists( fs, resFile ) )
+            // Test if localization matches
+            TBool wasFound = EFalse;
+            for( TInt j=0; j < languagesCount; j++ )
                 {
-                User::Leave( KErrNotFound );
+                if( appResource.Language() == supportedLanguages->At( j ) )
+                    {
+                    wasFound = ETrue;
+                    break;                                               
+                    }
+                }
+            if( !wasFound )
+                {
+                isBroken = ETrue;
+                break;
                 }
             }
         }
+   
+    if( isBroken )
+        {                                             
+        // Remove all resources 
+        RemovePluginResourcesL( aAppOdt, aPluginHeader.ThemeUid() );
+   
+        // Add back the matching resources        
+        const TInt resourceCount = aPluginHeader.ResourceCount();
+        for ( TInt i=0; i < resourceCount; i++ )
+            {                    
+            ChspsResource& resource = aPluginHeader.ResourceL( i );
+
+            // Ignore the ODT resource
+            if ( resource.FileName().FindF( KSourcesFolder ) > 0
+                || resource.FileName().FindF( KLocalesFolder ) > 0 )                               
+                {
+                
+                // Find valid resources                
+                for( TInt j=0; j < languagesCount; j++ )
+                    {
+                    if( resource.Language() == supportedLanguages->At( j ) )
+                        {
+                        // Make sure the file exists    
+                        if( !BaflUtils::FileExists( aRfs, resource.FileName() ) )
+                            {
+                            User::Leave( KErrNotFound );
+                            }
+                        // Finally append the resource array of the application configuration 
+                        ChspsResource* clonedResource = resource.CloneL();
+                        CleanupStack::PushL( clonedResource );
+                        aAppOdt.AddResourceL( clonedResource );
+                        CleanupStack::Pop( clonedResource );
+                        }
+                    }
+                
+                }
+            }                
+                
+        }
     
-    CleanupStack::PopAndDestroy(); // fs
+    CleanupStack::PopAndDestroy( supportedLanguages );
     
     __UHEAP_MARKEND;
-    
     }
 
 // -----------------------------------------------------------------------------
@@ -1992,6 +2048,13 @@
                  {
                  aFs.SetSessionToPrivate( drive );
                  }
+// When Emmc drive is not present in emulator it is replaced by D drive
+#ifdef __WINSCW__
+             else 
+                 {
+                 aFs.SetSessionToPrivate( EDriveD );
+                 }
+#endif
              }
          else 
              {
@@ -2102,6 +2165,7 @@
             {
             CleanupStack::PushL( dirList );
                        
+            // Loop entries
             const TInt count = dirList->Count();          
             for( TInt entryIndex = 0; entryIndex < count; entryIndex++ )
                 {
@@ -2111,12 +2175,18 @@
                 file.Append( entry.iName );
                 
                 if( entry.IsDir() )
-                    {                               
+                    {   
+					                            
                     if( aDeviceLanguages )
                         {
+#if defined(WINSCW) || defined(__WINS__)
+                        // Emulator environment supports all languages, include all directories
+#else
+                        // Devices have less languages, therefore include specific directories only
                         TInt dirLanguage = 0;
                         TLex lex( entry.iName );
-                        TBool skipDir = ETrue;
+                        TBool skipDir = ETrue;                        
+                        // If conversion succeeded
                         if( lex.Val( dirLanguage ) == KErrNone && dirLanguage >= ELangTest )
                             {                   
                             for( TInt i=0; i < aDeviceLanguages->Count(); i++ )
@@ -2129,26 +2199,30 @@
                                     }
                                 }
                             }
+                        
+                        // If the language is not supported by the device  
                         if( skipDir )
                             {
                             continue;
                             }
+#endif                                                
                         }
-              
-                  file.Append( KDoubleBackSlash );
-                  }
+						
+                    file.Append( KDoubleBackSlash );
+                    }
                                 
               if( entry.IsDir() && aRecursive )
                   {                   
-                  // Find files from the directory and drive
+                  // Find files from the subdirectory and the drive
                   RArray<TInt> driveArray;
                   CleanupClosePushL( driveArray );                  
-                  driveArray.Append( aDriveArray[driveIndex] );                                   
+                  driveArray.AppendL( aDriveArray[driveIndex] );                                   
                   FindResourcesL( aFs, driveArray, file, aFileArray, NULL );   
                   CleanupStack::PopAndDestroy( &driveArray );
                   }
               else
-                  {                                                  
+                  {              
+                  // Append the results array
                   HBufC* nameBuf = file.AllocLC();                
                   aFileArray.AppendL( nameBuf );
                   CleanupStack::Pop( nameBuf );                      
@@ -2170,13 +2244,13 @@
     {
     User::LeaveIfError( SysLangUtil::GetInstalledLanguages( aLanguages ) );
     CleanupStack::PushL( aLanguages );
-    
-    const TInt testLang = (TInt)ELangTest;
-    
+
+    // Check for a duplicate entry
+    const TInt KTestLang = (TInt)ELangTest;    
     TBool isIncluded = EFalse;           
     for( TInt i = 0; i < aLanguages->Count(); i++ )
         {
-        if( aLanguages->At( i ) == testLang )
+        if( aLanguages->At( i ) == KTestLang )
             {    
             isIncluded = ETrue;            
             break;
@@ -2185,7 +2259,7 @@
     
     if( !isIncluded )
         {
-        aLanguages->InsertL( 0, testLang );        
+        aLanguages->InsertL( 0, KTestLang );        
         }
     
     CleanupStack::Pop( aLanguages );
--- a/homescreenpluginsrv/hspsmanager/src/hspsthemeserver.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/homescreenpluginsrv/hspsmanager/src/hspsthemeserver.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -624,7 +624,8 @@
 
     if( aRepositoryInfo.iEventType & EhspsODTUpdated ||
         aRepositoryInfo.iEventType & EhspsODTModified ||
-        aRepositoryInfo.iEventType & EhspsPluginReplaced )
+        aRepositoryInfo.iEventType & EhspsPluginReplaced ||
+        aRepositoryInfo.iEventType == EhspsODTActivated )
         {
         SetResourceFileCopyRequired( aRepositoryInfo.iAppUid );
         }    
@@ -3380,10 +3381,20 @@
                 header->ThemeVersion() ) );
             if ( err == KErrNone )
                 {
-                // Check that configuration resource files are found
-                TRAP( err, hspsServerUtil::CheckResourceFilesL( 
-                    aOdt, 
-                    uids[ i ] ) );
+                ChspsODT* odt = ChspsODT::NewL();
+                CleanupStack::PushL( odt );
+                err = GetConfigurationL( 0, header->ThemeUid(), *odt );                                
+                if ( err == KErrNone )
+                    {   
+	                // Check that configuration resource files are found
+                    TRAP( err,
+                            hspsServerUtil::CheckResourceFilesL(
+                                    aOdt,                                
+                                    *odt,
+                                    iFsSession );
+                            );    
+                    }
+                CleanupStack::PopAndDestroy();
                 }
             }
         
@@ -3632,7 +3643,7 @@
                     }                                                     
                 if ( !alreadyIncluded )
                     {                
-                    notificationTargets.Append( header );
+                    notificationTargets.AppendL( header );
 
                     // Check if active configuration supports the current family
                     TBool updateRequired = ETrue;
--- a/homescreenpluginsrv/hspsmanager/src/hspsthemeserversession.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/homescreenpluginsrv/hspsmanager/src/hspsthemeserversession.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -781,7 +781,7 @@
         ChspsODT& aAppODT,
         RArray<TInt>& aUidArray ) 
     {    
-    aUidArray.Reset();       
+    aUidArray.Reset();
     const TInt resourceCount = aAppODT.ResourceCount();
     for( TInt resourceIndex = 0; resourceIndex < resourceCount; resourceIndex++ )
         {      
@@ -790,9 +790,9 @@
         if ( uid > 0 &&
              aUidArray.Find( uid ) == KErrNotFound )
             {
-            aUidArray.Append( uid );
+            aUidArray.AppendL( uid );
             }
-        }                       
+        }
     }
 
 // -----------------------------------------------------------------------------
--- a/homescreensrv_plat/ai_variation_api/inc/activeidle2domaincrkeys.h	Wed Sep 01 12:22:09 2010 +0100
+++ b/homescreensrv_plat/ai_variation_api/inc/activeidle2domaincrkeys.h	Tue Sep 14 21:55:16 2010 +0300
@@ -128,4 +128,9 @@
  */
 const TUint32 KAIActiveViewPluginId = 0x00000852;
 
+/**
+ * Key id for finger follow view switching support
+ */
+const TUint32 KAIFingerFollowSupport = 0x00000853;
+
 #endif // __AI2INTERNALCRKEYS_H__
--- a/homescreensrv_plat/hs_widget_publisher_api/src/hswidgetitem.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/homescreensrv_plat/hs_widget_publisher_api/src/hswidgetitem.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -27,7 +27,6 @@
 HsWidgetItem::HsWidgetItem(std::string& aItemName, std::string& aValue):
 	mItemName(aItemName), mItemString(aValue), mItemInt(0), 
 	mIsString(true),mTrigger(false)
-	
 	{
 	}
 
@@ -36,7 +35,8 @@
 // ---------------------------------------------------------------------------
 //
 HsWidgetItem::HsWidgetItem( std::string& aItemName, int aValue ):
-	mItemName(aItemName), mItemString(), mItemInt(aValue), mIsString(false)
+	mItemName(aItemName), mItemString(), mItemInt(aValue), 
+	mIsString(false), mTrigger(false)
 	{
 	}
 
--- a/homescreensrv_plat/hs_widget_publisher_api/tsrc/src/TestHspApiBlocks.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/homescreensrv_plat/hs_widget_publisher_api/tsrc/src/TestHspApiBlocks.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -630,7 +630,7 @@
 	
 	delete mHSPApi;
 	
-	if ( count != 1 )
+	if ( count != 4 )
 		{
 		err = KErrGeneral;
 		}	
@@ -724,7 +724,7 @@
 	CLiwGenericParamList* res = GetListL( contentType, identifier, widgetName );
 	TInt count = ExtractItemCountL( *res );
 	
-	if ( count != 1 )
+	if ( count != 4 )
 		{
 		err = KErrGeneral;
 		}	
@@ -770,7 +770,7 @@
 	CLiwGenericParamList* res = GetListL( contentType, identifier, widgetName );
 	TInt count = ExtractItemCountL( *res );
 	
-	if ( count != 1 )
+	if ( count != 4 )
 		{
 		err = KErrGeneral;
 		}
@@ -816,7 +816,7 @@
 	CLiwGenericParamList* res = GetListL( contentType, identifier, widgetName );
 	TInt count = ExtractItemCountL( *res );
 	
-	if ( count != 1 )
+	if ( count != 4 )
 		{
 		err = KErrGeneral;
 		}
--- a/homescreensrv_plat/sapi_homescreenplugin/hspsservice/src/hspsconfigurationservice.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/homescreensrv_plat/sapi_homescreenplugin/hspsservice/src/hspsconfigurationservice.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -422,7 +422,7 @@
         
         for(TInt i=0; i < iNotifyParams->iCount; i++ )
             {
-            iPluginIds.Append( aParams.iPluginIds[i] );
+            iPluginIds.AppendL( aParams.iPluginIds[i] );
             }
            
         iNotifyParams->SetNameL(aParams.Name());
--- a/homescreensrv_plat/sapi_homescreenplugin/src/hspsliwutilities.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/homescreensrv_plat/sapi_homescreenplugin/src/hspsliwutilities.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -1057,7 +1057,7 @@
             }
         if ( aItemMask & CHspsLiwUtilities::EPluginMapLocked )
             {
-            //Add plugin locked status - locked/removable/none(default)
+            //Add plugin locked status - locked/permanent/none(default)
             AppendAttributeToMapL( aMap,
                     attrList,
                     KConfigurationAttrLockingStatus,
--- a/homescreensrv_plat/sapi_homescreenplugin/tsrc/hspsconfigurationif/group/mt_hspsconfigurationif.mmp	Wed Sep 01 12:22:09 2010 +0100
+++ b/homescreensrv_plat/sapi_homescreenplugin/tsrc/hspsconfigurationif/group/mt_hspsconfigurationif.mmp	Tue Sep 14 21:55:16 2010 +0300
@@ -61,5 +61,6 @@
 LIBRARY                 hspsclient.lib
 LIBRARY                 hspsodt.lib
 LIBRARY                 hspsresult.lib
+LIBRARY                 PlatformEnv.lib // for DriveInfo
 
 // End of file
--- a/homescreensrv_plat/sapi_homescreenplugin/tsrc/hspsconfigurationif/src/mt_hspsconfigurationif.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/homescreensrv_plat/sapi_homescreenplugin/tsrc/hspsconfigurationif/src/mt_hspsconfigurationif.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -23,6 +23,7 @@
 #include <eikenv.h>
 #include <centralrepository.h>
 #include <bautils.h>
+#include <driveinfo.h>
 #include "mt_hspsconfigurationif.h"
 #include "mt_hspsliwlistprinter.h"
 #include "mt_hspsinstallationservice.h"
@@ -132,8 +133,38 @@
 _LIT( KMinimalResourceFile4, "c:\\private\\20000fb1\\2456\\270513751\\536916225\\1.0\\sources\\picture.jpeg"  );
 _LIT( KFinnishMifLogo, "c:\\private\\20000fb1\\2456\\270513751\\536916274\\1.0\\sources\\dummy.mif"  );
 
+const TInt16 KletterA = 'a'; // ASCII code for 'a'
+
 // ======== LOCAL FUNCTIONS ====================================================
 
+//------------------------------------------------------------------------------
+// EMMC drive finder - from hspsServerUtil 
+//------------------------------------------------------------------------------
+TInt GetEmmcDrivePath( )
+    {
+    RFs fs;
+    if ( fs.Connect() != KErrNone )
+        {
+        return KErrNotFound;
+        }
+    TInt drive = KErrNotFound;
+    if ( DriveInfo::GetDefaultDrive( 
+            DriveInfo::EDefaultMassStorage, drive ) == KErrNone )
+        {
+        TUint status;
+        if ( DriveInfo::GetDriveStatus( fs, drive, status ) == KErrNone )
+            {
+            if ( status & DriveInfo::EDriveInternal )
+                {
+                fs.Close();
+                return drive;
+                }
+            }
+        }
+    fs.Close();
+    return KErrNotFound;
+    }
+
 // ======== MEMBER FUNCTIONS ===================================================
 
 //------------------------------------------------------------------------------
@@ -3209,6 +3240,15 @@
 void MT_CHSPSConfigurationIf::Customization_1_L()
     {        
     // Pre conditions
+    // There is minimal configuration and a D drive present in emulator
+    // Outcome:
+    // The original configuration file is bypassed by a new one placed on the D 
+    // drive
+    // Possible problems:
+    // There is no E drive (EMMC) in emulator. The data are copied to the D 
+    // drive. In case there is the E drive,please check all possible references
+    // to the D drive and change, if needed. This is important for HW testing.
+    // Remark: hspsServerUtil::FindFile() determines which drives are searched.
         
     EUNIT_PRINT( _L8( "Pre conditions: Set Active configuration Minimal" ) );
     SetActiveConfigurationL( KHSPSTestAppUid, KHSPSActiveConfMinimal );    
@@ -3219,13 +3259,24 @@
     // Simulate customization by copying configuration files to D drive ("ROM" stuff is on C)
     CFileMan* fileManager = CFileMan::NewL( iFileserver );
     CleanupStack::PushL( fileManager );
+    
+    // Find MMC drive, if not found copy it to the D drive
+    TInt drive = GetEmmcDrivePath();
+    if ( drive == KErrNotFound )
+        {
+        drive = EDriveD;    // Set D drive
+        }
+    _LIT( Kconfigdir, "d:\\data\\mt_hsps\\installed_widget\\widgetconfiguration.xml" );
+    TBuf<200> confdir;
+    confdir.Append( Kconfigdir );
+    confdir[0] = ( TInt16 )drive + KletterA; // see ACII table
     User::LeaveIfError( 
         fileManager->Copy(
-            _L( "c:\\data\\mt_hsps\\installed_widget\\widgetconfiguration_customized.xml" ),
-            _L( "d:\\data\\mt_hsps\\installed_widget\\widgetconfiguration.xml" ),
-            CFileMan::ERecurse|CFileMan::EOverWrite 
-            )             
+        _L( "c:\\data\\mt_hsps\\installed_widget\\widgetconfiguration_customized.xml" ),
+        confdir,
+        CFileMan::ERecurse|CFileMan::EOverWrite )
         );    
+    
     CleanupStack::PopAndDestroy( fileManager );
                 
     MT_CHspsInstallationService* installationService = MT_CHspsInstallationService::NewL();    
Binary file idlefw/conf/activeidle2.confml has changed
Binary file idlefw/conf/activeidle2_10275102.crml has changed
--- a/idlefw/plugins/devicestatus/inc/aimcnpublisher.h	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/plugins/devicestatus/inc/aimcnpublisher.h	Tue Sep 14 21:55:16 2010 +0300
@@ -98,6 +98,11 @@
      * Own.
      */
     CAiNetworkInfoListener* iListener;
+    
+    /**
+     * MCN info to show
+     */
+    TNWMCNName iMCNName;
     };
 
 
--- a/idlefw/plugins/devicestatus/src/aicontentobserveroptimizer.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/plugins/devicestatus/src/aicontentobserveroptimizer.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -194,7 +194,24 @@
                                      TInt aContent,
                                      TInt aIndex )
     {
-    return iObserver.Clean( aPlugin, aContent, aIndex );    
+    if ( IsInBlackList( aContent, aIndex ) )
+        {
+        return KErrNotFound;
+        }    
+    TInt err = iObserver.Clean( aPlugin, aContent, aIndex );
+    // Publish went through OK, we need to commit the transaction
+    if ( err == KErrNone && iTransactionStarted )
+        {
+        iCommitNeeded = ETrue;
+        }
+    // publish failed because the ui declaration doesn't
+    // include this content => add to black list and 
+    // don't try to publish again
+    else if ( err == KErrNotFound || err == KErrNotSupported )
+        {
+        AddToBlackList( aContent, aIndex );
+        }
+    return err;
     }
 
 MAiContentObserver& CAiContentObserverOptimizer::Observer() const
--- a/idlefw/plugins/devicestatus/src/aimcnpublisher.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/plugins/devicestatus/src/aimcnpublisher.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -71,7 +71,10 @@
     
 void CAiMCNPublisher::RefreshL( TBool /*aClean*/ )
     {
-    //cannot be refreshed
+    iContentObserver->Publish( *iExtension, 
+                                EAiDeviceStatusContentMCNIndicator, 
+                                iMCNName, 
+                                0 );
     }
 
 
@@ -85,14 +88,15 @@
         {
         if ( aInfo.iMCNIndicatorType == ENWMCNIndicatorTypeActive )
             {
-            TPtrC msg = aInfo.iMCNName;
+            iMCNName.Copy( aInfo.iMCNName );
             iContentObserver->Publish( *iExtension, 
             							EAiDeviceStatusContentMCNIndicator, 
-            							msg, 
+            							iMCNName, 
             							0 );
             }
         else if ( aInfo.iMCNIndicatorType == ENWMCNIndicatorTypeNone )
             {
+            iMCNName.Copy( KNullDesC );
             iContentObserver->Clean( *iExtension, 
             							EAiDeviceStatusContentMCNIndicator,
             							0 );
--- a/idlefw/plugins/devicestatus/src/ainetworkinfolistener.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/plugins/devicestatus/src/ainetworkinfolistener.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -100,36 +100,35 @@
 
 void CAiNetworkInfoListener::AddObserverL( MAiNetworkInfoObserver& aObserver )
     {
-	//Removing observer doesn't remove slots from array, removed observers are only
-	//set to NULL. Reason for this is found out later on the code. Adding observer
-	//first tries to find free slot, if it is not found, observer is appended to the
-	//array.
-    TInt freeSlot = iObservers.Find( NULL );
-
-    if( freeSlot == KErrNotFound )
+    
+    if ( iObservers.Find( &aObserver ) == KErrNotFound)
         {
-        User::LeaveIfError( iObservers.Append( &aObserver ) );
+        //Removing observer doesn't remove slots from array, removed observers are only
+        //set to NULL. Reason for this is found out later on the code. Adding observer
+        //first tries to find free slot, if it is not found, observer is appended to the
+        //array.
+        TInt freeSlot = iObservers.Find( NULL );
+    
+        if( freeSlot == KErrNotFound )
+            {
+            User::LeaveIfError( iObservers.Append( &aObserver ) );
+            }
+        else
+            {
+            User::LeaveIfError( iObservers.Insert( &aObserver, freeSlot ) );
+            }
         }
-    else
-        {
-        User::LeaveIfError( iObservers.Insert( &aObserver, freeSlot ) );
-        }
-    }
+   }
 
 void CAiNetworkInfoListener::RemoveObserver( MAiNetworkInfoObserver& aObserver )
     {
-	//Remove observer, removing is done by replacing it with NULL pointer.
-    const TInt count( iObservers.Count() );
-
-    for( TInt i( 0 ); i < count; i++ )
+    TInt slot = iObservers.Find( &aObserver );
+    
+    if (slot != KErrNotFound )
         {
-        if( iObservers[i] == &aObserver )
-            {
-            //replace it with NULL
-            iObservers.Remove( i );
-            iObservers.Insert( NULL, i );
-            break;
-            }
+        //Remove observer, removing is done by replacing it with NULL pointer.
+        iObservers.Remove( slot );
+        iObservers.Insert( NULL, slot );
         }
     }
 
@@ -155,25 +154,45 @@
 
 void CAiNetworkInfoListener::HandleNetworkMessage( const TNWMessages aMessage )
     {
-    __PRINT(__DBG_FORMAT("XAI: Handle NW message %d"), aMessage );
+    __PRINT(__DBG_FORMAT("XAI: CAiNetworkInfoListener > Handle NW message %d"), aMessage );
+    
+    __PRINT(__DBG_FORMAT("XAI: iInfo.iRegistrationStatus %d"), iInfo.iRegistrationStatus );
+    __PRINT(__DBG_FORMAT("XAI: iInfo.iStatus %d"), iInfo.iStatus );
+    __PRINT(__DBG_FORMAT("XAI: iInfo.iCountryCode %S"), &iInfo.iCountryCode );
+    __PRINT(__DBG_FORMAT("XAI: iInfo.iNetworkId %S"), &iInfo.iNetworkId );
+    __PRINT(__DBG_FORMAT("XAI: iInfo.iOperatorNameInfo.iType %d"), iInfo.iOperatorNameInfo.iType );
+    __PRINT(__DBG_FORMAT("XAI: iInfo.iOperatorNameInfo.iName %S"), &iInfo.iOperatorNameInfo.iName );
+    __PRINT(__DBG_FORMAT("XAI: iInfo.iDisplayTag %S"), &iInfo.iDisplayTag );
+    __PRINT(__DBG_FORMAT("XAI: iInfo.iShortName %S"), &iInfo.iShortName );
+    __PRINT(__DBG_FORMAT("XAI: iInfo.iLongName %S"), &iInfo.iLongName );
+    __PRINT(__DBG_FORMAT("XAI: iInfo.iSPName %S"), &iInfo.iSPName );
+    __PRINT(__DBG_FORMAT("XAI: iInfo.iServiceProviderNameDisplayReq %d"), iInfo.iServiceProviderNameDisplayReq );
+    __PRINT(__DBG_FORMAT("XAI: iInfo.iNPName %S"), &iInfo.iNPName );
+    __PRINT(__DBG_FORMAT("XAI: iInfo.iPLMNField %S"), &iInfo.iPLMNField );
+    
     //Insert message into the message cache. Only one messsage of one type.
     TRAPD( err, iMessageCache->InsertIsqL( aMessage, iKeyProperties ) );
     if( err == KErrAlreadyExists )
         {
+        __PRINTS("XAI: message already exists in cache");
         err = KErrNone;
         }
     if( err != KErrNone )
         {
+        __PRINTS("XAI: error inserting message to cache , return");
         return;
         }
 
+    __PRINTS("XAI: check if allowed to display operator indicator");
 	iShowOpInd 		= !NotAllowedToDisplayOperatorIndicator( aMessage );
 
 	TBool hasNetInfoChanged = HasNetworkInfoChanged( aMessage );
 	if ( !hasNetInfoChanged )
 		{
+	    __PRINTS("XAI: net info not changed, return");
 		return;
 		}
+
 	__PRINT(__DBG_FORMAT("XAI: Show operator indicator %d, info changed %d"), iShowOpInd, hasNetInfoChanged );
     const TInt count( iObservers.Count() );
 
@@ -200,7 +219,7 @@
 
 void CAiNetworkInfoListener::HandleNetworkError( const TNWOperation aOperation, TInt aErrorCode )
     {
-    __PRINT(__DBG_FORMAT("XAI: Error code %d"), aErrorCode );
+    __PRINT(__DBG_FORMAT("XAI: CAiNetworkInfoListener > NetworkError code %d"), aErrorCode );
 
     TNWMessages errorCode = TNWMessages( KErrGeneral );
 
--- a/idlefw/plugins/devicestatus/src/ainwspublisher.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/plugins/devicestatus/src/ainwspublisher.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -41,6 +41,7 @@
 
 void CAiNwsPublisher::ConstructL()
     {
+    __PRINTS( "XAI: CAiNwsPublisher > ConstructL" );
     iListener = CAiNetworkInfoListener::InstanceL();
     iProfileApi = CRepository::NewL( KCRUidProfileEngine );
     }
@@ -57,6 +58,7 @@
 
 CAiNwsPublisher::~CAiNwsPublisher()
     {
+    __PRINTS( "XAI: CAiNwsPublisher > ~CAiNwsPublisher" );
     if( iListener )
         {
         iListener->RemoveObserver( *this );
@@ -68,6 +70,7 @@
 
 void CAiNwsPublisher::ResumeL()
     {
+    __PRINTS( "XAI: CAiNwsPublisher > ResumeL" );
     iListener->AddObserverL( *this );
     }
 
@@ -77,6 +80,7 @@
                                     MAiPublishPrioritizer& /*aPrioritizer*/,
                                     MAiPublisherBroadcaster& /*aBroadcaster*/ )
     {
+    __PRINTS( "XAI: CAiNwsPublisher > Subscribe" );
     iContentObserver = &aObserver;
     iExtension = &aExtension;
     }
@@ -89,8 +93,10 @@
 
 TBool CAiNwsPublisher::RefreshL( TInt aContentId, TBool aClean )
 	{
+    __PRINTS( "XAI: CAiNwsPublisher::RefreshL" );
     if( aContentId == EAiDeviceStatusContentNWStatus )
         {
+        __PRINTS( "XAI: content EAiDeviceStatusContentNWStatus" );
    	    RefreshL( aClean );
    	    return ETrue;
     	}
@@ -98,13 +104,12 @@
     return EFalse;
 	}
 
-
-
 void CAiNwsPublisher::HandleNetworkInfoChange(
                             const MNWMessageObserver::TNWMessages& /*aMessage*/,
                             const TNWInfo& aInfo,
                             const TBool /*aShowOpInd*/ )
     {
+    __PRINTS( "XAI: CAiNwsPublisher::HandleNetworkInfoChange" );
     HandleStateChange( aInfo );
     }
 
@@ -139,16 +144,18 @@
 
 void CAiNwsPublisher::HandleNetworkFound()
     {
-    __PRINTS( "XAI: Network found, clean state" );
+    __PRINTS( "XAI: Network found" );
     iRegistered = ETrue;
     if ( iContentObserver && iExtension )
         {
+        __PRINTS( "XAI: Network found, clean state" );
         iContentObserver->Clean( *iExtension, EAiDeviceStatusContentNWStatus, 0 );
         }
     }
 
 void CAiNwsPublisher::HandleNetworkLost( const TNWNetworkSelectionSetting &aSelectionSetting )
     {
+    __PRINTS( "XAI: Network lost" );
     if( aSelectionSetting == ENWNetworkSelectionManual )
         {
         // See if we were registered before
--- a/idlefw/plugins/devicestatus/src/aioperatornamepublisher.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/plugins/devicestatus/src/aioperatornamepublisher.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -33,6 +33,7 @@
 #include "aiprioritizer.h"
 #include "ainwidpriorities.h"
 #include "activeidle2domaincrkeys.h"
+#include "debug.h"
 
 //Delay used to animate
 const TInt KCleanOperationDelay = 2 * 1000000;
@@ -132,8 +133,10 @@
                 const TNWInfo& /*aInfo*/,
                 const TBool aShowOpInd )
     {
+    __PRINTS("XAI: CAiOperatorNamePublisher::HandleNetworkInfoChange");    
     if ( iSuspended )
         {
+        __PRINTS("XAI: suspended");
         return;
         }
     
@@ -174,10 +177,12 @@
 
 void CAiOperatorNamePublisher::RefreshL( TBool aClean )
     {
+    __PRINTS("XAI: NamePublisher > RefreshL");
     iSuccess = EFalse;
 
     if ( iSuspended )
         {
+        __PRINTS("XAI: NamePublisher > RefreshL - iSuspended");
         return;
         }
     
@@ -185,6 +190,7 @@
         {
         MProfile* profile = iProfileEngine->ActiveProfileLC();
         const MProfileName& name = profile->ProfileName();
+        iPriority = EAiOfflineProfile;
         iPrioritizer->TryToPublishL( *iBroadcaster,
                                       EAiDeviceStatusContentNetworkIdentity,
                                       name.Name(),
@@ -193,14 +199,22 @@
         CleanupStack::PopAndDestroy();//profile
         return;
         }
-    
-    if( aClean )
+    else if ( iPriority == EAiOfflineProfile )
+        {
+        iPrioritizer->TryToCleanL( *iBroadcaster,
+                                    EAiDeviceStatusContentNetworkIdentity,
+                                    iPriority );
+        iPriority = EAiInvalidPriority;
+        }
+    else if( aClean )
         {
         iPrioritizer->TryToCleanL( *iBroadcaster,
                                     EAiDeviceStatusContentNetworkIdentity,
                                     iPriority );
         }
-
+    
+    __PRINT(__DBG_FORMAT("XAI: NamePublisher > RefreshL - iPriority = %d"), iPriority );
+    
     const TNWInfo& nwInfo = iListener->NetworkInfo();
 
 #if defined(WINSCW) || defined(__WINS__)
@@ -230,7 +244,8 @@
     //Check if PLMN  must be shown.
 
     const TBool showPLMN = nwInfo.iServiceProviderNameDisplayReq & ENWDisplayPLMNRequired;
-
+    __PRINT(__DBG_FORMAT("XAI: NamePublisher > RefreshL - showPLMN = %d"), showPLMN );
+    
     TBool isInSPDI = EFalse;
     TBool showSPN = EFalse;
 
@@ -245,7 +260,8 @@
     showSPN =
         showSPN ||
         ( nwInfo.iServiceProviderNameDisplayReq & ENWDisplaySPNRequired );
-
+    
+    __PRINT(__DBG_FORMAT("XAI: NamePublisher > RefreshL - showSPN  = %d"), showSPN );
     
 #if defined(WINSCW) || defined(__WINS__)
     _LIT( KOperator, "Operator" );    
@@ -278,8 +294,14 @@
             	}
             else
             	{
-	            //spn & plmn (SPN.And.EONS.No)
-	            iPriority = EAiServiceProviderName;
+                __PRINTS("XAI: NamePublisher > RefreshL (showPLMN)- try publish and start delayed operation ");
+                //spn & plmn (SPN.And.EONS.No)
+                if ( !OperatorNamePriority( iPriority ) )
+                    {                    
+                    iPriority = EAiServiceProviderName;
+                    }
+	            
+			    __PRINT(__DBG_FORMAT("XAI: NamePublisher > RefreshL - try publish with priority %d"), iPriority );
 	            iPrioritizer->TryToPublishL( *iBroadcaster,
 	                                        	EAiDeviceStatusContentNetworkIdentity,
 	                                        	serviceProviderName,
@@ -322,8 +344,14 @@
             	}
             else
             	{
+                __PRINTS("XAI: NamePublisher > RefreshL (showSPN)- try publish and start delayed operation ");
 	            //spn & plmn (SPN.And.EONS.No)
-	            iPriority = EAiServiceProviderName;
+                if ( !OperatorNamePriority( iPriority ) )
+                    {                    
+                    iPriority = EAiServiceProviderName;
+                    }
+
+      		    __PRINT(__DBG_FORMAT("XAI: NamePublisher > RefreshL - try publish with priority %d"), iPriority );
 	            iPrioritizer->TryToPublishL( *iBroadcaster,
 	                                        	EAiDeviceStatusContentNetworkIdentity,
 	                                        	serviceProviderName,
@@ -377,6 +405,7 @@
 
 void CAiOperatorNamePublisher::ShowNetworkIdentityNameL( TBool aTryToPublish )
 	{
+    __PRINTS("XAI: NamePublisher > ShowNetworkIdentityNameL");
 	const TNWInfo& nwInfo = iListener->NetworkInfo();
 
 	iNetworkIdentityName.Set( KNullDesC );
@@ -388,6 +417,8 @@
     		nwInfo.iOperatorNameInfo.iType != RMmCustomAPI::EOperatorNameFlexiblePlmn  &&
     			nwInfo.iRegistrationStatus == ENWRegisteredOnHomeNetwork )
     	{
+        __PRINTS("XAI: NamePublisher > ShowNetworkIdentityNameL - iNPName ");
+        
     	//priority
     	iPriority = EAiNetworkOperatorName;
     	//name
@@ -408,6 +439,8 @@
     // *** Operator name ***
     if( nwInfo.iOperatorNameInfo.iName.Length() > 0 )
     	{
+        __PRINTS("XAI: NamePublisher > ShowNetworkIdentityNameL - iOperatorNameInfo.iName ");
+        
     	//priority
     	OperatorNamePriority( iPriority );
     	//name
@@ -632,6 +665,7 @@
 
 TInt CAiOperatorNamePublisher::CleanAndShowPLMNOperationCallback( TAny* aPtr )
     {
+    __PRINTS("XAI: NamePublisher > CleanAndShowPLMNOperationCallback ");
     CAiOperatorNamePublisher* self =
                     static_cast<CAiOperatorNamePublisher*>( aPtr );
 
@@ -657,14 +691,16 @@
 
 void CAiOperatorNamePublisher::DoCleanOperationL()
     {
+    __PRINTS("XAI: NamePublisher > DoCleanOperationL");
     iPrioritizer->TryToCleanL( *iBroadcaster,
                                 EAiDeviceStatusContentNetworkIdentity,
-                                EAiServiceProviderName );
+                                iPriority );
     }
 
 
 TBool CAiOperatorNamePublisher::RefreshL( TInt aContentId, TBool aClean )
 	{
+    __PRINTS("XAI: NamePublisher > RefreshL with content");
     if ( aContentId == EAiDeviceStatusContentNetworkIdentity )
         {
         iSuspended = EFalse;
@@ -682,6 +718,7 @@
 
 TBool CAiOperatorNamePublisher::SuspendL( TInt aContentId, TBool /*aClean*/ )
     {
+    __PRINTS("XAI: NamePublisher > SuspendL with content");
     if ( aContentId == EAiDeviceStatusContentNetworkIdentity )
         {
         iSuspended = ETrue;
@@ -696,8 +733,10 @@
                                             TInt aContentId,
                                             TInt aPriority )
 	{
+    __PRINTS("XAI: NamePublisher > RefreshContentWithPriorityL");
 	if( aContentId == EAiDeviceStatusContentNetworkIdentity && aPriority == EAiServiceProviderName )
         {
+	    __PRINTS("XAI: NamePublisher > identity and priority matched ");
 	    RefreshL( EFalse );
 	    if( iSuccess )
    	        {
--- a/idlefw/plugins/devicestatus/src/aipublishprioritizer.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/plugins/devicestatus/src/aipublishprioritizer.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -54,14 +54,17 @@
                                             TInt aResource, 
                                             TInt aPriority )
     {
+    __PRINT(__DBG_FORMAT("XAI: TryToPublishL - content %d, aResource %d, aPriority %d, iPriority %d"), aContent, aResource, aPriority, iPriority );
     if( aPriority >= iPriority )
         {
+        __PRINTS("XAI: prio publish - priority check ok");
         iPriority = aPriority;
         (void)iContentObserver.Publish( iPropertyExtension, 
                                             aContent, 
                                             aResource, 
                                             0 );
         }
+    __PRINTS("XAI: prio publish - done");
     }
 
 
@@ -70,7 +73,8 @@
                                             const TDesC16& aText, 
                                             TInt aPriority )
     {
-    __PRINT(__DBG_FORMAT("XAI: prio publish - content %d, priority %d, text %S"), aContent, aPriority, &aText );
+    __PRINTS("XAI: CAiPublishPrioritizer::TryToPublishL");
+    __PRINT(__DBG_FORMAT("XAI: prio publish - content %d, aPriority %d, iPriority %d, text %S"), aContent, aPriority, iPriority, &aText );
     
     if( aPriority >= iPriority )
         {
@@ -81,6 +85,11 @@
                                             aText, 
                                             0 );
         }
+    else
+        {
+        __PRINTS("XAI: prio publish - aPriority < iPriority !!!! ");
+        }
+        
         
     __PRINTS("XAI: prio publish - done");
     }
@@ -91,14 +100,23 @@
                                             const TDesC8& aBuf, 
                                             TInt aPriority )
     {
+    __PRINTS("XAI: CAiPublishPrioritizer::TryToPublishL - TDesC8" );    
     if( aPriority >= iPriority )
         {
+        __PRINTS("XAI: prio publish - priority check ok");
         iPriority = aPriority;
         (void)iContentObserver.Publish( iPropertyExtension, 
                                             aContent, 
                                             aBuf, 
                                             0 );
         }
+    else
+        {
+        __PRINTS("XAI: prio publish - aPriority < iPriority !!!! ");
+        }
+        
+        
+    __PRINTS("XAI: prio publish - done");
     }
                             
 
@@ -106,7 +124,7 @@
                                         TInt aContent, 
                                         TInt aPriority )
     {
-    __PRINT(__DBG_FORMAT("XAI: prio clean - content %d, priority %d"), aContent, aPriority );
+    __PRINT(__DBG_FORMAT("XAI: CAiPublishPrioritizer::TryToCleanL - content %d, aPriority %d, iPriority %d"), aContent, aPriority, iPriority );
     if( aPriority == EAiInvalidPriority )
         {
         // do nothing
@@ -138,4 +156,8 @@
         	    }
         	}
         }
+    else
+        {
+        __PRINT(__DBG_FORMAT("XAI: prio clean - CLEAN failed - iPriority %d"), iPriority );
+        }        
     }
--- a/idlefw/plugins/mcsplugin/handler/src/mcspluginhandler.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/plugins/mcsplugin/handler/src/mcspluginhandler.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -30,6 +30,7 @@
 #include <mcsmenuitem.h>
 #include <mcspluginparamval.h>
 #include <LogsUiCmdStarter.h>
+#include <APGCLI.H>
 
 // User includes
 #include "mcsplugincompletedoperation.h"
@@ -39,10 +40,13 @@
 // Constants
 _LIT( KMenuTypeShortcut, "menu:shortcut" ); ///< Menu folder type.
 _LIT( KMenuAttrParamLogs, "logs:dialed" );
+_LIT( KMenuAttrProfiles, "profiles" );
 
 /** Argument value for parameter*/
 _LIT( KMenuAttrParam, "param" );
 
+const TUid KProfilesAppUid = { 0x100058F8 };
+
 #define KMCSCmailUidValue 0x2001E277
 #define KMCSCmailMailboxDefaultViewIdValue 0x1
 #define KMCSCmailMailboxViewIdValue 0x2
@@ -248,6 +252,27 @@
         {
         LogsUiCmdStarter::CmdStartL( LogsUiCmdStarterConsts::KDialledView() );
         }
+    else if ( param.Find( KMenuAttrProfiles ) != KErrNotFound )
+        {
+        RApaLsSession apaLsSession;
+        User::LeaveIfError( apaLsSession.Connect() );
+        CleanupClosePushL( apaLsSession );
+
+        TApaAppInfo appInfo;
+        TInt retVal = apaLsSession.GetAppInfo( appInfo, KProfilesAppUid );
+
+        if ( retVal == KErrNone )
+            {
+            CApaCommandLine* cmdLine = CApaCommandLine::NewLC();
+            cmdLine->SetExecutableNameL( appInfo.iFullName );
+            cmdLine->SetCommandL( EApaCommandRun );
+            User::LeaveIfError( apaLsSession.StartApp( *cmdLine ) );
+
+            CleanupStack::PopAndDestroy( cmdLine );
+            }
+
+        CleanupStack::PopAndDestroy( &apaLsSession );
+        }
     CleanupStack::PopAndDestroy( sendUi );
     }
 
--- a/idlefw/plugins/mcsplugin/publisher/inc/mcsplugindata.h	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/plugins/mcsplugin/publisher/inc/mcsplugindata.h	Tue Sep 14 21:55:16 2010 +0300
@@ -62,7 +62,7 @@
     /**
      * Name of the item.
      */
-    TDesC& Name();
+    const TDesC* Name();
     
     /**
      * Set name of the item,
@@ -72,7 +72,7 @@
     /**
      * Value of the item. Used for bookmark url.
      */
-    TDesC& Value();
+    const TDesC* Value();
     
     /*
      * Set value of the item.
--- a/idlefw/plugins/mcsplugin/publisher/inc/mcspluginengine.h	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/plugins/mcsplugin/publisher/inc/mcspluginengine.h	Tue Sep 14 21:55:16 2010 +0300
@@ -147,9 +147,12 @@
     void SetBackupRestore( TBool aBackupRestore );
 
     /**
-     * ShowSettingsL
-     */
-    void ShowSettingsL();
+    * Shows shortcut settings
+    *
+    * @param aEditIdx Change specified shortcut
+    * @return void
+    */
+    void ShowSettingsL( const TInt aEditIdx );
 
 private:
     // from MMCSPluginWatcherObserver
--- a/idlefw/plugins/mcsplugin/publisher/src/mcsplugin.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/plugins/mcsplugin/publisher/src/mcsplugin.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -40,6 +40,7 @@
 _LIT( KEventNameShowSettings,   "ShowSettings" );
 _LIT( KContentItemTypeText, "text" );
 _LIT( KContentItemTypeImage, "image" );
+const TInt KUndefinedIndex = -1;
 
 const TImplementationProxy KImplementationTable[] =
     {
@@ -375,7 +376,7 @@
         }
     else if( aEventName == KEventNameShowSettings )
         {
-        TRAP_IGNORE( iEngine->ShowSettingsL() );
+        TRAP_IGNORE( iEngine->ShowSettingsL( KUndefinedIndex ) );
         }    
     }
 
--- a/idlefw/plugins/mcsplugin/publisher/src/mcsplugindata.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/plugins/mcsplugin/publisher/src/mcsplugindata.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -111,9 +111,9 @@
 // 
 // ---------------------------------------------------------------------------
 //
-TDesC& CMCSData::Name()
+const TDesC* CMCSData::Name()
     {
-    return *iName;
+    return iName;
     }
     
 // ---------------------------------------------------------------------------
@@ -131,9 +131,9 @@
 // 
 // ---------------------------------------------------------------------------
 //
-TDesC& CMCSData::Value()
+const TDesC* CMCSData::Value()
     {
-    return *iValue;
+    return iValue;
     }
     
 // ---------------------------------------------------------------------------
@@ -265,20 +265,20 @@
             
             // id of all bookmarks is zero so name has to be check
             // in case of bookmark has changed
-            if ( id >= 0 && ( data->MenuItem().Id() != id ||
-                    ( id == 0 && data->Name().CompareF(
-                            iData[ i ]->Name() ) != 0 ) ) )
+            if( data->MenuItem().Id() != id ||
+                ( id == 0 && data->Name() != NULL && iData[i]->Name() != NULL && 
+                  data->Name()->CompareF( *iData[i]->Name() ) != 0 ) )
                 {
                 data->SetDirty( ETrue );
                 CMCSData* oldData = iData[i];
                 iData.Remove( i );
                 delete oldData;
-                
                 iData.InsertL( data, i );
-                CleanupStack::Pop( data );
+                CleanupStack::Pop( data );            
                 }
             else
                 {
+                // keep old data
                 CleanupStack::PopAndDestroy( data );
                 }
             }
@@ -572,8 +572,8 @@
                 }
             }
         }
-    // ETrue tells that modified settings are stored also to plugin reference
-    iPluginSettings->SetSettingsL( iInstanceUid, settingItems, ETrue );
+    // EFalse tells that modified settings are not stored to plugin reference
+    iPluginSettings->SetSettingsL( iInstanceUid, settingItems, EFalse );
     CleanupStack::PopAndDestroy(); // settingItems
     }
 
--- a/idlefw/plugins/mcsplugin/publisher/src/mcspluginengine.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/plugins/mcsplugin/publisher/src/mcspluginengine.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -50,7 +50,6 @@
 _LIT( KResourceFile, "mcspluginres.rsc" );
 _LIT( KResPath, "\\resource\\" );
 _LIT( KMMApplication, "mm://" );
-_LIT( KHideExit2, "&exit=hide" );
 _LIT( KSetFocusString, "!setfocus?applicationgroup_name=" );
 _LIT( KApplicationGroupName, "applicationgroup_name" );
 _LIT( KIcon, "icon" );
@@ -62,6 +61,7 @@
 _LIT( KMenuMailboxMaskId, "16389" );
 _LIT( KMenuTypeMailbox, "menu:mailbox" );
 _LIT( KPrefix, "0x" );
+_LIT( KMenuAttrInvokeSettingsUid, "0x99999990" );
 
 const TUid KHomescreenUid = { AI_UID3_AIFW_COMMON };
 const TUid KMMUid = { 0x101F4CD2 };
@@ -69,6 +69,10 @@
 const TUid KMCSCmailMailboxViewIdValue = { 0x2 };
 const TUid KBrowserUid = { 0x10008D39 };
 
+// maximum custom message length
+const TInt KMaxCustomMsg = 256;
+const TInt KUndefinedIndex = -1;
+
 // ======== LOCAL FUNCTIONS ========
 // ----------------------------------------------------------------------------
 // NextIdToken
@@ -355,7 +359,7 @@
         {        
         item = CMenuItem::CreateL( iMenu, KMenuTypeUrl, 0, 0 );
         CleanupStack::PushL( item );
-        item->SetAttributeL( KMenuAttrLongName, aData.Name() );
+        item->SetAttributeL( KMenuAttrLongName, *aData.Name() );
         item->SetAttributeL( KMenuAttrIconFile, KMenuIconFile );
         item->SetAttributeL( KMenuAttrIconId, KMenuBookmarkIconId );
         item->SetAttributeL( KMenuAttrMaskId, KMenuBookmarkMaskId );
@@ -375,7 +379,7 @@
         {   
         item = CMenuItem::CreateL( iMenu, KMenuTypeMailbox, 0, 0 );
         CleanupStack::PushL( item );
-        item->SetAttributeL( KMenuAttrLongName, aData.Name() );
+        item->SetAttributeL( KMenuAttrLongName, *aData.Name() );
         item->SetAttributeL( KMenuAttrIconFile, KMenuIconFile );
         item->SetAttributeL( KMenuAttrIconId, KMenuMailboxIconId );
         item->SetAttributeL( KMenuAttrMaskId, KMenuMailboxMaskId );
@@ -403,7 +407,14 @@
         TUint32 isHidden = flags & TMenuItem::EHidden;
         TUint32 isMissing = flags & TMenuItem::EMissing;
 
-        if ( iUndefinedItem && ( isHidden || isMissing ) )
+        TBool attrExists = ETrue;
+        TPtrC uid = aMenuItem->GetAttributeL(KMenuAttrUid, attrExists);
+                
+        // if item is hidden or missing (mmc card removed)
+        // use "Undefined" icon instead
+        // for empty item it's own icon is shown
+        if ( iUndefinedItem && uid.Compare(KMenuAttrInvokeSettingsUid) != 0 && 
+                ( isHidden || isMissing ) )
             {
             menuItem = iUndefinedItem;
             }
@@ -471,9 +482,14 @@
         TUint32 isHidden = flags & TMenuItem::EHidden;
         TUint32 isMissing = flags & TMenuItem::EMissing;
 
+        TBool attrExists = ETrue;
+        TPtrC uid = aMenuItem->GetAttributeL(KMenuAttrUid, attrExists);
+                
         // if item is hidden or missing (mmc card removed)
         // use "Undefined" text instead
-        if ( iUndefinedItem && ( isHidden || isMissing ) )
+        // for empty item it's own icon is shown
+        if ( iUndefinedItem && uid.Compare(KMenuAttrInvokeSettingsUid) != 0 && 
+                ( isHidden || isMissing ) )
             {
             menuItem = iUndefinedItem;
             }
@@ -532,7 +548,23 @@
         }
     else
         {
-        LaunchMCSItemL( dataItem );
+        CMenuItem* item(CMenuItem::OpenL(iMenu, dataItem.MenuItem().Id()));
+        CleanupStack::PushL(item);
+        
+        TBool attrExists = ETrue;
+        
+        TPtrC uid = item->GetAttributeL(KMenuAttrUid, attrExists);
+        
+        // Show selected shortcut settings
+        if (uid.Compare(KMenuAttrInvokeSettingsUid) == 0)
+            {
+            TRAP_IGNORE( ShowSettingsL(aIndex + 1) );
+            }
+        else
+            {
+            LaunchMCSItemL(dataItem);
+            }
+        CleanupStack::PopAndDestroy(item);
         }
     }
 
@@ -567,18 +599,17 @@
                                                       
     if ( !hasApplicationGroupName )
         {
+        CleanupStack::PopAndDestroy( item );
         return;
         }
     
     message = HBufC8::NewLC( KMMApplication().Length() + 
                              KSetFocusString().Length() +
-                             applicationGroupName.Length() + 
-                             KHideExit2().Length() );
+                             applicationGroupName.Length() );
 
     message->Des().Copy( KMMApplication );
     message->Des().Append( KSetFocusString );
     message->Des().Append( applicationGroupName );
-    message->Des().Append( KHideExit2 );
 
     // find MM application
     TApaTaskList taskList( CCoeEnv::Static()->WsSession() );
@@ -624,7 +655,7 @@
     {
     StartEffect( KBrowserUid );
     
-    CSchemeHandler* urlHandler = CSchemeHandler::NewL( aData.Value());    
+    CSchemeHandler* urlHandler = CSchemeHandler::NewL( *aData.Value());    
     CleanupStack::PushL( urlHandler );
     urlHandler->HandleUrlStandaloneL();
     CleanupStack::PopAndDestroy( urlHandler );
@@ -768,12 +799,22 @@
 // Launch General Settings plugin
 // ---------------------------------------------------------------------------
 //
-void CMCSPluginEngine::ShowSettingsL()
+void CMCSPluginEngine::ShowSettingsL( const TInt aEditIdx )
     { 
     TUid uid = {AI_UID_ECOM_IMPLEMENTATION_SETTINGS_MCSPLUGIN};
     
+    // format the custom message
+    // iInstanceUid/aEditIdx is the format
+    TBuf8<KMaxCustomMsg> msg;
+    msg.Append(iInstanceUid);
+    if( aEditIdx != KUndefinedIndex )
+        {
+        msg.Append('//');
+        msg.AppendFormat(_L8("%d"), aEditIdx);
+        }
+
     CGSLauncher* launcher = CGSLauncher::NewLC();
-    launcher->LaunchGSViewL ( uid, KHomescreenUid, iInstanceUid );
+    launcher->LaunchGSViewL ( uid, KHomescreenUid, msg );
     CleanupStack::PopAndDestroy( launcher );
     }
 
--- a/idlefw/plugins/mcsplugin/settings/inc/mcspluginsettings.h	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/plugins/mcsplugin/settings/inc/mcspluginsettings.h	Tue Sep 14 21:55:16 2010 +0300
@@ -159,6 +159,11 @@
      */
     void HandleListBoxSelectionL();
 
+    /**
+     * Callback function to be used with CPeriodic.
+     */
+    static TInt TimerCallbackL( TAny *aPtr );
+    
 private:  // data
 
     /**
@@ -166,6 +171,12 @@
      * Own.
      */
     CMCSPluginSettingsModel* iModel;
+    
+    /** 
+     * Timer to change specified shortcut when view is activated.
+     * Own. 
+     */
+    CPeriodic* iTimer;    
 };
 
 #endif // MCSPLUGINSETTINGS_H
--- a/idlefw/plugins/mcsplugin/settings/inc/mcspluginsettingsapplist.h	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/plugins/mcsplugin/settings/inc/mcspluginsettingsapplist.h	Tue Sep 14 21:55:16 2010 +0300
@@ -130,6 +130,11 @@
      */
     TPtrC UndefinedText() { return *iUndefinedText; };
 
+    /**
+     * Returns title for empty item
+     */
+    TPtrC EmptyText() { return *iEmptyText; };
+    
 private:
     /**
      * Constructor
@@ -169,6 +174,14 @@
      */
     void AddMailboxL( const TDesC& aMailbox, const TDesC& aMailboxId );
 
+    /**
+     * Returns title for requested item
+     *
+     * @param aUid Shortcut items uid
+     * @return HBufC title
+     */    
+    HBufC* MenuItemTextL( const TDesC& aUid );
+    
 private:  // data
 
     /**
@@ -192,10 +205,11 @@
      */
     HBufC* iUndefinedText;
     
-    /*
-     * Undefined MCS item, own
+    /**
+     * Name of "Empty" application, own
      */
-    CMenuItem* iUndefinedItem;
+    HBufC* iEmptyText;
+
 };
 
 #endif // CMCSPLUGINSETTINGSAPPLIST_H
--- a/idlefw/plugins/mcsplugin/settings/inc/mcspluginsettingscontainer.h	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/plugins/mcsplugin/settings/inc/mcspluginsettingscontainer.h	Tue Sep 14 21:55:16 2010 +0300
@@ -117,7 +117,12 @@
      * Hanle notify
      */
     void HandleNotifyL();
-
+    
+    /**
+     * Sets currently selected index
+     */
+    void SetCurrentItemIndex(TInt aIdx);
+    
 private:
 
     /*
--- a/idlefw/plugins/mcsplugin/settings/inc/mcspluginsettingsmodel.h	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/plugins/mcsplugin/settings/inc/mcspluginsettingsmodel.h	Tue Sep 14 21:55:16 2010 +0300
@@ -52,6 +52,7 @@
     TInt id;
     TSettingType type;
     TBool locked;
+    TBool empty;
     };
 
 /**
@@ -222,6 +223,14 @@
     TBool SettingLockedL( 
         RPointerArray<HSPluginSettingsIf::CPropertyMap>& aProperties );
 
+    /**
+     * Empty setting
+     * 
+     * @param aProperties
+     * @return TBool
+     */
+    TBool SettingEmptyL( 
+        RPointerArray<HSPluginSettingsIf::CPropertyMap>& aProperties );
     
 
     /**
--- a/idlefw/plugins/mcsplugin/settings/src/mcspluginsettings.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/plugins/mcsplugin/settings/src/mcspluginsettings.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -75,6 +75,8 @@
 //
 void CMCSPluginSettings::ConstructL()
 {
+    iTimer = CPeriodic::NewL( CActive::EPriorityUserInput );
+    
     FeatureManager::InitializeLibL();
 
     TParsePtrC driveParse(PathInfo::RomRootPath());
@@ -113,6 +115,12 @@
     FeatureManager::UnInitializeLib();
     iResourceLoader.Close();
     delete iModel;
+    
+    if (iTimer->IsActive())
+        {
+        iTimer->Cancel();
+        }
+    delete iTimer;
 }
 
 // ---------------------------------------------------------------------------
@@ -160,11 +168,49 @@
 //
 void CMCSPluginSettings::DoActivateL(const TVwsViewId& aPrevViewId, TUid aCustomMessageId, const TDesC8& aCustomMessage)
     {
-    iModel->SetPluginIdL( aCustomMessage );
+    // Parse the custom message
+    TInt locate = aCustomMessage.Locate('/');
+    TInt editIdx = -1;
+    
     iModel->UpdateAppListL( EFalse );
     iModel->UpdateBkmListL( EFalse );
-    iModel->UpdateSettingsL();
-    CGSBaseView::DoActivateL( aPrevViewId, aCustomMessageId, aCustomMessage );
+    
+    if (locate > 0)
+        {
+        // if / is located in the custom mesage
+        // upto / is the plugin id
+        iModel->SetPluginIdL(aCustomMessage.Left(locate));
+
+        // right most character is the edit index
+        TLex8 lex(aCustomMessage.Right(1));
+        lex.Val(editIdx);
+
+        iModel->UpdateSettingsL();
+        CGSBaseView::DoActivateL(aPrevViewId, aCustomMessageId,
+                aCustomMessage.Left(locate));        
+
+        if (editIdx > 0)
+            {
+            // set the current edit item
+            Container()->SetCurrentItemIndex(editIdx - 1);
+            
+            // Set timer for handle the change of shortcut item
+            // Otherwise status bar is not shown correctly
+            if (iTimer->IsActive())
+                {
+                iTimer->Cancel();
+                }
+            iTimer->Start( 0, 0, TCallBack( TimerCallbackL, this ) );
+            }
+        }
+    else
+        { 
+        // if '/' is not located, custommessage has only the plugin id 
+        iModel->SetPluginIdL(aCustomMessage);
+        iModel->UpdateSettingsL();
+        CGSBaseView::DoActivateL(aPrevViewId, aCustomMessageId,
+                aCustomMessage);
+        }
     }
 
 // ----------------------------------------------------------------------------
@@ -258,4 +304,18 @@
     Container()->HandleChangeCommandL();
 }
 
+// ---------------------------------------------------------------------------
+// Callback for direct settings change
+// ---------------------------------------------------------------------------
+//
+TInt CMCSPluginSettings::TimerCallbackL( TAny *aPtr )
+    {
+    CMCSPluginSettings* self = reinterpret_cast< CMCSPluginSettings* >( aPtr );
+    self->iTimer->Cancel();
+    // Handle the change
+    self->HandleListBoxSelectionL();
+    
+    return 0;
+    }
+
 // End of File.
--- a/idlefw/plugins/mcsplugin/settings/src/mcspluginsettingsapplist.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/plugins/mcsplugin/settings/src/mcspluginsettingsapplist.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -30,6 +30,7 @@
 _LIT8( KItemLocked, "locked");
 _LIT8( KProperValueFolder, "folder" );
 _LIT( KMenuAttrUndefUid, "0x99999991" );
+_LIT( KMenuAttrInvokeSettingsUid, "0x99999990" );
 _LIT( KMenuItemLongName, "long_name" );
 
 #define KMCSCmailMtmUidValue 0x2001F406
@@ -54,44 +55,10 @@
 
     iMenu.OpenL( KMyMenuData );
     
-    // Get "Undefined" icon and text
-    CMenuFilter* filter = CMenuFilter::NewL();
-    CleanupStack::PushL( filter );
-
-    // 'Undefined' item
-    filter->HaveAttributeL( KMenuAttrUid, KMenuAttrUndefUid );
-
-    TMenuItem item;
-    const TInt root = iMenu.RootFolderL();
-    RArray<TMenuItem> items;
-    CleanupClosePushL( items );
-    iMenu.GetItemsL( items, root, filter, ETrue );
-
-    if ( items.Count() > 0 )
-        {
-        iUndefinedItem = CMenuItem::OpenL( iMenu, items[ 0 ] );
-        iUndefinedText = NULL;
+    iUndefinedText = MenuItemTextL( KMenuAttrUndefUid );
+    iEmptyText = MenuItemTextL( KMenuAttrInvokeSettingsUid );
+    }
 
-        if ( iUndefinedItem )
-            {
-            TBool exists( KErrNotFound );//CleanupStack::PushL( undefinedItem );
-            TPtrC undefined = iUndefinedItem->GetAttributeL( KMenuItemLongName, exists );
-
-            if ( exists )
-                {
-                iUndefinedText = HBufC::NewMaxL( undefined.Length() );
-                iUndefinedText->Des().Copy( undefined );
-                }
-            else
-                {
-                iUndefinedText = KNullDesC().Alloc();
-                }
-            }
-        }
-
-    CleanupStack::PopAndDestroy( &items );
-    CleanupStack::PopAndDestroy( filter );
-    }
 
 // ---------------------------------------------------------------------------
 // Two-phased constructor
@@ -118,7 +85,7 @@
     iMenu.Close();
     
     delete iUndefinedText;
-    delete iUndefinedItem;
+    delete iEmptyText;
     }
 
 // ---------------------------------------------------------------------------
@@ -188,7 +155,7 @@
         RPointerArray<HSPluginSettingsIf::CPropertyMap>& aProperties )
     {
     TBool attrExists( EFalse );
-    TSettingItem settingItem = { KErrNotFound, EApplication, EFalse };
+    TSettingItem settingItem = { KErrNotFound, EApplication, EFalse, EFalse };
     TBool isFolder = EFalse;
 
     // check if the item is folder
@@ -414,4 +381,56 @@
     CleanupStack::Pop( newItem );
     }
 
+// ---------------------------------------------------------------------------
+// Gets specified menu item text
+// ---------------------------------------------------------------------------
+//
+HBufC* CMCSPluginSettingsAppList::MenuItemTextL( const TDesC& aUid )
+    {
+    HBufC* text = NULL;
+
+    // Get specified icon and text
+    CMenuFilter* filter = CMenuFilter::NewL();
+    CleanupStack::PushL( filter );
+    
+    // Filter specified item
+    filter->HaveAttributeL( KMenuAttrUid, aUid );
+    
+    const TInt root = iMenu.RootFolderL();
+    RArray<TMenuItem> items;
+    CleanupClosePushL( items );
+    iMenu.GetItemsL( items, root, filter, ETrue );
+    
+    CMenuItem* item = NULL;
+    
+    if ( items.Count() > 0 )
+        {
+        item = CMenuItem::OpenL( iMenu, items[ 0 ] );
+        
+        if ( item )
+            {
+            TBool exists( KErrNotFound );
+            TPtrC itemName = item->GetAttributeL( KMenuItemLongName, exists );
+    
+            if ( exists )
+                {
+                text = HBufC::NewMaxL( itemName.Length() );
+                text->Des().Copy( itemName );
+                }
+            delete item;
+            }
+        }
+
+    if( !text )
+        {
+        text = KNullDesC().Alloc();
+        }    
+
+    CleanupStack::PopAndDestroy( &items );
+    CleanupStack::PopAndDestroy( filter );
+    
+    return text;
+    }
+
+
 // End of File.
--- a/idlefw/plugins/mcsplugin/settings/src/mcspluginsettingsbkmlist.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/plugins/mcsplugin/settings/src/mcspluginsettingsbkmlist.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -111,7 +111,7 @@
 TSettingItem CMCSPluginSettingsBkmList::FindItemL( RPointerArray<HSPluginSettingsIf::CPropertyMap>& aProperties )
     {
     TInt index( KErrNotFound );
-    TSettingItem settingItem = { KErrNotFound, EBookmark, EFalse };
+    TSettingItem settingItem = { KErrNotFound, EBookmark, EFalse, EFalse };
     for( TInt i= 0; i < aProperties.Count(); i++ )
         {
         if( aProperties[i]->Name() == KUid )
@@ -247,7 +247,7 @@
     CleanupStack::PushL( newItem );
     newItem->SetAttributeL( KMenuAttrUid, aUid );
     newItem->SetAttributeL( KMenuAttrLongName, aName );
-    newItem->SetAttributeL( KMenuAttrView, aUrl );
+    newItem->SetAttributeL( KMenuAttrUrl, aUrl );
     newItem->SetAttributeL( KMenuAttrParameter, aName );
     iMenuItems.AppendL( newItem );
     CleanupStack::Pop( newItem );
--- a/idlefw/plugins/mcsplugin/settings/src/mcspluginsettingscontainer.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/plugins/mcsplugin/settings/src/mcspluginsettingscontainer.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -472,4 +472,16 @@
     iNotifyWatcher->WatchNotify( this );
     }
 
+// ---------------------------------------------------------------------------
+// Sets the currently selected item
+// ---------------------------------------------------------------------------
+//
+void CMCSPluginSettingsContainer::SetCurrentItemIndex( TInt aIdx )
+    {
+    if( iListBox )
+        {
+        iListBox->SetCurrentItemIndex( aIdx );
+        }
+    }
+
 // End of File.
--- a/idlefw/plugins/mcsplugin/settings/src/mcspluginsettingsmodel.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/plugins/mcsplugin/settings/src/mcspluginsettingsmodel.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -49,6 +49,7 @@
 _LIT8( KProperValueAppl, "application" );
 _LIT8( KProperValueMailbox, "mailbox" );
 _LIT( KMenuTypeMailbox, "menu:mailbox" );
+_LIT8( KMenuAttrInvokeSettingsUid, "0x99999990" );
 
 using namespace HSPluginSettingsIf;
 
@@ -230,7 +231,7 @@
 TSettingItem CMCSPluginSettingsModel::ItemL( 
                  RPointerArray<HSPluginSettingsIf::CPropertyMap>& aProperties )
     {
-    TSettingItem setting = { KErrNotFound, EApplication , EFalse };
+    TSettingItem setting = { KErrNotFound, EApplication , EFalse, EFalse };
 
     TSettingType type = SettingTypeL( aProperties );
     if ( type == EApplication || type == EMailbox )
@@ -243,7 +244,8 @@
         }
     
     setting.locked = SettingLockedL( aProperties );
-
+    setting.empty = SettingEmptyL( aProperties );
+    
     return setting;
     }
 
@@ -301,6 +303,30 @@
     }
 
 // ---------------------------------------------------------------------------
+// Gets empty status of given HSPS entry
+// ---------------------------------------------------------------------------
+//
+TBool CMCSPluginSettingsModel::SettingEmptyL( 
+                RPointerArray<HSPluginSettingsIf::CPropertyMap>& aProperties )
+    {
+        
+    for( TInt i = 0; i <aProperties.Count(); i++ )
+        {
+        TPtrC8 name = aProperties[i]->Name();
+        if( name == KProperNameUid )
+            {
+            TPtrC8 value = aProperties[i]->Value();
+            if( value.Compare(KMenuAttrInvokeSettingsUid) == 0 )
+                {
+                return ETrue;
+                }
+            }
+        }   
+    
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
 // Saves menuitem to HSPS to the given shortcut index
 // ---------------------------------------------------------------------------
 //
@@ -402,7 +428,18 @@
                 }
             else if ( properties[ i ]->Name() == KProperNameView )
                 {
-                TPtrC view = aMenuItem.GetAttributeL( KMenuAttrView, exists );
+                TPtrC type = aMenuItem.Type();
+                TPtrC attr;
+                if ( type == KMenuTypeUrl )
+                    {
+                    // In case of bookmark type item, bookmark URL is stored to view property
+                    attr.Set( KMenuAttrUrl );
+                    }
+                else
+                    {
+                    attr.Set( KMenuAttrView );
+                    }
+                TPtrC view = aMenuItem.GetAttributeL( attr, exists );
                 if( exists && view.Length() > 0 )
                     {
                     HBufC8* view8( NULL );
@@ -470,8 +507,8 @@
             }
         }
 
-    // ETrue tells that modified settings are stored also to plugin reference
-    User::LeaveIfError( iPluginSettings->SetSettingsL( *iPluginId, settingItems, ETrue ) );
+    // EFalse tells that modified settings are not stored to plugin reference
+    User::LeaveIfError( iPluginSettings->SetSettingsL( *iPluginId, settingItems, EFalse ) );
     CleanupStack::PopAndDestroy(); // settingItems
     }
 
@@ -515,10 +552,19 @@
         // first, we need to check if the item is missing 
         // (application uninstalled or mmc card removed)
         // If it is, we return "Undefined" application name instead
+        // In case of empty item, it's own name is returned
         if ( iSettings[ aIndex ].id == KErrNotFound )
             {
-            const TDesC& caption = iAppList->UndefinedText();
-            TRAP_IGNORE( line.Set( ListBoxLineL( caption, aIndex ) ) )
+            if ( iSettings[ aIndex ].empty )
+                {
+                const TDesC& caption = iAppList->EmptyText();
+                TRAP_IGNORE( line.Set( ListBoxLineL( caption, aIndex ) ) )
+                }
+            else
+                {
+                const TDesC& caption = iAppList->UndefinedText();
+                TRAP_IGNORE( line.Set( ListBoxLineL( caption, aIndex ) ) )
+                }
             }
         else
             {
@@ -555,7 +601,7 @@
 //
 const TSettingItem CMCSPluginSettingsModel::Item( TInt aIndex ) const
     {
-    TSettingItem setting = { KErrNotFound, EApplication, EFalse };
+    TSettingItem setting = { KErrNotFound, EApplication, EFalse, EFalse };
 
     if ( aIndex >= 0 && aIndex < iSettings.Count() )
         {
--- a/idlefw/plugins/sapidataplugin/src/sapidataplugin.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/plugins/sapidataplugin/src/sapidataplugin.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -241,7 +241,9 @@
           if ( icon != NULL ) // Syntax correct but icon not found
               {
               aObserver->PublishPtr( *this, aContentId, icon , aContentId );
-              iIconArray.Append(icon);
+              CleanupStack::PushL( icon );
+              iIconArray.AppendL( icon );
+              CleanupStack::Pop( icon );
               } 
           else
               {
@@ -285,6 +287,7 @@
                 {
                 // Take the ownership
                 CGulIcon* icon = CGulIcon::NewL(bitmap);
+                CleanupStack::PushL( icon );
                 if( aMaskHandle != KErrBadHandle )
                     {
                     CFbsBitmap* mask = new (ELeave) CFbsBitmap();
@@ -294,7 +297,8 @@
                         }
                     }
                 aObserver->PublishPtr( *this, aContentId, icon , aContentId );
-                iIconArray.Append(icon);
+                iIconArray.AppendL( icon );
+                CleanupStack::Pop( icon );
                 }
             else
                 {
@@ -484,8 +488,6 @@
 void CSapiDataPlugin::Stop( TStopReason aReason )
     {
     TRAP_IGNORE( StopL( aReason ) );
-    
-    iPluginState = EStopped;
     }
 
 // ----------------------------------------------------------------------------
@@ -495,23 +497,28 @@
 //
 void CSapiDataPlugin::StopL( TStopReason aReason )
     {
-    if ( aReason == ESystemShutdown )
+    if ( iPluginState != EStopped )
         {
-        iData->ChangePublisherStatusL( KSystemShutdown );
-        }
-    else if ( aReason == EPageShutdown )
-        {
-        iData->ChangePublisherStatusL( KPageShutdown );
+        if ( aReason == ESystemShutdown )
+            {
+            iData->ChangePublisherStatusL( KSystemShutdown );
+            }
+        else if ( aReason == EPageShutdown )
+            {
+            iData->ChangePublisherStatusL( KPageShutdown );
+            }
+        else if ( aReason == EPluginShutdown )
+            {
+            iData->ChangePublisherStatusL( KPluginShutdown );
+            }
+    
+        if ( iData )
+            {
+            iData->ChangePublisherStatusL( KDeActive );
+            }
+        
+        iPluginState = EStopped;
         }
-    else if ( aReason == EPluginShutdown )
-        {
-        iData->ChangePublisherStatusL( KPluginShutdown );
-        }
-
-    if ( iData )
-        {
-        iData->ChangePublisherStatusL( KDeActive );
-        }          
     }
 
 // ----------------------------------------------------------------------------
--- a/idlefw/plugins/wrtdataplugin/src/wrtdataplugin.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/plugins/wrtdataplugin/src/wrtdataplugin.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -582,7 +582,9 @@
           if ( icon != NULL ) // Syntax correct but icon not found
               {
               aObserver->PublishPtr( *this, aContentId, icon , aContentId );
-              iIconArray.Append(icon);
+              CleanupStack::PushL( icon );
+              iIconArray.AppendL( icon );
+              CleanupStack::Pop( icon );
               } 
           else
               {
@@ -626,6 +628,7 @@
                 {
                 // Take the ownership
                 CGulIcon* icon = CGulIcon::NewL(bitmap);
+                CleanupStack::PushL( icon );
                 if( aMaskHandle != KErrBadHandle )
                     {
                     CFbsBitmap* mask = new (ELeave) CFbsBitmap();
@@ -635,7 +638,8 @@
                         }
                     }
                 aObserver->PublishPtr( *this, aContentId, icon , aContentId );
-                iIconArray.Append(icon);
+                iIconArray.AppendL( icon );
+                CleanupStack::Pop( icon );
                 }
             else
                 {
--- a/idlefw/src/framework/aicpsexecuteparam.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/src/framework/aicpsexecuteparam.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -201,7 +201,7 @@
 //
 void CAiCpsExecuteParam::AddActionL(const TDesC8& aAction)
     {
-    iActions.Append(aAction.AllocL());
+    iActions.AppendL(aAction.AllocL());
     }
 
 // End of file
--- a/idlefw/src/framework/aipluginfactory.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/src/framework/aipluginfactory.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -512,7 +512,7 @@
     ConfigurePluginL( *plugin, info ) );
     
     // Take plugin's ownership
-    iPublishers.Append( plugin );
+    iPublishers.AppendL( plugin );
     CleanupStack::Pop( plugin );
     }
 
--- a/idlefw/src/framework/aiuicontrollermanager.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/src/framework/aiuicontrollermanager.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -55,9 +55,9 @@
     User::LeaveIfError( aRepository.Get( KAiMainUIController, value ) );
     
     CAiUiController* controller = CAiUiController::NewL( TUid::Uid( value ) );
-    
-    iCreatedUICList.Append( value );
     CleanupStack::PushL( controller );
+
+    iCreatedUICList.AppendL( value );   
     
     iMainUiController = controller->MainInterface();
     
@@ -98,7 +98,7 @@
             continue;
             }
         
-        iCreatedUICList.Append( value );
+        iCreatedUICList.AppendL( value );
         
         CAiUiController* controller = 
             CAiUiController::NewL( TUid::Uid( value ) );
--- a/idlefw/tsrc/devicestatusplugin/group/MT_DevStaPlg.mmp	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/tsrc/devicestatusplugin/group/MT_DevStaPlg.mmp	Tue Sep 14 21:55:16 2010 +0300
@@ -36,15 +36,12 @@
 
 USERINCLUDE             ../mt_devstaplg
 USERINCLUDE             ../stub/src
-USERINCLUDE             ../../../../inc/common
-USERINCLUDE             ../../../../inc/framework
-USERINCLUDE             ../../../../group
-USERINCLUDE             ../../../../plugins/devicestatus/inc
-USERINCLUDE             ../../../../../../homescreen/idlehomescreen/inc
-USERINCLUDE             ../../../../../../homescreen/idlehomescreen/nativeuicontroller/inc
-USERINCLUDE             ../../../../../idlefw/plugins/profileplugin/inc
-USERINCLUDE             ../../../../../../../app/homescreen/idlehomescreen/inc
-USERINCLUDE             ../../../../../../../app/homescreen/idlehomescreen/nativeuicontroller/inc
+USERINCLUDE             ../../../plugins/devicestatus/inc
+USERINCLUDE             ../../../../../homescreen/idlehomescreen/inc
+USERINCLUDE             ../../../../../homescreen/idlehomescreen/nativeuicontroller/inc
+USERINCLUDE             ../../../../idlefw/plugins/profileplugin/inc
+USERINCLUDE             ../../../../../../app/homescreen/idlehomescreen/inc
+USERINCLUDE             ../../../../../../app/homescreen/idlehomescreen/nativeuicontroller/inc
 
 APP_LAYER_SYSTEMINCLUDE
 
--- a/idlefw/tsrc/devicestatusplugin/mt_devstaplg/MT_DevStaPlg.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/tsrc/devicestatusplugin/mt_devstaplg/MT_DevStaPlg.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -559,7 +559,7 @@
         {
         User::Leave( KErrNoMemory );
         }    
-		/*
+
     MAiPropertyExtension* ext = static_cast<MAiPropertyExtension*>( iPublisher->Extension( KExtensionUidProperty ) ); 
     MAiContentRequest* request = static_cast<MAiContentRequest*>( ext->GetPropertyL( EAiContentRequest ) );
     
@@ -657,7 +657,7 @@
     
     CStubDataHolder::Instance()->SetCurrentProfileL( KProfGeneral, EProfileGeneralId );
         
-    /*
+
     MAiPropertyExtension* ext = static_cast<MAiPropertyExtension*>( iPublisher->Extension( KExtensionUidProperty ) ); 
     MAiContentRequest* request = static_cast<MAiContentRequest*>( ext->GetPropertyL( EAiContentRequest ) );
     
--- a/idlefw/tsrc/devicestatusplugin/mt_devstaplg/contentobserver.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/tsrc/devicestatusplugin/mt_devstaplg/contentobserver.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -96,19 +96,19 @@
 	}
 
 
-TInt CContentObserver::StartTransaction(TInt aTxId)
+TInt CContentObserver::StartTransaction(TInt /*aTxId*/)
 	{
 	return 0;
 	}
 
 
-TInt CContentObserver::Commit(TInt aTxId)
+TInt CContentObserver::Commit(TInt /*aTxId*/)
 	{
 	return 0;
 	}
 
 
-TInt CContentObserver::CancelTransaction(TInt aTxId)
+TInt CContentObserver::CancelTransaction(TInt /*aTxId*/)
 	{
 	return 0;
 	}
@@ -120,7 +120,7 @@
     }
 
 
-TInt CContentObserver::Publish(CHsContentPublisher& aPlugin, TInt aContent, TInt aResource, TInt aIndex )
+TInt CContentObserver::Publish(CHsContentPublisher& /*aPlugin*/, TInt aContent, TInt aResource, TInt aIndex )
 	{
 	RDebug::Print( _L("Publish(%d, %d, %d)"), aContent, aResource, aIndex );
 	CContentCache* cache = new( ELeave )CContentCache;
@@ -133,7 +133,7 @@
 	return 0;
 	}
 
-TInt CContentObserver::Publish(CHsContentPublisher& aPlugin, TInt aContent, const TDesC16& aText, TInt aIndex )
+TInt CContentObserver::Publish(CHsContentPublisher& /*aPlugin*/, TInt aContent, const TDesC16& aText, TInt aIndex )
 	{
 	RDebug::Print( _L("Publish(%d, \"%S\", %d)"), aContent, &aText, aIndex );
 	CContentCache* cache = new( ELeave )CContentCache;
@@ -147,7 +147,7 @@
 	}
 
 
-TInt CContentObserver::Publish(CHsContentPublisher& aPlugin, TInt aContent, const TDesC8& aBuf, TInt aIndex )
+TInt CContentObserver::Publish(CHsContentPublisher& /*aPlugin*/, TInt aContent, const TDesC8& aBuf, TInt aIndex )
 	{
 	RDebug::Print( _L("Publish(%d, Buf.Len=%d, %d)"), aContent, aBuf.Length(), aIndex );
 	CContentCache* cache = new( ELeave )CContentCache;
@@ -161,7 +161,7 @@
 	}
 
 
-TInt CContentObserver::Publish(CHsContentPublisher& aPlugin, TInt aContent, RFile& aFile, TInt aIndex )
+TInt CContentObserver::Publish(CHsContentPublisher& /*aPlugin*/, TInt aContent, RFile& /*aFile*/, TInt aIndex )
 	{
 	CContentCache* cache = new( ELeave )CContentCache;
 	CleanupStack::PushL( cache );
@@ -173,7 +173,7 @@
 	}
 
 
-TInt CContentObserver::Clean(CHsContentPublisher& aPlugin, TInt aContent, TInt aIndex)
+TInt CContentObserver::Clean(CHsContentPublisher& /*aPlugin*/, TInt aContent, TInt aIndex)
 	{
 	RDebug::Print( _L("Clean(%d, %d)"), aContent, aIndex );
 	CContentCache* cache = new( ELeave )CContentCache;
@@ -187,12 +187,12 @@
 	}
 
 
-TAny* CContentObserver::Extension(TUid aUid)
+TAny* CContentObserver::Extension(TUid /*aUid*/)
 	{
 	return NULL;
 	}
 
-TBool CContentObserver::RequiresSubscription( const THsPublisherInfo& aPublisherInfo ) const
+TBool CContentObserver::RequiresSubscription( const THsPublisherInfo& /*aPublisherInfo*/ ) const
     {
     return EFalse;
     }
--- a/idlefw/tsrc/devicestatusplugin/stub/group/devstaplg.mmp	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/tsrc/devicestatusplugin/stub/group/devstaplg.mmp	Tue Sep 14 21:55:16 2010 +0300
@@ -29,11 +29,12 @@
 #include <data_caging_paths.hrh>
 #include <eunitcaps.h>
 
-#include        <platform/mw/aisystemuids.hrh>
+//#include        <platform/mw/aisystemuids.hrh>
 
 TARGET          aidevstaplg.dll
 TARGETTYPE      PLUGIN
-UID             0x10009D8D AI_UID_ECOM_DLL_CONTENTPUBLISHER_DEVSTAPLUGIN
+UID             0x10009D8D 0x102750F7 //AI_UID_ECOM_DLL_CONTENTPUBLISHER_DEVSTAPLUGIN
+
 
 CAPABILITY      EUNIT_CAPS
 
--- a/idlefw/tsrc/devicestatusplugin/stub/src/profileengine.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/tsrc/devicestatusplugin/stub/src/profileengine.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -200,7 +200,9 @@
 
 
 TProfileRingingVolume CProfileEngine::TempRingingVolumeL() const
-    {    
+    {
+    TProfileRingingVolume vol = EProfileRingingVolumeLevel1;
+    return vol;
     }
 
 
@@ -210,7 +212,9 @@
 
 
 TProfileRingingVolume CProfileEngine::TempMediaVolumeL() const
-    {    
+    {
+    TProfileRingingVolume vol = EProfileRingingVolumeLevel1;
+    return vol;
     }
 
 
--- a/idlefw/tsrc/mcsplugin/ut_mcsplugin/ut_mcspluginpublisher.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/idlefw/tsrc/mcsplugin/ut_mcsplugin/ut_mcspluginpublisher.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -47,19 +47,13 @@
 _LIT( KMenuMailboxIconId, "16388" );
 _LIT( KMenuMailboxMaskId, "16389" );
 _LIT( KMenuTypeMailbox, "menu:mailbox" );
-_LIT( KIcon, "icon" );
 
 _LIT8( KProperNameType, "type" );
-_LIT8( KProperNameParam, "param" );
 _LIT8( KProperNameUid, "uid" );
-_LIT8( KProperNameView, "view" );
-_LIT8( KProperNameLocked, "locked" );
 _LIT8( KProperValueBookmark, "bookmark" );
 _LIT8( KProperValueFolder, "folder" );
 _LIT8( KProperValueMailbox, "mailbox" );
 _LIT8( KMenuAttrUndefUid, "0x99999991" );
-_LIT8( KMenuAttrViewTest, "view:test" );
-_LIT8( KMenuAttrParamTest, "param:test" );
 
 _LIT( KTestName, "test:name" );
 _LIT( KTestIconAttr, "icon_attributes" );
@@ -203,7 +197,7 @@
 void UT_MCSPluginPublisher::Teardown()
 {
     User::LeaveIfError( iPluginSettings->SetSettingsL( KNameSpace,
-        iSettings, ETrue ));
+        iSettings, EFalse ));
 
     iSettings.ResetAndDestroy();
 
@@ -231,8 +225,8 @@
     data->SetNameL( KTestName );
     data->SetValueL( KTestValue );
 
-    EUNIT_ASSERT_EQUALS( data->Name(), KTestName );
-    EUNIT_ASSERT_EQUALS( data->Value(), KTestValue );
+    EUNIT_ASSERT_EQUALS( *data->Name(), KTestName );
+    EUNIT_ASSERT_EQUALS( *data->Value(), KTestValue );
 
     CleanupStack::PopAndDestroy( data );
 }
@@ -278,7 +272,7 @@
     }
 
     User::LeaveIfError( iPluginSettings->SetSettingsL( KNameSpace, settings,
-        ETrue) );
+        EFalse ));
     iMCSPlugin->iEngine->iPluginData->UpdateDataL();
 
     CMCSData& itemData =  iMCSPlugin->iEngine->iPluginData->DataItemL( 0 );
@@ -309,7 +303,7 @@
     }
 
     User::LeaveIfError( iPluginSettings->SetSettingsL( KNameSpace, settings,
-        ETrue ));
+        EFalse ));
     iMCSPlugin->iEngine->iPluginData->UpdateDataL();
 
     CMCSData& itemData =  iMCSPlugin->iEngine->iPluginData->DataItemL( 0 );
@@ -340,7 +334,7 @@
     }
 
     User::LeaveIfError( iPluginSettings->SetSettingsL( KNameSpace, settings,
-        ETrue));
+        EFalse ));
     iMCSPlugin->iEngine->iPluginData->UpdateDataL();
 
     CMCSData& itemData =  iMCSPlugin->iEngine->iPluginData->DataItemL(0);
--- a/layers.sysdef.xml	Wed Sep 01 12:22:09 2010 +0100
+++ b/layers.sysdef.xml	Tue Sep 14 21:55:16 2010 +0300
@@ -23,7 +23,7 @@
 		
     <layer name="unit_test_layer">
       <module name="homescreensrv_unit_tests">
-  			<unit unitID="hsdo.idlefw.test" name="idlefw.test" bldFile="&layer_real_source_path;/idlefw/Internal/tsrc/group" mrp="" />
+  			<unit unitID="hsdo.idlefw.test" name="idlefw.test" bldFile="&layer_real_source_path;/idlefw/tsrc/group" mrp="" />
       </module>
     </layer>		
 		
--- a/menucontentsrv/group/mcsmenu.mmp	Wed Sep 01 12:22:09 2010 +0100
+++ b/menucontentsrv/group/mcsmenu.mmp	Tue Sep 14 21:55:16 2010 +0300
@@ -12,7 +12,7 @@
 * Contributors:
 *
 * Description:  
-*  Version     : %version: sa1spcx1#11.1.7.1.8 % << Don't touch! Updated by Synergy at check-out.
+*  Version     : %version: sa1spcx1#11.1.7.1.9 % << Don't touch! Updated by Synergy at check-out.
 *
 */
 
@@ -80,6 +80,7 @@
 SOURCE          mcsmmcobserver.cpp
 SOURCE          mcsfreespaceobserver.cpp
 SOURCE          mcsinstallnotifier.cpp
+SOURCE          mcsinstallstrategy.cpp
 
 SOURCE          mcsgetlistcreatorinterface.cpp
 SOURCE          mcsgetlisthandler.cpp
--- a/menucontentsrv/group/mcsmenusrv.mmp	Wed Sep 01 12:22:09 2010 +0100
+++ b/menucontentsrv/group/mcsmenusrv.mmp	Tue Sep 14 21:55:16 2010 +0300
@@ -12,7 +12,7 @@
 * Contributors:
 *
 * Description:  
-*  Version     : %version: sa1spcx1#5.1.9 % << Don't touch! Updated by Synergy at check-out.
+*  Version     : %version: sa1spcx1#5.1.10 % << Don't touch! Updated by Synergy at check-out.
 *
 */
 
@@ -27,7 +27,7 @@
 TARGET          mcsmenuserver.exe
 TARGETTYPE      exe
 UID             0x1000008c MENU_SRV_UID3
-CAPABILITY      AllFiles ProtServ ReadDeviceData
+CAPABILITY      AllFiles ProtServ ReadDeviceData ReadUserData 
 VENDORID        VID_DEFAULT
 
 EPOCSTACKSIZE   0x5000
--- a/menucontentsrv/srvinc/mcsdrmhandler.h	Wed Sep 01 12:22:09 2010 +0100
+++ b/menucontentsrv/srvinc/mcsdrmhandler.h	Tue Sep 14 21:55:16 2010 +0300
@@ -32,24 +32,24 @@
  *  @lib mcsmenu.lib
  *  @since S60 v5.0
  */
-NONSHARABLE_CLASS( CMcsDrmHandler ): 
+NONSHARABLE_CLASS( CMcsDrmHandler ):
     public CBase,
     public MMcsInstallListener,
     public MMcsDrmObserver,
     public MMcsDrmAppScanner
     {
 public:
-    
+
     /**
     * Two-phased constructor. Leaves on failure.
     * @return The constructed object.
     */
-    
-    static CMcsDrmHandler* NewL( 
+
+    static CMcsDrmHandler* NewL(
         CMenuSrvEng& aSrvEng,
         CMenuSrvEngUtils& aUtils,
         CMcsCacheHandler& aCacheHandler );
-    
+
     /**
     * Destructor.
     * @since S60 v5.0
@@ -58,24 +58,25 @@
     * @panic None.
     */
     virtual ~CMcsDrmHandler();
-    
+
     void HandleDrmEvent( TUid aUid );
-    
+
     void HandleDrmAppEvent();
-    
+
     void EngineEvents( TInt aFolder, TInt aEvents );
 
     /**
      * Handle Install Event
      */
-    void HandleInstallNotifyL(TInt aPackageUid);    
-    
+    void HandleInstallNotifyL( TUid aPackageUid,
+    		CMcsInstallNotifier::TNotificationType aNotificationType  );
+
 private:
 
     /**
     * Constructor.
     */
-    CMcsDrmHandler( 
+    CMcsDrmHandler(
         CMenuSrvEng& aSrvEng,
         CMenuSrvEngUtils& aUtils,
         CMcsCacheHandler& aCacheHandler  );
@@ -84,27 +85,27 @@
     * 2nd phase constructor.
     */
     void ConstructL();
-    
-    void AddRemoveObserversL( 
+
+    void AddRemoveObserversL(
     		const RArray<TUid>& aDrmProtectedArray );
-    
+
     TInt AppFolderIdL( TUid aUid );
-    
+
 private:    // data
-    
+
     RMcsDrmObserverManager iObserversManager;
-    
-    
+
+
     CMenuSrvEng& iSrvEng; ///< Menu Engine. Not own.
-    
+
     CMenuSrvEngUtils& iUtils;
-    
+
     CMcsCacheHandler& iCacheHandler;
-    
+
     CMcsDrmScanner* iScanner;
-    
+
     CMcsInstallNotifier* iInstallNotifier;
-    
+
     };
 
 #endif // __MCSDRMHANDLER_H__
--- a/menucontentsrv/srvinc/mcsinstallnotifier.h	Wed Sep 01 12:22:09 2010 +0100
+++ b/menucontentsrv/srvinc/mcsinstallnotifier.h	Tue Sep 14 21:55:16 2010 +0300
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of "Eclipse Public License v1.0"
@@ -11,8 +11,8 @@
 *
 * Contributors:
 *
-* Description:  This class implements MMcsGetListCreatorInterface. It builds tree 
-*   output list for getlist operation 
+* Description:  This class implements MMcsGetListCreatorInterface. It builds tree
+*   output list for getlist operation
 *
 *
 */
@@ -20,9 +20,92 @@
 #ifndef MCSINSTALLNOTIFIER_H_
 #define MCSINSTALLNOTIFIER_H_
 
+#include <sacls.h>
 #include <e32base.h>
 #include <e32property.h>
 
+class CMcsNotifierStrategy;
+class MMcsInstallListener;
+
+/**
+ *  MCS Install notifier.
+ *
+ *  @since S60 v5.0
+ */
+NONSHARABLE_CLASS( CMcsInstallNotifier ) : public CActive
+	{
+public:
+
+    /**
+     * Enum defining notification type.
+     */
+    enum TNotificationType
+        {
+        ENoNotification,            ///< No notification.
+        ESisInstallNotification,    ///< System installation notification.
+        EJavaInstallNotification,   ///< Java instalation and uninstallation notification.
+        };
+
+    /**
+     * Creates an instance of CCaInstallNotifier.
+     * @param aNotifier Reference to notifier interface.
+     * @param aNotificationType Notification type.
+     */
+	static CMcsInstallNotifier* NewL( MMcsInstallListener& aListener,
+			TNotificationType aNotificationType );
+
+	/**
+	 * Destructor.
+	 */
+	virtual ~CMcsInstallNotifier();
+
+private:
+
+    /**
+     * Constructor.
+     * @param aListener Reference to listener interface.
+     */
+	CMcsInstallNotifier( MMcsInstallListener& aListener );
+
+	/**
+     * Symbian 2nd phase constructor.
+     * @param aNotificationType Notification type.
+     */
+    void ConstructL( TNotificationType aNotificationType );
+
+    /**
+     * From CActive.
+     */
+    void DoCancel();
+
+    /**
+     * From CActive.
+     */
+    void RunL();
+
+    /**
+     * From CActive.
+     */
+    TInt RunError( TInt aError );
+
+private:
+
+    /**
+     * RProperty - own.
+     */
+    RProperty iProperty;
+
+    /**
+     * MMcsInstallListener - own.
+     */
+    MMcsInstallListener& iListener;
+
+    /*
+     * Notification strategy - own.
+     */
+    CMcsNotifierStrategy* iNotifierStrategy;
+
+    };
 
 /**
  * Interface for updating after installer events.
@@ -31,109 +114,16 @@
  */
 class MMcsInstallListener
     {
-protected:
+public:
+
     /**
-     * Enum defining the purpouse of the installation event.
+     * Pure virtual method.
+     * @param aUid uid of installed application.
+     * @param aOperation operation type, see TSASwisOperation.
      */
-    enum TInstOp
-    	{
-    	EInstOpNone = 0x00000000,
-    	EInstOpInstall = 0x00000001,
-    	EInstOpUninstall = 0x00000002,
-    	EInstOpRestore = 0x00000004
-		};
-public:
-    virtual void HandleInstallNotifyL(TInt aEvent) = 0;
+    virtual void HandleInstallNotifyL( TUid aUid,
+    		CMcsInstallNotifier::TNotificationType aNotificationType ) = 0;
     };
 
 
-/**
- *  MCS Install notifier.
- *
- *  @since S60 v5.0
- */
-NONSHARABLE_CLASS( CMcsInstallNotifier ) :
-	public CActive
-	{
-    /**
-     * Enum defining the purpouse of the installation event.
-     */
-    enum TInstOp
-    	{
-    	EInstOpNone = 0x00000000,
-    	EInstOpInstall = 0x00000001,
-    	EInstOpUninstall = 0x00000002,
-    	EInstOpRestore = 0x00000004
-		};
-    
-    enum TInstOpStatus
-        {
-        EInstOpStatusNone = 0x00000000,
-        EInstOpStatusSuccess = 0x00000100,
-        EInstOpStatusAborted = 0x00000200
-        };
-public:	
-		
-    /**
-     * Creates an instance of CMCSInstallNotifier implementation.
-     * @param aNotifier Reference to notifier interface.
-     * @param aCategory Package uid.
-     * @param aKey Key for central repository.
-     */
-	static CMcsInstallNotifier* NewL(MMcsInstallListener& aListener, TInt aKey );
-	
-	/**
-	 * Destructor.
-	 */
-	virtual ~CMcsInstallNotifier();
-	
-private:
-	
-    /**
-     * Constructor.
-     * @param aNotifier Reference to notifier interface.
-     * @param aCategory Package uid.
-     * @param aKey Key for central repository.
-     */
-	CMcsInstallNotifier( MMcsInstallListener& aListener, TInt aKey );
-	
-	/**
-	     * Symbian 2nd phase constructor.
-	     */
-	    void ConstructL();
-
-	    /**
-	     * From CActive.
-	     */
-	    void DoCancel();
-
-	    /**
-	     * From CActive.
-	     */
-	    void RunL();
-
-	    /**
-	     * From CActive.
-	     */
-	    TInt RunError( TInt aError );
-	    
-private:
-    /**.
-     * Own.
-     */
-    RProperty iProperty;
-
-    /**
-     * Interface for notifying changes in folder.
-     * Not Own.
-     */
-    MMcsInstallListener& iListener;
-
-    /*
-     * 
-     */
-    TInt iKey;
-	};
-
-
 #endif /* MCSINSTALLNOTIFIER_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/menucontentsrv/srvinc/mcsinstallstrategy.h	Tue Sep 14 21:55:16 2010 +0300
@@ -0,0 +1,169 @@
+/*
+ * Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  ?Description
+ *
+ */
+
+#ifndef MCSINSTALLSTRATEGY_H
+#define MCSINSTALLSTRATEGY_H
+
+#include "mcsinstallnotifier.h"
+#include <e32base.h>
+
+namespace Swi
+    {
+    class RSisRegistryEntry;
+    }
+
+/**
+ * Strategy interface.
+ *
+ * @since S60 v5.0
+ */
+class CMcsNotifierStrategy: public CBase
+    {
+public:
+
+    /**
+     * Notifies listener with changes in property.
+     */
+    virtual void NotifyListenerL() = 0;
+
+protected:
+
+    /**
+     * Constructor.
+     * @param aProperty to read values from.
+     * @param aListener listener to notify.
+     */
+    CMcsNotifierStrategy(
+            RProperty& aProperty,
+            MMcsInstallListener& aListener );
+
+protected:
+
+    /**
+     * Property. Not own.
+     */
+    RProperty& iProperty;
+
+    /**
+     * Listener. Not own.
+     */
+    MMcsInstallListener& iListener;
+
+    };
+
+/**
+ *  Swi Install strategy.
+ *
+ *  @since S60 v5.0
+ */
+NONSHARABLE_CLASS( CMcsSwiInstallStrategy ): public CMcsNotifierStrategy
+    {
+public:
+
+    /**
+     * Creates an instance of CCaInstallStrategy.
+     * @param aProperty to read values from.
+     * @param aListener listener to notify.
+     */
+    static CMcsSwiInstallStrategy* NewL(
+            RProperty& aProperty,
+            MMcsInstallListener& aListener );
+
+    /**
+     * Notifies listener with changes in property.
+     */
+    void NotifyListenerL();
+
+private:
+
+    /**
+     * Constructor.
+     * @param aProperty to read values from.
+     * @param aListener listener to notify.
+     */
+    CMcsSwiInstallStrategy(
+            RProperty& aProperty,
+            MMcsInstallListener& aListener );
+
+    /**
+     * Symbian 2nd phase constructor.
+     */
+    void ConstructL();
+
+    /**
+     * Handle Install Event.
+     * @param aUid installed/uninstalled app uid.
+     */
+    void HandleInstallNotifyL( TInt aUid );
+
+    /**
+     * Notifies storage abaut change for aPackageEntry related app.
+     * @param aPackageEntry application package entry.
+     */
+    void NotifyL( Swi::RSisRegistryEntry & aPackageEntry );
+
+    };
+
+/**
+ *  Mcs Java install strategy.
+ *
+ *  @since S60 v5.0
+ */
+NONSHARABLE_CLASS( CMcsJavaInstallStrategy ): public CMcsNotifierStrategy
+    {
+public:
+
+    /**
+     * Creates an instance of CCaInstallStrategy.
+     * @param aProperty to read values from.
+     * @param aListener listener to notify.
+     */
+    static CMcsJavaInstallStrategy* NewL(
+            RProperty& aProperty,
+            MMcsInstallListener& aListener );
+
+    /**
+     * Notifies listener with changes in property.
+     */
+    void NotifyListenerL();
+
+private:
+
+    /**
+     * Constructor.
+     * @param aProperty to read values from.
+     * @param aListener listener to notify.
+     */
+    CMcsJavaInstallStrategy(
+            RProperty& aProperty,
+            MMcsInstallListener& aListener );
+
+    /**
+     * Symbian 2nd phase constructor.
+     */
+    void ConstructL();
+
+    /**
+     * Handle Install Event.
+     * @param aUid installed/uninstalled app uid.
+     */
+    void HandleInstallNotifyL( TUid aPackageUid );
+
+    };
+
+#endif /* MCSINSTALLSTRATEGY_H */
+// End of File
--- a/menucontentsrv/srvinc/menusrvappscanner.h	Wed Sep 01 12:22:09 2010 +0100
+++ b/menucontentsrv/srvinc/menusrvappscanner.h	Tue Sep 14 21:55:16 2010 +0300
@@ -21,6 +21,7 @@
 #include <e32base.h>
 #include <apgcli.h>
 #include <apgnotif.h>
+#include <driveinfo.h>
 #include <cenrepnotifyhandler.h>
 #include "menuengoperation.h"
 #include "mcssatnotifier.h"
@@ -28,7 +29,8 @@
 #include "mcsfreespaceobserver.h"
 #include "mcsmenuitem.h"
 #include "mcsmenunotifier.h"
-#include <driveinfo.h>
+#include "mcsinstallnotifier.h"
+
 
 // FORWARD DECLARATION
 
@@ -64,7 +66,7 @@
 NONSHARABLE_CLASS( CMenuSrvAppScanner )
 : public CActive, public MMenuEngOperation, public MApaAppListServObserver,
     public MCenRepNotifyHandlerCallback, public MMcsSATNotifierCallback,
-    MMcsFreeSpaceObserver
+    MMcsFreeSpaceObserver, MMcsInstallListener
     {
 
 public:     // Constructor
@@ -82,6 +84,13 @@
             CMenuEng& aEng,
             CMenuSrvEngUtils& aSrvEngUtils );
 
+public:
+    /**
+     * Schedule appscanner run.
+     * Self complete active object.
+     */
+    void ScheduleScan();
+
 private:    // Constructors and destructor
 
     /**
@@ -135,14 +144,18 @@
 
 private:    // from MApaAppListServObserver
 
+    /**
+    * Application list event.
+    * @param aEvent only one type event exists.
+    */
     void HandleAppListEvent( TInt aEvent );
 
 private:    // from MCenRepNotifyHandlerCallback
 
     /**
     * Called if one of CR keys has changed
-    * @param aId  Id of the key that has changed.
-    * @param aNewValue  The new value of the key.
+    * @param aKey Id of the key that has changed.
+    * @param aNewValue The new value of the key.
     */
     void HandleNotifyString( TUint32 aKey, const TDesC16& aNewValue );
 
@@ -156,12 +169,15 @@
     */
     void SATChangeL();
 
-public:
-	/**
-	 * Schedule appscanner run.
-	 * Self complete active object.
-	 */
-	void ScheduleScan();
+private:    // from MMcsInstallListener
+
+    /**
+    * Called application is installed.
+    * @param aUid uid of an application.
+    * @param aOperation operation type.
+    */
+    void HandleInstallNotifyL( TUid aUid,
+    		CMcsInstallNotifier::TNotificationType aNotificationType  );
 
 private:    // new methods
 
@@ -175,7 +191,28 @@
     * Add new menu item referring to this application.
     * @param aItem menu item.
     */
-    void HandleMissingFlagUpdateL( const TMenuItem& aItem );
+    void HandleMissingFlagUpdateL(
+            const TMenuItem& aItem, const CMenuSrvAppAttributes& aApaItem );
+
+    /**
+    * Notifies engine abaut application installation.
+    */
+    void InstallationNotifyL();
+
+    /**
+    * Removes uid from installed packages array.
+    * @param aUid application uid.
+    */
+    void RemoveFromInstalledPackages( TUid aUid );
+
+    /**
+    * Removes uid from installed packages array.
+    * @param aUid application uid.
+    * @param aId Item ID.
+    * @param aEvent event for engine to append.
+    */
+    CMenuEngObject& ModifiableObjectL( TUid aUid, TInt aId,
+                TInt aEvent = RMenuNotifier::EItemAttributeChanged );
 
     /**
     * Updates hidden flag.
@@ -453,6 +490,12 @@
     CMcsFreeSpaceObserver* iFreeSpaceObserver;
 
     TBool iOpStatus;
+
+    RArray<TUid> iInstalledPackages; ///< Own.
+
+    CMcsInstallNotifier* iSisInstallNotifier; ///< Native app notifier. Own.
+    CMcsInstallNotifier* iJavaInstallNotifier; ///< Java app notifier. Own.
+
     };
 
 #endif // __MENUSRVAPPSCANNER_H__
--- a/menucontentsrv/srvsrc/mcscachehandler.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/menucontentsrv/srvsrc/mcscachehandler.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -11,7 +11,7 @@
 *
 * Contributors:
 *
-* Description:  Used for receive SIM Application name, icon or 
+* Description:  Used for receive SIM Application name, icon or
 *                visibility information.
 *
 */
@@ -33,7 +33,7 @@
 // Two-phased constructor.
 // -----------------------------------------------------------------------------
 //
-EXPORT_C CMcsCacheHandler* CMcsCacheHandler::NewL( 
+EXPORT_C CMcsCacheHandler* CMcsCacheHandler::NewL(
     CMenuEng& aEng,
     CMenuSrvEngUtils& aUtils )
     {
@@ -44,7 +44,7 @@
     return self;
     }
 
-// -----------------------------------------------------------------------------    
+// -----------------------------------------------------------------------------
 // Destructor
 // -----------------------------------------------------------------------------
 CMcsCacheHandler::~CMcsCacheHandler()
@@ -58,7 +58,7 @@
 // might leave.
 // -----------------------------------------------------------------------------
 //
-CMcsCacheHandler::CMcsCacheHandler( 
+CMcsCacheHandler::CMcsCacheHandler(
     CMenuEng& aEng,
     CMenuSrvEngUtils& aUtils ): iEng( aEng ), iUtils( aUtils )
     {
@@ -75,7 +75,7 @@
 
 // -----------------------------------------------------------------------------
 // -----------------------------------------------------------------------------
-//     
+//
 void CMcsCacheHandler::HandleRemoveId( TInt aId )
     {
     iAttrCache.RemoveId( aId );
@@ -83,7 +83,7 @@
 
 // -----------------------------------------------------------------------------
 // -----------------------------------------------------------------------------
-// 
+//
 void CMcsCacheHandler::HandleRemoveAttribute( TInt aId, const TDesC& aAttrName )
 	{
 	iAttrCache.RemoveAttribute(aId, aAttrName);
@@ -91,7 +91,7 @@
 
 // -----------------------------------------------------------------------------
 // -----------------------------------------------------------------------------
-//        
+//
 void CMcsCacheHandler::EngineEvents( TInt aEvents )
     {
     if( aEvents & RMenuNotifier::EItemsAddedRemoved )
@@ -100,7 +100,7 @@
         }
     if( aEvents & RMenuNotifier::EItemAttributeChanged )
         {
-        TRAP_IGNORE(RemoveItemsWithChangedAttributesL());
+        TRAP_IGNORE( RemoveItemsWithChangedAttributesL() );
         }
     }
 
@@ -118,9 +118,9 @@
         TInt id = iAttrCache[i]->Id();
         TPtrC name = iAttrCache[i]->Name();
         TPtrC valueCache = iAttrCache[i]->Value();
-        
+
         TPtrC valueXml(KNullDesC);
-    
+
         exist = iEng.ObjectL(id).FindAttribute( name, valueXml, dummy );
         if( exist && valueXml != valueCache )
             {
@@ -151,4 +151,4 @@
         }
     }
 
-//  End of File  
+//  End of File
--- a/menucontentsrv/srvsrc/mcsdrmhandler.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/menucontentsrv/srvsrc/mcsdrmhandler.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -11,7 +11,7 @@
 *
 * Contributors:
 *
-* Description:  Used for receive SIM Application name, icon or 
+* Description:  Used for receive SIM Application name, icon or
 *                visibility information.
 *
 */
@@ -41,12 +41,12 @@
 // -----------------------------------------------------------------------------
 //
 
-CMcsDrmHandler* CMcsDrmHandler::NewL( 
+CMcsDrmHandler* CMcsDrmHandler::NewL(
     CMenuSrvEng& aSrvEng,
     CMenuSrvEngUtils& aUtils,
     CMcsCacheHandler& aCacheHandler )
     {
-    CMcsDrmHandler* self = new( ELeave ) 
+    CMcsDrmHandler* self = new( ELeave )
             CMcsDrmHandler( aSrvEng, aUtils, aCacheHandler );
     CleanupStack::PushL( self );
     self->ConstructL();
@@ -54,7 +54,7 @@
     return self;
     }
 
-// -----------------------------------------------------------------------------    
+// -----------------------------------------------------------------------------
 // Destructor
 // -----------------------------------------------------------------------------
 CMcsDrmHandler::~CMcsDrmHandler()
@@ -70,10 +70,10 @@
 // might leave.
 // -----------------------------------------------------------------------------
 //
-CMcsDrmHandler::CMcsDrmHandler( 
+CMcsDrmHandler::CMcsDrmHandler(
     CMenuSrvEng& aSrvEng,
     CMenuSrvEngUtils& aUtils,
-    CMcsCacheHandler& aCacheHandler ): 
+    CMcsCacheHandler& aCacheHandler ):
     iObserversManager( aUtils ), iSrvEng( aSrvEng ),
     iUtils( aUtils ), iCacheHandler( aCacheHandler )
     {
@@ -87,47 +87,48 @@
 void CMcsDrmHandler::ConstructL()
     {
     iScanner = CMcsDrmScanner::NewL( *this, iSrvEng, iUtils );
-	iInstallNotifier = CMcsInstallNotifier::NewL(*this, KPSUidJavaLatestInstallation);
+	iInstallNotifier = CMcsInstallNotifier::NewL(
+	        *this, CMcsInstallNotifier::EJavaInstallNotification );
 
     }
 
 // -----------------------------------------------------------------------------
 // -----------------------------------------------------------------------------
-//    
+//
 TInt CMcsDrmHandler::AppFolderIdL( TUid aUid )
     {
-    RArray<TMenuItem> mcsItems; 
+    RArray<TMenuItem> mcsItems;
     CleanupClosePushL( mcsItems );
-    
+
     TInt root;
     iSrvEng.Engine().RootFolderL( root );
     TMenuSrvTypeAttrFilter appFilter;
-    appFilter.SetType( KMenuTypeApp() );   
-    
+    appFilter.SetType( KMenuTypeApp() );
+
     TBuf<KUidChars> uidString;
     MenuSrvUtil::UidToStringL( aUid.iUid, uidString, 0, EHex );
-    
+
     appFilter.SetAttr( KMenuAttrUid(), uidString );
     iSrvEng.Engine().GetItemsL( mcsItems, root, &appFilter, ETrue );
-    
+
     TInt folderId = KErrNotFound;
     if (mcsItems.Count())
         {
         folderId = mcsItems[0].Parent();
         iCacheHandler.HandleRemoveAttribute(mcsItems[0].Id(), KMenuAttrDrmProtection);
         }
-    
+
     CleanupStack::PopAndDestroy( &mcsItems );
     return folderId;
     }
 
 // -----------------------------------------------------------------------------
 // -----------------------------------------------------------------------------
-//     
+//
 void CMcsDrmHandler::HandleDrmEvent( TUid aUid )
     {
     TRAP_IGNORE(
-    		iSrvEng.Engine().AppendNotifyL( AppFolderIdL( aUid ), 
+    		iSrvEng.Engine().AppendNotifyL( AppFolderIdL( aUid ),
     				RMenuNotifier::EItemAttributeChanged );
     		iScanner->RemoveObserverAndScanL( aUid );
 				);
@@ -135,100 +136,69 @@
 
 // -----------------------------------------------------------------------------
 // -----------------------------------------------------------------------------
-//     
+//
 void CMcsDrmHandler::HandleDrmAppEvent()
     {
     TRAP_IGNORE( AddRemoveObserversL(
-        iScanner->DrmProtectedAppArray() ) );     
+        iScanner->DrmProtectedAppArray() ) );
     }
 
 // -----------------------------------------------------------------------------
 // -----------------------------------------------------------------------------
-//     
-void CMcsDrmHandler::AddRemoveObserversL( 
+//
+void CMcsDrmHandler::AddRemoveObserversL(
 	const RArray<TUid>& aDrmProtectedArray )
     {
-    iObserversManager.RemoveMissingObservers( aDrmProtectedArray );    
+    iObserversManager.RemoveMissingObservers( aDrmProtectedArray );
     iObserversManager.CreateObserversL( aDrmProtectedArray, *this );
-    }    
+    }
 
 // -----------------------------------------------------------------------------
 // -----------------------------------------------------------------------------
-//        
+//
 void CMcsDrmHandler::EngineEvents( TInt /*aFolder*/, TInt aEvents )
     {
     if ( aEvents & RMenuNotifier::EItemsAddedRemoved )
         {
         iScanner->Scan();
-        }    
+        }
     }
 
 // ---------------------------------------------------------
-// CMcsDrmHandler::HandleInstallNotifyL
+//
 // ---------------------------------------------------------
 //
-void CMcsDrmHandler::HandleInstallNotifyL( TInt aPackageUid )
+void CMcsDrmHandler::HandleInstallNotifyL( TUid aPackageUid,
+		CMcsInstallNotifier::TNotificationType aNotificationType )
 	{
-	RArray<TUid> uids;
-	CleanupClosePushL( uids );
-
-	Java::CJavaRegistry* javaRegistry;
-	javaRegistry = Java::CJavaRegistry::NewLC();
-
-	Java::CJavaRegistryEntry* regEntry = 
-		javaRegistry->RegistryEntryL( TUid::Uid(aPackageUid) );
-
-	if( regEntry )
-		{
-	CleanupStack::PushL( regEntry );
-
-	Java::TJavaRegistryEntryType entryType = regEntry->Type();
-	
-	if ( ( entryType >= Java::EGeneralPackage ) && 
-			(entryType < Java::EGeneralApplication) )
-		{
-		//package entry
-		Java::CJavaRegistryPackageEntry* regPackageEntry = 
-					static_cast<Java::CJavaRegistryPackageEntry*>( regEntry );
-			regPackageEntry->GetEmbeddedEntries( uids );
-			}
-		else 
-			{
-			//application entry
-			uids.AppendL( regEntry->Uid() );
-			}
-		
-		CleanupStack::PopAndDestroy( regEntry );
-	    for ( TInt i = 0; i< uids.Count(); i++ )
-	        {
-	        if ( ( iScanner->DrmExpiredAppArray()).Find(uids[i]) != KErrNotFound )
-	            {
-	            HandleDrmEvent( uids[i] );
-	            }
-	        else
-	            {
-	            iObserversManager.RefreshObserverL( iScanner->DrmProtectedAppArray(), 
-	                    uids[i], *this );
-	            }
-	        }
+    if( aPackageUid != TUid::Null() )
+        {
+        if ( ( iScanner->DrmExpiredAppArray()).Find( aPackageUid )
+                != KErrNotFound )
+            {
+            HandleDrmEvent( aPackageUid );
+            }
+        else
+            {
+            iObserversManager.RefreshObserverL(
+                    iScanner->DrmProtectedAppArray(), aPackageUid, *this );
+            }
 		}
 	else
 	    {
 	    for ( TInt i = 0; i< iScanner->DrmProtectedAppArray().Count(); i++ )
 	        {
-            iObserversManager.RefreshObserverL( iScanner->DrmProtectedAppArray(), 
-        		   iScanner->DrmProtectedAppArray()[i], *this );
+            iObserversManager.RefreshObserverL(
+                    iScanner->DrmProtectedAppArray(),
+                    iScanner->DrmProtectedAppArray()[i],
+                    *this );
 	        }
 	    for ( TInt i = 0; i< iScanner->DrmExpiredAppArray().Count(); i++ )
 	        {
 	        HandleDrmEvent( iScanner->DrmExpiredAppArray()[i] );
-	        }	    
+	        }
 	    }
-	
-	
-	CleanupStack::PopAndDestroy( javaRegistry );
-	CleanupStack::PopAndDestroy( &uids );
     }
 
 
-//  End of File  
+//  End of File
--- a/menucontentsrv/srvsrc/mcsinstallnotifier.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/menucontentsrv/srvsrc/mcsinstallnotifier.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -17,68 +17,67 @@
 
 #include <javadomainpskeys.h>
 #include "mcsinstallnotifier.h"
-#include <sacls.h>
-
-CMcsInstallNotifier* CMcsInstallNotifier::NewL(MMcsInstallListener& aListener, TInt aKey)
-	{
-	CMcsInstallNotifier* self = new (ELeave) CMcsInstallNotifier( aListener, aKey );
-	CleanupStack::PushL( self );
-	self->ConstructL( );
-	CleanupStack::Pop( self );
-
-	return self;
-	}
-
-CMcsInstallNotifier::~CMcsInstallNotifier()
-	{
-    Cancel( );
-    iProperty.Close( );
-	}
-
-CMcsInstallNotifier::CMcsInstallNotifier( MMcsInstallListener& aListener, TInt aKey ) : 
-    CActive(EPriorityNormal), iListener(aListener)
-	{
-	iKey = aKey;
-	// Prepare automatically
-	iProperty.Attach( KUidSystemCategory, iKey );
-	CActiveScheduler::Add( this );
-	iProperty.Subscribe( iStatus );
-	SetActive( );
-	}
+#include "mcsinstallstrategy.h"
 
 
-void CMcsInstallNotifier::ConstructL()
-	{
+CMcsInstallNotifier* CMcsInstallNotifier::NewL(
+		MMcsInstallListener& aListener, TNotificationType aNotificationType )
+    {
+    CMcsInstallNotifier* self = new ( ELeave ) CMcsInstallNotifier( aListener );
+    CleanupStack::PushL( self );
+    self->ConstructL( aNotificationType );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+CMcsInstallNotifier::~CMcsInstallNotifier()
+    {
+    Cancel();
+    iProperty.Close();
+    delete iNotifierStrategy;
+    }
 
-	}
+CMcsInstallNotifier::CMcsInstallNotifier( MMcsInstallListener& aListener ) :
+    CActive( EPriorityNormal ), iListener( aListener )
+    {
+    CActiveScheduler::Add( this );
+    SetActive();
+    }
 
+void CMcsInstallNotifier::ConstructL( TNotificationType aNotificationType )
+    {
+    switch( aNotificationType )
+		{
+        case ESisInstallNotification:
+        	iNotifierStrategy = CMcsSwiInstallStrategy::NewL(
+        	        iProperty, iListener );
+            break;
+        case EJavaInstallNotification:
+        	iNotifierStrategy = CMcsJavaInstallStrategy::NewL(
+        	        iProperty, iListener );
+            break;
+        default:
+        	User::Leave( KErrNotSupported );
+            break;
+		}
+    iProperty.Subscribe( iStatus );
+    }
 
 void CMcsInstallNotifier::DoCancel()
-	{
-    iProperty.Cancel( );
-	}
-
+    {
+    iProperty.Cancel();
+    }
 
 void CMcsInstallNotifier::RunL()
-	{
-	SetActive( );
-	iProperty.Subscribe( iStatus );
-	TInt status;
-	User::LeaveIfError( iProperty.Get( KUidSystemCategory,
-			iKey, status ) );
+    {
+    SetActive();
+    iProperty.Subscribe( iStatus );
+    iNotifierStrategy->NotifyListenerL();
+    }
 
-	if (( iKey == KPSUidJavaLatestInstallation ) || 
-			((status & EInstOpInstall )||(status & EInstOpUninstall )) && 
-			  (status & EInstOpStatusSuccess) )
-		{
-		iListener.HandleInstallNotifyL(status);
-		}
+TInt CMcsInstallNotifier::RunError( TInt /*aError*/)
+    {
+    // No need to do anything
+    return KErrNone;
+    }
 
-	}
-
-
-TInt CMcsInstallNotifier::RunError( TInt /*aError*/ )
-	{
-    // No need to do anything      
-    return KErrNone;
-	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/menucontentsrv/srvsrc/mcsinstallstrategy.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -0,0 +1,260 @@
+/*
+ * Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  ?Description
+ *
+ */
+#include <e32property.h>
+#include <SWInstallerInternalPSKeys.h>
+#include <swi/sisregistrysession.h>
+#include <swi/sisregistryentry.h>
+#include <swi/sisregistrypackage.h>
+#include <javadomainpskeys.h>
+#include <javaregistry.h>
+#include <javaregistrypackageentry.h>
+#include <javaregistryapplicationentry.h>
+#include "mcsinstallstrategy.h"
+
+
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CMcsNotifierStrategy::CMcsNotifierStrategy(
+            RProperty& aProperty, MMcsInstallListener& aListener ) :
+    iProperty( aProperty ), iListener( aListener )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CMcsSwiInstallStrategy* CMcsSwiInstallStrategy::NewL(
+        RProperty& aProperty, MMcsInstallListener& aListener )
+    {
+    CMcsSwiInstallStrategy* self = new ( ELeave ) CMcsSwiInstallStrategy(
+            aProperty, aListener );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMcsSwiInstallStrategy::NotifyListenerL()
+    {
+    TInt appUid;
+    User::LeaveIfError( iProperty.Get( KUidSystemCategory,
+            KUidSwiLatestInstallation, appUid ) );
+    if( appUid )
+        {
+        HandleInstallNotifyL( appUid );
+        }
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+void CMcsSwiInstallStrategy::HandleInstallNotifyL( TInt aUid )
+    {
+    Swi::RSisRegistrySession iSisRegSession;
+    User::LeaveIfError( iSisRegSession.Connect() );
+    CleanupClosePushL( iSisRegSession );
+
+    // Open sis package entry related to aUid
+    Swi::RSisRegistryEntry packageEntry;
+    if( KErrNone == packageEntry.Open( iSisRegSession, TUid::Uid( aUid ) ) )
+        {
+        CleanupClosePushL( packageEntry );
+
+        // Get packageEntry's embedded sis'
+        RPointerArray<Swi::CSisRegistryPackage> embedded;
+        CleanupClosePushL( embedded );
+        packageEntry.EmbeddedPackagesL( embedded );
+        if( embedded.Count() )
+            {
+            // For each embadded sis we notify storage - recursive call
+            for( TInt i = 0; i < embedded.Count(); ++i )
+                {
+                iListener.HandleInstallNotifyL( embedded[i]->Uid(),
+                		CMcsInstallNotifier::ESisInstallNotification );
+                }
+            }
+        else
+            {
+            // There are no embaddes sis', so we can notify storage
+            // of changes in apps included in packageEntry
+            NotifyL( packageEntry );
+            }
+        embedded.ResetAndDestroy();
+        CleanupStack::PopAndDestroy( &embedded );
+        CleanupStack::PopAndDestroy( &packageEntry );
+        }
+
+    CleanupStack::PopAndDestroy( &iSisRegSession );
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+void CMcsSwiInstallStrategy::NotifyL( Swi::RSisRegistryEntry & aPackageEntry )
+    {
+    // Get sids ( == uids of exetucables included in aPackageEntry )
+    RArray<TUid> sids;
+    CleanupClosePushL( sids );
+    aPackageEntry.SidsL( sids );
+    if( sids.Count() )
+        {
+        // For each sid we notify storage
+        for( TInt i = 0; i < sids.Count(); ++i )
+            {
+            iListener.HandleInstallNotifyL(
+            		sids[i], CMcsInstallNotifier::ESisInstallNotification );
+            }
+        }
+    CleanupStack::PopAndDestroy( &sids );
+    }
+
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CMcsSwiInstallStrategy::CMcsSwiInstallStrategy(
+        RProperty& aProperty, MMcsInstallListener& aListener )
+    : CMcsNotifierStrategy( aProperty, aListener )
+    {
+    iProperty.Attach( KUidSystemCategory, KUidSwiLatestInstallation );
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMcsSwiInstallStrategy::ConstructL()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CMcsJavaInstallStrategy* CMcsJavaInstallStrategy::NewL(
+        RProperty& aProperty, MMcsInstallListener& aListener )
+    {
+    CMcsJavaInstallStrategy* self =
+            new ( ELeave ) CMcsJavaInstallStrategy( aProperty, aListener );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMcsJavaInstallStrategy::NotifyListenerL()
+    {
+    TInt state;
+    User::LeaveIfError( iProperty.Get( KUidSystemCategory,
+            KPSUidJavaLatestInstallationState, state ) );
+	if( ( ( state & ESASwisInstall ) || ( state & ESASwisUninstall ) )
+            && ( state & ESASwisStatusSuccess ) )
+        {
+        TInt appUid;
+        User::LeaveIfError( iProperty.Get( KUidSystemCategory,
+                KPSUidJavaLatestInstallation, appUid ) );
+        HandleInstallNotifyL( TUid::Uid( appUid ) );
+        }
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+void CMcsJavaInstallStrategy::HandleInstallNotifyL( TUid aPackageUid )
+    {
+    RArray<TUid> uids;
+    CleanupClosePushL( uids );
+
+    Java::CJavaRegistry* javaRegistry;
+    javaRegistry = Java::CJavaRegistry::NewLC();
+
+    Java::CJavaRegistryEntry* regEntry =
+        javaRegistry->RegistryEntryL( aPackageUid );
+
+    if( regEntry )
+        {
+        CleanupStack::PushL( regEntry );
+
+        Java::TJavaRegistryEntryType entryType = regEntry->Type();
+
+        if ( ( entryType >= Java::EGeneralPackage ) &&
+                (entryType < Java::EGeneralApplication) )
+            {
+            //package entry
+            Java::CJavaRegistryPackageEntry* regPackageEntry =
+                    static_cast<Java::CJavaRegistryPackageEntry*>( regEntry );
+            regPackageEntry->GetEmbeddedEntries( uids );
+            }
+        else
+            {
+            //application entry
+            uids.AppendL( regEntry->Uid() );
+            }
+
+        for ( TInt i = 0; i < uids.Count(); i++ )
+            {
+            iListener.HandleInstallNotifyL(
+            		uids[i], CMcsInstallNotifier::EJavaInstallNotification );
+            }
+
+        CleanupStack::PopAndDestroy( regEntry );
+        }
+    else
+        {
+        iListener.HandleInstallNotifyL(
+        		TUid::Null(), CMcsInstallNotifier::EJavaInstallNotification );
+        }
+    CleanupStack::PopAndDestroy( javaRegistry );
+    CleanupStack::PopAndDestroy( &uids );
+    }
+
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CMcsJavaInstallStrategy::CMcsJavaInstallStrategy(
+        RProperty& aProperty, MMcsInstallListener& aListener  )
+    : CMcsNotifierStrategy( aProperty, aListener )
+    {
+    iProperty.Attach( KUidSystemCategory, KPSUidJavaLatestInstallationState );
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMcsJavaInstallStrategy::ConstructL()
+    {
+    }
+
--- a/menucontentsrv/srvsrc/menusrvappscanner.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/menucontentsrv/srvsrc/menusrvappscanner.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -73,6 +73,8 @@
     {
     Cancel();
     delete iMcsSatNotifier;
+    delete iSisInstallNotifier;
+    delete iJavaInstallNotifier;
     delete iNotifier;
     iEng.DequeueOperation( *this );
     delete iMmcHistory;
@@ -97,7 +99,7 @@
     delete iCenRepNotifyHandlerCPHiddenFolders;
   	delete iCenRepSession;
   	delete iFreeSpaceObserver;
-
+    iInstalledPackages.Close();
     }
 
 // ---------------------------------------------------------
@@ -160,7 +162,11 @@
 
 	iFreeSpaceObserver = CMcsFreeSpaceObserver::NewL( *this );
 
-    //SetActive();
+	iSisInstallNotifier = CMcsInstallNotifier::NewL(
+            *this, CMcsInstallNotifier::ESisInstallNotification );
+	iJavaInstallNotifier = CMcsInstallNotifier::NewL(
+            *this, CMcsInstallNotifier::EJavaInstallNotification );
+
 	ScheduleScan();
     //iOpStatus = ETrue;
     }
@@ -248,7 +254,8 @@
 // CMenuSrvAppScanner::HideAppIfExists
 // ---------------------------------------------------------
 //
-void CMenuSrvAppScanner::HideItemIfPresentL( TInt aFolder, TInt aId, const TDesC& aUid, TBool aWasHidden )
+void CMenuSrvAppScanner::HideItemIfPresentL(
+        TInt aFolder, TInt aId, const TDesC& aUid, TBool aWasHidden )
     {
     TBool hideItem = EFalse;
     TMenuSrvAttrFilter uidAppFilter;
@@ -258,21 +265,20 @@
     CleanupClosePushL( appItems );
     iEng.GetItemsL( appItems, aFolder, &uidAppFilter, ETrue );
 
-    for (TInt i=0; i < appItems.Count(); i++)
+    for( TInt i=0; i < appItems.Count(); i++ )
         {
-        if(appItems[i].Type() != KMenuTypeLink())
+        if( appItems[i].Type() != KMenuTypeLink() )
         	{
             const TMenuItem& item = appItems[i];
 
-            TBool itemHidden = (0 != (item.Flags() & TMenuItem::EHidden));
-            TBool itemMissing = (0 != (item.Flags() & TMenuItem::EMissing));
+            TBool itemHidden = (0 != ( item.Flags() & TMenuItem::EHidden ) );
+            TBool itemMissing = ( 0 != ( item.Flags() & TMenuItem::EMissing ) );
             if ( !itemHidden && !itemMissing )
                 {
                 hideItem = ETrue;
                 }
         	}
         }
-
     SetHiddenFlagL( aId, aWasHidden, hideItem );
 
     CleanupStack::PopAndDestroy( &appItems );
@@ -284,7 +290,7 @@
 //
 void CMenuSrvAppScanner::SetHiddenFlagL( TInt aId, TBool aWasHidden, TBool aHide )
     {
-    if ( aWasHidden ^ aHide )
+    if ( aWasHidden != aHide )
         {
         iEng.ModifiableObjectL( aId, RMenuNotifier::EItemsAddedRemoved ).
             SetFlags( TMenuItem::EHidden, aHide );
@@ -465,6 +471,72 @@
         User::RequestComplete( ownStatus, KErrNone );
         }
     }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+void CMenuSrvAppScanner::InstallationNotifyL()
+    {
+    TBool isLegacy = iEng.GetOnceLegacyFormat();
+    for( TInt i = iInstalledPackages.Count() - 1; i >= 0; i-- )
+        {
+        RArray<TMenuItem> mcsUidItems;
+        CleanupClosePushL( mcsUidItems );
+        GetMcsAppItemsL( isLegacy, iInstalledPackages[i].iUid, mcsUidItems );
+        if( mcsUidItems.Count() )
+            {
+            iEng.ModifiableObjectL( mcsUidItems[0].Id() );
+            iInstalledPackages.Remove( i );
+            }
+        CleanupStack::PopAndDestroy( &mcsUidItems );
+        }
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+void CMenuSrvAppScanner::RemoveFromInstalledPackages( TUid aUid )
+    {
+    TInt appIndex = iInstalledPackages.Find( aUid );
+    if( appIndex != KErrNotFound )
+        {
+        iInstalledPackages.Remove( appIndex );
+        }
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+CMenuEngObject& CMenuSrvAppScanner::ModifiableObjectL( TUid aUid, TInt aId,
+            TInt aEvent )
+    {
+    if( aEvent != RMenuNotifier::EItemsNone )
+        {
+        RemoveFromInstalledPackages( aUid );
+        }
+    return iEng.ModifiableObjectL( aId, aEvent );
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+void CMenuSrvAppScanner::HandleInstallNotifyL( TUid aUid,
+		CMcsInstallNotifier::TNotificationType aNotificationType )
+    {
+    iInstalledPackages.AppendL( aUid );
+    // when installing java, appscanner first gets notification from appArc,
+    // and then it is notified with instal notifier(RProperty)
+    // so we need another scan for java apps
+    if( aNotificationType == CMcsInstallNotifier::EJavaInstallNotification )
+    	{
+		ScheduleScan();
+    	}
+    }
+
 // ---------------------------------------------------------
 // CMenuSrvAppScanner::RunMenuEngOperationL
 // ---------------------------------------------------------
@@ -474,10 +546,10 @@
     UpdateApplicationItemsL();
     UpdateApplicationWithHideIfInstalledItemsL();
     UpdateLinkItemsL();
+    InstallationNotifyL();
     iOpStatus = EFalse;
     }
 
-
 // ---------------------------------------------------------
 // CMenuSrvAppScanner::UpdateApplicationItemL
 // ---------------------------------------------------------
@@ -488,8 +560,8 @@
     {
     RArray<TMenuItem> mcsUidItems;
     CleanupClosePushL( mcsUidItems );
-    TUid appuid = aApaItem.GetUid();
-    GetMcsAppItemsL( isLegacy, appuid.iUid, mcsUidItems );
+    TUid appUid = aApaItem.GetUid();
+    GetMcsAppItemsL( isLegacy, appUid.iUid, mcsUidItems );
     TBool isApaItemHidden( aApaItem.IsHidden() );
 
     // This app is not in the menu, add it now.
@@ -497,9 +569,9 @@
     // do not display Menu app
     if ( !mcsUidItems.Count()
     		&& !isApaItemHidden
-    		&& appuid !=  KMmUid3  )
+    		&& appUid !=  KMmUid3  )
         {
-        if( appuid == KSatUid )
+        if( appUid == KSatUid )
             {
             if( CMcsSatHandler::CheckVisibility() )
              	{
@@ -509,7 +581,8 @@
         else
           	{
           	AddAppItemL( aApaItem, aMmcId );
-            GetMcsAppItemsL( isLegacy, appuid.iUid, mcsUidItems );
+            GetMcsAppItemsL( isLegacy, appUid.iUid, mcsUidItems );
+            RemoveFromInstalledPackages( appUid );
            	}
         }//if
 
@@ -520,11 +593,10 @@
         //for every item with matching UID
         for (TInt j=0; j < mcsUidItems.Count(); j++)
      		{
-       		CMenuEngObject& object =
-      		                iEng.ModifiableObjectL( mcsUidItems[j].Id() );
             TBuf<KUidChars> uidString;
-            MenuSrvUtil::UidToStringL( appuid.iUid, uidString, EFalse, EHex );
-       	    object.SetAttributeL( KMenuAttrUid(), uidString, EFalse );
+            MenuSrvUtil::UidToStringL( appUid.iUid, uidString, EFalse, EHex );
+            ModifiableObjectL( appUid, mcsUidItems[j].Id() ).SetAttributeL(
+                    KMenuAttrUid(), uidString, EFalse );
        		}//for
         }//else if
     // "hidden", "missing" and "lock_delete"  flags update
@@ -542,10 +614,10 @@
         HandleHiddenFlagUpdateL( item, aApaItem );
 
         // "missing" flag handling
-        HandleMissingFlagUpdateL( item );
+        HandleMissingFlagUpdateL( item, aApaItem );
 
         //"lock_delete" flag handling
-        HandleLockDeleteFlagUpdateL(item, aApaItem );
+        HandleLockDeleteFlagUpdateL( item, aApaItem );
         // if item was just added to MCS  it is not present in aMcsItems
         // so we cannot remove it
         TInt index = aMcsItems.Find( item, TIdentityRelation<TMenuItem>( IdMatch ) );
@@ -564,19 +636,22 @@
 void CMenuSrvAppScanner::HandleHiddenFlagUpdateL( const TMenuItem & aItem,
         const CMenuSrvAppAttributes& aApaItem )
 	{
-	TBool itemHidden = (0 != (aItem.Flags() & TMenuItem::EHidden));
-	if ( aApaItem.GetUid() == KSatUid )
+	TBool itemHidden = ( 0 != ( aItem.Flags() & TMenuItem::EHidden ) );
+	if( aApaItem.GetUid() == KSatUid )
 		{
-		if (itemHidden == CMcsSatHandler::CheckVisibility())
+		if( itemHidden == CMcsSatHandler::CheckVisibility() )
 			{
-			iEng.ModifiableObjectL(aItem.Id(), RMenuNotifier::EItemsAddedRemoved).
-				SetFlags( TMenuItem::EHidden, !CMcsSatHandler::CheckVisibility());
+			ModifiableObjectL( aApaItem.GetUid(), aItem.Id(),
+			        RMenuNotifier::EItemsAddedRemoved ).SetFlags(
+			                TMenuItem::EHidden,
+			                !CMcsSatHandler::CheckVisibility() );
 			}
 		}
-	else if ( itemHidden != aApaItem.IsHidden() )
+	else if( itemHidden != aApaItem.IsHidden() )
 		{
-		iEng.ModifiableObjectL(aItem.Id(), RMenuNotifier::EItemsAddedRemoved).
-			SetFlags( TMenuItem::EHidden, aApaItem.IsHidden() );
+		ModifiableObjectL( aApaItem.GetUid(), aItem.Id(),
+		        RMenuNotifier::EItemsAddedRemoved ).SetFlags(
+		                TMenuItem::EHidden, aApaItem.IsHidden() );
 		}
 	}
 
@@ -590,7 +665,7 @@
     //we need this to delete uninstalled java app item
     if( aApaItem.GetAppType() != iEng.ObjectL( aItem.Id() ).GetAppType() )
     	{
-    	iEng.ModifiableObjectL( aItem.Id(),
+    	ModifiableObjectL( aApaItem.GetUid(), aItem.Id(),
     			RMenuNotifier::EItemsNone ).SetAppType( aApaItem.GetAppType() );
     	}
 	}
@@ -603,27 +678,37 @@
 void CMenuSrvAppScanner::HandleMmcAttrUpdateL(
 		const TMenuItem& aItem, const CMenuSrvAppAttributes& aApaItem, TUint aMmcId )
 	{
-    if ( IsInMmc( aApaItem ) )
+    TPtrC val;
+    TBool dummy;
+    TBool attributeExists = iEng.ObjectL( aItem.Id() ).FindAttribute(
+            KMenuAttrMmcId(), val, dummy );
+    if( IsInMmc( aApaItem ) )
     	{
     	//app is instaled on mmc - KMenuAttrMmcId attribute update
     	TBuf<KUidChars> uidString;
         uidString.Format( KHexFormat, aMmcId );
-        iEng.ModifiableObjectL( aItem.Id(), RMenuNotifier::EItemsAddedRemoved ).
-			SetAttributeL( KMenuAttrMmcId, uidString, EFalse );
+        if( uidString.Compare( val ) )
+            {
+            ModifiableObjectL( aApaItem.GetUid(), aItem.Id() ).SetAttributeL(
+                            KMenuAttrMmcId, uidString, EFalse );
+            }
     	}
-    else if ( IsInMassStorage( aApaItem )
+    else if( IsInMassStorage( aApaItem )
     		&& aApaItem.GetAppType() == CMenuEngObject::EWidgetApp )
     	{
     	//its java app installed on mass storage, we need to leave it in xml
     	//in case of connecting usb in mass storage mode
-        iEng.ModifiableObjectL( aItem.Id(), RMenuNotifier::EItemsAddedRemoved ).
-			SetAttributeL( KMenuAttrMmcId, KMenuMassStorage, EFalse );
+        if( KMenuMassStorage().Compare( val ) )
+            {
+            ModifiableObjectL( aApaItem.GetUid(), aItem.Id() ).SetAttributeL(
+                    KMenuAttrMmcId, KMenuMassStorage, EFalse );
+            }
     	}
-    else
+    else if( attributeExists )
     	{
     	//its installed on c: drive - remove attribute
-		iEng.ModifiableObjectL( aItem.Id(), RMenuNotifier::EItemsAddedRemoved ).
-			RemoveAttribute( KMenuAttrMmcId );
+        ModifiableObjectL( aApaItem.GetUid(), aItem.Id() ).RemoveAttribute(
+                KMenuAttrMmcId );
     	}
 	}
 // ---------------------------------------------------------
@@ -641,14 +726,13 @@
     GetCrItemsL( iSrvEngUtils.GetAppItemsL() );
     TBool isLegacy = iEng.GetOnceLegacyFormat();
 
-
     //for every item in apaAndCrItems array
     for ( TInt i = ( iSrvEngUtils.GetAppItemsL().Count() - 1 ); i >= 0 ; i-- )
         {
         // if there was leave for any item we ignore it
         // and proceed to the next one
-        TRAP_IGNORE(UpdateApplicationItemL(
-        		mcsItems, *iSrvEngUtils.GetAppItemsL()[i], currentMmcId, isLegacy));
+        TRAP_IGNORE( UpdateApplicationItemL( mcsItems,
+                *iSrvEngUtils.GetAppItemsL()[i], currentMmcId, isLegacy ) );
         }
     // Here the big list contains menu items that refer to missing apps.
     HandleMissingItemsL( mcsItems );
@@ -668,16 +752,16 @@
 		{
 		if ( ( aItem.Flags() & TMenuItem::ELockDelete ) == 0 )
 			{
-			iEng.ModifiableObjectL(aItem.Id())
-					.SetFlags( TMenuItem::ELockDelete, ETrue );
+            ModifiableObjectL( aApaItem.GetUid(), aItem.Id()).SetFlags(
+                    TMenuItem::ELockDelete, ETrue );
 			}
 		}
 	else
 		{
 		if ( ( aItem.Flags() & TMenuItem::ELockDelete ) != 0 )
 			{
-			iEng.ModifiableObjectL(aItem.Id())
-					.SetFlags( TMenuItem::ELockDelete, EFalse );
+            ModifiableObjectL( aApaItem.GetUid(), aItem.Id() ).SetFlags(
+                    TMenuItem::ELockDelete, EFalse );
 			}
 		}
 	}
@@ -686,14 +770,16 @@
 // CMenuSrvAppScanner::HandleMissingFlagUpdateL
 // ---------------------------------------------------------
 //
-void CMenuSrvAppScanner::HandleMissingFlagUpdateL( const TMenuItem& aItem )
+void CMenuSrvAppScanner::HandleMissingFlagUpdateL(
+        const TMenuItem& aItem,  const CMenuSrvAppAttributes& aApaItem  )
 	{
 	if ( aItem.Flags() & TMenuItem::EMissing )
         {
         CLOG_WRITE_FORMAT8( "Unsetting flag EMissing on %d", item.Id() );
         //application found so we unset "missing" flag
-        iEng.ModifiableObjectL( aItem.Id(), RMenuNotifier::EItemsAddedRemoved ).
-            SetFlags( TMenuItem::EMissing, EFalse );
+        ModifiableObjectL( aApaItem.GetUid(), aItem.Id(),
+                RMenuNotifier::EItemsAddedRemoved ).SetFlags(
+                        TMenuItem::EMissing, EFalse );
         }
 	}
 
@@ -1104,8 +1190,8 @@
 	TBool itemFlagPresent = (0 != (aItem.Flags() & aFlag));
 	if( aFlagValue != itemFlagPresent )
 		{
-		iEng.ModifiableObjectL( aItem.Id(), aEvent ).
-			 SetFlags( aFlag, aFlagValue );
+        iEng.ModifiableObjectL( aItem.Id(), aEvent ).
+                 SetFlags( aFlag, aFlagValue );
 		}
 	}
 
--- a/menucontentsrv/srvsrc/menusrveng.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/menucontentsrv/srvsrc/menusrveng.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -347,9 +347,8 @@
 // CMenuSrvEng::GetRunningAppsL()
 // ---------------------------------------------------------
 //
-void CMenuSrvEng::GetExtendedAttributesL(TInt aId,
-    const TDesC& aAttrName, TBool& aAttrExists,
-    TDes& aAttrVal )
+void CMenuSrvEng::GetExtendedAttributesL(TInt aId, const TDesC& aAttrName,
+        TBool& aAttrExists, TDes& aAttrVal )
     {
     TBool captionInfo(aAttrName.Compare( KMenuAttrShortName ) == KErrNone ||
     aAttrName.Compare( KMenuAttrLongName ) == KErrNone ||
@@ -376,6 +375,7 @@
     else if( KErrNone == aAttrName.Compare( KMenuAttrNative ) )
         {
         ApplicationNativeAttributeL( aId, aAttrExists, aAttrVal );
+        addToCache = EFalse;
         }
     else // The attribute doesn't present for the item
         {
@@ -384,7 +384,7 @@
         }
     if( aAttrExists && addToCache )
         {
-        AddToCacheL(aId, aAttrName, aAttrVal );
+        AddToCacheL( aId, aAttrName, aAttrVal );
         }
     }
 
@@ -392,8 +392,8 @@
 // CMenuSrvEng::ApplicationNativeAttributeL
 // ---------------------------------------------------------
 //
-void CMenuSrvEng::ApplicationNativeAttributeL(
-		TInt aId, TBool & aAttrExists, TDes & aAttrVal )
+void CMenuSrvEng::ApplicationNativeAttributeL( TInt aId,
+        TBool & aAttrExists, TDes & aAttrVal )
 	{
 	const CMenuEngObject & aEngObj = iEng->ObjectL(aId);
 
@@ -449,7 +449,7 @@
 void CMenuSrvEng::CaptionInfoL( TInt aId, const TDesC& aAttrName,
     TBool& aExists, TDes& aAttrVal )
     {
-    const CMenuEngObject& obj = iEng->ObjectL(aId);
+    const CMenuEngObject& obj = iEng->ObjectL( aId );
     if ( obj.Type().Compare( KMenuTypeFolder ) == KErrNone )
         {
         TBool localized;
@@ -459,15 +459,14 @@
             {
             aExists = ETrue;
             aAttrVal = attrvalue;
-            AddToCacheL(aId, KMenuAttrLongName, aAttrVal );
-            AddToCacheL(aId, KMenuAttrShortName, aAttrVal );
-            AddToCacheL(aId, KMenuAttrTitleName, aAttrVal );
+            AddToCacheL( aId, KMenuAttrLongName, aAttrVal );
+            AddToCacheL( aId, KMenuAttrShortName, aAttrVal );
+            AddToCacheL( aId, KMenuAttrTitleName, aAttrVal );
             }
         }
     else if ( obj.Type().Compare( KMenuTypeApp ) == KErrNone )
         {
         aAttrVal = AppCaptionInfoL( obj, aAttrName, aExists );
-        AddToCacheL(aId, aAttrName, aAttrVal );
         }
     else
         {
@@ -562,7 +561,8 @@
  // CMenuSrvEng::FolderChildrenCountL
  // ---------------------------------------------------------
  //
- void CMenuSrvEng::FolderChildrenCountL( TInt aId, TBool& aExists, TDes& aAttrVal )
+ void CMenuSrvEng::FolderChildrenCountL(
+         TInt aId, TBool& aExists, TDes& aAttrVal )
 	 {
 	 const CMenuEngObject& obj = iEng->ObjectL(aId);
 
@@ -680,47 +680,54 @@
  void CMenuSrvEng::AppendExtendedAttrributesL(
  		const TDesC& aType,
  		RArray<TPtrC>& aList )
-	 {
-
+{
     if ( KErrNone == aType.Compare( KMenuTypeApp ) )
         {
-        if( KErrNotFound == aList.Find( KMenuAttrTitleName(), TIdentityRelation<TPtrC>( CmpAttrName )) )
-        	{
-        	aList.AppendL( TPtrC( KMenuAttrTitleName ) );
-        	}
-        if( KErrNotFound == aList.Find( KMenuAttrShortName(), TIdentityRelation<TPtrC>( CmpAttrName )) )
-        	{
-        	aList.AppendL( TPtrC( KMenuAttrShortName ) );
-        	}
-        if( KErrNotFound == aList.Find( KMenuAttrLongName(), TIdentityRelation<TPtrC>( CmpAttrName )) )
-        	{
-        	aList.AppendL( TPtrC( KMenuAttrLongName ) );
-        	}
-        if( KErrNotFound == aList.Find( KMenuAttrDrmProtection(), TIdentityRelation<TPtrC>( CmpAttrName )) )
-        	{
-        	aList.AppendL( TPtrC( KMenuAttrDrmProtection ) );
-        	}
+        if( KErrNotFound == aList.Find( KMenuAttrTitleName(),
+                TIdentityRelation<TPtrC>( CmpAttrName )) )
+            {
+            aList.AppendL( TPtrC( KMenuAttrTitleName ) );
+            }
+        if( KErrNotFound == aList.Find( KMenuAttrShortName(),
+                TIdentityRelation<TPtrC>( CmpAttrName )) )
+            {
+            aList.AppendL( TPtrC( KMenuAttrShortName ) );
+            }
+        if( KErrNotFound == aList.Find( KMenuAttrLongName(),
+                TIdentityRelation<TPtrC>( CmpAttrName )) )
+            {
+            aList.AppendL( TPtrC( KMenuAttrLongName ) );
+            }
+        if( KErrNotFound == aList.Find( KMenuAttrDrmProtection(),
+                TIdentityRelation<TPtrC>( CmpAttrName )) )
+            {
+            aList.AppendL( TPtrC( KMenuAttrDrmProtection ) );
+            }
         }
     else if ( KErrNone == aType.Compare( KMenuTypeFolder ) )
         {
-        if( KErrNotFound == aList.Find( KMenuAttrTitleName(), TIdentityRelation<TPtrC>( CmpAttrName )) )
-        	{
-        	aList.AppendL( TPtrC( KMenuAttrTitleName ) );
-        	}
-        if( KErrNotFound == aList.Find( KMenuAttrShortName(), TIdentityRelation<TPtrC>( CmpAttrName )) )
-        	{
-        	aList.AppendL( TPtrC( KMenuAttrShortName ) );
-        	}
-        if( KErrNotFound == aList.Find( KMenuAttrLongName(), TIdentityRelation<TPtrC>( CmpAttrName )) )
-        	{
-        	aList.AppendL( TPtrC( KMenuAttrLongName ) );
-        	}
-        if( KErrNotFound == aList.Find( KChildrenCount(), TIdentityRelation<TPtrC>( CmpAttrName )) )
-        	{
-        	aList.AppendL( TPtrC( KChildrenCount ) );
-        	}
+        if( KErrNotFound == aList.Find( KMenuAttrTitleName(),
+                TIdentityRelation<TPtrC>( CmpAttrName )) )
+            {
+            aList.AppendL( TPtrC( KMenuAttrTitleName ) );
+            }
+        if( KErrNotFound == aList.Find( KMenuAttrShortName(),
+                TIdentityRelation<TPtrC>( CmpAttrName )) )
+            {
+            aList.AppendL( TPtrC( KMenuAttrShortName ) );
+            }
+        if( KErrNotFound == aList.Find( KMenuAttrLongName(),
+                TIdentityRelation<TPtrC>( CmpAttrName )) )
+            {
+            aList.AppendL( TPtrC( KMenuAttrLongName ) );
+            }
+        if( KErrNotFound == aList.Find( KChildrenCount(),
+                TIdentityRelation<TPtrC>( CmpAttrName )) )
+            {
+            aList.AppendL( TPtrC( KChildrenCount ) );
+            }
         }
-	 }
+    }
 
 
 //  End of File
--- a/xcfw/src/xcfwlocalizer.cpp	Wed Sep 01 12:22:09 2010 +0100
+++ b/xcfw/src/xcfwlocalizer.cpp	Tue Sep 14 21:55:16 2010 +0300
@@ -138,9 +138,10 @@
     if( !BaflUtils::FileExists( aFileSystem, locfile->Des() ) )
         {
         RArray<TLanguage> langs;
+        CleanupClosePushL( langs );
         BaflUtils::GetDowngradePathL( aFileSystem, langcode, langs );
         //add current language to array for ROM fetching
-        langs.Append( langcode );
+        langs.AppendL( langcode );
         TInt current = langs.Count() - 1;
         do 
             {
@@ -165,8 +166,8 @@
                 } while ( current >= 0 && 
                     !BaflUtils::FileExists( aFileSystem, locfile->Des() ) );
             }
-        langs.Reset();
-        langs.Close();
+        
+        CleanupStack::PopAndDestroy( &langs );
         }