#ifndef QTAVAHI_H #define QTAVAHI_H #include #include "libqtavahi_global.h" namespace Avahi { class LIBQTAVAHISHARED_EXPORT Service; class LIBQTAVAHISHARED_EXPORT ServiceKey; class LIBQTAVAHISHARED_EXPORT Browse; class LIBQTAVAHISHARED_EXPORT Announce; } /* we need this before #include so it finds our qHash function */ inline uint qHash(const Avahi::ServiceKey& k); #include #include #include #include #include #include "qtavahi_p.h" namespace Avahi { class LIBQTAVAHISHARED_EXPORT Service { public: inline Service() : m_priv(0) { } inline Service(QString name, QString hostname, QString domain, QHostAddress address, int interface, int protocol, quint16 port, QHash txt) : m_priv(new Avahi::priv::ServiceP(name, hostname, domain, address, interface, protocol, port, txt)) { } inline Service(const Service &s) : m_priv(0) { assign(s.m_priv); } inline Service &operator=(const Service &s) { assign(s.m_priv); return *this; } ~Service() { assign(0); } inline QString name() const { return m_priv ? m_priv->m_name : QString(); } inline QString hostname() const { return m_priv ? m_priv->m_hostname : QString(); } inline QString domain() const { return m_priv ? m_priv->m_domain : QString(); } inline QHostAddress address() const { return m_priv ? m_priv->m_address : QHostAddress(); } inline quint16 port() const { return m_priv ? m_priv->m_port : 0; } inline QHash txt() const { return m_priv ? m_priv->m_txt : QHash(); } inline QString txt(QString key) const { return m_priv ? m_priv->m_txt.value(key) : QString(); } inline bool valid() const { return 0 != m_priv; } /* save custom data for a service (the service is probably associated with a Browse instance, so all code using the same Browse instance uses the same private data here */ inline void* data() const { return m_priv ? m_priv->m_data : 0; } inline void setData(void *data) const { if (m_priv) m_priv->m_data = data; } private: friend class Avahi::ServiceKey; inline void assign(Avahi::priv::ServiceP *p) { if (p == m_priv) return; if (p) p->ref(); if (m_priv) m_priv->deref(); m_priv = p; } Avahi::priv::ServiceP *m_priv; }; class LIBQTAVAHISHARED_EXPORT ServiceKey { public: inline ServiceKey(int interface, int protocol, const char *name, const char *domain) : interface(interface), protocol(protocol), name(QString::fromUtf8(name)), domain(QString::fromUtf8(domain)) { } inline ServiceKey(int interface, int protocol, QString name, QString domain) : interface(interface), protocol(protocol), name(name), domain(domain) { } inline ServiceKey(const Service &s) : interface(-1), protocol(-1), name(), domain() { if (s.m_priv) { interface = s.m_priv->m_interface; protocol = s.m_priv->m_protocol; name = s.m_priv->m_name; domain = s.m_priv->m_domain; } } int interface; /* AvahiIfIndex */ int protocol; /* AvahiProtocol */ QString name; QString domain; }; inline bool operator==(const ServiceKey &a, const ServiceKey &b) { return a.interface == b.interface && a.protocol == b.protocol && a.name == b.name && a.domain == b.domain; } inline bool operator<(const ServiceKey &a, const ServiceKey &b) { if (a.interface < b.interface) return true; if (a.interface > b.interface) return false; if (a.protocol < b.protocol) return true; if (a.protocol > b.protocol) return false; if (a.name < b.name) return true; if (a.name > b.name) return false; return a.domain < b.domain; } inline bool operator>(const ServiceKey &a, const ServiceKey &b) { return b < a; } inline bool operator<=(const ServiceKey &a, const ServiceKey &b) { return !(b < a); } inline bool operator>=(const ServiceKey &a, const ServiceKey &b) { return !(a < b); } class LIBQTAVAHISHARED_EXPORT Browse : public QObject { Q_OBJECT private: Q_DISABLE_COPY(Browse); public: typedef Avahi::priv::Protocol Protocol; inline Browse(QString servtype, Protocol prot, QObject *parent = 0) { Browse(Avahi::priv::serv_prot2str(servtype, prot), parent); } Browse(QString serviceType, QObject *parent = 0); virtual ~Browse(); bool start(); void stop(); QString serviceType() const; QList currentList() const; private: void clearList(); signals: void found(Avahi::Service i); void lost(Avahi::Service i); void started(); void stopped(); private: Avahi::priv::BrowseP *m_priv; friend class Avahi::priv::BrowseP; }; class LIBQTAVAHISHARED_EXPORT Announce : public QObject { Q_OBJECT private: Q_DISABLE_COPY(Announce); public: typedef Avahi::priv::Protocol Protocol; inline Announce(QString servtype, Protocol prot, QString name, quint16 port, QHash txt, QObject *parent = 0) { Announce(Avahi::priv::serv_prot2str(servtype, prot), name, port, txt, parent); } Announce(QString serviceType, QString name, quint16 port, QHash txt, QObject *parent = 0); virtual ~Announce(); QString serviceType() const; QString name() const; quint16 port() const; QHash txt() const; QString txt(QString key) const; bool start(); void stop(); signals: void established(); /* the name may have been changed after collisions */ void collision(); void started(); void stopped(); private: Avahi::priv::AnnounceP *m_priv; friend class Avahi::priv::AnnounceP; }; } QT_BEGIN_NAMESPACE inline uint qHash(const Avahi::ServiceKey& k) { return qHash(k.interface ^ k.protocol) ^ qHash(k.name) ^ qHash(k.domain); } QT_END_NAMESPACE #endif // QTAVAHI_H