locationmanager/ReverseGeocode/inc/clientengine.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 02 Sep 2010 20:52:02 +0300
changeset 52 40db28bb26b8
parent 36 aa5a574040a4
permissions -rw-r--r--
Revision: 201033 Kit: 201035

/*
* Copyright (c) 2006-2009 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:  HTTP client engine, which takes of doing an Http GET request for
* the maps server.
*/

#ifndef __CLIENTENGINE_H__
#define __CLIENTENGINE_H__

#include <http/mhttptransactioncallback.h>
#include <http/mhttpauthenticationcallback.h>
#include <es_sock.h>
#include <cmmanager.h>
#include <comms-infras/cs_mobility_apiext.h>
#include <etel.h>
#include <etelmm.h>

#include "reversegeocode.h"

class RHTTPSession;
class RHTTPTransaction;

const TInt KDefaultBufferSize = 256;

/*
 *  Enumration for the different states of HTTP GET request.
 */
enum THttpStatus
    {
        EHttpSessionError =0,
        EHttpExitingApp,
        EHttpConnecting,
        EHttpTxCancelled,
        EHttpHdrReceived,
        EHttpBytesReceieved,
        EHttpBodyReceieved,
        EHttpTxCompleted,
        EHttpTxSuccess,
        EHttpTxFailed,
        EHttpConnectionFailure,
        EHttpUnknownEvent,
        EHttpMhfRunError,
        EHttpAuthNote,
        EHttpAuthFailed,
        EHttpAuthRequired,
    };

enum TMobileRoamingStatus
    {
    EMobileNotRegistered = 0x00,
    EMobileRegHomeNetwork, // home network
    EMobileNationalRoaming,
    EMobileInternationalRoaming
    };

/*
* MClientObserver
* CClientEngine passes events and responses body data with this interface.
* An instance of this class must be provided for construction of CClientEngine.
*/
class MClientObserver
    {
    public:
    /*
    * ClientEvent()
    *
    * Called when event occurs in CClientEngine.
    *
    * @params aEvent Status of the event.
    */
    virtual void ClientEvent( const THttpStatus& aEvent ) = 0;
    
    /*
    * ClientBodyReceived()
    *
    * Called when a part of the HTTP body is received.
    *
    * @param aBodyData Part of the body data received. (e.g. part of
    *         the received HTML page)
    */
    virtual void ClientBodyReceived( const TDesC8& aBodyData ) = 0;

    /*
    * Get registrer network country code
    *
    * @return current register n/w info
    */
    virtual RMobilePhone::TMobilePhoneNetworkInfoV2& GetCurrentRegisterNw() = 0;

    /*
    * UE is registered to home network?
    *
    * @return ETrue if UE is registered at home network else EFalse
    */
    virtual TBool IsRegisteredAtHomeNetwork() = 0;

    /*
    * Get home network country code
    * @param aHomeNwInfoAvailableFlag ETrue if home n/w info available else EFalse
    * @return user home n/w info
    */
    virtual const RMobilePhone::TMobilePhoneNetworkInfoV1& 
        GetHomeNetworkInfo(TBool& aHomeNwInfoAvailableFlag) = 0;
    };


/*
* Provides simple interface to HTTP Client API.
*/
NONSHARABLE_CLASS( CClientEngine ): public CActive,
                                    public MHTTPTransactionCallback,
                                    public MMobilityProtocolResp
    {

    //Internal Engine state
    enum TEngineState
    {
    EIdle = 0,
    EGet
    };

    public:
    /*
     * Create a CClientEngine object.
     *
     * @params iObserver refernce to the MClientObservers implementation
     *
     * @returns A pointer to the created instance of CClientEngine
     */
    static CClientEngine* NewL( MClientObserver& iObserver );

    /*
     * Create a CClientEngine object. This leaves the object on the clean up
     * stack.
     *
     * @params iObserver refernce to the MClientObservers implementation
     *
     * @returns A pointer to the created instance of CClientEngine
     */
    static CClientEngine* NewLC( MClientObserver& iObserver );

    /*
     * Destroy the object
     *
     */
    ~CClientEngine();

    /*
     * Starts a new HTTP GET transaction.
     *
     * @param aUri URI to get request. (e.g. http://host.org")
     */
    void IssueHTTPGetL( const TDesC8& aUri, const TConnectionOption aOption );

    /*
     * Closes currently running transaction and frees resources related to it.
     */
    void CancelTransaction();
    
	/*
	* Closes the connection
	*/
    void CloseConnection();


	/*
	* checks if silent connection is allowed
	* @return ETrue if silent connection is allowed
	*/
    TBool SilentConnectionAllowed();

#ifdef REVERSEGEOCODE_UNIT_TESTCASE
    public:
#else    
    private:
#endif    
    /*
     * Perform the second phase construction of a CClientEngine object.
     */
    void ConstructL();

    /*
     * Performs the first phase of two phase construction.
     * @param iObserver The observer that is notified after the HTTP transcation is over
     */
    CClientEngine( MClientObserver& iObserver );

    /*
     * Sets header value of an HTTP request.
     *
     * @param aHeaders Headers of the HTTP request
     * @param aHdrField Enumerated HTTP header field, e.g. HTTP::EUserAgent
     * @param aHdrValue New value for header field.
     */
    void SetHeaderL( RHTTPHeaders aHeaders, TInt aHdrField,
                     const TDesC8& aHdrValue );

    /*
     * Sets up the connection
     * @param aOption The connection option
     */
    void SetupConnectionL( const TConnectionOption aOption );

#ifdef REVERSEGEOCODE_UNIT_TESTCASE
    public:
#else    
    private:
#endif  
    //From MHTTPSessionEventCallback
    /*
     * Called by framework to notify about transaction events.
     *
     * @param aTransaction Transaction, where the event occured.
     * @param aEvent Occured event.
     */
    void MHFRunL( RHTTPTransaction aTransaction, const THTTPEvent& aEvent );

    /*
     * Called by framework to notify about transaction events.
     *
     * @param aTransaction Transaction, where the event occured.
     * @param aError Error status code.
     * @param aEvent The event that was being processed when leave occured.
     * 
     * @retuen    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.
     */
    TInt MHFRunError( TInt aError, RHTTPTransaction aTransaction, const THTTPEvent& aEvent );

    
#ifdef REVERSEGEOCODE_UNIT_TESTCASE
    public:
#else    
    private:
#endif 
    // from MMobilityProtocolResp
    void PreferredCarrierAvailable( TAccessPointInfo aOldAPInfo,
                                    TAccessPointInfo aNewAPInfo,
                                    TBool aIsUpgrade,
                                    TBool aIsSeamless );
    void NewCarrierActive( TAccessPointInfo aNewAPInfo, TBool aIsSeamless );
    void Error( TInt aError );

	TBool IsDataConnectionAskAlwaysL();
	TMobileRoamingStatus UeRegNetworkStatus();
    TBool IsVisitorNetwork(const TMobileRoamingStatus& aRoamingStatus) const;
    TBool IsWlanOnly(const TMobileRoamingStatus& aRoamingStatus,
                const TCmGenConnSettings& aGenConnSettings) const;
    
#ifdef REVERSEGEOCODE_UNIT_TESTCASE
    public:
#else    
    private:
#endif 

	/**
	  * RunL
	  * This method is called on completion of the active object request
	  */

    void RunL();

	/**
	  * DoCancel
	  * Cancels any outstanding requests
	  */	
    void DoCancel();

	/**
	  * This method is called if the RunL leaves
	  *  @param aError The errcode with which it leaves
	  */	
    TInt RunError(TInt aError);

#ifdef REVERSEGEOCODE_UNIT_TESTCASE
    public:
#else    
    private:
#endif 

	/**
	  * Submits a HTTP transaction
	  */
    void DoHTTPGetL();
    
#ifdef REVERSEGEOCODE_UNIT_TESTCASE
    public:
#else    
    private:
#endif 
  // declare members
    RSocketServ                 iSocketServ;
    RConnection                 iConnection;
    TUint32                     iSelectedIap;

    RHTTPSession                iSession;
    RHTTPTransaction            iTransaction;

    MClientObserver&            iObserver;  // Used for passing body data and events to UI
    TBool                       iRunning;   // ETrue, if transaction running
    TBool                       iConnectionSetupDone;
    
    TInt                        iPrevProfileId;
    
    CActiveCommsMobilityApiExt* iMobility;
    TBool                       iTransactionOpen;
    TEngineState                 iEngineState;
    HBufC8*                     iUri;
	RCmManager                  iCmManager;
    
    };

#endif // __CLIENTENGINE_H__

// End of file