/*H*************************************************************************************/
/*!
    \File    commsrp.h

    \Description
        This is CommSRP (Selectively Reliable Protocol), a datagram packet-based
        transport class.

    \Copyright
        Copyright Electronic Arts 1999-2003

    \Version 0.5 01/03/03 (jbrookes) Initial Version, based on CommTCP
    \Version 0.7 01/07/03 (jbrookes) Working unreliable transport, based on CommUDP
    \Version 0.8 01/08/03 (jbrookes) Working reliable transport.
    \Version 0.9 02/09/03 (jbrookes) Added support for sending zero-byte packets, and fixed PS2 alignment issue.
*/
/*************************************************************************************H*/

#ifndef _commsrp_h
#define _commsrp_h

/*!
\Moduledef CommSRP CommSRP
\Modulemember Comm
*/
//@{

/*** Include files *********************************************************************/

#include "DirtySDK/platform.h"

/*** Defines ***************************************************************************/

/*** Macros ****************************************************************************/

/*** Type Definitions ******************************************************************/

// basic reference returned/used by all routines
typedef struct CommSRPRef CommSRPRef;

/*** Variables *************************************************************************/

/*** Functions *************************************************************************/

#ifdef __cplusplus
extern "C" {
#endif

// construct the class
DIRTYCODE_API  CommSRPRef *CommSRPConstruct(int32_t maxwid, int32_t maxinp, int32_t maxout);

// destruct the class
DIRTYCODE_API  void CommSRPDestroy(CommSRPRef *what);

// resolve an address
DIRTYCODE_API int32_t CommSRPResolve(CommSRPRef *what, const char *addr, char *buf, int32_t len, char div);

// stop the resolver
DIRTYCODE_API void CommSRPUnresolve(CommSRPRef *what);

// listen for a connection
DIRTYCODE_API int32_t CommSRPListen(CommSRPRef *what, const char *addr);

// stop listening
DIRTYCODE_API int32_t CommSRPUnlisten(CommSRPRef *what);

// initiate a connection to a peer
DIRTYCODE_API int32_t CommSRPConnect(CommSRPRef *what, const char *addr);

// terminate a connection
DIRTYCODE_API int32_t CommSRPUnconnect(CommSRPRef *what);

// set event callback hook
DIRTYCODE_API void CommSRPCallback(CommSRPRef *what, void (*callback)(CommRef *ref, int32_t event));

// return current stream status
DIRTYCODE_API int32_t CommSRPStatus(CommSRPRef *what);

// return current clock tick
DIRTYCODE_API uint32_t CommSRPTick(CommSRPRef *what);

// send a packet
// FIFA_BEGIN | DIVERGENCE | mmisalucha | 2019-12-24 | Input latency tracking
DIRTYCODE_API int32_t CommSRPSend(CommSRPRef *what, const void *buffer, int32_t length, uint32_t flags, uint64_t *latency);
// FIFA_END

// peek at waiting packet
DIRTYCODE_API int32_t CommSRPPeek(CommSRPRef *what, void *target, int32_t length, uint32_t *when);

// receive a packet from the buffer
// FIFA_BEGIN | DIVERGENCE | mmisalucha | 2019-12-24 | Input latency tracking
DIRTYCODE_API int32_t CommSRPRecv(CommSRPRef *what, void *target, int32_t length, uint32_t *when, uint64_t *latency);
// FIFA_END
#ifdef __cplusplus
}
#endif

//@}

#endif // _commsrp_h






