#pragma once

#if defined(__PS3__) || defined(__ORBIS__)
#include "..\..\Common\Network\Sony\SQRNetworkManager.h"
#endif


// A struct that we store in the QoS data when we are hosting the session. Max size 1020 bytes.
#ifdef _XBOX
typedef struct _GameSessionData
{
	unsigned short netVersion;										//   2 bytes
	char hostName[XUSER_NAME_SIZE];									//  16 bytes ( 16*1 )
	GameSessionUID hostPlayerUID;										//   8 bytes ( 8*1 ) on xbox, 24 bytes on PS3
	GameSessionUID players[MINECRAFT_NET_MAX_PLAYERS];					//  64 bytes ( 8*8 ) on xbox, 192 ( 24*8) on PS3
	char szPlayers[MINECRAFT_NET_MAX_PLAYERS][XUSER_NAME_SIZE];		// 128 bytes ( 8*16)
	unsigned int m_uiGameHostSettings;								//   4 bytes
	unsigned int texturePackParentId;										//   4 bytes
	unsigned char subTexturePackId;									//   1 byte

	bool isJoinable;												//   1 byte

	_GameSessionData()
	{
		netVersion = 0;
		memset(hostName,0,XUSER_NAME_SIZE);
		memset(players,0,MINECRAFT_NET_MAX_PLAYERS*sizeof(players[0]));
		memset(szPlayers,0,MINECRAFT_NET_MAX_PLAYERS*XUSER_NAME_SIZE);
		isJoinable = true;
		m_uiGameHostSettings = 0;
		texturePackParentId = 0;
		subTexturePackId = 0;
	}
} GameSessionData;
#elif defined __PS3__ || defined __ORBIS__ || defined(__PSVITA__)
typedef struct _GameSessionData
{
	unsigned short netVersion;										//   2 bytes
	GameSessionUID hostPlayerUID;										//   8 bytes ( 8*1 ) on xbox, 24 bytes on PS3
	GameSessionUID players[MINECRAFT_NET_MAX_PLAYERS];					//  64 bytes ( 8*8 ) on xbox, 192 ( 24*8) on PS3
	unsigned int m_uiGameHostSettings;								//   4 bytes
	unsigned int texturePackParentId;										//   4 bytes
	unsigned char subTexturePackId;									//   1 byte

	bool isJoinable;												//   1 byte

	unsigned char playerCount;										//   1 byte
	bool isReadyToJoin;												//   1 byte

	_GameSessionData()
	{
		netVersion = 0;
		memset(players,0,MINECRAFT_NET_MAX_PLAYERS*sizeof(players[0]));
		isJoinable = true;
		m_uiGameHostSettings = 0;
		texturePackParentId = 0;
		subTexturePackId = 0;
		playerCount = 0;
		isReadyToJoin = false;

	}
} GameSessionData;
#else
typedef struct _GameSessionData
{
	unsigned short netVersion;
	unsigned int m_uiGameHostSettings;
	unsigned int texturePackParentId;
	unsigned char subTexturePackId;

	bool isReadyToJoin;
	bool isJoinable;

	char hostIP[64];
	int hostPort;
	wchar_t hostName[XUSER_NAME_SIZE];
	unsigned char playerCount;
	unsigned char maxPlayers;

	_GameSessionData()
	{
		netVersion = 0;
		m_uiGameHostSettings = 0;
		texturePackParentId = 0;
		subTexturePackId = 0;
		isReadyToJoin = false;
		isJoinable = true;
		memset(hostIP, 0, sizeof(hostIP));
		hostPort = 0;
		memset(hostName, 0, sizeof(hostName));
		playerCount = 0;
		maxPlayers = MINECRAFT_NET_MAX_PLAYERS;
	}
} GameSessionData;
#endif

class FriendSessionInfo
{
public:
	SessionID sessionId;
#ifdef _XBOX
	XSESSION_SEARCHRESULT searchResult;
#elif defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__)
	SQRNetworkManager::SessionSearchResult searchResult;
#elif defined(_DURANGO)
	DQRNetworkManager::SessionSearchResult searchResult;
#endif
	wchar_t *displayLabel;
	unsigned char displayLabelLength;
	unsigned char displayLabelViewableStartIndex;
	GameSessionData data;
	bool hasPartyMember;

	FriendSessionInfo()
	{
		displayLabel = NULL;
		displayLabelLength = 0;
		displayLabelViewableStartIndex = 0;
		hasPartyMember = false;
	}

	~FriendSessionInfo()
	{
		if(displayLabel!=NULL)
			delete displayLabel;
	}
};
