2626
2727# include < climits>
2828
29+ // Private structure used to filter descriptors during discovery and return results.
2930struct NimBLEDescriptorFilter {
30- NimBLERemoteDescriptor* dsc;
31+ NimBLEDescriptorFilter () = delete ;
32+ NimBLEDescriptorFilter (const NimBLEUUID* uuid, NimBLEUtils::TaskData* td = nullptr ) : uuid(uuid), taskData(td) {}
3133 const NimBLEUUID* uuid;
32- void * taskData;
34+ NimBLEUtils::TaskData* taskData;
35+ NimBLERemoteDescriptor* dsc{nullptr };
3336};
3437
3538static const char * LOG_TAG = " NimBLERemoteCharacteristic" ;
@@ -117,9 +120,11 @@ bool NimBLERemoteCharacteristic::retrieveDescriptors(NimBLEDescriptorFilter* pFi
117120 }
118121
119122 NimBLEUtils::TaskData taskData (const_cast <NimBLERemoteCharacteristic*>(this ));
120- NimBLEDescriptorFilter defaultFilter{ nullptr , nullptr , &taskData} ;
123+ NimBLEDescriptorFilter defaultFilter ( nullptr , &taskData) ;
121124 if (pFilter == nullptr ) {
122125 pFilter = &defaultFilter;
126+ } else {
127+ pFilter->taskData = &taskData;
123128 }
124129
125130 int rc = ble_gattc_disc_all_dscs (getClient ()->getConnHandle (),
@@ -134,7 +139,7 @@ bool NimBLERemoteCharacteristic::retrieveDescriptors(NimBLEDescriptorFilter* pFi
134139
135140 auto prevDscCount = m_vDescriptors.size ();
136141 NimBLEUtils::taskWait (taskData, BLE_NPL_TIME_FOREVER);
137- rc = ((NimBLEUtils::TaskData*)pFilter-> taskData )-> m_flags ;
142+ rc = taskData. m_flags ;
138143 if (rc != BLE_HS_EDONE) {
139144 NIMBLE_LOGE (LOG_TAG, " << retrieveDescriptors(): failed: rc=%d %s" , rc, NimBLEUtils::returnCodeToString (rc));
140145 return false ;
@@ -156,8 +161,7 @@ bool NimBLERemoteCharacteristic::retrieveDescriptors(NimBLEDescriptorFilter* pFi
156161NimBLERemoteDescriptor* NimBLERemoteCharacteristic::getDescriptor (const NimBLEUUID& uuid) const {
157162 NIMBLE_LOGD (LOG_TAG, " >> getDescriptor: uuid: %s" , uuid.toString ().c_str ());
158163 NimBLEUUID uuidTmp{uuid};
159- NimBLEUtils::TaskData taskData (const_cast <NimBLERemoteCharacteristic*>(this ));
160- NimBLEDescriptorFilter filter{nullptr , &uuidTmp, &taskData};
164+ NimBLEDescriptorFilter filter (&uuidTmp);
161165
162166 for (const auto & dsc : m_vDescriptors) {
163167 if (dsc->getUUID () == uuid) {
0 commit comments