diff -r 000000000000 -r 3ad9d5175a89 remotestoragefw/remotefileengine/src/rsfwgetattributesstatemachine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/remotestoragefw/remotefileengine/src/rsfwgetattributesstatemachine.cpp Thu Dec 17 09:07:59 2009 +0200 @@ -0,0 +1,226 @@ +/* +* 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 getting attributes of a file +* +*/ + + +#include "rsfwgetattributesstatemachine.h" +#include "rsfwopenbypathstatemachine.h" +#include "rsfwinterface.h" +#include "rsfwrferequest.h" +#include "rsfwrfeoperation.h" +#include "rsfwfileentry.h" +#include "rsfwfileengine.h" +#include "mdebug.h" +#include "rsfwdirentattr.h" +#include "rsfwvolumetable.h" + +// ---------------------------------------------------------------------------- +// CRsfwGetAttributesStateMachine::CRsfwGetAttributesStateMachine +// ---------------------------------------------------------------------------- +// +CRsfwGetAttributesStateMachine::CRsfwGetAttributesStateMachine() + { + } + +// ---------------------------------------------------------------------------- +// CRsfwGetAttributesStateMachine::CompleteRequestL +// ---------------------------------------------------------------------------- +// +CRsfwRfeStateMachine::TState* CRsfwGetAttributesStateMachine::CompleteRequestL(TInt aError) + { + TRfeGetAttrOutArgs* outArgs = static_cast(iOutArgs); + + if (!aError) + { + outArgs->iAttr.iAtt = Node()->Att(); + outArgs->iAttr.iSize = Node()->Size(); + outArgs->iAttr.iModified = Node()->Modified(); + } + + CompleteAndDestroyState()->SetErrorCode(aError); + return CompleteAndDestroyState(); + } + +// ---------------------------------------------------------------------------- +// CRsfwGetAttributesStateMachine::TRefreshAttributesState::TRefreshAttributesState +// ---------------------------------------------------------------------------- +// +CRsfwGetAttributesStateMachine:: +TRefreshAttributesState:: +TRefreshAttributesState(CRsfwAttributeRefreshingStateMachine* aParent) + : iOperation(aParent) + { + } + +// ---------------------------------------------------------------------------- +// CRsfwGetAttributesStateMachine::TRefreshAttributesState::EnterL +// ---------------------------------------------------------------------------- +// +void CRsfwGetAttributesStateMachine::TRefreshAttributesState::EnterL() + { + DEBUGSTRING(("CRsfwGetAttributesStateMachine::TRefreshAttributesState::EnterL")); + TInt err = KErrNone; + + if (iOperation->Node()) + { + DEBUGSTRING(("getting attributes of fid %d", + iOperation->Node()->Fid().iNodeId)); + + // as the entry is "needed" move it to the back of metadata LRU list + iOperation->Volumes()->MoveToTheBackOfMetadataLRUPriorityListL(iOperation->Node()); + + if (!(iOperation->FileEngine()->UseCachedAttributes(*iOperation->Node()))) + { + // If we find the file entry and + // the time window to use cached attributes has passed. + // Store the old attributes + delete iOperation->iDirEntAttrOld; + iOperation->iDirEntAttrOld = NULL; + iOperation->iDirEntAttrOld = CRsfwDirEntAttr::NewL(); + iOperation->Node()->GetAttributesL(*iOperation->iDirEntAttrOld); + if (!iOperation->FileEngine()->WriteDisconnected()) + { + iOperation->FileEngine()->GetAttributesL( + *(iOperation->Node()), + iOperation->iDirEntAttr, + iOperation->Node()->Type(), + iOperation); + } + else + { + iOperation->HandleRemoteAccessResponse(0, KUpdateNotRequired); + } + if (err) + { + User::Leave(err); + } + } + else + { + // use cached attributes + iOperation->HandleRemoteAccessResponse(0, KUpdateNotRequired); + } + } + else + { + User::Leave(KErrPathNotFound); + } + } + +// ---------------------------------------------------------------------------- +// CRsfwGetAttributesStateMachine::TRefreshAttributesState::CompleteL +// ---------------------------------------------------------------------------- +// +CRsfwGetAttributesStateMachine::TState* +CRsfwGetAttributesStateMachine::TRefreshAttributesState::CompleteL() + { + + DEBUGSTRING(("TRefreshAttributesState::CompleteL for fid %d", + iOperation->Node()->Fid().iNodeId)); + + // from CRsfwFileEngine::UpdateAttributes() + iOperation->Node()->SetAttributesL(*iOperation->iDirEntAttr, ETrue); + + if (iOperation->Node()->IsOpenedForWriting()) + { + iOperation->Node()->iUseCachedData = ETrue; + } + else if (iOperation->FileEngine()->DataChanged(*iOperation->iDirEntAttrOld, + *iOperation->iDirEntAttr)) + { + // discard the old cache file + // this will also call SetCached(EFalse) etc... + iOperation->Node()->RemoveCacheFile(); + } + + DEBUGSTRING(("Attributes: attr=0x%x, size=%d, time=", + iOperation->Node()->Att(), + iOperation->Node()->Size())); + DEBUGTIME((iOperation->Node()->Modified())); + + // from CRsfwFileEngine::UpdateFileAttributes/UpdateDirAttributes + return CompleteOurRequestL(KErrNone); + } + +// ---------------------------------------------------------------------------- +// CRsfwGetAttributesStateMachine::TRefreshAttributesState::ErrorL +// ---------------------------------------------------------------------------- +// +CRsfwGetAttributesStateMachine::TState* +CRsfwGetAttributesStateMachine::TRefreshAttributesState::ErrorL(TInt aCode) + { + DEBUGSTRING(("CRsfwGetAttributesStateMachine::TRefreshAttributesState::ErrorL %d", aCode)); + if (aCode == KUpdateNotRequired) + { + // note that we should NOT set iUseCachedData to ETrue here + // (if it is false, only after fetch it should be set to true + // , or openbypath if we are writing to the file) + aCode = KErrNone; + + DEBUGSTRING(("update was not required")); + + DEBUGSTRING(("Attributes: attr=0x%x, size=%d, time=", + iOperation->Node()->Att(), + iOperation->Node()->Size())); + DEBUGTIME((iOperation->Node()->Modified())); + + } + else + { + // from CRsfwFileEngine::UpdateAttributes() + if (!(iOperation->Node()->IsOpenedForWriting())) + { + // "iOperation->Node()" has been removed from the server?? + // : remove FEP here + iOperation->Node()->RemoveCacheFile(); + } + } + return CompleteOurRequestL(aCode); + } + +// ---------------------------------------------------------------------------- +// CRsfwGetAttributesStateMachine::TRefreshAttributesState::CompleteOurRequestL +// ---------------------------------------------------------------------------- +// +CRsfwGetAttributesStateMachine::TState* +CRsfwGetAttributesStateMachine::TRefreshAttributesState::CompleteOurRequestL(TInt aCode) + { + if (iOperation->Request()->Operation()->Function() == EGetAttr) + { + // we are running in GetAttr() + return iOperation->CompleteRequestL(aCode); + } + else if (iOperation->Request()->Operation()->Function() == EOpenByPath) + { + // we are running in OpenByPath() + if (aCode == KErrNone) + { + return new (ELeave) CRsfwOpenByPathStateMachine::TRequestOpenModeState( + (CRsfwOpenByPathStateMachine *)iOperation); + } + else + { + // attributes expired, refrshing them failed, do not open the file + return iOperation->CompleteRequestL(aCode); + } + } + else + { + return NULL; + } + } + +