diff -r 88ee4cf65e19 -r 1aa8c82cb4cb remotestoragefw/remotefileengine/src/rsfwrenamefilestatemachine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/remotestoragefw/remotefileengine/src/rsfwrenamefilestatemachine.cpp Wed Sep 01 12:15:08 2010 +0100 @@ -0,0 +1,296 @@ +/* +* 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 renaming files +* +*/ + + +#include "rsfwrenamefilestatemachine.h" +#include "rsfwfileentry.h" +#include "rsfwfiletable.h" +#include "rsfwfileengine.h" +#include "rsfwlockmanager.h" +#include "mdebug.h" + + +// ---------------------------------------------------------------------------- +// CRsfwRenameFileStateMachine::CRsfwRenameFileStateMachine +// ---------------------------------------------------------------------------- +// +CRsfwRenameFileStateMachine::CRsfwRenameFileStateMachine() + { + } + +// ---------------------------------------------------------------------------- +// CRsfwRenameFileStateMachine::~CRsfwRenameFileStateMachine +// ---------------------------------------------------------------------------- +// +CRsfwRenameFileStateMachine::~CRsfwRenameFileStateMachine() + { + delete iLockToken; + } + +// ---------------------------------------------------------------------------- +// CRsfwRenameFileStateMachine::CompleteRequestL +// ---------------------------------------------------------------------------- +// +CRsfwRfeStateMachine::TState* +CRsfwRenameFileStateMachine::CompleteRequestL(TInt aError) + { + if (iSrcKidCreated) + { + if (aError) + { + delete iSrcKidFep; + iSrcKidFep = NULL; + } + } + if (iDstKidCreated) + { + delete iDstKidFep; + iDstKidFep = NULL; + } + + // it may happen that the new name is equal to iLastFailedLookup value + FileEngine()->ResetFailedLookup(); + + CompleteAndDestroyState()->SetErrorCode(aError); + return CompleteAndDestroyState(); + } + + + +// Rename the file + +// ---------------------------------------------------------------------------- +// CRsfwRenameFileStateMachine::TRenameFileState::TRenameFileState +// ---------------------------------------------------------------------------- +// +CRsfwRenameFileStateMachine:: +TRenameFileState::TRenameFileState(CRsfwRenameFileStateMachine* aParent) + : iOperation(aParent) + { + } + +// ---------------------------------------------------------------------------- +// CRsfwRenameFileStateMachine::TRenameFileState::EnterL +// ---------------------------------------------------------------------------- +// +void CRsfwRenameFileStateMachine::TRenameFileState::EnterL() + { + // rename or replace + TRfeRenameInArgs* inArgs = + static_cast(iOperation->iInArgs); + iOperation->iOverWrite = inArgs->iOverWrite; + + TFid* dstParentFidp = &(inArgs->iDstFid); + TPtrC16 srcKidName(inArgs->iSrcName); + iOperation->iDstKidName.Set(inArgs->iDstName); + + // Get the parent from which we are removing + if (!iOperation->Node()) + { + User::Leave(KErrNotFound); + } + + // Get the parent to which we are removing + iOperation->iDstParentFep = + iOperation->FileEngine()->iFileTable->Lookup(*dstParentFidp); + if (!iOperation->iDstParentFep) + { + User::Leave(KErrNotFound); + } + + // Do we know the target kid yet? + iOperation->iDstKidFep = + iOperation->iDstParentFep->FindKidByName(iOperation->iDstKidName); + if (!iOperation->iDstKidFep) + { + // Create a temporary file entry for building the full path + iOperation->iDstKidFep = + CRsfwFileEntry::NewL(iOperation->iDstKidName, + iOperation->iDstParentFep); + iOperation->iDstKidCreated = ETrue; + } + + // Do we know the source kid yet? + iOperation->iSrcKidFep = iOperation->Node()->FindKidByName(srcKidName); + if (!iOperation->iSrcKidFep) + { + iOperation->iSrcKidFep = CRsfwFileEntry::NewL(srcKidName, + iOperation->Node()); + iOperation->iSrcKidCreated = ETrue; + } + + if (!iOperation->FileEngine()->Disconnected()) + { + // Do the rename + HBufC* srcKidPath = + iOperation->FileEngine()->FullNameLC(*iOperation->iSrcKidFep); + if ((*iOperation->iSrcKidFep).Type() == KNodeTypeDir) + { // if source is a directory, make sure the name ends with a slash + if ((*srcKidPath)[(srcKidPath->Length() - 1)] != '/') + { + TPtr srcKidAppend = srcKidPath->Des(); + srcKidAppend.Append('/'); + } + } + + HBufC* dstKidPath = + iOperation->FileEngine()->FullNameLC(*iOperation->iDstKidFep); + if ((*iOperation->iDstKidFep).Type() == KNodeTypeDir) + { // if source is a directory, make sure the name ends with a slash + if ((*dstKidPath)[(dstKidPath->Length() -1)] != '/') + { + TPtr dstKidAppend = dstKidPath->Des(); + dstKidAppend.Append('/'); + } + } + iOperation-> + FileEngine()-> + RemoteAccessL()->RenameL(*srcKidPath, + *dstKidPath, + iOperation->iOverWrite, + iOperation); + CleanupStack::PopAndDestroy(2, srcKidPath); // dstKidPath, srcKidPath + } + } + +// ---------------------------------------------------------------------------- +// CRsfwRenameFileStateMachine::TRenameFileState::CompleteL +// ---------------------------------------------------------------------------- +// +CRsfwRenameFileStateMachine::TState* +CRsfwRenameFileStateMachine::TRenameFileState::CompleteL() + { + if (!iOperation->iSrcKidCreated) + { + // If we didn't create the srcKidFep, + // we must remove it from parent's list + iOperation->Node()->RemoveKidL(iOperation->iSrcKidFep); + } + else + { + // Enter source into the file table + iOperation->Node()->iFileTable->AddL(iOperation->iSrcKidFep); + } + + if (!iOperation->iDstKidCreated) + { + // If we didn't create the dstKidFep, we must remove and destroy it + // unless the node has a removed marking set + // (should not happen, except for removed nodes) + iOperation->FileEngine()->iFileTable->RemoveL(iOperation->iDstKidFep); + delete iOperation->iDstKidFep; + iOperation->iDstKidFep = NULL; + } + + // Change srcKidFep's name, + // and insert the fep into the dstParentFep directory + iOperation->iSrcKidFep->RenameL(iOperation->iDstKidName); + iOperation->iDstParentFep->AddKid(*iOperation->iSrcKidFep); + + // Refresh both parent directories + iOperation->Node()->SetLocallyDirty(); + if (iOperation->Node() != iOperation->iDstParentFep) + { + iOperation->Node()->SetLocallyDirty(); + } + + return new CRsfwRenameFileStateMachine::TAcquireLockState(iOperation); + } + +// ---------------------------------------------------------------------------- +// CRsfwRenameFileStateMachine::TRenameFileState::ErrorL +// ---------------------------------------------------------------------------- +// +CRsfwRenameFileStateMachine::TState* +CRsfwRenameFileStateMachine::TRenameFileState::ErrorL(TInt aCode) + { + DEBUGSTRING(("remote rename failed")); + return iOperation->CompleteRequestL(aCode); + } + +// ---------------------------------------------------------------------------- +// CRsfwRenameFileStateMachine::TAcquireLockState::TAcquireLockState +// ---------------------------------------------------------------------------- +// +CRsfwRenameFileStateMachine:: +TAcquireLockState::TAcquireLockState(CRsfwRenameFileStateMachine* aParent) + { + iOperation = aParent; + iRequestedLock = EFalse; + } + +// ---------------------------------------------------------------------------- +// CRsfwRenameFileStateMachine::TAcquireLockState::EnterL +// ---------------------------------------------------------------------------- +// +void CRsfwRenameFileStateMachine::TAcquireLockState::EnterL() + { + if (!iOperation->FileEngine()->WriteDisconnected()) + { + // Now we have updated everything necessary in iSrcKidFep + // possibly lock timer is ticking with etc. + // However, at least WebDAV does not lock the new file in move, + // so if the old file was locked we need to tell + // the access protocol plug-in that it must lock the new file. + if (iOperation->iSrcKidFep->IsLocked()) + { + iOperation->iSrcKidFep->iLockTimer->Cancel(); + iOperation->FileEngine()->LockManager()-> + ObtainLockL(iOperation->iSrcKidFep, + EFileWrite, + iOperation->iLockToken, + iOperation); + iRequestedLock = ETrue; + } + else + { + iOperation->HandleRemoteAccessResponse(0, KErrNone); + } + } + else + { + iOperation->HandleRemoteAccessResponse(0, KErrNone); + } + } + +// ---------------------------------------------------------------------------- +// CRsfwRenameFileStateMachine::TAcquireLockState::CompleteL +// ---------------------------------------------------------------------------- +// +CRsfwRenameFileStateMachine::TState* +CRsfwRenameFileStateMachine::TAcquireLockState::CompleteL() + { + if (iRequestedLock) + { + iOperation-> + iSrcKidFep->SetLockedL(iOperation->FileEngine()->LockManager(), + iOperation->iLockToken); + iOperation->iLockToken = NULL; + } + return iOperation->CompleteRequestL(KErrNone); + } + +// ---------------------------------------------------------------------------- +// CRsfwRenameFileStateMachine::TAcquireLockState::ErrorL +// ---------------------------------------------------------------------------- +// +CRsfwRenameFileStateMachine::TState* +CRsfwRenameFileStateMachine::TAcquireLockState::ErrorL(TInt aCode) + { + return iOperation->CompleteRequestL(aCode); + } +