--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mtpfws/mtpfw/dataproviders/dputility/src/cmtpsvcdeleteobject.cpp Tue Feb 02 01:11:40 2010 +0200
@@ -0,0 +1,267 @@
+// Copyright (c) 2008-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:
+// mw/remoteconn/mtpfws/mtpfw/dataproviders/dputility/src/cmtpsvcdeleteobject.cpp
+
+#include <mtp/mmtpdataproviderframework.h>
+#include <mtp/cmtpobjectmetadata.h>
+#include <mtp/mmtpobjectmgr.h>
+
+#include "cmtpsvcdeleteobject.h"
+#include "mtpdpconst.h"
+#include "mmtpservicedataprovider.h"
+#include "mmtpsvcobjecthandler.h"
+
+// Class constants.
+__FLOG_STMT(_LIT8(KComponent,"SvcDeleteObject");)
+
+EXPORT_C MMTPRequestProcessor* CMTPSvcDeleteObject::NewL(MMTPDataProviderFramework& aFramework,
+ MMTPConnection& aConnection,
+ MMTPServiceDataProvider& aDataProvider)
+ {
+ CMTPSvcDeleteObject* self = new (ELeave) CMTPSvcDeleteObject(aFramework, aConnection, aDataProvider);
+ return self;
+ }
+
+EXPORT_C CMTPSvcDeleteObject::~CMTPSvcDeleteObject()
+ {
+ __FLOG(_L8("~CMTPSvcDeleteObject - Entry"));
+ iObjectHandles.Close();
+ delete iReceivedObjectMetaData;
+ __FLOG(_L8("~CMTPSvcDeleteObject - Exit"));
+ __FLOG_CLOSE;
+ }
+
+CMTPSvcDeleteObject::CMTPSvcDeleteObject(MMTPDataProviderFramework& aFramework, MMTPConnection& aConnection, MMTPServiceDataProvider& aDataProvider) :
+ CMTPRequestProcessor(aFramework, aConnection, 0, NULL), iDataProvider(aDataProvider), iDeleteError(KErrNone)
+ {
+ __FLOG_OPEN(KMTPSubsystem, KComponent);
+ __FLOG(_L8("CMTPSvcDeleteObject - Constructed"));
+ }
+
+/**
+DeleteObject request handler
+*/
+void CMTPSvcDeleteObject::LoadAllObjHandlesL(TUint32 aParentHandle)
+ {
+ __FLOG(_L8("LoadAllObjHandlesL - Entry"));
+ const TUint32 KFormatCode = Request().Uint32(TMTPTypeRequest::ERequestParameter2);
+ RMTPObjectMgrQueryContext context;
+ CleanupClosePushL(context);
+
+ do
+ { // Append all object handles with service dp's storage id.
+ TUint32 storageId = iDataProvider.StorageId();
+ TMTPObjectMgrQueryParams params(storageId, KFormatCode, aParentHandle);
+ iFramework.ObjectMgr().GetObjectHandlesL(params, context, iObjectHandles);
+ }
+ while (!context.QueryComplete());
+ CleanupStack::PopAndDestroy(&context);
+ __FLOG(_L8("LoadAllObjHandlesL - Exit"));
+ }
+
+void CMTPSvcDeleteObject::ServiceL()
+ {
+ __FLOG(_L8("ServiceL - Entry"));
+ if (iFormatCode == EMTPFormatCodeAssociation)
+ {
+ // Framework may send deleteobject for a directory, allow framework do this.
+ SendResponseL(EMTPRespCodeOK);
+ return;
+ }
+
+ const TUint32 KHandle = Request().Uint32(TMTPTypeRequest::ERequestParameter1);
+
+ if (KHandle == KMTPHandleAll)
+ {
+ LoadAllObjHandlesL(KMTPHandleNoParent);
+ iDeleteIndex = 0;
+ iSuccessDeletion = EFalse;
+ CompleteSelf(KErrNone);
+ }
+ else
+ {
+ TMTPResponseCode responseCode = iObjectHandler->DeleteObjectL(*iReceivedObjectMetaData);
+ // Remove from framework.
+ iFramework.ObjectMgr().RemoveObjectL(iReceivedObjectMetaData->DesC(CMTPObjectMetaData::ESuid));
+ SendResponseL(responseCode);
+ __FLOG_VA((_L8("Delete single object exit with response code = 0x%04X"), responseCode));
+ }
+ __FLOG(_L8("ServiceL - Exit"));
+ }
+
+void CMTPSvcDeleteObject::RunL()
+ {
+ __FLOG(_L8("RunL - Entry"));
+ __FLOG_VA((_L8("the number of objects to be deleted is %d, iDeleteIndex is %d"), iObjectHandles.Count(), iDeleteIndex));
+
+ if (iStatus != KErrNone)
+ {
+ iDeleteError = iStatus.Int();
+ }
+
+ CDesCArray* objectDeleted = new (ELeave) CDesCArrayFlat(KMTPDriveGranularity);
+ CleanupStack::PushL(objectDeleted);
+
+ TInt errCount = 0;
+ TInt count = iObjectHandles.Count();
+ const TUint32 granularity = iDataProvider.OperationGranularity();
+ for (TInt i = 0; iDeleteIndex < count && i < granularity; ++i)
+ {
+ TUint handle = iObjectHandles[iDeleteIndex++];
+ iFramework.ObjectMgr().ObjectL(handle, *iReceivedObjectMetaData);
+ if (DeleteObjectL(*iReceivedObjectMetaData) == EMTPRespCodeOK)
+ {
+ objectDeleted->AppendL(iReceivedObjectMetaData->DesC(CMTPObjectMetaData::ESuid));
+ iSuccessDeletion = ETrue;
+ }
+ else
+ {
+ ++errCount;
+ __FLOG_VA((_L8("Delete object failed, SUID:%S"), &(iReceivedObjectMetaData->DesC(CMTPObjectMetaData::ESuid))));
+ }
+ }
+
+ // Remove object from framework
+ iFramework.ObjectMgr().RemoveObjectsL(*objectDeleted);
+ CleanupStack::PopAndDestroy(objectDeleted);
+
+ if (iDeleteIndex >= count)
+ {
+ ProcessFinalPhaseL();
+ }
+ else
+ {
+ TInt err = (errCount > 0) ? KErrGeneral : KErrNone;
+ CompleteSelf(err);
+ }
+ __FLOG(_L8("RunL - Exit"));
+ }
+
+/**
+Handle an error in the delete loop by storing the error code and continuing deleting.
+*/
+TInt CMTPSvcDeleteObject::RunError(TInt aError)
+ {
+ __FLOG(_L8("RunError - Entry"));
+ CompleteSelf(aError);
+ __FLOG(_L8("RunError - Exit"));
+ return KErrNone;
+ }
+
+/**
+Complete myself
+*/
+void CMTPSvcDeleteObject::CompleteSelf(TInt aError)
+ {
+ __FLOG(_L8("CompleteSelf - Entry"));
+ SetActive();
+ TRequestStatus* status = &iStatus;
+ *status = KRequestPending;
+ User::RequestComplete(status, aError);
+ __FLOG(_L8("CompleteSelf - Exit"));
+ }
+
+TMTPResponseCode CMTPSvcDeleteObject::CheckRequestL()
+ {
+ __FLOG(_L8("CheckRequestL - Entry"));
+ TMTPResponseCode responseCode = CMTPRequestProcessor::CheckRequestL();
+ if (EMTPRespCodeOK == responseCode)
+ {
+ TUint32 objectHandle = Request().Uint32(TMTPTypeRequest::ERequestParameter1);
+ iReceivedObjectMetaData = CMTPObjectMetaData::NewL();
+ // Check object handle with dataprovider id, if handle is valid, then ignore format code in parameter 2.
+ if (objectHandle != KMTPHandleAll)
+ {
+ MMTPObjectMgr& objects = iFramework.ObjectMgr();
+ //Check whether object handle is valid
+ // Framework may send a handle which is a directory and dp can't check id in this case
+ if (objects.ObjectL(objectHandle, *iReceivedObjectMetaData))
+ {
+ iFormatCode = iReceivedObjectMetaData->Uint(CMTPObjectMetaData::EFormatCode);
+ if (iReceivedObjectMetaData->Uint(CMTPObjectMetaData::EDataProviderId) != iFramework.DataProviderId() && (iFormatCode != EMTPFormatCodeAssociation))
+ {
+ responseCode = EMTPRespCodeInvalidObjectHandle;
+ __FLOG(_L8("DataProviderId dismatch"));
+ }
+ else
+ {
+ responseCode = CheckFmtAndSetHandler(iFormatCode);
+ }
+ }
+ else
+ {
+ responseCode = EMTPRespCodeInvalidObjectHandle;
+ }
+ }
+ else
+ {
+ // Delete all objects for a format
+ iFormatCode = Request().Uint32(TMTPTypeRequest::ERequestParameter2);
+ // Check format code
+ if (iFormatCode != KMTPFormatsAll)
+ {
+ responseCode = CheckFmtAndSetHandler(iFormatCode);
+ }
+ }
+ }
+
+ __FLOG_VA((_L8("CheckRequestL Exit with response code = 0x%04X"), responseCode));
+ return responseCode;
+ }
+
+void CMTPSvcDeleteObject::ProcessFinalPhaseL()
+ {
+ __FLOG(_L8("ProcessFinalPhaseL - Entry"));
+ TMTPResponseCode responseCode = EMTPRespCodeOK;
+ if (iDeleteError != KErrNone)
+ {
+ if (iSuccessDeletion)
+ {
+ responseCode = EMTPRespCodePartialDeletion;
+ }
+ else
+ {
+ responseCode = EMTPRespCodeStoreReadOnly;
+ }
+ }
+ SendResponseL(responseCode);
+ __FLOG_VA((_L8("ProcessFinalPhaseL - Exit with response code = 0x%04X"), responseCode));
+ }
+
+TMTPResponseCode CMTPSvcDeleteObject::CheckFmtAndSetHandler(TUint32 aFormatCode)
+ {
+ __FLOG(_L8("CheckFmtAndSetHandler - Entry"));
+ TMTPResponseCode responseCode = EMTPRespCodeOK;
+ iObjectHandler = iDataProvider.ObjectHandler(aFormatCode);
+ if (!iObjectHandler)
+ {
+ responseCode = EMTPRespCodeInvalidObjectFormatCode;
+ }
+ __FLOG(_L8("CheckFmtAndSetHandler - Exit"));
+ return responseCode;
+ }
+
+TMTPResponseCode CMTPSvcDeleteObject::DeleteObjectL(const CMTPObjectMetaData& aObjectMetaData)
+ {
+ __FLOG(_L8("DeleteObjectL - Entry"));
+ TMTPResponseCode responseCode = EMTPRespCodeOK;
+ TUint16 formatCode = aObjectMetaData.Uint(CMTPObjectMetaData::EFormatCode);
+ responseCode = CheckFmtAndSetHandler(formatCode);
+ if (EMTPRespCodeOK == responseCode)
+ {
+ responseCode = iObjectHandler->DeleteObjectL(aObjectMetaData);
+ }
+ __FLOG(_L8("DeleteObjectL - Exit"));
+ return responseCode;
+ }