summaryrefslogtreecommitdiffstats
path: root/src/bluetooth/qbluetoothsocket.h
blob: 53aa9f25d76ec4efad51062231474c4b039a3370 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
// 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 QBLUETOOTHSOCKET_H
#define QBLUETOOTHSOCKET_H

#include <QtBluetooth/qtbluetoothglobal.h>

#include <QtBluetooth/qbluetooth.h>
#include <QtBluetooth/qbluetoothaddress.h>
#include <QtBluetooth/qbluetoothuuid.h>
#include <QtBluetooth/qbluetoothserviceinfo.h>

#include <QtCore/qiodevice.h>

QT_BEGIN_NAMESPACE


class QBluetoothSocketBasePrivate;

class Q_BLUETOOTH_EXPORT QBluetoothSocket : public QIODevice
{
    Q_OBJECT

    Q_DECLARE_PRIVATE(QBluetoothSocketBase)

    friend class QBluetoothServer;
    friend class QBluetoothServerPrivate;
    friend class QBluetoothSocketPrivateDarwin;
    friend class QBluetoothSocketPrivateAndroid;
    friend class QBluetoothSocketPrivateBluez;
    friend class QBluetoothSocketPrivateBluezDBus;
    friend class QBluetoothSocketPrivateDummy;
    friend class QBluetoothSocketPrivateWin;
    friend class QBluetoothSocketPrivateWinRT;

public:

    enum class SocketState {
        UnconnectedState,
        ServiceLookupState,
        ConnectingState,
        ConnectedState,
        BoundState,
        ClosingState,
        ListeningState
    };
    Q_ENUM(SocketState)

    enum class SocketError {
        NoSocketError,
        UnknownSocketError,
        RemoteHostClosedError,
        HostNotFoundError,
        ServiceNotFoundError,
        NetworkError,
        UnsupportedProtocolError,
        OperationError,
        MissingPermissionsError
    };
    Q_ENUM(SocketError)

    explicit QBluetoothSocket(QBluetoothServiceInfo::Protocol socketType, QObject *parent = nullptr);   // create socket of type socketType
    explicit QBluetoothSocket(QObject *parent = nullptr);  // create a blank socket
    virtual ~QBluetoothSocket();

    void abort();

    void close() override;

    bool isSequential() const override;

    qint64 bytesAvailable() const override;
    qint64 bytesToWrite() const override;

    bool canReadLine() const override;

    void connectToService(const QBluetoothServiceInfo &service, OpenMode openMode = ReadWrite);
    void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, OpenMode openMode = ReadWrite);
    void connectToService(const QBluetoothAddress &address, quint16 port, OpenMode openMode = ReadWrite);
    inline void connectToService(const QBluetoothAddress &address, QBluetoothUuid::ServiceClassUuid uuid,
                                 OpenMode mode = ReadWrite)
    {
        connectToService(address, QBluetoothUuid(uuid), mode);
    }
    void disconnectFromService();

    //bool flush();
    //bool isValid() const;

    QString localName() const;
    QBluetoothAddress localAddress() const;
    quint16 localPort() const;

    QString peerName() const;
    QBluetoothAddress peerAddress() const;
    quint16 peerPort() const;
    //QBluetoothServiceInfo peerService() const;

    //qint64 readBufferSize() const;
    //void setReadBufferSize(qint64 size);

    bool setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType,
                             SocketState socketState = SocketState::ConnectedState,
                             OpenMode openMode = ReadWrite);
    int socketDescriptor() const;

    QBluetoothServiceInfo::Protocol socketType() const;
    SocketState state() const;
    SocketError error() const;
    QString errorString() const;

    //bool waitForConnected(int msecs = 30000);
    //bool waitForDisconnected(int msecs = 30000);
    //virtual bool waitForReadyRead(int msecs = 30000);

    void setPreferredSecurityFlags(QBluetooth::SecurityFlags flags);
    QBluetooth::SecurityFlags preferredSecurityFlags() const;

Q_SIGNALS:
    void connected();
    void disconnected();
    void errorOccurred(QBluetoothSocket::SocketError error);
    void stateChanged(QBluetoothSocket::SocketState state);

protected:
    qint64 readData(char *data, qint64 maxSize) override;
    qint64 writeData(const char *data, qint64 maxSize) override;

    void setSocketState(SocketState state);
    void setSocketError(SocketError error);

    void doDeviceDiscovery(const QBluetoothServiceInfo &service, OpenMode openMode);

private Q_SLOTS:
    void serviceDiscovered(const QBluetoothServiceInfo &service);
    void discoveryFinished();


protected:
#if QT_CONFIG(bluez)
    //evil hack to enable QBluetoothServer on Bluez to set the desired d_ptr
    explicit QBluetoothSocket(QBluetoothSocketBasePrivate *d,
                              QBluetoothServiceInfo::Protocol socketType,
                              QObject *parent = nullptr);
#endif

    QBluetoothSocketBasePrivate *d_ptr;

private:
    friend class QLowEnergyControllerPrivateBluez;
};


QT_END_NAMESPACE

#endif