diff -r 8b094906a049 -r 60a94a45d437 mtpfws/mtpfw/dataproviders/devdp/src/cmtpgetobjecthandles.cpp --- 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 #include +#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 handles; CleanupClosePushL(context);