/*
** 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/WOLUser.cpp $
*
* DESCRIPTION
*
* PROGRAMMER
* $Author: Steve_t $
*
* VERSION INFO
* $Revision: 19 $
* $Modtime: 10/10/02 10:38a $
*
******************************************************************************/
#include "always.h"
#include "WOLUser.h"
#include "WOLChannel.h"
#include "WOLSquad.h"
#include "WOLLadder.h"
#include
namespace WWOnline {
/******************************************************************************
*
* NAME
* UserData::Create
*
* DESCRIPTION
* Create a new User data instance
*
* INPUTS
* WOLUser - Wolapi user structure
*
* RESULT
* User -
*
******************************************************************************/
RefPtr UserData::Create(const WOL::User& user)
{
return new UserData(user);
}
/******************************************************************************
*
* NAME
* UserData::Create
*
* DESCRIPTION
* Create a new User data instance
*
* INPUTS
* Name - Name of user
*
* RESULT
* User -
*
******************************************************************************/
RefPtr UserData::Create(const wchar_t* name)
{
if (name)
{
WOL::User user;
memset(&user, 0, sizeof(user));
wcstombs((char*)user.name, name, sizeof(user.name));
user.name[sizeof(user.name) - 1] = 0;
return Create(user);
}
return RefPtr();
}
/******************************************************************************
*
* NAME
* UserData::UserData
*
* DESCRIPTION
* Constructor
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
UserData::UserData(const WOL::User& user) :
mUserName((char*)user.name),
mLocation(USERLOCATION_UNKNOWN)
{
WWDEBUG_SAY(("WOL: Instantiating UserData '%S'\n", (const WCHAR*)mUserName));
memcpy(&mData, &user, sizeof(mData));
mKickTimer = 0;
mData.next = NULL;
}
/******************************************************************************
*
* NAME
* UserData::~UserData
*
* DESCRIPTION
* Destructor
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
UserData::~UserData()
{
WWDEBUG_SAY(("WOL: Destructing UserData '%S'\n", (const WCHAR*)mUserName));
}
/******************************************************************************
*
* NAME
* UserData::UpdateData
*
* DESCRIPTION
*
* INPUTS
* WOlUser - WOL user structure to update with.
*
* RESULT
* NONE
*
******************************************************************************/
void UserData::UpdateData(const WOL::User& wolUser)
{
wchar_t name[64];
mbstowcs(name, (const char*)wolUser.name, sizeof(wolUser.name));
name[sizeof(wolUser.name) - 1] = 0;
WWASSERT(wcslen(name) && "Empty user name");
bool isValid = (!mUserName.Is_Empty() && mUserName.Compare_No_Case(name) == 0);
WWASSERT(isValid && "WOLUserData::UpdateData() mismatch");
if (isValid)
{
if (mData.squadID != wolUser.squadID)
{
mSquad.Release();
mData.squadID = wolUser.squadID;
}
}
}
/******************************************************************************
*
* NAME
* UserData::Squelch
*
* DESCRIPTION
*
* INPUTS
* OnOff - Squelch state
*
* RESULT
* NONE
*
******************************************************************************/
void UserData::Squelch(bool onoff)
{
mData.flags = (onoff == true) ?
(mData.flags | CHAT_USER_SQUELCHED) : (mData.flags ^ CHAT_USER_SQUELCHED);
}
/******************************************************************************
*
* NAME
* UserData::SetLocation
*
* DESCRIPTION
* Set the users location.
*
* INPUTS
* Location - User's location
*
* RESULT
* NONE
*
******************************************************************************/
void UserData::SetLocation(UserLocation location)
{
mLocation = location;
}
/******************************************************************************
*
* NAME
* UserData::SetChannel
*
* DESCRIPTION
* Set the channel the user is in.
*
* INPUTS
* Channel - Channel user is in.
*
* RESULT
* NONE
*
******************************************************************************/
void UserData::SetChannel(const RefPtr& channel)
{
mChannel = channel;
}
/******************************************************************************
*
* NAME
* UserData::SetSquad
*
* DESCRIPTION
* Associate a squad for this user.
*
* INPUTS
* Squad
*
* RESULT
* NONE
*
******************************************************************************/
void UserData::SetSquad(const RefPtr& squadData)
{
mSquad = squadData;
if (squadData.IsValid())
{
mData.squadID = squadData->GetID();
// Syncronize common data with updated squad information.
strncpy((char*)mData.squadname, squadData->GetName(), sizeof(mData.squadname));
mData.squadname[sizeof(mData.squadname) - 1] = 0;
strncpy((char*)mData.squadabbrev, squadData->GetAbbr(), sizeof(mData.squadabbrev));
mData.squadabbrev[sizeof(mData.squadabbrev) - 1] = 0;
}
else
{
mData.squadname[0] = 0;
mData.squadabbrev[0] = 0;
}
}
/******************************************************************************
*
* NAME
* UserData::SetTeam
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void UserData::SetTeam(int team)
{
mData.team = team;
}
/******************************************************************************
*
* NAME
* UserData::SetLocale
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void UserData::SetLocale(WOL::Locale locale)
{
if (locale >= WOL::LOC_UNKNOWN && locale <= WOL::LOC_TURKEY)
{
mData.locale = locale;
}
}
/******************************************************************************
*
* NAME
* UserData::SetLadder
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void UserData::SetLadder(const RefPtr& ladder)
{
mUserLadder = ladder;
}
/******************************************************************************
*
* NAME
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
*
******************************************************************************/
RefPtr UserData::GetClanLadder(void) const
{
if (mSquad.IsValid())
{
return mSquad->GetLadder();
}
return NULL;
}
/******************************************************************************
*
* NAME
* UserData::SetTeamLadder
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void UserData::SetTeamLadder(const RefPtr& ladder)
{
mTeamLadder = ladder;
}
/******************************************************************************
*
* NAME
* UserData::
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void UserData::SetLadderFromType(const RefPtr& ladder, LadderType type)
{
if (type == LadderType_Team)
{
SetTeamLadder(ladder);
return;
}
if (type == LadderType_Clan)
{
if (mSquad.IsValid())
{
mSquad->SetLadder(ladder);
}
return;
}
SetLadder(ladder);
}
/******************************************************************************
*
* NAME
* UserData::
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
*
******************************************************************************/
RefPtr UserData::GetLadderFromType(LadderType type)
{
if (type == LadderType_Team)
{
return GetTeamLadder();
}
if (type == LadderType_Clan)
{
return GetClanLadder();
}
return GetLadder();
}
/******************************************************************************
*
* NAME
* NativeWOLUserList::
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
NativeWOLUserList::NativeWOLUserList(const UserList& users) :
mNativeList(NULL)
{
int count = users.size();
if (count > 0)
{
mNativeList = new WOL::User[count];
if (mNativeList)
{
for (int index = 0; index < count; index++)
{
WOL::User* wolUser = &users[index]->GetData();
memcpy(&mNativeList[index], wolUser, sizeof(WOL::User));
if (index == (count - 1))
{
mNativeList[index].next = NULL;
}
else
{
mNativeList[index].next = &mNativeList[index + 1];
}
}
}
}
}
/******************************************************************************
*
* NAME
* NativeWOLUserList::
*
* DESCRIPTION
* Destructor
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
NativeWOLUserList::~NativeWOLUserList()
{
if (mNativeList)
{
delete []mNativeList;
}
}
/******************************************************************************
*
* NAME
* FindUserInList
*
* DESCRIPTION
* Search for a user with the specified name in the list.
*
* INPUTS
* Name - Name of user to search for.
* List - UserData list to search.
*
* RESULT
* User -
*
******************************************************************************/
RefPtr FindUserInList(const wchar_t* username, const UserList& list)
{
for (unsigned int index = 0; index < list.size(); index++)
{
const WideStringClass& name = list[index]->GetName();
if (name.Compare_No_Case(username) == 0)
{
return list[index];
}
}
return RefPtr();
}
/******************************************************************************
*
* NAME
* RemoveUserInList
*
* DESCRIPTION
* Remove the
*
* INPUTS
* Name - Name of user to remove.
* List - UserData list to search.
*
* RESULT
* Removed - User removed from list.
*
******************************************************************************/
RefPtr RemoveUserInList(const wchar_t* username, UserList& list)
{
RefPtr removedUser;
UserList::iterator iter = list.begin();
while (iter != list.end())
{
const WideStringClass& name = (*iter)->GetName();
if (name.Compare_No_Case(username) == 0)
{
removedUser = *iter;
list.erase(iter);
break;
}
iter++;
}
return removedUser;
}
} // namespace WWOnline