diff -r 88ee4cf65e19 -r 1aa8c82cb4cb remotestoragefw/remotefileengine/src/rsfwrfemessagerequest.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/remotestoragefw/remotefileengine/src/rsfwrfemessagerequest.cpp Wed Sep 01 12:15:08 2010 +0100 @@ -0,0 +1,461 @@ +/* +* Copyright (c) 2005-2006 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: A request sent by a client (i.e. non-internal request) +* +*/ + + +#include "rsfwrfemessagerequest.h" +#include "rsfwrfeoperation.h" +#include "rsfwvolumetable.h" +#include "rsfwvolume.h" +#include "rsfwcommon.h" +#include "rsfwinterface.h" +#include "mdebug.h" +#include "rsfwrfesession.h" + + + +// ---------------------------------------------------------------------------- +// CRsfwRfeMessageRequest::CRsfwRfeMessageRequest +// ---------------------------------------------------------------------------- +// +CRsfwRfeMessageRequest::CRsfwRfeMessageRequest() + { + SetRequestType(EMessageRequest); + iMessageCompleted = EFalse; + } + +// ---------------------------------------------------------------------------- +// CRsfwRfeMessageRequest::SetL +// ---------------------------------------------------------------------------- +// +void CRsfwRfeMessageRequest::SetL(const RMessage2& aMessage, + CRsfwRfeSession* aSession) + { + DEBUGSTRING(("CRsfwRfeMessageRequest::Set")); + + // common for all operations + iMessage = aMessage; + iSession = aSession; + iVolumeTable = aSession->Volume(); + + // if a file system access operation + if (aMessage.Function() >= ERenameReplace) + { + switch (aMessage.Function()) + { + // read input parameters + case ERenameReplace: + { + TRfeRenameInArgs* inArgs = new (ELeave) TRfeRenameInArgs(); + CleanupStack::PushL(inArgs); + TPckg pkgInArgs(*inArgs); + aMessage.ReadL(0, pkgInArgs); + CleanupStack::Pop(inArgs); + iInArgs = inArgs; + iOutArgs = NULL; + break; + } + case ESetAttr: + { + TRfeSetAttrInArgs* inArgs = new (ELeave) TRfeSetAttrInArgs(); + CleanupStack::PushL(inArgs); + TPckg pkgInArgs(*inArgs); + aMessage.ReadL(0, pkgInArgs); + CleanupStack::Pop(inArgs); + iInArgs = inArgs; + iOutArgs = NULL; + break; + } + case EFsIoctl: + { + TRfeIoctlInArgs* inArgs = new (ELeave) TRfeIoctlInArgs(); + CleanupStack::PushL(inArgs); + TPckg pkgInArgs(*inArgs); + aMessage.ReadL(0, pkgInArgs); + CleanupStack::Pop(inArgs); + iInArgs = inArgs; + iOutArgs = NULL; + break; + } + + case EGetAttr: + { + TRfeGetAttrInArgs* inArgs = new (ELeave) TRfeGetAttrInArgs(); + CleanupStack::PushL(inArgs); + TRfeGetAttrOutArgs* outArgs = new (ELeave )TRfeGetAttrOutArgs(); + CleanupStack::PushL(outArgs); + TPckg pkgInArgs(*inArgs); + aMessage.ReadL(0, pkgInArgs); + CleanupStack::Pop(2, inArgs); // inArgs, outArgs + iInArgs = inArgs; + iOutArgs = outArgs; + break; + } + + case EOpenByPath: + { + TRfeOpenByPathInArgs* inArgs = new (ELeave) TRfeOpenByPathInArgs(); + CleanupStack::PushL(inArgs); + TRfeOpenByPathOutArgs* outArgs = new (ELeave) TRfeOpenByPathOutArgs(); + CleanupStack::PushL(outArgs); + TPckg pkgInArgs(*inArgs); + aMessage.ReadL(0, pkgInArgs); + CleanupStack::Pop(2, inArgs); // inArgs, outArgs + iInArgs = inArgs; + iOutArgs = outArgs; + break; + } + + case EFsRoot: + { + TRfeRootInArgs* inArgs = new (ELeave) TRfeRootInArgs(); + CleanupStack::PushL(inArgs); + TRfeRootOutArgs* outArgs = new (ELeave) TRfeRootOutArgs(); + CleanupStack::PushL(outArgs); + TPckg pkgInArgs(*inArgs); + aMessage.ReadL(0, pkgInArgs); + CleanupStack::Pop(2, inArgs); // inArgs, outArgs + iInArgs = inArgs; + iOutArgs = outArgs; + break; + } + + case EMkDir: + { + TRfeMkdirInArgs* inArgs = new (ELeave) TRfeMkdirInArgs(); + CleanupStack::PushL(inArgs); + TPckg pkgInArgs(*inArgs); + aMessage.ReadL(0, pkgInArgs); + CleanupStack::Pop(inArgs); + iInArgs = inArgs; + iOutArgs = NULL; + break; + } + + case ERemoveDir: + { + TRfeRmdirInArgs* inArgs = new (ELeave) TRfeRmdirInArgs(); + CleanupStack::PushL(inArgs); + TPckg pkgInArgs(*inArgs); + aMessage.ReadL(0, pkgInArgs); + CleanupStack::Pop(inArgs); + iInArgs = inArgs; + iOutArgs = NULL; + break; + } + + case ECreateFile: + { + TRfeCreateInArgs* inArgs = new (ELeave) TRfeCreateInArgs(); + CleanupStack::PushL(inArgs); + TRfeCreateOutArgs* outArgs = new (ELeave) TRfeCreateOutArgs(); + CleanupStack::PushL(outArgs); + TPckg pkgInArgs(*inArgs); + aMessage.ReadL(0, pkgInArgs); + CleanupStack::Pop(2, inArgs); // inArgs, outArgs + iInArgs = inArgs; + iOutArgs = outArgs; + break; + } + + case ERemove: + { + TRfeRemoveInArgs* inArgs = new (ELeave) TRfeRemoveInArgs(); + CleanupStack::PushL(inArgs); + TPckg pkgInArgs(*inArgs); + aMessage.ReadL(0, pkgInArgs); + CleanupStack::Pop(inArgs); + iInArgs = inArgs; + iOutArgs = NULL; + break; + } + + case ELookUp: + { + TRfeLookupInArgs* inArgs = new (ELeave) TRfeLookupInArgs(); + CleanupStack::PushL(inArgs); + TRfeLookupOutArgs* outArgs = new (ELeave) TRfeLookupOutArgs(); + CleanupStack::PushL(outArgs); + TPckg pkgInArgs(*inArgs); + aMessage.ReadL(0, pkgInArgs); + CleanupStack::Pop(2, inArgs); + iInArgs = inArgs; + iOutArgs = outArgs; + break; + } + + case EClose: + { + TRfeCloseInArgs* inArgs = new (ELeave) TRfeCloseInArgs(); + inArgs->iFid.iVolumeId = aMessage.Int0(); + inArgs->iFid.iNodeId = aMessage.Int1(); + inArgs->iOpCode = EClose; + inArgs->iFlags = aMessage.Int2(); + iInArgs = inArgs; + iOutArgs = NULL; + break; + } + + case EFlush: + { + TRfeFlushInArgs* inArgs = new (ELeave) TRfeFlushInArgs(); + CleanupStack::PushL(inArgs); + TPckg pkgInArgs(*inArgs); + aMessage.ReadL(0, pkgInArgs); + CleanupStack::Pop(inArgs); + iInArgs = inArgs; + break; + } + + case EFetch: + { + TRfeFetchInArgs* inArgs = new (ELeave) TRfeFetchInArgs(); + CleanupStack::PushL(inArgs); + TRfeFetchOutArgs* outArgs = new (ELeave) TRfeFetchOutArgs(); + CleanupStack::PushL(outArgs); + TPckg pkgInArgs(*inArgs); + aMessage.ReadL(0, pkgInArgs); + CleanupStack::Pop(2, inArgs); + iInArgs = inArgs; + iOutArgs = outArgs; + break; + } + + case EFetchData: + { + TRfeFetchDataInArgs* inArgs = new (ELeave) TRfeFetchDataInArgs(); + CleanupStack::PushL(inArgs); + TRfeFetchDataOutArgs* outArgs = new (ELeave) TRfeFetchDataOutArgs(); + CleanupStack::PushL(outArgs); + TPckg pkgInArgs(*inArgs); + aMessage.ReadL(0, pkgInArgs); + CleanupStack::Pop(2, inArgs); + iInArgs = inArgs; + iOutArgs = outArgs; + break; + } + + case EOkToWrite: + { + TRfeWriteDataInArgs* inArgs = new (ELeave) TRfeWriteDataInArgs(); + CleanupStack::PushL(inArgs); + TRfeWriteDataOutArgs* outArgs = new (ELeave) TRfeWriteDataOutArgs(); + CleanupStack::PushL(outArgs); + TPckg pkgInArgs(*inArgs); + aMessage.ReadL(0, pkgInArgs); + CleanupStack::Pop(2, inArgs); + iInArgs = inArgs; + iOutArgs = outArgs; + break; + } + } + + DEBUGSTRING(("volume id %d", iInArgs->iFid.iVolumeId)); + // Here volumeId may be 0 to denote "no volume id" + // This is OK - we assume that drive letter A is never allocated + iVolume = iVolumeTable->VolumeByVolumeId(iInArgs->iFid.iVolumeId); + + // As this is a file system access operation - not mount operation, + // if volume is null we are not ready for file operations + // - indicate this to the client who needs to call mount + TBool ready = + iVolume && + (iVolume->iMountInfo.iMountStatus.iMountState != + KMountStateDormant); + if (!ready && aMessage.Function() != EFsRoot && aMessage.Function() != EClose) + { + aMessage.Complete(KErrNotReady); + iMessageCompleted = ETrue; + } + } + } + +// ---------------------------------------------------------------------------- +// CRsfwRfeMessageRequest::Message +// ---------------------------------------------------------------------------- +// +const RMessage2& CRsfwRfeMessageRequest::Message() + { + return iMessage; + } + +// ---------------------------------------------------------------------------- +// CRsfwRfeMessageRequest::Session +// ---------------------------------------------------------------------------- +// +CRsfwRfeSession* CRsfwRfeMessageRequest::Session() + { + return iSession; + } + + +// ---------------------------------------------------------------------------- +// CRsfwRfeMessageRequest::Session +// ---------------------------------------------------------------------------- +// +void CRsfwRfeMessageRequest::SetSession(CRsfwRfeSession* aSession) + { + iSession = aSession; + } + + +// ---------------------------------------------------------------------------- +// CRsfwRfeMessageRequest::Complete +// ---------------------------------------------------------------------------- +// +void CRsfwRfeMessageRequest::Complete(TInt aError) + { + DEBUGSTRING(("CRsfwRfeMessageRequest::Complete")); + if (iSession) + { + DEBUGSTRING((">>> Dispatch exit (operation %d, error %d, return %d)", + Operation()->iFunction, + aError, + aError)); + DEBUGSTRING(("completing request")); + if (!Message().IsNull()) + { + Message().Complete(aError); + } + DEBUGSTRING(("request completed")); + iMessageCompleted = ETrue; + } + } + +// ---------------------------------------------------------------------------- +// CRsfwRfeMessageRequest::CompleteAndDestroy +// ---------------------------------------------------------------------------- +// +void CRsfwRfeMessageRequest::CompleteAndDestroy(TInt aError) + { + DEBUGSTRING(("CRsfwRfeMessageRequest::CompleteAndDestroy")); + + TInt err; + err = KErrNone; + if (iSession) + { + DEBUGSTRING((">>> Dispatch exit (operation %d, error %d, return %d)", + Operation()->iFunction, aError, aError)); + switch (Operation()->iFunction) + { + // write output parameters + case EFetch: + { + DEBUGSTRING(("writing parameters: EFetch")); + TRfeFetchOutArgs* outArgs = (TRfeFetchOutArgs *)(iOutArgs); + TPckg pkgOutArgs(*outArgs); + err = Message().Write(1, pkgOutArgs); + break; + } + + case EFetchData: + { + DEBUGSTRING(("writing parameters: EFetchData")); + TRfeFetchDataOutArgs* outArgs = (TRfeFetchDataOutArgs *)(iOutArgs); + TPckg pkgOutArgs(*outArgs); + err = Message().Write(1, pkgOutArgs); + break; + } + + case EOkToWrite: + { + DEBUGSTRING(("writing parameters: EOkToWrite")); + TRfeWriteDataOutArgs* outArgs = (TRfeWriteDataOutArgs *)(iOutArgs); + TPckg pkgOutArgs(*outArgs); + err = Message().Write(1, pkgOutArgs); + break; + } + + case ELookUp: + { + DEBUGSTRING(("writing parameters: ELookup")); + TRfeLookupOutArgs* outArgs = (TRfeLookupOutArgs *)(iOutArgs); + TPckg pkgOutArgs(*outArgs); + err = Message().Write(1, pkgOutArgs); + break; + } + + case ECreateFile: + { + DEBUGSTRING(("writing parameters: ECreateFile")); + TRfeCreateOutArgs* outArgs = (TRfeCreateOutArgs *)(iOutArgs); + TPckg pkgOutArgs(*outArgs); + err = Message().Write(1, pkgOutArgs); + break; + } + + case EOpenByPath: + { + DEBUGSTRING(("writing parameters: EOpenByPath")); + TRfeOpenByPathOutArgs* outArgs = + (TRfeOpenByPathOutArgs *)(iOutArgs); + TPckg pkgOutArgs(*outArgs); + err = Message().Write(1, pkgOutArgs); + break; + } + + case EGetAttr: + { + DEBUGSTRING(("writing parameters: EGetAttr")); + TRfeGetAttrOutArgs* outArgs = (TRfeGetAttrOutArgs *)(iOutArgs); + TPckg pkgOutArgs(*outArgs); + err = Message().Write(1, pkgOutArgs); + break; + } + + case EFsRoot: + { + DEBUGSTRING(("writing parameters: EFsRoot")); + TRfeRootOutArgs* outArgs = (TRfeRootOutArgs *)(iOutArgs); + TPckg pkgOutArgs(*outArgs); + err = Message().Write(1, pkgOutArgs); + break; + } + } + + if (err) + { + aError = err; + } + + DEBUGSTRING(("completing request")); + if (!Message().IsNull()) + { + Message().Complete(aError); + } + DEBUGSTRING(("request completed")); + iMessageCompleted = ETrue; + } + + Destroy(); + } + + + // ---------------------------------------------------------------------------- +// CRsfwRfeRequest::Destroy +// ---------------------------------------------------------------------------- +// +void CRsfwRfeMessageRequest::Destroy() + { + if (iSession) + { + iSession->RemoveFromMessageRequestArray(this); + } + + CRsfwRfeRequest::Destroy(); + } + +