Something went wrong. Try again.
Command and Conquer: Red Alert
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341/*** Command & Conquer Red Alert(tm)** Copyright 2025 Electronic Arts Inc.**** This program is free software: you can redistribute it and/or modify** it under the terms of the GNU General Public License as published by** the Free Software Foundation, either version 3 of the License, or** (at your option) any later version.**** This program is distributed in the hope that it will be useful,** but WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the** GNU General Public License for more details.**** You should have received a copy of the GNU General Public License** along with this program. If not, see <http://www.gnu.org/licenses/>.*/
#ifdef WOLAPI_INTEGRATION
#ifndef WIN32#error WOLAPI_INTEGRATION can't be specified for non WIN32 version!#endif
// rawolapi.h - WOLAPI sinks declarations.// ajw 07/10/98
// Based somewhat on Neal's Borlandized version, "chatapi.h".
#ifndef RAWOLAPI_H#define RAWOLAPI_H
#include "function.h"
//#include "cominit.h"#include <stdio.h>
// From OBJBASE.H#define interface struct
// From RPCNDR.H#define DECLSPEC_UUID(x)
#include <commctrl.h>
//namespace WOL // namespace is workaround due to the use of "Server" as a global in Red Alert.// ajw - Can't use namespaces in Watcom 10.5 it seems...//{ #include "wolapi\wolapi.h" #define IID_DEFINED //#include "wlib/wdebug.h" #include "wolapi\chatdefs.h" #include "wolapi\downloaddefs.h" #include "wolapi\ftpdefs.h"//};//using namespace WOL;#include <winerror.h>//#include <ocidl.h>#include <olectl.h>
//***********************************************************************************************// For debugging chat defined hresults...void ChatDefAsText( char* szDesc, HRESULT hRes );void DebugChatDef( HRESULT hRes );
int iChannelLobbyNumber( const unsigned char* szChannelName );#define REASONABLELOBBYINTERPRETEDNAMELEN 50void InterpretLobbyNumber( char* szLobbyNameToSet, int iLobby );
class WolapiObject;
#define MAXCHATSENDLENGTH 71 // Mainly aesthetic, and because of the length of edit line.
enum CHANNELFILTER{ CHANNELFILTER_NO, CHANNELFILTER_OFFICIAL, CHANNELFILTER_UNOFFICIAL, CHANNELFILTER_LOBBIES, CHANNELFILTER_LOCALLOBBYGAMES,};
#define WOLCOLORREMAP_ACTION PCOLOR_GREY#define WOLCOLORREMAP_SELFSPEAKING PCOLOR_RED#define WOLCOLORREMAP_LOCALMACHINEMESS PCOLOR_REALLY_BLUE // Color of system messages that originate locally.#define WOLCOLORREMAP_PAGE PCOLOR_GOLD#define WOLCOLORREMAP_KICKORBAN PCOLOR_GREEN //LTBLUE#define WOLCOLORREMAP_PUBLICMESSAGE PCOLOR_NONE#define WOLCOLORREMAP_PRIVATEMESSAGE PCOLOR_ORANGE
#define WOLSOUND_ERROR VOC_SYS_ERROR#define WOLSOUND_LOGIN VOC_RADAR_ON#define WOLSOUND_LOGOUT VOC_RADAR_OFF#define WOLSOUND_ENTERCHAN VOC_PLAYER_JOINED#define WOLSOUND_EXITCHAN VOC_PLAYER_LEFT#define WOLSOUND_ONPAGE VOC_INCOMING_MESSAGE#define WOLSOUND_KICKORBAN VOC_TANYA_KISS#define WOLSOUND_ENTERGAME VOC_INVULNERABLE#define WOLSOUND_EXITGAME VOC_DOOR
enum DISCONNECT_PING_STATUS{ PING_UNSTARTED, PING_WAITING, PING_GOOD, PING_BAD,};#define DISCONNECT_PING_COUNT 5
//***********************************************************************************************class RAChatEventSink : /////public CComObjectRoot, /////public IConnectionPoint, public IChatEvent{ public: RAChatEventSink( WolapiObject* pOwner ); virtual ~RAChatEventSink();
// BEGIN_COM_MAP(RAChatEventSink)// COM_INTERFACE_ENTRY(IChatEvent)// END_COM_MAP()
// IUnknown STDMETHOD(QueryInterface)(const IID& iid, void **ppv); STDMETHOD_(ULONG,AddRef)(); STDMETHOD_(ULONG,Release)();
// IChatEvent STDMETHOD(OnServerList)(HRESULT res, Server* servers); STDMETHOD(OnLogout)(HRESULT r, User *user); STDMETHOD(OnBusy)(HRESULT r); STDMETHOD(OnIdle)(HRESULT r); STDMETHOD(OnPageSend)(HRESULT r); STDMETHOD(OnPaged)(HRESULT r, User *, LPCSTR); STDMETHOD(OnFind)(HRESULT r, Channel *); STDMETHOD(OnConnection)(HRESULT r,LPCSTR motd); STDMETHOD(OnChannelCreate)(HRESULT r, Channel *channel); STDMETHOD(OnChannelModify)(HRESULT r, Channel *channel); STDMETHOD(OnChannelJoin)(HRESULT r, Channel *channel, User *user); STDMETHOD(OnChannelLeave)(HRESULT r, Channel *channel, User *user); STDMETHOD(OnChannelTopic)(HRESULT r, Channel *channel, LPCSTR topic); STDMETHOD(OnGroupList)(HRESULT r, Group *); STDMETHOD(OnPublicMessage)(HRESULT r, Channel *channel, User *user, LPCSTR text); STDMETHOD(OnPrivateMessage)(HRESULT r, User *user,LPCSTR text); STDMETHOD(OnSystemMessage)(HRESULT r, LPCSTR); STDMETHOD(OnNetStatus)(HRESULT r); STDMETHOD(OnChannelList)(HRESULT r, Channel* channels); STDMETHOD(OnUserList)(HRESULT r, Channel* channel, User* users); STDMETHOD(OnUpdateList)(HRESULT res, Update *); STDMETHOD(OnServerError)(HRESULT res); STDMETHOD(OnMessageOfTheDay)(HRESULT res, LPCSTR); STDMETHOD(OnPrivateAction)(HRESULT r, User *, LPCSTR); STDMETHOD(OnPublicAction)(HRESULT r, Channel *, User *, LPCSTR); STDMETHOD(OnPrivateGameOptions)(HRESULT r, User *, LPCSTR); STDMETHOD(OnPublicGameOptions)(HRESULT r, Channel *, User *, LPCSTR); STDMETHOD(OnGameStart)(HRESULT r, Channel *, User *, int); STDMETHOD(OnUserKick)(HRESULT r, Channel *, User *, User *); STDMETHOD(OnUserIP)(HRESULT r, User *); STDMETHOD(OnServerError)(HRESULT res, LPCSTR ircmsg); STDMETHOD(OnServerBannedYou)(HRESULT r, time_t bannedTill); STDMETHOD(OnUserFlags)(HRESULT r, LPCSTR name, unsigned int flags, unsigned int mask); STDMETHOD(OnChannelBan)(HRESULT r, LPCSTR name, int banned);
unsigned long GetPlayerGameIP( const char* szPlayerName ) const; void DeleteUserList(); // Deletes from heap all users pointed to through pUserList. void DeleteUserIPList(); unsigned long GetUserIP( const char* szName ) const; void ActionEggSound( const char* szMessage );
public: // These vars are rather hackish. Basically, they are set before a callback is expected to be fired, and // then checked immediately afterwards. The rest of the time, their values are meaningless. // The idea is to force wolapi act in a modal way. In many places I "block" until a callback response to a // wolapi request has been received. bool bRequestServerListWait; bool bRequestConnectionWait; bool bRequestLogoutWait;// bool bRequestChannelListWait; bool bRequestChannelJoinWait; bool bRequestChannelLeaveWait; bool bRequestUserListWait; bool bRequestChannelCreateWait; bool bRequestFindWait; bool bRequestPageWait;
bool bRequestChannelListForLobbiesWait;
bool bIgnoreChannelLists; // Used to temporarily turn off response to channel lists, when we are in the midst // of some processing that depends on pChannelList remaining constant.
bool bRequestGameStartWait;
Server* pServer; // Server to connect to, acquired from OnServerList. bool bConnected; // True when user is logged in to chat server. bool bJoined; // True when user has joined a channel.
Channel* pChannelList; // First element of channel list, or null. CHANNELFILTER ChannelFilter; // Affects what channels are included in channel list when built.
User* pUserList; // First element of user list, or null. User* pUserTail; // Last element of user list, or null.
char* szMotd; // Message of the day. HRESULT hresRequestConnectionError; // Used to pass error hresult. HRESULT hresRequestFindResult; // Used to pass hresult. Channel OnFindChannel;
HRESULT hresRequestPageResult; // Used to pass hresult.
HRESULT hresRequestJoinResult; // Used to pass hresult.
bool bGotKickedTrigger; // Special flag meaning do some more processing after callback has exited.
User* pGameUserList; // First element of start game user list, or null. int iGameID; // WW Online game id received from OnGameStart. // Is also a flag indicating "OnGameStart() called, TriggerGameStart() not yet called".
User* pUserIPList; // List that holds user IP's, used for pinging in game channel. User* pUserIPListTail;
protected: WolapiObject* pOwner; // Link back to the object that contains me.
void DeleteChannelList(); // Deletes from heap all channels pointed to through pChannelList. bool DownloadUpdates( Update* pUpdateList, int iUpdates ); bool bSpecialMessage( const char* szMessage ); void InsertUserSorted( User* pUserNew );
private: long m_cRef; // Reference Count
};
//***********************************************************************************************class RADownloadEventSink : /////////// public CComObjectRoot, public IDownloadEvent{public: RADownloadEventSink(); virtual ~RADownloadEventSink() {};
// BEGIN_COM_MAP(RADownloadEventSink)// COM_INTERFACE_ENTRY(IDownloadEvent)// END_COM_MAP()
// IUnknown STDMETHOD(QueryInterface)(const IID& iid, void **ppv); STDMETHOD_(ULONG,AddRef)(); STDMETHOD_(ULONG,Release)();
// IDownloadEvent STDMETHOD(OnEnd)(void); STDMETHOD(OnError)(int error); STDMETHOD(OnProgressUpdate)(int bytesread, int totalsize, int timetaken, int timeleft); STDMETHOD(OnStatusUpdate)(int status); STDMETHOD(OnQueryResume)(void);
public: bool bFlagEnd; bool bFlagError; bool bFlagProgressUpdate; bool bFlagStatusUpdate; bool bFlagQueryResume; int iBytesRead; int iTotalSize; int iTimeTaken; int iTimeLeft; int iStatus; bool bResumed;
private: long m_cRef; // Ref count};
//***********************************************************************************************class RANetUtilEventSink :// public CComObjectRoot, public INetUtilEvent{public: RANetUtilEventSink( WolapiObject* pOwner ); virtual ~RANetUtilEventSink();
//BEGIN_COM_MAP(CNetUtilEventSink)// COM_INTERFACE_ENTRY(INetUtilEvent)//END_COM_MAP()
// IUnknown STDMETHOD(QueryInterface)(const IID& iid, void **ppv); STDMETHOD_(ULONG,AddRef)(); STDMETHOD_(ULONG,Release)();
// INetUtilEvent
STDMETHOD(OnGameresSent)(HRESULT res); STDMETHOD(OnLadderList)(HRESULT res, Ladder *list, int totalCount, long timeStamp, int keyRung); STDMETHOD(OnPing)(HRESULT res, int time, unsigned long ip, int handle);
void DeleteLadderList(); // Deletes from heap all users pointed to through pUserList. unsigned int GetUserRank( const char* szName, bool bRankRA );
Ladder* pLadderList; // First element of Ladder list, or null. Ladder* pLadderTail; // Last element of Ladder list, or null. Ladder* pLadderListAM; // First element of Aftermath Ladder list, or null. Ladder* pLadderTailAM; // Last element of Aftermath Ladder list, or null.
protected: WolapiObject* pOwner; // Link back to the object that contains me.
private: long m_cRef; // Reference Count};
//***********************************************************************************************
// SKU, reported to WOLAPI for the purpose of finding patches.#ifdef ENGLISH#define GAME_SKU 0x1500#else#ifdef GERMAN#define GAME_SKU 0x1502#else#define GAME_SKU 0x1503#endif#endif
#define GAME_VERSION 0x00030003#define GAME_TYPE 21#define LOB_PREFIX "Lob_21_"
// Sent to gameres server in order to receive Red Alert or Aftermath ladder rankings. (Sent in RequestLadderList.)#define LADDER_CODE_RA 1005#define LADDER_CODE_AM 500
#endif
#endif