2024-12-21 10:04:04 +08:00
|
|
|
|
|
|
|
|
|
|
#include "stdafx.h"
|
|
|
|
|
|
#include "DNFriend.h"
|
|
|
|
|
|
#include "DNUserSendManager.h"
|
|
|
|
|
|
#include "DNWorldUserState.h"
|
|
|
|
|
|
#include "Log.h"
|
|
|
|
|
|
|
|
|
|
|
|
CDNFriend::CDNFriend(CDNUserSendManager * pManager)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_pUserSendManager = pManager;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CDNFriend::~CDNFriend()
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> lock(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::vector <TFriend*>::iterator ii;
|
|
|
|
|
|
for (ii = m_FriendList.begin(); ii != m_FriendList.end(); ii++)
|
|
|
|
|
|
SAFE_DELETE((*ii));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDNFriend::AddGroup(UINT nGroupDBID, const WCHAR * pGroupName)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> lock(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::vector <TFriendGroup*>::iterator ii;
|
|
|
|
|
|
for (ii = m_FriendGroupList.begin(); ii != m_FriendGroupList.end(); ii++)
|
|
|
|
|
|
if ((*ii)->nGroupDBID == nGroupDBID)
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
TFriendGroup * pGroup = new TFriendGroup;
|
|
|
|
|
|
pGroup->nGroupDBID = nGroupDBID;
|
|
|
|
|
|
_wcscpy(pGroup->wszGroupName, _countof(pGroup->wszGroupName), pGroupName, (int)wcslen(pGroupName));
|
|
|
|
|
|
|
|
|
|
|
|
m_FriendGroupList.push_back(pGroup);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDNFriend::DelGroup(UINT nGroupDBID)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> lock(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::vector <TFriendGroup*>::iterator ii;
|
|
|
|
|
|
for (ii = m_FriendGroupList.begin(); ii != m_FriendGroupList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii)->nGroupDBID == nGroupDBID)
|
|
|
|
|
|
{
|
|
|
|
|
|
TFriendGroup * pGroup = (*ii);
|
|
|
|
|
|
m_FriendGroupList.erase(ii);
|
|
|
|
|
|
|
|
|
|
|
|
std::vector <TFriend*>::iterator iter;
|
|
|
|
|
|
for (iter = m_FriendList.begin(); iter != m_FriendList.end(); iter++)
|
|
|
|
|
|
if ((*iter)->nGroupDBID == nGroupDBID)
|
|
|
|
|
|
{
|
|
|
|
|
|
(*iter)->nGroupDBID = 0;
|
|
|
|
|
|
memset((*iter)->wszGroupName, 0, sizeof((*iter)->wszGroupName));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SAFE_DELETE(pGroup);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDNFriend::AddFriend(UINT nFriendAccountDBID, INT64 biFriendCharacterDBID, const WCHAR * pName, UINT nGroupID, bool bMobileAuthentication)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (HasFriend(biFriendCharacterDBID) == true)
|
|
|
|
|
|
return false; //Already Have
|
|
|
|
|
|
|
|
|
|
|
|
ScopeLock <CSyncLock> lock(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
TFriend * pFriend = new TFriend;
|
|
|
|
|
|
memset(pFriend, 0, sizeof(TFriend));
|
|
|
|
|
|
|
|
|
|
|
|
pFriend->nFriendAccountDBID = nFriendAccountDBID;
|
|
|
|
|
|
pFriend->biFriendCharacterDBID = biFriendCharacterDBID;
|
|
|
|
|
|
_wcscpy(pFriend->wszCharacterName, _countof(pFriend->wszCharacterName), pName, (int)wcslen(pName));
|
|
|
|
|
|
#ifdef PRE_ADD_DOORS
|
|
|
|
|
|
pFriend->bMobileAuthentication = bMobileAuthentication;
|
|
|
|
|
|
#endif //#ifdef PRE_ADD_DOORS
|
|
|
|
|
|
|
|
|
|
|
|
if (nGroupID > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
TFriendGroup * pGroup = GetGroupAsync(nGroupID);
|
|
|
|
|
|
if (pGroup != NULL)
|
|
|
|
|
|
{
|
|
|
|
|
|
_wcscpy(pFriend->wszGroupName, _countof(pFriend->wszGroupName), pGroup->wszGroupName, (int)wcslen( pGroup->wszGroupName));
|
|
|
|
|
|
pFriend->nGroupDBID = pGroup->nGroupDBID;
|
|
|
|
|
|
} else
|
|
|
|
|
|
{
|
|
|
|
|
|
//<2F><EFBFBD><D7B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE>ϴ¤<CFB4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><D7B7><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ż<EFBFBD>
|
|
|
|
|
|
SAFE_DELETE(pFriend);
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
m_FriendList.push_back(pFriend);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool CDNFriend::DelFriend(INT64 biFriendCharacterDBID)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> lock(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::vector <TFriend*>::iterator ii;
|
|
|
|
|
|
for (ii = m_FriendList.begin(); ii != m_FriendList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii)->biFriendCharacterDBID == biFriendCharacterDBID)
|
|
|
|
|
|
{
|
|
|
|
|
|
TFriend * pFriend = (*ii);
|
|
|
|
|
|
m_FriendList.erase(ii);
|
|
|
|
|
|
SAFE_DELETE(pFriend);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
INT64 CDNFriend::DelFriend(const WCHAR * pwszFriendCharacterName)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> lock(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
INT64 biCharacterDBID = 0;
|
|
|
|
|
|
std::vector <TFriend*>::iterator ii;
|
|
|
|
|
|
for (ii = m_FriendList.begin(); ii != m_FriendList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!wcscmp((*ii)->wszCharacterName, pwszFriendCharacterName))
|
|
|
|
|
|
{
|
|
|
|
|
|
TFriend * pFriend = (*ii);
|
|
|
|
|
|
m_FriendList.erase(ii);
|
|
|
|
|
|
|
|
|
|
|
|
if (pFriend != NULL)
|
|
|
|
|
|
{
|
|
|
|
|
|
biCharacterDBID = pFriend->biFriendCharacterDBID;
|
|
|
|
|
|
SAFE_DELETE(pFriend);
|
|
|
|
|
|
}
|
|
|
|
|
|
return biCharacterDBID;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return biCharacterDBID;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDNFriend::UpdateFriend(INT64 biFriendCharacterDBID, UINT nGroupDBID, const WCHAR * pMemo)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> lock(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::vector <TFriend*>::iterator ii;
|
|
|
|
|
|
for (ii = m_FriendList.begin(); ii != m_FriendList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii)->biFriendCharacterDBID == biFriendCharacterDBID)
|
|
|
|
|
|
{
|
|
|
|
|
|
TFriendGroup * pGroup = NULL;
|
|
|
|
|
|
if (nGroupDBID > 0)
|
|
|
|
|
|
pGroup = GetGroupAsync(nGroupDBID);
|
|
|
|
|
|
|
|
|
|
|
|
if (pGroup != NULL)
|
|
|
|
|
|
{
|
|
|
|
|
|
_wcscpy((*ii)->wszGroupName, _countof((*ii)->wszGroupName), pGroup->wszGroupName, (int)wcslen(pGroup->wszGroupName));
|
|
|
|
|
|
(*ii)->nGroupDBID = nGroupDBID;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
memset((*ii)->wszGroupName, 0, sizeof((*ii)->wszGroupName));
|
|
|
|
|
|
(*ii)->nGroupDBID = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (pMemo != NULL && pMemo[0] != '\0' && pMemo[0] != 0)
|
|
|
|
|
|
_wcscpy((*ii)->wszFriendMemo, _countof((*ii)->wszFriendMemo), pMemo, (int)wcslen(pMemo));
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDNFriend::UpdateGroup(UINT nGroupDBID, const WCHAR * pGroupName)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> lock(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::vector <TFriendGroup*>::iterator ii;
|
|
|
|
|
|
for (ii = m_FriendGroupList.begin(); ii != m_FriendGroupList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii)->nGroupDBID == nGroupDBID)
|
|
|
|
|
|
{
|
|
|
|
|
|
_wcscpy((*ii)->wszGroupName, _countof((*ii)->wszGroupName), pGroupName, (int)wcslen(pGroupName));
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDNFriend::SendFriendList()
|
|
|
|
|
|
{
|
|
|
|
|
|
{
|
|
|
|
|
|
SCFriendGroupList packet;
|
|
|
|
|
|
memset(&packet, 0, sizeof(packet));
|
|
|
|
|
|
|
|
|
|
|
|
int nSize = 0;
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> lock(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::vector <TFriendGroup*>::iterator ii;
|
|
|
|
|
|
for (ii = m_FriendGroupList.begin(); ii != m_FriendGroupList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
packet.nGroupDBID[packet.cGroupCount] = (*ii)->nGroupDBID;
|
|
|
|
|
|
if( (*ii)->wszGroupName[0] > 0 )
|
|
|
|
|
|
{
|
|
|
|
|
|
size_t len = wcslen( (*ii)->wszGroupName );
|
|
|
|
|
|
if( len > FRIEND_GROUP_NAMELENMAX )
|
|
|
|
|
|
{
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
packet.cGroupNameLen[packet.cGroupCount] = (BYTE)wcslen((*ii)->wszGroupName);
|
|
|
|
|
|
wmemcpy_s( packet.wszBuf + nSize, _countof(packet.wszBuf)-nSize, (*ii)->wszGroupName, packet.cGroupNameLen[packet.cGroupCount]);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
packet.cGroupNameLen[packet.cGroupCount] = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
nSize += packet.cGroupNameLen[packet.cGroupCount];
|
|
|
|
|
|
packet.cGroupCount++;
|
|
|
|
|
|
if (packet.cGroupCount >= FRIEND_GROUP_MAX)
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
m_pUserSendManager->SendFriendGroupList(&packet, nSize);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
SCFriendList packet;
|
|
|
|
|
|
memset(&packet, 0, sizeof(packet));
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> lock(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::vector <TFriend*>::iterator ii;
|
|
|
|
|
|
for (ii = m_FriendList.begin(); ii != m_FriendList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ǵ<EFBFBD> <20><> <20>ʹ<EFBFBD> <20>̻ڰ<CCBB> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ȯ<EFBFBD><C8AE> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20>־
|
|
|
|
|
|
if ((*ii) == NULL) continue;
|
|
|
|
|
|
|
|
|
|
|
|
sWorldUserState State;
|
|
|
|
|
|
if (g_pWorldUserState->GetUserState((*ii)->wszCharacterName, (*ii)->biFriendCharacterDBID, &State))
|
|
|
|
|
|
{
|
|
|
|
|
|
packet.Info[packet.cCount].Location.cServerLocation = State.nLocationState;
|
|
|
|
|
|
packet.Info[packet.cCount].Location.nChannelID = State.nLocationState == _LOCATION_VILLAGE ? State.nChannelID : -1;
|
|
|
|
|
|
packet.Info[packet.cCount].Location.nMapIdx = State.nMapIdx;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
packet.Info[packet.cCount].Location.cServerLocation = _LOCATION_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
packet.Info[packet.cCount].biFriendCharacterDBID = (*ii)->biFriendCharacterDBID;
|
|
|
|
|
|
packet.Info[packet.cCount].nGroupDBID = (*ii)->nGroupDBID;
|
|
|
|
|
|
|
|
|
|
|
|
_wcscpy(packet.Info[packet.cCount].wszFriendName, _countof(packet.Info[packet.cCount].wszFriendName), (*ii)->wszCharacterName, (int)wcslen((*ii)->wszCharacterName));
|
|
|
|
|
|
packet.cCount++;
|
|
|
|
|
|
if (packet.cCount >= FRIEND_MAXCOUNT)
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
m_pUserSendManager->SendFriendList(&packet);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDNFriend::SendFriendLocation()
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> lock(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
SCFriendLocationList packet; //SC_FRIEND / SC_FRIEND_LOCATIONLIST
|
|
|
|
|
|
memset(&packet, 0, sizeof(packet));
|
|
|
|
|
|
|
|
|
|
|
|
std::vector <TFriend*>::iterator ii;
|
|
|
|
|
|
for (ii = m_FriendList.begin(); ii != m_FriendList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
sWorldUserState State;
|
|
|
|
|
|
if (g_pWorldUserState->GetUserState((*ii)->wszCharacterName, (*ii)->biFriendCharacterDBID, &State))
|
|
|
|
|
|
{
|
|
|
|
|
|
packet.FriendLocation[packet.cCount].Location.cServerLocation = State.nLocationState;
|
|
|
|
|
|
packet.FriendLocation[packet.cCount].Location.nChannelID = State.nLocationState == _LOCATION_VILLAGE ? State.nChannelID : -1;
|
|
|
|
|
|
packet.FriendLocation[packet.cCount].Location.nMapIdx = State.nMapIdx;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
packet.FriendLocation[packet.cCount].Location.cServerLocation = _LOCATION_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
packet.FriendLocation[packet.cCount].nGroupDBID = (*ii)->nGroupDBID;
|
|
|
|
|
|
packet.FriendLocation[packet.cCount].biFriendCharacterDBID = (*ii)->biFriendCharacterDBID;
|
|
|
|
|
|
packet.cCount++;
|
|
|
|
|
|
if (packet.cCount >= FRIEND_MAXCOUNT)
|
|
|
|
|
|
{
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
m_pUserSendManager->SendFriendLocationList(&packet);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDNFriend::HasFriend(INT64 biFriendCharacterDBID)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> lock(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::vector <TFriend*>::iterator ii;
|
|
|
|
|
|
for (ii = m_FriendList.begin(); ii != m_FriendList.end(); ii++)
|
|
|
|
|
|
if ((*ii)->biFriendCharacterDBID == biFriendCharacterDBID)
|
|
|
|
|
|
return true;
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDNFriend::HasFriend(const WCHAR * pName)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> lock(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::vector <TFriend*>::iterator ii;
|
|
|
|
|
|
for (ii = m_FriendList.begin(); ii != m_FriendList.end(); ii++)
|
|
|
|
|
|
if (!__wcsicmp_l((*ii)->wszCharacterName, pName))
|
|
|
|
|
|
return true;
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TFriendGroup * CDNFriend::GetGroup(UINT nGroupDBID)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> lock(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::vector <TFriendGroup*>::iterator ii;
|
|
|
|
|
|
for (ii = m_FriendGroupList.begin(); ii != m_FriendGroupList.end(); ii++)
|
|
|
|
|
|
if ((*ii)->nGroupDBID == nGroupDBID)
|
|
|
|
|
|
return (*ii);
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TFriendGroup * CDNFriend::GetGroup(const WCHAR * pName)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> lock(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::vector <TFriendGroup*>::iterator ii;
|
|
|
|
|
|
for (ii = m_FriendGroupList.begin(); ii != m_FriendGroupList.end(); ii++)
|
|
|
|
|
|
if (!_wcsicmp((*ii)->wszGroupName, pName))
|
|
|
|
|
|
return (*ii);
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TFriend * CDNFriend::GetFriend(INT64 biFriendCharDBID)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> lock(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::vector <TFriend*>::iterator ii;
|
|
|
|
|
|
for (ii = m_FriendList.begin(); ii != m_FriendList.end(); ii++)
|
|
|
|
|
|
if ((*ii)->biFriendCharacterDBID == biFriendCharDBID)
|
|
|
|
|
|
return (*ii);
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TFriend * CDNFriend::GetFriend(const WCHAR * pName)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> lock(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::vector <TFriend*>::iterator ii;
|
|
|
|
|
|
for (ii = m_FriendList.begin(); ii != m_FriendList.end(); ii++)
|
|
|
|
|
|
if (!__wcsicmp_l((*ii)->wszCharacterName, pName))
|
|
|
|
|
|
return (*ii);
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TFriendGroup * CDNFriend::GetGroupAsync(UINT nGroupDBID)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector <TFriendGroup*>::iterator ii;
|
|
|
|
|
|
for (ii = m_FriendGroupList.begin(); ii != m_FriendGroupList.end(); ii++)
|
|
|
|
|
|
if ((*ii)->nGroupDBID == nGroupDBID)
|
|
|
|
|
|
return (*ii);
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|