UserList.cpp
上传用户:hysujiao87
上传日期:2007-12-02
资源大小:156k
文件大小:6k
源码类别:

ICQ/即时通讯

开发平台:

C/C++

  1. // UserRecord.cpp: implementation of the CUserList class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "UserList.h"
  6. #ifdef _DEBUG
  7. #undef THIS_FILE
  8. static char THIS_FILE[]=__FILE__;
  9. #define new DEBUG_NEW
  10. #endif
  11. //////////////////////////////////////////////////////////////////////
  12. // Construction/Destruction
  13. //////////////////////////////////////////////////////////////////////
  14. IMPLEMENT_DYNCREATE(CUserData, CObject)
  15. IMPLEMENT_DYNCREATE(CUserList, CObject)
  16. CUserList::CUserList()
  17. {
  18. }
  19. CUserList::~CUserList()
  20. {
  21. CSingleLock lock(&_mutex, TRUE);
  22. _ASSERTE(lock.IsLocked() == TRUE);
  23. if (lock.IsLocked() != TRUE)
  24. return ;
  25. removeAll();
  26. }
  27. HRESULT CUserList::authenticate(LPCTSTR userID, LPCTSTR password)
  28. {
  29. _ASSERTE(userID != NULL && password != NULL);
  30. if (userID == NULL || password == NULL)
  31. return E_INVALIDARG;
  32. CSingleLock lock(&_mutex, TRUE);
  33. _ASSERTE(lock.IsLocked() == TRUE);
  34. if (lock.IsLocked() != TRUE)
  35. return E_FAIL;
  36. CUserData* userData = getUserByID(userID);
  37. if (userData == NULL)
  38. return E_FAIL;
  39. if (userData->_password == password)
  40. return S_OK;
  41. return E_FAIL;
  42. }
  43. CUserData* CUserList::getUserByID(LPCTSTR userID)
  44. {
  45. CSingleLock lock(&_mutex, TRUE);
  46. _ASSERTE(lock.IsLocked() == TRUE);
  47. if (lock.IsLocked() != TRUE)
  48. return NULL;
  49. for(int i = 0; i < _userList.GetCount(); i++)
  50. {
  51. CUserData *userData = getUserByIndex(i);
  52. _ASSERTE(userData != NULL);
  53. if (userData == NULL)
  54. continue ;
  55. if (userData->_clientID == userID)
  56. return userData;
  57. }
  58. return NULL;
  59. }
  60. CUserData* CUserList::getUserByIndex(INT_PTR index)
  61. {
  62. CSingleLock lock(&_mutex, TRUE);
  63. _ASSERTE(lock.IsLocked() == TRUE);
  64. if (lock.IsLocked() != TRUE)
  65. return NULL;
  66. if(index < 0 || index >= _userList.GetCount())
  67. return NULL;
  68. return _userList.GetAt(_userList.FindIndex(index));
  69. }
  70. void CUserList::removeAll()
  71. {
  72. CSingleLock lock(&_mutex, TRUE);
  73. _ASSERTE(lock.IsLocked() == TRUE);
  74. if (lock.IsLocked() != TRUE)
  75. return ;
  76. for(int i = 0; i < _userList.GetCount(); i++)
  77. {
  78. CUserData* pUserData = getUserByIndex(i);
  79. ASSERT(pUserData != NULL);
  80. delete pUserData;
  81. }
  82. _userList.RemoveAll();
  83. }
  84. void CUserList::addUser(CUserData* userData)
  85. {
  86. CSingleLock lock(&_mutex, TRUE);
  87. _ASSERTE(lock.IsLocked() == TRUE);
  88. if (lock.IsLocked() != TRUE)
  89. return ;
  90. CUserData *oldData = getUserByID(userData->_clientID);
  91. if(oldData != NULL)
  92. {
  93. *oldData = *userData;
  94. }
  95. else
  96. {
  97. CUserData *newData = new CUserData;
  98. *newData = *userData;
  99. _userList.AddTail(newData);
  100. }
  101. _mutex.Unlock();
  102. }
  103. void CUserList::Serialize(CArchive &ar)
  104. {
  105. CSingleLock lock(&_mutex, TRUE);
  106. _ASSERTE(lock.IsLocked() == TRUE);
  107. if (lock.IsLocked() != TRUE)
  108. return ;
  109. if( ar.IsStoring() )
  110. {
  111. INT_PTR count = _userList.GetCount();
  112. ar.Write(&count, sizeof(INT_PTR));
  113. for (INT_PTR i = 0; i < _userList.GetCount(); i++)
  114. {
  115. CUserData *userData = getUserByIndex(i);
  116. _ASSERTE(userData != NULL);
  117. if (userData == NULL)
  118. return ;
  119. userData->Serialize(ar);
  120. }
  121. }
  122. else
  123. {
  124. INT_PTR count = 0;
  125. ar.Read(&count, sizeof(INT_PTR));
  126. for(INT_PTR i = 0; i < count; i++)
  127. {
  128. CUserData *userData = new CUserData;
  129. _ASSERTE(userData != NULL);
  130. if (userData == NULL)
  131. return ;
  132. userData->Serialize(ar);
  133. _userList.AddTail(userData);
  134. }
  135. }
  136. }
  137. CUserData::CUserData()
  138. {
  139. _online = FALSE;
  140. _lastReport = 0;
  141. ::ZeroMemory(&_sockAddr, sizeof(sockaddr_in));
  142. }
  143. CUserData::~CUserData()
  144. {
  145. clear();
  146. }
  147. void CUserData::clear()
  148. {
  149. _clientID.Empty();
  150. _password.Empty();
  151. _nickname.Empty();
  152. _online = FALSE;
  153. _lastReport = 0;
  154. ::ZeroMemory(&_sockAddr, sizeof(sockaddr_in));
  155. FriendIterator begin = _friendList.begin();
  156. FriendIterator end = _friendList.end();
  157. for (FriendIterator it = begin; it != end; it++)
  158. {
  159. delete (*it);
  160. }
  161. _friendList.clear();
  162. }
  163. void CUserData::Serialize(CArchive &ar)
  164. {
  165. if( ar.IsStoring() )
  166. {
  167. ar << _clientID;
  168. ar << _password;
  169. ar << _nickname;
  170. ar << _friendList.size();
  171. FriendIterator begin = _friendList.begin();
  172. FriendIterator end = _friendList.end();
  173. for (FriendIterator it = begin; it != end; it++)
  174. {
  175. ar << (*it)->userID;
  176. }
  177. }
  178. else
  179. {
  180. ar >> _clientID;
  181. ar >> _password;
  182. ar >> _nickname;
  183. int size = 0;
  184. ar >> size;
  185. for (int i = 0; i < size; i++)
  186. {
  187. FRIEND_DATA *friendData = new FRIEND_DATA;
  188. _ASSERTE(friendData != NULL);
  189. if (friendData == NULL)
  190. return ;
  191. ar >> friendData->userID;
  192. _friendList.push_back(friendData);
  193. }
  194. }
  195. }
  196. void CUserData::operator = (CUserData &data)
  197. {
  198. clear();
  199. _clientID = data._clientID;
  200. _password = data._password;
  201. _nickname = data._nickname;
  202. _online = data._online;
  203. _lastReport = data._lastReport;
  204. memcpy(&_sockAddr, &data._sockAddr, sizeof(sockaddr_in));
  205. FriendIterator begin = data._friendList.begin();
  206. FriendIterator end = data._friendList.end();
  207. for (FriendIterator it = begin; it != end; it++)
  208. {
  209. FRIEND_DATA *friendData = new FRIEND_DATA;
  210. if (friendData == NULL)
  211. return ;
  212. friendData->userID = (*it)->userID;
  213. _friendList.push_back(friendData);
  214. }
  215. }
  216. HRESULT CUserData::addFriend(LPCTSTR friendID)
  217. {
  218. FriendIterator begin = _friendList.begin();
  219. FriendIterator end = _friendList.end();
  220. for (FriendIterator it = begin; it != end; it++)
  221. {
  222. if ((*it)->userID == friendID)
  223. {
  224. return S_FALSE;
  225. }
  226. }
  227. FRIEND_DATA *friendData = new FRIEND_DATA;
  228. if (friendData == NULL)
  229. return ERROR_NOT_ENOUGH_MEMORY;
  230. friendData->userID = friendID;
  231. _friendList.push_back(friendData);
  232. return S_OK;
  233. }