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

228 lines
6.6 KiB
C

/*H*************************************************************************************/
/*!
\File ticker.c
\Description
This application demonstrates simple use of DirtySock including starting up the
network stack and using ProtoHttp to hit the Yahoo stock ticker on a recurring
basis.
\Copyright
Copyright (c) Electronic Arts 2016.
\Version 1.0 12/10/2000 (gschaefer) Initial version
\Version 2.0 11/27/2002 (gschaefer) Revived from the dead
\Version 2.1 02/23/2003 (jbrookes) Rewrote to use demo lib
\Version 2.2 03/06/2003 (jbrookes) Updated to use netconn
\Version 3.0 10/05/2005 (jbrookes) PS3 version
\Version 3.1 11/19/2008 (mclouatre) Adding user data concept to mem group support
\Version 4.0 04/01/2016 (jbrookes) Ported from PS4 version
*/
/*************************************************************************************H*/
/*** Include files *********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// dirtysock includes
#include "DirtySDK/dirtysock.h"
#include "DirtySDK/dirtysock/dirtyerr.h"
#include "DirtySDK/dirtysock/dirtymem.h"
#include "DirtySDK/dirtysock/netconn.h"
#include "DirtySDK/misc/weblog.h"
#include "DirtySDK/proto/protohttp.h"
/*** Defines ***************************************************************************/
#define TICKER_WEBLOG_ENABLED (DIRTYCODE_DEBUG && FALSE)
/*** Macros ****************************************************************************/
/*** Type Definitions ******************************************************************/
/*** Function Prototypes ***************************************************************/
/*** Variables *************************************************************************/
// Private variables
// Public variables
/*** Public Functions ******************************************************************/
// dll-friendly DirtyMemAlloc
#if !defined(DIRTYCODE_DLL)
void *DirtyMemAlloc(int32_t iSize, int32_t iMemModule, int32_t iMemGroup, void *pMemGroupUserData)
#else
void *DirtyMemAlloc2(int32_t iSize, int32_t iMemModule, int32_t iMemGroup, void *pMemGroupUserData)
#endif
{
return(malloc(iSize));
}
// dll-friendly DirtyMemFree
#if !defined(DIRTYCODE_DLL)
void DirtyMemFree(void *pMem, int32_t iMemModule, int32_t iMemGroup, void *pMemGroupUserData)
#else
void DirtyMemFree2(void *pMem, int32_t iMemModule, int32_t iMemGroup, void *pMemGroupUserData)
#endif
{
free(pMem);
}
int main(int32_t argc, char *argv[])
{
int32_t iAddr, iLen, iStatus, iTimeout, iCount;
ProtoHttpRefT *pHttp;
char strBuffer[16*1024];
#if TICKER_WEBLOG_ENABLED
WebLogRefT *pWebLog;
int32_t iVerbose = 1;
#endif
#if defined(DIRTYCODE_DLL)
DirtyMemFuncSet(&DirtyMemAlloc2, &DirtyMemFree2);
#endif
#if TICKER_WEBLOG_ENABLED
// create weblog module
pWebLog = WebLogCreate(8192);
#if 0
// set to post to dev server
WebLogConfigure(pWebLog, "eggplant.online.ea.com:8001", NULL);
#endif
// set weblog protohttp debugging to a high level
WebLogControl(pWebLog, 'spam', iVerbose, 0, NULL);
// hook in to netprintf debug output
#if DIRTYCODE_LOGGING
NetPrintfHook(WebLogDebugHook, pWebLog);
#endif
// start logging
WebLogStart(pWebLog);
#endif
// start network
NetConnStartup("-servicename=ticker");
// bring up the interface
NetConnConnect(NULL, NULL, 0);
// wait for network interface activation
for (iTimeout = NetTick()+15*1000 ; ; )
{
// update network
NetConnIdle();
// get current status
iStatus = NetConnStatus('conn', 0, NULL, 0);
if ((iStatus == '+onl') || ((iStatus >> 24) == '-'))
{
break;
}
// check for timeout
if (iTimeout < (signed)NetTick())
{
NetPrintf(("ticker: timeout waiting for interface activation\n"));
return(-1);
}
// give time to other threads
NetConnSleep(500);
}
// check result code
if ((iStatus = NetConnStatus('conn', 0, NULL, 0)) == '+onl')
{
NetPrintf(("ticker: interface active\n"));
}
else if ((iStatus >> 14) == '-')
{
NetPrintf(("ticker: error bringing up interface\n"));
return(-11);
}
// broadband check (should return TRUE if broadband, else FALSE)
NetPrintf(("iftype=%d\n", NetConnStatus('type', 0, NULL, 0)));
NetPrintf(("broadband=%s\n", NetConnStatus('bbnd', 0, NULL, 0) ? "TRUE" : "FALSE"));
// acquire and display address
iAddr = NetConnStatus('addr', 0, NULL, 0);
NetPrintf(("addr=%a\n", iAddr));
// display mac address
NetPrintf(("mac=%s\n", NetConnMAC()));
// setup http module
pHttp = ProtoHttpCreate(4096);
// just keep working
for ( iTimeout = NetTick()-1, iLen=-1, iCount = 0; iCount < 8; )
{
// see if its time to query
if ((iTimeout != 0) && (NetTick() > (unsigned)iTimeout))
{
ProtoHttpGet(pHttp, "http://quote.yahoo.com/d/quotes.csv?s=^DJI,^SPC,^IXIC,EA,SNE,YHOO,^AORD,^N225,^FTSE&f=sl1c1&e=.csv", FALSE);
iTimeout = NetTick()+30*1000;
iLen = 0;
iCount += 1; // count the attempt
}
// update protohttp
ProtoHttpUpdate(pHttp);
// read incoming data into buffer
if ((iLen == 0) || (iLen == PROTOHTTP_RECVWAIT))
{
if ((iLen = ProtoHttpRecvAll(pHttp, strBuffer, sizeof(strBuffer)-1)) > 0)
{
// print response
NetPrintf(("ticker: received response\n"));
NetPrintf(("%s", strBuffer));
// print to console
printf("%s", strBuffer);
}
}
#if TICKER_WEBLOG_ENABLED
WebLogUpdate(pWebLog);
#endif
NetConnIdle();
}
NetPrintf(("ticker: done\n"));
// shut down HTTP
ProtoHttpDestroy(pHttp);
#if TICKER_WEBLOG_ENABLED
// stop the logging
WebLogStop(pWebLog);
// give it five seconds to flush the remaining data and end the transaction gracefully
for (iCount = 0; iCount < (5*1000); iCount += 100)
{
NetConnIdle();
WebLogUpdate(pWebLog);
NetConnSleep(100);
}
// unhook netprintf debug output *before* we destroy WebLog
#if DIRTYCODE_LOGGING
NetPrintfHook(NULL, NULL);
#endif
// destroy module
WebLogDestroy(pWebLog);
#endif
// disconnect from the network
NetConnDisconnect();
// shutdown the network connections && destroy the dirtysock code
NetConnShutdown(FALSE);
return(0);
}