Listener& Streams::subscribe(Peer& peer,UInt32 id,const string& name,FlowWriter& writer,double start) { Publications::Iterator it = createPublication(name); Publication& publication(*it->second); try { return publication.addListener(peer,id,writer,start==-3000 ? true : false); } catch(...) { if(publication.publisherId()==0 && publication.listeners.count()==0) destroyPublication(it); throw; } }
void Streams::unsubscribe(Peer& peer,UInt32 id,const string& name) { Publications::Iterator it = _publications.find(name); if(it == _publications.end()) { DEBUG("The stream '%s' doesn't exists, unsubscribe useless",name.c_str()); return; } Publication& publication(*it->second); publication.removeListener(peer,id); if(publication.publisherId()==0 && publication.listeners.count()==0) destroyPublication(it); }
void Streams::unpublish(Peer& peer,UInt32 id,const string& name) { Publications::Iterator it = _publications.find(name); if(it == _publications.end()) { DEBUG("The stream '%s' with a %u id doesn't exist, unpublish useless",name.c_str(),id); return; } Publication& publication(*it->second); publication.stop(peer,id); if(publication.publisherId()==0 && publication.listeners.count()==0) destroyPublication(it); }
void Invoker::unpublish(Peer& peer,const string& name) { auto& it = _publications.find(name); if(it == _publications.end()) { DEBUG("The publication '",name,"' doesn't exist, unpublish useless"); return; } Publication& publication(it->second); publication.stop(peer); if(!publication.publisher() && publication.listeners.count()==0) _publications.erase(it); }
void Streams::unsubscribe(const Client& client,UInt32 id,const string& name) { Publications::Iterator it = publications(name); if(it == publications.end()) { DEBUG("The stream '%s' doesn't exists, unsubscribe useless",name.c_str()); return; } Publication& publication(*it->second); publication.removeListener(client,id); if(publication.publisherId()==0 && publication.listeners.count()==0) publications.destroy(it); }
void Streams::unpublish(const Client& client,UInt32 id,const string& name) { Publications::Iterator it = publications(name); if(it == publications.end()) { DEBUG("The stream '%s' with a %u id doesn't exist, unpublish useless",name.c_str(),id); return; } Publication& publication(*it->second); publication.stop(client,id); if(publication.publisherId()==0 && publication.listeners.count()==0) publications.destroy(it); }
Publication& Streams::publish(Peer& peer,UInt32 id,const string& name,FlowWriter* pController) { Publications::Iterator it = createPublication(name); Publication& publication(*it->second); try { publication.start(peer,id,pController); } catch(...) { if(publication.publisherId()==0 && publication.listeners.count()==0) destroyPublication(it); throw; } return publication; }