Revision: 201003 RCL_3
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 19 Feb 2010 23:40:44 +0200
branchRCL_3
changeset 1 f8e15b44d440
parent 0 d0791faffa3f
child 2 4843bb5893b6
Revision: 201003 Kit: 201007
connectivitymodules/SeCon/services/csc/bld/sconcsc.mmp
connectivitymodules/SeCon/services/csc/src/sconversioninfo.cpp
connectivitymodules/SeCon/services/pcd/inc/sconpcdconsts.h
connectivitymodules/SeCon/services/pcd/inc/sconvideoparser.h
connectivitymodules/SeCon/services/pcd/src/sconbrqueue.cpp
connectivitymodules/SeCon/services/pcd/src/sconpcdutility.cpp
connectivitymodules/SeCon/services/pcd/src/sconqueue.cpp
connectivitymodules/SeCon/services/pcd/src/sconvideoparser.cpp
mtpdataproviders/mtpfileandfolderdp/inc/cmtpfiledp.h
mtpdataproviders/mtpfileandfolderdp/src/cmtpfiledp.cpp
mtpdataproviders/mtpimagedp/src/cmtpimagedpdeleteobject.cpp
mtpfws/mtpfw/daemon/server/src/cmtpshutdown.cpp
mtpfws/mtpfw/dataproviders/devdp/inc/cmtpgetnumobjects.h
mtpfws/mtpfw/dataproviders/devdp/inc/cmtpstoragewatcher.h
mtpfws/mtpfw/dataproviders/devdp/inc/mtpdevdppanic.h
mtpfws/mtpfw/dataproviders/devdp/inc/rmtpdevicedpsingletons.h
mtpfws/mtpfw/dataproviders/devdp/src/cmtpgetnumobjects.cpp
mtpfws/mtpfw/dataproviders/devdp/src/cmtpopensession.cpp
mtpfws/mtpfw/dataproviders/devdp/src/cmtpstoragewatcher.cpp
mtpfws/mtpfw/dataproviders/devdp/src/rmtpdevicedpsingletons.cpp
mtpfws/mtpfw/dataproviders/dputility/inc/cmtpfsenumerator.h
mtpfws/mtpfw/dataproviders/dputility/inc/cmtpknowledgehandler.h
mtpfws/mtpfw/dataproviders/dputility/inc/cmtprequestprocessor.h
mtpfws/mtpfw/dataproviders/dputility/inc/mtpsvcdpconst.h
mtpfws/mtpfw/dataproviders/dputility/src/cmtpfsenumerator.cpp
mtpfws/mtpfw/dataproviders/dputility/src/cmtpknowledgehandler.cpp
mtpfws/mtpfw/dataproviders/proxydp/inc/cmtpdeleteobject.h
mtpfws/mtpfw/dataproviders/proxydp/inc/cmtpobjectbrowser.h
mtpfws/mtpfw/dataproviders/proxydp/src/cmtpdeleteobject.cpp
mtpfws/mtpfw/dataproviders/proxydp/src/cmtpgetobjectproplist.cpp
mtpfws/mtpfw/dataproviders/proxydp/src/cmtpobjectbrowser.cpp
mtpfws/mtpfw/datatypes/interface/cmtptypefile.h
mtpfws/mtpfw/datatypes/src/cmtptypefile.cpp
mtpfws/mtpfw/inc/cmtpconnection.h
mtpfws/mtpfw/inc/cmtpconnectionmgr.h
mtpfws/mtpfw/inc/cmtpdataprovidercontroller.h
mtpfws/mtpfw/src/cmtpconnection.cpp
mtpfws/mtpfw/src/cmtpconnectionmgr.cpp
mtpfws/mtpfw/src/cmtpdataprovider.cpp
mtpfws/mtpfw/src/cmtpdataprovidercontroller.cpp
mtpfws/mtpfw/src/cmtpobjectstore.cpp
mtpfws/mtpfw/transports/transportapi/inc/mmtpconnectionmgr.h
mtpfws/mtpintegrationtest/integration/mtpmodeselector/inc/CMAppGroupView.H
mtpfws/mtpintegrationtest/integration/mtpmodeselector/inc/CtransportInitiator.h
mtpfws/mtpintegrationtest/integration/mtpmodeselector/inc/MtpModeSelector.h
mtpfws/mtpintegrationtest/integration/mtpmodeselector/inc/mtpstarter.h
mtptransports/mtpptpiptransport/ptpipplugin/src/cptpipconnection.cpp
mtptransports/mtpusbtransport/usbsic_imp/inc/cmtpusbconnection.h
mtptransports/mtpusbtransport/usbsic_imp/src/cmtpusbconnection.cpp
obex/obexprotocol/obex/public/obexbase.h
--- a/connectivitymodules/SeCon/services/csc/bld/sconcsc.mmp	Tue Feb 02 01:11:40 2010 +0200
+++ b/connectivitymodules/SeCon/services/csc/bld/sconcsc.mmp	Fri Feb 19 23:40:44 2010 +0200
@@ -67,7 +67,6 @@
 LIBRARY         hal.lib
 LIBRARY         platformenv.lib
 LIBRARY         charconv.lib
-LIBRARY	        customapi.lib
 LIBRARY	        centralrepository.lib
 LIBRARY         apgrfx.lib
 LIBRARY         apparc.lib
--- a/connectivitymodules/SeCon/services/csc/src/sconversioninfo.cpp	Tue Feb 02 01:11:40 2010 +0200
+++ b/connectivitymodules/SeCon/services/csc/src/sconversioninfo.cpp	Fri Feb 19 23:40:44 2010 +0200
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2008-2010 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"
@@ -23,8 +23,7 @@
 #include <etel3rdparty.h> // read imsi
 #include <etel.h>
 #include <etelmm.h>
-#include <e32event.h>
-#include <e32svr.h>
+#include <hal.h>
 
 #include "caputils.h"
 #include "debug.h"
@@ -200,13 +199,6 @@
         iProductCode = info.AllocL();
         }
     
-    // screen size
-    TPckgBuf<TScreenInfoV01> siBuf;
-    UserSvr::ScreenInfo(siBuf);
-    TScreenInfoV01& si=siBuf();
-    iScreenSize = si.iScreenSize;
-    
-    
     // read DesktopSync key value
     CRepository* repository(NULL);
     TRAP( iDesktopSyncError, repository = CRepository::NewL( KCRUidDSDCMOConfig ));
@@ -222,7 +214,9 @@
         LOGGER_WRITE_1("Could not create CRepository, err: %d", iDesktopSyncError );
         }
     
-    
+    // screen size
+    HAL::Get(HAL::EDisplayXPixels, iScreenSize.iWidth);
+    HAL::Get(HAL::EDisplayYPixels, iScreenSize.iHeight);
     
     iInfoFetched = ETrue;
     TRACE_FUNC_EXIT;   
--- a/connectivitymodules/SeCon/services/pcd/inc/sconpcdconsts.h	Tue Feb 02 01:11:40 2010 +0200
+++ b/connectivitymodules/SeCon/services/pcd/inc/sconpcdconsts.h	Fri Feb 19 23:40:44 2010 +0200
@@ -42,6 +42,7 @@
 // ConML Status code: No memory
 const TInt KSConCodeNoMemory( 420 );
 
+
 // ConML Status codes in installer errorcases
 const TInt KSConCodeInstErrUserCancel = KSConCodeCancelled; // User cancelled the operation
 const TInt KSConCodeInstErrFileCorrupted = 600; // File is corrupted
@@ -57,6 +58,9 @@
 const TInt KSConCodeInstErrAccessDenied = 608;  // Target location of package is not accessible
 const TInt KSConCodeInstUpgradeError = 609;  // The package is an invalid upgrade
 
+// ConML Status code: 1001...1050 System wide error code
+const TInt KSConCodeFirstSymbianErr( 1000 );
+
 struct SDeviceInfo
 	{
 	TSConMethodName method;
--- a/connectivitymodules/SeCon/services/pcd/inc/sconvideoparser.h	Tue Feb 02 01:11:40 2010 +0200
+++ b/connectivitymodules/SeCon/services/pcd/inc/sconvideoparser.h	Fri Feb 19 23:40:44 2010 +0200
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2008-2010 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"
@@ -141,9 +141,12 @@
 private: // data
     CVideoPlayerUtility* iVideoUtil;
     CTNEVideoClipInfo*   iVideoClip;
-
+    
     RWsSession          iWsSession;
     CWsScreenDevice*    iScreen;
+    RWindow*            iWindow;
+    RWindowGroup        iRootWindow;
+    
     TRequestStatus*     iCallerStatus;
     CActiveSchedulerWait iWait;
     CSconTimeOut*       iTimeOut;
--- a/connectivitymodules/SeCon/services/pcd/src/sconbrqueue.cpp	Tue Feb 02 01:11:40 2010 +0200
+++ b/connectivitymodules/SeCon/services/pcd/src/sconbrqueue.cpp	Fri Feb 19 23:40:44 2010 +0200
@@ -30,12 +30,10 @@
 //
 CSConBackupRestoreQueue* CSConBackupRestoreQueue::NewL( const TInt aMaxObjectSize, RFs& aFs )
 	{
-	TRACE_FUNC_ENTRY;
 	CSConBackupRestoreQueue* self = new (ELeave) CSConBackupRestoreQueue();
 	CleanupStack::PushL( self );
 	self->ConstructL( aMaxObjectSize, aFs );
 	CleanupStack::Pop( self );
-	TRACE_FUNC_EXIT;
     return self;
 	}
 	
@@ -56,11 +54,9 @@
 //
 void CSConBackupRestoreQueue::ConstructL( const TInt aMaxObjectSize, RFs& aFs )
 	{
-	TRACE_FUNC_ENTRY;
 	iBackupRestore = CSConBackupRestore::NewL( this, aMaxObjectSize, aFs );
 	CActiveScheduler::Add( iBackupRestore );
 	User::LeaveIfError( iTimer.CreateLocal() );
-	TRACE_FUNC_EXIT;
 	}
 	
 // -----------------------------------------------------------------------------
@@ -88,7 +84,6 @@
 //
 void CSConBackupRestoreQueue::StartQueue()	
 	{
-	TRACE_FUNC_ENTRY;
 	if( IsActive() )
 		{
 		Cancel();
@@ -96,7 +91,6 @@
 		
 	iTimer.After( iStatus, KSConTimerValue );
 	SetActive();
-	TRACE_FUNC_EXIT;
 	}
 	
 // -----------------------------------------------------------------------------
@@ -106,9 +100,7 @@
 //
 void CSConBackupRestoreQueue::StopQueue()	
 	{
-	TRACE_FUNC_ENTRY;
 	iTimer.Cancel();
-	TRACE_FUNC_EXIT;
 	}
 
 // -----------------------------------------------------------------------------
@@ -139,7 +131,6 @@
 		}
 
 	ret = iQueue.InsertInOrder( aNewTask, CSConTaskQueue::Compare );
-	LOGGER_WRITE_1( "CSConBackupRestoreQueue::AddNewTask() : returned %d", ret );
 	return ret;
 	}
 
@@ -189,7 +180,6 @@
 //
 void CSConBackupRestoreQueue::QueueAddress( CSConInstallerQueue*& aTaskQueue )
 	{
-	TRACE_FUNC;
 	iInstQueueAddress = aTaskQueue;
 	}
 
@@ -253,14 +243,11 @@
 //
 void CSConBackupRestoreQueue::RunL()
 	{
-	TRACE_FUNC_ENTRY;
-	LOGGER_WRITE_1( "There are still %d tasks in this queue", iQueue.Count() );
 	if( iQueue.Count() > 0 )
 		{
 		PollQueue();
 		StartQueue();
 		}
-	TRACE_FUNC_EXIT;
 	}
 
 // End of file
--- a/connectivitymodules/SeCon/services/pcd/src/sconpcdutility.cpp	Tue Feb 02 01:11:40 2010 +0200
+++ b/connectivitymodules/SeCon/services/pcd/src/sconpcdutility.cpp	Fri Feb 19 23:40:44 2010 +0200
@@ -21,7 +21,7 @@
 #include <swi/sisregistrysession.h>
 #include <swi/sisregistrypackage.h>
 #include <stringresourcereader.h>
-#include <WidgetRegistryClient.h>
+#include <widgetregistryclient.h>
 #include <javaregistryincludes.h>
 #include <appversion.h>
 #include <mmf/common/mmfcontrollerpluginresolver.h>
--- a/connectivitymodules/SeCon/services/pcd/src/sconqueue.cpp	Tue Feb 02 01:11:40 2010 +0200
+++ b/connectivitymodules/SeCon/services/pcd/src/sconqueue.cpp	Fri Feb 19 23:40:44 2010 +0200
@@ -265,7 +265,17 @@
             
             default :
                 iQueue[index]->SetCompleteValue( complete );
-                progress = KSConCodeConflict;
+                if ( aError < KErrNone && aError >= KErrCorruptSurrogateFound )
+                    {
+                    // aError is always negative
+                    //  -> returned errorcode is from KSConCodeFirstSymbianErr...n
+                    progress = KSConCodeFirstSymbianErr - aError;
+                    }
+                else
+                    {
+                    progress = KSConCodeConflict;
+                    }
+                
                 break;
             }
             
--- a/connectivitymodules/SeCon/services/pcd/src/sconvideoparser.cpp	Tue Feb 02 01:11:40 2010 +0200
+++ b/connectivitymodules/SeCon/services/pcd/src/sconvideoparser.cpp	Fri Feb 19 23:40:44 2010 +0200
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2008-2010 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"
@@ -57,6 +57,13 @@
         iVideoUtil->Close();
         }
     delete iVideoUtil;
+    
+    if ( iWindow )
+        {
+        iWindow->Close();
+        }
+    delete iWindow;
+    iRootWindow.Close();
     delete iScreen;
     iWsSession.Close();
     
@@ -90,26 +97,16 @@
     User::LeaveIfError( iWsSession.Connect() );
     
     iScreen = new(ELeave) CWsScreenDevice( iWsSession );
-    iScreen->Construct();
-    
-    RWindowGroup wg( iWsSession );
-    User::LeaveIfError( wg.Construct(reinterpret_cast<TUint32>(&wg), EFalse) );
-    CleanupClosePushL( wg );
+    User::LeaveIfError( iScreen->Construct() );
     
-    CWindowGc* gc;
-    User::LeaveIfError( iScreen->CreateContext(gc) );
-    CleanupStack::PushL(gc);
+    iRootWindow = RWindowGroup(iWsSession);
+    User::LeaveIfError( iRootWindow.Construct(reinterpret_cast<TUint32>(&iWsSession), EFalse) );
     
-    RWindow window( iWsSession );
-    User::LeaveIfError( window.Construct(wg, reinterpret_cast<TUint32>(&wg) + 1) );
-    CleanupClosePushL( window );
+    iWindow = new(ELeave) RWindow( iWsSession );
+    User::LeaveIfError( iWindow->Construct(iRootWindow, reinterpret_cast<TUint32>(&iRootWindow) + 1) );
     
     TRect temp(0,0,320,240); // dummy parameter
-    iVideoUtil = CVideoPlayerUtility::NewL(*this, EMdaPriorityNormal, EMdaPriorityPreferenceNone, iWsSession, *(iScreen), window, temp, temp);
-    
-    CleanupStack::PopAndDestroy( &window );
-    CleanupStack::PopAndDestroy( gc );
-    CleanupStack::PopAndDestroy( &wg );
+    iVideoUtil = CVideoPlayerUtility::NewL(*this, EMdaPriorityNormal, EMdaPriorityPreferenceNone, iWsSession, *iScreen, *iWindow, temp, temp);
     
     iTimeOut = CSconTimeOut::NewL( *this );
     
--- a/mtpdataproviders/mtpfileandfolderdp/inc/cmtpfiledp.h	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpdataproviders/mtpfileandfolderdp/inc/cmtpfiledp.h	Fri Feb 19 23:40:44 2010 +0200
@@ -27,6 +27,7 @@
 #include "mtpdebug.h"
 #include "rmtpfiledpsingletons.h"
 #include "rmtpdpsingletons.h"
+#include "rmtpframework.h"
 
 class CMTPFileDpExclusionMgr;
 class CMTPFSEnumerator;
@@ -117,6 +118,8 @@
     
     TInt								iActiveProcessor;
     TBool								iActiveProcessorRemoved;
+    
+	RMTPFramework               		iSingletons;
 
     };
     
--- a/mtpdataproviders/mtpfileandfolderdp/src/cmtpfiledp.cpp	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpdataproviders/mtpfileandfolderdp/src/cmtpfiledp.cpp	Fri Feb 19 23:40:44 2010 +0200
@@ -28,6 +28,7 @@
 #include "mtpfiledpconst.h"
 #include "mtpfiledppanic.h"
 #include "mtpfiledpprocessor.h"
+#include "cmtpdataprovidercontroller.h"
 
 // Class constants
 static const TInt KArrayGranularity = 3;
@@ -63,6 +64,7 @@
     iActiveProcessors.Close();
     iDpSingletons.Close();
 	iFileDPSingletons.Close();
+	iSingletons.Close();
     delete iFileEnumerator;
     delete iExclusionMgr;
     __FLOG(_L8("~CMTPFileDataProvider - Exit"));
@@ -135,12 +137,12 @@
     {
     __FLOG(_L8("StartObjectEnumerationL - Entry"));
 
-    iExclusionMgr->AppendFormatExclusionListL();
-    iDpSingletons.MTPUtility().FormatExtensionMapping();
     iPendingEnumerations.AppendL(aStorageId);
     if (iPendingEnumerations.Count() == 1)
         {
-        iFileEnumerator->StartL(iPendingEnumerations[KActiveEnumeration]);
+		CMTPDataProviderController& dpController(iSingletons.DpController());
+		TBool bOnlyScanRoot = ( (dpController.EnumerateState() == CMTPDataProviderController::EEnumeratingFrameworkObjects) && (dpController.NeedEnumeratingPhase2()) );
+		iFileEnumerator->StartL(iPendingEnumerations[KActiveEnumeration], bOnlyScanRoot);
         }
     __FLOG(_L8("StartObjectEnumerationL - Exit"));
     }
@@ -148,6 +150,8 @@
 void CMTPFileDataProvider::StartStorageEnumerationL()
     {
     __FLOG(_L8("StartStorageEnumerationL - Entry"));
+    iExclusionMgr->AppendFormatExclusionListL();
+    iDpSingletons.MTPUtility().FormatExtensionMapping();
     Framework().StorageEnumerationCompleteL();
     __FLOG(_L8("StartStorageEnumerationL - Exit"));
     }
@@ -220,7 +224,9 @@
     iPendingEnumerations.Remove(KActiveEnumeration);
     if (iPendingEnumerations.Count())
         {
-        iFileEnumerator->StartL(iPendingEnumerations[KActiveEnumeration]);
+		CMTPDataProviderController& dpController(iSingletons.DpController());
+		TBool bOnlyScanRoot = ( (dpController.EnumerateState() == CMTPDataProviderController::EEnumeratingFrameworkObjects) && (dpController.NeedEnumeratingPhase2()) );
+        iFileEnumerator->StartL(iPendingEnumerations[KActiveEnumeration], bOnlyScanRoot);
         }
     __FLOG(_L8("HandleEnumerationCompletedL - Exit"));
     }
@@ -246,6 +252,7 @@
     __FLOG(_L8("ConstructL - Entry"));
   	iDpSingletons.OpenL(Framework());
   	iFileDPSingletons.OpenL(Framework());
+  	iSingletons.OpenL();
   	
   	iExclusionMgr = CMTPFileDpExclusionMgr::NewL(Framework());
   	iDpSingletons.SetExclusionMgrL(*iExclusionMgr);
--- a/mtpdataproviders/mtpimagedp/src/cmtpimagedpdeleteobject.cpp	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpdataproviders/mtpimagedp/src/cmtpimagedpdeleteobject.cpp	Fri Feb 19 23:40:44 2010 +0200
@@ -261,6 +261,15 @@
     {
     __FLOG(_L8(">> CMTPImageDpDeleteObject::StartL"));
     
+    if(iCancelled)
+        {
+        __FLOG(_L8("Cancell the delete"));
+        CMTPRequestProcessor::SendResponseL(EMTPRespCodeTransactionCancelled);
+        iObjectsToDelete.Reset();
+        iCancelled = EFalse;
+        return;
+        }
+    
     TInt numObjectsToDelete = iObjectsToDelete.Count();
 
     if ( numObjectsToDelete > 0 )
--- a/mtpfws/mtpfw/daemon/server/src/cmtpshutdown.cpp	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/daemon/server/src/cmtpshutdown.cpp	Fri Feb 19 23:40:44 2010 +0200
@@ -54,7 +54,7 @@
     
 void CMTPShutdown::RunL()
     {
-    if ( iSingletons.DpController().EnumerateState() != CMTPDataProviderController::EEnumerated )
+    if ( iSingletons.DpController().EnumerateState() != CMTPDataProviderController::EEnumeratedFulllyCompleted )
         {
         Start();
         }
--- a/mtpfws/mtpfw/dataproviders/devdp/inc/cmtpgetnumobjects.h	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/dataproviders/devdp/inc/cmtpgetnumobjects.h	Fri Feb 19 23:40:44 2010 +0200
@@ -24,9 +24,11 @@
 
 #include "cmtprequestprocessor.h"
 #include "rmtpframework.h"
+#include "rmtpdevicedpsingletons.h"
 
 class MMTPObjectMgr;
 
+
 /** 
 Implements device data provider GetNumObjects request processor
 @internalComponent
@@ -55,6 +57,8 @@
 private:
 
 	RMTPFramework iSingletons;
+
+    RMTPDeviceDpSingletons              iDevDpSingletons;
 	};
 	
 #endif // CMTPGETNUMOBJECTS_H
--- a/mtpfws/mtpfw/dataproviders/devdp/inc/cmtpstoragewatcher.h	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/dataproviders/devdp/inc/cmtpstoragewatcher.h	Fri Feb 19 23:40:44 2010 +0200
@@ -27,9 +27,11 @@
 #include "mtpdebug.h"
 #include "rmtpframework.h"
 #include "rmtpdpsingletons.h"
+#include "rmtpdevicedpsingletons.h"
 
 class MMTPDataProviderFramework;
 
+
 /** 
 Implements the MTP device data provider system storage watcher.
 @internalComponent
@@ -119,6 +121,8 @@
     */
     RMTPDpSingletons				iDpSingletons;
     
+    RMTPDeviceDpSingletons          iDevDpSingletons;
+    
 private: // Not owned.
 
     MMTPDataProviderFramework&      iFramework;
--- a/mtpfws/mtpfw/dataproviders/devdp/inc/mtpdevdppanic.h	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/dataproviders/devdp/inc/mtpdevdppanic.h	Fri Feb 19 23:40:44 2010 +0200
@@ -35,6 +35,7 @@
     EMTPDevDpInvalidRequest             = 7,
     EMTPDevDpUnknownDeviceProperty      = 8,
     EMTPDevDpUnknownServiceID           = 9,
+    EMTPDevDpObjectNull					= 10,
 
     };
 
--- a/mtpfws/mtpfw/dataproviders/devdp/inc/rmtpdevicedpsingletons.h	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/dataproviders/devdp/inc/rmtpdevicedpsingletons.h	Fri Feb 19 23:40:44 2010 +0200
@@ -45,6 +45,8 @@
     CMTPDeviceDataStore& DeviceDataStore();
     CMTPDeviceDpConfigMgr& ConfigMgr();
     
+    RArray<TUint>& PendingStorages();
+    
 private:
     
     /**
@@ -79,6 +81,11 @@
         The device dp config manager.
         */
         CMTPDeviceDpConfigMgr*	iConfigMgr;
+        
+        /*
+         * The pending storageids which is not enumerated.
+         */
+        RArray<TUint>         iPendingStorages;
     };
     
 private: // Owned
--- a/mtpfws/mtpfw/dataproviders/devdp/src/cmtpgetnumobjects.cpp	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/dataproviders/devdp/src/cmtpgetnumobjects.cpp	Fri Feb 19 23:40:44 2010 +0200
@@ -18,6 +18,7 @@
 #include <mtp/mmtpobjectmgr.h>
 #include <mtp/mmtpdataprovider.h>
 #include <mtp/cmtpdataproviderplugin.h>
+#include <mtp/cmtpobjectmetadata.h>
 
 #include "cmtpdataprovidercontroller.h"
 #include "cmtpdataprovider.h"
@@ -26,6 +27,7 @@
 #include "mtpdevicedpconst.h"
 #include "mtpdevdppanic.h"
 
+
 /**
 Verification data for GetNumObjects request
 */
@@ -57,6 +59,7 @@
 */	
 CMTPGetNumObjects::~CMTPGetNumObjects()
 	{	
+	iDevDpSingletons.Close();
     iSingletons.Close();
 	}
 /**
@@ -74,19 +77,51 @@
 void CMTPGetNumObjects::ConstructL()
     {
     iSingletons.OpenL();
+    iDevDpSingletons.OpenL(iFramework);
     }
 
 TMTPResponseCode CMTPGetNumObjects::CheckRequestL()
 	{
 	TMTPResponseCode responseCode = CMTPRequestProcessor::CheckRequestL();
-	if(responseCode == EMTPRespCodeOK)
+	if(responseCode != EMTPRespCodeOK)
+		{
+		return responseCode;	
+		}
+	
+	TUint32 formatCode = Request().Uint32(TMTPTypeRequest::ERequestParameter2); 
+	if(formatCode != 0 && !IsSupportedFormatL(formatCode))
+		{
+		return EMTPRespCodeInvalidObjectFormatCode;
+		}
+	
+	if(iSingletons.DpController().EnumerateState() != CMTPDataProviderController::EEnumeratedFulllyCompleted)
 		{
-		TUint32 formatCode = Request().Uint32(TMTPTypeRequest::ERequestParameter2);
-		if(formatCode != 0 && !IsSupportedFormatL(formatCode))
+		TUint storageID = Request().Uint32(TMTPTypeRequest::ERequestParameter1);
+		TUint handle = Request().Uint32(TMTPTypeRequest::ERequestParameter3);
+		if(iDevDpSingletons.PendingStorages().FindInOrder(storageID) != KErrNotFound)
+			{
+			responseCode = EMTPRespCodeDeviceBusy;
+			}
+		else if( (handle != KMTPHandleNone) && (handle != KMTPHandleAll)  )
 			{
-			responseCode = EMTPRespCodeInvalidObjectFormatCode;
+			CMTPObjectMetaData* meta = iRequestChecker->GetObjectInfo(handle);
+			__ASSERT_DEBUG(meta, Panic(EMTPDevDpObjectNull));
+			
+			if( meta->Uint(CMTPObjectMetaData::EFormatCode) == EMTPFormatCodeAssociation )
+				{
+				responseCode = EMTPRespCodeDeviceBusy;
+				}
+			}
+		else if(EMTPFormatCodeUndefined == formatCode)
+			{
+			responseCode = EMTPRespCodeDeviceBusy;
 			}
 		}
+	else if(iDevDpSingletons.PendingStorages().Count() > 0)
+		{
+		iDevDpSingletons.PendingStorages().Close();
+		}
+	
 	return responseCode;	
 	}
 	
--- a/mtpfws/mtpfw/dataproviders/devdp/src/cmtpopensession.cpp	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/dataproviders/devdp/src/cmtpopensession.cpp	Fri Feb 19 23:40:44 2010 +0200
@@ -83,7 +83,7 @@
 void CMTPOpenSession::ServiceL()    
     {
     iSingletons.DpController().WaitForEnumerationComplete();
-    if(iSingletons.DpController().EnumerateState() != CMTPDataProviderController::EEnumerated)
+    if(iSingletons.DpController().EnumerateState() < CMTPDataProviderController::EEnumeratingPhaseOneDone)
     	{
     	SendResponseL(EMTPRespCodeDeviceBusy);
     	}
--- a/mtpfws/mtpfw/dataproviders/devdp/src/cmtpstoragewatcher.cpp	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/dataproviders/devdp/src/cmtpstoragewatcher.cpp	Fri Feb 19 23:40:44 2010 +0200
@@ -24,7 +24,6 @@
 #include "cmtpstoragemgr.h"
 #include "cmtpobjectmgr.h"
 #include "cmtpstoragewatcher.h"
-#include "rmtpdevicedpsingletons.h"
 #include "cmtpdevicedpconfigmgr.h"
 
 
@@ -61,6 +60,7 @@
     iDpSingletons.Close();
     iDrivesExcluded.Close();
     iFrameworkSingletons.Close();
+    iDevDpSingletons.Close();
     __FLOG(_L8("~CMTPStorageWatcher - Exit"));
     __FLOG_CLOSE;
     }
@@ -278,13 +278,10 @@
     iFrameworkSingletons.OpenL();
     iFrameworkSingletons.FrameworkConfig().GetValueL(CMTPFrameworkConfig::ELogicalStorageIdsAllocationEnable, iAllocateLogicalStorages);
     
-    RMTPDeviceDpSingletons devSingletons;
-    devSingletons.OpenL(iFramework);
-    CleanupClosePushL(devSingletons);
-    
     iDpSingletons.OpenL(iFramework);
-    iFolderExclusionList = devSingletons.ConfigMgr().GetArrayValueL(CMTPDeviceDpConfigMgr::EFolderExclusionList); 
-    CleanupStack::PopAndDestroy(&devSingletons);
+    iDevDpSingletons.OpenL(iFramework);
+    iFolderExclusionList = iDevDpSingletons.ConfigMgr().GetArrayValueL(CMTPDeviceDpConfigMgr::EFolderExclusionList); 
+
     __FLOG(_L8("ConstructL - Exit"));
     }
     
@@ -475,6 +472,11 @@
         {
         TMTPNotificationParamsStorageChange params = {physical};
         iFrameworkSingletons.DpController().NotifyDataProvidersL(EMTPStorageAdded, static_cast<TAny*>(&params));
+        
+        if(iFrameworkSingletons.DpController().EnumerateState() == CMTPDataProviderController::EEnumeratingSubDirFiles)
+			{
+			iDevDpSingletons.PendingStorages().InsertInOrder(logical);
+			}
         }
 
     // Notify any connected Initiator(s).
@@ -515,6 +517,12 @@
     TMTPNotificationParamsStorageChange params = {physical};
     iFrameworkSingletons.DpController().NotifyDataProvidersL(EMTPStorageRemoved, static_cast<TAny*>(&params));
 
+    TInt index = iDevDpSingletons.PendingStorages().FindInOrder( logical);
+	if(KErrNotFound != index)
+		{
+		iDevDpSingletons.PendingStorages().Remove(index);
+		}
+        	
     // Notify any connected Initiator(s).
     if (iAllocateLogicalStorages)
         {
--- a/mtpfws/mtpfw/dataproviders/devdp/src/rmtpdevicedpsingletons.cpp	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/dataproviders/devdp/src/rmtpdevicedpsingletons.cpp	Fri Feb 19 23:40:44 2010 +0200
@@ -141,6 +141,7 @@
     __FLOG(_L8("CSingletons::~CSingletons - Entry"));
     delete iConfigMgr;
     delete iDeviceDataStore;
+    iPendingStorages.Close();
     __FLOG(_L8("CSingletons::~CSingletons - Exit"));
     __FLOG_CLOSE;
     }
@@ -154,3 +155,11 @@
     __FLOG(_L8("CSingletons::ConstructL - Exit"));
     }
 
+RArray<TUint>& RMTPDeviceDpSingletons::PendingStorages()
+	{
+    __FLOG(_L8("PendingStorages - Entry"));
+    __ASSERT_DEBUG(iSingletons, User::Invariant());
+    __FLOG(_L8("PendingStorages - Exit"));
+    return iSingletons->iPendingStorages;
+	}
+
--- a/mtpfws/mtpfw/dataproviders/dputility/inc/cmtpfsenumerator.h	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/dataproviders/dputility/inc/cmtpfsenumerator.h	Fri Feb 19 23:40:44 2010 +0200
@@ -46,7 +46,7 @@
     IMPORT_C static CMTPFSEnumerator* NewL(MMTPDataProviderFramework& aFramework, CMTPFSExclusionMgr& aExclusionMgr, MMTPEnumerationCallback& aCallback, TInt aProcessLimit);
     IMPORT_C ~CMTPFSEnumerator();
 
-	IMPORT_C void StartL(TUint32 aStorageId);	
+	IMPORT_C void StartL(TUint32 aStorageId, TBool aOnlyRoot = EFalse);	
 	
 private:
 	//from CActive
@@ -64,10 +64,11 @@
 	void ScanNextStorageL();
 	void ScanNextSubdirL();
 	void ProcessEntriesL();
-	void AddEntryL(const TDesC& aPath, TUint32 &aHandle, TMTPFormatCode format, TUint32 aDPId, const TEntry& aEntry);
-	void AddFileEntryForOtherDpL(const TDesC& aPath, TUint32 &aHandle, TMTPFormatCode format, TUint32 aDPId, const TEntry& aEntry);
+	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 NotifyObjectAddToDP(const TUint32 aHandle,const TUint DpId);
 	
+	
 private: 
 	// Owned
 	MMTPDataProviderFramework&  iFramework;
@@ -88,6 +89,10 @@
 	TUint						iDpID;
 	RMTPFramework               iSingletons;
 	TBool                       iSkipCurrentStorage;
+	
+	TBool						iIsFileEnumerator;
+	TBool						iOnlyScanRoot;
+	TInt						iNumOfFoldersAndFiles;
 	/**
     FLOGGER debug trace member variable.
     */
--- a/mtpfws/mtpfw/dataproviders/dputility/inc/cmtpknowledgehandler.h	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/dataproviders/dputility/inc/cmtpknowledgehandler.h	Fri Feb 19 23:40:44 2010 +0200
@@ -31,6 +31,93 @@
 class CMTPTypeFile;
 class CRepository;
 
+NONSHARABLE_CLASS(CKnowledgeObject) : public CBase
+	{
+public:
+	static CKnowledgeObject* NewL(CRepository& aRepository);
+	~CKnowledgeObject();
+	
+	/**
+	Get the value from the central repository
+	@leave One of the system wide error codes, if repository get value fail
+	*/
+	void LoadL();
+	/**
+	Set the cached value to the central repository
+	@leave One of the system wide error codes, if repository set value fail
+	*/
+	void CommitL();
+	/** 
+	Clear the cached knowledge object property values 
+	*/
+	void Clear();
+	/**
+	Update cached DateModified to current Device time
+	*/
+	void RefreshDateModifed();
+	/**
+	Check if the cached object property values are aligned with repository
+	*/
+	TBool IsDirty() {return iDirty;};
+	
+	//Get method for all prop
+	TUint64 Size(){return iKnowledgeObjectSize;};
+	TDesC& DateModified(){return iDateModified;};
+	TDesC& Name(){return iName;};
+	const TMTPTypeUint128& LastAuthorProxyID() {return iLastAuthorProxyID;};
+	
+	//Set method for all prop
+	void SetSize(TUint64 aSize);
+	void SetDateModified(const TDesC& aDateModified);
+	void SetName(const TDesC& aName);
+	void SetLastAuthorProxyID(TUint64 aHigh, TUint64 aLow);
+	
+private:
+	//key of central repository
+	enum TMTPKnowledgeStoreKeyNum
+		{
+		ESize 				= 0x10001, 
+		EDateModified 		= 0x10002,
+		EName 				= 0x10003,
+		ELastAuthorProxyID 	= 0x10004
+		};
+
+	// Bit flag of the property
+	enum TMTPKnowledgeBitFlag
+		{
+		EBitFlagNone 				= 0x00,
+		EBitFlagSize 				= 0x01, 
+		EBitFlagDateModified 		= 0x02,
+		EBitFlagName 				= 0x04,
+		EBitFlagLastAuthorProxyID 	= 0x08,
+		EBitFlagAll 				= 0x0F
+		};
+
+private:
+	CKnowledgeObject(CRepository& aRepository);
+	
+	void ConstructL();
+	
+	TMTPResponseCode SetColumnType128Value(TMTPKnowledgeStoreKeyNum aColumnNum, TMTPTypeUint128& aNewData);
+	
+	CRepository&     	iRepository;
+
+	// The bit wise value of TMTPKnowledgeBitFlag 
+	// to state which property is not aligned with repository
+	TUint				iDirty;
+	
+	TUint64          	iKnowledgeObjectSize; 
+	RBuf             	iDateModified;
+	RBuf             	iName;
+	TMTPTypeUint128  	iLastAuthorProxyID;
+	
+	/**
+	FLOGGER debug trace member variable.
+	*/
+	__FLOG_DECLARATION_MEMBER_MUTABLE;
+	
+	};
+
 /** 
 Controls access to the knowledge object.
 @internalComponent
@@ -68,58 +155,24 @@
 	void RollBack();
 	void ReleaseObjectBuffer();	
 
-	enum TCacheStatus
-		{
-		EOK,
-		EDirty,
-		EDeleted
-		};
-	//key of central repository
-	enum TMTPKnowledgeStoreKeyNum
-		{
-		ESize = 0x10001, 
-		EDateModified = 0x10002,
-		EName = 0x10003,
-		ELastAuthorProxyID = 0x10004
-		};
 	
-	TMTPResponseCode SetColumnType128Value(TMTPKnowledgeStoreKeyNum aColumnNum, TMTPTypeUint128& aNewData);
-
 private:
 	CMTPKnowledgeHandler(MMTPDataProviderFramework& aFramework,TUint16 aFormatCode, CRepository& aReposotry, const TDesC& aKwgSuid);
 	void ConstructL();
 	
 	/**
-	Get the value from the central repository
-	@leave One of the system wide error codes, if repository get value fail
-	*/
-	void LoadKnowledgeObjPropertiesL();
-	/**
-	Cleanup Item operation for drop all knowledge properties
-	*/
-	static void DropCacheWrapper(TAny* aObject);
-	void DropKnowledgeObjPropertiesCache();
-	/**
 	Helper for GetObjectInfo request handling
 	*/
 	void BuildObjectInfoL(CMTPTypeObjectInfo& aObjectInfo) const;
-	/**
-	Delete knowledge object properties and content
-	@leave One of the system wide error codes, if repository set value fail
-	*/
-	void DeleteAllObjectPropertiesL();
 	
 private:
 	MMTPDataProviderFramework&  iFramework;
 	CRepository&                iRepository;
 	TUint32                     iStorageID;
 	TUint16                     iKnowledgeFormatCode;
-	TUint64                     iKnowledgeObjectSize; 
-	HBufC*                      iDateModified;
-	HBufC*                      iName;
-	TMTPTypeUint128             iLastAuthorProxyID;
-	TCacheStatus                iCacheStatus;
-	TCacheStatus                iCacheStatusFlag;
+	
+	CKnowledgeObject*			iCachedKnowledgeObject;
+	
 	TFileName                   iKnowObjFileName;
 	TFileName                   iKnowObjSwpFileName;
 	// Knowledge object content file
--- a/mtpfws/mtpfw/dataproviders/dputility/inc/cmtprequestprocessor.h	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/dataproviders/dputility/inc/cmtprequestprocessor.h	Fri Feb 19 23:40:44 2010 +0200
@@ -182,7 +182,7 @@
 	const TMTPTypeRequest*		    iRequest;			//the pending requst object
 	MMTPConnection&				    iConnection;		//the connection from which the request comes
 	TMTPTypeResponse			    iResponse;			//the response object to send to the initiator
-	TBool						    iCancelled;			//indicates whether the data phase (send/receive) has been cancelled
+	TBool						    iCancelled;			//indicates whether this request has been cancelled
 	CMTPRequestChecker*		    	iRequestChecker;	//a utility class providing generic request verification service
 	TInt					    	iElementCount;		//number of verification elements used for request checker
 	const TMTPRequestElementInfo*	iElements;	 		//pointer to an array of verification elements
--- a/mtpfws/mtpfw/dataproviders/dputility/inc/mtpsvcdpconst.h	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/dataproviders/dputility/inc/mtpsvcdpconst.h	Fri Feb 19 23:40:44 2010 +0200
@@ -230,6 +230,7 @@
 const TUint32 KMTPServicePropertyAll = 0x00000000;
 
 const TUint32 KMTPUnInitialized32 = 0xFFFFFFFF;
+const TUint64 KMTPUnInitialized64 = ~0; //MAKE_TINT64(KMTPUnInitialized32, KMTPUnInitialized32);
 const TUint32 KMaxSUIDLength = 50;
 const TUint64 KObjectSizeNotAvaiable = ~0;
 const TUint32 KLongStringMaxLength = 0x1000;
--- a/mtpfws/mtpfw/dataproviders/dputility/src/cmtpfsenumerator.cpp	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/dataproviders/dputility/src/cmtpfsenumerator.cpp	Fri Feb 19 23:40:44 2010 +0200
@@ -27,10 +27,18 @@
 #include "mmtpenumerationcallback.h"
 #include "cmtpdataprovidercontroller.h"
 #include "cmtpdataprovider.h"
+#include "mtpframeworkconst.h"
+
 
 // Class constants.
 __FLOG_STMT(_LIT8(KComponent,"FSEnumerator");)
 
+const TUint KMTPMaxFullFileName = 259;
+/*
+ * 
+ */
+#define KMAX_FILECOUNT_ENUMERATINGPHASE1 5000
+
 /**
  * the files should not be owned by any dp. 
  */
@@ -86,9 +94,13 @@
 Kick off the enumeration on the specified storage
 @param aStorageId storage to be enumerated
 */
-EXPORT_C void CMTPFSEnumerator::StartL(TUint32 aStorageId)
+EXPORT_C void CMTPFSEnumerator::StartL(TUint32 aStorageId, TBool aOnlyRoot)
 	{
 	__ASSERT_DEBUG(!IsActive(), User::Invariant());
+	iNumOfFoldersAndFiles = 0;
+	iOnlyScanRoot = aOnlyRoot;
+	__FLOG_VA((_L8("iOnlyScanRoot == %d "), iOnlyScanRoot));
+	
 	MMTPStorageMgr& storageMgr(iFramework.StorageMgr());
 	if (aStorageId == KMTPStorageAll)
 	    {
@@ -157,6 +169,11 @@
 		}
 	else
 		{
+		if((!iIsFileEnumerator) &&(iNumOfFoldersAndFiles > KMAX_FILECOUNT_ENUMERATINGPHASE1))
+			{
+			iSingletons.DpController().SetNeedEnumeratingPhase2(ETrue);
+			}
+		
 		iCallback.NotifyEnumerationCompleteL(iStorageId, KErrNone);
 		
 		TMTPTypeEvent event;
@@ -248,7 +265,12 @@
 		{
 		// We are done
 		iStorages.Reset();
+		if((!iIsFileEnumerator) &&(iNumOfFoldersAndFiles > KMAX_FILECOUNT_ENUMERATINGPHASE1))
+			{
+			iSingletons.DpController().SetNeedEnumeratingPhase2(ETrue);
+			}
 		iCallback.NotifyEnumerationCompleteL(iStorageId, KErrNone);
+		
 		}
 	__FLOG_VA(_L8("ScanNextStorageL - exit"));
 	}
@@ -283,7 +305,7 @@
 	__FLOG_VA(_L8("ScanNextL - entry"));
 	TInt count = iDirStack.Count();
 	
-	if (count == 0)
+	if ((count == 0) || iOnlyScanRoot )
 		{
 		// No more directories on the stack, try the next storage
 		ScanNextStorageL();
@@ -372,6 +394,7 @@
 	__FLOG_VA((_L8("RunError - entry with error %d"), aError));
 	 if(!iFramework.StorageMgr().ValidStorageId(iStorages[0]))
 		 {
+		 __FLOG_VA((_L8("Invalid StorageID = %d"),iStorages[0] ));
 		 if (iStorages.Count()>1)
 			 {
 			 //Not necessary to process any entry on the storage, since the storage removed.
@@ -411,6 +434,7 @@
 	iDpSingletons.OpenL(iFramework);
 	iObject = CMTPObjectMetaData::NewL();	
 	iDpID = iFramework.DataProviderId();
+	iIsFileEnumerator = (KMTPFileDPID == iDpID);
 	}
 
 /**
@@ -419,8 +443,6 @@
 
 void CMTPFSEnumerator::ProcessEntriesL()
 	{
-	const TUint KMTPMaxFullFileName = 259;
-
 	TBuf<KMTPMaxFullFileName> path = iPath.DriveAndPath();
 	
 	// Start looping through entries at where we left off
@@ -429,7 +451,11 @@
 	count = Min(count, iProcessLimit);
 	iFirstUnprocessed += count;		
 	
-		
+	if(!iIsFileEnumerator)
+		{
+		iNumOfFoldersAndFiles +=count;
+		}	
+	
 	for (TInt i = (iFirstUnprocessed - count); i < iFirstUnprocessed; ++i)
 		{
 		const TEntry& entry = iEntries[i];
@@ -475,14 +501,14 @@
 				path.Append('\\');
 				++len;
 				format = EMTPFormatCodeAssociation;
-				AddEntryL(path, handle, format, iDpID, entry);
+				AddEntryL(path, handle, format, iDpID, entry, iStorages[0], iParentHandle);
 				iDirStack.AppendL(entry);
 				}
 			}
 		else if ( iExclusionMgr.IsFileAcceptedL(path,iStorages[0]) )
 			{
 			format = EMTPFormatCodeUndefined;
-			AddEntryL(path, handle, format, iDpID, entry);
+			AddEntryL(path, handle, format, iDpID, entry, iStorages[0], iParentHandle);
 			}
 		else if ( parse.ExtPresent() )
 		    {
@@ -492,7 +518,7 @@
                 if (KMTPHandleNone == iFramework.ObjectMgr().HandleL(path))
                     {
                     format = EMTPFormatCodeUndefined;
-                    AddEntryL(path, handle, format, iDpID, entry);		   
+                    AddEntryL(path, handle, format, iDpID, entry, iStorages[0], iParentHandle);		   
                     }
                 break;
                 
@@ -501,7 +527,7 @@
                     {
                     format = iDpSingletons.MTPUtility().GetFormatByExtension(parse.Ext().Mid(1));  
                     TUint32 DpId = iDpSingletons.MTPUtility().GetDpId(parse.Ext().Mid(1), KNullDesC);
-                    AddFileEntryForOtherDpL(path, handle, format, DpId, entry);
+                    AddFileEntryForOtherDpL(path, handle, format, DpId, entry, iStorages[0], iParentHandle);
                     }
                 break;
                 
@@ -509,7 +535,7 @@
                 {
                 format = iDpSingletons.MTPUtility().GetFormatByExtension(parse.Ext().Mid(1));  
                 TUint32 DpId = iDpSingletons.MTPUtility().GetDpId(parse.Ext().Mid(1), KNullDesC);
-                AddFileEntryForOtherDpL(path, handle, format, DpId, entry);
+                AddFileEntryForOtherDpL(path, handle, format, DpId, entry, iStorages[0], iParentHandle);
                 }
                 break;
                 
@@ -531,7 +557,7 @@
 @param aPath    The full path name of the entry
 @return MTP object handle, or KMTPHandleNone if entry was not accepted
 */    
-void CMTPFSEnumerator::AddEntryL(const TDesC& aPath, TUint32 &aHandle, TMTPFormatCode format, TUint32 aDPId, const TEntry& aEntry)
+void CMTPFSEnumerator::AddEntryL(const TDesC& aPath, TUint32 &aHandle, TMTPFormatCode format, TUint32 aDPId, const TEntry& aEntry, TUint32 aStorageId, TUint32 aParentHandle)
 	{
 #ifdef __FLOG_ACTIVE    
 	TBuf8<KMaxFileName> tmp;
@@ -561,10 +587,10 @@
         
         iObject->SetUint(CMTPObjectMetaData::EDataProviderId, aDPId);
         iObject->SetUint(CMTPObjectMetaData::EFormatCode, format);
-        iObject->SetUint(CMTPObjectMetaData::EStorageId, iStorages[0]);
+        iObject->SetUint(CMTPObjectMetaData::EStorageId, aStorageId);
         iObject->SetDesCL(CMTPObjectMetaData::ESuid, aPath);
         iObject->SetUint(CMTPObjectMetaData::EFormatSubCode, assoc);
-        iObject->SetUint(CMTPObjectMetaData::EParentHandle, iParentHandle);
+        iObject->SetUint(CMTPObjectMetaData::EParentHandle, aParentHandle);
         iObject->SetUint(CMTPObjectMetaData::ENonConsumable, EMTPConsumable);
         iObject->SetDesCL(CMTPObjectMetaData::EName, name);
         iFramework.ObjectMgr().InsertObjectL(*iObject);
@@ -572,7 +598,7 @@
 	__FLOG_VA(_L8("AddEntryL - exit"));	
 	}
 
-void CMTPFSEnumerator::AddFileEntryForOtherDpL(const TDesC& aPath, TUint32 &aHandle, TMTPFormatCode format, TUint32 aDPId, const TEntry& /*aEntry*/)
+void CMTPFSEnumerator::AddFileEntryForOtherDpL(const TDesC& aPath, TUint32 &aHandle, TMTPFormatCode format, TUint32 aDPId, const TEntry& /*aEntry*/, TUint32 aStorageId, TUint32 aParentHandle)
     {
 #ifdef __FLOG_ACTIVE    
     TBuf8<KMaxFileName> tmp;
@@ -589,10 +615,10 @@
     
     iObject->SetUint(CMTPObjectMetaData::EDataProviderId, aDPId);
     iObject->SetUint(CMTPObjectMetaData::EFormatCode, format);
-    iObject->SetUint(CMTPObjectMetaData::EStorageId, iStorages[0]);
+    iObject->SetUint(CMTPObjectMetaData::EStorageId, aStorageId);
     iObject->SetDesCL(CMTPObjectMetaData::ESuid, aPath);
     iObject->SetUint(CMTPObjectMetaData::EFormatSubCode, assoc);
-    iObject->SetUint(CMTPObjectMetaData::EParentHandle, iParentHandle);
+    iObject->SetUint(CMTPObjectMetaData::EParentHandle, aParentHandle);
     iObject->SetUint(CMTPObjectMetaData::ENonConsumable, EMTPConsumable);
     iObject->SetDesCL(CMTPObjectMetaData::EName, name);
     iFramework.ObjectMgr().InsertObjectL(*iObject);
@@ -604,3 +630,4 @@
     iSingletons.DpController().NotifyDataProvidersL(DpId,EMTPObjectAdded,(TAny*)&aHandle);
     }
 
+
--- a/mtpfws/mtpfw/dataproviders/dputility/src/cmtpknowledgehandler.cpp	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/dataproviders/dputility/src/cmtpknowledgehandler.cpp	Fri Feb 19 23:40:44 2010 +0200
@@ -39,6 +39,183 @@
 _LIT(KMTPKnowledgeObjFileName, "mtp_knowledgeobj.dat");
 _LIT(KMTPKnowledgeObjSwpFileName, "mtp_knowledgeobj.swp");
 
+
+CKnowledgeObject* CKnowledgeObject::NewL(CRepository& aRepository)
+	{
+	CKnowledgeObject *self = new (ELeave) CKnowledgeObject(aRepository);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CKnowledgeObject::CKnowledgeObject(CRepository& aRepository) : iRepository(aRepository)
+	{
+	
+	}
+CKnowledgeObject::~CKnowledgeObject()
+	{
+	__FLOG(_L8("~CKnowledgeObject - Entry")); 
+	iDateModified.Close();
+	iName.Close();
+	__FLOG(_L8("~CKnowledgeObject - Exit")); 
+	__FLOG_CLOSE;
+	}
+void CKnowledgeObject::ConstructL()
+	{
+	__FLOG_OPEN(KMTPSubsystem, KComponent);
+	__FLOG(_L8("CKnowledgeObject Construct - Entry"));
+	iKnowledgeObjectSize = KObjectSizeNotAvaiable;
+	iDateModified.CreateL(KDateTimeMaxLength);
+	iName.CreateL(KNameMaxLength);
+	iLastAuthorProxyID.Set(KMTPUnInitialized64, KMTPUnInitialized64);
+	iDirty = EBitFlagAll;
+	__FLOG(_L8("CKnowledgeObject Construct - Exit"));
+	}
+
+void CKnowledgeObject::LoadL()
+	{
+	__FLOG(_L8("CKnowledgeObject LoadL - Entry"));
+	// Load ObjectSize
+	TInt objSize;
+	User::LeaveIfError(iRepository.Get(ESize, objSize));
+	iKnowledgeObjectSize = objSize;
+
+	// Load DateModify
+	iDateModified.Zero();
+	User::LeaveIfError(iRepository.Get(EDateModified, iDateModified));
+	
+	// Load Name
+	iName.Zero();
+	User::LeaveIfError(iRepository.Get(EName, iName));
+
+	// Load LastAuthorProxyID:
+	TPtr8 writeBuf(NULL, 0); //walkaroud for the TMTPTypeUint128
+	iLastAuthorProxyID.FirstWriteChunk(writeBuf);
+	User::LeaveIfError(iRepository.Get(ELastAuthorProxyID, writeBuf));
+	iDirty = EBitFlagNone;
+	__FLOG(_L8("CKnowledgeObject LoadL - Exit"));
+	return;
+	}
+
+
+void CKnowledgeObject::Clear()
+	{
+	__FLOG(_L8("CKnowledgeObject Clear - Entry"));
+	iKnowledgeObjectSize = KObjectSizeNotAvaiable;
+	iDateModified.Zero();
+	iName.Zero();
+	iLastAuthorProxyID.Set(KMTPUnInitialized64, KMTPUnInitialized64);
+	iDirty = EBitFlagAll;
+	__FLOG(_L8("CKnowledgeObject Clear - Exit"));
+	}
+
+void CKnowledgeObject::SetSize(TUint64 aSize)
+	{
+	iKnowledgeObjectSize = aSize;
+	iDirty |= EBitFlagSize;
+	}
+
+void CKnowledgeObject::SetDateModified(const TDesC& /*aDateModified*/)
+	{
+	/**
+	 * DateModifed will be auto updated when commit. If PC set this prop, it will be ignored.
+	 * If someday PC want to force the DateModifed be saved, the following code piece should 
+	 * be opened, and add check in commit when save DateModified.
+	 *iDateModified.Copy(aDateModified);
+	 *iDirty |= EBitFlagDateModified;
+	**/
+	}
+
+void CKnowledgeObject::SetName(const TDesC& aName)
+	{
+	iName.Copy(aName);
+	iDirty |= EBitFlagName;
+	}
+
+void CKnowledgeObject::SetLastAuthorProxyID(TUint64 aHigh, TUint64 aLow) 
+	{
+	iLastAuthorProxyID.Set(aHigh, aLow);
+	iDirty |= EBitFlagLastAuthorProxyID;
+	}
+
+void CKnowledgeObject::CommitL()
+	{
+	__FLOG(_L8("CKnowledgeObject CommitL - Entry"));
+	if (EBitFlagSize == (iDirty & EBitFlagSize))
+		{
+		// TUint64 -> TInt, some capability is lost, 
+		// anyway, it's enough for knowledge object.   
+		User::LeaveIfError(iRepository.Set(ESize, (TInt)iKnowledgeObjectSize));
+		}
+
+	if (EBitFlagName == (iDirty & EBitFlagName))
+		{
+		User::LeaveIfError(iRepository.Set(EName, iName));
+		}
+	
+	if (EBitFlagLastAuthorProxyID == (iDirty & EBitFlagLastAuthorProxyID))
+		{
+		if (EMTPRespCodeOK != SetColumnType128Value(ELastAuthorProxyID, iLastAuthorProxyID))
+			{
+			User::Leave(KErrGeneral);
+			}
+		}
+	
+	// update DateModified to be the time of Commit
+	RefreshDateModifed();
+	User::LeaveIfError(iRepository.Set(EDateModified, iDateModified));
+
+	iDirty = EBitFlagNone;
+	__FLOG(_L8("CKnowledgeObject KnowledgeObject CommitL - Exit"));
+	return;
+	}
+
+TMTPResponseCode CKnowledgeObject::SetColumnType128Value(TMTPKnowledgeStoreKeyNum aColumnNum, TMTPTypeUint128& aNewData)
+	{
+	__FLOG(_L8("CKnowledgeObject SetColumnType128ValueL - Entry"));
+	TInt ret;
+	TMTPResponseCode responseCode = EMTPRespCodeOK;
+	TBuf8<KMTPTypeINT128Size>  data;
+	data.FillZ(data.MaxLength());
+	TUint64 upperValue = aNewData.UpperValue();
+	TUint64 lowerValue = aNewData.LowerValue();
+	
+	/**
+	Least significant 64-bit buffer offset.
+	*/
+	const TInt           KMTPTypeUint128OffsetLS = 0;
+	/**
+	Most significant 64-bit buffer offset.
+	*/
+	const TInt           KMTPTypeUint128OffsetMS = 8;
+	
+	memcpy(&data[KMTPTypeUint128OffsetMS], &upperValue, sizeof(upperValue));
+	memcpy(&data[KMTPTypeUint128OffsetLS], &lowerValue, sizeof(lowerValue));
+	
+	ret = iRepository.Set(aColumnNum, data);
+	if (KErrNone != ret)
+		{
+		responseCode = EMTPRespCodeGeneralError;
+		}
+	__FLOG_VA((_L8("CKnowledgeObject SetColumnType128ValueL - Exit with responseCode = 0x%04X"), responseCode));
+	return responseCode;
+	}
+
+
+void CKnowledgeObject::RefreshDateModifed()
+	{
+	__FLOG(_L8("CKnowledgeObject RefreshDateModifed - Entry"));
+	//get current time
+	TTime now;	
+	now.UniversalTime();
+	_LIT(KFormat,"%F%Y%M%DT%H%T%SZ");
+	iDateModified.Zero();
+	now.FormatL(iDateModified, KFormat);
+	__FLOG(_L8("CKnowledgeObject RefreshDateModifed - Exit"));
+	return;
+	}
+
 EXPORT_C CMTPKnowledgeHandler* CMTPKnowledgeHandler::NewL(MMTPDataProviderFramework& aFramework, TUint16 aFormatCode, 
 												CRepository& aReposotry, const TDesC& aKwgSuid)
 	{
@@ -52,18 +229,16 @@
 EXPORT_C CMTPKnowledgeHandler::~CMTPKnowledgeHandler()
 	{
 	__FLOG(_L8("~CMTPKnowledgeHandler - Entry")); 
-	delete iDateModified;
-	delete iName;
 	delete iKnowledgeObj;
 	delete iKnowledgeSwpBuffer;
+	delete iCachedKnowledgeObject;
 	__FLOG(_L8("~CMTPKnowledgeHandler - Exit"));
 	__FLOG_CLOSE;
 	}
 
 CMTPKnowledgeHandler::CMTPKnowledgeHandler(MMTPDataProviderFramework& aFramework, TUint16 aFormatCode, 
 										CRepository& aReposotry, const TDesC& aKwgSuid) :
-	iFramework(aFramework), iRepository(aReposotry), iKnowledgeFormatCode(aFormatCode),
-	iKnowledgeObjectSize(KObjectSizeNotAvaiable), iCacheStatus(EOK), iSuid(aKwgSuid)
+	iFramework(aFramework), iRepository(aReposotry), iKnowledgeFormatCode(aFormatCode), iSuid(aKwgSuid)
 	{
 	}
 
@@ -93,7 +268,9 @@
 		User::LeaveIfError(iFramework.Fs().Delete(iKnowObjSwpFileName));
 		}
 
-	LoadKnowledgeObjPropertiesL();
+	// create and load knowledge object properties
+	iCachedKnowledgeObject = CKnowledgeObject::NewL(iRepository);
+	iCachedKnowledgeObject->LoadL();
 	__FLOG(_L8("ConstructL - Exit"));
 	}
 
@@ -105,26 +282,11 @@
 void CMTPKnowledgeHandler::CommitL()
 	{
 	__FLOG(_L8("CommitL - Entry"));
-
 	User::LeaveIfError(iRepository.StartTransaction(CRepository::EReadWriteTransaction));
 	iRepository.CleanupCancelTransactionPushL();
-	if(iKnowledgeObjectSize != KObjectSizeNotAvaiable)
-		{
-		User::LeaveIfError(iRepository.Set(ESize, (TInt)iKnowledgeObjectSize));
-		}
-	if(iDateModified)
-		{
-		User::LeaveIfError(iRepository.Set(EDateModified, *iDateModified));
-		}
-	if(iName)
-		{
-		User::LeaveIfError(iRepository.Set(EName, *iName));
-		}
 	
-	if (EMTPRespCodeOK != SetColumnType128Value(ELastAuthorProxyID, iLastAuthorProxyID))
-		{
-		User::Leave(KErrGeneral);
-		}
+	iCachedKnowledgeObject->CommitL();
+	
 	// Close all knowledge file and reset pointer.
 	if (iKnowledgeObj)
 		{
@@ -144,10 +306,11 @@
 		User::LeaveIfError(iFramework.Fs().Replace(iKnowObjSwpFileName, iKnowObjFileName));
 		}
 	// If swp file isn't exsited, that means 0 sized object received, need do nothing.
-	
+
 	TUint32 keyInfo;
 	User::LeaveIfError(iRepository.CommitTransaction(keyInfo));
 	CleanupStack::Pop(&iRepository);
+
 	__FLOG(_L8("CommitL - Exit"));
 	}
 
@@ -160,80 +323,21 @@
 void CMTPKnowledgeHandler::RollBack()
 	{
 	__FLOG(_L8("Rollback - Entry"));
-	TRAP_IGNORE(LoadKnowledgeObjPropertiesL());
+	iCachedKnowledgeObject->Clear();
+	TRAP_IGNORE(iCachedKnowledgeObject->LoadL());
 	__FLOG(_L8("Rollback - Exit"));
 	}
 
 EXPORT_C void CMTPKnowledgeHandler::GetObjectSuidL(TDes& aSuid) const
 	{
 	__FLOG(_L8("GetObjectSuidL - Entry"));
-	if(iKnowledgeObjectSize != KObjectSizeNotAvaiable)
+	if(iCachedKnowledgeObject->Size() != KObjectSizeNotAvaiable)
 		{
 		aSuid.Append(iSuid);
 		}
 	__FLOG(_L8("GetObjectSuidL - Exit"));
 	}
 
-void CMTPKnowledgeHandler::LoadKnowledgeObjPropertiesL()
-	{
-	__FLOG(_L8("LoadKnowledgeObjPropertiesL - Entry"));
-	iCacheStatus = EOK;
-	iCacheStatusFlag = EDirty;
-	TCleanupItem cacheDroper(DropCacheWrapper, this);
-	CleanupStack::PushL(cacheDroper);
-	TInt objSize;
-	User::LeaveIfError(iRepository.Get(ESize, objSize));
-	iKnowledgeObjectSize = objSize;
-
-	// Load DateModify
-	delete iDateModified;
-	iDateModified = NULL;
-	iDateModified = HBufC::NewL(KDateTimeMaxLength);
-	TPtr ptrDate(iDateModified->Des());
-	User::LeaveIfError(iRepository.Get(EDateModified, ptrDate));
-	
-	// Load Name
-	delete iName;
-	iName = NULL;
-	iName = HBufC::NewL(KNameMaxLength);
-	TPtr ptrName(iName->Des());
-	User::LeaveIfError(iRepository.Get(EName, ptrName));
-
-	// Load LastAuthorProxyID:
-	TPtr8 writeBuf(NULL, 0); //walkaroud for the TMTPTypeUint128
-	iLastAuthorProxyID.FirstWriteChunk(writeBuf);
-	User::LeaveIfError(iRepository.Get(ELastAuthorProxyID, writeBuf));
-	CleanupStack::Pop(this);
-	// Doesn't load object content to cache beacause it can grow up to 100KB
-	__FLOG(_L8("LoadKnowledgeObjPropertiesL - Exit"));
-	}
-
-void CMTPKnowledgeHandler::DropCacheWrapper(TAny* aObject)
-	{
-	reinterpret_cast<CMTPKnowledgeHandler*>(aObject)->DropKnowledgeObjPropertiesCache();
-	}
-
-void CMTPKnowledgeHandler::DropKnowledgeObjPropertiesCache()
-	{
-	__FLOG(_L8("DropKnowledgeObjPropertiesCache - Entry"));
-	iCacheStatus = iCacheStatusFlag;
-	iKnowledgeObjectSize = KObjectSizeNotAvaiable;
-	
-	// Load DateModify
-	delete iDateModified;
-	iDateModified = NULL;
-	
-	// Load Name
-	delete iName;
-	iName = NULL;
-	
-	// Reset LastAuthorProxyID
-	TMTPTypeUint128 tmp(MAKE_TINT64(KMTPUnInitialized32, KMTPUnInitialized32), 
-						MAKE_TINT64(KMTPUnInitialized32, KMTPUnInitialized32));
-	iLastAuthorProxyID.Set(tmp.UpperValue(), tmp.LowerValue());
-	__FLOG(_L8("DropKnowledgeObjPropertiesCache - Exit"));
-	}
-
 TMTPResponseCode CMTPKnowledgeHandler::SendObjectInfoL(const CMTPTypeObjectInfo& aObjectInfo, TUint32& aParentHandle, TDes& aSuid)
 	{
 	__FLOG(_L("SendObjectInfoL - Entry"));
@@ -245,21 +349,22 @@
 	else
 		{
 		//if there's a read error reread
-		if(EDirty == iCacheStatus)
+		if(iCachedKnowledgeObject->IsDirty())
 			{
-			LoadKnowledgeObjPropertiesL();
+			__FLOG(_L8("Warning: The cached knowledge is dirty"));
+			iCachedKnowledgeObject->Clear();
+			iCachedKnowledgeObject->LoadL();
 			}
 		//already has a knowledge object
-		if(iKnowledgeObjectSize != KObjectSizeNotAvaiable)
+		if(iCachedKnowledgeObject->Size() != KObjectSizeNotAvaiable)
 			{
 			responseCode = EMTPRespCodeAccessDenied;
 			}
 		else
 			{
-			iKnowledgeObjectSize = aObjectInfo.Uint32L(CMTPTypeObjectInfo::EObjectCompressedSize);
-			delete iDateModified;
-			iDateModified = NULL;
-			iDateModified = aObjectInfo.StringCharsL(CMTPTypeObjectInfo::EDateModified).AllocL();
+			iCachedKnowledgeObject->Clear();
+			iCachedKnowledgeObject->SetSize(aObjectInfo.Uint32L(CMTPTypeObjectInfo::EObjectCompressedSize));
+			// DateModified will be updated when commit.
 			aSuid = iSuid;
 			}
 		}
@@ -280,18 +385,21 @@
 		{
 		//if there's a read error reread
 		aParentHandle = KMTPHandleNoParent;
-		if(EDirty == iCacheStatus)
+		if(iCachedKnowledgeObject->IsDirty())
 			{
-			LoadKnowledgeObjPropertiesL();
+			__FLOG(_L8("Warning: The cached knowledge is dirty"));
+			iCachedKnowledgeObject->Clear();
+			iCachedKnowledgeObject->LoadL();
 			}
 		//already has a knowledge object
-		if(iKnowledgeObjectSize != KObjectSizeNotAvaiable)
+		if(iCachedKnowledgeObject->Size() != KObjectSizeNotAvaiable)
 			{
 			responseCode = EMTPRespCodeAccessDenied;
 			}
 		else
 			{
-			iKnowledgeObjectSize = aObjectSize;
+			iCachedKnowledgeObject->Clear();
+			iCachedKnowledgeObject->SetSize(aObjectSize);
 			aSuid = iSuid;
 			}
 		}
@@ -307,6 +415,12 @@
 	CMTPTypeObjectPropListElement* propertyElement = NULL;
 	TUint32 aHandle = aObjectMetaData.Uint(CMTPObjectMetaData::EHandle);
 	
+	if(iCachedKnowledgeObject->IsDirty())
+		{
+		__FLOG(_L8("Warning: The cached knowledge is dirty"));
+		iCachedKnowledgeObject->LoadL();
+		}
+	
 	switch (aPropertyCode)
 		{
 		case EMTPGenObjPropCodeParentID:
@@ -319,9 +433,9 @@
 		case EMTPGenObjPropCodeName:
 			{
 			propertyElement = &(aPropList.ReservePropElemL(aHandle, aPropertyCode));
-			if (iName && iName->Length() > 0)
+			if (iCachedKnowledgeObject->Name().Length() > 0)
 				{
-				propertyElement->SetStringL(CMTPTypeObjectPropListElement::EValue, *iName);			
+				propertyElement->SetStringL(CMTPTypeObjectPropListElement::EValue, iCachedKnowledgeObject->Name());
 				}
 			else
 				{
@@ -349,10 +463,10 @@
 
 		case EMTPGenObjPropCodeObjectSize:
 			{
-			if (iKnowledgeObjectSize != ~0)
+			if (iCachedKnowledgeObject->Size() != KObjectSizeNotAvaiable)
 				{
 				propertyElement = &(aPropList.ReservePropElemL(aHandle, aPropertyCode));
-				propertyElement->SetUint64L(CMTPTypeObjectPropListElement::EValue,iKnowledgeObjectSize);
+				propertyElement->SetUint64L(CMTPTypeObjectPropListElement::EValue, iCachedKnowledgeObject->Size());
 				}
 			break;
 			}
@@ -380,34 +494,24 @@
 
 		case EMTPGenObjPropCodeDateModified:
 			{
-			propertyElement = &(aPropList.ReservePropElemL(aHandle, aPropertyCode));
-			if(iDateModified && iDateModified->Length() > 0)
-				{
-				propertyElement->SetStringL(CMTPTypeObjectPropListElement::EValue, *iDateModified);	
-				}
-			else
+			if(iCachedKnowledgeObject->DateModified().Length() == 0)
 				{
-				TTime now;	
-				now.UniversalTime();
-				const TInt KMaxTimeStringSize = 50;
-				TBuf<KMaxTimeStringSize> dateTimeBuf;
-				_LIT(KFormat,"%F%Y%M%DT%H%T%S");
-				now.FormatL(dateTimeBuf, KFormat);
-				propertyElement->SetStringL(CMTPTypeObjectPropListElement::EValue, dateTimeBuf);	
+				iCachedKnowledgeObject->RefreshDateModifed();
 				}
+			propertyElement = &(aPropList.ReservePropElemL(aHandle, aPropertyCode));
+			propertyElement->SetStringL(CMTPTypeObjectPropListElement::EValue, iCachedKnowledgeObject->DateModified());
 			break;
 			}
 			
 		case EMTPSvcObjPropCodeLastAuthorProxyID:
 			{
-			const TMTPTypeUint128 unInitValue(MAKE_TUINT64(KMTPUnInitialized32, KMTPUnInitialized32), 
-										MAKE_TUINT64(KMTPUnInitialized32, KMTPUnInitialized32));
-			if(!unInitValue.Equal(iLastAuthorProxyID))
+			if ((iCachedKnowledgeObject->LastAuthorProxyID().UpperValue() != KMTPUnInitialized64)
+				 && (iCachedKnowledgeObject->LastAuthorProxyID().LowerValue() !=KMTPUnInitialized64))
 				{
 				propertyElement = &(aPropList.ReservePropElemL(aHandle, aPropertyCode));
 				propertyElement->SetUint128L(CMTPTypeObjectPropListElement::EValue,
-											iLastAuthorProxyID.UpperValue(),
-											iLastAuthorProxyID.LowerValue());
+						iCachedKnowledgeObject->LastAuthorProxyID().UpperValue(),
+						iCachedKnowledgeObject->LastAuthorProxyID().LowerValue());
 				}
 			break;	
 			}
@@ -437,43 +541,27 @@
 		switch (propertyCode)
 			{
 			case EMTPGenObjPropCodeObjectSize:
-				if(aOperationCode == EMTPOpCodeSetObjectPropList)
-					{
-					ret = iRepository.Set(ESize, (TInt)aElement.Uint64L(CMTPTypeObjectPropListElement::EValue));
-					}
-				iKnowledgeObjectSize = aElement.Uint64L(CMTPTypeObjectPropListElement::EValue);
+				{
+				iCachedKnowledgeObject->SetSize(aElement.Uint64L(CMTPTypeObjectPropListElement::EValue));
 				break;
-				
+				}
 			case EMTPGenObjPropCodeDateModified:
-				if(aOperationCode == EMTPOpCodeSetObjectPropList)
-					{
-					ret = iRepository.Set(EDateModified, aElement.StringL(CMTPTypeObjectPropListElement::EValue));
-					}
-				delete iDateModified;
-				iDateModified = NULL;
-				iDateModified = aElement.StringL(CMTPTypeObjectPropListElement::EValue).AllocL();
+				{
+				// DateModified will be updated when Commit
+				iCachedKnowledgeObject->SetDateModified(aElement.StringL(CMTPTypeObjectPropListElement::EValue));
 				break;
-				
+				}
 			case EMTPGenObjPropCodeName:
-				if(aOperationCode == EMTPOpCodeSetObjectPropList)
-					{
-					ret = iRepository.Set(EName, aElement.StringL(CMTPTypeObjectPropListElement::EValue));
-					}
-				delete iName;
-				iName = NULL;
-				iName = aElement.StringL(CMTPTypeObjectPropListElement::EValue).AllocL();
+				{
+				iCachedKnowledgeObject->SetName(aElement.StringL(CMTPTypeObjectPropListElement::EValue));
 				break;
-				
+				}
 			case EMTPSvcObjPropCodeLastAuthorProxyID:
 				{
 				TUint64 high_value = 0;
 				TUint64 low_value  = 0;
 				aElement.Uint128L(CMTPTypeObjectPropListElement::EValue, high_value, low_value);
-				if(aOperationCode == EMTPOpCodeSetObjectPropList)
-					{
-					responseCode = SetColumnType128Value(ELastAuthorProxyID, iLastAuthorProxyID);
-					}
-				iLastAuthorProxyID.Set(high_value, low_value);
+				iCachedKnowledgeObject->SetLastAuthorProxyID(high_value, low_value);
 				break;
 				}
 				
@@ -494,16 +582,31 @@
 TMTPResponseCode CMTPKnowledgeHandler::DeleteObjectL(const CMTPObjectMetaData& /*aObjectMetaData*/)
 	{
 	__FLOG(_L8("DeleteObjectL - Entry"));
-	iCacheStatusFlag = EDirty;
-	TCleanupItem cacheDroper(DropCacheWrapper, this);
-	CleanupStack::PushL(cacheDroper);
+
+	User::LeaveIfError(iRepository.StartTransaction(CRepository::EReadWriteTransaction));
+	iRepository.CleanupCancelTransactionPushL();
+
 	// Delete obejct properties in transaction, if leave, mgr will rollback all properties.
-	DeleteAllObjectPropertiesL();
-	CleanupStack::Pop(this);
-	// Drop all cached properties.
-	iCacheStatusFlag = EDeleted;
-	CMTPKnowledgeHandler::DropCacheWrapper(this);
-	LoadKnowledgeObjPropertiesL();
+	iCachedKnowledgeObject->Clear();
+	iCachedKnowledgeObject->CommitL();
+	
+	// Reset knowledgeobject pointer and close the file.
+	if (iKnowledgeObj)
+		{
+		delete iKnowledgeObj;
+		iKnowledgeObj = NULL;
+		}
+	
+	// Keep file delete is atomic.
+	if (BaflUtils::FileExists(iFramework.Fs(), iKnowObjFileName))
+		{
+		User::LeaveIfError(iFramework.Fs().Delete(iKnowObjFileName));
+		}
+
+	TUint32 keyInfo;
+	User::LeaveIfError(iRepository.CommitTransaction(keyInfo));
+	CleanupStack::Pop(&iRepository);
+
 	__FLOG(_L8("DeleteObjectL - Exit"));
 	return EMTPRespCodeOK;
 	}
@@ -538,19 +641,12 @@
 	switch (aPropertyCode)
 		{
 		case EMTPGenObjPropCodeDateModified:
-			delete iDateModified;
-			iDateModified = NULL;
-			if (KErrNone != iRepository.Set(EDateModified, KEmptyContent16))
-				{
-				responseCode = EMTPRespCodeGeneralError;
-				}
+			// DateModified will be updated when Commit
+			iCachedKnowledgeObject->SetDateModified(KEmptyContent16);
 			break;
 		case EMTPSvcObjPropCodeLastAuthorProxyID:
 			{
-			TMTPTypeUint128 tmp(MAKE_TINT64(KMTPUnInitialized32, KMTPUnInitialized32), 
-								MAKE_TINT64(KMTPUnInitialized32, KMTPUnInitialized32));
-			iLastAuthorProxyID.Set(tmp.UpperValue(), tmp.LowerValue());
-			responseCode = SetColumnType128Value(ELastAuthorProxyID, iLastAuthorProxyID);
+			iCachedKnowledgeObject->SetLastAuthorProxyID(KMTPUnInitialized64, KMTPUnInitialized64);
 			break;
 			}
 			
@@ -594,7 +690,7 @@
 	aObjectInfo.SetUint16L(CMTPTypeObjectInfo::EObjectFormat, iKnowledgeFormatCode);
 	// Not use
 	aObjectInfo.SetUint16L(CMTPTypeObjectInfo::EProtectionStatus, 0x0000);
-	aObjectInfo.SetUint32L(CMTPTypeObjectInfo::EObjectCompressedSize, iKnowledgeObjectSize);
+	aObjectInfo.SetUint32L(CMTPTypeObjectInfo::EObjectCompressedSize, iCachedKnowledgeObject->Size());
 	aObjectInfo.SetUint16L(CMTPTypeObjectInfo::EThumbFormat, 0);
 	aObjectInfo.SetUint32L(CMTPTypeObjectInfo::EThumbCompressedSize, 0);
 	aObjectInfo.SetUint32L(CMTPTypeObjectInfo::EThumbPixWidth, 0);
@@ -615,7 +711,7 @@
 TMTPResponseCode CMTPKnowledgeHandler::GetObjectInfoL(const CMTPObjectMetaData& /*aObjectMetaData*/, CMTPTypeObjectInfo& aObjectInfo)
 	{
 	__FLOG(_L8("GetObjectInfoL - Entry"));
-	if(iKnowledgeObjectSize != KObjectSizeNotAvaiable)
+	if(iCachedKnowledgeObject->Size() != KObjectSizeNotAvaiable)
 		{
 		BuildObjectInfoL(aObjectInfo);
 		}
@@ -624,42 +720,6 @@
 	}
 
 
-void CMTPKnowledgeHandler::DeleteAllObjectPropertiesL()
-	{
-	__FLOG(_L8("DeleteAllObjectPropertiesL - Entry"));
-	User::LeaveIfError(iRepository.StartTransaction(CRepository::EReadWriteTransaction));
-	iRepository.CleanupCancelTransactionPushL();
-	User::LeaveIfError(iRepository.Set(EDateModified, KEmptyContent16));
-	User::LeaveIfError(iRepository.Set(EName, KEmptyContent16));
-	User::LeaveIfError(iRepository.Set(ESize, static_cast<TInt>(KObjectSizeNotAvaiable)));
-	
-	TMTPTypeUint128 tmp(MAKE_TINT64(KMTPUnInitialized32, KMTPUnInitialized32), 
-						MAKE_TINT64(KMTPUnInitialized32, KMTPUnInitialized32));
-	if (EMTPRespCodeOK != SetColumnType128Value(ELastAuthorProxyID, tmp))
-		{
-		User::Leave(KErrGeneral);
-		}
-	// Reset knowledgeobject pointer and close the file.
-	if (iKnowledgeObj)
-		{
-		delete iKnowledgeObj;
-		iKnowledgeObj = NULL;
-		}
-	
-	// Keep file delete is atomic.
-	if (BaflUtils::FileExists(iFramework.Fs(), iKnowObjFileName))
-		{
-		User::LeaveIfError(iFramework.Fs().Delete(iKnowObjFileName));
-		}
-	
-	TUint32 keyInfo;
-	User::LeaveIfError(iRepository.CommitTransaction(keyInfo));
-	CleanupStack::Pop(&iRepository);
-	
-	__FLOG(_L8("DeleteAllObjectPropertiesL - Exit"));
-	return;
-	}
-
 void CMTPKnowledgeHandler::ReleaseObjectBuffer()
 	{
 	__FLOG(_L8("ReleaseObjectBuffer - Entry"));
@@ -678,42 +738,11 @@
 		{
 		return EMTPRespCodeGeneralError;
 		}
-	aObjectSize = iKnowledgeObjectSize;
+	aObjectSize = iCachedKnowledgeObject->Size();
 	__FLOG(_L8("GetObjectSizeL - Exit"));
 	return EMTPRespCodeOK;
 	}
 
-TMTPResponseCode CMTPKnowledgeHandler::SetColumnType128Value(TMTPKnowledgeStoreKeyNum aColumnNum, TMTPTypeUint128& aNewData)
-	{
-	__FLOG(_L8("SetColumnType128ValueL - Entry"));
-	TInt ret;
-	TMTPResponseCode responseCode = EMTPRespCodeOK;
-	TBuf8<KMTPTypeINT128Size>  data;
-	data.FillZ(data.MaxLength());
-	TUint64 upperValue = aNewData.UpperValue();
-	TUint64 lowerValue = aNewData.LowerValue();
-	
-	/**
-	Least significant 64-bit buffer offset.
-	*/
-	const TInt           KMTPTypeUint128OffsetLS = 0;
-	/**
-	Most significant 64-bit buffer offset.
-	*/
-	const TInt           KMTPTypeUint128OffsetMS = 8;
-	
-	memcpy(&data[KMTPTypeUint128OffsetMS], &upperValue, sizeof(upperValue));
-	memcpy(&data[KMTPTypeUint128OffsetLS], &lowerValue, sizeof(lowerValue));
-	
-	ret = iRepository.Set(aColumnNum, data);
-	if (KErrNone != ret)
-		{
-		responseCode = EMTPRespCodeGeneralError;
-		}
-	__FLOG_VA((_L8("SetColumnType128ValueL - Exit with responseCode = 0x%04X"), responseCode));
-	return responseCode;
-	}
-
 TMTPResponseCode CMTPKnowledgeHandler::GetAllObjectPropCodeByGroupL(TUint32 aGroupId, RArray<TUint32>& aPropCodes)
 	{
 	__FLOG(_L8("GetAllObjectPropCodeByGroupL - Entry"));
@@ -749,3 +778,5 @@
 	__FLOG(_L8("GetAllObjectPropCodeByGroupL - Exit"));
 	return responseCode;
 	}
+
+
--- a/mtpfws/mtpfw/dataproviders/proxydp/inc/cmtpdeleteobject.h	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/dataproviders/proxydp/inc/cmtpdeleteobject.h	Fri Feb 19 23:40:44 2010 +0200
@@ -45,7 +45,8 @@
 private: // From CMTPRequestProcessor
 
     void ServiceL();    
-
+	TMTPResponseCode CheckRequestL();
+	
 private: // From MMTPTransactionProxy
 
     void ProxyReceiveDataL(MMTPType& aData, const TMTPTypeRequest& aRequest, MMTPConnection& aConnection, TRequestStatus& aStatus);
--- a/mtpfws/mtpfw/dataproviders/proxydp/inc/cmtpobjectbrowser.h	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/dataproviders/proxydp/inc/cmtpobjectbrowser.h	Fri Feb 19 23:40:44 2010 +0200
@@ -58,6 +58,15 @@
     void GetRootObjectHandlesL( TUint32 aCurDepth, TUint32 aFormatCode, TUint32 aDepth, const TBrowseCallback& aBrowseCallback ) const;
     void GetObjectHandlesTreeL( TUint32 aCurDepth, TUint32 aFormatCode, TUint32 aDepth, TUint32 aParentHandle, const TBrowseCallback& aBrowseCallback ) const;
     
+    /**
+     * This function retrives all the object handles with the format code of aFormatCode.
+     * 
+     * If aFormatCode == KMTPFormatsAll, only Legacy dp's object handles are returned. Object
+     * Handles of service dp's will not be returned.
+     * 
+     */
+    void GetAllObjectHandlesL( TUint32 aFormatCode,const TBrowseCallback& aBrowseCallback ) const;
+    
 private:
     __FLOG_DECLARATION_MEMBER_MUTABLE;
     
--- a/mtpfws/mtpfw/dataproviders/proxydp/src/cmtpdeleteobject.cpp	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/dataproviders/proxydp/src/cmtpdeleteobject.cpp	Fri Feb 19 23:40:44 2010 +0200
@@ -86,6 +86,19 @@
     __FLOG( _L8("-ConstructL") );
     }
     
+TMTPResponseCode CMTPDeleteObject::CheckRequestL()
+	{
+    __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;
+	}
+
 /**
 DeleteObject request handler
 */ 
@@ -158,11 +171,21 @@
     
     if ( iStatus == KErrNone )
         {
-        NextObjectHandleL();
-        if ( iOwnerDp != KInvalidDpId )
+        //First check if the operation has been cancelled or not
+        if(iCancelled)
             {
-            CMTPDataProvider& dp = iSingletons.DpController().DataProviderL( iOwnerDp );
-            dp.ExecuteProxyRequestL( iCurrentRequest, Connection(), *this );
+            __FLOG(_L8("Initiator cancell delete, send response with cancelled code "));
+            SendResponseL(EMTPRespCodeTransactionCancelled);
+            iCancelled = EFalse;
+            }
+        else
+            {
+            NextObjectHandleL();
+            if ( iOwnerDp != KInvalidDpId )
+                {
+                CMTPDataProvider& dp = iSingletons.DpController().DataProviderL( iOwnerDp );
+                dp.ExecuteProxyRequestL( iCurrentRequest, Connection(), *this );
+                }
             }
         }
     else
@@ -209,6 +232,7 @@
     iHandles.Reset();
     iCurrentHandle = 0;
     iDeletedObjectsNumber = 0;
+    
     MMTPType::CopyL( Request(), iCurrentRequest );
     
     CMTPObjectBrowser::TBrowseCallback callback = { CMTPDeleteObject::OnBrowseObjectL, this };
--- a/mtpfws/mtpfw/dataproviders/proxydp/src/cmtpgetobjectproplist.cpp	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/dataproviders/proxydp/src/cmtpgetobjectproplist.cpp	Fri Feb 19 23:40:44 2010 +0200
@@ -248,18 +248,7 @@
     
     if ( 0 == iHandles.Count() )
         {
-        if ( handle==KMTPHandleNone && depth==0 )
-            {
-            SendDataL( *iObjectPropList );
-            }
-        else if ( fmtCode != KMTPFormatsAll )
-            {
-            SendResponseL(EMTPRespCodeSpecificationByFormatUnsupported);
-            }
-        else if ( handle != KMTPHandleAll )
-            {
-            SendResponseL(EMTPRespCodeInvalidObjectHandle);
-            }
+          SendDataL( *iObjectPropList );
         }
     else
         {
--- a/mtpfws/mtpfw/dataproviders/proxydp/src/cmtpobjectbrowser.cpp	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/dataproviders/proxydp/src/cmtpobjectbrowser.cpp	Fri Feb 19 23:40:44 2010 +0200
@@ -55,7 +55,16 @@
     switch ( aHandle )
         {
         case KMTPHandleAll:
-            GetObjectHandlesL( 0, KMTPStorageAll, aFormatCode, KMaxTUint, KMTPHandleNoParent, aBrowseCallback );
+           //for the format code of serveice dp's, need to check the format
+           if( (aFormatCode >= EMTPFormatCodeVendorExtStart)&&(aFormatCode <= EMTPFormatCodeVendorExtEnd) )
+               {
+               GetAllObjectHandlesL( aFormatCode,aBrowseCallback );
+               }
+           else
+               {
+               GetAllObjectHandlesL( KMTPFormatsAll,aBrowseCallback );
+               }
+           
             break;
         case KMTPHandleNone:
             GetRootObjectHandlesL( 0, aFormatCode, aDepth, aBrowseCallback );
@@ -88,7 +97,16 @@
     
     RMTPObjectMgrQueryContext   context;
     RArray< TUint >             handles;
-    TMTPObjectMgrQueryParams    params( aStorageId, aFormatCode, aParentHandle );
+    TMTPObjectMgrQueryParams    params( aStorageId, KMTPFormatsAll, aParentHandle );
+    // if parenthandle = 0, depth >0 and != ffffffff, for service dp, 
+    // 1. there is no tree structure
+    // 2. KMTPFormatsAll may make the low lever api filter the handls of service dp.
+    if( (aFormatCode >= EMTPFormatCodeVendorExtStart)&&(aFormatCode <= EMTPFormatCodeVendorExtEnd) )
+        {
+        params.iFormatCode = aFormatCode ;
+        }
+     
+      
     CleanupClosePushL( context );
     CleanupClosePushL( handles );
     
@@ -107,7 +125,13 @@
             {
             for ( TUint i = 0; i < handleCount; i++ )
                 {
-                aBrowseCallback.iCallback( aBrowseCallback.iContext, handles[i], aCurDepth );
+                //before insert the handle to th result list , check it's format.
+                iDpFw.ObjectMgr().ObjectL( handles[i], *iObjMetaCache );
+                if ( (KMTPFormatsAll == aFormatCode) || ( aFormatCode == iObjMetaCache->Uint( CMTPObjectMetaData::EFormatCode )) )
+                   {
+                   aBrowseCallback.iCallback( aBrowseCallback.iContext, handles[i], aCurDepth );
+                   }
+           
                 }
             }
         }
@@ -123,16 +147,18 @@
     {
     __FLOG_VA( ( _L8("+GetFolderObjectHandlesL( %d, 0x%08X, %d, 0x%08X )"), aCurDepth, aFormatCode, aDepth, aParentHandle ) );
     
-    if ( 0 == aDepth )
-        {
-        aBrowseCallback.iCallback( aBrowseCallback.iContext, aParentHandle, aCurDepth );
-        }
-    else
+    if (  aDepth > 0)
         {
         GetObjectHandlesL( aCurDepth + 1, KMTPStorageAll, aFormatCode, aDepth - 1, aParentHandle, aBrowseCallback );
-        aBrowseCallback.iCallback( aBrowseCallback.iContext, aParentHandle, aCurDepth );
         }
     
+    //before insert the handle to th result list , check it's format.
+    iDpFw.ObjectMgr().ObjectL( aParentHandle, *iObjMetaCache );
+    if ( (KMTPFormatsAll == aFormatCode) || ( aFormatCode == iObjMetaCache->Uint( CMTPObjectMetaData::EFormatCode )) )
+       {
+       aBrowseCallback.iCallback( aBrowseCallback.iContext, aParentHandle, aCurDepth );
+       }
+            
     __FLOG( _L8("-GetFolderObjectHandlesL") );
     }
 
@@ -140,19 +166,21 @@
     {
     __FLOG_VA( ( _L8("+GetRootObjectHandlesL( %d, 0x%08X, %d )"), aCurDepth, aFormatCode, aDepth ) );
     
-    switch ( aDepth )
-        {
-        case KMaxTUint:
-            GetObjectHandlesL( aCurDepth, KMTPStorageAll, aFormatCode, aDepth, KMTPHandleNoParent, aBrowseCallback );
-            break;
-        case 0:
-            // do nothing
-            break;
-        default:
-            GetObjectHandlesL( aCurDepth, KMTPStorageAll, aFormatCode, aDepth, KMTPHandleNoParent, aBrowseCallback );
-            break;
+    if( aDepth > 0)
+        {        
+            if (KMaxTUint == aDepth)
+                {
+                GetAllObjectHandlesL( aFormatCode,aBrowseCallback );
+                }
+            else
+                {
+                // attention: aDepth should be reduced by 1 here
+                GetObjectHandlesL( aCurDepth, KMTPStorageAll, aFormatCode, aDepth-1, KMTPHandleNoParent, aBrowseCallback );
+                }
         }
     
+    // if aDepth == 0, no handles should be returned.
+    
     __FLOG( _L8("-GetRootObjectHandlesL") );
     }
 
@@ -169,9 +197,13 @@
         {
         GetFolderObjectHandlesL( aCurDepth, aFormatCode, aDepth, aParentHandle, aBrowseCallback );
         }
+    else if ( (KMTPFormatsAll == aFormatCode) || ( aFormatCode == iObjMetaCache->Uint( CMTPObjectMetaData::EFormatCode )) )
+        {
+        aBrowseCallback.iCallback( aBrowseCallback.iContext, aParentHandle, aCurDepth );
+        }
     else
         {
-        aBrowseCallback.iCallback( aBrowseCallback.iContext, aParentHandle, aCurDepth );
+          // format doesn't match, do nothing
         }
 #ifdef __FLOG_ACTIVE
     __FLOG_1( _L8("recursion_depth: %d"), aCurDepth );
@@ -181,4 +213,45 @@
     __FLOG( _L8("-GetObjectHandlesTreeL") );
     }
 
+/**
+ * This function retrives all the object handles with the format code of aFormatCode.
+ * 
+ * If aFormatCode == KMTPFormatsAll, only Legacy dp's object handles are returned. Object
+ * Handles of service dp's will not be returned.
+ * 
+ */
 
+void CMTPObjectBrowser::GetAllObjectHandlesL(TUint32 aFormatCode,const TBrowseCallback& aBrowseCallback ) const
+    {
+    __FLOG( _L8("CMTPObjectBrowser::GetAllObjectHandles-----entry") );
+
+    RMTPObjectMgrQueryContext   context;
+    RArray< TUint >             handles;
+    TMTPObjectMgrQueryParams    params( KMTPStorageAll, aFormatCode, KMTPHandleNone );
+    
+   
+    CleanupClosePushL( context );
+    CleanupClosePushL( handles );
+      
+    do
+        {
+        iDpFw.ObjectMgr().GetObjectHandlesL( params, context, handles );
+        TUint handleCount = handles.Count();
+        
+        for ( TUint i = 0; i < handleCount; i++ )
+          {
+            /* the argument aCurDepth of the callback is set to 0, since the call back never use this argument. 
+             * If aCurDepth is used later, this arugment shoud be changed to the valid value.
+             */
+            aBrowseCallback.iCallback( aBrowseCallback.iContext, handles[i], 0 );
+          }
+        
+        }
+    while ( !context.QueryComplete() );
+      
+    CleanupStack::PopAndDestroy( &handles );
+    CleanupStack::PopAndDestroy( &context );
+    
+    __FLOG( _L8("CMTPObjectBrowser::GetAllObjectHandles------exit") );
+    }
+
--- a/mtpfws/mtpfw/datatypes/interface/cmtptypefile.h	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/datatypes/interface/cmtptypefile.h	Fri Feb 19 23:40:44 2010 +0200
@@ -33,6 +33,43 @@
 */
 class CMTPTypeFile : public CActive, public MMTPType
     {
+
+class CFileWriter : public CActive
+    {
+public:
+    
+    static CFileWriter* NewL(RFile&  aFile, RBuf8& aWriteBuf);
+    /*
+     * Get the buffer for transport to receive data.
+     */
+    void GetWriteBuf(TPtr8& aChunk);
+    /*
+     * Get the file write result.
+     */
+    TInt GetResult() const;
+    /*
+     * Issue a async request to write aLength Data
+     * 
+     */
+    void Write(TInt aLength);
+    /*
+     * Wait until the async write complete.
+     */
+    void WaitForWriteComplete();
+    void RunL();
+    ~CFileWriter();
+    
+private:
+    void DoCancel();
+    CFileWriter(RFile&  aFile, RBuf8& aBuf);
+    void ConstructL();
+    
+private:
+    TInt    iWriteResult;
+    RFile&  iFile;
+    RBuf8&  iBuf;
+    };
+
 public:
 
     IMPORT_C static CMTPTypeFile* NewL(RFs& aFs, const TDesC& aFileName, TFileMode aFileMode);
@@ -167,6 +204,14 @@
 	TInt64          iOffSet;
     
     mutable TInt64          iByteSent;
+    /*
+     * Use the writer to controll buffer1 write.
+     */
+    CFileWriter    *iFileWriter1;
+    /*
+     * Use the writer to controll buffer2 write.
+     */
+    CFileWriter    *iFileWriter2;
 
     };
     
--- a/mtpfws/mtpfw/datatypes/src/cmtptypefile.cpp	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/datatypes/src/cmtptypefile.cpp	Fri Feb 19 23:40:44 2010 +0200
@@ -32,6 +32,80 @@
 
 const TUint KUSBHeaderLen = 12;
 
+
+
+CMTPTypeFile::CFileWriter* CMTPTypeFile::CFileWriter::NewL(RFile&  aFile, RBuf8& aWriteBuf)
+    {
+    CFileWriter *self = new(ELeave)CFileWriter(aFile, aWriteBuf);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+void CMTPTypeFile::CFileWriter::GetWriteBuf(TPtr8& aChunk)
+    {
+    WaitForWriteComplete();
+    aChunk.Set(&iBuf[0], 0, iBuf.MaxLength());
+    }
+    
+TInt CMTPTypeFile::CFileWriter::GetResult() const
+    {
+    return iWriteResult;
+    }
+    
+void CMTPTypeFile::CFileWriter::Write(TInt aLength)
+    {
+    iFile.Write(iBuf, aLength, iStatus);
+    SetActive();
+    }
+    
+void CMTPTypeFile::CFileWriter::WaitForWriteComplete()
+    {
+    /*
+     * We didn't want to cancel the file write here.
+     * But we need to wait until the file write complete.
+     * The Cancel() function of CActive will do the wait until the file write complete.
+     * If the Write already complete and the RunL() invoked there's nothing happened in the Cancel().
+     */
+    Cancel(); 
+    //Have to save the result.
+    iWriteResult = iStatus.Int();
+    }
+
+void CMTPTypeFile::CFileWriter::RunL()
+    {
+    //Have to save the result.
+    iWriteResult = iStatus.Int();
+    }
+    
+    
+CMTPTypeFile::CFileWriter::~CFileWriter()
+    {
+    WaitForWriteComplete(); //make sure all async request complete
+    if(iWriteResult != KErrNone)
+        {
+        iFile.SetSize(0);
+        }
+    }
+
+
+void CMTPTypeFile::CFileWriter::DoCancel()
+    {
+    //We didn't really want to cancel the file write, so we do nothing here
+    }
+
+
+CMTPTypeFile::CFileWriter::CFileWriter(RFile&  aFile, RBuf8& aBuf):CActive(EPriorityStandard), iWriteResult(KErrNone), iFile(aFile), iBuf(aBuf) 
+    {
+    }
+    
+
+void CMTPTypeFile::CFileWriter::ConstructL()
+    {
+    CActiveScheduler::Add(this);
+    }
+
 /**
  MTP file object data type factory method. 
  @param aFs The handle of an active file server session.
@@ -88,13 +162,9 @@
  */
 EXPORT_C CMTPTypeFile::~CMTPTypeFile()
     {
-    if(iCurrentCommitChunk.Length() != 0)
-        {
-        ToggleRdWrBuffer();
-        }
-
+    delete iFileWriter1;
+    delete iFileWriter2;
     iFile.Close();
-
     iBuffer1.Close();
     iBuffer2.Close();
     Cancel();
@@ -133,6 +203,8 @@
         User::LeaveIfError(iFile.SetSize(aSize));
         iCurrentFileSetSize = aSize;
         }
+    iFileWriter1 = CFileWriter::NewL(iFile, iBuffer1);
+    iFileWriter2 = CFileWriter::NewL(iFile, iBuffer2);
     }
 
 /**
@@ -311,19 +383,14 @@
     TInt err(iFile.Seek(ESeekStart, pos));
     if (err == KErrNone)
         {
-        //Because USB HS's transmission rate is several time faster than the rate of writting data into File System.
-        //If the first packet is a full chunk size packet, then the writting of that data will not start until the full-chunk
-        //sized packet is received. Here we intentionly reduce the first packet size to 1/4 of the full chunk size, therefore,
-        //the start of writting data into File system will start only after 1/4 of the full chunk size data is received.
-        //This can make the writting of data to FS start earlier.
-        aChunk.Set(&iBuffer1[0], 0, iBuffer1.MaxLength());
+        iFileWriter1->GetWriteBuf(aChunk);
         iWriteSequenceState = EInProgress;
 
         //this chunk is going to be used by Transport to write data into it, and when it is full, transport
-        //will call back CommitChunkL(), at that time, the EFalse means it already contains data in it.
+        //will call back CommitChunkL(), at that time, the ETrue means it already contains data in it.
         //it is ready for reading data from it. 
         //This is a initial value for it to trigger the double-buffering mechanism.
-        iBuffer1AvailForWrite = EFalse;
+        iBuffer1AvailForWrite = ETrue;
         }
 
     return err;
@@ -342,11 +409,11 @@
         {//toggle between buffer 1 and buffer 2 here.
         if(iBuffer1AvailForWrite)
             {
-            aChunk.Set(&iBuffer1[0], 0, iBuffer1.MaxLength());
+            iFileWriter1->GetWriteBuf(aChunk);
             }
         else
             {
-            aChunk.Set(&iBuffer2[0], 0, iBuffer2.MaxLength());
+            iFileWriter2->GetWriteBuf(aChunk);
             }
         }
 
@@ -402,51 +469,43 @@
 
 EXPORT_C MMTPType* CMTPTypeFile::CommitChunkL(TPtr8& aChunk)
     {
-	if(iFileRdWrError)
-		{
-		return NULL;
-		}
-	if(0 == aChunk.Length())
-		{
-		ToggleRdWrBuffer();
-		return NULL;
-		}
+    if(iFileRdWrError)
+        {
+        return NULL;
+        }
     iCurrentCommitChunk.Set(aChunk);
-
     if(iRemainingDataSize> iCurrentCommitChunk.Length())
-        {//This is NOT the last chunk, we issue an active object to commit it to File system.
-        iRemainingDataSize -= iCurrentCommitChunk.Length();
-		/*
-		if (!IsActive())
-			{
-			//Since the writting data into file sever will take a long time, will issue a dedicated Active Object to do that.
-			SetActive();
-			TRequestStatus* thisAO = &iStatus;
-			User::RequestComplete(thisAO, KErrNone);
-			}
-		else
-			{
-			//This is a very extreme cases, it only occurs when the following assumption is met
-			//1. USB received buffer1 and already call this CommitChunkL(), therefore, the ActiveObject has completed itself, and USB then use another buffer to
-			//receive the data.
-			//2. Somehow, this active object is not scheduled to be running even after the USB already fill out the other buffer.
-			//3. USB's active object is scheduled to be running prior to the last File active object(this should not happen if ActiveScheduler follow the priority scheduler).
-			//4. USB call this function again to commit the other data buffer.
-			//5. Then it find the previous active is not scheduled to run.
-			//in single-core platform, the code rely on the CActiveScheduler to guarantee the first active call which has higher priority to be running firstly before
-			//the 2nd USB active. but for multi-core platform, this should be re-evaluated .
-			iFileRdWrError = ETrue;//if it really discard the incoming recevied file.			
-			//__FLOG(_L8("\nThe program should not arrive here !!!!!\n"));
-			}
-			*/
+        {
+        iRemainingDataSize -= iCurrentCommitChunk.Length();    
         }
     else
-        {//This is the last chunk, we synchronous commit it 
+        {
         iRemainingDataSize = 0;
-        ToggleRdWrBuffer();
-			return NULL;
+        }
+    //wait until previous write complete
+    if(iBuffer1AvailForWrite)
+        {
+        iFileWriter2->WaitForWriteComplete();
+        iFileRdWrError = (iFileWriter2->GetResult() != KErrNone); 
+        }
+    else
+        {
+        iFileWriter1->WaitForWriteComplete();
+        iFileRdWrError = (iFileWriter1->GetResult() != KErrNone);
         }
-	return this;
+    ToggleRdWrBuffer();
+    if(iRemainingDataSize <= 0) //last chunk need wait the write complete
+        {
+        iFileWriter1->WaitForWriteComplete();
+        iFileWriter2->WaitForWriteComplete();
+        if(iFileWriter1->GetResult() != KErrNone || iFileWriter2->GetResult() != KErrNone)
+            {
+            iFile.SetSize(0);
+            iFileRdWrError = ETrue;
+            }
+        }
+    
+    return NULL;
     }
 
 //for partial
@@ -590,17 +649,20 @@
                 }
             else
                 {
-                err = iFile.Write(iCurrentCommitChunk);
-                if (err != KErrNone)
-                    {// file Write failed,	this means we cannot successfully received this file but however, we cannot disrupt a current DIOR phase according to MTP spec.
-                    // We should continue to receive the data and discard this data, only after the data  phase is finished can we send back an error response
-                    //to Initiator. Therefore, we pretend to continue to write this data into file, and let final processor to check the file size and then give back a 
-                    //corresponding error code to MTP initiator.
-                    iFileRdWrError = ETrue;
-                    iFile.SetSize(0);
+                if(iBuffer1AvailForWrite)
+                    {
+                    iFileWriter1->Write(iCurrentCommitChunk.Length());
+                    }
+                else
+                    {
+                    iFileWriter2->Write(iCurrentCommitChunk.Length());
                     }
                 }
             }
+        else
+            {
+            iFile.SetSize(0);
+            }
         iCurrentCommitChunk.Zero();
         }
     else
--- a/mtpfws/mtpfw/inc/cmtpconnection.h	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/inc/cmtpconnection.h	Fri Feb 19 23:40:44 2010 +0200
@@ -90,7 +90,7 @@
     IMPORT_C void SessionClosedL(TUint32 aSessionMTPId);
     IMPORT_C void SessionOpenedL(TUint32 aSessionMTPId);
     IMPORT_C TInt GetDataReceiveResult() const;
-    void ConnectionSuspended();
+    TBool ConnectionSuspended();
     void ConnectionResumedL(MMTPTransportConnection& aTransportConnection);
     void TransactionCompleteL(const TMTPTypeRequest& aRequest);
     
@@ -116,7 +116,7 @@
     void SendDataCompleteL(TInt aErr, const MMTPType& aData, const TMTPTypeRequest& aRequest);
     void SendEventCompleteL(TInt aErr, const TMTPTypeEvent& aEvent);
     void SendResponseCompleteL(TInt aErr, const TMTPTypeResponse& aResponse, const TMTPTypeRequest& aRequest);
-	void Unbind(MMTPTransportConnection& aConnection);
+    void Unbind(MMTPTransportConnection& aConnection);
 
 private:
 
@@ -132,6 +132,7 @@
     TUint ActiveSessions() const;
     void CloseAllSessions();
     void CloseSession(TUint aIdx);
+    void CompleteCloseConnection();
     CMTPSession& SessionL(const TMTPTypeFlatBase& aDataset, TInt aSessionIdElementNo) const;
     
     static TInt SessionOrder(const TUint32* aL, const CMTPSession& aR);
--- a/mtpfws/mtpfw/inc/cmtpconnectionmgr.h	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/inc/cmtpconnectionmgr.h	Fri Feb 19 23:40:44 2010 +0200
@@ -54,6 +54,7 @@
     IMPORT_C CMTPConnection& ConnectionL(TUint aConnectionId) const;
     TUint ConnectionCount() const;
     CMTPConnection& operator[](TInt aIndex) const;
+	void ConnectionCloseComplete(const TUint& aConnUid);
     IMPORT_C void StartTransportL(TUid aTransport);
     IMPORT_C void StartTransportL(TUid aTransport, const TAny* aParameter);  
     IMPORT_C void QueueTransportL( TUid aTransport, const TAny* aParameter );
@@ -63,13 +64,11 @@
     IMPORT_C void StopTransports();
     IMPORT_C TInt TransportCount() const;
     IMPORT_C TUid TransportUid();
-	
-	    
+                  
 private: // From MMTPConnectionMgr
 
-    void ConnectionClosed(MMTPTransportConnection& aTransportConnection);
+    TBool ConnectionClosed(MMTPTransportConnection& aTransportConnection);
     void ConnectionOpenedL(MMTPTransportConnection& aTransportConnection);
-    TBool DeleteConnection(TUint aConnectionId);
     TUid ClientSId();
     
 private:
@@ -92,6 +91,7 @@
     TUid                            iTransportUid;
     TUint							iTransportCount;
     TUid 							iSecureId;
+    TBool                           iIsTransportStopping;
     
     /**
      * Array storing the UIDs of the suspended transport plugins
--- a/mtpfws/mtpfw/inc/cmtpdataprovidercontroller.h	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/inc/cmtpdataprovidercontroller.h	Fri Feb 19 23:40:44 2010 +0200
@@ -62,7 +62,9 @@
         EEnumeratingDataProviderStorages    = 3,
         EEnumeratingFrameworkObjects        = 4,
         EEnumeratingDataProviderObjects     = 5,
-        EEnumerated                         = 6,
+        EEnumeratingPhaseOneDone            = 6,
+        EEnumeratingSubDirFiles				= 7, //Only File DP care the status.
+        EEnumeratedFulllyCompleted			= 8,
         };
         
 public:
@@ -90,6 +92,9 @@
 
     IMPORT_C void WaitForEnumerationComplete();
     TBool FreeEnumerationWaiter();
+    
+    IMPORT_C void SetNeedEnumeratingPhase2(TBool aNeed);
+    IMPORT_C TBool NeedEnumeratingPhase2() const;
 private: // From CActive
 
     void DoCancel();
@@ -115,7 +120,7 @@
     static void ImplementationsCleanup(TAny* aData);
     static TInt ImplementationsLinearOrderUid(const TUid* aUid, const CImplementationInformation& aObject);
     static TInt ImplementationsLinearOrderUid(const CImplementationInformation& aL, const CImplementationInformation& aR);
-        
+    
 private: // Owned
     /**
     FLOGGER debug trace member variable.
@@ -208,11 +213,12 @@
     opensession waiter
     */
     CActiveSchedulerWait *iOpenSessionWaiter;
-    
-    /**
-    Flag for Create DBSnapshot
-    */
-    TUint8 iFlagDb;
+
+    /*
+     The number of folders and files that will be enumerated.
+     */
+    TBool		iNeedEnumeratingPhase2;
+    TUint32 	iNeedEnumeratingPhase2StorageId;
 
     };
 
--- a/mtpfws/mtpfw/src/cmtpconnection.cpp	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/src/cmtpconnection.cpp	Fri Feb 19 23:40:44 2010 +0200
@@ -108,14 +108,6 @@
     }
 
 /**
-Unbinds the Transport Connection
-*/    
-void CMTPConnection::Unbind(MMTPTransportConnection& /*aConnection*/)
-	{
-	iTransportConnection = NULL;
-	}
-
-/**
 Initiates MTP transaction data phase processing for initiator-to-responder
 data flows. This method should only be invoked when the MTP transaction phase 
 state is ERequestPhase. This is an asynchronous method.
@@ -351,45 +343,43 @@
  * Signals the connection is suspended, the connection state is set to EStateShutdown which 
  * means that all the current transaction will not be able to send/receive any data via the
  * connection
+ * @return ETrue - there is an active transaction currently, and Connection will suspend when it finishes
+ * EFalse - No active transaction, connection suspends immediately.
  */
-void CMTPConnection::ConnectionSuspended()
+TBool CMTPConnection::ConnectionSuspended()
     {
     __FLOG(_L8("ConnectionSuspended - Entry"));
     
+    TBool ret = EFalse;
     TUint currentState = State();
-    if (currentState!=EStateShutdown && currentState!=EStateErrorShutdown)
+    if (currentState != EStateShutdown)
         {
-        SetState(EStateShutdown);
-        
-        if (iTransportConnection != NULL)
-            {
-            iTransportConnection->Unbind(*this);
-            iTransportConnection = NULL;
-            }
-        PublishConnState(EDisconnectedFromHost);   
-    
-        if (ActiveSessions() == 0)
+        if (ActiveSessions() == 0 || currentState == EStateErrorShutdown)
             {
-            CloseAllSessions();
-            iSessions.Reset();
-            iSingletons.Close();
+            CompleteCloseConnection();
+            ret = ETrue;
             }
-        else 
-            {
-            //some session may be in data or response phase, complete them and set transaction phase to ECompletingPhase.
-            const TUint count(iSessions.Count());
-            for (TUint i(0); (i < count); i++)
-                {
-                if (iSessions[i]->TransactionPhase() & (EDataIToRPhase|EDataRToIPhase|EResponsePhase))
-                    {
-                    iSessions[i]->SetTransactionPhase(ECompletingPhase);
-                    iSessions[i]->CompletePendingRequest(KErrCancel);
-                    }
-                }
-            }
+        
+        SetState(EStateShutdown);
+        PublishConnState(EDisconnectedFromHost);   
         }
     
     __FLOG(_L8("ConnectionSuspended - Exit"));
+    return ret;
+    }
+
+void CMTPConnection::CompleteCloseConnection()
+    {
+    __FLOG(_L8("CompleteCloseConnection - Entry"));
+    
+    CloseAllSessions();
+    iSessions.Reset();
+    
+    //notify ConnectionMgr and corresponding transports of completion of connection close
+    iSingletons.ConnectionMgr().ConnectionCloseComplete(iConnectionId);    
+    iSingletons.Close();
+
+    __FLOG(_L8("CompleteCloseConnection - Exit"));
     }
 
 /*
@@ -439,24 +429,18 @@
     if (ValidFrameworkRequest(&session, KValidPhases, NULL))
         {
         session.SetTransactionPhase(EIdlePhase);
-        if (State() == EStateShutdown)
-            {
-            if (ActiveSessions() == 0)
-                {        
-                CloseAllSessions();
-                iSessions.Reset();
-                iSingletons.Close();
-                
-                // Move the log here because ShutdownComplete will delete this object.
-                __FLOG(_L8("TransactionCompleteL - Exit"));
-                }
+        
+        if (State() == EStateShutdown && ActiveSessions() == 0)
+            {     
+            CompleteCloseConnection();
             }
-        else
+        
+        if (iTransportConnection != NULL)
             {
             iTransportConnection->TransactionCompleteL(aRequest);
-            __FLOG(_L8("TransactionCompleteL - Exit"));
             }
         }
+    __FLOG(_L8("TransactionCompleteL - Exit"));
     }
     
 TUint CMTPConnection::ConnectionId() const
@@ -700,6 +684,11 @@
     __FLOG(_L8("SendResponseCompleteL - Exit"));
     }
 
+void CMTPConnection::Unbind(MMTPTransportConnection& /*aConnection*/)
+    {
+    iTransportConnection = NULL;
+    }
+
    
 TMTPTransactionPhase CMTPConnection::TransactionPhaseL(TUint32 aMTPId) const
     {
--- a/mtpfws/mtpfw/src/cmtpconnectionmgr.cpp	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/src/cmtpconnectionmgr.cpp	Fri Feb 19 23:40:44 2010 +0200
@@ -93,6 +93,15 @@
     return iTransportUid;
     }
 
+void CMTPConnectionMgr::ConnectionCloseComplete(const TUint& /*aConnUid*/)
+    {
+    if (iIsTransportStopping)
+        {
+        iIsTransportStopping = EFalse;
+        ResumeSuspendedTransport();
+        }
+    }
+
 EXPORT_C void CMTPConnectionMgr::StartTransportL(TUid aTransport)
     {
     StartTransportL( aTransport, NULL );
@@ -187,14 +196,14 @@
             {
             TRAP_IGNORE( SuspendTransportL( aTransport ) );
             }
+        iIsTransportStopping = ETrue;
         iTransport->Stop(*this);
         delete iTransport;
         iTransport = NULL;
         iTransportUid = KNullUid;
         iTransportCount--;
-
-
         }
+    
     if ( aByBearer )
         {
         UnsuspendTransport( aTransport );
@@ -227,7 +236,7 @@
 	return iTransportCount;
     }
 
-void CMTPConnectionMgr::ConnectionClosed(MMTPTransportConnection& aTransportConnection)
+TBool CMTPConnectionMgr::ConnectionClosed(MMTPTransportConnection& aTransportConnection)
     {
     __FLOG(_L8("ConnectionClosed - Entry"));
     
@@ -236,11 +245,9 @@
     __ASSERT_DEBUG((idx != KErrNotFound), User::Invariant());
     
     CMTPConnection* connection(iConnections[idx]);
-    connection->ConnectionSuspended();
-    
-    ResumeSuspendedTransport();
     
     __FLOG(_L8("ConnectionClosed - Exit"));
+    return connection->ConnectionSuspended();
     }
     
 void CMTPConnectionMgr::ConnectionOpenedL(MMTPTransportConnection& aTransportConnection)
@@ -267,26 +274,6 @@
     __FLOG(_L8("ConnectionOpenedL - Exit"));
     }
 
-TBool CMTPConnectionMgr::DeleteConnection(TUint aConnectionId)
-    {
-    __FLOG(_L8("DeleteConnection - Entry"));
-    
-    TBool ret = EFalse;    
-    TInt idx = ConnectionFind(aConnectionId);
-    
-    if (idx != KErrNotFound)
-        {
-        CMTPConnection* connection(iConnections[idx]);
-        iConnections.Remove(idx);
-        delete connection;
-        ret = ETrue;
-        }
-    
-    __FLOG(_L8("DeleteConnection - Entry"));
-    
-    return ret;
-    }
-
 EXPORT_C TUid CMTPConnectionMgr::ClientSId()
 	{
 	return iSecureId;
@@ -297,7 +284,8 @@
 CMTPConnectionMgr::CMTPConnectionMgr() :
     iConnectionOrder(ConnectionOrderCompare),
     iShutdownConnectionIdx(KErrNotFound),
-	iTransportUid(KNullUid)
+	iTransportUid(KNullUid),
+	iIsTransportStopping(EFalse)
     {
     __FLOG_OPEN(KMTPSubsystem, KComponent);    
     }
--- a/mtpfws/mtpfw/src/cmtpdataprovider.cpp	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/src/cmtpdataprovider.cpp	Fri Feb 19 23:40:44 2010 +0200
@@ -558,7 +558,7 @@
             }
         }
     
-		else if (iSingletons.DpController().EnumerateState() != CMTPDataProviderController::EEnumerated)
+		else if (iSingletons.DpController().EnumerateState() < CMTPDataProviderController::EEnumeratingPhaseOneDone)
     	{
         __FLOG(_L8("DP Enumeration is not complete"));
 
--- a/mtpfws/mtpfw/src/cmtpdataprovidercontroller.cpp	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/src/cmtpdataprovidercontroller.cpp	Fri Feb 19 23:40:44 2010 +0200
@@ -236,7 +236,7 @@
         iEnumeratingStorages.AppendL(params->iStorageId);
         
         // Only schedule the operation start if there is not one currently underway.
-        if (iEnumerationState == EEnumerated)
+        if (iEnumerationState == EEnumeratedFulllyCompleted) 
             {
             iNextDpId           = iDpIdDeviceDp;
             iEnumerationState   = EEnumeratingFrameworkObjects;
@@ -385,7 +385,7 @@
 */ 
 EXPORT_C void CMTPDataProviderController::WaitForEnumerationComplete()
 {
-	if(EnumerateState() != CMTPDataProviderController::EEnumerated)
+	if(EnumerateState() < CMTPDataProviderController::EEnumeratingPhaseOneDone)
 		{
 		iOpenSessionWaiter->Start();
 		}
@@ -406,6 +406,7 @@
 void CMTPDataProviderController::EnumerationStateChangedL(const CMTPDataProvider& aDp)
     {
     __FLOG(_L8("EnumerationStateChangedL - Entry"));
+    __FLOG_VA((_L8("Entry iEnumerationState: 0x%x iNextDpId: %d"), iEnumerationState, iNextDpId));
     switch (iEnumerationState)
         {        
     case EEnumeratingFrameworkStorages:
@@ -463,27 +464,42 @@
             break;
             
         case KMTPImplementationUidFileDp:
-            iSingletons.ObjectMgr().RemoveNonPersistentObjectsL(aDp.DataProviderId());
-            // No other data providers
-            iNextDpId = 0;
-            iEnumeratingStorages.Remove(0);
-            if (iEnumeratingStorages.Count() == 0)
-                {
-                // No queued enumerations.
-                iSingletons.ObjectMgr().ObjectStore().CleanDBSnapshotL();
-                iEnumerationState   = EEnumerated;
-                Cancel();
-                if(iOpenSessionWaiter->IsStarted())
-                    {
-                    iOpenSessionWaiter->AsyncStop();
-                    }
-                }
-            else
-                {
-                // Queued enumerations.
-                iNextDpId           = iDpIdDeviceDp;
-                Schedule();
-                }
+			// No other data providers
+			if(NeedEnumeratingPhase2())
+				{
+				iEnumerationState = EEnumeratingSubDirFiles;
+				if(iOpenSessionWaiter->IsStarted())
+					{
+					iOpenSessionWaiter->AsyncStop();
+					}
+				//Schedule FildDP to enumerate the files in sub-dir
+				iNextDpId           = iDpIdFileDp;
+				Schedule();
+				}
+			else
+				{
+				iNextDpId = 0;
+				iEnumeratingStorages.Remove(0);
+				if (iEnumeratingStorages.Count() == 0)
+					{
+					iSingletons.ObjectMgr().RemoveNonPersistentObjectsL(aDp.DataProviderId());
+					iEnumerationState   = EEnumeratedFulllyCompleted;
+					iSingletons.ObjectMgr().ObjectStore().CleanDBSnapshotL();
+						
+					Cancel();
+					if(iOpenSessionWaiter->IsStarted())
+						{
+						iOpenSessionWaiter->AsyncStop();
+						}
+					}
+				else
+					{
+					// Queued enumerations.
+					iNextDpId           = iDpIdDeviceDp;
+					Schedule();
+					}
+				}
+        		
             }
         break;
         
@@ -496,9 +512,23 @@
         if ((iEnumeratingDps.Count() == 0) && iDpIdArrayIndex >= iDataProviderIds.Count())
             {
             // Enumeration complete.
-            iNextDpId = 0;
             iNextDpId           = iDpIdFileDp;
             iEnumerationState   = EEnumeratingFrameworkObjects;
+            			
+			if ( ( iEnumeratingStorages.Count() > 1 ) &&(KErrNotFound != iEnumeratingStorages.Find(KMTPStorageAll)) )
+				{
+				const TUint storageid = iEnumeratingStorages[0];
+				iEnumeratingStorages.Remove(0);
+				if(KMTPStorageAll == storageid)
+					{
+					iEnumeratingStorages.Append(KMTPStorageAll);
+					}
+				
+				if(iEnumeratingStorages[0] != KMTPStorageAll)
+					{
+					iNextDpId = iDpIdDeviceDp;
+					}
+				}
             }
         else
             {
@@ -511,13 +541,39 @@
         Schedule();        
         break;
         
+    case EEnumeratingSubDirFiles:
+    	{
+    	if(aDp.ImplementationUid().iUid == KMTPImplementationUidFileDp)
+    		{
+			iSingletons.ObjectMgr().RemoveNonPersistentObjectsL(aDp.DataProviderId());
+			iNextDpId = 0;
+			iEnumeratingStorages.Remove(0);
+			if(iEnumeratingStorages.Count() == 0)
+				{
+				iSingletons.DpController().SetNeedEnumeratingPhase2(EFalse);
+				iEnumerationState   = EEnumeratedFulllyCompleted;
+				iSingletons.ObjectMgr().ObjectStore().CleanDBSnapshotL();
+				}
+			else //removable card plug in
+				{
+				iNextDpId           = iDpIdDeviceDp;
+				iEnumerationState   = EEnumeratingFrameworkObjects;
+				Schedule();
+				}
+    		}
+    	}
+    	break;
+    	
+    case EEnumeratedFulllyCompleted:
     case EUnenumerated:
     case EEnumerationStarting:
-    case EEnumerated:
+    case EEnumeratingPhaseOneDone:
     default:
         __DEBUG_ONLY(User::Invariant());
         break;
         }
+    
+    __FLOG_VA((_L8("Exit iEnumerationState: 0x%x, iNextDpId: %d, UID=0x%x"), iEnumerationState, iNextDpId, aDp.ImplementationUid().iUid));
     __FLOG(_L8("EnumerationStateChangedL - Exit"));
     }
 
@@ -556,8 +612,6 @@
             iNextDpId           = iDpIdDeviceDp;
             iEnumerationState   = EEnumeratingFrameworkObjects;
 	
-            
-        
             Schedule();
             }
         break;
@@ -573,7 +627,7 @@
             iEnumeratingStorages.Remove(0);
             if (iEnumeratingStorages.Count() == 0)
                 {
-                iEnumerationState = EEnumerated;
+                iEnumerationState = EEnumeratedFulllyCompleted;
                 }
             else
                 {
@@ -591,21 +645,22 @@
                     {
                     iSingletons.ObjectMgr().ObjectStore().EstablishDBSnapshotL(storageId);
                     }
-                else
+                else 
                     {
-                    const CMTPStorageMetaData& storage(iSingletons.StorageMgr().StorageL(storageId));
-                    if(storage.Uint(CMTPStorageMetaData::EStorageSystemType) == CMTPStorageMetaData::ESystemTypeDefaultFileSystem)
-                        {
-                        const RArray<TUint>& logicalIds(storage.UintArray(CMTPStorageMetaData::EStorageLogicalIds));
-                        const TUint KCountLogicalIds(logicalIds.Count());
-                        for (TUint i(0); (i < KCountLogicalIds); i++)
-                            {
-                            __FLOG_VA((_L8("Establish snapshot for storage: 0x%x"), storageId));
-                            iSingletons.ObjectMgr().ObjectStore().EstablishDBSnapshotL(storageId);
-                            }
-                        }
+					const CMTPStorageMetaData& storage(iSingletons.StorageMgr().StorageL(storageId));
+                	if(storage.Uint(CMTPStorageMetaData::EStorageSystemType) == CMTPStorageMetaData::ESystemTypeDefaultFileSystem)
+                		{
+						const RArray<TUint>& logicalIds(storage.UintArray(CMTPStorageMetaData::EStorageLogicalIds));
+						const TUint KCountLogicalIds(logicalIds.Count());
+						for (TUint i(0); (i < KCountLogicalIds); i++)
+							{
+							__FLOG_VA((_L8("Establish snapshot for storage: 0x%x"), logicalIds[i]));
+							iSingletons.ObjectMgr().ObjectStore().EstablishDBSnapshotL(logicalIds[i]);
+							}	
+                		}
                     }
                 }
+            	
             EnumerateDataProviderObjectsL(iNextDpId);          
             }
         	}
@@ -624,11 +679,19 @@
             iEnumeratingDps.InsertInOrderL(currentDp);
             EnumerateDataProviderObjectsL(currentDp);
             }
+        
+        __FLOG_VA((_L8("iDpIdArrayIndex = %d, KLoadedDps = %d"), iDpIdArrayIndex, KLoadedDps));
         }
         break;
         
+    case EEnumeratingSubDirFiles:
+    	{
+    	EnumerateDataProviderObjectsL(iNextDpId); 
+    	}
+    	break;
+    case EEnumeratedFulllyCompleted:
     case EUnenumerated:
-    case EEnumerated:
+    case EEnumeratingPhaseOneDone:
     default:
         __DEBUG_ONLY(User::Invariant());
         break;
@@ -666,7 +729,7 @@
         break;
         
     case EUnenumerated:
-    case EEnumerated:
+    case EEnumeratingPhaseOneDone:
     default:
         User::Invariant();
         break;
@@ -709,7 +772,7 @@
 	iMode = (TMTPOperationalMode)tMTPMode;
 	CreateRegistrySessionAndEntryL();
     
-	iFlagDb = 0;
+	SetNeedEnumeratingPhase2(EFalse);
 	
     iOpenSessionWaiter = new(ELeave) CActiveSchedulerWait();
     __FLOG(_L8("ConstructL - Exit"));
@@ -1148,3 +1211,18 @@
 	iSisSession.Close();
 	}
 
+EXPORT_C void CMTPDataProviderController::SetNeedEnumeratingPhase2(TBool aNeed)
+	{
+	__FLOG(_L8("SetNeedEnumeratingPhase2 - Entry"));
+	__FLOG_VA((_L8("Need = %d"), aNeed)); 
+	
+	iNeedEnumeratingPhase2 = aNeed;
+	
+	__FLOG(_L8("SetNeedEnumeratingPhase2 - Exit"));
+	}
+
+EXPORT_C TBool CMTPDataProviderController::NeedEnumeratingPhase2() const
+	{
+	return iNeedEnumeratingPhase2;
+	}
+
--- a/mtpfws/mtpfw/src/cmtpobjectstore.cpp	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/src/cmtpobjectstore.cpp	Fri Feb 19 23:40:44 2010 +0200
@@ -385,6 +385,7 @@
 	TBool needToInsert = EFalse;
 	TBool needUpdateOwner = EFalse;
 	TUint dpId(aObject.Uint(CMTPObjectMetaData::EDataProviderId));
+
 	TFileName suid;
 	suid.CopyLC(aObject.DesC(CMTPObjectMetaData::ESuid));
 	TUint32 suidHash = DefaultHash::Des16(suid);
@@ -392,7 +393,7 @@
 	TUint32 handle = KMTPHandleNone, handleInDB = KMTPHandleAll;
 	TInt64 id = 0;
 	// Check if the dp is enumerating
-	if (iSingletons.DpController().EnumerateState() != CMTPDataProviderController::EEnumerated && iCacheExist)
+	if (iSingletons.DpController().EnumerateState() != CMTPDataProviderController::EEnumeratedFulllyCompleted && iCacheExist)
 		{
 		//it is in the object enumeration phase. 
 		// if it's see if we have an object with the same SUID
@@ -438,7 +439,8 @@
 				}
 			else
 				{
-				User::Leave(KErrAlreadyExists);
+				//while enumerating, we ignore the repeatedly INSERT operations.
+				//User::Leave(KErrAlreadyExists);
 				}
 			}
 		}
@@ -686,7 +688,7 @@
 	{
 	if (LocateByHandleL(aHandle.Value()))
 		{
-		if (iSingletons.DpController().EnumerateState() != CMTPDataProviderController::EEnumerated &&
+		if (iSingletons.DpController().EnumerateState() != CMTPDataProviderController::EEnumeratedFulllyCompleted &&
 			IsMediaFormat(iBatched.ColUint16(EObjectStoreFormatCode)))
 			{
 			iMtpDeltaDataMgr->UpdateDeltaDataTableL(iBatched.ColInt64(EObjectStorePOUID), CMtpDeltaDataMgr::EDeleted);
@@ -702,7 +704,7 @@
 	{
 	if(LocateBySuidL(aSuid))
 		{
-		if (iSingletons.DpController().EnumerateState() != CMTPDataProviderController::EEnumerated &&
+		if (iSingletons.DpController().EnumerateState() != CMTPDataProviderController::EEnumeratedFulllyCompleted &&
 			IsMediaFormat(iBatched_SuidHashID.ColUint16(EObjectStoreFormatCode)))
 			{
 			iMtpDeltaDataMgr->UpdateDeltaDataTableL(iBatched_SuidHashID.ColInt64(EObjectStorePOUID), CMtpDeltaDataMgr::EDeleted);
--- a/mtpfws/mtpfw/transports/transportapi/inc/mmtpconnectionmgr.h	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtpfws/mtpfw/transports/transportapi/inc/mmtpconnectionmgr.h	Fri Feb 19 23:40:44 2010 +0200
@@ -39,8 +39,13 @@
     Signals that an MTP transport layer connection has become unavailable.
     @param aTransportConnection Interface handle of the MTP transport layer 
     connection instance.
+    @return ETrue means MTP framework successfully cleanup ts env and can accept
+    another ConnectionOpendedL call. EFalse means there is a transaction alive currently,
+    ConnectionOpenedL must not be called until MMTPTransportConnection::TransactionCompleteL is called.
+    @see MMTPConnectionMgr::ConnectionOpenedL()
+    @see MMTPTransportConnection::TransactionCompleteL()
     */
-    virtual void ConnectionClosed(MMTPTransportConnection& aTransportConnection) = 0;
+    virtual TBool ConnectionClosed(MMTPTransportConnection& aTransportConnection) = 0;
     
     /**
     Signals that an MTP transport layer connection has become available.
@@ -56,4 +61,4 @@
     virtual TUid ClientSId()=0;
             
     };
-#endif // MMTPCONNECTIONMGR_H
\ No newline at end of file
+#endif // MMTPCONNECTIONMGR_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mtpfws/mtpintegrationtest/integration/mtpmodeselector/inc/CMAppGroupView.H	Fri Feb 19 23:40:44 2010 +0200
@@ -0,0 +1,48 @@
+// Copyright (c) 1997-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 
+ @test
+*/
+#if !defined(__CMAPPGroupVIEW_H__)
+#define __CMAPPGroupVIEW_H__
+
+#include "CMLSTVW.H"
+
+
+class CContactsManAppGroupView : public CContactsManListView
+	{
+public:
+	static CContactsManAppGroupView* NewL(CCoeControl& aContainer,CContactsAppModel& aModel);
+	TInt CurrentItemIndex();
+	TInt NumberOfItems();
+private:
+	CContactsManAppGroupView(CContactsAppModel& aModel,TContactsListViewPrefs* aPreferences);
+	void NewGroupL();
+// from CContactsManViewBase
+	virtual void HandleModelChangeL(TBool aCountChanged);
+	virtual TBool HandleCommandL(TInt aCommand);		
+	virtual TUid ViewUid() const;
+//from 	MCoeView
+	virtual void ViewActivatedL(const TVwsViewId& aPrevViewId, TUid aCustomMessageId, const TDesC8& aCustomMessage);
+	virtual void ViewDeactivated();
+// from CCoeControl
+	virtual TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType);
+	void ConstructL(CCoeControl& aContainer);
+	};
+
+#endif // __CMAPPGroupVIEW_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mtpfws/mtpintegrationtest/integration/mtpmodeselector/inc/CtransportInitiator.h	Fri Feb 19 23:40:44 2010 +0200
@@ -0,0 +1,53 @@
+// This material, including documentation and any related computer
+// programs, is protected by copyright controlled by Nokia. All
+// rights are reserved. Copying, including reproducing, storing
+// adapting or translating, any or all of this material requires the
+// prior written consent of Nokia. This material also contains
+// confidential information which may not be disclosed to others
+// without the prior written consent of Nokia.
+
+
+
+/**
+ @file CtransportInitiator.h
+*/
+ #ifndef __CTRANSPORTINITIATOR_H__
+ #define __CTRANSPORTINITIATOR_H__
+ #include <e32base.h>
+ #include <f32file.h>
+ #include <bautils.h> 
+ #include <mtp/mtpdataproviderapitypes.h>
+ 
+ 
+ _LIT(KCMTPTest, "c:\\mtptest\\");
+_LIT(KZMTPTest, "z:\\mtptest\\");
+/**
+ class CtransportInitiator
+ Descibes creation of subset drives 
+ Running and stopping the transport as wished by the user
+*/ 
+ class CtransportInitiator: public CBase
+	 {
+	 public :
+	      static CtransportInitiator* NewL();
+	      ~CtransportInitiator();
+	      
+	 private:
+	     void ConstructL();	 
+	     CtransportInitiator();
+	 
+	 public :
+	     void SetModeL(TMTPOperationalMode aMode);
+	     void RunMtpL();
+	     TInt DeleteMTPTestStorages();
+	     TInt CreateMTPTestStoragesL();    	
+	 };
+	 
+#endif	 
+
+	 
+ 
+ 
+ 
+ 
+ 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mtpfws/mtpintegrationtest/integration/mtpmodeselector/inc/MtpModeSelector.h	Fri Feb 19 23:40:44 2010 +0200
@@ -0,0 +1,122 @@
+// This material, including documentation and any related computer
+// programs, is protected by copyright controlled by Nokia. All
+// rights are reserved. Copying, including reproducing, storing
+// adapting or translating, any or all of this material requires the
+// prior written consent of Nokia. This material also contains
+// confidential information which may not be disclosed to others
+// without the prior written consent of Nokia.
+
+
+
+/**
+ @file
+ @internalComponent
+ @test
+*/
+#ifndef __MTPMODESELECTOR_H__
+#define __MTPMODESELECTOR_H__
+
+#include <eikdialg.h>
+#include <eikchlst.h>
+#include "CtransportInitiator.h"
+
+
+class CMtpModeSelectorDlg : public CEikDialog
+	{
+public:	
+	static CMtpModeSelectorDlg* NewL();
+	CMtpModeSelectorDlg();
+   
+private:
+    void ConstructL();
+	~CMtpModeSelectorDlg();
+	// from CEikDialog
+	TBool OkToExitL(TInt aButtonId);
+	void PreLayoutDynInitL();
+public :
+    CtransportInitiator* iTransportInitiator;	
+	
+	};
+	
+
+	
+/**
+ *	CModeSelectorAppView for creating a window and to draw the text
+ *	
+ */  
+class CModeSelectorAppView : public CCoeControl
+    {
+public:
+	// creates a CModeSelectorAppView object
+	static CModeSelectorAppView* NewL(const TRect& aRect);
+	~CModeSelectorAppView();
+private:
+	CModeSelectorAppView();
+	void ConstructL(const TRect& aRect);
+	//Draws the text on the screen	           
+	void Draw(const TRect& /*aRect*/) const;
+
+private:
+	//contains the text needs to be drawn
+	HBufC*  iExampleText;
+    };
+    
+    
+/**
+ *	CModeSelectorAppUi handles the system events and menu events
+ *	
+ */  
+class CModeSelectorAppUi : public CEikAppUi
+    {
+public:
+    void ConstructL();
+	~CModeSelectorAppUi();
+
+private:
+    // Inherirted from class CEikAppUi for handling menu events
+	void HandleCommandL(TInt aCommand);
+	
+	// From CCoeAppUi to handle system events
+	void HandleSystemEventL(const TWsEvent& aEvent);
+
+private:
+	CCoeControl* iAppView;
+	};
+
+
+/**
+ *	CExampleDocument for creating the application UI
+ *	
+ */  
+class CModeSelectorDocument : public CEikDocument
+	{
+public:
+	// creates a CExampleDocument object
+	static CModeSelectorDocument* NewL(CEikApplication& aApp);
+	CModeSelectorDocument(CEikApplication& aApp);
+	void ConstructL();
+private: 
+	// Inherited from CEikDocument for creating the AppUI
+	CEikAppUi* CreateAppUiL();
+	};
+	
+	
+	
+/**
+ *	CExampleApplication creates a new instance of the document 
+ *   associated with this application
+ *	
+ */  
+class CModeSelectorApplication : public CEikApplication
+	{
+private: 
+	// Inherited from class CApaApplication to create a new instance of the document
+	CApaDocument* CreateDocumentL();
+	//gets teh Application's UID
+	TUid AppDllUid() const;
+	};	 
+	
+#endif	   
+	
+
+	
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mtpfws/mtpintegrationtest/integration/mtpmodeselector/inc/mtpstarter.h	Fri Feb 19 23:40:44 2010 +0200
@@ -0,0 +1,18 @@
+// This material, including documentation and any related computer
+// programs, is protected by copyright controlled by Nokia. All
+// rights are reserved. Copying, including reproducing, storing
+// adapting or translating, any or all of this material requires the
+// prior written consent of Nokia. This material also contains
+// confidential information which may not be disclosed to others
+// without the prior written consent of Nokia.
+
+
+
+#ifndef __MTPSTARTER_H__
+#define __MTPSTARTER_H__
+
+
+TInt StartMTP();
+TInt StopMTP();
+
+#endif // MTPSTARTER_H
--- a/mtptransports/mtpptpiptransport/ptpipplugin/src/cptpipconnection.cpp	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtptransports/mtpptpiptransport/ptpipplugin/src/cptpipconnection.cpp	Fri Feb 19 23:40:44 2010 +0200
@@ -68,6 +68,11 @@
 	delete iPTPIPCommandContainer;
 	delete iPTPIPDataContainer;
 	delete iPTPIPEventContainer;
+
+        if (iProtocolLayer != NULL)
+           {
+           iProtocolLayer->Unbind(*this);
+           }
 	
 	iNullBuffer.Close();
 
--- a/mtptransports/mtpusbtransport/usbsic_imp/inc/cmtpusbconnection.h	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtptransports/mtpusbtransport/usbsic_imp/inc/cmtpusbconnection.h	Fri Feb 19 23:40:44 2010 +0200
@@ -150,7 +150,7 @@
     
     void ResumeConnectionL();
     void StartConnectionL();
-    void StopConnection();
+    TBool StopConnection();
     void SuspendConnectionL();
     
     void StartUsbL();
@@ -418,6 +418,12 @@
 	TBool 												iIsCancelReceived;
 	
     /**
+    A flag to reflect if a Host initiated cancel transaction
+    is triggered.
+    */
+    TBool                                               iIsResetRequestSignaled;
+	
+    /**
     FLOGGER debug trace member variable.
     */
     __FLOG_DECLARATION_MEMBER_MUTABLE;
--- a/mtptransports/mtpusbtransport/usbsic_imp/src/cmtpusbconnection.cpp	Tue Feb 02 01:11:40 2010 +0200
+++ b/mtptransports/mtpusbtransport/usbsic_imp/src/cmtpusbconnection.cpp	Fri Feb 19 23:40:44 2010 +0200
@@ -78,7 +78,7 @@
 CMTPUsbConnection::~CMTPUsbConnection()
     {
     __FLOG(_L8("~CMTPUsbConnection - Entry"));
-
+    
     // Terminate all endpoint data transfer activity.
     StopConnection();
         
@@ -91,11 +91,13 @@
     StopUsb();
     
     iNullBuffer.Close();
-    if (iProtocolLayer)
-	    {    	
-	    iProtocolLayer->Unbind(*this);
-	    }
 
+    if (iProtocolLayer != NULL)
+        {
+        BoundProtocolLayer().Unbind(*this);
+        }
+    iProtocolLayer = NULL;
+    
     __FLOG(_L8("~CMTPUsbConnection - Exit"));
     __FLOG_CLOSE;
     }
@@ -331,21 +333,27 @@
     __FLOG(_L8("TransactionCompleteL - Entry"));
    
    	__FLOG_VA((_L8("DeviceState: 0x%x TransactionState: 0x%x"), iDeviceStatusCode, iBulkTransactionState));
-    
-    if (iBulkTransactionState != ERequestPhase)
-    	{
-	    // Update the transaction state.
-    	SetBulkTransactionState(EIdlePhase);
-    	
-   		// Update the device status
-   		SetDeviceStatus(EMTPUsbDeviceStatusOK); 
-   		
-   		// Clear the cancel flag.
-   		iIsCancelReceived = EFalse; 
-   		
-   		// Initiate the next request phase bulk data receive sequence.
-   		InitiateBulkRequestSequenceL();
-    	}
+   	
+   	if (iBulkTransactionState != ERequestPhase)
+   	    {
+        // Update the transaction state.
+        SetBulkTransactionState(EIdlePhase);    
+        // Update the device status
+        SetDeviceStatus(EMTPUsbDeviceStatusOK);     
+        // Clear the cancel flag.
+        iIsCancelReceived = EFalse; 
+        
+        if (ConnectionOpen())
+            {
+            // Initiate the next request phase bulk data receive sequence.
+            InitiateBulkRequestSequenceL();   		    
+            }
+        else if (iIsResetRequestSignaled)
+            {
+            iIsResetRequestSignaled = EFalse;
+            StartConnectionL();
+            }
+   	    }
     
     __FLOG(_L8("TransactionCompleteL - Exit"));
     } 
@@ -587,8 +595,7 @@
         {
         TUint16 containerType(iUsbBulkContainer->Uint16L(CMTPUsbContainer::EContainerType));
 
-#ifdef _DEBUG        
-      
+#ifdef _DEBUG              
         TUint16 transactionID(iUsbBulkContainer->Uint32L(CMTPUsbContainer::ETransactionID));
         RDebug::Print(_L("Time Stamp is :%d"), User::TickCount());
         RDebug::Print(_L("the container Type is 0x%x, the transaction ID is 0x%x\n"), containerType,transactionID);
@@ -906,6 +913,8 @@
 CMTPUsbConnection::CMTPUsbConnection(MMTPConnectionMgr& aConnectionMgr) :
     CActive(EPriorityStandard),
     iEndpointInfo(KEndpointMetaData, EMTPUsbEpNumEndpoints),
+    iIsCancelReceived(EFalse),
+    iIsResetRequestSignaled(EFalse),
     iConnectionMgr(&aConnectionMgr)
     {
     CActiveScheduler::Add(this);
@@ -1233,7 +1242,7 @@
 void CMTPUsbConnection::ProcessControlRequestDeviceResetL(const TMTPUsbControlRequestSetup& /*aRequest*/)
     {
     __FLOG(_L8("ProcessControlRequestDeviceResetL - Entry"));
-                
+    
     // Clear stalled endpoints and re-open connection
     BulkEndpointsStallClearL();
     StartConnectionL();
@@ -1243,9 +1252,18 @@
     sequence and initiate the next control request sequence. 
     */
     static_cast<CMTPUsbEpControl*>(iEndpoints[EMTPUsbEpControl])->SendControlRequestStatus();
-    StopConnection();
+    TBool connIsStopped = StopConnection();
     InitiateControlRequestSequenceL();
-    StartConnectionL();
+    
+    if (connIsStopped)
+        {
+        StartConnectionL();
+        }
+    else
+        {
+        iIsResetRequestSignaled = ETrue;
+        }
+
     __FLOG(_L8("ProcessControlRequestDeviceResetL - Exit"));
     }
     
@@ -1261,8 +1279,7 @@
     
     TUint offset = 0;
     for(TUint i(EMTPUsbEpControl); i<EMTPUsbEpNumEndpoints; ++i)
-    	{
-        
+    	{        
         if ( IsEpStalled(i) )
             {
             TInt epSize(0);
@@ -1277,16 +1294,11 @@
             //but in practice, it's requested by host with a 32-bit value, so we plus offset with 4 to reflect this.
             TUint32 epAddress = epDesc[KEpAddressOffsetInEpDesc];
             iUsbControlRequestDeviceStatus.SetUint32((offset + TMTPUsbControlRequestDeviceStatus::EParameter1), epAddress);            
-            CleanupStack::PopAndDestroy(); // calls epDesc.Close()
-            
+            CleanupStack::PopAndDestroy(); // calls epDesc.Close()            
             ++offset;
             }
         }
-   
 
-  
-   
-    
     // if the current status is OK and a cancel event has been received but the device has not respond 
     // transaction_cancelled yet, return transaction_cancelled firstly.
     TUint16 originalStatus = iDeviceStatusCode;
@@ -1296,10 +1308,7 @@
     	  // clear the transaction cancelled flag
         isResponseTransactionCancelledNeeded = false;
     	}
-    
-    
 
-    
     // Set the Code and wLength fields and send the dataset.
     iUsbControlRequestDeviceStatus.SetUint16(TMTPUsbControlRequestDeviceStatus::ECode, iDeviceStatusCode);
     iUsbControlRequestDeviceStatus.SetUint16(TMTPUsbControlRequestDeviceStatus::EwLength, iUsbControlRequestDeviceStatus.Size());
@@ -1511,7 +1520,6 @@
     __FLOG(_L8("BulkEndpointsStallL - Entry"));
     EndpointStallL(EMTPUsbEpBulkIn);
     EndpointStallL(EMTPUsbEpBulkOut);
-    SetDeviceStatus(EMTPUsbDeviceStatusTransactionCancelled);
     __FLOG(_L8("BulkEndpointsStallL - Exit"));
     }
 
@@ -1523,7 +1531,6 @@
     __FLOG(_L8("BulkEndpointsStallClearL - Entry"));
     EndpointStallClearL(EMTPUsbEpBulkIn);
     EndpointStallClearL(EMTPUsbEpBulkOut);
-    SetDeviceStatus(EMTPUsbDeviceStatusOK);
     __FLOG(_L8("BulkEndpointsStallClearL - Exit"));  
     }
 
@@ -1582,14 +1589,9 @@
     CMTPUsbEpBase& ep(*iEndpoints[aId]);
     ep.Stall();
     
-    // Stop the connection.
-    StopConnection();
+    // Update the connection state.
+    SetConnectionState(EStalled);
     
-    // Update the connection state.
-    if (!(ConnectionState() & EStalled))
-        {
-        SetConnectionState(EStalled);
-        }
     __FLOG(_L8("EndpointStallL - Exit"));
     }
     
@@ -1617,7 +1619,7 @@
         else if (!IsEpStalled( aId ) )
             {
             // All data endpoint stall conditions are clear.
-          	SetConnectionState(EIdlePhase);
+          	SetConnectionState(EIdle);
             }
         }
     __FLOG(_L8("EndpointStallClearL - Exit"));
@@ -1651,8 +1653,9 @@
     if (ConnectionClosed())
         {
         __FLOG(_L8("Notifying protocol layer connection opened"));
-        iConnectionMgr->ConnectionOpenedL(*this);  
+        iConnectionMgr->ConnectionOpenedL(*this);
         SetConnectionState(EOpen);
+        SetDeviceStatus(EMTPUsbDeviceStatusOK);
         InitiateBulkRequestSequenceL();
         }
     __FLOG(_L8("StartConnectionL - Exit"));
@@ -1661,10 +1664,11 @@
 /**
 Halts USB MTP device class processing.
 */ 
-void CMTPUsbConnection::StopConnection()
+TBool CMTPUsbConnection::StopConnection()
     {
     __FLOG(_L8("StopConnection - Entry"));
     
+    TBool ret = ETrue;
     // Stop all data transfer activity.
     DataEndpointsStop();    
     
@@ -1672,13 +1676,16 @@
     if (ConnectionOpen())
         {
         __FLOG(_L8("Notifying protocol layer connection closed"));
-        iConnectionMgr->ConnectionClosed(*this);
+        ret = iConnectionMgr->ConnectionClosed(*this);
         SetBulkTransactionState(EUndefined);
         SetConnectionState(EIdle);
         SetSuspendState(ENotSuspended);
+        SetDeviceStatus(EMTPUsbDeviceStatusBusy);
         }
     
     __FLOG(_L8("StopConnection - Exit"));
+    
+    return ret;
     }
        
 /**
@@ -1706,7 +1713,7 @@
 */
 void CMTPUsbConnection::StartUsbL()
     {
-    __FLOG(_L8("StartUsbL - Exit"));
+    __FLOG(_L8("StartUsbL - Entry"));
     
     // Open the USB device interface.
     User::LeaveIfError(iLdd.Open(KDefaultUsbClientController));
--- a/obex/obexprotocol/obex/public/obexbase.h	Tue Feb 02 01:11:40 2010 +0200
+++ b/obex/obexprotocol/obex/public/obexbase.h	Fri Feb 19 23:40:44 2010 +0200
@@ -164,10 +164,17 @@
 	IMPORT_C TBool IsConnected() const;
 	IMPORT_C TBool IsStrictPeer() const;
 	IMPORT_C const TObexConnectInfo& LocalInfo() const;
-	IMPORT_C TInt SetLocalWho(const TDesC8& aInfo); 
-    IMPORT_C const TObexConnectInfo& RemoteInfo() const;
-   	IMPORT_C void SuppressAuthenticationHeaderElements(TObexSuppressedAuthElements aSuppressedObexAuthElements);
+	IMPORT_C TInt SetLocalWho(const TDesC8& aInfo);
+	IMPORT_C const TObexConnectInfo& RemoteInfo() const;
+	IMPORT_C void SuppressAuthenticationHeaderElements(TObexSuppressedAuthElements aSuppressedObexAuthElements);
 	
+public: // Implementation of MObexNotify Interface (No longer used)
+	virtual void Process(CObexPacket& aPacket);
+	virtual void Error(TInt aError);
+	virtual void TransportUp();
+	virtual void TransportDown(TBool aForceTransportDeletion);
+	
+public:
 	virtual void UserPasswordL( const TDesC& aPassword) = 0; 
 	IMPORT_C void RemoteAddr(TSockAddr& anAddr); 
 
@@ -181,12 +188,6 @@
 	void NotifyTransportUp();
 	void NotifyTransportDown(TBool);
 	
-public: // Implementation of MObexNotify Interface (No longer used)
-	virtual void Process(CObexPacket& aPacket);
-	virtual void Error(TInt aError) ;
-	virtual void TransportUp();
-	virtual void TransportDown(TBool aForceTransportDeletion);
-	
 protected:
 	CObex();
 	virtual void ConstructL(TObexTransportInfo& aObexTransportInfo);