/*
** 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 .
*/
/******************************************************************************
*
* FILE
* $Archive: /Commando/Code/WWOnline/WOLConnect.cpp $
*
* DESCRIPTION
* Westwood Online wait conditions.
*
* PROGRAMMER
* Denzil E. Long, Jr.
* $Author: Denzil_l $
*
* VERSION INFO
* $Revision: 35 $
* $Modtime: 1/29/02 1:47p $
*
******************************************************************************/
#include "WOLConnect.h"
#include "WOLProduct.h"
#include "WOLServer.h"
#include "WOLChannel.h"
#include "WOLErrorUtil.h"
#include "WOLString.h"
#include
namespace WOL
{
#include
}
namespace WWOnline {
/******************************************************************************
*
* NAME
* ServerListWait::Create
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* Wait - Wait condition to process.
*
******************************************************************************/
RefPtr ServerListWait::Create(const RefPtr& session)
{
WWASSERT(session.IsValid() && "ServerListWait");
if (!session.IsValid())
{
WWDEBUG_SAY(("WOLERROR: WWOnline session not instantiated\n"));
return NULL;
}
return new ServerListWait(session);
}
/******************************************************************************
*
* NAME
* ServerListWait::ServerListWait
*
* DESCRIPTION
* Constructor
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
ServerListWait::ServerListWait(const RefPtr& session) :
SingleWait(WOLSTRING("WOL_SERVERLISTFETCH")),
mSession(session)
{
WWDEBUG_SAY(("WOL: ServerListWait Create\n"));
}
/******************************************************************************
*
* NAME
* ServerListWait::~ServerListWait
*
* DESCRIPTION
* Destructor
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
ServerListWait::~ServerListWait()
{
WWDEBUG_SAY(("WOL: ServerListWait End '%S'\n", mEndText));
}
/******************************************************************************
*
* NAME
* ServerListWait::WaitBeginning
*
* DESCRIPTION
* Start server list wait condition
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
void ServerListWait::WaitBeginning(void)
{
WWDEBUG_SAY(("WOL: ServerListWait Begin\n"));
WWASSERT(mSession.IsValid() && "ServerListWait");
RefPtrConst product(Product::Current());
WWASSERT(product.IsValid() && "ServerListWait");
if (!product.IsValid())
{
WWDEBUG_SAY(("WOLERROR: WWOnline product not instantiated\n"));
EndWait(WaitCondition::Error, WOLSTRING("WOL_SERVERLISTERROR"));
return;
}
mSession->AddObserver(*static_cast< Observer *>(this));
mSession->AddObserver(*static_cast< Observer *>(this));
bool success = mSession->RequestServerList();
if (!success)
{
WWDEBUG_SAY(("WOLERROR: ServerListWait request failed\n"));
EndWait(Error, WOLSTRING("WOL_SERVERLISTERROR"));
}
}
/******************************************************************************
*
* NAME
* ServerListWait::HandleNotification(ServerError)
*
* DESCRIPTION
* General error notificaiton
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void ServerListWait::HandleNotification(ServerError& serverError)
{
if (mEndResult == Waiting)
{
const wchar_t* errorMsg = serverError.GetDescription();
WWDEBUG_SAY(("WOLERROR: ServerListWait '%S'\n", errorMsg));
EndWait(Error, errorMsg);
}
}
/******************************************************************************
*
* NAME
* ServerListWait::HandleNotification(IRCServerList)
*
* DESCRIPTION
* Server list recieved notification.
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void ServerListWait::HandleNotification(IRCServerList&)
{
if (mEndResult == Waiting)
{
WWDEBUG_SAY(("WOL: ServerListWait successful\n"));
EndWait(ConditionMet, WOLSTRING("WOL_SERVERLISTRECEIVED"));
}
}
//-----------------------------------------------------------------------------
/******************************************************************************
*
* NAME
* DisconnectWait::Create
*
* DESCRIPTION
* Create a disconnect wait condition.
*
* INPUTS
* Session - WWOnline session to initiate disconnect from.
*
* RESULT
* Wait - Wait condition to process.
*
******************************************************************************/
RefPtr DisconnectWait::Create(const RefPtr& session)
{
WWASSERT(session.IsValid() && "DisconnectWait");
if (!session.IsValid())
{
WWDEBUG_SAY(("WOLERROR: WWOnline session not instantiated\n"));
return NULL;
}
return new DisconnectWait(session);
}
/******************************************************************************
*
* NAME
* DisconnectWait::DisconnectWait
*
* DESCRIPTION
* Constructor
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
DisconnectWait::DisconnectWait(const RefPtr& session) :
SingleWait(WOLSTRING("WOL_DISCONNECTING")),
mSession(session)
{
WWDEBUG_SAY(("WOL: DisconnectWait Create\n"));
}
/******************************************************************************
*
* NAME
* DisconnectWait::~DisconnectWait
*
* DESCRIPTION
* Destructor
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
DisconnectWait::~DisconnectWait()
{
WWDEBUG_SAY(("WOL: DisconnectWait End '%S'\n", mEndText));
}
/******************************************************************************
*
* NAME
* DisconnectWait::WaitBeginning
*
* DESCRIPTION
* Start disconnect wait condition
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
void DisconnectWait::WaitBeginning(void)
{
WWDEBUG_SAY(("WOL: DisconnectWait Begin\n"));
WWASSERT(mSession.IsValid() && "DisconnectWait");
mSession->AddObserver(*static_cast *>(this));
mSession->AddObserver(*static_cast *>(this));
WWASSERT((mSession->GetChatObject() != NULL) && "DisconnectWait");
HRESULT hr = mSession->GetChatObject()->RequestLogout();
if (SUCCEEDED(hr))
{
mSession->mCurrentConnectionStatus = ConnectionDisconnecting;
}
else
{
WWDEBUG_SAY(("WOLERROR: DisconnectWait request failed\n"));
EndWait(Error, WOLSTRING("WOL_DISCONNECTERROR"));
}
}
/******************************************************************************
*
* NAME
* DisconnectWait::EndWait
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void DisconnectWait::EndWait(WaitResult result, const wchar_t* msg)
{
SingleWait::EndWait(result, msg);
if (ConditionMet != result)
{
mSession->mCurrentConnectionStatus = ConnectionDisconnected;
}
}
/******************************************************************************
*
* NAME
* DisconnectWait::HandleNotification
*
* DESCRIPTION
* General server error notification
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void DisconnectWait::HandleNotification(ServerError& serverError)
{
if (mEndResult == Waiting)
{
const wchar_t* errorMsg = serverError.GetDescription();
WWDEBUG_SAY(("WOLERROR: DisconnectWait server error '%S'\n", errorMsg));
EndWait(Error, errorMsg);
}
}
/******************************************************************************
*
* NAME
* DisconnectWait::HandleNotification(ConnectionStatus)
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void DisconnectWait::HandleNotification(ConnectionStatus& status)
{
if (mEndResult == Waiting)
{
if (status == ConnectionDisconnected)
{
WWDEBUG_SAY(("WOL: DisconnectWait successful\n"));
EndWait(ConditionMet, WOLSTRING("WOL_DISCONNECTED"));
}
else
{
WWDEBUG_SAY(("WOLERROR: DisconnectWait did not receive disconnect\n"));
EndWait(Error, WOLSTRING("WOL_DISCONNECTERROR"));
}
}
}
//-----------------------------------------------------------------------------
/******************************************************************************
*
* NAME
* ConnectWait::Create
*
* DESCRIPTION
* Create a server connect wait condition.
*
* INPUTS
* Session - WWOnline session
* Server - Server to connect to.
* Login - Login to connect with.
*
* RESULT
* Wait - Wait condition to process.
*
******************************************************************************/
RefPtr ConnectWait::Create(const RefPtr& session,
const RefPtr& server, const RefPtr& login)
{
WWASSERT(session.IsValid() && "ConnectWait");
WWASSERT(server.IsValid() && "ConnectWait");
WWASSERT(login.IsValid() && "ConnectWait");
if (!session.IsValid() || !server.IsValid() || !login.IsValid())
{
return NULL;
}
return new ConnectWait(session, server, login);
}
/******************************************************************************
*
* NAME
* ConnectWait::ConnectWait
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
ConnectWait::ConnectWait(const RefPtr& session, const RefPtr& server,
const RefPtr& login) :
SingleWait(WOLSTRING("WOL_CONNECTING")),
mSession(session),
mServer(server),
mLogin(login)
{
WWDEBUG_SAY(("WOL: ConnectWait Create\n"));
}
/******************************************************************************
*
* NAME
* ConnectWait::~ConnectWait
*
* DESCRIPTION
* Destructor
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
ConnectWait::~ConnectWait()
{
WWDEBUG_SAY(("WOL: ConnectWait End %S\n", mEndText));
}
/******************************************************************************
*
* NAME
* ConnectWait::WaitBeginning
*
* DESCRIPTION
* Start connection wait condition.
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
void ConnectWait::WaitBeginning(void)
{
WWDEBUG_SAY(("WOL: ConnectWait Begin\n"));
WWASSERT(mSession.IsValid() && "ConnectWait");
mSession->AddObserver(*static_cast *>(this));
mSession->AddObserver(*static_cast *>(this));
WWASSERT(mServer.IsValid() && "ConnectWait");
WOL::Server& server = mServer->GetData();
WWASSERT(mLogin.IsValid() && "ConnectWait");
wcstombs((char*)server.login, (const WCHAR*)mLogin->GetNickname(), sizeof(server.login));
wcstombs((char*)server.password, (const WCHAR*)mLogin->GetPassword(), sizeof(server.password));
WWASSERT((mSession->GetChatObject() != NULL) && "ConnectWait");
HRESULT hr = mSession->GetChatObject()->RequestConnection(&server, 20, !mLogin->IsPasswordEncrypted());
if (SUCCEEDED(hr))
{
mSession->mCurrentConnectionStatus = ConnectionConnecting;
}
else
{
WWDEBUG_SAY(("WOLERROR: ConnectWait request failed '%s'\n", GetChatErrorString(hr)));
EndWait(Error, WOLSTRING("WOL_CONNECTERROR"));
}
}
/******************************************************************************
*
* NAME
* DisconnectWait::EndWait
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void ConnectWait::EndWait(WaitResult result, const wchar_t* msg)
{
SingleWait::EndWait(result, msg);
if (ConditionMet != result)
{
mSession->mCurrentConnectionStatus = ConnectionDisconnected;
}
}
/******************************************************************************
*
* NAME
* ConnectWait::HandleNotification(ServerError)
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void ConnectWait::HandleNotification(ServerError& serverError)
{
if (mEndResult == Waiting)
{
mSession->mCurrentConnectionStatus = ConnectionDisconnected;
const wchar_t* errorMsg = serverError.GetDescription();
WWDEBUG_SAY(("WOLERROR: ConnectWait server error '%S'\n", errorMsg));
EndWait(Error, errorMsg);
}
}
/******************************************************************************
*
* NAME
* ConnectWait::HandleNotification(ConnectionStatus)
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void ConnectWait::HandleNotification(ConnectionStatus& status)
{
if (mEndResult == Waiting)
{
if (status == ConnectionConnected)
{
WWDEBUG_SAY(("WOL: ConnectWait successful\n"));
EndWait(ConditionMet, WOLSTRING("WOL_CONNECTED"));
}
else
{
WWDEBUG_SAY(("WOLERROR: ConnectWait did not receive connect\n"));
EndWait(Error, WOLSTRING("WOL_CONNECTERROR"));
}
}
}
//-----------------------------------------------------------------------------
/******************************************************************************
*
* NAME
* ChannelListWait::Create
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
*
******************************************************************************/
RefPtr ChannelListWait::Create(const RefPtr& session, int type)
{
WWASSERT(session.IsValid() && "ChannelListWait");
if (!session.IsValid())
{
return NULL;
}
return new ChannelListWait(session, type);
}
/******************************************************************************
*
* NAME
* ChannelListWait::ChannelListWait
*
* DESCRIPTION
* Constructor
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
ChannelListWait::ChannelListWait(const RefPtr& session, int type) :
SingleWait(WOLSTRING("WOL_CHANNELLISTFETCH")),
mSession(session),
mType(type)
{
WWDEBUG_SAY(("WOL: ChannelListWait Create\n"));
}
/******************************************************************************
*
* NAME
* ChannelListWait::~ChannelListWait
*
* DESCRIPTION
* Destructor
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
ChannelListWait::~ChannelListWait()
{
WWDEBUG_SAY(("WOL: ChannelListWait End %S\n", mEndText));
}
/******************************************************************************
*
* NAME
* ChannelListWait::WaitBeginning
*
* DESCRIPTION
* Start channel list request wait condition.
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
void ChannelListWait::WaitBeginning(void)
{
WWDEBUG_SAY(("WOL: ChannelListWait Begin\n"));
WWASSERT(mSession.IsValid() && "ChannelListWait");
mSession->AddObserver(*static_cast *>(this));
mSession->AddObserver(*static_cast *>(this));
mSession->AddObserver(*static_cast *>(this));
bool success = mSession->RequestChannelList(mType, false);
if (!success)
{
WWDEBUG_SAY(("WOLERROR: ChannelListWait request failed\n"));
EndWait(Error, WOLSTRING("WOL_CHANNELLISTERROR"));
}
}
/******************************************************************************
*
* NAME
* ChannelListWait::HandleNotification(ServerError)
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void ChannelListWait::HandleNotification(ServerError& serverError)
{
if (mEndResult == Waiting)
{
const wchar_t* errorMsg = serverError.GetDescription();
WWDEBUG_SAY(("WOLERROR: ChannelListWait server error '%S'\n", errorMsg));
EndWait(Error, errorMsg);
}
}
/******************************************************************************
*
* NAME
* ChannelListWait::HandleNotification(ConnectionStatus)
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void ChannelListWait::HandleNotification(ConnectionStatus& status)
{
if (mEndResult == Waiting)
{
if (status != ConnectionConnected)
{
WWDEBUG_SAY(("WOLERROR: ChannelListWait not connected to server\n"));
EndWait(Error, WOLSTRING("WOL_NOTCONNECTED"));
}
}
}
/******************************************************************************
*
* NAME
* ChannelListWait::HandleNotification(ChannelListEvent)
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void ChannelListWait::HandleNotification(ChannelListEvent& event)
{
if (mEndResult == Waiting)
{
if ((event.GetEvent() == ChannelListEvent::NewList) && (event.GetChannelType() == mType))
{
WWDEBUG_SAY(("WOL: ChannelListWait successful\n"));
EndWait(ConditionMet, WOLSTRING("WOL_CHANNELLISTRECEIVED"));
}
}
}
//-----------------------------------------------------------------------------
/******************************************************************************
*
* NAME
* LeaveChannelWait::Create
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
*
******************************************************************************/
RefPtr LeaveChannelWait::Create(const RefPtr& session)
{
WWASSERT(session.IsValid() && "LeaveChannelWait");
if (!session.IsValid())
{
return NULL;
}
return new LeaveChannelWait(session);
}
/******************************************************************************
*
* NAME
* LeaveChannelWait::LeaveChannelWait
*
* DESCRIPTION
* Constructor
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
LeaveChannelWait::LeaveChannelWait(const RefPtr& session) :
SingleWait(WOLSTRING("WOL_CHANNELLEAVE")),
mSession(session)
{
WWDEBUG_SAY(("WOL: LeaveChannelWait Create\n"));
}
/******************************************************************************
*
* NAME
* LeaveChannelWait::~LeaveChannelWait
*
* DESCRIPTION
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
LeaveChannelWait::~LeaveChannelWait()
{
WWDEBUG_SAY(("WOL: LeaveChannelWait End %S\n", mEndText));
}
/******************************************************************************
*
* NAME
* LeaveChannelWait::WaitBeginning
*
* DESCRIPTION
* Start leave channel wait condition.
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
void LeaveChannelWait::WaitBeginning(void)
{
WWDEBUG_SAY(("WOL: LeaveChannelWait Begin\n"));
WWASSERT(mSession.IsValid() && "LeaveChannelWait");
ChannelStatus status = mSession->GetChannelStatus();
// If we are not joined to a channel and not already leaving
// a channel then we have successfully left a channel.
if (ChannelJoined != status && ChannelLeaving != status)
{
EndWait(ConditionMet, WOLSTRING("WOL_CHANNELLEFT"));
return;
}
// Listen for various events
mSession->AddObserver(*static_cast *>(this));
mSession->AddObserver(*static_cast *>(this));
mSession->AddObserver(*static_cast *>(this));
// If we are currently joined the request to leave.
if (ChannelJoined == status)
{
// Make the request to leave the channel
bool success = mSession->RequestLeaveChannel();
if (!success)
{
EndWait(Error, WOLSTRING("WOL_CHANNELLEAVEERROR"));
}
}
}
/******************************************************************************
*
* NAME
* LeaveChannelWait::HandleNotification(ServerError)
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void LeaveChannelWait::HandleNotification(ServerError& serverError)
{
// If we get a server error while leaving a channel then something is wrong.
if (mEndResult == Waiting)
{
const wchar_t* errorMsg = serverError.GetDescription();
WWDEBUG_SAY(("WOLERROR: LeaveChannelWait server error '%S'\n", errorMsg));
EndWait(Error, errorMsg);
}
}
/******************************************************************************
*
* NAME
* LeaveChannelWait::HandleNotification(ConnectionStatus)
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void LeaveChannelWait::HandleNotification(ConnectionStatus& status)
{
if (mEndResult == Waiting)
{
if (status != ConnectionConnected)
{
WWDEBUG_SAY(("WOLWARNING: LeaveChannelWait not connected to server\n"));
EndWait(ConditionMet, WOLSTRING("WOL_NOTCONNECTED"));
}
}
}
/******************************************************************************
*
* NAME
* LeaveChannelWait::HandleNotification(ChannelEvent)
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void LeaveChannelWait::HandleNotification(ChannelEvent& event)
{
if (mEndResult == Waiting)
{
// If we left the channel then the condition is met.
// Otherwise something went wrong.
if (event.GetStatus() == ChannelLeft)
{
WWDEBUG_SAY(("WOL: LeaveChannelWait successful\n"));
EndWait(ConditionMet, WOLSTRING("WOL_CHANNELLEFT"));
}
else
{
WWDEBUG_SAY(("WOLERROR: LeaveChannelWait channel not left\n"));
EndWait(Error, WOLSTRING("WOL_CHANNELLEAVEERROR"));
}
}
}
//-----------------------------------------------------------------------------
/******************************************************************************
*
* NAME
* JoinChannelWait::Create
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
*
******************************************************************************/
RefPtr JoinChannelWait::Create(const RefPtr& session,
const RefPtr& channel, const wchar_t* password)
{
WWASSERT(session.IsValid() && "JoinChannelWait");
if (!session.IsValid())
{
return NULL;
}
return new JoinChannelWait(session, channel, password);
}
/******************************************************************************
*
* NAME
* JoinChannelWait::Create
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
*
******************************************************************************/
RefPtr JoinChannelWait::Create(const RefPtr& session,
const wchar_t* channelName, const wchar_t* password, int type)
{
WWASSERT(session.IsValid() && "JoinChannelWait");
WWASSERT(channelName && "JoinChannelWait");
if (!session.IsValid() || (channelName == NULL))
{
return NULL;
}
return new JoinChannelWait(session, channelName, password, type);
}
/******************************************************************************
*
* NAME
* JoinChannelWait::JoinChannelWait
*
* DESCRIPTION
* Constructor
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
JoinChannelWait::JoinChannelWait(const RefPtr& session,
const RefPtr& channel, const wchar_t* password) :
SingleWait(WOLSTRING("WOL_CHANNELJOIN")),
mSession(session),
mChannel(channel),
mPassword(password),
mType(0)
{
WWDEBUG_SAY(("WOL: JoinChannelWait Create\n"));
}
/******************************************************************************
*
* NAME
* JoinChannelWait::JoinChannelWait
*
* DESCRIPTION
* Constructor
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
JoinChannelWait::JoinChannelWait(const RefPtr& session,
const wchar_t* channelName, const wchar_t* password, int type) :
SingleWait(WOLSTRING("WOL_CHANNELJOIN")),
mSession(session),
mChannelName(channelName),
mPassword(password),
mType(type)
{
WWDEBUG_SAY(("WOL: JoinChannelWait Create\n"));
}
/******************************************************************************
*
* NAME
* JoinChannelWait::~JoinChannelWait
*
* DESCRIPTION
* Destructor
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
JoinChannelWait::~JoinChannelWait()
{
WWDEBUG_SAY(("WOL: JoinChannelWait End %S\n", mEndText));
}
/******************************************************************************
*
* NAME
* JoinChannelWait::WaitCondition
*
* DESCRIPTION
* Start channel join wait condition.
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
void JoinChannelWait::WaitBeginning(void)
{
WWDEBUG_SAY(("WOL: JoinChannelWait Begin\n"));
WWASSERT(mSession.IsValid() && "JoinChannelWait");
// If a channel is not specified then search for the named channel
if (!mChannel.IsValid())
{
mChannel = mSession->FindChannel(mChannelName);
// If the channel cannot be found then create one
if (!mChannel.IsValid())
{
mChannel = ChannelData::Create(mChannelName, mPassword, mType);
}
}
if (!mChannel.IsValid())
{
WWDEBUG_SAY(("WOLERROR: JoinChanneWait Channel not found\n"));
EndWait(Error, WOLSTRING("WOL_CHANNELNOTFOUND"));
return;
}
mSession->AddObserver(*static_cast *>(this));
mSession->AddObserver(*static_cast *>(this));
mSession->AddObserver(*static_cast *>(this));
bool success = mSession->RequestChannelJoin(mChannel, mPassword);
if (!success)
{
WWDEBUG_SAY(("WOLERROR: JoinChanneWait request failed\n"));
EndWait(Error, WOLSTRING("WOL_CHANNELJOINERROR"));
}
}
/******************************************************************************
*
* NAME
* JoinChannelWait::HandleNotification(ServerError)
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void JoinChannelWait::HandleNotification(ServerError& serverError)
{
// Join failed if we get a server error.
if (mEndResult == Waiting)
{
const wchar_t* errorMsg = serverError.GetDescription();
WWDEBUG_SAY(("WOLERROR: JoinChannelWait server error '%S'\n", errorMsg));
EndWait(Error, errorMsg);
}
}
/******************************************************************************
*
* NAME
* JoinChannelWait::HandleNotification(ConnectionStatus)
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void JoinChannelWait::HandleNotification(ConnectionStatus& status)
{
if (mEndResult == Waiting)
{
// Join failed if the connection is not present or lost.
if (status != ConnectionConnected)
{
WWDEBUG_SAY(("WOLERROR: JoinChanneWait not connected to server\n"));
EndWait(Error, WOLSTRING("WOL_NOTCONNECTED"));
}
}
}
/******************************************************************************
*
* NAME
* JoinChannelWait::HandleNotification(ChannelEvent)
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void JoinChannelWait::HandleNotification(ChannelEvent& event)
{
if (mEndResult == Waiting)
{
// If we joined the channel the condition is met
if (ChannelJoined == event.GetStatus())
{
WWDEBUG_SAY(("WOL: JoinChanneWait successful\n"));
EndWait(ConditionMet, WOLSTRING("WOL_CHANNELJOINED"));
}
else
{
WWDEBUG_SAY(("WOLERROR: JoinChanneWait failed\n"));
EndWait(Error, GetChannelStatusDescription(event.GetStatus()));
}
}
}
//-----------------------------------------------------------------------------
/******************************************************************************
*
* NAME
* CreateChannelWait::Create
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
*
******************************************************************************/
RefPtr CreateChannelWait::Create(const RefPtr& session,
const RefPtr& channel, const wchar_t* password)
{
WWASSERT(session.IsValid() && "CreateChannelWait");
if (!session.IsValid())
{
return NULL;
}
return new CreateChannelWait(session, channel, password);
}
/******************************************************************************
*
* NAME
* CreateChannelWait::CreateChannelWait
*
* DESCRIPTION
* Destructor
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
CreateChannelWait::CreateChannelWait(const RefPtr& session,
const RefPtr& channel, const wchar_t* password) :
SingleWait(WOLSTRING("WOL_CHANNELCREATE")),
mSession(session),
mChannel(channel),
mPassword(password)
{
WWDEBUG_SAY(("WOL: CreateChannelWait Create\n"));
}
/******************************************************************************
*
* NAME
* CreateChannelWait::~CreateChannelWait
*
* DESCRIPTION
* Destructor
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
CreateChannelWait::~CreateChannelWait()
{
WWDEBUG_SAY(("WOL: CreateChannelWait End %S\n", mEndText));
}
/******************************************************************************
*
* NAME
* CreateChannelWait::WaitBeginning
*
* DESCRIPTION
* Start channel creation wait condition
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
void CreateChannelWait::WaitBeginning(void)
{
WWDEBUG_SAY(("WOL: CreateChannelWait Begin\n"));
WWASSERT(mSession.IsValid() && "CreateChannelWait");
mSession->AddObserver(*static_cast *>(this));
mSession->AddObserver(*static_cast *>(this));
mSession->AddObserver(*static_cast *>(this));
WWASSERT(mChannel.IsValid() && "CreateChannelWait");
WOL::Channel& channel = mChannel->GetData();
wcstombs((char*)channel.key, (const WCHAR*)mPassword, sizeof(channel.key));
WWASSERT((mSession->GetChatObject() != NULL) && "CreateChannelWait");
HRESULT hr = mSession->GetChatObject()->RequestChannelCreate(&channel);
if (FAILED(hr))
{
WWDEBUG_SAY(("WOLERROR: CreateChanneWait request failed '%s'\n", GetChatErrorString(hr)));
EndWait(Error, WOLSTRING("WOL_CHANNELCREATEERROR"));
}
}
/******************************************************************************
*
* NAME
* CreateChannelWait::HandleNotification(ServerError)
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void CreateChannelWait::HandleNotification(ServerError& serverError)
{
if (mEndResult == Waiting)
{
const wchar_t* errorMsg = serverError.GetDescription();
WWDEBUG_SAY(("WOLERROR: CreateChannelWait server error '%S'\n", errorMsg));
EndWait(Error, errorMsg);
}
}
/******************************************************************************
*
* NAME
* CreateChannelWait::HandleNotification(ConnectionStatus)
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void CreateChannelWait::HandleNotification(ConnectionStatus& status)
{
if (mEndResult == Waiting)
{
if (status != ConnectionConnected)
{
WWDEBUG_SAY(("WOLERROR: CreateChannelWait not connected to server\n"));
EndWait(Error, WOLSTRING("WOL_NOTCONNECTED"));
}
}
}
/******************************************************************************
*
* NAME
* CreateChannelWait::HandleNotification(ChannelEvent)
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void CreateChannelWait::HandleNotification(ChannelEvent& event)
{
if (mEndResult == Waiting)
{
ChannelStatus status = event.GetStatus();
if (ChannelCreated == status)
{
WWDEBUG_SAY(("WOL: CreateChannelWait successful\n"));
EndWait(ConditionMet, WOLSTRING("WOL_CHANNELJOINED"));
}
else
{
WWDEBUG_SAY(("WOLERROR: CreateChannelWait failed\n"));
EndWait(Error, GetChannelStatusDescription(status));
}
}
}
//-----------------------------------------------------------------------------
/******************************************************************************
*
* NAME
* UserListWait::Create
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
*
******************************************************************************/
RefPtr UserListWait::Create(const RefPtr& session)
{
WWASSERT(session.IsValid() && "UserListWait");
if (!session.IsValid())
{
return NULL;
}
return new UserListWait(session);
}
/******************************************************************************
*
* NAME
* UserListWait::WaitBeginning
*
* DESCRIPTION
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
void UserListWait::WaitBeginning(void)
{
WWDEBUG_SAY(("WOL: UserListWait Begin\n"));
WWASSERT(mSession.IsValid() && "UserListWait");
Observer::NotifyMe(*mSession);
Observer::NotifyMe(*mSession);
}
/******************************************************************************
*
* NAME
* UserListWait::UserListWait
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
UserListWait::UserListWait(const RefPtr& session) :
mSession(session)
{
WWDEBUG_SAY(("WOL: UserListWait Create\n"));
}
/******************************************************************************
*
* NAME
* UserListWait::~UserListWait
*
* DESCRIPTION
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
UserListWait::~UserListWait()
{
WWDEBUG_SAY(("WOL: UserListWait End %S\n", mEndText));
}
/******************************************************************************
*
* NAME
* UserListWait::HandleNotification(ServerError)
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void UserListWait::HandleNotification(ServerError& error)
{
if (mEndResult == Waiting)
{
const wchar_t* errorMsg = error.GetDescription();
WWDEBUG_SAY(("WOLERROR: UserListWait server error '%S'\n", errorMsg));
EndWait(Error, errorMsg);
}
}
/******************************************************************************
*
* NAME
* UserListWait::HandleNotification(UserList)
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void UserListWait::HandleNotification(UserList&)
{
if (mEndResult == Waiting)
{
WWDEBUG_SAY(("WOL: UserListWait successful\n"));
EndWait(ConditionMet, WOLSTRING("WOL_USERLISTRECEIVED"));
}
}
//-----------------------------------------------------------------------------
/******************************************************************************
*
* NAME
* GetUserWait::Create
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
*
******************************************************************************/
RefPtr GetUserWait::Create(const RefPtr& session,
const wchar_t* userName)
{
WWASSERT(session.IsValid() && "GetUserWait");
WWASSERT(userName && "GetUserWait");
if (!session.IsValid() || (userName == NULL))
{
return NULL;
}
return new GetUserWait(session, userName);
}
/******************************************************************************
*
* NAME
* GetUserWait::GetUserWait
*
* DESCRIPTION
* Constructor
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
GetUserWait::GetUserWait(const RefPtr& session, const wchar_t* userName) :
mSession(session),
mUserName(userName)
{
WWDEBUG_SAY(("WOL: GetUserWait Create\n"));
}
/******************************************************************************
*
* NAME
* GetUserWait::GetUserWait
*
* DESCRIPTION
* Destructor
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
GetUserWait::~GetUserWait()
{
WWDEBUG_SAY(("WOL: GetUserWait End %S\n", mEndText));
}
/******************************************************************************
*
* NAME
* GetUserWait::WaitBeginning
*
* DESCRIPTION
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
void GetUserWait::WaitBeginning(void)
{
WWDEBUG_SAY(("WOL: GetUserWait Begin\n"));
WWASSERT(mSession.IsValid() && "GetUserWait");
RefPtr user = mSession->FindUser(mUserName);
if (user.IsValid())
{
WWDEBUG_SAY(("WOL: GetUserWait successful\n"));
EndWait(ConditionMet, WOLSTRING("WOL_USERFOUND"));
}
else
{
Add(UserListWait::Create(mSession));
}
}
/******************************************************************************
*
* NAME
* GetUserWait::GetResult
*
* DESCRIPTION
*
* INPUTS
* NONE
*
* RESULT
*
******************************************************************************/
WaitCondition::WaitResult GetUserWait::GetResult(void)
{
WaitResult result = SerialWait::GetResult();
if (result == ConditionMet)
{
RefPtr user = mSession->FindUser(mUserName);
if (user.IsValid())
{
WWDEBUG_SAY(("WOL: GetUserWait successful\n"));
mEndText = WOLSTRING("WOL_USERFOUND");
}
else
{
WWDEBUG_SAY(("WOL: GetUserWait failed\n"));
mEndResult = Error;
mEndText = WOLSTRING("WOL_USERNOTFOUND");
}
}
return mEndResult;
}
//-----------------------------------------------------------------------------
/******************************************************************************
*
* NAME
* LocateUserWait::Create
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
*
******************************************************************************/
RefPtr LocateUserWait::Create(const RefPtr& session,
const wchar_t* userName)
{
WWASSERT(session.IsValid() && "LocateUserWait");
WWASSERT(userName && "LocateUserWait");
if (!session.IsValid() || (userName == NULL))
{
return NULL;
}
return new LocateUserWait(session, userName);
}
/******************************************************************************
*
* NAME
* LocateUserWait::LocateUserWait
*
* DESCRIPTION
* Constructor
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
LocateUserWait::LocateUserWait(const RefPtr& session, const wchar_t* userName) :
SingleWait(WOLSTRING("WOL_LOCATINGUSER")),
mSession(session),
mUserName(userName)
{
WWDEBUG_SAY(("WOL: LocateUserWait Create\n"));
}
/******************************************************************************
*
* NAME
* LocateUserWait::~LocateUserWait
*
* DESCRIPTION
* Destructor
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
LocateUserWait::~LocateUserWait()
{
WWDEBUG_SAY(("WOL: LocateUserWait End '%S'\n", mEndText));
}
/******************************************************************************
*
* NAME
* LocateUserWait::WaitBeginning
*
* DESCRIPTION
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
void LocateUserWait::WaitBeginning(void)
{
WWDEBUG_SAY(("WOL: LocateUserWait Begin '%S'\n", (const WCHAR*)mUserName));
WWASSERT(mSession.IsValid() && "LocateUserWait");
RefPtr user = mSession->FindUser(mUserName);
if (user.IsValid())
{
WWDEBUG_SAY(("WOL: LocateUserWait successful\n"));
EndWait(ConditionMet, WOLSTRING("WOL_USERFOUND"));
}
mSession->AddObserver(*static_cast< Observer *>(this));
mSession->AddObserver(*static_cast< Observer *>(this));
mSession->RequestLocateUser(mUserName);
}
/******************************************************************************
*
* NAME
* LocateUserWait::HandleNotification(ServerError)
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void LocateUserWait::HandleNotification(ServerError& error)
{
if (mEndResult == Waiting)
{
const wchar_t* errorMsg = error.GetDescription();
WWDEBUG_SAY(("WOLERROR: LocateUserWait server error '%S'\n", errorMsg));
EndWait(Error, errorMsg);
}
}
/******************************************************************************
*
* NAME
* LocateUserWait::LocateUserWait
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void LocateUserWait::HandleNotification(UserEvent& event)
{
if (mEndResult == Waiting)
{
const RefPtr& user = event.Subject();
if (mUserName.Compare_No_Case(user->GetName()) == 0)
{
WWDEBUG_SAY(("WOL: LocateUserWait successful\n"));
EndWait(ConditionMet, WOLSTRING("WOL_USERFOUND"));
}
}
}
//-----------------------------------------------------------------------------
/******************************************************************************
*
* NAME
* SendMsgWait::Create
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
*
******************************************************************************/
RefPtr SendMsgWait::Create(const RefPtr& session, ChatMessage& message)
{
WWASSERT(session.IsValid() && "SendMsgWait");
if (!session.IsValid())
{
return NULL;
}
return new SendMsgWait(session, message);
}
/******************************************************************************
*
* NAME
* SendMsgWait::SendMsgWait
*
* DESCRIPTION
* Constructor
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
SendMsgWait::SendMsgWait(const RefPtr& session, ChatMessage& message) :
SingleWait(WOLSTRING("WOL_SENDINGMSG")),
mSession(session),
mMessage(message)
{
WWDEBUG_SAY(("WOL: SendMsgWait Create\n"));
}
/******************************************************************************
*
* NAME
* SendMsgWait::~SendMsgWait
*
* DESCRIPTION
* Destructor
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
SendMsgWait::~SendMsgWait()
{
WWDEBUG_SAY(("WOL: SendMsgWait End %S\n", mEndText));
}
/******************************************************************************
*
* NAME
* SendMsgWait::WaitBeginning
*
* DESCRIPTION
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
void SendMsgWait::WaitBeginning(void)
{
WWDEBUG_SAY(("WOL: SendMsgWait Begin\n"));
WWASSERT(mSession.IsValid() && "SendMsgWait");
if (mMessage.IsPrivate())
{
RefPtr user = mSession->FindUser(mMessage.GetSendersName());
if (!user.IsValid())
{
WWDEBUG_SAY(("WOLERROR: SendMsgWait user not found\n"));
EndWait(Error, WOLSTRING("WOL_USERNOTFOUND"));
return;
}
UserList userList;
userList.push_back(user);
if (mMessage.IsAction())
{
mSession->SendPrivateAction(userList, mMessage.GetMessage());
}
else
{
mSession->SendPrivateMessage(userList, mMessage.GetMessage());
}
}
else
{
if (mMessage.IsAction())
{
mSession->SendPublicAction(mMessage.GetMessage());
}
else
{
mSession->SendPublicMessage(mMessage.GetMessage());
}
}
WWDEBUG_SAY(("WOL: SendMsgWait successful\n"));
EndWait(ConditionMet, mMessage.GetMessage());
}
} // namespace WWOnline