next up previous contents
Next: Example 6: Priority Up: listener Previous: Example 4: CD Player   Contents

Example 5: RadioStation

using namespace listener ;

class Message: public Event {
public:
  Message(const std::string& m): m_(m) {}
  const std::string& message() const {return m_ ;}
private:
  std::string m_ ;
} ;

class RadioOff: public Event {
} ;

class RadioStation: public Publisher {
public:
  RadioStation(const std::string& name): name_(name) {}
  ~RadioStation()                 {igs_emit(RadioOff) ;}
  void send(const std::string& m) {igs_emit(Message(name_+": "+m)) ;}
  const std::string& name()       {return name_ ;}
private:
  std::string name_ ;
} ;

class Receiver: public Subscriber {
public:
  void message(Message* e)    {
    std::cerr << e->message() << std::endl ;
  }
  void radio_off(RadioOff* e) {
    RadioStation* s = dynamic_cast<RadioStation*>(e->get_source()) ;
    std::cerr << "Radio " << s->name() << " is now off" << std::endl ;
  }
} ;

int main() {
  RadioStation* radio1 = new RadioStation("105.5") ;
  RadioStation* radio2 = new RadioStation("98.3 ") ;
  Receiver*     r = new Receiver ;
  
  igs_connect(radio1, r, igs_functor(r, Receiver::message)) ;
  igs_connect(radio1, r, igs_functor(r, Receiver::radio_off)) ;
  igs_connect(radio2, r, igs_functor(r, Receiver::message)) ;
  igs_connect(radio2, r, igs_functor(r, Receiver::radio_off)) ;

  radio1->send("News") ;
  radio2->send("Music") ;

  delete radio1 ;
  radio2->send("Informations") ;

  igs_disconnect(radio2, r, igs_functor(r, Receiver::message)) ;
  radio2->send("Variety") ;
  
  delete radio2 ;
}
Will print:
  105.5: News
  98.3 : Music
  Radio 105.5 is now off
  98.3 : Informations
  Radio 98.3  is now off



Frantz Maerten 2006-01-30