| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337 |
- //
- // 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
|