activityfw/storage/server/src/afstoragesynctask.cpp
changeset 112 dbfb5e38438b
parent 107 b34d53f6acdf
child 119 50e220be30d1
--- a/activityfw/storage/server/src/afstoragesynctask.cpp	Fri Aug 06 13:40:46 2010 +0300
+++ b/activityfw/storage/server/src/afstoragesynctask.cpp	Wed Aug 18 10:39:24 2010 +0300
@@ -130,24 +130,39 @@
     TPckgBuf<TInt> bitmapHdl(0);
     CAfEntry *entry = CAfEntry::NewLC(msg);
     msg.ReadL(1, bitmapHdl);
-        
-    RBuf thumbnailPath;
-    CleanupClosePushL(thumbnailPath);
-    DeleteActivityScreenshotL(dataStorage, 
-                    entry->ApplicationId(), 
-                    entry->ActivityId());
+
+    TInt hdl = bitmapHdl();
+    if (0 >= hdl) {
+        User::Leave(KErrCorrupt);
+    }
+    CFbsBitmap *bitmap = new (ELeave) CFbsBitmap;
+    CleanupStack::PushL(bitmap);
+    User::LeaveIfError(bitmap->Duplicate(hdl));
     
-    dataStorage.ThumbnailPathL(thumbnailPath, 
-                   dataStorage.Fs(), 
-                   entry->ApplicationId(), 
-                   entry->ActivityId(),
-                   entry->Flags() & CAfEntry::Persistent);
-    CreateThumbnailL(thumbnailPath, bitmapHdl());
     //all data is retrieved. compleate message to improve response time
     msg.Complete(KErrNone);
-    TRAP_IGNORE(entry->SetImageSrcL(thumbnailPath);
-    dataStorage.SaveActivityL(*entry);)
-    CleanupStack::PopAndDestroy(&thumbnailPath);
+    
+    // trap all other leaving methods to prevent completing message in ServiceError
+    TRAP_IGNORE(
+        RBuf thumbnailPath;
+        CleanupClosePushL(thumbnailPath);
+        DeleteActivityScreenshotL(dataStorage, 
+                        entry->ApplicationId(), 
+                        entry->ActivityId());
+        
+        dataStorage.ThumbnailPathL(thumbnailPath, 
+                       dataStorage.Fs(), 
+                       entry->ApplicationId(), 
+                       entry->ActivityId(),
+                       entry->Flags() & CAfEntry::Persistent);
+                       
+        User::LeaveIfError(bitmap->Save(thumbnailPath));
+
+        entry->SetImageSrcL(thumbnailPath);
+        dataStorage.SaveActivityL(*entry);
+        CleanupStack::PopAndDestroy(&thumbnailPath);
+    )
+    CleanupStack::PopAndDestroy(bitmap);
     CleanupStack::PopAndDestroy(entry);
 }