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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: hxmisus.cpp,v 1.5.20.1 2004/07/09 02:08:40 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 "hxcom.h"
  50. #include "hxtypes.h"
  51. #include "hxwintyp.h"
  52. #include "hxslist.h"
  53. #include "hxwin.h"
  54. #include "hxengin.h"
  55. #include "hxsite2.h"
  56. #include "ihxpckts.h"
  57. #include "hxvsurf.h"
  58. #include "hxmisus.h"
  59. #include "hxheap.h"
  60. #ifdef _DEBUG
  61. #undef HX_THIS_FILE
  62. static const char HX_THIS_FILE[] = __FILE__;
  63. #endif
  64. /************************************************************************
  65.  *  Method:
  66.  *    Constructor
  67.  */
  68. CHXMultiInstanceSiteUserSupplier::CHXMultiInstanceSiteUserSupplier()
  69.     : m_lRefCount(0)
  70.     , m_pSingleUser(NULL)
  71.     , m_bIsAttached(FALSE)
  72.     , m_pSurfaceBitmapInfo(NULL)
  73.     , m_bSetSizeHasBeenCalled(FALSE)
  74.     , m_bSetPositionHasBeenCalled(FALSE)
  75.     , m_bSetZOrderHasBeenCalled(FALSE)
  76.     , m_zorder(0)
  77.     , m_bIsInterrupSafe(FALSE)
  78. {
  79.     m_size.cx       = 0;
  80.     m_size.cy       = 0;
  81.     m_position.x    = 0;
  82.     m_position.y    = 0;
  83.     m_pSurfaceBitmapInfo = 0;
  84. }
  85. /************************************************************************
  86.  *  Method:
  87.  *    Destructor
  88.  */
  89. CHXMultiInstanceSiteUserSupplier::~CHXMultiInstanceSiteUserSupplier()
  90. {
  91.     CHXSimpleList::Iterator ndx = m_PassiveSiteWatchers.Begin();
  92.     for (; ndx != m_PassiveSiteWatchers.End(); ++ndx)
  93.     {
  94. IHXPassiveSiteWatcher* pWatcher =
  95.     (IHXPassiveSiteWatcher*)(*ndx);
  96. delete pWatcher;
  97.     }
  98.     m_PassiveSiteWatchers.RemoveAll();
  99.     HX_DELETE (m_pSurfaceBitmapInfo);
  100. }
  101. /************************************************************************
  102.  *  Method:
  103.  *    IUnknown::QueryInterface
  104.  */
  105. STDMETHODIMP 
  106. CHXMultiInstanceSiteUserSupplier::QueryInterface(REFIID riid, void** ppvObj)
  107. {
  108.     if (IsEqualIID(riid, IID_IHXVideoSurface2))
  109.     {
  110.         // All of our target site surfaces must support IHXVideoSurface2
  111.         // for this QI to succeed; this is required both for the proxy logic
  112.         // in this class as well as to signal to the renderer that it's using
  113.         // and old or 3rd party site. 
  114.         
  115.         CHXSimpleList::Iterator i = m_SiteUsers.Begin();
  116.         if (i != m_SiteUsers.End())
  117.         {
  118.             CHXMultiInstanceSiteUser* pSiteUser = (CHXMultiInstanceSiteUser*)(*i);
  119.             if (pSiteUser->m_pSite2)
  120.             {
  121.                 IHXVideoSurface* pFirstSurface;
  122.                 if (HXR_OK == pSiteUser->m_pSite2->GetVideoSurface(pFirstSurface))
  123.                 {
  124.                     IHXVideoSurface* pSecondSurface;
  125.                     if (HXR_OK == pFirstSurface->QueryInterface(riid, (void**) &pSecondSurface))
  126.                     {
  127.                         HX_RELEASE(pFirstSurface);
  128.                         HX_RELEASE(pSecondSurface);
  129.                         AddRef();
  130.                         *ppvObj = (IUnknown*)(IHXVideoSurface2*)this;
  131.                         return HXR_OK;
  132.                     }
  133.                     
  134.                     HX_RELEASE(pFirstSurface);
  135.                 }
  136.             }
  137.         }
  138.     }
  139.     QInterfaceList qiList[] =
  140.     {
  141.     { GET_IIDHANDLE(IID_IUnknown), (IUnknown*)(IHXSite*)this },
  142.     { GET_IIDHANDLE(IID_IHXVideoSurface), (IHXVideoSurface*) this },
  143.     { GET_IIDHANDLE(IID_IHXSite), (IHXSite*) this },
  144.     { GET_IIDHANDLE(IID_IHXSite2), (IHXSite2*) this },
  145.     { GET_IIDHANDLE(IID_IHXSiteEnumerator), (IHXSiteEnumerator*) this },
  146.     { GET_IIDHANDLE(IID_IHXSiteUserSupplier), (IHXSiteUserSupplier*) this },
  147.     { GET_IIDHANDLE(IID_IHXMultiInstanceSiteUserSupplier), (IHXMultiInstanceSiteUserSupplier*) this },
  148.     { GET_IIDHANDLE(IID_IHXInterruptSafe), (IHXInterruptSafe*) this },
  149.     };
  150.     if (QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj) == HXR_OK)
  151.     {
  152.     return HXR_OK;
  153.     }
  154.     else if (IsEqualIID(riid, IID_IHXValues)) //XXXCXZ
  155.     {
  156. if (m_pSingleUser)
  157. {
  158.     return m_pSingleUser->QueryInterface(IID_IHXValues, ppvObj);
  159. }
  160.     }
  161.     else if (IsEqualIID(riid, IID_IHXSiteWindowless))
  162.     {
  163. // check if the underlying implementation is the new one!
  164. CHXSimpleList::Iterator i = m_SiteUsers.Begin();
  165. if(i != m_SiteUsers.End())
  166. {
  167.     CHXMultiInstanceSiteUser* pSiteUser = 
  168. (CHXMultiInstanceSiteUser*)(*i);
  169.     if (pSiteUser->m_pSite)
  170.     {
  171. return pSiteUser->m_pSite->QueryInterface(riid, ppvObj);
  172.     }
  173. }
  174.     }
  175.     else if (IsEqualIID(riid, IID_IHXSubRectSite))
  176.     {
  177. //Check to see if this site support this new interface....
  178. CHXSimpleList::Iterator i = m_SiteUsers.Begin();
  179. if(i != m_SiteUsers.End())
  180. {
  181.     CHXMultiInstanceSiteUser* pSiteUser = (CHXMultiInstanceSiteUser*)(*i);
  182.     if(pSiteUser->m_pSite)
  183.     {
  184. return pSiteUser->m_pSite->QueryInterface(riid, ppvObj);
  185.     }
  186. }
  187.     }
  188.     else if (IsEqualIID(riid, IID_IHXKeyBoardFocus))
  189.     {
  190. CHXSimpleList::Iterator i = m_SiteUsers.Begin();
  191. if(i != m_SiteUsers.End())
  192. {
  193.     CHXMultiInstanceSiteUser* pSiteUser = (CHXMultiInstanceSiteUser*)(*i);
  194.     if(pSiteUser->m_pSite)
  195.     {
  196.                 // Return fhe first we find:
  197. if (SUCCEEDED(pSiteUser->m_pSite->QueryInterface(riid, ppvObj)))
  198.                 {
  199.                     return HXR_OK;
  200.                 }
  201.     }
  202. }
  203.     }
  204.     *ppvObj = NULL;
  205.     return HXR_NOINTERFACE;
  206. }
  207. /************************************************************************
  208.  *  Method:
  209.  *    IUnknown::AddRef
  210.  */
  211. STDMETHODIMP_(ULONG32) 
  212. CHXMultiInstanceSiteUserSupplier::AddRef()
  213. {
  214.     return InterlockedIncrement(&m_lRefCount);
  215. }
  216. /************************************************************************
  217.  *  Method:
  218.  *    IUnknown::Release
  219.  */
  220. STDMETHODIMP_(ULONG32) 
  221. CHXMultiInstanceSiteUserSupplier::Release()
  222. {
  223.     if (InterlockedDecrement(&m_lRefCount) > 0)
  224.     {
  225.         return m_lRefCount;
  226.     }
  227.     delete this;
  228.     return 0;
  229. }
  230. /************************************************************************
  231.  *  Method:
  232.  *    IHXSite::AttachUser
  233.  */
  234. STDMETHODIMP 
  235. CHXMultiInstanceSiteUserSupplier::AttachUser(IHXSiteUser* /*IN*/ pUser)
  236. {
  237.     return HXR_NOTIMPL;
  238. }
  239. /************************************************************************
  240.  *  Method:
  241.  *    IHXSite::DetachUser
  242.  */
  243. STDMETHODIMP 
  244. CHXMultiInstanceSiteUserSupplier::DetachUser()
  245. {
  246.     return HXR_NOTIMPL;
  247. }
  248. /************************************************************************
  249.  *  Method:
  250.  *    IHXSite::GetUser
  251.  */
  252. STDMETHODIMP 
  253. CHXMultiInstanceSiteUserSupplier::GetUser(REF(IHXSiteUser*) /*OUT*/ pUser)
  254. {
  255.     return HXR_NOTIMPL;
  256. }
  257. /************************************************************************
  258.  *  Method:
  259.  *    IHXSite::CreateChild
  260.  */
  261. STDMETHODIMP 
  262. CHXMultiInstanceSiteUserSupplier::CreateChild(REF(IHXSite*) /*OUT*/ pChildSite)
  263. {
  264.     return HXR_NOTIMPL;
  265. }
  266. /************************************************************************
  267.  *  Method:
  268.  *    IHXSite::DestroyChild
  269.  */
  270. STDMETHODIMP 
  271. CHXMultiInstanceSiteUserSupplier::DestroyChild(IHXSite* /*IN*/ pChildSite)
  272. {
  273.     return HXR_NOTIMPL;
  274. }
  275. /************************************************************************
  276.  *  Method:
  277.  *    IHXSite::SetSize
  278.  */
  279. STDMETHODIMP 
  280. CHXMultiInstanceSiteUserSupplier::SetSize(HXxSize size)
  281. {
  282.     m_bSetSizeHasBeenCalled = TRUE;
  283.     m_size = size;
  284.     CHXSimpleList::Iterator i = m_SiteUsers.Begin();
  285.     for ( ; i != m_SiteUsers.End(); ++i)
  286.     {
  287. CHXMultiInstanceSiteUser* pSiteUser = 
  288.     (CHXMultiInstanceSiteUser*)(*i);
  289. pSiteUser->m_pSite->SetSize(size);
  290.     }
  291.     CHXSimpleList::Iterator ndx = m_PassiveSiteWatchers.Begin();
  292.     for (; ndx != m_PassiveSiteWatchers.End(); ++ndx)
  293.     {
  294. IHXPassiveSiteWatcher* pWatcher =
  295.     (IHXPassiveSiteWatcher*)(*ndx);
  296. pWatcher->SizeChanged(&size);
  297.     }
  298.     
  299.     return HXR_OK;
  300. }
  301. /************************************************************************
  302.  *  Method:
  303.  *    IHXSite::SetPosition
  304.  */
  305. STDMETHODIMP 
  306. CHXMultiInstanceSiteUserSupplier::SetPosition(HXxPoint position)
  307. {
  308.     m_bSetPositionHasBeenCalled = TRUE;
  309.     m_position = position;
  310.     CHXSimpleList::Iterator i = m_SiteUsers.Begin();
  311.     for ( ; i != m_SiteUsers.End(); ++i)
  312.     {
  313. CHXMultiInstanceSiteUser* pSiteUser = 
  314.     (CHXMultiInstanceSiteUser*)(*i);
  315. pSiteUser->m_pSite->SetPosition(position);
  316.     }
  317.     
  318.     CHXSimpleList::Iterator ndx = m_PassiveSiteWatchers.Begin();
  319.     for (; ndx != m_PassiveSiteWatchers.End(); ++ndx)
  320.     {
  321. IHXPassiveSiteWatcher* pWatcher =
  322.     (IHXPassiveSiteWatcher*)(*ndx);
  323. pWatcher->PositionChanged(&position);
  324.     }
  325.     
  326.     return HXR_OK;
  327. }
  328. /************************************************************************
  329.  *  Method:
  330.  *    IHXSite::GetSize
  331.  */
  332. STDMETHODIMP 
  333. CHXMultiInstanceSiteUserSupplier::GetSize(REF(HXxSize) size)
  334. {
  335.     // We assume the first instance has the correct size and position.
  336.     CHXSimpleList::Iterator i = m_SiteUsers.Begin();
  337.     if(i != m_SiteUsers.End())
  338.     {
  339. CHXMultiInstanceSiteUser* pSiteUser = 
  340.     (CHXMultiInstanceSiteUser*)(*i);
  341. return pSiteUser->m_pSite->GetSize(size);
  342.     }
  343.     // If there is no actual instance, then use the cached size.
  344.     size = m_size;
  345.     return HXR_OK;
  346. }
  347. /************************************************************************
  348.  *  Method:
  349.  *    IHXSite::GetPosition
  350.  */
  351. STDMETHODIMP 
  352. CHXMultiInstanceSiteUserSupplier::GetPosition(REF(HXxPoint) position)
  353. {
  354.     // We assume the first instance has the correct size and position.
  355.     CHXSimpleList::Iterator i = m_SiteUsers.Begin();
  356.     if(i != m_SiteUsers.End())
  357.     {
  358. CHXMultiInstanceSiteUser* pSiteUser = 
  359.     (CHXMultiInstanceSiteUser*)(*i);
  360. return pSiteUser->m_pSite->GetPosition(position);
  361.     }
  362.     // If there is no actual instance, then use the cached position
  363.     position = m_position;
  364.     return HXR_OK;
  365. }
  366. /************************************************************************
  367.  *  Method:
  368.  *    IHXSite::DamageRect
  369.  */
  370. STDMETHODIMP 
  371. CHXMultiInstanceSiteUserSupplier::DamageRect(HXxRect rect)
  372. {
  373.     /*
  374.      * Coding this loop like this instead of using an iterator
  375.      * makes things slightly more thread safe. This fixes the known
  376.      * repro cases for bug 3787.
  377.      */
  378.     LISTPOSITION pos = m_SiteUsers.GetHeadPosition();
  379.     while(pos)
  380.     {
  381. CHXMultiInstanceSiteUser* pSiteUser = 
  382.     (CHXMultiInstanceSiteUser*)m_SiteUsers.GetNext(pos);
  383. if (pSiteUser)
  384.     pSiteUser->m_pSite->DamageRect(rect);
  385.     }
  386.    
  387.     return HXR_OK;
  388. }
  389. /************************************************************************
  390.  *  Method:
  391.  *    IHXSite::DamageRegion
  392.  */
  393. STDMETHODIMP 
  394. CHXMultiInstanceSiteUserSupplier::DamageRegion(HXxRegion region)
  395. {
  396.     /*
  397.      * Coding this loop like this instead of using an iterator
  398.      * makes things slightly more thread safe. This fixes the known
  399.      * repro cases for bug 3787.
  400.      */
  401.     LISTPOSITION pos = m_SiteUsers.GetHeadPosition();
  402.     while(pos)
  403.     {
  404. CHXMultiInstanceSiteUser* pSiteUser = 
  405.     (CHXMultiInstanceSiteUser*)m_SiteUsers.GetNext(pos);
  406. if (pSiteUser)
  407.     pSiteUser->m_pSite->DamageRegion(region);
  408.     }
  409.    
  410.     return HXR_OK;
  411. }
  412. /************************************************************************
  413.  *  Method:
  414.  *    IHXSite::ForceRedraw
  415.  */
  416. STDMETHODIMP 
  417. CHXMultiInstanceSiteUserSupplier::ForceRedraw()
  418. {
  419.     /*
  420.      * Coding this loop like this instead of using an iterator
  421.      * makes things slightly more thread safe. This fixes the known
  422.      * repro cases for bug 3787.
  423.      */
  424.     LISTPOSITION pos = m_SiteUsers.GetHeadPosition();
  425.     while(pos)
  426.     {
  427. CHXMultiInstanceSiteUser* pSiteUser = 
  428.     (CHXMultiInstanceSiteUser*)m_SiteUsers.GetNext(pos);
  429. if (pSiteUser)
  430.     pSiteUser->m_pSite->ForceRedraw();
  431.     }
  432.    
  433.     return HXR_OK;
  434. }
  435. /************************************************************************
  436.  *  Method:
  437.  *    IHXMultiInstanceSiteUserSupplier::SetSingleSiteUser
  438.  */
  439. STDMETHODIMP
  440. CHXMultiInstanceSiteUserSupplier::SetSingleSiteUser(IUnknown* pUnknown)
  441. {
  442.     if (HXR_OK != pUnknown->QueryInterface(IID_IHXSiteUser,(void**)&m_pSingleUser))
  443.     {
  444. return HXR_INVALID_PARAMETER;
  445.     }
  446.     return HXR_OK;
  447. }
  448. /************************************************************************
  449.  *  Method:
  450.  *    IHXMultiInstanceSiteUserSupplier::ReleaseSingleSiteUser
  451.  */
  452. STDMETHODIMP
  453. CHXMultiInstanceSiteUserSupplier::ReleaseSingleSiteUser()
  454. {
  455.     HX_RELEASE(m_pSingleUser);
  456.     return HXR_OK;
  457. }
  458. /************************************************************************
  459.  *  Method:
  460.  *    IHXSiteUserSupplier::CreateSiteUser
  461.  */
  462. STDMETHODIMP
  463. CHXMultiInstanceSiteUserSupplier::CreateSiteUser
  464. (
  465.     REF(IHXSiteUser*)/*OUT*/ pSiteUser
  466. )
  467. {
  468.     CHXMultiInstanceSiteUser* pMISU = new CHXMultiInstanceSiteUser(this);
  469.     if (!pMISU)
  470.     {
  471. return HXR_OUTOFMEMORY;
  472.     }
  473.     // This is our caller's ref.
  474.     pMISU->QueryInterface(IID_IHXSiteUser,(void**)&pSiteUser);
  475.     m_SiteUsers.AddTail(pSiteUser);
  476.     pSiteUser->AddRef(); // this is for the caller
  477.     
  478.     return HXR_OK;
  479. }
  480. /************************************************************************
  481.  *  Method:
  482.  *    IHXSiteUserSupplier::DestroySiteUser
  483.  */
  484. STDMETHODIMP
  485. CHXMultiInstanceSiteUserSupplier::DestroySiteUser
  486. (
  487.     IHXSiteUser* /*IN*/ pSiteUser
  488. )
  489. {
  490.     LISTPOSITION pos = m_SiteUsers.Find(pSiteUser);
  491.     if (!pos)
  492.     {
  493.         return HXR_INVALID_PARAMETER;
  494.     }
  495.     m_SiteUsers.RemoveAt(pos);
  496.     pSiteUser->Release();
  497.     // If this is the last of the multi-instance sites, then
  498.     // tell the real site user to detach.
  499.     if (m_SiteUsers.IsEmpty())
  500.     {
  501. AddRef();
  502. IHXSiteUser* pSingleUser = m_pSingleUser;
  503. pSingleUser->AddRef();
  504.         m_pSingleUser->DetachSite();
  505. pSingleUser->Release();
  506. m_bIsAttached = FALSE;
  507. Release();
  508.     }
  509.     return HXR_OK;
  510. }
  511. /************************************************************************
  512.  *  Method:
  513.  *    IHXSiteUserSupplier::NeedsWindowedSites
  514.  */
  515. STDMETHODIMP_(BOOL)
  516. CHXMultiInstanceSiteUserSupplier::NeedsWindowedSites()
  517. {
  518.     return FALSE;
  519. }
  520. /************************************************************************
  521.  *  Method:
  522.  *    IHXSite::AttachWatcher
  523.  */
  524. STDMETHODIMP 
  525. CHXMultiInstanceSiteUserSupplier::AttachWatcher(IHXSiteWatcher* /*IN*/ pWatcher)
  526. {
  527.     return HXR_NOTIMPL;
  528. }
  529. /************************************************************************
  530.  *  Method:
  531.  *    IHXSite::DetachWatcher
  532.  */
  533. STDMETHODIMP 
  534. CHXMultiInstanceSiteUserSupplier::DetachWatcher()
  535. {
  536.     return HXR_NOTIMPL;
  537. }
  538. /************************************************************************
  539.  *  Method:
  540.  *    IHXSite2::UpdateSiteWindow
  541.  */
  542. STDMETHODIMP
  543. CHXMultiInstanceSiteUserSupplier::UpdateSiteWindow(HXxWindow* /*IN*/ pWindow)
  544. {
  545.     CHXSimpleList::Iterator i = m_SiteUsers.Begin();
  546.     for ( ; i != m_SiteUsers.End(); ++i)
  547.     {
  548. CHXMultiInstanceSiteUser* pSiteUser = 
  549.     (CHXMultiInstanceSiteUser*)(*i);
  550. if (pSiteUser->m_pSite2)
  551. {
  552.     pSiteUser->m_pSite2->UpdateSiteWindow(pWindow);
  553. }
  554.     }
  555.     
  556.     return HXR_OK;
  557. }
  558. /************************************************************************
  559.  *  Method:
  560.  *    IHXSite2::ShowSite
  561.  */
  562. STDMETHODIMP
  563. CHXMultiInstanceSiteUserSupplier::ShowSite(BOOL bShow)
  564. {
  565.     return HXR_NOTIMPL;
  566. }
  567. /************************************************************************
  568.  *  Method:
  569.  *    IHXSite2::IsSiteVisible
  570.  */
  571. STDMETHODIMP_(BOOL)
  572. CHXMultiInstanceSiteUserSupplier::IsSiteVisible()
  573. {
  574.     // Not implemented
  575.     HX_ASSERT(0);
  576.     return FALSE;
  577. }
  578. /************************************************************************
  579.  *  Method:
  580.  *    IHXSite2::SetZOrder
  581.  */
  582. STDMETHODIMP
  583. CHXMultiInstanceSiteUserSupplier::SetZOrder(INT32 lZOrder)
  584. {
  585.     m_bSetZOrderHasBeenCalled = TRUE;
  586.     m_zorder = lZOrder;
  587.     
  588.     CHXSimpleList::Iterator i = m_SiteUsers.Begin();
  589.     for ( ; i != m_SiteUsers.End(); ++i)
  590.     {
  591. CHXMultiInstanceSiteUser* pSiteUser = 
  592.     (CHXMultiInstanceSiteUser*)(*i);
  593. if (pSiteUser->m_pSite2)
  594. {
  595.     pSiteUser->m_pSite2->SetZOrder(lZOrder);
  596. }
  597.     }
  598.     
  599.     return HXR_OK;
  600. }
  601. /************************************************************************
  602.  *  Method:
  603.  *    IHXSite2::GetZOrder
  604.  */
  605. STDMETHODIMP
  606. CHXMultiInstanceSiteUserSupplier::GetZOrder(REF(INT32) lZOrder)
  607. {
  608.     return HXR_NOTIMPL;
  609. }
  610. /************************************************************************
  611.  *  Method:
  612.  *    IHXSite2::MoveSiteToTop
  613.  */
  614. STDMETHODIMP
  615. CHXMultiInstanceSiteUserSupplier::MoveSiteToTop()
  616. {
  617.     CHXSimpleList::Iterator i = m_SiteUsers.Begin();
  618.     for ( ; i != m_SiteUsers.End(); ++i)
  619.     {
  620. CHXMultiInstanceSiteUser* pSiteUser = 
  621.     (CHXMultiInstanceSiteUser*)(*i);
  622. if (pSiteUser->m_pSite2)
  623. {
  624.     pSiteUser->m_pSite2->MoveSiteToTop();
  625. }
  626.     }
  627.     
  628.     return HXR_OK;
  629. }
  630. #if 0 
  631. /************************************************************************
  632.  *  Method:
  633.  *    IHXSite2::GetVideoSurface
  634.  */
  635. STDMETHODIMP
  636. CHXMultiInstanceSiteUserSupplier::GetVideoSurface(REF(IHXVideoSurface*) pSurface)
  637. {
  638.     CHXSimpleList::Iterator i = m_SiteUsers.Begin();
  639.     CHXMultiInstanceSiteUser* pSiteUser = (CHXMultiInstanceSiteUser*)(*i);
  640.     if (pSiteUser->m_pSite2)
  641.     {
  642. return pSiteUser->m_pSite2->GetVideoSurface(pSurface);
  643.     }
  644.     
  645.     return HXR_FAIL;
  646. }
  647. #endif
  648. /************************************************************************
  649.  *  Method:
  650.  *    IHXSite2::GetVideoSurface
  651.  */
  652. STDMETHODIMP
  653. CHXMultiInstanceSiteUserSupplier::GetVideoSurface(REF(IHXVideoSurface*) pSurface)
  654. {
  655.     // check to see if we have a video surface in any of our 
  656.     // sites 
  657.     IHXVideoSurface* pTempSurface;
  658.     for (CHXSimpleList::Iterator i = m_SiteUsers.Begin();
  659.  i!= m_SiteUsers.End(); ++i)
  660.     {
  661. CHXMultiInstanceSiteUser* pSiteUser = (CHXMultiInstanceSiteUser*)(*i);
  662. if (pSiteUser->m_pSite2)
  663. {
  664.     if (HXR_OK == pSiteUser->m_pSite2->GetVideoSurface(pTempSurface))
  665.     {
  666. // so we have a video sufrface in one of our sites 
  667. // good enough return HXR_OK.
  668. HX_RELEASE(pTempSurface);
  669. QueryInterface(IID_IHXVideoSurface, (void**) &pSurface);
  670. return HXR_OK;
  671.     }
  672. }
  673.      }
  674.     
  675.     return HXR_FAIL;
  676. }
  677. /************************************************************************
  678.  *  Method:
  679.  *    IHXSite2::GetNumberOfChildSites
  680.  */
  681. STDMETHODIMP_(UINT32)
  682. CHXMultiInstanceSiteUserSupplier::GetNumberOfChildSites()
  683. {
  684.     UINT32 ulChildSites = 0;
  685.     CHXSimpleList::Iterator i = m_SiteUsers.Begin();
  686.     for ( ; i != m_SiteUsers.End(); ++i)
  687.     {
  688. CHXMultiInstanceSiteUser* pSiteUser = 
  689.     (CHXMultiInstanceSiteUser*)(*i);
  690. ulChildSites += pSiteUser->m_pSite2->GetNumberOfChildSites();
  691.     }
  692.     return ulChildSites;
  693. }
  694. /************************************************************************
  695.  *  Method:
  696.  *    IHXSite2::AddPassiveSiteWatcher
  697.  */
  698. STDMETHODIMP
  699. CHXMultiInstanceSiteUserSupplier::AddPassiveSiteWatcher
  700. (
  701.     IHXPassiveSiteWatcher* pWatcher
  702. )
  703. {
  704.     HX_ASSERT(pWatcher);
  705.     pWatcher->AddRef();
  706.     m_PassiveSiteWatchers.AddTail(pWatcher);
  707.     return HXR_OK;
  708. }
  709. /************************************************************************
  710.  *  Method:
  711.  *    IHXSite2::DetachPassiveSiteWatcher
  712.  */
  713. STDMETHODIMP
  714. CHXMultiInstanceSiteUserSupplier::RemovePassiveSiteWatcher
  715. (
  716.     IHXPassiveSiteWatcher* pWatcher
  717. )
  718. {
  719.     LISTPOSITION pos = m_PassiveSiteWatchers.GetHeadPosition();
  720.     while(pos)
  721.     {
  722. IHXPassiveSiteWatcher* pThisWatcher = 
  723.     (IHXPassiveSiteWatcher*)m_PassiveSiteWatchers.GetAt(pos);
  724. if(pWatcher == pThisWatcher)
  725. {
  726.     pWatcher->Release();
  727.     m_PassiveSiteWatchers.RemoveAt(pos);
  728.     break;
  729. }
  730. m_PassiveSiteWatchers.GetNext(pos);
  731.     }
  732.     return HXR_OK;
  733. }
  734. /************************************************************************
  735.  *  Method:
  736.  *    IHXSite2::SetCursor
  737.  */
  738. STDMETHODIMP
  739. CHXMultiInstanceSiteUserSupplier::SetCursor
  740. (
  741.     HXxCursor cursor,
  742.     REF(HXxCursor) oldCursor
  743. )
  744. {
  745.     return HXR_NOTIMPL;
  746. }
  747. /*
  748.  * IHXSiteEnumerator methods 
  749.  */
  750. STDMETHODIMP 
  751. CHXMultiInstanceSiteUserSupplier::GetFirstSite  
  752. (
  753.     REF(IHXSite*) /* OUT */ pFirstSite,
  754.     REF(IHXSiteEnumerator::SitePosition) /* OUT */ nextPosition
  755. )
  756. {
  757.     nextPosition = m_SiteUsers.GetHeadPosition();  
  758.     if (nextPosition)
  759.     {
  760.         pFirstSite = ((CHXMultiInstanceSiteUser*) m_SiteUsers.GetNext(nextPosition))->m_pSite; 
  761.         if (pFirstSite)
  762.         {        
  763.             HX_ADDREF(pFirstSite);
  764.             return HXR_OK;
  765.         }
  766.     }
  767.     return HXR_FAIL;
  768. }
  769. STDMETHODIMP 
  770. CHXMultiInstanceSiteUserSupplier::GetNextSite   
  771. (
  772.     REF(IHXSite*) pNextSite,
  773.     REF(IHXSiteEnumerator::SitePosition) /* IN/OUT */ nextPosition
  774. )
  775. {
  776.     if (nextPosition)
  777.     {
  778.         pNextSite = ((CHXMultiInstanceSiteUser*) m_SiteUsers.GetNext(nextPosition))->m_pSite; 
  779.         if (pNextSite)
  780.         {
  781.             HX_ADDREF(pNextSite);
  782.             return HXR_OK;
  783.         }
  784.     }
  785.     return HXR_FAIL;
  786. }
  787. /************************************************************************
  788.  *  Method:
  789.  *    IHXVideoSurface::Blt
  790.  */
  791. STDMETHODIMP 
  792. CHXMultiInstanceSiteUserSupplier::Blt
  793. (UCHAR* /*IN*/ pImageBits, 
  794. HXBitmapInfoHeader*    /*IN*/ pBitmapInfo,
  795. REF(HXxRect) /*IN*/ rDestRect, 
  796. REF(HXxRect) /*IN*/ rSrcRect) 
  797. {           
  798.     HX_ASSERT(0);
  799.     return HXR_NOTIMPL;
  800. }
  801. /************************************************************************
  802.  *  Method:
  803.  *    IHXVideoSurface::BeginOptimizedBlt
  804.  */
  805. STDMETHODIMP
  806. CHXMultiInstanceSiteUserSupplier::BeginOptimizedBlt
  807. (
  808. HXBitmapInfoHeader*    /*IN*/ pBitmapInfo
  809. {
  810.     if (!pBitmapInfo)
  811. return HXR_FAIL;
  812.     HX_DELETE(m_pSurfaceBitmapInfo);
  813.     m_pSurfaceBitmapInfo = new HXBitmapInfoHeader;
  814.     memcpy(m_pSurfaceBitmapInfo, pBitmapInfo, sizeof(HXBitmapInfoHeader)); /* Flawfinder: ignore */
  815.     
  816.     HX_RESULT retVal = HXR_FAIL;
  817.     IHXVideoSurface* pTempSurface;
  818.     for (CHXSimpleList::Iterator i = m_SiteUsers.Begin();
  819.  i!= m_SiteUsers.End(); ++i)
  820.     {
  821. CHXMultiInstanceSiteUser* pSiteUser = (CHXMultiInstanceSiteUser*)(*i);
  822. if (pSiteUser->m_pSite2)
  823. {
  824.     if (HXR_OK == pSiteUser->m_pSite2->GetVideoSurface(pTempSurface))
  825.     {
  826. // so we have a video sufrface in one of our sites 
  827. // good enough return HXR_OK.
  828. if (HXR_OK == pTempSurface->BeginOptimizedBlt(pBitmapInfo))
  829. {
  830.     retVal = HXR_OK;
  831. }
  832. HX_RELEASE(pTempSurface);
  833.     }
  834. }
  835.      }
  836.     return retVal;
  837. }
  838. /************************************************************************
  839.  *  Method:
  840.  *    IHXVideoSurface::OptimizedBlt
  841.  */
  842. STDMETHODIMP 
  843. CHXMultiInstanceSiteUserSupplier::OptimizedBlt
  844. (
  845. UCHAR* /*IN*/ pImageBits,
  846. REF(HXxRect) /*IN*/ rDestRect, 
  847. REF(HXxRect) /*IN*/ rSrcRect
  848. )
  849. {
  850.     HX_ASSERT(0);
  851.     return HXR_NOTIMPL;
  852. }
  853. /************************************************************************
  854.  *  Method:
  855.  *    IHXVideoSurface::EndOptimizedBlt
  856.  */
  857. STDMETHODIMP 
  858. CHXMultiInstanceSiteUserSupplier::EndOptimizedBlt ()
  859. {
  860.     HX_RESULT retVal = HXR_FAIL;
  861.     IHXVideoSurface* pTempSurface;
  862.     for (CHXSimpleList::Iterator i = m_SiteUsers.Begin();
  863.  i!= m_SiteUsers.End(); ++i)
  864.     {
  865. CHXMultiInstanceSiteUser* pSiteUser = (CHXMultiInstanceSiteUser*)(*i);
  866. if (pSiteUser->m_pSite2)
  867. {
  868.     if (HXR_OK == pSiteUser->m_pSite2->GetVideoSurface(pTempSurface))
  869.     {
  870. // so we have a video sufrface in one of our sites 
  871. // good enough return HXR_OK.
  872. if (HXR_OK == pTempSurface->EndOptimizedBlt())
  873. {
  874.     HX_RELEASE(pTempSurface);
  875.     retVal = HXR_OK;
  876.     break;
  877. }
  878. HX_RELEASE(pTempSurface);
  879.     }
  880. }
  881.      }
  882.     return retVal;
  883. }
  884. /************************************************************************
  885.  *  Method:
  886.  *    IHXVideoSurface::GetOptimizedFormat
  887.  */
  888. STDMETHODIMP 
  889. CHXMultiInstanceSiteUserSupplier::GetOptimizedFormat
  890. (
  891.     REF(HX_COMPRESSION_TYPE) /*OUT*/ ulType
  892. )
  893. {
  894.     if (m_SiteUsers.IsEmpty())
  895. return HXR_FAIL;
  896.     HX_RESULT retVal = HXR_FAIL;
  897.     IHXVideoSurface* pTempSurface;
  898.     for (CHXSimpleList::Iterator i = m_SiteUsers.Begin();
  899.  i!= m_SiteUsers.End(); ++i)
  900.     {
  901. CHXMultiInstanceSiteUser* pSiteUser = (CHXMultiInstanceSiteUser*)(*i);
  902. if (pSiteUser->m_pSite2)
  903. {
  904.     if (HXR_OK == pSiteUser->m_pSite2->GetVideoSurface(pTempSurface))
  905.     {
  906. // so we have a video sufrface in one of our sites 
  907. // good enough return HXR_OK.
  908. if (HXR_OK == pTempSurface->GetOptimizedFormat(ulType))
  909. {
  910.     retVal = HXR_OK;
  911. }
  912. HX_RELEASE(pTempSurface);
  913.     }
  914. }
  915.      }
  916.     return retVal;
  917. }
  918. /************************************************************************
  919.  *  Method:
  920.  *    IHXVideoSurface::GetPreferredFormat
  921.  */
  922. STDMETHODIMP 
  923. CHXMultiInstanceSiteUserSupplier::GetPreferredFormat
  924. (
  925. REF(HX_COMPRESSION_TYPE) /*OUT*/ ulType
  926. )
  927. {
  928.     if (m_SiteUsers.IsEmpty())
  929. return HXR_FAIL;
  930.     HX_RESULT retVal = HXR_FAIL;
  931.     IHXVideoSurface* pTempSurface;
  932.     for (CHXSimpleList::Iterator i = m_SiteUsers.Begin();
  933.  i!= m_SiteUsers.End(); ++i)
  934.     {
  935. CHXMultiInstanceSiteUser* pSiteUser = (CHXMultiInstanceSiteUser*)(*i);
  936. if (pSiteUser->m_pSite2)
  937. {
  938.     if (HXR_OK == pSiteUser->m_pSite2->GetVideoSurface(pTempSurface))
  939.     {
  940. // so we have a video sufrface in one of our sites 
  941. // good enough return HXR_OK.
  942. if (HXR_OK == pTempSurface->GetPreferredFormat(ulType))
  943. {
  944.     HX_RELEASE(pTempSurface);
  945.     retVal = HXR_OK;
  946.     break;
  947. }
  948. HX_RELEASE(pTempSurface);
  949.     }
  950. }
  951.      }
  952.     return retVal;
  953. }
  954. /*
  955.  * IHXVideoSurface2 methods 
  956.  */
  957. STDMETHODIMP 
  958. CHXMultiInstanceSiteUserSupplier::SetProperties
  959. (
  960.     HXBitmapInfoHeader *bmi, REF(UINT32) ulNumBuffers, IHXRenderTimeLine *pClock
  961. )
  962. {
  963.     HX_RESULT result = HXR_OK;
  964.     for (CHXSimpleList::Iterator i = m_SiteUsers.Begin();
  965.  i!= m_SiteUsers.End(); ++i)
  966.     {
  967. CHXMultiInstanceSiteUser* pSiteUser = (CHXMultiInstanceSiteUser*)(*i);
  968. if (pSiteUser->m_pSite2)
  969. {
  970.             IHXVideoSurface* pVideoSurface;
  971.     if (SUCCEEDED(pSiteUser->m_pSite2->GetVideoSurface(pVideoSurface)))
  972.     {
  973.                 IHXVideoSurface2* pVideoSurface2;
  974.                 if (SUCCEEDED(pVideoSurface->QueryInterface(IID_IHXVideoSurface2,
  975.                                                             (void**) &pVideoSurface2)))
  976.                 {
  977.                     // Propagate all failures:
  978.                     HX_RESULT localResult = pVideoSurface2->SetProperties(bmi,
  979.                                                                           ulNumBuffers,
  980.                                                                           pClock);
  981.                     if (SUCCEEDED(result))
  982.                     {
  983.                         result = localResult;    
  984.                     }
  985.                     
  986.                     HX_RELEASE(pVideoSurface2);
  987.                 }
  988.                 HX_RELEASE(pVideoSurface);
  989.             }
  990.         }
  991.     }
  992.     return result;
  993. }
  994. STDMETHODIMP_(void) 
  995. CHXMultiInstanceSiteUserSupplier::Flush()    
  996. {
  997.     for (CHXSimpleList::Iterator i = m_SiteUsers.Begin();
  998.  i!= m_SiteUsers.End(); ++i)
  999.     {
  1000. CHXMultiInstanceSiteUser* pSiteUser = (CHXMultiInstanceSiteUser*)(*i);
  1001. if (pSiteUser->m_pSite2)
  1002. {
  1003.             IHXVideoSurface* pVideoSurface;
  1004.     if (SUCCEEDED(pSiteUser->m_pSite2->GetVideoSurface(pVideoSurface)))
  1005.     {
  1006.                 IHXVideoSurface2* pVideoSurface2;
  1007.                 if (SUCCEEDED(pVideoSurface->QueryInterface(IID_IHXVideoSurface2,
  1008.                                                             (void**) &pVideoSurface2)))
  1009.                 {
  1010.                     pVideoSurface2->Flush();
  1011.                     HX_RELEASE(pVideoSurface2);
  1012.                 }
  1013.                 HX_RELEASE(pVideoSurface);
  1014.             }
  1015.         }
  1016.     }
  1017. }
  1018. STDMETHODIMP   
  1019. CHXMultiInstanceSiteUserSupplier::ReleaseVideoMem(VideoMemStruct* pVidMem)
  1020. {
  1021.     HX_RESULT result = HXR_FAIL;
  1022.     for (CHXSimpleList::Iterator i = m_SiteUsers.Begin();
  1023.  i!= m_SiteUsers.End(); ++i)
  1024.     {
  1025. CHXMultiInstanceSiteUser* pSiteUser = (CHXMultiInstanceSiteUser*)(*i);
  1026. if (pSiteUser->m_pSite2)
  1027. {
  1028.             IHXVideoSurface* pVideoSurface;
  1029.     if (SUCCEEDED(pSiteUser->m_pSite2->GetVideoSurface(pVideoSurface)))
  1030.     {
  1031.                 IHXVideoSurface2* pVideoSurface2;
  1032.                 if (SUCCEEDED(pVideoSurface->QueryInterface(IID_IHXVideoSurface2,
  1033.                                                             (void**) &pVideoSurface2)))
  1034.                 {
  1035.                     // We just need one success:
  1036.                     result = pVideoSurface2->ReleaseVideoMem(pVidMem);
  1037.                     HX_RELEASE(pVideoSurface2);
  1038.                     if (SUCCEEDED(result))
  1039.                     {
  1040.                         break;   
  1041.                     }
  1042.                 }
  1043.                 HX_RELEASE(pVideoSurface);
  1044.             }
  1045.         }
  1046.     }
  1047.     return result;
  1048. }
  1049.                                  
  1050. STDMETHODIMP   
  1051. CHXMultiInstanceSiteUserSupplier::ColorConvert
  1052. (
  1053.     INT32 cidIn, 
  1054.     HXxSize *pSrcSize,
  1055.     HXxRect *prSrcRect,
  1056.     SourceInputStruct *pInput,
  1057.     INT32 cidOut,
  1058.     UCHAR *pDestBuffer, 
  1059.     HXxSize *pDestSize, 
  1060.     HXxRect *prDestRect, 
  1061.     int nDestPitch
  1062. )
  1063. {
  1064.     HX_RESULT result = HXR_FAIL;
  1065.     for (CHXSimpleList::Iterator i = m_SiteUsers.Begin();
  1066.  i!= m_SiteUsers.End(); ++i)
  1067.     {
  1068. CHXMultiInstanceSiteUser* pSiteUser = (CHXMultiInstanceSiteUser*)(*i);
  1069. if (pSiteUser->m_pSite2)
  1070. {
  1071.             IHXVideoSurface* pVideoSurface;
  1072.     if (SUCCEEDED(pSiteUser->m_pSite2->GetVideoSurface(pVideoSurface)))
  1073.     {
  1074.                 IHXVideoSurface2* pVideoSurface2;
  1075.                 if (SUCCEEDED(pVideoSurface->QueryInterface(IID_IHXVideoSurface2,
  1076.                                                             (void**) &pVideoSurface2)))
  1077.                 {
  1078.                     // We just need one success:
  1079.                     result = pVideoSurface2->ColorConvert( cidIn,
  1080.                                                            pSrcSize,
  1081.                                                            prSrcRect,
  1082.                                                            pInput,
  1083.                                                            cidOut,
  1084.                                                            pDestBuffer,
  1085.                                                            pDestSize,
  1086.                                                            prDestRect,
  1087.                                                            nDestPitch
  1088.                                                            );
  1089.                     
  1090.                     HX_RELEASE(pVideoSurface2);
  1091.                     if (SUCCEEDED(result))
  1092.                     {
  1093.                         break;   
  1094.                     }
  1095.                 }
  1096.                 HX_RELEASE(pVideoSurface);
  1097.             }
  1098.         }
  1099.     }
  1100.     return result;
  1101. }
  1102.                                  
  1103. STDMETHODIMP   
  1104. CHXMultiInstanceSiteUserSupplier::GetVideoMem
  1105. (
  1106.     VideoMemStruct* pVidMem,
  1107.     UINT32 ulFlags
  1108. )
  1109. {
  1110.     HX_RESULT result = HXR_FAIL;
  1111.     for (CHXSimpleList::Iterator i = m_SiteUsers.Begin();
  1112.  i!= m_SiteUsers.End(); ++i)
  1113.     {
  1114. CHXMultiInstanceSiteUser* pSiteUser = (CHXMultiInstanceSiteUser*)(*i);
  1115. if (pSiteUser->m_pSite2)
  1116. {
  1117.             IHXVideoSurface* pVideoSurface;
  1118.     if (SUCCEEDED(pSiteUser->m_pSite2->GetVideoSurface(pVideoSurface)))
  1119.     {
  1120.                 IHXVideoSurface2* pVideoSurface2;
  1121.                 if (SUCCEEDED(pVideoSurface->QueryInterface(IID_IHXVideoSurface2,
  1122.                                                             (void**) &pVideoSurface2)))
  1123.                 {
  1124.                     // We just need one success:
  1125.                     result = pVideoSurface2->GetVideoMem(pVidMem, ulFlags);
  1126.                     HX_RELEASE(pVideoSurface2);
  1127.                     if (SUCCEEDED(result))
  1128.                     {
  1129.                         break;   
  1130.                     }
  1131.                 }
  1132.                 HX_RELEASE(pVideoSurface);
  1133.             }
  1134.         }
  1135.     }
  1136.     return result;
  1137. }
  1138.                                  
  1139. STDMETHODIMP   
  1140. CHXMultiInstanceSiteUserSupplier::Present
  1141. (
  1142.     VideoMemStruct* pVidMem,
  1143.     INT32 lTime,
  1144.     UINT32 ulFlags,
  1145.     HXxRect* prDestRect,
  1146.     HXxRect* prSrcRect
  1147. )
  1148. {
  1149.     HX_RESULT result = HXR_OK;
  1150.     for (CHXSimpleList::Iterator i = m_SiteUsers.Begin();
  1151.  i!= m_SiteUsers.End(); ++i)
  1152.     {
  1153. CHXMultiInstanceSiteUser* pSiteUser = (CHXMultiInstanceSiteUser*)(*i);
  1154. if (pSiteUser->m_pSite2)
  1155. {
  1156.             IHXVideoSurface* pVideoSurface;
  1157.     if (SUCCEEDED(pSiteUser->m_pSite2->GetVideoSurface(pVideoSurface)))
  1158.     {
  1159.                 IHXVideoSurface2* pVideoSurface2;
  1160.                 if (SUCCEEDED(pVideoSurface->QueryInterface(IID_IHXVideoSurface2,
  1161.                                                             (void**) &pVideoSurface2)))
  1162.                 {
  1163.                     // Propagate all failures:
  1164.                     HX_RESULT localResult = pVideoSurface2->Present(pVidMem,
  1165.                                                                     lTime,
  1166.                                                                     ulFlags,
  1167.                                                                     prDestRect,
  1168.                                                                     prSrcRect);
  1169.                     if (SUCCEEDED(result))
  1170.                     {
  1171.                         result = localResult;    
  1172.                     }
  1173.                     
  1174.                     HX_RELEASE(pVideoSurface2);
  1175.                 }
  1176.                 HX_RELEASE(pVideoSurface);
  1177.             }
  1178.         }
  1179.     }
  1180.     return result;
  1181. }
  1182.                                  
  1183. STDMETHODIMP   
  1184. CHXMultiInstanceSiteUserSupplier::PresentIfReady()
  1185. {
  1186.     HX_RESULT result = HXR_OK;
  1187.     for (CHXSimpleList::Iterator i = m_SiteUsers.Begin();
  1188.  i!= m_SiteUsers.End(); ++i)
  1189.     {
  1190. CHXMultiInstanceSiteUser* pSiteUser = (CHXMultiInstanceSiteUser*)(*i);
  1191. if (pSiteUser->m_pSite2)
  1192. {
  1193.             IHXVideoSurface* pVideoSurface;
  1194.     if (SUCCEEDED(pSiteUser->m_pSite2->GetVideoSurface(pVideoSurface)))
  1195.     {
  1196.                 IHXVideoSurface2* pVideoSurface2;
  1197.                 if (SUCCEEDED(pVideoSurface->QueryInterface(IID_IHXVideoSurface2,
  1198.                                                             (void**) &pVideoSurface2)))
  1199.                 {
  1200.                     // Propagate all failures:
  1201.                     HX_RESULT localResult = pVideoSurface2->PresentIfReady();
  1202.                     if (SUCCEEDED(result))
  1203.                     {
  1204.                         result = localResult;    
  1205.                     }
  1206.                     HX_RELEASE(pVideoSurface2);
  1207.                 }
  1208.                 HX_RELEASE(pVideoSurface);
  1209.             }
  1210.         }
  1211.     }     
  1212.     return result;
  1213. }
  1214. /*
  1215.  *  IHXInterruptSafe methods
  1216.  */
  1217. /************************************************************************
  1218.  * Method:
  1219.  *     IHXInterruptSafe::IsInterruptSafe
  1220.  * Purpose:
  1221.  *     This is the function that will be called to determine if
  1222.  *     interrupt time execution is supported.
  1223.  */
  1224. STDMETHODIMP_(BOOL)
  1225. CHXMultiInstanceSiteUserSupplier::IsInterruptSafe(void)
  1226. {
  1227.     return m_bIsInterrupSafe;
  1228. }
  1229. /************************************************************************
  1230.  *  Method:
  1231.  *    Constructor
  1232.  */
  1233. CHXMultiInstanceSiteUser::CHXMultiInstanceSiteUser
  1234. (
  1235.     CHXMultiInstanceSiteUserSupplier* pMISUS
  1236. )
  1237.     : m_lRefCount(0)
  1238.     , m_pMISUS(pMISUS)
  1239.     , m_pSite(NULL)
  1240.     , m_pSite2(NULL)
  1241. {
  1242. };
  1243. /************************************************************************
  1244.  *  Method:
  1245.  *    Destructor
  1246.  */
  1247. CHXMultiInstanceSiteUser::~CHXMultiInstanceSiteUser()
  1248. {
  1249. }
  1250. /************************************************************************
  1251.  *  Method:
  1252.  *    IUnknown::QueryInterface
  1253.  */
  1254. STDMETHODIMP 
  1255. CHXMultiInstanceSiteUser::QueryInterface(REFIID riid, void** ppvObj)
  1256. {
  1257.     if (IsEqualIID(riid, IID_IHXSiteUser))
  1258.     {
  1259. AddRef();
  1260. *ppvObj = (IHXSiteUser*)this;
  1261. return HXR_OK;
  1262.     }
  1263.     else if (IsEqualIID(riid, IID_IUnknown))
  1264.     {
  1265. AddRef();
  1266. *ppvObj = (IUnknown*)(IHXSiteUser*)this;
  1267. return HXR_OK;
  1268.     }
  1269.     *ppvObj = NULL;
  1270.     return HXR_NOINTERFACE;
  1271. }
  1272. /************************************************************************
  1273.  *  Method:
  1274.  *    IUnknown::AddRef
  1275.  */
  1276. STDMETHODIMP_(ULONG32) 
  1277. CHXMultiInstanceSiteUser::AddRef()
  1278. {
  1279.     return InterlockedIncrement(&m_lRefCount);
  1280. }
  1281. /************************************************************************
  1282.  *  Method:
  1283.  *    IUnknown::Release
  1284.  */
  1285. STDMETHODIMP_(ULONG32) 
  1286. CHXMultiInstanceSiteUser::Release()
  1287. {
  1288.     if (InterlockedDecrement(&m_lRefCount) > 0)
  1289.     {
  1290.         return m_lRefCount;
  1291.     }
  1292.     delete this;
  1293.     return 0;
  1294. }
  1295. /************************************************************************
  1296.  *  Method:
  1297.  *    IHXSiteUser::AttachSite
  1298.  */
  1299. STDMETHODIMP 
  1300. CHXMultiInstanceSiteUser::AttachSite(IHXSite* /*IN*/ pSite)
  1301. {
  1302.     if (m_pSite) return HXR_UNEXPECTED;
  1303.     if (!pSite)  return HXR_INVALID_PARAMETER;
  1304.     m_pSite = pSite;
  1305.     m_pSite->AddRef();
  1306.     IHXSite2* pSite2 = NULL;
  1307.     m_pSite->QueryInterface(IID_IHXSite2, (void**)&pSite2);
  1308.     if (pSite2)
  1309.     {
  1310. m_pSite2 = pSite2;
  1311.     }
  1312.     if (!m_pMISUS->m_bIsAttached)
  1313.     {
  1314. IHXInterruptSafe* pInterrupSafe = NULL;
  1315. if (m_pSite->QueryInterface(IID_IHXInterruptSafe, 
  1316.     (void**) &pInterrupSafe) == HXR_OK)
  1317. {
  1318.     m_pMISUS->m_bIsInterrupSafe = pInterrupSafe->IsInterruptSafe();
  1319.     pInterrupSafe->Release();
  1320. }
  1321. m_pMISUS->m_pSingleUser->AttachSite((IHXSite*)m_pMISUS);
  1322. m_pMISUS->m_bIsAttached = TRUE;
  1323.     }
  1324.     if (m_pMISUS->m_bSetSizeHasBeenCalled)
  1325.     {
  1326. m_pSite->SetSize(m_pMISUS->m_size);
  1327.     }
  1328.     if (m_pMISUS->m_bSetPositionHasBeenCalled)
  1329.     {
  1330. m_pSite->SetPosition(m_pMISUS->m_position);
  1331.     }
  1332.     if (m_pMISUS->m_bSetZOrderHasBeenCalled)
  1333.     {
  1334. m_pSite2->SetZOrder(m_pMISUS->m_zorder);
  1335.     }
  1336.     HXBitmapInfoHeader* pHeader = m_pMISUS->GetBitmapInfoHeader();
  1337.     if (pHeader && m_pSite2)
  1338.     {
  1339. IHXVideoSurface* pTempSurface;
  1340. if (HXR_OK == m_pSite2->GetVideoSurface(pTempSurface))
  1341. {
  1342.     // so we have a video sufrface in one of our sites 
  1343.     // good enough return HXR_OK.
  1344.     pTempSurface->BeginOptimizedBlt(pHeader);
  1345.     HX_RELEASE(pTempSurface);
  1346. }
  1347.     }
  1348.     return HXR_OK;
  1349. }
  1350. /************************************************************************
  1351.  *  Method:
  1352.  *    IHXSiteUser::DetachSite
  1353.  */
  1354. STDMETHODIMP 
  1355. CHXMultiInstanceSiteUser::DetachSite()
  1356. {
  1357.     HX_ASSERT(m_pSite);
  1358.     HX_ASSERT(m_pMISUS);
  1359.     m_pMISUS->DestroySiteUser((IHXSiteUser*)this);
  1360.     HX_RELEASE(m_pSite);
  1361.     HX_RELEASE(m_pSite2);
  1362.     return HXR_OK;
  1363. }
  1364. /************************************************************************
  1365.  *  Method:
  1366.  *    IHXSiteUser::HandleEvent
  1367.  */
  1368. STDMETHODIMP 
  1369. CHXMultiInstanceSiteUser::HandleEvent(HXxEvent* /*IN*/ pEvent)
  1370. {
  1371.     if (m_pMISUS)
  1372.     {
  1373. if (m_pMISUS->m_pSingleUser)
  1374. {
  1375.     return m_pMISUS->m_pSingleUser->HandleEvent(pEvent);
  1376. }
  1377.     }
  1378.     return HXR_NOTIMPL;
  1379. }
  1380. /************************************************************************
  1381.  *  Method:
  1382.  *    IHXSiteUser::NeedsWindowedSites
  1383.  */
  1384. STDMETHODIMP_(BOOL)
  1385. CHXMultiInstanceSiteUser::NeedsWindowedSites()
  1386. {
  1387.     return FALSE;
  1388. }