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

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 "hxcom.h"
  36. #include "hxtypes.h"
  37. #include "ihxpckts.h"
  38. #include "upgrdcol.h"
  39. #include "stdlib.h"
  40. #include "hxordval.h"
  41. #include "hxbuffer.h"
  42. #include "hxstrutl.h"
  43. #include "hxheap.h"
  44. #ifdef _DEBUG
  45. #undef HX_THIS_FILE
  46. static const char HX_THIS_FILE[] = __FILE__;
  47. #endif
  48. #define UPGRADE_NAME_SIZE   128
  49. struct HXUpgradeInfo
  50. {
  51.     HXUpgradeType m_UpgradeType;
  52.     UINT32 m_MajorVersion;
  53.     UINT32 m_MinorVersion;
  54.     char m_Name[UPGRADE_NAME_SIZE]; /* Flawfinder: ignore */
  55. };
  56. const char* const z_szURLTranslationChars = ";/?:@=&x7F "<>#%{}|\^~[]'";
  57. HXUpgradeCollection::HXUpgradeCollection(void):
  58.     m_lRefCount(0),
  59.     m_pComponents(NULL),
  60.     m_pURLParseElements(NULL)
  61. {
  62. }
  63. HXUpgradeCollection::~HXUpgradeCollection(void)
  64. {
  65.     RemoveAll();
  66. }
  67. /************************************************************************
  68.  *  Method:
  69.  *    IUnknown::QueryInterface
  70.  */
  71. STDMETHODIMP HXUpgradeCollection::QueryInterface(REFIID riid,
  72. void** ppvObj)
  73. {
  74.     QInterfaceList qiList[] =
  75.         {
  76.             { GET_IIDHANDLE(IID_IHXUpgradeCollection), (IHXUpgradeCollection*)this },
  77.             { GET_IIDHANDLE(IID_IHXUpgradeCollection2), (IHXUpgradeCollection2*)this },
  78.             { GET_IIDHANDLE(IID_IUnknown), (IUnknown*)(IHXUpgradeCollection*)this },
  79.         };
  80.     
  81.     return ::QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);
  82. }
  83. /************************************************************************
  84.  *  Method:
  85.  *    IUnknown::AddRef
  86.  */
  87. STDMETHODIMP_(ULONG32) HXUpgradeCollection::AddRef(void)
  88. {
  89.     return InterlockedIncrement(&m_lRefCount);
  90. }
  91. /************************************************************************
  92.  *  Method:
  93.  *    IUnknown::Release
  94.  */
  95. STDMETHODIMP_(ULONG32) HXUpgradeCollection::Release(void)
  96. {
  97.     if (InterlockedDecrement(&m_lRefCount) > 0)
  98.     {
  99.         return m_lRefCount;
  100.     }
  101.     delete this;
  102.     return 0;
  103. }
  104. /************************************************************************
  105.  *  Method:
  106.  *    IHXUpgradeCollection::Add
  107.  */
  108. STDMETHODIMP_(UINT32) HXUpgradeCollection::Add(HXUpgradeType upgradeType, 
  109. IHXBuffer* pPluginId, UINT32 majorVersion, UINT32 minorVersion)
  110. {
  111.     if (!m_pComponents)
  112.     {
  113. m_pComponents = new CHXPtrArray;
  114. if (!m_pComponents)
  115. {
  116.     // XXXNH: should we return this? 0 would indicate success...
  117.     return (UINT32)-1;
  118. }
  119.     }
  120.     HXUpgradeInfo* pInfo = new HXUpgradeInfo;
  121.     pInfo->m_UpgradeType = upgradeType;
  122.     pInfo->m_MajorVersion = majorVersion;
  123.     pInfo->m_MinorVersion = minorVersion;
  124.     pInfo->m_Name[0] = 0;
  125.     if (pPluginId)
  126.      SafeStrCpy(&(pInfo->m_Name[0]), (const char*) pPluginId->GetBuffer(), UPGRADE_NAME_SIZE);
  127.     return(m_pComponents->Add(pInfo));
  128. }
  129. /************************************************************************
  130.  * Method:
  131.  * IHXUpgradeCollection::Remove
  132.  */
  133. STDMETHODIMP HXUpgradeCollection::Remove(UINT32 index)
  134. {
  135.     if (m_pComponents)
  136.     {
  137. if ((UINT32)m_pComponents->GetSize() > index)
  138. {
  139.     HXUpgradeInfo* pInfo = (HXUpgradeInfo*)(*m_pComponents)[(int)index];
  140.     m_pComponents->RemoveAt((int)index);
  141.     delete pInfo;
  142.     return(HXR_OK);
  143. }
  144.     }
  145.     return(HXR_FAIL);
  146. }
  147. /************************************************************************
  148.  * Method
  149.  * IHXUpgradeCollection::RemoveAll
  150.  */
  151. STDMETHODIMP HXUpgradeCollection::RemoveAll(void)
  152. {
  153.     if (m_pComponents)
  154.     {
  155. UINT32 size = m_pComponents->GetSize();
  156. for(UINT32 i = 0;i < size;i++)
  157.          delete (*m_pComponents)[(int)i];
  158. m_pComponents->RemoveAll();
  159. HX_DELETE(m_pComponents);
  160.     }
  161.     HX_RELEASE(m_pURLParseElements);
  162.     return(HXR_OK);
  163. }
  164. /************************************************************************
  165.  * Method:
  166.  * IHXUpgradeCollection::GetCount
  167.  */
  168. STDMETHODIMP_(UINT32) HXUpgradeCollection::GetCount(void)
  169. {
  170.     return m_pComponents ? (m_pComponents->GetSize()) : 0;
  171. }
  172. /************************************************************************
  173.  * Method:
  174.  * IHXUpgradeCollection::GetAt
  175.  */
  176. STDMETHODIMP HXUpgradeCollection::GetAt(UINT32 index, 
  177. HXUpgradeType& upgradeType, IHXBuffer* pPluginId, UINT32& majorVersion, 
  178. UINT32& minorVersion)
  179. {
  180.     if (m_pComponents)
  181.     {
  182. if ((UINT32)m_pComponents->GetSize() > index && pPluginId)
  183. {
  184.     HXUpgradeInfo* pInfo = (HXUpgradeInfo*)(*m_pComponents)[(int)index];
  185.     upgradeType = pInfo->m_UpgradeType;
  186.     majorVersion = pInfo->m_MajorVersion;
  187.     minorVersion = pInfo->m_MinorVersion;
  188.     pPluginId->Set((const UCHAR *)&(pInfo->m_Name[0]), ::strlen(&(pInfo->m_Name[0])) + 1);
  189.     return(HXR_OK);
  190. }
  191.     }
  192.     return(HXR_FAIL);
  193. }
  194. /************************************************************************
  195.  * Method:
  196.  * IHXUpgradeCollection::AddURLParseElement
  197.  * Purpose:
  198.  * Adds name-value pair for RUP URL parsing:
  199.  * URL-encoded values substitute names.
  200.  *
  201.  */
  202. STDMETHODIMP
  203. HXUpgradeCollection::AddURLParseElement(const char* pName, const char* pValue)
  204. {
  205.     if(!m_pURLParseElements)
  206.     {
  207. m_pURLParseElements = (IHXValues*)new CHXOrderedValues;
  208. if(m_pURLParseElements)
  209.     m_pURLParseElements->AddRef();
  210.     }
  211.     if(!m_pURLParseElements)
  212. return HXR_FAILED;
  213.     // We have to URL encode the Value as it's going to be used in RUP URLs.
  214.     IHXBuffer* pURLEncValue = new CHXBuffer;
  215.     if(pURLEncValue)
  216.     {
  217. pURLEncValue->AddRef();
  218. /* No URL-encoding is required any more since Core guarantees to 
  219.    only pass data that is already URL-encoded. (SB) */
  220. pURLEncValue->Set((const Byte*)pValue, strlen(pValue) + 1);
  221. /*
  222. // Maximum possible size for URL encoded pValue.
  223. pURLEncValue->SetSize(strlen(pValue) * 3 + 1);
  224. char* pszBuffer = (char*)pURLEncValue->GetBuffer();
  225. pszBuffer[0] = 0;
  226. for(UINT16 nIndex = 0; nIndex < strlen(pValue); nIndex++)
  227. {
  228.     Byte nChar = pValue[nIndex];
  229.     if(nChar <= 0x1F || nChar >= 0x80 && nChar <= 0xFF ||
  230.        strchr(z_szURLTranslationChars, nChar))
  231.     {
  232. wsprintf(pszBuffer + strlen(pszBuffer), "%%%02X", nChar);
  233.     }
  234.     else
  235.     {
  236. wsprintf(pszBuffer + strlen(pszBuffer), "%c", nChar);
  237.     }
  238. }
  239. // Reset the size
  240. pURLEncValue->SetSize(strlen(pszBuffer) + 1);
  241. */
  242. m_pURLParseElements->SetPropertyCString(pName, pURLEncValue);
  243.     }
  244.     HX_RELEASE(pURLEncValue);
  245.     return HXR_OK;
  246. }
  247. /************************************************************************
  248.  * Method:
  249.  * IHXUpgradeCollection::GetURLParseElements
  250.  * Purpose:
  251.  * Gets name-value pair for RUP URL parsing.
  252.  *
  253.  */
  254. STDMETHODIMP 
  255. HXUpgradeCollection::GetURLParseElements(REF(IHXValues*) pURLParseElements)
  256. {
  257.     pURLParseElements = m_pURLParseElements;
  258.     if(pURLParseElements)
  259.     {
  260. pURLParseElements->AddRef();
  261. return HXR_OK;
  262.     }
  263.     return HXR_FAILED;
  264. }