📄 sitemgr.cpp
字号:
BOOL bIsPersistent = FALSE; /* * We need to get the IHXValues for the site so we know it * its for by LSGName or for by plattofrom use. If this is not * available then barf up an error. */ hresTemp = pSite->QueryInterface(IID_IHXValues,(void**)&pProps); if (HXR_OK != hresTemp) { hresFinal = hresTemp; goto exit; } /* * let's see if this is a persistent site... */ hresTemp = pProps->GetPropertyCString("Persistent",pValue); if(HXR_OK == hresTemp) { bIsPersistent = TRUE; HX_RELEASE(pValue); } /* * Now let's determine if it's by LSGName or by playtofrom. * If one of these is not available then barf up an error. */ /* * If the "LayoutGroup" property exists than this is * a site for layout groups by LSGName. */ hresTemp = pProps->GetPropertyCString("LayoutGroup",pValue); if (HXR_OK == hresTemp) { pActualString = (char*)pValue->GetBuffer(); if(bIsPersistent) { hresFinal = AddSiteByStringHelper(pActualString, pSite, m_PersistentLSGNamesToLists); } else { hresFinal = AddSiteByStringHelper(pActualString, pSite, m_LSGNamesToLists); } goto exit; } /* * If the "channel" property exists than this is * a site for renderers playing to a channel. */ hresTemp = pProps->GetPropertyCString("channel",pValue); if (HXR_OK == hresTemp) { pActualString = (char*)pValue->GetBuffer(); if(bIsPersistent) { hresFinal = AddSiteByStringHelper(pActualString, pSite, m_PersistentChannelsToLists); } else { hresFinal = AddSiteByStringHelper(pActualString, pSite, m_ChannelsToLists); } goto exit; }#if 0 ////// NOT YET SUPPORTED //////// /* * If the "playfrom" property exists than this is * a site for renderers playing from a source/stream combo. * Notice that more properties than just "playfrom" are needed * to do the actual hookup so we pass the properties in as well. */ hresTemp = pProps->GetPropertyCString("playfrom",pValue); if (HXR_OK == hresTemp) { hresFinal = AddSiteByPlayFrom(pProperties,pSite); goto exit; }#endifexit: /* * Cleanup any temporary objects.... */ HX_RELEASE(pProps); HX_RELEASE(pValue); // hookup any leftover orphan value/sites (pending)... // first process the LSG list HookupHelper(&m_PendingValueToSULSG, pActualString, bIsPersistent, SITE_USER_SUPPLIER, HOOKUP_BY_LSGNAMEWITHSTRING); // next process the Single LSG list HookupHelper(&m_PendingValueToSUSingleLSG, pActualString, bIsPersistent, SITE_USER, HOOKUP_SINGLESITE_BY_LSGNAMEWITHSTRING); // next process play to list HookupHelper(&m_PendingValueToSUPlayTo, pActualString, bIsPersistent, SITE_USER_SUPPLIER, HOOKUP_BY_PLAYTOFROMWITHSTRING); // next process the Single LSG list HookupHelper(&m_PendingValueToSUSinglePlayTo, pActualString, bIsPersistent, SITE_USER, HOOKUP_SINGLESITE_BY_PLAYTOFROMWITHSTRING);#ifdef _WINDOWS if (m_bNeedFocus && pSite) { IHXSiteWindowless* pWindowLess = NULL; IHXSiteWindowed* pWindowed = NULL; pSite->QueryInterface(IID_IHXSiteWindowless, (void**) &pWindowLess); if (pWindowLess) { pWindowLess->QueryInterface(IID_IHXSiteWindowed, (void**) &pWindowed); } if (pWindowed) { HXxWindow* pWindow = pWindowed->GetWindow(); if (pWindow && pWindow->window) { // same logic exists in pnvideo/win/winsite.cpp: _SetFocus() HWND hTmp = ::GetForegroundWindow(); if( ::IsChild(hTmp, (HWND)pWindow->window )) { ::SetFocus((HWND)pWindow->window); } } } HX_RELEASE(pWindowLess); HX_RELEASE(pWindowed); }#endif return hresFinal;}/************************************************************************ * Method:` * IHXSiteManager::RemoveSite */STDMETHODIMP CHXSiteManager::RemoveSite(IHXSite* pSite){ void* pVoid = NULL; CHXMapPtrToPtr* pSiteCollection = NULL; IHXValues* pProps = NULL; IHXBuffer* pValue = NULL; BOOL bIsPersistent = FALSE; const char* pChannelName = NULL; /* * This site must have been previously added and therefore * should be in the master list of sites. */ if (!m_MasterListOfSites.Lookup(pSite,pVoid)) { return HXR_INVALID_PARAMETER; } /* * determine whether the site is persistent, and get the name of * the site so it can be removed from the channel list */ if(HXR_OK == pSite->QueryInterface(IID_IHXValues,(void**)&pProps)) { if(HXR_OK == pProps->GetPropertyCString("Persistent", pValue)) { bIsPersistent = TRUE; HX_RELEASE(pValue); } HX_RELEASE(pProps); } /* * */ /* If we are unhooking all sites, we do not want to unhook site here */ if (!m_bInUnHookAll) { UnhookSite(pSite, bIsPersistent); } /* * We need to remove the site from whatever collection of * sites it is in. This means we are removing it from the * collection of sites for it's LSGName if that is how it * was added. Instead of determining the properties supported * by the site to determine which collection to remove it from * we stored the site collection in our master list. Cool, eh? */ pSiteCollection = (CHXMapPtrToPtr*)pVoid; HX_ASSERT(pSiteCollection->Lookup(pSite,pVoid)); pSiteCollection->RemoveKey(pSite); /* * Of course we also need to remove it from the master site * list as well. */ m_MasterListOfSites.RemoveKey(pSite); return HXR_OK;}STDMETHODIMPCHXSiteManager::AddEventHookElement( CHXSimpleList* pList, CHXEventHookElement* pHookElement){ // insert element into pList // in region/uLayer order (greater uLayer // before lesser uLayer) HX_RESULT rc = HXR_OK; BOOL bInserted = FALSE; LISTPOSITION pos = pList->GetHeadPosition(); while(pos) { CHXEventHookElement* pElement = (CHXEventHookElement*)pList->GetAt(pos); if(pElement->m_uLayer <= pHookElement->m_uLayer) { pList->InsertBefore(pos, pHookElement); bInserted = TRUE; break; } pList->GetNext(pos); } if(!bInserted) { pList->AddTail(pHookElement); } return rc;}STDMETHODIMPCHXSiteManager::RemoveEventHookElement( CHXSimpleList* pList, IHXEventHook* pHook, UINT16 uLayer){ HX_RESULT rc = HXR_OK; LISTPOSITION pos = pList->GetHeadPosition(); while(pos) { CHXEventHookElement* pThisElement = (CHXEventHookElement*)pList->GetAt(pos); if(pHook == pThisElement->m_pHook && uLayer == pThisElement->m_uLayer) { delete pThisElement; pList->RemoveAt(pos); break; } pList->GetNext(pos); } return rc;}/************************************************************************ * Method: * IHXEventHookMgr::AddHook */STDMETHODIMP CHXSiteManager::AddHook( IHXEventHook* pHook, const char* pRegionName, UINT16 uLayer){ HX_RESULT rc = HXR_OK; CHXEventHookElement* pElement = new CHXEventHookElement(pHook, uLayer); if(pRegionName && strlen(pRegionName) > 0) { CHXSimpleList* pList = NULL; if (!m_EventHookMap.Lookup(pRegionName, (void*&)pList)) { pList = new CHXSimpleList; m_EventHookMap[pRegionName] = pList; } rc = AddEventHookElement(pList, pElement); } else { rc = AddEventHookElement(&m_UnnamedEventHookList, pElement); } return rc;}/************************************************************************ * Method: * IHXEventHookMgr::RemoveHook */STDMETHODIMP CHXSiteManager::RemoveHook( IHXEventHook* pHook, const char* pRegionName, UINT16 uLayer){ HX_RESULT rc = HXR_OK; if(pRegionName && strlen(pRegionName) > 0) { CHXSimpleList* pList = NULL; if (m_EventHookMap.Lookup(pRegionName, (void*&)pList)) { rc = RemoveEventHookElement(pList, pHook, uLayer); } } else { rc = RemoveEventHookElement(&m_UnnamedEventHookList, pHook, uLayer); } return rc;}STDMETHODIMP CHXSiteManager::GetNumberOfSites(REF(UINT32) nNumSites ){ nNumSites = m_MasterListOfSites.GetCount(); return HXR_OK;}STDMETHODIMP CHXSiteManager::GetSiteAt(UINT32 nIndex, REF(IHXSite*) pSite){ if (!m_MasterListOfSites.GetCount()) { return HXR_FAIL; } POSITION pos = m_MasterListOfSites.GetStartPosition(); void* pValue; for (UINT32 i = 0; i<=nIndex; i++) { m_MasterListOfSites.GetNextAssoc(pos, (void*&)pSite, pValue); } return HXR_OK;}/************************************************************************* Method:* CHXSiteManager::HandleHookedEvent* Purpose:* Pass the event to interested parties*/HX_RESULTCHXSiteManager::HandleHookedEvent( const char* pRegionName, IHXSite* pSite, HXxEvent* pEvent){ return HandleSiteEvent(pRegionName, pSite, pEvent, SITE_EVENT_GENERAL);}/************************************************************************* Method:* CHXSiteManager::HookedSiteAdded* Purpose:* Let hooks know about the added site*/voidCHXSiteManager::HookedSiteAdded( const char* pRegionName, IHXSite* pSite){ HandleSiteEvent(pRegionName, pSite, NULL, SITE_EVENT_ADDED);}/************************************************************************* Method:* CHXSiteManager::HookedSiteRemoved* Purpose:* Let hooks know about the removed site*/voidCHXSiteManager::HookedSiteRemoved( const char* pRegionName, IHXSite* pSite){ HandleSiteEvent(pRegionName, pSite, NULL, SITE_EVENT_REMOVED);}/************************************************************************* Method:* CHXSiteManager::IsSitePresent* Purpose:* */BOOLCHXSiteManager::IsSitePresent( IHXSite* pSite){ void* pVoid = NULL; return m_MasterListOfSites.Lookup(pSite,pVoid);}void CHXSiteManager::NeedFocus(BOOL bNeedFocus){ m_bNeedFocus = bNeedFocus;}/************************************************************************ * Method: * IHXSiteManager::IsSiteAvailableByStringHelper */BOOLCHXSiteManager::IsSiteAvailableByStringHelper( const char* pString, CHXMapStringToOb& ByStringMap){ BOOL bAvailable = FALSE; void* pVoid = NULL; CHXMapPtrToPtr* pSiteCollection = NULL; /* * The basic data structure is as follows: A map is kept * from names to "lists" of sites. We don't actually use * a list because we want to quickly detect if the item is * already in the list so we use a map for the sites as well. */ /* * Find the list in the name to list map, if there is no * list in the map then we know it is surely not available. */ if (!ByStringMap.Lookup(pString,pVoid)) { bAvailable = FALSE; goto exit; } pSiteCollection = (CHXMapPtrToPtr*)pVoid; /* * Now that we have the collection of sites we want to see * if there are any items in the collection. The collection * may exist with no items in it. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -