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.

589 lines
12 KiB

  1. //******************************************************************************
  2. //
  3. // Microsoft Confidential. Copyright (c) Microsoft Corporation 1999. All rights reserved
  4. //
  5. // File: RsopUtil.cpp
  6. //
  7. // Description:
  8. //
  9. // History: 8-20-99 leonardm Created
  10. //
  11. //******************************************************************************
  12. #include <windows.h>
  13. #include "RsopUtil.h"
  14. #include <strsafe.h>
  15. //******************************************************************************
  16. //
  17. // Function:
  18. //
  19. // Description:
  20. //
  21. // Parameters:
  22. //
  23. // Return:
  24. //
  25. // History: 8/20/99 leonardm Created.
  26. //
  27. //******************************************************************************
  28. CWString::CWString() : _pW(NULL), _len(0), _bState(false)
  29. {
  30. _pW = new WCHAR[_len+1];
  31. if(_pW)
  32. {
  33. HRESULT hr = StringCchCopy(_pW, _len + 1, L"");
  34. if(FAILED(hr))
  35. {
  36. Reset();
  37. return;
  38. }
  39. _bState = true;
  40. }
  41. }
  42. //******************************************************************************
  43. //
  44. // Function:
  45. //
  46. // Description:
  47. //
  48. // Parameters:
  49. //
  50. // Return:
  51. //
  52. // History: 8/20/99 leonardm Created.
  53. //
  54. //******************************************************************************
  55. CWString::CWString(const CWString& s) : _pW(NULL), _len(0), _bState(false)
  56. {
  57. if(!s.ValidString())
  58. {
  59. return;
  60. }
  61. _len = s._len;
  62. _pW = new WCHAR[_len+1];
  63. if(_pW)
  64. {
  65. HRESULT hr = StringCchCopy(_pW, _len + 1, s._pW);
  66. if(FAILED(hr))
  67. {
  68. Reset();
  69. return;
  70. }
  71. _bState = true;
  72. }
  73. }
  74. //******************************************************************************
  75. //
  76. // Function:
  77. //
  78. // Description:
  79. //
  80. // Parameters:
  81. //
  82. // Return:
  83. //
  84. // History: 8/20/99 leonardm Created.
  85. //
  86. //******************************************************************************
  87. CWString::CWString(const WCHAR* s) : _pW(NULL), _len(0), _bState(false)
  88. {
  89. if(s)
  90. {
  91. _len = wcslen(s);
  92. }
  93. _pW = new WCHAR[_len + 1];
  94. if(_pW)
  95. {
  96. HRESULT hr = StringCchCopy(_pW, _len + 1, s ? s : L"");
  97. if(FAILED(hr))
  98. {
  99. Reset();
  100. return;
  101. }
  102. _bState = true;
  103. }
  104. }
  105. //******************************************************************************
  106. //
  107. // Function:
  108. //
  109. // Description:
  110. //
  111. // Parameters:
  112. //
  113. // Return:
  114. //
  115. // History: 8/20/99 leonardm Created.
  116. //
  117. //******************************************************************************
  118. CWString::~CWString()
  119. {
  120. Reset();
  121. }
  122. //******************************************************************************
  123. //
  124. // Function:
  125. //
  126. // Description:
  127. //
  128. // Parameters:
  129. //
  130. // Return:
  131. //
  132. // History: 8/20/99 leonardm Created.
  133. //
  134. //******************************************************************************
  135. CWString& CWString::operator = (const CWString& s)
  136. {
  137. if(&s == this)
  138. {
  139. return *this;
  140. }
  141. Reset();
  142. if(s.ValidString())
  143. {
  144. _len = s._len;
  145. _pW = new WCHAR[_len+1];
  146. if(_pW)
  147. {
  148. HRESULT hr = StringCchCopy(_pW, _len + 1, s._pW);
  149. if(FAILED(hr))
  150. {
  151. Reset();
  152. return *this;
  153. }
  154. _bState = true;
  155. }
  156. }
  157. return *this;
  158. }
  159. //******************************************************************************
  160. //
  161. // Function:
  162. //
  163. // Description:
  164. //
  165. // Parameters:
  166. //
  167. // Return:
  168. //
  169. // History: 8/20/99 leonardm Created.
  170. //
  171. //******************************************************************************
  172. CWString& CWString::operator = (const WCHAR* s)
  173. {
  174. Reset();
  175. _len = s ? wcslen(s) : 0;
  176. _pW = new WCHAR[_len + 1];
  177. if(_pW)
  178. {
  179. HRESULT hr = StringCchCopy(_pW, _len + 1, s ? s : L"");
  180. if(FAILED(hr))
  181. {
  182. Reset();
  183. return *this;
  184. }
  185. _bState = true;
  186. }
  187. return *this;
  188. }
  189. //******************************************************************************
  190. //
  191. // Function:
  192. //
  193. // Description:
  194. //
  195. // Parameters:
  196. //
  197. // Return:
  198. //
  199. // History: 8/20/99 leonardm Created.
  200. //
  201. //******************************************************************************
  202. void CWString::Reset()
  203. {
  204. if (_pW)
  205. delete[] _pW;
  206. _pW = NULL;
  207. _len =0;
  208. _bState = false;
  209. }
  210. //******************************************************************************
  211. //
  212. // Function:
  213. //
  214. // Description:
  215. //
  216. // Parameters:
  217. //
  218. // Return:
  219. //
  220. // History: 8/20/99 leonardm Created.
  221. //
  222. //******************************************************************************
  223. CWString& CWString::operator += (const CWString& s)
  224. {
  225. if(!s.ValidString())
  226. {
  227. Reset();
  228. return *this;
  229. }
  230. int newLen = _len + s._len;
  231. WCHAR* pW = new WCHAR[newLen+1];
  232. if(!pW)
  233. {
  234. Reset();
  235. return *this;
  236. }
  237. HRESULT hr = StringCchCopy(pW, newLen + 1, _pW);
  238. if(SUCCEEDED(hr))
  239. hr = StringCchCat(pW, newLen + 1, s._pW);
  240. if(FAILED(hr))
  241. {
  242. delete [] pW;
  243. Reset();
  244. return *this;
  245. }
  246. *this = pW;
  247. delete[] pW;
  248. return *this;
  249. }
  250. //******************************************************************************
  251. //
  252. // Function:
  253. //
  254. // Description:
  255. //
  256. // Parameters:
  257. //
  258. // Return:
  259. //
  260. // History: 8/20/99 leonardm Created.
  261. //
  262. //******************************************************************************
  263. CWString CWString::operator + (const CWString& s) const
  264. {
  265. if(!s.ValidString())
  266. {
  267. return *this;
  268. }
  269. CWString tmp;
  270. tmp.Reset();
  271. tmp._len = _len + s._len;
  272. tmp._pW = new WCHAR[tmp._len+1];
  273. if(!tmp._pW)
  274. {
  275. tmp.Reset();
  276. return tmp;
  277. }
  278. HRESULT hr = StringCchCopy(tmp._pW, tmp._len + 1, _pW);
  279. if(SUCCEEDED(hr))
  280. hr = StringCchCat(tmp._pW, tmp._len + 1, s._pW);
  281. if(FAILED(hr))
  282. {
  283. tmp.Reset();
  284. return tmp;
  285. }
  286. tmp._bState = true;
  287. return tmp;
  288. }
  289. //******************************************************************************
  290. //
  291. // Function:
  292. //
  293. // Description:
  294. //
  295. // Parameters:
  296. //
  297. // Return:
  298. //
  299. // History: 8/20/99 leonardm Created.
  300. //
  301. //******************************************************************************
  302. CWString operator + (const WCHAR* s1, const CWString& s2)
  303. {
  304. CWString tmp;
  305. if(!s1 || !s2.ValidString())
  306. {
  307. return tmp;
  308. }
  309. tmp.Reset();
  310. tmp._len = wcslen(s1) + s2._len;
  311. tmp._pW = new WCHAR[tmp._len+1];
  312. if(!tmp._pW)
  313. {
  314. tmp.Reset();
  315. return tmp;
  316. }
  317. HRESULT hr = StringCchCopy(tmp._pW, tmp._len + 1, s1);
  318. if(SUCCEEDED(hr))
  319. hr = StringCchCat(tmp._pW, tmp._len + 1, s2._pW);
  320. if(FAILED(hr))
  321. {
  322. tmp.Reset();
  323. return tmp;
  324. }
  325. tmp._bState = true;
  326. return tmp;
  327. }
  328. //******************************************************************************
  329. //
  330. // Function:
  331. //
  332. // Description:
  333. //
  334. // Parameters:
  335. //
  336. // Return:
  337. //
  338. // History: 8/20/99 leonardm Created.
  339. //
  340. //******************************************************************************
  341. CWString::operator const WCHAR* () const
  342. {
  343. return _pW;
  344. }
  345. //******************************************************************************
  346. //
  347. // Function:
  348. //
  349. // Description:
  350. //
  351. // Parameters:
  352. //
  353. // Return:
  354. //
  355. // History: 8/20/99 leonardm Created.
  356. //
  357. //******************************************************************************
  358. CWString::operator WCHAR* () const
  359. {
  360. return _pW;
  361. }
  362. //******************************************************************************
  363. //
  364. // Function:
  365. //
  366. // Description:
  367. //
  368. // Parameters:
  369. //
  370. // Return:
  371. //
  372. // History: 8/20/99 leonardm Created.
  373. //
  374. //******************************************************************************
  375. bool CWString::operator == (const WCHAR* s) const
  376. {
  377. CWString tmp = s;
  378. return (*this == tmp);
  379. }
  380. //******************************************************************************
  381. //
  382. // Function:
  383. //
  384. // Description:
  385. //
  386. // Parameters:
  387. //
  388. // Return:
  389. //
  390. // History: 8/20/99 leonardm Created.
  391. //
  392. //******************************************************************************
  393. bool CWString::operator == (const CWString& s) const
  394. {
  395. if(!ValidString() || !s.ValidString())
  396. {
  397. return false;
  398. }
  399. if(&s == this)
  400. {
  401. return true;
  402. }
  403. if(_len != s._len || _bState != s._bState)
  404. {
  405. return false;
  406. }
  407. if(_wcsicmp(s._pW, _pW) != 0)
  408. {
  409. return false;
  410. }
  411. return true;
  412. }
  413. //******************************************************************************
  414. //
  415. // Function:
  416. //
  417. // Description:
  418. //
  419. // Parameters:
  420. //
  421. // Return:
  422. //
  423. // History: 8/20/99 leonardm Created.
  424. //
  425. //******************************************************************************
  426. bool CWString::CaseSensitiveCompare(const CWString& s) const
  427. {
  428. if(!ValidString() || !s.ValidString())
  429. {
  430. return false;
  431. }
  432. if(&s == this)
  433. {
  434. return true;
  435. }
  436. if(_len != s._len || _bState != s._bState)
  437. {
  438. return false;
  439. }
  440. if(wcscmp(s._pW, _pW) != 0)
  441. {
  442. return false;
  443. }
  444. return true;
  445. }
  446. //******************************************************************************
  447. //
  448. // Function:
  449. //
  450. // Description:
  451. //
  452. // Parameters:
  453. //
  454. // Return:
  455. //
  456. // History: 8/20/99 leonardm Created.
  457. //
  458. //******************************************************************************
  459. bool CWString::operator != (const CWString& s) const
  460. {
  461. return !(*this == s);
  462. }
  463. //******************************************************************************
  464. //
  465. // Function:
  466. //
  467. // Description:
  468. //
  469. // Parameters:
  470. //
  471. // Return:
  472. //
  473. // History: 8/20/99 leonardm Created.
  474. //
  475. //******************************************************************************
  476. bool CWString::operator != (const WCHAR* s) const
  477. {
  478. CWString tmp = s;
  479. return !(*this == tmp);
  480. }
  481. //******************************************************************************
  482. //
  483. // Function:
  484. //
  485. // Description:
  486. //
  487. // Parameters:
  488. //
  489. // Return:
  490. //
  491. // History: 8/20/99 leonardm Created.
  492. //
  493. //******************************************************************************
  494. int CWString::length() const
  495. {
  496. return _len;
  497. }
  498. //******************************************************************************
  499. //
  500. // Function:
  501. //
  502. // Description:
  503. //
  504. // Parameters:
  505. //
  506. // Return:
  507. //
  508. // History: 8/20/99 leonardm Created.
  509. //
  510. //******************************************************************************
  511. bool CWString::ValidString() const
  512. {
  513. return _bState;
  514. }