📄 sitemgr.cpp
字号:
{ pSUS->DestroySiteUser(pUser); pSUS->Release(); } HX_RELEASE(pUser); HX_RELEASE(pSite); } else if(m_SitesToSUS.Lookup(pSite, (void*&)pSUS)) { m_SitesToSUS.RemoveKey(pSite); pSite->GetUser(pUser); pSite->DetachUser(); if(pUser && pSUS) { pSUS->DestroySiteUser(pUser); pSUS->Release(); } HX_RELEASE(pUser); HX_RELEASE(pSite); }}/************************************************************************ * Method: * CHXSiteManager::UnhookAll */void CHXSiteManager::UnhookAll(){ m_bInUnHookAll = TRUE; /* * To unhook all the items we simple run through the site users * we created, ask them for their site, tell the site to detach * from the user, and tell the site user supplier to destroy the * site user. That's simple enough... */ CHXMapPtrToPtr::Iterator ndxSite = m_SitesToSUS.Begin(); for (; ndxSite != m_SitesToSUS.End(); ++ndxSite) { IHXSite* pSite = (IHXSite*)ndxSite.get_key(); IHXSiteUserSupplier* pSUS = (IHXSiteUserSupplier*)(*ndxSite); IHXSiteUser* pUser = NULL; pSite->GetUser(pUser); /* * Now actually unhook the site to the site user! * * NOTE: The IHXSite is responsible for calling the * IHXSiteUser::DetachSite() method. * * NOTE: If this is a layout site user than it will * destroy the child sites in responses to the * DetachSite() method call. */ pSite->DetachUser(); if (pSUS) { if (pUser) { pSUS->DestroySiteUser(pUser); } pSUS->Release(); } HX_RELEASE(pUser); HX_RELEASE(pSite); } m_SitesToSUS.RemoveAll(); CleanupPendingValues(); m_bInUnHookAll = FALSE;}/************************************************************************ * Method: * CHXSiteManager::HookupSingleSiteByLSGNameWithString */BOOL CHXSiteManager::HookupSingleSiteByLSGNameWithString( IHXSiteUser* pSU, char* pActualString, BOOL bIsPersistent){ BOOL res = FALSE; if(bIsPersistent) { res = HookupSingleSiteByStringHelper(pActualString,m_PersistentLSGNamesToLists,pSU,bIsPersistent); if(!res) { // check for existence of string in non-persistent list, then move it if it exists void* pVoid = NULL; if(m_LSGNamesToLists.Lookup(pActualString, pVoid)) { m_LSGNamesToLists.RemoveKey(pActualString); m_PersistentLSGNamesToLists.SetAt(pActualString, pVoid); res = HookupSingleSiteByStringHelper(pActualString,m_PersistentLSGNamesToLists, pSU,bIsPersistent); } } } else { res = HookupSingleSiteByStringHelper(pActualString,m_LSGNamesToLists,pSU,bIsPersistent); } return res;}/************************************************************************ * Method: * CHXSiteManager::HookupSingleSiteByLSGName */BOOL CHXSiteManager::HookupSingleSiteByLSGName( IHXSiteUser* pSU, IHXValues* pProps, BOOL bIsPersistent){ IHXBuffer* pValue = NULL; char* pActualString = NULL; HRESULT hresTemp; /* * This method is responsible for fully hooking up the * site user supplier with any and all sites associate with * it's LSG name. NOTE: The Properties passed in are those * of this site user supplier, so first thing is to map from * the appropriate property to the collection of sites having * that property. This is the same as the process for determining * availability. */ hresTemp = pProps->GetPropertyCString("name",pValue); HX_ASSERT(HXR_OK == hresTemp); pActualString = (char*)pValue->GetBuffer(); CHXSiteUserProxy* pProxy = new CHXSiteUserProxy(this, pSU, pActualString); pProxy->AddRef(); BOOL res = HookupSingleSiteByLSGNameWithString(pProxy, pActualString, bIsPersistent); // when it fails, save the pProxy & pValue for pending hookup // which is done later during AddSite() if (!res) { m_PendingValueToSUSingleLSG.SetAt(pValue, pProxy); } else { pValue->Release(); pProxy->Release(); // now owned by hookup list } return res;}/************************************************************************ * Method: * CHXSiteManager::HookupSingleSiteByPlayToFromWithString */BOOLCHXSiteManager::HookupSingleSiteByPlayToFromWithString( IHXSiteUser* pSU, char* pActualString, BOOL bIsPersistent){ BOOL res = FALSE; if(bIsPersistent) { res = HookupSingleSiteByStringHelper(pActualString,m_PersistentChannelsToLists,pSU,bIsPersistent); if(!res) { // check for existence of string in non-persistent list, then move it if it exists void* pVoid = NULL; if(m_ChannelsToLists.Lookup(pActualString, pVoid)) { m_ChannelsToLists.RemoveKey(pActualString); m_PersistentChannelsToLists.SetAt(pActualString, pVoid); res = HookupSingleSiteByStringHelper(pActualString,m_PersistentChannelsToLists, pSU,bIsPersistent); } } } else { res = HookupSingleSiteByStringHelper(pActualString,m_ChannelsToLists,pSU,bIsPersistent); } return res;}//////////////////////// JEB: Add ret value /************************************************************************ * Method: * CHXSiteManager::HookupSingleSiteByPlayToFrom */BOOLCHXSiteManager::HookupSingleSiteByPlayToFrom( IHXSiteUser* pSU, IHXValues* pProps, BOOL bIsPersistent){ IHXBuffer* pValue = NULL; char* pActualString = NULL; HRESULT hresTemp; /* * The properties passed here are the properties of the * site user not the site. When associating by PlayToFrom * the site's "channel" property must match the site * users "playto" property. So we get the "playto" property * from the props and look it in our Channel list. */ hresTemp = pProps->GetPropertyCString("playto",pValue); HX_ASSERT(HXR_OK == hresTemp); pActualString = (char*)pValue->GetBuffer(); CHXSiteUserProxy* pProxy = new CHXSiteUserProxy(this, pSU, pActualString); pProxy->AddRef(); BOOL res = HookupSingleSiteByPlayToFromWithString(pProxy, pActualString, bIsPersistent); // when it fails, save the pProxy & pValue for pending hookup // which is done later during AddSite() if (!res) { m_PendingValueToSUSinglePlayTo.SetAt(pValue, pProxy); } else { pProxy->Release(); // now owned by hookup list pValue->Release(); } return res;}/************************************************************************ * Method: * IHXSiteManager::HookupSingleSiteByStringHelper */BOOLCHXSiteManager::HookupSingleSiteByStringHelper( const char* pString, CHXMapStringToOb& ByStringMap, IHXSiteUser* pSU, BOOL bIsPersistent){ void* pVoid = NULL; CHXMapPtrToPtr* pSiteCollection = NULL; CHXMapPtrToPtr::Iterator ndxSite; IHXSite* pSite = NULL; IHXSiteWindowed* pSiteWindowed = NULL; IHXSiteUser* pUser = pSU; BOOL bWindowed = FALSE; BOOL bNeedsWindowed = FALSE; /* * 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)) { /* We may get back site from the site supplier at a later time due to * asynchronous nature. Make this request pending and we will try * to HookupSingleSiteByStringHelper from within AddSite() */ return FALSE; } /* * Now that we have the collection of sites we want to actually * hook the site user supplier up to _THE_FIRST_ site in the collection. */ pSiteCollection = (CHXMapPtrToPtr*)pVoid; ndxSite = pSiteCollection->Begin(); pSite = (IHXSite*)(*ndxSite); /* * We need to find out if this site user needs windowed * sites. The first step is to determine if this is a * windowed site. */ bWindowed = (HXR_OK == pSite->QueryInterface( IID_IHXSiteWindowed, (void**)&pSiteWindowed)); HX_RELEASE(pSiteWindowed); /* * If the site user supplier needs windowed sites and this * site is windowed, or if the site user supplier can handle * windowless sites, then proceed. */ bNeedsWindowed = pSU->NeedsWindowedSites(); if (!bNeedsWindowed || (bNeedsWindowed && bWindowed)) { /* * Now actually hook up the site to the site user! * * NOTE: The IHXSite is responsible for calling the * IHXSiteUser::AttachSite() method. * * NOTE: If this is a layout site user than it will * create child site in response to the AttachSite() * method call. */ pSite->AttachUser(pUser); /* * We also record the site's that we have created users for * here so that we can unhook everything the next time the * layout is changed. We record the site user supplier * that created the site user so that we can delete that user * as well. NOTE: we shouldn't have already created this * user! */ if(bIsPersistent) { HX_ASSERT(!m_PersistentSitesToSUS.Lookup(pSite,pVoid)); /* * NULL means no Site User supplier was provided. */ m_PersistentSitesToSUS[pSite] = NULL; } else { HX_ASSERT(!m_SitesToSUS.Lookup(pSite,pVoid)); /* * NULL means no Site User supplier was provided. */ m_SitesToSUS[pSite] = NULL; } pSite->AddRef(); } return TRUE;}/************************************************************************* Method:* CHXSiteManager::EventOccurred* Purpose:* Pass the event to appropriate sites*/void CHXSiteManager::EventOccurred(HXxEvent* pEvent){#if defined(_MACINTOSH) || defined(_MAC_UNIX) // xxxbobclark // first, try iterating through sites the old-fashioned way. If there are // any sites here then they'll be in the zm_SiteWindowedList list. If there // aren't, then try using the new pnvideo way. BOOL bHandledOldEvent = FALSE; #if 0 /* XXX BOB PLEASE TAKE A LOOK */ //determine which sites should get the event & send it over CHXSimpleList::Iterator ndxSite = CHXSiteWindowed::zm_SiteWindowedList.Begin(); for (; ndxSite != CHXSiteWindowed::zm_SiteWindowedList.End(); ++ndxSite) { zm_bWindowRemovedFromList = FALSE; CHXSiteWindowed* pSiteWindowed = (CHXSiteWindowed*)(*ndxSite); bHandledOldEvent = TRUE; pSiteWindowed->AddRef(); pSiteWindowed->MacEventOccurred(pEvent); pSiteWindowed->Release(); /* If a window was removed from this list, iterate again * from the head. * This *hack* is to avoid O(n^2) processing of events. * It is required since a new URL may be opened from * within MacEventOccured() call resulting in * releasing one(or more) CHXSiteWindows. * * Potential Problem: Same event may be given to the same * window more than once. */ if (zm_bWindowRemovedFromList) { zm_bWindowRemovedFromList = FALSE; ndxSite = CHXSiteWindowed::zm_SiteWindowedList.Begin(); } }#endif if (!bHandledOldEvent) { CHXSimpleList::Iterator siteManagerNdx = zm_SiteManagerList.Begin(); for (; siteManagerNdx != zm_SiteManagerList.End(); ++siteManagerNdx) { CHXSiteManager* pSiteManager = (CHXSiteManager*)(*siteManagerNdx); CHXMapPtrToPtr::Iterator ndx = pSiteManager->m_MasterListOfSites.Begin(); for (; ndx != pSiteManager->m_MasterListOfSites.End(); ++ndx) { IHXSite* pSite = (IHXSite*)ndx.get_key(); IHXSiteWindowless* pSiteWindowless = NULL; if (pSite->QueryInterface(IID_IHXSiteWindowless, (void**)&pSiteWindowless) == HXR_OK) { pSiteWindowless->EventOccurred(pEvent); pSiteWindowless->Release(); } } } }#endif}/* * CHXEventHookElement methods */CHXEventHookElement::CHXEventHookElement( IHXEventHook* pHook, UINT16 uLayer) : m_pHook(pHook) , m_uLayer(uLayer){ HX_ASSERT(m_pHook); m_pHook->AddRef();}CHXEventHookElement::~CHXEventHookElement(){ HX_RELEASE(m_pHook);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -