⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 basesite.cpp

📁 著名的 helix realplayer 基于手机 symbian 系统的 播放器全套源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:

    HXDestroyRegion(m_pDirtyRegion);
    m_pDirtyRegion = NULL;
}


/************************************************************************
 *  Method:
 *    CHXBaseSite::SetParentSite
 */
void
CHXBaseSite::SetParentSite(CHXBaseSite* pParentSite)
{
    m_pParentSite = pParentSite;
}

/************************************************************************
 *  Method:
 *    CHXBaseSite::SetTopLevelSite
 */
void
CHXBaseSite::SetTopLevelSite(CHXBaseSite* pTop)
{
    if (m_pTopLevelSite != this)
    {
        HX_RELEASE(m_pTopLevelSite);
    }

    m_pTopLevelSite = pTop;

    if (m_pTopLevelSite && m_pTopLevelSite != this)
        m_pTopLevelSite->AddRef();
}

/************************************************************************
 *  Method:
 *    IUnknown::QueryInterface
 */
STDMETHODIMP CHXBaseSite::QueryInterface(REFIID riid, void** ppvObj)
{
    return m_pUnkOuter->QueryInterface(riid,ppvObj);
}

/************************************************************************
 *  Method:
 *    IUnknown::AddRef
 */
STDMETHODIMP_(ULONG32) CHXBaseSite::AddRef()
{
    return m_pUnkOuter->AddRef();
}

/************************************************************************
 *  Method:
 *    IUnknown::Release
 */
STDMETHODIMP_(ULONG32) CHXBaseSite::Release()
{
    return m_pUnkOuter->Release();
}

/************************************************************************
 *  Method:
 *    IUnknown::QueryInterface
 */
STDMETHODIMP CHXBaseSite::SiteNonDelegatingQueryInterface(REFIID riid, void** ppvObj)
{
    if (IsEqualIID(riid, IID_IUnknown))
    {
        AddRef();
        *ppvObj = (IUnknown*)(IHXSite*)this;
        return HXR_OK;
    }
    else if (IsEqualIID(riid, IID_IHXSite))
    {
        AddRef();
        *ppvObj = (IHXSite*)this;
        return HXR_OK;
    }
    else if (IsEqualIID(riid, IID_IHXSite2))
    {
        AddRef();
        *ppvObj = (IHXSite2*)this;
        return HXR_OK;
    }
    else if (IsEqualIID(riid, IID_IHXInterruptSafe))
    {
        AddRef();
        *ppvObj = (IHXInterruptSafe*)this;
        return HXR_OK;
    }
    else if (IsEqualIID(riid, IID_IHXSiteWindowless))
    {
        AddRef();
        *ppvObj = (IHXSiteWindowless*)this;
        return HXR_OK;
    }
    else if (IsEqualIID(riid, IID_IHXSiteWindowed))
    {
        AddRef();
        *ppvObj = (IHXSiteWindowed*)this;
        return HXR_OK;
    }
    else if (IsEqualIID(riid, IID_IHXStatusMessage))
    {
        AddRef();
        *ppvObj = (IHXStatusMessage*)this;
        return HXR_OK;
    }
    else if (IsEqualIID(riid, IID_IHXSiteFullScreen))
    {
        AddRef();
        *ppvObj = (IHXSiteFullScreen*)this;
        return HXR_OK;
    }
    else if (IsEqualIID(riid, IID_IHXVideoControl))
    {
        AddRef();
        *ppvObj = (IHXVideoControl*)this;
        return HXR_OK;
    }
    else if (IsEqualIID(riid, IID_IHXSiteTransition))
    {
        AddRef();
        *ppvObj = (IHXSiteTransition*)this;
        return HXR_OK;
    }
    else if (IsEqualIID(riid, IID_IHXSiteComposition))
    {
        AddRef();
        *ppvObj = (IHXSiteComposition*)this;
        return HXR_OK;
    }
    else if (m_pValues &&
             m_pValues->QueryInterface(riid, ppvObj) == HXR_OK)
    {
        return HXR_OK;
    }
    else if (IsEqualIID(riid, IID_IHXKeyBoardFocus))
    {
        AddRef();
        *ppvObj = (IHXKeyBoardFocus*)this;
        return HXR_OK;
    }
    else if (IsEqualIID(riid, IID_IHXDrawFocus))
    {
        AddRef();
        *ppvObj = (IHXDrawFocus*)this;
        return HXR_OK;
    }
    else if (IsEqualIID(riid, IID_IHXSubRectSite))
    {
        AddRef();
        *ppvObj = (IHXSubRectSite*)this;
        return HXR_OK;
    }

    *ppvObj = NULL;
    return HXR_NOINTERFACE;
}

/************************************************************************
 *  Method:
 *    IUnknown::AddRef
 */
STDMETHODIMP_(ULONG32) CHXBaseSite::SiteNonDelegatingAddRef()
{
    return InterlockedIncrement(&m_lRefCount);
}


/************************************************************************
 *  Method:
 *    IUnknown::Release
 */
STDMETHODIMP_(ULONG32) CHXBaseSite::SiteNonDelegatingRelease()
{
    if (InterlockedDecrement(&m_lRefCount) > 0)
    {
        return m_lRefCount;
    }

    delete this;
    return 0;
}

/************************************************************************
 *  Method:
 *    IHXSite::AttachUser
 */
STDMETHODIMP CHXBaseSite::AttachUser(IHXSiteUser* /*IN*/ pUser)
{
    if (m_pUser) return HXR_UNEXPECTED;

#ifndef _DEBUG_WINDOWED_SITES
    if (m_pParentSite && pUser->NeedsWindowedSites())
    {
        _NeedWindowedSite();
    }
#endif

    m_pUser = pUser;
    m_pUser->AddRef();

    //if (!m_pTopLevelSite->m_pKeyBoardFocusUser && m_pTopLevelSite->m_pUser)
    //{
    //    m_pTopLevelSite->m_pKeyBoardFocusUser = m_pTopLevelSite->m_pUser;
    //    m_pTopLevelSite->m_pKeyBoardFocusUser->AddRef();
    //}

    m_pUser->AttachSite(this);

    if (m_bAttachWindowPending)
    {
        m_bAttachWindowPending = FALSE;
        m_bDetachWndMsgPending = TRUE;
        // send HX_ATTACH_WINDOW msg to the renderers
        void *  lpParam1 = NULL;
        void *  lpParam2 = NULL;

        HXxEvent event = {HX_ATTACH_WINDOW, m_pWindow ? m_pWindow->window : NULL, lpParam1, lpParam2, 0, 0};
        m_pUser->HandleEvent(&event);
    }

    /* XXXRA
     * Mac one does scale to full screen and also forces and update message
     * should not need it!
     */

    return HXR_OK;
}

/************************************************************************
 *  Method:
 *    IHXSite::DetachUser
 */
STDMETHODIMP CHXBaseSite::DetachUser()
{
    if (!m_pUser) return HXR_UNEXPECTED;

    /*
     *  SetCapture
     */

    if (m_pTopLevelSite->m_pLastUser == m_pUser)
    {
        m_pTopLevelSite->m_pLastUser = NULL;
    }

    if (m_pTopLevelSite->m_pCaptureUser == m_pUser)
    {
        m_pTopLevelSite->m_pCaptureUser= NULL;
        m_bSetCaptureOn = FALSE;
    }

    if (m_CallbackHandle)
    {
        m_pScheduler->Remove(m_CallbackHandle);
        m_CallbackHandle = 0;
    }
    if (m_ScrollSiteCallbackHandle)
    {
        m_pScheduler->Remove(m_ScrollSiteCallbackHandle);
        m_ScrollSiteCallbackHandle = 0;
    }

    if (m_pUser && m_bDetachWndMsgPending)
    {
        // send HX_DETACH_WINDOW msg to the renderers
        void *  lpParam1 = NULL;
        void *  lpParam2 = NULL;

        HXxEvent event = {HX_DETACH_WINDOW, m_pWindow ? m_pWindow->window : NULL, lpParam1, lpParam2, 0, 0};

        m_bDetachWndMsgPending = FALSE;
        m_pUser->HandleEvent(&event);
    }

    AddRef();
    if (HXR_OK == m_pUser->DetachSite())
    {
        if (m_pTopLevelSite->m_pKeyBoardFocusUser == m_pUser)
            HX_RELEASE(m_pTopLevelSite->m_pKeyBoardFocusUser);

        HX_RELEASE(m_pUser);
    }
    Release();

    return HXR_OK;
}

/************************************************************************
 *  Method:
 *    IHXSite::GetUser
 */
STDMETHODIMP CHXBaseSite::GetUser(REF(IHXSiteUser*) /*OUT*/ pUser)
{
    if (!m_pUser) return HXR_UNEXPECTED;

    pUser = m_pUser;
    pUser->AddRef();

    return HXR_OK;
}


/************************************************************************
 *  Method:
 *    IHXSite::CreateChild
 */
STDMETHODIMP CHXBaseSite::CreateChild(REF(IHXSite*) /*OUT*/ pChildSite)
{
    _TLSLock();

    HRESULT result = HXR_OK;

    // Create an instance of CHXBaseSite, let it know it's in child
    // window mode.
    CHXBaseSite* pChildSiteWindowless = CHXBaseSite::CreateSite(m_pContext, NULL, m_ChildrenMap.GetCount());
    pChildSiteWindowless->AddRef();
    pChildSiteWindowless->SetParentSite(this);
    pChildSiteWindowless->SetTopLevelSite(m_pTopLevelSite);
    pChildSiteWindowless->SetRootSurface(m_pRootSurface);
    pChildSiteWindowless->SetParentWindow(&m_TopLevelWindow);

#ifdef _WIN32
    //this is to give the windows sites a chance to hook themselves
    //into wm_move madness.
    CHXWinSite* pSiteIt = (CHXWinSite*)pChildSiteWindowless;
    pSiteIt->HookParents();
#endif

    // Get the IHXSite interface from the child to return to the
    // outside world.
    pChildSiteWindowless->QueryInterface(IID_IHXSite, (void**)&pChildSite);

    // Store the CHXBaseSite in a list of child windows, always keep
    //a reference to it.  ExSiteInfo does an AddRef in constructor
    m_ChildrenMap.SetAt(pChildSite, pChildSiteWindowless);
    pChildSite->AddRef();

    //Now add the child into or ZOrder sorted list.
    m_ChildrenInZOrder.AddTail( (void*)pChildSiteWindowless );


    //Set the child's origin
    pChildSiteWindowless->SetOrigin(&m_topleft);

    if(m_pTopLevelSite)
        m_pTopLevelSite->ScheduleCallback(CLIP, 0);

    HXxWindow* pWindow = GetWindow();
    //XXXgfw this focus code is disabled for the beamer release.
    //SafeSetFocus(pWindow);

    _TLSUnlock();


    return HXR_OK;
}

/************************************************************************
 *  Method:
 *    IHXSite::DestroyChild
 */
STDMETHODIMP CHXBaseSite::DestroyChild(IHXSite* /*IN*/ pChildSite)
{
    // Avoid dead-lock in vidsurf2
    LockBlitters();
    FlushSurfaces();

    _TLSLock();

    //Check and see if we are in the YUV Site list. If so, remove ourselves.
    LISTPOSITION pPos = zm_YUVSiteList.Find(this);
    if(pPos)
    {
        zm_YUVSiteList.RemoveAt(pPos);
    }

    //Verify that the site is actually a child site and find its
    //position in the list in the event that it is a child.
    HX_RESULT retVal = HXR_FAIL;
    CHXBaseSite* pChildSiteWindowless=NULL;

    if (m_ChildrenMap.Lookup(pChildSite, (void*&) pChildSiteWindowless))
    {
        m_ChildrenMap.RemoveKey(pChildSite);
        pChildSiteWindowless->Destroy();
        pChildSiteWindowless->SetParentSite(NULL);
        //Remove it from our child z-order list.
        LISTPOSITION pos,posNext = m_ChildrenInZOrder.GetHeadPosition();
        while (posNext)
        {
            pos = posNext;
            CHXBaseSite* pSite = (CHXBaseSite*)m_ChildrenInZOrder.GetNext(posNext);
            if( pSite == pChildSiteWindowless )
            {
                m_ChildrenInZOrder.RemoveAt(pos);
                while (posNext)
                {
		    pSite = (CHXBaseSite*)m_ChildrenInZOrder.GetNext(posNext);

		    INT32 zOrder;
		    pSite->GetZOrder(zOrder);
		    pSite->SetInternalZOrder(zOrder - 1);
                }
                break;
            }
        }
        HX_RELEASE(pChildSite);
        HX_RELEASE(pChildSiteWindowless);
        retVal = HXR_OK;
    }
    HX_ASSERT( m_ChildrenInZOrder.GetCount() == m_ChildrenMap.GetCount() );

    if (m_pTopLevelSite==this)
    {
        m_pTopLevelSite->RecomputeClip();
    }
    else
    {
        if (m_pTopLevelSite)
        {
            m_pTopLevelSite->ScheduleCallback(CLIP, 0);
        }
    }

    _TLSUnlock();
    UnlockBlitters();

    return retVal;
}

/************************************************************************
 *  Method:
 *    IHXSite::AttachWatcher
 */
STDMETHODIMP CHXBaseSite::AttachWatcher(IHXSiteWatcher* /*IN*/ pWatcher)
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -