|
30 | 30 | /******************************************************************************
|
31 | 31 | * PUBLIC MEMBER FUNCTIONS
|
32 | 32 | ******************************************************************************/
|
33 |
| - |
34 |
| -int CBOREncoder::encode(PropertyContainer & property_container, uint8_t * data, size_t const size, bool lightPayload) |
| 33 | +#include <iostream> |
| 34 | +CborError CBOREncoder::encode(PropertyContainer & property_container, uint8_t * data, size_t const size, int & bytes_encoded, bool lightPayload) |
35 | 35 | {
|
| 36 | + CborError error = CborNoError; |
36 | 37 | CborEncoder encoder, arrayEncoder;
|
37 | 38 |
|
38 | 39 | cbor_encoder_init(&encoder, data, size, 0);
|
39 | 40 |
|
40 |
| - if (cbor_encoder_create_array(&encoder, &arrayEncoder, CborIndefiniteLength) != CborNoError) |
41 |
| - return -1; |
| 41 | + error = cbor_encoder_create_array(&encoder, &arrayEncoder, CborIndefiniteLength); |
| 42 | + if (CborNoError != error) |
| 43 | + return error; |
42 | 44 |
|
43 | 45 | /* Check if backing storage and cloud has diverged
|
44 | 46 | * time interval may be elapsed or property may be changed
|
45 | 47 | * and if that's the case encode the property into the CBOR.
|
46 | 48 | */
|
47 |
| - CborError err = CborNoError; |
| 49 | + int num_encoded_properties = 0; |
48 | 50 | std::for_each(property_container.begin(),
|
49 | 51 | property_container.end(),
|
50 |
| - [lightPayload, &arrayEncoder, &err](Property * p) |
| 52 | + [lightPayload, &arrayEncoder, &error, &num_encoded_properties](Property * p) |
51 | 53 | {
|
52 | 54 | if (p->shouldBeUpdated() && p->isReadableByCloud())
|
53 | 55 | {
|
54 |
| - err = p->append(&arrayEncoder, lightPayload); |
55 |
| - if(err != CborNoError) |
| 56 | + error = p->append(&arrayEncoder, lightPayload); |
| 57 | + if(error == CborNoError) |
| 58 | + num_encoded_properties++; |
| 59 | + else |
56 | 60 | return;
|
57 | 61 | }
|
58 | 62 | });
|
59 |
| - if ((err != CborNoError) && (err != CborErrorOutOfMemory)) |
60 |
| - return -1; |
| 63 | + if ((CborNoError != error) && |
| 64 | + (CborErrorOutOfMemory != error)) |
| 65 | + return error; |
61 | 66 |
|
| 67 | + error = cbor_encoder_close_container(&encoder, &arrayEncoder); |
| 68 | + if (CborNoError != error) |
| 69 | + return error; |
62 | 70 |
|
63 |
| - if (cbor_encoder_close_container(&encoder, &arrayEncoder) != CborNoError) |
64 |
| - return -1; |
| 71 | + if (num_encoded_properties > 0) |
| 72 | + bytes_encoded = cbor_encoder_get_buffer_size(&encoder, data); |
| 73 | + else |
| 74 | + bytes_encoded = 0; |
65 | 75 |
|
66 |
| - int const bytes_encoded = cbor_encoder_get_buffer_size(&encoder, data); |
67 |
| - return bytes_encoded; |
| 76 | + return CborNoError; |
68 | 77 | }
|
0 commit comments