TitanInterfaceC.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469
  1. #ifndef ___TITAN_INTERFACEC_H
  2. #define ___TITAN_INTERFACEC_H
  3. #include <wchar.h>
  4. // Homeworld Message Types
  5. #define TITANMSGTYPE_JOINGAMEREQUEST 0x10
  6. #define TITANMSGTYPE_JOINGAMECONFIRM 0x11
  7. #define TITANMSGTYPE_JOINGAMEREJECT 0x12
  8. #define TITANMSGTYPE_UPDATEGAMEDATA 0x20
  9. #define TITANMSGTYPE_LEAVEGAMEREQUEST 0x30
  10. #define TITANMSGTYPE_GAMEISSTARTING 0x40
  11. #define TITANMSGTYPE_PING 0x50
  12. #define TITANMSGTYPE_PINGREPLY 0x51
  13. #define TITANMSGTYPE_GAME 0x60
  14. #define TITANMSGTYPE_GAMEDISOLVED 0x70
  15. #define TITANMSGTYPE_UPDATEPLAYER 0x80
  16. #define TITANMSGTYPE_BEGINSTARTGAME 0x90
  17. #define TITANMSGTYPE_CHANGEADDRESS 0xa0
  18. #define TITANMSGTYPE_REQUESTPACKETS 0xb0
  19. #define TITANMSGTYPE_RECONNECT 0xc0
  20. #define TITANMSGTYPE_KICKPLAYER 0xd0
  21. #define MAX_VERSION_STRING_LEN 64
  22. #define MAX_NETWORKVERSION_STRING_LEN 16
  23. #define MAX_CHANNEL_NAME_LEN 32
  24. #define MAX_CHANNEL_DESCRIPTION_LEN 32
  25. #define MAX_SERVER_NAME_LEN 32
  26. #define MAX_SERVER_DESCRIPTION_LEN 32
  27. #define MAX_TITAN_GAME_NAME_LEN 32
  28. #define MAX_PASSWORD_LEN 20
  29. #define MAX_MAPNAME_LEN 32
  30. #define MAX_PERSONAL_NAME_LEN 18 // if change change in globals.h to match
  31. #define TP_ScenarioListLength 200 // fix later
  32. #define TP_ChannelListLength 200 // fix later
  33. #define TP_ServerListLength 200 // fix later
  34. #define MAX_LAN_ADVERT_LEN 1500
  35. #define GAME_IN_PROGRESS 0x01
  36. typedef struct Address
  37. {
  38. union {
  39. unsigned long IP;
  40. unsigned char etherAddr[6];
  41. } AddrPart;
  42. unsigned short Port;
  43. } Address;
  44. #define CreateInternetAddress(addr,ip,port) \
  45. addr.AddrPart.IP = ip; \
  46. addr.Port = port;
  47. #define CreateEthernetAddress(addr,etheraddr,port) \
  48. addr.AddrPart.etherAddr = etheraddr; \
  49. addr.Port = port;
  50. #define GetIPFromInternetAddress(addr) ((addr).AddrPart.IP)
  51. #define GetPortFromInternetAddress(addr) ((addr).Port)
  52. #define InternetAddressesAreEqual(addr1,addr2) ((addr1).AddrPart.IP == (addr2).AddrPart.IP)
  53. #define InternetAddressesAndPortsAreEqual(addr1,addr2) (((addr1).AddrPart.IP == (addr2).AddrPart.IP) && ((addr1).Port == (addr2).Port))
  54. #define EthernetAddressesAreEqual(addr1,addr2) ( (*((unsigned long *)&((addr1).AddrPart.etherAddr[0])) == *((unsigned long *)&((addr2).AddrPart.etherAddr[0]))) && ((addr1).AddrPart.etherAddr[4] == (addr2).AddrPart.etherAddr[4]) && ((addr1).AddrPart.etherAddr[5] == (addr2).AddrPart.etherAddr[5]) )
  55. #define EthernetAddressesAndPortsAreEqual(addr1,addr2) (EthernetAddressesAreEqual(addr1,addr2) && ((addr1).Port == (addr2).Port))
  56. #define AddressesAreEqual(addr1,addr2) ((!IPGame) ? (EthernetAddressesAreEqual((addr1),(addr2))) : (InternetAddressesAreEqual((addr1),(addr2))))
  57. #define AddressesAndPortsAreEqual(addr1,addr2) ((!IPGame) ? (EthernetAddressesAndPortsAreEqual((addr1),(addr2))) : (InternetAddressesAndPortsAreEqual((addr1),(addr2))))
  58. #define GAMEKEY_SIZE 8
  59. void PrintAddressToString(char *buffer,Address *address);
  60. typedef struct
  61. {
  62. Address routingAddress; // Address of routing mechanism
  63. Address oldCaptainAddress; // Old address of captain
  64. Address newCaptainAddress; // New address of captain
  65. } BeginStartGamePacket;
  66. typedef struct
  67. {
  68. Address oldAddress;
  69. Address newAddress;
  70. } ChangeAddressPacket;
  71. typedef struct
  72. {
  73. unsigned long firstPacket;
  74. unsigned long lastPacket;
  75. } RequestPacketsPacket;
  76. typedef struct
  77. {
  78. Address captainAddress;
  79. Address pingAddress;
  80. char versionInfo[MAX_NETWORKVERSION_STRING_LEN];
  81. char userBehindFirewall;
  82. unsigned char pad[3];
  83. unsigned char sessionKey[GAMEKEY_SIZE]; // filled in by TitanInterface.cpp when we create a internet game
  84. unsigned short flag;
  85. unsigned char numPlayers;
  86. unsigned char stringdatalength; // contains Password and Mapnam
  87. wchar_t stringdata[1];
  88. } DirectoryCustomInfo;
  89. typedef struct
  90. {
  91. Address captainAddress;
  92. Address pingAddress;
  93. char versionInfo[MAX_NETWORKVERSION_STRING_LEN];
  94. char userBehindFirewall;
  95. unsigned char pad[3];
  96. unsigned char sessionKey[GAMEKEY_SIZE]; // filled in by TitanInterface.cpp when we create a internet game
  97. unsigned short flag;
  98. unsigned char numPlayers;
  99. unsigned char stringdatalength;
  100. wchar_t stringdata[MAX_PASSWORD_LEN+MAX_MAPNAME_LEN];
  101. } DirectoryCustomInfoMax;
  102. typedef struct
  103. {
  104. Address address;
  105. unsigned short playerIndex;
  106. unsigned long baseColor;
  107. unsigned long stripeColor;
  108. unsigned long colorsPicked;
  109. unsigned short race;
  110. char behindFirewall;
  111. unsigned char pad[3];
  112. char PersonalName[MAX_PERSONAL_NAME_LEN];
  113. } PlayerInfo;
  114. typedef struct
  115. {
  116. unsigned long baseColor;
  117. unsigned long stripeColor;
  118. unsigned long colorsPicked;
  119. unsigned short race;
  120. char behindFirewall;
  121. unsigned char pad[3];
  122. char PersonalName[MAX_PERSONAL_NAME_LEN];
  123. } PlayerJoinInfo;
  124. typedef struct CaptainGameInfo
  125. {
  126. wchar_t Name[MAX_TITAN_GAME_NAME_LEN];
  127. wchar_t Password[MAX_PASSWORD_LEN];
  128. char MapName[MAX_MAPNAME_LEN];
  129. char DisplayMapName[MAX_MAPNAME_LEN];
  130. char userBehindFirewall;
  131. unsigned char pad[3];
  132. unsigned char numComputers;
  133. unsigned char startingFleet;
  134. unsigned char bountySize;
  135. unsigned char startingResources;
  136. unsigned long resourceInjectionInterval;
  137. unsigned long resourceInjectionsAmount;
  138. unsigned long resourceLumpSumTime;
  139. unsigned long resourceLumpSumAmount;
  140. unsigned char aiplayerDifficultyLevel;
  141. unsigned char aiplayerBigotry;
  142. unsigned short pad2;
  143. unsigned short flag;
  144. unsigned short numPlayers;
  145. PlayerInfo playerInfo[8]; // MAX_MULTIPLAYER_PLAYERS
  146. // all new options here
  147. } CaptainGameInfo;
  148. typedef struct
  149. {
  150. wchar_t Name[MAX_TITAN_GAME_NAME_LEN];
  151. DirectoryCustomInfoMax directoryCustomInfo;
  152. }
  153. tpscenario;
  154. // flags for roomflags of tpchannel
  155. #define ROOMFLAGS_LANGUAGE_MASK 0x0ff
  156. #define ROOMFLAGS_PASSWORDPROTECTED 0x100
  157. #define ROOMFLAGS_ADEFAULTROOM 0x200
  158. typedef struct
  159. {
  160. wchar_t ChannelName[MAX_CHANNEL_NAME_LEN];
  161. wchar_t ChannelDescription[MAX_CHANNEL_DESCRIPTION_LEN];
  162. unsigned int roomflags;
  163. unsigned int roomfullness;
  164. unsigned char addressstore[6];
  165. }
  166. tpchannel;
  167. typedef struct TPChannelList
  168. {
  169. unsigned long numChannels;
  170. tpchannel tpChannels[TP_ChannelListLength];
  171. void *mutex;
  172. unsigned long newDataArrived;
  173. } TPChannelList;
  174. typedef struct
  175. {
  176. wchar_t ServerName[MAX_SERVER_NAME_LEN];
  177. wchar_t ServerDescription[MAX_SERVER_DESCRIPTION_LEN];
  178. unsigned int flags;
  179. unsigned int reliability;
  180. unsigned int ping;
  181. unsigned char addressstore[6];
  182. }
  183. tpserver;
  184. typedef struct TPServerList
  185. {
  186. unsigned long numServers;
  187. tpserver tpServers[TP_ServerListLength];
  188. void *mutex;
  189. unsigned newDataArrived;
  190. } TPServerList;
  191. #define sizeofDirectoryCustomInfo(n) (sizeof(DirectoryCustomInfo) + (n).stringdatalength - 1)
  192. void SetChannel(wchar_t *channel,wchar_t *description);
  193. void ResetChannel(void);
  194. wchar_t *GetCurrentChannel(void);
  195. wchar_t *GetCurrentChannelDescription(void);
  196. extern int ChannelProtectedFlag;
  197. extern wchar_t ChannelPassword[MAX_PASSWORD_LEN];
  198. void titanGameMsgReceivedCB(const void *blob,unsigned short bloblen);
  199. //void titanQueryRoutingServers(void);
  200. void titanGotNumUsersInRoomCB(const wchar_t *theRoomName, int theNumUsers);
  201. unsigned long titanStart(unsigned long isLan, unsigned long isIP); // returns 1 if succesful, 0 if failed
  202. unsigned long titanCheckCanNetwork(unsigned long isLan, unsigned long isIP); // returns 1 if can network, 0 if can't. Assumes titanInterface not initialized
  203. // --MikeN
  204. // Call this method to begin shutdown of titan. Parameters specify packet to send
  205. // to connected client(s) (a shutdown message). The callback titanNoClientsCB() will
  206. // be invoked when complete.
  207. void titanStartShutdown(unsigned long titanMsgType, const void* thePacket,
  208. unsigned short theLen);
  209. void titanLeaveGameNotify(void);
  210. void titanShutdown(void);
  211. void titanRefreshRequest(char* theDir);
  212. unsigned long titanReadyToStartGame(unsigned char *routingaddress);
  213. unsigned long titanBehindFirewall(void);
  214. void mgGameStartReceivedCB(const void *blob,unsigned short bloblength);
  215. void titanCreateGame(wchar_t *str, DirectoryCustomInfo* myInfo);
  216. void titanRemoveGame(wchar_t *str);
  217. void titanCreateDirectory(char *str, char* desc);
  218. void titanSendLanBroadcast(const void* thePacket, unsigned short theLen);
  219. void titanReceivedLanBroadcastCB(const void* thePacket, unsigned short theLen);
  220. void titanSendPacketTo(Address *address, unsigned char titanMsgType,
  221. const void* thePacket, unsigned short theLen);
  222. void titanBroadcastPacket(unsigned char titanMsgType, const void* thePacket, unsigned short theLen);
  223. void titanAnyoneSendPacketTo(Address *address, unsigned char titanMsgType,
  224. const void* thePacket, unsigned short theLen);
  225. void titanAnyoneBroadcastPacket(unsigned char titanMsgType, const void* thePacket, unsigned short theLen);
  226. void titanConnectToClient(Address *address);
  227. int titanStartChatServer(wchar_t *password);
  228. void titanSendPing(Address *address,unsigned int pingsizebytes);
  229. void titanSendPointMessage(int playerIndex,unsigned char *packet,unsigned long sizeofPacket);
  230. void titanSendBroadcastMessage(unsigned char *packet,unsigned long sizeofPacket);
  231. void titanAnyoneSendPointMessage(int playerIndex,unsigned char *packet,unsigned long sizeofPacket);
  232. void titanAnyoneSendBroadcastMessage(unsigned char *packet,unsigned long sizeofPacket);
  233. void titanPumpEngine();
  234. void titanSetGameKey(unsigned char *key);
  235. const unsigned char *titanGetGameKey(void);
  236. // callback for when titan gets valid version strings (one string, multiple version strings seperated by tabs)
  237. void titanGotValidVersionStrings(char *validversions);
  238. void titanResetValidVersions(); // clears ValidVersions string
  239. Address titanGetMyPingAddress(void);
  240. //--MikeN
  241. // This method is invoked when the last client connection is closed. Note that this
  242. // may happen at times other than shutdown.
  243. void titanNoClientsCB(void);
  244. unsigned long titanConfirmReceivedCB(Address *address,const void *blob,unsigned short bloblen);
  245. unsigned long titanRejectReceivedCB(Address *address,const void *blob,unsigned short bloblen);
  246. void titanStartChatReplyReceivedCB(short theStatus);
  247. void titanUpdateGameDataCB(const void *blob,unsigned short bloblen);
  248. void titanPingReplyReceivedCB(Address *address,unsigned long theLag);
  249. unsigned long titanLeaveGameReceivedCB(Address *address,const void *blob,unsigned short bloblen);
  250. void titanLeaveGame(int shutdown);
  251. #define REQUEST_RECV_CB_DENYANDCLOSE -1
  252. #define REQUEST_RECV_CB_JUSTDENY 0
  253. #define REQUEST_RECV_CB_ACCEPT 1
  254. signed long titanRequestReceivedCB(Address *address,const void *blob,unsigned short bloblen);
  255. void tpLockChannelList();
  256. void tpUnLockChannelList();
  257. void tpLockServerList();
  258. void tpUnLockServerList();
  259. //void titanGetMyAddress(Address *address);
  260. int titanGetPatch(char *filename,char *saveFileName);
  261. void titanPatchProgressCB(int lenSoFar,int totalLen);
  262. void titanGetPatchCompleteCB(void);
  263. void titanGetPatchFailedCB(int patchFailErrorMsg);
  264. #define PATCHFAIL_UNABLE_TO_CONNECT 1
  265. #define PATCHFAIL_ERROR_SENDING_REQUEST 2
  266. #define PATCHFAIL_ERROR_RECEIVING_HTTP_HEADER 3
  267. #define PATCHFAIL_INVALID_FILE_LENGTH 4
  268. #define PATCHFAIL_UNABLE_TO_CREATE_FILE 5
  269. #define PATCHFAIL_UNABLE_TO_WRITE_FILE 6
  270. #define PATCHFAIL_ERROR_RECEIVING_PATCH 7
  271. #define PATCHFAIL_UNABLE_TO_START_DOWNLOAD_THREAD 8
  272. #define PATCHFAIL_USERABORT 9
  273. #define PATCHFAIL_INVALID_STATUS_REPLY 10
  274. extern int patchAbortRequest;
  275. void titanReplaceGameInfo(wchar_t *str, DirectoryCustomInfo* myInfo, unsigned long replaceTimeout);
  276. void titanUpdatePlayerCB(Address *address, const void *blob, unsigned short bloblen);
  277. // Callbacks for chatting, user joined user left, etc..
  278. void chatConnect(wchar_t *password);
  279. void chatClose(void);
  280. void BroadcastChatMessage(unsigned short size, const void* chatData);
  281. void SendPrivateChatMessage(unsigned long* userIDList, unsigned short numUsersInList,
  282. unsigned short size, const void* chatData);
  283. void chatReceiveUserJoinReply(short status, unsigned long userID);
  284. void chatReceiveUsersHere(const char *name, unsigned long userID);
  285. void chatReceiveUsersJoined(const char *name, unsigned long userID);
  286. void chatReceiveMessage(unsigned long originUserID, signed long whisper,unsigned long type, unsigned long size, const void* chatData);
  287. void chatReceiveUserLeft(unsigned long userID);
  288. int authReceiveReply(short status);
  289. void authAuthenticate(char *loginName, char *password);
  290. void authCreateUser(char *loginName, char *password);
  291. void authChangePassword(char *loginName, char *oldpassword, char *newpassword);
  292. void mgNotifyAuthRequestFailed(void);
  293. void mgNotifyGameDisolved(void);
  294. void mgNotifyKickedOut(void);
  295. // Functions to call from the titan code for the connection state machine
  296. void cNotifyChatInfo(void);
  297. void cNotifyDirStatus(short theStatus);
  298. void mgNotifyDirRequestFailed();
  299. void cNotifyGameCreationStatus(short theStatus);
  300. void cNotifyChatConnectFailed(void);
  301. void cNotifyOffline(const signed long theStatus);
  302. void cNotifyCurrentRoomPresent(int present);
  303. void cNotifyRoomListPresent(void);
  304. extern TPChannelList tpChannelList;
  305. extern TPServerList tpServerList;
  306. extern CaptainGameInfo tpGameCreated;
  307. void mgGameListGameAdded(tpscenario *thegame);
  308. void mgGameListGameRemoved(tpscenario *thegame);
  309. void mgGameListGameChanged(tpscenario *thegame);
  310. void mgGameListNew(void);
  311. int titanLoadPublicKey(char *filename,unsigned char **buffer);
  312. int titanSaveWonstuff();
  313. extern Address myAddress;
  314. extern unsigned long TitanActive;
  315. extern int LANGame;
  316. extern int IPGame;
  317. #define MAX_PORTS 10
  318. #define MAX_IPS (MAX_PORTS)
  319. #define MAXIP_STRLEN 50
  320. extern char PATCHNAME[];
  321. extern unsigned long DIRSERVER_NUM;
  322. extern unsigned long PATCHSERVER_NUM;
  323. extern unsigned long DIRSERVER_PORTS[MAX_PORTS];
  324. extern unsigned long PATCHSERVER_PORTS[MAX_PORTS];
  325. typedef char ipString[MAXIP_STRLEN];
  326. extern ipString DIRSERVER_IPSTRINGS[MAX_IPS];
  327. extern ipString PATCHSERVER_IPSTRINGS[MAX_IPS];
  328. extern unsigned long HomeworldCRC[4];
  329. #define FIREWALL_NOTBEHIND 0
  330. #define FIREWALL_BEHIND 1
  331. #define FIREWALL_AUTODETECT 2
  332. extern unsigned long firewallButton;
  333. extern long CONNECT_TIMEOUT;
  334. extern int sigsNumPlayers;
  335. extern int sigsPlayerIndex;
  336. extern int sigsPressedStartGame;
  337. // is person waiting for a game ?
  338. extern int WaitingForGame;
  339. // did the person create the game
  340. extern int GameCreator;
  341. extern signed int captainIndex;
  342. #define IAmCaptain (sigsPressedStartGame ? (sigsPlayerIndex == captainIndex) : (GameCreator))
  343. #define CaptainNotDefined (captainIndex == -1)
  344. extern wchar_t GameWereInterestedIn[MAX_TITAN_GAME_NAME_LEN];
  345. extern void *GameWereInterestedInMutex;
  346. void mgGameInterestedIn(wchar_t *interested);
  347. void mgGameInterestedOff();
  348. extern unsigned long TitanReadyToShutdown;
  349. extern unsigned long WAIT_SHUTDOWN_MS;
  350. void titanWaitShutdown(void);
  351. void titanConnectingCancelHit(void);
  352. #endif