diff -r 000000000000 -r d0791faffa3f mtpfws/mtpfw/dataproviders/dputility/src/cmtpdeleteobject.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mtpfws/mtpfw/dataproviders/dputility/src/cmtpdeleteobject.cpp Tue Feb 02 01:11:40 2010 +0200 @@ -0,0 +1,260 @@ +// 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 +#include +#include +#include + +#include "cmtpdeleteobject.h" +#include "mtpdpconst.h" +#include "mtpdppanic.h" + + +// Class constants. +__FLOG_STMT(_LIT8(KComponent,"DeleteObject");) + +/** +Verification data for the DeleteObject request +*/ +const TMTPRequestElementInfo KMTPDeleteObjectPolicy[] = + { + {TMTPTypeRequest::ERequestParameter1, EMTPElementTypeObjectHandle, EMTPElementAttrWrite, 1, KMTPHandleAll, 0}, + }; + + +/** +Standard c++ constructor +*/ +CMTPDeleteObject::CMTPDeleteObject(MMTPDataProviderFramework& aFramework, MMTPConnection& aConnection) : + CMTPRequestProcessor(aFramework, aConnection, sizeof(KMTPDeleteObjectPolicy)/sizeof(TMTPRequestElementInfo), KMTPDeleteObjectPolicy) + { + __FLOG_OPEN(KMTPSubsystem, KComponent); + __FLOG(_L8("CMTPDeleteObject - Entry")); + __FLOG(_L8("CMTPDeleteObject - Exit")); + } + + +/** +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 +*/ +EXPORT_C MMTPRequestProcessor* CMTPDeleteObject::NewL(MMTPDataProviderFramework& aFramework, + MMTPConnection& aConnection) + { + CMTPDeleteObject* self = new (ELeave) CMTPDeleteObject(aFramework, aConnection); + return self; + } + +/** +Destructor +*/ +EXPORT_C CMTPDeleteObject::~CMTPDeleteObject() + { + __FLOG(_L8("~CMTPDeleteObject - Entry")); + __FLOG(_L8("~CMTPDeleteObject - Exit")); + __FLOG_CLOSE; + } + +/** +Verify the request +@return EMTPRespCodeOK if request is verified, otherwise one of the error response codes +*/ + + +TMTPResponseCode CMTPDeleteObject::CheckRequestL() + { + __FLOG(_L8("CheckRequestL - Entry")); + TMTPResponseCode result(EMTPRespCodeOK); + if (IsStoreReadOnlyL(Request().Uint32(TMTPTypeRequest::ERequestParameter1))) + { + result = EMTPRespCodeStoreReadOnly; + } + else + { + result = CMTPRequestProcessor::CheckRequestL(); + } + __FLOG(_L8("CheckRequestL - Exit")); + return result; + } + +void CMTPDeleteObject::DeleteFolderOrFileL(CMTPObjectMetaData* aMeta) + { + __ASSERT_DEBUG(aMeta, Panic(EMTPDpObjectNull)); + if (IsFolderObject(*aMeta)) + { + __FLOG( _L8("Delete the folder itself which is empty ") ); + DeleteFolderL(aMeta); + } + else + { + __FLOG(_L8("Going to delete a file.")); + DeleteFileL(aMeta); + } + ProcessFinalPhaseL(); + } + +void CMTPDeleteObject::DeleteFolderL(CMTPObjectMetaData* aMeta) + { + TParsePtrC fileNameParser(aMeta->DesC(CMTPObjectMetaData::ESuid)); + TInt err = KErrNone; + if ( fileNameParser.IsWild() ) + { + err = KErrBadName; + } + else + { + err = iFramework.Fs().RmDir(aMeta->DesC(CMTPObjectMetaData::ESuid)); + } + + if( KErrNone == err ) + { + iFramework.ObjectMgr().RemoveObjectL(aMeta->Uint(CMTPObjectMetaData::EHandle)); + iSuccessDeletion = ETrue; + } + + } + +void CMTPDeleteObject::DeleteFileL(CMTPObjectMetaData* aMeta) + { + TParsePtrC fileNameParser(aMeta->DesC(CMTPObjectMetaData::ESuid)); + TInt err = KErrNone; + if ( !fileNameParser.NamePresent() ) + { + err = KErrBadName; + } + else if ( fileNameParser.IsWild() ) + { + err = KErrBadName; + } + else + { + err = iFramework.Fs().Delete(aMeta->DesC(CMTPObjectMetaData::ESuid)); + } + + if( KErrNone == err ) + { + iFramework.ObjectMgr().RemoveObjectL(aMeta->Uint(CMTPObjectMetaData::EHandle)); + iSuccessDeletion = ETrue; + } + else if(KErrAccessDenied == err) + { + err = KErrBadHandle; + iObjectWritePotected = ETrue; + } + } + +/** +DeleteObject request handler +*/ +void CMTPDeleteObject::ServiceL() + { + __FLOG(_L8("ServiceL - Entry")); + const TUint32 KHandle(Request().Uint32(TMTPTypeRequest::ERequestParameter1)); + iObjectWritePotected = EFalse; + iSuccessDeletion = EFalse; + + CMTPObjectMetaData* meta = NULL; + meta = iRequestChecker->GetObjectInfo(KHandle); + __ASSERT_DEBUG(meta, Panic(EMTPDpObjectNull)); + __FLOG_VA((_L8("meta->Uint(CMTPObjectMetaData::EDataProviderId) is %d"), meta->Uint(CMTPObjectMetaData::EDataProviderId))); + __FLOG_VA((_L8("iFramework.DataProviderId() is %d"), iFramework.DataProviderId())); + + if ( meta != NULL && meta->Uint(CMTPObjectMetaData::EDataProviderId) == iFramework.DataProviderId()) + { + DeleteFolderOrFileL(meta); + } + else + { + SendResponseL(EMTPRespCodeInvalidObjectHandle); + } + + __FLOG(_L8("ServiceL - Exit")); + } + +/** +Signal to the initiator that the deletion operation has finished with or without error +*/ +void CMTPDeleteObject::ProcessFinalPhaseL() + { + __FLOG(_L8("ProcessFinalPhaseL - Entry")); + TMTPResponseCode rsp = EMTPRespCodeOK; + if ( iObjectWritePotected ) + { + rsp = EMTPRespCodeObjectWriteProtected; + } + else if ( !iSuccessDeletion ) + { + rsp = EMTPRespCodeAccessDenied; + } + SendResponseL(rsp); + __FLOG(_L8("ProcessFinalPhaseL - Exit")); + } + +/** +Indicates if the specified object is a generic folder association. +@param aObject The object meta-data. +@return ETrue if the specified object is a generic folder association, +otherwise EFalse. +*/ +TBool CMTPDeleteObject::IsFolderObject(const CMTPObjectMetaData& aObject) + { + return ((aObject.Uint(CMTPObjectMetaData::EFormatCode) == EMTPFormatCodeAssociation) && + (aObject.Uint(CMTPObjectMetaData::EFormatSubCode) == EMTPAssociationTypeGenericFolder)); + } + +/** +Check whether the store on which the object resides is read only. +@return ETrue if the store is read only, EFalse if read-write +*/ +TBool CMTPDeleteObject::IsStoreReadOnlyL(TUint32 aObjectHandle) + { + __FLOG(_L8("IsStoreReadOnlyL - Entry")); + TBool result(EFalse); + CMTPObjectMetaData *info(CMTPObjectMetaData::NewLC()); + if (iFramework.ObjectMgr().ObjectL(aObjectHandle, *info)) + { + TInt drive(iFramework.StorageMgr().DriveNumber(info->Uint(CMTPObjectMetaData::EStorageId))); + User::LeaveIfError(drive); + TVolumeInfo volumeInfo; + User::LeaveIfError(iFramework.Fs().Volume(volumeInfo, drive)); + if (volumeInfo.iDrive.iMediaAtt == KMediaAttWriteProtected) + { + result = ETrue; + } + } + CleanupStack::PopAndDestroy(info); + __FLOG(_L8("IsStoreReadOnlyL - Exit")); + return result; + } + + + + + + + + + + + +