1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
|
/*
GameSpy Peer SDK
Dan "Mr. Pants" Schoenblum
dan@gamespy.com
Copyright 1999-2007 GameSpy Industries, Inc
devsupport@gamespy.com
*/
#ifndef _PEERMAIN_H_
#define _PEERMAIN_H_
/*************
** INCLUDES **
*************/
#include "peer.h"
#include "../darray.h"
#include "../hashtable.h"
#include "../pinger/pinger.h"
#include "../Chat/chatASCII.h"
#ifdef __cplusplus
extern "C" {
#endif
#if 0
piConnection * connection; // This is to fool Visual Assist.
#endif
/************
** DEFINES **
************/
#define PI_ROOM_MAX_LEN 257
#define PI_NICK_MAX_LEN 64
#define PI_NAME_MAX_LEN 512
#define PI_TITLE_MAX_LEN 32
#define PI_AWAY_MAX_LEN 128
#define PI_SB_LEN 32 // from sb_internal.h
#ifndef PI_CHAT_PING_TIME
#ifndef _NITRO
#define PI_CHAT_PING_TIME (5 * 60000)
#else
#define PI_CHAT_PING_TIME (20000)
#endif
#endif
#define PEER_CONNECTION piConnection * connection;\
assert(peer);\
connection = (piConnection *)peer;\
GSI_UNUSED(connection);
#define ASSERT_ROOMTYPE(type) assert((type == TitleRoom) || (type == GroupRoom) || (type == StagingRoom))
#define ASSERT_MESSAGETYPE(type) assert((type == NormalMessage) || (type == ActionMessage) || (type == NoticeMessage))
#define ROOM (connection->rooms[roomType])
#define ROOM_W (connection->rooms_W[roomType])
#define ROOMS (connection->rooms)
#define NAME (connection->names[roomType])
#define NAME_W (connection->names_W[roomType])
#define NAMES (connection->names)
#define IN_ROOM (connection->inRoom[roomType])
#define ENTERING_ROOM (connection->enteringRoom[roomType])
#define strzcpy(dest, src, len) { strncpy(dest, src, (len)); (dest)[(len) - 1] = '\0'; }
#define strzcat(dest, src, len) { strncat(dest, src, (len) - strlen(dest)); (dest)[(len) - 1] = '\0'; }
#if defined(_PS3)
#define PEERCBType void* // Note: ANSI function pointers should int rather than void*
#else
#define PEERCBType int // Note: ANSI function pointers should int rather than void*
#endif
/**********
** TYPES **
**********/
typedef struct piConnection
{
// Chat.
////////
CHAT chat; // The chat connection.
char nick[PI_NICK_MAX_LEN]; // The local nick.
PEERBool connecting;
PEERBool connected;
peerNickErrorCallback nickErrorCallback;
gsi_time lastChatPing;
// Game.
////////
unsigned int publicIP;
unsigned int privateIP;
int profileID;
char title[PI_TITLE_MAX_LEN];
#ifdef GSI_UNICODE
unsigned short title_W[PI_TITLE_MAX_LEN];
unsigned short nick_W[PI_NICK_MAX_LEN];
unsigned short names_W[NumRooms][PI_NAME_MAX_LEN];
unsigned short rooms_W[NumRooms][PI_ROOM_MAX_LEN];
#endif
// Rooms.
/////////
char rooms[NumRooms][PI_ROOM_MAX_LEN];
PEERBool enteringRoom[NumRooms];
PEERBool inRoom[NumRooms];
char names[NumRooms][PI_NAME_MAX_LEN];
int oldFlags[NumRooms];
int groupID;
char titleRoomChannel[PI_ROOM_MAX_LEN];
PEERBool stayInTitleRoom;
// Players.
///////////
HashTable players;
int numPlayers[NumRooms];
PEERBool alwaysRequestPlayerInfo;
// Ping.
////////
PEERBool doPings;
int lastPingTimeMod;
PEERBool pingRoom[NumRooms];
PEERBool xpingRoom[NumRooms];
HashTable xpings;
unsigned int lastXpingSend;
// Reporting.
/////////////
qr2_t queryReporting;
char qrSecretKey[64]; // i ripped the length from qr2.c
PEERBool natNegotiate;
int reportingOptions;
int reportingGroupID; // might be different than groupID if left group room after started reporting
// Hosting.
///////////
PEERBool hosting;
PEERBool playing;
int maxPlayers;
PEERBool passwordedRoom;
// Staging room.
////////////////
SBServer hostServer;
PEERBool ready;
// SB.
//////
char sbName[PI_SB_LEN];
char sbSecretKey[PI_SB_LEN];
int sbGameVersion;
int sbMaxUpdates;
PEERBool sbInitialized;
SBServerList gameList;
SBServerList groupList;
SBQueryEngine gameEngine;
peerListingGamesCallback gameListCallback;
void * gameListParam;
PEERBool initialGameList;
struct piOperation * listingGroupsOperation;
// ID.
//////
int nextID;
// Operations.
//////////////
DArray operationList;
int operationsStarted;
int operationsFinished;
// Callbacks.
/////////////
PEERCallbacks callbacks;
DArray callbackList;
int callbacksQueued;
int callbacksCalled;
int callbackDepth;
// Away.
////////
PEERBool away;
char awayReason[PI_AWAY_MAX_LEN];
// Keys.
////////
HashTable globalWatchKeys[NumRooms];
HashTable roomWatchKeys[NumRooms];
HashTable globalWatchCache;
HashTable roomWatchCache[NumRooms];
// AutoMatch.
/////////////
PEERAutoMatchStatus autoMatchStatus;
SBServerList autoMatchList;
SBQueryEngine autoMatchEngine;
PEERBool autoMatchBrowsing;
struct piOperation * autoMatchOperation;
qr2_t autoMatchReporting;
char * autoMatchFilter;
PEERBool autoMatchSBFailed;
PEERBool autoMatchQRFailed;
// Misc.
////////
PEERBool disconnect;
PEERBool shutdown;
} piConnection;
void piSendChannelUTM(PEER peer, const char * channel, const char * command, const char * parameters, PEERBool authenticate);
void piSendPlayerUTM(PEER peer, const char * nick, const char * command, const char * parameters, PEERBool authenticate);
PEERBool piConnectTitle(PEER peer);
void piDisconnectTitle(PEER peer);
#ifdef __cplusplus
}
#endif
#endif
|