--- /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);
+ }
+