Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

224 lines
5.2 KiB

  1. /***************************************************************************/
  2. /** Microsoft Windows **/
  3. /** Copyright(c) Microsoft Corp., 1995-1996 **/
  4. /***************************************************************************/
  5. //
  6. // File: RostInfo.cpp
  7. // Created: ChrisPi 6/17/96
  8. // Modified:
  9. //
  10. // The CRosterInfo class is implemented, which is used for adding user
  11. // information to the T.120 roster
  12. //
  13. #include "precomp.h"
  14. #include <RostInfo.h>
  15. GUID g_csguidRostInfo = GUID_ROSTINFO;
  16. static const HROSTINFO g_cshriEOList = (HROSTINFO)((LONG_PTR)-1);
  17. CRosterInfo::~CRosterInfo()
  18. {
  19. DebugEntry(CRosterInfo::~CRosterInfo);
  20. while (FALSE == m_ItemList.IsEmpty())
  21. {
  22. PWSTR pwszItem = (PWSTR) m_ItemList.RemoveHead();
  23. ASSERT(pwszItem);
  24. delete pwszItem;
  25. }
  26. delete m_pvSaveData;
  27. DebugExitVOID(CRosterInfo::~CRosterInfo);
  28. }
  29. HRESULT CRosterInfo::AddItem(PCWSTR pcwszTag, PCWSTR pcwszData)
  30. {
  31. DebugEntry(CRosterInfo::AddItem);
  32. ASSERT(pcwszTag);
  33. ASSERT(pcwszData);
  34. HRESULT hr = E_OUTOFMEMORY;
  35. int nTagLength = lstrlenW(pcwszTag);
  36. int nDataLength = lstrlenW(pcwszData);
  37. // +1 for tag sep, +1 for rost info sep
  38. PWSTR pwszNewItem = new WCHAR[nTagLength + 1 + nDataLength + 1];
  39. if (NULL != pwszNewItem)
  40. {
  41. ::CopyMemory( (PVOID) pwszNewItem,
  42. pcwszTag,
  43. sizeof(WCHAR) * nTagLength);
  44. pwszNewItem[nTagLength] = g_cwchRostInfoTagSeparator;
  45. ::CopyMemory( (PVOID) &(pwszNewItem[nTagLength + 1]),
  46. pcwszData,
  47. sizeof(WCHAR) * nDataLength);
  48. pwszNewItem[nTagLength + 1 + nDataLength] = g_cwchRostInfoSeparator;
  49. m_ItemList.AddTail(pwszNewItem);
  50. hr = S_OK;
  51. }
  52. DebugExitHRESULT(CRosterInfo::AddItem, hr);
  53. return hr;
  54. }
  55. HRESULT CRosterInfo::ExtractItem( PHROSTINFO phRostInfo,
  56. PCWSTR pcwszTag,
  57. LPTSTR pszBuffer,
  58. UINT cbLength)
  59. {
  60. DebugEntry(CRosterInfo::ExtractItem);
  61. ASSERT(pcwszTag);
  62. HRESULT hr = E_FAIL;
  63. POSITION pos;
  64. if ((NULL == phRostInfo) ||
  65. (NULL == *phRostInfo))
  66. {
  67. pos = m_ItemList.GetHeadPosition();
  68. }
  69. else
  70. {
  71. pos = *phRostInfo;
  72. }
  73. if (g_cshriEOList != pos)
  74. {
  75. while (NULL != pos)
  76. {
  77. PWSTR pwszItem = (PWSTR) m_ItemList.GetNext(pos);
  78. if (NULL != phRostInfo)
  79. {
  80. *phRostInfo = (NULL != pos) ? pos : g_cshriEOList;
  81. }
  82. ASSERT(pwszItem);
  83. int nItemLength = lstrlenW(pwszItem);
  84. int nTagLength = lstrlenW(pcwszTag);
  85. // NOTE: CRT is used for memcmp
  86. if ((nItemLength > nTagLength) &&
  87. (0 == memcmp( pcwszTag,
  88. pwszItem,
  89. sizeof(WCHAR) * nTagLength)) &&
  90. (g_cwchRostInfoTagSeparator == pwszItem[nTagLength]))
  91. {
  92. // This is a match
  93. PWSTR pwszItemData = &(pwszItem[nTagLength + 1]);
  94. CUSTRING custrItemData(pwszItemData);
  95. LPTSTR pszItemData = custrItemData;
  96. if (NULL != pszBuffer)
  97. {
  98. lstrcpyn(pszBuffer, pszItemData, cbLength);
  99. }
  100. hr = S_OK;
  101. break;
  102. }
  103. }
  104. }
  105. DebugExitHRESULT(CRosterInfo::ExtractItem, hr);
  106. return hr;
  107. }
  108. HRESULT CRosterInfo::Load(PVOID pData)
  109. {
  110. DebugEntry(CRosterInfo::Load);
  111. HRESULT hr = E_FAIL;
  112. PWSTR pwszUserInfo = (PWSTR) pData;
  113. if (NULL != pwszUserInfo)
  114. {
  115. hr = S_OK;
  116. while (L'\0' != pwszUserInfo[0])
  117. {
  118. // this includes the null terminator
  119. int nItemLenNT = lstrlenW(pwszUserInfo) + 1;
  120. PWSTR pwszNewItem = new WCHAR[nItemLenNT];
  121. if (NULL != pwszNewItem)
  122. {
  123. ::CopyMemory( pwszNewItem,
  124. pwszUserInfo,
  125. sizeof(WCHAR) * nItemLenNT);
  126. m_ItemList.AddTail(pwszNewItem);
  127. // Skip past this item and the n.t.
  128. pwszUserInfo += nItemLenNT;
  129. }
  130. else
  131. {
  132. hr = E_OUTOFMEMORY;
  133. break;
  134. }
  135. }
  136. }
  137. else
  138. {
  139. TRACE_OUT(("CRosterInfo::Load() called with NULL pData"));
  140. }
  141. DebugExitHRESULT(CRosterInfo::Load, hr);
  142. return hr;
  143. }
  144. UINT CRosterInfo::GetSize()
  145. {
  146. UINT uSize = sizeof(WCHAR); // for last separator
  147. POSITION pos = m_ItemList.GetHeadPosition();
  148. while (NULL != pos)
  149. {
  150. PWSTR pwszItem = (PWSTR) m_ItemList.GetNext(pos);
  151. ASSERT(pwszItem);
  152. uSize += sizeof(WCHAR) * (lstrlenW(pwszItem) + 1);
  153. }
  154. return uSize;
  155. }
  156. HRESULT CRosterInfo::Save(PVOID* ppvData, PUINT pcbLength)
  157. {
  158. DebugEntry(CRosterInfo::Save);
  159. ASSERT(ppvData);
  160. ASSERT(pcbLength);
  161. HRESULT hr = E_FAIL;
  162. *pcbLength = GetSize();
  163. delete m_pvSaveData;
  164. m_pvSaveData = new BYTE[*pcbLength];
  165. if (NULL != m_pvSaveData)
  166. {
  167. PWSTR pwszDest = (PWSTR) m_pvSaveData;
  168. POSITION pos = m_ItemList.GetHeadPosition();
  169. while (NULL != pos)
  170. {
  171. PWSTR pwszItem = (PWSTR) m_ItemList.GetNext(pos);
  172. ASSERT(pwszItem);
  173. ::CopyMemory( pwszDest,
  174. pwszItem,
  175. sizeof(WCHAR) * (lstrlenW(pwszItem) + 1));
  176. pwszDest += (lstrlenW(pwszItem) + 1);
  177. }
  178. int nLastSepPos = (*pcbLength / sizeof(WCHAR)) - 1;
  179. ((PWSTR)m_pvSaveData)[nLastSepPos] = g_cwchRostInfoSeparator;
  180. *ppvData = m_pvSaveData;
  181. hr = S_OK;
  182. }
  183. DebugExitHRESULT(CRosterInfo::Save, hr);
  184. return hr;
  185. }
  186. #ifdef DEBUG
  187. VOID CRosterInfo::Dump()
  188. {
  189. POSITION pos = m_ItemList.GetHeadPosition();
  190. while (NULL != pos)
  191. {
  192. PWSTR pwszItem = (PWSTR) m_ItemList.GetNext(pos);
  193. ASSERT(pwszItem);
  194. TRACE_OUT(("\t%ls", pwszItem));
  195. }
  196. }
  197. #endif // DEBUG
  198.