diff -r 000000000000 -r d0791faffa3f mtpfws/mtpfw/dataproviders/proxydp/src/cmtpsendobjectinfo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mtpfws/mtpfw/dataproviders/proxydp/src/cmtpsendobjectinfo.cpp Tue Feb 02 01:11:40 2010 +0200 @@ -0,0 +1,262 @@ +// Copyright (c) 2006-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: +// + +#include +#include +#include +#include + +#include "rmtpframework.h" +#include "cmtpdataprovidercontroller.h" +#include "cmtpparserrouter.h" +#include "cmtpdataprovider.h" +#include "cmtpsendobjectinfo.h" +#include "mtpproxydppanic.h" +#include "cmtpproxydpconfigmgr.h" +#include "cmtpstoragemgr.h" + +__FLOG_STMT( _LIT8( KComponent,"PrxySendObjectInfo" ); ) + +/** +Verification data for the SendObjectInfo request +*/ +const TMTPRequestElementInfo KMTPSendObjectInfoPolicy[] = + { + {TMTPTypeRequest::ERequestParameter1, EMTPElementTypeStorageId, EMTPElementAttrWrite, 1, 0, 0}, + {TMTPTypeRequest::ERequestParameter2, EMTPElementTypeObjectHandle, EMTPElementAttrDir | EMTPElementAttrWrite, 2, KMTPHandleAll, KMTPHandleNone} + }; + +/** +Two-phase construction method +@param aFramework The data provider framework +@param aConnection The connection from which the request comes +@return a pointer to the created request processor object +*/ +MMTPRequestProcessor* CMTPSendObjectInfo::NewL(MMTPDataProviderFramework& aFramework, MMTPConnection& aConnection) + { + CMTPSendObjectInfo* self = new (ELeave) CMTPSendObjectInfo(aFramework, aConnection); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +/** +Destructor +*/ +CMTPSendObjectInfo::~CMTPSendObjectInfo() + { + __FLOG(_L8("~CMTPSendObjectInfo - Entry")); + + delete iObjectInfo; + iSingletons.Close(); + iProxyDpSingletons.Close(); + + __FLOG(_L8("~CMTPSendObjectInfo - Exit")); + __FLOG_CLOSE; + } + +/** +Standard c++ constructor +*/ +CMTPSendObjectInfo::CMTPSendObjectInfo(MMTPDataProviderFramework& aFramework, MMTPConnection& aConnection) : + CMTPRequestProcessor(aFramework, aConnection, sizeof(KMTPSendObjectInfoPolicy)/sizeof(TMTPRequestElementInfo), KMTPSendObjectInfoPolicy) + { + + } + +/** +Second phase constructor. +*/ +void CMTPSendObjectInfo::ConstructL() + { + __FLOG_OPEN(KMTPSubsystem, KComponent); + __FLOG(_L8("ConstructL - Entry")); + + iSingletons.OpenL(); + + __FLOG(_L8("ConstructL - Exit")); + } + +/** +SendObjectInfo/SendObject request handler +NOTE: SendObjectInfo has to be comes before SendObject requests. To maintain the state information +between the two requests, the two requests are combined together in one signal processor. +*/ +void CMTPSendObjectInfo::ServiceL() + { + delete iObjectInfo; + iObjectInfo = NULL; + iObjectInfo = CMTPTypeObjectInfo::NewL(); + ReceiveDataL(*iObjectInfo); + } + +/** +Override to handle the response phase of SendObjectInfo requests +@return EFalse +*/ +TBool CMTPSendObjectInfo::DoHandleResponsePhaseL() + { + DoHandleSendObjectInfoCompleteL(); + return EFalse; + } + +TBool CMTPSendObjectInfo::HasDataphase() const + { + return ETrue; + } + +/** +Handling the completing phase of SendObjectInfo request +@return ETrue if the specified object can be saved on the specified location, otherwise, EFalse +*/ +void CMTPSendObjectInfo::DoHandleSendObjectInfoCompleteL() + { + __FLOG(_L8("DoHandleSendObjectInfoCompleteL - Entry")); + + CMTPParserRouter::TRoutingParameters params(*iRequest, iConnection); + iSingletons.Router().ParseOperationRequestL(params); + TBool fileFlag=EFalse; + RArray targets; + CleanupClosePushL(targets); + params.SetParam(CMTPParserRouter::TRoutingParameters::EParamFormatCode, iObjectInfo->Uint16L(CMTPTypeObjectInfo::EObjectFormat)); + + iProxyDpSingletons.OpenL(iFramework); + TInt index(KErrNotFound); + const TUint16 formatCode=iObjectInfo->Uint16L(CMTPTypeObjectInfo::EObjectFormat); + __FLOG_1( _L8("formatCode = %d"), formatCode ); + switch(formatCode) + { + case EMTPFormatCodeAssociation: + params.SetParam(CMTPParserRouter::TRoutingParameters::EParamFormatSubCode, iObjectInfo->Uint16L(CMTPTypeObjectInfo::EAssociationType)); + break; + + case EMTPFormatCodeScript: + { + __FLOG_1( _L8("formatCode = %d"), EMTPFormatCodeScript ); + const TDesC& filename = iObjectInfo->StringCharsL(CMTPTypeObjectInfo::EFilename); + HBufC* lowFileName = HBufC::NewLC(filename.Length()); + TPtr16 prt(lowFileName->Des()); + prt.Append(filename); + prt.LowerCase(); + __FLOG_1( _L8("lowFileName = %s"), &prt ); + if (iProxyDpSingletons.FrameworkConfig().GetFileName(prt,index) ) + { + fileFlag=ETrue; + } + CleanupStack::PopAndDestroy(lowFileName); + + params.SetParam(CMTPParserRouter::TRoutingParameters::EParamFormatSubCode, EMTPAssociationTypeUndefined); + break; + } + default: + params.SetParam(CMTPParserRouter::TRoutingParameters::EParamFormatSubCode, EMTPAssociationTypeUndefined); + break; + } + + __FLOG_1( _L8("fileFlag = %d"), fileFlag ); + if(fileFlag) + { + TInt syncdpid = iSingletons.DpController().DpId(iProxyDpSingletons.FrameworkConfig().GetDPId(index)); + iSingletons.DpController().DataProviderL(syncdpid).ExecuteProxyRequestL(Request(), Connection(), *this); + } + else + { + iSingletons.Router().RouteOperationRequestL(params, targets); + CMTPStorageMgr& storages(iSingletons.StorageMgr()); + const TUint KStorageId = Request().Uint32(TMTPTypeResponse::EResponseParameter1); + __FLOG_1( _L8("KStorageId = %d"), KStorageId ); + __FLOG_1( _L8("targets.Count() = %d"), targets.Count() ); + if( KMTPNotSpecified32 == KStorageId) + { + iSingletons.DpController().DataProviderL(targets[0]).ExecuteProxyRequestL(Request(), Connection(), *this); + } + else if( storages.ValidStorageId(KStorageId) ) + { + if(targets.Count() == 1) + { + __FLOG_1( _L8("targets[0] = %d"), targets[0] ); + iSingletons.DpController().DataProviderL(targets[0]).ExecuteProxyRequestL(Request(), Connection(), *this); + } + else + { + TInt dpID(KErrNotFound); + if (storages.LogicalStorageId(KStorageId)) + { + dpID = storages.LogicalStorageOwner(KStorageId); + } + else + { + dpID = storages.PhysicalStorageOwner(KStorageId); + } + __FLOG_1( _L8("dpID = %d"), dpID ); + if( targets.Find( dpID ) == KErrNotFound ) + { + __FLOG(_L8("No target dp is found, so send one GeneralError response.")); + SendResponseL( EMTPRespCodeGeneralError ); + } + else + { + iSingletons.DpController().DataProviderL(dpID).ExecuteProxyRequestL(Request(), Connection(), *this); + } + } + } + else + { + __FLOG(_L8("StorageID is invalid.")); + SendResponseL( EMTPRespCodeInvalidStorageID ); + } + } + CleanupStack::PopAndDestroy(&targets); + + __FLOG(_L8("DoHandleSendObjectInfoCompleteL - Exit")); + } + +#ifdef _DEBUG +void CMTPSendObjectInfo::ProxyReceiveDataL(MMTPType& aData, const TMTPTypeRequest& aRequest, MMTPConnection& aConnection, TRequestStatus& aStatus) +#else +void CMTPSendObjectInfo::ProxyReceiveDataL(MMTPType& aData, const TMTPTypeRequest& /*aRequest*/, MMTPConnection& /*aConnection*/, TRequestStatus& aStatus) +#endif + { + __ASSERT_DEBUG(iRequest == &aRequest && &iConnection == &aConnection, Panic(EMTPNotSameRequestProxy)); + MMTPType::CopyL(*iObjectInfo, aData); + TRequestStatus* status = &aStatus; + User::RequestComplete(status, KErrNone); + } + +void CMTPSendObjectInfo::ProxySendDataL(const MMTPType& /*aData*/, const TMTPTypeRequest& /*aRequest*/, MMTPConnection& /*aConnection*/, TRequestStatus& /*aStatus*/) + { + Panic(EMTPWrongRequestPhase); + } + +#ifdef _DEBUG +void CMTPSendObjectInfo::ProxySendResponseL(const TMTPTypeResponse& aResponse, const TMTPTypeRequest& aRequest, MMTPConnection& aConnection, TRequestStatus& aStatus) +#else +void CMTPSendObjectInfo::ProxySendResponseL(const TMTPTypeResponse& aResponse, const TMTPTypeRequest& /*aRequest*/, MMTPConnection& /*aConnection*/, TRequestStatus& aStatus) +#endif + { + __ASSERT_DEBUG(iRequest == &aRequest && &iConnection == &aConnection, Panic(EMTPNotSameRequestProxy)); + MMTPType::CopyL(aResponse, iResponse); + TRequestStatus* status = &aStatus; + User::RequestComplete(status, KErrNone); + } + +void CMTPSendObjectInfo::ProxyTransactionCompleteL(const TMTPTypeRequest& aRequest, MMTPConnection& aConnection) + { + __ASSERT_DEBUG(iRequest == &aRequest && &iConnection == &aConnection, Panic(EMTPNotSameRequestProxy)); + iFramework.SendResponseL(iResponse, aRequest, aConnection); + } + +