CnC_Remastered_Collection/REDALERT/RAWOLAPI.H

338 lines
11 KiB
C++

//
// Copyright 2020 Electronic Arts Inc.
//
// TiberianDawn.DLL and RedAlert.dll and corresponding source code 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.
// TiberianDawn.DLL and RedAlert.dll and corresponding source code is distributed
// in the hope that it will be useful, but with permitted additional restrictions
// under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT
// distributed with this program. You should have received a copy of the
// GNU General Public License along with permitted additional restrictions
// with this program. If not, see https://github.com/electronicarts/CnC_Remastered_Collection
#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 50
void 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