#ifndef ISTEAMNETWORKINGSOCKETSSERIALIZED_H
#define ISTEAMNETWORKINGSOCKETSSERIALIZED_H

#include "steamtypes.h"
#include "steamclientpublic.h"

class ISteamNetworkingSocketsSerialized002
{
public:
    virtual void SendP2PRendezvous( CSteamID steamIDRemote, uint32 unConnectionIDSrc, const void *pMsgRendezvous, uint32 cbRendezvous ) = 0;
    virtual void SendP2PConnectionFailure( CSteamID steamIDRemote, uint32 unConnectionIDDest, uint32 nReason, const char *pszReason ) = 0;
    //SteamNetworkingSocketsCert_t
    virtual SteamAPICall_t GetCertAsync() = 0;
    virtual int GetNetworkConfigJSON( void *buf, uint32 cbBuf ) = 0;
    virtual void CacheRelayTicket( const void *pTicket, uint32 cbTicket ) = 0;
    virtual uint32 GetCachedRelayTicketCount() = 0;
    virtual int GetCachedRelayTicket( uint32 idxTicket, void *buf, uint32 cbBuf ) = 0;
    virtual void PostConnectionStateMsg( const void *pMsg, uint32 cbMsg ) = 0;
};

class ISteamNetworkingSocketsSerialized003
{
public:
	virtual void SendP2PRendezvous( CSteamID steamIDRemote, uint32 unConnectionIDSrc, const void *pMsgRendezvous, uint32 cbRendezvous ) = 0;
	virtual void SendP2PConnectionFailure( CSteamID steamIDRemote, uint32 unConnectionIDDest, uint32 nReason, const char *pszReason ) = 0;
	virtual SteamAPICall_t GetCertAsync() = 0;
	virtual int GetNetworkConfigJSON( void *buf, uint32 cbBuf, const char *pszLauncherPartner ) = 0;
	virtual void CacheRelayTicket( const void *pTicket, uint32 cbTicket ) = 0;
	virtual uint32 GetCachedRelayTicketCount() = 0;
	virtual int GetCachedRelayTicket( uint32 idxTicket, void *buf, uint32 cbBuf ) = 0;
	virtual void PostConnectionStateMsg( const void *pMsg, uint32 cbMsg ) = 0;
};

class ISteamNetworkingSocketsSerialized004
{
public:
	virtual void SendP2PRendezvous( CSteamID steamIDRemote, uint32 unConnectionIDSrc, const void *pMsgRendezvous, uint32 cbRendezvous ) = 0;
	virtual void SendP2PConnectionFailure( CSteamID steamIDRemote, uint32 unConnectionIDDest, uint32 nReason, const char *pszReason ) = 0;
	virtual SteamAPICall_t GetCertAsync() = 0;
	virtual int GetNetworkConfigJSON( void *buf, uint32 cbBuf, const char *pszLauncherPartner ) = 0;
	virtual void CacheRelayTicket( const void *pTicket, uint32 cbTicket ) = 0;
	virtual uint32 GetCachedRelayTicketCount() = 0;
	virtual int GetCachedRelayTicket( uint32 idxTicket, void *buf, uint32 cbBuf ) = 0;
	virtual void PostConnectionStateMsg( const void *pMsg, uint32 cbMsg ) = 0;
    virtual bool GetSTUNServer(int dont_know, char *buf, unsigned int len) = 0;
    virtual bool BAllowDirectConnectToPeer(SteamNetworkingIdentity const &identity) = 0;
};

struct SteamNetworkingSocketsConfigUpdated_t
{
    enum { k_iCallback = k_iSteamNetworkingCallbacks + 95 };
    //TODO total size: 4
    char placeholder[4];
};

struct SteamNetworkingSocketsCert_t
{
    enum { k_iCallback = k_iSteamNetworkingCallbacks + 96 };

    EResult m_eResult;
    uint32 m_cbCert;
    char m_certOrMsg[0x200]; //CMsgSteamDatagramCertificate protobuf
    uint64 m_caKeyID;
    uint32 m_cbSignature;
    char m_signature[0x80];
    uint32 m_cbPrivKey;
    char m_privKey[0x80];
    //total size: 792
    //0
    //4
    //8 []
    //0x208
    //0x20C
    //0x210
    //0x214 []
    //0x294
    //0x298 []
};

struct SteamNetworkingSocketsRecvP2PFailure_t
{
    enum { k_iCallback = k_iSteamNetworkingCallbacks + 97 };
    uint64 steamIDRemote;
    uint32 unConnectionIDDest;
    uint32 placeholder; //not sure what this is supposed to be
    uint32 nReason;
    char pszReason[128];
    //total size: 148
};

struct SteamNetworkingSocketsRecvP2PRendezvous_t
{
    enum { k_iCallback = k_iSteamNetworkingCallbacks + 98 };
    uint64 steamIDRemote;
    uint32 unConnectionIDSrc;
    uint32 m_cbRendezvous;
    char m_MsgRendezvous[512];
    //total size: 528
};


#define STEAMNETWORKINGSOCKETSSERIALIZED_INTERFACE_VERSION "SteamNetworkingSocketsSerialized002"

#endif