62 lines
1.6 KiB
C++
62 lines
1.6 KiB
C++
|
#include "qcp.h"
|
||
|
|
||
|
#define SERVICETYPE "_qcp._tcp"
|
||
|
|
||
|
namespace QCP {
|
||
|
Browse::Browse(QObject *parent)
|
||
|
: QObject(parent), m_av_browse(new Avahi::Browse(SERVICETYPE, this)) {
|
||
|
connect(m_av_browse, SIGNAL(found(Avahi::Service)), this, SLOT(foundService(Avahi::Service)));
|
||
|
connect(m_av_browse, SIGNAL(lost(Avahi::Service)), this, SLOT(lostService(Avahi::Service)));
|
||
|
connect(m_av_browse, SIGNAL(started()), this, SIGNAL(started()));
|
||
|
connect(m_av_browse, SIGNAL(stopped()), this, SIGNAL(stopped()));
|
||
|
}
|
||
|
|
||
|
WatchShare *Browse::watch(const Avahi::Service &service, QObject *parent) {
|
||
|
ShareData *sd = shareData(service);
|
||
|
WatchShare *ws;
|
||
|
if (!sd) return 0;
|
||
|
|
||
|
sd->watcherList.append(ws = new WatchShare(parent, Share(this, service)));
|
||
|
ws->m_list_it = sd->watcherList.end()-1;
|
||
|
|
||
|
return ws;
|
||
|
}
|
||
|
|
||
|
void Browse::removeWatch(WatcherList::iterator it, const Avahi::Service &service) {
|
||
|
ShareData *sd = shareData(service);
|
||
|
if (!sd || WatcherList::iterator() == it) return;
|
||
|
|
||
|
sd->watcherList.erase(it);
|
||
|
}
|
||
|
|
||
|
void Browse::foundService(Avahi::Service s) {
|
||
|
ShareData *sd = new ShareData();
|
||
|
s.setData(sd);
|
||
|
emit found(Share(this, s));
|
||
|
}
|
||
|
|
||
|
void Browse::lostService(Avahi::Service s) {
|
||
|
emit lost(Share(this, s));
|
||
|
ShareData *sd = shareData(s);
|
||
|
if (0 != sd) {
|
||
|
while (!sd->watcherList.empty()) {
|
||
|
WatchShare *ws = sd->watcherList.first();
|
||
|
emit ws->lost();
|
||
|
if (ws == sd->watcherList.first()) {
|
||
|
ws->m_list_it = WatcherList::iterator();
|
||
|
sd->watcherList.pop_front();
|
||
|
}
|
||
|
}
|
||
|
delete sd;
|
||
|
}
|
||
|
sd->data = 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
WatchShare *Share::watch(QObject *parent) {
|
||
|
return m_browse->watch(m_service, parent);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|