Revision: 201004 RCL_3 PDK_3.0.i
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 27 Apr 2010 17:30:23 +0300
branchRCL_3
changeset 19 ef55b168cedb
parent 16 3673b591050c
child 23 f5809cfbf6d5
Revision: 201004 Kit: 201017
backupandrestore/backupengine/src/sbedataownermanager.cpp
backupandrestore/backupengine/src/sbpackagedatatransfer.cpp
backupandrestore/backuptest/burtestserver/Group/burtestserver.iby
mtpdataproviders/mtpimagedp/inc/cmtpimagedp.h
mtpdataproviders/mtpimagedp/inc/cmtpimagedpobjectpropertymgr.h
mtpdataproviders/mtpimagedp/inc/cmtpimagedpsendobjectinfo.h
mtpdataproviders/mtpimagedp/src/cmtpimagedp.cpp
mtpdataproviders/mtpimagedp/src/cmtpimagedpgetobjectproplist.cpp
mtpdataproviders/mtpimagedp/src/cmtpimagedpgetobjectpropvalue.cpp
mtpdataproviders/mtpimagedp/src/cmtpimagedpobjectpropertymgr.cpp
mtpdataproviders/mtpimagedp/src/cmtpimagedpsendobjectinfo.cpp
mtpdataproviders/mtpimagedp/src/mtpimagedputilits.cpp
mtpfws/mtpfw/daemon/server/group/mtpserver.mmp
mtpfws/mtpfw/dataproviders/devdp/src/mtpdevicedpprocessor.cpp
mtpfws/mtpfw/dataproviders/dputility/bwins/mtpdataproviderutilityu.def
mtpfws/mtpfw/dataproviders/dputility/eabi/mtpdataproviderutilityu.def
mtpfws/mtpfw/dataproviders/dputility/inc/cmtpextensionmapping.h
mtpfws/mtpfw/dataproviders/dputility/inc/cmtpfsenumerator.h
mtpfws/mtpfw/dataproviders/dputility/inc/cmtpmoveobject.h
mtpfws/mtpfw/dataproviders/dputility/inc/cmtpsendobjectinfo.h
mtpfws/mtpfw/dataproviders/dputility/inc/cmtpsetobjectprotection.h
mtpfws/mtpfw/dataproviders/dputility/inc/rmtputility.h
mtpfws/mtpfw/dataproviders/dputility/src/cmtpcopyobject.cpp
mtpfws/mtpfw/dataproviders/dputility/src/cmtpextensionmapping.cpp
mtpfws/mtpfw/dataproviders/dputility/src/cmtpfsenumerator.cpp
mtpfws/mtpfw/dataproviders/dputility/src/cmtpmoveobject.cpp
mtpfws/mtpfw/dataproviders/dputility/src/cmtpsendobjectinfo.cpp
mtpfws/mtpfw/dataproviders/dputility/src/cmtpsetobjectpropvalue.cpp
mtpfws/mtpfw/dataproviders/dputility/src/cmtpsetobjectprotection.cpp
mtpfws/mtpfw/dataproviders/dputility/src/rmtputility.cpp
mtpfws/mtpfw/dataproviders/proxydp/src/cmtpdeleteobject.cpp
mtpfws/mtpfw/dataproviders/proxydp/src/cmtpsetobjectproplist.cpp
mtpfws/mtpfw/datatypes/src/cmtptypefile.cpp
mtpfws/mtpfw/src/cmtpconnection.cpp
mtpfws/mtpfw/src/cmtpconnectionmgr.cpp
mtpfws/mtpfw/src/cmtpdeltadatamgr.cpp
mtpfws/mtpfw/src/cmtpparserrouter.cpp
mtptransports/mtpcontroller/group/mtpcontroller.mmp
mtptransports/mtpcontroller/inc/cmtpcontrollertimer.h
mtptransports/mtpcontroller/inc/cmtpoperator.h
mtptransports/mtpcontroller/src/cmtpcontrollertimer.cpp
mtptransports/mtpcontroller/src/cmtpoperator.cpp
--- a/backupandrestore/backupengine/src/sbedataownermanager.cpp	Wed Apr 14 16:49:36 2010 +0300
+++ b/backupandrestore/backupengine/src/sbedataownermanager.cpp	Tue Apr 27 17:30:23 2010 +0300
@@ -575,12 +575,11 @@
 						CPackageDataTransfer* pak = FindPackageDataContainerL(packageUid);
 						//renews the drive list
 						TRAP(err, pak->GetDriveListL(driveList));
-						if (err != KErrNone)
-                            {//Non-removable, ignore this data owner
-                            iDataOwners.Remove(count);
-                            CleanupStack::PopAndDestroy(pId);
-                            continue;
-                            }
+						if( err == KErrNotSupported)
+							{
+							__LOG("CDataOwnerManager::GetDataOwnersL() - Error KErrNotSupported");
+							err = KErrNone;
+							}
 						} // if
 					else
 						{
--- a/backupandrestore/backupengine/src/sbpackagedatatransfer.cpp	Wed Apr 14 16:49:36 2010 +0300
+++ b/backupandrestore/backupengine/src/sbpackagedatatransfer.cpp	Tue Apr 27 17:30:23 2010 +0300
@@ -354,12 +354,14 @@
             if(KErrNotSupported == err)
                 {//Non-Removable package, nothing to backup
                 iState.iState = ENone;
+                aLastSection = ETrue;
                 Cleanup();
                 return;
                 }
             else if(KErrNone != err)
                 {
                 iState.iState = ENone;
+                aLastSection = ETrue;
                 Cleanup();
                 User::Leave(err);
                 }
@@ -1413,12 +1415,22 @@
 		// We now no longer return the Z drive, it has been decided that the Z drive will always be the
 		// ROM. Backing up and restoring the ROM drive should not be possible, as what is the point
 		
-		// build package files
+		// build package files        
 		if (iMetaData == NULL)
 			{
-			iMetaData = iSWIBackup.GetMetaDataL(iPackageID, iFiles);
-			iMetaDataSize = iMetaData->Size();
-			BuildPackageFileList();
+			TRAPD( err, iMetaData = iSWIBackup.GetMetaDataL(iPackageID, iFiles) );
+			
+			if( err )
+				{
+				iMetaData = NULL;
+				iMetaDataSize = 0;
+				User::Leave( err );
+				}
+			else
+				{
+				iMetaDataSize = iMetaData->Size();
+				BuildPackageFileList();				
+				}
 			}
 		
 		TDriveList notToBackup = ipDataOwnerManager->Config().ExcludeDriveList();
@@ -1433,6 +1445,7 @@
 			}
 		
 		aDriveList = iDriveList;
+		
 		__LOG1("CPackageDataTransfer::GetDriveListL() - end - SID: 0x%08x", iPackageID.iUid);
 		}
 
--- a/backupandrestore/backuptest/burtestserver/Group/burtestserver.iby	Wed Apr 14 16:49:36 2010 +0300
+++ b/backupandrestore/backuptest/burtestserver/Group/burtestserver.iby	Tue Apr 27 17:30:23 2010 +0300
@@ -18,7 +18,6 @@
 
 file=ABI_DIR\BUILD_DIR\burtestserver.exe                            Sys\bin\burtestserver.exe
 data=EPOCROOT##Epoc32\data\z\testdata\scripts\sbetestdata\test.ini                         testdata\scripts\sbetestdata\test.ini
-data=EPOCROOT##Epoc32\data\z\testdata\scripts\sbetestdata\sbeconfig.xml                    private\10202d56\sbeconfig.xml
 data=EPOCROOT##Epoc32\data\z\testdata\scripts\sbetestdata\backup_registration.xml          testdata\scripts\sbetestdata\backup_registration.xml
 data=EPOCROOT##Epoc32\data\z\testdata\scripts\sbetestdata\increamenttest.xml               testdata\scripts\sbetestdata\increamenttest.xml
 data=EPOCROOT##Epoc32\data\z\testdata\scripts\sbetestdata\test_registration.xml            testdata\scripts\sbetestdata\test_registration.xml
@@ -36,4 +35,8 @@
 data=EPOCROOT##Epoc32\data\z\testdata\scripts\sbetestdata\test_activebackuprestore.script  testdata\scripts\sbetestdata\test_activebackuprestore.script
 data=EPOCROOT##Epoc32\data\z\testdata\scripts\sbetestdata\test_increament.script           testdata\scripts\sbetestdata\test_increament.script
 
+#ifndef __SERIES60_ 
+data=EPOCROOT##Epoc32\data\z\testdata\scripts\sbetestdata\sbeconfig.xml                    private\10202d56\sbeconfig.xml
+#endif
+
 #endif // __BUR_TEST_SERVER_IBY__
--- a/mtpdataproviders/mtpimagedp/inc/cmtpimagedp.h	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpdataproviders/mtpimagedp/inc/cmtpimagedp.h	Tue Apr 27 17:30:23 2010 +0300
@@ -63,8 +63,6 @@
     
     TMTPFormatCode FindFormat(const TDesC& aExtension);
     const TDesC& FindMimeType(const TDesC& aExtension);
-    TBool GetCacheParentHandle(const TDesC& aParentPath, TUint32& aParentHandle);
-    void  SetCacheParentHandle(const TDesC& aParentPath, TUint32 aParentHandle);
     void AppendDeleteObjectsArrayL(const TDesC& aSuid);
     void HandleDeleteObjectsArray();
     void IncreaseNewPictures(TInt aCount);
@@ -95,14 +93,7 @@
     void SessionOpenedL(const TMTPNotificationParamsSessionChange& aSession);
     void RenameObjectL(const TMTPNotificationParamsHandle& aParam);
     
-    TUint QueryImageObjectCountL();
-    
-private:
-    struct SMTPImageDpParentCache
-        {        
-        TPath   iPath;
-        TUint32 iHandle;
-        };
+    TUint QueryImageObjectCountL();    
     
 private:
 	/**
@@ -130,9 +121,7 @@
     /**
      * contain the mapping image's extension to mime type
      */
-    RHashMap<TBuf<KMaxExtNameLength>, TBuf<KMaxMimeNameLength> > iMimeMappings;    
-    
-    SMTPImageDpParentCache  iParentCache;
+    RHashMap<TBuf<KMaxExtNameLength>, TBuf<KMaxMimeNameLength> > iMimeMappings;
     
     TInt                    iActiveProcessor;
     TBool                   iActiveProcessorRemoved;    
--- a/mtpdataproviders/mtpimagedp/inc/cmtpimagedpobjectpropertymgr.h	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpdataproviders/mtpimagedp/inc/cmtpimagedpobjectpropertymgr.h	Tue Apr 27 17:30:23 2010 +0300
@@ -67,11 +67,11 @@
     
     void GetPropertyL(TMTPObjectPropertyCode aProperty, TUint8& aValue);
     void GetPropertyL(TMTPObjectPropertyCode aProperty, TUint16& aValue);
-    void GetPropertyL(TMTPObjectPropertyCode aProperty, TUint32& aValue);
+    void GetPropertyL(TMTPObjectPropertyCode aProperty, TUint32& aValue, TBool alwaysCreate = ETrue);
     void GetPropertyL(TMTPObjectPropertyCode aProperty, TUint64& aValue);
     void GetPropertyL(TMTPObjectPropertyCode aProperty, TMTPTypeUint128& aValue);
     void GetPropertyL(TMTPObjectPropertyCode aProperty, CMTPTypeString& aValue);
-    void GetPropertyL(TMTPObjectPropertyCode aProperty, CMTPTypeArray& aValue);
+    void GetPropertyL(TMTPObjectPropertyCode aProperty, CMTPTypeArray& aValue, TBool alwaysCreate = ETrue);
     
     //clear the cache
     void ClearCacheL();
--- a/mtpdataproviders/mtpimagedp/inc/cmtpimagedpsendobjectinfo.h	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpdataproviders/mtpimagedp/inc/cmtpimagedpsendobjectinfo.h	Tue Apr 27 17:30:23 2010 +0300
@@ -150,6 +150,7 @@
     
     void CreateFsObjectL();
     TMTPResponseCode ErrorToMTPError(TInt err)const;
+    TBool IsTooLarge(TUint64 aObjectSize) const;
 private: // Owned
 
     /**
--- a/mtpdataproviders/mtpimagedp/src/cmtpimagedp.cpp	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpdataproviders/mtpimagedp/src/cmtpimagedp.cpp	Tue Apr 27 17:30:23 2010 +0300
@@ -398,29 +398,29 @@
         
     case EFormatExtensionSets:
         {
-        _LIT(KFormatExtensionJpg, "0x3801:jpg::3");//3 means file dp will enumerate all image files instead of image dp.
+        _LIT(KFormatExtensionJpg, "0x3801:jpg:::3");//3 means file dp will enumerate all image files instead of image dp.
         aStrings.AppendL(KFormatExtensionJpg);
-        _LIT(KFormatExtensionJpe, "0x3801:jpe::3");
+        _LIT(KFormatExtensionJpe, "0x3801:jpe:::3");
         aStrings.AppendL(KFormatExtensionJpe);
-        _LIT(KFormatExtensionJpeg, "0x3801:jpeg::3");
+        _LIT(KFormatExtensionJpeg, "0x3801:jpeg:::3");
         aStrings.AppendL(KFormatExtensionJpeg);
         
         /*
          * bmp files
          */
-        _LIT(KFormatExtensionBmp, "0x3804:bmp::3");
+        _LIT(KFormatExtensionBmp, "0x3804:bmp:::3");
         aStrings.AppendL(KFormatExtensionBmp);
         
         /*
          * gif files
          */
-        _LIT(KFormatExtensionGif, "0x3807:gif::3");
+        _LIT(KFormatExtensionGif, "0x3807:gif:::3");
         aStrings.AppendL(KFormatExtensionGif);
         
         /*
          * png files
          */
-        _LIT(KFormatExtensionPng, "0x380B:png::3");
+        _LIT(KFormatExtensionPng, "0x380B:png:::3");
         aStrings.AppendL(KFormatExtensionPng);
         
         /*
@@ -663,6 +663,11 @@
     /**
      * copy file extension by insensitive case
      */
+    if (aExtension.Length() > KMaxExtNameLength)
+        {
+        return KNullDesC;
+        }
+    
     TBuf<KMaxExtNameLength> extension;
     extension.CopyLC(aExtension);
     
@@ -718,29 +723,6 @@
     return newPictures;
     }
 
-TBool CMTPImageDataProvider::GetCacheParentHandle(const TDesC& aParentPath, TUint32& aParentHandle)
-    {
-    TBool ret = EFalse;
-    
-    if (iParentCache.iPath.Compare(aParentPath) == 0)
-        {
-        aParentHandle = iParentCache.iHandle;
-        ret = ETrue;
-        }
-    else
-        {
-        aParentHandle = KMTPHandleNone;
-        }
-    
-    return ret;
-    }
-
-void CMTPImageDataProvider::SetCacheParentHandle(const TDesC& aParentPath, TUint32 aParentHandle)
-    {
-    iParentCache.iPath.Copy(aParentPath);
-    iParentCache.iHandle = aParentHandle;
-    }
-
 void CMTPImageDataProvider::AppendDeleteObjectsArrayL(const TDesC& aSuid)
     {
     iDeleteObjectsArray.AppendL(aSuid.AllocLC());
--- a/mtpdataproviders/mtpimagedp/src/cmtpimagedpgetobjectproplist.cpp	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpdataproviders/mtpimagedp/src/cmtpimagedpgetobjectproplist.cpp	Tue Apr 27 17:30:23 2010 +0300
@@ -364,7 +364,7 @@
         case EMTPObjectPropCodeRepresentativeSampleWidth:
             {
             TUint32 value;
-            iPropertyMgr.GetPropertyL(TMTPObjectPropertyCode(aPropCode), value);
+            iPropertyMgr.GetPropertyL(TMTPObjectPropertyCode(aPropCode), value, EFalse);
             CMTPTypeObjectPropListElement& propElem = iPropertyList->ReservePropElemL(aHandle, propCode); 
             propElem.SetUint32L(CMTPTypeObjectPropListElement::EValue, value);
             iPropertyList->CommitPropElemL(propElem);
@@ -374,7 +374,7 @@
         case EMTPObjectPropCodeRepresentativeSampleData:
             {
             CMTPTypeArray* value = CMTPTypeArray::NewLC(EMTPTypeAUINT8);
-            iPropertyMgr.GetPropertyL(TMTPObjectPropertyCode(aPropCode), *value);            
+            iPropertyMgr.GetPropertyL(TMTPObjectPropertyCode(aPropCode), *value, EFalse);            
             CMTPTypeObjectPropListElement& propElem = iPropertyList->ReservePropElemL(aHandle, propCode);
             propElem.SetArrayL(CMTPTypeObjectPropListElement::EValue, *value);            
             iPropertyList->CommitPropElemL(propElem);
--- a/mtpdataproviders/mtpimagedp/src/cmtpimagedpgetobjectpropvalue.cpp	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpdataproviders/mtpimagedp/src/cmtpimagedpgetobjectpropvalue.cpp	Tue Apr 27 17:30:23 2010 +0300
@@ -315,7 +315,7 @@
 void CMTPImageDpGetObjectPropValue::ServiceRepresentativeSampleSizeL()
     {
     TUint32 representativeSampleSize;
-    iObjectPropertyMgr.GetPropertyL(EMTPObjectPropCodeRepresentativeSampleSize, representativeSampleSize);
+    iObjectPropertyMgr.GetPropertyL(EMTPObjectPropCodeRepresentativeSampleSize, representativeSampleSize, EFalse);
     iMTPTypeUint32.Set(representativeSampleSize);
     
     SendDataL(iMTPTypeUint32);
@@ -341,7 +341,7 @@
 
 void CMTPImageDpGetObjectPropValue::ServiceRepresentativeSampleDataL()
     {
-    iObjectPropertyMgr.GetPropertyL(EMTPObjectPropCodeRepresentativeSampleData, *iMTPTypeArray);
+    iObjectPropertyMgr.GetPropertyL(EMTPObjectPropCodeRepresentativeSampleData, *iMTPTypeArray, EFalse);
     
     SendDataL(*iMTPTypeArray);
     }
--- a/mtpdataproviders/mtpimagedp/src/cmtpimagedpobjectpropertymgr.cpp	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpdataproviders/mtpimagedp/src/cmtpimagedpobjectpropertymgr.cpp	Tue Apr 27 17:30:23 2010 +0300
@@ -422,7 +422,7 @@
     __FLOG(_L8("<< CMTPImageDpObjectPropertyMgr::GetPropertyL"));
     }
 
-void CMTPImageDpObjectPropertyMgr::GetPropertyL(TMTPObjectPropertyCode aProperty, TUint32 &aValue)
+void CMTPImageDpObjectPropertyMgr::GetPropertyL(TMTPObjectPropertyCode aProperty, TUint32 &aValue, TBool alwaysCreate/* = ETrue*/)
     {
     __FLOG(_L8(">> CMTPImageDpObjectPropertyMgr::GetPropertyL"));
     __ASSERT_DEBUG(iObjectInfo, Panic(EMTPImageDpObjectNull));
@@ -450,11 +450,14 @@
             TInt err = iFs.Entry(iObjectInfo->DesC(CMTPObjectMetaData::ESuid), fileEntry);
             if (err == KErrNone)
                 {
-                iDataProvider.ThumbnailManager().GetThumbMgr()->SetFlagsL(CThumbnailManager::EDefaultFlags);
-                if(fileEntry.FileSize() > KFileSizeMax)
+                if(fileEntry.FileSize() > KFileSizeMax || !alwaysCreate)
                     {
                     iDataProvider.ThumbnailManager().GetThumbMgr()->SetFlagsL(CThumbnailManager::EDoNotCreate);
                     }
+                else
+                    {
+                    iDataProvider.ThumbnailManager().GetThumbMgr()->SetFlagsL(CThumbnailManager::EDefaultFlags);
+                    }
                 
                 /**
                  * trap the leave to avoid return general error when PC get object property list
@@ -578,7 +581,7 @@
     __FLOG(_L8("<< CMTPImageDpObjectPropertyMgr::GetPropertyL"));
     }
 
-void CMTPImageDpObjectPropertyMgr::GetPropertyL(TMTPObjectPropertyCode aProperty, CMTPTypeArray& aValue)
+void CMTPImageDpObjectPropertyMgr::GetPropertyL(TMTPObjectPropertyCode aProperty, CMTPTypeArray& aValue, TBool alwaysCreate /*= ETrue*/)
     {
     __FLOG(_L8(">> CMTPImageDpObjectPropertyMgr::GetPropertyL -- SmapleData"));       
     
@@ -599,11 +602,15 @@
             TInt err = iFs.Entry(iObjectInfo->DesC(CMTPObjectMetaData::ESuid), fileEntry);
             if (err == KErrNone)
                 {
-                iDataProvider.ThumbnailManager().GetThumbMgr()->SetFlagsL(CThumbnailManager::EDefaultFlags);
-                if(fileEntry.FileSize() > KFileSizeMax)
+                
+                if(fileEntry.FileSize() > KFileSizeMax || !alwaysCreate)
                     {
                     iDataProvider.ThumbnailManager().GetThumbMgr()->SetFlagsL(CThumbnailManager::EDoNotCreate);
                     }
+                else
+                    {
+                    iDataProvider.ThumbnailManager().GetThumbMgr()->SetFlagsL(CThumbnailManager::EDefaultFlags);
+                    }
                 
                 /**
                  * trap the leave to avoid return general error when PC get object property list
--- a/mtpdataproviders/mtpimagedp/src/cmtpimagedpsendobjectinfo.cpp	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpdataproviders/mtpimagedp/src/cmtpimagedpsendobjectinfo.cpp	Tue Apr 27 17:30:23 2010 +0300
@@ -20,9 +20,9 @@
 
 #include <f32file.h>
 #include <bautils.h>
+#include <e32const.h>
 
 #include <mtp/mmtpdataproviderframework.h>
-
 #include <mtp/cmtpobjectmetadata.h>
 #include <mtp/cmtptypefile.h>
 #include <mtp/cmtptypeobjectinfo.h>
@@ -322,7 +322,11 @@
             {
             iStorageId = iFramework.StorageMgr().DefaultStorageId();
             }
-             
+        
+        if(IsTooLarge(iObjectSize))
+            {
+            *ret = EMTPRespCodeObjectTooLarge;
+            }
         }
     
     __FLOG(_L8("CMTPImageDpSendObjectInfo::CheckObjectPropListParamsL - Exit"));
@@ -608,6 +612,11 @@
     if (result)
         {
         iObjectSize = iObjectInfo->Uint32L(CMTPTypeObjectInfo::EObjectCompressedSize);
+        if(IsTooLarge(iObjectSize))
+            {
+            SendResponseL(EMTPRespCodeObjectTooLarge);
+            result = EFalse;
+            }
         }
 
     if (result)
@@ -1277,3 +1286,40 @@
         
     return resp;
     }
+
+/**
+Check if the object is too large
+@return ETrue if yes, otherwise EFalse
+*/
+TBool CMTPImageDpSendObjectInfo::IsTooLarge(TUint64 aObjectSize) const
+    {
+    __FLOG(_L8("IsTooLarge - Entry"));
+    TBool ret(aObjectSize > KMaxTInt64);
+    
+    if(!ret)
+        {
+        TBuf<255> fsname;
+        TUint32 storageId = iStorageId;
+        if (storageId == KMTPStorageDefault)
+            {
+            storageId = iFramework.StorageMgr().DefaultStorageId();
+            }
+        TInt drive( iFramework.StorageMgr().DriveNumber(storageId) );
+        if(drive != KErrNotFound)
+            {
+            iFramework.Fs().FileSystemSubType(drive, fsname);        
+        
+            const TUint64 KMaxFatFileSize = 0xFFFFFFFF; //Maximal file size supported by all FAT filesystems (4GB-1)
+            _LIT(KFsFAT16, "FAT16");
+            _LIT(KFsFAT32, "FAT32");
+        
+            if((fsname.CompareF(KFsFAT16) == 0 || fsname.CompareF(KFsFAT32) == 0) && aObjectSize > KMaxFatFileSize)
+                {
+                ret = ETrue;
+                }
+            }
+        }
+    __FLOG_VA((_L8("Result = %d"), ret));
+    __FLOG(_L8("IsTooLarge - Exit"));
+    return ret;
+    }
--- a/mtpdataproviders/mtpimagedp/src/mtpimagedputilits.cpp	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpdataproviders/mtpimagedp/src/mtpimagedputilits.cpp	Tue Apr 27 17:30:23 2010 +0300
@@ -64,24 +64,17 @@
     return aFramework.StorageMgr().FrameworkStorageId(static_cast<TDriveNumber>(driveNumber));
     }
 
-TUint32 MTPImageDpUtilits::FindParentHandleL(MMTPDataProviderFramework& aFramework, CMTPImageDataProvider& aDataProvider, const TDesC& aFullPath)
+TUint32 MTPImageDpUtilits::FindParentHandleL(MMTPDataProviderFramework& aFramework, CMTPImageDataProvider& /*aDataProvider*/, const TDesC& aFullPath)
     {
     TUint32 parentHandle = KMTPHandleNoParent;
     TParsePtrC parse(aFullPath);
     
     if(!parse.IsRoot())
-        {   
-        if (!aDataProvider.GetCacheParentHandle(parse.DriveAndPath(), parentHandle))
-            {
-            parentHandle = aFramework.ObjectMgr().HandleL(parse.DriveAndPath());
-            if (parentHandle != KMTPHandleNone)
-                {
-                aDataProvider.SetCacheParentHandle(parse.DriveAndPath(), parentHandle);                
-                }
-            }
+        {
+        parentHandle = aFramework.ObjectMgr().HandleL(parse.DriveAndPath());
         }
     
-    return parentHandle;    
+    return parentHandle;
     }
 
 TBool MTPImageDpUtilits::IsNewPicture(const CMTPObjectMetaData& aMetadata)
--- a/mtpfws/mtpfw/daemon/server/group/mtpserver.mmp	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpfws/mtpfw/daemon/server/group/mtpserver.mmp	Tue Apr 27 17:30:23 2010 +0300
@@ -24,9 +24,9 @@
 
 #ifdef WINSCW
 //EPOCHEAPSIZE        0x1400000   0x1400000   // 20MB
-EPOCHEAPSIZE        0x80000   0x400000   // 4MB
+EPOCHEAPSIZE        0x80000   0x800000   // 8MB
 #else
-EPOCHEAPSIZE        0x80000   0x400000   // 4MB
+EPOCHEAPSIZE        0x80000   0x800000   // 8MB
 #endif
 
 MW_LAYER_SYSTEMINCLUDE_SYMBIAN
--- a/mtpfws/mtpfw/dataproviders/devdp/src/mtpdevicedpprocessor.cpp	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpfws/mtpfw/dataproviders/devdp/src/mtpdevicedpprocessor.cpp	Tue Apr 27 17:30:23 2010 +0300
@@ -51,6 +51,7 @@
 #include "cmtpgetserviceids.h"
 #include "cmtpgetserviceinfo.h"
 #include "cmtpgetformatcapabilities.h"
+#include "cmtpsetobjectprotection.h"
 /**
 device data provider mapping table from request ID to factory method of the request processor
 */
@@ -87,7 +88,8 @@
 		{EMTPOpCodeResetDevicePropValue, CMTPResetDevicePropValue::NewL},
 		{EMTPOpCodeGetServiceIDs, CMTPGetServiceIds::NewL},
 		{EMTPOpCodeGetServiceInfo, CMTPGetServiceInfo::NewL},
-		{EMTPOpCodeGetFormatCapabilities,CMTPGetFormatCapabilities::NewL}
+		{EMTPOpCodeGetFormatCapabilities,CMTPGetFormatCapabilities::NewL},
+		{EMTPOpCodeSetObjectProtection, CMTPSetObjectProtection::NewL}
 	};
 
 /**
--- a/mtpfws/mtpfw/dataproviders/dputility/bwins/mtpdataproviderutilityu.def	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpfws/mtpfw/dataproviders/dputility/bwins/mtpdataproviderutilityu.def	Tue Apr 27 17:30:23 2010 +0300
@@ -115,7 +115,7 @@
 	?FormatFromFilename@RMTPUtility@@QAE?AW4TMTPFormatCode@@ABVTDesC16@@@Z @ 114 NONAME ; enum TMTPFormatCode RMTPUtility::FormatFromFilename(class TDesC16 const &)
 	?TTime2MTPTimeStr@RMTPUtility@@QBEHABVTTime@@AAVTDes16@@@Z @ 115 NONAME ; int RMTPUtility::TTime2MTPTimeStr(class TTime const &, class TDes16 &) const
 	?MTPUtility@RMTPDpSingletons@@QBEAAVRMTPUtility@@XZ @ 116 NONAME ; class RMTPUtility & RMTPDpSingletons::MTPUtility(void) const
-	?GetDpId@RMTPUtility@@QAEKABVTDesC16@@0@Z @ 117 NONAME ; unsigned long RMTPUtility::GetDpId(class TDesC16 const &, class TDesC16 const &)
+	?GetDpId@RMTPUtility@@QAEKABVTDesC16@@0@Z @ 117 NONAME ABSENT ; unsigned long RMTPUtility::GetDpId(class TDesC16 const &, class TDesC16 const &)
 	?GetFormatByExtension@RMTPUtility@@QAE?AW4TMTPFormatCode@@ABVTDesC16@@@Z @ 118 NONAME ; enum TMTPFormatCode RMTPUtility::GetFormatByExtension(class TDesC16 const &)
 	?SessionId@CMTPRequestProcessor@@MAEKXZ @ 119 NONAME ; unsigned long CMTPRequestProcessor::SessionId(void)
 	?GetEnumerationFlag@RMTPUtility@@QAEIABVTDesC16@@@Z @ 120 NONAME ; unsigned int RMTPUtility::GetEnumerationFlag(class TDesC16 const &)
@@ -213,4 +213,7 @@
 	?NewL@CMTPFSEntryCache@@SAPAV1@XZ @ 212 NONAME ; class CMTPFSEntryCache * CMTPFSEntryCache::NewL(void)
 	?FileEntry@CMTPFSEntryCache@@QAEAAVTEntry@@XZ @ 213 NONAME ; class TEntry & CMTPFSEntryCache::FileEntry(void)
 	?RegisterPendingRequest@CMTPRequestProcessor@@IAEXI@Z @ 214 NONAME ; void CMTPRequestProcessor::RegisterPendingRequest(unsigned int)
+	?GetDpIdL@RMTPUtility@@QAEKABVTDesC16@@0@Z @ 215 NONAME ; unsigned long RMTPUtility::GetDpIdL(class TDesC16 const &, class TDesC16 const &)
+	?GetSubFormatCodeL@RMTPUtility@@QAEGABVTDesC16@@0@Z @ 216 NONAME ; unsigned short RMTPUtility::GetSubFormatCodeL(class TDesC16 const &, class TDesC16 const &)
+	?GetFormatCodeByMimeTypeL@RMTPUtility@@QAE?AW4TMTPFormatCode@@ABVTDesC16@@0@Z @ 217 NONAME ; enum TMTPFormatCode RMTPUtility::GetFormatCodeByMimeTypeL(class TDesC16 const &, class TDesC16 const &)
 
--- a/mtpfws/mtpfw/dataproviders/dputility/eabi/mtpdataproviderutilityu.def	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpfws/mtpfw/dataproviders/dputility/eabi/mtpdataproviderutilityu.def	Tue Apr 27 17:30:23 2010 +0300
@@ -210,7 +210,7 @@
 	_ZN11RMTPUtility18FormatFromFilenameERK7TDesC16 @ 209 NONAME
 	_ZN11RMTPUtility20GetFormatByExtensionERK7TDesC16 @ 210 NONAME
 	_ZN11RMTPUtility22FormatExtensionMappingEv @ 211 NONAME
-	_ZN11RMTPUtility7GetDpIdERK7TDesC16S2_ @ 212 NONAME
+	_ZN11RMTPUtility7GetDpIdERK7TDesC16S2_ @ 212 NONAME ABSENT
 	_ZNK11RMTPUtility16MTPTimeStr2TTimeERK7TDesC16R5TTime @ 213 NONAME
 	_ZNK11RMTPUtility16TTime2MTPTimeStrERK5TTimeR6TDes16 @ 214 NONAME
 	_ZNK16RMTPDpSingletons10MTPUtilityEv @ 215 NONAME
@@ -415,4 +415,7 @@
 	_ZTI16CMTPFSEntryCache @ 414 NONAME
 	_ZTV16CMTPFSEntryCache @ 415 NONAME
 	_ZN20CMTPRequestProcessor22RegisterPendingRequestEj @ 416 NONAME
+	_ZN11RMTPUtility17GetSubFormatCodeLERK7TDesC16S2_ @ 417 NONAME
+	_ZN11RMTPUtility24GetFormatCodeByMimeTypeLERK7TDesC16S2_ @ 418 NONAME
+	_ZN11RMTPUtility8GetDpIdLERK7TDesC16S2_ @ 419 NONAME
 
--- a/mtpfws/mtpfw/dataproviders/dputility/inc/cmtpextensionmapping.h	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpfws/mtpfw/dataproviders/dputility/inc/cmtpextensionmapping.h	Tue Apr 27 17:30:23 2010 +0300
@@ -34,6 +34,7 @@
 	
 	const TDesC& Extension() const;
 	TMTPFormatCode FormatCode() const;
+	TUint16 SubFormatCode() const;
 	const TDesC& MIMEType() const;
 	TUint32 DpId() const;
 	TUint EnumerationFlag() const;
@@ -42,6 +43,7 @@
 	void SetMIMETypeL(const TDesC& aMIMEType);
 	void SetDpId(const TUint32 aDpId);
 	void SetFormatCode(const TMTPFormatCode aFormatCode);
+	void SetSubFormatCode(TUint16  aSubFormatCode);
 	void SetEnumerationFlag(const TUint aNeedFileDp);
 	
 	static TInt Compare(const CMTPExtensionMapping& aFirst, const CMTPExtensionMapping& aSecond);
@@ -57,6 +59,7 @@
 	HBufC* iMIMEType;
 	TUint32 iDpId;
 	TUint   iNeedFileDp;
+	TUint16  iSubFormatCode;
 	};
 
 #endif // CMTPEXTENSIONMAPPING_H
--- a/mtpfws/mtpfw/dataproviders/dputility/inc/cmtpfsenumerator.h	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpfws/mtpfw/dataproviders/dputility/inc/cmtpfsenumerator.h	Tue Apr 27 17:30:23 2010 +0300
@@ -65,7 +65,7 @@
 	void ScanNextSubdirL();
 	void ProcessEntriesL();
 	void AddEntryL(const TDesC& aPath, TUint32 &aHandle, TMTPFormatCode format, TUint32 aDPId, const TEntry& aEntry, TUint32 aStorageId, TUint32 aParentHandle);
-	void AddFileEntryForOtherDpL(const TDesC& aPath, TUint32 &aHandle, TMTPFormatCode format, TUint32 aDPId, const TEntry& aEntry, TUint32 aStorageId, TUint32 aParentHandle);
+	void AddFileEntryForOtherDpL(const TDesC& aPath, TUint32 &aHandle, TMTPFormatCode format, TUint32 aDPId, const TEntry& aEntry, TUint32 aStorageId, TUint32 aParentHandle, TUint16 aSubFormatCode = 0);
 	void NotifyObjectAddToDP(const TUint32 aHandle,const TUint DpId);
 	
 	
--- a/mtpfws/mtpfw/dataproviders/dputility/inc/cmtpmoveobject.h	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpfws/mtpfw/dataproviders/dputility/inc/cmtpmoveobject.h	Tue Apr 27 17:30:23 2010 +0300
@@ -24,10 +24,13 @@
 #include "rmtpframework.h"
 #include "cmtprequestprocessor.h"
 #include "mtpdebug.h"
+#include "rmtpdpsingletons.h"
 
 class CFileMan;
 class CMTPObjectMetaData;
 
+const TInt KMoveObjectTimeOut = 180000000; // 180s
+
 /** 
 Defines data provider MoveObject request processor
 
@@ -48,7 +51,9 @@
 
 private:	//from CMTPRequestProcessor
 	virtual void ServiceL();
-    TMTPResponseCode CheckRequestL();
+	TMTPResponseCode CheckRequestL();
+	TBool DoHandleCompletingPhaseL();
+	TBool Match(const TMTPTypeRequest& aRequest, MMTPConnection& aConnection) const;
 	
 private:
 	void ConstructL();
@@ -60,19 +65,26 @@
 	void SetPreviousPropertiesL(const TDesC& aFileName);
 	void MoveFileL(const TDesC& aNewFileName);
 	void MoveFolderL();
+	static TInt OnTimeoutL(TAny* aPtr);
+	void DoOnTimeoutL();
+	void RunL();
 	
 private:	
-	CFileMan*				iFileMan;
+	CFileMan*							iFileMan;
 	CMTPObjectMetaData*		iObjectInfo;	//Not owned.
-	HBufC*					iDest;
-	HBufC*					iNewRootFolder;
-	TUint32					iNewParentHandle;
-	TUint32					iStorageId;
-	TTime					iPreviousModifiedTime;
-	HBufC*					iPathToMove;
-	RArray<TUint>           iObjectHandles;
-	TInt                    iMoveObjectIndex;
-    RMTPFramework           iSingletons;
+	HBufC*								iDest;
+	HBufC*								iNewRootFolder;
+	TUint32								iNewParentHandle;
+	TUint32								iStorageId;
+	TTime									iPreviousModifiedTime;
+	HBufC*								iPathToMove;
+	RArray<TUint>					iObjectHandles;
+	TInt									iMoveObjectIndex;
+	RMTPFramework					iSingletons;
+	RMTPDpSingletons			iDpSingletons;
+	CPeriodic*						iTimer;
+	HBufC*								iNewFileName;
+	TBool									iIsFolder;
 	/**
     FLOGGER debug trace member variable.
     */
--- a/mtpfws/mtpfw/dataproviders/dputility/inc/cmtpsendobjectinfo.h	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpfws/mtpfw/dataproviders/dputility/inc/cmtpsendobjectinfo.h	Tue Apr 27 17:30:23 2010 +0300
@@ -128,6 +128,8 @@
     TFileName				iName;
     TBool					iNoRollback;
     RMTPFramework           iSingletons;
+    static const TInt       KExtensionLength = 8; 
+    RArray< TBuf<KExtensionLength> > iExceptionList;
     };
     
 #endif //CMTPSENDOBJECTINFO_H
--- a/mtpfws/mtpfw/dataproviders/dputility/inc/cmtpsetobjectprotection.h	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpfws/mtpfw/dataproviders/dputility/inc/cmtpsetobjectprotection.h	Tue Apr 27 17:30:23 2010 +0300
@@ -57,7 +57,7 @@
 private:
     RFs&                    iRfs;
     CMTPObjectMetaData*     iObjMeta;
-    
+    RMTPFramework           iSingletons;
     };
     
 #endif
--- a/mtpfws/mtpfw/dataproviders/dputility/inc/rmtputility.h	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpfws/mtpfw/dataproviders/dputility/inc/rmtputility.h	Tue Apr 27 17:30:23 2010 +0300
@@ -49,9 +49,20 @@
 	IMPORT_C TMTPFormatCode FormatFromFilename( const TDesC& aFullFileName );
 	IMPORT_C void FormatExtensionMapping();
 	IMPORT_C TMTPFormatCode GetFormatByExtension(const TDesC& aExtension);
-	IMPORT_C TUint32 GetDpId(const TDesC& aExtension,const TDesC& aMIMEType);
+	IMPORT_C TUint32 GetDpIdL(const TDesC& aExtension,const TDesC& aMIMEType);
+    IMPORT_C TUint16 GetSubFormatCodeL(const TDesC& aExtension,const TDesC& aMIMEType);
+    IMPORT_C TMTPFormatCode GetFormatCodeByMimeTypeL(const TDesC& aExtension,const TDesC& aMIMEType);
     IMPORT_C TUint GetEnumerationFlag(const TDesC& aExtension);	
-	
+private:
+    enum TParseState
+        {
+        EFormatCode,
+        Extension,
+        EMimeType,
+        ESubFormatCode,
+        EnumerationFlag,
+        EParseStateEnd
+        };
 private:
 	void RenameAllChildrenL(TUint32 aStorageId, TUint32 aParentHandle, const TDesC& aNewFolderName, const TDesC& aOldFolderName);
 	TBool GetYear(const TDesC& aTimeString, TInt& aYear) const;
@@ -63,18 +74,24 @@
 	TBool GetTenthSecond(const TDesC& aTimeString, TInt& aTenthSecond) const;
 	TBool GetTimeZone(const TDesC& aTimeString, TBool& aPositiveTimeZone, TInt& aTimeZoneInHour, TInt& aTimeZoneInMinute) const;
 	HBufC* OdfMimeTypeL( const TDesC& aFullFileName );
-	void AppendFormatExtensionMapping(const CDesCArray& aFormatExtensionMapping,TUint32 aDpId);
+	void AppendFormatExtensionMappingL(const CDesCArray& aFormatExtensionMapping,TUint32 aDpId);
 	void GetAllDecendents(TUint32 aStorageId, TUint aParentHandle, RArray<TUint>& aHandles) const;
 	
+	void ParseFormatCode(const TDesC& aString, CMTPExtensionMapping& aMapping, TParseState& aState);
+	void ParseExtension(const TDesC& aString, CMTPExtensionMapping& aMapping, TParseState& aState);
+	void ParseMimeType(const TDesC& aString, CMTPExtensionMapping& aMapping, TParseState& aState);
+	void ParseSubFormatCode(const TDesC& aString, CMTPExtensionMapping& aMapping, TParseState& aState);
+	void ParseEnumerationFlag(const TDesC& aString, CMTPExtensionMapping& aMapping, TParseState& aState);
+	void Parse(const TDesC& aString, CMTPExtensionMapping& aMapping, TParseState& aState);
 private:
     /**
     FLOGGER debug trace member variable.
     */
     __FLOG_DECLARATION_MEMBER_MUTABLE;
-    
 	MMTPDataProviderFramework*  iFramework;
 	RMTPFramework				iSingleton;
     RPointerArray<CMTPExtensionMapping> iFormatMappings;
+    TUint                iEnumFlag; //temp code will remove after the correct their format string
     
 	};
 
--- a/mtpfws/mtpfw/dataproviders/dputility/src/cmtpcopyobject.cpp	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpfws/mtpfw/dataproviders/dputility/src/cmtpcopyobject.cpp	Tue Apr 27 17:30:23 2010 +0300
@@ -127,8 +127,13 @@
 	{	
 	__FLOG(_L8("ServiceL - Entry"));
 	TUint32 handle = KMTPHandleNone;
-	TMTPResponseCode responseCode = CopyObjectL(handle);
-	if(responseCode != EMTPRespCodeOK)
+	TMTPResponseCode responseCode = EMTPRespCodeOK;
+	TRAPD(err, responseCode = CopyObjectL(handle));
+	if(err != KErrNone)
+		{
+		SendResponseL(EMTPRespCodeAccessDenied);
+		}
+	else if(responseCode != EMTPRespCodeOK)
 		{
 		__FLOG_VA((_L8("ServiceL, sending response with respond code %d"), responseCode));
 		SendResponseL(responseCode);
--- a/mtpfws/mtpfw/dataproviders/dputility/src/cmtpextensionmapping.cpp	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpfws/mtpfw/dataproviders/dputility/src/cmtpextensionmapping.cpp	Tue Apr 27 17:30:23 2010 +0300
@@ -65,6 +65,11 @@
 	return iFormatCode;
 	}
 
+TUint16 CMTPExtensionMapping::SubFormatCode() const
+    {
+    return iSubFormatCode;
+    }
+
 TUint32 CMTPExtensionMapping::DpId() const
     {
     return iDpId;
@@ -79,7 +84,6 @@
 	{
 	delete iExtension;
 	iExtension = NULL;
-	
 	iExtension = aExtension.AllocL();	
 	}
 
@@ -100,6 +104,10 @@
     {
     iFormatCode = aFormatCode;
     }
+void CMTPExtensionMapping::SetSubFormatCode(TUint16  aSubFormatCode)
+    {
+    iSubFormatCode = aSubFormatCode;
+    }
 
 void CMTPExtensionMapping::SetEnumerationFlag(const TUint aNeedFileDp)
     {
--- a/mtpfws/mtpfw/dataproviders/dputility/src/cmtpfsenumerator.cpp	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpfws/mtpfw/dataproviders/dputility/src/cmtpfsenumerator.cpp	Tue Apr 27 17:30:23 2010 +0300
@@ -456,7 +456,7 @@
         {
         const TEntry& entry = iEntries[i];
         iCurrentPath.Append(entry.iName);
-        __FLOG_VA((_L8("Process path %S name %S"), &iCurrentPath, &entry.iName));
+        __FLOG_VA((_L("Process path %S name %S"), &iCurrentPath, &entry.iName));
 #ifdef __FLOG_ACTIVE    
         TBuf8<KMTPMaxFullFileName> tmp;
         tmp.Copy(iCurrentPath);
@@ -531,7 +531,7 @@
                         if (KMTPHandleNone == iFramework.ObjectMgr().HandleL(iCurrentPath))
                             {
                             format = iDpSingletons.MTPUtility().GetFormatByExtension(parse.Ext().Mid(1));  
-                            TUint32 DpId = iDpSingletons.MTPUtility().GetDpId(parse.Ext().Mid(1), KNullDesC);
+                            TUint32 DpId = iDpSingletons.MTPUtility().GetDpIdL(parse.Ext().Mid(1), KNullDesC);
                             AddFileEntryForOtherDpL(iCurrentPath, handle, format, DpId, entry, iStorages[iScanPos], iParentHandle);
                             }
                         break;
@@ -542,33 +542,23 @@
                         TUint32 DpId = iFramework.DataProviderId();
                         if (parse.Ext().CompareF(KTxtExtensionODF)==0)
                             {
-                            format = iDpSingletons.MTPUtility().FormatFromFilename(parse.Ext().Mid(1));
-                            if ( EMTPFormatCode3GPContainer==format || EMTPFormatCodeMP4Container==format )
+                            HBufC* mime = iDpSingletons.MTPUtility().ContainerMimeType(iCurrentPath);
+                            CleanupStack::PushL(mime);
+                            if ( mime != NULL )
                                 {
-                                DpId = iDpSingletons.MTPUtility().GetDpId(parse.Ext().Mid(1),KNullDesC);
-                                if ( 255 == DpId )
-                                    {
-                                    HBufC* mime = NULL;
-                                    mime = iDpSingletons.MTPUtility().ContainerMimeType(iCurrentPath);
-                                    if ( mime != NULL )
-                                        {
-                                        DpId = iDpSingletons.MTPUtility().GetDpId(parse.Ext().Mid(1),*mime);
-                                        delete mime;
-                                        mime = NULL;
-                                        }
-                                    }
-                                AddFileEntryForOtherDpL(iCurrentPath, handle, format, DpId, entry, iStorages[iScanPos], iParentHandle);
+                                __FLOG_VA((_L("mime %S"), mime));
+                                DpId = iDpSingletons.MTPUtility().GetDpIdL(parse.Ext().Mid(1),*mime);
+                                __FLOG_VA((_L("DpId find %d"), DpId));
                                 }
-                            else
-                                {
-                                format = EMTPFormatCodeUndefined;
-                                AddEntryL(iCurrentPath, handle, format, iDpID, entry, iStorages[iScanPos], iParentHandle);
-                                }
+                            format = iDpSingletons.MTPUtility().GetFormatCodeByMimeTypeL(parse.Ext().Mid(1),*mime);
+                            AddFileEntryForOtherDpL(iCurrentPath, handle, format, DpId, entry, iStorages[iScanPos], 
+                                    iParentHandle, iDpSingletons.MTPUtility().GetSubFormatCodeL(parse.Ext().Mid(1),*mime));
+                            CleanupStack::PopAndDestroy(mime);
                             }
                         else
                             {
                             format = iDpSingletons.MTPUtility().GetFormatByExtension(parse.Ext().Mid(1));  
-                            TUint32 DpId = iDpSingletons.MTPUtility().GetDpId(parse.Ext().Mid(1), KNullDesC);
+                            TUint32 DpId = iDpSingletons.MTPUtility().GetDpIdL(parse.Ext().Mid(1), KNullDesC);
                             AddFileEntryForOtherDpL(iCurrentPath, handle, format, DpId, entry, iStorages[iScanPos], iParentHandle);
                             }
                         }
@@ -637,7 +627,7 @@
 	__FLOG_VA(_L8("AddEntryL - exit"));	
 	}
 
-void CMTPFSEnumerator::AddFileEntryForOtherDpL(const TDesC& aPath, TUint32 &aHandle, TMTPFormatCode format, TUint32 aDPId, const TEntry& /*aEntry*/, TUint32 aStorageId, TUint32 aParentHandle)
+void CMTPFSEnumerator::AddFileEntryForOtherDpL(const TDesC& aPath, TUint32 &aHandle, TMTPFormatCode format, TUint32 aDPId, const TEntry& /*aEntry*/, TUint32 aStorageId, TUint32 aParentHandle, TUint16 aSubFormatCode/* = 0*/)
     {
 #ifdef __FLOG_ACTIVE    
     TBuf8<KMaxFileName> tmp;
@@ -646,7 +636,6 @@
     __FLOG_VA((_L8("AddFileEntryForOtherDpL - entry: %S"), &tmp));
 #endif // __FLOG_ACTIVE
 
-    TUint16 assoc = EMTPAssociationTypeUndefined;
     TParsePtrC pathParser(aPath);
     TPtrC name(pathParser.Name());    
     
@@ -656,7 +645,7 @@
     iObject->SetUint(CMTPObjectMetaData::EFormatCode, format);
     iObject->SetUint(CMTPObjectMetaData::EStorageId, aStorageId);
     iObject->SetDesCL(CMTPObjectMetaData::ESuid, aPath);
-    iObject->SetUint(CMTPObjectMetaData::EFormatSubCode, assoc);
+    iObject->SetUint(CMTPObjectMetaData::EFormatSubCode, aSubFormatCode);
     iObject->SetUint(CMTPObjectMetaData::EParentHandle, aParentHandle);
     iObject->SetUint(CMTPObjectMetaData::ENonConsumable, EMTPConsumable);
     iObject->SetDesCL(CMTPObjectMetaData::EName, name);
--- a/mtpfws/mtpfw/dataproviders/dputility/src/cmtpmoveobject.cpp	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpfws/mtpfw/dataproviders/dputility/src/cmtpmoveobject.cpp	Tue Apr 27 17:30:23 2010 +0300
@@ -23,6 +23,7 @@
 #include <mtp/cmtptypearray.h>
 #include <mtp/cmtptypestring.h>
 
+#include "cmtpfsentrycache.h"
 #include "cmtpstoragemgr.h"
 #include "cmtpmoveobject.h"
 #include "mtpdppanic.h"
@@ -61,12 +62,17 @@
 Destructor
 */	
 EXPORT_C CMTPMoveObject::~CMTPMoveObject()
-	{	
+	{
+	Cancel();
+	iDpSingletons.Close();
+	iSingletons.Close();
+	
+	delete iTimer;
+	delete iNewFileName;
 	delete iDest;
 	delete iFileMan;
 	delete iPathToMove;
-	delete iNewRootFolder;
-	iSingletons.Close();
+	delete iNewRootFolder;	
 	__FLOG_CLOSE;
 	}
 
@@ -75,7 +81,7 @@
 */	
 CMTPMoveObject::CMTPMoveObject(MMTPDataProviderFramework& aFramework, MMTPConnection& aConnection) :
 	CMTPRequestProcessor(aFramework, aConnection, sizeof(KMTPMoveObjectPolicy)/sizeof(TMTPRequestElementInfo), KMTPMoveObjectPolicy),
-	iMoveObjectIndex(0)
+	iMoveObjectIndex(0), iTimer(NULL)
 	{
 	__FLOG_OPEN(KMTPSubsystem, KComponent);
 	}
@@ -104,6 +110,21 @@
 		result = EMTPRespCodeStoreReadOnly;
 		}
 	
+	if(result == EMTPRespCodeOK)
+		{
+		const TDesC& suid(iObjectInfo->DesC(CMTPObjectMetaData::ESuid));
+		iIsFolder = EFalse;
+		User::LeaveIfError(BaflUtils::IsFolder(iFramework.Fs(), suid, iIsFolder));
+		if(!iIsFolder)
+			{
+			if(iDpSingletons.MovingBigFileCache().IsOnGoing())
+				{
+				__FLOG(_L8("CheckRequestL - A big file moving is ongoing, respond with access denied"));
+				result = EMTPRespCodeAccessDenied;
+				}
+			}
+		}
+	
     __FLOG(_L8("CheckRequestL - Exit"));
 	return result;	
 	} 
@@ -112,7 +133,8 @@
 MoveObject request handler
 */		
 void CMTPMoveObject::ServiceL()
-	{	
+	{
+	__FLOG(_L8("ServiceL - Entry"));
 	TMTPResponseCode ret = EMTPRespCodeOK;
 	TRAPD(err, ret = MoveObjectL());
 	if (err != KErrNone)
@@ -123,6 +145,7 @@
 		{
 		SendResponseL(ret);
 		}
+	__FLOG(_L8("ServiceL - Exit"));
 	}
 
 /**
@@ -131,6 +154,7 @@
 void CMTPMoveObject::ConstructL()
     {
 	iSingletons.OpenL();
+	iDpSingletons.OpenL(iFramework);
     }
     
 
@@ -143,12 +167,38 @@
 	__FLOG(_L8("MoveFileL - Entry"));
 	const TDesC& suid(iObjectInfo->DesC(CMTPObjectMetaData::ESuid));
 	GetPreviousPropertiesL(suid);
-	User::LeaveIfError(iFileMan->Move(suid, *iDest));
-	SetPreviousPropertiesL(aNewFileName);
-	iObjectInfo->SetDesCL(CMTPObjectMetaData::ESuid, aNewFileName);
-	iObjectInfo->SetUint(CMTPObjectMetaData::EStorageId, iStorageId);
-	iObjectInfo->SetUint(CMTPObjectMetaData::EParentHandle, iNewParentHandle);
-	iFramework.ObjectMgr().ModifyObjectL(*iObjectInfo);
+	
+	if(iFramework.StorageMgr().DriveNumber(iObjectInfo->Uint(CMTPObjectMetaData::EStorageId)) ==
+			iFramework.StorageMgr().DriveNumber(iStorageId))
+		//Move file to the same storage
+		{
+		User::LeaveIfError(iFileMan->Move(suid, *iDest));
+		SetPreviousPropertiesL(aNewFileName);
+		iObjectInfo->SetDesCL(CMTPObjectMetaData::ESuid, aNewFileName);
+		iObjectInfo->SetUint(CMTPObjectMetaData::EStorageId, iStorageId);
+		iObjectInfo->SetUint(CMTPObjectMetaData::EParentHandle, iNewParentHandle);
+		iFramework.ObjectMgr().ModifyObjectL(*iObjectInfo);
+		SendResponseL(EMTPRespCodeOK);
+		}
+	else
+		//Move file between different storages
+		{
+		delete iNewFileName;
+		iNewFileName = NULL;
+		iNewFileName = aNewFileName.AllocL(); // Store the new file name
+		
+		User::LeaveIfError(iFileMan->Move(suid, *iDest, CFileMan::EOverWrite, iStatus));
+		if ( !IsActive() )
+		{  
+		SetActive();
+		}
+		
+		delete iTimer;
+		iTimer = NULL;
+		iTimer = CPeriodic::NewL(EPriorityStandard);
+		TTimeIntervalMicroSeconds32 KMoveObjectIntervalNone = 0;	
+		iTimer->Start(TTimeIntervalMicroSeconds32(KMoveObjectTimeOut), KMoveObjectIntervalNone, TCallBack(CMTPMoveObject::OnTimeoutL, this));		
+		}
 	__FLOG(_L8("MoveFileL - Exit"));
 	}
 
@@ -206,10 +256,7 @@
 	TParsePtrC fileNameParser(suid);
 	
 	// Check if the object is a folder or a file.
-	TBool isFolder = EFalse;
-	User::LeaveIfError(BaflUtils::IsFolder(iFramework.Fs(), suid, isFolder));	
-				
-	if(!isFolder)
+	if(!iIsFolder)
 		{
 		if((newObjectName.Length() + fileNameParser.NameAndExt().Length()) <= newObjectName.MaxLength())
 			{
@@ -239,10 +286,9 @@
 		iFileMan = NULL;
 		iFileMan = CFileMan::NewL(iFramework.Fs());
 		
-		if(!isFolder)
+		if(!iIsFolder)
 			{
 			MoveFileL(newObjectName);
-			SendResponseL(responseCode);
 			}
 		else
 			{		
@@ -347,7 +393,129 @@
 	__FLOG(_L8("SetPreviousPropertiesL - Exit"));
 	}
 
+/**
+ Call back function, called when the timer expired for big file moving.
+ Send response to initiator and cache the target file entry info, which is used to send response 
+ to getobjectproplist and getobjectinfo.
+*/
+TInt CMTPMoveObject::OnTimeoutL(TAny* aPtr)
+	{
+	CMTPMoveObject* moveObjectProcessor = static_cast<CMTPMoveObject*>(aPtr);
+	moveObjectProcessor->DoOnTimeoutL();
+	return KErrNone;
+	}
 
+void CMTPMoveObject::DoOnTimeoutL()
+	{
+	__FLOG(_L8("DoOnTimeoutL - Entry"));
+	
+	if (iTimer)
+		{
+		if (iTimer->IsActive())
+			{
+			iTimer->Cancel();
+			}
+		delete iTimer;
+		iTimer = NULL;
+		}
+	
+	const TDesC& suid(iObjectInfo->DesC(CMTPObjectMetaData::ESuid));
+	TEntry fileEntry;
+	User::LeaveIfError(iFramework.Fs().Entry(suid, fileEntry));
+	TUint32 handle = iObjectInfo->Uint(CMTPObjectMetaData::EHandle);
+	
+	iObjectInfo->SetDesCL(CMTPObjectMetaData::ESuid, *iNewFileName);
+	iObjectInfo->SetUint(CMTPObjectMetaData::EStorageId, iStorageId);
+	iObjectInfo->SetUint(CMTPObjectMetaData::EParentHandle, iNewParentHandle);
+	iFramework.ObjectMgr().ModifyObjectL(*iObjectInfo);
+	
+	CMTPFSEntryCache& aCache = iDpSingletons.MovingBigFileCache();
+	
+	// Cache the target file entry info, which is used to send response to getobjectproplist and getobjectinfo
+	aCache.SetOnGoing(ETrue);
+	aCache.SetTargetHandle(handle);
+	aCache.SetFileEntry(fileEntry);	
+	
+	__FLOG(_L8("UpdateFSEntryCache, sending response with respond code OK for a big file move"));
+	SendResponseL(EMTPRespCodeOK);
+	
+	__FLOG(_L8("DoOnTimeoutL - Exit"));
+	}
 
+/**
+ CMTPMoveObject::RunL
+*/
+void CMTPMoveObject::RunL()
+	{
+	__FLOG(_L8("RunL - Entry"));
+	
+	User::LeaveIfError(iStatus.Int());
+	SetPreviousPropertiesL(*iNewFileName);
+	CMTPFSEntryCache& aCache = iDpSingletons.MovingBigFileCache();
+	// Check to see if we are moving a big file
+	if(aCache.IsOnGoing())
+		{
+		__FLOG(_L8("RunL - Big file move complete"));
+		aCache.SetOnGoing(EFalse);
+		aCache.SetTargetHandle(KMTPHandleNone);
+		}
+	else
+		{
+		//Cancel the timer
+		if(iTimer)
+			{
+			if(iTimer->IsActive())
+				{
+				iTimer->Cancel();
+				}
+			delete iTimer;
+			iTimer = NULL;
+			}
 
+		iObjectInfo->SetDesCL(CMTPObjectMetaData::ESuid, *iNewFileName);
+		iObjectInfo->SetUint(CMTPObjectMetaData::EStorageId, iStorageId);
+		iObjectInfo->SetUint(CMTPObjectMetaData::EParentHandle, iNewParentHandle);
+		iFramework.ObjectMgr().ModifyObjectL(*iObjectInfo);
 
+		__FLOG(_L8("RunL, sending response with respond code OK for a normal file move"));
+		SendResponseL(EMTPRespCodeOK);
+		}
+	__FLOG(_L8("RunL - Exit"));
+	}
+
+/**
+Override to handle the complete phase of move object
+*/
+TBool CMTPMoveObject::DoHandleCompletingPhaseL()
+	{
+	CMTPRequestProcessor::DoHandleCompletingPhaseL();
+	
+	CMTPFSEntryCache& aCache = iDpSingletons.MovingBigFileCache();
+	if(aCache.IsOnGoing())
+		{
+		return EFalse;
+		}
+	else
+		{
+		return ETrue;
+		}
+	}
+
+/**
+Override to match MoveObject request
+@param aRequest    The request to match
+@param aConnection The connection from which the request comes
+@return ETrue if the processor can handle the request, otherwise EFalse
+*/        
+TBool CMTPMoveObject::Match(const TMTPTypeRequest& aRequest, MMTPConnection& aConnection) const
+	{
+	__FLOG(_L8("Match - Entry"));
+	TBool result = EFalse;
+	TUint16 operationCode = aRequest.Uint16(TMTPTypeRequest::ERequestOperationCode);
+	if ((operationCode == EMTPOpCodeMoveObject) && &iConnection == &aConnection)
+	{
+	result = ETrue;
+	}    
+	__FLOG_VA((_L8("Match -- Exit with result = %d"), result));
+	return result;
+	}
--- a/mtpfws/mtpfw/dataproviders/dputility/src/cmtpsendobjectinfo.cpp	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpfws/mtpfw/dataproviders/dputility/src/cmtpsendobjectinfo.cpp	Tue Apr 27 17:30:23 2010 +0300
@@ -220,6 +220,10 @@
     iDpSingletons.OpenL(iFramework);
     iNoRollback = EFalse;
     iSingletons.OpenL();
+    _LIT(KM4A, ".m4a");
+    _LIT(KODF, ".odf");
+    iExceptionList.AppendL(KM4A());
+    iExceptionList.AppendL(KODF());
     __FLOG(_L8("ConstructL - Exit"));
     }
 
@@ -707,38 +711,48 @@
         //with folder creation.
 
         if(!iIsFolder)
-        	{
-			SetPropertiesL();    
-        	iFramework.ObjectMgr().CommitReservedObjectHandleL(*iReceivedObject);
-        	
-        	TParsePtrC file( iFullPath );
-        	_LIT( KTxtExtensionODF, ".odf" );
-        	if ( file.ExtPresent() && file.Ext().CompareF(KTxtExtensionODF)==0 )
-        	    {
-        	    TUint32 DpId = iFramework.DataProviderId();
-        	    DpId = iDpSingletons.MTPUtility().GetDpId(file.Ext().Mid(1),KNullDesC);
-        	    //The data provider which owns all mimetypes of a file extension is not found 
-        	    if ( 255 == DpId )
-        	        {
-        	        HBufC* mime = NULL;
-        	        mime = iDpSingletons.MTPUtility().ContainerMimeType(iFullPath);
-        	        if ( mime != NULL )
-        	            {
-        	            DpId = iDpSingletons.MTPUtility().GetDpId(file.Ext().Mid(1),*mime);
-        	            delete mime;
-        	            mime = NULL;
-        	            }
-        	        }
-        	    if ( DpId!=iFramework.DataProviderId() && DpId!=255)
-        	        {
-        	        iReceivedObject->SetUint(CMTPObjectMetaData::EDataProviderId,DpId);
-        	        //iReceivedObject->SetUint(CMTPObjectMetaData::EFormatCode,format);
-        	        iFramework.ObjectMgr().ModifyObjectL(*iReceivedObject);
-        	        TUint32 handle = iReceivedObject->Uint(CMTPObjectMetaData::EHandle);
-        	        iSingletons.DpController().NotifyDataProvidersL(DpId,EMTPObjectAdded,(TAny*)&handle);
-        	        }
-        	    }
-        	}
+            {
+            SetPropertiesL();    
+            iFramework.ObjectMgr().CommitReservedObjectHandleL(*iReceivedObject);
+            iFullPath.LowerCase();
+            __FLOG_VA((_L8("File Name %S"), &iFullPath));
+            TParsePtrC file( iFullPath );
+            if ( file.ExtPresent() && iExceptionList.Find(file.Ext()) != KErrNotFound)
+                {
+                TUint32 DpId = iFramework.DataProviderId();
+                HBufC* mime = iDpSingletons.MTPUtility().ContainerMimeType(iFullPath);
+                CleanupStack::PushL(mime);
+                if ( mime != NULL )
+                    {
+                    DpId = iDpSingletons.MTPUtility().GetDpIdL(file.Ext().Mid(1),*mime);
+                    }
+                else
+                    {
+                    DpId = iDpSingletons.MTPUtility().GetDpIdL(file.Ext().Mid(1), KNullDesC);
+                    }
+                if ( DpId!=iFramework.DataProviderId())
+                    {
+                    iReceivedObject->SetUint(CMTPObjectMetaData::EDataProviderId,DpId);
+                    TUint32 format = EMTPFormatCodeUndefined;
+                    TUint16 subFormat = 0;
+                    if(mime != NULL)
+                        {
+                        format = iDpSingletons.MTPUtility().GetFormatCodeByMimeTypeL(file.Ext().Mid(1),*mime);
+                        subFormat = iDpSingletons.MTPUtility().GetSubFormatCodeL(file.Ext().Mid(1),*mime);
+                        }
+                    else
+                        {
+                        format = iDpSingletons.MTPUtility().GetFormatByExtension(file.Ext().Mid(1));
+                        }
+                    iReceivedObject->SetUint(CMTPObjectMetaData::EFormatCode,format);
+                    iReceivedObject->SetUint(CMTPObjectMetaData::EFormatSubCode,subFormat);
+                    iFramework.ObjectMgr().ModifyObjectL(*iReceivedObject);
+                    TUint32 handle = iReceivedObject->Uint(CMTPObjectMetaData::EHandle);
+                    iSingletons.DpController().NotifyDataProvidersL(DpId,EMTPObjectAdded,(TAny*)&handle);
+                    }
+                CleanupStack::PopAndDestroy(mime);
+                }
+            }
         
         SendResponseL(EMTPRespCodeOK);
 	    }
--- a/mtpfws/mtpfw/dataproviders/dputility/src/cmtpsetobjectpropvalue.cpp	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpfws/mtpfw/dataproviders/dputility/src/cmtpsetobjectpropvalue.cpp	Tue Apr 27 17:30:23 2010 +0300
@@ -28,6 +28,7 @@
 #include "mtpframeworkconst.h"
 #include "rmtpdpsingletons.h"
 #include "rmtputility.h"
+#include "cmtpstoragemgr.h"
 
 /**
 Verification data for the SetObjectPropValue request
@@ -109,6 +110,11 @@
     CMTPObjectMetaData* meta = iRequestChecker->GetObjectInfo(handle);
     __ASSERT_DEBUG(meta, Panic(EMTPDpObjectNull));
     
+    if(!iSingleton.StorageMgr().IsReadWriteStorage(meta->Uint(CMTPObjectMetaData::EStorageId)))
+   		{
+		responseCode = EMTPRespCodeAccessDenied;
+   		}
+    
 	if(responseCode == EMTPRespCodeOK)
 		{
 		TUint32 propCode = Request().Uint32(TMTPTypeRequest::ERequestParameter2);
--- a/mtpfws/mtpfw/dataproviders/dputility/src/cmtpsetobjectprotection.cpp	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpfws/mtpfw/dataproviders/dputility/src/cmtpsetobjectprotection.cpp	Tue Apr 27 17:30:23 2010 +0300
@@ -28,6 +28,7 @@
 #include "mtpframeworkconst.h"
 #include "rmtpdpsingletons.h"
 #include "rmtputility.h"
+#include "cmtpstoragemgr.h"
 
 /**
 Verification data for the SetObjectPropValue request
@@ -63,6 +64,7 @@
 EXPORT_C CMTPSetObjectProtection::~CMTPSetObjectProtection()
     {   
     delete iObjMeta;
+    iSingletons.Close();
     }
 
 /**
@@ -85,6 +87,11 @@
         {
         return EMTPRespCodeInvalidObjectHandle;
         }
+    if(!iSingletons.StorageMgr().IsReadWriteStorage(iObjMeta->Uint(CMTPObjectMetaData::EStorageId)))
+		{
+		return EMTPRespCodeAccessDenied; //EMTPRespCodeStoreReadOnly
+		}
+    
     TUint32 statusValue = Request().Uint32(TMTPTypeRequest::ERequestParameter2);
     //Currently we only support EMTPProtectionNoProtection and EMTPProtectionReadOnly
     if ( statusValue!=EMTPProtectionNoProtection && statusValue!=EMTPProtectionReadOnly )
@@ -151,4 +158,5 @@
 void CMTPSetObjectProtection::ConstructL()
     {   
     iObjMeta = CMTPObjectMetaData::NewL();
+    iSingletons.OpenL();
     }
--- a/mtpfws/mtpfw/dataproviders/dputility/src/rmtputility.cpp	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpfws/mtpfw/dataproviders/dputility/src/rmtputility.cpp	Tue Apr 27 17:30:23 2010 +0300
@@ -31,13 +31,14 @@
 #include "cmtpdataprovidercontroller.h"
 #include "cmtpextensionmapping.h"
 #include "cmtpdataprovider.h"
+#include "mtpframeworkconst.h"
 
 using namespace ContentAccess;
 // Class constants.
 const TInt KMTPDateStringLength = 15;
 const TInt KMTPDateStringTIndex = 8;
 const TInt KMimeTypeMaxLength = 76;
-const TInt KMAXPackageIDStringLen = 32;
+//const TInt KMAXPackageIDStringLen = 32;
 
 _LIT( KTxtBackSlash, "\\" );
     
@@ -373,8 +374,8 @@
     if ( file.Ext().CompareF( KTxtExtensionODF ) == 0 )
         {
         TRAP( err, mime = OdfMimeTypeL( aFullPath ) );
+        __FLOG_VA((_L("ContainerMimeType err %d mime %S"), err, mime));
         }
-
     return mime;
     }
 
@@ -386,8 +387,10 @@
         {
         CDesCArraySeg* FormatExtensionMapping = new (ELeave) CDesCArraySeg(4);
         CleanupStack::PushL(FormatExtensionMapping);
-        TRAP_IGNORE(iSingleton.DpController().DataProviderByIndexL(count).Plugin().SupportedL(EFormatExtensionSets,*FormatExtensionMapping));
-        AppendFormatExtensionMapping(*FormatExtensionMapping,iSingleton.DpController().DataProviderByIndexL(count).DataProviderId());
+        TRAP_IGNORE(
+        iSingleton.DpController().DataProviderByIndexL(count).Plugin().SupportedL(EFormatExtensionSets,*FormatExtensionMapping);
+        AppendFormatExtensionMappingL(*FormatExtensionMapping,iSingleton.DpController().DataProviderByIndexL(count).DataProviderId());
+        );
         CleanupStack::PopAndDestroy(FormatExtensionMapping);
         }
     }
@@ -406,7 +409,29 @@
     return EMTPFormatCodeUndefined;
     }
 
-EXPORT_C TUint32 RMTPUtility::GetDpId(const TDesC& aExtension,const TDesC& aMIMEType)
+EXPORT_C TUint32 RMTPUtility::GetDpIdL(const TDesC& aExtension,const TDesC& aMIMEType)
+    {
+    CMTPExtensionMapping* extensionMapping = CMTPExtensionMapping::NewL(aExtension, EMTPFormatCodeUndefined,aMIMEType);
+    CleanupStack::PushL(extensionMapping);
+    TInt  found = KErrNotFound;
+    if(aMIMEType == KNullDesC)
+        {
+        found = iFormatMappings.FindInOrder(extensionMapping, TLinearOrder<CMTPExtensionMapping>(CMTPExtensionMapping::Compare));
+        }
+    else
+        {
+        found = iFormatMappings.FindInOrder(extensionMapping, TLinearOrder<CMTPExtensionMapping>(CMTPExtensionMapping::ComparewithMIME));
+        }
+    if ( KErrNotFound != found)
+        {
+        CleanupStack::PopAndDestroy(extensionMapping);
+        return iFormatMappings[found]->DpId();
+        }
+    CleanupStack::PopAndDestroy(extensionMapping);
+    return KMTPFileDPID;
+    }
+
+EXPORT_C TUint16 RMTPUtility::GetSubFormatCodeL(const TDesC& aExtension,const TDesC& aMIMEType)
     {
     CMTPExtensionMapping* extensionMapping = CMTPExtensionMapping::NewL(aExtension, EMTPFormatCodeUndefined,aMIMEType);
     CleanupStack::PushL(extensionMapping);
@@ -414,12 +439,27 @@
     if ( KErrNotFound != found)
         {
         CleanupStack::PopAndDestroy(extensionMapping);
-        return iFormatMappings[found]->DpId();
+        return iFormatMappings[found]->SubFormatCode();
         }
     CleanupStack::PopAndDestroy(extensionMapping);
-    return 255;
+    return 0;
     }
 
+EXPORT_C TMTPFormatCode RMTPUtility::GetFormatCodeByMimeTypeL(const TDesC& aExtension,const TDesC& aMIMEType)
+    {
+    CMTPExtensionMapping* extensionMapping = CMTPExtensionMapping::NewL(aExtension, EMTPFormatCodeUndefined,aMIMEType);
+    CleanupStack::PushL(extensionMapping);
+    TInt  found = iFormatMappings.FindInOrder(extensionMapping, TLinearOrder<CMTPExtensionMapping>(CMTPExtensionMapping::ComparewithMIME));
+    if ( KErrNotFound != found)
+        {
+        CleanupStack::PopAndDestroy(extensionMapping);
+        return iFormatMappings[found]->FormatCode();
+        }
+    CleanupStack::PopAndDestroy(extensionMapping);
+    return EMTPFormatCodeUndefined;
+    }
+
+
 EXPORT_C TUint RMTPUtility::GetEnumerationFlag(const TDesC& aExtension)
     {
     CMTPExtensionMapping* extensionMapping = CMTPExtensionMapping::NewL(aExtension, EMTPFormatCodeUndefined);
@@ -558,25 +598,14 @@
         
     if ( file.Ext().CompareF( KTxtExtensionODF ) == 0 )
         {
-        RFs tempFsSession; 
-        User::LeaveIfError(tempFsSession.Connect());     
-        CleanupClosePushL(tempFsSession);
-        User::LeaveIfError(tempFsSession.ShareProtected());  
-        
-        RFile tempFile; 
-        User::LeaveIfError(tempFile.Open(tempFsSession, aFullPath, EFileRead|EFileShareAny)); 
-        CleanupClosePushL(tempFile); 
-        
-        //CContent* content = CContent::NewL( aFullPath );
-        CContent* content = CContent::NewL( tempFile );
+        CContent* content = CContent::NewL( aFullPath );
         CleanupStack::PushL( content ); // + content
         
         HBufC* buffer = HBufC::NewL( KMimeTypeMaxLength );
         CleanupStack::PushL( buffer ); // + buffer
         
         TPtr data = buffer->Des();
-        TInt err = content->GetStringAttribute( EMimeType, data );
-                
+        TInt err = content->GetStringAttribute( ContentAccess::EMimeType, data );
         if ( err == KErrNone )
             {
             mimebuf = HBufC::New( buffer->Length() );
@@ -585,8 +614,8 @@
                 {
                 User::LeaveIfError( KErrNotFound );
                 }
+            mimebuf->Des().Copy( *buffer );
             
-            mimebuf->Des().Copy( *buffer );
             }
         
         // leave if NULL
@@ -597,8 +626,6 @@
         
         CleanupStack::PopAndDestroy( buffer ); // - buffer
         CleanupStack::PopAndDestroy( content ); // - content
-        CleanupStack::PopAndDestroy(&tempFile); // close 
-        CleanupStack::PopAndDestroy(&tempFsSession);    // close 
         }
     else
         {
@@ -607,65 +634,126 @@
     
     return mimebuf;
     }
+void RMTPUtility::ParseFormatCode(const TDesC& aString, CMTPExtensionMapping& aMapping, TParseState& aState)
+    {
+    
+    TLex lex(aString.Mid(2)); //skip 0x
+    TUint formatCode = EMTPFormatCodeUndefined;
+    lex.Val(formatCode, EHex);
+    aMapping.SetFormatCode(static_cast<TMTPFormatCode>(formatCode));
+    aState = Extension;
+    __FLOG_VA((_L("ParseFormatCode %S, 0x%x"), &aString, formatCode));
+    }
+void RMTPUtility::ParseExtension(const TDesC& aString, CMTPExtensionMapping& aMapping, TParseState& aState)
+    {
+    aMapping.SetExtensionL(aString);
+    aState = EMimeType;
+    __FLOG_VA((_L("ParseExtension %S"), &aString));
+    }
+void RMTPUtility::ParseMimeType(const TDesC& aString, CMTPExtensionMapping& aMapping, TParseState& aState)
+    {
+    aMapping.SetMIMETypeL(aString);
+    aState = ESubFormatCode;
+    __FLOG_VA((_L("ParseMimeType %S"), &aString));
+    }
+void RMTPUtility::ParseSubFormatCode(const TDesC& aString, CMTPExtensionMapping& aMapping, TParseState& aState)
+    {
+    iEnumFlag = 1;
+    TUint32 subFormatCode = 0;
+    if(aString != KNullDesC)
+        {
+        if(aString.Length() > 2) //temp code will remove after the correct their format string
+            {
+            TLex lex(aString.Mid(2)); //skip 0x
+            lex.Val(subFormatCode, EHex);
+            }
+        else//temp code will remove after the correct their format string
+            {
+            TLex lex(aString);
+            lex.Val(iEnumFlag, EDecimal);
+            }
+        }
+    aMapping.SetSubFormatCode(subFormatCode);
+    aState = EnumerationFlag;
+    __FLOG_VA((_L("ParseSubFormatCode %S, 0x%x"), &aString, subFormatCode));
+    }
+void RMTPUtility::ParseEnumerationFlag(const TDesC& aString, CMTPExtensionMapping& aMapping, TParseState& aState)
+    {
+    TUint enumFlag = iEnumFlag;           //default is delegate to file DP
+    //temp code(iEnumFlag is temp the value should be 1) will remove after the correct their format string
+    if(aString != KNullDesC)
+        {
+        TLex lex(aString);
+        lex.Val(enumFlag, EDecimal);
+        }
+    aMapping.SetEnumerationFlag(enumFlag);
+    
+    __FLOG_VA((_L8("ParseEnumerationFlag %S, %d"), &aString, enumFlag));
+    aState = EParseStateEnd;
+    }
+void RMTPUtility::Parse(const TDesC& aString, CMTPExtensionMapping& aMapping, TParseState& aState)
+    {
+    switch(aState)
+        {
+        case EFormatCode:
+            ParseFormatCode(aString, aMapping, aState);
+            break;
+        case Extension:
+            ParseExtension(aString, aMapping, aState);
+            break;
+        case EMimeType:
+            ParseMimeType(aString, aMapping, aState);
+            break;
+        case ESubFormatCode:
+            ParseSubFormatCode(aString, aMapping, aState);
+            break;
+        case EnumerationFlag:
+            ParseEnumerationFlag(aString, aMapping, aState);
+            break;
+        default:
+            //do nothing;
+            break;
+        }
+    }
 
-void  RMTPUtility::AppendFormatExtensionMapping(const CDesCArray& aFormatExtensionMapping,TUint32 aDpId)
+void  RMTPUtility::AppendFormatExtensionMappingL(const CDesCArray& aFormatExtensionMapping,TUint32 aDpId)
     {
     //Parse the descriptor formatcode,fileextension, e.g. 0x3009:mp3
-     TBuf<KMAXPackageIDStringLen> stringSeg;
-     TInt  splitter1(0);
-     TInt  splitter2(0);
-     TInt  found(0);
-     TUint formatCode = 0;
-     TUint isNeedFileDp = 1;
-     
-     for(TInt i=0; i < aFormatExtensionMapping.Count(); ++i)
-         {
-         CMTPExtensionMapping* extensionMapping = CMTPExtensionMapping::NewL(KNullDesC, EMTPFormatCodeUndefined);
-         CleanupStack::PushL(extensionMapping);
-         _LIT(KSPLITTER,":");
-         splitter1 = aFormatExtensionMapping[i].FindF(KSPLITTER);
-         //Skip "0x", 2 is the length of "0x"
-         stringSeg = aFormatExtensionMapping[i].Mid(2, 4);
-         TLex lex(stringSeg);
-         User::LeaveIfError(lex.Val(formatCode, EHex));
-         //Skip ":"
-         stringSeg = aFormatExtensionMapping[i].Mid(splitter1 + 1);
-         splitter2 = stringSeg.FindF(KSPLITTER);
-         if ( splitter2 == KErrNotFound )
-             {
-             extensionMapping->SetExtensionL(stringSeg);
-             }
-         else
-             {
-             extensionMapping->SetExtensionL(aFormatExtensionMapping[i].Mid(splitter1+1,splitter2));
-             stringSeg = stringSeg.Mid(splitter2+1);
-             splitter1 = stringSeg.FindF(KSPLITTER);
-             if ( splitter1==KErrNotFound )
-                 {
-                 extensionMapping->SetMIMETypeL(stringSeg);
-                 }
-             else if ( splitter1==0 )
-                 {
-                 TLex lex1(stringSeg.Mid(splitter1+1));
-                 User::LeaveIfError(lex1.Val(isNeedFileDp, EDecimal));                 
-                 }
-             else
-                 {
-                 extensionMapping->SetMIMETypeL(stringSeg.Mid(0,splitter1));
-                 TLex lex2(stringSeg.Mid(splitter1+1));
-                 User::LeaveIfError(lex2.Val(isNeedFileDp, EDecimal));
-                 }
-             
-             }
+    //FromatCode:extension:MimeType:SubFormatCode:EnumerationFlag
 
-         found = iFormatMappings.FindInOrder(extensionMapping, TLinearOrder<CMTPExtensionMapping>(CMTPExtensionMapping::ComparewithMIME));
-         if (KErrNotFound == found)
-             {
-             extensionMapping->SetFormatCode((TMTPFormatCode)formatCode);
-             extensionMapping->SetDpId(aDpId);
-             extensionMapping->SetEnumerationFlag(isNeedFileDp);
-             iFormatMappings.InsertInOrderL(extensionMapping, TLinearOrder<CMTPExtensionMapping>(CMTPExtensionMapping::ComparewithMIME));
-             }
-         CleanupStack::Pop(extensionMapping);
-         }    
+    TChar spliter(':');
+    for(TInt i=0; i < aFormatExtensionMapping.Count(); ++i)
+        {
+        CMTPExtensionMapping* extensionMapping = CMTPExtensionMapping::NewL(KNullDesC, EMTPFormatCodeUndefined);
+      
+        TParseState state = EFormatCode;
+        TLex lex(aFormatExtensionMapping[i]);
+        lex.Mark();
+        while(!lex.Eos())
+            {
+            if(lex.Peek() == spliter)
+                {
+                Parse(lex.MarkedToken(), *extensionMapping, state);
+                lex.Inc(); //skip :
+                lex.Mark();
+                }
+            else
+                {
+                lex.Inc(); //move to next char
+                }
+            }
+        while(state < EParseStateEnd)
+            {
+            Parse(lex.MarkedToken(), *extensionMapping, state);
+            lex.Mark();
+            }
+        extensionMapping->SetDpId(aDpId);
+        if(iFormatMappings.InsertInOrder(extensionMapping, TLinearOrder<CMTPExtensionMapping>(CMTPExtensionMapping::ComparewithMIME)) != KErrNone)
+            {
+            delete extensionMapping;
+            }
+        }
     }
+
+
+
--- a/mtpfws/mtpfw/dataproviders/proxydp/src/cmtpdeleteobject.cpp	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpfws/mtpfw/dataproviders/proxydp/src/cmtpdeleteobject.cpp	Tue Apr 27 17:30:23 2010 +0300
@@ -19,6 +19,7 @@
 #include <mtp/mtpprotocolconstants.h>
 #include <mtp/tmtptyperequest.h>
 #include <mtp/cmtptypearray.h>
+#include <mtp/mtpdataproviderapitypes.h>
 
 #include "cmtpdataprovider.h"
 #include "cmtpdataprovidercontroller.h"
@@ -98,10 +99,6 @@
 	{
     __FLOG(_L8("CheckRequestL - Entry"));
     TMTPResponseCode responseCode = CMTPRequestProcessor::CheckRequestL();   
-    if ((EMTPRespCodeOK == responseCode) && (iSingletons.DpController().EnumerateState() == CMTPDataProviderController::EEnumeratingSubDirFiles))
-        {
-		responseCode = EMTPRespCodeDeviceBusy;
-        }
     
 	__FLOG_VA((_L8("CheckRequestL - Exit with responseCode = 0x%04X"), responseCode));
     return responseCode;
@@ -119,6 +116,27 @@
     router.ParseOperationRequestL(params);
     router.RouteOperationRequestL(params, iTargetDps);
     
+    if (iSingletons.DpController().EnumerateState() == CMTPDataProviderController::EEnumeratingSubDirFiles)
+        {
+		TBool hasBaseFileSystemDp = EFalse;
+		for(TInt i=0; i<iTargetDps.Count(); i++)
+			{
+			CMTPDataProvider& dp = iSingletons.DpController().DataProviderL( iTargetDps[i] );
+			if(dp.SupportedCodes(EStorageSystemTypes).Find(CMTPStorageMetaData::ESystemTypeDefaultFileSystem) != KErrNotFound)
+				{
+				hasBaseFileSystemDp = ETrue;
+				break;
+				}
+			}
+		
+		if(hasBaseFileSystemDp)
+			{
+			SendResponseL(EMTPRespCodeDeviceBusy);
+			__FLOG( _L8("-ServiceL with Device_Busy") );
+			return;
+			}
+        }
+    
     BrowseHandlesL();
     
     __FLOG( _L8("-ServiceL") );
--- a/mtpfws/mtpfw/dataproviders/proxydp/src/cmtpsetobjectproplist.cpp	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpfws/mtpfw/dataproviders/proxydp/src/cmtpsetobjectproplist.cpp	Tue Apr 27 17:30:23 2010 +0300
@@ -27,6 +27,7 @@
 #include "cmtpsetobjectproplist.h"
 #include "mtpproxydppanic.h"
 #include "rmtpframework.h"
+#include "cmtpstoragemgr.h"
 
 /**
 Two-phase construction method
@@ -174,6 +175,10 @@
                     // Invalid object handle.
                     iResponseCode = EMTPRespCodeInvalidObjectHandle;
                     }
+                else if(!iSingletons.StorageMgr().IsReadWriteStorage(meta->Uint(CMTPObjectMetaData::EStorageId)))
+                	{
+					iResponseCode = EMTPRespCodeAccessDenied;
+                	}
                 else
                     {
                     RArray<TUint> targets;
--- a/mtpfws/mtpfw/datatypes/src/cmtptypefile.cpp	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpfws/mtpfw/datatypes/src/cmtptypefile.cpp	Tue Apr 27 17:30:23 2010 +0300
@@ -197,11 +197,20 @@
     
     //Read the threshold value from Central Repository and check against it
     CRepository* repository(NULL);
-    TInt thresholdValue(0);
+    TInt64 thresholdValue(0);
     TRAPD(err,repository = CRepository::NewL(KCRUidUiklaf));
     if (err == KErrNone)
         {
-        if (driveNo == EDriveC)
+        if (driveNo == EDriveE || driveNo == EDriveF)
+            {
+            TInt warningValue(0);
+            err = repository->Get(KUikOODDiskFreeSpaceWarningNoteLevelMassMemory,warningValue);
+            if (err == KErrNone)
+                {
+                thresholdValue = warningValue + KFreeSpaceExtraReserved;
+                }
+            }
+        else
             {
             TInt warningUsagePercent(0);
             err = repository->Get(KUikOODDiskFreeSpaceWarningNoteLevel,warningUsagePercent);
@@ -211,14 +220,7 @@
                     + KFreeSpaceExtraReserved;
                 }
             }
-        else 
-            {
-            err = repository->Get(KUikOODDiskFreeSpaceWarningNoteLevelMassMemory,thresholdValue);
-            if (err == KErrNone)
-                {
-                thresholdValue += KFreeSpaceExtraReserved;
-                }
-            }
+        
         delete repository;
         }
     
--- a/mtpfws/mtpfw/src/cmtpconnection.cpp	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpfws/mtpfw/src/cmtpconnection.cpp	Tue Apr 27 17:30:23 2010 +0300
@@ -329,6 +329,8 @@
     if (aMTPId != KMTPSessionNone)
         {
         // Notify the data providers if other than the null session is closing.
+        // OpenSession Command coming and now it is really connected to host.
+        PublishConnState(EConnectedToHost);
         TMTPNotificationParamsSessionChange params = {aMTPId, *this};
         iSingletons.DpController().NotifyDataProvidersL(EMTPSessionOpened, &params);
         }
@@ -406,7 +408,7 @@
         iTransportConnection = &aTransportConnection;
         iTransportConnection->BindL(*this); 
         SetState(EStateOpen); 
-        PublishConnState(EConnectedToHost); 
+         
         }
     
     __FLOG(_L8("ConnectionResumed - Exit"));
--- a/mtpfws/mtpfw/src/cmtpconnectionmgr.cpp	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpfws/mtpfw/src/cmtpconnectionmgr.cpp	Tue Apr 27 17:30:23 2010 +0300
@@ -182,7 +182,7 @@
                 {
                 iTransport->Stop(*this);
                 delete iTransport;
-                
+                iTransportCount--;
                 iTransport = CMTPTransportPlugin::NewL(aTransport, aParameter);
                 
                 TRAPD(err, iTransport->StartL(*this));
@@ -191,11 +191,12 @@
                     __FLOG_VA( ( _L8("StartTransportL error, error code = %d"), err) );
                     delete iTransport;
                     iTransport = NULL;
+                    
                     User::Leave(err);
                     }
+                iTransportCount++;
                 iTransportUid = aTransport;       
              
-                iTransportCount++;
                 }
 
             }
--- a/mtpfws/mtpfw/src/cmtpdeltadatamgr.cpp	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpfws/mtpfw/src/cmtpdeltadatamgr.cpp	Tue Apr 27 17:30:23 2010 +0300
@@ -291,7 +291,7 @@
 	TInt64 puidlow = 1;
 	TBuf8<KMTPPuidSize> puidBuffer;
 	
-	for(TInt count=0;count <aMaxArraySize;count++)
+	for(TInt count=0;count <aMaxArraySize && iView.AtRow();count++)
 		{
 		iView.GetL();
 		//Get the data from the current row
@@ -370,7 +370,7 @@
 	TInt64 puidlow = 1;
 	TBuf8<KMTPPuidSize> puidBuffer;
 	
-	for(TInt count=0;count <aMaxArraySize;count++)
+	for(TInt count=0;count <aMaxArraySize && iView.AtRow();count++)
 		{
 
 		iView.GetL();
@@ -442,7 +442,7 @@
 	TInt64 puidlow = 1;
 	TBuf8<KMTPPuidSize> puidBuffer;
 	
-	for(TInt count=0;count <aMaxArraySize;count++)
+	for(TInt count=0;count <aMaxArraySize && iView.AtRow();count++)
 		{
 
 		iView.GetL();
@@ -514,7 +514,7 @@
 	TInt64 puidlow = 1;
 	TBuf8<KMTPPuidSize> puidBuffer;
 	
-	for(TInt count=0;count <aMaxArraySize;count++)
+	for(TInt count=0;count <aMaxArraySize && iView.AtRow();count++)
 		{
 		iView.GetL();
 		//Get the data from the current row
--- a/mtpfws/mtpfw/src/cmtpparserrouter.cpp	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtpfws/mtpfw/src/cmtpparserrouter.cpp	Tue Apr 27 17:30:23 2010 +0300
@@ -2311,6 +2311,8 @@
 	__FLOG_VA((_L8("Operation Code = 0x%04X"), KOpCode));
 	switch (KOpCode)
 	   {
+		case EMTPOpCodeSetObjectPropValue:
+		case EMTPOpCodeSetObjectProtection:
 		case EMTPOpCodeDeleteObject:
 			{
 			const TUint32 KObjectHandle(aParams.Request().Uint32(TMTPTypeRequest::ERequestParameter1));
--- a/mtptransports/mtpcontroller/group/mtpcontroller.mmp	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtptransports/mtpcontroller/group/mtpcontroller.mmp	Tue Apr 27 17:30:23 2010 +0300
@@ -42,7 +42,7 @@
 SOURCE          cmtpcontrollerbase.cpp
 SOURCE          cmtpbluetoothcontroller.cpp
 SOURCE          cmtpoperator.cpp
-SOURCE          proxy.cpp
+SOURCE          proxy.cpp cmtpcontrollertimer.cpp
 
 LIBRARY         euser.lib
 LIBRARY         ecom.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mtptransports/mtpcontroller/inc/cmtpcontrollertimer.h	Tue Apr 27 17:30:23 2010 +0300
@@ -0,0 +1,60 @@
+// Copyright (c) 2007-2009 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:
+//
+
+
+
+/**
+ @file
+ @internalComponent
+*/
+
+#ifndef CMTPCONTROLLERTIMER_H_
+#define CMTPCONTROLLERTIMER_H_
+
+#include <e32base.h>
+#include <mtp/rmtpclient.h>
+#include "mtpdebug.h"
+
+class CMTPOperator;
+
+class CMTPControllerTimer : public CTimer
+    {
+private:
+
+    enum { ETimerMultiplier         = 1000000 };
+    
+public:
+    static CMTPControllerTimer* NewLC( RMTPClient& aMTPClient, CMTPOperator& aMTPOperator );
+    static CMTPControllerTimer* NewL( RMTPClient& aMTPClient , CMTPOperator& aMTPOperator );
+    void Start( TInt aTimeOut );
+    TBool GetStopTransportStatus();
+    ~CMTPControllerTimer();
+    
+private:
+    CMTPControllerTimer(RMTPClient& aMTPClient, CMTPOperator& aMTPOperator);
+    void ConstructL();
+    void RunL();
+
+private:
+    __FLOG_DECLARATION_MEMBER_MUTABLE;
+    
+    RMTPClient& iMTPClient;
+    CMTPOperator * iMTPOperator;
+    TBool iStopTransport;
+
+    };
+
+
+#endif /* CMTPCONTROLLERTIMER_H_ */
--- a/mtptransports/mtpcontroller/inc/cmtpoperator.h	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtptransports/mtpcontroller/inc/cmtpoperator.h	Tue Apr 27 17:30:23 2010 +0300
@@ -24,10 +24,14 @@
 #define CMTPOPERATOR_H_
 
 #include <e32base.h>
-#include <mtp/rmtpclient.h>
+#include <e32property.h>
+
 #include "mmtpoperatornotifier.h"
+#include "cmtpcontrollertimer.h"
 #include "mtpdebug.h"
 
+
+
 NONSHARABLE_CLASS( CMTPOperator ) : public CActive
     {
 private:
@@ -52,6 +56,9 @@
     void StartTransport( TUid aTransport );
     void StopTransport( TUid aTransport );
     
+    void StartTimer (TInt aSecond);
+    void SubscribeConnState();
+    
 private:// From CActive
     void DoCancel();
     void RunL();
@@ -62,6 +69,7 @@
     TInt AppendOperation( TOperationType aType, TUid aTransport );
     void Schedule( TInt aError );
     void HandleOperationL( const TOperation& aOperation );
+    
 private:
     /**
      * FLOGGER debug trace member variable.
@@ -73,6 +81,19 @@
     RArray< TOperation > iPendingOperations;
     
     RMTPClient iMTPClient;
+    
+    RProperty       iProperty;
+    
+    TBool           iConSubscribed;
+    
+    TInt            iConnState;
+    
+    CMTPControllerTimer*  iTimer;
+
     };
 
+
+const TInt KInitialValue = -1;
+const TInt KStopMTPSeconds = 30;
+
 #endif /* CMTPOPERATOR_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mtptransports/mtpcontroller/src/cmtpcontrollertimer.cpp	Tue Apr 27 17:30:23 2010 +0300
@@ -0,0 +1,97 @@
+// Copyright (c) 2007-2009 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:
+//
+
+
+
+/**
+ @file
+ @internalComponent
+*/
+
+#include "cmtpcontrollertimer.h"
+#include "cmtpoperator.h"
+
+__FLOG_STMT( _LIT8( KComponent, "mtpConTimer" ); )
+
+const TUid KMTPBtTransportUid = { 0x10286FCB };
+const TInt KStartMTPSeconds = 7;
+
+CMTPControllerTimer* CMTPControllerTimer::NewLC( RMTPClient& aMTPClient, CMTPOperator & aMTPOperator )
+    {
+    CMTPControllerTimer* self = new(ELeave) CMTPControllerTimer( aMTPClient, aMTPOperator );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+CMTPControllerTimer* CMTPControllerTimer::NewL( RMTPClient& aMTPClient, CMTPOperator & aMTPOperator )
+    {
+    CMTPControllerTimer* self = NewLC( aMTPClient, aMTPOperator );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+void CMTPControllerTimer::Start( TInt aTimeOut )
+    {
+    CTimer::After( aTimeOut * ETimerMultiplier );
+    }
+
+TBool CMTPControllerTimer::GetStopTransportStatus()
+    {
+    return iStopTransport;
+    }
+
+CMTPControllerTimer::~CMTPControllerTimer()
+    {
+    __FLOG( _L8("CMPTControllerTimer destruction") );
+    __FLOG_CLOSE;
+    }
+
+CMTPControllerTimer::CMTPControllerTimer( RMTPClient& aMTPClient, CMTPOperator& aMTPOperator ):
+    CTimer( CActive::EPriorityStandard ), iMTPClient(aMTPClient)
+    {
+    __FLOG_OPEN( KMTPSubsystem, KComponent );
+    iMTPOperator = &aMTPOperator;
+    }
+
+void CMTPControllerTimer::ConstructL()
+    {
+    CTimer::ConstructL();
+    CActiveScheduler::Add( this );
+    iStopTransport = EFalse;
+    __FLOG( _L8("CMPTControllerTimer construction") );
+    }
+
+void CMTPControllerTimer::RunL()
+    {
+    if (KErrNone == iMTPClient.IsProcessRunning() && !iStopTransport)
+        {
+        __FLOG( _L8("Stop transport to shut down mtp server") );
+        TInt error = iMTPClient.StopTransport(KMTPBtTransportUid);
+        iMTPClient.Close();
+        iStopTransport = ETrue;
+        __FLOG_1( _L8("The return value of stop transport is: %d"), error );
+        iMTPOperator->StartTimer(KStartMTPSeconds);
+        }
+    else
+        {
+        __FLOG( _L8("Start transport to launch mtp server") );
+        
+        iMTPClient.Connect();
+        iMTPClient.StartTransport(KMTPBtTransportUid);
+        iStopTransport = EFalse;
+        iMTPOperator->SubscribeConnState();
+        }
+    }
--- a/mtptransports/mtpcontroller/src/cmtpoperator.cpp	Wed Apr 14 16:49:36 2010 +0300
+++ b/mtptransports/mtpcontroller/src/cmtpoperator.cpp	Tue Apr 27 17:30:23 2010 +0300
@@ -24,6 +24,7 @@
 
 __FLOG_STMT( _LIT8( KComponent, "mtpoperator" ); )
 
+
 CMTPOperator* CMTPOperator::NewL( MMTPOperatorNotifier& aNotifier )
     {
     CMTPOperator* self = new( ELeave ) CMTPOperator( aNotifier );
@@ -37,6 +38,8 @@
     iPendingOperations.Reset();
     iPendingOperations.Close();
     iMTPClient.Close();
+    iProperty.Close();
+    delete iTimer;
     __FLOG( _L8("+/-Dtor") );
     __FLOG_CLOSE;
     }
@@ -44,6 +47,7 @@
 void CMTPOperator::StartTransport( TUid aTransport )
     {
     __FLOG_1( _L8("+/-StartTransport( 0x%08X )"), aTransport.iUid );
+
     TInt err = AppendOperation( EStartTransport, aTransport );
     if ( KErrNone != err )
         {
@@ -61,23 +65,82 @@
         }
     }
 
+void CMTPOperator::StartTimer(TInt aSecond)
+    {
+    __FLOG(_L8("StartTimer in cmtpoperator!"));
+    iTimer->Start(aSecond);    
+    }
+
 void CMTPOperator::DoCancel()
     {
     __FLOG( _L8("+/-DoCancel") );
+    iProperty.Cancel();
+    iConSubscribed = EFalse;
     }
 
 void CMTPOperator::RunL()
     {
     __FLOG( _L8("+RunL") );
     
+    iConSubscribed = EFalse;
     TInt count = iPendingOperations.Count();
+    
+    TInt connState = KInitialValue;
+    
     if ( count > 0 )
         {
         TOperation& operation = iPendingOperations[0];
         TRAP_IGNORE( HandleOperationL( operation ) );
         iPendingOperations.Remove( 0 );
         }
-    
+    else
+        {
+        //this will go on to get the updated connection status.
+        SubscribeConnState();
+
+
+        TInt error = iProperty.Get(KMTPPublishConnStateCat, EMTPConnStateKey, connState);
+        __FLOG_2(_L8("Before, the iConnState is %d and connState is %d"), iConnState, connState);
+        if ( KErrNotFound == error )
+            {
+            iConnState = KInitialValue;
+            __FLOG( _L8("The key is deleted and mtp server shut down!") );
+            }
+        else
+            {
+            if (iTimer->IsActive() && !iTimer->GetStopTransportStatus())
+                {
+                __FLOG( _L8("Timer is cancelled!") );
+                iTimer->Cancel();
+                }
+            //if the disconnect is not set, set the disconnect
+            //else if the connState is disconnect, launch the timer to restart the server to unload dps.
+            if ( KInitialValue == iConnState )
+                {
+                iConnState = connState;
+                __FLOG( _L8("the first time to launch mtp") );
+                }
+            else
+                {
+                if (EDisconnectedFromHost == connState)
+                    {
+                    iConnState = connState;
+                    if (!iTimer->IsActive())
+                        {
+                        iTimer->Start(KStopMTPSeconds);
+                        }
+                    __FLOG( _L8("Timer is launched.") );
+                    }
+                else
+                    {
+
+                    iConnState = connState;
+                    }
+                }
+            }
+        __FLOG_2(_L8("After, the iConnState is %d and connState is %d"), iConnState, connState);
+        }
+       
     __FLOG( _L8("-RunL") );
     }
 
@@ -93,7 +156,21 @@
     {
     __FLOG( _L8("+ConstructL") );
     CActiveScheduler::Add( this );
+    //if the server is running, the first disconnction shows the conection is down!
+    if(KErrNone == iMTPClient.IsProcessRunning())
+        {
+        iConnState = EDisconnectedFromHost;
+        }
+    else
+        {
+        iConnState = KInitialValue;
+        }
+    __FLOG_1( _L8("The connstate is set to %d"), iConnState );
     User::LeaveIfError( iMTPClient.Connect() );
+    User::LeaveIfError(iProperty.Attach(KMTPPublishConnStateCat, EMTPConnStateKey));
+    iTimer = CMTPControllerTimer::NewL(iMTPClient, *this);
+    
+    iConSubscribed = EFalse;
     __FLOG( _L8("-ConstructL") );
     }
 
@@ -101,17 +178,33 @@
     {
     TOperation operation = { aType, aTransport };
     TInt err = iPendingOperations.Append( operation );
+    __FLOG_1( _L8("+AppendOperation returns %d"), err );
     if ( ( KErrNone == err ) && !IsActive() )
         {
         Schedule( KErrNone );
         }
-    __FLOG_1( _L8("+/-AppendOperation returns %d"), err );
+    else
+        {
+        if (iConSubscribed)
+            {
+            Cancel();
+            if (KErrNone == err)
+                {
+                Schedule( KErrNone );
+                }
+            }
+        }
+    __FLOG( _L8("-AppendOperation") );
     return err;
     }
 
 void CMTPOperator::Schedule( TInt aError )
     {
     __FLOG_1( _L8("+/-Schedule( %d )"), aError );
+    if(iTimer->IsActive())
+        {
+        iTimer->Cancel();
+        }
     TRequestStatus* status = &iStatus;
     User::RequestComplete( status, aError );
     SetActive();
@@ -126,13 +219,31 @@
         case EStartTransport:
             err = iMTPClient.StartTransport( aOperation.iTransport );
             iNotifier.HandleStartTrasnportCompleteL( err );
+            SubscribeConnState();
             break;
         default:
             __ASSERT_DEBUG( ( EStopTransport == aOperation.iType ), User::Invariant() );
-            err = iMTPClient.StopTransport( aOperation.iTransport );
+            if(!iTimer->GetStopTransportStatus())
+                {
+                err = iMTPClient.StopTransport( aOperation.iTransport );
+                }
+         
             iNotifier.HandleStopTrasnportCompleteL( err );
             break;
         }
     __FLOG( _L8("-HandleOperationL") );
     }
 
+void CMTPOperator::SubscribeConnState()
+    {
+    if(!IsActive())
+        {
+        __FLOG( _L8("Subscribe connection state changed)") );
+        iProperty.Subscribe(iStatus);
+        iConSubscribed = ETrue;
+        SetActive();
+        }
+  
+    }
+
+