remotestoragefw/remotefileengine/src/rsfwrfesession.cpp
changeset 0 3ad9d5175a89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotestoragefw/remotefileengine/src/rsfwrfesession.cpp	Thu Dec 17 09:07:59 2009 +0200
@@ -0,0 +1,297 @@
+/*
+* 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