remotestoragefw/remotefileengine/src/rsfwrenamefilestatemachine.cpp
branchRCL_3
changeset 16 1aa8c82cb4cb
parent 0 3ad9d5175a89
--- /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<TRfeRenameInArgs*>(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);   
+    }
+