A client for the SmartREST protocol from Cumulocity.
Fork of MbedSmartRest by
Diff: SmartRest/SmartRest.cpp
- Revision:
- 11:844856ab160d
- Parent:
- 10:478414cc15a4
- Child:
- 12:788dd934f283
--- a/SmartRest/SmartRest.cpp Wed Feb 05 16:21:46 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,164 +0,0 @@ -/* - * SmartRest.cpp - * - * Created on: Nov 1, 2013 - * * Authors: Vincent Wochnik <v.wochnik@gmail.com> - * - * Copyright (c) 2013 Cumulocity GmbH - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#include "SmartRest.h" -#include <stdlib.h> -#include <stdio.h> -#include <string.h> - -SmartRest::SmartRest(AbstractClient& client, const char *identifier) : _client(client), _identifier(identifier) -{ - _source = NULL; - _mogid[0] = 0; -} - -int8_t SmartRest::send(DataGenerator& generator) -{ - uint8_t res; - - res = beginRequest(); - if (res != SMARTREST_SUCCESS) - return res; - - _client.sendData(generator); - return awaitResponse(); -} - -int8_t SmartRest::receive(ParsedRecord& record) -{ - uint8_t res; - - 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; -} - -int8_t SmartRest::bootstrap(DataGenerator& generator) -{ - ParsedRecord record; - int8_t ret; - - ret = beginRequest(); - 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 (record.value(0).integerValue() != 40) - return SMARTREST_INTERNAL_ERROR; - - ret = send(generator); - if (ret != SMARTREST_SUCCESS) - return ret; - ret = receive(record); - if (ret != SMARTREST_SUCCESS) - return ret; - stop(); - - if (!setMoGid(record)) - return SMARTREST_INTERNAL_ERROR; - - return SMARTREST_SUCCESS; -} - -void SmartRest::stop() -{ - _source = NULL; - _client.stop(); -} - -uint8_t SmartRest::beginRequest() -{ - int res; - - res = _client.beginRequest(); - if (res == CLIENT_CONNECTION_ERROR) { - return SMARTREST_CONNECTION_FAILED; - } else if (res != CLIENT_OK) { - return SMARTREST_INTERNAL_ERROR; - } - if (strlen(_mogid)) { - if (_client.sendIdentifier(_mogid) != CLIENT_OK) - return SMARTREST_INTERNAL_ERROR; - } else { - if (_client.sendIdentifier(_identifier) != 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; -} - -bool SmartRest::setMoGid(Record& record) -{ - long mogid; - - *_mogid = 0; - - if ((record.values() < 2) || (record.value(0).integerValue() != 20)) - return false; - - if (record.value(1).integerValue() == 0) - return false; - - mogid = record.value(1).integerValue(); - - if (!snprintf(_mogid, SMARTREST_MOGID_BUFFER_SIZE, "%ld", mogid)) - *_mogid = 0; - - return true; -}