Skip to content

Commit 320b1b5

Browse files
committed
Fix Jira and update code based on code review
1. Fix Jira 736 BLE in Central mode Peripheral object returns true even if Peripheral does not exist 2. Dismiss the order of add characteristic and service
1 parent 19baf30 commit 320b1b5

File tree

9 files changed

+176
-29
lines changed

9 files changed

+176
-29
lines changed

libraries/BLE/src/BLECharacteristic.cpp

Lines changed: 81 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,18 @@
99
#include "./internal/BLECharacteristicImp.h"
1010

1111
BLECharacteristic::BLECharacteristic():
12-
_bledev(), _internal(NULL), _properties(0),
13-
_value_size(0), _value(NULL),_event_handlers(NULL)
12+
_bledev(), _internal(NULL), _chrc_local_imp(NULL),
13+
_properties(0), _value_size(0), _value(NULL),
14+
_event_handlers(NULL)
1415
{
1516
memset(_uuid_cstr, 0, sizeof(_uuid_cstr));
1617
}
1718

1819
BLECharacteristic::BLECharacteristic(const char* uuid,
1920
unsigned char properties,
2021
unsigned short valueSize):
21-
_bledev(), _internal(NULL), _properties(properties), _value(NULL),
22+
_bledev(), _internal(NULL), _chrc_local_imp(NULL), _properties(properties),
23+
_value(NULL),
2224
_event_handlers(NULL)
2325
{
2426
bt_uuid_128 bt_uuid_tmp;
@@ -38,7 +40,7 @@ BLECharacteristic::BLECharacteristic(const char* uuid,
3840

3941
BLECharacteristic::BLECharacteristic(BLECharacteristicImp *characteristicImp,
4042
const BLEDevice *bleDev):
41-
_bledev(bleDev), _internal(characteristicImp),
43+
_bledev(bleDev), _internal(characteristicImp), _chrc_local_imp(NULL),
4244
_value(NULL),_event_handlers(NULL)
4345
{
4446
BLEUtils::uuidBT2String(characteristicImp->bt_uuid(), _uuid_cstr);
@@ -59,6 +61,12 @@ BLECharacteristic::~BLECharacteristic()
5961
free(_event_handlers);
6062
_event_handlers = NULL;
6163
}
64+
65+
if (_chrc_local_imp != NULL)
66+
{
67+
delete _chrc_local_imp;
68+
_chrc_local_imp = NULL;
69+
}
6270
}
6371

6472
const char* BLECharacteristic::uuid() const
@@ -115,6 +123,54 @@ BLECharacteristic::operator bool() const
115123
return (strlen(_uuid_cstr) > 3);
116124
}
117125

126+
BLECharacteristic& BLECharacteristic::operator= (const BLECharacteristic& chrc)
127+
{
128+
memcpy(_uuid_cstr, chrc._uuid_cstr, sizeof(_uuid_cstr));
129+
_bledev.setAddress(*chrc._bledev.bt_le_address());
130+
_internal = chrc._internal;
131+
_chrc_local_imp = NULL; // Not copy
132+
_properties = chrc._properties;
133+
134+
if (_value_size < chrc._value_size)
135+
{
136+
_value_size = chrc._value_size;
137+
if (NULL != _value)
138+
{
139+
free(_value);
140+
_value = NULL;
141+
}
142+
143+
if (NULL != _event_handlers)
144+
{
145+
free(_event_handlers);
146+
_event_handlers = NULL;
147+
}
148+
}
149+
150+
if (_internal == NULL)
151+
{
152+
if (chrc._value != NULL)
153+
{
154+
if (NULL == _value)
155+
_value = (unsigned char*) malloc(_value_size);
156+
157+
if (NULL != _value)
158+
memcpy(_value, chrc._value, chrc._value_size);
159+
}
160+
161+
if (chrc._event_handlers != NULL)
162+
{
163+
if (NULL == _event_handlers)
164+
_event_handlers = (BLECharacteristicEventHandler*)malloc(sizeof(BLECharacteristicEventHandler) * BLECharacteristicEventLast);
165+
166+
if (NULL != _event_handlers)
167+
memcpy(_event_handlers, chrc._event_handlers, (sizeof(BLECharacteristicEventHandler) * BLECharacteristicEventLast));
168+
}
169+
170+
}
171+
172+
return *this;
173+
}
118174

119175
byte BLECharacteristic::operator[] (int offset) const
120176
{
@@ -301,16 +357,36 @@ bool BLECharacteristic::valueUpdated()
301357

302358
int BLECharacteristic::addDescriptor(BLEDescriptor& descriptor)
303359
{
304-
bool retVar = false;
360+
int retVar = BLE_STATUS_ERROR;
305361
BLECharacteristicImp *characteristicImp = getImplementation();
306362

307363
if (NULL != characteristicImp)
308364
{
309365
retVar = characteristicImp->addDescriptor(descriptor);
310366
}
367+
else if (BLEUtils::isLocalBLE(_bledev) == true)
368+
{
369+
// Only support the GATT server that create the service in local device.
370+
_chrc_local_imp = new BLECharacteristicImp(*this, _bledev);
371+
if (NULL == _chrc_local_imp)
372+
{
373+
retVar = BLE_STATUS_NO_MEMORY;
374+
}
375+
else
376+
{
377+
retVar = _chrc_local_imp->addDescriptor(descriptor);
378+
}
379+
}
311380
return retVar;
312381
}
313382

383+
BLECharacteristicImp* BLECharacteristic::fetchCharacteristicImp()
384+
{
385+
BLECharacteristicImp* temp = _chrc_local_imp;
386+
_chrc_local_imp = NULL;
387+
return temp;
388+
}
389+
314390
int BLECharacteristic::descriptorCount() const
315391
{
316392
int count = 0;

libraries/BLE/src/BLECharacteristic.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ class BLECharacteristic: public BLEAttributeWithValue
162162
* @note none
163163
*/
164164
virtual byte operator[] (int offset) const;
165+
BLECharacteristic& operator= (const BLECharacteristic& chrc);
165166

166167
/**
167168
* Set the current value of the Characteristic
@@ -463,6 +464,7 @@ class BLECharacteristic: public BLEAttributeWithValue
463464
protected:
464465
friend class BLEDevice;
465466
friend class BLEService;
467+
friend class BLEServiceImp;
466468
/**
467469
* @brief Create a characteristic with specified value size
468470
*
@@ -500,7 +502,7 @@ class BLECharacteristic: public BLEAttributeWithValue
500502

501503
// For GATT
502504
void setBLECharacteristicImp(BLECharacteristicImp *characteristicImp);
503-
505+
BLECharacteristicImp* fetchCharacteristicImp();
504506
private:
505507
void _setValue(const uint8_t value[], uint16_t length);
506508
BLECharacteristicImp *getImplementation() const;
@@ -511,6 +513,7 @@ class BLECharacteristic: public BLEAttributeWithValue
511513
// NULL - GATT server
512514
// None-NULL - GATT client
513515
BLECharacteristicImp *_internal; // The real implementation of characteristic.
516+
BLECharacteristicImp *_chrc_local_imp;
514517
protected:
515518
friend class BLECharacteristicImp;
516519
unsigned char _properties; // The characteristic property

libraries/BLE/src/BLEService.cpp

Lines changed: 51 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,16 @@
2323

2424
#include "./internal/BLEUtils.h"
2525

26-
BLEService::BLEService():_bledevice(),_service_imp(NULL)
26+
BLEService::BLEService():_bledevice(),
27+
_service_imp(NULL),
28+
_service_local_imp(NULL)
2729
{
2830
memset(_uuid_cstr, 0, sizeof (_uuid_cstr));
2931
}
3032

31-
BLEService::BLEService(const char* uuid):_bledevice(),_service_imp(NULL)
33+
BLEService::BLEService(const char* uuid):_bledevice(),
34+
_service_imp(NULL),
35+
_service_local_imp(NULL)
3236
{
3337
bt_uuid_128_t uuid_tmp;
3438
memset(_uuid_cstr, 0, sizeof (_uuid_cstr));
@@ -38,42 +42,82 @@ BLEService::BLEService(const char* uuid):_bledevice(),_service_imp(NULL)
3842
_bledevice.setAddress(*BLEUtils::bleGetLoalAddress());
3943
}
4044

41-
BLEService::BLEService(const bt_uuid_t* uuid):_bledevice(),_service_imp(NULL)
45+
BLEService::BLEService(const bt_uuid_t* uuid):_bledevice(),
46+
_service_imp(NULL),
47+
_service_local_imp(NULL)
4248
{
4349
memset(_uuid_cstr, 0, sizeof (_uuid_cstr));
4450
BLEUtils::uuidBT2String(uuid, _uuid_cstr);
45-
_bledevice.setAddress(*BLEUtils::bleGetLoalAddress());
4651
}
4752

4853
BLEService::BLEService(BLEServiceImp* serviceImp, const BLEDevice* bledev):
49-
_bledevice(bledev),_service_imp(serviceImp)
54+
_bledevice(bledev),_service_imp(serviceImp),
55+
_service_local_imp(NULL)
5056
{
5157
memset(_uuid_cstr, 0, sizeof (_uuid_cstr));
5258
BLEUtils::uuidBT2String(serviceImp->bt_uuid(), _uuid_cstr);
5359
}
5460

5561
BLEService::~BLEService()
5662
{
63+
if (NULL != _service_local_imp)
64+
{
65+
delete _service_local_imp;
66+
_service_local_imp = NULL;
67+
}
5768
}
5869

5970
BLEService::operator bool() const
6071
{
6172
return (strlen(_uuid_cstr) > 3);
6273
}
6374

75+
BLEService& BLEService::operator= (const BLEService& service)
76+
{
77+
memcpy(_uuid_cstr, service._uuid_cstr, sizeof(_uuid_cstr));
78+
_bledevice.setAddress(*service._bledevice.bt_le_address());
79+
_service_imp = service._service_imp;
80+
_service_local_imp = NULL; // Not copy
81+
return *this;
82+
}
83+
6484
const char* BLEService::uuid() const
6585
{
6686
return _uuid_cstr;
6787
}
6888

69-
void BLEService::addCharacteristic(BLECharacteristic& characteristic)
89+
int BLEService::addCharacteristic(BLECharacteristic& characteristic)
7090
{
7191
BLEServiceImp* serviceImp = getServiceImp();
92+
int retVar = BLE_STATUS_ERROR;
7293

7394
if (NULL != serviceImp)
7495
{
75-
serviceImp->addCharacteristic(_bledevice, characteristic);
96+
retVar = serviceImp->addCharacteristic(_bledevice, characteristic);
97+
}
98+
else if (BLEUtils::isLocalBLE(_bledevice) == true)
99+
{
100+
// Only support the GATT server that create the service in local device.
101+
_service_local_imp = new BLEServiceImp(*this);
102+
if (NULL == _service_local_imp)
103+
{
104+
return BLE_STATUS_NO_MEMORY;
105+
}
106+
retVar = _service_local_imp->addCharacteristic(_bledevice, characteristic);
76107
}
108+
return retVar;
109+
}
110+
111+
BLEServiceImp* BLEService::getLocalServiceImp()
112+
{
113+
return _service_local_imp;
114+
}
115+
116+
BLEServiceImp* BLEService::fetchOutLocalServiceImp()
117+
{
118+
BLEServiceImp* temp = _service_local_imp;
119+
_service_local_imp = NULL;
120+
return temp;
77121
}
78122

79123
int BLEService::characteristicCount() const

libraries/BLE/src/BLEService.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class BLEService
3434
virtual ~BLEService();
3535

3636
virtual operator bool() const; // is the service valid
37+
BLEService& operator= (const BLEService& service);
3738

3839
const char* uuid() const;
3940

@@ -42,11 +43,11 @@ class BLEService
4243
*
4344
* @param characteristic The characteristic want to be added to service
4445
*
45-
* @return none
46+
* @return int 0 - Success. Others - Error codes
4647
*
4748
* @note none
4849
*/
49-
void addCharacteristic(BLECharacteristic& characteristic);
50+
int addCharacteristic(BLECharacteristic& characteristic);
5051

5152
/**
5253
* @brief Get the number of characteristics the service has
@@ -132,6 +133,9 @@ class BLEService
132133
BLEService(BLEServiceImp* serviceImp, const BLEDevice* bledev);
133134
BLEService(const bt_uuid_t* uuid);
134135
void setServiceImp(BLEServiceImp* serviceImp);
136+
137+
BLEServiceImp* getLocalServiceImp();
138+
BLEServiceImp* fetchOutLocalServiceImp();
135139
private:
136140
BLEServiceImp* getServiceImp();
137141
BLEServiceImp* getServiceImp() const;
@@ -140,6 +144,8 @@ class BLEService
140144
BLEDevice _bledevice;
141145
BLEServiceImp* _service_imp;
142146
char _uuid_cstr[37];
147+
148+
BLEServiceImp* _service_local_imp; // This not allow copy
143149
};
144150

145151
#endif

libraries/BLE/src/internal/BLECharacteristicImp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ class BLECharacteristicImp: public BLEAttribute{
182182
protected:
183183
friend class BLEProfileManager;
184184
friend class BLEServiceImp;
185+
friend class BLECharacteristic;
185186
/**
186187
* Constructor for BLE Characteristic
187188
*

libraries/BLE/src/internal/BLEDeviceManager.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -752,14 +752,15 @@ String BLEDeviceManager::advertisedServiceUuid(const BLEDevice* device, int inde
752752
uint8_t service_cnt = 0;
753753
bt_uuid_128_t service_uuid;
754754
char uuid_string[37];
755+
755756
memset(uuid_string, 0, sizeof(uuid_string));
756757

757758
if (BLEUtils::isLocalBLE(*device) == true)
758759
{
759760
// Local device only support advertise 1 service now.
760761
if (_has_service_uuid && index == 0)
761762
{
762-
BLEUtils::uuidBT2String(&service_uuid.uuid, uuid_string);
763+
BLEUtils::uuidBT2String(&_service_uuid.uuid, uuid_string);
763764
}
764765
return uuid_string;
765766
}

libraries/BLE/src/internal/BLEProfileManager.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,11 +101,21 @@ BLEProfileManager::addService (BLEDevice &bledevice, BLEService& service)
101101
// The service alreay exist
102102
return BLE_STATUS_SUCCESS;
103103
}
104-
serviceImp = new BLEServiceImp(service);
104+
105105
if (NULL == serviceImp)
106106
{
107-
return BLE_STATUS_NO_MEMORY;
107+
serviceImp = service.fetchOutLocalServiceImp();
108108
}
109+
110+
if (NULL == serviceImp)
111+
{
112+
serviceImp = new BLEServiceImp(service);
113+
if (NULL == serviceImp)
114+
{
115+
return BLE_STATUS_NO_MEMORY;
116+
}
117+
}
118+
109119
BLEServiceNodePtr node = link_node_create(serviceImp);
110120
if (NULL == node)
111121
{

libraries/BLE/src/internal/BLEServiceImp.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,16 @@ int BLEServiceImp::addCharacteristic(BLEDevice& bledevice, BLECharacteristic& ch
6464
pr_info(LOG_MODULE_BLE, "%s-%d: Already exist",__FUNCTION__, __LINE__);
6565
return BLE_STATUS_SUCCESS;
6666
}
67-
characteristicImp = new BLECharacteristicImp(characteristic, bledevice);
68-
pr_debug(LOG_MODULE_BLE, "%s-%d",__FUNCTION__, __LINE__);
67+
68+
characteristicImp = characteristic.fetchCharacteristicImp();
6969
if (NULL == characteristicImp)
7070
{
71-
return BLE_STATUS_NO_MEMORY;
71+
characteristicImp = new BLECharacteristicImp(characteristic, bledevice);
72+
pr_debug(LOG_MODULE_BLE, "%s-%d",__FUNCTION__, __LINE__);
73+
if (NULL == characteristicImp)
74+
{
75+
return BLE_STATUS_NO_MEMORY;
76+
}
7277
}
7378

7479
BLECharacteristicNodePtr node = link_node_create(characteristicImp);

0 commit comments

Comments
 (0)