imagehandlingutilities/thumbnailmanager/thumbagdaemon/src/thumbagprocessor.cpp
changeset 14 2edacbf5d3f9
parent 0 2014ca87e772
child 15 7197e789b953
--- a/imagehandlingutilities/thumbnailmanager/thumbagdaemon/src/thumbagprocessor.cpp	Tue Feb 02 00:23:15 2010 +0200
+++ b/imagehandlingutilities/thumbnailmanager/thumbagdaemon/src/thumbagprocessor.cpp	Fri Mar 19 09:35:30 2010 +0200
@@ -21,14 +21,15 @@
 #include <mdeconstants.h>
 #include <centralrepository.h>
 
+#include <mpxcollectionutility.h>
+#include <mpxmessagegeneraldefs.h>
+#include <mpxcollectionmessage.h>
+#include <coreapplicationuisdomainpskeys.h> 
+
 #include "thumbagprocessor.h"
 #include "thumbnaillog.h"
 #include "thumbnailmanagerconstants.h"
 #include "thumbnailmanagerprivatecrkeys.h"
-#include "thumbagformatobserver.h"
-#include <mpxcollectionutility.h>
-#include <mpxmessagegeneraldefs.h>
-#include <mpxcollectionmessage.h>
 
 // ---------------------------------------------------------------------------
 // CThumbAGProcessor::NewL()
@@ -64,14 +65,9 @@
     {
     TN_DEBUG1( "CThumbAGProcessor::ConstructL() - begin" );
     
-#ifdef _DEBUG
-    iAddCounter = 0;
-    iModCounter = 0;
-    iDelCounter = 0;
-#endif
-    
     iTMSession = CThumbnailManager::NewL( *this );
-    
+    iQueryAllItems = NULL;
+    iQueryPlaceholders = NULL;
     iQuery = NULL;
     iQueryActive = EFalse;
     iModify = EFalse;
@@ -84,18 +80,31 @@
     
     iPeriodicTimer = CPeriodic::NewL(CActive::EPriorityIdle);
     
-    //do some initializing async in RunL()
-    iInit = ETrue;
-    iForceRun = EFalse;    
+    SetForceRun( EFalse );    
     iActive = EFalse;
     
-    iFormatObserver = CThumbAGFormatObserver::NewL( this );
+    iFormatObserver = CTMFormatObserver::NewL( *this );
        
     iFormatting = EFalse;     
     iSessionDied = EFalse;
     
     iCollectionUtility = NULL;
-        
+    
+    iActivityManager = CTMActivityManager::NewL( this, KBackgroundGenerationIdle);
+
+    UpdatePSValues(ETrue);
+
+    if(iForegroundGenerationObserver)
+      {
+      delete iForegroundGenerationObserver;
+      iForegroundGenerationObserver = NULL;
+      }
+    
+    RProperty::Define(KTAGDPSNotification, KMPXHarvesting, RProperty::EInt);
+    
+	//start foreground generation observer
+    iForegroundGenerationObserver = CTMRPropertyObserver::NewL( *this, KTAGDPSNotification, KForceBackgroundGeneration, ETrue );  
+    
     TN_DEBUG1( "CThumbAGProcessor::ConstructL() - end" );
     }
 
@@ -107,6 +116,25 @@
     {
     TN_DEBUG1( "CThumbAGProcessor::~CThumbAGProcessor() - begin" );
     
+    if(iForegroundGenerationObserver)
+      {
+      delete iForegroundGenerationObserver;
+      iForegroundGenerationObserver = NULL;
+      }
+    
+    if(iActivityManager)
+        {
+        delete iActivityManager;
+        iActivityManager = NULL;
+        }
+    
+    if (iInactivityTimer)
+        {
+        iInactivityTimer->Cancel();
+        delete iInactivityTimer;
+        iInactivityTimer = NULL;
+        }
+    
     if(iPeriodicTimer)
         {
         iPeriodicTimer->Cancel();
@@ -115,8 +143,9 @@
     
     if (!iInit)
         {
+    /*
         iHarvesterClient.RemoveHarvesterEventObserver(*this);
-        iHarvesterClient.Close();
+        iHarvesterClient.Close();*/
         }
     
     if ( iCollectionUtility )
@@ -127,6 +156,13 @@
 
     Cancel();
     
+    if(iQueryPlaceholders)
+        {
+        iQueryPlaceholders->Cancel();
+        delete iQueryPlaceholders;
+        iQueryPlaceholders = NULL;
+        }
+    
     if (iQuery)
         {
         iQuery->Cancel();
@@ -134,21 +170,20 @@
         iQuery = NULL;
         }
     
-    if (iQueryForPlaceholders)
+    if (iQueryAllItems)
        {
-       iQueryForPlaceholders->Cancel();
-       delete iQueryForPlaceholders;
-       iQueryForPlaceholders = NULL;
+       iQueryAllItems->Cancel();
+       delete iQueryAllItems;
+       iQueryAllItems = NULL;
        }
-    
+
     iAddQueue.Close();
     iModifyQueue.Close();
-    iRemoveQueue.Close();
+    iRemoveQueue.ResetAndDestroy();
     iQueryQueue.Close();
-    iPresentQueue.Close();
-    iTempModifyQueue.Close();
-    iTempAddQueue.Close();
-    iPlaceholderIDs.Close();
+    iPlaceholderQueue.Close();
+	  
+    i2ndRoundGenerateQueue.Close();
     
     if (iTMSession)
         {
@@ -176,65 +211,119 @@
 // CThumbAGProcessor::HandleQueryCompleted()
 // -----------------------------------------------------------------------------
 //
-void CThumbAGProcessor::HandleQueryCompleted( CMdEQuery& /*aQuery*/, const TInt aError )
+void CThumbAGProcessor::HandleQueryCompleted( CMdEQuery& aQuery, const TInt aError )
     {
-
-    if( iQueryForPlaceholdersActive && iQueryForPlaceholders)
+    TN_DEBUG3( "CThumbAGProcessor::HandleQueryCompleted, aError == %d Count== %d", aError, aQuery.Count());
+    
+    if(&aQuery == iQueryPlaceholders)
         {
-        TN_DEBUG3( "CThumbAGProcessor::HandleQueryCompletedv2, aError == %d Count== %d", aError, iQueryForPlaceholders->Count());
+        TN_DEBUG1( "CThumbAGProcessor::HandleQueryCompleted - iQueryPlaceholders completed");
         
+        iPlaceholderQueue.Reset();
         // if no errors in query
         if (aError == KErrNone )
             {
-            
-            for(TInt i = 0; i < iQueryForPlaceholders->Count(); i++)
+            for(TInt i = 0; i < iQueryPlaceholders->Count(); i++)
+               {    
+               const CMdEObject* object = &iQueryPlaceholders->Result(i);
+              
+               if(!object)
+                   {
+                   continue;
+                   }
+              
+               if(!object->Placeholder())
+                   {
+                   TN_DEBUG2( "CThumbAGProcessor::HandleQueryCompleted %d not placeholder", object->Id());
+                   continue;
+                   }
+              
+               /*if (iPlaceholderQueue.Find( object->Id() ) == KErrNotFound)
+                   {
+                   TN_DEBUG2( "CThumbAGProcessor::HandleQueryCompleted %d added to placeholder queue", object->Id());*/
+                   TRAP_IGNORE( iPlaceholderQueue.AppendL( object->Id() )); 
+                 //}
+               }
+           }
+           delete iQueryPlaceholders;
+           iQueryPlaceholders = NULL;
+        }
+    else if(&aQuery == iQueryAllItems)
+        {
+        TN_DEBUG1( "CThumbAGProcessor::HandleQueryCompleted - QueryAllItems completed");
+        // if no errors in query
+        if (aError == KErrNone )
+            {
+            for(TInt i = 0; i < iQueryAllItems->Count(); i++)
                 {    
-                const CMdEObject* object = &iQueryForPlaceholders->Result(i);
-                
+                const CMdEObject* object = &iQueryAllItems->Result(i);
+               
                 if(!object)
-                    continue;
-                
-                if(!object->Placeholder())
                     {
-                    TN_DEBUG2( "CThumbAGProcessor::HandleQueryCompletedv2 %d not placeholder",object->Id());
                     continue;
                     }
-                
-                if (iPlaceholderIDs.Find( object->Id() ) == KErrNotFound)
-                   {
-                   TRAP_IGNORE( iPlaceholderIDs.AppendL( object->Id() )); 
-                   }
+               
+                if (iAddQueue.Find( object->Id() ) == KErrNotFound && iModifyQueue.Find( object->Id()) == KErrNotFound  )
+                    {
+                    TRAP_IGNORE( iAddQueue.AppendL( object->Id() ));
+                    }
                 }
-                
+#ifdef _DEBUG
+TN_DEBUG2( "CThumbAGProcessor::HandleQueryCompleted IN-COUNTERS---------- Amount: %d, Add",iQueryAllItems->Count());
+#endif
             }
-        else
+            //free query
+            delete iQueryAllItems;
+            iQueryAllItems = NULL;
+        }
+    else if(&aQuery == iQuery )
+        {
+        TN_DEBUG1( "CThumbAGProcessor::HandleQueryCompleted - Query completed");
+        
+        if(iQueryActive)
             {
-            TN_DEBUG1( "CThumbAGProcessor::HandleQueryCompleted() FAILED!");   
+            iQueryReady = ETrue;
+            iQueryActive = EFalse;
             }
-        
-        iQueryForPlaceholdersActive = EFalse;
-        }
-    
-    else if(iQueryActive)
-        {
-        TN_DEBUG3( "CThumbAGProcessor::HandleQueryCompleted, aError == %d Count== %d", aError, iQuery->Count());
-        iQueryReady = ETrue;
-        iQueryActive = EFalse;
     
         // if no errors in query
         if (aError == KErrNone && iQuery)
             {
             iProcessingCount = iQuery->Count();
+			
+            if( !iProcessingCount)
+                {
+                delete iQuery;
+                iQuery = NULL;
+                iProcessingCount = 0;
+                iModify = EFalse;
+                }
             }
         else
             {
+            TInt itemIndex(KErrNotFound);
+            
+            //cleanup current queue
+            while(iQueryQueue.Count())
+                {
+                itemIndex = iLastQueue->Find(iQueryQueue[0]);
+                if(itemIndex >= 0)
+                    {
+                    iLastQueue->Remove( itemIndex );
+                    }
+                iQueryQueue.Remove(0);
+                }
+        
+            delete iQuery;
+            iQuery = NULL;
             iProcessingCount = 0;
-            TN_DEBUG1( "CThumbAGProcessor::HandleQueryCompleted() FAILED!");   
+            TN_DEBUG1( "CThumbAGProcessor::HandleQueryCompleted() Query FAILED!");   
             }
         }
     else
         {
         TN_DEBUG1( "CThumbAGProcessor::HandleQueryCompleted() - NO QUERY ACTIVE"); 
+        __ASSERT_DEBUG((EFalse), User::Panic(_L("CThumbAGProcessor::HandleQueryCompleted()"), -1));
         }
     
     ActivateAO();
@@ -247,6 +336,7 @@
 void CThumbAGProcessor::ThumbnailPreviewReady( MThumbnailData& /*aThumbnail*/, 
                                                TThumbnailRequestId /*aId*/)
     {
+    TN_DEBUG1( "CThumbAGProcessor::ThumbnailPreviewReady()");
     // No implementation required
     }
 
@@ -258,8 +348,14 @@
                                         TThumbnailRequestId /*aId*/ )
     {
     TN_DEBUG2( "CThumbAGProcessor::ThumbnailReady() aError == %d", aError );
- 
-    iActive = EFalse; 
+    
+    iActiveCount--;
+    
+    if(iActiveCount <= 0)
+        {
+        iActiveCount = 0;
+        iActive = EFalse;
+        }
     
     // TNM server died, delete session
     if( aError == KErrServerTerminated )
@@ -268,7 +364,7 @@
 		
         iSessionDied = ETrue;
         
-        if( !iTimerActive)
+        if( !iPeriodicTimer->IsActive())
             {
             StartTimeout();
 			}
@@ -281,6 +377,7 @@
         }
     
     ActivateAO();
+	
     TN_DEBUG1( "CThumbAGProcessor::ThumbnailReady() - end" );
     }
 
@@ -294,11 +391,19 @@
     
     iMdESession = aMdESession;
     
+    __ASSERT_DEBUG((iMdESession), User::Panic(_L("CThumbAGProcessor::SetMdESession() !iMdESession "), KErrBadHandle));
+    
     TRAPD( err, iDefNamespace = &iMdESession->GetDefaultNamespaceDefL() );
     if (err != KErrNone)
         {
-        TN_DEBUG1( "CThumbAGProcessor::SetMdESession - Error: GetDefaultNamespaceDefL leave" );
+        TN_DEBUG2( "CThumbAGProcessor::SetMdESession() GetDefaultNamespaceDefL() err = %d", err );
         }
+    
+    __ASSERT_DEBUG((iDefNamespace), User::Panic(_L("CThumbAGProcessor::SetMdESession() !iDefNamespace "), KErrBadHandle));
+       
+    //do async init
+    iInit = ETrue;
+    
 	ActivateAO();
     }
 
@@ -307,149 +412,133 @@
 // ---------------------------------------------------------------------------
 //
 void CThumbAGProcessor::AddToQueueL( TObserverNotificationType aType, 
-                                    const RArray<TItemId>& aIDArray, TBool aPresent )
+                                    const RArray<TItemId>& aIDArray, 
+                                    const RPointerArray<HBufC>& aObjectUriArray,
+                                    TBool /*aPresent*/ )
     {
     TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() - begin" );
-    
-    if(aPresent)
-        {
-        TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() - Add to SetPresentQueue" );
-        for (int i=0; i<aIDArray.Count(); i++)
-             {
-             // only add to Present queue if not already in Add or Present queue        
-              if (iAddQueue.Find( aIDArray[i] ) == KErrNotFound)
-                  {
-                  if (iPresentQueue.Find( aIDArray[i] ) == KErrNotFound)
-                      {
-                      iPresentQueue.AppendL(aIDArray[i]);
-                      }
-                  }
-             }     
-        }
+
     // update queues
-    else if (aType == ENotifyAdd)
+    if (aType == ENotifyAdd)
         {
         TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() - ENotifyAdd" );
         
         for (int i=0; i<aIDArray.Count(); i++)
             {
-            // only add to Add queue if not already in Add queue        
-            if (iAddQueue.Find( aIDArray[i] ) == KErrNotFound)
+            // do not to append to Add queue if exist already in Add or 2nd Add queue (just processed)     
+            if (iAddQueue.Find( aIDArray[i] ) == KErrNotFound && i2ndRoundGenerateQueue.Find( aIDArray[i] ) == KErrNotFound)
                 {
-                //if in Present Queue remove from there and and put to add queue
-                TInt index = iPresentQueue.Find( aIDArray[i] );
-                if( index != KErrNotFound)
-                    {
-                    iPresentQueue.Remove( index );
-                    }
-                iAddQueue.AppendL(aIDArray[i]); 
-                iTempAddQueue.AppendL(aIDArray[i]);
+                iAddQueue.AppendL(aIDArray[i]);
                 }
             }
         }
     else if (aType == ENotifyModify)
         {
         TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() - ENotifyModify" );
+        
+        if(iPHHarvesting)
+            {
+        
+            TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() - PH  harvesting active, treat like add" );
+            for (int i=0; i<aIDArray.Count(); i++)
+                {
+                TInt itemIndex = iPlaceholderQueue.Find( aIDArray[i] );
+                                
+                if (itemIndex >= 0)
+                    {
+                    TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() - remove from placeholder queue");
+                    iPlaceholderQueue.Remove( itemIndex );
+                    }
+                
+                if(iAddQueue.Find( aIDArray[i]) == KErrNotFound && i2ndRoundGenerateQueue.Find( aIDArray[i]))
+                    {
+                    TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() - append to add queue");
+                    iAddQueue.Append( aIDArray[i]);
+                    }
+                }
+            }
+        else
+            {
+            TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() - PH  harvesting finished, check is real modify!" );
             
-        for (int i=0; i<aIDArray.Count(); i++)
-             {
-             TInt itemIndex = iPlaceholderIDs.Find( aIDArray[i] );
-             if(itemIndex >= 0 )
-                 {
-                 TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() - harvesting now ended for this placeholder - not Real ENotifyModify" );
-                 iPlaceholderIDs.Remove(itemIndex);
-                 TN_DEBUG2( "CThumbAGProcessor::AddToQueueL() - placeholders left %d", iPlaceholderIDs.Count() );
-                 if (iAddQueue.Find( aIDArray[i] ) == KErrNotFound)
-                     {
-                     iAddQueue.AppendL(aIDArray[i]);
-                     }
-                 if (iTempModifyQueue.Find( aIDArray[i] ) == KErrNotFound)
-                     {
-                     iTempModifyQueue.AppendL( aIDArray[i] );
-                     }
-                 }
-             else if ( iTempAddQueue.Find( aIDArray[i] ) == KErrNotFound)
-                 {
-                 TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() - Real ENotifyModify, force run" );
-                 iModifyQueue.InsertL( aIDArray[i], 0 );
-                  
-                 TInt itemIndex = iAddQueue.Find( aIDArray[i] );
-                 if(itemIndex >= 0)
+            TInt itemIndex(KErrNotFound);
+            
+            for (int i=0; i<aIDArray.Count(); i++)
+                {
+                itemIndex = iPlaceholderQueue.Find( aIDArray[i] );
+                
+                if (itemIndex >= 0)
+                    {
+                    TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() - placeholder modify, remove from placeholder queue");
+                    iPlaceholderQueue.Remove( itemIndex );
+                    }
+                else
+                    {
+                    TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() - real modify");
+                    itemIndex = iAddQueue.Find( aIDArray[i] );
+                                    
+                    if (itemIndex >= 0)
+                        {
+                        TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() - remove from add queue");
+                        iAddQueue.Remove( itemIndex );
+                        }
+					else
+						{
+						
+						itemIndex = i2ndRoundGenerateQueue.Find( aIDArray[i] );
+                                    
+	                    if (itemIndex >= 0)
+	                        {
+	                        TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() - remove from 2nd round add queue");
+	                        i2ndRoundGenerateQueue.Remove( itemIndex );
+	                        }
+					}
+                    
+                    TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() - append to modify queue");
+                    iModifyQueue.AppendL(aIDArray[i]);
+                    
+                    SetForceRun( ETrue );
+                    } 
+                }
+            }
+        }
+        else if (aType == ENotifyRemove)
+            {
+            TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() - ENotifyRemove, remove IDs from all queues");
+            
+            for (int i=0; i<aIDArray.Count(); i++)
+                {
+                // can be removed from Add queue
+                TInt itemIndex = iAddQueue.Find( aIDArray[i] );
+                if(itemIndex >= 0)
                     {
                     iAddQueue.Remove(itemIndex);
                     }
-                 itemIndex = iPresentQueue.Find( aIDArray[i] );
-                 if(itemIndex >= 0)
+    
+                // ..and Modify Queue
+                itemIndex = iModifyQueue.Find( aIDArray[i] );
+                if(itemIndex >= 0)
                     {
-                    iPresentQueue.Remove(itemIndex);
+                    iModifyQueue.Remove(itemIndex);
                     }
-                 SetForceRun( ETrue );
-                 }
-             else
-                 {
-                 if (iTempModifyQueue.Find( aIDArray[i] ) == KErrNotFound)
-                     {
-                     TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() - harvesting now ended for this file - not Real ENotifyModify" );
-                     iTempModifyQueue.AppendL( aIDArray[i] );
-                     }
-                else
-                     {
-                     TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() - harvesting ended allready for this file - Real ENotifyModify, force run" );
-                     iModifyQueue.InsertL( aIDArray[i], 0 );
-                     TInt itemIndex = iAddQueue.Find( aIDArray[i] );
-                     if(itemIndex >= 0)
-                        {
-                        iAddQueue.Remove(itemIndex);
-                        }
-                     itemIndex = iPresentQueue.Find( aIDArray[i] );
-                     if(itemIndex >= 0)
-                        {
-                        iPresentQueue.Remove(itemIndex);
-                        }
-                     SetForceRun( ETrue );
-                     }
-                 } 
-             }        
-        }
-    else if (aType == ENotifyRemove)
-        {
-        TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() - ENotifyRemove" );
-        
-        for (int i=0; i<aIDArray.Count(); i++)
+                }
+            
+            TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() - ENotifyRemove append URIs to remove queue");
+            for (int i=0; i<aObjectUriArray.Count(); i++)
+                {
+                HBufC* temp = aObjectUriArray[i]->AllocL();
+                iRemoveQueue.Append( temp );
+                TN_DEBUG2( "CThumbAGProcessor::AddToQueueL() - %S", temp); 
+                }
+            }
+#ifdef _DEBUG
+        else
             {
-            // only add to Remove queue if not already in Remove queue        
-            if (iRemoveQueue.Find( aIDArray[i] ) == KErrNotFound)
-                {
-                iRemoveQueue.AppendL(aIDArray[i]);
-                }
-
-            // can be removed from Add queue
-            TInt itemIndex = iAddQueue.Find( aIDArray[i] );
-            if(itemIndex >= 0)
-                {
-                iAddQueue.Remove(itemIndex);
-                }
-            // ..and Present Queue
-            itemIndex = iPresentQueue.Find( aIDArray[i] );
-            if(itemIndex >= 0)
-                {
-                iPresentQueue.Remove(itemIndex);
-                }
-            // ..and Modify Queue
-            itemIndex = iModifyQueue.Find( aIDArray[i] );
-            if(itemIndex >= 0)
-                {
-                iModifyQueue.Remove(itemIndex);
-                }
-            }  
-        }
-    else
-        {
-        // should not come here
-        TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() -  should not come here" );
-        return;
-        }
-
+	        TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() -  should not come here" );
+	        User::Leave( KErrArgument );
+            }
+#endif
+    
     ActivateAO(); 
     
     TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() - end" );
@@ -463,109 +552,94 @@
     {
     TN_DEBUG1( "CThumbAGProcessor::CreateThumbnailsL() - begin" );
     
-    if( iModify )
+    __ASSERT_DEBUG((iTMSession), User::Panic(_L("CThumbAGProcessor::CreateThumbnailsL() !iTMSession "), KErrBadHandle));
+    __ASSERT_DEBUG((iDefNamespace), User::Panic(_L("CThumbAGProcessor::CreateThumbnailsL() !iDefNamespace "), KErrBadHandle));
+    
+    if(!iTMSession || !iDefNamespace)
         {
-        TInt orientationVal = 0;
-        TInt64 modifiedVal = 0;
-        
-        CMdEProperty* orientation = NULL;
-        CMdEObjectDef& objDef = iDefNamespace->GetObjectDefL( MdeConstants::Image::KImageObject );       
-        TInt orientErr = aObject->Property( objDef.GetPropertyDefL( MdeConstants::Image::KOrientationProperty ), orientation, 0 );
+        return;
+        }
+    
+    TInt orientationVal = 0;
+    TInt64 modifiedVal = 0;
+    
+    CMdEProperty* orientation = NULL;
+    CMdEObjectDef& imageObjectDef = iDefNamespace->GetObjectDefL( MdeConstants::Image::KImageObject );       
+    TInt orientErr = aObject->Property( imageObjectDef.GetPropertyDefL( MdeConstants::Image::KOrientationProperty ), orientation, 0 );
+    
+    if (orientErr == KErrNone)
+        {
+        orientationVal = orientation->Uint16ValueL();
+        }
         
-        if (orientErr == KErrNone)
-            {
-            orientationVal = orientation->Uint16ValueL();
-            }
-        
-        CMdEProperty* modified = NULL;
-        CMdEObjectDef& objDef2 = iDefNamespace->GetObjectDefL( MdeConstants::Object::KBaseObject );       
-        TInt modifyErr = aObject->Property( objDef2.GetPropertyDefL( MdeConstants::Object::KLastModifiedDateProperty ), modified, 0 );
-        
-        if (modifyErr >= 0)
+    CMdEProperty* modified = NULL;
+    CMdEObjectDef& baseObjDef = iDefNamespace->GetObjectDefL( MdeConstants::Object::KBaseObject );       
+    TInt modifyErr = aObject->Property( baseObjDef.GetPropertyDefL( MdeConstants::Object::KLastModifiedDateProperty ), modified, 0 );
+
+    if (modifyErr >= 0)
+        {
+        modifiedVal = modified->TimeValueL().Int64();
+        }
+    
+    // update thumbs
+    if (iTMSession)
+        {
+		// 2nd round and modify updates both sizes if needed
+        if( i2ndRound )
             {
-            modifiedVal = modified->TimeValueL().Int64();
+            //generate both if needed
+            TN_DEBUG1( "CThumbAGProcessor::CreateThumbnailsL() EOptimizeForQuality ");
+            iTMSession->SetQualityPreferenceL( CThumbnailManager::EOptimizeForQuality );
             }
-        
-        // modify existing thumbs
-        if (iTMSession)
+		// 1st roung generation
+        else
             {
-			// run as lower priority than getting but higher that creating thumbnails
-            TRAPD(err, iTMSession->UpdateThumbnailsL(aObject->Id(), aObject->Uri(), orientationVal, modifiedVal, CActive::EPriorityIdle ));
+            //1st round
+            TN_DEBUG1( "CThumbAGProcessor::CreateThumbnailsL() EOptimizeForQualityWithPreview");
+            iTMSession->SetQualityPreferenceL( CThumbnailManager::EOptimizeForQualityWithPreview );
+            
+            CMdEObjectDef& videoObjectDef = iDefNamespace->GetObjectDefL( MdeConstants::Video::KVideoObject );
             
-            if ( err != KErrNone )
+            // add item to 2nd round queue 
+            if(iLastQueue == &iAddQueue || iLastQueue == &iModifyQueue)
                 {
-                TN_DEBUG2( "CThumbAGProcessor::UpdateThumbnailsL, iTMSession error == %d", err );
-                
-                iSessionDied = ETrue;
-                iActive = EFalse;
+                TN_DEBUG2( "CThumbAGProcessor::CreateThumbnailsL() - 1st round add/modify, append to 2nd round queue", aObject->Id() );
+                if(i2ndRoundGenerateQueue.Find(aObject->Id()) == KErrNotFound)
+                    {
+                    i2ndRoundGenerateQueue.Append( aObject->Id() );
+                    }
+                }
+            
+           if( !(imageObjectDef.Id() == aObject->Def().Id() || videoObjectDef.Id() == aObject->Def().Id()) )
+                {
+                TN_DEBUG1( "CThumbAGProcessor::CreateThumbnailsL() 1st round and not image or video, skip");
                 ActivateAO();
-                } 
-            else
-                {
-                iActive = ETrue;
+                return;
                 }
             }
+
+        // run as lower priority than getting but higher that creating thumbnails
+        TRAPD(err, iTMSession->UpdateThumbnailsL(KNoId, aObject->Uri(), orientationVal, modifiedVal, CActive::EPriorityIdle ));
+      
+        if ( err != KErrNone )
+            {
+            TN_DEBUG2( "CThumbAGProcessor::CreateThumbnailsL, iTMSession error == %d", err );
+            
+            iSessionDied = ETrue;
+            iActive = EFalse;
+            ActivateAO();
+            } 
         else
             {
-            ActivateAO();
+            iActiveCount++;
+            iActive = ETrue;
             }
-        
-#ifdef _DEBUG
-        iModCounter++;
-#endif     
         }
     else
         {
-        CThumbnailObjectSource* source = NULL;
-        CMdEProperty* mimeType = NULL;
-        CMdEObjectDef& objDef = iDefNamespace->GetObjectDefL( MdeConstants::Object::KBaseObject );       
-        TInt mime = aObject->Property( objDef.GetPropertyDefL( MdeConstants::Object::KItemTypeProperty ), mimeType, 0 );
-        
-        // create new thumbs
-        if (mime != KErrNotFound)
-            {
-            source = CThumbnailObjectSource::NewLC(aObject->Uri(), aObject->Id(), mimeType->TextValueL());
-            }
-        else
-            {
-            source = CThumbnailObjectSource::NewLC(aObject->Uri(), aObject->Id());
-            }
+        ActivateAO();
+        }
         
-        if (iTMSession)
-            {
-            // run as very low priority task
-            TInt id = iTMSession->CreateThumbnails(*source, CActive::EPriorityIdle );
-            if ( id < 0 )
-                {
-                TN_DEBUG2( "CThumbAGProcessor::CreateThumbnailsL, iTMSession error == %d", id );
-                           
-                iSessionDied = ETrue;
-                iActive = EFalse;
-                CleanupStack::PopAndDestroy( source );
-                ActivateAO();
-                } 
-           else
-                {
-                iActive = ETrue;
-                CleanupStack::PopAndDestroy( source );
-                }
-            
-            }
-        else
-            {
-            ActivateAO();
-            }
-        
-#ifdef _DEBUG
-        iAddCounter++;
-#endif
-        }
-    
-#ifdef _DEBUG
-    TN_DEBUG3( "CThumbAGProcessor::OUT-COUNTERS----------, Add = %d Modify = %d", 
-               iAddCounter, iModCounter );
-#endif
-   
     TN_DEBUG1( "CThumbAGProcessor::CreateThumbnailsL() - end" );
     }
 
@@ -577,6 +651,19 @@
     {
     TN_DEBUG1( "CThumbAGProcessor::QueryL() - begin" );
     
+    __ASSERT_DEBUG((iMdESession), User::Panic(_L("CThumbAGProcessor::QueryL() !iMdeSession "), KErrBadHandle));
+    __ASSERT_DEBUG((iDefNamespace), User::Panic(_L("CThumbAGProcessor::QueryL() !iDefNamespace "), KErrBadHandle));
+    
+    if(!iMdESession  || !iDefNamespace)
+        {
+        return;
+        }
+    
+	//reset query queue
+    iQueryQueue.Reset();
+	//set reference to current pprocessing queue
+    iLastQueue = &aIDArray;
+    
     iQueryReady = EFalse;
 
     // delete old query
@@ -593,9 +680,8 @@
     
     for(TInt i=0;i < KMaxQueryItems && i < maxCount; i++)
         {
-        TN_DEBUG2( "CThumbAGProcessor::QueryL() - fill %d", aIDArray[0] );
-        iQueryQueue.Append( aIDArray[0] );
-        aIDArray.Remove( 0 );
+        TN_DEBUG2( "CThumbAGProcessor::QueryL() - fill %d", aIDArray[i] );
+        iQueryQueue.Append( aIDArray[i] );
         }
     
     TN_DEBUG3( "CThumbAGProcessor::QueryL() - fill end aIDArray == %d, iQueryQueue == %d", aIDArray.Count(), iQueryQueue.Count() );
@@ -636,11 +722,73 @@
     
     iQuery->FindL();
     
-    iQueryQueue.Reset();
-    
     TN_DEBUG1( "CThumbAGProcessor::QueryL() - end" );
     }
 
+
+// ---------------------------------------------------------------------------
+// CThumbAGProcessor::QueryForPlaceholders()
+// ---------------------------------------------------------------------------
+//
+
+void CThumbAGProcessor::QueryPlaceholdersL()
+    {
+    TN_DEBUG1( "CThumbAGProcessor::QueryPlaceholdersL" );
+    
+    __ASSERT_DEBUG((iMdESession), User::Panic(_L("CThumbAGProcessor::QueryPlaceholdersL() !iMdeSession "), KErrBadHandle));
+    __ASSERT_DEBUG((iDefNamespace), User::Panic(_L("CThumbAGProcessor::QueryPlaceholdersL() !iDefNamespace "), KErrBadHandle));
+    
+    if(!iMdESession  || !iDefNamespace)
+         {
+         return;
+         }
+    
+    if( iQueryPlaceholders )
+        {
+        if( !iQueryPlaceholders->IsComplete() )
+            {
+            TN_DEBUG1( "CThumbAGProcessor::QueryPlaceholdersL active- skip" );
+            return;
+            }
+        
+        // delete old query
+        iQueryPlaceholders->Cancel();
+        delete iQueryPlaceholders;
+        iQueryPlaceholders = NULL;
+        }
+   
+    TN_DEBUG1( "CThumbAGProcessor::QueryPlaceholdersL - start" );
+
+    CMdEObjectDef& imageObjDef = iDefNamespace->GetObjectDefL( MdeConstants::Image::KImageObject );
+    CMdEObjectDef& videoObjDef = iDefNamespace->GetObjectDefL( MdeConstants::Video::KVideoObject );
+    CMdEObjectDef& audioObjDef = iDefNamespace->GetObjectDefL( MdeConstants::Audio::KAudioObject );
+    
+    CMdEObjectDef& objDef = iDefNamespace->GetObjectDefL( MdeConstants::Object::KBaseObject);
+    iQueryPlaceholders = iMdESession->NewObjectQueryL( *iDefNamespace, objDef, this );
+        
+    iQueryPlaceholders->SetResultMode( EQueryResultModeItem );
+    
+    CMdELogicCondition& rootCondition = iQueryPlaceholders->Conditions();
+    rootCondition.SetOperator( ELogicConditionOperatorOr );
+    
+    CMdEObjectCondition& imagePHObjectCondition = rootCondition.AddObjectConditionL(imageObjDef);
+    imagePHObjectCondition.SetPlaceholderOnly( ETrue );
+    imagePHObjectCondition.SetNotPresent( ETrue );
+    
+    CMdEObjectCondition& videoPHObjectCondition = rootCondition.AddObjectConditionL(videoObjDef);
+    videoPHObjectCondition.SetPlaceholderOnly( ETrue );
+    videoPHObjectCondition.SetNotPresent( ETrue );
+    
+    CMdEObjectCondition& audioPHObjectCondition = rootCondition.AddObjectConditionL(audioObjDef);
+    audioPHObjectCondition.SetPlaceholderOnly( ETrue );
+    audioPHObjectCondition.SetNotPresent( ETrue );
+    
+    iQueryPlaceholders->FindL();  
+   
+    TN_DEBUG1( "CThumbAGProcessor::QueryPlaceholdersL - end" );
+    }
+
+
 // ---------------------------------------------------------------------------
 // CThumbAGProcessor::RunL()
 // ---------------------------------------------------------------------------
@@ -651,26 +799,65 @@
     
     if (iSessionDied)
         {
+        TN_DEBUG1( "CThumbAGProcessor::RunL() - iSessionDied" );
         delete iTMSession;
         iTMSession = NULL;
         }
     
     if (iInit)
         {
-        TN_DEBUG1( "CThumbAGProcessor::RunL() - Do Initialisation" );
+        TN_DEBUG1( "CThumbAGProcessor::RunL() - Do Initialisation 1" );
+        
         iInit = EFalse;
-        TN_DEBUG1( "iHarvesterClient");
-        if( iHarvesterClient.Connect() == KErrNone )
+        iInit2 = ETrue;
+
+        iAddQueue.Reset();
+        iModifyQueue.Reset();
+        iRemoveQueue.ResetAndDestroy();
+        iQueryQueue.Reset();
+        iPlaceholderQueue.Reset();
+        
+        TRAP_IGNORE(QueryPlaceholdersL());
+        TN_DEBUG1( "CThumbAGProcessor::RunL() - Initialisation 1 done" );
+        ActivateAO();
+        return;
+        }
+    
+    if(iInit2)
+        {
+        TN_DEBUG1( "CThumbAGProcessor::RunL() - Do Initialisation 2" );
+		
+        iInit2 = EFalse;
+        TInt err(KErrNone);
+        /*
+        TN_DEBUG1( "CThumbAGProcessor::RunL() do iHarvesterClient connect");
+        TInt err = iHarvesterClient.Connect();
+        TN_DEBUG2( "CThumbAGProcessor::RunL() iHarvesterClient connect err = %d", err);
+        
+        __ASSERT_DEBUG((err==KErrNone), User::Panic(_L("CThumbAGProcessor::RunL(), !iHarvesterClient "), err));
+        
+        if(  err == KErrNone )
             {
-            TN_DEBUG1( "iHarvesterClient connected");
-            iHarvesterClient.AddHarvesterEventObserver( *this, EHEObserverTypeOverall, KMaxTInt );
-            iHarvesterClient.AddHarvesterEventObserver( *this, EHEObserverTypePlaceholder, KMaxTInt );
-            TN_DEBUG1( "iHarvesterClient AddHarvesterEventObserver added");
+            TN_DEBUG1( "CThumbAGProcessor::RunL() add iHarvesterClient observer");
+            err = iHarvesterClient.AddHarvesterEventObserver( *this, EHEObserverTypeOverall | EHEObserverTypePlaceholder, KMaxTInt );
+            TN_DEBUG2( "CThumbAGProcessor::RunL() iHarvesterClient observer err = %d", err);
+            __ASSERT_DEBUG((err==KErrNone), User::Panic(_L("CThumbAGProcessor::RunL(), !iHarvesterClient "), err));
+            }*/
+ 
+        TN_DEBUG1( "CThumbAGProcessor::RunL() MMPXCollectionUtility");
+        TRAP( err, iCollectionUtility = MMPXCollectionUtility::NewL( this, KMcModeIsolated ));
+        TN_DEBUG2( "CThumbAGProcessor::RunL() create MMPXCollectionUtility err = %d", err);
+        __ASSERT_DEBUG((iCollectionUtility), User::Panic(_L("CThumbAGProcessor::RunL(), !iCollectionUtility "), err));
+        
+        __ASSERT_DEBUG((iActivityManager), User::Panic(_L("CThumbAGProcessor::RunL(), !iActivityManager "), KErrBadHandle));
+        if(iActivityManager)
+            {
+            iActivityManager->Start();
             }
         
-        TN_DEBUG1( "create MMPXCollectionUtility");
-        iCollectionUtility = MMPXCollectionUtility::NewL( this, KMcModeIsolated );
-        TN_DEBUG1( "CThumbAGProcessor::RunL() - Initialisation done" );
+        TRAP_IGNORE(QueryAllItemsL());
+		
+        TN_DEBUG1( "CThumbAGProcessor::RunL() - Initialisation 2 done" );
         return;
         }
     
@@ -684,9 +871,11 @@
         if (err != KErrNone)
             {
             iTMSession = NULL;
+            ActivateAO();
             TN_DEBUG2( "CThumbAGProcessor::RunL() - Session restart failed, error == %d", err );
             }        
-        else {
+        else 
+            {
             iSessionDied = EFalse;
             }
         }    
@@ -694,95 +883,123 @@
     // do not run if request is already issued to TNM server even if forced
     if( iActive)
         {
-        if(iActiveCount <= KMaxDaemonRequests)
+        if(iActiveCount >= KMaxDaemonRequests)
             {
-            iActiveCount++;
             TN_DEBUG1( "CThumbAGProcessor::RunL() - waiting for previous to complete, abort..." );
             return;
             }
-        else
-            {
-            TN_DEBUG1( "CThumbAGProcessor::RunL() - iActive jammed - resetted" );
-            iActive = EFalse;
-            iActiveCount = 0;
-            }     
         }
     else
         {
         iActiveCount = 0;   
         }
     
-    //Iforce run can proceed from this point
-    if( !iForceRun )
+    
+    //force run can proceed from this point
+#ifdef _DEBUG
+	if( iForegroundRun )
+		{
+      	TN_DEBUG1( "void CThumbAGProcessor::RunL() KForceBackgroundGeneration enabled");
+	  	}
+	
+    if( iForceRun )
         {
-        //check if harvesting or waiting timeout
-        if( iHarvesting || iTimerActive || iMPXHarvesting )
+        TN_DEBUG1( "CThumbAGProcessor::RunL() - *** FORCED RUN ***");
+        }
+#endif
+	
+  	if( /*iForceRun || */iForegroundRun )
+      	{
+        TN_DEBUG1( "void CThumbAGProcessor::RunL() skip idle detection!");
+      	CancelTimeout();
+     	 }
+  	else
+	    {
+        if(iActivityManager)
             {
-            TN_DEBUG1( "void CThumbAGProcessor::RunL() Harvester or timer active, abort");
+            iIdle = iActivityManager->IsInactive();
+            }
+	    
+        if( !iIdle || iHarvesting || iMPXHarvesting || iPeriodicTimer->IsActive() )
+            {
+            TN_DEBUG1( "void CThumbAGProcessor::RunL() device not idle");
             return;
             }
         else
             {
             //check is server idle
-	        TInt idle(-1);
-
-            TInt ret = RProperty::Get(KServerIdle, KIdle, idle);
-	        
-	        if(ret == KErrNone )
-	            {
-	            if(!idle)
-	                {
-					//start wait timer and retry on after callback
-	                TN_DEBUG1( "CThumbAGProcessor::RunL() server not idle, wait... " );
-	                if( !iTimerActive)
-	                    {
-	                    StartTimeout();
-	                    }
-	                return;
-	                }
-	            }
-	        else
-	            {
-	            TN_DEBUG2( "CThumbAGProcessor::RunL() get KServerIdle failed %d, continue...", ret );
-	            }
+            TInt serveIdle(KErrNotFound);
+            TInt ret = RProperty::Get(KServerIdle, KIdle, serveIdle);
+            
+            if(ret == KErrNone )
+                {
+                if(!serveIdle)
+                    {
+                    //start inactivity timer and retry on after callback
+                    TN_DEBUG1( "void CThumbAGProcessor::RunL() server not idle");
+                    StartTimeout();
+                    return;
+                    }
+                }
+            TN_DEBUG1( "void CThumbAGProcessor::RunL() device and server idle, process");
             }
-        }
-    else
-        {
-        TN_DEBUG1( "void CThumbAGProcessor::RunL() forced run");
-        }
-    
+	    }
     
     //Handle completed MDS Query
     if( iQueryReady && iProcessingCount)
         {
         TInt err(KErrNone);
-        if((iForceRun && iModify) || (!iForceRun && !iModify))
+        //if force or non forced
+        if((iForceRun && iModify ) || (!iForceRun && !iModify ))
             {
             TN_DEBUG1( "CThumbAGProcessor::RunL() - iQueryReady START" );
             
-        
             const CMdEObject* object = &iQuery->Result( iProcessingCount-1 );
             iProcessingCount--;
-        
+            
+            TInt itemIndex = iLastQueue->Find( object->Id());
+            if(itemIndex >= 0)
+                {
+                iLastQueue->Remove(itemIndex);
+                }
+				
             // process one item at once
             if ( object )
                 {
-                TRAP( err, CreateThumbnailsL(object) );
+                //remove item from queryQueue when request is issued 
+                itemIndex = iQueryQueue.Find( object->Id());
+                if(itemIndex >= 0)
+                    {
+                    iQueryQueue.Remove(itemIndex);
+                    }
             
-                if ( err != KErrNone )
-                   { 
-                   TN_DEBUG2( "CThumbAGProcessor::RunL(), CreateThumbnailsL error == %d", err );
-                   }
+                TRAP( err, CreateThumbnailsL(object) );
+                TN_DEBUG2( "CThumbAGProcessor::RunL(), CreateThumbnailsL error == %d", err );
+                __ASSERT_DEBUG((err==KErrNone), User::Panic(_L("CThumbAGProcessor::RunL(), CreateThumbnailsL() "), err));
                 }
             }
+        //force is coming, but executing non-forced query complete-> cancel old
         else
             {
-            TN_DEBUG1( "CThumbAGProcessor::RunL() - deleting query" );
+            TN_DEBUG1( "CThumbAGProcessor::RunL() - deleting query 1" );
             delete iQuery;
             iQuery = NULL;
             iQueryReady = EFalse;
             iProcessingCount = 0;
+            
+            //move remainig IDs in query queue back to original queue
+            while(iQueryQueue.Count())
+                {
+                if(iLastQueue)
+                    {
+                    if(iLastQueue->Find( iQueryQueue[0]) == KErrNotFound)
+                        {
+                        iLastQueue->Append(iQueryQueue[0]);
+                        }
+                    }
+                iQueryQueue.Remove(0);
+                }
+            iLastQueue = NULL;
             ActivateAO();
             return;    
             }
@@ -798,13 +1015,12 @@
             //check if forced run needs to continue
             if (iModifyQueue.Count())
                 {
-                iForceRun = ETrue;
+                SetForceRun( ETrue );
                 }
             else
                 {
-                iForceRun = EFalse;
-                }
-                
+                SetForceRun( EFalse );
+                }   
             }
         //keep going if processing Remove items or if Add item fails
         else if( iModify || err )
@@ -813,16 +1029,35 @@
             }
         }
     //waiting for MDS query to complete
-    else if( iQueryActive || iQueryForPlaceholdersActive )
+    else if( iQueryActive )
         {
-        if(iForceRun && !iModify && iQueryActive)
+        if(iForceRun && !iModify)
             {
-            iQuery->Cancel();
-            delete iQuery;
-            iQuery = NULL;
-            TN_DEBUG1( "CThumbAGProcessor::RunL() - canceling query..." );
+            if(iQuery)
+                {
+                TN_DEBUG1( "CThumbAGProcessor::RunL() - deleting query 2" );
+                iQuery->Cancel();
+                delete iQuery;
+                iQuery = NULL;
+                }
+
             iQueryReady = EFalse;
             iQueryActive = EFalse;
+            
+            //move remainig IDs in query queue back to original queue
+            while(iQueryQueue.Count())
+                {
+                if(iLastQueue)
+                    {
+                    if(iLastQueue->Find( iQueryQueue[0]) == KErrNotFound)
+                        {
+                        iLastQueue->Append(iQueryQueue[0]);
+                        }
+                    }
+                iQueryQueue.Remove(0);
+                }
+            iLastQueue = NULL;
+            
             ActivateAO();
             }
         else  
@@ -831,52 +1066,66 @@
             }    
         }
 
-    // select queue to process, priority by type. Process modify events before new images
+    // no items in query queue, start new
+    // select queue to process, priority by type
     else if ( iModifyQueue.Count() > 0 )
         {
         TN_DEBUG1( "void CThumbAGProcessor::RunL() update thumbnails");
         
+        i2ndRound = EFalse;
+        
         // query for object info
         iQueryActive = ETrue;
         iModify = ETrue;
         QueryL( iModifyQueue );
        }
-    else if ( iRemoveQueue.Count() > 0 )
-        {
-        TN_DEBUG1( "void CThumbAGProcessor::RunL() delete thumbnails");
-        
-        // delete thumbs by ID
-        if (iTMSession)
-            {
-            iTMSession->DeleteThumbnails( iRemoveQueue[0] );
-            }
-        iRemoveQueue.Remove( 0 );
-            
-#ifdef _DEBUG
-        iDelCounter++;
-        TN_DEBUG2( "CThumbAGProcessor::OUT-COUNTERS----------, Delete = %d", iDelCounter );
-#endif
-        ActivateAO();
-        }
     else if ( iAddQueue.Count() > 0 )
         {
-        TN_DEBUG1( "void CThumbAGProcessor::RunL() add thumbnails");
+        TN_DEBUG1( "void CThumbAGProcessor::RunL() update 1st round thumbnails");
+        
+        i2ndRound = EFalse;
         
         // query for object info
         iQueryActive = ETrue;
         
         QueryL( iAddQueue );     
         }
-    else if ( iPresentQueue.Count() > 0 )
+    else if ( iRemoveQueue.Count() > 0 )
         {
-        TN_DEBUG1( "void CThumbAGProcessor::RunL() add thumbnails for present thumbnails" );
-                
+        TN_DEBUG1( "void CThumbAGProcessor::RunL() delete thumbnails");
+
+        i2ndRound = EFalse;
+        
+        // delete thumbs by URI
+        __ASSERT_DEBUG((iTMSession), User::Panic(_L("CThumbAGProcessor::RunL() !iTMSession "), KErrBadHandle));
+        if(iTMSession)
+            {
+            HBufC* uri = iRemoveQueue[0];
+            TN_DEBUG2( "void CThumbAGProcessor::RunL() delete %S",  uri);
+            CThumbnailObjectSource* source = NULL;
+            TRAPD(err,  source = CThumbnailObjectSource::NewL( *uri, KNullDesC));
+               
+        	if(err == KErrNone)
+            	{
+                iTMSession->DeleteThumbnails( *source );
+                }
+            iRemoveQueue.Remove( 0 );
+            delete source;
+            delete uri;
+            }
+            
+        ActivateAO();
+        }
+    else if( i2ndRoundGenerateQueue.Count() > 0)
+        {
+        TN_DEBUG1( "void CThumbAGProcessor::RunL() update 2nd round thumbnails");
+            
         // query for object info
         iQueryActive = ETrue;
-                
-        QueryL( iPresentQueue );  
+        i2ndRound = ETrue;
+        QueryL( i2ndRoundGenerateQueue );     
         }
-    
+        
     TN_DEBUG1( "CThumbAGProcessor::RunL() - end" );
     }
 
@@ -895,62 +1144,94 @@
          TInt /*aItemsLeft*/ )
     {
     TN_DEBUG3( "CThumbAGProcessor::HarvestingUpdated -- start() aHEObserverType = %d, aHarvesterEventState = %d", aHEObserverType, aHarvesterEventState );
-  
+
+    #ifdef _DEBUG
+    if( aHEObserverType == EHEObserverTypePlaceholder)
+        {
+        TN_DEBUG1( "CThumbAGProcessor::HarvestingUpdated -- type EHEObserverTypePlaceholder");
+        }
+    else if( aHEObserverType == EHEObserverTypeOverall)
+        {
+        TN_DEBUG1( "CThumbAGProcessor::HarvestingUpdated -- type EHEObserverTypeOverall");
+        }
+    #endif
+    
+    //placeholder harvesting
     if( aHEObserverType == EHEObserverTypePlaceholder)
         {
-        TRAP_IGNORE( QueryForPlaceholdersL() );
-        return;
-        }    
-    
-    if( aHEObserverType != EHEObserverTypeOverall)
-        {
-        return;
-        }
+        switch(aHarvesterEventState)
+            {
+            case EHEStateStarted:
+            case EHEStateHarvesting:
+            case EHEStateResumed:
+                {
+                iPHHarvestingTemp = ETrue;
+                break;
+                }
+            case EHEStatePaused:
+            case EHEStateFinished:
+            case EHEStateUninitialized:
+                {
+                iPHHarvestingTemp = EFalse;
+                break;
+                }
+            };
     
-    switch(aHarvesterEventState)
-        {
-        case EHEStateStarted:
-        case EHEStateHarvesting:
-        case EHEStatePaused:
-        case EHEStateResumed:
-           {
-           iHarvestingTemp = ETrue;
-           break;
-           }
-        case EHEStateFinished:
-        case EHEStateUninitialized:
-           {
-           iHarvestingTemp = EFalse;
-           break;
-           }
-        };
-    
-    if(iHarvestingTemp == iHarvesting)
-        {
-        TN_DEBUG2( "CThumbAGProcessor::HarvestingUpdated -- no change %d", iHarvesting);
-        }
-    else
-        {
-        iHarvesting = iHarvestingTemp;
-        
-        if( iHarvesting )
+        if(iPHHarvestingTemp != iPHHarvesting)
             {
-            TN_DEBUG1( "CThumbAGProcessor::HarvestingUpdated -- MDS harvesterin started");
-            CancelTimeout();
-            }
-        else
-            {
-             TN_DEBUG1( "CThumbAGProcessor::HarvestingUpdated -- MDS harvesting finished ");
-             // continue processing if needed
-            StartTimeout();
-                 
-             iTempModifyQueue.Reset();
-             iTempAddQueue.Reset();
-             iPlaceholderIDs.Reset();
+            iPHHarvesting = iPHHarvestingTemp;
+           
+            if( iPHHarvesting )
+                {
+                TN_DEBUG1( "CThumbAGProcessor::HarvestingUpdated -- MDS placeholder harvesterin started");
+                }
+            else
+                {
+                TN_DEBUG1( "CThumbAGProcessor::HarvestingUpdated -- MDS placeholder harvesting finished");
+                TRAP_IGNORE(QueryPlaceholdersL());
+                }
             }
         }
-
-    TN_DEBUG3( "CThumbAGProcessor::HarvestingUpdated -- end() iHarvesting == %d, iMPXHarvesting == %d", iHarvesting, iMPXHarvesting);
+    //overall harvesting
+    else if ( aHEObserverType == EHEObserverTypeOverall)
+        {
+        switch(aHarvesterEventState)
+            {
+            case EHEStateStarted:
+            case EHEStateHarvesting:
+            case EHEStatePaused:
+            case EHEStateResumed:
+                {
+                iHarvestingTemp = ETrue;
+                break;
+                }
+            case EHEStateFinished:
+            case EHEStateUninitialized:
+                {
+                iHarvestingTemp = EFalse;
+                break;
+                }
+            };
+        
+        if(iHarvestingTemp != iHarvesting)
+            {
+            iHarvesting = iHarvestingTemp;
+            
+            if( iHarvesting )
+                {
+                TN_DEBUG1( "CThumbAGProcessor::HarvestingUpdated -- MDS harvesterin started");
+                CancelTimeout();
+                }
+            else
+                {
+                TN_DEBUG1( "CThumbAGProcessor::HarvestingUpdated -- MDS harvesting finished ");
+                // continue processing if needed
+                StartTimeout();
+                }
+            }
+        }
+   
+    TN_DEBUG3( "CThumbAGProcessor::HarvestingUpdated -- end() iHarvesting == %d, iPHHarvesting == %d ", iHarvesting, iPHHarvesting);
     }
 
 // ---------------------------------------------------------------------------
@@ -959,17 +1240,13 @@
 //
 void CThumbAGProcessor::StartTimeout()
     {
+    TN_DEBUG1( "CThumbAGProcessor::StartTimeout()");
     CancelTimeout();
     
     if(!iHarvesting && !iMPXHarvesting && !iPeriodicTimer->IsActive())
         {
-        iPeriodicTimer->Start( KHarvestingCompleteTimeout, KHarvestingCompleteTimeout, 
+        iPeriodicTimer->Start( KHarvestingCompleteTimeout, KHarvestingCompleteTimeout,
                 TCallBack(PeriodicTimerCallBack, this));
-        iTimerActive = ETrue;
-        }
-    else
-        {
-        iTimerActive = EFalse;
         }
     }
 
@@ -979,26 +1256,36 @@
 //
 void CThumbAGProcessor::CancelTimeout()
     {
-    if(iTimerActive)
-       {
-       iPeriodicTimer->Cancel();
-       }
-    iTimerActive = EFalse;
+    if(iPeriodicTimer->IsActive())
+        {
+        iPeriodicTimer->Cancel();
+        }
     }
 
 // ---------------------------------------------------------------------------
 // CThumbAGProcessor::RunError()
 // ---------------------------------------------------------------------------
 //
+#ifdef _DEBUG
 TInt CThumbAGProcessor::RunError(TInt aError)
+#else
+TInt CThumbAGProcessor::RunError(TInt /*aError*/)
+#endif
     {
-    if (aError != KErrNone)
+    TN_DEBUG2( "CThumbAGrocessor::RunError() %d", aError);
+    
+    UpdatePSValues();
+        
+    iActiveCount--;
+    
+    if(iActiveCount <= 0)
         {
-        TN_DEBUG2( "CThumbAGProcessor::RunError = %d", aError );
+        iActiveCount = 0;
+        iActive = EFalse;
         }
     
-    iActive = EFalse;
-    
+	ActivateAO();
+	
     // nothing to do
     return KErrNone;
     }
@@ -1009,24 +1296,29 @@
 //
 void CThumbAGProcessor::ActivateAO()
     {
+#ifdef _DEBUG
+    TN_DEBUG6( "CThumbAGProcessor::ActivateAO() items in queue Add = %d, Mod = %d, Del = %d, Query = %d, iPlaceholder = %d", iAddQueue.Count(),  iModifyQueue.Count(), iRemoveQueue.Count(), iQueryQueue.Count(), iPlaceholderQueue.Count());
+    TN_DEBUG2( "CThumbAGProcessor::ActivateAO() items in queue 2nd Add = %d", i2ndRoundGenerateQueue.Count());
+    TN_DEBUG3( "CThumbAGProcessor::ActivateAO() iActive = %d, iActiveCount = %d", iActive, iActiveCount);
+    TN_DEBUG3( "CThumbAGProcessor::ActivateAO() iHarvesting == %d, iMPXHarvesting == %d", iHarvesting, iMPXHarvesting);
+    TN_DEBUG4( "CThumbAGProcessor::ActivateAO() iIdle = %d, timer = %d, iForceRun = %d", iIdle, iPeriodicTimer->IsActive(), iForceRun);
+    TN_DEBUG4( "CThumbAGProcessor::ActivateAO() iModify = %d, iQueryReady = %d, iProcessingCount = %d", iModify, iQueryReady, iProcessingCount);
+#endif
+    
     if(iFormatting)
         {
         TN_DEBUG1( "CThumbAGProcessor::ActivateAO() - FORMATTING - DAEMON ON PAUSE");
         return;
         }
         
-    if( !IsActive() && (!iHarvesting || iForceRun ))
+    if( !IsActive() )
         {
-#ifdef _DEBUG
-        if( iForceRun )
-            {
-            TN_DEBUG1( "CThumbAGProcessor::ActivateAO() - *** FORCED RUN ***");
-            }
-#endif
         SetActive();
         TRequestStatus* statusPtr = &iStatus;
         User::RequestComplete( statusPtr, KErrNone );
         }
+
+    UpdatePSValues();
     }
 
 // ---------------------------------------------------------------------------
@@ -1063,15 +1355,24 @@
     TBool audioFull( EFalse );
 
     // get cenrep values
-    rep->Get( KAutoCreateImageGrid, imageGrid );
-    rep->Get( KAutoCreateImageList, imageList );
-    rep->Get( KAutoCreateImageFullscreen, imageFull );
-    rep->Get( KAutoCreateVideoGrid, videoGrid );
-    rep->Get( KAutoCreateVideoList, videoList );
-    rep->Get( KAutoCreateVideoFullscreen, videoFull );
-    rep->Get( KAutoCreateAudioGrid, audioGrid );
-    rep->Get( KAutoCreateAudioList, audioList );
-    rep->Get( KAutoCreateAudioFullscreen, audioFull );
+    TInt ret = rep->Get( KAutoCreateImageGrid, imageGrid );
+    TN_DEBUG2( "CThumbAGProcessor::CheckAutoCreateValuesL() KAutoCreateImageGrid %d", ret);
+    ret = rep->Get( KAutoCreateImageList, imageList );
+    TN_DEBUG2( "CThumbAGProcessor::CheckAutoCreateValuesL() KAutoCreateImageList %d", ret);
+    ret = rep->Get( KAutoCreateImageFullscreen, imageFull );
+    TN_DEBUG2( "CThumbAGProcessor::CheckAutoCreateValuesL() KAutoCreateImageFullscreen %d", ret);
+    ret = rep->Get( KAutoCreateVideoGrid, videoGrid );
+    TN_DEBUG2( "CThumbAGProcessor::CheckAutoCreateValuesL() KAutoCreateVideoGrid %d", ret);
+    ret = rep->Get( KAutoCreateVideoList, videoList );
+    TN_DEBUG2( "CThumbAGProcessor::CheckAutoCreateValuesL() KAutoCreateVideoList %d", ret);
+    ret = rep->Get( KAutoCreateVideoFullscreen, videoFull );
+    TN_DEBUG2( "CThumbAGProcessor::CheckAutoCreateValuesL() KAutoCreateVideoFullscreen %d", ret);
+    ret = rep->Get( KAutoCreateAudioGrid, audioGrid );
+    TN_DEBUG2( "CThumbAGProcessor::CheckAutoCreateValuesL() KAutoCreateAudioGrid %d", ret);
+    ret = rep->Get( KAutoCreateAudioList, audioList );
+    TN_DEBUG2( "CThumbAGProcessor::CheckAutoCreateValuesL() KAutoCreateAudioList %d", ret);
+    ret = rep->Get( KAutoCreateAudioFullscreen, audioFull );
+    TN_DEBUG2( "CThumbAGProcessor::CheckAutoCreateValuesL() KAutoCreateAudioFullscreen %d", ret);
     
     iAutoImage = EFalse;
     iAutoVideo = EFalse;
@@ -1098,7 +1399,11 @@
 // CThumbAGProcessor::RemoveFromQueues()
 // ---------------------------------------------------------------------------
 //
+#ifdef _DEBUG
 void CThumbAGProcessor::RemoveFromQueues( const RArray<TItemId>& aIDArray, const TBool aRemoveFromDelete )
+#else
+void CThumbAGProcessor::RemoveFromQueues( const RArray<TItemId>& aIDArray, const TBool /*aRemoveFromDelete*/ )
+#endif
     {
     TN_DEBUG2( "CThumbAGProcessor::RemoveFromQueues() aRemoveFromDelete == %d - begin", aRemoveFromDelete );
     
@@ -1107,6 +1412,14 @@
     for (int i=0; i< aIDArray.Count(); i++)
         {
         TN_DEBUG2( "CThumbAGProcessor::RemoveFromQueues() - %d", aIDArray[i]);
+
+        itemIndex = iPlaceholderQueue.Find( aIDArray[i] );
+                         
+        if(itemIndex >= 0)
+            {
+            iPlaceholderQueue.Remove(itemIndex);
+            TN_DEBUG1( "CThumbAGProcessor::RemoveFromQueues() - iPlaceholderQueue" );
+            }
                 
         itemIndex = iAddQueue.Find( aIDArray[i] );
         
@@ -1114,44 +1427,42 @@
             {
             iAddQueue.Remove(itemIndex);
             TN_DEBUG1( "CThumbAGProcessor::RemoveFromQueues() - iAddQueue" );
-            continue;
             }
-        
-        itemIndex = iPresentQueue.Find( aIDArray[i] );
+
+        itemIndex = i2ndRoundGenerateQueue.Find( aIDArray[i] );
                 
         if(itemIndex >= 0)
             {
-            iPresentQueue.Remove(itemIndex);
-            TN_DEBUG1( "CThumbAGProcessor::RemoveFromQueues() - iPresentQueue" );
-            continue;
+            i2ndRoundGenerateQueue.Remove(itemIndex);
+            TN_DEBUG1( "CThumbAGProcessor::RemoveFromQueues() - i2ndRoundGenerateQueue" );
             }
-   
+        
         itemIndex = iModifyQueue.Find( aIDArray[i] );
          
         if(itemIndex >= 0)
-           {
-           iModifyQueue.Remove(itemIndex);
-           TN_DEBUG1( "CThumbAGProcessor::RemoveFromQueues() - iModifyQueue" );
+            {
+            iModifyQueue.Remove(itemIndex);
+            TN_DEBUG1( "CThumbAGProcessor::RemoveFromQueues() - iModifyQueue" );
 			 
-           if( iModifyQueue.Count() == 0)
-			  {
-			  iForceRun = EFalse;
-		      }
+            if( iModifyQueue.Count() == 0)
+			    {
+			    SetForceRun( EFalse );
+		        }
 			 
-           continue;
-           }
+            continue;
+            }
     
-        if( aRemoveFromDelete )
-           {
-           itemIndex = iRemoveQueue.Find( aIDArray[i] );
+        /*if( aRemoveFromDelete )
+            {
+            itemIndex = iRemoveQueue.Find( aIDArray[i] );
              
-           if(itemIndex >= 0)
-              {
-              iRemoveQueue.Remove(itemIndex);
-              TN_DEBUG1( "CThumbAGProcessor::RemoveFromQueues() - iRemoveQueue" );
-              continue;
-              }
-           }
+            if(itemIndex >= 0)
+                {
+                iRemoveQueue.Remove(itemIndex);
+                TN_DEBUG1( "CThumbAGProcessor::RemoveFromQueues() - iRemoveQueue" );
+                continue;
+                }
+            }*/
         }
     
     TN_DEBUG1( "CThumbAGProcessor::RemoveFromQueues() - end" );
@@ -1173,75 +1484,57 @@
     }
 
 // ---------------------------------------------------------------------------
-// CThumbAGProcessor::SetFormat()
-// ---------------------------------------------------------------------------
-//
-
-void CThumbAGProcessor::SetFormat(TBool aStatus)
-    {
-    TN_DEBUG2( "CThumbAGProcessor::SetFormat(%d) - end", aStatus );
-    
-    iFormatting = aStatus;
-    if(!aStatus)
-        {
-        ActivateAO();
-        }
-    }
-
-// ---------------------------------------------------------------------------
 // CThumbAGProcessor::QueryForPlaceholders()
 // ---------------------------------------------------------------------------
 //
-
-void CThumbAGProcessor::QueryForPlaceholdersL()
+void CThumbAGProcessor::QueryAllItemsL()
     {
-    TN_DEBUG1( "CThumbAGProcessor::QueryForPlaceholders" );
-    if(iQueryForPlaceholdersActive)
+    TN_DEBUG1( "CThumbAGProcessor::QueryAllItemsL" );
+    
+    __ASSERT_DEBUG((iMdESession), User::Panic(_L("CThumbAGProcessor::QueryAllItemsL() !iMdeSession "), KErrBadHandle));
+    
+    if(!iMdESession)
+         {
+         return;
+         }
+    
+    if( iQueryAllItems )
         {
-        TN_DEBUG1( "CThumbAGProcessor::QueryForPlaceholders - skip" );
-        return;
+        if( !iQueryAllItems->IsComplete() )
+            {
+            TN_DEBUG1( "CThumbAGProcessor::QueryAllItemsL active- skip" );
+            return;
+            }
+        
+        // delete old query
+        iQueryAllItems->Cancel();
+        delete iQueryAllItems;
+        iQueryAllItems = NULL;
         }
     
-    TN_DEBUG1( "CThumbAGProcessor::QueryForPlaceholders - start" );
-
-    // delete old query
-    if (iQueryForPlaceholders)
-       {
-       iQueryForPlaceholdersActive = EFalse;
-       iQueryForPlaceholders->Cancel();
-       delete iQueryForPlaceholders;
-       iQueryForPlaceholders = NULL;
-       }
+    TN_DEBUG1( "CThumbAGProcessor::QueryAllItemsL - start" );
     
     CMdEObjectDef& imageObjDef = iDefNamespace->GetObjectDefL( MdeConstants::Image::KImageObject );
     CMdEObjectDef& videoObjDef = iDefNamespace->GetObjectDefL( MdeConstants::Video::KVideoObject );
     CMdEObjectDef& audioObjDef = iDefNamespace->GetObjectDefL( MdeConstants::Audio::KAudioObject );
     
     CMdEObjectDef& objDef = iDefNamespace->GetObjectDefL( MdeConstants::Object::KBaseObject);
-    iQueryForPlaceholders = iMdESession->NewObjectQueryL( *iDefNamespace, objDef, this );
+    iQueryAllItems = iMdESession->NewObjectQueryL( *iDefNamespace, objDef, this );
         
-    iQueryForPlaceholders->SetResultMode( EQueryResultModeItem );
+    iQueryAllItems->SetResultMode( EQueryResultModeItem );
     
-    CMdELogicCondition& rootCondition = iQueryForPlaceholders->Conditions();
+    CMdELogicCondition& rootCondition = iQueryAllItems->Conditions();
     rootCondition.SetOperator( ELogicConditionOperatorOr );
     
     CMdEObjectCondition& imagePHObjectCondition = rootCondition.AddObjectConditionL(imageObjDef);
-    imagePHObjectCondition.SetPlaceholderOnly( ETrue );
-    imagePHObjectCondition.SetNotPresent( ETrue );
     
     CMdEObjectCondition& videoPHObjectCondition = rootCondition.AddObjectConditionL(videoObjDef);
-    videoPHObjectCondition.SetPlaceholderOnly( ETrue );
-    videoPHObjectCondition.SetNotPresent( ETrue );
     
     CMdEObjectCondition& audioPHObjectCondition = rootCondition.AddObjectConditionL(audioObjDef);
-    audioPHObjectCondition.SetPlaceholderOnly( ETrue );
-    audioPHObjectCondition.SetNotPresent( ETrue );
     
-    iQueryForPlaceholders->FindL();  
+    iQueryAllItems->FindL();  
     
-    iQueryForPlaceholdersActive = ETrue;
-    
-    TN_DEBUG1( "CThumbAGProcessor::QueryForPlaceholders - end" );
+    TN_DEBUG1( "CThumbAGProcessor::QueryAllItemsL - end" );
     }
 
 // -----------------------------------------------------------------------------
@@ -1250,9 +1543,7 @@
 // Handle collection message.
 // -----------------------------------------------------------------------------
 //
-
-void CThumbAGProcessor::HandleCollectionMessage( CMPXMessage* aMessage,
-                                                        TInt aError )
+void CThumbAGProcessor::HandleCollectionMessage( CMPXMessage* aMessage, TInt aError )
     {
     if ( aError != KErrNone || !aMessage )
         {
@@ -1271,40 +1562,50 @@
             {
             TInt op( *aMessage->Value<TInt>( KMPXMessageGeneralType ) );
                
-           switch( op )
-               {
-			   //when MTP sync or music collection is started then pause processing
-               case EMcMsgRefreshStart:
-               case EMcMsgUSBMTPStart:
-                   TN_DEBUG1("CThumbAGProcessor::HandleCollectionMessage MPX refresh started" );
-                   iMPXHarvesting = ETrue;
-                   CancelTimeout();
-                   break;
-			   //when MTP sync or music collection refresh is complete then resume processing
-               case EMcMsgRefreshEnd:
-               case EMcMsgUSBMTPEnd:
-               case EMcMsgUSBMTPNotActive:
-                   TN_DEBUG1("CThumbAGProcessor::HandleCollectionMessage MPX refresh finished/not active" );
-                   iMPXHarvesting = EFalse;
-                   StartTimeout();
-                   break;
-               default:
-                   break;
-               }
-           TN_DEBUG3( "CThumbAGProcessor::HandleCollectionMessage -- end() iHarvesting == %d, iMPXHarvesting == %d", iHarvesting, iMPXHarvesting);
+            switch( op )
+                {
+			    //when MTP sync or music collection is started then pause processing
+                case EMcMsgRefreshStart:
+                case EMcMsgUSBMTPStart:
+                    TN_DEBUG1("CThumbAGProcessor::HandleCollectionMessage MPX refresh started" );
+                    iMPXHarvesting = ETrue;
+                    CancelTimeout();
+                    break;
+			    //when MTP sync or music collection refresh is complete then resume processing
+                case EMcMsgRefreshEnd:
+                case EMcMsgUSBMTPEnd:
+                case EMcMsgUSBMTPNotActive:
+                    TN_DEBUG1("CThumbAGProcessor::HandleCollectionMessage MPX refresh finished/not active" );
+                    iMPXHarvesting = EFalse;
+                    StartTimeout();
+                    break;
+                default:
+                    break;
+                }
+            
+            //signal Server's stores about MPX harvesting state
+            if( iMPXHarvesting )
+                {
+                RProperty::Set(KTAGDPSNotification, KMPXHarvesting, ETrue);
+                }
+            else
+                {
+                RProperty::Set(KTAGDPSNotification, KMPXHarvesting, EFalse);
+                }
+                
+            TN_DEBUG3( "CThumbAGProcessor::HandleCollectionMessage -- end() iHarvesting == %d, iMPXHarvesting == %d", iHarvesting, iMPXHarvesting);
             }
         }
     }
+
 // -----------------------------------------------------------------------------
 // CThumbAGProcessor::HandleOpenL
 // From MMPXCollectionObserver
 // Handles the collection entries being opened.
 // -----------------------------------------------------------------------------
 //
-void CThumbAGProcessor::HandleOpenL( const CMPXMedia& /*aEntries*/,
-                                            TInt /*aIndex*/,
-                                            TBool /*aComplete*/,
-                                            TInt /*aError*/ )
+void CThumbAGProcessor::HandleOpenL( const CMPXMedia& /*aEntries*/, TInt /*aIndex*/,
+                                               TBool /*aComplete*/, TInt /*aError*/ )
      {
      // not needed here
      }
@@ -1331,4 +1632,107 @@
     // not needed here
     }
 
+// -----------------------------------------------------------------------------
+// ActivityChanged()
+// -----------------------------------------------------------------------------
+//
+void CThumbAGProcessor::ActivityChanged(const TBool aActive)
+    {
+    TN_DEBUG2( "void CThumbAGProcessor::ActivityChanged() aActive == %d", aActive);
+    if(aActive)
+        {
+        iIdle = EFalse;
+        }
+    else
+        {
+        iIdle = ETrue; 
+        
+        if(iAddQueue.Count() + iModifyQueue.Count() + iRemoveQueue.Count() + i2ndRoundGenerateQueue.Count() > 0 )
+            {
+            ActivateAO();
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CThumbAGProcessor::FormatNotification
+// Handles a format operation
+// ---------------------------------------------------------------------------
+//
+void CThumbAGProcessor::FormatNotification( TBool aFormat )
+    {
+    TN_DEBUG2( "CThumbAGProcessor::FormatNotification(%d)", aFormat );
+    
+    iFormatting = aFormat;
+    if(!aFormat)
+        {
+        ActivateAO();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CThumbAGProcessor::RPropertyNotification
+// Handles a RProperty changed operation
+// ---------------------------------------------------------------------------
+//
+void CThumbAGProcessor::RPropertyNotification(const TInt aError, const TUid aKeyCategory, const TUint aPropertyKey, const TInt aValue)
+    {
+    TN_DEBUG5( "CThumbAGProcessor::RPropertyNotification() aError = %d, aPropertyKey = %d, aKeyCategory = %d, aValue = %d", aError, aPropertyKey, aKeyCategory, aValue );
+    
+    if(aPropertyKey == KForceBackgroundGeneration && aKeyCategory == KTAGDPSNotification )
+        {
+        if( aValue == 1 && aError == KErrNone )
+            {
+            iForegroundRun = ETrue;
+            ActivateAO();
+            }
+        else
+            {
+            iForegroundRun = EFalse;
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CThumbAGProcessor::UpdateItemsLeft
+// Update KItemsleft PS value if changed
+// ---------------------------------------------------------------------------
+//
+void CThumbAGProcessor::UpdatePSValues(const TBool aDefine)
+    {
+    TInt itemsLeft = iModifyQueue.Count() + iAddQueue.Count();
+    TBool daemonProcessing = EFalse;
+    
+    if(itemsLeft + i2ndRoundGenerateQueue.Count() + iRemoveQueue.Count() > 0 )
+        {
+        daemonProcessing = ETrue;
+        }
+    
+    if(aDefine)
+        {
+        TN_DEBUG1( "CThumbAGProcessor::UpdatePSValues() define");
+        RProperty::Define(KTAGDPSNotification, KDaemonProcessing, RProperty::EInt);
+        RProperty::Set(KTAGDPSNotification, KDaemonProcessing, 0);
+        daemonProcessing = EFalse;
+        RProperty::Define(KTAGDPSNotification, KItemsleft, RProperty::EInt);
+        RProperty::Set(KTAGDPSNotification, KItemsleft, 0);
+        iPreviousItemsLeft = 0;
+        }
+    
+    if( daemonProcessing != iPreviousDaemonProcessing)
+        {
+        TN_DEBUG2( "CThumbAGProcessor::UpdatePSValues() update KDaemonProcessing == %d", daemonProcessing);
+        iPreviousDaemonProcessing = daemonProcessing;
+        RProperty::Set(KTAGDPSNotification, KDaemonProcessing, daemonProcessing);
+        }
+    
+    if( itemsLeft != iPreviousItemsLeft)
+        {
+        TN_DEBUG2( "CThumbAGProcessor::UpdatePSValues() update KItemsleft == %d", itemsLeft);
+        iPreviousItemsLeft = itemsLeft;
+        RProperty::Set(KTAGDPSNotification, KItemsleft, itemsLeft );
+        }
+    }
+
 // End of file