openmohaa/code/gamespy/GP/gpiPeer.h

187 lines
3.9 KiB
C
Raw Permalink Normal View History

2023-02-04 21:00:01 +01:00
/*
gpiPeer.h
GameSpy Presence SDK
Dan "Mr. Pants" Schoenblum
Copyright 1999-2007 GameSpy Industries, Inc
devsupport@gamespy.com
***********************************************************************
Please see the GameSpy Presence SDK documentation for more information
**********************************************************************/
#ifndef _GPIPEER_H_
#define _GPIPEER_H_
//INCLUDES
//////////
#include "gpi.h"
//DEFINES
/////////
// Peer states.
///////////////
#define GPI_PEER_NOT_CONNECTED 100
#define GPI_PEER_GETTING_SIG 101
#define GPI_PEER_GOT_SIG 102
#define GPI_PEER_CONNECTING 103
#define GPI_PEER_WAITING 104
#define GPI_PEER_CONNECTED 105
#define GPI_PEER_DISCONNECTED 106
// Timeout for a peer connection, in milliseconds.
/////////////////////////////////////////////
#define GPI_PEER_TIMEOUT (10 * 1000)
// Timeout for a peer operation, in milliseconds
////////////////////////////////////////////
#define GPI_PEER_OP_TIMEOUT 60000
typedef enum
{
GPI_PEER_OP_STATE_NONE,
GPI_PEER_OP_STATE_REQUESTED,
GPI_PEER_OP_STATE_FINISHED
} GPIPeerOpState;
typedef struct GPITransferID_s * GPITransferID_st;
//TYPES
///////
// A peer message.
//////////////////
typedef struct GPIMessage
{
GPIBuffer buffer;
int type;
int start;
} GPIMessage;
typedef struct _GPIPeerOp
{
GPIPeerOpState state;
void *userData;
GPCallback callback;
struct _GPIPeerOp * next;
int type;
gsi_time timeout;
} GPIPeerOp;
typedef struct _GPIPeerOpQueue
{
GPIPeerOp * opList;
GPIPeerOp * first;
GPIPeerOp * last;
} GPIPeerOpQueue;
// A peer connection.
/////////////////////
typedef struct GPIPeer_s
{
int state;
GPIBool initiated;
//SOCKET sock;
unsigned int ip;
unsigned short port;
GPProfile profile;
time_t timeout;
int nackCount;
GPIBuffer inputBuffer;
GPIBuffer outputBuffer;
DArray messages;
GPIPeerOpQueue peerOpQueue;
struct GPIPeer_s * pnext;
} GPIPeer;
//FUNCTIONS
///////////
GPResult
gpiProcessPeers(
GPConnection * connection
);
GPResult
gpiPeerGetSig(
GPConnection * connection,
GPIPeer * peer
);
GPResult
gpiPeerStartConnect(
GPConnection * connection,
GPIPeer * peer
);
// NOTE: use this function when in a gp function
GPIPeer * gpiGetPeerByProfile(const GPConnection * connection,
int profileid);
// NOTE: use this function only when in a UDP layer callback
GPIPeer *gpiGetPeerByAddr(const GPConnection *connection,
unsigned int ip,
unsigned short port);
gsi_bool gpiIsPeerConnected(GPIPeer *peer);
GPIPeer *
gpiAddPeer(
GPConnection * connection,
int profileid,
GPIBool initiate
);
void
gpiDestroyPeer(
GPConnection * connection,
GPIPeer * peer
);
void
gpiRemovePeer(
GPConnection * connection,
GPIPeer * peer
);
GPResult
gpiPeerAddMessage(
GPConnection * connection,
GPIPeer * peer,
int type,
const char * message
);
GPResult
gpiPeerStartTransferMessage(
GPConnection * connection,
GPIPeer * peer,
int type,
const struct GPITransferID_s * transferID
);
GPResult
gpiPeerFinishTransferMessage(
GPConnection * connection,
GPIPeer * peer,
const char * message,
int len
);
GPResult
gpiPeerSendMessages(
GPConnection * connection,
GPIPeer * peer
);
void gpiPeerLeftCallback(unsigned int ip, unsigned short port, GSUdpCloseReason reason, void *userData);
void gpiPeerMessageCallback(unsigned int ip, unsigned short port, unsigned char *message,
unsigned int messageLength, gsi_bool reliable, void *userData);
void gpiPeerAcceptedCallback(unsigned int ip, unsigned short port,
GSUdpErrorCode error, gsi_bool rejected, void *userData);
void gpiPeerPingReplyCallback(unsigned int ip, unsigned short port, unsigned int latency, void *userData);
void gpiPeerAddOp(GPIPeer *peer, GPIPeerOp *operation);
void gpiPeerRemoveOp(GPIPeer *peer, GPIPeerOp *operation);
void gpiCheckTimedOutPeerOperations(GPConnection * connection, GPIPeer * peer);
#endif