remotestoragefw/remotefileengine/src/rsfwsyncoperations.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:15:08 +0100
branchRCL_3
changeset 20 1aa8c82cb4cb
parent 0 3ad9d5175a89
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201021 Kit: 201035

/*
* 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);
    }