remotestoragefw/remotefileengine/src/rsfwsyncoperations.cpp
branchRCL_3
changeset 16 1aa8c82cb4cb
parent 0 3ad9d5175a89
equal deleted inserted replaced
15:88ee4cf65e19 16:1aa8c82cb4cb
       
     1 /*
       
     2 * Copyright (c) 2005-2006 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Encapsulated all sync operations
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include "rsfwsyncoperations.h"
       
    20 #include "rsfwrfemessagerequest.h"
       
    21 #include "rsfwvolumetable.h"
       
    22 #include "rsfwvolume.h"
       
    23 #include "rsfwfileengine.h"
       
    24 #include "rsfwfiletable.h"
       
    25 #include "rsfwfileentry.h"
       
    26 #include "rsfwrfesession.h"
       
    27 #include "rsfwinterface.h"
       
    28 #include "rsfwcontrol.h"
       
    29 #include "mdebug.h"
       
    30 
       
    31    
       
    32 // ----------------------------------------------------------------------------
       
    33 // TRFeSynCRsfwRfeRequest::DoRequestL
       
    34 // wrapper for all sync requests
       
    35 // ----------------------------------------------------------------------------
       
    36 // 
       
    37 void TRFeSynCRsfwRfeRequest::DoRequestL(CRsfwRfeRequest* aRequest) 
       
    38     {
       
    39     CRsfwRfeMessageRequest* request = (CRsfwRfeMessageRequest*) aRequest;
       
    40     request->Session()->Volume()->DispatchL(request->iInArgs,
       
    41                                             request->iOutArgs);
       
    42     }
       
    43 
       
    44 // ----------------------------------------------------------------------------
       
    45 // TRFeDismountVolumeId::DoRequestL
       
    46 // dismount a previously mounted volume by volume ID
       
    47 // ----------------------------------------------------------------------------
       
    48 //  
       
    49 void TRFeDismountVolumeId::DoRequestL(CRsfwRfeRequest* aRequest)
       
    50     {
       
    51     DEBUGSTRING(("TRFeDismountVolumeId::DoRequestL"));
       
    52     CRsfwRfeMessageRequest* request = (CRsfwRfeMessageRequest*) aRequest;
       
    53     TInt volumeId = reinterpret_cast<TInt>(request->Message().Ptr0());
       
    54     DEBUGSTRING(("EDismount: volume %d", volumeId));
       
    55     request->Session()->Volume()->DismountByVolumeIdL(volumeId, ETrue);
       
    56     // This is called from the fileserver main thread.
       
    57     // Therefore, we should return quickly.
       
    58     }
       
    59     
       
    60 // ----------------------------------------------------------------------------
       
    61 // TRFeDismountByDriveLetter::DoRequestL
       
    62 // dismount a previously mounted volume by drive letter
       
    63 // ----------------------------------------------------------------------------
       
    64 //   
       
    65 void TRFeDismountByDriveLetter::DoRequestL(CRsfwRfeRequest* aRequest)
       
    66     {
       
    67     DEBUGSTRING(("TRFeDismountByDriveLetter::DoRequestL"));
       
    68     // Dismount a volume by drive letter
       
    69     // synchronous request
       
    70     CRsfwRfeMessageRequest* request = (CRsfwRfeMessageRequest*) aRequest;
       
    71     TChar driveLetter = reinterpret_cast<TInt>(request->Message().Ptr0());
       
    72     DEBUGSTRING(("EDismountByDriveLetter: '%c'", TUint(driveLetter)));
       
    73     request->Session()->Volume()->DismountByDriveLetterL(driveLetter, ETrue); 
       
    74     }
       
    75 
       
    76 
       
    77 // ----------------------------------------------------------------------------
       
    78 // TRFeGetMountList::DoRequestL
       
    79 // get a list of currently active mounts
       
    80 // ----------------------------------------------------------------------------
       
    81 //      
       
    82 void TRFeGetMountList::DoRequestL(CRsfwRfeRequest* aRequest)
       
    83     {
       
    84     DEBUGSTRING(("TRFeGetMountList::DoRequestL"));
       
    85     // synchronous request
       
    86     CRsfwRfeMessageRequest* request = (CRsfwRfeMessageRequest*) aRequest;
       
    87     TDriveList mountList;
       
    88     request->Session()->Volume()->GetMountList(mountList);
       
    89     TPckg<TDriveList> p(mountList);
       
    90     request->Message().WriteL(0, p);
       
    91     DEBUGSTRING8(("EGetMountList: '%S'", &mountList));
       
    92     }
       
    93 
       
    94 
       
    95 // ----------------------------------------------------------------------------
       
    96 // TRFeGetMountInfo::DoRequestL
       
    97 // get information about a specific mount
       
    98 // ----------------------------------------------------------------------------
       
    99 //        
       
   100 void TRFeGetMountInfo::DoRequestL(CRsfwRfeRequest* aRequest)
       
   101     {
       
   102     DEBUGSTRING(("TRFeGetMountInfo::DoRequestL"));
       
   103     // synchronous request
       
   104     CRsfwRfeMessageRequest* request = (CRsfwRfeMessageRequest*) aRequest;
       
   105     TRsfwMountInfo* mountInfo = new (ELeave) TRsfwMountInfo;
       
   106     CleanupStack::PushL(mountInfo);
       
   107     mountInfo->iMountConfig.iDriveLetter = 
       
   108         reinterpret_cast<TInt>(request->Message().Ptr0());
       
   109     TInt err = request->Session()->Volume()->GetMountInfo(*mountInfo);
       
   110     DEBUGSTRING(("EGetMountInfo for '%c' (err=%d)",
       
   111                  TUint(mountInfo->iMountConfig.iDriveLetter),
       
   112                  err));
       
   113     if (err != KErrNone)
       
   114         {
       
   115         mountInfo->iMountConfig.iUri.Zero();
       
   116         }
       
   117     TPckg<TRsfwMountInfo> mountInfoPackage(*mountInfo);
       
   118     request->Message().WriteL(1, mountInfoPackage);
       
   119     CleanupStack::PopAndDestroy(mountInfo);
       
   120     }  
       
   121     
       
   122     
       
   123 // ----------------------------------------------------------------------------
       
   124 // TRFeWriteData::DoRequestL
       
   125 // get permission to write certain amount of data
       
   126 // ----------------------------------------------------------------------------
       
   127 //    
       
   128 void TRFeWriteData::DoRequestL(CRsfwRfeRequest* aRequest) 
       
   129     {
       
   130     DEBUGSTRING(("TRFeWriteData::DoRequestL"));
       
   131     CRsfwRfeMessageRequest* request = (CRsfwRfeMessageRequest*) aRequest;
       
   132     TRfeWriteDataInArgs* inArgs =
       
   133         static_cast<TRfeWriteDataInArgs*>(request->iInArgs);
       
   134     TRfeWriteDataOutArgs* outArgs =
       
   135         static_cast<TRfeWriteDataOutArgs*>(request->iOutArgs);
       
   136     outArgs->iOkToWrite =
       
   137         request->iVolumeTable->EnsureCacheCanBeAddedL(inArgs->iBytes); 
       
   138         
       
   139     if (outArgs->iOkToWrite)  
       
   140         {
       
   141         // make sure "dirty bit" is on (file has uncommited modifications)
       
   142         CRsfwFileEntry* entry= 
       
   143             request->iVolume->iFileEngine->iFileTable->Lookup(inArgs->iFid);
       
   144         if (entry) 
       
   145             {
       
   146             entry->SetOpenedForWriting(ETrue);
       
   147             request->iVolume->iFileEngine->iFileTable->SaveMetaDataDelta();
       
   148             }
       
   149         // if writing has been cancelled, we have to inform the file server plugin
       
   150         if (entry->IsCancelled()) 
       
   151             {
       
   152             User::Leave(KErrCancel);
       
   153             }
       
   154         
       
   155         }
       
   156     }
       
   157 
       
   158 void TRFeDirectoryRefresh::DoRequestL(CRsfwRfeRequest* aRequest) 
       
   159     {
       
   160     DEBUGSTRING(("TRFeDirectoryRefresh::DoRequestL"));
       
   161     CRsfwRfeMessageRequest* request = (CRsfwRfeMessageRequest*) aRequest;
       
   162     HBufC* refreshBuf = HBufC::NewLC(KMaxPath);
       
   163     TPtr refPtr = refreshBuf->Des();
       
   164     request->Message().ReadL(0, refPtr);
       
   165     User::LeaveIfError(request->Session()->Volume()->PurgeFromCache(refPtr));
       
   166     CleanupStack::PopAndDestroy(refreshBuf);
       
   167     }
       
   168 
       
   169 
       
   170 void TRFeCancelAll::DoRequestL(CRsfwRfeRequest* aRequest)
       
   171     {
       
   172     DEBUGSTRING(("TRFeCancelAll::DoRequestL"));
       
   173     CRsfwRfeMessageRequest* request = (CRsfwRfeMessageRequest*) aRequest;
       
   174     HBufC* fileBuf = HBufC::NewLC(KMaxPath);
       
   175     TPtr filePtr = fileBuf->Des();
       
   176     request->Message().ReadL(0, filePtr);
       
   177     User::LeaveIfError(request->Session()->Volume()->CancelTransferL(filePtr));
       
   178     CleanupStack::PopAndDestroy(fileBuf);
       
   179     }
       
   180