diff options
Diffstat (limited to 'src/libs/zeroconf/servicebrowser_p.h')
-rw-r--r-- | src/libs/zeroconf/servicebrowser_p.h | 358 |
1 files changed, 0 insertions, 358 deletions
diff --git a/src/libs/zeroconf/servicebrowser_p.h b/src/libs/zeroconf/servicebrowser_p.h deleted file mode 100644 index 2a980845ffa..00000000000 --- a/src/libs/zeroconf/servicebrowser_p.h +++ /dev/null @@ -1,358 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://www.qt.io/licensing. For further information -** use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef SERVICEBROWSER_P_H -#define SERVICEBROWSER_P_H - -#include "dns_sd_types.h" -#include "servicebrowser.h" - -#include <QCoreApplication> -#include <QAtomicInt> -#include <QHash> -#include <QList> -#include <QMap> -#include <QMutex> -#include <QSharedPointer> -#include <QStringList> -#include <QThread> - -namespace ZeroConf { - -class ServiceBrowser; - -namespace Internal { - -class ServiceGatherer; -class ServiceBrowserPrivate; - -enum ZK_IP_Protocol { - ZK_PROTO_IPv4_OR_IPv6, - ZK_PROTO_IPv4, - ZK_PROTO_IPv6 -}; - -// represents a zero conf library exposing the dns-sd interface -class ZConfLib { - Q_DECLARE_TR_FUNCTIONS(ZeroConf::Internal::ZConfLib) -public: - typedef QSharedPointer<ZConfLib> Ptr; - typedef void *ConnectionRef; - typedef void *BrowserRef; - enum RunLoopStatus { - ProcessedIdle, - ProcessedOk, - ProcessedQuit, - ProcessedError, - ProcessedFailure - }; - enum { - // Note: the select() implementation on Windows (Winsock2) fails with any timeout much larger than this - MAX_SEC_FOR_READ = 100000000 - }; - Ptr fallbackLib; - - ZConfLib(Ptr fallBack); - virtual ~ZConfLib(); - - virtual QString name(); - - virtual bool tryStartDaemon(ErrorMessage::ErrorLogger *logger = 0); - - virtual void refDeallocate(DNSServiceRef sdRef) = 0; - virtual void browserDeallocate(BrowserRef *sdRef) = 0; - virtual DNSServiceErrorType resolve(ConnectionRef cRef, DNSServiceRef *sdRef, - uint32_t interfaceIndex, ZK_IP_Protocol protocol, - const char *name, const char *regtype, - const char *domain, ServiceGatherer *gatherer) = 0; - virtual DNSServiceErrorType queryRecord(ConnectionRef cRef, DNSServiceRef *sdRef, - uint32_t interfaceIndex, const char *fullname, - ServiceGatherer *gatherer) = 0; - virtual DNSServiceErrorType getAddrInfo(ConnectionRef cRef, DNSServiceRef *sdRef, - uint32_t interfaceIndex, DNSServiceProtocol protocol, - const char *hostname, ServiceGatherer *gatherer) = 0; - - virtual DNSServiceErrorType reconfirmRecord(ConnectionRef cRef, uint32_t interfaceIndex, - const char *name, const char *type, - const char *domain, const char *fullname) = 0; - virtual DNSServiceErrorType browse(ConnectionRef cRef, BrowserRef *sdRef, - uint32_t interfaceIndex, - const char *regtype, const char *domain, - ServiceBrowserPrivate *browser) = 0; - virtual DNSServiceErrorType getProperty(const char *property, void *result, uint32_t *size) = 0; - virtual RunLoopStatus processOneEventBlock(ConnectionRef sdRef) = 0; - virtual RunLoopStatus processOneEvent(MainConnection *mainConnection, - ConnectionRef sdRef, qint64 maxMsBlock); - virtual DNSServiceErrorType createConnection(MainConnection *mainConnection, - ConnectionRef *sdRef) = 0; - virtual void stopConnection(ConnectionRef cRef) = 0; - virtual void destroyConnection(ConnectionRef *sdRef) = 0; - virtual int refSockFD(ConnectionRef sdRef) = 0; - bool isOk(); - QString errorMsg(); - void setError(bool failure, const QString &eMsg); - int nFallbacks() const; - int maxErrors() const; - - static Ptr createEmbeddedLib(const QString &daemonPath, const Ptr &fallback = Ptr(0)); - static Ptr createDnsSdLib(const QString &libName, const Ptr &fallback = Ptr(0)); - static Ptr createAvahiLib(const QString &libName, const QString &version, const Ptr &fallback = Ptr(0)); -protected: - bool m_isOk; - QString m_errorMsg; - int m_maxErrors; -}; - -/// class that gathers all needed info on a service, all its methods (creation included) are -/// supposed to be called by the listener/reaction thread -class ServiceGatherer { -public: - QString hostName; - ServiceBrowserPrivate *serviceBrowser; - QHostInfo *host; - Service::Ptr publishedService; - Service *currentService; - - typedef QSharedPointer<ServiceGatherer> Ptr; - - enum Status { - ResolveConnectionFailed = 1 << 0, - ResolveConnectionActive = 1 << 1, - ResolveConnectionSuccess = 1 << 2, - ResolveConnectionV6Failed = 1 << 3, - ResolveConnectionV6Active = 1 << 4, - ResolveConnectionV6Success = 1 << 5, - TxtConnectionFailed = 1 << 6, - TxtConnectionActive = 1 << 7, - TxtConnectionSuccess = 1 << 8, - AddrConnectionFailed = 1 << 9, - AddrConnectionActive = 1 << 10, - AddrConnectionSuccess = 1 << 11 - }; - - QString fullName(); - bool enactServiceChange(); - void retireService(); - Ptr gatherer(); - - void stopResolve(ZK_IP_Protocol protocol = ZK_PROTO_IPv4_OR_IPv6); - void stopTxt(); - void stopHostResolution(); - void restartResolve(ZK_IP_Protocol protocol = ZK_PROTO_IPv4_OR_IPv6); - void restartTxt(); - void restartHostResolution(); - - bool currentServiceCanBePublished(); - - ~ServiceGatherer(); - static Ptr createGatherer(const QString &newService, const QString &newType, - const QString &newDomain, const QString &fullName, - uint32_t interfaceIndex, ZK_IP_Protocol protocol, - ServiceBrowserPrivate *serviceBrowser); - - void serviceResolveReply(DNSServiceFlags flags, uint32_t interfaceIndex, - DNSServiceErrorType errorCode, const char *hosttarget, - const QString &port, uint16_t txtLen, - const unsigned char *rawTxtRecord); - - void txtRecordReply(DNSServiceFlags flags, DNSServiceErrorType errorCode, - uint16_t txtLen, const void *rawTxtRecord, uint32_t ttl); - void txtFieldReply(DNSServiceFlags flags, DNSServiceErrorType errorCode, - uint16_t txtLen, const void *rawTxtRecord, uint32_t ttl); - - void addrReply(DNSServiceFlags flags, DNSServiceErrorType errorCode, const char *hostname, - const struct sockaddr *address, uint32_t ttl); - void maybeRemove(); - void stop(ZK_IP_Protocol protocol = ZK_PROTO_IPv4_OR_IPv6); - void reload(qint32 interfaceIndex = 0, ZK_IP_Protocol protocol = ZK_PROTO_IPv4_OR_IPv6); - void remove(); - void reconfirm(); - ZConfLib::Ptr lib(); -private: - ServiceGatherer(const QString &newService, const QString &newType, const QString &newDomain, - const QString &fullName, uint32_t interfaceIndex, - ZK_IP_Protocol protocol, ServiceBrowserPrivate *serviceBrowser); - - DNSServiceRef resolveConnection; - DNSServiceRef resolveConnectionV6; - DNSServiceRef txtConnection; - DNSServiceRef addrConnection; - uint32_t interfaceIndex; - - quint32 status; - QWeakPointer<ServiceGatherer> self; -}; - -//Q_DECLARE_METATYPE(Service::ConstPtr) - -class ConnectionThread; - -class MainConnection : private ErrorMessage::ErrorLogger { - Q_DECLARE_TR_FUNCTIONS(ZeroConf) -public: - enum RequestFlowStatus { - NormalRFS, - MoreComingRFS, - ForceUpdateRFS - }; - RequestFlowStatus flowStatus; - /// WARNING order matters in this enum, and status should only be changed with increaseStatusTo - enum Status { - Starting, - Started, - Running, - Stopping, - Stopped - }; - ZConfLib::Ptr lib; - - MainConnection(ServiceBrowserPrivate *initialBrowser = 0); - virtual ~MainConnection(); - QMutex *lock(); - QMutex *mainThreadLock(); - void waitStartup(); - void stop(bool wait = true); - void addBrowser(ServiceBrowserPrivate *browser); - void removeBrowser(ServiceBrowserPrivate *browser); - void updateFlowStatusForCancel(); - void updateFlowStatusForFlags(DNSServiceFlags flags); - void maybeUpdateLists(); - void gotoValidLib(); - void abortLib(); - void createConnection(); - void destroyConnection(); - ZConfLib::RunLoopStatus handleEvent(); - bool increaseStatusTo(int s); - void handleEvents(); - ZConfLib::ConnectionRef mainRef(); - Status status(); - - QList<ErrorMessage> errors(); - bool isOk(); - void startupPhase(int progress, const QString &msg); -private: - void appendError(ErrorMessage::SeverityLevel severity, const QString &msg); - - mutable QMutex m_lock, m_mainThreadLock; - QList<ServiceBrowserPrivate *> m_browsers; - ZConfLib::ConnectionRef m_mainRef; - bool m_failed; - ConnectionThread *m_thread; - QAtomicInt m_status; - int m_nErrs; - QList<ErrorMessage> m_errors; -}; - -class ServiceBrowserPrivate { -public: - ServiceBrowser *q; - QString serviceType; - QString domain; - MainConnectionPtr mainConnection; - ZConfLib::BrowserRef serviceConnection; - DNSServiceFlags flags; - uint32_t interfaceIndex; - QList<QString> knownServices; - QMap<QString, ServiceGatherer::Ptr> gatherers; - QList<Service::ConstPtr> activeServices; - QList<Service::ConstPtr> nextActiveServices; - QList<ServiceGatherer::Ptr> pendingGatherers; - qint64 delayDeletesUntil; - bool failed; - bool browsing; - bool autoResolveAddresses; - bool requireAddresses; - bool shouldRefresh; - - ZConfLib::ConnectionRef mainRef(); - void updateFlowStatusForCancel(); - void updateFlowStatusForFlags(DNSServiceFlags flags); - - void pendingGathererAdd(ServiceGatherer::Ptr gatherer); - - ServiceBrowserPrivate(const QString &serviceType, const QString &domain, bool requireAddresses, - MainConnectionPtr conn); - ~ServiceBrowserPrivate(); - - void insertGatherer(const QString &fullName); - void maybeUpdateLists(); - - void startBrowsing(quint32 interfaceIndex); - bool internalStartBrowsing(); - void stopBrowsing(); - void triggerRefresh(); - void refresh(); - void reconfirmService(Service::ConstPtr s); - - void browseReply(DNSServiceFlags flags, - uint32_t interfaceIndex, ZK_IP_Protocol proto, DNSServiceErrorType errorCode, - const char *serviceName, const char *regtype, const char *replyDomain); - - void activateAutoRefresh(); - void serviceChanged(const Service::ConstPtr &oldService, const Service::ConstPtr &newService, - ServiceBrowser *browser); - void serviceAdded(const Service::ConstPtr &service, ServiceBrowser *browser); - void serviceRemoved(const Service::ConstPtr &service, ServiceBrowser *browser); - void servicesUpdated(ServiceBrowser *browser); - void startupPhase(int progress, const QString &description); - void errorMessage(ErrorMessage::SeverityLevel severity, const QString &msg); - void hadFailure(const QList<ErrorMessage> &msgs); - void startedBrowsing(); -}; - -class ConnectionThread: public QThread { - MainConnection &connection; - - void run(); -public: - ConnectionThread(MainConnection &mc, QObject *parent = 0); -}; - -extern "C" void DNSSD_API cServiceResolveReply( - DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, - DNSServiceErrorType errorCode, const char *fullname, const char *hosttarget, uint16_t port, - uint16_t txtLen, const unsigned char *txtRecord, void *context); -extern "C" void DNSSD_API cTxtRecordReply(DNSServiceRef sdRef, DNSServiceFlags flags, - uint32_t interfaceIndex, DNSServiceErrorType errorCode, - const char *fullname, uint16_t rrtype, uint16_t rrclass, - uint16_t rdlen, const void *rdata, uint32_t ttl, - void *context); -extern "C" void DNSSD_API cAddrReply(DNSServiceRef sdRef, DNSServiceFlags flags, - uint32_t interfaceIndex, DNSServiceErrorType errorCode, - const char *hostname, const struct sockaddr *address, - uint32_t ttl, void *context); -extern "C" void DNSSD_API cBrowseReply(DNSServiceRef sdRef, DNSServiceFlags flags, - uint32_t interfaceIndex, DNSServiceErrorType errorCode, - const char *serviceName, const char *regtype, - const char *replyDomain, void *context); -} // namespace Internal -} // namespace Zeroconf - -#endif // SERVICEBROWSER_P_H |