summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qsocketnotifier.h
blob: ac9e577ebc821262d03b11485bef40d7deee6543 (plain)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
// Copyright (C) 2016 The Qt Company Ltd.// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only#ifndef QSOCKETNOTIFIER_H#define QSOCKETNOTIFIER_H#include <QtCore/qobject.h> QT_BEGIN_NAMESPACE class QSocketDescriptor;class QSocketNotifierPrivate;class Q_CORE_EXPORT QSocketNotifier :public QObject { Q_OBJECT Q_DECLARE_PRIVATE(QSocketNotifier)public:enum Type { Read, Write, Exception };explicitQSocketNotifier(Type, QObject *parent =nullptr);QSocketNotifier(qintptr socket, Type, QObject *parent =nullptr);~QSocketNotifier();voidsetSocket(qintptr socket); qintptr socket()const; Type type()const;boolisValid()const;boolisEnabled()const;public Q_SLOTS:voidsetEnabled(bool); Q_SIGNALS:#if defined(Q_MOC_RUN)// Add default arguments during Q_MOC_RUN which makes moc generate "signals" which takes less// parameters, but we won't actually allow emitting without all 3. This lets users use the// string-based connect without specifying QSocketNotifier::Type as one of the parameters.voidactivated(QSocketDescriptor socket,QSocketNotifier::Type activationEvent = Read, QPrivateSignal = {});#elsevoidactivated(QSocketDescriptor socket,QSocketNotifier::Type activationEvent, QPrivateSignal);#endif// ### Qt7: consider removing it.// The old signal is compiled internally, but hidden outside of this class.// This means the PMF-based connect(..) will automatically, on recompile, pick up the new// version while the old-style connect(..) can query the metaobject system for this version.#if defined(Q_MOC_RUN) || defined(BUILDING_QSOCKETNOTIFIER) || defined(Q_QDOC) QT_MOC_COMPAT voidactivated(int socket, QPrivateSignal);#endifprotected:boolevent(QEvent *) override;private:Q_DISABLE_COPY(QSocketNotifier)};class QSocketDescriptor {public:#if defined(Q_OS_WIN) || defined(Q_QDOC)using DescriptorType =Qt::HANDLE;#define Q_DECL_CONSTEXPR_NOT_WIN#elseusing DescriptorType =int;#define Q_DECL_CONSTEXPR_NOT_WIN Q_DECL_CONSTEXPR#endif Q_DECL_CONSTEXPR_NOT_WIN Q_IMPLICIT QSocketDescriptor(DescriptorType descriptor =DescriptorType(-1)) noexcept :sockfd(descriptor){}#if defined(Q_OS_WIN) || defined(Q_QDOC) Q_IMPLICIT QSocketDescriptor(qintptr desc) noexcept :sockfd(DescriptorType(desc)) {} Q_IMPLICIT operatorqintptr()const noexcept {returnqintptr(sockfd); } Q_DECL_CONSTEXPR Qt::HANDLE winHandle()const noexcept {return sockfd; }#endif Q_DECL_CONSTEXPR operatorDescriptorType()const noexcept {return sockfd; } Q_DECL_CONSTEXPR_NOT_WIN boolisValid()const noexcept {return*this!=QSocketDescriptor(); }private:friend Q_DECL_CONSTEXPR_NOT_WIN boolcomparesEqual(const QSocketDescriptor &lhs,const QSocketDescriptor &rhs) noexcept {return lhs.sockfd == rhs.sockfd;}#if defined(Q_OS_WIN) || defined(Q_QDOC)Q_DECLARE_EQUALITY_COMPARABLE(QSocketDescriptor)#elseQ_DECLARE_EQUALITY_COMPARABLE_LITERAL_TYPE(QSocketDescriptor)#endif#undef Q_DECL_CONSTEXPR_NOT_WIN DescriptorType sockfd;}; QT_END_NAMESPACE QT_DECL_METATYPE_EXTERN_TAGGED(QSocketNotifier::Type, QSocketNotifier_Type, Q_CORE_EXPORT)QT_DECL_METATYPE_EXTERN(QSocketDescriptor, Q_CORE_EXPORT)#endif// QSOCKETNOTIFIER_H
close