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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: statsmgr.cpp,v 1.7.8.1 2004/07/09 02:05:58 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 "hxtypes.h"
  50. #include "hxcom.h"
  51. #include <stdio.h>
  52. #include <stdlib.h>
  53. #include "hxcomm.h"
  54. #include "hxengin.h"
  55. #include "hxmon.h"
  56. #include "hxclreg.h"
  57. #include "chxpckts.h"
  58. #include "hxslist.h"
  59. #include "hxmap.h"
  60. #include "statsmgr.h"
  61. #include "hxstrutl.h"
  62. #include "hxheap.h"
  63. #ifdef _DEBUG
  64. #undef HX_THIS_FILE
  65. static const char HX_THIS_FILE[] = __FILE__;
  66. #endif
  67. StatsManager::StatsManager(HXClientRegistry* pRegistry,
  68.    UINT32 ulRegistryID,
  69.    UINT32 ulRepeatedRegistryID)
  70. {
  71.     m_pStatsMap = new CHXMapLongToObj;
  72.     
  73.     HX_RESULT     hr = HXR_OK;
  74.     IHXBuffer*     pBuffer = NULL;
  75.     m_lRefCount = 0;
  76.     if (!pRegistry)
  77.     {
  78. hr = HXR_FAILED;
  79. goto cleanup;
  80.     }
  81.     m_pRegistry = pRegistry;
  82.     m_pRegistry->AddRef();
  83.     if (HXR_OK == m_pRegistry->GetPropName(ulRepeatedRegistryID, pBuffer))
  84.     {
  85. m_ulOffset = pBuffer->GetSize();
  86.     }
  87.     HX_RELEASE(pBuffer);
  88.     if (HXR_OK == m_pRegistry->GetPropName(ulRegistryID, pBuffer))
  89.     {
  90. m_pRegistryName = new char[pBuffer->GetSize() + 1];
  91. strcpy(m_pRegistryName, (const char*)pBuffer->GetBuffer()); /* Flawfinder: ignore */
  92.     }
  93.     HX_RELEASE(pBuffer);
  94.     m_ulRegistryID = ulRegistryID;
  95.     m_ulRepeatedRegistryID = m_ulRepeatedRegistryID;
  96.     m_pPropWatchList = new CHXSimpleList();
  97.     if (HXR_OK != SetWatch(ulRepeatedRegistryID))
  98.     {
  99. hr = HXR_UNEXPECTED;
  100. goto cleanup;
  101.     }
  102. cleanup:
  103.     return;
  104. }
  105. StatsManager::~StatsManager()
  106. {
  107.     HX_VECTOR_DELETE(m_pRegistryName);
  108.     HX_RELEASE(m_pRegistry);
  109.     HX_DELETE(m_pStatsMap);
  110. }
  111. /////////////////////////////////////////////////////////////////////////
  112. //  Method:
  113. //      HXRegistry::QueryInterface
  114. //  Purpose:
  115. //      Implement this to export the interfaces supported by your
  116. //      object.
  117. //
  118. STDMETHODIMP
  119. StatsManager::QueryInterface(REFIID riid, void** ppvObj)
  120. {
  121.     QInterfaceList qiList[] =
  122.         {
  123.             { GET_IIDHANDLE(IID_IHXPropWatchResponse), (IHXPropWatchResponse*)this },
  124.             { GET_IIDHANDLE(IID_IUnknown), (IUnknown*)this },
  125.         };
  126.     
  127.     return ::QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);
  128. }   
  129. /////////////////////////////////////////////////////////////////////////
  130. //  Method:
  131. //      HXRegistry::AddRef
  132. //  Purpose:
  133. //      Everyone usually implements this the same... feel free to use
  134. //      this implementation.
  135. //
  136. STDMETHODIMP_(ULONG32)
  137. StatsManager::AddRef()
  138. {
  139.     return InterlockedIncrement(&m_lRefCount);
  140. }   
  141. /////////////////////////////////////////////////////////////////////////
  142. //  Method:
  143. //      HXRegistry::Release
  144. //  Purpose:
  145. //      Everyone usually implements this the same... feel free to use
  146. //      this implementation.
  147. //
  148. STDMETHODIMP_(ULONG32)
  149. StatsManager::Release()
  150. {
  151.     if (InterlockedDecrement(&m_lRefCount) > 0)
  152.     {
  153.         return m_lRefCount;
  154.     }
  155.     
  156.     delete this;
  157.     return 0;
  158. }   
  159. HX_RESULT
  160. StatsManager::DoCleanup()
  161. {
  162.     HX_RESULT hr = HXR_OK;
  163.     CHXSimpleList::Iterator i;
  164.     CHXMapLongToObj::Iterator j;
  165.     if (m_pPropWatchList)
  166.     {
  167. PropWatchEntry*  pPropWatchEntry = NULL;
  168. i = m_pPropWatchList->Begin();
  169. for (; i != m_pPropWatchList->End(); ++i)
  170. {
  171.     pPropWatchEntry = (PropWatchEntry*)(*i);
  172.     
  173.     pPropWatchEntry->pPropWatch->ClearWatchById(pPropWatchEntry->ulPropID);
  174.     HX_RELEASE(pPropWatchEntry->pPropWatch);
  175.     HX_DELETE(pPropWatchEntry);
  176. }
  177. HX_DELETE(m_pPropWatchList);
  178.     }
  179.     StatsMapEntry* pEntry = NULL;
  180.     j = m_pStatsMap->Begin();
  181.     for (; j != m_pStatsMap->End(); ++j)
  182.     {
  183. pEntry = (StatsMapEntry*)(*j);
  184. HX_DELETE(pEntry);
  185.     }
  186.     m_pStatsMap->RemoveAll();
  187.     return hr;
  188. }
  189. HX_RESULT
  190. StatsManager::Copy()
  191. {
  192.     HX_RESULT     hr = HXR_OK;
  193.     INT32     lValue = 0;
  194.     IHXBuffer*     pName = NULL;
  195.     IHXBuffer*     pBuffer = NULL;
  196.     StatsMapEntry*  pEntry = NULL;
  197.     CHXMapLongToObj::Iterator i;
  198.     i = m_pStatsMap->Begin();
  199.     for (; i != m_pStatsMap->End(); ++i)
  200.     {
  201. pEntry = (StatsMapEntry*)(*i);
  202. switch(pEntry->type)
  203. {
  204.     case PT_INTEGER:
  205. m_pRegistry->GetIntById(pEntry->ulFrom, lValue);     
  206. m_pRegistry->SetIntById(pEntry->ulTo, lValue);
  207. break;
  208.     case PT_INTREF:
  209. m_pRegistry->GetIntById(pEntry->ulFrom, lValue);
  210. m_pRegistry->GetPropName(pEntry->ulTo, pName);
  211. m_pRegistry->AddIntRef((const char*)pName->GetBuffer(), &lValue);
  212. HX_RELEASE(pName);
  213. break;
  214.     case PT_STRING:
  215. if (HXR_OK == m_pRegistry->GetStrById(pEntry->ulFrom, pBuffer) &&
  216.     pBuffer)
  217. {
  218.     m_pRegistry->SetStrById(pEntry->ulTo, pBuffer);
  219. }
  220. HX_RELEASE(pBuffer);
  221. break;
  222.     case PT_BUFFER:
  223. if (HXR_OK == m_pRegistry->GetBufById(pEntry->ulFrom, pBuffer) &&
  224.     pBuffer)
  225. {
  226.     m_pRegistry->SetBufById(pEntry->ulTo, pBuffer);
  227. }
  228. HX_RELEASE(pBuffer);
  229. break;
  230.     default:
  231. break;
  232. }
  233.     }
  234.     return hr;
  235. }
  236.     
  237. HX_RESULT
  238. StatsManager::SetWatch(UINT32 ulRegistryID)
  239. {
  240.     HX_RESULT     hr = HXR_OK;
  241.     PropWatchEntry* pPropWatchEntry = NULL;
  242.     IHXPropWatch*  pPropWatch = NULL;
  243.     if (HXR_OK != m_pRegistry->CreatePropWatch(pPropWatch))
  244.     {
  245. hr = HXR_FAILED;
  246. goto cleanup;
  247.     }
  248.     if (HXR_OK != pPropWatch->Init((IHXPropWatchResponse*)this))
  249.     {
  250. hr = HXR_FAILED;
  251. goto cleanup;
  252.     }
  253.     pPropWatch->SetWatchById(ulRegistryID);
  254.     pPropWatchEntry = new PropWatchEntry;
  255.     pPropWatchEntry->ulPropID = ulRegistryID;
  256.     pPropWatchEntry->pPropWatch = pPropWatch;
  257.     m_pPropWatchList->AddTail(pPropWatchEntry);
  258. cleanup:
  259.     if (HXR_OK != hr)
  260.     {
  261. HX_RELEASE(pPropWatch);
  262. HX_DELETE(pPropWatchEntry);
  263.     }
  264.     return hr;
  265. }
  266. STDMETHODIMP
  267. StatsManager::AddedProp(const UINT32 ulHash,
  268. const HXPropType type,
  269. const UINT32 ulParentHash)
  270. {
  271.     HX_RESULT hr = HXR_OK;
  272.     INT32 lValue = 0;
  273.     UINT32 ulRegistryID = 0;
  274.     char szRegKeyName[MAX_DISPLAY_NAME] = {0}; /* Flawfinder: ignore */
  275.     HXPropType theType = PT_UNKNOWN;
  276.     IHXBuffer* pBuffer = NULL;
  277.     if (HXR_OK == m_pRegistry->GetPropName(ulHash, pBuffer))
  278.     {
  279. // apparently the type returned from IHXPropWatchReponse is always
  280. // PT_UNKNOWN !!
  281. theType = m_pRegistry->GetTypeById(ulHash);
  282. // exclude leading "Repeat.*."
  283. SafeSprintf(szRegKeyName, MAX_DISPLAY_NAME, "%s.%s", m_pRegistryName, (const char*)(pBuffer->GetBuffer() + m_ulOffset));
  284. HX_RELEASE(pBuffer);
  285. ulRegistryID = m_pRegistry->GetId(szRegKeyName);
  286. if (!ulRegistryID)
  287. {
  288.     switch (theType)
  289.     {
  290.     case PT_INTEGER:
  291. m_pRegistry->GetIntById(ulHash, lValue);     
  292. ulRegistryID = m_pRegistry->AddInt(szRegKeyName, lValue);
  293. break;
  294.     case PT_INTREF:
  295. m_pRegistry->GetIntById(ulHash, lValue);
  296. ulRegistryID = m_pRegistry->AddIntRef(szRegKeyName, &lValue);
  297. break;
  298.     case PT_STRING:
  299. m_pRegistry->GetStrById(ulHash, pBuffer);
  300. ulRegistryID = m_pRegistry->AddStr(szRegKeyName, pBuffer);
  301. HX_RELEASE(pBuffer);
  302. break;
  303.     case PT_BUFFER:
  304. m_pRegistry->GetBufById(ulHash, pBuffer);
  305. ulRegistryID = m_pRegistry->AddBuf(szRegKeyName, pBuffer);
  306. HX_RELEASE(pBuffer);
  307. break;
  308.     case PT_COMPOSITE:
  309. hr = m_pRegistry->AddComp(szRegKeyName);
  310. break;
  311.     default:
  312. break;
  313.     }
  314. }
  315. if (PT_COMPOSITE != theType)
  316. {
  317.     StatsMapEntry* pEntry = new StatsMapEntry;
  318.     pEntry->ulFrom = ulHash;
  319.     pEntry->ulTo = ulRegistryID;
  320.     pEntry->type = theType;
  321.     m_pStatsMap->SetAt((INT32)ulHash, pEntry);
  322. }
  323. else
  324. {
  325.     hr = SetWatch(ulHash);
  326. }
  327.     }
  328.     return hr;
  329. }
  330. STDMETHODIMP
  331. StatsManager::ModifiedProp(const UINT32 ulHash,
  332.    const HXPropType type,
  333.    const UINT32 ulParentHash)
  334. {
  335.     return HXR_OK;
  336. }
  337. STDMETHODIMP
  338. StatsManager::DeletedProp(const UINT32 ulHash,
  339.   const UINT32 ulParentHash)
  340. {
  341.     HX_RESULT hr = HXR_OK;
  342.     UINT32 ulRegistryID = 0;
  343.     char szRegKeyName[MAX_DISPLAY_NAME] = {0}; /* Flawfinder: ignore */
  344.     IHXBuffer* pBuffer = NULL;
  345.     if (HXR_OK == m_pRegistry->GetPropName(ulHash, pBuffer))
  346.     {
  347. // exclude leading "Repeat.*."
  348. SafeSprintf(szRegKeyName, MAX_DISPLAY_NAME, "%s.%s", m_pRegistryName, (const char*)(pBuffer->GetBuffer() + m_ulOffset));
  349. HX_RELEASE(pBuffer);
  350. ulRegistryID = m_pRegistry->GetId(szRegKeyName);
  351. if (ulRegistryID)
  352. {
  353.     m_pRegistry->DeleteById(ulRegistryID);
  354.     StatsMapEntry* pEntry = NULL;
  355.     if (m_pStatsMap->Lookup((INT32)ulHash, (void*&)pEntry))
  356.     {
  357. HX_DELETE(pEntry);
  358. m_pStatsMap->RemoveKey((INT32)ulHash);
  359.     }
  360. }
  361.     }
  362.     
  363.     return HXR_OK;
  364. }
  365. HX_RESULT
  366. StatsManager::UpdateRegistry(UINT32 ulRegistryID)
  367. {
  368.     IHXBuffer* pBuffer = NULL;
  369.     if (HXR_OK == m_pRegistry->GetPropName(ulRegistryID, pBuffer))
  370.     {
  371. HX_VECTOR_DELETE(m_pRegistryName);
  372. m_pRegistryName = new char[pBuffer->GetSize() + 1];
  373. strcpy(m_pRegistryName, (const char*)pBuffer->GetBuffer()); /* Flawfinder: ignore */
  374.     }
  375.     HX_RELEASE(pBuffer);
  376.     m_ulRegistryID = ulRegistryID;
  377.     return HXR_OK;
  378. }