70 void readDescriptor(
const QSharedPointer<QLowEnergyServicePrivate> service,
78 void writeDescriptor(
const QSharedPointer<QLowEnergyServicePrivate> service,
86 int mtu()
const override;
114 QQueue<Request> openRequests;
116 struct WriteRequest {
124 QList<WriteRequest> openPrepareWriteRequests;
127 QList<QLowEnergyHandle> scheduledIndications;
128 bool indicationInFlight =
false;
130 struct TempClientConfigurationData {
133 : descData(dd), charValueHandle(chHndl), configHandle(coHndl) {}
140 struct ClientConfigurationData {
143 : charValueHandle(chHndl), configHandle(coHndl), configValue(
val) {}
148 bool charValueWasUpdated =
false;
150 QHash<quint64, QList<ClientConfigurationData>> clientConfigData;
153 SigningData() =
default;
160 QHash<quint64, SigningData> signingData;
165 int securityLevelValue;
166 bool encryptionChangePending;
167 bool receivedMtuExchangeRequest =
false;
169 std::shared_ptr<HciManager> hciManager;
172 QTimer *requestTimer =
nullptr;
190 int gattRequestTimeout = 20000;
192 void handleConnectionRequest();
193 void closeServerSocket();
195 bool isBonded()
const;
196 QList<TempClientConfigurationData> gatherClientConfigData();
197 void storeClientConfigurations();
198 void restoreClientConfigurations();
200 enum SigningKeyType { LocalSigningKey, RemoteSigningKey };
201 void loadSigningDataIfNecessary(SigningKeyType keyType);
202 void storeSignCounter(SigningKeyType keyType)
const;
203 QString signingKeySettingsGroup(SigningKeyType keyType)
const;
204 QString keySettingsFilePath()
const;
207 void sendNextPendingRequest();
212 void sendReadByTypeRequest(QSharedPointer<QLowEnergyServicePrivate> serviceData,
214 void sendReadValueRequest(
QLowEnergyHandle attributeHandle,
bool isDescriptor);
216 bool readCharacteristics);
220 void discoverServiceDescriptors(
const QBluetoothUuid &serviceUuid);
221 void discoverNextDescriptor(QSharedPointer<QLowEnergyServicePrivate> serviceData,
222 const QList<QLowEnergyHandle> pendingCharHandles,
224 void processUnsolicitedReply(
const QByteArray &msg);
226 bool setSecurityLevel(
int level);
227 int securityLevel()
const;
235 void resetController();
237 void handleAdvertisingError();
239 bool checkPacketSize(
const QByteArray &packet,
int minSize,
int maxSize = -1);
244 void handleExchangeMtuRequest(
const QByteArray &packet);
245 void handleFindInformationRequest(
const QByteArray &packet);
246 void handleFindByTypeValueRequest(
const QByteArray &packet);
247 void handleReadByTypeRequest(
const QByteArray &packet);
248 void handleReadRequest(
const QByteArray &packet);
249 void handleReadBlobRequest(
const QByteArray &packet);
250 void handleReadMultipleRequest(
const QByteArray &packet);
251 void handleReadByGroupTypeRequest(
const QByteArray &packet);
252 void handleWriteRequestOrCommand(
const QByteArray &packet);
253 void handlePrepareWriteRequest(
const QByteArray &packet);
254 void handleExecuteWriteRequest(
const QByteArray &packet);
259 using ElemWriter = std::function<
void(
const Attribute &,
char *&)>;
261 const QList<Attribute> &attributes,
const ElemWriter &elemWriter);
266 void sendNextIndication();
268 void ensureUniformAttributes(QList<Attribute> &attributes,
269 const std::function<
int(
const Attribute &)> &
getSize);
270 void ensureUniformUuidSizes(QList<Attribute> &attributes);
271 void ensureUniformValueSizes(QList<Attribute> &attributes);
273 using AttributePredicate = std::function<bool(
const Attribute &)>;
274 QList<Attribute> getAttributes(
276 const AttributePredicate &attributePredicate = [](
const Attribute &) {
return true; });
286 void updateLocalAttributeValue(
292 void writeCharacteristicForPeripheral(
295 void writeCharacteristicForCentral(
const QSharedPointer<QLowEnergyServicePrivate> &service,
301 void writeDescriptorForPeripheral(
302 const QSharedPointer<QLowEnergyServicePrivate> &service,
306 void writeDescriptorForCentral(
311 void restartRequestTimer();
312 void establishL2cpClientSocket();
313 void createServicesForCentralIfRequired();
316 void l2cpConnected();
317 void l2cpDisconnected();
319 void l2cpReadyRead();
321 void handleGattRequestTimeout();
322 void activeConnectionTerminationDone();
static QSize getSize(QTextDocument *doc, const QTextImageFormat &format)