mbed.org implementation of the abstract SmartREST library for the Cumulocity Platform SmartREST protocol.
Dependents: MbedSmartRestMain MbedSmartRestMain
Diff: SmartRest.cpp
- Revision:
- 11:e1bee9a77652
- Parent:
- 7:8159a2d12e4e
- Child:
- 13:aba98ad2ac1b
diff -r 97077cfa13fc -r e1bee9a77652 SmartRest.cpp --- a/SmartRest.cpp Thu Oct 23 14:41:58 2014 +0200 +++ b/SmartRest.cpp Sat Nov 15 11:21:01 2014 +0100 @@ -30,190 +30,205 @@ #include <stdlib.h> #include <string.h> + +/*-------------------------------------------------------------------------*/ SmartRest::SmartRest(AbstractClient& client, const char *identifier) : - _client(client), - _identifier(identifier) + _client(client), + _identifier(identifier) { - _source = NULL; - _mogid[0] = 0; + _source = NULL; + _mogid[0] = 0; } - +/*-------------------------------------------------------------------------*/ uint8_t SmartRest::setAuthorization(const char *username, const char *password) { - uint8_t res; + uint8_t res; - res = _client.setAuthorization(username, password); - if (res != CLIENT_OK) - return SMARTREST_INTERNAL_ERROR; - return SMARTREST_SUCCESS; + res = _client.setAuthorization(username, password); + if (res != CLIENT_OK) + return SMARTREST_INTERNAL_ERROR; + return SMARTREST_SUCCESS; } - +/*-------------------------------------------------------------------------*/ #ifdef SMARTREST_TRANSACTIONAL +/*-------------------------------------------------------------------------*/ uint8_t SmartRest::request(const DataGenerator& generator, const char *overrideIdentifier) { - uint8_t res; + uint8_t res; - res = send(generator, overrideIdentifier); - stop(); - return res; + res = send(generator, overrideIdentifier); + stop(); + return res; } - +/*-------------------------------------------------------------------------*/ uint8_t SmartRest::request(const DataGenerator& generator, Aggregator& aggregator, const char *overrideIdentifier) { - uint8_t res; + uint8_t res; - if (!aggregator.managed()) - return SMARTREST_INTERNAL_ERROR; + if (!aggregator.managed()) + return SMARTREST_INTERNAL_ERROR; - res = send(generator, overrideIdentifier); - if (res != SMARTREST_SUCCESS) { - stop(); - return res; - } + res = send(generator, overrideIdentifier); + if (res != SMARTREST_SUCCESS) + { + stop(); + return res; + } - ParsedRecord recvd; - while ((res = receive(recvd)) == SMARTREST_SUCCESS) { - if (!aggregator.add(recvd)) - return SMARTREST_INTERNAL_ERROR; - } + ParsedRecord recvd; + while ((res = receive(recvd)) == SMARTREST_SUCCESS) + { + if (!aggregator.add(recvd)) + return SMARTREST_INTERNAL_ERROR; + } - stop(); - if (res == SMARTREST_END_OF_RESPONSE) - return SMARTREST_SUCCESS; - return res; + stop(); + if (res == SMARTREST_END_OF_RESPONSE) + return SMARTREST_SUCCESS; + return res; } -#endif - +/*-------------------------------------------------------------------------*/ +#endif // SMARTREST_TRANSACTIONAL +/*-------------------------------------------------------------------------*/ uint8_t SmartRest::bootstrap(const DataGenerator& generator) { - ParsedRecord record; - int8_t ret; + ParsedRecord record; + int8_t ret; - ret = beginRequest(NULL); - if (ret != SMARTREST_SUCCESS) - return ret; - ret = awaitResponse(); - if (ret != SMARTREST_SUCCESS) - return ret; - ret = receive(record); - if (ret != SMARTREST_SUCCESS) - return ret; - if (!record) { - return SMARTREST_INTERNAL_ERROR; - } - stop(); + ret = beginRequest(NULL); + if (ret != SMARTREST_SUCCESS) + return ret; + ret = awaitResponse(); + if (ret != SMARTREST_SUCCESS) + return ret; + ret = receive(record); + if (ret != SMARTREST_SUCCESS) + return ret; + if (!record) + { + return SMARTREST_INTERNAL_ERROR; + } + stop(); - if (setMoGid(record)) - return SMARTREST_SUCCESS; + if (setMoGid(record)) + return SMARTREST_SUCCESS; - if (record.value(0).integerValue() != 40) - return SMARTREST_INTERNAL_ERROR; + if (record.value(0).integerValue() != 40) + return SMARTREST_INTERNAL_ERROR; - ret = send(generator, NULL); - if (ret != SMARTREST_SUCCESS) - return ret; - ret = receive(record); - if (ret != SMARTREST_SUCCESS) - return ret; - stop(); + ret = send(generator, NULL); + if (ret != SMARTREST_SUCCESS) + return ret; + ret = receive(record); + if (ret != SMARTREST_SUCCESS) + return ret; + stop(); - if (!setMoGid(record)) - return SMARTREST_INTERNAL_ERROR; + if (!setMoGid(record)) + return SMARTREST_INTERNAL_ERROR; - return SMARTREST_SUCCESS; + return SMARTREST_SUCCESS; } - +/*-------------------------------------------------------------------------*/ uint8_t SmartRest::send(const DataGenerator& generator, const char *overrideIdentifier) { - uint8_t res; + uint8_t res; - res = beginRequest(overrideIdentifier); - if (res != SMARTREST_SUCCESS) - return res; + res = beginRequest(overrideIdentifier); + if (res != SMARTREST_SUCCESS) + return res; - _client.sendData(generator); - return awaitResponse(); + _client.sendData(generator); + return awaitResponse(); } - +/*-------------------------------------------------------------------------*/ uint8_t SmartRest::receive(ParsedRecord& record) { - uint8_t res; - - if (_source == NULL) - return SMARTREST_INTERNAL_ERROR; + uint8_t res; - res = _parser.readFrom(*_source, record); + if (_source == NULL) + return SMARTREST_INTERNAL_ERROR; + + res = _parser.readFrom(*_source, record); - switch (res) { - case PARSER_SUCCESS: - return SMARTREST_SUCCESS; - case PARSER_END_OF_RESPONSE: - return SMARTREST_END_OF_RESPONSE; - case PARSER_TIMEOUT_ERROR: - return SMARTREST_TIMEOUT_ERROR; - } - return SMARTREST_INTERNAL_ERROR; + switch (res) + { + case PARSER_SUCCESS: + return SMARTREST_SUCCESS; + case PARSER_END_OF_RESPONSE: + return SMARTREST_END_OF_RESPONSE; + case PARSER_TIMEOUT_ERROR: + return SMARTREST_TIMEOUT_ERROR; + } + return SMARTREST_INTERNAL_ERROR; } - +/*-------------------------------------------------------------------------*/ void SmartRest::stop() { - _source = NULL; - _client.stop(); + _source = NULL; + _client.stop(); } - +/*-------------------------------------------------------------------------*/ const char * SmartRest::getIdentifier() { - if (*_mogid) - return _mogid; - return _identifier; + if (*_mogid) + return _mogid; + return _identifier; } - +/*-------------------------------------------------------------------------*/ uint8_t SmartRest::beginRequest(const char *overrideIdentifier) { - int res; + int res; - res = _client.beginRequest(); - if (res == CLIENT_CONNECTION_ERROR) { - return SMARTREST_CONNECTION_FAILED; - } else if (res != CLIENT_OK) { - return SMARTREST_INTERNAL_ERROR; - } - if (overrideIdentifier != NULL) { - if (_client.sendIdentifier(overrideIdentifier) != CLIENT_OK) - return SMARTREST_INTERNAL_ERROR; - } else { - if (_client.sendIdentifier(getIdentifier()) != CLIENT_OK) - return SMARTREST_INTERNAL_ERROR; - } - return SMARTREST_SUCCESS; + res = _client.beginRequest(); + if (res == CLIENT_CONNECTION_ERROR) + { + return SMARTREST_CONNECTION_FAILED; + } + else if (res != CLIENT_OK) + { + return SMARTREST_INTERNAL_ERROR; + } + if (overrideIdentifier != NULL) + { + if (_client.sendIdentifier(overrideIdentifier) != CLIENT_OK) + return SMARTREST_INTERNAL_ERROR; + } + else + { + if (_client.sendIdentifier(getIdentifier()) != CLIENT_OK) + return SMARTREST_INTERNAL_ERROR; + } + return SMARTREST_SUCCESS; } - +/*-------------------------------------------------------------------------*/ uint8_t SmartRest::awaitResponse() { - if ((_client.endRequest() != CLIENT_OK) || - (_client.awaitResponse() != CLIENT_OK)) - return SMARTREST_INTERNAL_ERROR; - _source = &_client.receiveData(); - return SMARTREST_SUCCESS; + if ((_client.endRequest() != CLIENT_OK) || + (_client.awaitResponse() != CLIENT_OK)) + return SMARTREST_INTERNAL_ERROR; + _source = &_client.receiveData(); + return SMARTREST_SUCCESS; } - +/*-------------------------------------------------------------------------*/ bool SmartRest::setMoGid(ParsedRecord& record) { - const char *mogid; + const char *mogid; - *_mogid = 0; - if ((record.values() < 2) || (record.value(0).integerValue() != 20)) - return false; + *_mogid = 0; + if ((record.values() < 2) || (record.value(0).integerValue() != 20)) + return false; + + if ((record.value(1).valueType() != VALUE_INTEGER) || + (record.value(1).integerValue() <= 0)) + return false; - if ((record.value(1).valueType() != VALUE_INTEGER) || - (record.value(1).integerValue() <= 0)) - return false; + mogid = record.rawValue(1); + if (strlen(mogid)+1 > sizeof(_mogid)) + return false; - mogid = record.rawValue(1); - if (strlen(mogid)+1 > sizeof(_mogid)) - return false; + strcpy(_mogid, mogid); - strcpy(_mogid, mogid); - - return true; + return true; } +/*-------------------------------------------------------------------------*/