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 "mbed-client/m2mobject.h"
mbedAustin 11:cada08fc8a70 17 #include "mbed-client/m2mobservationhandler.h"
mbedAustin 11:cada08fc8a70 18 #include "mbed-client/m2mconstants.h"
mbedAustin 11:cada08fc8a70 19 #include "include/m2mtlvserializer.h"
mbedAustin 11:cada08fc8a70 20 #include "include/m2mtlvdeserializer.h"
mbedAustin 11:cada08fc8a70 21 #include "include/nsdllinker.h"
mbedAustin 11:cada08fc8a70 22 #include "include/m2mreporthandler.h"
mbedAustin 11:cada08fc8a70 23 #include "ns_trace.h"
mbedAustin 11:cada08fc8a70 24
mbedAustin 11:cada08fc8a70 25 M2MObject::M2MObject(const String &object_name)
mbedAustin 11:cada08fc8a70 26 : M2MBase(object_name,M2MBase::Dynamic),
mbedAustin 11:cada08fc8a70 27 _max_instance_count(MAX_UNINT_16_COUNT)
mbedAustin 11:cada08fc8a70 28 {
mbedAustin 11:cada08fc8a70 29 M2MBase::set_base_type(M2MBase::Object);
mbedAustin 11:cada08fc8a70 30 if(M2MBase::name_id() != -1) {
mbedAustin 11:cada08fc8a70 31 M2MBase::set_coap_content_type(COAP_CONTENT_OMA_TLV_TYPE);
mbedAustin 11:cada08fc8a70 32 }
mbedAustin 11:cada08fc8a70 33 }
mbedAustin 11:cada08fc8a70 34
mbedAustin 11:cada08fc8a70 35 M2MObject::~M2MObject()
mbedAustin 11:cada08fc8a70 36 {
mbedAustin 11:cada08fc8a70 37 if(!_instance_list.empty()) {
mbedAustin 11:cada08fc8a70 38 M2MObjectInstanceList::const_iterator it;
mbedAustin 11:cada08fc8a70 39 it = _instance_list.begin();
mbedAustin 11:cada08fc8a70 40 M2MObjectInstance* obj = NULL;
mbedAustin 11:cada08fc8a70 41 uint16_t index = 0;
mbedAustin 11:cada08fc8a70 42 for (; it!=_instance_list.end(); it++, index++ ) {
mbedAustin 11:cada08fc8a70 43 //Free allocated memory for object instances.
mbedAustin 11:cada08fc8a70 44 obj = *it;
mbedAustin 11:cada08fc8a70 45
mbedAustin 11:cada08fc8a70 46 char *obj_inst_id = (char*)malloc(20);
mbedAustin 11:cada08fc8a70 47 if(obj_inst_id) {
mbedAustin 11:cada08fc8a70 48 snprintf(obj_inst_id, 20,"%d",index);
mbedAustin 11:cada08fc8a70 49
mbedAustin 11:cada08fc8a70 50 String obj_name = M2MBase::name();
mbedAustin 11:cada08fc8a70 51 obj_name += String("/");
mbedAustin 11:cada08fc8a70 52 obj_name += String(obj_inst_id);
mbedAustin 11:cada08fc8a70 53
mbedAustin 11:cada08fc8a70 54 free(obj_inst_id);
mbedAustin 11:cada08fc8a70 55 remove_resource_from_coap(obj_name);
mbedAustin 11:cada08fc8a70 56 }
mbedAustin 11:cada08fc8a70 57
mbedAustin 11:cada08fc8a70 58 delete obj;
mbedAustin 11:cada08fc8a70 59 obj = NULL;
mbedAustin 11:cada08fc8a70 60 }
mbedAustin 11:cada08fc8a70 61 remove_object_from_coap();
mbedAustin 11:cada08fc8a70 62 _instance_list.clear();
mbedAustin 11:cada08fc8a70 63 }
mbedAustin 11:cada08fc8a70 64 }
mbedAustin 11:cada08fc8a70 65
mbedAustin 11:cada08fc8a70 66 M2MObject& M2MObject::operator=(const M2MObject& other)
mbedAustin 11:cada08fc8a70 67 {
mbedAustin 11:cada08fc8a70 68 if (this != &other) { // protect against invalid self-assignment
mbedAustin 11:cada08fc8a70 69 if(!other._instance_list.empty()){
mbedAustin 11:cada08fc8a70 70 M2MObjectInstance* ins = NULL;
mbedAustin 11:cada08fc8a70 71 M2MObjectInstanceList::const_iterator it;
mbedAustin 11:cada08fc8a70 72 it = other._instance_list.begin();
mbedAustin 11:cada08fc8a70 73 for (; it!=other._instance_list.end(); it++ ) {
mbedAustin 11:cada08fc8a70 74 ins = *it;
mbedAustin 11:cada08fc8a70 75 _instance_list.push_back(new M2MObjectInstance(*ins));
mbedAustin 11:cada08fc8a70 76 }
mbedAustin 11:cada08fc8a70 77 }
mbedAustin 11:cada08fc8a70 78 }
mbedAustin 11:cada08fc8a70 79 return *this;
mbedAustin 11:cada08fc8a70 80 }
mbedAustin 11:cada08fc8a70 81
mbedAustin 11:cada08fc8a70 82 M2MObject::M2MObject(const M2MObject& other)
mbedAustin 11:cada08fc8a70 83 : M2MBase(other),
mbedAustin 11:cada08fc8a70 84 _max_instance_count(MAX_UNINT_16_COUNT)
mbedAustin 11:cada08fc8a70 85 {
mbedAustin 11:cada08fc8a70 86 this->operator=(other);
mbedAustin 11:cada08fc8a70 87 }
mbedAustin 11:cada08fc8a70 88
mbedAustin 11:cada08fc8a70 89 M2MObjectInstance* M2MObject::create_object_instance(uint16_t instance_id)
mbedAustin 11:cada08fc8a70 90 {
mbedAustin 11:cada08fc8a70 91 tr_debug("M2MObject::create_object_instance - id: %d", instance_id);
mbedAustin 11:cada08fc8a70 92 M2MObjectInstance *instance = NULL;
mbedAustin 11:cada08fc8a70 93 if(!object_instance(instance_id)) {
mbedAustin 11:cada08fc8a70 94 instance = new M2MObjectInstance(this->name(),*this);
mbedAustin 11:cada08fc8a70 95 if(instance) {
mbedAustin 11:cada08fc8a70 96 instance->set_instance_id(instance_id);
mbedAustin 11:cada08fc8a70 97 _instance_list.push_back(instance);
mbedAustin 11:cada08fc8a70 98 if(M2MBase::name_id() != -1) {
mbedAustin 11:cada08fc8a70 99 instance->set_coap_content_type(COAP_CONTENT_OMA_TLV_TYPE);
mbedAustin 11:cada08fc8a70 100 }
mbedAustin 11:cada08fc8a70 101 }
mbedAustin 11:cada08fc8a70 102 }
mbedAustin 11:cada08fc8a70 103 return instance;
mbedAustin 11:cada08fc8a70 104 }
mbedAustin 11:cada08fc8a70 105
mbedAustin 11:cada08fc8a70 106 bool M2MObject::remove_object_instance(uint16_t inst_id)
mbedAustin 11:cada08fc8a70 107 {
mbedAustin 11:cada08fc8a70 108 tr_debug("M2MObject::remove_object_instance(inst_id %d)", inst_id);
mbedAustin 11:cada08fc8a70 109 bool success = false;
mbedAustin 11:cada08fc8a70 110 if(!_instance_list.empty()) {
mbedAustin 11:cada08fc8a70 111 M2MObjectInstance* obj = NULL;
mbedAustin 11:cada08fc8a70 112 M2MObjectInstanceList::const_iterator it;
mbedAustin 11:cada08fc8a70 113 it = _instance_list.begin();
mbedAustin 11:cada08fc8a70 114 int pos = 0;
mbedAustin 11:cada08fc8a70 115 for ( ; it != _instance_list.end(); it++, pos++ ) {
mbedAustin 11:cada08fc8a70 116 if((*it)->instance_id() == inst_id) {
mbedAustin 11:cada08fc8a70 117 // Instance found and deleted.
mbedAustin 11:cada08fc8a70 118 obj = *it;
mbedAustin 11:cada08fc8a70 119
mbedAustin 11:cada08fc8a70 120 char *obj_inst_id = (char*)malloc(20);
mbedAustin 11:cada08fc8a70 121 if(obj_inst_id) {
mbedAustin 11:cada08fc8a70 122 snprintf(obj_inst_id, 20,"%d",obj->instance_id());
mbedAustin 11:cada08fc8a70 123
mbedAustin 11:cada08fc8a70 124 String obj_name = name();
mbedAustin 11:cada08fc8a70 125 obj_name += String("/");
mbedAustin 11:cada08fc8a70 126 obj_name += String(obj_inst_id);
mbedAustin 11:cada08fc8a70 127
mbedAustin 11:cada08fc8a70 128 free(obj_inst_id);
mbedAustin 11:cada08fc8a70 129
mbedAustin 11:cada08fc8a70 130 delete obj;
mbedAustin 11:cada08fc8a70 131 obj = NULL;
mbedAustin 11:cada08fc8a70 132 _instance_list.erase(pos);
mbedAustin 11:cada08fc8a70 133 success = true;
mbedAustin 11:cada08fc8a70 134
mbedAustin 11:cada08fc8a70 135 remove_resource_from_coap(obj_name);
mbedAustin 11:cada08fc8a70 136 }
mbedAustin 11:cada08fc8a70 137 break;
mbedAustin 11:cada08fc8a70 138 }
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 M2MObjectInstance* M2MObject::object_instance(uint16_t inst_id) const
mbedAustin 11:cada08fc8a70 145 {
mbedAustin 11:cada08fc8a70 146 tr_debug("M2MObject::object_instance(inst_id %d)", inst_id);
mbedAustin 11:cada08fc8a70 147 M2MObjectInstance *obj = NULL;
mbedAustin 11:cada08fc8a70 148 if(!_instance_list.empty()) {
mbedAustin 11:cada08fc8a70 149 M2MObjectInstanceList::const_iterator it;
mbedAustin 11:cada08fc8a70 150 it = _instance_list.begin();
mbedAustin 11:cada08fc8a70 151 for ( ; it != _instance_list.end(); it++ ) {
mbedAustin 11:cada08fc8a70 152 if((*it)->instance_id() == inst_id) {
mbedAustin 11:cada08fc8a70 153 // Instance found.
mbedAustin 11:cada08fc8a70 154 obj = *it;
mbedAustin 11:cada08fc8a70 155 break;
mbedAustin 11:cada08fc8a70 156 }
mbedAustin 11:cada08fc8a70 157 }
mbedAustin 11:cada08fc8a70 158 }
mbedAustin 11:cada08fc8a70 159 return obj;
mbedAustin 11:cada08fc8a70 160 }
mbedAustin 11:cada08fc8a70 161
mbedAustin 11:cada08fc8a70 162 const M2MObjectInstanceList& M2MObject::instances() const
mbedAustin 11:cada08fc8a70 163 {
mbedAustin 11:cada08fc8a70 164 return _instance_list;
mbedAustin 11:cada08fc8a70 165 }
mbedAustin 11:cada08fc8a70 166
mbedAustin 11:cada08fc8a70 167 uint16_t M2MObject::instance_count() const
mbedAustin 11:cada08fc8a70 168 {
mbedAustin 11:cada08fc8a70 169 return (uint16_t)_instance_list.size();
mbedAustin 11:cada08fc8a70 170 }
mbedAustin 11:cada08fc8a70 171
mbedAustin 11:cada08fc8a70 172 M2MBase::BaseType M2MObject::base_type() const
mbedAustin 11:cada08fc8a70 173 {
mbedAustin 11:cada08fc8a70 174 return M2MBase::base_type();
mbedAustin 11:cada08fc8a70 175 }
mbedAustin 11:cada08fc8a70 176
mbedAustin 11:cada08fc8a70 177 void M2MObject::add_observation_level(M2MBase::Observation observation_level)
mbedAustin 11:cada08fc8a70 178 {
mbedAustin 11:cada08fc8a70 179 M2MBase::add_observation_level(observation_level);
mbedAustin 11:cada08fc8a70 180 if(!_instance_list.empty()) {
mbedAustin 11:cada08fc8a70 181 M2MObjectInstanceList::const_iterator it;
mbedAustin 11:cada08fc8a70 182 it = _instance_list.begin();
mbedAustin 11:cada08fc8a70 183 for ( ; it != _instance_list.end(); it++ ) {
mbedAustin 11:cada08fc8a70 184 (*it)->add_observation_level(observation_level);
mbedAustin 11:cada08fc8a70 185 }
mbedAustin 11:cada08fc8a70 186 }
mbedAustin 11:cada08fc8a70 187 }
mbedAustin 11:cada08fc8a70 188
mbedAustin 11:cada08fc8a70 189 void M2MObject::remove_observation_level(M2MBase::Observation observation_level)
mbedAustin 11:cada08fc8a70 190 {
mbedAustin 11:cada08fc8a70 191 M2MBase::remove_observation_level(observation_level);
mbedAustin 11:cada08fc8a70 192 if(!_instance_list.empty()) {
mbedAustin 11:cada08fc8a70 193 M2MObjectInstanceList::const_iterator it;
mbedAustin 11:cada08fc8a70 194 it = _instance_list.begin();
mbedAustin 11:cada08fc8a70 195 for ( ; it != _instance_list.end(); it++ ) {
mbedAustin 11:cada08fc8a70 196 (*it)->remove_observation_level(observation_level);
mbedAustin 11:cada08fc8a70 197 }
mbedAustin 11:cada08fc8a70 198 }
mbedAustin 11:cada08fc8a70 199 }
mbedAustin 11:cada08fc8a70 200
mbedAustin 11:cada08fc8a70 201 sn_coap_hdr_s* M2MObject::handle_get_request(nsdl_s *nsdl,
mbedAustin 11:cada08fc8a70 202 sn_coap_hdr_s *received_coap_header,
mbedAustin 11:cada08fc8a70 203 M2MObservationHandler *observation_handler)
mbedAustin 11:cada08fc8a70 204 {
mbedAustin 11:cada08fc8a70 205 tr_debug("M2MObject::handle_get_request()");
mbedAustin 11:cada08fc8a70 206 sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CONTENT;
mbedAustin 11:cada08fc8a70 207 sn_coap_hdr_s * coap_response = sn_nsdl_build_response(nsdl,
mbedAustin 11:cada08fc8a70 208 received_coap_header,
mbedAustin 11:cada08fc8a70 209 msg_code);
mbedAustin 11:cada08fc8a70 210 //TODO: GET for Object is not yet implemented.
mbedAustin 11:cada08fc8a70 211 // Need to first fix C library and then implement on C++ side.
mbedAustin 11:cada08fc8a70 212 uint8_t * data = NULL;
mbedAustin 11:cada08fc8a70 213 uint32_t data_length = 0;
mbedAustin 11:cada08fc8a70 214 //TODO: GET for Object is not yet implemented.
mbedAustin 11:cada08fc8a70 215 // Need to first fix C library and then implement on C++ side.
mbedAustin 11:cada08fc8a70 216 if(received_coap_header) {
mbedAustin 11:cada08fc8a70 217 // process the GET if we have registered a callback for it
mbedAustin 11:cada08fc8a70 218 if ((operation() & SN_GRS_GET_ALLOWED) != 0) {
mbedAustin 11:cada08fc8a70 219 if(coap_response) {
mbedAustin 11:cada08fc8a70 220 uint16_t coap_content_type = 0;
mbedAustin 11:cada08fc8a70 221 bool content_type_present = false;
mbedAustin 11:cada08fc8a70 222 if(received_coap_header->content_type_ptr) {
mbedAustin 11:cada08fc8a70 223 content_type_present = true;
mbedAustin 11:cada08fc8a70 224 coap_response->content_type_ptr = (uint8_t*)malloc(received_coap_header->content_type_len);
mbedAustin 11:cada08fc8a70 225 if(coap_response->content_type_ptr) {
mbedAustin 11:cada08fc8a70 226 memset(coap_response->content_type_ptr, 0, received_coap_header->content_type_len);
mbedAustin 11:cada08fc8a70 227 memcpy(coap_response->content_type_ptr,
mbedAustin 11:cada08fc8a70 228 received_coap_header->content_type_ptr,
mbedAustin 11:cada08fc8a70 229 received_coap_header->content_type_len);
mbedAustin 11:cada08fc8a70 230 coap_response->content_type_len = received_coap_header->content_type_len;
mbedAustin 11:cada08fc8a70 231 for(uint8_t i = 0; i < coap_response->content_type_len; i++) {
mbedAustin 11:cada08fc8a70 232 coap_content_type = (coap_content_type << 8) + (coap_response->content_type_ptr[i] & 0xFF);
mbedAustin 11:cada08fc8a70 233 }
mbedAustin 11:cada08fc8a70 234 }
mbedAustin 11:cada08fc8a70 235 }
mbedAustin 11:cada08fc8a70 236 if(!content_type_present &&
mbedAustin 11:cada08fc8a70 237 M2MBase::coap_content_type() == COAP_CONTENT_OMA_TLV_TYPE) {
mbedAustin 11:cada08fc8a70 238 coap_content_type = COAP_CONTENT_OMA_TLV_TYPE;
mbedAustin 11:cada08fc8a70 239 }
mbedAustin 11:cada08fc8a70 240
mbedAustin 11:cada08fc8a70 241 tr_debug("M2MObject::handle_get_request() - Request Content-Type %d", coap_content_type);
mbedAustin 11:cada08fc8a70 242
mbedAustin 11:cada08fc8a70 243 // fill in the CoAP response payload
mbedAustin 11:cada08fc8a70 244 if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type) {
mbedAustin 11:cada08fc8a70 245 M2MTLVSerializer *serializer = new M2MTLVSerializer();
mbedAustin 11:cada08fc8a70 246 data = serializer->serialize(_instance_list, data_length);
mbedAustin 11:cada08fc8a70 247 delete serializer;
mbedAustin 11:cada08fc8a70 248 } else { // TOD0: Implement JSON Format.
mbedAustin 11:cada08fc8a70 249 msg_code = COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT; // Content format not supported
mbedAustin 11:cada08fc8a70 250 }
mbedAustin 11:cada08fc8a70 251
mbedAustin 11:cada08fc8a70 252 coap_response->payload_len = data_length;
mbedAustin 11:cada08fc8a70 253 coap_response->payload_ptr = data;
mbedAustin 11:cada08fc8a70 254
mbedAustin 11:cada08fc8a70 255 coap_response->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s));
mbedAustin 11:cada08fc8a70 256 memset(coap_response->options_list_ptr, 0, sizeof(sn_coap_options_list_s));
mbedAustin 11:cada08fc8a70 257
mbedAustin 11:cada08fc8a70 258 coap_response->options_list_ptr->max_age_ptr = (uint8_t*)malloc(1);
mbedAustin 11:cada08fc8a70 259 memset(coap_response->options_list_ptr->max_age_ptr,0,1);
mbedAustin 11:cada08fc8a70 260 coap_response->options_list_ptr->max_age_len = 1;
mbedAustin 11:cada08fc8a70 261
mbedAustin 11:cada08fc8a70 262 if(data){
mbedAustin 11:cada08fc8a70 263 if(received_coap_header->token_ptr) {
mbedAustin 11:cada08fc8a70 264 tr_debug("M2MObject::handle_get_request - Sets Observation Token to resource");
mbedAustin 11:cada08fc8a70 265 set_observation_token(received_coap_header->token_ptr,
mbedAustin 11:cada08fc8a70 266 received_coap_header->token_len);
mbedAustin 11:cada08fc8a70 267 }
mbedAustin 11:cada08fc8a70 268
mbedAustin 11:cada08fc8a70 269 if(received_coap_header->options_list_ptr) {
mbedAustin 11:cada08fc8a70 270 if(received_coap_header->options_list_ptr->observe) {
mbedAustin 11:cada08fc8a70 271 if (is_observable()) {
mbedAustin 11:cada08fc8a70 272 uint32_t number = 0;
mbedAustin 11:cada08fc8a70 273 uint8_t observe_option = 0;
mbedAustin 11:cada08fc8a70 274 if(received_coap_header->options_list_ptr->observe_ptr) {
mbedAustin 11:cada08fc8a70 275 observe_option = *received_coap_header->options_list_ptr->observe_ptr;
mbedAustin 11:cada08fc8a70 276 }
mbedAustin 11:cada08fc8a70 277 if(START_OBSERVATION == observe_option) {
mbedAustin 11:cada08fc8a70 278 tr_debug("M2MObject::handle_get_request - Starts Observation");
mbedAustin 11:cada08fc8a70 279 // If the observe length is 0 means register for observation.
mbedAustin 11:cada08fc8a70 280 if(received_coap_header->options_list_ptr->observe_len != 0) {
mbedAustin 11:cada08fc8a70 281 for(int i=0;i < received_coap_header->options_list_ptr->observe_len; i++) {
mbedAustin 11:cada08fc8a70 282 number = (*(received_coap_header->options_list_ptr->observe_ptr + i) & 0xff) <<
mbedAustin 11:cada08fc8a70 283 8*(received_coap_header->options_list_ptr->observe_len- 1 - i);
mbedAustin 11:cada08fc8a70 284 }
mbedAustin 11:cada08fc8a70 285 }
mbedAustin 11:cada08fc8a70 286 // If the observe value is 0 means register for observation.
mbedAustin 11:cada08fc8a70 287 if(number == 0) {
mbedAustin 11:cada08fc8a70 288 tr_debug("M2MObject::handle_get_request - Put Resource under Observation");
mbedAustin 11:cada08fc8a70 289 set_under_observation(true,observation_handler);
mbedAustin 11:cada08fc8a70 290 add_observation_level(M2MBase::O_Attribute);
mbedAustin 11:cada08fc8a70 291 uint8_t *obs_number = (uint8_t*)malloc(3);
mbedAustin 11:cada08fc8a70 292 memset(obs_number,0,3);
mbedAustin 11:cada08fc8a70 293 uint8_t observation_number_length = 1;
mbedAustin 11:cada08fc8a70 294
mbedAustin 11:cada08fc8a70 295 uint16_t number = observation_number();
mbedAustin 11:cada08fc8a70 296
mbedAustin 11:cada08fc8a70 297 tr_debug("M2MObject::handle_get_request - Observation Number %d", number);
mbedAustin 11:cada08fc8a70 298 obs_number[0] = ((number>>8) & 0xFF);
mbedAustin 11:cada08fc8a70 299 obs_number[1] = (number & 0xFF);
mbedAustin 11:cada08fc8a70 300
mbedAustin 11:cada08fc8a70 301 if(number > 0xFF) {
mbedAustin 11:cada08fc8a70 302 observation_number_length = 2;
mbedAustin 11:cada08fc8a70 303 }
mbedAustin 11:cada08fc8a70 304 coap_response->options_list_ptr->observe_ptr = obs_number;
mbedAustin 11:cada08fc8a70 305 coap_response->options_list_ptr->observe_len = observation_number_length;
mbedAustin 11:cada08fc8a70 306 }
mbedAustin 11:cada08fc8a70 307 } else if (STOP_OBSERVATION == observe_option) {
mbedAustin 11:cada08fc8a70 308 tr_debug("M2MObject::handle_get_request - Stops Observation");
mbedAustin 11:cada08fc8a70 309 // If the observe options_list_ptr->observe_ptr value is 1 means de-register from observation.
mbedAustin 11:cada08fc8a70 310 set_under_observation(false,NULL);
mbedAustin 11:cada08fc8a70 311 remove_observation_level(M2MBase::O_Attribute);
mbedAustin 11:cada08fc8a70 312 }
mbedAustin 11:cada08fc8a70 313 msg_code = COAP_MSG_CODE_RESPONSE_CONTENT;
mbedAustin 11:cada08fc8a70 314 }
mbedAustin 11:cada08fc8a70 315 else {
mbedAustin 11:cada08fc8a70 316 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
mbedAustin 11:cada08fc8a70 317 }
mbedAustin 11:cada08fc8a70 318 }
mbedAustin 11:cada08fc8a70 319 }
mbedAustin 11:cada08fc8a70 320 } else {
mbedAustin 11:cada08fc8a70 321 msg_code = COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT; // Content format not supported
mbedAustin 11:cada08fc8a70 322 }
mbedAustin 11:cada08fc8a70 323 }
mbedAustin 11:cada08fc8a70 324 }else {
mbedAustin 11:cada08fc8a70 325 tr_error("M2MResource::handle_get_request - Return COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED");
mbedAustin 11:cada08fc8a70 326 // Operation is not allowed.
mbedAustin 11:cada08fc8a70 327 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
mbedAustin 11:cada08fc8a70 328 }
mbedAustin 11:cada08fc8a70 329 } else {
mbedAustin 11:cada08fc8a70 330 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
mbedAustin 11:cada08fc8a70 331 }
mbedAustin 11:cada08fc8a70 332 if(coap_response) {
mbedAustin 11:cada08fc8a70 333 coap_response->msg_code = msg_code;
mbedAustin 11:cada08fc8a70 334 }
mbedAustin 11:cada08fc8a70 335 return coap_response;
mbedAustin 11:cada08fc8a70 336 }
mbedAustin 11:cada08fc8a70 337
mbedAustin 11:cada08fc8a70 338 sn_coap_hdr_s* M2MObject::handle_put_request(nsdl_s *nsdl,
mbedAustin 11:cada08fc8a70 339 sn_coap_hdr_s *received_coap_header,
mbedAustin 11:cada08fc8a70 340 M2MObservationHandler */*observation_handler*/)
mbedAustin 11:cada08fc8a70 341 {
mbedAustin 11:cada08fc8a70 342 tr_debug("M2MObject::handle_put_request()");
mbedAustin 11:cada08fc8a70 343 sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; // 2.04
mbedAustin 11:cada08fc8a70 344 sn_coap_hdr_s *coap_response = sn_nsdl_build_response(nsdl,
mbedAustin 11:cada08fc8a70 345 received_coap_header,
mbedAustin 11:cada08fc8a70 346 msg_code);
mbedAustin 11:cada08fc8a70 347 if(received_coap_header) {
mbedAustin 11:cada08fc8a70 348 if ((operation() & SN_GRS_PUT_ALLOWED) != 0) {
mbedAustin 11:cada08fc8a70 349 if(!received_coap_header->payload_ptr) {
mbedAustin 11:cada08fc8a70 350 if(received_coap_header->options_list_ptr &&
mbedAustin 11:cada08fc8a70 351 received_coap_header->options_list_ptr->uri_query_ptr) {
mbedAustin 11:cada08fc8a70 352 char *query = (char*)malloc(received_coap_header->options_list_ptr->uri_query_len+1);
mbedAustin 11:cada08fc8a70 353 if (query){
mbedAustin 11:cada08fc8a70 354 memset(query, 0, received_coap_header->options_list_ptr->uri_query_len+1);
mbedAustin 11:cada08fc8a70 355 memcpy(query,
mbedAustin 11:cada08fc8a70 356 received_coap_header->options_list_ptr->uri_query_ptr,
mbedAustin 11:cada08fc8a70 357 received_coap_header->options_list_ptr->uri_query_len);
mbedAustin 11:cada08fc8a70 358 memset(query + received_coap_header->options_list_ptr->uri_query_len,'\0',1);//String terminator
mbedAustin 11:cada08fc8a70 359 tr_debug("M2MObject::handle_put_request() - Query %s", query);
mbedAustin 11:cada08fc8a70 360 // if anything was updated, re-initialize the stored notification attributes
mbedAustin 11:cada08fc8a70 361 if (!handle_observation_attribute(query)){
mbedAustin 11:cada08fc8a70 362 tr_debug("M2MObject::handle_put_request() - Invalid query");
mbedAustin 11:cada08fc8a70 363 msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; // 4.00
mbedAustin 11:cada08fc8a70 364 }
mbedAustin 11:cada08fc8a70 365 free(query);
mbedAustin 11:cada08fc8a70 366 }
mbedAustin 11:cada08fc8a70 367 } else {
mbedAustin 11:cada08fc8a70 368 tr_error("M2MObject::handle_put_request() - COAP_MSG_CODE_RESPONSE_BAD_REQUEST - Empty URI_QUERY");
mbedAustin 11:cada08fc8a70 369 msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST;
mbedAustin 11:cada08fc8a70 370 }
mbedAustin 11:cada08fc8a70 371 } else {
mbedAustin 11:cada08fc8a70 372 tr_error("M2MObject::handle_put_request() - COAP_MSG_CODE_RESPONSE_BAD_REQUEST -Payload exists");
mbedAustin 11:cada08fc8a70 373 msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST;
mbedAustin 11:cada08fc8a70 374 }
mbedAustin 11:cada08fc8a70 375 } else {
mbedAustin 11:cada08fc8a70 376 // Operation is not allowed.
mbedAustin 11:cada08fc8a70 377 tr_error("M2MObject::handle_put_request() - COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED");
mbedAustin 11:cada08fc8a70 378 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
mbedAustin 11:cada08fc8a70 379 }
mbedAustin 11:cada08fc8a70 380 } else {
mbedAustin 11:cada08fc8a70 381 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
mbedAustin 11:cada08fc8a70 382 }
mbedAustin 11:cada08fc8a70 383 if(coap_response) {
mbedAustin 11:cada08fc8a70 384 coap_response->msg_code = msg_code;
mbedAustin 11:cada08fc8a70 385 }
mbedAustin 11:cada08fc8a70 386 return coap_response;
mbedAustin 11:cada08fc8a70 387 }
mbedAustin 11:cada08fc8a70 388
mbedAustin 11:cada08fc8a70 389
mbedAustin 11:cada08fc8a70 390 sn_coap_hdr_s* M2MObject::handle_post_request(nsdl_s *nsdl,
mbedAustin 11:cada08fc8a70 391 sn_coap_hdr_s *received_coap_header,
mbedAustin 11:cada08fc8a70 392 M2MObservationHandler *observation_handler)
mbedAustin 11:cada08fc8a70 393 {
mbedAustin 11:cada08fc8a70 394 tr_debug("M2MObject::handle_post_request()");
mbedAustin 11:cada08fc8a70 395 sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; // 2.04
mbedAustin 11:cada08fc8a70 396 // process the POST if we have registered a callback for it
mbedAustin 11:cada08fc8a70 397 sn_coap_hdr_s *coap_response = sn_nsdl_build_response(nsdl,
mbedAustin 11:cada08fc8a70 398 received_coap_header,
mbedAustin 11:cada08fc8a70 399 msg_code);
mbedAustin 11:cada08fc8a70 400
mbedAustin 11:cada08fc8a70 401 if(received_coap_header) {
mbedAustin 11:cada08fc8a70 402 if ((operation() & SN_GRS_POST_ALLOWED) != 0) {
mbedAustin 11:cada08fc8a70 403 if(received_coap_header->payload_ptr) {
mbedAustin 11:cada08fc8a70 404 tr_debug("M2MObject::handle_post_request() - Update Object with new values");
mbedAustin 11:cada08fc8a70 405 uint16_t coap_content_type = 0;
mbedAustin 11:cada08fc8a70 406 bool content_type_present = false;
mbedAustin 11:cada08fc8a70 407 if(received_coap_header->content_type_ptr) {
mbedAustin 11:cada08fc8a70 408 content_type_present = true;
mbedAustin 11:cada08fc8a70 409 if(coap_response) {
mbedAustin 11:cada08fc8a70 410 coap_response->content_type_ptr = (uint8_t*)malloc(received_coap_header->content_type_len);
mbedAustin 11:cada08fc8a70 411 if(coap_response->content_type_ptr) {
mbedAustin 11:cada08fc8a70 412 memset(coap_response->content_type_ptr, 0, received_coap_header->content_type_len);
mbedAustin 11:cada08fc8a70 413 memcpy(coap_response->content_type_ptr,
mbedAustin 11:cada08fc8a70 414 received_coap_header->content_type_ptr,
mbedAustin 11:cada08fc8a70 415 received_coap_header->content_type_len);
mbedAustin 11:cada08fc8a70 416 coap_response->content_type_len = received_coap_header->content_type_len;
mbedAustin 11:cada08fc8a70 417 for(uint8_t i = 0; i < coap_response->content_type_len; i++) {
mbedAustin 11:cada08fc8a70 418 coap_content_type = (coap_content_type << 8) + (coap_response->content_type_ptr[i] & 0xFF);
mbedAustin 11:cada08fc8a70 419 }
mbedAustin 11:cada08fc8a70 420 }
mbedAustin 11:cada08fc8a70 421 }
mbedAustin 11:cada08fc8a70 422 } // if(received_coap_header->content_type_ptr)
mbedAustin 11:cada08fc8a70 423 if(!content_type_present &&
mbedAustin 11:cada08fc8a70 424 M2MBase::coap_content_type() == COAP_CONTENT_OMA_TLV_TYPE) {
mbedAustin 11:cada08fc8a70 425 coap_content_type = COAP_CONTENT_OMA_TLV_TYPE;
mbedAustin 11:cada08fc8a70 426 }
mbedAustin 11:cada08fc8a70 427
mbedAustin 11:cada08fc8a70 428 tr_debug("M2MObject::handle_post_request() - Request Content-Type %d", coap_content_type);
mbedAustin 11:cada08fc8a70 429
mbedAustin 11:cada08fc8a70 430 if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type) {
mbedAustin 11:cada08fc8a70 431 uint16_t instance_id = 0;
mbedAustin 11:cada08fc8a70 432 // Check next free instance id
mbedAustin 11:cada08fc8a70 433 for(instance_id = 0; instance_id <= _max_instance_count; instance_id++) {
mbedAustin 11:cada08fc8a70 434 if(NULL == object_instance(instance_id)) {
mbedAustin 11:cada08fc8a70 435 break;
mbedAustin 11:cada08fc8a70 436 }
mbedAustin 11:cada08fc8a70 437 if(instance_id == _max_instance_count) {
mbedAustin 11:cada08fc8a70 438 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
mbedAustin 11:cada08fc8a70 439 break;
mbedAustin 11:cada08fc8a70 440 }
mbedAustin 11:cada08fc8a70 441 }
mbedAustin 11:cada08fc8a70 442 if(COAP_MSG_CODE_RESPONSE_CHANGED == msg_code) {
mbedAustin 11:cada08fc8a70 443 M2MTLVDeserializer *deserializer = new M2MTLVDeserializer();
mbedAustin 11:cada08fc8a70 444 bool is_obj_instance = false;
mbedAustin 11:cada08fc8a70 445 bool obj_instance_exists = false;
mbedAustin 11:cada08fc8a70 446 if (deserializer) {
mbedAustin 11:cada08fc8a70 447 is_obj_instance = deserializer->is_object_instance(received_coap_header->payload_ptr);
mbedAustin 11:cada08fc8a70 448 if (is_obj_instance) {
mbedAustin 11:cada08fc8a70 449 instance_id = deserializer->instance_id(received_coap_header->payload_ptr);
mbedAustin 11:cada08fc8a70 450 tr_debug("M2MObject::handle_post_request() - instance id in TLV: %d", instance_id);
mbedAustin 11:cada08fc8a70 451 // Check if instance id already exists
mbedAustin 11:cada08fc8a70 452 if (object_instance(instance_id)){
mbedAustin 11:cada08fc8a70 453 obj_instance_exists = true;
mbedAustin 11:cada08fc8a70 454 }
mbedAustin 11:cada08fc8a70 455 }
mbedAustin 11:cada08fc8a70 456 }
mbedAustin 11:cada08fc8a70 457 if (!obj_instance_exists) {
mbedAustin 11:cada08fc8a70 458 M2MObjectInstance *obj_instance = create_object_instance(instance_id);
mbedAustin 11:cada08fc8a70 459 if(obj_instance) {
mbedAustin 11:cada08fc8a70 460 obj_instance->set_operation(M2MBase::GET_PUT_ALLOWED);
mbedAustin 11:cada08fc8a70 461 }
mbedAustin 11:cada08fc8a70 462
mbedAustin 11:cada08fc8a70 463 if(deserializer) {
mbedAustin 11:cada08fc8a70 464 String obj_name = "";
mbedAustin 11:cada08fc8a70 465 char *obj_inst_id = NULL;
mbedAustin 11:cada08fc8a70 466 M2MTLVDeserializer::Error error = M2MTLVDeserializer::None;
mbedAustin 11:cada08fc8a70 467 if(is_obj_instance) {
mbedAustin 11:cada08fc8a70 468 tr_debug("M2MObject::handle_post_request() - TLV data contains ObjectInstance");
mbedAustin 11:cada08fc8a70 469 error = deserializer->deserialise_object_instances(received_coap_header->payload_ptr,
mbedAustin 11:cada08fc8a70 470 received_coap_header->payload_len,
mbedAustin 11:cada08fc8a70 471 *this,
mbedAustin 11:cada08fc8a70 472 M2MTLVDeserializer::Post);
mbedAustin 11:cada08fc8a70 473 } else if(deserializer->is_resource(received_coap_header->payload_ptr) ||
mbedAustin 11:cada08fc8a70 474 deserializer->is_multiple_resource(received_coap_header->payload_ptr)) {
mbedAustin 11:cada08fc8a70 475 tr_debug("M2MObject::handle_post_request() - TLV data contains Resources");
mbedAustin 11:cada08fc8a70 476 error = deserializer->deserialize_resources(received_coap_header->payload_ptr,
mbedAustin 11:cada08fc8a70 477 received_coap_header->payload_len,
mbedAustin 11:cada08fc8a70 478 *obj_instance,
mbedAustin 11:cada08fc8a70 479 M2MTLVDeserializer::Post);
mbedAustin 11:cada08fc8a70 480 } else {
mbedAustin 11:cada08fc8a70 481 error = M2MTLVDeserializer::NotValid;
mbedAustin 11:cada08fc8a70 482 }
mbedAustin 11:cada08fc8a70 483 switch(error) {
mbedAustin 11:cada08fc8a70 484 case M2MTLVDeserializer::None:
mbedAustin 11:cada08fc8a70 485 if(observation_handler) {
mbedAustin 11:cada08fc8a70 486 observation_handler->value_updated(this);
mbedAustin 11:cada08fc8a70 487 }
mbedAustin 11:cada08fc8a70 488 coap_response->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s));
mbedAustin 11:cada08fc8a70 489 if (coap_response->options_list_ptr) {
mbedAustin 11:cada08fc8a70 490 memset(coap_response->options_list_ptr, 0, sizeof(sn_coap_options_list_s));
mbedAustin 11:cada08fc8a70 491
mbedAustin 11:cada08fc8a70 492 obj_name = M2MBase::name();
mbedAustin 11:cada08fc8a70 493 obj_name += String("/");
mbedAustin 11:cada08fc8a70 494 obj_inst_id = (char*)malloc(10);
mbedAustin 11:cada08fc8a70 495 snprintf(obj_inst_id, 10,"%d",instance_id);
mbedAustin 11:cada08fc8a70 496 obj_name += obj_inst_id;
mbedAustin 11:cada08fc8a70 497
mbedAustin 11:cada08fc8a70 498 coap_response->options_list_ptr->location_path_len = obj_name.length();
mbedAustin 11:cada08fc8a70 499 if (coap_response->options_list_ptr->location_path_len != 0) {
mbedAustin 11:cada08fc8a70 500 coap_response->options_list_ptr->location_path_ptr =
mbedAustin 11:cada08fc8a70 501 (uint8_t*)malloc(coap_response->options_list_ptr->location_path_len);
mbedAustin 11:cada08fc8a70 502 if (coap_response->options_list_ptr->location_path_ptr) {
mbedAustin 11:cada08fc8a70 503 memcpy(coap_response->options_list_ptr->location_path_ptr,
mbedAustin 11:cada08fc8a70 504 obj_name.c_str(),
mbedAustin 11:cada08fc8a70 505 coap_response->options_list_ptr->location_path_len);
mbedAustin 11:cada08fc8a70 506 }
mbedAustin 11:cada08fc8a70 507 }
mbedAustin 11:cada08fc8a70 508 free(obj_inst_id);
mbedAustin 11:cada08fc8a70 509 }
mbedAustin 11:cada08fc8a70 510 msg_code = COAP_MSG_CODE_RESPONSE_CREATED;
mbedAustin 11:cada08fc8a70 511 break;
mbedAustin 11:cada08fc8a70 512 case M2MTLVDeserializer::NotAllowed:
mbedAustin 11:cada08fc8a70 513 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
mbedAustin 11:cada08fc8a70 514 break;
mbedAustin 11:cada08fc8a70 515 case M2MTLVDeserializer::NotValid:
mbedAustin 11:cada08fc8a70 516 msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST;
mbedAustin 11:cada08fc8a70 517 break;
mbedAustin 11:cada08fc8a70 518 case M2MTLVDeserializer::NotFound:
mbedAustin 11:cada08fc8a70 519 msg_code = COAP_MSG_CODE_RESPONSE_NOT_FOUND;
mbedAustin 11:cada08fc8a70 520 break;
mbedAustin 11:cada08fc8a70 521 }
mbedAustin 11:cada08fc8a70 522 }
mbedAustin 11:cada08fc8a70 523 } else {
mbedAustin 11:cada08fc8a70 524 tr_debug("M2MObject::handle_post_request() - COAP_MSG_CODE_RESPONSE_BAD_REQUEST");
mbedAustin 11:cada08fc8a70 525 msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST;
mbedAustin 11:cada08fc8a70 526 }
mbedAustin 11:cada08fc8a70 527 delete deserializer;
mbedAustin 11:cada08fc8a70 528 }
mbedAustin 11:cada08fc8a70 529 } else {
mbedAustin 11:cada08fc8a70 530 msg_code =COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT;
mbedAustin 11:cada08fc8a70 531 } // if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type)
mbedAustin 11:cada08fc8a70 532 } else {
mbedAustin 11:cada08fc8a70 533 tr_error("M2MObject::handle_post_request - COAP_MSG_CODE_RESPONSE_BAD_REQUEST - Missing Payload");
mbedAustin 11:cada08fc8a70 534 msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; //
mbedAustin 11:cada08fc8a70 535 }
mbedAustin 11:cada08fc8a70 536 } else { // if ((object->operation() & SN_GRS_POST_ALLOWED) != 0)
mbedAustin 11:cada08fc8a70 537 tr_error("M2MObject::handle_post_request - COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED");
mbedAustin 11:cada08fc8a70 538 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; // 4.05
mbedAustin 11:cada08fc8a70 539 }
mbedAustin 11:cada08fc8a70 540 } else { //if(received_coap_header)
mbedAustin 11:cada08fc8a70 541 tr_error("M2MObject::handle_post_request - COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED");
mbedAustin 11:cada08fc8a70 542 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; // 4.05
mbedAustin 11:cada08fc8a70 543 }
mbedAustin 11:cada08fc8a70 544
mbedAustin 11:cada08fc8a70 545 if(coap_response) {
mbedAustin 11:cada08fc8a70 546 coap_response->msg_code = msg_code;
mbedAustin 11:cada08fc8a70 547 }
mbedAustin 11:cada08fc8a70 548 return coap_response;
mbedAustin 11:cada08fc8a70 549 }
mbedAustin 11:cada08fc8a70 550
mbedAustin 11:cada08fc8a70 551 void M2MObject::notification_update()
mbedAustin 11:cada08fc8a70 552 {
mbedAustin 11:cada08fc8a70 553 tr_debug("M2MObject::notification_update");
mbedAustin 11:cada08fc8a70 554 M2MReportHandler *report_handler = M2MBase::report_handler();
mbedAustin 11:cada08fc8a70 555 if(report_handler && is_observable()) {
mbedAustin 11:cada08fc8a70 556 report_handler->set_notification_trigger();
mbedAustin 11:cada08fc8a70 557 }
mbedAustin 11:cada08fc8a70 558 }
mbedAustin 11:cada08fc8a70 559