Source code of Windows XP (NT5)
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.

261 lines
6.2 KiB

  1. #include "precomp.h"
  2. // CP: DCL's header redefines this:
  3. #ifdef CLEAR_FLAG
  4. #undef CLEAR_FLAG
  5. #endif // CLEAR_FLAG
  6. #include <cuserdta.hpp>
  7. #include <inodecnt.h>
  8. static const BYTE H221IDGUID[5] =
  9. {
  10. H221GUIDKEY0,
  11. H221GUIDKEY1,
  12. H221GUIDKEY2,
  13. H221GUIDKEY3,
  14. H221GUIDKEY4
  15. };
  16. CNCUserDataList::
  17. CNCUserDataList(void)
  18. :
  19. CList(),
  20. m_apUserData(NULL)
  21. {
  22. }
  23. CNCUserDataList::
  24. ~CNCUserDataList(void)
  25. {
  26. delete[] m_apUserData;
  27. GCCUserData *pUserData;
  28. Reset();
  29. while (NULL != (pUserData = Iterate()))
  30. {
  31. delete pUserData->octet_string->value;
  32. delete pUserData->octet_string;
  33. delete pUserData;
  34. }
  35. }
  36. HRESULT CNCUserDataList::
  37. AddUserData
  38. (
  39. GUID *pGUID,
  40. UINT nData,
  41. LPVOID pData
  42. )
  43. {
  44. ASSERT(pGUID);
  45. ASSERT(!nData || pData);
  46. LPBYTE pWork;
  47. UINT nDataPlusHeader = nData+sizeof(GUID);
  48. GCCUserData * pUserData;
  49. LPOSTR pOctetString;
  50. // If there is already an entry in the list
  51. // for the GUID, then delete it.
  52. DeleteEntry(pGUID);
  53. // Make sure the size is reasonable
  54. if (nDataPlusHeader <= 0xffff)
  55. {
  56. // Now go and add the new entry to the list.
  57. DBG_SAVE_FILE_LINE
  58. if (NULL != (pUserData = new GCCUserData))
  59. {
  60. DBG_SAVE_FILE_LINE
  61. if (NULL != (pOctetString = new OSTR))
  62. {
  63. DBG_SAVE_FILE_LINE
  64. if (NULL != (pWork = new unsigned char[nDataPlusHeader]))
  65. {
  66. pUserData->octet_string = pOctetString;
  67. pUserData->key.key_type = GCC_H221_NONSTANDARD_KEY;
  68. pUserData->key.h221_non_standard_id.length = sizeof(H221IDGUID);
  69. pUserData->key.h221_non_standard_id.value = (LPBYTE) &H221IDGUID[0];
  70. pOctetString->value = pWork;
  71. pOctetString->length = nDataPlusHeader;
  72. *(GUID *)pWork = *pGUID;
  73. pWork += sizeof(GUID);
  74. ::CopyMemory(pWork, pData, nData);
  75. Append(pUserData);
  76. return NO_ERROR;
  77. }
  78. delete pOctetString;
  79. }
  80. delete pUserData;
  81. }
  82. }
  83. return UI_RC_OUT_OF_MEMORY;
  84. }
  85. void CNCUserDataList::
  86. DeleteEntry ( GUID * pGUID )
  87. {
  88. GCCUserData *pUserData;
  89. Reset();
  90. while (NULL != (pUserData = Iterate()))
  91. {
  92. if (0 == ::memcmp(pUserData->octet_string->value, pGUID, sizeof(GUID)))
  93. {
  94. Remove(pUserData);
  95. delete pUserData->octet_string->value;
  96. delete pUserData->octet_string;
  97. delete pUserData;
  98. return;
  99. }
  100. }
  101. }
  102. GCCUserData * CNCUserDataList::
  103. GetUserGUIDData (GUID * pGUID)
  104. {
  105. GCCUserData *pUserData;
  106. Reset();
  107. while (NULL != (pUserData = Iterate()))
  108. {
  109. if (0 == ::memcmp(pUserData->octet_string->value, pGUID, sizeof(GUID)))
  110. {
  111. return pUserData;
  112. }
  113. }
  114. return NULL;
  115. }
  116. HRESULT CNCUserDataList::
  117. GetUserDataList
  118. (
  119. UINT *pnRecords,
  120. GCCUserData ***papUserData
  121. )
  122. {
  123. GCCUserData ** pUserDataArrayTemp;
  124. HRESULT hr = NO_ERROR;
  125. delete[] m_apUserData;
  126. m_apUserData = NULL;
  127. if (! IsEmpty())
  128. {
  129. // Allocate memory.
  130. DBG_SAVE_FILE_LINE
  131. if (NULL != (m_apUserData = new GCCUserData * [GetCount()]))
  132. {
  133. // Fill in array.
  134. GCCUserData *pUserData;
  135. pUserDataArrayTemp = m_apUserData;
  136. Reset();
  137. while (NULL != (pUserData = Iterate()))
  138. {
  139. *(pUserDataArrayTemp++) = pUserData;
  140. }
  141. }
  142. else
  143. {
  144. hr = UI_RC_OUT_OF_MEMORY;
  145. }
  146. }
  147. *pnRecords = GetCount();
  148. *papUserData = m_apUserData;
  149. return hr;
  150. }
  151. HRESULT
  152. GetUserData
  153. (
  154. UINT nRecords,
  155. GCCUserData ** ppUserData,
  156. GUID * pGUID,
  157. UINT * pnData,
  158. LPVOID * ppData
  159. )
  160. {
  161. LPBYTE pData;
  162. UINT nLength;
  163. while (nRecords--)
  164. {
  165. // Check that the H.221 OID is for GUIDS.
  166. if (((*ppUserData)->key.key_type == GCC_H221_NONSTANDARD_KEY) &&
  167. ((*ppUserData)->key.h221_non_standard_id.length == sizeof(H221IDGUID)) &&
  168. (memcmp((*ppUserData)->key.h221_non_standard_id.value,
  169. H221IDGUID,
  170. sizeof(H221IDGUID)) == 0) ||
  171. ((*ppUserData)->key.key_type == GCC_OBJECT_KEY) &&
  172. ((*ppUserData)->key.object_id.long_string_length == 3) &&
  173. ((*ppUserData)->key.object_id.long_string[0] == 2) &&
  174. ((*ppUserData)->key.object_id.long_string[1] == 5) &&
  175. ((*ppUserData)->key.object_id.long_string[2] == 8))
  176. {
  177. nLength = (*ppUserData)->octet_string->length;
  178. pData = (*ppUserData)->octet_string->value;
  179. if (nLength >= sizeof(GUID))
  180. {
  181. if (*(GUID *)pData == *pGUID)
  182. {
  183. nLength -= sizeof(GUID);
  184. if (nLength)
  185. {
  186. pData += sizeof(GUID);
  187. }
  188. else
  189. {
  190. pData = NULL;
  191. }
  192. if (pnData)
  193. {
  194. *pnData = nLength;
  195. }
  196. if (ppData)
  197. {
  198. *ppData = (PVOID)pData;
  199. }
  200. return NO_ERROR;
  201. }
  202. }
  203. }
  204. ppUserData++;
  205. }
  206. return UI_RC_NO_SUCH_USER_DATA;
  207. }
  208. // Create an H.221 application key with a guid
  209. VOID CreateH221AppKeyFromGuid(LPBYTE lpb, GUID * pguid)
  210. {
  211. CopyMemory(lpb, H221IDGUID, sizeof(H221IDGUID));
  212. CopyMemory(lpb + sizeof(H221IDGUID), pguid, sizeof(GUID));
  213. }
  214. // Return TRUE if the guid string was extracted from the key
  215. BOOL GetGuidFromH221AppKey(LPTSTR pszGuid, LPOSTR pOctStr)
  216. {
  217. ASSERT(NULL != pszGuid);
  218. ASSERT(NULL != pOctStr);
  219. if (pOctStr->length < (sizeof(H221IDGUID) + sizeof(GUID)) )
  220. return FALSE;
  221. if (memcmp(pOctStr->value, H221IDGUID, sizeof(H221IDGUID)) != 0)
  222. return FALSE;
  223. GuidToSz((GUID *) (((LPBYTE) pOctStr->value)+ sizeof(H221IDGUID)), pszGuid);
  224. return TRUE;
  225. }