homescreenpluginsrv/hspsmanager/src/hspsmaintenancehandler.cpp
branchRCL_3
changeset 31 8baec10861af
parent 30 a5a39a295112
--- 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
                         {