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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: hxclreg.cpp,v 1.4.20.1 2004/07/09 02:07:27 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 "hlxclib/stdio.h"
  50. #include "hlxclib/string.h"
  51. #include "hxtypes.h"
  52. #include "hxcom.h"
  53. #include "ihxpckts.h"
  54. #include "hxmon.h"
  55. #include "watchlst.h"
  56. #include "property.h"
  57. #include "db_dict.h"
  58. #include "commreg.h"
  59. #include "hxpropwclnt.h"
  60. #include "hxclreg.h"
  61. #include "hxheap.h"
  62. #ifdef _DEBUG
  63. #undef HX_THIS_FILE
  64. static const char HX_THIS_FILE[] = __FILE__;
  65. #endif
  66. HXClientRegistry::HXClientRegistry() : 
  67.      m_lRefCount(0)
  68.     ,m_pPropDB(NULL)
  69.     ,m_pContext(NULL)
  70. {
  71.      m_pPropDB = new CommonRegistry;
  72. }
  73. HXClientRegistry::~HXClientRegistry()
  74. {
  75.     Close();
  76. }
  77. /////////////////////////////////////////////////////////////////////////
  78. //  Method:
  79. //      HXRegistry::QueryInterface
  80. //  Purpose:
  81. //      Implement this to export the interfaces supported by your
  82. //      object.
  83. //
  84. STDMETHODIMP
  85. HXClientRegistry::QueryInterface(REFIID riid, void** ppvObj)
  86. {
  87.     QInterfaceList qiList[] =
  88.         {
  89.             { GET_IIDHANDLE(IID_IHXRegistry), (IHXRegistry*)this },
  90.             { GET_IIDHANDLE(IID_IUnknown), (IUnknown*)(IHXRegistry*)this },
  91.         };
  92.     
  93.     return ::QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);
  94. }   
  95. /////////////////////////////////////////////////////////////////////////
  96. //  Method:
  97. //      HXRegistry::AddRef
  98. //  Purpose:
  99. //      Everyone usually implements this the same... feel free to use
  100. //      this implementation.
  101. //
  102. STDMETHODIMP_(ULONG32)
  103. HXClientRegistry::AddRef()
  104. {
  105.     return InterlockedIncrement(&m_lRefCount);
  106. }   
  107. /////////////////////////////////////////////////////////////////////////
  108. //  Method:
  109. //      HXRegistry::Release
  110. //  Purpose:
  111. //      Everyone usually implements this the same... feel free to use
  112. //      this implementation.
  113. //
  114. STDMETHODIMP_(ULONG32)
  115. HXClientRegistry::Release()
  116. {
  117.     if (InterlockedDecrement(&m_lRefCount) > 0)
  118.     {
  119.         return m_lRefCount;
  120.     }
  121.     
  122.     delete this;
  123.     return 0;
  124. }   
  125. /* 
  126.  * Users of this class should call Init and the context should
  127.  * expose IHXInterruptState and IHXScheduler if they want to
  128.  * ensure that watches are fired ONLY at non-interrupt time.
  129.  *
  130.  * Currently, this functionality is ONLY used by the client core
  131.  * since it is multi-threaded and needs to deal with
  132.  * top level clients which are not thread-safe.
  133.  */
  134. void
  135. HXClientRegistry::Init(IUnknown* pContext)
  136. {
  137.     m_pContext = pContext;
  138.     m_pContext->AddRef();
  139. }
  140. void
  141. HXClientRegistry::Close(void)
  142. {
  143.     HX_DELETE(m_pPropDB);
  144.     HX_RELEASE(m_pContext);
  145. }
  146. /************************************************************************
  147.  *  Method:
  148.  *      IHXRegistry::CreatePropWatch
  149.  *  Purpose:
  150.  *      Create a new IHXPropWatch object which can then be queried for the
  151.  *  right kind of IHXPropWatch object.
  152.  */
  153. STDMETHODIMP
  154. HXClientRegistry::CreatePropWatch(IHXPropWatch*& ppObj)
  155. {
  156.     if (!m_pPropDB)
  157.     {
  158. return HXR_FAIL;
  159.     }
  160.     ppObj = (IHXPropWatch *)new HXClientPropWatch(m_pPropDB, m_pContext);
  161.     if (ppObj)
  162.     {
  163.         ppObj->AddRef();
  164.         return HXR_OK;
  165.     }
  166.     return HXR_OUTOFMEMORY;
  167. }
  168. /************************************************************************
  169.  *  Method:
  170.  *      IHXRegistry::AddComp
  171.  *  Purpose:
  172.  *      Add a COMPOSITE property to the registry and return its hash
  173.  *  key value if successful. It returns ZERO (0) if an error occured
  174.  *  during the operation.
  175.  */
  176. STDMETHODIMP_(UINT32)
  177. HXClientRegistry::AddComp(const char * new_prop)
  178. {
  179.     // if the return value is ZERO then the operation failed
  180.     return m_pPropDB->AddComp(new_prop);
  181. }
  182. /************************************************************************
  183.  *  Method:
  184.  *      IHXRegistry::AddInt
  185.  *  Purpose:
  186.  *      Add an INTEGER property with name in "pName" and value in 
  187.  *  "iValue" to the registry. The return value is the id to
  188.  *  the newly added Property or ZERO if there was an error.
  189.  */
  190. STDMETHODIMP_(UINT32)
  191. HXClientRegistry::AddInt(const char* new_prop, const INT32 val)
  192. {
  193.     // if the return value is ZERO then the operation failed
  194.     return m_pPropDB->AddInt(new_prop, val);
  195. }
  196. /************************************************************************
  197.  *  Method:
  198.  *      IHXRegistry::GetInt
  199.  *  Purpose:
  200.  *      Retreive an INTEGER value from the registry given its Property
  201.  *  name "pcName" or by its id "id". If the Property 
  202.  *  is found, it will return HXR_OK, otherwise it returns HXR_FAIL.
  203.  */
  204. STDMETHODIMP
  205. HXClientRegistry::GetIntByName(const char* prop_name, INT32& val) const
  206. {
  207.     return m_pPropDB->GetInt(prop_name, &val);
  208. }
  209. /************************************************************************
  210.  *  Method:
  211.  *      IHXRegistry::GetInt
  212.  *  Purpose:
  213.  *      Retreive an INTEGER value from the registry given its Property
  214.  *  name "pcName" or by its id "id". If the Property 
  215.  *  is found, it will return HXR_OK, otherwise it returns HXR_FAIL.
  216.  */
  217. STDMETHODIMP
  218. HXClientRegistry::GetIntById(const UINT32 hash_key, INT32& val) const
  219. {
  220.     return m_pPropDB->GetInt(hash_key, &val);
  221. }
  222. /************************************************************************
  223.  *  Method:
  224.  *      IHXRegistry::SetIntByXYZ
  225.  *  Purpose:
  226.  *      Modify a Property's INTEGER value in the registry given the
  227.  *  Property's name "pcName" or its id "id". If the value 
  228.  *  was set, it will return HXR_OK, otherwise it returns HXR_FAIL.
  229.  */
  230. STDMETHODIMP
  231. HXClientRegistry::SetIntByName(const char* prop_name, const INT32 val)
  232. {
  233.     return m_pPropDB->SetInt(prop_name, val);
  234. }
  235. /************************************************************************
  236.  *  Method:
  237.  *      IHXRegistry::SetIntByXYZ
  238.  *  Purpose:
  239.  *      Modify a Property's INTEGER value in the registry given the
  240.  *  Property's name "pcName" or its id "id". If the value 
  241.  *  was set, it will return HXR_OK, otherwise it returns HXR_FAIL.
  242.  */
  243. STDMETHODIMP
  244. HXClientRegistry::SetIntById(const UINT32 hash_key, const INT32 val)
  245. {
  246.     return m_pPropDB->SetInt(hash_key, val);
  247. }
  248. /************************************************************************
  249.  *  Method:
  250.  *      IHXRegistry::AddStr
  251.  *  Purpose:
  252.  *      Add an STRING property with name in "pcName" and value in 
  253.  *  "pcValue" to the registry.
  254.  */
  255. STDMETHODIMP_(UINT32)
  256. HXClientRegistry::AddStr(const char* new_prop, IHXBuffer* val)
  257. {
  258.     // if the return value is ZERO then the operation failed
  259.     return m_pPropDB->AddStr(new_prop, val);
  260. }
  261. /************************************************************************
  262.  *  Method:
  263.  *      IHXRegistry::GetStrByXYZ
  264.  *  Purpose:
  265.  *      Retreive an STRING value from the registry given its Property
  266.  *  name "pcName" or by its id "id". If the Property 
  267.  *  is found, it will return HXR_OK, otherwise it returns HXR_FAIL.
  268.  */
  269. STDMETHODIMP
  270. HXClientRegistry::GetStrByName(const char* prop_name, REF(IHXBuffer*) val) const
  271. {
  272.     val = NULL;
  273.     return m_pPropDB->GetStr(prop_name, val);
  274. }
  275. /************************************************************************
  276.  *  Method:
  277.  *      IHXRegistry::GetStrByXYZ
  278.  *  Purpose:
  279.  *      Retreive an STRING value from the registry given its Property
  280.  *  name "pcName" or by its id "id". If the Property 
  281.  *  is found, it will return HXR_OK, otherwise it returns HXR_FAIL.
  282.  */
  283. STDMETHODIMP
  284. HXClientRegistry::GetStrById(const UINT32 hash_key, REF(IHXBuffer*) val) const
  285. {
  286.     val = NULL;
  287.     return m_pPropDB->GetStr(hash_key, val);
  288. }
  289. /************************************************************************
  290.  *  Method:
  291.  *      IHXRegistry::SetStrByXYZ
  292.  *  Purpose:
  293.  *      Modify a Property's STRING value in the registry given the
  294.  *  Property's name "pcName" or its id "id". If the value 
  295.  *  was set, it will return HXR_OK, otherwise it returns HXR_FAIL.
  296.  */
  297. STDMETHODIMP
  298. HXClientRegistry::SetStrByName(const char* prop_name, IHXBuffer* val)
  299. {
  300.     return m_pPropDB->SetStr(prop_name, val);
  301. }
  302. /************************************************************************
  303.  *  Method:
  304.  *      IHXRegistry::SetStrByXYZ
  305.  *  Purpose:
  306.  *      Modify a Property's STRING value in the registry given the
  307.  *  Property's name "pcName" or its id "id". If the value 
  308.  *  was set, it will return HXR_OK, otherwise it returns HXR_FAIL.
  309.  */
  310. STDMETHODIMP
  311. HXClientRegistry::SetStrById(const UINT32 hash_key, IHXBuffer* val)
  312. {
  313.     return m_pPropDB->SetStr(hash_key, val);
  314. }
  315. /************************************************************************
  316.  *  Method:
  317.  *      IHXRegistry::AddBuf
  318.  *  Purpose:
  319.  *      Add an BUFFER property with name in "pcName" and value in 
  320.  *  "pValue" to the registry.
  321.  */
  322. STDMETHODIMP_(UINT32)
  323. HXClientRegistry::AddBuf(const char* new_prop, IHXBuffer* p_buf)
  324. {
  325.     // if the return value is ZERO then the operation failed
  326.     return m_pPropDB->AddBuf(new_prop, p_buf);
  327. }
  328. /************************************************************************
  329.  *  Method:
  330.  *      IHXRegistry::GetBufByName
  331.  *  Purpose:
  332.  *      Retreive the BUFFER from the registry given its Property
  333.  *  name "pcName" or its id "id". If the Property 
  334.  *  is found, it will return HXR_OK, otherwise it returns HXR_FAIL.
  335.  */
  336. STDMETHODIMP
  337. HXClientRegistry::GetBufByName(const char* prop_name, IHXBuffer*& pp_buf) const
  338. {
  339.     // if the return value is ZERO then the operation failed
  340.     return m_pPropDB->GetBuf(prop_name, &pp_buf);
  341. }
  342. /************************************************************************
  343.  *  Method:
  344.  *      IHXRegistry::GetBufById
  345.  *  Purpose:
  346.  *      Retreive the BUFFER from the registry given its Property
  347.  *  name "pcName" or its id "id". If the Property 
  348.  *  is found, it will return HXR_OK, otherwise it returns HXR_FAIL.
  349.  */
  350. STDMETHODIMP
  351. HXClientRegistry::GetBufById(const UINT32 hash_key, IHXBuffer*& pp_buf) const
  352. {
  353.     // if the return value is ZERO then the operation failed
  354.     return m_pPropDB->GetBuf(hash_key, &pp_buf);
  355. }
  356. /************************************************************************
  357.  *  Method:
  358.  *      IHXRegistry::SetBufByXYZ
  359.  *  Purpose:
  360.  *      Modify a Property's BUFFER in the registry given the
  361.  *  Property's name "pcName" or its id "id". If the value 
  362.  *  was set, it will return HXR_OK, otherwise it returns HXR_FAIL.
  363.  */
  364. STDMETHODIMP
  365. HXClientRegistry::SetBufByName(const char* prop_name, IHXBuffer* p_buf)
  366. {
  367.     // if the return value is ZERO then the operation failed
  368.     return m_pPropDB->SetBuf(prop_name, p_buf);
  369. }
  370. /************************************************************************
  371.  *  Method:
  372.  *      IHXRegistry::SetBufByXYZ
  373.  *  Purpose:
  374.  *      Modify a Property's BUFFER in the registry given the
  375.  *  Property's name "pcName" or its id "id". If the value 
  376.  *  was set, it will return HXR_OK, otherwise it returns HXR_FAIL.
  377.  */
  378. STDMETHODIMP
  379. HXClientRegistry::SetBufById(const UINT32 hash_key, IHXBuffer* p_buf)
  380. {
  381.     // if the return value is ZERO then the operation failed
  382.     return m_pPropDB->SetBuf(hash_key, p_buf);
  383. }
  384. /************************************************************************
  385.  *  Method:
  386.  *      IHXRegistry::AddIntRef
  387.  *  Purpose:
  388.  *      Add an INTEGER REFERENCE property with name in "pcName" and 
  389.  *  value in "iValue" to the registry. This property allows the user
  390.  *  to modify its contents directly, without having to go through the
  391.  *  registry.
  392.  */
  393. STDMETHODIMP_(UINT32)
  394. HXClientRegistry::AddIntRef(const char* new_prop, INT32* val)
  395. {
  396.     return m_pPropDB->AddIntRef(new_prop, val);
  397. }
  398. /************************************************************************
  399.  *  Method:
  400.  *      IHXRegistry::DeleteByXYZ
  401.  *  Purpose:
  402.  *      Delete a Property from the registry using its name "pcName"
  403.  *  or id "id".
  404.  */
  405. STDMETHODIMP_(UINT32)
  406. HXClientRegistry::DeleteByName(const char* prop_name)
  407. {
  408.     // if the return value is ZERO then the operation failed
  409.     return m_pPropDB->Del(prop_name);
  410. }
  411. /************************************************************************
  412.  *  Method:
  413.  *      IHXRegistry::DeleteByXYZ
  414.  *  Purpose:
  415.  *      Delete a Property from the registry using its name "pcName"
  416.  *  or id "id".
  417.  */
  418. STDMETHODIMP_(UINT32)
  419. HXClientRegistry::DeleteById(const UINT32 hash_key)
  420. {
  421.     // if the return value is ZERO then the operation failed
  422.     return m_pPropDB->Del(hash_key);
  423. }
  424. /************************************************************************
  425.  *  Method:
  426.  *      IHXRegistry::GetType
  427.  *  Purpose:
  428.  *      Returns the datatype of the Property given its name "pcName"
  429.  *  or its id "id".
  430.  */
  431. STDMETHODIMP_(HXPropType)
  432. HXClientRegistry::GetTypeByName(const char* prop_name) const
  433. {
  434.     return m_pPropDB->GetType(prop_name);
  435. }
  436. /************************************************************************
  437.  *  Method:
  438.  *      IHXRegistry::GetType
  439.  *  Purpose:
  440.  *      Returns the datatype of the Property given its name "pcName"
  441.  *  or its id "id".
  442.  */
  443. STDMETHODIMP_(HXPropType)
  444. HXClientRegistry::GetTypeById(const UINT32 hash_key) const
  445. {
  446.     return m_pPropDB->GetType(hash_key);
  447. }
  448. /************************************************************************
  449.  *  Method:
  450.  *      IHXRegistry::FindParentIdByName
  451.  *  Purpose:
  452.  *      Returns the id value of the parent node of the Property
  453.  *  whose name (prop_name) or id (id) has been specified.
  454.  *  If it fails, a ZERO value is returned.
  455.  */
  456. STDMETHODIMP_(UINT32)
  457. HXClientRegistry::FindParentIdByName(const char* prop_name) const
  458. {
  459.     return m_pPropDB->FindParentKey(prop_name);
  460. }
  461. /************************************************************************
  462.  *  Method:
  463.  *      IHXRegistry::FindParentIdById
  464.  *  Purpose:
  465.  *      Returns the id value of the parent node of the Property
  466.  *  whose name (prop_name) or id (id) has been specified.
  467.  *  If it fails, a ZERO value is returned.
  468.  */
  469. STDMETHODIMP_(UINT32)
  470. HXClientRegistry::FindParentIdById(const UINT32 hash_key) const
  471. {
  472.     return m_pPropDB->FindParentKey(hash_key);
  473. }
  474. /************************************************************************
  475.  *  Method:
  476.  *      HXRegistry::GetPropName
  477.  *  Purpose:
  478.  *      Returns the Property name in the ppcName char buffer passed
  479.  *  as a parameter, given the Property's id "ulId".
  480.  */
  481. STDMETHODIMP
  482. HXClientRegistry::GetPropName(const UINT32 id, IHXBuffer*& prop_name) const
  483. {
  484.     return m_pPropDB->GetPropName(id, prop_name);
  485. }
  486. /************************************************************************
  487.  *  Method:
  488.  *      HXRegistry::GetId
  489.  *  Purpose:
  490.  *      Returns the Property's id given the Property name.
  491.  */
  492. STDMETHODIMP_(UINT32)
  493. HXClientRegistry::GetId(const char* prop_name) const
  494. {
  495.     return m_pPropDB->GetId(prop_name);
  496. }
  497. /************************************************************************
  498.  *  Method:
  499.  *      IHXRegistry::GetPropListOfRoot
  500.  *  Purpose:
  501.  *      It returns back a list of Properties as an IHXValues (prop_name
  502.  *  and its id pair) at the root level of the registry's hierarchy.
  503.  */
  504. STDMETHODIMP
  505. HXClientRegistry::GetPropListOfRoot(IHXValues*& pValues) const
  506. {
  507.     return m_pPropDB->GetPropList(pValues);
  508. }
  509. /************************************************************************
  510.  *  Method:
  511.  *      IHXRegistry::GetPropListByName
  512.  *  Purpose:
  513.  *      Returns a list of Properties immediately under the one with
  514.  *  name "pcName" or id "id".
  515.  */
  516. STDMETHODIMP
  517. HXClientRegistry::GetPropListByName(const char* prop_name, 
  518.                                     IHXValues*& pValues) const
  519. {
  520.     return m_pPropDB->GetPropList(prop_name, pValues);
  521. }
  522. /************************************************************************
  523.  *  Method:
  524.  *      IHXRegistry::GetPropListById
  525.  *  Purpose:
  526.  *      Returns a list of Properties immediately under the one with
  527.  *  name "pcName" or id "id".
  528.  */
  529. STDMETHODIMP
  530. HXClientRegistry::GetPropListById(const UINT32 hash_key,
  531.                                   IHXValues*& pValues) const
  532. {
  533.     return m_pPropDB->GetPropList(hash_key, pValues);
  534. }
  535. /************************************************************************
  536.  *  Method:
  537.  *      IHXRegistry::GetNumPropsAtRoot
  538.  *  Purpose:
  539.  *      Returns the count of the number of Properties within the
  540.  *  registry. If a property name of id is specified, then it
  541.  *  returns the number of Properties under it.
  542.  */
  543. STDMETHODIMP_(INT32)
  544. HXClientRegistry::GetNumPropsAtRoot() const
  545. {
  546.     return m_pPropDB->Count();
  547. }
  548. /************************************************************************
  549.  *  Method:
  550.  *      IHXRegistry::GetNumPropsByName
  551.  *  Purpose:
  552.  *      Returns the count of the number of Properties within the
  553.  *  registry. If a property name of id is specified, then it
  554.  *  returns the number of Properties under it.
  555.  */
  556. STDMETHODIMP_(INT32)
  557. HXClientRegistry::GetNumPropsByName(const char* prop_name) const
  558. {
  559.     return m_pPropDB->Count(prop_name);
  560. }
  561. /************************************************************************
  562.  *  Method:
  563.  *      IHXRegistry::GetNumPropsById
  564.  *  Purpose:
  565.  *      Returns the count of the number of Properties within the
  566.  *  registry. If a property name of id is specified, then it
  567.  *  returns the number of Properties under it.
  568.  */
  569. STDMETHODIMP_(INT32)
  570. HXClientRegistry::GetNumPropsById(const UINT32 hash_key) const
  571. {
  572.     return m_pPropDB->Count(hash_key);
  573. }