hxclreg.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:19k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "hlxclib/stdio.h"
  36. #include "hlxclib/string.h"
  37. #include "hxtypes.h"
  38. #include "hxcom.h"
  39. #include "ihxpckts.h"
  40. #include "hxmon.h"
  41. #include "watchlst.h"
  42. #include "property.h"
  43. #include "db_dict.h"
  44. #include "commreg.h"
  45. #include "hxpropwclnt.h"
  46. #include "hxclreg.h"
  47. #include "hxheap.h"
  48. #ifdef _DEBUG
  49. #undef HX_THIS_FILE
  50. static const char HX_THIS_FILE[] = __FILE__;
  51. #endif
  52. HXClientRegistry::HXClientRegistry() : 
  53.      m_lRefCount(0)
  54.     ,m_pPropDB(NULL)
  55.     ,m_pContext(NULL)
  56. {
  57.      m_pPropDB = new CommonRegistry;
  58. }
  59. HXClientRegistry::~HXClientRegistry()
  60. {
  61.     Close();
  62. }
  63. /////////////////////////////////////////////////////////////////////////
  64. //  Method:
  65. //      HXRegistry::QueryInterface
  66. //  Purpose:
  67. //      Implement this to export the interfaces supported by your
  68. //      object.
  69. //
  70. STDMETHODIMP
  71. HXClientRegistry::QueryInterface(REFIID riid, void** ppvObj)
  72. {
  73.     QInterfaceList qiList[] =
  74.         {
  75.             { GET_IIDHANDLE(IID_IHXRegistry), (IHXRegistry*)this },
  76.             { GET_IIDHANDLE(IID_IUnknown), (IUnknown*)(IHXRegistry*)this },
  77.         };
  78.     
  79.     return ::QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);
  80. }   
  81. /////////////////////////////////////////////////////////////////////////
  82. //  Method:
  83. //      HXRegistry::AddRef
  84. //  Purpose:
  85. //      Everyone usually implements this the same... feel free to use
  86. //      this implementation.
  87. //
  88. STDMETHODIMP_(ULONG32)
  89. HXClientRegistry::AddRef()
  90. {
  91.     return InterlockedIncrement(&m_lRefCount);
  92. }   
  93. /////////////////////////////////////////////////////////////////////////
  94. //  Method:
  95. //      HXRegistry::Release
  96. //  Purpose:
  97. //      Everyone usually implements this the same... feel free to use
  98. //      this implementation.
  99. //
  100. STDMETHODIMP_(ULONG32)
  101. HXClientRegistry::Release()
  102. {
  103.     if (InterlockedDecrement(&m_lRefCount) > 0)
  104.     {
  105.         return m_lRefCount;
  106.     }
  107.     
  108.     delete this;
  109.     return 0;
  110. }   
  111. /* 
  112.  * Users of this class should call Init and the context should
  113.  * expose IHXInterruptState and IHXScheduler if they want to
  114.  * ensure that watches are fired ONLY at non-interrupt time.
  115.  *
  116.  * Currently, this functionality is ONLY used by the client core
  117.  * since it is multi-threaded and needs to deal with
  118.  * top level clients which are not thread-safe.
  119.  */
  120. void
  121. HXClientRegistry::Init(IUnknown* pContext)
  122. {
  123.     m_pContext = pContext;
  124.     m_pContext->AddRef();
  125. }
  126. void
  127. HXClientRegistry::Close(void)
  128. {
  129.     HX_DELETE(m_pPropDB);
  130.     HX_RELEASE(m_pContext);
  131. }
  132. /************************************************************************
  133.  *  Method:
  134.  *      IHXRegistry::CreatePropWatch
  135.  *  Purpose:
  136.  *      Create a new IHXPropWatch object which can then be queried for the
  137.  *  right kind of IHXPropWatch object.
  138.  */
  139. STDMETHODIMP
  140. HXClientRegistry::CreatePropWatch(IHXPropWatch*& ppObj)
  141. {
  142.     if (!m_pPropDB)
  143.     {
  144. return HXR_FAIL;
  145.     }
  146.     ppObj = (IHXPropWatch *)new HXClientPropWatch(m_pPropDB, m_pContext);
  147.     if (ppObj)
  148.     {
  149.         ppObj->AddRef();
  150.         return HXR_OK;
  151.     }
  152.     return HXR_OUTOFMEMORY;
  153. }
  154. /************************************************************************
  155.  *  Method:
  156.  *      IHXRegistry::AddComp
  157.  *  Purpose:
  158.  *      Add a COMPOSITE property to the registry and return its hash
  159.  *  key value if successful. It returns ZERO (0) if an error occured
  160.  *  during the operation.
  161.  */
  162. STDMETHODIMP_(UINT32)
  163. HXClientRegistry::AddComp(const char * new_prop)
  164. {
  165.     // if the return value is ZERO then the operation failed
  166.     return m_pPropDB->AddComp(new_prop);
  167. }
  168. /************************************************************************
  169.  *  Method:
  170.  *      IHXRegistry::AddInt
  171.  *  Purpose:
  172.  *      Add an INTEGER property with name in "pName" and value in 
  173.  *  "iValue" to the registry. The return value is the id to
  174.  *  the newly added Property or ZERO if there was an error.
  175.  */
  176. STDMETHODIMP_(UINT32)
  177. HXClientRegistry::AddInt(const char* new_prop, const INT32 val)
  178. {
  179.     // if the return value is ZERO then the operation failed
  180.     return m_pPropDB->AddInt(new_prop, val);
  181. }
  182. /************************************************************************
  183.  *  Method:
  184.  *      IHXRegistry::GetInt
  185.  *  Purpose:
  186.  *      Retreive an INTEGER value from the registry given its Property
  187.  *  name "pcName" or by its id "id". If the Property 
  188.  *  is found, it will return HXR_OK, otherwise it returns HXR_FAIL.
  189.  */
  190. STDMETHODIMP
  191. HXClientRegistry::GetIntByName(const char* prop_name, INT32& val) const
  192. {
  193.     return m_pPropDB->GetInt(prop_name, &val);
  194. }
  195. /************************************************************************
  196.  *  Method:
  197.  *      IHXRegistry::GetInt
  198.  *  Purpose:
  199.  *      Retreive an INTEGER value from the registry given its Property
  200.  *  name "pcName" or by its id "id". If the Property 
  201.  *  is found, it will return HXR_OK, otherwise it returns HXR_FAIL.
  202.  */
  203. STDMETHODIMP
  204. HXClientRegistry::GetIntById(const UINT32 hash_key, INT32& val) const
  205. {
  206.     return m_pPropDB->GetInt(hash_key, &val);
  207. }
  208. /************************************************************************
  209.  *  Method:
  210.  *      IHXRegistry::SetIntByXYZ
  211.  *  Purpose:
  212.  *      Modify a Property's INTEGER value in the registry given the
  213.  *  Property's name "pcName" or its id "id". If the value 
  214.  *  was set, it will return HXR_OK, otherwise it returns HXR_FAIL.
  215.  */
  216. STDMETHODIMP
  217. HXClientRegistry::SetIntByName(const char* prop_name, const INT32 val)
  218. {
  219.     return m_pPropDB->SetInt(prop_name, val);
  220. }
  221. /************************************************************************
  222.  *  Method:
  223.  *      IHXRegistry::SetIntByXYZ
  224.  *  Purpose:
  225.  *      Modify a Property's INTEGER value in the registry given the
  226.  *  Property's name "pcName" or its id "id". If the value 
  227.  *  was set, it will return HXR_OK, otherwise it returns HXR_FAIL.
  228.  */
  229. STDMETHODIMP
  230. HXClientRegistry::SetIntById(const UINT32 hash_key, const INT32 val)
  231. {
  232.     return m_pPropDB->SetInt(hash_key, val);
  233. }
  234. /************************************************************************
  235.  *  Method:
  236.  *      IHXRegistry::AddStr
  237.  *  Purpose:
  238.  *      Add an STRING property with name in "pcName" and value in 
  239.  *  "pcValue" to the registry.
  240.  */
  241. STDMETHODIMP_(UINT32)
  242. HXClientRegistry::AddStr(const char* new_prop, IHXBuffer* val)
  243. {
  244.     // if the return value is ZERO then the operation failed
  245.     return m_pPropDB->AddStr(new_prop, val);
  246. }
  247. /************************************************************************
  248.  *  Method:
  249.  *      IHXRegistry::GetStrByXYZ
  250.  *  Purpose:
  251.  *      Retreive an STRING value from the registry given its Property
  252.  *  name "pcName" or by its id "id". If the Property 
  253.  *  is found, it will return HXR_OK, otherwise it returns HXR_FAIL.
  254.  */
  255. STDMETHODIMP
  256. HXClientRegistry::GetStrByName(const char* prop_name, REF(IHXBuffer*) val) const
  257. {
  258.     val = NULL;
  259.     return m_pPropDB->GetStr(prop_name, 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::GetStrById(const UINT32 hash_key, REF(IHXBuffer*) val) const
  271. {
  272.     val = NULL;
  273.     return m_pPropDB->GetStr(hash_key, val);
  274. }
  275. /************************************************************************
  276.  *  Method:
  277.  *      IHXRegistry::SetStrByXYZ
  278.  *  Purpose:
  279.  *      Modify a Property's STRING value in the registry given the
  280.  *  Property's name "pcName" or its id "id". If the value 
  281.  *  was set, it will return HXR_OK, otherwise it returns HXR_FAIL.
  282.  */
  283. STDMETHODIMP
  284. HXClientRegistry::SetStrByName(const char* prop_name, IHXBuffer* val)
  285. {
  286.     return m_pPropDB->SetStr(prop_name, val);
  287. }
  288. /************************************************************************
  289.  *  Method:
  290.  *      IHXRegistry::SetStrByXYZ
  291.  *  Purpose:
  292.  *      Modify a Property's STRING value in the registry given the
  293.  *  Property's name "pcName" or its id "id". If the value 
  294.  *  was set, it will return HXR_OK, otherwise it returns HXR_FAIL.
  295.  */
  296. STDMETHODIMP
  297. HXClientRegistry::SetStrById(const UINT32 hash_key, IHXBuffer* val)
  298. {
  299.     return m_pPropDB->SetStr(hash_key, val);
  300. }
  301. /************************************************************************
  302.  *  Method:
  303.  *      IHXRegistry::AddBuf
  304.  *  Purpose:
  305.  *      Add an BUFFER property with name in "pcName" and value in 
  306.  *  "pValue" to the registry.
  307.  */
  308. STDMETHODIMP_(UINT32)
  309. HXClientRegistry::AddBuf(const char* new_prop, IHXBuffer* p_buf)
  310. {
  311.     // if the return value is ZERO then the operation failed
  312.     return m_pPropDB->AddBuf(new_prop, p_buf);
  313. }
  314. /************************************************************************
  315.  *  Method:
  316.  *      IHXRegistry::GetBufByName
  317.  *  Purpose:
  318.  *      Retreive the BUFFER from the registry given its Property
  319.  *  name "pcName" or its id "id". If the Property 
  320.  *  is found, it will return HXR_OK, otherwise it returns HXR_FAIL.
  321.  */
  322. STDMETHODIMP
  323. HXClientRegistry::GetBufByName(const char* prop_name, IHXBuffer*& pp_buf) const
  324. {
  325.     // if the return value is ZERO then the operation failed
  326.     return m_pPropDB->GetBuf(prop_name, &pp_buf);
  327. }
  328. /************************************************************************
  329.  *  Method:
  330.  *      IHXRegistry::GetBufById
  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::GetBufById(const UINT32 hash_key, IHXBuffer*& pp_buf) const
  338. {
  339.     // if the return value is ZERO then the operation failed
  340.     return m_pPropDB->GetBuf(hash_key, &pp_buf);
  341. }
  342. /************************************************************************
  343.  *  Method:
  344.  *      IHXRegistry::SetBufByXYZ
  345.  *  Purpose:
  346.  *      Modify a Property's BUFFER in the registry given the
  347.  *  Property's name "pcName" or its id "id". If the value 
  348.  *  was set, it will return HXR_OK, otherwise it returns HXR_FAIL.
  349.  */
  350. STDMETHODIMP
  351. HXClientRegistry::SetBufByName(const char* prop_name, IHXBuffer* p_buf)
  352. {
  353.     // if the return value is ZERO then the operation failed
  354.     return m_pPropDB->SetBuf(prop_name, p_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::SetBufById(const UINT32 hash_key, IHXBuffer* p_buf)
  366. {
  367.     // if the return value is ZERO then the operation failed
  368.     return m_pPropDB->SetBuf(hash_key, p_buf);
  369. }
  370. /************************************************************************
  371.  *  Method:
  372.  *      IHXRegistry::AddIntRef
  373.  *  Purpose:
  374.  *      Add an INTEGER REFERENCE property with name in "pcName" and 
  375.  *  value in "iValue" to the registry. This property allows the user
  376.  *  to modify its contents directly, without having to go through the
  377.  *  registry.
  378.  */
  379. STDMETHODIMP_(UINT32)
  380. HXClientRegistry::AddIntRef(const char* new_prop, INT32* val)
  381. {
  382.     return m_pPropDB->AddIntRef(new_prop, val);
  383. }
  384. /************************************************************************
  385.  *  Method:
  386.  *      IHXRegistry::DeleteByXYZ
  387.  *  Purpose:
  388.  *      Delete a Property from the registry using its name "pcName"
  389.  *  or id "id".
  390.  */
  391. STDMETHODIMP_(UINT32)
  392. HXClientRegistry::DeleteByName(const char* prop_name)
  393. {
  394.     // if the return value is ZERO then the operation failed
  395.     return m_pPropDB->Del(prop_name);
  396. }
  397. /************************************************************************
  398.  *  Method:
  399.  *      IHXRegistry::DeleteByXYZ
  400.  *  Purpose:
  401.  *      Delete a Property from the registry using its name "pcName"
  402.  *  or id "id".
  403.  */
  404. STDMETHODIMP_(UINT32)
  405. HXClientRegistry::DeleteById(const UINT32 hash_key)
  406. {
  407.     // if the return value is ZERO then the operation failed
  408.     return m_pPropDB->Del(hash_key);
  409. }
  410. /************************************************************************
  411.  *  Method:
  412.  *      IHXRegistry::GetType
  413.  *  Purpose:
  414.  *      Returns the datatype of the Property given its name "pcName"
  415.  *  or its id "id".
  416.  */
  417. STDMETHODIMP_(HXPropType)
  418. HXClientRegistry::GetTypeByName(const char* prop_name) const
  419. {
  420.     return m_pPropDB->GetType(prop_name);
  421. }
  422. /************************************************************************
  423.  *  Method:
  424.  *      IHXRegistry::GetType
  425.  *  Purpose:
  426.  *      Returns the datatype of the Property given its name "pcName"
  427.  *  or its id "id".
  428.  */
  429. STDMETHODIMP_(HXPropType)
  430. HXClientRegistry::GetTypeById(const UINT32 hash_key) const
  431. {
  432.     return m_pPropDB->GetType(hash_key);
  433. }
  434. /************************************************************************
  435.  *  Method:
  436.  *      IHXRegistry::FindParentIdByName
  437.  *  Purpose:
  438.  *      Returns the id value of the parent node of the Property
  439.  *  whose name (prop_name) or id (id) has been specified.
  440.  *  If it fails, a ZERO value is returned.
  441.  */
  442. STDMETHODIMP_(UINT32)
  443. HXClientRegistry::FindParentIdByName(const char* prop_name) const
  444. {
  445.     return m_pPropDB->FindParentKey(prop_name);
  446. }
  447. /************************************************************************
  448.  *  Method:
  449.  *      IHXRegistry::FindParentIdById
  450.  *  Purpose:
  451.  *      Returns the id value of the parent node of the Property
  452.  *  whose name (prop_name) or id (id) has been specified.
  453.  *  If it fails, a ZERO value is returned.
  454.  */
  455. STDMETHODIMP_(UINT32)
  456. HXClientRegistry::FindParentIdById(const UINT32 hash_key) const
  457. {
  458.     return m_pPropDB->FindParentKey(hash_key);
  459. }
  460. /************************************************************************
  461.  *  Method:
  462.  *      HXRegistry::GetPropName
  463.  *  Purpose:
  464.  *      Returns the Property name in the ppcName char buffer passed
  465.  *  as a parameter, given the Property's id "ulId".
  466.  */
  467. STDMETHODIMP
  468. HXClientRegistry::GetPropName(const UINT32 id, IHXBuffer*& prop_name) const
  469. {
  470.     return m_pPropDB->GetPropName(id, prop_name);
  471. }
  472. /************************************************************************
  473.  *  Method:
  474.  *      HXRegistry::GetId
  475.  *  Purpose:
  476.  *      Returns the Property's id given the Property name.
  477.  */
  478. STDMETHODIMP_(UINT32)
  479. HXClientRegistry::GetId(const char* prop_name) const
  480. {
  481.     return m_pPropDB->GetId(prop_name);
  482. }
  483. /************************************************************************
  484.  *  Method:
  485.  *      IHXRegistry::GetPropListOfRoot
  486.  *  Purpose:
  487.  *      It returns back a list of Properties as an IHXValues (prop_name
  488.  *  and its id pair) at the root level of the registry's hierarchy.
  489.  */
  490. STDMETHODIMP
  491. HXClientRegistry::GetPropListOfRoot(IHXValues*& pValues) const
  492. {
  493.     return m_pPropDB->GetPropList(pValues);
  494. }
  495. /************************************************************************
  496.  *  Method:
  497.  *      IHXRegistry::GetPropListByName
  498.  *  Purpose:
  499.  *      Returns a list of Properties immediately under the one with
  500.  *  name "pcName" or id "id".
  501.  */
  502. STDMETHODIMP
  503. HXClientRegistry::GetPropListByName(const char* prop_name, 
  504.                                     IHXValues*& pValues) const
  505. {
  506.     return m_pPropDB->GetPropList(prop_name, pValues);
  507. }
  508. /************************************************************************
  509.  *  Method:
  510.  *      IHXRegistry::GetPropListById
  511.  *  Purpose:
  512.  *      Returns a list of Properties immediately under the one with
  513.  *  name "pcName" or id "id".
  514.  */
  515. STDMETHODIMP
  516. HXClientRegistry::GetPropListById(const UINT32 hash_key,
  517.                                   IHXValues*& pValues) const
  518. {
  519.     return m_pPropDB->GetPropList(hash_key, pValues);
  520. }
  521. /************************************************************************
  522.  *  Method:
  523.  *      IHXRegistry::GetNumPropsAtRoot
  524.  *  Purpose:
  525.  *      Returns the count of the number of Properties within the
  526.  *  registry. If a property name of id is specified, then it
  527.  *  returns the number of Properties under it.
  528.  */
  529. STDMETHODIMP_(INT32)
  530. HXClientRegistry::GetNumPropsAtRoot() const
  531. {
  532.     return m_pPropDB->Count();
  533. }
  534. /************************************************************************
  535.  *  Method:
  536.  *      IHXRegistry::GetNumPropsByName
  537.  *  Purpose:
  538.  *      Returns the count of the number of Properties within the
  539.  *  registry. If a property name of id is specified, then it
  540.  *  returns the number of Properties under it.
  541.  */
  542. STDMETHODIMP_(INT32)
  543. HXClientRegistry::GetNumPropsByName(const char* prop_name) const
  544. {
  545.     return m_pPropDB->Count(prop_name);
  546. }
  547. /************************************************************************
  548.  *  Method:
  549.  *      IHXRegistry::GetNumPropsById
  550.  *  Purpose:
  551.  *      Returns the count of the number of Properties within the
  552.  *  registry. If a property name of id is specified, then it
  553.  *  returns the number of Properties under it.
  554.  */
  555. STDMETHODIMP_(INT32)
  556. HXClientRegistry::GetNumPropsById(const UINT32 hash_key) const
  557. {
  558.     return m_pPropDB->Count(hash_key);
  559. }