www.pudn.com > UDP文件传输.rar > ZsP2pUserList.h
#ifndef ZS_P2P_USERLIST_H
#define ZS_P2P_USERLIST_H 1
///////////// ZsP2pUserList.h //////////////////////////
#include "HList.h"
#include "svr_userinfo.h"
class CZsP2pUserList:public ISvrUserinfo
{
typedef CHList USER_ITEM;
USER_ITEM m_UserList;
UNI_DWORD m_UserCount;
CHMutex m_userMutex;
public:
virtual UNI_DWORD GetUserCount()
{
return m_UserCount;
}
virtual UNI_BOOL InserUser(P2P_SVRITEM *puser)
{
UNI_BOOL ret;
USER_ITEM::NODETYPE *pNode;
ret=UNI_FALSE;
m_userMutex.Lock();
if(pNode=m_UserList.AddTail())
{
memcpy(pNode,puser,sizeof(USER_ITEM::NODETYPE));
m_UserCount++;
ret=UNI_TRUE;
}
m_userMutex.UnLock();
return ret;
}
virtual UNI_BOOL SetUser(P2P_SVRITEM *puser)
{
USER_ITEM::NODETYPE *pNode;
USER_ITEM::HLISTPOSTION pos;
UNI_BOOL ret=UNI_FALSE;
m_userMutex.Lock();
if(pos=m_UserList.MoveToBegin())
{
while(pNode=m_UserList.MoveToNext(pos))
{
if(strcmp(pNode->userName,puser->userName)==0)
{
memcpy(pNode,puser,sizeof(USER_ITEM::NODETYPE));
ret= UNI_TRUE;
break;
}
}
}
m_userMutex.UnLock();
return ret;
}
virtual UNI_BOOL GetUserInfo(char *userName,P2P_SVRITEM * puser)
{
USER_ITEM::NODETYPE *pNode;
USER_ITEM::HLISTPOSTION pos;
UNI_BOOL ret=UNI_FALSE;
m_userMutex.Lock();
if(pos=m_UserList.MoveToBegin())
{
while(pNode=m_UserList.MoveToNext(pos))
{
if(strcmp(pNode->userName,userName)==0)
{
memcpy(puser,pNode,sizeof(USER_ITEM::NODETYPE));
ret= UNI_TRUE;
break;
}
}
}
m_userMutex.UnLock();
return ret;
}
virtual void RemovUser(char *userName)
{
USER_ITEM::NODETYPE *pNode;
USER_ITEM::HLISTPOSTION pos;
m_userMutex.Lock();
if(pos=m_UserList.MoveToBegin())
{
while(pNode=m_UserList.MoveToNext(pos))
{
if(strcmp(pNode->userName,userName)==0)
{
m_UserList.Remove(pNode);
if(m_UserCount)
m_UserCount--;
break;;
}
}
}
m_userMutex.UnLock();
}
virtual void DeleteUsers(UNI_DWORD dwTimeOut,UNI_DWORD dwTickCount)
{
USER_ITEM::NODETYPE *pNode;
USER_ITEM::HLISTPOSTION pos;
m_userMutex.Lock();
if(pos=m_UserList.MoveToBegin())
{
while(pNode=m_UserList.MoveToNext(pos))
{
if((UNI_DWORD)(dwTickCount-pNode->dwTickCount)>dwTimeOut)
{
m_UserList.Remove(pNode);
if(m_UserCount)
m_UserCount--;
}
}
}
m_userMutex.UnLock();
}
};
////////////////////////////////////////////////
#endif