www.pudn.com > QQ2004_Source_0.01.rar > UserList.cpp
// UserRecord.cpp: implementation of the CUserList class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "UserList.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNCREATE(CUserData, CObject)
IMPLEMENT_DYNCREATE(CUserList, CObject)
CUserList::CUserList()
{
}
CUserList::~CUserList()
{
CSingleLock lock(&_mutex, TRUE);
_ASSERTE(lock.IsLocked() == TRUE);
if (lock.IsLocked() != TRUE)
return ;
removeAll();
}
HRESULT CUserList::authenticate(LPCTSTR userID, LPCTSTR password)
{
_ASSERTE(userID != NULL && password != NULL);
if (userID == NULL || password == NULL)
return E_INVALIDARG;
CSingleLock lock(&_mutex, TRUE);
_ASSERTE(lock.IsLocked() == TRUE);
if (lock.IsLocked() != TRUE)
return E_FAIL;
CUserData* userData = getUserByID(userID);
if (userData == NULL)
return E_FAIL;
if (userData->_password == password)
return S_OK;
return E_FAIL;
}
CUserData* CUserList::getUserByID(LPCTSTR userID)
{
CSingleLock lock(&_mutex, TRUE);
_ASSERTE(lock.IsLocked() == TRUE);
if (lock.IsLocked() != TRUE)
return NULL;
for(int i = 0; i < _userList.GetCount(); i++)
{
CUserData *userData = getUserByIndex(i);
_ASSERTE(userData != NULL);
if (userData == NULL)
continue ;
if (userData->_clientID == userID)
return userData;
}
return NULL;
}
CUserData* CUserList::getUserByIndex(INT_PTR index)
{
CSingleLock lock(&_mutex, TRUE);
_ASSERTE(lock.IsLocked() == TRUE);
if (lock.IsLocked() != TRUE)
return NULL;
if(index < 0 || index >= _userList.GetCount())
return NULL;
return _userList.GetAt(_userList.FindIndex(index));
}
void CUserList::removeAll()
{
CSingleLock lock(&_mutex, TRUE);
_ASSERTE(lock.IsLocked() == TRUE);
if (lock.IsLocked() != TRUE)
return ;
for(int i = 0; i < _userList.GetCount(); i++)
{
CUserData* pUserData = getUserByIndex(i);
ASSERT(pUserData != NULL);
delete pUserData;
}
_userList.RemoveAll();
}
void CUserList::addUser(CUserData* userData)
{
CSingleLock lock(&_mutex, TRUE);
_ASSERTE(lock.IsLocked() == TRUE);
if (lock.IsLocked() != TRUE)
return ;
CUserData *oldData = getUserByID(userData->_clientID);
if(oldData != NULL)
{
*oldData = *userData;
}
else
{
CUserData *newData = new CUserData;
*newData = *userData;
_userList.AddTail(newData);
}
_mutex.Unlock();
}
void CUserList::Serialize(CArchive &ar)
{
CSingleLock lock(&_mutex, TRUE);
_ASSERTE(lock.IsLocked() == TRUE);
if (lock.IsLocked() != TRUE)
return ;
if( ar.IsStoring() )
{
INT_PTR count = _userList.GetCount();
ar.Write(&count, sizeof(INT_PTR));
for (INT_PTR i = 0; i < _userList.GetCount(); i++)
{
CUserData *userData = getUserByIndex(i);
_ASSERTE(userData != NULL);
if (userData == NULL)
return ;
userData->Serialize(ar);
}
}
else
{
INT_PTR count = 0;
ar.Read(&count, sizeof(INT_PTR));
for(INT_PTR i = 0; i < count; i++)
{
CUserData *userData = new CUserData;
_ASSERTE(userData != NULL);
if (userData == NULL)
return ;
userData->Serialize(ar);
_userList.AddTail(userData);
}
}
}
CUserData::CUserData()
{
_online = FALSE;
_lastReport = 0;
::ZeroMemory(&_sockAddr, sizeof(sockaddr_in));
}
CUserData::~CUserData()
{
clear();
}
void CUserData::clear()
{
_clientID.Empty();
_password.Empty();
_nickname.Empty();
_online = FALSE;
_lastReport = 0;
::ZeroMemory(&_sockAddr, sizeof(sockaddr_in));
FriendIterator begin = _friendList.begin();
FriendIterator end = _friendList.end();
for (FriendIterator it = begin; it != end; it++)
{
delete (*it);
}
_friendList.clear();
}
void CUserData::Serialize(CArchive &ar)
{
if( ar.IsStoring() )
{
ar << _clientID;
ar << _password;
ar << _nickname;
ar << _friendList.size();
FriendIterator begin = _friendList.begin();
FriendIterator end = _friendList.end();
for (FriendIterator it = begin; it != end; it++)
{
ar << (*it)->userID;
}
}
else
{
ar >> _clientID;
ar >> _password;
ar >> _nickname;
int size = 0;
ar >> size;
for (int i = 0; i < size; i++)
{
FRIEND_DATA *friendData = new FRIEND_DATA;
_ASSERTE(friendData != NULL);
if (friendData == NULL)
return ;
ar >> friendData->userID;
_friendList.push_back(friendData);
}
}
}
void CUserData::operator = (CUserData &data)
{
clear();
_clientID = data._clientID;
_password = data._password;
_nickname = data._nickname;
_online = data._online;
_lastReport = data._lastReport;
memcpy(&_sockAddr, &data._sockAddr, sizeof(sockaddr_in));
FriendIterator begin = data._friendList.begin();
FriendIterator end = data._friendList.end();
for (FriendIterator it = begin; it != end; it++)
{
FRIEND_DATA *friendData = new FRIEND_DATA;
if (friendData == NULL)
return ;
friendData->userID = (*it)->userID;
_friendList.push_back(friendData);
}
}
HRESULT CUserData::addFriend(LPCTSTR friendID)
{
FriendIterator begin = _friendList.begin();
FriendIterator end = _friendList.end();
for (FriendIterator it = begin; it != end; it++)
{
if ((*it)->userID == friendID)
{
return S_FALSE;
}
}
FRIEND_DATA *friendData = new FRIEND_DATA;
if (friendData == NULL)
return ERROR_NOT_ENOUGH_MEMORY;
friendData->userID = friendID;
_friendList.push_back(friendData);
return S_OK;
}