siteprxy.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 "hxwintyp.h"
  38. #include "hxmap.h"
  39. #include "hxwin.h"
  40. #include "chxxtype.h"
  41. #include "ihxpckts.h"
  42. #include "hxslist.h"
  43. #include "hxstrutl.h"
  44. #include "sitemgr.h"
  45. #include "siteprxy.h"
  46. #include "hxheap.h"
  47. #ifdef _DEBUG
  48. #undef HX_THIS_FILE
  49. static const char HX_THIS_FILE[] = __FILE__;
  50. #endif
  51. /*
  52.  * CHXSiteUserSupplierProxy methods
  53.  */
  54. /************************************************************************
  55.  *  Method:
  56.  *    Constructor
  57.  */
  58. CHXSiteUserSupplierProxy::CHXSiteUserSupplierProxy
  59. (
  60.     CHXSiteManager* pSiteMgr,
  61.     IHXSiteUserSupplier* pSUS,
  62.     const char* pRegionName
  63. )
  64.     : m_lRefCount(0)
  65.     , m_pSiteMgr(pSiteMgr)
  66.     , m_pSUS(pSUS)
  67.     , m_pRegionName(NULL)
  68. {
  69.     HX_ASSERT(m_pSiteMgr);
  70.     HX_ASSERT(m_pSUS);
  71.     HX_ASSERT(pRegionName);
  72.     m_pSiteMgr->AddRef();
  73.     m_pSUS->AddRef();
  74.     m_pRegionName = new_string(pRegionName);
  75. }
  76. /************************************************************************
  77.  *  Method:
  78.  *    Destructor
  79.  */
  80. CHXSiteUserSupplierProxy::~CHXSiteUserSupplierProxy()
  81. {
  82.     HX_RELEASE(m_pSiteMgr);
  83.     HX_RELEASE(m_pSUS);
  84.     HX_VECTOR_DELETE(m_pRegionName);
  85. }
  86. /************************************************************************
  87.  *  Method:
  88.  *    IUnknown::QueryInterface
  89.  */
  90. STDMETHODIMP 
  91. CHXSiteUserSupplierProxy::QueryInterface(REFIID riid, void** ppvObj)
  92. {
  93.     if (IsEqualIID(riid, IID_IHXSiteUserSupplier))
  94.     {
  95. AddRef();
  96. *ppvObj = (IHXSiteUserSupplier*)this;
  97. return HXR_OK;
  98.     }
  99.     else if (IsEqualIID(riid, IID_IUnknown))
  100.     {
  101. AddRef();
  102. *ppvObj = this;
  103. return HXR_OK;
  104.     }
  105.     return m_pSUS->QueryInterface(riid, ppvObj);
  106. }
  107. /************************************************************************
  108.  *  Method:
  109.  *    IUnknown::AddRef
  110.  */
  111. STDMETHODIMP_(ULONG32) 
  112. CHXSiteUserSupplierProxy::AddRef()
  113. {
  114.     return InterlockedIncrement(&m_lRefCount);
  115. }
  116. /************************************************************************
  117.  *  Method:
  118.  *    IUnknown::Release
  119.  */
  120. STDMETHODIMP_(ULONG32) 
  121. CHXSiteUserSupplierProxy::Release()
  122. {
  123.     if (InterlockedDecrement(&m_lRefCount) > 0)
  124.     {
  125.         return m_lRefCount;
  126.     }
  127.     delete this;
  128.     return 0;
  129. }
  130. /************************************************************************
  131.  *  Method:
  132.  *    IHXSiteUserSupplier::CreateSiteUser
  133.  */
  134. STDMETHODIMP 
  135. CHXSiteUserSupplierProxy::CreateSiteUser
  136. (
  137.     REF(IHXSiteUser*) pSiteUser
  138. )
  139. {
  140.     HX_RESULT rc = m_pSUS->CreateSiteUser(pSiteUser);
  141.     if(HXR_OK == rc)
  142.     {
  143. CHXSiteUserProxy* pProxy = 
  144.     new CHXSiteUserProxy(m_pSiteMgr, pSiteUser, m_pRegionName);
  145. if (pProxy)
  146. {
  147.     HX_RELEASE(pSiteUser);
  148.     rc = pProxy->QueryInterface(IID_IHXSiteUser, (void**)&pSiteUser);
  149. }
  150.     }
  151.     return rc;
  152. }
  153. /************************************************************************
  154.  *  Method:
  155.  *    IHXSiteUserSupplier::DestroySiteUser
  156.  */
  157. STDMETHODIMP 
  158. CHXSiteUserSupplierProxy::DestroySiteUser
  159. (
  160.     IHXSiteUser* pSiteUser
  161. )
  162. {
  163.     return m_pSUS->DestroySiteUser(pSiteUser);
  164. }
  165. /************************************************************************
  166.  *  Method:
  167.  *    IHXSiteUserSupplier::NeedsWindowedSites
  168.  */
  169. STDMETHODIMP_(BOOL) 
  170. CHXSiteUserSupplierProxy::NeedsWindowedSites()
  171. {
  172.     return m_pSUS->NeedsWindowedSites();
  173. }
  174. /*
  175.  * CHXSiteUserProxy methods
  176.  */
  177. /************************************************************************
  178.  *  Method:
  179.  *    Constructor
  180.  */
  181. CHXSiteUserProxy::CHXSiteUserProxy
  182. (
  183.     CHXSiteManager* pSiteMgr,
  184.     IHXSiteUser* pSU,
  185.     const char* pRegionName
  186. )
  187.     : m_lRefCount(0)
  188.     , m_pSiteMgr(pSiteMgr)
  189.     , m_pSU(pSU)
  190.     , m_pRegionName(NULL)
  191.     , m_pSite(NULL)
  192. {
  193.     HX_ASSERT(m_pSiteMgr);
  194.     HX_ASSERT(pRegionName);
  195.     HX_ASSERT(m_pSU);
  196.     m_pSU->AddRef();
  197.     m_pSiteMgr->AddRef();
  198.     m_pRegionName = new_string(pRegionName);
  199. }
  200. /************************************************************************
  201.  *  Method:
  202.  *    Destructor
  203.  */
  204. CHXSiteUserProxy::~CHXSiteUserProxy()
  205. {
  206.     HX_RELEASE(m_pSU);
  207.     HX_RELEASE(m_pSiteMgr);
  208.     HX_VECTOR_DELETE(m_pRegionName);
  209. }
  210. /************************************************************************
  211.  *  Method:
  212.  *    IUnknown::QueryInterface
  213.  */
  214. STDMETHODIMP 
  215. CHXSiteUserProxy::QueryInterface(REFIID riid, void** ppvObj)
  216. {
  217.     if (IsEqualIID(riid, IID_IHXSiteUser))
  218.     {
  219. AddRef();
  220. *ppvObj = (IHXSiteUser*)this;
  221. return HXR_OK;
  222.     }
  223.     else if (IsEqualIID(riid, IID_IUnknown))
  224.     {
  225. AddRef();
  226. *ppvObj = this;
  227. return HXR_OK;
  228.     }
  229.     return m_pSU->QueryInterface(riid, ppvObj);
  230. }
  231. /************************************************************************
  232.  *  Method:
  233.  *    IUnknown::AddRef
  234.  */
  235. STDMETHODIMP_(ULONG32) 
  236. CHXSiteUserProxy::AddRef()
  237. {
  238.     return InterlockedIncrement(&m_lRefCount);
  239. }
  240. /************************************************************************
  241.  *  Method:
  242.  *    IUnknown::Release
  243.  */
  244. STDMETHODIMP_(ULONG32) 
  245. CHXSiteUserProxy::Release()
  246. {
  247.     if (InterlockedDecrement(&m_lRefCount) > 0)
  248.     {
  249.         return m_lRefCount;
  250.     }
  251.     delete this;
  252.     return 0;
  253. }
  254. /************************************************************************
  255.  *  Method:
  256.  *    IHXSiteUser::AttachSite
  257.  */
  258. STDMETHODIMP 
  259. CHXSiteUserProxy::AttachSite
  260. (
  261.     IHXSite* pSite
  262. )
  263. {
  264.     m_pSite = pSite;
  265.     m_pSite->AddRef();
  266.     m_pSiteMgr->HookedSiteAdded(
  267. m_pRegionName, m_pSite);
  268.     HX_RESULT rc = m_pSU->AttachSite(pSite);
  269.     return rc;
  270. }
  271. /************************************************************************
  272.  *  Method:
  273.  *    IHXSiteUser::DetachSite
  274.  */
  275. STDMETHODIMP 
  276. CHXSiteUserProxy::DetachSite
  277. (
  278. )
  279. {
  280.     HX_RESULT rc = m_pSU->DetachSite();
  281.     m_pSiteMgr->HookedSiteRemoved(
  282. m_pRegionName, m_pSite);
  283.     HX_RELEASE(m_pSite);
  284.     return rc;
  285. }
  286. /************************************************************************
  287.  *  Method:
  288.  *    IHXSiteUser::HandleEvent
  289.  */
  290. STDMETHODIMP 
  291. CHXSiteUserProxy::HandleEvent
  292. (
  293.     HXxEvent* pEvent
  294. )
  295. {
  296.     // Assume that event has not been handled
  297.     // if it gets here - set the event OUT
  298.     // values in case somebody forgot to...
  299.     pEvent->result = HXR_OK;
  300.     pEvent->handled = FALSE;
  301.     HX_RESULT rc = m_pSiteMgr->HandleHookedEvent(
  302. m_pRegionName, m_pSite, pEvent);
  303.     if(HXR_OK == rc && !pEvent->handled)
  304.     {
  305. rc = m_pSU->HandleEvent(pEvent);
  306.     }
  307.     return rc;
  308. }
  309. /************************************************************************
  310.  *  Method:
  311.  *    IHXSiteUser::NeedsWindowedSites
  312.  */
  313. STDMETHODIMP_(BOOL) 
  314. CHXSiteUserProxy::NeedsWindowedSites()
  315. {
  316.     return m_pSU->NeedsWindowedSites();
  317. }