@@ -35,28 +35,19 @@ BLEDescriptor::BLEDescriptor(BLEDescriptorImp* descriptorImp,
3535 const BLEDevice *bleDev):
3636 _bledev(bleDev),
3737 _value_size(0 ),
38- _value(NULL )
38+ _value(NULL ),
39+ _internal(descriptorImp)
3940{
4041 _properties = descriptorImp->properties ();
4142 memset (_uuid_cstr, 0 , sizeof (_uuid_cstr));
4243 BLEUtils::uuidBT2String (descriptorImp->bt_uuid (), _uuid_cstr);
43-
44- _value_size = descriptorImp->valueSize ();
45- _value = (unsigned char *)malloc (_value_size);
46- if (NULL == _value)
47- {
48- memcpy (_value, descriptorImp->value (), _value_size);
49- }
50- else
51- {
52- errno = ENOMEM;
53- }
5444}
5545
5646BLEDescriptor::BLEDescriptor (const char * uuid,
5747 const unsigned char value[],
5848 unsigned short valueLength):
59- _bledev()
49+ _bledev(),
50+ _internal(NULL )
6051{
6152 bt_uuid_128_t uuid_tmp;
6253 memset (_uuid_cstr, 0 , sizeof (_uuid_cstr));
@@ -65,15 +56,16 @@ BLEDescriptor::BLEDescriptor(const char* uuid,
6556
6657 _bledev.setAddress (*BLEUtils::bleGetLoalAddress ());
6758
68- _value_size = valueLength > BLE_MAX_ATTR_LONGDATA_LEN ? BLE_MAX_ATTR_LONGDATA_LEN : valueLength;
59+ _value_size = ( valueLength > BLE_MAX_ATTR_LONGDATA_LEN) ? BLE_MAX_ATTR_LONGDATA_LEN : valueLength;
6960 _value = (unsigned char *)malloc (_value_size);
70- if (NULL = = _value)
61+ if (NULL ! = _value)
7162 {
7263 memcpy (_value, value, _value_size);
7364 }
7465 else
7566 {
7667 errno = ENOMEM;
68+ _value_size = 0 ;
7769 }
7870}
7971
@@ -82,22 +74,27 @@ BLEDescriptor::BLEDescriptor(const char* uuid,
8274 BLEDescriptor(uuid, (const unsigned char *)value, strlen(value))
8375{}
8476
85- BLEDescriptor::BLEDescriptor (const BLEDescriptor& rhs)
77+ BLEDescriptor::BLEDescriptor (const BLEDescriptor& rhs):
78+ _bledev(&rhs._bledev),
79+ _properties(rhs._properties),
80+ _value_size(0 ),
81+ _value(NULL ),
82+ _internal(rhs._internal)
8683{
87- _value = (unsigned char *)malloc (rhs._value_size ); // Sid. KW: allocate memory for _value, not local
88- if (_value)
89- {
90- memcpy (_value, rhs._value , rhs._value_size );
91- _value_size = rhs._value_size ;
92- }
93- else
84+ memcpy (_uuid_cstr, rhs._uuid_cstr , sizeof (_uuid_cstr));
85+ if (NULL == _internal && rhs._value_size > 0 )
9486 {
95- _value_size = 0 ;
96- errno = ENOMEM;
87+ _value = (unsigned char *)malloc (rhs._value_size ); // Sid. KW: allocate memory for _value, not local
88+ if (_value)
89+ {
90+ memcpy (_value, rhs._value , rhs._value_size );
91+ _value_size = rhs._value_size ;
92+ }
93+ else
94+ {
95+ errno = ENOMEM;
96+ }
9797 }
98- memcpy (_uuid_cstr, rhs._uuid_cstr , sizeof (_uuid_cstr));
99- _properties = rhs._properties ;
100- _bledev = BLEDevice (&rhs._bledev );
10198}
10299
103100BLEDescriptor& BLEDescriptor::operator = (const BLEDescriptor& rhs)
@@ -107,23 +104,27 @@ BLEDescriptor& BLEDescriptor::operator= (const BLEDescriptor& rhs)
107104 memcpy (_uuid_cstr, rhs._uuid_cstr , sizeof (_uuid_cstr));
108105 _properties = rhs._properties ;
109106 _bledev = BLEDevice (&rhs._bledev );
110- if (_value_size < rhs._value_size )
107+ _internal = rhs._internal ;
108+ if (NULL == _internal && rhs._value_size > 0 )
111109 {
112- _value_size = rhs._value_size ;
110+ if (_value_size < rhs._value_size )
111+ {
112+ _value_size = rhs._value_size ;
113+
114+ if (NULL != _value)
115+ free (_value);
116+ _value = (unsigned char *)malloc (_value_size);
117+ }
113118
114119 if (NULL != _value)
115- free (_value);
116- _value = (unsigned char *)malloc (_value_size);
117- }
118-
119- if (NULL != _value)
120- {
121- memcpy (_value, rhs._value , rhs._value_size );
122- }
123- else
124- {
125- _value_size = 0 ;
126- errno = ENOMEM;
120+ {
121+ memcpy (_value, rhs._value , rhs._value_size );
122+ }
123+ else
124+ {
125+ _value_size = 0 ;
126+ errno = ENOMEM;
127+ }
127128 }
128129 }
129130 return *this ;
@@ -145,12 +146,22 @@ const char* BLEDescriptor::uuid() const
145146
146147const byte* BLEDescriptor::value () const
147148{
148- return _value;
149+ const byte* ret = _value;
150+ if (NULL != _internal)
151+ {
152+ ret = _internal->value ();
153+ }
154+ return ret;
149155}
150156
151157int BLEDescriptor::valueLength () const
152158{
153- return _value_size;
159+ int ret = _value_size;
160+ if (NULL != _internal)
161+ {
162+ ret = _internal->valueLength ();
163+ }
164+ return ret;
154165}
155166
156167BLEDescriptor::operator bool () const
@@ -166,6 +177,22 @@ unsigned char BLEDescriptor::properties() const
166177
167178int BLEDescriptor::valueSize () const
168179{
169- return _value_size;
180+ int ret = _value_size;
181+ if (NULL != _internal)
182+ {
183+ ret = _internal->valueSize ();
184+ }
185+ return ret;
186+ }
187+
188+ bool BLEDescriptor::read ()
189+ {
190+ bool retVar = false ;
191+
192+ if (NULL != _internal)
193+ {
194+ retVar = _internal->read ();
195+ }
196+ return retVar;
170197}
171198
0 commit comments