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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: dbindex.cpp,v 1.1.1.1.50.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 "dbindex.h"
  50. #include "ihxpckts.h"
  51.       
  52. // XXXND  FIX  Is there a better size for this?       
  53. const UINT32 kInitHashTableSize = 47;
  54. //---------------------- CPluginDatabaseIndex
  55. CPluginDatabaseIndex::CPluginDatabaseIndex()
  56. {
  57. }
  58. // static 
  59. CPluginDatabaseIndex* CPluginDatabaseIndex::CreateIndex( EPluginIndexType indexType )
  60. {
  61.     CPluginDatabaseIndex* pNewIndex = NULL;
  62.     switch( indexType )
  63.     {
  64. case kIndex_StringType:
  65.     pNewIndex = new CPluginDatabaseIndexString();
  66.     break;
  67. case kIndex_GUIDType:
  68.     pNewIndex = new CPluginDatabaseIndexGUID();
  69.     break;
  70.     }
  71.     return pNewIndex;
  72. }
  73. //---------------------- CPluginDatabaseIndexGUID
  74. CPluginDatabaseIndexGUID::CPluginDatabaseIndexGUID()
  75. {
  76.     m_mapGUIDToIUnknown.InitHashTable( kInitHashTableSize, FALSE );
  77. }
  78. CPluginDatabaseIndexGUID::~CPluginDatabaseIndexGUID()
  79. {
  80.     Reset();
  81. }
  82. HX_RESULT CPluginDatabaseIndexGUID::AddItem( IHXBuffer* pData, IUnknown* pIUnknown )
  83. {
  84.     HX_RESULT result = HXR_FAIL;
  85.     if( pData && pIUnknown )
  86.     {
  87. // Treat the stuff in pData like a GUID
  88. GUID* pGUID = (GUID*) pData->GetBuffer();
  89. void* pValue = NULL;
  90. if( !m_mapGUIDToIUnknown.Lookup( *pGUID, pValue ) )
  91. {
  92.     m_mapGUIDToIUnknown.SetAt( *pGUID, pIUnknown );
  93.     pIUnknown->AddRef();
  94.     result = HXR_OK;
  95. }
  96.     }
  97.     return result;
  98. }
  99. HX_RESULT CPluginDatabaseIndexGUID::FindItem( const void* pData, IUnknown** pIUnknown )
  100. {
  101.     HX_RESULT result = HXR_FAIL;
  102.     if( pIUnknown )
  103.     {
  104.      *pIUnknown = NULL;
  105. void* pValue = NULL;
  106. if( m_mapGUIDToIUnknown.Lookup( *(GUID*) pData, pValue ) )
  107. {
  108.     *pIUnknown = (IUnknown*) pValue;
  109.     (*pIUnknown)->AddRef();
  110.     
  111.     result = HXR_OK;
  112. }
  113.     }
  114.     return result;
  115. }
  116. HX_RESULT CPluginDatabaseIndexGUID::RemoveItem( IUnknown* pIValue )
  117. {
  118.     HX_RESULT result = HXR_FAIL;
  119.     CHXMapGUIDToObj::Iterator iter = m_mapGUIDToIUnknown.Begin();
  120.     CHXMapGUIDToObj::Iterator iterEnd = m_mapGUIDToIUnknown.End();
  121.     for( ; iter != iterEnd; ++iter )
  122.     {
  123. // Get the IUnknown 
  124. if( pIValue == (IUnknown*)(*iter) )
  125. {
  126.     if( m_mapGUIDToIUnknown.RemoveKey( *iter.get_key() ) )
  127.     {
  128. HX_RELEASE(pIValue);
  129. result = HXR_OK;
  130.     }
  131.     break;
  132. }
  133.     }
  134.     return result;
  135. }
  136. void CPluginDatabaseIndexGUID::Reset()
  137. {
  138.     CHXMapGUIDToObj::Iterator iter = m_mapGUIDToIUnknown.Begin();
  139.     CHXMapGUIDToObj::Iterator iterEnd = m_mapGUIDToIUnknown.End();
  140.     for( ; iter != iterEnd; ++iter )
  141.     {
  142. // Get the IUnknown 
  143. IUnknown* pUnknown = (IUnknown*)(*iter);
  144. HX_RELEASE(pUnknown);
  145.     }
  146.     m_mapGUIDToIUnknown.RemoveAll();
  147. }
  148. //------------------------------ CPluginDatabaseIndexString
  149. CPluginDatabaseIndexString::CPluginDatabaseIndexString()
  150. {
  151. }
  152. CPluginDatabaseIndexString::~CPluginDatabaseIndexString()
  153. {
  154.     Reset();
  155. }
  156. HX_RESULT CPluginDatabaseIndexString::AddItem( IHXBuffer* pData, IUnknown* pIUnknown )
  157. {
  158.     HX_RESULT result = HXR_FAIL;
  159.     if( pData && pIUnknown )
  160.     {
  161. const char *pCharData = (const char*) pData->GetBuffer();
  162. void* pValue = NULL;
  163. if( !m_mapStrToIUnknown.Lookup( pCharData, pValue ) )
  164. {
  165.     m_mapStrToIUnknown.SetAt( pCharData, pIUnknown );
  166.     pIUnknown->AddRef();
  167.     result = HXR_OK;
  168. }
  169.     }
  170.     return result;
  171. }
  172. HX_RESULT CPluginDatabaseIndexString::FindItem( const void* pData, IUnknown** pIUnknown )
  173. {
  174.     HX_RESULT result = HXR_FAIL;
  175.     if( pIUnknown )
  176.     {
  177.      *pIUnknown = NULL;
  178. void* pValue = NULL;
  179. if( m_mapStrToIUnknown.Lookup( (const char*) pData, pValue ) )
  180. {
  181.     *pIUnknown = (IUnknown*) pValue;
  182.     (*pIUnknown)->AddRef();
  183.     
  184.     result = HXR_OK;
  185. }
  186.     }
  187.     return result;
  188. }
  189. HX_RESULT CPluginDatabaseIndexString::RemoveItem( IUnknown* pIValue )
  190. {
  191.     HX_RESULT result = HXR_FAIL;
  192.     CHXMapStringToOb::Iterator iter = m_mapStrToIUnknown.Begin();
  193.     CHXMapStringToOb::Iterator iterEnd = m_mapStrToIUnknown.End();
  194.     for( ; iter != iterEnd; ++iter )
  195.     {
  196. // Get the IUnknown 
  197. if( pIValue == (IUnknown*)(*iter) )
  198. {
  199.     if( m_mapStrToIUnknown.RemoveKey( iter.get_key() ) )
  200.     {
  201. HX_RELEASE(pIValue);
  202. result = HXR_OK;
  203.     }
  204.     break;
  205. }
  206.     }
  207.     return result;
  208. }
  209. void CPluginDatabaseIndexString::Reset()
  210. {
  211.     CHXMapStringToOb::Iterator iter = m_mapStrToIUnknown.Begin();
  212.     CHXMapStringToOb::Iterator iterEnd = m_mapStrToIUnknown.End();
  213.     for( ; iter != iterEnd; ++iter )
  214.     {
  215. // Get the IUnknown 
  216. IUnknown* pUnknown = (IUnknown*)(*iter);
  217. HX_RELEASE(pUnknown);
  218.     }
  219.     m_mapStrToIUnknown.RemoveAll();
  220. }