Multicaster.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:2k
源码类别:

模拟服务器

开发平台:

C/C++

  1. #include "Multicaster.h"
  2. bool Multicaster::subscribe (MulticastObserver *observer, std::string address)
  3. {
  4.     AddressSpace::iterator  it = m_addresses.find (address);
  5.     if (it == m_addresses.end ())
  6.     {
  7.         m_addresses.insert (std::pair<std::string, Subscriptions> (address, Subscriptions ()));       
  8.         it = m_addresses.find (address);
  9.         if (it == m_addresses.end ())
  10.             return false;
  11.     }
  12.     (*it).second.push_back (observer);
  13.     return true;
  14. }
  15. bool Multicaster::unsubscribe (MulticastObserver *observer, std::string address)
  16. {
  17.     AddressSpace::iterator  it = m_addresses.find (address);
  18.     if (it == m_addresses.end ())
  19.         return false;
  20.     unsubscribe ((*it).second, observer);
  21.     return true;
  22. }
  23. bool Multicaster::publish (MulticastObserver *publisher, std::string address, Value value)
  24. {
  25.     AddressSpace::iterator  it = m_addresses.find (address);
  26.     if (it == m_addresses.end ())
  27.         return false;
  28.     Subscriptions& subscriptions = (*it).second;
  29.     for (Subscriptions::iterator subit = subscriptions.begin ();
  30.             subit != subscriptions.end ();
  31.             ++subit) {
  32.  
  33.         MulticastObserver *subscriber = *subit;
  34.         if (subscriber != publisher)
  35.             subscriber->accept (address, value);
  36.         
  37.     } 
  38.     return true;
  39. }
  40. void Multicaster::unsubscribeFromAll (MulticastObserver *observer)
  41. {
  42.     for (AddressSpace::iterator it = m_addresses.begin ();
  43.             it != m_addresses.end ();
  44.             ++it)
  45.         unsubscribe ((*it).second, observer);
  46. }
  47. void Multicaster::unsubscribe (Subscriptions& subscriptions, MulticastObserver *observerToRemove)
  48. {
  49.     for (Subscriptions::iterator it = subscriptions.begin (); it != subscriptions.end (); ) {
  50.         if (*it == observerToRemove)
  51.             it = subscriptions.erase (it);
  52.         else
  53.             it++;
  54.     }
  55. }