--- /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<TInt>(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<TInt>(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<TDriveList> 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<TInt>(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<TRsfwMountInfo> 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<TRfeWriteDataInArgs*>(request->iInArgs);
+ TRfeWriteDataOutArgs* outArgs =
+ static_cast<TRfeWriteDataOutArgs*>(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);
+ }
+