mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectreferences.cpp
branchRCL_3
changeset 34 e257e2b6459d
parent 30 6f9f6e99a23e
child 50 762d760dcfdf
equal deleted inserted replaced
30:6f9f6e99a23e 34:e257e2b6459d
    16 */
    16 */
    17 
    17 
    18 
    18 
    19 #include <mtp/cmtptypearray.h>
    19 #include <mtp/cmtptypearray.h>
    20 #include <mtp/mmtpreferencemgr.h>
    20 #include <mtp/mmtpreferencemgr.h>
       
    21 #include <mtp/mmtpobjectmgr.h>
    21 #ifdef _DEBUG
    22 #ifdef _DEBUG
    22 #include <mtp/mmtpobjectmgr.h>
       
    23 #include <mtp/tmtptypeuint128.h>
    23 #include <mtp/tmtptypeuint128.h>
    24 #endif
    24 #endif
    25 
    25 
    26 #include "cgetobjectreferences.h"
    26 #include "cgetobjectreferences.h"
    27 #include "mmmtpdputility.h"
    27 #include "mmmtpdputility.h"
    28 #include "mmmtpdplogger.h"
    28 #include "mmmtpdplogger.h"
       
    29 #include "cmmmtpdpperflog.h"
       
    30 #include "mmmtpdpconfig.h"
       
    31 #include "cmmmtpdpmetadataaccesswrapper.h"
       
    32 #include "tmmmtpdppanic.h"
       
    33 
       
    34 const TInt KMTPDriveGranularity = 5;
       
    35 
       
    36 #if defined(_DEBUG) || defined(MMMTPDP_PERFLOG)
       
    37 _LIT( KMpxQueryAbstractMediaReference, "MpxQueryAbstractMediaReference" );
       
    38 _LIT( KReferenceManagerSetReference, "ReferenceManagerSetReference" );
       
    39 _LIT( KObjectManagerHandle, "ObjectManagerHandle" );
       
    40 #endif
    29 
    41 
    30 // -----------------------------------------------------------------------------
    42 // -----------------------------------------------------------------------------
    31 // Verification data for the GetReferences request
    43 // Verification data for the GetReferences request
    32 // -----------------------------------------------------------------------------
    44 // -----------------------------------------------------------------------------
    33 //
    45 //
    48 // Two-phase construction method
    60 // Two-phase construction method
    49 // -----------------------------------------------------------------------------
    61 // -----------------------------------------------------------------------------
    50 //
    62 //
    51 EXPORT_C MMmRequestProcessor* CGetObjectReferences::NewL( MMTPDataProviderFramework& aFramework,
    63 EXPORT_C MMmRequestProcessor* CGetObjectReferences::NewL( MMTPDataProviderFramework& aFramework,
    52     MMTPConnection& aConnection,
    64     MMTPConnection& aConnection,
    53     MMmMtpDpConfig& /*aDpConfig*/ )
    65     MMmMtpDpConfig& aDpConfig )
    54     {
    66     {
    55     CGetObjectReferences* self = new ( ELeave ) CGetObjectReferences( aFramework,
    67     CGetObjectReferences* self = new ( ELeave ) CGetObjectReferences( aFramework,
    56         aConnection );
    68         aConnection,
       
    69         aDpConfig );
    57     CleanupStack::PushL( self );
    70     CleanupStack::PushL( self );
    58     self->ConstructL();
    71     self->ConstructL();
    59     CleanupStack::Pop( self );
    72     CleanupStack::Pop( self );
    60 
    73 
    61     return self;
    74     return self;
    66 // Two-phase construction method
    79 // Two-phase construction method
    67 // -----------------------------------------------------------------------------
    80 // -----------------------------------------------------------------------------
    68 //
    81 //
    69 void CGetObjectReferences::ConstructL()
    82 void CGetObjectReferences::ConstructL()
    70     {
    83     {
       
    84 #if defined(_DEBUG) || defined(MMMTPDP_PERFLOG)
       
    85     iPerfLog = CMmMtpDpPerfLog::NewL( _L( "CAbstractMediaMtpDataProviderEnumerator" ) );
       
    86 #endif
    71     }
    87     }
    72 
    88 
    73 // -----------------------------------------------------------------------------
    89 // -----------------------------------------------------------------------------
    74 // CGetObjectReferences::~CGetObjectReferences
    90 // CGetObjectReferences::~CGetObjectReferences
    75 // Destructor
    91 // Destructor
    76 // -----------------------------------------------------------------------------
    92 // -----------------------------------------------------------------------------
    77 //
    93 //
    78 EXPORT_C CGetObjectReferences::~CGetObjectReferences()
    94 EXPORT_C CGetObjectReferences::~CGetObjectReferences()
    79     {
    95     {
    80     delete iReferences;
    96     delete iReferences;
       
    97 
       
    98 #if defined(_DEBUG) || defined(MMMTPDP_PERFLOG)
       
    99     delete iPerfLog;
       
   100 #endif // _DEBUG
    81     }
   101     }
    82 
   102 
    83 // -----------------------------------------------------------------------------
   103 // -----------------------------------------------------------------------------
    84 // CGetObjectReferences::CGetObjectReferences
   104 // CGetObjectReferences::CGetObjectReferences
    85 // Standard c++ constructor
   105 // Standard c++ constructor
    86 // -----------------------------------------------------------------------------
   106 // -----------------------------------------------------------------------------
    87 //
   107 //
    88 CGetObjectReferences::CGetObjectReferences( MMTPDataProviderFramework& aFramework,
   108 CGetObjectReferences::CGetObjectReferences( MMTPDataProviderFramework& aFramework,
    89     MMTPConnection& aConnection ) :
   109     MMTPConnection& aConnection,
    90     CRequestProcessor( aFramework,
   110     MMmMtpDpConfig& aDpConfig ) :
    91         aConnection,
   111         CRequestProcessor( aFramework,
    92         sizeof ( KMTPGetObjectReferencesPolicy ) / sizeof( TMTPRequestElementInfo ),
   112             aConnection,
    93         KMTPGetObjectReferencesPolicy )
   113             sizeof ( KMTPGetObjectReferencesPolicy ) / sizeof( TMTPRequestElementInfo ),
       
   114             KMTPGetObjectReferencesPolicy ),
       
   115         iDpConfig( aDpConfig )
    94     {
   116     {
    95     PRINT( _L( "Operation: GetObjectReferences(0x9810)" ) );
   117     PRINT( _L( "Operation: GetObjectReferences(0x9810)" ) );
    96     }
   118     }
    97 
   119 
    98 // -----------------------------------------------------------------------------
   120 // -----------------------------------------------------------------------------
   102 //
   124 //
   103 void CGetObjectReferences::ServiceL()
   125 void CGetObjectReferences::ServiceL()
   104     {
   126     {
   105     PRINT( _L( "MM MTP => CGetObjectReferences::ServiceL" ) );
   127     PRINT( _L( "MM MTP => CGetObjectReferences::ServiceL" ) );
   106     
   128     
   107     MmMtpDpUtility::SetPSStatus(EMtpPSStatusActive);
   129     MmMtpDpUtility::SetPSStatus( EMtpPSStatusActive );
   108 
   130 
   109     TUint32 objectHandle = Request().Uint32( TMTPTypeRequest::ERequestParameter1 );
   131     TUint32 objectHandle = Request().Uint32( TMTPTypeRequest::ERequestParameter1 );
   110     PRINT1( _L( "MM MTP <> CGetObjectReferences::ServiceL objectHandle = 0x%x" ),
   132     PRINT1( _L( "MM MTP <> CGetObjectReferences::ServiceL objectHandle = 0x%x" ),
   111             objectHandle );
   133         objectHandle );
   112     MMTPReferenceMgr& referenceMgr = iFramework.ReferenceMgr();
   134 
       
   135     CMTPObjectMetaData* parentObject = iRequestChecker->GetObjectInfo( objectHandle );
       
   136     __ASSERT_DEBUG( parentObject, Panic( EMmMTPDpObjectNull ) );
       
   137 
       
   138     iFramework.ObjectMgr().ObjectL( objectHandle, *parentObject );
       
   139     TUint subFormatCode = parentObject->Uint( CMTPObjectMetaData::EFormatSubCode );
       
   140     PRINT1( _L( "MM MTP <> CGetObjectReferences::ServiceL subFormatCode = 0x%x" ),
       
   141         subFormatCode );
       
   142     
       
   143     if ( MmMtpDpUtility::HasReference( parentObject->Uint( CMTPObjectMetaData::EFormatCode ) )
       
   144         && ( subFormatCode == EMTPSubFormatCodeUnknown ) )
       
   145         {
       
   146         CDesCArray* references = new ( ELeave ) CDesCArrayFlat( KMTPDriveGranularity );
       
   147         CleanupStack::PushL( references ); // + references
       
   148 
       
   149         PERFLOGSTART( KMpxQueryAbstractMediaReference );
       
   150         TRAP_IGNORE( iDpConfig.GetWrapperL().GetAllReferenceL( *parentObject, *references ) );
       
   151         PERFLOGSTOP( KMpxQueryAbstractMediaReference );
       
   152 
       
   153         // insert references into reference db
       
   154         TPtrC parentSuid( parentObject->DesC( CMTPObjectMetaData::ESuid ) );
       
   155         AddReferencesL( parentSuid, *references );
       
   156         
       
   157         CleanupStack::PopAndDestroy( references );  // - references
       
   158 
       
   159         parentObject->SetUint( CMTPObjectMetaData::EFormatSubCode, EMTPSubFormatCodeUndefined );    // set it to something else
       
   160         iFramework.ObjectMgr().ModifyObjectL( *parentObject );
       
   161         }
       
   162 
       
   163 
   113     delete iReferences;
   164     delete iReferences;
   114     iReferences = NULL;
   165     iReferences = NULL;
       
   166     MMTPReferenceMgr& referenceMgr = iFramework.ReferenceMgr();
   115     iReferences = referenceMgr.ReferencesLC( TMTPTypeUint32( objectHandle ) );
   167     iReferences = referenceMgr.ReferencesLC( TMTPTypeUint32( objectHandle ) );
   116     CleanupStack::Pop( iReferences );
   168     CleanupStack::Pop( iReferences );
   117     SendDataL( *iReferences );
   169     SendDataL( *iReferences );
   118 
   170 
   119 #if _DEBUG
   171 #if _DEBUG
   138 #endif
   190 #endif
   139 
   191 
   140     PRINT( _L( "MM MTP <= CGetObjectReferences::ServiceL" ) );
   192     PRINT( _L( "MM MTP <= CGetObjectReferences::ServiceL" ) );
   141     }
   193     }
   142 
   194 
       
   195 // -----------------------------------------------------------------------------
       
   196 // CGetObjectReferences::AddReferencesL
       
   197 // GetObjectInfo request handler
       
   198 // -----------------------------------------------------------------------------
       
   199 //
       
   200 void CGetObjectReferences::AddReferencesL( const TDesC& aRefOwnerSuid,
       
   201     CDesCArray& aReferences )
       
   202     {
       
   203     TInt count = aReferences.Count();
       
   204     PRINT2( _L("MM MTP => CGetObjectReferences::AddReferencesL aRefOwnerSuid = %S, ref count = %d"), &aRefOwnerSuid, count );
       
   205 
       
   206     // check if references are valid
       
   207     TInt removeCount = 0;
       
   208     for ( TInt i = 0; i < count; i++ )
       
   209         {
       
   210         TInt index = i - removeCount;
       
   211         TPtrC temp( aReferences[index] );
       
   212         PRINT2( _L( "MM MTP <> CGetObjectReferences::AddReferencesL ref[%d]'s name = %S" ), index, &temp );
       
   213         PERFLOGSTART( KObjectManagerHandle );
       
   214         TUint32 handle = iFramework.ObjectMgr().HandleL( temp );
       
   215         PERFLOGSTOP( KObjectManagerHandle );
       
   216         if ( handle == KMTPHandleNone ) // object doesn't exist
       
   217             {
       
   218             PRINT1( _L( "MM MTP <> CGetObjectReferences::AddReferencesL, [%S] doesn't existed in handle db, remove this from reference array" ), &temp );
       
   219 
       
   220             // if handle is invalid, remove from reference array
       
   221             aReferences.Delete( index, 1 );
       
   222             removeCount++;
       
   223             }
       
   224         }
       
   225 
       
   226     // add all references into references db
       
   227     MMTPReferenceMgr& referenceMgr = iFramework.ReferenceMgr();
       
   228     PERFLOGSTART( KReferenceManagerSetReference );
       
   229     referenceMgr.SetReferencesL( aRefOwnerSuid, aReferences );
       
   230     PERFLOGSTOP( KReferenceManagerSetReference );
       
   231 
       
   232     PRINT( _L( "MM MTP <= CGetObjectReferences::AddReferencesL" ) );
       
   233     }
       
   234 
   143 // end of file
   235 // end of file