This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/WWOnline/WOLSession.h

573 lines
17 KiB
C
Raw Permalink Normal View History

/*
** Command & Conquer Renegade(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/>.
*/
/******************************************************************************
*
* FILE
* $Archive: /Commando/Code/WWOnline/WOLSession.h $
*
* DESCRIPTION
* WOLSession is the entryway to Westwood Online. An object of this type
* must exist in order to do anything WOL related. There should only be one
* instance of this; retrieve it via GetInstance.
*
* PROGRAMMER
* Steve Clinard & Denzil E. Long, Jr.
* $Author: Denzil_l $
*
* VERSION INFO
* $Revision: 54 $
* $Modtime: 1/25/02 5:02p $
*
******************************************************************************/
#ifndef __WOLSESSION_H__
#define __WOLSESSION_H__
#include <atlbase.h>
#include "WOLLoginInfo.h"
#include "WOLUser.h"
#include "WOLChannel.h"
#include "WOLPing.h"
#include "WOLAgeCheck.h"
#include "WOLDownload.h"
#include "WOLPageMsg.h"
#include "RefPtr.h"
#include <WWLib\Notify.h>
#include <WWLib\WideString.h>
namespace WOL
{
#include <WOLAPI\wolapi.h>
}
#if defined(_MSC_VER)
#pragma warning(push, 3)
#endif
#include <vector>
#if defined(_MSC_VER)
#pragma warning(pop)
#endif
class WaitCondition;
namespace WWOnline {
// The version of WOLAPI this product was build with.
#define WOLAPI_BUILD_VERSION MAKELONG(19,1)
class ChatObserver;
class NetUtilObserver;
class ServerError;
class ServerData;
class ChannelData;
class LadderServerData;
class GameResultsServerData;
class WDTServerData;
class GameOptionsMessage;
class GameStartEvent;
class SquadEvent;
class ChatMessage;
class ConnectWait;
class DisconnectWait;
class IRCServerData;
typedef std::vector< RefPtr<IRCServerData> > IRCServerList;
class MGLServerData;
typedef std::vector< RefPtr<MGLServerData> > MGLServerList;
class PingServerData;
typedef std::vector< RefPtr<PingServerData> > PingServerList;
typedef std::vector< RefPtr<LadderData> > LadderList;
enum ConnectionStatus {ConnectionDisconnected, ConnectionDisconnecting, ConnectionConnecting, ConnectionConnected};
class MessageOfTheDayType;
typedef TypedEvent<MessageOfTheDayType, WideStringClass> MessageOfTheDayEvent;
// Information request flags
#define REQUEST_LOCALE (1<<0L)
#define REQUEST_SQUADINFO (1<<1L)
#define REQUEST_TEAMINFO (1<<2L)
#define REQUEST_LADDERINFO (1<<3L)
#define REQUEST_ALL (REQUEST_LOCALE|REQUEST_SQUADINFO|REQUEST_TEAMINFO|REQUEST_LADDERINFO)
#define REQUEST_NONE 0
class Session :
public RefCounted,
public Notifier<ServerError>,
public Notifier<ConnectionStatus>,
public Notifier<IRCServerList>,
public Notifier<ChannelListEvent>,
public Notifier<UserList>,
public Notifier<UserEvent>,
public Notifier<BuddyEvent>,
public Notifier<ChannelEvent>,
public Notifier<MessageOfTheDayEvent>,
public Notifier<ChatMessage>,
public Notifier<PageMessage>,
public Notifier<PageSendStatus>,
public Notifier<GameOptionsMessage>,
public Notifier<GameStartEvent>,
public Notifier<RawPing>,
public Notifier<LadderInfoEvent>,
public Notifier<LadderList>,
public Notifier<SquadEvent>,
public Notifier<NewLoginInfoEvent>,
public Notifier<AgeCheckEvent>,
public Notifier<UserIPEvent>
{
public:
// Retrieve WWOnline session instance.
static RefPtr<Session> GetInstance(bool okToCreate = false);
void Reset(void);
// Yeild time for WWOnline processing.
virtual bool Process(void);
// Retrieve pointer to IChat object
const CComPtr<WOL::IChat>& GetChatObject(void) const
{return mChat;}
// Retrieve pointer to INetUtil object
const CComPtr<WOL::INetUtil>& GetNetUtilObject(void) const
{return mNetUtil;}
// Obtain current patch download list
DownloadList& GetPatchDownloadList(void)
{return mPatchFiles;}
// Retrieve connection status
ConnectionStatus GetConnectionStatus(void) const
{return mCurrentConnectionStatus;}
//-------------------------------------------------------------------------
// Server Methods
//-------------------------------------------------------------------------
// Retrieve new server list
RefPtr<WaitCondition> GetNewServerList(void);
// Submit request for new server list
bool RequestServerList(bool just_kidding = false);
// Obtain current server list
const IRCServerList& GetIRCServerList(void)
{return mIRCServers;}
const MGLServerList& GetManglerServerList(void)
{return mMGLServers;}
const PingServerList& GetPingServerList(void)
{return mPingServers;}
// Retrieve current server
const RefPtr<IRCServerData>& GetCurrentServer(void) const
{return mCurrentServer;}
// Retrieve current login
const RefPtr<LoginInfo>& GetCurrentLogin(void) const
{return mCurrentLogin;}
// Login into server
RefPtr<WaitCondition> LoginServer(const RefPtr<IRCServerData>&, const RefPtr<LoginInfo>&);
// Disconnection from current server.
RefPtr<WaitCondition> Logout(void);
// Retrieve message of the day
const WideStringClass& GetMessageOfTheDay(void) const
{return mMessageOfTheDay;}
//-------------------------------------------------------------------------
// Channel Methods
//-------------------------------------------------------------------------
bool EnableProgressiveChannelList(bool enable);
// Submit request for new channel list
bool RequestChannelList(int channelType, bool autoPing);
// Look for a channel with the specified name in the current channel list.
RefPtr<ChannelData> FindChannel(const wchar_t* name);
RefPtr<ChannelData> FindChannel(const char* name);
// Create a new channel
RefPtr<WaitCondition> CreateChannel(const wchar_t* channelName, const wchar_t* password, int type);
RefPtr<WaitCondition> CreateChannel(const RefPtr<ChannelData>&, const wchar_t* password);
// Join a channel
RefPtr<WaitCondition> JoinChannel(const RefPtr<ChannelData>& channel, const wchar_t* password);
RefPtr<WaitCondition> JoinChannel(const wchar_t* name, const wchar_t* password, int type);
bool RequestChannelJoin(const RefPtr<ChannelData>& channel, const wchar_t* password);
// Leave the current channel.
RefPtr<WaitCondition> LeaveChannel(void);
bool RequestLeaveChannel(void);
// Obtain current channel
const RefPtr<ChannelData>& GetCurrentChannel(void) const
{return mCurrentChannel;}
const char* GetChannelTopic(void) const;
// Send the current channels topic to the server.
bool SendChannelTopic(void);
// Send the current channels extra info to the server.
bool SendChannelExtraInfo(void);
// Retrieve current channel status
ChannelStatus GetChannelStatus(void) const
{return mCurrentChannelStatus;}
// Retrieve new chat channel list
RefPtr<WaitCondition> GetNewChatChannelList(void);
// Obtain current channel list.
const ChannelList& GetChatChannelList(void)
{return mChatChannels;}
RefPtr<ChannelData> FindChatChannel(const wchar_t* name);
RefPtr<ChannelData> FindChatChannel(const char* name);
// Retrieve new game channel list
RefPtr<WaitCondition> GetNewGameChannelList(void);
// Submit request for new game channel list.
bool RequestGameChannelList(void);
// Obtain current game channel list
const ChannelList& GetGameChannelList(void)
{return mGameChannels;}
RefPtr<ChannelData> FindGameChannel(const wchar_t* name);
RefPtr<ChannelData> FindGameChannel(const char* name);
//-------------------------------------------------------------------------
// User Methods
//-------------------------------------------------------------------------
// Request a new user list
bool RequestUserList(void);
// Obtian current user list
const UserList& GetUserList(void)
{return mUsers;}
// Find specified user
RefPtr<UserData> FindUser(const wchar_t* userName);
// Obtain current user
RefPtr<UserData> GetCurrentUser(void) const
{return mCurrentUser;}
// Test is specified user is the current one.
bool IsCurrentUser(const RefPtr<UserData>&) const;
bool IsCurrentUser(const wchar_t* username) const;
// Change the locale for the user currently logged in.
bool ChangeCurrentUserLocale(WOL::Locale locale);
// Squelch / unsquelch user messages. Prevents messages from specified user.
bool SquelchUser(const RefPtr<UserData>& user, bool squelched);
// Kick a user from the current channel. Kicking is only allowed for
// channel owners.
bool KickUser(const wchar_t* username);
// Ban / unban a user from the current channel. Banning is only allowed for
// channel owners.
bool BanUser(const wchar_t* username, bool banned);
// Send a page to a user.
bool PageUser(const wchar_t* userName, const wchar_t* message);
// Request a users online location
unsigned long GetAutoRequestFlags(void) const
{return mAutoRequestFlags;}
void SetAutoRequestFlags(unsigned long flags)
{mAutoRequestFlags = flags;}
void RequestUserDetails(const RefPtr<UserData>& user, unsigned long requestFlags);
void RequestLocateUser(const wchar_t* userName);
void RequestLocateUser(const RefPtr<UserData>& user);
// Request users locale
void RequestUserLocale(const wchar_t* userName);
// Request information about a squad by Squad ID
void RequestSquadInfoByID(unsigned long squadID);
// Request information about a squad by member name
void RequestSquadInfoByMemberName(const wchar_t* memberName);
// Request users team information
void RequestTeamInfo(const wchar_t* userName);
// Request users ladder information
void RequestLadderInfo(const wchar_t* name, unsigned long type);
//-------------------------------------------------------------------------
// Buddy Methods
//-------------------------------------------------------------------------
// Obtian current buddy list
const UserList& GetBuddyList(void) const
{return mBuddies;}
// Find specified buddy
RefPtr<UserData> FindBuddy(const wchar_t* buddyName)
{return FindUserInList(buddyName, mBuddies);}
bool RequestBuddyList(void);
bool AddBuddy(const wchar_t* buddyName);
bool RemoveBuddy(const wchar_t* buddyName);
//-------------------------------------------------------------------------
// Chatting Methods
//-------------------------------------------------------------------------
bool AllowFindPage(bool allowFind, bool allowPage);
// Enable / disable filtering of bad language
bool SetBadLanguageFilter(bool enabled);
bool SendPublicMessage(const char* message);
bool SendPublicMessage(const wchar_t* message);
bool SendPublicAction(const char* action);
bool SendPublicAction(const wchar_t* action);
bool SendPrivateMessage(const wchar_t* username, const wchar_t* message);
bool SendPrivateMessage(const UserList& users, const char* message);
bool SendPrivateMessage(const UserList& users, const wchar_t* message);
bool SendPrivateAction(const UserList& users, const char* action);
bool SendPrivateAction(const UserList& users, const wchar_t* action);
bool SendPublicGameOptions(const char* options);
bool SendPrivateGameOptions(const wchar_t* user, const char* options);
bool SendPrivateGameOptions(const UserList& users, const char* options);
//-------------------------------------------------------------------------
// Utility Methods
//-------------------------------------------------------------------------
void GetLocaleStrings(std::vector<WideStringClass>& localeStrings);
void EnablePinging(bool enable);
void RequestPing(const char* address, int timeout = 1000);
unsigned int GetPendingPingCount(void) const
{return mPingsPending;}
bool SendGameResults(unsigned char* packet, unsigned long length);
bool RequestUserIP(char *user_name);
time_t GetServerTime(void)
{return mServerTime;}
//-------------------------------------------------------------------------
// IGR (Internet Gaming Room) support
//-------------------------------------------------------------------------
bool IsStoreLoginAllowed(void);
bool IsAutoLoginAllowed(void);
bool IsRunRegAppAllowed(void);
//-------------------------------------------------------------------------
// Insider status support
//-------------------------------------------------------------------------
void RequestInsiderStatus(void);
void RequestServerTime(void);
bool IsCurrUserInsider(void)
{return mIsInsider;}
//-------------------------------------------------------------------------
// Event notification
//-------------------------------------------------------------------------
DECLARE_NOTIFIER(ServerError)
DECLARE_NOTIFIER(ConnectionStatus)
DECLARE_NOTIFIER(IRCServerList)
DECLARE_NOTIFIER(ChannelListEvent)
DECLARE_NOTIFIER(UserList)
DECLARE_NOTIFIER(UserEvent)
DECLARE_NOTIFIER(BuddyEvent)
DECLARE_NOTIFIER(ChannelEvent)
DECLARE_NOTIFIER(MessageOfTheDayEvent)
DECLARE_NOTIFIER(ChatMessage)
DECLARE_NOTIFIER(PageMessage)
DECLARE_NOTIFIER(PageSendStatus)
DECLARE_NOTIFIER(GameOptionsMessage)
DECLARE_NOTIFIER(GameStartEvent)
DECLARE_NOTIFIER(RawPing)
DECLARE_NOTIFIER(LadderInfoEvent)
DECLARE_NOTIFIER(LadderList)
DECLARE_NOTIFIER(SquadEvent)
DECLARE_NOTIFIER(NewLoginInfoEvent)
DECLARE_NOTIFIER(AgeCheckEvent)
DECLARE_NOTIFIER(UserIPEvent)
protected:
friend ChatObserver;
friend NetUtilObserver;
friend Download;
friend ConnectWait;
friend DisconnectWait;
Session();
virtual ~Session();
// Disallow copy and assignment
Session(const Session&);
const Session& operator=(const Session&);
virtual void ReleaseReference(void);
bool FinalizeCreate(void);
void UpdatePingServerTime(const char* name, int time);
void AutoRequestUserDetails(const RefPtr<UserData>& user);
RefPtr<UserData> GetUserOrBuddy(const wchar_t*);
const CComPtr<WOL::IIGROptions>& GetIGRObject(void);
private:
void ClearServers(void);
void MakeLocateUserRequests(void);
void MakeSquadRequests(void);
void MakeLocaleRequests(void);
void MakeTeamRequests(void);
void MakeLadderRequests(void);
void MakePingRequests(void);
CComPtr<WOL::IChat> mChat;
CComPtr<WOL::IChatEvent> mChatEvents;
unsigned long mChatCookie;
CComPtr<WOL::INetUtil> mNetUtil;
CComPtr<WOL::INetUtilEvent> mNetUtilEvents;
unsigned long mNetUtilCookie;
CComPtr<WOL::IIGROptions> mIGRObject;
// Server data
bool mRequestingServerList;
IRCServerList mIRCServers;
RefPtr<LadderServerData> mLadderServer;
RefPtr<GameResultsServerData> mGameResultsServer;
RefPtr<WDTServerData> mWDTServer;
MGLServerList mMGLServers;
PingServerList mPingServers;
bool mIgnoreServerLists;
// Insider status data
bool mIsInsider;
time_t mServerTime;
// Patch data
DownloadList mPatchFiles;
// Connection state
ConnectionStatus mCurrentConnectionStatus;
RefPtr<IRCServerData> mPendingServer;
RefPtr<IRCServerData> mCurrentServer;
RefPtr<LoginInfo> mPendingLogin;
RefPtr<LoginInfo> mCurrentLogin;
// Channel data
ChannelList mChatChannels;
ChannelList mGameChannels;
int mRequestedChannelType;
ChannelList mIncommingChatChannels;
ChannelList mIncommingGameChannels;
RefPtr<ChannelData> mPendingChannel;
RefPtr<ChannelData> mCurrentChannel;
ChannelStatus mCurrentChannelStatus;
// User data
UserList mUsers;
RefPtr<UserData> mCurrentUser;
UserList mLocatePendingUsers;
RefPtr<UserData> mLocatingUser;
UserList mBuddies;
unsigned long mAutoRequestFlags;
// Squad Request queues
typedef std::vector<WideStringClass> SquadRequestColl;
SquadRequestColl mSquadRequests;
SquadRequestColl mSquadPending;
typedef std::vector<WideStringClass> LocaleRequestColl;
LocaleRequestColl mLocaleRequests;
typedef std::vector<WideStringClass> TeamRequestColl;
TeamRequestColl mTeamRequests;
typedef std::list<WideStringClass> LadderRequestList;
LadderRequestList mLadderRequests;
unsigned long mLadderPending;
// Misc.
WideStringClass mMessageOfTheDay;
std::vector<RawPing> mPingRequests;
unsigned int mPingsPending;
int mPingEnable;
unsigned long mLastUserDataRequestTime;
static RefPtr<Session> _mInstance;
};
class ChatAdvisement :
public RefCounted
{
public:
static RefPtr<ChatAdvisement> Create(const CComPtr<WOL::IChat>&, const CComPtr<WOL::IChatEvent>&);
private:
ChatAdvisement(const CComPtr<WOL::IChat>&, const CComPtr<WOL::IChatEvent>&);
virtual ~ChatAdvisement();
// Prevent copy and assignment
ChatAdvisement(const ChatAdvisement&);
const ChatAdvisement& operator=(const ChatAdvisement&);
CComPtr<WOL::IChat> mChat;
unsigned long mChatCookie;
};
} // using namespace WWOnline
#endif // __WOLSESSION_H__