mbed client lightswitch demo

Dependencies:   mbed Socket lwip-eth lwip-sys lwip

Fork of mbed-client-classic-example-lwip by Austin Blackstone

Committer:
mbedAustin
Date:
Thu Jun 09 17:08:36 2016 +0000
Revision:
11:cada08fc8a70
Commit for public Consumption

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbedAustin 11:cada08fc8a70 1 /*
mbedAustin 11:cada08fc8a70 2 * Copyright (c) 2015 ARM Limited. All rights reserved.
mbedAustin 11:cada08fc8a70 3 * SPDX-License-Identifier: Apache-2.0
mbedAustin 11:cada08fc8a70 4 * Licensed under the Apache License, Version 2.0 (the License); you may
mbedAustin 11:cada08fc8a70 5 * not use this file except in compliance with the License.
mbedAustin 11:cada08fc8a70 6 * You may obtain a copy of the License at
mbedAustin 11:cada08fc8a70 7 *
mbedAustin 11:cada08fc8a70 8 * http://www.apache.org/licenses/LICENSE-2.0
mbedAustin 11:cada08fc8a70 9 *
mbedAustin 11:cada08fc8a70 10 * Unless required by applicable law or agreed to in writing, software
mbedAustin 11:cada08fc8a70 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
mbedAustin 11:cada08fc8a70 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbedAustin 11:cada08fc8a70 13 * See the License for the specific language governing permissions and
mbedAustin 11:cada08fc8a70 14 * limitations under the License.
mbedAustin 11:cada08fc8a70 15 */
mbedAustin 11:cada08fc8a70 16 #include <stdlib.h>
mbedAustin 11:cada08fc8a70 17 #include "mbed-client/m2mresource.h"
mbedAustin 11:cada08fc8a70 18 #include "mbed-client/m2mconstants.h"
mbedAustin 11:cada08fc8a70 19 #include "mbed-client/m2mobservationhandler.h"
mbedAustin 11:cada08fc8a70 20 #include "mbed-client/m2mobjectinstance.h"
mbedAustin 11:cada08fc8a70 21 #include "include/m2mreporthandler.h"
mbedAustin 11:cada08fc8a70 22 #include "include/nsdllinker.h"
mbedAustin 11:cada08fc8a70 23 #include "ns_trace.h"
mbedAustin 11:cada08fc8a70 24
mbedAustin 11:cada08fc8a70 25 M2MResourceInstance& M2MResourceInstance::operator=(const M2MResourceInstance& other)
mbedAustin 11:cada08fc8a70 26 {
mbedAustin 11:cada08fc8a70 27 if (this != &other) { // protect against invalid self-assignment
mbedAustin 11:cada08fc8a70 28
mbedAustin 11:cada08fc8a70 29 if(_value) {
mbedAustin 11:cada08fc8a70 30 free(_value);
mbedAustin 11:cada08fc8a70 31 _value = NULL;
mbedAustin 11:cada08fc8a70 32 _value_length = 0;
mbedAustin 11:cada08fc8a70 33 }
mbedAustin 11:cada08fc8a70 34 _value_length = other._value_length;
mbedAustin 11:cada08fc8a70 35 if(other._value) {
mbedAustin 11:cada08fc8a70 36 _value = (uint8_t *)malloc(other._value_length+1);
mbedAustin 11:cada08fc8a70 37 if(_value) {
mbedAustin 11:cada08fc8a70 38 memset(_value, 0, other._value_length+1);
mbedAustin 11:cada08fc8a70 39 memcpy((uint8_t *)_value, (uint8_t *)other._value, other._value_length);
mbedAustin 11:cada08fc8a70 40 }
mbedAustin 11:cada08fc8a70 41 }
mbedAustin 11:cada08fc8a70 42 }
mbedAustin 11:cada08fc8a70 43 return *this;
mbedAustin 11:cada08fc8a70 44 }
mbedAustin 11:cada08fc8a70 45
mbedAustin 11:cada08fc8a70 46 M2MResourceInstance::M2MResourceInstance(const M2MResourceInstance& other)
mbedAustin 11:cada08fc8a70 47 : M2MBase(other),
mbedAustin 11:cada08fc8a70 48 _object_instance_callback(other._object_instance_callback),
mbedAustin 11:cada08fc8a70 49 _execute_callback(NULL),
mbedAustin 11:cada08fc8a70 50 _value(NULL),
mbedAustin 11:cada08fc8a70 51 _value_length(0),
mbedAustin 11:cada08fc8a70 52 _resource_type(M2MResourceInstance::STRING),
mbedAustin 11:cada08fc8a70 53 _resource_callback(NULL)
mbedAustin 11:cada08fc8a70 54 {
mbedAustin 11:cada08fc8a70 55 this->operator=(other);
mbedAustin 11:cada08fc8a70 56 }
mbedAustin 11:cada08fc8a70 57
mbedAustin 11:cada08fc8a70 58 M2MResourceInstance::M2MResourceInstance(const String &res_name,
mbedAustin 11:cada08fc8a70 59 const String &resource_type,
mbedAustin 11:cada08fc8a70 60 M2MResourceInstance::ResourceType type,
mbedAustin 11:cada08fc8a70 61 M2MObjectInstanceCallback &object_instance_callback)
mbedAustin 11:cada08fc8a70 62 : M2MBase(res_name,
mbedAustin 11:cada08fc8a70 63 M2MBase::Dynamic),
mbedAustin 11:cada08fc8a70 64 _object_instance_callback(object_instance_callback),
mbedAustin 11:cada08fc8a70 65 _execute_callback(NULL),
mbedAustin 11:cada08fc8a70 66 _value(NULL),
mbedAustin 11:cada08fc8a70 67 _value_length(0),
mbedAustin 11:cada08fc8a70 68 _resource_type(type),
mbedAustin 11:cada08fc8a70 69 _resource_callback(NULL)
mbedAustin 11:cada08fc8a70 70 {
mbedAustin 11:cada08fc8a70 71 M2MBase::set_resource_type(resource_type);
mbedAustin 11:cada08fc8a70 72 M2MBase::set_base_type(M2MBase::ResourceInstance);
mbedAustin 11:cada08fc8a70 73 }
mbedAustin 11:cada08fc8a70 74
mbedAustin 11:cada08fc8a70 75 M2MResourceInstance::M2MResourceInstance(const String &res_name,
mbedAustin 11:cada08fc8a70 76 const String &resource_type,
mbedAustin 11:cada08fc8a70 77 M2MResourceInstance::ResourceType type,
mbedAustin 11:cada08fc8a70 78 const uint8_t *value,
mbedAustin 11:cada08fc8a70 79 const uint8_t value_length,
mbedAustin 11:cada08fc8a70 80 M2MObjectInstanceCallback &object_instance_callback)
mbedAustin 11:cada08fc8a70 81 : M2MBase(res_name,
mbedAustin 11:cada08fc8a70 82 M2MBase::Static),
mbedAustin 11:cada08fc8a70 83 _object_instance_callback(object_instance_callback),
mbedAustin 11:cada08fc8a70 84 _execute_callback(NULL),
mbedAustin 11:cada08fc8a70 85 _value(NULL),
mbedAustin 11:cada08fc8a70 86 _value_length(0),
mbedAustin 11:cada08fc8a70 87 _resource_type(type),
mbedAustin 11:cada08fc8a70 88 _resource_callback(NULL)
mbedAustin 11:cada08fc8a70 89 {
mbedAustin 11:cada08fc8a70 90 M2MBase::set_resource_type(resource_type);
mbedAustin 11:cada08fc8a70 91 M2MBase::set_base_type(M2MBase::Resource);
mbedAustin 11:cada08fc8a70 92 if( value != NULL && value_length > 0 ) {
mbedAustin 11:cada08fc8a70 93 _value = (uint8_t *)malloc(value_length+1);
mbedAustin 11:cada08fc8a70 94 if(_value) {
mbedAustin 11:cada08fc8a70 95 memset(_value, 0, value_length+1);
mbedAustin 11:cada08fc8a70 96 memcpy((uint8_t *)_value, (uint8_t *)value, value_length);
mbedAustin 11:cada08fc8a70 97 _value_length = value_length;
mbedAustin 11:cada08fc8a70 98 }
mbedAustin 11:cada08fc8a70 99 }
mbedAustin 11:cada08fc8a70 100 }
mbedAustin 11:cada08fc8a70 101
mbedAustin 11:cada08fc8a70 102 M2MResourceInstance::~M2MResourceInstance()
mbedAustin 11:cada08fc8a70 103 {
mbedAustin 11:cada08fc8a70 104 if(_value) {
mbedAustin 11:cada08fc8a70 105 free(_value);
mbedAustin 11:cada08fc8a70 106 _value = NULL;
mbedAustin 11:cada08fc8a70 107 _value_length = 0;
mbedAustin 11:cada08fc8a70 108 }
mbedAustin 11:cada08fc8a70 109 _resource_callback = NULL;
mbedAustin 11:cada08fc8a70 110 }
mbedAustin 11:cada08fc8a70 111
mbedAustin 11:cada08fc8a70 112 M2MBase::BaseType M2MResourceInstance::base_type() const
mbedAustin 11:cada08fc8a70 113 {
mbedAustin 11:cada08fc8a70 114 return M2MBase::base_type();
mbedAustin 11:cada08fc8a70 115 }
mbedAustin 11:cada08fc8a70 116
mbedAustin 11:cada08fc8a70 117 M2MResourceInstance::ResourceType M2MResourceInstance::resource_instance_type() const
mbedAustin 11:cada08fc8a70 118 {
mbedAustin 11:cada08fc8a70 119 return _resource_type;
mbedAustin 11:cada08fc8a70 120 }
mbedAustin 11:cada08fc8a70 121
mbedAustin 11:cada08fc8a70 122 bool M2MResourceInstance::handle_observation_attribute(char *&query)
mbedAustin 11:cada08fc8a70 123 {
mbedAustin 11:cada08fc8a70 124 tr_debug("M2MResourceInstance::handle_observation_attribute()");
mbedAustin 11:cada08fc8a70 125 bool success = false;
mbedAustin 11:cada08fc8a70 126 M2MReportHandler *handler = M2MBase::report_handler();
mbedAustin 11:cada08fc8a70 127 if (handler) {
mbedAustin 11:cada08fc8a70 128 success = handler->parse_notification_attribute(query,
mbedAustin 11:cada08fc8a70 129 M2MBase::base_type(), _resource_type);
mbedAustin 11:cada08fc8a70 130 if (success) {
mbedAustin 11:cada08fc8a70 131 if ((handler->attribute_flags() & M2MReportHandler::Cancel) == 0) {
mbedAustin 11:cada08fc8a70 132 handler->set_under_observation(true);
mbedAustin 11:cada08fc8a70 133 } else {
mbedAustin 11:cada08fc8a70 134 handler->set_under_observation(false);
mbedAustin 11:cada08fc8a70 135 }
mbedAustin 11:cada08fc8a70 136 }
mbedAustin 11:cada08fc8a70 137 else {
mbedAustin 11:cada08fc8a70 138 handler->set_default_values();
mbedAustin 11:cada08fc8a70 139 }
mbedAustin 11:cada08fc8a70 140 }
mbedAustin 11:cada08fc8a70 141 return success;
mbedAustin 11:cada08fc8a70 142 }
mbedAustin 11:cada08fc8a70 143
mbedAustin 11:cada08fc8a70 144 void M2MResourceInstance::set_execute_function(execute_callback callback)
mbedAustin 11:cada08fc8a70 145 {
mbedAustin 11:cada08fc8a70 146 _execute_callback = callback;
mbedAustin 11:cada08fc8a70 147 }
mbedAustin 11:cada08fc8a70 148
mbedAustin 11:cada08fc8a70 149 void M2MResourceInstance::clear_value()
mbedAustin 11:cada08fc8a70 150 {
mbedAustin 11:cada08fc8a70 151 tr_debug("M2MResourceInstance::clear_value");
mbedAustin 11:cada08fc8a70 152 if(_value) {
mbedAustin 11:cada08fc8a70 153 free(_value);
mbedAustin 11:cada08fc8a70 154 _value = NULL;
mbedAustin 11:cada08fc8a70 155 _value_length = 0;
mbedAustin 11:cada08fc8a70 156 }
mbedAustin 11:cada08fc8a70 157 report();
mbedAustin 11:cada08fc8a70 158 }
mbedAustin 11:cada08fc8a70 159
mbedAustin 11:cada08fc8a70 160 bool M2MResourceInstance::set_value(const uint8_t *value,
mbedAustin 11:cada08fc8a70 161 const uint32_t value_length)
mbedAustin 11:cada08fc8a70 162 {
mbedAustin 11:cada08fc8a70 163 tr_debug("M2MResourceInstance::set_value()");
mbedAustin 11:cada08fc8a70 164 bool success = false;
mbedAustin 11:cada08fc8a70 165 bool string_value_changed = false;
mbedAustin 11:cada08fc8a70 166 if(_resource_type == M2MResourceInstance::STRING) {
mbedAustin 11:cada08fc8a70 167 if(is_value_changed(value,value_length)) {
mbedAustin 11:cada08fc8a70 168 string_value_changed = true;
mbedAustin 11:cada08fc8a70 169 }
mbedAustin 11:cada08fc8a70 170 }
mbedAustin 11:cada08fc8a70 171 if( value != NULL && value_length > 0 ) {
mbedAustin 11:cada08fc8a70 172 success = true;
mbedAustin 11:cada08fc8a70 173 if(_value) {
mbedAustin 11:cada08fc8a70 174 free(_value);
mbedAustin 11:cada08fc8a70 175 _value = NULL;
mbedAustin 11:cada08fc8a70 176 _value_length = 0;
mbedAustin 11:cada08fc8a70 177 }
mbedAustin 11:cada08fc8a70 178 _value = (uint8_t *)malloc(value_length+1);
mbedAustin 11:cada08fc8a70 179 if(_value) {
mbedAustin 11:cada08fc8a70 180 memset(_value, 0, value_length+1);
mbedAustin 11:cada08fc8a70 181 memcpy((uint8_t *)_value, (uint8_t *)value, value_length);
mbedAustin 11:cada08fc8a70 182 _value_length = value_length;
mbedAustin 11:cada08fc8a70 183 if(string_value_changed) {
mbedAustin 11:cada08fc8a70 184 M2MReportHandler *report_handler = M2MBase::report_handler();
mbedAustin 11:cada08fc8a70 185 if(report_handler && is_observable()) {
mbedAustin 11:cada08fc8a70 186 report_handler->set_notification_trigger();
mbedAustin 11:cada08fc8a70 187 }
mbedAustin 11:cada08fc8a70 188 } else {
mbedAustin 11:cada08fc8a70 189 report();
mbedAustin 11:cada08fc8a70 190 }
mbedAustin 11:cada08fc8a70 191 }
mbedAustin 11:cada08fc8a70 192 }
mbedAustin 11:cada08fc8a70 193
mbedAustin 11:cada08fc8a70 194 return success;
mbedAustin 11:cada08fc8a70 195 }
mbedAustin 11:cada08fc8a70 196
mbedAustin 11:cada08fc8a70 197
mbedAustin 11:cada08fc8a70 198 void M2MResourceInstance::report()
mbedAustin 11:cada08fc8a70 199 {
mbedAustin 11:cada08fc8a70 200 tr_debug("M2MResourceInstance::report()");
mbedAustin 11:cada08fc8a70 201 M2MBase::Observation observation_level = M2MBase::observation_level();
mbedAustin 11:cada08fc8a70 202 if(M2MBase::O_Attribute == observation_level ||
mbedAustin 11:cada08fc8a70 203 M2MBase::OI_Attribute == observation_level||
mbedAustin 11:cada08fc8a70 204 M2MBase::OOI_Attribute == observation_level) {
mbedAustin 11:cada08fc8a70 205 _object_instance_callback.notification_update(observation_level);
mbedAustin 11:cada08fc8a70 206 }
mbedAustin 11:cada08fc8a70 207
mbedAustin 11:cada08fc8a70 208 if(M2MBase::Dynamic == mode()) {
mbedAustin 11:cada08fc8a70 209 if(!_resource_callback && _resource_type != M2MResourceInstance::STRING) {
mbedAustin 11:cada08fc8a70 210 M2MReportHandler *report_handler = M2MBase::report_handler();
mbedAustin 11:cada08fc8a70 211 if (report_handler && is_observable()) {
mbedAustin 11:cada08fc8a70 212 if(_value) {
mbedAustin 11:cada08fc8a70 213 report_handler->set_value(atof((const char*)_value));
mbedAustin 11:cada08fc8a70 214 } else {
mbedAustin 11:cada08fc8a70 215 report_handler->set_value(0);
mbedAustin 11:cada08fc8a70 216 }
mbedAustin 11:cada08fc8a70 217 }
mbedAustin 11:cada08fc8a70 218 }
mbedAustin 11:cada08fc8a70 219 else {
mbedAustin 11:cada08fc8a70 220 if (_resource_callback && base_type() == M2MBase::ResourceInstance) {
mbedAustin 11:cada08fc8a70 221 _resource_callback->notification_update();
mbedAustin 11:cada08fc8a70 222 }
mbedAustin 11:cada08fc8a70 223 }
mbedAustin 11:cada08fc8a70 224 } else if(M2MBase::Static == mode()) {
mbedAustin 11:cada08fc8a70 225 M2MObservationHandler *observation_handler = M2MBase::observation_handler();
mbedAustin 11:cada08fc8a70 226 if(observation_handler) {
mbedAustin 11:cada08fc8a70 227 observation_handler->value_updated(this);
mbedAustin 11:cada08fc8a70 228 }
mbedAustin 11:cada08fc8a70 229 } else {
mbedAustin 11:cada08fc8a70 230 tr_debug("M2MResourceInstance::report() - mode = %d, is_observable = %d", mode(), is_observable());
mbedAustin 11:cada08fc8a70 231 }
mbedAustin 11:cada08fc8a70 232 }
mbedAustin 11:cada08fc8a70 233
mbedAustin 11:cada08fc8a70 234 bool M2MResourceInstance::is_value_changed(const uint8_t* value, const uint32_t value_len)
mbedAustin 11:cada08fc8a70 235 {
mbedAustin 11:cada08fc8a70 236 tr_debug("M2MResourceInstance::is_value_changed()");
mbedAustin 11:cada08fc8a70 237 bool changed = false;
mbedAustin 11:cada08fc8a70 238 if(value_len != _value_length) {
mbedAustin 11:cada08fc8a70 239 changed = true;
mbedAustin 11:cada08fc8a70 240 } else if(value && !_value) {
mbedAustin 11:cada08fc8a70 241 changed = true;
mbedAustin 11:cada08fc8a70 242 } else if(_value && !value) {
mbedAustin 11:cada08fc8a70 243 changed = true;
mbedAustin 11:cada08fc8a70 244 } else {
mbedAustin 11:cada08fc8a70 245 if (_value) {
mbedAustin 11:cada08fc8a70 246 String val((const char*)value);
mbedAustin 11:cada08fc8a70 247 String tmp_val((const char*)_value);
mbedAustin 11:cada08fc8a70 248 if(!(val == tmp_val)){
mbedAustin 11:cada08fc8a70 249 changed = true;
mbedAustin 11:cada08fc8a70 250 }
mbedAustin 11:cada08fc8a70 251 }
mbedAustin 11:cada08fc8a70 252 }
mbedAustin 11:cada08fc8a70 253 return changed;
mbedAustin 11:cada08fc8a70 254 }
mbedAustin 11:cada08fc8a70 255
mbedAustin 11:cada08fc8a70 256 void M2MResourceInstance::execute(void *arguments)
mbedAustin 11:cada08fc8a70 257 {
mbedAustin 11:cada08fc8a70 258 tr_debug("M2MResourceInstance::execute");
mbedAustin 11:cada08fc8a70 259 if(_execute_callback) {
mbedAustin 11:cada08fc8a70 260 _execute_callback(arguments);
mbedAustin 11:cada08fc8a70 261 }
mbedAustin 11:cada08fc8a70 262 }
mbedAustin 11:cada08fc8a70 263
mbedAustin 11:cada08fc8a70 264 void M2MResourceInstance::get_value(uint8_t *&value, uint32_t &value_length)
mbedAustin 11:cada08fc8a70 265 {
mbedAustin 11:cada08fc8a70 266 value_length = 0;
mbedAustin 11:cada08fc8a70 267 if(value) {
mbedAustin 11:cada08fc8a70 268 free(value);
mbedAustin 11:cada08fc8a70 269 value = NULL;
mbedAustin 11:cada08fc8a70 270 }
mbedAustin 11:cada08fc8a70 271 if(_value && _value_length > 0) {
mbedAustin 11:cada08fc8a70 272 value = (uint8_t *)malloc(_value_length+1);
mbedAustin 11:cada08fc8a70 273 if(value) {
mbedAustin 11:cada08fc8a70 274 value_length = _value_length;
mbedAustin 11:cada08fc8a70 275 memset(value, 0, _value_length+1);
mbedAustin 11:cada08fc8a70 276 memcpy((uint8_t *)value, (uint8_t *)_value, value_length);
mbedAustin 11:cada08fc8a70 277 }
mbedAustin 11:cada08fc8a70 278 }
mbedAustin 11:cada08fc8a70 279 }
mbedAustin 11:cada08fc8a70 280
mbedAustin 11:cada08fc8a70 281 uint8_t* M2MResourceInstance::value() const
mbedAustin 11:cada08fc8a70 282 {
mbedAustin 11:cada08fc8a70 283 return _value;
mbedAustin 11:cada08fc8a70 284 }
mbedAustin 11:cada08fc8a70 285
mbedAustin 11:cada08fc8a70 286 uint32_t M2MResourceInstance::value_length() const
mbedAustin 11:cada08fc8a70 287 {
mbedAustin 11:cada08fc8a70 288 return _value_length;
mbedAustin 11:cada08fc8a70 289 }
mbedAustin 11:cada08fc8a70 290
mbedAustin 11:cada08fc8a70 291 sn_coap_hdr_s* M2MResourceInstance::handle_get_request(nsdl_s *nsdl,
mbedAustin 11:cada08fc8a70 292 sn_coap_hdr_s *received_coap_header,
mbedAustin 11:cada08fc8a70 293 M2MObservationHandler *observation_handler)
mbedAustin 11:cada08fc8a70 294 {
mbedAustin 11:cada08fc8a70 295 tr_debug("M2MResourceInstance::handle_get_request()");
mbedAustin 11:cada08fc8a70 296 sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CONTENT;
mbedAustin 11:cada08fc8a70 297 sn_coap_hdr_s *coap_response = sn_nsdl_build_response(nsdl,
mbedAustin 11:cada08fc8a70 298 received_coap_header,
mbedAustin 11:cada08fc8a70 299 msg_code);
mbedAustin 11:cada08fc8a70 300 if(received_coap_header) {
mbedAustin 11:cada08fc8a70 301 // process the GET if we have registered a callback for it
mbedAustin 11:cada08fc8a70 302 if ((operation() & SN_GRS_GET_ALLOWED) != 0) {
mbedAustin 11:cada08fc8a70 303 if(coap_response) {
mbedAustin 11:cada08fc8a70 304 coap_response->content_type_ptr = (uint8_t*)malloc(1);
mbedAustin 11:cada08fc8a70 305 if(coap_response->content_type_ptr) {
mbedAustin 11:cada08fc8a70 306 memset(coap_response->content_type_ptr, 0, 1);
mbedAustin 11:cada08fc8a70 307 coap_response->content_type_len = 1;
mbedAustin 11:cada08fc8a70 308 }
mbedAustin 11:cada08fc8a70 309
mbedAustin 11:cada08fc8a70 310 // fill in the CoAP response payload
mbedAustin 11:cada08fc8a70 311 coap_response->payload_ptr = NULL;
mbedAustin 11:cada08fc8a70 312 uint32_t payload_len = 0;
mbedAustin 11:cada08fc8a70 313 get_value(coap_response->payload_ptr,payload_len);
mbedAustin 11:cada08fc8a70 314 coap_response->payload_len = payload_len;
mbedAustin 11:cada08fc8a70 315
mbedAustin 11:cada08fc8a70 316 coap_response->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s));
mbedAustin 11:cada08fc8a70 317 memset(coap_response->options_list_ptr, 0, sizeof(sn_coap_options_list_s));
mbedAustin 11:cada08fc8a70 318
mbedAustin 11:cada08fc8a70 319 coap_response->options_list_ptr->max_age_ptr = (uint8_t*)malloc(1);
mbedAustin 11:cada08fc8a70 320 memset(coap_response->options_list_ptr->max_age_ptr,0,1);
mbedAustin 11:cada08fc8a70 321 coap_response->options_list_ptr->max_age_len = 1;
mbedAustin 11:cada08fc8a70 322
mbedAustin 11:cada08fc8a70 323 if(received_coap_header->token_ptr) {
mbedAustin 11:cada08fc8a70 324 tr_debug("M2MResourceInstance::handle_get_request - Sets Observation Token to resource");
mbedAustin 11:cada08fc8a70 325 set_observation_token(received_coap_header->token_ptr,
mbedAustin 11:cada08fc8a70 326 received_coap_header->token_len);
mbedAustin 11:cada08fc8a70 327 }
mbedAustin 11:cada08fc8a70 328
mbedAustin 11:cada08fc8a70 329 if(received_coap_header->options_list_ptr) {
mbedAustin 11:cada08fc8a70 330 if(received_coap_header->options_list_ptr->observe) {
mbedAustin 11:cada08fc8a70 331 if (is_observable()) {
mbedAustin 11:cada08fc8a70 332 uint32_t number = 0;
mbedAustin 11:cada08fc8a70 333 uint8_t observe_option = 0;
mbedAustin 11:cada08fc8a70 334 if(received_coap_header->options_list_ptr->observe_ptr) {
mbedAustin 11:cada08fc8a70 335 observe_option = *received_coap_header->options_list_ptr->observe_ptr;
mbedAustin 11:cada08fc8a70 336 }
mbedAustin 11:cada08fc8a70 337 if(START_OBSERVATION == observe_option) {
mbedAustin 11:cada08fc8a70 338 tr_debug("M2MResourceInstance::handle_get_request - Starts Observation");
mbedAustin 11:cada08fc8a70 339 // If the observe length is 0 means register for observation.
mbedAustin 11:cada08fc8a70 340 if(received_coap_header->options_list_ptr->observe_len != 0) {
mbedAustin 11:cada08fc8a70 341 for(int i=0;i < received_coap_header->options_list_ptr->observe_len; i++) {
mbedAustin 11:cada08fc8a70 342 number = (*(received_coap_header->options_list_ptr->observe_ptr + i) & 0xff) <<
mbedAustin 11:cada08fc8a70 343 8*(received_coap_header->options_list_ptr->observe_len- 1 - i);
mbedAustin 11:cada08fc8a70 344 }
mbedAustin 11:cada08fc8a70 345 }
mbedAustin 11:cada08fc8a70 346 // If the observe value is 0 means register for observation.
mbedAustin 11:cada08fc8a70 347 if(number == 0) {
mbedAustin 11:cada08fc8a70 348 tr_debug("M2MResourceInstance::handle_get_request - Put Resource under Observation");
mbedAustin 11:cada08fc8a70 349 set_under_observation(true,observation_handler);
mbedAustin 11:cada08fc8a70 350 M2MBase::add_observation_level(M2MBase::R_Attribute);
mbedAustin 11:cada08fc8a70 351 uint8_t *obs_number = (uint8_t*)malloc(3);
mbedAustin 11:cada08fc8a70 352 memset(obs_number,0,3);
mbedAustin 11:cada08fc8a70 353 uint8_t observation_number_length = 1;
mbedAustin 11:cada08fc8a70 354
mbedAustin 11:cada08fc8a70 355 uint16_t number = observation_number();
mbedAustin 11:cada08fc8a70 356
mbedAustin 11:cada08fc8a70 357 tr_debug("M2MResourceInstance::handle_get_request - Observation Number %d", number);
mbedAustin 11:cada08fc8a70 358 obs_number[0] = ((number>>8) & 0xFF);
mbedAustin 11:cada08fc8a70 359 obs_number[1] = (number & 0xFF);
mbedAustin 11:cada08fc8a70 360
mbedAustin 11:cada08fc8a70 361 if(number > 0xFF) {
mbedAustin 11:cada08fc8a70 362 observation_number_length = 2;
mbedAustin 11:cada08fc8a70 363 }
mbedAustin 11:cada08fc8a70 364 coap_response->options_list_ptr->observe_ptr = obs_number;
mbedAustin 11:cada08fc8a70 365 coap_response->options_list_ptr->observe_len = observation_number_length;
mbedAustin 11:cada08fc8a70 366 }
mbedAustin 11:cada08fc8a70 367 } else if (STOP_OBSERVATION == observe_option) {
mbedAustin 11:cada08fc8a70 368 tr_debug("M2MResourceInstance::handle_get_request - Stops Observation");
mbedAustin 11:cada08fc8a70 369 set_under_observation(false,NULL);
mbedAustin 11:cada08fc8a70 370 M2MBase::remove_observation_level(M2MBase::R_Attribute);
mbedAustin 11:cada08fc8a70 371 }
mbedAustin 11:cada08fc8a70 372 } else {
mbedAustin 11:cada08fc8a70 373 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
mbedAustin 11:cada08fc8a70 374 }
mbedAustin 11:cada08fc8a70 375 }
mbedAustin 11:cada08fc8a70 376 }
mbedAustin 11:cada08fc8a70 377 }
mbedAustin 11:cada08fc8a70 378 }else {
mbedAustin 11:cada08fc8a70 379 tr_error("M2MResourceInstance::handle_get_request - Return COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED");
mbedAustin 11:cada08fc8a70 380 // Operation is not allowed.
mbedAustin 11:cada08fc8a70 381 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
mbedAustin 11:cada08fc8a70 382 }
mbedAustin 11:cada08fc8a70 383 } else {
mbedAustin 11:cada08fc8a70 384 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
mbedAustin 11:cada08fc8a70 385 }
mbedAustin 11:cada08fc8a70 386 if(coap_response) {
mbedAustin 11:cada08fc8a70 387 coap_response->msg_code = msg_code;
mbedAustin 11:cada08fc8a70 388 }
mbedAustin 11:cada08fc8a70 389 return coap_response;
mbedAustin 11:cada08fc8a70 390 }
mbedAustin 11:cada08fc8a70 391
mbedAustin 11:cada08fc8a70 392 sn_coap_hdr_s* M2MResourceInstance::handle_put_request(nsdl_s *nsdl,
mbedAustin 11:cada08fc8a70 393 sn_coap_hdr_s *received_coap_header,
mbedAustin 11:cada08fc8a70 394 M2MObservationHandler *observation_handler)
mbedAustin 11:cada08fc8a70 395 {
mbedAustin 11:cada08fc8a70 396 tr_debug("M2MResourceInstance::handle_put_request()");
mbedAustin 11:cada08fc8a70 397 sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; // 2.04
mbedAustin 11:cada08fc8a70 398 sn_coap_hdr_s * coap_response = sn_nsdl_build_response(nsdl,
mbedAustin 11:cada08fc8a70 399 received_coap_header,
mbedAustin 11:cada08fc8a70 400 msg_code);
mbedAustin 11:cada08fc8a70 401 // process the PUT if we have registered a callback for it
mbedAustin 11:cada08fc8a70 402 if(received_coap_header) {
mbedAustin 11:cada08fc8a70 403 if ((operation() & SN_GRS_PUT_ALLOWED) != 0) {
mbedAustin 11:cada08fc8a70 404 uint16_t coap_content_type = 0;
mbedAustin 11:cada08fc8a70 405 if(received_coap_header->content_type_ptr) {
mbedAustin 11:cada08fc8a70 406 if(coap_response) {
mbedAustin 11:cada08fc8a70 407 coap_response->content_type_ptr = (uint8_t*)malloc(received_coap_header->content_type_len);
mbedAustin 11:cada08fc8a70 408 if(coap_response->content_type_ptr) {
mbedAustin 11:cada08fc8a70 409 memset(coap_response->content_type_ptr, 0, received_coap_header->content_type_len);
mbedAustin 11:cada08fc8a70 410 memcpy(coap_response->content_type_ptr,
mbedAustin 11:cada08fc8a70 411 received_coap_header->content_type_ptr,
mbedAustin 11:cada08fc8a70 412 received_coap_header->content_type_len);
mbedAustin 11:cada08fc8a70 413 coap_response->content_type_len = received_coap_header->content_type_len;
mbedAustin 11:cada08fc8a70 414 for(uint8_t i = 0; i < coap_response->content_type_len; i++) {
mbedAustin 11:cada08fc8a70 415 coap_content_type = (coap_content_type << 8) + (coap_response->content_type_ptr[i] & 0xFF);
mbedAustin 11:cada08fc8a70 416 }
mbedAustin 11:cada08fc8a70 417 }
mbedAustin 11:cada08fc8a70 418 }
mbedAustin 11:cada08fc8a70 419 }
mbedAustin 11:cada08fc8a70 420
mbedAustin 11:cada08fc8a70 421 tr_debug("M2MResourceInstance::handle_put_request() - Request Content-Type %d", coap_content_type);
mbedAustin 11:cada08fc8a70 422
mbedAustin 11:cada08fc8a70 423 if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type) {
mbedAustin 11:cada08fc8a70 424 msg_code = COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT;
mbedAustin 11:cada08fc8a70 425 } else {
mbedAustin 11:cada08fc8a70 426 set_value(received_coap_header->payload_ptr, received_coap_header->payload_len);
mbedAustin 11:cada08fc8a70 427 if(received_coap_header->payload_ptr) {
mbedAustin 11:cada08fc8a70 428 tr_debug("M2MResourceInstance::handle_put_request() - Update Resource with new values");
mbedAustin 11:cada08fc8a70 429 if(observation_handler) {
mbedAustin 11:cada08fc8a70 430 String value = "";
mbedAustin 11:cada08fc8a70 431 if (received_coap_header->uri_path_ptr != NULL &&
mbedAustin 11:cada08fc8a70 432 received_coap_header->uri_path_len > 0) {
mbedAustin 11:cada08fc8a70 433 char* buf = (char*)malloc(received_coap_header->uri_path_len+1);
mbedAustin 11:cada08fc8a70 434 if(buf) {
mbedAustin 11:cada08fc8a70 435 memset(buf,0,received_coap_header->uri_path_len+1);
mbedAustin 11:cada08fc8a70 436 memcpy(buf,received_coap_header->uri_path_ptr,received_coap_header->uri_path_len);
mbedAustin 11:cada08fc8a70 437 value = String(buf);
mbedAustin 11:cada08fc8a70 438 free(buf);
mbedAustin 11:cada08fc8a70 439 }
mbedAustin 11:cada08fc8a70 440 }
mbedAustin 11:cada08fc8a70 441 observation_handler->value_updated(this,value);
mbedAustin 11:cada08fc8a70 442 }
mbedAustin 11:cada08fc8a70 443 }
mbedAustin 11:cada08fc8a70 444 if(received_coap_header->options_list_ptr &&
mbedAustin 11:cada08fc8a70 445 received_coap_header->options_list_ptr->uri_query_ptr) {
mbedAustin 11:cada08fc8a70 446 char *query = (char*)malloc(received_coap_header->options_list_ptr->uri_query_len+1);
mbedAustin 11:cada08fc8a70 447 if (query){
mbedAustin 11:cada08fc8a70 448 memset(query, 0, received_coap_header->options_list_ptr->uri_query_len+1);
mbedAustin 11:cada08fc8a70 449 memcpy(query,
mbedAustin 11:cada08fc8a70 450 received_coap_header->options_list_ptr->uri_query_ptr,
mbedAustin 11:cada08fc8a70 451 received_coap_header->options_list_ptr->uri_query_len);
mbedAustin 11:cada08fc8a70 452 memset(query + received_coap_header->options_list_ptr->uri_query_len,'\0',1);//String terminator
mbedAustin 11:cada08fc8a70 453 tr_debug("M2MResourceInstance::handle_put_request() - Query %s", query);
mbedAustin 11:cada08fc8a70 454 // if anything was updated, re-initialize the stored notification attributes
mbedAustin 11:cada08fc8a70 455 if (!handle_observation_attribute(query)){
mbedAustin 11:cada08fc8a70 456 tr_debug("M2MResourceInstance::handle_put_request() - Invalid query");
mbedAustin 11:cada08fc8a70 457 msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; // 4.00
mbedAustin 11:cada08fc8a70 458 }
mbedAustin 11:cada08fc8a70 459 free(query);
mbedAustin 11:cada08fc8a70 460 }
mbedAustin 11:cada08fc8a70 461 }
mbedAustin 11:cada08fc8a70 462 }
mbedAustin 11:cada08fc8a70 463 } else {
mbedAustin 11:cada08fc8a70 464 // Operation is not allowed.
mbedAustin 11:cada08fc8a70 465 tr_error("M2MResourceInstance::handle_put_request() - COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED");
mbedAustin 11:cada08fc8a70 466 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
mbedAustin 11:cada08fc8a70 467 }
mbedAustin 11:cada08fc8a70 468 } else {
mbedAustin 11:cada08fc8a70 469 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
mbedAustin 11:cada08fc8a70 470 }
mbedAustin 11:cada08fc8a70 471 if(coap_response) {
mbedAustin 11:cada08fc8a70 472 coap_response->msg_code = msg_code;
mbedAustin 11:cada08fc8a70 473 }
mbedAustin 11:cada08fc8a70 474 return coap_response;
mbedAustin 11:cada08fc8a70 475 }
mbedAustin 11:cada08fc8a70 476
mbedAustin 11:cada08fc8a70 477 void M2MResourceInstance::set_resource_observer(M2MResourceCallback *resource)
mbedAustin 11:cada08fc8a70 478 {
mbedAustin 11:cada08fc8a70 479 _resource_callback = resource;
mbedAustin 11:cada08fc8a70 480 }