diff -r 000000000000 -r a2952bb97e68 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csetobjectreferences.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csetobjectreferences.cpp Thu Dec 17 08:55:47 2009 +0200 @@ -0,0 +1,217 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Implement the operation: SetObjectReferences +* +*/ + + +#include +#include +#include +#include + +#include "csetobjectreferences.h" +#include "tmmmtpdppanic.h" +#include "mmmtpdplogger.h" +#include "cmmmtpdpmetadataaccesswrapper.h" +#include "mmmtpdputility.h" +#include "mmmtpdpconfig.h" + +// ----------------------------------------------------------------------------- +// Verification data for the SetReferences request +// ----------------------------------------------------------------------------- +// +const TMTPRequestElementInfo KMTPSetObjectReferencesPolicy[] = + { + { + TMTPTypeRequest::ERequestParameter1, + EMTPElementTypeObjectHandle, + EMTPElementAttrNone, + 0, + 0, + 0 + } + }; + +// ----------------------------------------------------------------------------- +// CSetObjectReferences::NewL +// Two-phase construction method +// ----------------------------------------------------------------------------- +// +EXPORT_C MMmRequestProcessor* CSetObjectReferences::NewL( MMTPDataProviderFramework& aFramework, + MMTPConnection& aConnection, + MMmMtpDpConfig& aDpConfig ) + { + CSetObjectReferences* self = new ( ELeave ) CSetObjectReferences( aFramework, + aConnection, + aDpConfig ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CSetObjectReferences::ConstructL +// Two-phase construction method +// ----------------------------------------------------------------------------- +// +void CSetObjectReferences::ConstructL() + { + SetPSStatus(); + } + +// ----------------------------------------------------------------------------- +// CSetObjectReferences::~CSetObjectReferences +// Destructor +// ----------------------------------------------------------------------------- +// +EXPORT_C CSetObjectReferences::~CSetObjectReferences() + { + delete iReferences; + delete iReferenceSuids; + } + +// ----------------------------------------------------------------------------- +// CSetObjectReferences::CSetObjectReferences +// Standard c++ constructor +// ----------------------------------------------------------------------------- +// +EXPORT_C CSetObjectReferences::CSetObjectReferences( + MMTPDataProviderFramework& aFramework, + MMTPConnection& aConnection, + MMmMtpDpConfig& aDpConfig ) : + CRequestProcessor( + aFramework, + aConnection, + sizeof( KMTPSetObjectReferencesPolicy )/sizeof( TMTPRequestElementInfo ), + KMTPSetObjectReferencesPolicy ), + iDpConfig( aDpConfig ) + { + PRINT( _L( "Operation: SetObjectReferences(0x9811)" ) ); + } + +// ----------------------------------------------------------------------------- +// CSetObjectReferences::DoSetObjectReferencesL +// set references to DB +// ----------------------------------------------------------------------------- +// +EXPORT_C void CSetObjectReferences::DoSetObjectReferencesL( CMmMtpDpMetadataAccessWrapper& aWrapper, + TUint16 aObjectFormat, + const TDesC& aSrcFileName, + CDesCArray& aRefFileArray ) + { + // do nothing, do special thing by inheriting + } + +// ----------------------------------------------------------------------------- +// CSetObjectReferences::ServiceL +// SetReferences request handler +// start receiving reference data from the initiator +// ----------------------------------------------------------------------------- +// +EXPORT_C void CSetObjectReferences::ServiceL() + { + PRINT( _L( "MM MTP => CSetObjectReferences::ServiceL" ) ); + delete iReferences; + iReferences = NULL; + iReferences = CMTPTypeArray::NewL( EMTPTypeAUINT32 ); + ReceiveDataL( *iReferences ); + PRINT( _L( "MM MTP <= CSetObjectReferences::ServiceL" ) ); + } + +// ----------------------------------------------------------------------------- +// CSetObjectReferences::DoHandleResponsePhaseL +// Apply the references to the specified object +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CSetObjectReferences::DoHandleResponsePhaseL() + { + PRINT( _L("MM MTP => CSetObjectReferences::DoHandleResponsePhaseL" ) ); + + delete iReferenceSuids; + iReferenceSuids = NULL; + iReferenceSuids = new ( ELeave ) CDesCArrayFlat( 3 ); + + if ( !VerifyReferenceHandlesL() ) + { + SendResponseL( EMTPRespCodeInvalidObjectReference ); + } + else + { + MMTPReferenceMgr& referenceMgr = iFramework.ReferenceMgr(); + TUint32 objectHandle = Request().Uint32( TMTPTypeRequest::ERequestParameter1 ); + PRINT1( _L( "MM MTP <>CSetObjectReferences::DoHandleResponsePhaseL objectHandle = 0x%x" ), objectHandle ); + referenceMgr.SetReferencesL( TMTPTypeUint32( objectHandle ), + *iReferences ); + + CMTPObjectMetaData* object = CMTPObjectMetaData::NewLC(); // + object + iFramework.ObjectMgr().ObjectL( objectHandle, *object ); + PRINT1( _L( "MM MTP <> object file name is %S" ), &(object->DesC( CMTPObjectMetaData::ESuid ) ) ); + DoSetObjectReferencesL( iDpConfig.GetWrapperL(), + object->Uint( CMTPObjectMetaData::EFormatCode ), + object->DesC( CMTPObjectMetaData::ESuid ), + *iReferenceSuids ); + + CleanupStack::PopAndDestroy( object ); // - object + + SendResponseL( EMTPRespCodeOK ); + } + PRINT( _L("MM MTP <= CSetObjectReferences::DoHandleResponsePhaseL" ) ); + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CSetObjectReferences::VerifyReferenceHandlesL +// Verify if the references are valid handles to objects +// ----------------------------------------------------------------------------- +// +TBool CSetObjectReferences::VerifyReferenceHandlesL() const + { + PRINT( _L( "MM MTP => CSetObjectReferences::VerifyReferenceHandlesL" ) ); + __ASSERT_DEBUG( iReferences, Panic( EMmMTPDpReferencesNull ) ); + TBool result = ETrue; + TInt count = iReferences->NumElements(); + PRINT1( _L( "MM MTP <> CSetObjectReferences::VerifyReferenceHandlesL count = %d" ), count ); + CMTPObjectMetaData* object( CMTPObjectMetaData::NewLC() ); // + object + MMTPObjectMgr& objectMgr = iFramework.ObjectMgr(); + + for ( TInt i = 0; i < count; i++ ) + { + TMTPTypeUint32 handle; + iReferences->ElementL( i, handle ); + if ( !objectMgr.ObjectL( handle, *object ) ) + { + result = EFalse; + break; + } + + iReferenceSuids->AppendL( object->DesC( CMTPObjectMetaData::ESuid ) ); + } + CleanupStack::PopAndDestroy( object ); // - object + PRINT( _L( "MM MTP <= CSetObjectReferences::VerifyReferenceHandlesL" ) ); + return result; + } + +// ----------------------------------------------------------------------------- +// CSetObjectReferences::HasDataphase +// Derived from CRequestProcessor, can not be neglected +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CSetObjectReferences::HasDataphase() const + { + return ETrue; + } + +// end of file