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

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