Kawe Mazidjatari b3a68ed095 Add EABase, EAThread and DirtySDK to R5sdk
DirtySDK (EA's Dirty Sockets library) will be used for the LiveAPI implementation, and depends on: EABase, EAThread.
2024-04-05 18:29:03 +02:00

132 lines
5.9 KiB
C

/*H********************************************************************************/
/*!
\File protohttpmanager.h
\Description
High-level module designed to create and manage a pool of ProtoHttp refs. A
client application can submit rapid-fire http requests and ProtoHttpManager
will distribute them efficiently across the ref pool internally, queuing
them for efficient use of keep-alive and pipelining requests where possible.
\Notes
None.
\Todo
Pipelining
\Copyright
Copyright (c) Electronic Arts 2009.
\Version 1.0 05/20/2009 (jbrookes) First Version
*/
/********************************************************************************H*/
#ifndef _protohttpmanager_h
#define _protohttpmanager_h
/*!
\Moduledef ProtoHttpManager ProtoHttpManager
\Modulemember Proto
*/
//@{
/*** Include files ****************************************************************/
#include "DirtySDK/platform.h"
#include "DirtySDK/proto/protohttp.h"
/*** Defines **********************************************************************/
/*** Macros ***********************************************************************/
/*** Type Definitions *************************************************************/
//! httpmanager stats
typedef struct HttpManagerStatT
{
uint32_t uNumActiveTransactions; //!< current number of active transactions
uint32_t uMaxActiveTransactions; //!< maximum (highwater) number of active transactions
uint32_t uNumQueuedTransactions; //!< current number of queued transactions
uint32_t uMaxQueuedTransactions; //!< maximum (highwater) number of queued transactions
uint32_t uNumTransactions; //!< total number of transactions issued
uint32_t uNumKeepAliveTransactions; //!< total number of keep-alive transactions issued
uint32_t uNumPipelinedTransactions; //!< total number of pipelined transactions issued
uint32_t uSumQueueWaitLatency; //!< total amount of time spent waiting in queue
uint32_t uMaxQueueWaitLatency; //!< max time any single request had to wait
uint32_t uSumQueueFreeLatency; //!< total amount of time spent waiting for transaction to freed
uint32_t uMaxQueueFreeLatency; //!< max time any single transaction waited to be freed
uint64_t uTransactionBytes; //!< total bytes xferred
uint32_t uTransactionTime; //!< total transaction time
} HttpManagerStatT;
//! opaque module ref
typedef struct HttpManagerRefT HttpManagerRefT;
/*** Variables ********************************************************************/
/*** Functions ********************************************************************/
#ifdef __cplusplus
extern "C" {
#endif
// allocate module state and prepare for use
DIRTYCODE_API HttpManagerRefT *HttpManagerCreate(int32_t iHttpBufSize, int32_t iHttpNumRefs);
// set custom header callback
DIRTYCODE_API void HttpManagerCallback(HttpManagerRefT *pHttpManager, ProtoHttpCustomHeaderCbT *pCustomHeaderCb, ProtoHttpReceiveHeaderCbT *pReceiveHeaderCb);
// destroy the module and release its state
DIRTYCODE_API void HttpManagerDestroy(HttpManagerRefT *pHttpManager);
// allocate a new transaction handle
DIRTYCODE_API int32_t HttpManagerAlloc(HttpManagerRefT *pHttpManager);
// release a transaction handle
DIRTYCODE_API void HttpManagerFree(HttpManagerRefT *pHttpManager, int32_t iHandle);
// initiate an HTTP transfer
DIRTYCODE_API int32_t HttpManagerGet(HttpManagerRefT *pHttpManager, int32_t iHandle, const char *pUrl, uint32_t bHeadOnly);
// return the actual url data
DIRTYCODE_API int32_t HttpManagerRecv(HttpManagerRefT *pHttpManager, int32_t iHandle, char *pBuffer, int32_t iBufMin, int32_t iBufMax);
// receive all of the response data
DIRTYCODE_API int32_t HttpManagerRecvAll(HttpManagerRefT *pHttpManager, int32_t iHandle, char *pBuffer, int32_t iBufSize);
// initiate transfer of data to to the server via an HTTP POST command
DIRTYCODE_API int32_t HttpManagerPost(HttpManagerRefT *pHttpManager, int32_t iHandle, const char *pUrl, const char *pData, int64_t iDataSize, uint32_t bDoPut);
// send the actual url data
DIRTYCODE_API int32_t HttpManagerSend(HttpManagerRefT *pHttpManager, int32_t iHandle, const char *pData, int32_t iDataSize);
// make an http request
#define HttpManagerRequest(_pHttpManager, _iHandle, _pUrl, _pData, _iDataSize, _eRequestType) HttpManagerRequestCb2(_pHttpManager, _iHandle, _pUrl, _pData, _iDataSize, _eRequestType, NULL, NULL, NULL, NULL)
// make an http request with write callback
#define HttpManagerRequestCb(_pHttpManager, _iHandle, _pUrl, _pData, _iDataSize, _eRequestType, _pWriteCb, _pWriteCbUserData) HttpManagerRequestCb2(_pHttpManager, _iHandle, _pUrl, _pData, _iDataSize, _eRequestType, _pWriteCb, NULL, NULL, _pWriteCbUserData)
// make an http request with write, custom header and receive header callback
DIRTYCODE_API int32_t HttpManagerRequestCb2(HttpManagerRefT *pHttpManager, int32_t iHandle, const char *pUrl, const char *pData, int64_t iDataSize, ProtoHttpRequestTypeE eRequestType, ProtoHttpWriteCbT *pWriteCb, ProtoHttpCustomHeaderCbT *pCustomHeaderCb, ProtoHttpReceiveHeaderCbT *pReceiveHeaderCb, void *pUserData);
// set base url
DIRTYCODE_API void HttpManagerSetBaseUrl(HttpManagerRefT *pHttpManager, int32_t iHandle, const char *pUrl);
// control function; functionality based on input selector (-1 to apply to all refs)
DIRTYCODE_API int32_t HttpManagerControl(HttpManagerRefT *pHttpManager, int32_t iHandle, int32_t iSelect, int32_t iValue, int32_t iValue2, void *pValue);
// return module status based on input selector
DIRTYCODE_API int32_t HttpManagerStatus(HttpManagerRefT *pHttpManager, int32_t iHandle, int32_t iSelect, void *pBuffer, int32_t iBufSize);
// give time to module to do its thing (should be called periodically to allow module to perform work)
DIRTYCODE_API void HttpManagerUpdate(HttpManagerRefT *pHttpManager);
#ifdef __cplusplus
}
#endif
//@}
#endif // _protohttpmanager_h