diff -r 88ee4cf65e19 -r 1aa8c82cb4cb remotestoragefw/remotefileengine/src/rsfwsyncoperations.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/remotestoragefw/remotefileengine/src/rsfwsyncoperations.cpp Wed Sep 01 12:15:08 2010 +0100 @@ -0,0 +1,180 @@ +/* +* 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: Encapsulated all sync operations +* +*/ + + +#include "rsfwsyncoperations.h" +#include "rsfwrfemessagerequest.h" +#include "rsfwvolumetable.h" +#include "rsfwvolume.h" +#include "rsfwfileengine.h" +#include "rsfwfiletable.h" +#include "rsfwfileentry.h" +#include "rsfwrfesession.h" +#include "rsfwinterface.h" +#include "rsfwcontrol.h" +#include "mdebug.h" + + +// ---------------------------------------------------------------------------- +// TRFeSynCRsfwRfeRequest::DoRequestL +// wrapper for all sync requests +// ---------------------------------------------------------------------------- +// +void TRFeSynCRsfwRfeRequest::DoRequestL(CRsfwRfeRequest* aRequest) + { + CRsfwRfeMessageRequest* request = (CRsfwRfeMessageRequest*) aRequest; + request->Session()->Volume()->DispatchL(request->iInArgs, + request->iOutArgs); + } + +// ---------------------------------------------------------------------------- +// TRFeDismountVolumeId::DoRequestL +// dismount a previously mounted volume by volume ID +// ---------------------------------------------------------------------------- +// +void TRFeDismountVolumeId::DoRequestL(CRsfwRfeRequest* aRequest) + { + DEBUGSTRING(("TRFeDismountVolumeId::DoRequestL")); + CRsfwRfeMessageRequest* request = (CRsfwRfeMessageRequest*) aRequest; + TInt volumeId = reinterpret_cast(request->Message().Ptr0()); + DEBUGSTRING(("EDismount: volume %d", volumeId)); + request->Session()->Volume()->DismountByVolumeIdL(volumeId, ETrue); + // This is called from the fileserver main thread. + // Therefore, we should return quickly. + } + +// ---------------------------------------------------------------------------- +// TRFeDismountByDriveLetter::DoRequestL +// dismount a previously mounted volume by drive letter +// ---------------------------------------------------------------------------- +// +void TRFeDismountByDriveLetter::DoRequestL(CRsfwRfeRequest* aRequest) + { + DEBUGSTRING(("TRFeDismountByDriveLetter::DoRequestL")); + // Dismount a volume by drive letter + // synchronous request + CRsfwRfeMessageRequest* request = (CRsfwRfeMessageRequest*) aRequest; + TChar driveLetter = reinterpret_cast(request->Message().Ptr0()); + DEBUGSTRING(("EDismountByDriveLetter: '%c'", TUint(driveLetter))); + request->Session()->Volume()->DismountByDriveLetterL(driveLetter, ETrue); + } + + +// ---------------------------------------------------------------------------- +// TRFeGetMountList::DoRequestL +// get a list of currently active mounts +// ---------------------------------------------------------------------------- +// +void TRFeGetMountList::DoRequestL(CRsfwRfeRequest* aRequest) + { + DEBUGSTRING(("TRFeGetMountList::DoRequestL")); + // synchronous request + CRsfwRfeMessageRequest* request = (CRsfwRfeMessageRequest*) aRequest; + TDriveList mountList; + request->Session()->Volume()->GetMountList(mountList); + TPckg p(mountList); + request->Message().WriteL(0, p); + DEBUGSTRING8(("EGetMountList: '%S'", &mountList)); + } + + +// ---------------------------------------------------------------------------- +// TRFeGetMountInfo::DoRequestL +// get information about a specific mount +// ---------------------------------------------------------------------------- +// +void TRFeGetMountInfo::DoRequestL(CRsfwRfeRequest* aRequest) + { + DEBUGSTRING(("TRFeGetMountInfo::DoRequestL")); + // synchronous request + CRsfwRfeMessageRequest* request = (CRsfwRfeMessageRequest*) aRequest; + TRsfwMountInfo* mountInfo = new (ELeave) TRsfwMountInfo; + CleanupStack::PushL(mountInfo); + mountInfo->iMountConfig.iDriveLetter = + reinterpret_cast(request->Message().Ptr0()); + TInt err = request->Session()->Volume()->GetMountInfo(*mountInfo); + DEBUGSTRING(("EGetMountInfo for '%c' (err=%d)", + TUint(mountInfo->iMountConfig.iDriveLetter), + err)); + if (err != KErrNone) + { + mountInfo->iMountConfig.iUri.Zero(); + } + TPckg mountInfoPackage(*mountInfo); + request->Message().WriteL(1, mountInfoPackage); + CleanupStack::PopAndDestroy(mountInfo); + } + + +// ---------------------------------------------------------------------------- +// TRFeWriteData::DoRequestL +// get permission to write certain amount of data +// ---------------------------------------------------------------------------- +// +void TRFeWriteData::DoRequestL(CRsfwRfeRequest* aRequest) + { + DEBUGSTRING(("TRFeWriteData::DoRequestL")); + CRsfwRfeMessageRequest* request = (CRsfwRfeMessageRequest*) aRequest; + TRfeWriteDataInArgs* inArgs = + static_cast(request->iInArgs); + TRfeWriteDataOutArgs* outArgs = + static_cast(request->iOutArgs); + outArgs->iOkToWrite = + request->iVolumeTable->EnsureCacheCanBeAddedL(inArgs->iBytes); + + if (outArgs->iOkToWrite) + { + // make sure "dirty bit" is on (file has uncommited modifications) + CRsfwFileEntry* entry= + request->iVolume->iFileEngine->iFileTable->Lookup(inArgs->iFid); + if (entry) + { + entry->SetOpenedForWriting(ETrue); + request->iVolume->iFileEngine->iFileTable->SaveMetaDataDelta(); + } + // if writing has been cancelled, we have to inform the file server plugin + if (entry->IsCancelled()) + { + User::Leave(KErrCancel); + } + + } + } + +void TRFeDirectoryRefresh::DoRequestL(CRsfwRfeRequest* aRequest) + { + DEBUGSTRING(("TRFeDirectoryRefresh::DoRequestL")); + CRsfwRfeMessageRequest* request = (CRsfwRfeMessageRequest*) aRequest; + HBufC* refreshBuf = HBufC::NewLC(KMaxPath); + TPtr refPtr = refreshBuf->Des(); + request->Message().ReadL(0, refPtr); + User::LeaveIfError(request->Session()->Volume()->PurgeFromCache(refPtr)); + CleanupStack::PopAndDestroy(refreshBuf); + } + + +void TRFeCancelAll::DoRequestL(CRsfwRfeRequest* aRequest) + { + DEBUGSTRING(("TRFeCancelAll::DoRequestL")); + CRsfwRfeMessageRequest* request = (CRsfwRfeMessageRequest*) aRequest; + HBufC* fileBuf = HBufC::NewLC(KMaxPath); + TPtr filePtr = fileBuf->Des(); + request->Message().ReadL(0, filePtr); + User::LeaveIfError(request->Session()->Volume()->CancelTransferL(filePtr)); + CleanupStack::PopAndDestroy(fileBuf); + } +