mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectreferences.cpp
changeset 35 2ee890d2f7e7
parent 32 edd273b3192a
child 50 762d760dcfdf
--- 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 <mtp/cmtptypearray.h>
 #include <mtp/mmtpreferencemgr.h>
+#include <mtp/mmtpobjectmgr.h>
 #ifdef _DEBUG
-#include <mtp/mmtpobjectmgr.h>
 #include <mtp/tmtptypeuint128.h>
 #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