⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 httpclientengine.cpp

📁 《基于Symbian OS的手机开发与应用实践》这本书的配套源码。
💻 CPP
字号:
/*
* ============================================================================
*  Name     : CHttpClientEngine from HttpClientEngine.h
*  Part of  : HttpClient
*  Created  : 07.03.2006 by ToBeReplacedByAuthor
*  Implementation notes:
*     Initial content was generated by Series 60 Application Wizard.
*  Version  :
*  Copyright: ToBeReplacedByCopyright
* ============================================================================
*/

// INCLUDE FILES
#include <chttpformencoder.h> // for CHTTPFormEncoder
#include <httpstringconstants.h> // for HTTP string table
#include <rhttpheaders.h> // for RHTTPHeaders

#include "HttpClientEngine.h"

// CONSTANTS
// HTTP header values
_LIT8(KUserAgent, "HttpClient (1.0)");    // Name of this client app
_LIT8(KAccept, "text/*");                // Accept any (but only) text content

// ================= MEMBER FUNCTIONS =======================

// Two-phased constructor.
CHttpClientEngine* CHttpClientEngine::NewL(MObserver& aObserver)
    {
    CHttpClientEngine* self = new (ELeave) CHttpClientEngine(aObserver);
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop();
    return self;
    }

// destructor
CHttpClientEngine::~CHttpClientEngine()
    {
    // Close session
    iSession.Close();    // Close any open transactions
    delete iUri;
    }

// New functions
/**
* Cancel any outstanding transaction
*/
void CHttpClientEngine::Cancel()
    {
    if(iUri!=NULL)
        {
        iTransaction.Cancel();
        delete iUri;
        iUri = NULL;
        }
    }

/**
* Issue a GET request
* @param aUri The URI to get
*/
void CHttpClientEngine::GetL(const TDesC& aUri)
    {
    Cancel();

    // Parse the URI, Convert the URI to an 8-bit descriptor
    // then set iParser to point at it
    iUri = HBufC8::NewL(aUri.Length());
    iUri->Des().Copy(aUri);
    User::LeaveIfError(iParser.Parse(*iUri));

    // Create a transaction
    iTransaction = iSession.OpenTransactionL(iParser, *this,
        iSession.StringPool().StringF(HTTP::EGET, RHTTPSession::GetTable()));

    // Set headers
    RHTTPHeaders headers = iTransaction.Request().GetHeaderCollection();
    AddHeaderL(headers, HTTP::EUserAgent, KUserAgent);
    AddHeaderL(headers, HTTP::EAccept, KAccept);

    // Issue a get request
    iTransaction.SubmitL();
    }

TBool CHttpClientEngine::IsGetting()
    {
    return iUri!=NULL;
    }

// constructor
CHttpClientEngine::CHttpClientEngine(MObserver& aObserver)
: iObserver(aObserver)
    {
    }

// EPOC default constructor can leave.
void CHttpClientEngine::ConstructL()
    {
    iSession.OpenL();
    }


/**
* Override of pure virtual method in MHTTPTransactionCallback.
* Called to report progress by a currently outstanding transaction.
*
* @param aTransaction The transaction reporting progress
* @param aEvent The event being notified
*/
void CHttpClientEngine::MHFRunL(RHTTPTransaction aTransaction, const THTTPEvent& aEvent)
    {
    switch (aEvent.iStatus)
        {
        case THTTPEvent::EGotResponseHeaders:
            {
            // HTTP response headers have been received.
            // Pass status information to observer.
            RHTTPResponse resp = aTransaction.Response();

            // Get status code
            TInt statusCode = resp.StatusCode();

            // Get status text
            RStringF statusStr = resp.StatusText();
            HBufC* buf = HBufC::NewLC(statusStr.DesC().Length());
            buf->Des().Copy(statusStr.DesC());
            iObserver.OnHeaderL(statusCode, *buf);
            CleanupStack::PopAndDestroy(buf);
            break;
            }
        case THTTPEvent::EGotResponseBodyData:
            {
            // Get text of response body
            MHTTPDataSupplier* dataSupplier = aTransaction.Response().Body();
            TPtrC8 ptr;
            dataSupplier->GetNextDataPart(ptr);

            // Convert to 16-bit descriptor
            HBufC* buf = HBufC::NewLC(ptr.Length());
            buf->Des().Copy(ptr);
            iObserver.OnBodyL(*buf);
            CleanupStack::PopAndDestroy(buf);

            // Release the body data
            dataSupplier->ReleaseData();
            break;
            }
        case THTTPEvent::EResponseComplete:
            {
            // The "GET" operation is completed
            iObserver.OnBodyL(KNullDesC());
            break;
            }
        }
    }

/**
*/
TInt CHttpClientEngine::MHFRunError(TInt aError, RHTTPTransaction /*aTransaction*/, const THTTPEvent& /*aEvent*/)
    {
    return aError;
    }

// Private new functions
/**
* Add a header to a header set
* @param aHeaders The header set to be modified
* @param aHeaderField The name of the header to be added
* @param aHeaderValue The value for the header to be added
*/
void CHttpClientEngine::AddHeaderL(RHTTPHeaders aHeaders, TInt aHeaderField, const TDesC8& aHeaderValue)
    {
    RStringPool stringPool = iSession.StringPool();
    RStringF valStr = stringPool.OpenFStringL(aHeaderValue);
    THTTPHdrVal headerVal(valStr);
    aHeaders.SetFieldL(stringPool.StringF(aHeaderField, RHTTPSession::GetTable()), headerVal);
    valStr.Close();
    }

// End of File  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -