--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/remotestoragefw/remotefileengine/src/rsfwmkdirstatemachine.cpp Wed Sep 01 12:15:08 2010 +0100
@@ -0,0 +1,223 @@
+/*
+* 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 creating directories
+*
+*/
+
+
+#include "rsfwmkdirstatemachine.h"
+#include "rsfwfileentry.h"
+#include "rsfwfiletable.h"
+#include "rsfwinterface.h"
+#include "rsfwfileengine.h"
+#include "mdebug.h"
+#include "rsfwdirentattr.h"
+#include "rsfwvolumetable.h"
+
+// Make dir
+
+// ----------------------------------------------------------------------------
+// CRsfwMkDirStateMachine::CRsfwMkDirStateMachine
+// ----------------------------------------------------------------------------
+//
+CRsfwMkDirStateMachine::CRsfwMkDirStateMachine()
+ {
+ }
+
+// ----------------------------------------------------------------------------
+// CRsfwMkDirStateMachine::~CRsfwMkDirStateMachine
+// ----------------------------------------------------------------------------
+//
+CRsfwMkDirStateMachine::~CRsfwMkDirStateMachine()
+ {
+ delete iDirEntAttr;
+ }
+
+// ----------------------------------------------------------------------------
+// CRsfwMkDirStateMachine::CompleteRequestL
+// ----------------------------------------------------------------------------
+//
+CRsfwRfeStateMachine::TState* CRsfwMkDirStateMachine::CompleteRequestL(TInt aError)
+ {
+ if (iKidCreated && aError)
+ {
+ if ( aError == KErrNotFound )
+ {
+ User::Leave( KErrNotFound );
+ }
+ delete iKidFep;
+ iKidFep = NULL;
+ }
+
+ // it may happen by chance that the new name is equal to iLastFailedLookup value
+ FileEngine()->ResetFailedLookup();
+
+ CompleteAndDestroyState()->SetErrorCode(aError);
+ return CompleteAndDestroyState();
+ }
+
+
+
+// Check if exists
+
+
+// ----------------------------------------------------------------------------
+// CRsfwMkDirStateMachine::TCheckIfExistsState::TCheckIfExistsState
+// ----------------------------------------------------------------------------
+//
+CRsfwMkDirStateMachine::
+TCheckIfExistsState::TCheckIfExistsState(CRsfwMkDirStateMachine* aParent)
+ : iOperation(aParent)
+ {
+ }
+
+// ----------------------------------------------------------------------------
+// CRsfwMkDirStateMachine::TCheckIfExistsState::EnterL
+// ----------------------------------------------------------------------------
+//
+void CRsfwMkDirStateMachine::TCheckIfExistsState::EnterL()
+ {
+ TRfeMkdirInArgs* inArgs =
+ static_cast<TRfeMkdirInArgs*>(iOperation->iInArgs);
+ TPtrC kidName(inArgs->iEntry.iName);
+
+ iOperation->iKidFep = NULL;
+ iOperation->iKidCreated = EFalse;
+
+ // the parent to which we are making
+ if (!iOperation->Node())
+ {
+ User::Leave(KErrNotFound);
+ }
+
+ DEBUGSTRING16(("making directory '%S' in fid %d",
+ &kidName,
+ iOperation->Node()->Fid().iNodeId));
+
+ // Do we know about the kid yet?
+ iOperation->iKidFep = iOperation->Node()->FindKidByName(kidName);
+ if (!iOperation->iKidFep)
+ {
+ // This is either a completely new directory,
+ // or a directory that we have not yet created a file entry for.
+ // (should always happen)
+ if (!iOperation->Volumes()->EnsureMetadataCanBeAddedL(iOperation->Node()))
+ {
+ User::Leave(KErrNoMemory);
+ }
+ iOperation->iKidFep = CRsfwFileEntry::NewL(kidName, iOperation->Node());
+ iOperation->iKidCreated = ETrue;
+ }
+
+ iOperation->FileEngine()->GetAttributesL(*iOperation->iKidFep,
+ iOperation->iDirEntAttr,
+ KNodeTypeDir,
+ iOperation);
+ }
+
+// ----------------------------------------------------------------------------
+// CRsfwMkDirStateMachine::TCheckIfExistsState::CompleteL
+// ----------------------------------------------------------------------------
+//
+CRsfwMkDirStateMachine::TState*
+CRsfwMkDirStateMachine::TCheckIfExistsState::CompleteL()
+ {
+ // GetAttributes returned KErrNone
+ // directory exist and we return KErrAlreadyExitsts
+ return iOperation->CompleteRequestL(KErrAlreadyExists);
+ }
+
+// ----------------------------------------------------------------------------
+// CRsfwMkDirStateMachine::TCheckIfExistsState::ErrorL
+// ----------------------------------------------------------------------------
+//
+CRsfwMkDirStateMachine::TState*
+CRsfwMkDirStateMachine::TCheckIfExistsState::ErrorL(TInt /*aCode*/)
+ {
+ // GetAttributes returned error -
+ // directory does not exists, let's create it
+
+ return new CRsfwMkDirStateMachine::TMakeDirectoryState(iOperation);
+ }
+
+
+
+// Make directory
+
+// ----------------------------------------------------------------------------
+// CRsfwMkDirStateMachine::TMakeDirectoryState::TMakeDirectoryState
+// ----------------------------------------------------------------------------
+//
+CRsfwMkDirStateMachine::
+TMakeDirectoryState::TMakeDirectoryState(CRsfwMkDirStateMachine* aParent)
+ : iOperation(aParent)
+ {
+ }
+
+// ----------------------------------------------------------------------------
+// CRsfwMkDirStateMachine::TMakeDirectoryState::EnterL
+// ----------------------------------------------------------------------------
+//
+void CRsfwMkDirStateMachine::TMakeDirectoryState::EnterL()
+ {
+ // Make the directory
+ if (!iOperation->FileEngine()->Disconnected())
+ {
+ HBufC* kidPath =
+ iOperation->FileEngine()->FullNameLC(*iOperation->iKidFep);
+ iOperation->FileEngine()->RemoteAccessL()->MakeDirectoryL(*kidPath,
+ iOperation);
+ CleanupStack::PopAndDestroy(kidPath);
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CRsfwMkDirStateMachine::TMakeDirectoryState::CompleteL
+// ----------------------------------------------------------------------------
+//
+CRsfwMkDirStateMachine::TState*
+CRsfwMkDirStateMachine::TMakeDirectoryState::CompleteL()
+ {
+ iOperation->iKidFep->SetType(KNodeTypeDir);
+ iOperation->FileEngine()->SetupAttributes(*iOperation->iKidFep);
+
+ // Attach the kid
+ if (iOperation->iKidCreated)
+ {
+ iOperation->FileEngine()->iFileTable->AddL(iOperation->iKidFep);
+ iOperation->Node()->AddKid(*iOperation->iKidFep);
+ }
+
+ // Create an empty container file locally
+ iOperation->FileEngine()->CreateContainerFileL(*iOperation->iKidFep);
+ iOperation->iKidFep->SetCached(ETrue);
+ iOperation->iKidFep->SetAttribValidationTime();
+
+ // Refresh parent directory next time it is accessed
+ iOperation->Node()->SetLocallyDirty();
+
+ return iOperation->CompleteRequestL(KErrNone);
+ }
+
+// ----------------------------------------------------------------------------
+// CRsfwMkDirStateMachine::TMakeDirectoryState::ErrorL
+// ----------------------------------------------------------------------------
+//
+CRsfwMkDirStateMachine::TState*
+CRsfwMkDirStateMachine::TMakeDirectoryState::ErrorL(TInt aCode)
+ {
+ DEBUGSTRING(("remote mkdir failed!"));
+ return iOperation->CompleteRequestL(aCode);
+ }
+