remotestoragefw/remotefileengine/src/rsfwrfesession.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) 2003-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:  Remote File Engine session manager
*
*/



// INCLUDE FILES
#include <e32cons.h>
#include <e32std.h>
#include <e32svr.h>
#include <e32std.h>
#include <f32file.h>

#include "rsfwcommon.h"
#include "rsfwinterface.h"
#include "rsfwrfesession.h"
#include "rsfwremoteaccess.h"
#include "mdebug.h"
#include "rsfwrfeserver.h"
#include "rsfwrfemessagerequest.h"
#include "rsfwrequestallocator.h"
#include "rsfwrfeoperation.h"
#include "rsfwrfesyncoperation.h"
#include "rsfwrfeasyncoperation.h"


// ============================ MEMBER FUNCTIONS ==============================

// ----------------------------------------------------------------------------
// CRsfwRfeSession::NewL
// ----------------------------------------------------------------------------
//
CRsfwRfeSession* CRsfwRfeSession::NewL(CRsfwRfeServer& aServer)
    {
    CRsfwRfeSession* self = CRsfwRfeSession::NewLC(aServer);
    CleanupStack::Pop(self);
    return self;
    }

// ----------------------------------------------------------------------------
// CRsfwRfeSession::NewLC
// ----------------------------------------------------------------------------
//
CRsfwRfeSession* CRsfwRfeSession::NewLC(CRsfwRfeServer& aServer)
    {
    // the following debug print crashes easily with USER 24:
 //   DEBUGSTRING(("CRsfwRfeSession::NewLC"));
    CRsfwRfeSession* self;
    self = new (ELeave) CRsfwRfeSession(aServer);
    CleanupStack::PushL(self);
    self->ConstructL();
    return self;
    }

// ----------------------------------------------------------------------------
// CRsfwRfeSession::CRsfwRfeSession
// ----------------------------------------------------------------------------
//
CRsfwRfeSession::CRsfwRfeSession(CRsfwRfeServer& aServer) :
    CSession2(),
    iRfeServer(aServer)
    {
    // Implementation not required
    }

// ----------------------------------------------------------------------------
// CRsfwRfeSession::ConstructL
// ----------------------------------------------------------------------------
//
void CRsfwRfeSession::ConstructL()
    {
    iVolumes = iRfeServer.iVolumes;
    iRfeServer.IncrementSessions();
    
    for (int i = 0; i < KDefaultMessageSlots; i++ ) 
        {
        iMessageRequests[i] = NULL;
        }
    }

// ----------------------------------------------------------------------------
// CRsfwRfeSession::~CRsfwRfeSession
// ----------------------------------------------------------------------------
//
CRsfwRfeSession::~CRsfwRfeSession()
    {
    // When the sessions are shared we don't know which
    // volumes can be freed at session shutdown 
    iRfeServer.DecrementSessions();
    }
    
// ----------------------------------------------------------------------------
// CRsfwRfeSession::DisconnectL
// ----------------------------------------------------------------------------
//
void CRsfwRfeSession::Disconnect(const RMessage2& aMessage)
    {
    // in all messages pending completion for this session
    // mark the session as NULL so that we do not try to complete them later
    for (int i = 0 ; i <KDefaultMessageSlots ; i++)
        {
        CRsfwRfeMessageRequest* mesrequest = iMessageRequests[i];
    
        if (mesrequest)
            {
            mesrequest->SetSession(NULL);
            }
       
        }
    CSession2::Disconnect(aMessage);   
    }


// ----------------------------------------------------------------------------
// CRsfwRfeSession::ServiceL
// ----------------------------------------------------------------------------
//
void CRsfwRfeSession::ServiceL(const RMessage2& aMessage)
    {  
    DEBUGSTRING16(("CRsfwRfeSession::ServiceL(), function %d", aMessage.Function()));
 
    iRfeServer.ServiceRequested();
   
    if(aMessage.Function() >= EMaxRfeOperations)
        {
        aMessage.Complete(KErrNotSupported);
        return;
        }
        
    CRsfwRfeMessageRequest* pR = NULL;
    pR=RsfwRequestAllocator::GetMessageRequest(aMessage, this);
    if (!pR)
        {
        aMessage.Complete(KErrNoMemory);
        return;
        }
        
    SetToMessageRequestArray(pR);
    
    // if volume was not found and this was a file system request
    // (not a mounting request), we have completed now with
    // KErrNotReady
    if (pR->iMessageCompleted) 
        {
        delete pR;
        return;
        }
    
    CRsfwRfeOperation* pO = NULL;
    pO = GetOperation(pR, aMessage.Function());
    if(!pO)
        { 
        delete pR;
        aMessage.Complete(KErrNoMemory);
        return;
        }
        
    // Request will take ownership of the operation
    pR->SetOperation(pO);   
        
    pR->Dispatch();
    }


// ----------------------------------------------------------------------------
// CRsfwRfeSession::SetToMessageRequestArray
// ----------------------------------------------------------------------------
//
void CRsfwRfeSession::SetToMessageRequestArray(CRsfwRfeMessageRequest* aMessageRequest)
    {  
    // set message request to the message request array
    for (int i = 0; i < KDefaultMessageSlots; i++) 
        {
        if (iMessageRequests[i] == NULL) 
            {
            // completely unused slot
            iMessageRequests[i] = aMessageRequest;
            break;
            }
        }
    
    }


// ----------------------------------------------------------------------------
// CRsfwRfeSession::RemoveFromMessageRequestArray
// call by request prior to self-destruction
// ----------------------------------------------------------------------------
//
void CRsfwRfeSession::RemoveFromMessageRequestArray(CRsfwRfeMessageRequest* aMessageRequest)
    {  
    // set message request to the message request array
    for (int i = 0; i < KDefaultMessageSlots; i++) 
        {
        if (iMessageRequests[i] == aMessageRequest) 
            {
            iMessageRequests[i] = NULL;
            }
        }
    
    }


// ----------------------------------------------------------------------------
// CRsfwRfeSession::Volume
// ----------------------------------------------------------------------------
//
CRsfwVolumeTable* CRsfwRfeSession::Volume() 
    {
    return iVolumes;
    }

// ----------------------------------------------------------------------------
// CRsfwRfeSession::Server
// ----------------------------------------------------------------------------
//
CRsfwRfeServer* CRsfwRfeSession::Server() 
    {
    return &iRfeServer;
    }

// ----------------------------------------------------------------------------
// CRsfwRfeSession::GetOperation
// Sets operations to be synchronous or asynhronous
// ----------------------------------------------------------------------------
//
CRsfwRfeOperation* CRsfwRfeSession::GetOperation(CRsfwRfeRequest* aRequest, TInt aOpCode)
    {
    CRsfwRfeOperation* pO = NULL;
    switch (aOpCode)
        {
    case EDismountByVolumeId:
    case EDismountByDriveLetter:
    case EGetMountList:
    case EGetMountInfo:
    case EFsRoot:
    case EOkToWrite:
    case ESetAttr:
    case EFsIoctl:
    case EDirRefresh:
    case ECancelAll:
        pO = RsfwRequestAllocator::GetSyncOperation(aRequest, aOpCode);
        break;

    case EMount:
    case EMountByDriveLetter:
    case ESetMountConnectionState:
    case ERenameReplace:        
    case EOpenByPath:
    case EFetch:
    case EFetchData:
    case ELookUp:
    case EGetAttr:
    case EMkDir:
    case ERemoveDir:
    case ERemove:
    case ECreateFile:
    case EClose:
    case EFlush:
        pO = RsfwRequestAllocator::GetAsyncOperation(aRequest, aOpCode);
        break;

    default:
       __ASSERT_DEBUG(FALSE, User::Panic(KRfeServer, EUndefinedRequest));
        // if this happens even in release build
        // pO will stay NULL and the request is completed with KErrNoMemory...
        }
   
    return pO; 
    }

// ----------------------------------------------------------------------------
// CRsfwRfeSession::PanicClient
// ----------------------------------------------------------------------------
//
#ifdef NONSHARABLE_SESSION
void CRsfwRfeSession::PanicClient(TInt aPanic) const
    {
    // Note: this panics the client thread, not server
    Panic(KRfeServer, aPanic);
    }
#endif

// End of File