diff -r edd273b3192a -r 2ee890d2f7e7 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectreferences.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectreferences.cpp Thu May 27 13:19:19 2010 +0300 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectreferences.cpp Fri Jun 11 14:04:53 2010 +0300 @@ -18,14 +18,26 @@ #include #include +#include #ifdef _DEBUG -#include #include #endif #include "cgetobjectreferences.h" #include "mmmtpdputility.h" #include "mmmtpdplogger.h" +#include "cmmmtpdpperflog.h" +#include "mmmtpdpconfig.h" +#include "cmmmtpdpmetadataaccesswrapper.h" +#include "tmmmtpdppanic.h" + +const TInt KMTPDriveGranularity = 5; + +#if defined(_DEBUG) || defined(MMMTPDP_PERFLOG) +_LIT( KMpxQueryAbstractMediaReference, "MpxQueryAbstractMediaReference" ); +_LIT( KReferenceManagerSetReference, "ReferenceManagerSetReference" ); +_LIT( KObjectManagerHandle, "ObjectManagerHandle" ); +#endif // ----------------------------------------------------------------------------- // Verification data for the GetReferences request @@ -50,10 +62,11 @@ // EXPORT_C MMmRequestProcessor* CGetObjectReferences::NewL( MMTPDataProviderFramework& aFramework, MMTPConnection& aConnection, - MMmMtpDpConfig& /*aDpConfig*/ ) + MMmMtpDpConfig& aDpConfig ) { CGetObjectReferences* self = new ( ELeave ) CGetObjectReferences( aFramework, - aConnection ); + aConnection, + aDpConfig ); CleanupStack::PushL( self ); self->ConstructL(); CleanupStack::Pop( self ); @@ -68,6 +81,9 @@ // void CGetObjectReferences::ConstructL() { +#if defined(_DEBUG) || defined(MMMTPDP_PERFLOG) + iPerfLog = CMmMtpDpPerfLog::NewL( _L( "CAbstractMediaMtpDataProviderEnumerator" ) ); +#endif } // ----------------------------------------------------------------------------- @@ -78,6 +94,10 @@ EXPORT_C CGetObjectReferences::~CGetObjectReferences() { delete iReferences; + +#if defined(_DEBUG) || defined(MMMTPDP_PERFLOG) + delete iPerfLog; +#endif // _DEBUG } // ----------------------------------------------------------------------------- @@ -86,11 +106,13 @@ // ----------------------------------------------------------------------------- // CGetObjectReferences::CGetObjectReferences( MMTPDataProviderFramework& aFramework, - MMTPConnection& aConnection ) : - CRequestProcessor( aFramework, - aConnection, - sizeof ( KMTPGetObjectReferencesPolicy ) / sizeof( TMTPRequestElementInfo ), - KMTPGetObjectReferencesPolicy ) + MMTPConnection& aConnection, + MMmMtpDpConfig& aDpConfig ) : + CRequestProcessor( aFramework, + aConnection, + sizeof ( KMTPGetObjectReferencesPolicy ) / sizeof( TMTPRequestElementInfo ), + KMTPGetObjectReferencesPolicy ), + iDpConfig( aDpConfig ) { PRINT( _L( "Operation: GetObjectReferences(0x9810)" ) ); } @@ -104,14 +126,44 @@ { PRINT( _L( "MM MTP => CGetObjectReferences::ServiceL" ) ); - MmMtpDpUtility::SetPSStatus(EMtpPSStatusActive); + MmMtpDpUtility::SetPSStatus( EMtpPSStatusActive ); TUint32 objectHandle = Request().Uint32( TMTPTypeRequest::ERequestParameter1 ); PRINT1( _L( "MM MTP <> CGetObjectReferences::ServiceL objectHandle = 0x%x" ), - objectHandle ); - MMTPReferenceMgr& referenceMgr = iFramework.ReferenceMgr(); + objectHandle ); + + CMTPObjectMetaData* parentObject = iRequestChecker->GetObjectInfo( objectHandle ); + __ASSERT_DEBUG( parentObject, Panic( EMmMTPDpObjectNull ) ); + + iFramework.ObjectMgr().ObjectL( objectHandle, *parentObject ); + TUint subFormatCode = parentObject->Uint( CMTPObjectMetaData::EFormatSubCode ); + PRINT1( _L( "MM MTP <> CGetObjectReferences::ServiceL subFormatCode = 0x%x" ), + subFormatCode ); + + if ( MmMtpDpUtility::HasReference( parentObject->Uint( CMTPObjectMetaData::EFormatCode ) ) + && ( subFormatCode == EMTPSubFormatCodeUnknown ) ) + { + CDesCArray* references = new ( ELeave ) CDesCArrayFlat( KMTPDriveGranularity ); + CleanupStack::PushL( references ); // + references + + PERFLOGSTART( KMpxQueryAbstractMediaReference ); + TRAP_IGNORE( iDpConfig.GetWrapperL().GetAllReferenceL( *parentObject, *references ) ); + PERFLOGSTOP( KMpxQueryAbstractMediaReference ); + + // insert references into reference db + TPtrC parentSuid( parentObject->DesC( CMTPObjectMetaData::ESuid ) ); + AddReferencesL( parentSuid, *references ); + + CleanupStack::PopAndDestroy( references ); // - references + + parentObject->SetUint( CMTPObjectMetaData::EFormatSubCode, EMTPSubFormatCodeUndefined ); // set it to something else + iFramework.ObjectMgr().ModifyObjectL( *parentObject ); + } + + delete iReferences; iReferences = NULL; + MMTPReferenceMgr& referenceMgr = iFramework.ReferenceMgr(); iReferences = referenceMgr.ReferencesLC( TMTPTypeUint32( objectHandle ) ); CleanupStack::Pop( iReferences ); SendDataL( *iReferences ); @@ -140,4 +192,44 @@ PRINT( _L( "MM MTP <= CGetObjectReferences::ServiceL" ) ); } +// ----------------------------------------------------------------------------- +// CGetObjectReferences::AddReferencesL +// GetObjectInfo request handler +// ----------------------------------------------------------------------------- +// +void CGetObjectReferences::AddReferencesL( const TDesC& aRefOwnerSuid, + CDesCArray& aReferences ) + { + TInt count = aReferences.Count(); + PRINT2( _L("MM MTP => CGetObjectReferences::AddReferencesL aRefOwnerSuid = %S, ref count = %d"), &aRefOwnerSuid, count ); + + // check if references are valid + TInt removeCount = 0; + for ( TInt i = 0; i < count; i++ ) + { + TInt index = i - removeCount; + TPtrC temp( aReferences[index] ); + PRINT2( _L( "MM MTP <> CGetObjectReferences::AddReferencesL ref[%d]'s name = %S" ), index, &temp ); + PERFLOGSTART( KObjectManagerHandle ); + TUint32 handle = iFramework.ObjectMgr().HandleL( temp ); + PERFLOGSTOP( KObjectManagerHandle ); + if ( handle == KMTPHandleNone ) // object doesn't exist + { + PRINT1( _L( "MM MTP <> CGetObjectReferences::AddReferencesL, [%S] doesn't existed in handle db, remove this from reference array" ), &temp ); + + // if handle is invalid, remove from reference array + aReferences.Delete( index, 1 ); + removeCount++; + } + } + + // add all references into references db + MMTPReferenceMgr& referenceMgr = iFramework.ReferenceMgr(); + PERFLOGSTART( KReferenceManagerSetReference ); + referenceMgr.SetReferencesL( aRefOwnerSuid, aReferences ); + PERFLOGSTOP( KReferenceManagerSetReference ); + + PRINT( _L( "MM MTP <= CGetObjectReferences::AddReferencesL" ) ); + } + // end of file