Revision: 201015
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 03 May 2010 12:48:51 +0300
changeset 17 ffa62e555b02
parent 15 7197e789b953
child 19 b790c5b3d11f
Revision: 201015 Kit: 201018
imagehandling_plat/thumbnailmanager_api/inc/thumbnailmanager.h
imagehandling_plat/thumbnailmanager_api/inc/thumbnailmanager_qt.h
imagehandlingutilities/thumbnailmanager/conf/thumbnailmanager.confml
imagehandlingutilities/thumbnailmanager/inc/thumbnailmanagerconstants.h
imagehandlingutilities/thumbnailmanager/inc/thumbnailpanic.h
imagehandlingutilities/thumbnailmanager/plugins/audio/group/thumbnailaudioprovider.mmp
imagehandlingutilities/thumbnailmanager/plugins/image/group/thumbnailimageprovider.mmp
imagehandlingutilities/thumbnailmanager/plugins/image/src/thumbnailimagedecoder.cpp
imagehandlingutilities/thumbnailmanager/plugins/video/group/thumbnailvideoprovider.mmp
imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/package.pkg
imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/stub.pkg
imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/thumbnailmanager_stub.sis
imagehandlingutilities/thumbnailmanager/sis/thumbnailmanagercenrep/package.pkg
imagehandlingutilities/thumbnailmanager/thumbagdaemon/group/thumbagdaemon.mmp
imagehandlingutilities/thumbnailmanager/thumbagdaemon/inc/thumbagprocessor.h
imagehandlingutilities/thumbnailmanager/thumbagdaemon/src/thumbagdaemon.cpp
imagehandlingutilities/thumbnailmanager/thumbagdaemon/src/thumbagprocessor.cpp
imagehandlingutilities/thumbnailmanager/thumbnailclient/group/thumbnailmanager.mmp
imagehandlingutilities/thumbnailmanager/thumbnailclient/inc/thumbnailmanagerimpl.h
imagehandlingutilities/thumbnailmanager/thumbnailclient/inc/thumbnailrequestactive.h
imagehandlingutilities/thumbnailmanager/thumbnailclient/inc/thumbnailsession.h
imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailmanagerimpl.cpp
imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailrequestactive.cpp
imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailsession.cpp
imagehandlingutilities/thumbnailmanager/thumbnailmanagerqt/inc/thumbnailmanager_p_qt.h
imagehandlingutilities/thumbnailmanager/thumbnailmanagerqt/src/thumbnailmanager_p_qt.cpp
imagehandlingutilities/thumbnailmanager/thumbnailmanagerqt/src/thumbnailmanager_qt.cpp
imagehandlingutilities/thumbnailmanager/thumbnailmanagerqt/thumbnailmanagerqt.pro
imagehandlingutilities/thumbnailmanager/thumbnailmanagerqt/tsrc/test_qtnmwrapper.cpp
imagehandlingutilities/thumbnailmanager/thumbnailserver/group/thumbnailserver.mmp
imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailfetchedchecker.h
imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailserver.h
imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailserversession.h
imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailsql.h
imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailstore.h
imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailfetchedchecker.cpp
imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserver.cpp
imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserversession.cpp
imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailstore.cpp
imagehandlingutilities/thumbnailmanager/tmcommon/src/tmactivitymanager.cpp
--- a/imagehandling_plat/thumbnailmanager_api/inc/thumbnailmanager.h	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandling_plat/thumbnailmanager_api/inc/thumbnailmanager.h	Mon May 03 12:48:51 2010 +0300
@@ -548,6 +548,23 @@
       */
       virtual void UpdateThumbnailsL( const TThumbnailId aItemId, const TDesC& aPath,
                                       const TInt aOrientation, const TInt64 aModified, const TInt aPriority  ) = 0;
+      
+      /**
+       * Rename Thumbnails. This is an asynchronous
+       * operation, which always returns immediately.
+       *
+       * @since S60 v5.0
+       * @param aCurrentPath     Current path of the Thumbnail
+       * @param aNewPath         New path for the Thumbnail
+       * @param aPriority        Priority for this operation
+       * @return                 Thumbnail request ID. This can be used to
+       *                         cancel the request or change priority.
+       *                         The ID is specific to this CThumbnailManager
+       *                         instance and may not be shared with other
+       *                         instances.
+       */
+       virtual TThumbnailRequestId RenameThumbnailsL( const TDesC& aCurrentPath, 
+               const TDesC& aNewPath, TInt aPriority = CActive::EPriorityIdle ) = 0;
 
 };
 
--- a/imagehandling_plat/thumbnailmanager_api/inc/thumbnailmanager_qt.h	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandling_plat/thumbnailmanager_api/inc/thumbnailmanager_qt.h	Mon May 03 12:48:51 2010 +0300
@@ -18,13 +18,22 @@
 #ifndef THUMBNAILMANAGER_QT_H
 #define THUMBNAILMANAGER_QT_H
 
-#include <qobject>
-#include <QPixmap.h>
+#include <QObject>
+#include <qpixmap>
+#include <QImage>
+#include <QtGlobal>
 
 class ThumbnailManagerPrivate;
 class QString;
 class QSize;
 
+#ifdef TNMQT_DLL
+#  define TNM_EXPORT Q_DECL_EXPORT
+#else
+#  define TNM_EXPORT Q_DECL_IMPORT
+#endif  
+
+
 /** default priority value */
 const int tnmWrapperPriorityIdle = -100;
 
@@ -109,19 +118,19 @@
      * 
      * @param parentPtr parent
      */    
-    IMPORT_C ThumbnailManager( QObject* parentPtr = NULL );
+    TNM_EXPORT ThumbnailManager( QObject* parentPtr = NULL );
 
     /**
      * Destructor
      */
-    IMPORT_C ~ThumbnailManager();
+    TNM_EXPORT ~ThumbnailManager();
 
     /**
      * Get quality versus performance preference.
      *
      * @return quality versus performance preference
      */
-    IMPORT_C QualityPreference qualityPreference() const;
+    TNM_EXPORT QualityPreference qualityPreference() const;
 
     /**
      * Set quality versus performance preference.
@@ -130,14 +139,14 @@
      *                           value.
      * @return true on success
      */
-    IMPORT_C bool setQualityPreference( QualityPreference qualityPreference );
+    TNM_EXPORT bool setQualityPreference( QualityPreference qualityPreference );
 
     /**
      * Get the current desired size for thumbnail bitmaps.
      *
      * @return Current desired size for thumbnail bitmaps (in pixels).
      */
-    IMPORT_C QSize thumbnailSize() const;
+    TNM_EXPORT QSize thumbnailSize() const;
 
     /**
      * Set desired size for thumbnail bitmaps.
@@ -145,7 +154,7 @@
      * @param thumbnailSize New desired thumbnail size.
      * @return true on success
      */
-    IMPORT_C bool setThumbnailSize( const QSize& thumbnailSize );
+    TNM_EXPORT bool setThumbnailSize( const QSize& thumbnailSize );
 
     /**
      * Set desired size for thumbnail bitmaps.
@@ -153,14 +162,14 @@
      * @param thumbnailSize New desired thumbnail size.
      * @return true on success
      */
-    IMPORT_C bool setThumbnailSize( ThumbnailSize thumbnailSize );
+    TNM_EXPORT bool setThumbnailSize( ThumbnailSize thumbnailSize );
     
     /**
      * Get current mode for thumbnail generation.
      *
      * @return Current mode.
      */
-    IMPORT_C ThumbnailMode mode() const;
+    TNM_EXPORT ThumbnailMode mode() const;
 
     /**
      * Set mode for thumbnail generation.
@@ -168,7 +177,7 @@
      * @param mode New flags.
      * @return true on success 
      */
-    IMPORT_C bool setMode( ThumbnailMode mode );
+    TNM_EXPORT bool setMode( ThumbnailMode mode );
 
     /**
      * Get a thumbnail for an object file. If a thumbnail already exists, it
@@ -188,7 +197,7 @@
      *                      instance and may not be shared with other
      *                      instances.
      */
-    IMPORT_C int getThumbnail( const QString& fileName, void * clientData = NULL, 
+    TNM_EXPORT int getThumbnail( const QString& fileName, void * clientData = NULL, 
             int priority = tnmWrapperPriorityIdle );
 
     /**
@@ -209,7 +218,7 @@
      *                      instance and may not be shared with other
      *                      instances.
      */    
-    IMPORT_C int getThumbnail( unsigned long int thumbnailId, void * clientData = NULL, 
+    TNM_EXPORT int getThumbnail( unsigned long int thumbnailId, void * clientData = NULL, 
             int priority = tnmWrapperPriorityIdle );
     
     /**
@@ -227,7 +236,7 @@
      *                           cancel the request or change priority. 
      *                           
      */    
-    IMPORT_C int setThumbnail( const QPixmap& source, const QString& fileName,
+    TNM_EXPORT int setThumbnail( const QPixmap& source, const QString& fileName,
             void * clientData = NULL, int priority = tnmWrapperPriorityIdle );
     
     /**
@@ -245,7 +254,7 @@
      *                           cancel the request or change priority. 
      *                           
      */    
-    IMPORT_C int setThumbnail( const QImage& source, const QString& fileName,
+    TNM_EXPORT int setThumbnail( const QImage& source, const QString& fileName,
             void * clientData = NULL, int priority = tnmWrapperPriorityIdle );
 
     /**
@@ -254,7 +263,7 @@
      *
      * @param fileName      Source file
      */
-    IMPORT_C void deleteThumbnails( const QString& fileName );
+    TNM_EXPORT void deleteThumbnails( const QString& fileName );
 
     /**
      * Delete all thumbnails for a given object. This is an asynchronous
@@ -262,7 +271,7 @@
      *
      * @param thumbnailId      thumbnail id
      */
-    IMPORT_C void deleteThumbnails( unsigned long int thumbnailId );
+    TNM_EXPORT void deleteThumbnails( unsigned long int thumbnailId );
 
     /**
      * Cancel a thumbnail operation.
@@ -270,7 +279,7 @@
      * @param id      Request ID for the operation to be cancelled.
      * @return         true if cancelling was successful.
      */
-    IMPORT_C bool cancelRequest( int id );
+    TNM_EXPORT bool cancelRequest( int id );
 
     /**
      * Change the priority of a queued thumbnail operation.
@@ -280,7 +289,7 @@
      * @param newPriority  New priority value
      * @return              true if change was successful.
      */
-    IMPORT_C bool changePriority( int id, int newPriority );
+    TNM_EXPORT bool changePriority( int id, int newPriority );
     
 signals:  
     /**
@@ -292,7 +301,23 @@
      * @param errorCode  error code
      */
     void thumbnailReady( QPixmap , void * , int , int );    
+
+    /**
+     * Final thumbnail bitmap generation or loading is complete.
+     *
+     * @param image      An object representing the resulting thumbnail.
+     * @param clientData Client data
+     * @param id         Request ID for the operation
+     * @param errorCode  error code
+     */
+    void thumbnailReady( QImage , void * , int , int );    
+
+protected:
     
+    void connectNotify(const char *signal);
+
+    void disconnectNotify(const char *signal);
+
 private:
     ThumbnailManagerPrivate* d;
 };
Binary file imagehandlingutilities/thumbnailmanager/conf/thumbnailmanager.confml has changed
--- a/imagehandlingutilities/thumbnailmanager/inc/thumbnailmanagerconstants.h	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/inc/thumbnailmanagerconstants.h	Mon May 03 12:48:51 2010 +0300
@@ -50,9 +50,21 @@
 const TInt KDaemonProcessing = 0x00000040;
 
 //insert to temp table first wo indexing and move data to main table as batch
-const TUint KMaxBatchItems = 36;
+//actual batch size will vary and will be between min...max batch size values below
+
+//minimum batch size
+const TUint KMInBatchItems = 3;
+//maximum batch size
+const TUint KMaxBatchItems = 18;
+//Max allowed flush time
+const TUint KMaxFlushDelay = 3000; //ms
+// fixed batch size for MTP
+const TUint KMaxBatchItemsMTP = 60;
+
 //how many items daemon will query at once from MDS
 const TUint KMaxQueryItems = 100;
+// max items for PH & AllItems query
+const TUint KMaxQueryItems2 = 100;
 
 // maximum number of active client side queue requests
 const TUint KMaxClientRequests = 2;
@@ -432,7 +444,7 @@
      */
     EDeleteThumbnailsById,
     
-    EReserved1,
+    ERenameThumbnails,
     
     /**
      * Update thumbnails by given Id.
--- a/imagehandlingutilities/thumbnailmanager/inc/thumbnailpanic.h	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/inc/thumbnailpanic.h	Mon May 03 12:48:51 2010 +0300
@@ -31,7 +31,7 @@
         = 2, EThumbnailBadPath = 3, EThumbnailUnknownMessage = 4,
         EThumbnailMessageNotCompleted = 5, EThumbnailBitmapNotReleased = 6,
         EThumbnailEmptyDescriptor = 7, EThumbnailWrongId = 8, EThumbnailAlreadyRunning =
-        9, EThumbnailDatabaseUnrecoverable = 10
+        9, EThumbnailDatabaseUnrecoverable = 10, EThumbnailSQLTransaction = 11
     };
 
 /**
--- a/imagehandlingutilities/thumbnailmanager/plugins/audio/group/thumbnailaudioprovider.mmp	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/plugins/audio/group/thumbnailaudioprovider.mmp	Mon May 03 12:48:51 2010 +0300
@@ -57,5 +57,7 @@
 
 DEBUGLIBRARY flogger.lib
 
+OPTION ARMCC -O3 -OTime
+
 PAGED
 BYTEPAIRCOMPRESSTARGET
--- a/imagehandlingutilities/thumbnailmanager/plugins/image/group/thumbnailimageprovider.mmp	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/plugins/image/group/thumbnailimageprovider.mmp	Mon May 03 12:48:51 2010 +0300
@@ -56,5 +56,7 @@
 
 DEBUGLIBRARY flogger.lib
 
+OPTION ARMCC -O3 -OTime
+
 PAGED
 BYTEPAIRCOMPRESSTARGET
--- a/imagehandlingutilities/thumbnailmanager/plugins/image/src/thumbnailimagedecoder.cpp	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/plugins/image/src/thumbnailimagedecoder.cpp	Mon May 03 12:48:51 2010 +0300
@@ -553,7 +553,6 @@
         reader = CExifRead::NewL( *iBuffer, CExifRead::ENoJpeg );
         }
     
-    
     CleanupStack::PushL( reader );
 
     iExifThumbImage = reader->GetThumbnailL();
@@ -591,16 +590,6 @@
         User::LeaveIfError( err );
         }
 
-/*
-    // If the Exif thumbnail is smaller than requested it will not be used
-    TFrameInfo frame = iDecoder->FrameInfo( 0 );
-    
-    if ( frame.iOverallSizeInPixels.iWidth < iSize.iWidth ||
-        frame.iOverallSizeInPixels.iHeight < iSize.iHeight ) 
-        {
-        User::Leave( KErrGeneral );
-        }
-    */
     TN_DEBUG1( "CThumbnailImageDecoder::CreateExifDecoderL() end" );
     }
 
--- a/imagehandlingutilities/thumbnailmanager/plugins/video/group/thumbnailvideoprovider.mmp	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/plugins/video/group/thumbnailvideoprovider.mmp	Mon May 03 12:48:51 2010 +0300
@@ -50,6 +50,8 @@
 
 DEBUGLIBRARY            flogger.lib
 
+OPTION ARMCC -O3 -OTime
+
 PAGED
 BYTEPAIRCOMPRESSTARGET
 
--- a/imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/package.pkg	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/package.pkg	Mon May 03 12:48:51 2010 +0300
@@ -17,7 +17,7 @@
 &EN
 
 ; Header
-#{"Thumbnail Manager"},(0x102830AB), 10, 10, 4, TYPE=SA, RU
+#{"Thumbnail Manager"},(0x102830AB), 10, 10, 5, TYPE=SA, RU
 
 ; Localised Vendor name
 %{"Nokia"}
--- a/imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/stub.pkg	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/stub.pkg	Mon May 03 12:48:51 2010 +0300
@@ -17,7 +17,7 @@
 &EN
 
 ; Header
-#{"ThumbnailManager"},(0x102830AB), 10, 10, 4, TYPE=SA
+#{"ThumbnailManager"},(0x102830AB), 10, 10, 5, TYPE=SA
 
 ; Localised Vendor name
 %{"Nokia"}
Binary file imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/thumbnailmanager_stub.sis has changed
--- a/imagehandlingutilities/thumbnailmanager/sis/thumbnailmanagercenrep/package.pkg	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/sis/thumbnailmanagercenrep/package.pkg	Mon May 03 12:48:51 2010 +0300
@@ -17,7 +17,7 @@
 &EN
 
 ; Header
-#{"Thumbnail Manager Cenrep"},(0x10202BE9), 10, 10, 4, TYPE=SP
+#{"Thumbnail Manager Cenrep"},(0x10202BE9), 10, 10, 5, TYPE=SP
 
 ; Localised Vendor name
 %{"Symbian Software Ltd."}
--- a/imagehandlingutilities/thumbnailmanager/thumbagdaemon/group/thumbagdaemon.mmp	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/thumbagdaemon/group/thumbagdaemon.mmp	Mon May 03 12:48:51 2010 +0300
@@ -67,6 +67,8 @@
 
 DEBUGLIBRARY            flogger.lib
 
+OPTION ARMCC -O3 -OTime
+
 PAGED
 BYTEPAIRCOMPRESSTARGET
 
--- a/imagehandlingutilities/thumbnailmanager/thumbagdaemon/inc/thumbagprocessor.h	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/thumbagdaemon/inc/thumbagprocessor.h	Mon May 03 12:48:51 2010 +0300
@@ -158,7 +158,19 @@
      */
     void QueryL( RArray<TItemId>& aIDArray );
     
+	 /**
+     * QueryPlaceholdersL
+     *
+     * @since S60 v5.0
+     */
     void QueryPlaceholdersL();
+
+   	 /**
+     * DeleteAndCancelQuery
+     *
+     * @since Symbian^3
+     */
+    void DeleteAndCancelQuery();
     
 protected:
 
@@ -243,6 +255,13 @@
      */
     void UpdatePSValues(const TBool aDefine = EFalse);
        
+    /**
+     * Comparison function for logaritmic use of queue arrays
+     * 
+     * @since S60 v5.0
+     */
+    static TInt Compare(const TItemId& aLeft, const TItemId& aRight);
+        
 private:
     
     // not own
@@ -265,22 +284,33 @@
 	//reference to current processing queue
     RArray<TItemId>* iLastQueue;
     
+	//background generation state
+	// EFalse = 1st round, create only grid size thumbnail for images and videos
+	// ETrue = 2nds round, create all missing sizes for all media items
     TBool i2ndRound;    
     
+	//MDS query issues
     TBool iQueryActive;
+	//MDS query complete
     TBool iQueryReady;
     
+	//Processing MDS itens which are modified
     TBool iModify;
     TInt iProcessingCount;
 
-    //Flag is MDS Harvester harevsting
+    //MDS harvester's overall state
     TBool iHarvesting;
     TBool iHarvestingTemp;
-    
-	//Flag is MDS placeholder harvesting active
+
+    //MDS Harvester's placeholder harvesting state
     TBool iPHHarvesting;
     TBool iPHHarvestingTemp;
     
+    //MDS Harvester's SD card harvesting state
+    TBool iMMCHarvesting;
+    TBool iMMCHarvestingTemp;
+    
+    
     CPeriodic* iPeriodicTimer;
 
 	//MDS Harvester client
--- a/imagehandlingutilities/thumbnailmanager/thumbagdaemon/src/thumbagdaemon.cpp	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/thumbagdaemon/src/thumbagdaemon.cpp	Mon May 03 12:48:51 2010 +0300
@@ -186,7 +186,6 @@
         {
         // 2 observers
         TRAP_IGNORE( iMdESession->RemoveObjectObserverL( *this ) );
-//modify        TRAP_IGNORE( iMdESession->RemoveObjectObserverL( *this ) );
         
 #ifdef MDS_URI_OBSERVER
         // remove observer with uri
@@ -374,8 +373,7 @@
             iProcessor->RemoveFromQueues( aObjectIdArray, EFalse);
             }
         
-        // Add event to processing queue by type and enable force run
-        
+        // Add event to processing queue by type and enable force run        
         RPointerArray<HBufC> dummyArray;
         TRAPD(err, iProcessor->AddToQueueL(aType, aObjectIdArray, dummyArray, EFalse));
         if (err != KErrNone)
--- a/imagehandlingutilities/thumbnailmanager/thumbagdaemon/src/thumbagprocessor.cpp	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/thumbagdaemon/src/thumbagprocessor.cpp	Mon May 03 12:48:51 2010 +0300
@@ -201,11 +201,62 @@
 // CThumbAGProcessor::HandleQueryNewResults()
 // -----------------------------------------------------------------------------
 //
-void CThumbAGProcessor::HandleQueryNewResults( CMdEQuery& /*aQuery*/,
-                                               const TInt /*aFirstNewItemIndex*/,
-                                               const TInt /*aNewItemCount*/ )
+void CThumbAGProcessor::HandleQueryNewResults( CMdEQuery& aQuery,
+                                               const TInt aFirstNewItemIndex,
+                                               const TInt aNewItemCount )
     {
-    // No implementation required
+    // PH & AllItems query results are handled here
+    if (aNewItemCount > 0)
+        {
+        if(&aQuery == iQueryPlaceholders)
+            {
+            TN_DEBUG2( "CThumbAGProcessor::HandleQueryNewResults - iQueryPlaceholders, %d new", aNewItemCount);
+            
+            for(TInt i = aFirstNewItemIndex; i < iQueryPlaceholders->Count(); i++)
+                {    
+                const CMdEObject* object = &iQueryPlaceholders->Result(i);
+              
+                if(!object)
+                    {
+                    continue;
+                    }
+              
+                if(!object->Placeholder())
+                    {
+                    TN_DEBUG2( "CThumbAGProcessor::HandleQueryNewResults %d not placeholder", object->Id());
+                    continue;
+                    }
+               
+                // ignore if fails
+                iPlaceholderQueue.InsertInOrder(object->Id(), Compare);               
+                }  
+            }
+        else if(&aQuery == iQueryAllItems)
+            {
+            TN_DEBUG2( "CThumbAGProcessor::HandleQueryNewResults - QueryAllItems, %d new", aNewItemCount);
+    
+            for(TInt i = aFirstNewItemIndex; i < iQueryAllItems->Count(); i++)
+                {    
+                const CMdEObject* object = &iQueryAllItems->Result(i);
+               
+                if(!object)
+                    {
+                    continue;
+                    }
+               
+                if (iAddQueue.FindInOrder(object->Id(), Compare) == KErrNotFound && 
+                    iModifyQueue.FindInOrder(object->Id(), Compare) == KErrNotFound )
+                    {
+                    // ignore if fails
+                    iAddQueue.InsertInOrder(object->Id(), Compare);
+                    }
+                }
+            }    
+        }
+    else
+        {
+        TN_DEBUG1( "CThumbAGProcessor::HandleQueryNewResults - error, no new items");
+        }
     }
 
 // -----------------------------------------------------------------------------
@@ -221,67 +272,28 @@
         TN_DEBUG1( "CThumbAGProcessor::HandleQueryCompleted - iQueryPlaceholders completed");
         
         iPlaceholderQueue.Reset();
-        // if no errors in query
-        if (aError == KErrNone )
+        
+        //free query
+        delete iQueryPlaceholders;
+        iQueryPlaceholders = NULL;
+       
+        if(iDoQueryAllItems)
             {
-            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;
-           
-           if(iDoQueryAllItems)
-               {
-               iDoQueryAllItems = EFalse;
-               TRAP_IGNORE(QueryAllItemsL());
-               }
+            iDoQueryAllItems = EFalse;
+            TRAP_IGNORE(QueryAllItemsL());
+            }
         }
     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 = &iQueryAllItems->Result(i);
-               
-                if(!object)
-                    {
-                    continue;
-                    }
-               
-                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
-            }
-            //free query
-            delete iQueryAllItems;
-            iQueryAllItems = NULL;
+       
+        //free query
+        delete iQueryAllItems;
+        iQueryAllItems = NULL;
         }
     else if(&aQuery == iQuery )
         {
@@ -302,7 +314,7 @@
                 {
                 TN_DEBUG1( "CThumbAGProcessor::HandleQueryCompleted() some result items missing");
                 
-                RArray<TItemId> iQueryQueueDelta;
+                RArray<TItemId> queryQueueDelta;
                 
                 TInt itemIndex(KErrNotFound);
                 
@@ -324,23 +336,26 @@
                      if(!found)
                          {
                          TN_DEBUG2( "CThumbAGProcessor::HandleQueryCompleted() missing from results item %d", iQueryQueue[queryItem] );
-                         iQueryQueueDelta.Append( iQueryQueue[queryItem] );
+                         
+                         // ignore if fails
+                         queryQueueDelta.InsertInOrder(iQueryQueue[queryItem], Compare);
                          }
                      }
                  
-                 TN_DEBUG2( "CThumbAGProcessor::HandleQueryCompleted() missing items total count %d", iQueryQueueDelta.Count()); 
+                 TN_DEBUG2( "CThumbAGProcessor::HandleQueryCompleted() missing items total count %d", queryQueueDelta.Count()); 
                  //cleanup from previous queue it item is not found from MDS
-                 while(iQueryQueueDelta.Count())
+                 while(queryQueueDelta.Count())
                      {
-                     itemIndex = iLastQueue->Find(iQueryQueueDelta[0]);
+                     itemIndex = iLastQueue->FindInOrder(queryQueueDelta[0], Compare);
+                     
                      if(itemIndex >= 0)
                          {
                          TN_DEBUG2( "CThumbAGProcessor::HandleQueryCompleted() remove items %d", iQueryQueue[0]);
                          iLastQueue->Remove( itemIndex );
                          }
-                     iQueryQueueDelta.Remove(0);
+                     queryQueueDelta.Remove(0);
                      }
-                 iQueryQueueDelta.Close();
+                 queryQueueDelta.Close();
                 }
             
             // no results, reset query
@@ -354,23 +369,8 @@
             }
         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() Query FAILED!");   
+            DeleteAndCancelQuery();
+            TN_DEBUG1( "CThumbAGProcessor::HandleQueryCompleted() Query FAILED!"); 
             }
         }
     else
@@ -479,9 +479,10 @@
         for (int i=0; i<aIDArray.Count(); i++)
             {
             // 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 (iAddQueue.FindInOrder(aIDArray[i], Compare) == KErrNotFound && 
+                i2ndRoundGenerateQueue.FindInOrder(aIDArray[i], Compare) == KErrNotFound)
                 {
-                iAddQueue.AppendL(aIDArray[i]);
+                User::LeaveIfError(iAddQueue.InsertInOrder(aIDArray[i], Compare));    
                 }
             }
         }
@@ -490,12 +491,11 @@
         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] );
+                TInt itemIndex = iPlaceholderQueue.FindInOrder(aIDArray[i], Compare);
                                 
                 if (itemIndex >= 0)
                     {
@@ -503,10 +503,11 @@
                     iPlaceholderQueue.Remove( itemIndex );
                     }
                 
-                if(iAddQueue.Find( aIDArray[i]) == KErrNotFound && i2ndRoundGenerateQueue.Find( aIDArray[i]))
+                if(iAddQueue.FindInOrder(aIDArray[i], Compare) == KErrNotFound && 
+                   i2ndRoundGenerateQueue.FindInOrder(aIDArray[i], Compare) == KErrNotFound)
                     {
                     TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() - append to add queue");
-                    iAddQueue.Append( aIDArray[i]);
+                    User::LeaveIfError(iAddQueue.InsertInOrder(aIDArray[i], Compare));
                     }
                 }
             }
@@ -518,7 +519,7 @@
             
             for (int i=0; i<aIDArray.Count(); i++)
                 {
-                itemIndex = iPlaceholderQueue.Find( aIDArray[i] );
+                itemIndex = iPlaceholderQueue.FindInOrder(aIDArray[i], Compare);
                 
                 if (itemIndex >= 0)
                     {
@@ -528,7 +529,7 @@
                 else
                     {
                     TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() - real modify");
-                    itemIndex = iAddQueue.Find( aIDArray[i] );
+                    itemIndex = iAddQueue.FindInOrder(aIDArray[i], Compare);
                                     
                     if (itemIndex >= 0)
                         {
@@ -536,9 +537,8 @@
                         iAddQueue.Remove( itemIndex );
                         }
 					else
-						{
-						
-						itemIndex = i2ndRoundGenerateQueue.Find( aIDArray[i] );
+						{						
+						itemIndex = i2ndRoundGenerateQueue.FindInOrder(aIDArray[i], Compare);
                                     
 	                    if (itemIndex >= 0)
 	                        {
@@ -548,7 +548,7 @@
 					}
                     
                     TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() - append to modify queue");
-                    iModifyQueue.AppendL(aIDArray[i]);
+                    User::LeaveIfError(iModifyQueue.InsertInOrder(aIDArray[i], Compare));
                     
                     SetForceRun( ETrue );
                     } 
@@ -562,14 +562,14 @@
             for (int i=0; i<aIDArray.Count(); i++)
                 {
                 // can be removed from Add queue
-                TInt itemIndex = iAddQueue.Find( aIDArray[i] );
+                TInt itemIndex = iAddQueue.FindInOrder(aIDArray[i], Compare);
                 if(itemIndex >= 0)
                     {
                     iAddQueue.Remove(itemIndex);
                     }
     
                 // ..and Modify Queue
-                itemIndex = iModifyQueue.Find( aIDArray[i] );
+                itemIndex = iModifyQueue.FindInOrder(aIDArray[i], Compare);
                 if(itemIndex >= 0)
                     {
                     iModifyQueue.Remove(itemIndex);
@@ -657,15 +657,16 @@
             if(iLastQueue == &iAddQueue || iLastQueue == &iModifyQueue)
                 {
                 TN_DEBUG2( "CThumbAGProcessor::CreateThumbnailsL() - 1st round add/modify, append to 2nd round queue", aObject->Id() );
-                if(i2ndRoundGenerateQueue.Find(aObject->Id()) == KErrNotFound)
+                if(i2ndRoundGenerateQueue.FindInOrder(aObject->Id(), Compare) == KErrNotFound)
                     {
-                    i2ndRoundGenerateQueue.Append( aObject->Id() );
+                    // ignore if fails
+                    i2ndRoundGenerateQueue.InsertInOrder(aObject->Id(), Compare);
                     }
                 }
             
-           if( !(imageObjectDef.Id() == aObject->Def().Id() || videoObjectDef.Id() == aObject->Def().Id()) )
+           if( imageObjectDef.Id() != aObject->Def().Id()  )
                 {
-                TN_DEBUG1( "CThumbAGProcessor::CreateThumbnailsL() 1st round and not image or video, skip");
+                TN_DEBUG1( "CThumbAGProcessor::CreateThumbnailsL() 1st round not image");
                 ActivateAO();
                 return;
                 }
@@ -731,10 +732,11 @@
         
     TN_DEBUG3( "CThumbAGProcessor::QueryL() - fill begin aIDArray == %d, iQueryQueue == %d", aIDArray.Count(), iQueryQueue.Count() );
     
-    for(TInt i=0;i < KMaxQueryItems && i < maxCount; i++)
+    for(TInt i=0; i < KMaxQueryItems && i < maxCount; i++)
         {
-        TN_DEBUG2( "CThumbAGProcessor::QueryL() - fill %d", aIDArray[i] );
-        iQueryQueue.Append( aIDArray[i] );
+        TN_DEBUG2( "CThumbAGProcessor::QueryL() - fill %d", aIDArray[0] );
+        iQueryQueue.InsertInOrder(aIDArray[0], Compare);
+        aIDArray.Remove(0);
         }
     
     TN_DEBUG3( "CThumbAGProcessor::QueryL() - fill end aIDArray == %d, iQueryQueue == %d", aIDArray.Count(), iQueryQueue.Count() );
@@ -836,7 +838,7 @@
     audioPHObjectCondition.SetPlaceholderOnly( ETrue );
     audioPHObjectCondition.SetNotPresent( ETrue );
     
-    iQueryPlaceholders->FindL();  
+    iQueryPlaceholders->FindL(KMaxTInt, KMaxQueryItems2);   
    
     TN_DEBUG1( "CThumbAGProcessor::QueryPlaceholdersL - end" );
     }
@@ -895,7 +897,7 @@
         if(  err == KErrNone )
             {
             TN_DEBUG1( "CThumbAGProcessor::RunL() add iHarvesterClient observer");
-            err = iHarvesterClient.AddHarvesterEventObserver( *this, EHEObserverTypeOverall | EHEObserverTypePlaceholder, KMaxTInt );
+            err = iHarvesterClient.AddHarvesterEventObserver( *this, EHEObserverTypeOverall | EHEObserverTypeMMC | EHEObserverTypePlaceholder, KMaxTInt );
             TN_DEBUG2( "CThumbAGProcessor::RunL() iHarvesterClient observer err = %d", err);
             __ASSERT_DEBUG((err==KErrNone), User::Panic(_L("CThumbAGProcessor::RunL(), !iHarvesterClient "), err));
             }
@@ -967,14 +969,9 @@
       	{
         TN_DEBUG1( "void CThumbAGProcessor::RunL() skip idle detection!");
       	CancelTimeout();
-     	 }
+     	}
   	else
 	    {
-        if(iActivityManager)
-            {
-            iIdle = iActivityManager->IsInactive();
-            }
-	    
         if( !iIdle || iHarvesting || iMPXHarvesting || iPeriodicTimer->IsActive() )
             {
             TN_DEBUG1( "void CThumbAGProcessor::RunL() device not idle");
@@ -1009,17 +1006,17 @@
             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 )
                 {
+                TInt itemIndex = iLastQueue->FindInOrder(object->Id(), Compare);
+                if(itemIndex >= 0)
+                    {
+                    iLastQueue->Remove(itemIndex);
+                    }
+				
+                //process one item at once
                 //remove item from queryQueue when request is issued 
-                itemIndex = iQueryQueue.Find( object->Id());
+                itemIndex = iQueryQueue.FindInOrder(object->Id(), Compare);
                 if(itemIndex >= 0)
                     {
                     iQueryQueue.Remove(itemIndex);
@@ -1033,27 +1030,9 @@
         //force is coming, but executing non-forced query complete-> cancel old
         else
             {
-            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;    
+            DeleteAndCancelQuery();
+	        ActivateAO();
+            return;  
             }
         
         //is last query item
@@ -1071,31 +1050,7 @@
         {
         if(iForceRun && !iModify)
             {
-            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;
-            
+            DeleteAndCancelQuery();
             ActivateAO();
             }
         else  
@@ -1168,6 +1123,44 @@
     }
 
 // ---------------------------------------------------------------------------
+// CThumbAGProcessor::DeleteAndCancelQuery()
+// ---------------------------------------------------------------------------
+//
+void CThumbAGProcessor::DeleteAndCancelQuery()
+    {
+    TN_DEBUG1( "CThumbAGProcessor::DeleteAndCancelQuery() in" );
+    
+    if(iQuery)
+        {
+        TN_DEBUG1( "CThumbAGProcessor::DeleteAndCancelQuery() - deleting query" );
+        iQuery->Cancel();
+        delete iQuery;
+        iQuery = NULL;
+        }
+    
+    iQueryReady = EFalse;
+    iQueryActive = EFalse;
+    iProcessingCount = 0;
+    
+    //move remainig IDs in query queue back to original queue
+    while(iQueryQueue.Count())
+        {
+        if(iLastQueue)
+            {
+            if(iLastQueue->FindInOrder(iQueryQueue[0], Compare) == KErrNotFound)
+                {
+                //ignore if fails
+                iLastQueue->InsertInOrder(iQueryQueue[0], Compare);
+                }
+            }
+        iQueryQueue.Remove(0);
+        }
+    iLastQueue = NULL;
+    
+    TN_DEBUG1( "CThumbAGProcessor::DeleteAndCancelQuery() out" );
+    }
+
+// ---------------------------------------------------------------------------
 // CThumbAGProcessor::DoCancel()
 // ---------------------------------------------------------------------------
 //
@@ -1268,8 +1261,48 @@
                 }
             }
         }
+    //MMC harvesting
+    else if( aHEObserverType == EHEObserverTypeMMC)
+        {
+        switch(aHarvesterEventState)
+            {
+            case EHEStateStarted:
+            case EHEStateHarvesting:
+            case EHEStatePaused:
+            case EHEStateResumed:
+                {
+                iMMCHarvestingTemp = ETrue;
+                break;
+                }
+            case EHEStateFinished:
+            case EHEStateUninitialized:
+                {
+                iMMCHarvestingTemp = EFalse;
+                break;
+                }
+            };
+        
+        if(iMMCHarvestingTemp != iMMCHarvesting)
+            {
+            iMMCHarvesting = iMMCHarvestingTemp;
+            
+            if( iMMCHarvesting )
+                {
+                TN_DEBUG1( "CThumbAGProcessor::HarvestingUpdated -- MDS MMC harvesterin started");
+                if(iPreviousItemsLeft != KErrNotReady)
+                    {
+                    iPreviousItemsLeft = KErrNotReady;
+                    RProperty::Set(KTAGDPSNotification, KDaemonProcessing, iPreviousItemsLeft);
+                    }
+                }
+            else
+                {
+                TN_DEBUG1( "CThumbAGProcessor::HarvestingUpdated -- MDS MMC harvesting finished ");
+                }
+            }
+        }
    
-    TN_DEBUG3( "CThumbAGProcessor::HarvestingUpdated -- end() iHarvesting == %d, iPHHarvesting == %d ", iHarvesting, iPHHarvesting);
+    TN_DEBUG4( "CThumbAGProcessor::HarvestingUpdated -- end() iHarvesting == %d, iPHHarvesting == %d iMMCHarvesting == %d ", iHarvesting, iPHHarvesting, iMMCHarvesting);
     }
 
 // ---------------------------------------------------------------------------
@@ -1349,13 +1382,6 @@
         return;
         }
         
-    if( !IsActive() )
-        {
-        SetActive();
-        TRequestStatus* statusPtr = &iStatus;
-        User::RequestComplete( statusPtr, KErrNone );
-        }
-    
     //check if forced run needs to continue
     if (iModifyQueue.Count())
         {
@@ -1366,6 +1392,14 @@
         iModify = EFalse;
         SetForceRun( EFalse );
         }
+    
+    if( !IsActive() && ((!iActive && !iQueryActive) || iForceRun ))
+        {
+        TN_DEBUG1( "CThumbAGProcessor::ActivateAO() - Activated");
+        SetActive();
+        TRequestStatus* statusPtr = &iStatus;
+        User::RequestComplete( statusPtr, KErrNone );
+        }
 
     UpdatePSValues();
     }
@@ -1462,32 +1496,28 @@
         {
         TN_DEBUG2( "CThumbAGProcessor::RemoveFromQueues() - %d", aIDArray[i]);
 
-        itemIndex = iPlaceholderQueue.Find( aIDArray[i] );
-                         
+        itemIndex = iPlaceholderQueue.FindInOrder(aIDArray[i], Compare);                        
         if(itemIndex >= 0)
             {
             iPlaceholderQueue.Remove(itemIndex);
             TN_DEBUG1( "CThumbAGProcessor::RemoveFromQueues() - iPlaceholderQueue" );
             }
                 
-        itemIndex = iAddQueue.Find( aIDArray[i] );
-        
+        itemIndex = iAddQueue.FindInOrder(aIDArray[i], Compare);       
         if(itemIndex >= 0)
             {
             iAddQueue.Remove(itemIndex);
             TN_DEBUG1( "CThumbAGProcessor::RemoveFromQueues() - iAddQueue" );
             }
 
-        itemIndex = i2ndRoundGenerateQueue.Find( aIDArray[i] );
-                
+        itemIndex = i2ndRoundGenerateQueue.FindInOrder(aIDArray[i], Compare);               
         if(itemIndex >= 0)
             {
             i2ndRoundGenerateQueue.Remove(itemIndex);
             TN_DEBUG1( "CThumbAGProcessor::RemoveFromQueues() - i2ndRoundGenerateQueue" );
             }
         
-        itemIndex = iModifyQueue.Find( aIDArray[i] );
-         
+        itemIndex = iModifyQueue.FindInOrder(aIDArray[i], Compare);       
         if(itemIndex >= 0)
             {
             iModifyQueue.Remove(itemIndex);
@@ -1499,34 +1529,19 @@
 		        }
             }
             
-        itemIndex = iQueryQueue.Find( aIDArray[i] );
-                     
+        itemIndex = iQueryQueue.FindInOrder(aIDArray[i], Compare);                    
         if(itemIndex >= 0)
             {
             iQueryQueue.Remove(itemIndex);
             TN_DEBUG1( "CThumbAGProcessor::RemoveFromQueues() - iQueryQueue" );
             }
-        
-        itemIndex = iPlaceholderQueue.Find( aIDArray[i] );
-                      
+         
+        itemIndex = iPlaceholderQueue.FindInOrder(aIDArray[i], Compare); 
         if(itemIndex >= 0)
         	{
             iPlaceholderQueue.Remove(itemIndex);
             TN_DEBUG1( "CThumbAGProcessor::RemoveFromQueues() - iPlaceholderQueue" );
             }
-        
-        /*
-        if( aRemoveFromDelete )
-            {
-            itemIndex = iRemoveQueue.Find( aIDArray[i] );
-             
-            if(itemIndex >= 0)
-                {
-                iRemoveQueue.Remove(itemIndex);
-                TN_DEBUG1( "CThumbAGProcessor::RemoveFromQueues() - iRemoveQueue" );
-                continue;
-                }
-            }*/
         }
     
     TN_DEBUG1( "CThumbAGProcessor::RemoveFromQueues() - end" );
@@ -1593,7 +1608,7 @@
     
     CMdEObjectCondition& audioPHObjectCondition = rootCondition.AddObjectConditionL(audioObjDef);
     
-    iQueryAllItems->FindL();  
+    iQueryAllItems->FindL(KMaxTInt, KMaxQueryItems2);  
     
     TN_DEBUG1( "CThumbAGProcessor::QueryAllItemsL - end" );
     }
@@ -1770,12 +1785,20 @@
         daemonProcessing = ETrue;
         }
     
-    //disable 2nd round generarion when there is items in 1st round queues
-    //or 2nd queue is empty 
-    if( !i2ndRoundGenerateQueue.Count() || itemsLeft )
+    //adjust items left to containing also items not yet processed but removed from queue under processing
+    if((iLastQueue == &iModifyQueue || iLastQueue == &iAddQueue) && !i2ndRound)
         {
+        itemsLeft +=iQueryQueue.Count();
+        }
+    
+    //cancel 2nd round generarion when there is items in 1st round queues
+    if(itemsLeft && i2ndRound)
+        {
+        DeleteAndCancelQuery();
         i2ndRound = EFalse;
         }
+        
+    TN_DEBUG2( "CThumbAGProcessor::UpdatePSValues() KItemsleft == %d", itemsLeft);
     
     if(aDefine)
         {
@@ -1803,4 +1826,15 @@
         }
     }
 
+// ---------------------------------------------------------------------------
+// CThumbAGProcessor::Compare
+// Comparison function for logaritmic use of queue arrays
+// ---------------------------------------------------------------------------
+//
+TInt CThumbAGProcessor::Compare(const TItemId& aLeft, const TItemId& aRight)
+    {  
+    return (aLeft - aRight);
+    }
+
+
 // End of file
--- a/imagehandlingutilities/thumbnailmanager/thumbnailclient/group/thumbnailmanager.mmp	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/thumbnailclient/group/thumbnailmanager.mmp	Mon May 03 12:48:51 2010 +0300
@@ -54,5 +54,7 @@
 
 DEBUGLIBRARY            flogger.lib
 
+OPTION ARMCC -O3 -OTime
+
 PAGED
 BYTEPAIRCOMPRESSTARGET
--- a/imagehandlingutilities/thumbnailmanager/thumbnailclient/inc/thumbnailmanagerimpl.h	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/thumbnailclient/inc/thumbnailmanagerimpl.h	Mon May 03 12:48:51 2010 +0300
@@ -337,6 +337,23 @@
      void UpdateThumbnailsL( const TThumbnailId aItemId, const TDesC& aPath,
                              const TInt aOrientation, const TInt64 aModified, TInt aPriority );
 
+     /**
+      * Rename Thumbnails. This is an asynchronous
+      * operation, which always returns immediately.
+      *
+      * @since S60 v5.0
+      * @param aCurrentPath     Current path of the Thumbnail
+      * @param aNewPath         New path for the Thumbnail
+      * @param aPriority        Priority for this operation
+      * @return                 Thumbnail request ID. This can be used to
+      *                         cancel the request or change priority.
+      *                         The ID is specific to this CThumbnailManager
+      *                         instance and may not be shared with other
+      *                         instances.
+      */
+     TThumbnailRequestId RenameThumbnailsL( const TDesC& aCurrentPath, 
+             const TDesC& aNewPath, TInt aPriority = CActive::EPriorityIdle );
+     
 private:
 
     /**
--- a/imagehandlingutilities/thumbnailmanager/thumbnailclient/inc/thumbnailrequestactive.h	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/thumbnailclient/inc/thumbnailrequestactive.h	Mon May 03 12:48:51 2010 +0300
@@ -40,7 +40,8 @@
     EReqSetThumbnailBitmap = 3,
     EReqUpdateThumbnails = 4,
     EReqGetThumbnailHandleLater = 5,
-    EReqDeleteThumbnails = 6
+    EReqDeleteThumbnails = 6,
+    EReqRenameThumbnails = 7
 };
 
 /**
@@ -223,6 +224,17 @@
         const TInt aPriority );   
     
     /**
+     * Rename thumbnails.
+     *
+     * @since S60 v5.0
+     * @param aCurrentPath     Current path of the Thumbnail
+     * @param aNewPath         New path for the Thumbnail
+     * @param aPriority        Priority for this operation
+     */
+    void RenameThumbnails( const TDesC& aCurrentPath, const TDesC& aNewPath, 
+        const TInt aPriority );    
+    
+    /**
      * Start active request.
      *
      * @since S60 v5.0
--- a/imagehandlingutilities/thumbnailmanager/thumbnailclient/inc/thumbnailsession.h	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/thumbnailclient/inc/thumbnailsession.h	Mon May 03 12:48:51 2010 +0300
@@ -192,6 +192,13 @@
     void UpdateThumbnails( const TDesC& aPath, const TInt aOrientation, const TInt64 aModified,
                            TThumbnailRequestParamsPckg& aParams, TRequestStatus& aStatus);
 
+    /**
+     * Rename thumbnails.
+     *
+     * @since S60 v5.0
+     */
+    void RenameThumbnails( TThumbnailRequestParamsPckg& aParams, TRequestStatus& aStatus );
+    
 private:
 
     /**
--- a/imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailmanagerimpl.cpp	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailmanagerimpl.cpp	Mon May 03 12:48:51 2010 +0300
@@ -147,7 +147,7 @@
     TInt aPriority, TBool aGeneratePersistentSizesOnly)
     {
     iRequestId++;
-    TN_DEBUG4( "CThumbnailManagerImpl::GetThumbnailL() URI==%S, iThumbnailSize==%d %d", &aObjectSource.Uri(), iThumbnailSize, iRequestId );
+    TN_DEBUG4( "CThumbnailManagerImpl::GetThumbnailL() URI==%S, iThumbnailSize==%d, req %d", &aObjectSource.Uri(), iThumbnailSize, iRequestId );
     
     __ASSERT_DEBUG(( iRequestId > 0 ), ThumbnailPanic( EThumbnailWrongId ));
 
@@ -208,7 +208,7 @@
     aThumbnailId, TAny* aClientData /*= NULL*/, TInt aPriority)
     {
     iRequestId++;
-    TN_DEBUG5( "CThumbnailManagerImpl::GetThumbnailL() reqid==%d, aThumbnailId==%d, iThumbnailSize==%d %d", iRequestId, aThumbnailId, iThumbnailSize, iRequestId );
+    TN_DEBUG4( "CThumbnailManagerImpl::GetThumbnailL() aThumbnailId==%d, iThumbnailSize==%d, req %d", aThumbnailId, iThumbnailSize, iRequestId );
 
     __ASSERT_DEBUG(( iRequestId > 0 ), ThumbnailPanic( EThumbnailWrongId ));
 
@@ -613,7 +613,7 @@
                                                TInt aPriority )
     {
     iRequestId++;
-    TN_DEBUG4( "CThumbnailManagerImpl::UpdateThumbnailsL() URI==%S, aItemId==%d %d", &aPath, aItemId, iRequestId); 
+    TN_DEBUG4( "CThumbnailManagerImpl::UpdateThumbnailsL() URI==%S, aItemId==%d, req %d", &aPath, aItemId, iRequestId); 
     
     __ASSERT_DEBUG(( iRequestId > 0 ), ThumbnailPanic( EThumbnailWrongId ));
     
@@ -633,6 +633,35 @@
     }
 
 // ---------------------------------------------------------------------------
+// CThumbnailManagerImpl::RenameThumbnailsL()
+// Renames thumbnails by given path
+// ---------------------------------------------------------------------------
+//
+TThumbnailRequestId CThumbnailManagerImpl::RenameThumbnailsL( const TDesC& aCurrentPath, 
+        const TDesC& aNewPath, TInt aPriority )
+    {
+    iRequestId++;
+    TN_DEBUG3( "CThumbnailManagerImpl::RenameThumbnailsL() URI==%S, req %d", &aCurrentPath, iRequestId); 
+    
+    __ASSERT_DEBUG(( iRequestId > 0 ), ThumbnailPanic( EThumbnailWrongId ));
+    
+    TInt priority = ValidatePriority(aPriority);
+    
+    CThumbnailRequestActive* getThumbnailActive = CThumbnailRequestActive::NewL
+        ( iFs, iSession, iObserver, iRequestId, priority, iRequestQueue );
+    CleanupStack::PushL( getThumbnailActive );
+    
+    getThumbnailActive->RenameThumbnails( aCurrentPath, aNewPath, priority );
+    
+    iRequestQueue->AddRequestL( getThumbnailActive );
+    CleanupStack::Pop( getThumbnailActive );
+    
+    iRequestQueue->Process();
+    
+    return iRequestId;
+    }
+
+// ---------------------------------------------------------------------------
 // CThumbnailManagerImpl::ValidatePriority()
 // Check that given priority is in range of CActive::TPriority 
 // ---------------------------------------------------------------------------
--- a/imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailrequestactive.cpp	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailrequestactive.cpp	Mon May 03 12:48:51 2010 +0300
@@ -163,6 +163,7 @@
         case EReqGetThumbnailHandleLater:
             {
             // open file handle
+            iFile.Close();
             User::LeaveIfError( iFile.Open( iFs, iTargetUri, EFileShareReadersOrWriters ) );  
             
             TN_DEBUG2( "CThumbnailRequestActive::StartL() - file handle opened for %S", &iTargetUri );
@@ -185,7 +186,12 @@
                 iSession.DeleteThumbnails( iParams.iThumbnailId, iParamsPckg, iStatus );
                 }
             break;
-            } 
+            }
+        case EReqRenameThumbnails:
+            {
+            iSession.RenameThumbnails( iParamsPckg, iStatus );
+            break;
+            }  
         default:
             {
             break;
@@ -219,9 +225,15 @@
     
     iTimer->Cancel();
     
-    if (iRequestType == EReqDeleteThumbnails || iCanceled)
+    if (iRequestType == EReqDeleteThumbnails || iCanceled ||
+        iRequestType == EReqRenameThumbnails)
         {
-        // no action for delete or canceled request
+        TN_DEBUG1( "CThumbnailRequestActive::RunL() - rename/delete/canceled" );
+    
+        iFile.Close();
+        iMyFileHandle.Close();
+    
+        // no action for delete/rename or canceled request
         iRequestQueue->RequestComplete(this);
         
 #ifdef _DEBUG
@@ -239,8 +251,8 @@
         
         // We tried to get thumbnail using file path, but it was not found in
         // the database. We need to open the file now (on the client side) and
-        // use file handle.
-        
+        // use file handle.     
+        iFile.Close();
         TInt err = iFile.Open( iFs, iParams.iFileName, EFileShareReadersOrWriters );
         TN_DEBUG2( "CThumbnaiRequestActive::RunL() - file handle open err = %d", err );
         User::LeaveIfError( err );
@@ -273,6 +285,10 @@
 	    iObserver.ThumbnailReady( iStatus.Int(), *iCallbackThumbnail, iParams.iRequestId );
 	  
 	    ReleaseServerBitmap();
+	    
+	    iFile.Close();
+	    iMyFileHandle.Close();
+	    
 	    iRequestQueue->RequestComplete(this);
 	    
         #ifdef _DEBUG
@@ -296,6 +312,8 @@
       
         ReleaseServerBitmap();
         
+        iFile.Close();
+        
         //set flags so that EThumbnailGeneratePersistentSizesOnly is done aka check all missing sizes 
         iParams.iQualityPreference = CThumbnailManager::EOptimizeForQuality;
         iParams.iControlFlags = EThumbnailGeneratePersistentSizesOnly;
@@ -350,12 +368,17 @@
         if ( iProcessingPreview )
             {
             TN_DEBUG2( "CThumbnailRequestActive::RunL() - iObserver.ThumbnailPreviewReady %d", iParams.iRequestId );
-			//increase priority of 2nd round (both, AO and request itself)
+			
+            //increase priority of 2nd round (both, AO and request itself)
             this->SetPriority(this->Priority() + 1);
             iParams.iPriority++;
             iObserver.ThumbnailPreviewReady( *iCallbackThumbnail, iParams.iRequestId );
             iProcessingPreview = EFalse;
+            
             ReleaseServerBitmap();
+            
+            iFile.Close();
+            
             Get2ndPhaseThumbnailL();
             }
         else
@@ -365,6 +388,9 @@
             iObserver.ThumbnailReady( iStatus.Int(), * iCallbackThumbnail, iParams.iRequestId );
             ReleaseServerBitmap();    
             
+            iFile.Close();
+            iMyFileHandle.Close();
+            
             iRequestQueue->RequestComplete(this);
             
 #ifdef _DEBUG
@@ -480,6 +506,9 @@
     
     ReleaseServerBitmap();
     
+    iFile.Close();
+    iMyFileHandle.Close();
+    
     iRequestCompleted = ETrue;
     iRequestQueue->RequestComplete(this);
     iRequestActive = EFalse;
@@ -726,6 +755,22 @@
     }
 
 // ---------------------------------------------------------------------------
+// CThumbnailRequestActive::RenameThumbnails()
+// Rename thumbnails.
+// ---------------------------------------------------------------------------
+//
+void CThumbnailRequestActive::RenameThumbnails( const TDesC& aCurrentPath, 
+        const TDesC& aNewPath, const TInt aPriority )
+    {
+    iRequestType = EReqRenameThumbnails;
+    
+    iParams.iRequestId = iRequestId;
+    iParams.iPriority = aPriority;
+    iParams.iFileName = aCurrentPath;
+    iParams.iTargetUri = aNewPath;
+    }
+
+// ---------------------------------------------------------------------------
 // Request 2nd phase thumbnail
 // ---------------------------------------------------------------------------
 //
@@ -798,8 +843,16 @@
     
     CThumbnailRequestActive* self = static_cast<CThumbnailRequestActive*>( aAny );
     
+    self->iTimer->Cancel();
+    
+    if (self->IsActive())
+        {
+        // hangs without this
+        TRequestStatus* statusPtr = &self->iStatus;
+        User::RequestComplete( statusPtr, KErrTimedOut );
+        }
+    
     self->Cancel();
-    self->iTimer->Cancel();
     
     if (self->iStartError != KErrNone)
         {
@@ -812,6 +865,8 @@
     
     self->HandleError();
     
+    TN_DEBUG1( "CThumbnailRequestActive::TimerCallBack() - end");
+    
     return KErrNone;
     }
 
--- a/imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailsession.cpp	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailsession.cpp	Mon May 03 12:48:51 2010 +0300
@@ -338,6 +338,18 @@
             
     SendReceive( EUpdateThumbnails, args, aStatus );  
     }
+
+// ---------------------------------------------------------------------------
+// Rename thumbnails.
+// ---------------------------------------------------------------------------
+//
+void RThumbnailSession::RenameThumbnails( TThumbnailRequestParamsPckg& aParams, 
+                                          TRequestStatus& aStatus )
+    {
+    TIpcArgs args( &aParams, KCheckValue);
+            
+    SendReceive( ERenameThumbnails, args, aStatus ); 
+    }
     
 
 // End of file
--- a/imagehandlingutilities/thumbnailmanager/thumbnailmanagerqt/inc/thumbnailmanager_p_qt.h	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/thumbnailmanagerqt/inc/thumbnailmanager_p_qt.h	Mon May 03 12:48:51 2010 +0300
@@ -19,19 +19,21 @@
 #define THUMBNAILMANAGER_P_QT_H
 
 #include <QObject>
+#include <QPixmap>
+
 #include <thumbnailmanager.h>
 #include <thumbnailmanager_qt.h>
 #include <thumbnailmanagerobserver.h>
-#include <qpixmap.h>
+
 
 class QString;
-class QPixmap;
 class QSize;
 class CThumbnailManager;
 class MThumbnailData;
 class CFbsBitmap;
 class QByteArray;
 
+class TestThumbnailManager;
 
 class ThumbnailManagerPrivate : 
 public QObject,
@@ -137,7 +139,7 @@
      * Change the priority of a queued thumbnail operation.
      */
     bool changePriority( int id, int newPriority );
-
+    
     //FROM  MThumbnailManagerObserver
     /**
      * Preview thumbnail generation or loading is complete.
@@ -185,20 +187,40 @@
      * Final thumbnail bitmap generation or loading is complete.
      */
     void thumbnailReady( QPixmap , void * , int , int );
-    
+
+    void thumbnailReady( QImage , void * , int , int );
+
+private:
+    /**
+     * Copy CFbsBitmap into a QImage.
+     */
+    QImage fromBitmap( CFbsBitmap* bitmap );
     
-private:
     /**
      * Copy CFbsBitmap into a QPixmap.
      */
-    QPixmap copyPixmap( CFbsBitmap* bitmap );
+    QPixmap fromImage( CFbsBitmap* bitmap );
     
+    /**
+     * Limit priority to presumed range.
+     */
+    int convertPriority(int basePriority);
+
+
+public:
+    
+    int connectionCounterImage;
+
+    int connectionCounterPixmap;
     
 private:
 
     CThumbnailManager* iThumbnailManager;
     
     QByteArray* byteArray;
+    
+    friend class TestThumbnailManager;
+    
 };
 
 #endif // ThumbnailManager_H
--- a/imagehandlingutilities/thumbnailmanager/thumbnailmanagerqt/src/thumbnailmanager_p_qt.cpp	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/thumbnailmanagerqt/src/thumbnailmanager_p_qt.cpp	Mon May 03 12:48:51 2010 +0300
@@ -16,7 +16,7 @@
 */
 
 #include <fbs.h>
-#include <qtcore>
+#include <QtCore>
 #include <qpixmap.h>
 #include <thumbnailmanager.h>
 #include <thumbnaildata.h>
@@ -24,7 +24,14 @@
 #include "thumbnailmanager_qt.h"
 #include "thumbnailmanager_p_qt.h"
 
-ThumbnailManagerPrivate::ThumbnailManagerPrivate() : iThumbnailManager( NULL ), byteArray( NULL )
+#include <e32base.h>
+
+const int ThumbnailMangerPriorityLowest = CActive::EPriorityIdle;
+const int ThumbnailMangerPriorityHighest = CActive::EPriorityHigh;
+
+ThumbnailManagerPrivate::ThumbnailManagerPrivate() : iThumbnailManager( NULL ), byteArray( NULL ),
+    connectionCounterImage( 0 ),
+    connectionCounterPixmap( 0 )
 {
     TRAP_IGNORE(
         iThumbnailManager = CThumbnailManager::NewL( *this );
@@ -103,6 +110,8 @@
 {
     int result( -1 );
     QString symbFileName( fileName );
+    
+    priority = convertPriority(priority);
 
     if( symbFileName.contains( "/" ) )
         symbFileName.replace( "/", "\\", Qt::CaseSensitive );
@@ -123,6 +132,9 @@
         int priority )
 {
     int result( -1 );
+    
+    priority = convertPriority(priority);
+    
     TRAP_IGNORE( result = iThumbnailManager->GetThumbnailL( aThumbnailId, clientData, priority ));
     return result;
 }    
@@ -133,6 +145,8 @@
     int result( -1 );
     RBuf file;
     _LIT( mime, "image/png" );
+    
+    priority = convertPriority(priority);
 
     if( !byteArray ){
         byteArray = new QByteArray();
@@ -169,6 +183,8 @@
     RBuf file;
     _LIT( mime, "image/png" );
 
+    priority = convertPriority(priority);
+    
     if( !byteArray ){
         byteArray = new QByteArray();
     }
@@ -228,21 +244,28 @@
 
 bool ThumbnailManagerPrivate::changePriority( int id, int newPriority )
 {
+    newPriority = convertPriority(newPriority);
+    
     return ( iThumbnailManager->ChangePriority( id, newPriority ) == KErrNone );
 }
 
-QPixmap ThumbnailManagerPrivate::copyPixmap( CFbsBitmap* bitmap )
+QImage ThumbnailManagerPrivate::fromBitmap( CFbsBitmap* bitmap )
 {
     TSize size = bitmap->SizeInPixels();
-    int bytesPerLine = bitmap->ScanLineLength( size.iWidth,
-            bitmap->DisplayMode() );
+    int bytesPerLine = bitmap->ScanLineLength( size.iWidth, bitmap->DisplayMode() );
     const uchar* dataPtr = ( const uchar* ) bitmap->DataAddress();
+    QImage image = QImage(dataPtr, size.iWidth, size.iHeight, bytesPerLine, QImage::Format_RGB16);
+    return image.copy();
+}
 
-    return QPixmap::fromImage( QImage(  dataPtr,
-                                        size.iWidth,
-                                        size.iHeight,
-                                        bytesPerLine,
-                                        QImage::Format_RGB16 ) );
+QPixmap ThumbnailManagerPrivate::fromImage( CFbsBitmap* bitmap )
+{
+    return QPixmap::fromImage(fromBitmap(bitmap));
+}
+
+int ThumbnailManagerPrivate::convertPriority(int basePriority)
+{
+    return qBound(ThumbnailMangerPriorityLowest, basePriority, ThumbnailMangerPriorityHighest);    
 }
 
 void ThumbnailManagerPrivate::ThumbnailPreviewReady( MThumbnailData& /*aThumbnail*/,
@@ -258,15 +281,23 @@
         byteArray = NULL;
     }
     
-    QPixmap* pixmap( NULL );
+    if (connectionCounterImage || connectionCounterPixmap) {
+        QImage image;
+
+        if (aError == KErrNone) {
+            image = fromBitmap(aThumbnail.Bitmap());
+        } else {
+            image = QImage(); 
+        }
 
-    if( aError == KErrNone ){
-        pixmap = new QPixmap( copyPixmap( aThumbnail.Bitmap() ) );
-    }else {
-        pixmap = new QPixmap();
+        if (connectionCounterImage) {
+            emit thumbnailReady(image, aThumbnail.ClientData(), aId, aError);
+        }
+        
+        if (connectionCounterPixmap) {
+            QPixmap pixmap = QPixmap::fromImage(image);
+            emit thumbnailReady(pixmap, aThumbnail.ClientData(), aId, aError);          
+        }
     }
-    
-    emit thumbnailReady( *pixmap, aThumbnail.ClientData(), aId, aError );
-    delete pixmap;
 }
 
--- a/imagehandlingutilities/thumbnailmanager/thumbnailmanagerqt/src/thumbnailmanager_qt.cpp	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/thumbnailmanagerqt/src/thumbnailmanager_qt.cpp	Mon May 03 12:48:51 2010 +0300
@@ -15,105 +15,126 @@
 *
 */
 
-#include <qsize.h>
+#include <QSize>
 #include "thumbnailmanager_qt.h"
 #include "thumbnailmanager_p_qt.h"
  
-EXPORT_C ThumbnailManager::ThumbnailManager( QObject* parentPtr ) :
+Q_DECL_EXPORT ThumbnailManager::ThumbnailManager( QObject* parentPtr ) :
 QObject( parentPtr ),
 d( new ThumbnailManagerPrivate() )
 {
     QObject::connect( d, SIGNAL( thumbnailReady( QPixmap , void * , int , int ) ),
             this, SIGNAL( thumbnailReady( QPixmap , void * , int , int ) ) );
+    QObject::connect( d, SIGNAL( thumbnailReady( QImage , void * , int , int ) ),
+            this, SIGNAL( thumbnailReady( QImage , void * , int , int ) ) );
 }
 
 
-EXPORT_C ThumbnailManager::~ThumbnailManager()
+Q_DECL_EXPORT ThumbnailManager::~ThumbnailManager()
 {
     QObject::disconnect( d, SIGNAL( thumbnailReady( QPixmap , void * , int , int ) ),
             this, SIGNAL( thumbnailReady( QPixmap , void * , int , int ) ) );
+    QObject::disconnect( d, SIGNAL( thumbnailReady( QImage , void * , int , int ) ),
+            this, SIGNAL( thumbnailReady( QImage , void * , int , int ) ) );
     if( NULL != d ){
         delete d;
     }
 }
 
-EXPORT_C ThumbnailManager::QualityPreference ThumbnailManager::qualityPreference() const
+Q_DECL_EXPORT ThumbnailManager::QualityPreference ThumbnailManager::qualityPreference() const
 {
     return d->qualityPreference();
 }
 
-EXPORT_C bool ThumbnailManager::setQualityPreference( QualityPreference
+Q_DECL_EXPORT bool ThumbnailManager::setQualityPreference( QualityPreference
     qualityPreference )
 {
     return d->setQualityPreference( qualityPreference );
 }
  
-EXPORT_C QSize ThumbnailManager::thumbnailSize() const
+Q_DECL_EXPORT QSize ThumbnailManager::thumbnailSize() const
 {
     return d->thumbnailSize();
 }
 
-EXPORT_C bool ThumbnailManager::setThumbnailSize( const QSize& thumbnailSize )
+Q_DECL_EXPORT bool ThumbnailManager::setThumbnailSize( const QSize& thumbnailSize )
 {
     return d->setThumbnailSize( thumbnailSize );
 }
 
-EXPORT_C bool ThumbnailManager::setThumbnailSize( ThumbnailSize thumbnailSize )
+Q_DECL_EXPORT bool ThumbnailManager::setThumbnailSize( ThumbnailSize thumbnailSize )
 {
     return d->setThumbnailSize( thumbnailSize );
 }
 
-EXPORT_C ThumbnailManager::ThumbnailMode ThumbnailManager::mode() const
+Q_DECL_EXPORT ThumbnailManager::ThumbnailMode ThumbnailManager::mode() const
 {
     return d->mode();
 }
 
-EXPORT_C bool ThumbnailManager::setMode( ThumbnailMode mode )
+Q_DECL_EXPORT bool ThumbnailManager::setMode( ThumbnailMode mode )
 {
     return d->setMode( mode );
 }
 
-EXPORT_C int ThumbnailManager::getThumbnail( const QString& fileName, void * clientData, 
+Q_DECL_EXPORT int ThumbnailManager::getThumbnail( const QString& fileName, void * clientData, 
         int priority )
 {
     return d->getThumbnail( fileName, clientData, priority );
 }
 
-EXPORT_C int ThumbnailManager::getThumbnail( unsigned long int thumbnailId, void * clientData, 
+Q_DECL_EXPORT int ThumbnailManager::getThumbnail( unsigned long int thumbnailId, void * clientData, 
         int priority )
 {
     return d->getThumbnail( thumbnailId, clientData, priority );
 }    
 
-EXPORT_C int ThumbnailManager::setThumbnail( const QPixmap& source, const QString& filename,
+Q_DECL_EXPORT int ThumbnailManager::setThumbnail( const QPixmap& source, const QString& filename,
         void * clientData , int priority )
 {
     return d->setThumbnail( source, filename, clientData, priority );
 }
 
-EXPORT_C int ThumbnailManager::setThumbnail( const QImage& source, const QString& filename,
+Q_DECL_EXPORT int ThumbnailManager::setThumbnail( const QImage& source, const QString& filename,
         void * clientData , int priority )
 {
     return d->setThumbnail( source, filename, clientData, priority );
 }
 
-EXPORT_C void ThumbnailManager::deleteThumbnails( const QString& fileName )
+Q_DECL_EXPORT void ThumbnailManager::deleteThumbnails( const QString& fileName )
 {
     d->deleteThumbnails( fileName );
 }
 
-EXPORT_C void ThumbnailManager::deleteThumbnails( unsigned long int thumbnailId )
+Q_DECL_EXPORT void ThumbnailManager::deleteThumbnails( unsigned long int thumbnailId )
 {
     d->deleteThumbnails( thumbnailId );
 }
 
-EXPORT_C bool ThumbnailManager::cancelRequest( int id )
+Q_DECL_EXPORT bool ThumbnailManager::cancelRequest( int id )
 {
     return d->cancelRequest( id );
 }
 
-EXPORT_C bool ThumbnailManager::changePriority( int id, int newPriority )
+Q_DECL_EXPORT bool ThumbnailManager::changePriority( int id, int newPriority )
 {
     return d->changePriority( id, newPriority );
 }
 
+void ThumbnailManager::connectNotify(const char *signal)
+{
+    if (QLatin1String(signal) == SIGNAL(thumbnailReady(QPixmap,void*,int,int))) {
+        d->connectionCounterPixmap++;
+    } else if (QLatin1String(signal) == SIGNAL(thumbnailReady(QImage,void*,int,int))) {
+        d->connectionCounterImage++;
+    }
+}
+
+void ThumbnailManager::disconnectNotify(const char *signal)
+{   
+    if (QLatin1String(signal) == SIGNAL(thumbnailReady(QPixmap,void*,int,int))) {
+        d->connectionCounterPixmap--;
+    } else if (QLatin1String(signal) == SIGNAL(thumbnailReady(QImage,void*,int,int))) {
+        d->connectionCounterImage--;
+    }
+}
--- a/imagehandlingutilities/thumbnailmanager/thumbnailmanagerqt/thumbnailmanagerqt.pro	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/thumbnailmanagerqt/thumbnailmanagerqt.pro	Mon May 03 12:48:51 2010 +0300
@@ -20,6 +20,7 @@
 
 symbian:TARGET.UID3=0x20029F65
 
+DEFINES+=TNMQT_DLL
 
 INCLUDEPATH += .
 INCLUDEPATH += $$MW_LAYER_SYSTEMINCLUDE
--- a/imagehandlingutilities/thumbnailmanager/thumbnailmanagerqt/tsrc/test_qtnmwrapper.cpp	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/thumbnailmanagerqt/tsrc/test_qtnmwrapper.cpp	Mon May 03 12:48:51 2010 +0300
@@ -39,10 +39,21 @@
 
     void thumbnailReady_p( QPixmap , void * , int , int );
 
+    void thumbnailReadyPixmap( QPixmap , void * , int , int );
+
+    void thumbnailReadyImage( QImage , void * , int , int );
+
 private slots:
-    void initTestCase();
-    void cleanupTestCase();
+    void init();
+    void cleanup();
+
+    void testThumbnailReadyError();
+    void testThumbnailReadyValid();
     
+    void testThumbnailReadyImage();
+    void testThumbnailReadyPixmap();
+    void testThumbnailReadyImageAndPixmap();
+
     void createAndDestroy();
     void qualityPreference();
     void thumbnailSize();
@@ -56,17 +67,30 @@
     void deleteThumbnailsByName();
     void deleteThumbnailsById();
 
-    void testThumbnailReadyError();
-    void testThumbnailReadyValid();
+    void testPriorities_data();
+    void testPriorities();
+
 
 public:
-    ThumbnailManager* wrapper;
+    ThumbnailManager *wrapper;
+    ThumbnailManagerPrivate *wrapper_p;
+    
     QPixmap* ipixmap;
     
     int aid; 
     int aerrorCode;
     bool pixmapNull;
     
+    //pixmap
+    int pixmapId;
+    int pixmapErr;
+    void *pixmapDataPtr;
+    
+    //image
+    int imageId;
+    int imageErr;
+    void *imageDataPtr;
+    
 };
 
 enum testDataType{
@@ -77,7 +101,11 @@
 class TestThumbnailData : public MThumbnailData
 {
 public:
-    TestThumbnailData( testDataType type) : bitmap(0), clientData(0)
+    static const int BITMAP_WIDTH = 26;
+    static const int BITMAP_HEIGHT = 15;
+    
+public:
+    TestThumbnailData( testDataType type, void* clientData_ = 0) : bitmap(0), clientData(clientData_)
     {
         switch( type ){
         case AllNull:
@@ -85,7 +113,7 @@
 
         case BitmapValid:
             bitmap = new CFbsBitmap();
-            QVERIFY( !bitmap->Create(TSize(26,15),EColor64K) );
+            QVERIFY( !bitmap->Create(TSize(BITMAP_WIDTH, BITMAP_HEIGHT),EColor64K) );
             QVERIFY( !bitmap->Load( _L("c:\\tnmwrapper_tsrc.mbm") ) );
         break;
         };
@@ -93,10 +121,9 @@
     };
 
     ~TestThumbnailData() { 
-        if( bitmap )
-            delete bitmap; 
-        if( clientData )
-            delete clientData; 
+        if( bitmap ) {
+            delete bitmap;
+        }
     };
     
     CFbsBitmap* Bitmap() {return bitmap;};
@@ -111,34 +138,45 @@
 
 };
 
+// --- test initialization ---
 
-// ======== MEMBER FUNCTIONS ========
-void TestThumbnailManager::initTestCase()
+void TestThumbnailManager::init()
 {
     wrapper = new ThumbnailManager();
     connect( wrapper, SIGNAL(thumbnailReady( QPixmap , void* , int, int ) ),
             this, SLOT( thumbnailReady( QPixmap , void* , int , int )));
+    
+    wrapper_p = new ThumbnailManagerPrivate();
 }
     
-void TestThumbnailManager::cleanupTestCase()
+void TestThumbnailManager::cleanup()
 {
     disconnect( wrapper, SIGNAL(thumbnailReady( QPixmap , void* , int, int ) ),
             this, SLOT( thumbnailReady( QPixmap , void* , int , int )));
     delete wrapper;
     wrapper = NULL;
 
-    if( ipixmap ){
+    if( ipixmap ) {
         delete ipixmap;
         ipixmap = NULL;
         }
+ 
+    delete wrapper_p;
 }
 
+// --- test ---
 
+/**
+ * Simple create and destroy.
+ */
 void TestThumbnailManager::createAndDestroy()
 {
     //empty
 }
 
+/**
+ * Checking quality preference flag.
+ */
 void TestThumbnailManager::qualityPreference()
 {
     QVERIFY( wrapper->setQualityPreference( ThumbnailManager::OptimizeForQuality ) );
@@ -146,6 +184,9 @@
     QVERIFY( wrapper->qualityPreference() == ThumbnailManager::OptimizeForPerformance );
 }
 
+/**
+ * Checking thumbnail size flag.
+ */
 void TestThumbnailManager::thumbnailSize()
 {
     QVERIFY( wrapper->setThumbnailSize( ThumbnailManager::ThumbnailSmall ) );
@@ -155,6 +196,9 @@
     QVERIFY( wrapper->thumbnailSize() == QSize( 100, 100 ) );
 }
 
+/**
+ * Checking thumbnail mode flag.
+ */
 void TestThumbnailManager::thumbnailMode()
 {
     QVERIFY( wrapper->setMode( ThumbnailManager::Default ) );
@@ -165,6 +209,9 @@
     QVERIFY( wrapper->mode() == ThumbnailManager::CropToAspectRatio );
 }
 
+/**
+ * Checking thumbnail mode flag.
+ */
 void TestThumbnailManager::getThumbnailByName()
 {
     wrapper->setMode( ThumbnailManager::CropToAspectRatio );
@@ -224,21 +271,9 @@
     wrapper->deleteThumbnails( 2 );
 }
 
-void TestThumbnailManager::thumbnailReady( QPixmap /*pixmap*/, void * /*clientData*/, int /*id*/, int /*errorCode*/ )
-{
-    //do nothing, we dont test Thumbnail Manager's functionality, we just use it
-}
-
-void TestThumbnailManager::thumbnailReady_p( QPixmap pixmap, void * /*clientData*/, int id, int errorCode )
-{
-    QVERIFY( pixmap.isNull() == pixmapNull );
-    QVERIFY( errorCode == aerrorCode );
-    QVERIFY( aid == id );
-}
-
 void TestThumbnailManager::testThumbnailReadyError()
 {
-    ThumbnailManagerPrivate* wrapper_p = new ThumbnailManagerPrivate();
+    int a=0;
 
     QVERIFY( connect( wrapper_p, SIGNAL(thumbnailReady( QPixmap , void* , int, int ) ),
         this, SLOT( thumbnailReady_p( QPixmap , void* , int , int )), Qt::DirectConnection ) );
@@ -252,13 +287,10 @@
     
     disconnect( wrapper_p, SIGNAL(thumbnailReady( QPixmap , void* , int, int ) ),
         this, SLOT( thumbnailReady_p( QPixmap , void* , int , int )));
-    delete wrapper_p;
 }
 
 void TestThumbnailManager::testThumbnailReadyValid()
 {
-    ThumbnailManagerPrivate* wrapper_p = new ThumbnailManagerPrivate();
-
     QVERIFY( connect( wrapper_p, SIGNAL(thumbnailReady( QPixmap , void* , int, int ) ),
         this, SLOT( thumbnailReady_p( QPixmap , void* , int , int )), Qt::DirectConnection ) );
 
@@ -270,7 +302,147 @@
 
     disconnect( wrapper_p, SIGNAL(thumbnailReady( QPixmap , void* , int, int ) ),
         this, SLOT( thumbnailReady_p( QPixmap , void* , int , int )));
-    delete wrapper_p;
+}
+
+void TestThumbnailManager::testThumbnailReadyImage()
+{
+    QVERIFY( connect( wrapper_p, SIGNAL(thumbnailReady( QImage , void* , int, int ) ),
+        this, SLOT( thumbnailReadyImage( QImage , void* , int , int )), Qt::DirectConnection ) );
+
+    pixmapId = 0;
+    pixmapErr = 0;
+    pixmapDataPtr = 0;
+
+    imageId = 432;
+    imageErr = KErrNone;
+    imageDataPtr = reinterpret_cast<void*>(0x1234);
+    
+    TestThumbnailData td = TestThumbnailData(BitmapValid);
+    td.clientData = imageDataPtr;
+
+    wrapper_p->ThumbnailReady(imageErr, td, imageId);
+    
+    QVERIFY(td.bitmap!=0);
+    QVERIFY(td.bitmap->SizeInPixels().iWidth == TestThumbnailData::BITMAP_WIDTH);
+    QVERIFY(td.bitmap->SizeInPixels().iHeight == TestThumbnailData::BITMAP_HEIGHT);
+
+    disconnect( wrapper_p, SIGNAL(thumbnailReady( QImage , void* , int, int ) ),
+        this, SLOT( thumbnailReadyImage(QImage, void* , int , int )));
+    
+}
+
+void TestThumbnailManager::testThumbnailReadyPixmap()
+{
+    QVERIFY( connect( wrapper_p, SIGNAL(thumbnailReady( QPixmap , void* , int, int ) ),
+        this, SLOT( thumbnailReadyPixmap( QPixmap , void* , int , int )), Qt::DirectConnection ) );
+
+    pixmapId = 432;
+    pixmapErr = -7;
+    pixmapDataPtr = reinterpret_cast<void*>(0x1234);
+
+    imageId = 0;
+    imageErr = 0;
+    imageDataPtr = 0;
+
+    TestThumbnailData td = TestThumbnailData(BitmapValid);
+    td.clientData = pixmapDataPtr;
+
+    wrapper_p->ThumbnailReady(pixmapErr, td, pixmapId);
+    
+    QVERIFY(td.bitmap!=0);
+    QVERIFY(td.bitmap->SizeInPixels().iWidth == TestThumbnailData::BITMAP_WIDTH);
+    QVERIFY(td.bitmap->SizeInPixels().iHeight == TestThumbnailData::BITMAP_HEIGHT);
+
+    disconnect( wrapper_p, SIGNAL(thumbnailReady( QPixmap , void* , int, int ) ),
+        this, SLOT( thumbnailReadyPixmap( QPixmap , void* , int , int )));
+
+}
+
+void TestThumbnailManager::testThumbnailReadyImageAndPixmap()
+{
+    QVERIFY( connect( wrapper_p, SIGNAL(thumbnailReady( QPixmap , void* , int, int ) ),
+        this, SLOT( thumbnailReadyPixmap( QPixmap , void* , int , int )), Qt::DirectConnection ) );
+
+    QVERIFY( connect( wrapper_p, SIGNAL(thumbnailReady( QImage , void* , int, int ) ),
+        this, SLOT( thumbnailReadyImage( QImage , void* , int , int )), Qt::DirectConnection ) );
+
+    pixmapId = 432;
+    pixmapErr = KErrNone;
+    pixmapDataPtr = reinterpret_cast<void*>(0x1234);
+
+    imageId = pixmapId;
+    imageErr = pixmapErr;
+    imageDataPtr = pixmapDataPtr;
+
+    TestThumbnailData td = TestThumbnailData(BitmapValid);
+    td.clientData = pixmapDataPtr;
+
+    wrapper_p->ThumbnailReady(pixmapErr, td, pixmapId);
+
+    QVERIFY(td.bitmap!=0);
+    QVERIFY(td.bitmap->SizeInPixels().iWidth == TestThumbnailData::BITMAP_WIDTH);
+    QVERIFY(td.bitmap->SizeInPixels().iHeight == TestThumbnailData::BITMAP_HEIGHT);
+
+    disconnect( wrapper_p, SIGNAL(thumbnailReady( QImage , void* , int, int ) ),
+        this, SLOT( thumbnailReadyImage( QImage , void* , int , int )));
+
+    disconnect( wrapper_p, SIGNAL(thumbnailReady( QPixmap , void* , int, int ) ),
+        this, SLOT( thumbnailReadyPixmap( QPixmap , void* , int , int )));
+    
+}
+
+void TestThumbnailManager::testPriorities_data()
+{
+    // note: current bounds for priorites are [-100:20] (from: CActive::TPriority)
+    
+    QTest::addColumn<int>("priority");
+    QTest::addColumn<int>("expectedPriority");
+    QTest::newRow("priority 0") << 0 << 0;
+    QTest::newRow("priority 10") << 10 << 10;
+    QTest::newRow("priority 20") << 20 << 20;
+    QTest::newRow("priority 100") << 100 << 20;
+    QTest::newRow("priority 200") << 200 << 20;
+    QTest::newRow("priority -10") << -10 << -10;
+    QTest::newRow("priority -100") << -100 << -100;
+    QTest::newRow("priority -200") << -200 << -100;
+}
+
+void TestThumbnailManager::testPriorities()
+{
+    QFETCH(int, priority);
+    QFETCH(int, expectedPriority);
+    QCOMPARE(wrapper_p->convertPriority(priority), expectedPriority);
+}
+ 
+
+// --- private slots - callback  ---
+
+void TestThumbnailManager::thumbnailReady( QPixmap /*pixmap*/, void * /*clientData*/, int /*id*/, int /*errorCode*/ )
+{
+    //do nothing, we dont test Thumbnail Manager's functionality, we just use it
+}
+
+void TestThumbnailManager::thumbnailReady_p( QPixmap pixmap, void * /*clientData*/, int id, int errorCode )
+{
+    QVERIFY( pixmap.isNull() == pixmapNull );
+    QVERIFY( errorCode == aerrorCode );
+    QVERIFY( id == aid );
+}
+
+void TestThumbnailManager::thumbnailReadyPixmap( QPixmap pixmap, void *clientData, int id, int errorCode )
+{
+    Q_UNUSED( pixmap );
+    QVERIFY( errorCode == pixmapErr );
+    QVERIFY( id == pixmapId );
+    QVERIFY( clientData = pixmapDataPtr );
+}
+
+void TestThumbnailManager::thumbnailReadyImage( QImage image, void *clientData, int id, int errorCode )
+{
+    Q_UNUSED( image );
+    QVERIFY( errorCode == imageErr );
+    QVERIFY( id == imageId );
+    QVERIFY( clientData = imageDataPtr );
 }
 
 #ifdef _LOG_TO_C_
--- a/imagehandlingutilities/thumbnailmanager/thumbnailserver/group/thumbnailserver.mmp	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/group/thumbnailserver.mmp	Mon May 03 12:48:51 2010 +0300
@@ -33,10 +33,11 @@
 EPOCHEAPSIZE            4096 0x3000000 // max heap 48MB
 #endif
 
-
 CAPABILITY              ALL -TCB -DRM
 VENDORID                VID_DEFAULT
 
+EPOCPROCESSPRIORITY background
+
 SOURCEPATH              ../src
 SOURCE                  thumbnailserver.cpp
 SOURCE                  thumbnailserversession.cpp
@@ -50,6 +51,7 @@
 SOURCE                  thumbnailcenrep.cpp 
 SOURCE                  thumbnailmemorycardobserver.cpp 
 SOURCE		        thumbnaildecodetask.cpp
+SOURCE                  thumbnailfetchedchecker.cpp
 #ifdef RD_MDS_2_5
 SOURCE			thumbnailmdsquerytask.cpp
 #endif // RD_MDS_2_5
@@ -90,7 +92,7 @@
 
 DEBUGLIBRARY            flogger.lib
 
-BYTEPAIRCOMPRESSTARGET
-EPOCPROCESSPRIORITY background
+OPTION ARMCC -O3 -OTime
 
 UNPAGED
+BYTEPAIRCOMPRESSTARGET
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailfetchedchecker.h	Mon May 03 12:48:51 2010 +0300
@@ -0,0 +1,51 @@
+/*
+* Copyright (c) 2006-2007 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 THUMBNAILFETCHEDCHECKER_H
+#define THUMBNAILFETCHEDCHECKER_H
+
+#include <e32base.h>
+
+NONSHARABLE_CLASS( CThumbnailFetchedChecker ): public CBase
+    {
+public:
+    static CThumbnailFetchedChecker* NewL();
+    virtual ~CThumbnailFetchedChecker();
+public:
+    TInt LastFetchResult( const TDesC& aUri );
+    void SetFetchResult( const TDesC& aUri, TInt aError );
+    void Reset();
+private:
+    CThumbnailFetchedChecker();
+    
+    NONSHARABLE_CLASS( CEntry ) : public CBase
+        {
+    public:
+        static CEntry* NewL( const TDesC& aUri, TInt aError );
+        static TInt FindCB( const TDesC* aUri, const CEntry& aEntry );
+        static TInt InsertCB( const CEntry& aEntry1, const CEntry& aEntry2 );
+        CEntry();
+        virtual ~CEntry();
+    public:
+        HBufC* iUri;
+        TInt iError;
+        };
+
+private:
+    RPointerArray< CEntry > iNotFetched;
+};
+
+#endif // THUMBNAILFETCHEDCHECKER_H
--- a/imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailserver.h	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailserver.h	Mon May 03 12:48:51 2010 +0300
@@ -45,6 +45,7 @@
 class CThumbnailServerSession;
 class CThumbnailDiskUnmountObserver;
 class CThumbnailMemoryCardObserver;
+class CThumbnailFetchedChecker;
 
 /**
  * Helper function to destroy all objects which are referred to
@@ -373,6 +374,15 @@
     TBool UpdateThumbnailsL( const TDesC& aPath,
                              const TInt aOrientation, const TInt64 aModified );
     
+    /**
+     * Rename thumbnails.
+     *
+     * @since S60 v5.0
+     * @param aCurrentPath     Current path of the Thumbnail
+     * @param aNewPath         New path for the Thumbnail
+     */
+    void RenameThumbnailsL( const TDesC& aCurrentPath, const TDesC& aNewPath );
+    
     /** 
      * Resolve mime type from file extension
      *
@@ -451,6 +461,7 @@
     
     TBool IsFormatting();
   
+    inline CThumbnailFetchedChecker& FetchedChecker() const { return *iFetchedChecker; }
 protected: // Functions from base classes
 
     /**
@@ -674,6 +685,11 @@
 #ifdef _DEBUG
     TUint32 iPlaceholderCounter;
 #endif
+    /**
+     * Fetched checker.
+     * Own.
+     */
+    CThumbnailFetchedChecker* iFetchedChecker;
 };
 
 #endif // THUMBNAILSERVER_H
--- a/imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailserversession.h	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailserversession.h	Mon May 03 12:48:51 2010 +0300
@@ -254,6 +254,14 @@
     void UpdateThumbnailsL( const RMessage2& aMessage );
     
     /**
+     * Rename thumbnails.
+     * 
+     * @since S60 v5.0
+     * @param aMessage Message.
+     */
+    void RenameThumbnailsL( const RMessage2& aMessage );
+    
+    /**
      * Checks if client thread is still alive and RMessage2 handle valid.
      *
      * @since S60 v5.0
--- a/imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailsql.h	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailsql.h	Mon May 03 12:48:51 2010 +0300
@@ -94,6 +94,7 @@
 _LIT( KThumbnailSqlParamData, ":Data" );
 _LIT( KThumbnailSqlParamFlags, ":Flags" );
 _LIT( KThumbnailSqlParamPath, ":Path" );
+_LIT( KThumbnailSqlParamNewPath, ":NewPath" );
 _LIT( KThumbnailSqlParamWidth, ":Width" );
 _LIT( KThumbnailSqlParamHeight, ":Height" );
 _LIT( KThumbnailSqlParamOriginalWidth, ":OrigWidth" );
@@ -199,6 +200,10 @@
         "WHERE NOT EXISTS (SELECT Path FROM ThumbnailInfo "
         "WHERE ThumbnailDeleted.Path = ThumbnailInfo.Path);" );
 
+// rename thumb
+_LIT8( KThumbnailRename, "UPDATE ThumbnailInfo SET Path = :NewPath WHERE Path = :Path;" );
+_LIT8( KThumbnailTempRename, "UPDATE TempThumbnailInfo SET Path = :NewPath WHERE Path = :Path;" );
+
 // reset blacklisted
 _LIT8( KThumbnailTouchBlacklistedRows, "UPDATE ThumbnailInfo SET Modified = 0 WHERE Flags & :Flag" );
 
--- a/imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailstore.h	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailstore.h	Mon May 03 12:48:51 2010 +0300
@@ -40,7 +40,7 @@
     {
     enum TState
         {
-        EOpen, EError, EClosed
+        EOpen, EOldOpen, EError, EClosed
     };
 public:
     RThumbnailTransaction( RSqlDatabase& aDatabase );
@@ -273,6 +273,15 @@
                             TBool aTransaction = ETrue);
     
     /**
+     * Rename thumbnails.
+     *
+     * @since S60 v5.0
+     * @param aCurrentPath     Current path of the Thumbnail
+     * @param aNewPath         New path for the Thumbnail
+     */
+    void RenameThumbnailsL( const TDesC& aCurrentPath, const TDesC& aNewPath );    
+    
+    /**
      * Persistent sizes.
      *
      * @since S60 v5.0
@@ -325,7 +334,7 @@
      *
      * @since S60 v5.0
      */
-    TInt UpdateImeiL();
+    void UpdateImeiL();
     
     /**
      * Checks that database rowids match.
@@ -625,6 +634,18 @@
     RSqlStatement iStmt_KThumbnailSqlDeleteInfoByRowID;
     RSqlStatement iStmt_KThumbnailSqlDeleteInfoDataByRowID;
     RSqlStatement iStmt_KThumbnailSelectAllPaths;
+    RSqlStatement iStmt_KThumbnailRename;
+    RSqlStatement iStmt_KThumbnailTempRename;
+    
+    /**
+     * Dynamic batch size
+     */
+    TInt iBatchFlushItemCount;
+
+    /**
+     * Measure time spend in flush
+     */
+    TTime iStartFlush, iStopFlush;
 
 };
 // End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailfetchedchecker.cpp	Mon May 03 12:48:51 2010 +0300
@@ -0,0 +1,175 @@
+/*
+* Copyright (c) 2006-2007 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:
+ *
+*/
+
+#include "thumbnailfetchedchecker.h"
+
+const int KMaxStoredEntries = 100;
+
+// -----------------------------------------------------------------------------
+// CThumbnailFetchedChecker::CThumbnailFetchedChecker()
+// -----------------------------------------------------------------------------
+//
+CThumbnailFetchedChecker* CThumbnailFetchedChecker::NewL()
+    {
+    return new (ELeave) CThumbnailFetchedChecker();
+    }
+
+// -----------------------------------------------------------------------------
+// CThumbnailFetchedChecker::CThumbnailFetchedChecker()
+// -----------------------------------------------------------------------------
+//
+CThumbnailFetchedChecker::CThumbnailFetchedChecker()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CThumbnailFetchedChecker::~CThumbnailFetchedChecker()
+// -----------------------------------------------------------------------------
+//
+CThumbnailFetchedChecker::~CThumbnailFetchedChecker()
+    {
+    iNotFetched.ResetAndDestroy();
+    }
+
+// -----------------------------------------------------------------------------
+// CThumbnailFetchedChecker::LastFetchResult()
+// -----------------------------------------------------------------------------
+//
+TInt CThumbnailFetchedChecker::LastFetchResult( const TDesC& aUri )
+    {
+    TInt i = iNotFetched.FindInOrder( aUri, CEntry::FindCB );
+    if ( i >= 0 && i < iNotFetched.Count() )
+        {
+        return iNotFetched[ i ]->iError;
+        }
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CThumbnailFetchedChecker::SetFetchResult()
+// -----------------------------------------------------------------------------
+//
+void CThumbnailFetchedChecker::SetFetchResult( const TDesC& aUri, TInt aError )
+    {
+    if ( aError == KErrNone )
+        {
+        // Do not store successful results
+        TInt i = iNotFetched.FindInOrder( aUri, CEntry::FindCB );
+        if ( i >= 0 && i < iNotFetched.Count() )
+            {
+            delete iNotFetched[ i ];
+            iNotFetched.Remove( i );
+            }
+        }
+    else
+        {
+        // Add or update
+        CEntry* entry = NULL;
+        TRAPD( err, entry = CEntry::NewL( aUri, aError ) );
+        if ( !err && entry )
+            {
+            err = iNotFetched.Find( entry );
+            if ( err != KErrNotFound )
+                {
+                TInt i = iNotFetched.FindInOrder( aUri, CEntry::FindCB );
+                if ( i >= 0 && i < iNotFetched.Count() )
+                    {
+                    iNotFetched[ i ]->iError = aError;
+                    }
+                }
+            else 
+                {
+                if( iNotFetched.Count() < KMaxStoredEntries )
+                    {
+                    TInt err = iNotFetched.InsertInOrder( entry, CEntry::InsertCB );
+                    if ( err != KErrNone )
+                        {
+                        delete entry;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CThumbnailFetchedChecker::Reset()
+// -----------------------------------------------------------------------------
+//
+void CThumbnailFetchedChecker::Reset()
+    {
+    iNotFetched.ResetAndDestroy();
+    }
+
+// -----------------------------------------------------------------------------
+// CThumbnailFetchedChecker::CEntry::New()
+// -----------------------------------------------------------------------------
+//
+CThumbnailFetchedChecker::CEntry* CThumbnailFetchedChecker::CEntry::NewL(
+        const TDesC& aUri, TInt aError )
+    {
+    CEntry* self  = new (ELeave) CEntry();
+    if ( self )
+        {
+        self->iUri = aUri.Alloc();
+        self->iError = aError;
+        if ( !self->iUri )
+            {
+            delete self;
+            self = NULL;
+            }
+        }
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CThumbnailFetchedChecker::CEntry::FindCB()
+// -----------------------------------------------------------------------------
+//
+TInt CThumbnailFetchedChecker::CEntry::FindCB(
+    const TDesC* aUri, const CThumbnailFetchedChecker::CEntry& aEntry )
+    {
+    return aUri->CompareF( *( aEntry.iUri ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CThumbnailFetchedChecker::CEntry::InsertCB()
+// -----------------------------------------------------------------------------
+//
+TInt CThumbnailFetchedChecker::CEntry::InsertCB(
+        const CThumbnailFetchedChecker::CEntry& aEntry1,
+        const CThumbnailFetchedChecker::CEntry& aEntry2 )
+    {
+    return aEntry1.iUri->CompareF( *( aEntry2.iUri ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CThumbnailFetchedChecker::CEntry::CEntry()
+// -----------------------------------------------------------------------------
+//
+CThumbnailFetchedChecker::CEntry::CEntry()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CThumbnailFetchedChecker::CEntry::~CEntry()
+// -----------------------------------------------------------------------------
+//
+CThumbnailFetchedChecker::CEntry::~CEntry()
+    {
+    delete iUri;
+    }
--- a/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserver.cpp	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserver.cpp	Mon May 03 12:48:51 2010 +0300
@@ -36,6 +36,7 @@
 #include "thumbnailcenrep.h"
 #include "thumbnailmemorycardobserver.h"
 #include "tmgetimei.h"
+#include "thumbnailfetchedchecker.h"
 
 
 _LIT8( KThumbnailMimeWildCard, "*" );
@@ -73,7 +74,7 @@
     ERequestThumbByBufferAsync,
     ERequestSetThumbnailByBuffer,
     EDeleteThumbnailsById,
-    EReserved1,
+    ERenameThumbnails,
     EUpdateThumbnails,
     ERequestSetThumbnailByBitmap,
     EThumbnailServerRequestCount,
@@ -96,7 +97,7 @@
     CPolicyServer::ECustomCheck,    // ERequestThumbByBufferAsync
     CPolicyServer::ECustomCheck,    // ERequestSetThumbnailByBuffer
     CPolicyServer::ECustomCheck,    // EDeleteThumbnailsById
-    CPolicyServer::ECustomCheck,    
+    CPolicyServer::ECustomCheck,    // ERenameThumbnails
     CPolicyServer::ECustomCheck,    // EUpdateThumbnails
     CPolicyServer::ECustomCheck,    // ERequestSetThumbnailByBitmap
     CPolicyServer::ECustomCheck,    // EThumbnailServerRequestCount
@@ -142,7 +143,8 @@
         case EGetMimeTypeList:
         case ERequestSetThumbnailByBuffer:
         case EDeleteThumbnailsById:
-        case EUpdateThumbnails:   
+        case EUpdateThumbnails:
+        case ERenameThumbnails:    
         case ERequestSetThumbnailByBitmap:
             {
             if( aMsg.HasCapability( ECapabilityReadDeviceData ) && 
@@ -152,8 +154,6 @@
                 }
             break;
             }
-
-        case EReserved1:
         case EThumbnailServerRequestCount:
         default:
             {
@@ -254,6 +254,7 @@
     //OpenStoresL();
     
     AddUnmountObserversL();
+    iFetchedChecker = CThumbnailFetchedChecker::NewL();
     }
 
 
@@ -267,6 +268,7 @@
 
     iShutdown = ETrue;
     
+    delete iFetchedChecker;
     delete iShutdownObserver;
     delete iProcessor;
     
@@ -536,6 +538,10 @@
         {
         TN_DEBUG1( "CThumbnailServer::StoreThumbnailL() - file doesn't exists anymore, skip store!");
         }
+    if( iFetchedChecker )    
+        {
+        iFetchedChecker->SetFetchResult( aPath, KErrNone );
+        }
     }
 
 
@@ -547,8 +553,23 @@
     aThumbnail, TDesC8* & aData, const TThumbnailSize aThumbnailSize, TSize &aOriginalSize )
     {
     TN_DEBUG3( "CThumbnailServer::FetchThumbnailL(aPath=%S aThumbnailSize=%d)", &aPath, aThumbnailSize );
-
-    StoreForPathL( aPath )->FetchThumbnailL( aPath, aThumbnail, aData, aThumbnailSize, aOriginalSize);
+    if( iFetchedChecker )
+        {
+        TInt err( iFetchedChecker->LastFetchResult( aPath ) );
+        if ( err == KErrNone ) // To avoid useless sql gets that fails for sure
+            {
+            TRAP( err, StoreForPathL( aPath )->FetchThumbnailL( aPath, aThumbnail, aData, aThumbnailSize, aOriginalSize) );
+            if ( err != KErrNone )
+                {
+                iFetchedChecker->SetFetchResult( aPath, err );
+                }
+            }
+        User::LeaveIfError( err );
+        }
+    else
+        {
+        StoreForPathL( aPath )->FetchThumbnailL( aPath, aThumbnail, aData, aThumbnailSize, aOriginalSize);
+        }
     }
 
 
@@ -600,6 +621,11 @@
     TN_DEBUG2( "CThumbnailServer::DeleteThumbnailsL(%S)", &aPath);
     
     StoreForPathL( aPath )->DeleteThumbnailsL( aPath );
+    
+    if( iFetchedChecker ) 
+        {
+        iFetchedChecker->SetFetchResult( aPath, KErrNone );
+        }
     }
 
 // -----------------------------------------------------------------------------
@@ -911,16 +937,14 @@
 // CThumbnailStore::PersistentSizeL()
 // ---------------------------------------------------------------------------
 //
-TThumbnailPersistentSize & CThumbnailServer::PersistentSizeL( TThumbnailSize
-        aThumbnailSize )
+TThumbnailPersistentSize & CThumbnailServer::PersistentSizeL( TThumbnailSize aThumbnailSize )
     {
     if ( !iCenrep )
-           {
-           iCenrep = CThumbnailCenRep::NewL();
-           }
+       {
+       iCenrep = CThumbnailCenRep::NewL();
+       }
     
-    return iCenrep->PersistentSizeL( aThumbnailSize );
-    
+    return iCenrep->PersistentSizeL( aThumbnailSize ); 
     }
 
 // -----------------------------------------------------------------------------
@@ -1175,6 +1199,11 @@
             // delete old thumbs
             store->DeleteThumbnailsL(aPath, ETrue);
             
+            if( iFetchedChecker ) 
+                {
+                iFetchedChecker->SetFetchResult( aPath, KErrNone );
+                }
+            
             // need to create new thumbs
             }
         else
@@ -1193,6 +1222,23 @@
     }
 
 // -----------------------------------------------------------------------------
+// Renames thumbnails.
+// -----------------------------------------------------------------------------
+//
+void CThumbnailServer::RenameThumbnailsL( const TDesC& aCurrentPath, const TDesC& aNewPath )
+    {
+    TN_DEBUG2( "CThumbnailServer::RenameThumbnailsL(%S)", &aCurrentPath);
+    
+    StoreForPathL( aCurrentPath )->RenameThumbnailsL( aCurrentPath, aNewPath );
+    
+    if( iFetchedChecker ) 
+        {
+        iFetchedChecker->SetFetchResult( aNewPath, iFetchedChecker->LastFetchResult(aCurrentPath) );
+        iFetchedChecker->SetFetchResult( aCurrentPath, KErrNone );
+        }
+    }
+
+// -----------------------------------------------------------------------------
 // CThumbnailServer::MimeTypeFromFileExt()
 // -----------------------------------------------------------------------------
 //
--- a/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserversession.cpp	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserversession.cpp	Mon May 03 12:48:51 2010 +0300
@@ -133,7 +133,12 @@
                 {
                 UpdateThumbnailsL( aMessage );
                 break;
-                }                  
+                }       
+        case ERenameThumbnails:
+                {
+                RenameThumbnailsL( aMessage );
+                break;
+                } 
         default:
                 {
                 err = KErrUnknown;
@@ -338,6 +343,38 @@
     }
 
 // -----------------------------------------------------------------------------
+// CThumbnailServerSession::RenameThumbnailsL()
+// Rename thumbnails.
+// -----------------------------------------------------------------------------
+//
+void CThumbnailServerSession::RenameThumbnailsL( const RMessage2& aMessage )
+    {
+    if(aMessage.Int1() != KCheckValue)
+       {
+       TN_DEBUG1( "CThumbnailServerSession::RenameThumbnailsL() - error in aMessage - leaving" );
+       User::Leave(KErrArgument);
+       }
+    
+    // read message params
+    aMessage.ReadL( 0, iRequestParams );
+    const TThumbnailRequestParams& params = iRequestParams();
+    
+    // renaming only inside one store
+    if (params.iFileName.Left(1).CompareF( params.iTargetUri.Left(1) ) == 0)
+        {
+        Server()->RenameThumbnailsL( params.iFileName, params.iTargetUri );
+        
+        aMessage.Complete( KErrNone );
+        }
+    else
+        {
+        aMessage.Complete( KErrNotSupported );
+        }
+    
+    iMessage = RMessage2();
+    }
+
+// -----------------------------------------------------------------------------
 // CThumbnailServerSession::RequestThumbByIdAsyncL()
 // -----------------------------------------------------------------------------
 //
@@ -615,9 +652,14 @@
        {
        TInt sourceType = TThumbnailPersistentSize::EUnknownSourceType;
        TDataType mimetype;
-       Server()->MimeTypeFromFileExt( params.iTargetUri, mimetype );
-       sourceType = Server()->SourceTypeFromMimeType( mimetype );   
-       ModifyThumbnailSize(sourceType);
+       TInt ret = Server()->MimeTypeFromFileExt( params.iTargetUri, mimetype );
+	   
+       if( ret == KErrNone )
+           {
+           sourceType = Server()->SourceTypeFromMimeType( mimetype );   
+           ModifyThumbnailSize(sourceType);
+           }
+       User::LeaveIfError( ret );
        }
     
     TInt bufferSize = aMessage.Int2();
--- a/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailstore.cpp	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailstore.cpp	Mon May 03 12:48:51 2010 +0300
@@ -44,7 +44,7 @@
 const TInt KStoreUnrecoverableErr = KErrCorrupt;
 
 // Database path without drive letter
-_LIT( KThumbnailDatabaseName, ":[102830AB]thumbnail_v3.db" );
+_LIT( KThumbnailDatabaseName, ":[102830AB]thumbnail_v5.db" );
 
 _LIT( KDrv, ":");
 
@@ -68,7 +68,18 @@
 // ---------------------------------------------------------------------------
 //
 void RThumbnailTransaction::BeginL()
-    {
+    {    
+    if (iDatabase.InTransaction())
+        {
+        TN_DEBUG1( "RThumbnailTransaction::BeginL() - error: old transaction open!" );
+        __ASSERT_DEBUG(( !iDatabase.InTransaction() ), ThumbnailPanic( EThumbnailSQLTransaction ));
+        
+        // old transaction already open, don't open another
+        iState = EOldOpen;
+        
+        return;
+        }
+    
     const TInt err = iDatabase.Exec( KThumbnailBeginTransaction );
     if ( err >= 0 )
         {
@@ -91,7 +102,7 @@
 //
 void RThumbnailTransaction::Close()
     {
-    if ( iState != EClosed )
+    if ( iState != EClosed && iState != EOldOpen )
         {
         Rollback();
         }
@@ -103,13 +114,16 @@
 //
 void RThumbnailTransaction::CommitL()
     {
-    TInt ret = iDatabase.Exec( KThumbnailCommitTransaction );
+    if ( iState != EOldOpen )
+        {
+        TInt ret = iDatabase.Exec( KThumbnailCommitTransaction );
     
 #ifdef _DEBUG
     TPtrC errorMsg = iDatabase.LastErrorMessage();
     TN_DEBUG3( "RThumbnailTransaction::CommitL() lastError %S, ret = %d" , &errorMsg, ret);
 #endif  
     User::LeaveIfError( ret );
+        }
     
     iState = EClosed;
     }
@@ -120,12 +134,20 @@
 //
 TInt RThumbnailTransaction::Rollback()
     {
-    const TInt err = iDatabase.Exec( KThumbnailRollbackTransaction );
-    if ( err >= 0 )
+    if ( iState != EOldOpen )
         {
-        iState = EClosed;
+        const TInt err = iDatabase.Exec( KThumbnailRollbackTransaction );
+        if ( err >= 0 )
+            {
+            iState = EClosed;
+            }
+        
+        return err;
         }
-    return err;
+    
+    iState = EClosed;
+    
+    return KErrNone;
     }
 
 
@@ -167,10 +189,6 @@
         iDiskFullNotifier = NULL;
         }
 
-    if(!iServer->IsFormatting())
-        {
- 	    FlushCacheTable( ETrue );
-        }
     if( iAutoFlushTimer )
         {
         iAutoFlushTimer->Cancel();
@@ -178,6 +196,18 @@
         iAutoFlushTimer = NULL;
         }
     
+    if( iMaintenanceTimer )
+        {
+        iMaintenanceTimer->Cancel();
+        delete iMaintenanceTimer;
+        iMaintenanceTimer = NULL;
+        }
+    
+    if(!iServer->IsFormatting())
+        {
+ 	    FlushCacheTable( ETrue );
+        }
+    
     CloseStatements();   
     iDatabase.Close();
     
@@ -191,7 +221,7 @@
 //
 CThumbnailStore::CThumbnailStore( RFs& aFs, TInt aDrive, TDesC& aImei, CThumbnailServer* aServer ): 
     iFs( aFs ), iDrive( aDrive ), iDriveChar( 0 ), iBatchItemCount(0), iImei(aImei), 
-    iServer(aServer), iDiskFull(EFalse), iUnrecoverable(ETrue)
+    iServer(aServer), iDiskFull(EFalse), iUnrecoverable(ETrue), iBatchFlushItemCount(KMInBatchItems)
     {
     // no implementation required
     }
@@ -293,18 +323,16 @@
                 checkError = CheckRowIDs();
                 }
             }
-        else
+
+        // if db file not found, wrong version, corrupted database or other error opening db
+        if ( err != KErrNone || checkError == KErrNotSupported )
             {
-            // if db file not found, wrong version, corrupted database or other error opening db
-            if ( checkError == KErrNotSupported || err != KErrNone )
-                {
-                CleanupClosePushL(iDatabase);
-                RecreateDatabaseL(ETrue);
-                CleanupStack::Pop(&iDatabase);
-                
-                aNewDatabase = ETrue;
-                }
-            }
+            CleanupClosePushL(iDatabase);
+            RecreateDatabaseL(ETrue);
+            CleanupStack::Pop(&iDatabase);
+            
+            aNewDatabase = ETrue;
+            }          
         }    
    
     // opened existing database file
@@ -319,7 +347,7 @@
         if(imeiError != KErrNone)
             {
             //take ownership
-            imeiError = UpdateImeiL();
+            TRAP(imeiError, UpdateImeiL() );
             
             //Touch blacklisted items
             TRAP(blistError, PrepareBlacklistedItemsForRetryL() );
@@ -332,9 +360,7 @@
             TRAP(blistError2, PrepareBlacklistedItemsForRetryL() );
             }
         
-        if(imeiError == KSqlErrCorrupt || imeiError == KErrCorrupt ||
-           blistError == KSqlErrCorrupt || blistError == KErrCorrupt || 
-           blistError2 == KSqlErrCorrupt || blistError2 == KErrCorrupt )
+        if(imeiError != KErrNone || blistError != KErrNone || blistError2 != KErrNone )
             {
             CleanupClosePushL(iDatabase);
             RecreateDatabaseL(ETrue);
@@ -745,31 +771,30 @@
 // UpdateImeiL()
 // -----------------------------------------------------------------------------
 //
-TInt CThumbnailStore::UpdateImeiL()
+void CThumbnailStore::UpdateImeiL()
     {
     TN_DEBUG1( "CThumbnailStore::UpdateImeiL()" );
     RSqlStatement stmt;
     CleanupClosePushL( stmt );
             
-    TInt ret = stmt.Prepare( iDatabase, KThumbnailUpdateIMEI );
+    User::LeaveIfError( stmt.Prepare( iDatabase, KThumbnailUpdateIMEI ) );
     
     TInt paramIndex = stmt.ParameterIndex( KThumbnailSqlParamImei );
     User::LeaveIfError( paramIndex );
     User::LeaveIfError( stmt.BindText( paramIndex, iImei ));
     
-    TInt err =  stmt.Exec();
+    TInt err = stmt.Exec();
     
     if(err < 0)
         {
 #ifdef _DEBUG
-        TPtrC errorMsg2 = iDatabase.LastErrorMessage();
-        TN_DEBUG2( "RThumbnailTransaction::ResetThumbnailIDs() lastError %S, ret = %d" , &errorMsg2);
+        TPtrC errorMsg = iDatabase.LastErrorMessage();
+        TN_DEBUG2( "RThumbnailTransaction::UpdateImeiL() lastError %S" , &errorMsg);
 #endif
-        return ret;
+        User::Leave(err);
         }
     
     CleanupStack::PopAndDestroy( &stmt );
-    return KErrNone;
     }
 
 // ---------------------------------------------------------------------------
@@ -961,6 +986,22 @@
 #endif
     User::LeaveIfError( err );
     
+    err = iStmt_KThumbnailRename.Prepare( iDatabase, KThumbnailRename );
+#ifdef _DEBUG
+    msg.Append( iDatabase.LastErrorMessage() );
+    TN_DEBUG2( "CThumbnailStore::PrepareStatementsL() KThumbnailRename %S" , &msg );
+    msg.Zero();
+#endif
+    User::LeaveIfError( err );
+    
+    err = iStmt_KThumbnailTempRename.Prepare( iDatabase, KThumbnailTempRename );
+#ifdef _DEBUG
+    msg.Append( iDatabase.LastErrorMessage() );
+    TN_DEBUG2( "CThumbnailStore::PrepareStatementsL() KThumbnailTempRename %S" , &msg );
+    msg.Zero();
+#endif
+    User::LeaveIfError( err );
+    
     TN_DEBUG1("CThumbnailStore::PrepareStatementsL() end");
     }
 
@@ -1005,6 +1046,8 @@
     iStmt_KThumbnailSqlDeleteInfoByRowID.Close();
     iStmt_KThumbnailSqlDeleteInfoDataByRowID.Close();
     iStmt_KThumbnailSelectAllPaths.Close();
+    iStmt_KThumbnailRename.Close();
+    iStmt_KThumbnailTempRename.Close();
     
     TN_DEBUG1("CThumbnailStore::CloseStatements() end");
     }
@@ -1347,10 +1390,11 @@
         found = ETrue;
         }
     
+    CleanupStack::PopAndDestroy( stmt );
+    
     // check if duplicate in Deleted
     if (found)
         {
-        CleanupStack::PopAndDestroy( stmt );
         stmt = &iStmt_KThumbnailSqlFindDeleted;
         CleanupStack::PushL(TCleanupItem(ResetStatement, stmt));   
             
@@ -1360,6 +1404,8 @@
         
         rowStatus = stmt->Next();
         
+        CleanupStack::PopAndDestroy( stmt );
+        
         if(rowStatus == KSqlAtRow)
             {
             TN_DEBUG1( "CThumbnailStore::FindDuplicateL() - duplicate marked deleted" );
@@ -1372,8 +1418,6 @@
             }
         }
     
-    CleanupStack::PopAndDestroy( stmt );
-    
     return found;
     }
 
@@ -1695,10 +1739,10 @@
         rowStatus = stmt->Next();   
         }
     
-    CleanupStack::PopAndDestroy( stmt );
+    CleanupStack::PopAndDestroy( stmt_infodata );
     CleanupStack::PopAndDestroy( stmt_info );
-    CleanupStack::PopAndDestroy( stmt_infodata );
-    
+    CleanupStack::PopAndDestroy( stmt );
+        
     // if forcing instant delete
     if (aForce)
         {
@@ -1744,9 +1788,15 @@
         
         CleanupStack::PopAndDestroy( stmt_infodata );
         CleanupStack::PopAndDestroy( stmt_info );
+        CleanupStack::PopAndDestroy( stmt );
+        
+		//remove delete mark
+        User::LeaveIfError( iDatabase.Exec( KThumbnailSqlDeleteFromDeleted ) );
         } 
     else
         {
+        TN_DEBUG1( "CThumbnailStore::DeleteThumbnailByPathL() -- add to Deleted" );
+    
         // only add path to deleted table
         stmt = &iStmt_KThumbnailSqlInsertDeleted;
         CleanupStack::PushL(TCleanupItem(ResetStatement, stmt));
@@ -1756,9 +1806,9 @@
         User::LeaveIfError( stmt->BindText( paramIndex, *path ));
         
         count = stmt->Exec();
-        }
-    
-    CleanupStack::PopAndDestroy( stmt );    
+        
+        CleanupStack::PopAndDestroy( stmt );
+        }    
     
     if (aTransaction)
         {
@@ -1783,6 +1833,84 @@
     CleanupStack::PopAndDestroy( path );
     }
 
+// -----------------------------------------------------------------------------
+// Rename thumbnails
+// -----------------------------------------------------------------------------
+//
+void CThumbnailStore::RenameThumbnailsL( const TDesC& aCurrentPath, const TDesC& aNewPath )
+    {
+    TN_DEBUG2( "CThumbnailStore::RenameThumbnailsL(%S)", &aCurrentPath );
+    
+#ifdef _DEBUG
+    TTime aStart, aStop;
+    aStart.UniversalTime();
+#endif
+    
+    User::LeaveIfError( CheckDbState() );
+    
+    TInt paramIndex = 0;
+
+    HBufC* path = aCurrentPath.AllocLC();
+    TPtr ptr(path->Des());
+    StripDriveLetterL( ptr );
+    
+    HBufC* newPath = aNewPath.AllocLC();
+    TPtr ptr2(newPath->Des());
+    StripDriveLetterL( ptr2 );
+    
+    RThumbnailTransaction transaction( iDatabase );
+    CleanupClosePushL( transaction );    
+    transaction.BeginL();
+        
+    TN_DEBUG1( "CThumbnailStore::RenameThumbnailsL() -- TEMP TABLE" );
+    
+    RSqlStatement* stmt = NULL;
+    stmt = &iStmt_KThumbnailTempRename;
+    CleanupStack::PushL(TCleanupItem(ResetStatement, stmt));
+    
+    paramIndex = stmt->ParameterIndex( KThumbnailSqlParamPath );
+    User::LeaveIfError( paramIndex );
+    User::LeaveIfError( stmt->BindText( paramIndex, *path ));
+    
+    paramIndex = stmt->ParameterIndex( KThumbnailSqlParamNewPath );
+    User::LeaveIfError( paramIndex );
+    User::LeaveIfError( stmt->BindText( paramIndex, *newPath ));
+    
+    User::LeaveIfError( stmt->Exec() );
+    
+    TN_DEBUG1( "CThumbnailStore::RenameThumbnailsL() -- MAIN TABLE" );
+    
+    CleanupStack::PopAndDestroy( stmt );
+    stmt = &iStmt_KThumbnailRename;
+    CleanupStack::PushL(TCleanupItem(ResetStatement, stmt));
+    
+    paramIndex = stmt->ParameterIndex( KThumbnailSqlParamPath );
+    User::LeaveIfError( paramIndex );
+    User::LeaveIfError( stmt->BindText( paramIndex, *path ));
+    
+    paramIndex = stmt->ParameterIndex( KThumbnailSqlParamNewPath );
+    User::LeaveIfError( paramIndex );
+    User::LeaveIfError( stmt->BindText( paramIndex, *newPath ));
+    
+    User::LeaveIfError( stmt->Exec() );
+    
+    CleanupStack::PopAndDestroy( stmt );
+    
+    // if thumb was for some reason already marked deleted, clean from deleted
+    User::LeaveIfError( iDatabase.Exec( KThumbnailSqlDeleteFromDeleted ) );
+    
+    transaction.CommitL();
+    CleanupStack::PopAndDestroy( &transaction );
+    
+    CleanupStack::PopAndDestroy( newPath );
+    CleanupStack::PopAndDestroy( path );
+    
+#ifdef _DEBUG
+    aStop.UniversalTime();
+    TN_DEBUG2( "CThumbnailStore::RenameThumbnailsL() took %d ms", (TInt)aStop.MicroSecondsFrom(aStart).Int64()/1000);
+#endif      
+    }
+
 // ---------------------------------------------------------------------------
 // CThumbnailStore::PersistentSizes()
 // ---------------------------------------------------------------------------
@@ -1808,17 +1936,30 @@
         return;
         }
     
-    if(iBatchItemCount < KMaxBatchItems && !aForce)
+    // fixed batch size if MTP sync on
+    TInt MPXHarvesting(0);
+    TInt ret = RProperty::Get(KTAGDPSNotification, KMPXHarvesting, MPXHarvesting);
+    if(ret != KErrNone)
+        {
+        TN_DEBUG2( "CThumbnailStore::FlushCacheTable() error checking MTP sync: %d", ret);
+        }
+    
+    if(MPXHarvesting && iBatchItemCount < KMaxBatchItemsMTP && !aForce)
+        {
+        TN_DEBUG1("CThumbnailStore::FlushCacheTable() MTP sync, fixed batch...");
+    
+        //some items in cache
+        StartAutoFlush();
+        return;
+        }    
+    else if(!MPXHarvesting && iBatchItemCount < iBatchFlushItemCount && !aForce)
        {
        //some items in cache
        StartAutoFlush();
        return;
-       }
+       }    
     
-#ifdef _DEBUG
-    TTime aStart, aStop;
-    aStart.UniversalTime();
-#endif
+    iStartFlush.UniversalTime();
     
     // Move data from temp table to main....
     TInt err_begin = iDatabase.Exec( KThumbnailBeginTransaction );
@@ -1871,16 +2012,31 @@
         // open new
         TRAP_IGNORE(OpenDatabaseL(ETrue));
         }
+   
+    iStopFlush.UniversalTime();
+    TInt aFlushDelay = (TInt)iStopFlush.MicroSecondsFrom(iStartFlush).Int64()/1000;
+    
+    TN_DEBUG2( "CThumbnailStore::FlushCacheTable() took %d ms", aFlushDelay);
+    
+    //adjust batch size dynamically between min and max based on read flush speed
+    if (!MPXHarvesting)
+        {
+        //increase batch count if there room for one more item (based on average time per item)
+        if( aFlushDelay < KMaxFlushDelay && iBatchFlushItemCount < KMaxBatchItems )
+            {
+            iBatchFlushItemCount++;
+            }
+        //decrease batch count if we exeeced max time allowed in flushing the TEMP table
+        else if(aFlushDelay > KMaxFlushDelay && iBatchFlushItemCount > KMInBatchItems )
+            {
+            iBatchFlushItemCount--;
+            }
+        }
     
     //cache flushed
     iBatchItemCount = 0;
-    
-#ifdef _DEBUG
-    aStop.UniversalTime();
-    TN_DEBUG2( "CThumbnailStore::FlushCacheTable() took %d ms", (TInt)aStop.MicroSecondsFrom(aStart).Int64()/1000);
-#endif
 
-    TN_DEBUG1("CThumbnailStore::FlushCacheTable() out");
+    TN_DEBUG2("CThumbnailStore::FlushCacheTable() out iBatchFlushItemCount = %d", iBatchFlushItemCount);
     }
 
 // -----------------------------------------------------------------------------
@@ -2047,7 +2203,7 @@
             {
             self->StartMaintenance();
             }  
-        else
+        else if (!self->iDeleteThumbs && !self->iCheckFilesExist)
             {
             // no need to monitor activity anymore
             self->iActivityManager->Cancel();
--- a/imagehandlingutilities/thumbnailmanager/tmcommon/src/tmactivitymanager.cpp	Fri Apr 16 15:16:16 2010 +0300
+++ b/imagehandlingutilities/thumbnailmanager/tmcommon/src/tmactivitymanager.cpp	Mon May 03 12:48:51 2010 +0300
@@ -66,6 +66,7 @@
     {
     TN_DEBUG1( "CTMActivityManager::ConstructL()");
     iTimer.CreateLocal();
+    iWatch = ENone;
     }
 
 // ---------------------------------------------------------------------------
@@ -112,8 +113,6 @@
     {
     TN_DEBUG1( "CTMActivityManager::Start()");
     
-    iFirstRound = ETrue;
-    
 #ifdef MONITOR_LIGHTS
     if(!iLight)
         {
@@ -121,11 +120,16 @@
         }
 #endif
     
-    if( !IsActive() )
+    if ( iWatch == ENone )
         {
-        SetActive();
-        TRequestStatus* statusPtr = &iStatus;
-        User::RequestComplete( statusPtr, KErrNone );
+        iFirstRound = ETrue;
+        
+        if( !IsActive() )
+            {
+            SetActive();
+            TRequestStatus* statusPtr = &iStatus;
+            User::RequestComplete( statusPtr, KErrNone );
+            }
         }
     }
 
@@ -161,12 +165,12 @@
                 TN_DEBUG1( "CTMActivityManager::RunL() inactive");
                 NotifyObserver();
 
-            if (!IsActive()) //observer might have called a Reset()
-                {
-                iTimer.Inactivity(iStatus,0);
-                iWatch = EWaitingForActivity;
+                if (!IsActive()) //observer might have called a Reset()
+                    {
+                    iTimer.Inactivity(iStatus,0);
+                    iWatch = EWaitingForActivity;
+                    }
                 }
-            }
             else
                 {
                 iTimer.Inactivity(iStatus,iTimeout);
@@ -174,8 +178,8 @@
             }
         else if (iWatch == EWaitingForActivity)
             {
-                TN_DEBUG1( "CTMActivityManager::RunL() active");
-                NotifyObserver();
+            TN_DEBUG1( "CTMActivityManager::RunL() active");
+            NotifyObserver();
              
             if (!IsActive()) //observer might have called a Reset()
                 {