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.

253 lines
6.4 KiB

  1. //+-------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. //
  5. // Copyright (C) Microsoft Corporation, 1997 - 1999
  6. //
  7. // File: convutil.cpp
  8. //
  9. //--------------------------------------------------------------------------
  10. #include "global.hxx"
  11. #include <dbgdef.h>
  12. extern HINSTANCE HinstDll;
  13. //////////////////////////////////////////////////////////////////////////////////////
  14. //
  15. //////////////////////////////////////////////////////////////////////////////////////
  16. LPSTR CertUIMkMBStr(LPCWSTR pwsz)
  17. {
  18. int cb;
  19. LPSTR psz;
  20. if (pwsz == NULL)
  21. {
  22. return NULL;
  23. }
  24. cb = WideCharToMultiByte(
  25. 0,
  26. 0,
  27. pwsz,
  28. -1,
  29. NULL,
  30. 0,
  31. NULL,
  32. NULL);
  33. if (NULL == (psz = (LPSTR) malloc(cb)))
  34. {
  35. SetLastError(E_OUTOFMEMORY);
  36. return NULL;
  37. }
  38. WideCharToMultiByte(
  39. 0,
  40. 0,
  41. pwsz,
  42. -1,
  43. psz,
  44. cb,
  45. NULL,
  46. NULL);
  47. return(psz);
  48. }
  49. //////////////////////////////////////////////////////////////////////////////////////
  50. //
  51. //////////////////////////////////////////////////////////////////////////////////////
  52. LPWSTR CertUIMkWStr(LPCSTR psz)
  53. {
  54. int cWChars;
  55. LPWSTR pwsz;
  56. if (psz == NULL)
  57. {
  58. return NULL;
  59. }
  60. cWChars = MultiByteToWideChar(
  61. 0,
  62. 0,
  63. psz,
  64. -1,
  65. NULL,
  66. 0);
  67. if (NULL == (pwsz = (LPWSTR) malloc(cWChars * sizeof(WCHAR))))
  68. {
  69. SetLastError(E_OUTOFMEMORY);
  70. return NULL;
  71. }
  72. MultiByteToWideChar(
  73. 0,
  74. 0,
  75. psz,
  76. -1,
  77. pwsz,
  78. cWChars);
  79. return(pwsz);
  80. }
  81. //////////////////////////////////////////////////////////////////////////////////////
  82. //
  83. //////////////////////////////////////////////////////////////////////////////////////
  84. LPSTR AllocAndCopyMBStr(LPCSTR psz)
  85. {
  86. LPSTR pszReturn;
  87. if (NULL == (pszReturn = (LPSTR) malloc(strlen(psz)+1)))
  88. {
  89. SetLastError(E_OUTOFMEMORY);
  90. return NULL;
  91. }
  92. strcpy(pszReturn, psz);
  93. return(pszReturn);
  94. }
  95. //////////////////////////////////////////////////////////////////////////////////////
  96. //
  97. //////////////////////////////////////////////////////////////////////////////////////
  98. LPWSTR AllocAndCopyWStr(LPCWSTR pwsz)
  99. {
  100. LPWSTR pwszReturn;
  101. if (NULL == (pwszReturn = (LPWSTR) malloc((wcslen(pwsz)+1) * sizeof(WCHAR))))
  102. {
  103. SetLastError(E_OUTOFMEMORY);
  104. return NULL;
  105. }
  106. wcscpy(pwszReturn, pwsz);
  107. return(pwszReturn);
  108. }
  109. //////////////////////////////////////////////////////////////////////////////////////
  110. //
  111. //////////////////////////////////////////////////////////////////////////////////////
  112. LPPROPSHEETPAGEA ConvertToPropPageA(LPCPROPSHEETPAGEW ppage, DWORD cPages)
  113. {
  114. PROPSHEETPAGEA *ppageA;
  115. DWORD i;
  116. DWORD dwSize;
  117. if (NULL == (ppageA = (PROPSHEETPAGEA *) malloc(sizeof(PROPSHEETPAGEA) * cPages)))
  118. {
  119. SetLastError(E_OUTOFMEMORY);
  120. return NULL;
  121. };
  122. // DSIE: Bug 590638.
  123. memset(ppageA, 0, sizeof(PROPSHEETPAGEA) * cPages);
  124. dwSize = sizeof(PROPSHEETPAGEA) < ppage->dwSize ? sizeof(PROPSHEETPAGEA) : ppage->dwSize;
  125. for (i = 0; i < cPages; i++)
  126. {
  127. memcpy(&ppageA[i], ppage, dwSize);
  128. ppageA[i].dwSize = sizeof(PROPSHEETPAGEA);
  129. // In the future we may need to handle the pszTemplate and pszIcon fields
  130. if (ppage->pszTitle != NULL)
  131. {
  132. ppageA[i].pszTitle = CertUIMkMBStr(ppage->pszTitle);
  133. }
  134. ppage = (LPCPROPSHEETPAGEW) (((LPBYTE) ppage) + ppage->dwSize);
  135. }
  136. return(ppageA);
  137. }
  138. //////////////////////////////////////////////////////////////////////////////////////
  139. //
  140. //////////////////////////////////////////////////////////////////////////////////////
  141. void FreePropSheetPagesA(LPPROPSHEETPAGEA ppage, DWORD cPages)
  142. {
  143. DWORD i;
  144. for (i=0; i<cPages; i++)
  145. {
  146. // In the future we may need to handle the pszTemplate and pszIcon fields
  147. if (ppage[i].pszTitle != NULL)
  148. {
  149. free((void *)ppage[i].pszTitle);
  150. }
  151. }
  152. free(ppage);
  153. }
  154. //////////////////////////////////////////////////////////////////////////////////////
  155. //
  156. //////////////////////////////////////////////////////////////////////////////////////
  157. BOOL ConvertToPropPageW(LPCPROPSHEETPAGEA ppage, DWORD cPages, LPCPROPSHEETPAGEW *pppageW)
  158. {
  159. PROPSHEETPAGEW * ppageW;
  160. DWORD i;
  161. DWORD dwSize;
  162. if (cPages == 0)
  163. {
  164. *pppageW = NULL;
  165. return TRUE;
  166. }
  167. if (NULL == (ppageW = (PROPSHEETPAGEW *) malloc(sizeof(PROPSHEETPAGEW) * cPages)))
  168. {
  169. SetLastError(E_OUTOFMEMORY);
  170. return FALSE;
  171. }
  172. // DSIE: Bug 590638.
  173. memset(ppageW, 0, sizeof(PROPSHEETPAGEW) * cPages);
  174. dwSize = sizeof(PROPSHEETPAGEW) < ppage->dwSize ? sizeof(PROPSHEETPAGEW) : ppage->dwSize;
  175. for (i = 0; i < cPages; i++)
  176. {
  177. memcpy(&ppageW[i], ppage, dwSize);
  178. ppageW[i].dwSize = sizeof(PROPSHEETPAGEW);
  179. // In the future we may need to handle the pszTemplate and pszIcon fields
  180. if (ppage->pszTitle != NULL)
  181. {
  182. ppageW[i].pszTitle = CertUIMkWStr(ppage->pszTitle);
  183. }
  184. ppage = (LPCPROPSHEETPAGEA) (((LPBYTE) ppage) + ppage->dwSize);
  185. }
  186. *pppageW = ppageW;
  187. return TRUE;
  188. }
  189. //////////////////////////////////////////////////////////////////////////////////////
  190. //
  191. //////////////////////////////////////////////////////////////////////////////////////
  192. void FreePropSheetPagesW(LPPROPSHEETPAGEW ppage, DWORD cPages)
  193. {
  194. DWORD i;
  195. for (i=0; i<cPages; i++)
  196. {
  197. // In the future we may need to handle the pszTemplate and pszIcon fields
  198. if (ppage[i].pszTitle != NULL)
  199. {
  200. free((void *)ppage[i].pszTitle);
  201. }
  202. }
  203. free(ppage);
  204. }