summaryrefslogtreecommitdiff
path: root/gatoattclient.h
blob: 64df313b2b51016e301050cfff75b0daf1895942 (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
#ifndef GATOATTCLIENT_H
#define GATOATTCLIENT_H

#include <QtCore/QObject>
#include <QtCore/QQueue>
#include "gatosocket.h"
#include "gatouuid.h"

class GatoAttClient : public QObject
{
	Q_OBJECT

public:
	explicit GatoAttClient(QObject *parent = 0);
	~GatoAttClient();

	GatoSocket::State state() const;

	bool connectTo(const GatoAddress& addr, GatoSocket::SecurityLevel sec_level);
	void close();

	struct InformationData
	{
		GatoHandle handle;
		GatoUUID uuid;
	};
	struct HandleInformation
	{
		GatoHandle start;
		GatoHandle end;
	};
	struct AttributeData
	{
		GatoHandle handle;
		QByteArray value;
	};
	struct AttributeGroupData
	{
		GatoHandle start;
		GatoHandle end;
		QByteArray value;
	};

	int mtu() const;

	uint request(int opcode, const QByteArray &data, QObject *receiver, const char *member);
	uint requestExchangeMTU(quint16 client_mtu, QObject *receiver, const char *member);
	uint requestFindInformation(GatoHandle start, GatoHandle end, QObject *receiver, const char *member);
	uint requestFindByTypeValue(GatoHandle start, GatoHandle end, const GatoUUID &uuid, const QByteArray& value, QObject *receiver, const char *member);
	uint requestReadByType(GatoHandle start, GatoHandle end, const GatoUUID &uuid, QObject *receiver, const char *member);
	uint requestRead(GatoHandle handle, QObject *receiver, const char *member);
	uint requestReadByGroupType(GatoHandle start, GatoHandle end, const GatoUUID &uuid, QObject *receiver, const char *member);
	uint requestWrite(GatoHandle handle, const QByteArray &value, QObject *receiver, const char *member);
	void cancelRequest(uint id);

	void command(int opcode, const QByteArray &data);
	void commandWrite(GatoHandle handle, const QByteArray &value);

signals:
	void connected();
	void disconnected();

	void attributeUpdated(GatoHandle handle, const QByteArray &value, bool confirmed);

private:
	struct Request
	{
		uint id;
		quint8 opcode;
		QByteArray pkt;
		QObject *receiver;
		QByteArray member;
	};

	void sendARequest();
	bool handleEvent(const QByteArray &event);
	bool handleResponse(const Request& req, const QByteArray &response);

	QList<InformationData> parseInformationData(const QByteArray &data);
	QList<HandleInformation> parseHandleInformation(const QByteArray &data);
	QList<AttributeData> parseAttributeData(const QByteArray &data);
	QList<AttributeGroupData> parseAttributeGroupData(const QByteArray &data);

private slots:
	void handleSocketConnected();
	void handleSocketDisconnected();
	void handleSocketReadyRead();

	void handleServerMTU(uint req, quint16 server_mtu);

private:
	GatoSocket *socket;
	quint16 cur_mtu;
	uint next_id;
	QQueue<Request> pending_requests;
	GatoSocket::SecurityLevel required_sec;
};

#endif // GATOATTCLIENT_H