remotestoragefw/remotefileengine/src/rsfwmountconnectionstatemachine.cpp
branchRCL_3
changeset 20 1aa8c82cb4cb
parent 0 3ad9d5175a89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotestoragefw/remotefileengine/src/rsfwmountconnectionstatemachine.cpp	Wed Sep 01 12:15:08 2010 +0100
@@ -0,0 +1,174 @@
+/*
+* 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:  State machine for changing mount state, e.g. online->offline
+*
+*/
+
+
+#include "rsfwmountconnectionstatemachine.h"
+#include "rsfwvolumetable.h"
+#include "rsfwfileengine.h"
+#include "rsfwfiletable.h"
+#include "rsfwlockmanager.h"
+#include "rsfwwaitnotemanager.h"
+#include "mdebug.h"
+#include "rsfwrfeserver.h"
+
+/**********************************************************
+ * CRsfwMountConnectionStateMachine
+ *
+ * If connect to server fails, deletes the remote accessor 
+ * (this comes from the way synch version fo CRsfwFileEngine::ConnectL() used to
+ * to work, but I'm not quite sure how correct behaviour this is).
+ * Note that EnteredConnectionState() in CompleteL
+ * may start reintegration.
+ * However instead of writing special reintegration states here
+ * it is better to later implement a reintegration thred.
+ *********************************************************/
+
+
+// ----------------------------------------------------------------------------
+// CRsfwMountConnectionStateMachine::CRsfwMountConnectionStateMachine
+// ----------------------------------------------------------------------------
+// 
+CRsfwMountConnectionStateMachine::CRsfwMountConnectionStateMachine(TChar aDriveLetter,
+                                                           TUint aState)
+    {
+    iDriveLetter = aDriveLetter;
+    iState = aState;
+    }
+
+
+// ----------------------------------------------------------------------------
+// CRsfwMountConnectionStateMachine::TChangeConnectionState::TChangeConnectionState
+// ----------------------------------------------------------------------------
+//  
+CRsfwMountConnectionStateMachine::TChangeConnectionState::TChangeConnectionState(
+    CRsfwMountConnectionStateMachine* aParent)
+    : iOperation(aParent)
+    {}
+
+// ----------------------------------------------------------------------------
+// CRsfwMountConnectionStateMachine::TChangeConnectionState::EnterL
+// ----------------------------------------------------------------------------
+// 
+void CRsfwMountConnectionStateMachine::TChangeConnectionState::EnterL()
+    {   
+    // The user has forced us to go offline/online
+    iVolume =
+        iOperation->Volumes()->VolumeByDriveLetter(iOperation->iDriveLetter);
+    if (iVolume)
+        {
+        DEBUGSTRING(("Set state of volume %d to %d",
+                     iVolume->iMountInfo.iMountStatus.iVolumeId,
+                     iOperation->iState));
+
+        // Note that eventually the volume state may differ
+        // from the engine state
+        if ((iVolume->iFileEngine->ConnectionState() == KMountStronglyConnected)
+            && (iOperation->iState == KMountNotConnected))
+            {
+            // request to move from connected to disconnected state
+            // warn user if this volume contains open files
+           if (iVolume->iFileEngine->iFileTable->OpenFileCount() > 0) 
+                {
+                iOperation->Volumes()->WaitNoteManager()
+                    ->StartWaitNoteL(ERemoteWarnDisconnect, iOperation);  
+                }
+           else 
+                {
+                // actual move happens in CRsfwMountConnectionStateMachine::TChangeConnectionState::CompleteL
+                iOperation->HandleRemoteAccessResponse(0, KErrNone);     
+                }
+            
+            }
+        else 
+            {
+            // currently setting mount state to Connected state not supported
+            // but user is assumed to use Mount() instead
+            // this used to work, but authentication options and retry dialogs
+            // are now missing
+            User::Leave(KErrNotSupported);                                
+            }
+        }
+    else 
+        {
+        if (iOperation->iState == KMountNotConnected) 
+            {
+            // when volume is not yet found, we execute dormant mount
+            TInt err;
+            TInt drivenumber;
+            TRsfwMountConfig mountConfig;
+            CRsfwRfeServer::Env()->iFs.CharToDrive(iOperation->iDriveLetter, drivenumber);
+            mountConfig.iDriveLetter = iOperation->iDriveLetter;
+            err = iOperation->Volumes()->GetMountConfigL(mountConfig);
+            if (!err) 
+                {
+                iOperation->Volumes()->MountDormantL(mountConfig, drivenumber);
+                iOperation->HandleRemoteAccessResponse(0, KErrNone);     
+                }
+            else 
+                {
+                iOperation->HandleRemoteAccessResponse(0, err); 
+                }
+            }
+        else 
+            {
+            User::Leave(KErrNotSupported);  
+            }
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CRsfwMountConnectionStateMachine::TChangeConnectionState::CompleteL
+// ----------------------------------------------------------------------------
+//     
+CRsfwMountConnectionStateMachine::TState*
+CRsfwMountConnectionStateMachine::TChangeConnectionState::CompleteL()
+    {  
+    // from CRsfwFileEngine::RequestConnectionStateL
+    if (iVolume && iVolume->iFileEngine) 
+        {
+        
+        // we successfully disconnected
+        iVolume->iFileEngine->RequestConnectionStateL(
+                     KMountNotConnected,
+                      NULL);
+        
+        if (iVolume->iFileEngine->ConnectionState() != iOperation->iState)
+            {
+            iVolume->iFileEngine->EnteredConnectionStateL(iOperation->iState, EFalse);
+            }
+        }
+    
+    if (iVolume) 
+        {
+        // from CRsfwVolumeTable::SetMountConnectionStateL  
+        iVolume->iMountInfo.iMountStatus.iConnectionState =
+            iVolume->iFileEngine->ConnectionState();     
+        }
+    
+    return iOperation->CompleteRequestL(KErrNone);
+    }
+
+// ----------------------------------------------------------------------------
+// CRsfwMountConnectionStateMachine::TChangeConnectionState::ErrorL
+// ----------------------------------------------------------------------------
+// 
+CRsfwMountConnectionStateMachine::TState*
+CRsfwMountConnectionStateMachine::TChangeConnectionState::ErrorL(TInt aCode)
+    {
+    return iOperation->CompleteRequestL(aCode);
+    }
+