remotestoragefw/webdavaccessplugin/inc/rsfwdavtransaction.h
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) 2002-2004 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:  WebDAV transaction
 *
*/


#ifndef CRSFWDAVTRANSACTION_H
#define CRSFWDAVTRANSACTION_H

// INCLUDES
#include <e32base.h>
#include <uri8.h>
//#include <f32file.h>
//#include <s32file.h>
//#include <http/MHTTPAuthenticationCallback.h>
#include <http/mhttpdatasupplier.h>
//#include <chttpformencoder.h>
#include <http/mhttptransactioncallback.h>

//#include <xml/parser.h>

#include "rsfwdavdefs.h"
//#include "rsfwremoteaccess.h"
//#include "rsfwdavsession.h"

// FORWARD DECLARATIONS
class CRsfwDavSession;
class CRsfwDirEnt;
class CRsfwDavFileInfo;

// CONSTANTS
const TInt KHttpPortNumber  =  80;
const TInt KHttpsPortNumber = 443;
_LIT(KHttpScheme, "http");
_LIT(KHttpsScheme, "https");
_LIT8(KHttpsScheme8, "https");

/**
 *  WebDAV transaction
 *
 *  @lib davaccess.lib
 *  @since Series 60 3.1
 */
class CRsfwDavTransaction: public CBase,
                          public MHTTPTransactionCallback,
                          public MHTTPDataSupplier
                     
    {
public: // Constructors and destructor
    /**
     * Two-phased constructor.
     */
    static CRsfwDavTransaction* NewL(CRsfwDavSession* aWebDavSession,
                                    TWebDavOp aWebDavOp,
                                    const TUriC8& aUri, 
                                    RStringF aMethod,
                                    TUint aTransactionId);
    /**
     * Destructor.
     */
    virtual ~CRsfwDavTransaction();

public: // New functions
    void SetBodyData(HBufC8* aRequestBodyBuffer);
    void SetBodyFileL(const TDesC& aPath, 
                      TInt aOffset, 
                      TInt* aLength,
                      TUint aFlags);
    void SetPropFindPath(HBufC* aPropFindPath);
    void SetPropFindDirEntryArray(RPointerArray<CRsfwDirEnt>& aDirEnts);
    void SubmitL();
    void Cancel();
    void SetDavFileInfoL(CRsfwDavFileInfo** aDavFileInfo, const TDesC& aPath);
    inline RHTTPTransaction HttpTransaction() {return iHttpTransaction;};
    inline TUint Id() {return iTransactionId;};
    inline TInt Status() {return iStatus;};

public: // Functions from base classes
    // From MHTTPTransactionCallback
    void MHFRunL(RHTTPTransaction aTransaction, 
                 const THTTPEvent& aEvent);
    TInt MHFRunError(TInt aError,
                     RHTTPTransaction aTransaction,
                     const THTTPEvent& aEvent);
    
    // From MHTTPDataSupplier
    TBool GetNextDataPart(TPtrC8& aDataPart);
    void ReleaseData();
    TInt OverallDataSize();
    TInt Reset();

private:
    void ConstructL(CRsfwDavSession* aWebDavSession,
                    TWebDavOp aWebDavOp,
                    const TUriC8& aUri, 
                    RStringF aMethod,
                    TInt aTransactionId);
    void TransactionCompleteL();
    void TransactionError();
    void Cleanup();
    void PropFindResponseBeginL(TInt aDepth);
    void LockQueryResponseBegin();
    void ParsePropFindResponseL(const TDesC8& aFragment);
    void ParseLockResponseL(const TDesC8& aFragment);
    void PropFindResponseEndL();
    void LockResponseEndL();

public: // data
    TWebDavOp               iWebDavOp;
    
private: // Data
    TUint                   iTransactionId;
    CRsfwDavSession*        iWebDavSession;
    RHTTPTransaction        iHttpTransaction;
    TBool                   iMoreToCome;
    RFs                     iFs;
    
    // files used with PUT and GET 
    RFile                   iBodyFile;
    TFileName               iBodyFilePath;
    TInt                    iBodyFileOffset;
    TUint                   iBodyFileFlags;
    TParse                  iParsedBodyFilePath;
    
    // pointer to client's "length" variable
    // GET operation will set this based on "content-length" from the server
    TInt*                   iClientsLength;

    HBufC8*                 iRequestBodyBuffer;

    // PROPFIND parser needs to now where it is prop finding....
    HBufC*                  iPropFindPath;
    // PROPFIND etc: response body is copied to a memory buffer
    HBufC8*                 iResponseBuffer;
    // how much body data has been sent to the HTTP stack
    TInt                    iSendDataCount;
    // total size of body the data
    TInt                    iOverallDataSize;
    TInt                    iStatus;
    TBool iNoContentLength;
    TBool                   iDiscardBody; // there may be body that we discard
    
    // Used with LOCKs to store files lock token
    CRsfwDavFileInfo*           iDavFileInfo; 
    
    // Used with PROPFIND to store metadata of all entries in a directory
    RPointerArray<CRsfwDirEnt>* iDirEnts;
    };

#endif // CRSFWDAVTRANSACTION_H
           
// End of File