mtpdataproviders/mtpimagedp/src/cmtpimagedpobjectpropertymgr.cpp
branchRCL_3
changeset 2 4843bb5893b6
parent 0 d0791faffa3f
child 3 8b094906a049
--- a/mtpdataproviders/mtpimagedp/src/cmtpimagedpobjectpropertymgr.cpp	Fri Feb 19 23:40:44 2010 +0200
+++ b/mtpdataproviders/mtpimagedp/src/cmtpimagedpobjectpropertymgr.cpp	Fri Mar 12 15:46:41 2010 +0200
@@ -26,11 +26,13 @@
 #include <e32cmn.h>
 #include <imageconversion.h> 
 #include <mdeconstants.h>
+#include <thumbnailmanager.h>
 
 #include <mtp/mmtpobjectmgr.h>
 #include <mtp/cmtpobjectmetadata.h>
 #include <mtp/tmtptypeuint32.h>
 #include <mtp/cmtptypestring.h>
+#include <mtp/cmtptypeopaquedata.h>
 #include <mtp/mmtpdataproviderframework.h>
 #include <mtp/cmtptypearray.h>
 #include <mtp/mmtpdataproviderframework.h>
@@ -38,7 +40,9 @@
 #include <mtp/cmtptypestring.h>
 #include <mtp/mtpprotocolconstants.h>
 
+#include "cmtpimagedp.h"
 #include "cmtpimagedpobjectpropertymgr.h"
+#include "cmtpimagedpthumbnailcreator.h"
 #include "mtpimagedppanic.h"
 #include "mtpimagedputilits.h"
 #include "mtpimagedpconst.h"
@@ -114,6 +118,7 @@
 
 void CMTPImageDpObjectPropertyMgr::CMTPImagePropertiesCache::ResetL()
     {
+    iObjectHandle = KMTPHandleNone;
     SetUint(EImagePixWidth, 0);
     SetUint(EImagePixHeight, 0);
     SetUint(EImageBitDepth, 0);
@@ -157,16 +162,18 @@
     iObjectHandle = aObjectHandle;
     }
 
-CMTPImageDpObjectPropertyMgr* CMTPImageDpObjectPropertyMgr::NewL(MMTPDataProviderFramework& aFramework)
+CMTPImageDpObjectPropertyMgr* CMTPImageDpObjectPropertyMgr::NewL(MMTPDataProviderFramework& aFramework, CMTPImageDataProvider& aDataProvider)
     {
-    CMTPImageDpObjectPropertyMgr* self = new (ELeave) CMTPImageDpObjectPropertyMgr(aFramework);
+    CMTPImageDpObjectPropertyMgr* self = new (ELeave) CMTPImageDpObjectPropertyMgr(aFramework, aDataProvider);
     CleanupStack::PushL(self);
     self->ConstructL(aFramework);
     CleanupStack::Pop(self);
     return self;
     }
 
-CMTPImageDpObjectPropertyMgr::CMTPImageDpObjectPropertyMgr(MMTPDataProviderFramework& aFramework) :
+CMTPImageDpObjectPropertyMgr::CMTPImageDpObjectPropertyMgr(MMTPDataProviderFramework& aFramework, CMTPImageDataProvider& aDataProvider) :
+    iFramework(aFramework),
+    iDataProvider(aDataProvider),
     iFs(aFramework.Fs()),
     iObjectMgr(aFramework.ObjectMgr())
     {
@@ -196,6 +203,7 @@
     delete iObject;
     delete iMetaDataSession;
     delete iActiveSchedulerWait; 
+    delete iThumbnailCache.iThumbnailData;
     __FLOG(_L8("CMTPImageDpObjectPropertyMgr::~CMTPImageDpObjectPropertyMgr - Exit"));
     __FLOG_CLOSE;
     }
@@ -218,18 +226,20 @@
             iCacheHit = ETrue;
             }
         else
-            {
+            {            
             iCacheHit = EFalse;
+
+            /**
+             * if cache miss, we should clear the cache content
+             */
+            ClearCacheL();
             
-            CMdENamespaceDef& defaultNamespace = iMetaDataSession->GetDefaultNamespaceDefL();
-            CMdEObjectDef& imageObjDef = defaultNamespace.GetObjectDefL( MdeConstants::Image::KImageObject );
+			//need parse image file by our self if fail to get properties from MdS
+            iNeedParse = ETrue;
+
+			//clear previous Mde object
             delete iObject;
-            iObject = NULL;
-            
-            //if we can not open MdS object for getting properties, we will not get properites which stored in MdS
-            TFileName uri;
-            uri.CopyLC(iObjectInfo->DesC(CMTPObjectMetaData::ESuid));
-            TRAP_IGNORE((iObject = iMetaDataSession->GetObjectL(uri, imageObjDef)));            
+            iObject = NULL;            
             }        
         }    
     else
@@ -357,7 +367,7 @@
         {
         TTime modifiedTime;
         ConvertMTPTimeStr2TTimeL(aValue, modifiedTime);
-        iFs.SetModified(iObjectInfo->DesC(CMTPObjectMetaData::ESuid), modifiedTime);     
+        iFs.SetModified(iObjectInfo->DesC(CMTPObjectMetaData::ESuid), modifiedTime);            
         }
         break;
       
@@ -413,7 +423,9 @@
             }
         break;        
     default:
-        GetPropertyFromMdsL(aProperty, &aValue);
+        aValue = 0;//initialization
+        //ingore the failure if we can't get properties form MdS
+        TRAP_IGNORE(GetPropertyFromMdsL(aProperty, &aValue));
         break;
         }
     __FLOG(_L8("<< CMTPImageDpObjectPropertyMgr::GetPropertyL"));
@@ -434,20 +446,66 @@
         aValue = iObjectInfo->Uint(CMTPObjectMetaData::EParentHandle);
         break;        
        
-    case EMTPObjectPropCodeRepresentativeSampleSize:
-        aValue = KThumbCompressedSize;
-       break;       
+    case EMTPObjectPropCodeRepresentativeSampleSize: 
+        aValue = MTPImageDpUtilits::GetThumbnailSize(*iObjectInfo);
+        if (aValue == 0)
+            {
+            __FLOG_VA((_L16("Query smaple size from MdS - URI:%S"), &iObjectInfo->DesC(CMTPObjectMetaData::ESuid)));
+            ClearThumnailCache();                                
+            /**
+             * try to query thumbnail from TNM, and then store thumbnail to cache
+             */
+            TEntry fileEntry;
+            TInt err = iFs.Entry(iObjectInfo->DesC(CMTPObjectMetaData::ESuid), fileEntry);
+            if (err == KErrNone)
+                {
+                iDataProvider.ThumbnailManager().GetThumbMgr()->SetFlagsL(CThumbnailManager::EDefaultFlags);
+                if(fileEntry.FileSize() > KFileSizeMax)
+                    {
+                    iDataProvider.ThumbnailManager().GetThumbMgr()->SetFlagsL(CThumbnailManager::EDoNotCreate);
+                    }
+                
+                /**
+                 * trap the leave to avoid return general error when PC get object property list
+                 */
+                TRAP(err, iDataProvider.ThumbnailManager().GetThumbnailL(iObjectInfo->DesC(CMTPObjectMetaData::ESuid), iThumbnailCache.iThumbnailData, err));
+                if (err == KErrNone)
+                    {
+                    iThumbnailCache.iObjectHandle = iObjectInfo->Uint(CMTPObjectMetaData::EHandle);                        
+                    if (iThumbnailCache.iThumbnailData != NULL)
+                        {
+                        aValue = static_cast<TUint32>(iThumbnailCache.iThumbnailData->Size());
+                        }
+                                                
+                    if (aValue > 0)
+                        {
+                        //update metadata column
+                        MTPImageDpUtilits::UpdateObjectThumbnailSizeL(iFramework, *iObjectInfo, aValue);
+                        }
+                    else
+                        {
+                        //trigger initiator to re-query thumbnail again if the thumbnail size of response is zero
+                        aValue = KThumbCompressedSize;
+                        }
+
+                    __FLOG_VA((_L16("Cache miss:GetThumbnailSize - URI:%S, Size:%u"), &iObjectInfo->DesC(CMTPObjectMetaData::ESuid), aValue));
+                    }
+                }
+            }	    
+        break;       
        
     case EMTPObjectPropCodeRepresentativeSampleHeight:
         aValue = KThumbHeigth;
-       break;
+        break;
        
     case EMTPObjectPropCodeRepresentativeSampleWidth:
         aValue = KThumbWidht;
-       break;
+        break;
               
     default:
-        GetPropertyFromMdsL(aProperty, &aValue);
+        aValue = 0;//initialization
+        //ingore the failure if we can't get properties form MdS
+        TRAP_IGNORE(GetPropertyFromMdsL(aProperty, &aValue));
         break;  
         }
     __FLOG(_L8("<< CMTPImageDpObjectPropertyMgr::GetPropertyL"));
@@ -522,149 +580,205 @@
         break;                 
         
     default:
-        GetPropertyFromMdsL(aProperty, &aValue);
+        //ingore the failure if we can't get properties form MdS
+        TRAP_IGNORE(GetPropertyFromMdsL(aProperty, &aValue));
         break;
         }
     __FLOG(_L8("<< CMTPImageDpObjectPropertyMgr::GetPropertyL"));
     }
 
+void CMTPImageDpObjectPropertyMgr::GetPropertyL(TMTPObjectPropertyCode aProperty, CMTPTypeArray& aValue)
+    {
+    __FLOG(_L8(">> CMTPImageDpObjectPropertyMgr::GetPropertyL -- SmapleData"));       
+    
+    if (aProperty == EMTPObjectPropCodeRepresentativeSampleData)
+        {
+        HBufC8* tnBuf = Thumbnail(iObjectInfo->Uint(CMTPObjectMetaData::EHandle));    
+        if (tnBuf != NULL)
+            {    
+            aValue.SetByDesL(*tnBuf);
+            }
+        else
+            {    
+            ClearThumnailCache();                                
+            /**
+             * try to query thumbnail from TNM, and then store thumbnail to cache
+             */
+            TEntry fileEntry;
+            TInt err = iFs.Entry(iObjectInfo->DesC(CMTPObjectMetaData::ESuid), fileEntry);
+            if (err == KErrNone)
+                {
+                iDataProvider.ThumbnailManager().GetThumbMgr()->SetFlagsL(CThumbnailManager::EDefaultFlags);
+                if(fileEntry.FileSize() > KFileSizeMax)
+                    {
+                    iDataProvider.ThumbnailManager().GetThumbMgr()->SetFlagsL(CThumbnailManager::EDoNotCreate);
+                    }
+                
+                /**
+                 * trap the leave to avoid return general error when PC get object property list
+                 */
+                TRAP(err, iDataProvider.ThumbnailManager().GetThumbnailL(iObjectInfo->DesC(CMTPObjectMetaData::ESuid), iThumbnailCache.iThumbnailData, err));
+                if (err == KErrNone)
+                    {
+                    TInt size = MTPImageDpUtilits::GetThumbnailSize(*iObjectInfo);
+                    iThumbnailCache.iObjectHandle = iObjectInfo->Uint(CMTPObjectMetaData::EHandle);                        
+                    if (iThumbnailCache.iThumbnailData != NULL)
+                        {
+                        aValue.SetByDesL(*iThumbnailCache.iThumbnailData);
+                        if (size == 0)
+                            {
+                            //update metadata column
+                            MTPImageDpUtilits::UpdateObjectThumbnailSizeL(iFramework, *iObjectInfo, iThumbnailCache.iThumbnailData->Size());
+                            __FLOG_VA((_L16("Cache miss:GetThumbnailSize - URI:%S, Size:%u"), &iObjectInfo->DesC(CMTPObjectMetaData::ESuid), size));
+                            }
+                        }                                
+                    }
+                }
+            }
+        }
+    else
+        {
+        User::Leave(EMTPRespCodeObjectPropNotSupported);
+        }
+    }
+
 void CMTPImageDpObjectPropertyMgr::GetPropertyFromMdsL(TMTPObjectPropertyCode aProperty, TAny* aValue)
     {
     __FLOG(_L8(">> CMTPImageDpObjectPropertyMgr::GetPropertyFromMdsL"));
     
     TInt err = KErrNone;
-    CMdENamespaceDef& defaultNamespace = iMetaDataSession->GetDefaultNamespaceDefL();
-    CMdEObjectDef& imageObjDef = defaultNamespace.GetObjectDefL( MdeConstants::Image::KImageObject );
-    CMdEProperty* mdeProperty = NULL;
-    switch (aProperty)
-        {        
-    case EMTPObjectPropCodeDateCreated:
+      
+    if (iCacheHit)
         {
-        if (iCacheHit)
+        /**
+         * The object hit the cache, so we query properties from cache
+         */
+        switch (aProperty)
             {
-            (*(static_cast<CMTPTypeString*>(aValue))).SetL(iPropertiesCache->DesC(CMTPImageDpObjectPropertyMgr::CMTPImagePropertiesCache::EDateCreated));
+        case EMTPObjectPropCodeDateCreated:
+            (*(static_cast<CMTPTypeString*>(aValue))).SetL(iPropertiesCache->DesC(CMTPImageDpObjectPropertyMgr::CMTPImagePropertiesCache::EDateCreated));            
+            break;
+          
+        case EMTPObjectPropCodeWidth:
+            *static_cast<TUint32*>(aValue) = iPropertiesCache->Uint(CMTPImageDpObjectPropertyMgr::CMTPImagePropertiesCache::EImagePixWidth);            
+            break;
+            
+        case EMTPObjectPropCodeHeight:
+            *static_cast<TUint32*>(aValue) = iPropertiesCache->Uint(CMTPImageDpObjectPropertyMgr::CMTPImagePropertiesCache::EImagePixHeight);           
+            break;
+            
+        case EMTPObjectPropCodeImageBitDepth:
+            *static_cast<TUint32*>(aValue) = iPropertiesCache->Uint(CMTPImageDpObjectPropertyMgr::CMTPImagePropertiesCache::EImageBitDepth);            
+            break;
+            
+        default:
+            //nothing to do
+            break;
             }
-        else if (iObject)
+        }
+    else
+        {
+        /**
+         * The object miss cache, so we should open Mde object to query properties
+         */
+        OpenMdeObjectL();
+        
+        CMdENamespaceDef& defaultNamespace = iMetaDataSession->GetDefaultNamespaceDefL();
+        CMdEObjectDef& imageObjDef = defaultNamespace.GetObjectDefL( MdeConstants::Image::KImageObject );
+        CMdEProperty* mdeProperty = NULL;
+        
+        switch (aProperty)
             {        
-            CMdEPropertyDef& creationDatePropDef = imageObjDef.GetPropertyDefL(MdeConstants::Object::KCreationDateProperty);
-            TInt err = iObject->Property( creationDatePropDef, mdeProperty );  
-            if (err >= KErrNone) 
-                {
-                TBuf<KMaxTimeFormatSpec*2> timeValue;
-                // locale independent YYYYMMSSThhmmss, as required by the MTP spec
-                _LIT(KTimeFormat, "%F%Y%M%DT%H%T%S");
-                mdeProperty->TimeValueL().FormatL(timeValue, KTimeFormat);
-                (*(static_cast<CMTPTypeString*>(aValue))).SetL(timeValue);
+        case EMTPObjectPropCodeDateCreated:
+            {
+            if (iObject)
+                {        
+                CMdEPropertyDef& creationDatePropDef = imageObjDef.GetPropertyDefL(MdeConstants::Object::KCreationDateProperty);
+                TInt err = iObject->Property( creationDatePropDef, mdeProperty );  
+                if (err >= KErrNone) 
+                    {
+                    TBuf<KMaxTimeFormatSpec*2> timeValue;
+                    // locale independent YYYYMMSSThhmmss, as required by the MTP spec
+                    _LIT(KTimeFormat, "%F%Y%M%DT%H%T%S");
+                    mdeProperty->TimeValueL().FormatL(timeValue, KTimeFormat);
+                    (*(static_cast<CMTPTypeString*>(aValue))).SetL(timeValue);
+                    
+                    __FLOG_VA((_L16("GetPropertyFromMdsL - from MdS: URI:%S, DateCreated:%S"), &iObjectInfo->DesC(CMTPObjectMetaData::ESuid), &timeValue));
+                    }
                 }
             }
-        }
-       break;  
-       
-    case EMTPObjectPropCodeWidth:
-        {
-        if (iCacheHit)
+           break;  
+           
+        case EMTPObjectPropCodeWidth:
             {
-            *static_cast<TUint32*>(aValue) = iPropertiesCache->Uint(CMTPImageDpObjectPropertyMgr::CMTPImagePropertiesCache::EImagePixWidth);
-            }
-        else if (iObject)
-            {
-            CMdEPropertyDef& imageWidthPropDef = imageObjDef.GetPropertyDefL(MdeConstants::MediaObject::KWidthProperty);
-            err = iObject->Property( imageWidthPropDef, mdeProperty );  
-            if (err >= KErrNone) 
+            if (iObject)
                 {
-                TUint16 width = mdeProperty->Uint16ValueL();
-                if (width > 0)
+                CMdEPropertyDef& imageWidthPropDef = imageObjDef.GetPropertyDefL(MdeConstants::MediaObject::KWidthProperty);
+                err = iObject->Property( imageWidthPropDef, mdeProperty );  
+                if (err >= KErrNone) 
                     {
-                    *static_cast<TUint32*>(aValue) = width;
+                    *static_cast<TUint32*>(aValue) = mdeProperty->Uint16ValueL();
                     }
                 else
                     {
-                    *static_cast<TUint32*>(aValue) = ParseImageFileL(iObject->Uri(), EMTPObjectPropCodeWidth);
+                    *static_cast<TUint32*>(aValue) = 0;
                     }
                 }
             else
                 {
-                *static_cast<TUint32*>(aValue) = ParseImageFileL(iObject->Uri(), EMTPObjectPropCodeWidth);
+                *static_cast<TUint32*>(aValue) = 0;
                 }
             }
-        else
-            {
-            *static_cast<TUint32*>(aValue) = 0;
-            }
-        }
-       break; 
-       
-    case EMTPObjectPropCodeHeight:
-        {
-        if (iCacheHit)
+           break; 
+           
+        case EMTPObjectPropCodeHeight:
             {
-            *static_cast<TUint32*>(aValue) = iPropertiesCache->Uint(CMTPImageDpObjectPropertyMgr::CMTPImagePropertiesCache::EImagePixHeight);
-            }
-        else if (iObject)
-            {
-            CMdEPropertyDef& imageHeightPropDef = imageObjDef.GetPropertyDefL(MdeConstants::MediaObject::KHeightProperty);
-            err = iObject->Property( imageHeightPropDef, mdeProperty );  
-            if (err >= KErrNone) 
+            if (iObject)
                 {
-                TUint16 height = mdeProperty->Uint16ValueL();
-                if (height > 0)
+                CMdEPropertyDef& imageHeightPropDef = imageObjDef.GetPropertyDefL(MdeConstants::MediaObject::KHeightProperty);
+                err = iObject->Property( imageHeightPropDef, mdeProperty );  
+                if (err >= KErrNone) 
                     {
-                    *static_cast<TUint32*>(aValue) = height;
+                    *static_cast<TUint32*>(aValue) = mdeProperty->Uint16ValueL();
                     }
                 else
                     {
-                    *static_cast<TUint32*>(aValue) = ParseImageFileL(iObject->Uri(), EMTPObjectPropCodeHeight);
+                    *static_cast<TUint32*>(aValue) = 0;
                     }
                 }
             else
                 {
-                *static_cast<TUint32*>(aValue) = ParseImageFileL(iObject->Uri(), EMTPObjectPropCodeHeight);
+                *static_cast<TUint32*>(aValue) = 0;
                 }
             }
-        else
-            {
-            *static_cast<TUint32*>(aValue) = 0;
-            }
-        }
-       break; 
-       
-    case EMTPObjectPropCodeImageBitDepth:
-        {
-        if (iCacheHit)
+           break; 
+           
+        case EMTPObjectPropCodeImageBitDepth:
             {
-            *static_cast<TUint32*>(aValue) = iPropertiesCache->Uint(CMTPImageDpObjectPropertyMgr::CMTPImagePropertiesCache::EImageBitDepth);
-            }
-        else if (iObject)
-            {
-            CMdEPropertyDef& imageBitDepth = imageObjDef.GetPropertyDefL(MdeConstants::Image::KBitsPerSampleProperty);
-            err = iObject->Property( imageBitDepth, mdeProperty );  
-            if (err >= KErrNone) 
+            if (iObject)
                 {
-                TUint16 bitDepth = mdeProperty->Uint16ValueL();
-                if (bitDepth > 0)
+                CMdEPropertyDef& imageBitDepth = imageObjDef.GetPropertyDefL(MdeConstants::Image::KBitsPerSampleProperty);
+                err = iObject->Property( imageBitDepth, mdeProperty );  
+                if (err >= KErrNone) 
                     {
-                    *static_cast<TUint32*>(aValue) = bitDepth;
+                    *static_cast<TUint32*>(aValue) = mdeProperty->Uint16ValueL();               
                     }
                 else
                     {
-                    *static_cast<TUint32*>(aValue) = ParseImageFileL(iObject->Uri(), EMTPObjectPropCodeImageBitDepth);
-                    }                
+                    *static_cast<TUint32*>(aValue) = 0;
+                    }  
                 }
             else
                 {
-                *static_cast<TUint32*>(aValue) = ParseImageFileL(iObject->Uri(), EMTPObjectPropCodeImageBitDepth);
-                }  
+                *static_cast<TUint32*>(aValue) = 0;
+                }        
+            }     
+           break; 
+           
+        default:
+            //nothing to do
+            break;
             }
-        else
-            {
-            *static_cast<TUint32*>(aValue) = 0;
-            }        
-        }     
-       break; 
-       
-    default:
-        //nothing to do
-        break;
         }
     __FLOG(_L8("<< CMTPImageDpObjectPropertyMgr::GetPropertyFromMdsL"));
     }
@@ -781,7 +895,7 @@
            ||!GetMinute(aTimeString,minute)
            ||!GetSecond(aTimeString,second)
            ||!GetTenthSecond(aTimeString,tenthSecond))
-        {
+        {        
         User::Leave(KErrArgument);
         }
     else
@@ -803,93 +917,30 @@
         }
     }
 
-TUint32 CMTPImageDpObjectPropertyMgr::ParseImageFileL(const TDesC& aUri, TMTPObjectPropertyCode aPropCode)
+/**
+ * Store thumbnail into cache
+ */
+void CMTPImageDpObjectPropertyMgr::StoreThunmnail(TUint aHandle, HBufC8* aData)
     {
-    TUint32 result = 0;
-    TInt err = KErrNone;
-    const TInt K64Kb = 65536;
+    ClearThumnailCache();
     
-    HBufC8* buffer = HBufC8::NewLC(K64Kb);
-    TPtr8 myImagePtr = buffer->Des();
-    err = iFs.ReadFileSection(aUri, 0, myImagePtr, K64Kb);
-    if (err != KErrNone)
-        {
-        CleanupStack::PopAndDestroy(buffer);
-        return result;
-        }
-    
-    CBufferedImageDecoder *decoder = CBufferedImageDecoder::NewL(iFs);
-    CleanupStack::PushL(decoder);
-        
-    decoder->OpenL(myImagePtr, CImageDecoder::TOptions( CImageDecoder::EPreferFastDecode | CImageDecoder::EOptionIgnoreExifMetaData));
-    if (decoder->ValidDecoder())
+    iThumbnailCache.iObjectHandle = aHandle;      
+    iThumbnailCache.iThumbnailData = aData;
+    }
+
+/**
+ * Get thumbnail from cache
+ */
+HBufC8* CMTPImageDpObjectPropertyMgr::Thumbnail(TUint aHandle)
+    {
+    if (iThumbnailCache.iObjectHandle == aHandle)
         {
-        const TFrameInfo& info = decoder->FrameInfo();
-        
-        switch (aPropCode)
-            {
-        case EMTPObjectPropCodeWidth:
-            result = info.iOverallSizeInPixels.iWidth;
-            break;
-            
-        case EMTPObjectPropCodeHeight:
-            result = info.iOverallSizeInPixels.iHeight;
-            break;
-            
-        case EMTPObjectPropCodeImageBitDepth:
-            result = info.iBitsPerPixel;
-            break;
-            
-        default:
-            // nothing to do
-            break;
-            }
-        
-        /**
-         * Open MdE object for update image object properties after parsing
-         */
-        CMdENamespaceDef& defaultNamespace = iMetaDataSession->GetDefaultNamespaceDefL();
-        CMdEObjectDef& imageObjDef = defaultNamespace.GetObjectDefL(MdeConstants::Image::KImageObject);
-        CMdEPropertyDef& imageWidthPropDef = imageObjDef.GetPropertyDefL(MdeConstants::MediaObject::KWidthProperty);
-        CMdEPropertyDef& imageHeightPropDef = imageObjDef.GetPropertyDefL(MdeConstants::MediaObject::KHeightProperty);
-        CMdEPropertyDef& imageBitDepth = imageObjDef.GetPropertyDefL(MdeConstants::Image::KBitsPerSampleProperty);
-        
-        //update current object properties
-        TUint16 width = info.iOverallSizeInPixels.iWidth;
-        RemoveProperty(*iObject, imageWidthPropDef);
-        iObject->AddUint16PropertyL(imageWidthPropDef, width);
-        
-        TUint16 height = info.iOverallSizeInPixels.iHeight;
-        RemoveProperty(*iObject, imageHeightPropDef);
-        iObject->AddUint16PropertyL(imageHeightPropDef, height);
-        
-        TUint16 bitsPerPixel = info.iBitsPerPixel;
-        RemoveProperty(*iObject, imageBitDepth);
-        iObject->AddUint16PropertyL(imageBitDepth, bitsPerPixel);
-        
-        CMdEObject* updateObject = NULL;
-        TRAP(err, updateObject = iMetaDataSession->OpenObjectL(iObject->Id(), imageObjDef));
-        if (err == KErrNone && updateObject != NULL)
-            {
-            CleanupStack::PushL(updateObject);
-            
-            RemoveProperty(*updateObject, imageWidthPropDef);                   
-            updateObject->AddUint16PropertyL(imageWidthPropDef, width);    
-            
-            RemoveProperty(*updateObject, imageHeightPropDef);        
-            updateObject->AddUint16PropertyL(imageHeightPropDef, height);
-            
-            RemoveProperty(*updateObject, imageBitDepth);        
-            updateObject->AddUint16PropertyL(imageBitDepth, bitsPerPixel);    
-                    
-            iMetaDataSession->CommitObjectL(*updateObject);
-            CleanupStack::PopAndDestroy(updateObject);
-            }
+        return iThumbnailCache.iThumbnailData;
         }
-    
-    CleanupStack::PopAndDestroy(2);// decoder, buffer
-    
-    return result;
+    else
+        {
+        return NULL;
+        }
     }
 
 /**
@@ -933,3 +984,27 @@
     {
     iPropertiesCache->ResetL();
     }
+
+void CMTPImageDpObjectPropertyMgr::OpenMdeObjectL()
+    {
+    if (iObject == NULL)
+        {
+        __FLOG_VA((_L16("OpenMdeObjectL - URI = %S"), &iObjectInfo->DesC(CMTPObjectMetaData::ESuid)));
+		
+        CMdENamespaceDef& defaultNamespace = iMetaDataSession->GetDefaultNamespaceDefL();
+        CMdEObjectDef& imageObjDef = defaultNamespace.GetObjectDefL( MdeConstants::Image::KImageObject );
+        
+        //if we can not open MdS object for getting properties, we will not get properites which stored in MdS
+        TFileName uri;
+        uri.CopyLC(iObjectInfo->DesC(CMTPObjectMetaData::ESuid));
+        TRAP_IGNORE((iObject = iMetaDataSession->GetObjectL(uri, imageObjDef)));      
+        }
+    }
+
+void CMTPImageDpObjectPropertyMgr::ClearThumnailCache()
+    {
+    delete iThumbnailCache.iThumbnailData;
+    iThumbnailCache.iThumbnailData = NULL;
+    
+    iThumbnailCache.iObjectHandle = KMTPHandleNone;
+    }