winreg.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:18k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: winreg.cpp,v 1.3.36.3 2004/07/09 01:47:42 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #include "hxcom.h"
  50. #include "hxresult.h"
  51. #include "hxstring.h"
  52. #include "hxwinreg.h"
  53. #include "hxheap.h"
  54. #ifdef _DEBUG
  55. #undef HX_THIS_FILE
  56. static const char HX_THIS_FILE[] = __FILE__;
  57. #endif
  58. _CListOfCHXString_Node::_CListOfCHXString_Node()
  59.   : m_plocPrev(NULL)
  60.   , m_plocNext(NULL)
  61. {
  62. }
  63. _CListOfCHXString_Node::~_CListOfCHXString_Node()
  64. {
  65.     Remove();
  66. }
  67. void
  68. _CListOfCHXString_Node::Remove()
  69. {
  70.     if(m_plocPrev)
  71.     {
  72. m_plocPrev->next(m_plocNext);
  73.     }
  74.     if(m_plocNext)
  75.     {
  76. m_plocNext->prev(m_plocPrev);
  77.     }
  78. }
  79. void
  80. _CListOfCHXString_Node::Insert(_CListOfCHXString_Node& rlocnNew)
  81. {
  82.     rlocnNew.next(this);
  83.     rlocnNew.prev(m_plocPrev);
  84.     if(m_plocPrev)
  85.     {
  86. m_plocPrev->next(&rlocnNew);
  87.     }
  88.     m_plocPrev = &rlocnNew;
  89. }
  90. CHXString&
  91. _CListOfCHXString_Node::value()
  92. {
  93.     return m_clsValue;
  94. }
  95. const CHXString&
  96. _CListOfCHXString_Node::value() const
  97. {
  98.     return m_clsValue;
  99. }
  100. void
  101. _CListOfCHXString_Node::value(const CHXString& rclsNewValue)
  102. {
  103.     m_clsValue = rclsNewValue;
  104. }
  105. _CListOfCHXString_Node&
  106. _CListOfCHXString_Node::operator=(const CHXString& rclsNewValue)
  107. {
  108.     m_clsValue = rclsNewValue;
  109.     return *this;
  110. }
  111. _CListOfCHXString_Node*
  112. _CListOfCHXString_Node::next() const
  113. {
  114.     return m_plocNext;
  115. }
  116. void
  117. _CListOfCHXString_Node::next(_CListOfCHXString_Node* plocnNew)
  118. {
  119.     m_plocNext = plocnNew;
  120. }
  121. _CListOfCHXString_Node*
  122. _CListOfCHXString_Node::prev() const
  123. {
  124.     return m_plocPrev;
  125. }
  126. void
  127. _CListOfCHXString_Node::prev(_CListOfCHXString_Node* plocnNew)
  128. {
  129.     m_plocPrev = plocnNew;
  130. }
  131. _CListOfCHXString_::_CListOfCHXString_()
  132. {
  133.     m_locnREnd.next(&m_locnEnd);
  134.     m_locnEnd.prev(&m_locnREnd);
  135. }
  136. _CListOfCHXString_::_CListOfCHXString_(const _CListOfCHXString_& rlocOther)
  137. {
  138.     m_locnREnd.next(&m_locnEnd);
  139.     m_locnEnd.prev(&m_locnREnd);
  140.     _copy(rlocOther);
  141. }
  142. _CListOfCHXString_::~_CListOfCHXString_()
  143. {
  144.     empty();
  145. }
  146. _CListOfCHXString_&
  147. _CListOfCHXString_::operator=(const _CListOfCHXString_& rlocOther)
  148. {
  149.     empty();
  150.     _copy(rlocOther);
  151.     return *this;
  152. }
  153. void
  154. _CListOfCHXString_::_copy(const _CListOfCHXString_& rlocOther)
  155. {
  156.     iterator itOther;
  157.     for
  158.     (
  159. itOther = rlocOther.begin();
  160. itOther != rlocOther.end();
  161. ++itOther
  162.     )
  163.     {
  164. insert(end(), *itOther);
  165.     }
  166. }
  167. _CListOfCHXString_::iterator
  168. _CListOfCHXString_::begin()
  169. {
  170.     return iterator(*(m_locnREnd.next()));
  171. }
  172. const _CListOfCHXString_::iterator
  173. _CListOfCHXString_::begin() const
  174. {
  175.     return iterator(*(m_locnREnd.next()));
  176. }
  177. _CListOfCHXString_::iterator
  178. _CListOfCHXString_::end()
  179. {
  180.     return iterator(m_locnEnd);
  181. }
  182. const _CListOfCHXString_::iterator
  183. _CListOfCHXString_::end() const
  184. {
  185.     return iterator(m_locnEnd);
  186. }
  187. _CListOfCHXString_::reverse_iterator
  188. _CListOfCHXString_::rbegin()
  189. {
  190.     return reverse_iterator(*(m_locnEnd.prev()));
  191. }
  192. const _CListOfCHXString_::reverse_iterator 
  193. _CListOfCHXString_::rbegin() const
  194. {
  195.     return const_reverse_iterator(*(m_locnEnd.prev()));
  196. }
  197. _CListOfCHXString_::reverse_iterator
  198. _CListOfCHXString_::rend()
  199. {
  200.     return reverse_iterator(m_locnREnd);
  201. }
  202. const _CListOfCHXString_::reverse_iterator
  203. _CListOfCHXString_::rend() const
  204. {
  205.     return const_reverse_iterator(*((const _CListOfCHXString_Node *)&m_locnREnd));
  206. }
  207. _CListOfCHXString_::iterator
  208. _CListOfCHXString_::insert(iterator itBefore, const CHXString& rclsNew)
  209. {
  210.     _CListOfCHXString_Node* plocnNew = new _CListOfCHXString_Node;
  211.     HX_ASSERT(plocnNew);
  212.     *plocnNew = rclsNew;
  213.     itBefore.m_plocCurrent->Insert(*plocnNew);
  214.     return iterator(*plocnNew);
  215. }
  216. void
  217. _CListOfCHXString_::insert
  218. (
  219.     iterator itBefore,
  220.     const iterator itFirst,
  221.     const iterator itLast
  222. )
  223. {
  224.     iterator itOther;
  225.     _CListOfCHXString_Node* plocnNew;
  226.     for (itOther = itFirst; itOther != itLast; ++itOther)
  227.     {
  228. plocnNew = new _CListOfCHXString_Node;
  229. HX_ASSERT(plocnNew);
  230. *plocnNew = *itOther;
  231. itBefore.m_plocCurrent->Insert(*plocnNew);
  232.     }
  233. }
  234. void
  235. _CListOfCHXString_::remove(iterator itThis)
  236. {
  237.     if
  238.     (
  239. itThis.m_plocCurrent == &m_locnEnd ||
  240. itThis.m_plocCurrent == &m_locnREnd
  241.     )
  242.     {
  243. return;
  244.     }
  245.     _CListOfCHXString_Node* plocnOld;
  246.     plocnOld = itThis.m_plocCurrent;
  247.     ++itThis;
  248.     plocnOld->Remove();
  249.     delete plocnOld;
  250. }
  251. void
  252. _CListOfCHXString_::remove(iterator itFirst, iterator itLast)
  253. {
  254.     if
  255.     (
  256. itFirst.m_plocCurrent == &m_locnEnd ||
  257. itFirst.m_plocCurrent == &m_locnREnd
  258.     )
  259.     {
  260. return;
  261.     }
  262.     iterator itOther;
  263.     _CListOfCHXString_Node* plocnOld;
  264.     for (itOther = itFirst; itOther != itLast;)
  265.     {
  266. plocnOld = itOther.m_plocCurrent;
  267. ++itOther;
  268. plocnOld->Remove();
  269. delete plocnOld;
  270.     }
  271. }
  272. void
  273. _CListOfCHXString_::empty()
  274. {
  275.     remove(begin(), end());
  276. }
  277. _CListIteratorCHXString_::_CListIteratorCHXString_()
  278.   : m_plocCurrent(NULL)
  279. {
  280. }
  281. _CListIteratorCHXString_::_CListIteratorCHXString_
  282. (
  283.     const _CListOfCHXString_Node& rlocnNewLocation
  284. )
  285.   : m_plocCurrent((_CListOfCHXString_Node*)&rlocnNewLocation)
  286. {
  287. }
  288. _CListIteratorCHXString_::_CListIteratorCHXString_
  289. (
  290.     const _CListIteratorCHXString_& rliocOther
  291. )
  292.   : m_plocCurrent(rliocOther.m_plocCurrent)
  293. {
  294. }
  295. _CListIteratorCHXString_::~_CListIteratorCHXString_()
  296. {
  297. }
  298. _CListIteratorCHXString_&
  299. _CListIteratorCHXString_::operator=
  300. (
  301.     const _CListIteratorCHXString_& rliocOther
  302. )
  303. {
  304.     m_plocCurrent = rliocOther.m_plocCurrent;
  305.     return *this;
  306. }
  307. CHXString&
  308. _CListIteratorCHXString_::operator*()
  309. {
  310.     HX_ASSERT(m_plocCurrent);
  311.     return m_plocCurrent->value();
  312. }
  313. _CListIteratorCHXString_&
  314. _CListIteratorCHXString_::operator=(const CHXString& rclsNewValue)
  315. {
  316.     if(!m_plocCurrent)
  317. return *this;
  318.     m_plocCurrent->value(rclsNewValue);
  319.     return *this;
  320. }
  321. _CListIteratorCHXString_&
  322. _CListIteratorCHXString_::operator++()
  323. {
  324.     if(!m_plocCurrent)
  325. return *this;
  326.     m_plocCurrent = m_plocCurrent->next();
  327.     return *this;
  328. }
  329. const _CListIteratorCHXString_
  330. _CListIteratorCHXString_::operator++(int)
  331. {
  332.     _CListIteratorCHXString_ liocRet(*this);
  333.     ++(*this);
  334.     return liocRet;
  335. }
  336. _CListIteratorCHXString_&
  337. _CListIteratorCHXString_::operator--()
  338. {
  339.     if(!m_plocCurrent)
  340. return *this;
  341.     m_plocCurrent = m_plocCurrent->prev();
  342.     return *this;
  343. }
  344. const _CListIteratorCHXString_
  345. _CListIteratorCHXString_::operator--(int)
  346. {
  347.     _CListIteratorCHXString_ liocRet(*this);
  348.     --(*this);
  349.     return liocRet;
  350. }
  351. BOOL operator==
  352. (
  353.     const _CListIteratorCHXString_& rliocLeft,
  354.     const _CListIteratorCHXString_& rliocRight
  355. )
  356. {
  357.     return (rliocLeft.m_plocCurrent == rliocRight.m_plocCurrent);
  358. }
  359. BOOL operator!=
  360. (
  361.     const _CListIteratorCHXString_& rliocLeft,
  362.     const _CListIteratorCHXString_& rliocRight
  363. )
  364. {
  365.     return (rliocLeft.m_plocCurrent != rliocRight.m_plocCurrent);
  366. }
  367. _CListReverseIteratorCHXString_::_CListReverseIteratorCHXString_()
  368.   : m_plocCurrent(NULL)
  369. {
  370. }
  371. _CListReverseIteratorCHXString_::_CListReverseIteratorCHXString_
  372. (
  373.     const _CListOfCHXString_Node& rlocnNewLocation
  374. )
  375.   : m_plocCurrent((_CListOfCHXString_Node*)&rlocnNewLocation)
  376. {
  377. }
  378. _CListReverseIteratorCHXString_::_CListReverseIteratorCHXString_
  379. (
  380.     _CListReverseIteratorCHXString_& rlriocOther
  381. )
  382.   : m_plocCurrent(rlriocOther.m_plocCurrent)
  383. {
  384. }
  385. _CListReverseIteratorCHXString_::~_CListReverseIteratorCHXString_()
  386. {
  387. }
  388. _CListReverseIteratorCHXString_&
  389. _CListReverseIteratorCHXString_::operator=
  390. (
  391.     const _CListReverseIteratorCHXString_& rlriocOther
  392. )
  393. {
  394.     m_plocCurrent = rlriocOther.m_plocCurrent;
  395.     return *this;
  396. }
  397. CHXString&
  398. _CListReverseIteratorCHXString_::operator*()
  399. {
  400.     HX_ASSERT(m_plocCurrent);
  401.     return m_plocCurrent->value();
  402. }
  403. _CListReverseIteratorCHXString_&
  404. _CListReverseIteratorCHXString_::operator=(const CHXString& rclsNewValue)
  405. {
  406.     if(!m_plocCurrent)
  407. return *this;
  408.     m_plocCurrent->value(rclsNewValue);
  409.     return *this;
  410. }
  411. _CListReverseIteratorCHXString_&
  412. _CListReverseIteratorCHXString_::operator++()
  413. {
  414.     if(!m_plocCurrent)
  415. return *this;
  416.     m_plocCurrent = m_plocCurrent->prev();
  417.     return *this;
  418. }
  419. const _CListReverseIteratorCHXString_
  420. _CListReverseIteratorCHXString_::operator++(int)
  421. {
  422.     _CListReverseIteratorCHXString_ lriocRet(*this);
  423.     ++(*this);
  424.     return lriocRet;
  425. }
  426. _CListReverseIteratorCHXString_&
  427. _CListReverseIteratorCHXString_::operator--()
  428. {
  429.     if(!m_plocCurrent)
  430. return *this;
  431.     m_plocCurrent = m_plocCurrent->next();
  432.     return *this;
  433. }
  434. const _CListReverseIteratorCHXString_
  435. _CListReverseIteratorCHXString_::operator--(int)
  436. {
  437.     _CListReverseIteratorCHXString_ lriocRet(*this);
  438.     --(*this);
  439.     return lriocRet;
  440. }
  441. BOOL operator==
  442. (
  443.     const _CListReverseIteratorCHXString_& rlriocLeft,
  444.     const _CListReverseIteratorCHXString_& rlriocRight
  445. )
  446. {
  447.     return (rlriocLeft.m_plocCurrent == rlriocRight.m_plocCurrent);
  448. }
  449. BOOL operator!=
  450. (
  451.     const _CListReverseIteratorCHXString_& rlriocLeft,
  452.     const _CListReverseIteratorCHXString_& rlriocRight
  453. )
  454. {
  455.     return (rlriocLeft.m_plocCurrent != rlriocRight.m_plocCurrent);
  456. }
  457. CWinRegKey::CWinRegKey()
  458.     : m_hkRoot(NULL)
  459.     , m_hkThis(NULL)
  460.     , m_dwKeyEnumPos(0)
  461.     , m_dwValueEnumPos(0)
  462.     , m_rsAccess(KEY_READ)
  463.     , m_bOpen(FALSE)
  464. {
  465. }
  466. CWinRegKey::~CWinRegKey()
  467. {
  468.     Close();
  469. }
  470. HX_RESULT 
  471. CWinRegKey::Open()
  472. {
  473.     if(!m_hkRoot || m_sPath.IsEmpty())
  474.     {
  475. return HXR_UNEXPECTED;
  476.     }
  477.     Close();
  478.     HX_RESULT pnrRes = HXR_FAIL;
  479.     if
  480.     (
  481. SUCCEEDED
  482. (
  483.     pnrRes = HRESULT_FROM_WIN32
  484.     (
  485. RegOpenKeyEx
  486. (
  487.     m_hkRoot,
  488.     OS_STRING(m_sPath),
  489.     0,
  490.     m_rsAccess,
  491.     &m_hkThis
  492. )
  493.     )
  494. )
  495.     )
  496.     {
  497. m_bOpen = TRUE;
  498.     }
  499.     return pnrRes;
  500. }
  501. HX_RESULT 
  502. CWinRegKey::Create(const char* szClass, DWORD dwOptions)
  503. {
  504.     if(!m_hkRoot || m_sPath.IsEmpty())
  505.     {
  506. return HXR_UNEXPECTED;
  507.     }
  508.     Close();
  509.     DWORD dwIngnored;
  510.     if
  511.     (
  512. RegCreateKeyEx
  513. (
  514.     m_hkRoot,
  515.     OS_STRING(m_sPath),
  516.     0,
  517.     OS_STRING(szClass),
  518.     dwOptions,
  519.     m_rsAccess,
  520.     NULL,
  521.     &m_hkThis,
  522.     &dwIngnored
  523. )
  524. ==
  525. ERROR_SUCCESS
  526.     )
  527.     {
  528. m_bOpen = TRUE;
  529. return HXR_OK;
  530.     }
  531.     return HXR_FAIL;
  532. }
  533. HX_RESULT 
  534. CWinRegKey::Close()
  535. {
  536.     if(!m_bOpen)
  537.     {
  538. return HXR_UNEXPECTED;
  539.     }
  540.     if
  541.     (
  542. RegCloseKey(m_hkThis)
  543. ==
  544. ERROR_SUCCESS
  545.     )
  546.     {
  547. m_bOpen = FALSE;
  548. return HXR_OK;
  549.     }
  550.     return HXR_FAIL;
  551. }
  552. HX_RESULT 
  553. CWinRegKey::Flush()
  554. {
  555.     if(!m_bOpen)
  556.     {
  557. return HXR_UNEXPECTED;
  558.     }
  559.     if
  560.     (
  561. RegFlushKey(m_hkThis)
  562. ==
  563. ERROR_SUCCESS
  564.     )
  565.     {
  566. return HXR_OK;
  567.     }
  568.     return HXR_FAIL;
  569. }
  570. HX_RESULT 
  571. CWinRegKey::DeleteSubKey(const char* szName)
  572. {
  573.     if(!m_bOpen)
  574.     {
  575. return HXR_UNEXPECTED;
  576.     }
  577.     HX_RESULT pnrRes = HXR_FAIL;
  578.     CWinRegKey wrkExpired;
  579.     CWinRegKey wrkSub;
  580.     wrkExpired.SetRootKey(m_hkThis);
  581.     wrkExpired.SetRelativePath(szName);
  582.     wrkExpired.SetDesiredAccess(KEY_ENUMERATE_SUB_KEYS|KEY_CREATE_SUB_KEY);
  583.     if (SUCCEEDED(pnrRes = wrkExpired.Open()))
  584.     {
  585. wrkExpired.ResetKeyEnumerator();
  586. while(wrkExpired.GetNextKey(wrkSub))
  587. {
  588.     wrkExpired.DeleteSubKey(wrkSub.GetRelativePath());
  589.     wrkExpired.ResetKeyEnumerator();
  590. }
  591. wrkExpired.Close();
  592. pnrRes = HRESULT_FROM_WIN32(RegDeleteKey(m_hkThis, OS_STRING(szName)));
  593.     }
  594.     return pnrRes;
  595. }
  596. BOOL 
  597. CWinRegKey::DoesExist()
  598. {
  599.     if(m_bOpen)
  600.     {
  601. return TRUE;
  602.     }
  603.     if(SUCCEEDED(Open()))
  604.     {
  605. Close();
  606. return TRUE;
  607.     }
  608.     return FALSE;
  609. }
  610. BOOL 
  611. CWinRegKey::SetDesiredAccess(REGSAM rsNew)
  612. {
  613.     if(m_bOpen)
  614.     {
  615. return FALSE;
  616.     }
  617.     m_rsAccess = rsNew;
  618.     return TRUE;
  619. }
  620. REGSAM 
  621. CWinRegKey::GetDesiredAccess()
  622. {
  623.     return m_rsAccess;
  624. }
  625. BOOL 
  626. CWinRegKey::SetRootKey(HKEY hkRoot)
  627. {
  628.     if(m_bOpen)
  629.     {
  630. return FALSE;
  631.     }
  632.     m_hkRoot = hkRoot;
  633.     return TRUE;
  634. }
  635. HKEY 
  636. CWinRegKey::GetRootKey()
  637. {
  638.     return m_hkRoot;
  639. }
  640. HKEY 
  641. CWinRegKey::GetHandle()
  642. {
  643.     return m_hkThis;
  644. }
  645. // According to Article ID: Q117261
  646. //
  647. // A call to RegCreateKeyEx() is successful under Windows NT version 3.1 
  648. // and Windows 95, but the call fails with error 161 (ERROR_BAD_PATHNAME) 
  649. // under Windows NT version 3.5 and later. 
  650. //
  651. // This is by design. Windows NT version 3.1 and Windows 95 allow the 
  652. // subkey to begin with a backslash (""), however Windows NT version 3.5 
  653. // and later do not. The subkey is given as the second parameter to 
  654. // RegCreateKeyEx(). 
  655. //
  656. BOOL 
  657. CWinRegKey::SetRelativePath(const char* szPath)
  658. {
  659.     if(m_bOpen)
  660.     {
  661. return FALSE;
  662.     }
  663.     if (*szPath == '\')
  664.     {
  665. m_sPath = szPath+1;
  666.     }
  667.     else
  668.     {
  669. m_sPath = szPath;
  670.     }
  671.     return TRUE;
  672. }
  673. CHXString& 
  674. CWinRegKey::GetRelativePath()
  675. {
  676.     return m_sPath;
  677. }
  678. BOOL 
  679. CWinRegKey::GetValue
  680. (
  681.     const char* szName, 
  682.     AWinRegValue** ppwrvOut, 
  683.     UINT32 ulType
  684. )
  685. {
  686.     if
  687.     (
  688. !m_bOpen 
  689. || 
  690. !szName 
  691. || 
  692. !(*szName)
  693. ||
  694. !ppwrvOut
  695.     )
  696.     {
  697. return FALSE;
  698.     }
  699.     *ppwrvOut = NULL;
  700.     if (!ulType)
  701.     {
  702. if
  703. (
  704.     RegQueryValueEx
  705.     (
  706. m_hkThis,
  707. OS_STRING(szName),
  708. NULL,
  709. &ulType,
  710. NULL,
  711. NULL
  712.     )
  713.     !=
  714.     ERROR_SUCCESS
  715. )
  716. {
  717.     return FALSE;
  718. }
  719.     }
  720.     switch(ulType)
  721.     {
  722.     case REG_DWORD:
  723. {
  724.     *ppwrvOut = (AWinRegValue*)new CWinRegDWORDValue
  725.     (
  726. szName, 
  727. m_hkThis
  728.     );
  729. }
  730. break;
  731.     case REG_SZ:
  732. {
  733.     *ppwrvOut = (AWinRegValue*)new CWinRegStringValue
  734.     (
  735. szName, 
  736. m_hkThis
  737.     );
  738. }
  739. break;
  740.     case REG_MULTI_SZ:
  741. {
  742.     *ppwrvOut = (AWinRegValue*)new CWinRegStringArrayValue
  743.     (
  744. szName, 
  745. m_hkThis
  746.     );
  747. }
  748. break;
  749.     default:
  750. {
  751. }
  752. break;
  753.     };
  754.     
  755.     return (*ppwrvOut)?TRUE:FALSE;
  756. }
  757. void 
  758. CWinRegKey::FreeValue(AWinRegValue*& pwrvExpired)
  759. {
  760.     delete pwrvExpired;
  761.     pwrvExpired = NULL;
  762. }
  763. BOOL 
  764. CWinRegKey::ResetKeyEnumerator()
  765. {
  766.     if(!m_bOpen)
  767.     {
  768. return FALSE;
  769.     }
  770.     m_dwKeyEnumPos = 0;
  771.     return TRUE;
  772. }
  773. BOOL 
  774. CWinRegKey::GetNextKey(CWinRegKey& rwrkNext)
  775. {
  776.     if(!m_bOpen)
  777.     {
  778. return FALSE;
  779.     }
  780.     
  781.     char szName[128]; /* Flawfinder: ignore */
  782.     UINT32 ulSizeName=128;
  783.     char szClass[128]; /* Flawfinder: ignore */
  784.     UINT32 ulSizeClass=128;
  785.     FILETIME ftLastWrite;
  786.     if
  787.     (
  788. RegEnumKeyEx
  789. (
  790.     m_hkThis,
  791.     m_dwKeyEnumPos,
  792.     OS_STRING2(szName, ulSizeName),
  793.     &ulSizeName,
  794.     NULL,
  795.     OS_STRING2(szClass, ulSizeClass),
  796.     &ulSizeClass,
  797.     &ftLastWrite
  798. )
  799. ==
  800. ERROR_SUCCESS
  801.     )
  802.     {
  803. ++m_dwKeyEnumPos;
  804. rwrkNext.SetRootKey(m_hkThis);
  805. rwrkNext.SetRelativePath(szName);
  806. rwrkNext.SetDesiredAccess(m_rsAccess);
  807. return TRUE;
  808.     }
  809.     return FALSE;
  810. }
  811. BOOL 
  812. CWinRegKey::ResetValueEnumerator()
  813. {
  814.     if(!m_bOpen)
  815.     {
  816. return FALSE;
  817.     }
  818.     m_dwValueEnumPos = 0;
  819.     return TRUE;
  820. }
  821. BOOL 
  822. CWinRegKey::GetNextValue(AWinRegValue** ppwrvNext)
  823. {
  824.     if(!m_bOpen)
  825.     {
  826. return FALSE;
  827.     }
  828.     char szName[128]; /* Flawfinder: ignore */
  829.     UINT32 ulSizeName=128;
  830.     UINT32 ulType;
  831.     if
  832.     (
  833. RegEnumValue
  834. (
  835.     m_hkThis,
  836.     m_dwValueEnumPos,
  837.     OS_STRING2(szName, ulSizeName),
  838.     &ulSizeName,
  839.     NULL,
  840.     &ulType,
  841.     NULL,
  842.     NULL
  843. )
  844. ==
  845. ERROR_SUCCESS
  846.     )
  847.     {
  848. ++m_dwValueEnumPos;
  849. return GetValue(szName, ppwrvNext, ulType);
  850.     }
  851.     return FALSE;
  852. }