mtpfws/mtpfw/dataproviders/devdp/src/cmtpgetobjecthandles.cpp
branchRCL_3
changeset 4 60a94a45d437
parent 3 8b094906a049
child 15 f85613f12947
--- a/mtpfws/mtpfw/dataproviders/devdp/src/cmtpgetobjecthandles.cpp	Mon Mar 15 12:43:12 2010 +0200
+++ b/mtpfws/mtpfw/dataproviders/devdp/src/cmtpgetobjecthandles.cpp	Wed Mar 31 22:58:56 2010 +0300
@@ -20,6 +20,7 @@
 #include <mtp/mtpdatatypeconstants.h>
 #include <mtp/mmtpstoragemgr.h>  
 
+#include "cmtpdataprovidercontroller.h"
 #include "cmtpdevicedatastore.h"
 #include "cmtpgetobjecthandles.h"
 #include "mtpdevicedpconst.h"
@@ -28,6 +29,8 @@
 // Class constants.
 __FLOG_STMT(_LIT8(KComponent,"GetObjectHandles");)
 
+static const TInt KMTPGetObjectHandlesTimeOut(1);
+
 /**
 Two-phase construction method
 @param aPlugin	The data provider plugin
@@ -77,6 +80,33 @@
 void CMTPGetObjectHandles::ServiceL()
 	{
     __FLOG(_L8("ServiceL - Entry"));
+    
+    if(iSingletons.DpController().EnumerateState() != CMTPDataProviderController::EEnumeratedFulllyCompleted)
+        {
+        TUint storageId = Request().Uint32(TMTPTypeRequest::ERequestParameter1);
+        TUint handle = Request().Uint32(TMTPTypeRequest::ERequestParameter3);
+        TUint enumerateState = iSingletons.DpController().StorageEnumerateState(storageId);
+        if ( (enumerateState < CMTPDataProviderController::EEnumeratingPhaseOneDone)
+            || (enumerateState != CMTPDataProviderController::EEnumeratedFulllyCompleted && handle != KMTPHandleAll))
+            {
+            if (iTimeoutCount++ >= KMTPGetObjectHandlesTimeOut)
+                {
+                __FLOG(_L8("Wait for enumeration time out, return busy."));
+                SendResponseL(EMTPRespCodeDeviceBusy);
+                iTimeoutCount = 0;
+                return;
+                }
+            else
+                {
+                __FLOG(_L8("Enumeration not completed, suspend request."));
+                RegisterPendingRequest(20);
+                return; 
+                }
+            }
+        }
+    
+    iTimeoutCount = 0;
+    
 	RMTPObjectMgrQueryContext   context;
 	RArray<TUint>               handles;
 	CleanupClosePushL(context);