--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/remotestoragefw/remotefileengine/src/rsfwopenbypathstatemachine.cpp Thu Dec 17 09:07:59 2009 +0200
@@ -0,0 +1,254 @@
+/*
+* 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 opening a file or directory
+*
+*/
+
+
+#include "rsfwopenbypathstatemachine.h"
+#include "rsfwfileentry.h"
+#include "rsfwfiletable.h"
+#include "rsfwvolumetable.h"
+#include "rsfwvolume.h"
+#include "rsfwinterface.h"
+#include "rsfwfileengine.h"
+#include "rsfwlockmanager.h"
+#include "mdebug.h"
+
+
+// ----------------------------------------------------------------------------
+// CRsfwOpenByPathStateMachine::CRsfwOpenByPathStateMachine
+// ----------------------------------------------------------------------------
+//
+CRsfwOpenByPathStateMachine::CRsfwOpenByPathStateMachine()
+ {
+ }
+
+// ----------------------------------------------------------------------------
+// CRsfwOpenByPathStateMachine::~CRsfwOpenByPathStateMachine
+// ----------------------------------------------------------------------------
+//
+CRsfwOpenByPathStateMachine::~CRsfwOpenByPathStateMachine()
+ {
+ delete iLockToken;
+ }
+
+// ----------------------------------------------------------------------------
+// CRsfwOpenByPathStateMachine::CompleteRequestL
+// ----------------------------------------------------------------------------
+//
+CRsfwRfeStateMachine::TState*
+CRsfwOpenByPathStateMachine::CompleteRequestL(TInt aError)
+ {
+ DEBUGSTRING(("CRsfwOpenByPathStateMachine::CompleteRequestL %d", aError));
+ TRfeOpenByPathOutArgs* outArgs =
+ static_cast<TRfeOpenByPathOutArgs*>(iOutArgs);
+ if(!aError)
+ {
+ if ((Node()->Type() == KNodeTypeFile) &&
+ iRealOpen)
+ {
+ // file opened successfully and was not already opened in create
+ Node()->iFileTable->UpdateOpenFileCount(1);
+ }
+
+ outArgs->iPath.Copy(*iCacheName);
+ iAttrp->iAtt = Node()->Att();
+ iAttrp->iSize = Node()->Size();
+ iAttrp->iModified = Node()->Modified();
+ }
+
+ CompleteAndDestroyState()->SetErrorCode(aError);
+ return CompleteAndDestroyState();
+ }
+
+// ----------------------------------------------------------------------------
+// CRsfwOpenByPathStateMachine::TRequestOpenModeState::TRequestOpenModeState
+// ----------------------------------------------------------------------------
+//
+CRsfwOpenByPathStateMachine::TRequestOpenModeState::TRequestOpenModeState(
+ CRsfwOpenByPathStateMachine* aParent)
+ : iOperation(aParent)
+ {
+ iRequestedLock = EFalse;
+ }
+
+// ----------------------------------------------------------------------------
+// CRsfwOpenByPathStateMachine::TRequestOpenModeState::EnterL
+// ----------------------------------------------------------------------------
+//
+void CRsfwOpenByPathStateMachine::TRequestOpenModeState::EnterL()
+ {
+
+ DEBUGSTRING(("CRsfwOpenByPathStateMachine::TRequestOpenModeState::EnterL"));
+
+ TRfeOpenByPathInArgs* inArgs =
+ static_cast<TRfeOpenByPathInArgs*>(iOperation->iInArgs);
+ TRfeOpenByPathOutArgs* outArgs =
+ static_cast<TRfeOpenByPathOutArgs*>(iOperation->iOutArgs);
+ iOperation->iRealOpen = inArgs->iTrueOpen;
+ // Use inArgs->iFlags to pass desired locking information
+ iOperation->iFlags = inArgs->iFlags;
+ iOperation->iAttrp = &(outArgs->iAttr);
+
+ if (!iOperation->Node())
+ {
+ User::Leave(KErrNotFound);
+ }
+
+ if (iOperation->Node()->Size() > iOperation->Volumes()->iMaxCacheSize)
+ {
+ DEBUGSTRING(("OPENBYPATH failed: file too large: file size %d, max cache size %d",
+ iOperation->Node()->Size(),
+ iOperation->Volumes()->iMaxCacheSize));
+ User::Leave(KErrTooBig);
+ }
+
+ DEBUGSTRING(("opening fid %d with flags 0x%x",
+ iOperation->Node()->Fid().iNodeId,
+ iOperation->iFlags));
+
+ if (!iOperation->FileEngine()->WriteDisconnected())
+ {
+ if (!(iOperation->Node()->IsLocked()) &&
+ (iOperation->Node()->Type() != KNodeTypeDir) &&
+ (iOperation->iFlags & EFileWrite))
+ {
+ DEBUGSTRING(("requesting lock"));
+ // For the time being
+ // if flag is 0 we are not interested in getting a lock
+ iOperation->FileEngine()->LockManager()->ObtainLockL(
+ iOperation->Node(),
+ iOperation->iFlags,
+ iOperation->iLockToken,
+ iOperation);
+ iRequestedLock = ETrue;
+ }
+ else
+ {
+ // IsLocked() || !(iOperation->iFlags & EFileWrite)
+ iOperation->HandleRemoteAccessResponse(0, KErrNone);
+ }
+ }
+ else
+ {
+ // if WriteDisconnected()
+ iOperation->HandleRemoteAccessResponse(0, KErrNone);
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CRsfwOpenByPathStateMachine::TRequestOpenModeState::CompleteL
+// ----------------------------------------------------------------------------
+//
+CRsfwOpenByPathStateMachine::TState*
+CRsfwOpenByPathStateMachine::TRequestOpenModeState::CompleteL()
+ {
+ DEBUGSTRING(("CRsfwOpenByPathStateMachine::TRequestOpenModeState::CompleteL"));
+ if (iRequestedLock)
+ {
+ //from CRsfwLockManager::ObtainLock()
+#ifdef _DEBUG
+ TPtrC p = iOperation->Node()->FullNameLC()->Des();
+ DEBUGSTRING16(("ObtainLockL(): flags %d returned %d for file '%S'",
+ iOperation->iFlags,
+ KErrNone,
+ &p));
+ CleanupStack::PopAndDestroy();
+#endif // DEBUG
+ iOperation->Node()->SetLockedL(
+ iOperation->FileEngine()->LockManager(),
+ iOperation->iLockToken);
+ iOperation->iLockToken = NULL;
+ }
+
+ iOperation->iCacheName = iOperation->Node()->CacheFileName();
+
+ // make sure that the relevant cache file is on place
+ // (i.e. it has not been removed e.g. by other apps)
+ iOperation->Node()->ValidateCacheFile();
+
+ if (!iOperation->Node()->IsCached())
+ {
+ if (iOperation->FileEngine()->Disconnected())
+ {
+ if ((iOperation->Node()->Type() != KNodeTypeDir) &&
+ !(iOperation->iFlags & EFileWrite))
+ {
+ // While disconnected,
+ // write access of files returns "not found"
+ return iOperation->CompleteRequestL(KErrNotFound);
+ }
+ }
+ iOperation->FileEngine()->CreateContainerFileL(*(iOperation->Node()));
+ iOperation->iCacheName = iOperation->Node()->CacheFileName();
+ }
+ else // is cached
+ {
+ if (iOperation->Node()->IsLocallyDirty())
+ {
+ // This is a directory which has at least one kid
+ // that has been cached or flushed since the last opening
+ // of the directory
+ iOperation->FileEngine()->UpdateDirectoryContainerL(
+ *(iOperation->Node()));
+ }
+
+ // If this is a cached file,
+ // we must remove it from LRUlist as it is now open
+ if (iOperation->iRealOpen)
+ {
+ iOperation->Node()->iFileTable->Volume()->iVolumeTable->
+ RemoveFromLRUPriorityList(iOperation->Node());
+ }
+ }
+
+ // if file or dir has just been opened, remove it from metadata LRU list
+ iOperation->Node()->iFileTable->Volume()->iVolumeTable->
+ RemoveFromMetadataLRUPriorityList(iOperation->Node());
+
+ return iOperation->CompleteRequestL(KErrNone);
+ }
+
+// ----------------------------------------------------------------------------
+// CRsfwOpenByPathStateMachine::TRequestOpenModeState::ErrorL
+// fileEngine->RequestConnectionStateL() has returned with error
+// ----------------------------------------------------------------------------
+//
+CRsfwOpenByPathStateMachine::TState*
+CRsfwOpenByPathStateMachine::TRequestOpenModeState::ErrorL(TInt aCode)
+ {
+ DEBUGSTRING(("CRsfwOpenByPathStateMachine::TRequestOpenModeState::ErrorL %d", aCode));
+ // from CRsfwFileEngine::DoOpenByPath()
+ if (aCode == KErrNotSupported)
+ {
+ iRequestedLock = EFalse;
+ // locks not supported is not an error state
+ // instead we run the success state...
+ return CompleteL();
+ }
+
+ //from CRsfwLockManager::ObtainLock()
+#ifdef _DEBUG
+ TPtrC p = iOperation->Node()->FullNameLC()->Des();
+ DEBUGSTRING16(("ObtainLockL(): flags %d returned %d for file '%S'",
+ iOperation->iFlags,
+ aCode,
+ &p));
+ CleanupStack::PopAndDestroy();
+#endif
+
+ return iOperation->CompleteRequestL(aCode);
+ }
+