📄 httpclientengine.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 + -