remotestoragefw/remotefileengine/src/rsfwflushstatemachine.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 09:07:59 +0200
changeset 0 3ad9d5175a89
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* Copyright (c) 2007 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 fetching data without caching it permanently
*
*/


#include "rsfwflushstatemachine.h"
#include "rsfwinterface.h"
#include "rsfwfileentry.h"
#include "rsfwfileengine.h"
#include "rsfwrfeserver.h"
#include "rsfwvolumetable.h"
#include "rsfwfiletable.h"
#include "rsfwwaitnotemanager.h"
#include "rsfwvolume.h"
#include "mdebug.h"


// ----------------------------------------------------------------------------
// CRsfwFlushStateMachine::CRsfwFlushStateMachine
// ----------------------------------------------------------------------------
//
CRsfwFlushStateMachine::CRsfwFlushStateMachine()
    {
    }

// ----------------------------------------------------------------------------
// CRsfwFlushStateMachine::CompleteRequestL
// ----------------------------------------------------------------------------
//
CRsfwRfeStateMachine::TState*
CRsfwFlushStateMachine::CompleteRequestL(TInt aError) 
    {
     DEBUGSTRING(("CRsfwFlushStateMachine::CompleteRequestL()"));
    // If we just wrote the file to the server set attributes from the cache
    // file's attributes.Even if writing the file failed, attributes should
    // reflect the local modifications
    if (Node()->CacheFileName())
        {
        FileEngine()->SetupAttributes(*Node());
        }
        
    CompleteAndDestroyState()->SetErrorCode(aError);
    return CompleteAndDestroyState();   
    } 

// ----------------------------------------------------------------------------
// CRsfwFlushStateMachine::TFlushDataToServerState::TFlushDataToServerState
// ----------------------------------------------------------------------------
//
CRsfwFlushStateMachine::TFlushDataToServerState::TFlushDataToServerState(
    CRsfwFlushStateMachine* aParent)
    : iOperation(aParent)
    {
    }

// ----------------------------------------------------------------------------
// CRsfwFlushStateMachine::TFlushDataToServerState::EnterL
// ----------------------------------------------------------------------------
//
void CRsfwFlushStateMachine::TFlushDataToServerState::EnterL() 
    {
    DEBUGSTRING(("CRsfwFlushStateMachine::TFlushDataToServerState::EnterL()"));
    
    TDesC* cacheNamep;
    if (!iOperation->Node())
        {
        User::Leave(KErrNotFound);
        }

    TRfeFlushInArgs* inArgs =
        static_cast<TRfeFlushInArgs*>(iOperation->iInArgs);
    
    
    if (iOperation->Node()->IsCancelled()) 
        {
        // user has cancelled writing this file to server even before we got to flush
        // (when the file was being written to the local cache)
        iOperation->HandleRemoteAccessResponse(0, KErrCancel);
        }
    else 
        {
        TInt firstByte = inArgs->iFirstByte;
        TInt dataLength = inArgs->iDataLength;
        TInt totalSize = inArgs->iTotalSize;  
     
        cacheNamep = iOperation->Node()->CacheFileName();
    
        _LIT8(KTextPlain, "text/plain");
        HBufC* fullName =
            iOperation->FileEngine()->FullNameLC(*(iOperation->Node()));
            
    
        // get the MIME-type of the file
        HBufC8* contentType = iOperation->FileEngine()->GetContentType(*cacheNamep);
    
        if (contentType) 
            {
            CleanupStack::PushL(contentType);  
            }
        else 
            {
            contentType = KTextPlain().AllocLC();
            }
        
        if  ((firstByte == 0) &&
            (dataLength == totalSize)) 
            {
            // non-partial put
            TUint transactionId 
                = iOperation->FileEngine()->RemoteAccessL()->PutFileL(*cacheNamep,
                                                            *fullName,
                                                            *contentType,
                                                            iOperation);
        
            }
        else 
            {
            // partial put
            TUint transactionId 
            = iOperation->FileEngine()->RemoteAccessL()->PutFileL(*cacheNamep,
                                                            *fullName,
                                                            *contentType,
                                                            firstByte,
                                                   dataLength-firstByte,
                                                            totalSize,
                                                            iOperation);
            }
 
        CleanupStack::PopAndDestroy(2); // fullName, contentType        
        }

    }

// ----------------------------------------------------------------------------
// CRsfwFlushStateMachine::TFlushDataToServerState::CompleteL
// ----------------------------------------------------------------------------
//
CRsfwRfeStateMachine::TState*
CRsfwFlushStateMachine::TFlushDataToServerState::CompleteL()
    {  
    DEBUGSTRING(("CRsfwFlushStateMachine::TFlushDataToServerState::CompleteL()"));
  	return iOperation->CompleteRequestL(KErrNone); 
    }

// ----------------------------------------------------------------------------
// CRsfwFlushStateMachine::TFlushDataToServerState::ErrorL
// ----------------------------------------------------------------------------
//    
CRsfwRfeStateMachine::TState*
CRsfwFlushStateMachine::TFlushDataToServerState::ErrorL(TInt aCode)
    {
    DEBUGSTRING(("CRsfwFlushStateMachine::TFlushDataToServerState::ErrorL() %d", aCode));
  	return iOperation->CompleteRequestL(aCode); 
    }


// End of file