remotestoragefw/remotefileengine/src/rsfwrfestatemachine.cpp
changeset 0 3ad9d5175a89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotestoragefw/remotefileengine/src/rsfwrfestatemachine.cpp	Thu Dec 17 09:07:59 2009 +0200
@@ -0,0 +1,329 @@
+/*
+* 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:  Base class for all operation state machines
+*
+*/
+
+
+#include "mdebug.h"
+#include "rsfwrfestatemachine.h"
+#include "rsfwinterface.h"
+#include "rsfwfiletable.h"
+#include "rsfwrferequest.h"
+#include "rsfwfileengine.h"
+
+// ----------------------------------------------------------------------------
+// CRsfwRfeStateMachine::BaseConstructL
+// ----------------------------------------------------------------------------
+//
+void CRsfwRfeStateMachine::BaseConstructL()
+    {
+    DEBUGSTRING(("CRsfwRfeStateMachine::BaseConstructL"));
+    iCompleteAndDestroyState =
+        new (ELeave) CRsfwRfeStateMachine::TCompleteAndDestroyState(this);   
+    }
+
+// ----------------------------------------------------------------------------
+// CRsfwRfeStateMachine::~CRsfwRfeStateMachine
+// Note that normally when we come here iState = iCompleteAndDestroyState,
+// only delete once
+// ----------------------------------------------------------------------------
+//
+CRsfwRfeStateMachine::~CRsfwRfeStateMachine()
+    {
+    DEBUGSTRING(("CRsfwRfeStateMachine::~CRsfwRfeStateMachine"));
+    if (CurrentState() == CompleteAndDestroyState()) 
+        {
+        delete iState;
+        }
+    else 
+        {
+        delete iState;
+        delete iCompleteAndDestroyState;
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CRsfwRfeStateMachine::ErrorOnStateEntry
+// Entering the current state failed, so loop in EnterState() will replace 
+// it by CompleteAndDestroy state as we return that state.
+// Deleting the current state happens in EnterState()
+// The state machine logic does not do that, as it allows us to eg resolve
+// the problem by fixing the current state. 
+// ----------------------------------------------------------------------------
+//
+CRsfwRfeStateMachine::TState* CRsfwRfeStateMachine::ErrorOnStateEntry(TInt aError) 
+    {
+    DEBUGSTRING(("CRsfwRfeStateMachine::ErrorOnStateEntry"));
+    iCompleteAndDestroyState->SetErrorCode(aError);
+    return iCompleteAndDestroyState;
+    }
+
+// ----------------------------------------------------------------------------
+// CRsfwRfeStateMachine::ChangeState
+// Enters aNextState, and makes it our current state.
+// Deletes the previous state
+// (assumes we never go backwards in the state machine)
+// ----------------------------------------------------------------------------
+//
+void CRsfwRfeStateMachine::ChangeState(CRsfwRfeStateMachine::TState* aNextState)
+    {
+    DEBUGSTRING(("CRsfwRfeStateMachine::ChangeState"));
+    if (iState && (iState != aNextState) )
+        {
+        delete iState;
+        iState = NULL;
+        }
+    EnterState(aNextState);
+    }
+
+// ----------------------------------------------------------------------------
+// CRsfwRfeStateMachine::EnterState
+// Enters aNextState, and makes it our current state.
+// ----------------------------------------------------------------------------
+//
+void CRsfwRfeStateMachine::EnterState(CRsfwRfeStateMachine::TState* aNextState)
+    {
+    DEBUGSTRING(("CRsfwRfeStateMachine::EnterState"));
+    TInt err;
+    while (aNextState) 
+        {// State change required.
+        iState = aNextState;
+        TRAP(err, iState->EnterL());
+        if (err)
+            {
+            aNextState = ErrorOnStateEntry(err);
+            delete iState;
+            iState = NULL;
+            }
+        else
+            {
+            aNextState = NULL;
+            }
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CRsfwRfeStateMachine::SetNextState
+// Sets the current state, but doesn't actually enter it.
+// ----------------------------------------------------------------------------
+//
+void CRsfwRfeStateMachine::SetNextState(TState* aNextState)
+    {
+    DEBUGSTRING(("CRsfwRfeStateMachine::SetNextState"));
+    iState = aNextState;
+    }
+
+// ----------------------------------------------------------------------------
+// CRsfwRfeStateMachine::ReEnterCurrentState
+// Re-enters the state we're currently in.
+// ----------------------------------------------------------------------------
+//
+void CRsfwRfeStateMachine::ReEnterCurrentState()  
+    {
+    DEBUGSTRING(("CRsfwRfeStateMachine::ReEnterCurrentState"));
+    EnterState(iState);
+    }
+
+// ----------------------------------------------------------------------------
+// CRsfwRfeStateMachine::SetRequest
+// Sets the backpointer to our request
+// ----------------------------------------------------------------------------
+//
+void CRsfwRfeStateMachine::SetRequest(CRsfwRfeRequest* aRequest)
+    {
+    DEBUGSTRING(("CRsfwRfeStateMachine::SetRequest"));
+    iRFeRequest = aRequest;
+    }
+    
+// ----------------------------------------------------------------------------
+// CRsfwRfeStateMachine::Request 
+// ----------------------------------------------------------------------------
+//
+CRsfwRfeRequest* CRsfwRfeStateMachine::Request()
+    {
+    DEBUGSTRING(("CRsfwRfeStateMachine::Request"));
+    return iRFeRequest;
+    }
+
+// ----------------------------------------------------------------------------
+// CRsfwRfeStateMachine::SetVolumes
+// ----------------------------------------------------------------------------
+//    
+void CRsfwRfeStateMachine::SetVolumes(CRsfwVolumeTable* aImplementor)
+    {
+    DEBUGSTRING(("CRsfwRfeStateMachine::SetVolumes"));
+    iImplementor = aImplementor;
+    }
+
+// ----------------------------------------------------------------------------
+// CRsfwRfeStateMachine::SetFileEngine
+// ----------------------------------------------------------------------------
+//
+void CRsfwRfeStateMachine::SetFileEngine(CRsfwFileEngine* aFileEngine) 
+    {
+    DEBUGSTRING(("CRsfwRfeStateMachine::SetFileEngine"));
+    iFileEngine = aFileEngine;
+    }
+
+// ----------------------------------------------------------------------------
+// CRsfwRfeStateMachine::SetArguments
+// ----------------------------------------------------------------------------
+//
+void CRsfwRfeStateMachine::SetArguments(TRfeInArgs* aInArgs, TRfeOutArgs* aOutArgs)
+    {
+    DEBUGSTRING(("CRsfwRfeStateMachine::SetArguments"));
+    iInArgs = aInArgs;
+    iOutArgs = aOutArgs;
+    
+    // Set the target node for this operation.
+    if (iInArgs && iFileEngine) 
+        {
+        TFid* fidp = &(iInArgs->iFid);
+        iFep = iFileEngine->iFileTable->Lookup(*fidp);  
+        }
+    else 
+        {
+        iFep = NULL;
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CRsfwRfeStateMachine::Volumes
+// ----------------------------------------------------------------------------
+//    
+CRsfwVolumeTable* CRsfwRfeStateMachine::Volumes()
+    {
+    DEBUGSTRING(("CRsfwRfeStateMachine::Volumes"));
+    return iImplementor;
+    }
+  
+// ----------------------------------------------------------------------------
+// CRsfwRfeStateMachine::FileEngine
+// ----------------------------------------------------------------------------
+//    
+CRsfwFileEngine* CRsfwRfeStateMachine::FileEngine()
+    {
+    return iFileEngine;
+    }
+
+// ----------------------------------------------------------------------------
+// CRsfwRfeStateMachine::Node
+// ----------------------------------------------------------------------------
+//
+CRsfwFileEntry* CRsfwRfeStateMachine::Node() 
+    {
+    return iFep;
+    }
+
+// ----------------------------------------------------------------------------
+// CRsfwRfeStateMachine::ErrorOnStateExit
+// ----------------------------------------------------------------------------
+//
+CRsfwRfeStateMachine::TState* CRsfwRfeStateMachine::ErrorOnStateExit(TInt aError) 
+    {
+    DEBUGSTRING(("CRsfwRfeStateMachine::ErrorOnStateExit %d", aError));
+    iCompleteAndDestroyState->SetErrorCode(aError);
+    return iCompleteAndDestroyState;
+    }
+        
+// ----------------------------------------------------------------------------
+// CRsfwRfeStateMachine::HandleRemoteAccessResponse
+// ----------------------------------------------------------------------------
+//    
+void CRsfwRfeStateMachine::HandleRemoteAccessResponse(TUint /*aId*/, TInt aStatus)
+    {
+    DEBUGSTRING(("CRsfwRfeStateMachine::HandleRemoteAccessResponse"));
+    TState* nextState = NULL;
+    TRAPD(err, nextState = aStatus ? iState->ErrorL(aStatus)
+          : iState->CompleteL());
+    if (err)
+        {
+        nextState = ErrorOnStateExit(err);
+        }
+    ChangeState(nextState);
+    }
+
+// empty defaults for CRsfwRfeStateMachine::TState functions CompleteL(), ErrorL() and Cancel()
+
+// ----------------------------------------------------------------------------
+// CRsfwRfeStateMachine::TState::CompleteL
+// ----------------------------------------------------------------------------
+//
+CRsfwRfeStateMachine::TState* CRsfwRfeStateMachine::TState::CompleteL()
+    {
+    DEBUGSTRING(("CRsfwRfeStateMachine::TState::CompleteL"));
+    return NULL;
+    }
+
+// ----------------------------------------------------------------------------
+// CRsfwRfeStateMachine::TState::ErrorL
+// ----------------------------------------------------------------------------
+//
+CRsfwRfeStateMachine::TState* CRsfwRfeStateMachine::TState::ErrorL(TInt /*aCode*/) 
+    {
+    DEBUGSTRING(("CRsfwRfeStateMachine::TState::ErrorL"));
+    return NULL;
+    }
+
+// ----------------------------------------------------------------------------
+// CRsfwRfeStateMachine::TState::Cancel
+// ----------------------------------------------------------------------------
+//
+void CRsfwRfeStateMachine::TState::Cancel() 
+    {
+    DEBUGSTRING(("CRsfwRfeStateMachine::TState::Cancel"));
+    }
+
+// ----------------------------------------------------------------------------
+// CRsfwRfeStateMachine::TCompleteAndDestroyState::TCompleteAndDestroyState
+// Completes the remote request with error code aErrCode and
+//  destroys it (CRsfwRfeRequest) 
+// as well as the classes pointed to by it, that it the instances of 
+// CRsfwRfeAsyncOperation, CRsfwRfeStateMachine and CRsfwRfeStateMachine::TState classes.
+//
+// In RemoteFS requests error code is 0,
+// as the error is returned in iOutArgs->iResult
+// For RemoteEngine API requests aErrCode should have the error code
+// ----------------------------------------------------------------------------
+//
+CRsfwRfeStateMachine::
+TCompleteAndDestroyState::TCompleteAndDestroyState(CRsfwRfeStateMachine* aParent,
+                                                   TInt aErrCode)
+    : iOperation(aParent), iErrCode(aErrCode)
+    {
+    DEBUGSTRING(("TCompleteAndDestroyState::TCompleteAndDestroyState"));
+    }
+
+// ----------------------------------------------------------------------------
+// CRsfwRfeStateMachine::TCompleteAndDestroyState::EnterL
+// ----------------------------------------------------------------------------
+//
+void CRsfwRfeStateMachine::TCompleteAndDestroyState::EnterL()
+    {
+    DEBUGSTRING(("CRsfwRfeStateMachine::TCompleteAndDestroyState::EnterL"));
+    iOperation->Request()->CompleteAndDestroy(iErrCode);   
+    // nothing can be called here as we have been deallocated!!!    
+    }
+
+// ----------------------------------------------------------------------------
+// CRsfwRfeStateMachine::TCompleteAndDestroyState::SetErrorCode
+// ----------------------------------------------------------------------------
+//
+void CRsfwRfeStateMachine::TCompleteAndDestroyState::SetErrorCode(TInt aErrorCode) 
+    {
+    DEBUGSTRING(("CRsfwRfeStateMachine::TCompleteAndDestroyState::SetErrorCode"));
+    iErrCode = aErrorCode;
+    }
+