Own fork of MbedSmartRest

Dependents:   MbedSmartRestMain MbedSmartRestMain

Fork of MbedSmartRest by Cumulocity Official

Committer:
xinlei
Date:
Mon Apr 13 14:24:44 2015 +0000
Revision:
20:505d29d5bdfc
Parent:
18:16192696c106
Child:
21:207549b3711e
v2.1rc1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Cumulocity 0:099f76422485 1 /*
Cumulocity 0:099f76422485 2 * SmartRest.cpp
Cumulocity 0:099f76422485 3 *
Cumulocity 0:099f76422485 4 * Created on: Nov 1, 2013
Cumulocity 0:099f76422485 5 * * Authors: Vincent Wochnik <v.wochnik@gmail.com>
Cumulocity 0:099f76422485 6 *
Cumulocity 0:099f76422485 7 * Copyright (c) 2013 Cumulocity GmbH
Cumulocity 0:099f76422485 8 *
Cumulocity 0:099f76422485 9 * Permission is hereby granted, free of charge, to any person obtaining
Cumulocity 0:099f76422485 10 * a copy of this software and associated documentation files (the
Cumulocity 0:099f76422485 11 * "Software"), to deal in the Software without restriction, including
Cumulocity 0:099f76422485 12 * without limitation the rights to use, copy, modify, merge, publish,
Cumulocity 0:099f76422485 13 * distribute, sublicense, and/or sell copies of the Software, and to
Cumulocity 0:099f76422485 14 * permit persons to whom the Software is furnished to do so, subject to
Cumulocity 0:099f76422485 15 * the following conditions:
Cumulocity 0:099f76422485 16 *
Cumulocity 0:099f76422485 17 * The above copyright notice and this permission notice shall be
Cumulocity 0:099f76422485 18 * included in all copies or substantial portions of the Software.
Cumulocity 0:099f76422485 19 *
Cumulocity 0:099f76422485 20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
Cumulocity 0:099f76422485 21 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Cumulocity 0:099f76422485 22 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
Cumulocity 0:099f76422485 23 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
Cumulocity 0:099f76422485 24 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
Cumulocity 0:099f76422485 25 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
Cumulocity 0:099f76422485 26 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Cumulocity 0:099f76422485 27 */
Cumulocity 0:099f76422485 28
Cumulocity 0:099f76422485 29 #include <stdlib.h>
Cumulocity 0:099f76422485 30 #include <string.h>
xinlei 18:16192696c106 31 #include <stdio.h>
xinlei 20:505d29d5bdfc 32 #include "rtos.h"
xinlei 18:16192696c106 33 #include "SmartRest.h"
xinlei 20:505d29d5bdfc 34 #include "SmartRestConf.h"
Cumulocity 11:e1bee9a77652 35
Cumulocity 11:e1bee9a77652 36 /*-------------------------------------------------------------------------*/
xinlei 20:505d29d5bdfc 37 SmartRest::SmartRest(AbstractClient& client) :
xinlei 20:505d29d5bdfc 38 _client(client)
Cumulocity 0:099f76422485 39 {
Cumulocity 11:e1bee9a77652 40 _source = NULL;
Cumulocity 11:e1bee9a77652 41 _mogid[0] = 0;
Cumulocity 0:099f76422485 42 }
Cumulocity 11:e1bee9a77652 43 /*-------------------------------------------------------------------------*/
Cumulocity 5:2b74510900da 44 #ifdef SMARTREST_TRANSACTIONAL
Cumulocity 11:e1bee9a77652 45 /*-------------------------------------------------------------------------*/
Cumulocity 5:2b74510900da 46 uint8_t SmartRest::request(const DataGenerator& generator, const char *overrideIdentifier)
Cumulocity 5:2b74510900da 47 {
xinlei 20:505d29d5bdfc 48 uint8_t res = send(generator, overrideIdentifier);
Cumulocity 11:e1bee9a77652 49 stop();
Cumulocity 11:e1bee9a77652 50 return res;
Cumulocity 5:2b74510900da 51 }
Cumulocity 11:e1bee9a77652 52 /*-------------------------------------------------------------------------*/
Cumulocity 5:2b74510900da 53 uint8_t SmartRest::request(const DataGenerator& generator, Aggregator& aggregator, const char *overrideIdentifier)
Cumulocity 5:2b74510900da 54 {
Cumulocity 11:e1bee9a77652 55 if (!aggregator.managed())
Cumulocity 11:e1bee9a77652 56 return SMARTREST_INTERNAL_ERROR;
Cumulocity 5:2b74510900da 57
xinlei 20:505d29d5bdfc 58 uint8_t res = send(generator, overrideIdentifier);
xinlei 20:505d29d5bdfc 59 if (res != SMARTREST_SUCCESS) {
Cumulocity 11:e1bee9a77652 60 stop();
Cumulocity 11:e1bee9a77652 61 return res;
Cumulocity 11:e1bee9a77652 62 }
Cumulocity 5:2b74510900da 63
Cumulocity 11:e1bee9a77652 64 ParsedRecord recvd;
xinlei 20:505d29d5bdfc 65 while ((res = receive(recvd)) == SMARTREST_SUCCESS) {
Cumulocity 11:e1bee9a77652 66 if (!aggregator.add(recvd))
Cumulocity 11:e1bee9a77652 67 return SMARTREST_INTERNAL_ERROR;
Cumulocity 11:e1bee9a77652 68 }
Cumulocity 5:2b74510900da 69
Cumulocity 11:e1bee9a77652 70 stop();
Cumulocity 11:e1bee9a77652 71 if (res == SMARTREST_END_OF_RESPONSE)
Cumulocity 11:e1bee9a77652 72 return SMARTREST_SUCCESS;
Cumulocity 11:e1bee9a77652 73 return res;
Cumulocity 5:2b74510900da 74 }
Cumulocity 11:e1bee9a77652 75 /*-------------------------------------------------------------------------*/
Cumulocity 11:e1bee9a77652 76 #endif // SMARTREST_TRANSACTIONAL
Cumulocity 11:e1bee9a77652 77 /*-------------------------------------------------------------------------*/
Cumulocity 5:2b74510900da 78 uint8_t SmartRest::bootstrap(const DataGenerator& generator)
Cumulocity 5:2b74510900da 79 {
xinlei 20:505d29d5bdfc 80 int8_t ret = beginRequest(NULL, NULL);
Cumulocity 11:e1bee9a77652 81 if (ret != SMARTREST_SUCCESS)
Cumulocity 11:e1bee9a77652 82 return ret;
Cumulocity 11:e1bee9a77652 83 ret = awaitResponse();
Cumulocity 11:e1bee9a77652 84 if (ret != SMARTREST_SUCCESS)
Cumulocity 11:e1bee9a77652 85 return ret;
xinlei 20:505d29d5bdfc 86
xinlei 20:505d29d5bdfc 87 ParsedRecord record;
Cumulocity 11:e1bee9a77652 88 ret = receive(record);
Cumulocity 11:e1bee9a77652 89 if (ret != SMARTREST_SUCCESS)
Cumulocity 11:e1bee9a77652 90 return ret;
xinlei 20:505d29d5bdfc 91 if (!record) {
Cumulocity 11:e1bee9a77652 92 return SMARTREST_INTERNAL_ERROR;
Cumulocity 11:e1bee9a77652 93 }
Cumulocity 11:e1bee9a77652 94 stop();
Cumulocity 5:2b74510900da 95
Cumulocity 11:e1bee9a77652 96 if (setMoGid(record))
Cumulocity 11:e1bee9a77652 97 return SMARTREST_SUCCESS;
Cumulocity 5:2b74510900da 98
Cumulocity 11:e1bee9a77652 99 if (record.value(0).integerValue() != 40)
Cumulocity 11:e1bee9a77652 100 return SMARTREST_INTERNAL_ERROR;
Cumulocity 5:2b74510900da 101
Cumulocity 11:e1bee9a77652 102 ret = send(generator, NULL);
Cumulocity 11:e1bee9a77652 103 if (ret != SMARTREST_SUCCESS)
Cumulocity 11:e1bee9a77652 104 return ret;
Cumulocity 11:e1bee9a77652 105 ret = receive(record);
Cumulocity 11:e1bee9a77652 106 if (ret != SMARTREST_SUCCESS)
Cumulocity 11:e1bee9a77652 107 return ret;
Cumulocity 11:e1bee9a77652 108 stop();
Cumulocity 5:2b74510900da 109
Cumulocity 11:e1bee9a77652 110 if (!setMoGid(record))
Cumulocity 11:e1bee9a77652 111 return SMARTREST_INTERNAL_ERROR;
Cumulocity 5:2b74510900da 112
Cumulocity 11:e1bee9a77652 113 return SMARTREST_SUCCESS;
Cumulocity 5:2b74510900da 114 }
Cumulocity 11:e1bee9a77652 115 /*-------------------------------------------------------------------------*/
Cumulocity 2:45a6e44a4fb4 116 uint8_t SmartRest::send(const DataGenerator& generator, const char *overrideIdentifier)
Cumulocity 0:099f76422485 117 {
xinlei 20:505d29d5bdfc 118 uint8_t res = beginRequest(NULL, overrideIdentifier);
Cumulocity 11:e1bee9a77652 119 if (res != SMARTREST_SUCCESS)
Cumulocity 11:e1bee9a77652 120 return res;
Cumulocity 0:099f76422485 121
Cumulocity 11:e1bee9a77652 122 _client.sendData(generator);
Cumulocity 11:e1bee9a77652 123 return awaitResponse();
Cumulocity 0:099f76422485 124 }
Cumulocity 11:e1bee9a77652 125 /*-------------------------------------------------------------------------*/
xinlei 20:505d29d5bdfc 126 uint8_t SmartRest::sendAndClose(const DataGenerator& generator, const char *overrideIdentifier)
xinlei 20:505d29d5bdfc 127 {
xinlei 20:505d29d5bdfc 128 uint8_t res = beginRequest(NULL, overrideIdentifier);
xinlei 20:505d29d5bdfc 129 if (res != SMARTREST_SUCCESS)
xinlei 20:505d29d5bdfc 130 return res;
xinlei 20:505d29d5bdfc 131
xinlei 20:505d29d5bdfc 132 _client.sendData(generator);
xinlei 20:505d29d5bdfc 133 if (_client.endRequest() == CLIENT_OK) {
xinlei 20:505d29d5bdfc 134 return SMARTREST_SUCCESS;
xinlei 20:505d29d5bdfc 135 } else {
xinlei 20:505d29d5bdfc 136 return SMARTREST_INTERNAL_ERROR;
xinlei 20:505d29d5bdfc 137 }
xinlei 20:505d29d5bdfc 138 }
xinlei 20:505d29d5bdfc 139 /*-------------------------------------------------------------------------*/
Cumulocity 13:aba98ad2ac1b 140 uint8_t SmartRest::stream(const char *uri, const Record& record, const char *overrideIdentifier)
Cumulocity 13:aba98ad2ac1b 141 {
xinlei 20:505d29d5bdfc 142 uint8_t res = beginRequest(uri, overrideIdentifier);
Cumulocity 13:aba98ad2ac1b 143 if (res != SMARTREST_SUCCESS)
Cumulocity 13:aba98ad2ac1b 144 return res;
Cumulocity 13:aba98ad2ac1b 145
Cumulocity 13:aba98ad2ac1b 146 _client.sendData(record);
Cumulocity 13:aba98ad2ac1b 147 return awaitResponse();
Cumulocity 13:aba98ad2ac1b 148 }
Cumulocity 13:aba98ad2ac1b 149 /*-------------------------------------------------------------------------*/
Cumulocity 2:45a6e44a4fb4 150 uint8_t SmartRest::receive(ParsedRecord& record)
Cumulocity 0:099f76422485 151 {
Cumulocity 11:e1bee9a77652 152 if (_source == NULL)
Cumulocity 11:e1bee9a77652 153 return SMARTREST_INTERNAL_ERROR;
Cumulocity 11:e1bee9a77652 154
xinlei 20:505d29d5bdfc 155 uint8_t res = _parser.readFrom(*_source, record);
Cumulocity 11:e1bee9a77652 156 switch (res)
Cumulocity 11:e1bee9a77652 157 {
xinlei 20:505d29d5bdfc 158 case PARSER_SUCCESS: return SMARTREST_SUCCESS;
xinlei 20:505d29d5bdfc 159 case PARSER_END_OF_RESPONSE: return SMARTREST_END_OF_RESPONSE;
xinlei 20:505d29d5bdfc 160 case PARSER_TIMEOUT_ERROR: return SMARTREST_TIMEOUT_ERROR;
xinlei 20:505d29d5bdfc 161 default: return SMARTREST_INTERNAL_ERROR;
Cumulocity 11:e1bee9a77652 162 }
Cumulocity 0:099f76422485 163 }
Cumulocity 11:e1bee9a77652 164 /*-------------------------------------------------------------------------*/
Cumulocity 0:099f76422485 165 void SmartRest::stop()
Cumulocity 0:099f76422485 166 {
Cumulocity 11:e1bee9a77652 167 _source = NULL;
Cumulocity 11:e1bee9a77652 168 _client.stop();
Cumulocity 0:099f76422485 169 }
Cumulocity 11:e1bee9a77652 170 /*-------------------------------------------------------------------------*/
xinlei 20:505d29d5bdfc 171 const char * SmartRest::getIdentifier() const
Cumulocity 7:8159a2d12e4e 172 {
Cumulocity 11:e1bee9a77652 173 if (*_mogid)
Cumulocity 11:e1bee9a77652 174 return _mogid;
xinlei 20:505d29d5bdfc 175 else
xinlei 20:505d29d5bdfc 176 return NULL;
Cumulocity 7:8159a2d12e4e 177 }
Cumulocity 11:e1bee9a77652 178 /*-------------------------------------------------------------------------*/
Cumulocity 13:aba98ad2ac1b 179 uint8_t SmartRest::beginRequest(const char *uri, const char *overrideIdentifier)
Cumulocity 0:099f76422485 180 {
Cumulocity 11:e1bee9a77652 181 int res;
xinlei 20:505d29d5bdfc 182 if (uri) {
Cumulocity 13:aba98ad2ac1b 183 res = _client.beginStream(uri);
xinlei 20:505d29d5bdfc 184 } else {
Cumulocity 13:aba98ad2ac1b 185 res = _client.beginRequest();
Cumulocity 13:aba98ad2ac1b 186 }
Cumulocity 13:aba98ad2ac1b 187
xinlei 20:505d29d5bdfc 188 if (res == CLIENT_CONNECTION_ERROR) {
Cumulocity 11:e1bee9a77652 189 return SMARTREST_CONNECTION_FAILED;
xinlei 20:505d29d5bdfc 190 } else if (res != CLIENT_OK) {
Cumulocity 11:e1bee9a77652 191 return SMARTREST_INTERNAL_ERROR;
Cumulocity 11:e1bee9a77652 192 }
xinlei 20:505d29d5bdfc 193 if (overrideIdentifier != NULL) {
xinlei 20:505d29d5bdfc 194 if (_client.sendIdentifier(overrideIdentifier) != CLIENT_OK)
xinlei 20:505d29d5bdfc 195 return SMARTREST_INTERNAL_ERROR;
xinlei 20:505d29d5bdfc 196 } else {
xinlei 20:505d29d5bdfc 197 if (_client.sendIdentifier(::getIdentifier()) != CLIENT_OK)
xinlei 20:505d29d5bdfc 198 return SMARTREST_INTERNAL_ERROR;
xinlei 20:505d29d5bdfc 199 }
xinlei 20:505d29d5bdfc 200 return SMARTREST_SUCCESS;
Cumulocity 0:099f76422485 201 }
Cumulocity 11:e1bee9a77652 202 /*-------------------------------------------------------------------------*/
Cumulocity 0:099f76422485 203 uint8_t SmartRest::awaitResponse()
Cumulocity 0:099f76422485 204 {
Cumulocity 11:e1bee9a77652 205 if ((_client.endRequest() != CLIENT_OK) ||
xinlei 20:505d29d5bdfc 206 (_client.awaitResponse() != CLIENT_OK)) {
Cumulocity 11:e1bee9a77652 207 return SMARTREST_INTERNAL_ERROR;
xinlei 18:16192696c106 208 }
Cumulocity 11:e1bee9a77652 209 _source = &_client.receiveData();
Cumulocity 11:e1bee9a77652 210 return SMARTREST_SUCCESS;
Cumulocity 0:099f76422485 211 }
Cumulocity 11:e1bee9a77652 212 /*-------------------------------------------------------------------------*/
Cumulocity 0:099f76422485 213 bool SmartRest::setMoGid(ParsedRecord& record)
Cumulocity 0:099f76422485 214 {
Cumulocity 11:e1bee9a77652 215 const char *mogid;
Cumulocity 0:099f76422485 216
Cumulocity 11:e1bee9a77652 217 *_mogid = 0;
Cumulocity 11:e1bee9a77652 218 if ((record.values() < 2) || (record.value(0).integerValue() != 20))
Cumulocity 11:e1bee9a77652 219 return false;
Cumulocity 11:e1bee9a77652 220
Cumulocity 11:e1bee9a77652 221 if ((record.value(1).valueType() != VALUE_INTEGER) ||
xinlei 20:505d29d5bdfc 222 (record.value(1).integerValue() <= 0))
Cumulocity 11:e1bee9a77652 223 return false;
Cumulocity 0:099f76422485 224
Cumulocity 11:e1bee9a77652 225 mogid = record.rawValue(1);
Cumulocity 11:e1bee9a77652 226 if (strlen(mogid)+1 > sizeof(_mogid))
Cumulocity 11:e1bee9a77652 227 return false;
Cumulocity 0:099f76422485 228
Cumulocity 11:e1bee9a77652 229 strcpy(_mogid, mogid);
Cumulocity 0:099f76422485 230
Cumulocity 11:e1bee9a77652 231 return true;
Cumulocity 0:099f76422485 232 }
xinlei 20:505d29d5bdfc 233 /*-------------------------------------------------------------------------*/