upnp/upnpstack/serviceframework/inc/upnphttpmessagesender.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 01:12:20 +0200
changeset 0 f5a58ecadc66
permissions -rw-r--r--
Revision: 201003

/** @file
* Copyright (c) 2008 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:  Declares the CUpnpHttpMessageSender class
 *
*/


#ifndef __UPNPHTTPMESSAGESENDER_H__
#define __UPNPHTTPMESSAGESENDER_H__

#include <http.h>
#include <upnpnotifytimer.h>

class MUpnpHttpMessageSenderOwner;
class CUpnpHttpTransaction;

/**
 *  Class that manage sending process of a single transaction (
 *  request http message and response http message).
 *
 */
NONSHARABLE_CLASS( CUpnpHttpMessageSender ) : public CBase,
                                              public MHTTPTransactionCallback,
                                              public MHTTPDataSupplier,
                                              public MUpnpNotifyTimerObserver
    {
public:
    /**
     * Two-phased constructor. Create a CUpnpHttpMessageSender object.
     * @param aUpnpTransaction unsent upnp transaction object
     * @param aSession opened http session that will be used to send the message
     * @param aOwner object that should be notified when sender finish its job
     *                  and issue destruction of this (sender) object
     * @return A pointer to the created instance of CUpnpHttpMessageSender
     */
    static CUpnpHttpMessageSender* NewL( CUpnpHttpTransaction& aUpnpTransaction,
                                         RHTTPSession aSession,
                                         MUpnpHttpMessageSenderOwner& aOwner
                                         );

    /**
     * Two-phased constructor. Create a CUpnpHttpMessageSender object.
     * @param aUpnpTransaction unsent upnp transaction object
     * @param aSession opened http session that will be used to send the message
     * @param aOwner object that should be notified when sender finish its job
     *                  and issue destruction of this (sender) object
     * @return A pointer to the created instance of CUpnpHttpMessageSender
     */
    static CUpnpHttpMessageSender* NewLC( CUpnpHttpTransaction& aUpnpTransaction,
                                          RHTTPSession aSession,
                                          MUpnpHttpMessageSenderOwner& aOwner
                                          );

    /**
     * Destructor.
     */
    ~CUpnpHttpMessageSender();

    /**
     * Start a new HTTP transaction maintained by the object. It will start
     * asynchronous sending of request message.
     */
    void StartTransactionL();

    /**
     * Returns upnp transaction object that is maintained by the object.
     * @return upnp transaction object that is maintained by the object
     */
    CUpnpHttpTransaction& UpnpTransaction();
    
    
    void CancelTransaction();

private:    //from MHTTPTransactionCallback
    /**
     * Called by framework to notify about transaction events.
     * @param aTransaction: Transaction, where the event occured.
     * @param aEvent:       Occured event.
     */
    virtual void MHFRunL( RHTTPTransaction aTransaction, const THTTPEvent& aEvent );

    /**
     * Called by framework when *leave* occurs in handling of transaction event.
     * @param aError:       The leave code that occured.
     * @param aTransaction: The transaction that was being processed when leave occured.
     * @param aEvent:       The event that was being processed when leave occured.
     * @return KErrNone,    if the error was handled. Otherwise the value of aError, or
     *                      some other error value. Returning error value causes causes
     *                      HTTP-CORE 6 panic.
     */
    virtual TInt MHFRunError( TInt aError,
            RHTTPTransaction aTransaction,
            const THTTPEvent& aEvent );

private:    //from MHTTPDataSupplier
    /*
     * Methods from MHTTPDataSupplier are used to supply body of request from
     * our UpnpMessage to Symian RHTTPRequest
     */
    virtual TBool GetNextDataPart( TPtrC8& aDataChunk );

    virtual void ReleaseData();

    virtual TInt OverallDataSize();

    virtual TInt Reset();

private:    //from MNotifyTimerObserver
    /**
     * From MNotifyTimerObserver Function which indicate that message is timeout.
     * @since Series ?XX ?SeriesXX_version
     * @param aTimer Timer.
     */
    virtual void TimerEventL( CUpnpNotifyTimer* aTimer );

private:
    /**
     * Constructor
     * @param aUpnpTransaction unsent upnp transaction object
     * @param aSession opened http session that will be used to send the message
     * @param aOwner object that should be notified when sender finish its job
     *                  and issue destruction of this (sender) object
     */
    CUpnpHttpMessageSender( CUpnpHttpTransaction& aUpnpTransaction,
                            RHTTPSession aSession,
                            MUpnpHttpMessageSenderOwner& aOwner
                            );
                                                        
    /**
     * Second phase constructor
     */
    void ConstructL();

    /**
     * Opens RHTTPTransaction with request method and uri, subscribe
     * for transaction's events
     */
    void PrepareRequestTransactionL();

    /**
     * Sets http headers from UpnpHttpTransaction to RHTTPTransaction
     */
    void PrepareRequestHeadersL();

    /**
     * Copies http headers from RHTTPTransaction to UpnpHttpTransaction
     */
    void CopyResponseHeadersL();

    /**
     * Sets http message body from UpnpHttpTransaction to RHTTPTransaction
     */
    void PrepareRequestBody();

    /**
     * Starts timer of request sending with TcpTimeout value.
     */
    void StartRequestTimer();

    /**
     * Called when transaction succeeded.
     * Closes RHTTPTransaction, and forward result message to observer.
     */
    void TransactionSucceeded();

    /**
     * Do NOT use this method directly, but via TransactionFailed
     */
    void DoTransactionFailedL( TInt aStatus, TInt aError );
    
    /**
     * Do NOT use this method directly, but via TransactionSucceded
     */
    void DoTransactionSucceededL();
    
    /**
     * Called in case of every fail of transaction.
     * Closes RHTTPTransaction, creates error message (408 timeout), and forward it
     * to observer.
     */
    void TransactionFailed( TInt aStatus, TInt aError = 0 );

    /**
     * Called when transaction got another part of body data.
     * Data is concatenated to iBody and when the last part of body is received
     * request message is created witin transaction.
     */
    void GotResponseBodyDataL( MHTTPDataSupplier& aResponseBodySupplier );

    /**
     * Helper method that allocate descriptor object with destination uri of message
     * passed as a parameter.
     */
    static HBufC8* DestinationUriL( CUpnpHttpMessage* aMessage );

private:
    /**
     * Represents UPnP transaction
     */
    CUpnpHttpTransaction& iUpnpTransaction;

    /**
     * Timer of transaction
     */
    CUpnpNotifyTimer* iTimer;

    /**
     * Represents HTTP Transaction used to realize UPnP transaction
     */
    RHTTPTransaction iTransaction;

    /**
     * Error number to be sent if transaction failed
     */    
    TInt iCurrentErrorNumber;
    
    /**
     * Represents HTTP Session object
     */
    RHTTPSession iSession;

    /**
     * Body of received message
     */
    HBufC8* iBody;

    /*
     * Owner of an instance.
     */
    MUpnpHttpMessageSenderOwner& iOwner;

    };

#endif /*__UPNPHTTPMESSAGESENDER_H__*/

//  End of File