Jim Carver / Mbed OS mbed-cloud-workshop-connect-PIR

Dependencies:   HTS221

Fork of mbed-cloud-workshop-connect-HTS221 by Jim Carver

Committer:
JimCarver
Date:
Fri Oct 12 21:22:49 2018 +0000
Revision:
0:6b753f761943
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JimCarver 0:6b753f761943 1 /*
JimCarver 0:6b753f761943 2 * Copyright (c) 2015 ARM Limited. All rights reserved.
JimCarver 0:6b753f761943 3 * SPDX-License-Identifier: Apache-2.0
JimCarver 0:6b753f761943 4 * Licensed under the Apache License, Version 2.0 (the License); you may
JimCarver 0:6b753f761943 5 * not use this file except in compliance with the License.
JimCarver 0:6b753f761943 6 * You may obtain a copy of the License at
JimCarver 0:6b753f761943 7 *
JimCarver 0:6b753f761943 8 * http://www.apache.org/licenses/LICENSE-2.0
JimCarver 0:6b753f761943 9 *
JimCarver 0:6b753f761943 10 * Unless required by applicable law or agreed to in writing, software
JimCarver 0:6b753f761943 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
JimCarver 0:6b753f761943 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
JimCarver 0:6b753f761943 13 * See the License for the specific language governing permissions and
JimCarver 0:6b753f761943 14 * limitations under the License.
JimCarver 0:6b753f761943 15 */
JimCarver 0:6b753f761943 16 #include "mbed-client/m2mobjectinstance.h"
JimCarver 0:6b753f761943 17 #include "mbed-client/m2mobject.h"
JimCarver 0:6b753f761943 18 #include "mbed-client/m2mconstants.h"
JimCarver 0:6b753f761943 19 #include "mbed-client/m2mresource.h"
JimCarver 0:6b753f761943 20 #include "mbed-client/m2mresource.h"
JimCarver 0:6b753f761943 21 #include "mbed-client/m2mobservationhandler.h"
JimCarver 0:6b753f761943 22 #include "mbed-client/m2mstring.h"
JimCarver 0:6b753f761943 23 #include "mbed-client/m2mstringbuffer.h"
JimCarver 0:6b753f761943 24 #include "include/m2mtlvserializer.h"
JimCarver 0:6b753f761943 25 #include "include/m2mtlvdeserializer.h"
JimCarver 0:6b753f761943 26 #include "include/m2mreporthandler.h"
JimCarver 0:6b753f761943 27 #include "mbed-trace/mbed_trace.h"
JimCarver 0:6b753f761943 28 #include "include/m2mcallbackstorage.h"
JimCarver 0:6b753f761943 29 #include <stdlib.h>
JimCarver 0:6b753f761943 30
JimCarver 0:6b753f761943 31 #define BUFFER_SIZE 10
JimCarver 0:6b753f761943 32 #define TRACE_GROUP "mClt"
JimCarver 0:6b753f761943 33
JimCarver 0:6b753f761943 34 M2MObjectInstance::M2MObjectInstance(M2MObject& parent,
JimCarver 0:6b753f761943 35 const String &resource_type,
JimCarver 0:6b753f761943 36 char *path,
JimCarver 0:6b753f761943 37 bool external_blockwise_store)
JimCarver 0:6b753f761943 38 : M2MBase("",
JimCarver 0:6b753f761943 39 M2MBase::Dynamic,
JimCarver 0:6b753f761943 40 #ifndef DISABLE_RESOURCE_TYPE
JimCarver 0:6b753f761943 41 resource_type,
JimCarver 0:6b753f761943 42 #endif
JimCarver 0:6b753f761943 43 path,
JimCarver 0:6b753f761943 44 external_blockwise_store,
JimCarver 0:6b753f761943 45 false),
JimCarver 0:6b753f761943 46 _parent(parent)
JimCarver 0:6b753f761943 47 {
JimCarver 0:6b753f761943 48 M2MBase::set_base_type(M2MBase::ObjectInstance);
JimCarver 0:6b753f761943 49 M2MBase::set_coap_content_type(COAP_CONTENT_OMA_TLV_TYPE_OLD);
JimCarver 0:6b753f761943 50 M2MBase::set_operation(M2MBase::GET_ALLOWED);
JimCarver 0:6b753f761943 51 }
JimCarver 0:6b753f761943 52
JimCarver 0:6b753f761943 53 M2MObjectInstance::M2MObjectInstance(M2MObject& parent, const lwm2m_parameters_s* static_res)
JimCarver 0:6b753f761943 54 : M2MBase(static_res), _parent(parent)
JimCarver 0:6b753f761943 55 {
JimCarver 0:6b753f761943 56 M2MBase::set_coap_content_type(COAP_CONTENT_OMA_TLV_TYPE_OLD);
JimCarver 0:6b753f761943 57 M2MBase::set_operation(M2MBase::GET_ALLOWED);
JimCarver 0:6b753f761943 58 }
JimCarver 0:6b753f761943 59
JimCarver 0:6b753f761943 60 M2MObjectInstance::~M2MObjectInstance()
JimCarver 0:6b753f761943 61 {
JimCarver 0:6b753f761943 62 if(!_resource_list.empty()) {
JimCarver 0:6b753f761943 63 M2MResource* res = NULL;
JimCarver 0:6b753f761943 64 M2MResourceList::const_iterator it;
JimCarver 0:6b753f761943 65 it = _resource_list.begin();
JimCarver 0:6b753f761943 66 for (; it!=_resource_list.end(); it++ ) {
JimCarver 0:6b753f761943 67 //Free allocated memory for resources.
JimCarver 0:6b753f761943 68 res = *it;
JimCarver 0:6b753f761943 69 delete res;
JimCarver 0:6b753f761943 70 }
JimCarver 0:6b753f761943 71 _resource_list.clear();
JimCarver 0:6b753f761943 72 }
JimCarver 0:6b753f761943 73
JimCarver 0:6b753f761943 74 free_resources();
JimCarver 0:6b753f761943 75 }
JimCarver 0:6b753f761943 76
JimCarver 0:6b753f761943 77 // TBD, ResourceType to the base class struct?? TODO!
JimCarver 0:6b753f761943 78 M2MResource* M2MObjectInstance::create_static_resource(const lwm2m_parameters_s* static_res,
JimCarver 0:6b753f761943 79 M2MResourceInstance::ResourceType type)
JimCarver 0:6b753f761943 80 {
JimCarver 0:6b753f761943 81 tr_debug("M2MObjectInstance::create_static_resource(lwm2m_parameters_s resource_name %s)", static_res->identifier.name);
JimCarver 0:6b753f761943 82 M2MResource *res = NULL;
JimCarver 0:6b753f761943 83 if (validate_string_length(static_res->identifier.name, 1, MAX_ALLOWED_STRING_LENGTH) == false) {
JimCarver 0:6b753f761943 84 return res;
JimCarver 0:6b753f761943 85 }
JimCarver 0:6b753f761943 86 if(!resource(static_res->identifier.name)) {
JimCarver 0:6b753f761943 87 res = new M2MResource(*this, static_res, convert_resource_type(type));
JimCarver 0:6b753f761943 88 if(res) {
JimCarver 0:6b753f761943 89 res->add_observation_level(observation_level());
JimCarver 0:6b753f761943 90 //if (multiple_instance) {
JimCarver 0:6b753f761943 91 //res->set_coap_content_type(COAP_CONTENT_OMA_TLV_TYPE_OLD);
JimCarver 0:6b753f761943 92 //}
JimCarver 0:6b753f761943 93 _resource_list.push_back(res);
JimCarver 0:6b753f761943 94 set_changed();
JimCarver 0:6b753f761943 95 }
JimCarver 0:6b753f761943 96 }
JimCarver 0:6b753f761943 97 return res;
JimCarver 0:6b753f761943 98 }
JimCarver 0:6b753f761943 99
JimCarver 0:6b753f761943 100 M2MResource* M2MObjectInstance::create_static_resource(const String &resource_name,
JimCarver 0:6b753f761943 101 const String &resource_type,
JimCarver 0:6b753f761943 102 M2MResourceInstance::ResourceType type,
JimCarver 0:6b753f761943 103 const uint8_t *value,
JimCarver 0:6b753f761943 104 const uint8_t value_length,
JimCarver 0:6b753f761943 105 bool multiple_instance,
JimCarver 0:6b753f761943 106 bool external_blockwise_store)
JimCarver 0:6b753f761943 107 {
JimCarver 0:6b753f761943 108 tr_debug("M2MObjectInstance::create_static_resource(resource_name %s)",resource_name.c_str());
JimCarver 0:6b753f761943 109 M2MResource *res = NULL;
JimCarver 0:6b753f761943 110 if (validate_string_length(resource_name, 1, MAX_ALLOWED_STRING_LENGTH) == false) {
JimCarver 0:6b753f761943 111 return res;
JimCarver 0:6b753f761943 112 }
JimCarver 0:6b753f761943 113 if(!resource(resource_name)) {
JimCarver 0:6b753f761943 114 char *path = create_path(*this, resource_name.c_str());
JimCarver 0:6b753f761943 115
JimCarver 0:6b753f761943 116 if (path) {
JimCarver 0:6b753f761943 117 res = new M2MResource(*this, resource_name, M2MBase::Static, resource_type, convert_resource_type(type),
JimCarver 0:6b753f761943 118 value, value_length, path,
JimCarver 0:6b753f761943 119 multiple_instance, external_blockwise_store);
JimCarver 0:6b753f761943 120 if(res) {
JimCarver 0:6b753f761943 121 res->add_observation_level(observation_level());
JimCarver 0:6b753f761943 122 if (multiple_instance) {
JimCarver 0:6b753f761943 123 res->set_coap_content_type(COAP_CONTENT_OMA_TLV_TYPE_OLD);
JimCarver 0:6b753f761943 124 }
JimCarver 0:6b753f761943 125 _resource_list.push_back(res);
JimCarver 0:6b753f761943 126 set_changed();
JimCarver 0:6b753f761943 127 }
JimCarver 0:6b753f761943 128 }
JimCarver 0:6b753f761943 129 }
JimCarver 0:6b753f761943 130 return res;
JimCarver 0:6b753f761943 131 }
JimCarver 0:6b753f761943 132
JimCarver 0:6b753f761943 133 M2MResource* M2MObjectInstance::create_dynamic_resource(const lwm2m_parameters_s* static_res,
JimCarver 0:6b753f761943 134 M2MResourceInstance::ResourceType type,
JimCarver 0:6b753f761943 135 bool observable)
JimCarver 0:6b753f761943 136 {
JimCarver 0:6b753f761943 137 tr_debug("M2MObjectInstance::create_dynamic_resource(resource_name %s)", static_res->identifier.name);
JimCarver 0:6b753f761943 138 M2MResource *res = NULL;
JimCarver 0:6b753f761943 139
JimCarver 0:6b753f761943 140 if (validate_string_length(static_res->identifier.name, 1, MAX_ALLOWED_STRING_LENGTH) == false) {
JimCarver 0:6b753f761943 141 return res;
JimCarver 0:6b753f761943 142 }
JimCarver 0:6b753f761943 143 if(!resource(static_res->identifier.name)) {
JimCarver 0:6b753f761943 144 res = new M2MResource(*this, static_res, convert_resource_type(type));
JimCarver 0:6b753f761943 145 if(res) {
JimCarver 0:6b753f761943 146 //if (multiple_instance) { // TODO!
JimCarver 0:6b753f761943 147 // res->set_coap_content_type(COAP_CONTENT_OMA_TLV_TYPE);
JimCarver 0:6b753f761943 148 //}
JimCarver 0:6b753f761943 149 res->add_observation_level(observation_level());
JimCarver 0:6b753f761943 150 _resource_list.push_back(res);
JimCarver 0:6b753f761943 151 set_changed();
JimCarver 0:6b753f761943 152 }
JimCarver 0:6b753f761943 153 }
JimCarver 0:6b753f761943 154 return res;
JimCarver 0:6b753f761943 155 }
JimCarver 0:6b753f761943 156
JimCarver 0:6b753f761943 157 M2MResource* M2MObjectInstance::create_dynamic_resource(const String &resource_name,
JimCarver 0:6b753f761943 158 const String &resource_type,
JimCarver 0:6b753f761943 159 M2MResourceInstance::ResourceType type,
JimCarver 0:6b753f761943 160 bool observable,
JimCarver 0:6b753f761943 161 bool multiple_instance,
JimCarver 0:6b753f761943 162 bool external_blockwise_store)
JimCarver 0:6b753f761943 163 {
JimCarver 0:6b753f761943 164 tr_debug("M2MObjectInstance::create_dynamic_resource(resource_name %s)",resource_name.c_str());
JimCarver 0:6b753f761943 165 M2MResource *res = NULL;
JimCarver 0:6b753f761943 166 if (validate_string_length(resource_name, 1, MAX_ALLOWED_STRING_LENGTH) == false) {
JimCarver 0:6b753f761943 167 return res;
JimCarver 0:6b753f761943 168 }
JimCarver 0:6b753f761943 169 if(!resource(resource_name)) {
JimCarver 0:6b753f761943 170 char *path = create_path(*this, resource_name.c_str());
JimCarver 0:6b753f761943 171 if (path) {
JimCarver 0:6b753f761943 172 res = new M2MResource(*this, resource_name, M2MBase::Dynamic, resource_type, convert_resource_type(type),
JimCarver 0:6b753f761943 173 observable, path,
JimCarver 0:6b753f761943 174 multiple_instance, external_blockwise_store);
JimCarver 0:6b753f761943 175 if(res) {
JimCarver 0:6b753f761943 176 if (multiple_instance) {
JimCarver 0:6b753f761943 177 res->set_coap_content_type(COAP_CONTENT_OMA_TLV_TYPE_OLD);
JimCarver 0:6b753f761943 178 }
JimCarver 0:6b753f761943 179 res->add_observation_level(observation_level());
JimCarver 0:6b753f761943 180 _resource_list.push_back(res);
JimCarver 0:6b753f761943 181 set_changed();
JimCarver 0:6b753f761943 182 }
JimCarver 0:6b753f761943 183 }
JimCarver 0:6b753f761943 184 }
JimCarver 0:6b753f761943 185 return res;
JimCarver 0:6b753f761943 186 }
JimCarver 0:6b753f761943 187
JimCarver 0:6b753f761943 188 M2MResourceInstance* M2MObjectInstance::create_static_resource_instance(const String &resource_name,
JimCarver 0:6b753f761943 189 const String &resource_type,
JimCarver 0:6b753f761943 190 M2MResourceInstance::ResourceType type,
JimCarver 0:6b753f761943 191 const uint8_t *value,
JimCarver 0:6b753f761943 192 const uint8_t value_length,
JimCarver 0:6b753f761943 193 uint16_t instance_id,
JimCarver 0:6b753f761943 194 bool external_blockwise_store)
JimCarver 0:6b753f761943 195 {
JimCarver 0:6b753f761943 196 tr_debug("M2MObjectInstance::create_static_resource_instance(resource_name %s)",resource_name.c_str());
JimCarver 0:6b753f761943 197 M2MResourceInstance *instance = NULL;
JimCarver 0:6b753f761943 198 if (validate_string_length(resource_name, 1, MAX_ALLOWED_STRING_LENGTH) == false) {
JimCarver 0:6b753f761943 199
JimCarver 0:6b753f761943 200 return instance;
JimCarver 0:6b753f761943 201 }
JimCarver 0:6b753f761943 202 M2MResource *res = resource(resource_name);
JimCarver 0:6b753f761943 203 if(!res) {
JimCarver 0:6b753f761943 204 char *path = create_path(*this, resource_name.c_str());
JimCarver 0:6b753f761943 205 if (path) {
JimCarver 0:6b753f761943 206 res = new M2MResource(*this, resource_name, M2MBase::Static, resource_type, convert_resource_type(type),
JimCarver 0:6b753f761943 207 value, value_length, path,
JimCarver 0:6b753f761943 208 true, external_blockwise_store);
JimCarver 0:6b753f761943 209 _resource_list.push_back(res);
JimCarver 0:6b753f761943 210 set_changed();
JimCarver 0:6b753f761943 211 res->set_operation(M2MBase::GET_ALLOWED);
JimCarver 0:6b753f761943 212 res->set_observable(false);
JimCarver 0:6b753f761943 213 res->set_register_uri(false);
JimCarver 0:6b753f761943 214 }
JimCarver 0:6b753f761943 215 }
JimCarver 0:6b753f761943 216 if(res && res->supports_multiple_instances()&& (res->resource_instance(instance_id) == NULL)) {
JimCarver 0:6b753f761943 217 char *path = M2MBase::create_path(*res, instance_id);
JimCarver 0:6b753f761943 218 if (path) {
JimCarver 0:6b753f761943 219 instance = new M2MResourceInstance(*res, "", M2MBase::Static, resource_type, convert_resource_type(type),
JimCarver 0:6b753f761943 220 value, value_length,
JimCarver 0:6b753f761943 221 path, external_blockwise_store,true);
JimCarver 0:6b753f761943 222 if(instance) {
JimCarver 0:6b753f761943 223 instance->set_operation(M2MBase::GET_ALLOWED);
JimCarver 0:6b753f761943 224 instance->set_instance_id(instance_id);
JimCarver 0:6b753f761943 225 res->add_resource_instance(instance);
JimCarver 0:6b753f761943 226 }
JimCarver 0:6b753f761943 227 }
JimCarver 0:6b753f761943 228 }
JimCarver 0:6b753f761943 229 return instance;
JimCarver 0:6b753f761943 230 }
JimCarver 0:6b753f761943 231
JimCarver 0:6b753f761943 232 M2MResourceInstance* M2MObjectInstance::create_dynamic_resource_instance(const String &resource_name,
JimCarver 0:6b753f761943 233 const String &resource_type,
JimCarver 0:6b753f761943 234 M2MResourceInstance::ResourceType type,
JimCarver 0:6b753f761943 235 bool observable,
JimCarver 0:6b753f761943 236 uint16_t instance_id,
JimCarver 0:6b753f761943 237 bool external_blockwise_store)
JimCarver 0:6b753f761943 238 {
JimCarver 0:6b753f761943 239 tr_debug("M2MObjectInstance::create_dynamic_resource_instance(resource_name %s)",resource_name.c_str());
JimCarver 0:6b753f761943 240 M2MResourceInstance *instance = NULL;
JimCarver 0:6b753f761943 241 if (validate_string_length(resource_name, 1, MAX_ALLOWED_STRING_LENGTH) == false) {
JimCarver 0:6b753f761943 242 return instance;
JimCarver 0:6b753f761943 243 }
JimCarver 0:6b753f761943 244 M2MResource *res = resource(resource_name);
JimCarver 0:6b753f761943 245 if(!res) {
JimCarver 0:6b753f761943 246 char *path = create_path(*this, resource_name.c_str());
JimCarver 0:6b753f761943 247 if (path) {
JimCarver 0:6b753f761943 248 res = new M2MResource(*this, resource_name, M2MBase::Dynamic, resource_type, convert_resource_type(type),
JimCarver 0:6b753f761943 249 false, path, true, external_blockwise_store);
JimCarver 0:6b753f761943 250 _resource_list.push_back(res);
JimCarver 0:6b753f761943 251 res->set_register_uri(false);
JimCarver 0:6b753f761943 252 res->set_operation(M2MBase::GET_ALLOWED);
JimCarver 0:6b753f761943 253 }
JimCarver 0:6b753f761943 254 }
JimCarver 0:6b753f761943 255 if (res && res->supports_multiple_instances() && (res->resource_instance(instance_id) == NULL)) {
JimCarver 0:6b753f761943 256 char *path = create_path(*res, instance_id);
JimCarver 0:6b753f761943 257 if (path) {
JimCarver 0:6b753f761943 258 instance = new M2MResourceInstance(*res, "", M2MBase::Dynamic, resource_type, convert_resource_type(type),
JimCarver 0:6b753f761943 259 path, external_blockwise_store,true);
JimCarver 0:6b753f761943 260 if(instance) {
JimCarver 0:6b753f761943 261 instance->set_operation(M2MBase::GET_ALLOWED);
JimCarver 0:6b753f761943 262 instance->set_observable(observable);
JimCarver 0:6b753f761943 263 instance->set_instance_id(instance_id);
JimCarver 0:6b753f761943 264 res->add_resource_instance(instance);
JimCarver 0:6b753f761943 265 set_changed();
JimCarver 0:6b753f761943 266 }
JimCarver 0:6b753f761943 267 }
JimCarver 0:6b753f761943 268 }
JimCarver 0:6b753f761943 269 return instance;
JimCarver 0:6b753f761943 270 }
JimCarver 0:6b753f761943 271
JimCarver 0:6b753f761943 272 bool M2MObjectInstance::remove_resource(const String &resource_name)
JimCarver 0:6b753f761943 273 {
JimCarver 0:6b753f761943 274 return remove_resource(resource_name.c_str());
JimCarver 0:6b753f761943 275 }
JimCarver 0:6b753f761943 276
JimCarver 0:6b753f761943 277 bool M2MObjectInstance::remove_resource(const char *resource_name)
JimCarver 0:6b753f761943 278 {
JimCarver 0:6b753f761943 279 tr_debug("M2MObjectInstance::remove_resource(resource_name %s)", resource_name);
JimCarver 0:6b753f761943 280
JimCarver 0:6b753f761943 281 bool success = false;
JimCarver 0:6b753f761943 282 if(!_resource_list.empty()) {
JimCarver 0:6b753f761943 283 M2MResource* res = NULL;
JimCarver 0:6b753f761943 284 M2MResourceList::const_iterator it;
JimCarver 0:6b753f761943 285 it = _resource_list.begin();
JimCarver 0:6b753f761943 286 int pos = 0;
JimCarver 0:6b753f761943 287 for ( ; it != _resource_list.end(); it++, pos++ ) {
JimCarver 0:6b753f761943 288 if(strcmp((*it)->name(), resource_name) == 0) {
JimCarver 0:6b753f761943 289 // Resource found and deleted.
JimCarver 0:6b753f761943 290 res = *it;
JimCarver 0:6b753f761943 291 delete res;
JimCarver 0:6b753f761943 292 _resource_list.erase(pos);
JimCarver 0:6b753f761943 293 set_changed();
JimCarver 0:6b753f761943 294 success = true;
JimCarver 0:6b753f761943 295 break;
JimCarver 0:6b753f761943 296 }
JimCarver 0:6b753f761943 297 }
JimCarver 0:6b753f761943 298 }
JimCarver 0:6b753f761943 299 return success;
JimCarver 0:6b753f761943 300 }
JimCarver 0:6b753f761943 301
JimCarver 0:6b753f761943 302 bool M2MObjectInstance::remove_resource_instance(const String &resource_name,
JimCarver 0:6b753f761943 303 uint16_t inst_id)
JimCarver 0:6b753f761943 304 {
JimCarver 0:6b753f761943 305 tr_debug("M2MObjectInstance::remove_resource_instance(resource_name %s inst_id %d)",
JimCarver 0:6b753f761943 306 resource_name.c_str(), inst_id);
JimCarver 0:6b753f761943 307 bool success = false;
JimCarver 0:6b753f761943 308 M2MResource *res = resource(resource_name);
JimCarver 0:6b753f761943 309 if(res) {
JimCarver 0:6b753f761943 310 const M2MResourceInstanceList &list = res->resource_instances();
JimCarver 0:6b753f761943 311 M2MResourceInstanceList::const_iterator it;
JimCarver 0:6b753f761943 312 it = list.begin();
JimCarver 0:6b753f761943 313 for ( ; it != list.end(); it++) {
JimCarver 0:6b753f761943 314 if((*it)->instance_id() == inst_id) {
JimCarver 0:6b753f761943 315 success = res->remove_resource_instance(inst_id);
JimCarver 0:6b753f761943 316 if(res->resource_instance_count() == 0) {
JimCarver 0:6b753f761943 317 M2MResourceList::const_iterator itr;
JimCarver 0:6b753f761943 318 itr = _resource_list.begin();
JimCarver 0:6b753f761943 319 int pos = 0;
JimCarver 0:6b753f761943 320 for ( ; itr != _resource_list.end(); itr++, pos++ ) {
JimCarver 0:6b753f761943 321 if(strcmp((*itr)->name(),resource_name.c_str()) == 0) {
JimCarver 0:6b753f761943 322 delete res;
JimCarver 0:6b753f761943 323 _resource_list.erase(pos);
JimCarver 0:6b753f761943 324 set_changed();
JimCarver 0:6b753f761943 325 break;
JimCarver 0:6b753f761943 326 }
JimCarver 0:6b753f761943 327 }
JimCarver 0:6b753f761943 328 }
JimCarver 0:6b753f761943 329 break;
JimCarver 0:6b753f761943 330 }
JimCarver 0:6b753f761943 331 }
JimCarver 0:6b753f761943 332 }
JimCarver 0:6b753f761943 333 return success;
JimCarver 0:6b753f761943 334 }
JimCarver 0:6b753f761943 335
JimCarver 0:6b753f761943 336 M2MResource* M2MObjectInstance::resource(const String &resource_name) const
JimCarver 0:6b753f761943 337 {
JimCarver 0:6b753f761943 338 return resource(resource_name.c_str());
JimCarver 0:6b753f761943 339 }
JimCarver 0:6b753f761943 340
JimCarver 0:6b753f761943 341 M2MResource* M2MObjectInstance::resource(const char *resource_name) const
JimCarver 0:6b753f761943 342 {
JimCarver 0:6b753f761943 343 M2MResource *res = NULL;
JimCarver 0:6b753f761943 344 if(!_resource_list.empty()) {
JimCarver 0:6b753f761943 345 M2MResourceList::const_iterator it;
JimCarver 0:6b753f761943 346 it = _resource_list.begin();
JimCarver 0:6b753f761943 347 for (; it!=_resource_list.end(); it++ ) {
JimCarver 0:6b753f761943 348 if(strcmp((*it)->name(), resource_name) == 0) {
JimCarver 0:6b753f761943 349 res = *it;
JimCarver 0:6b753f761943 350 break;
JimCarver 0:6b753f761943 351 }
JimCarver 0:6b753f761943 352 }
JimCarver 0:6b753f761943 353 }
JimCarver 0:6b753f761943 354 return res;
JimCarver 0:6b753f761943 355 }
JimCarver 0:6b753f761943 356
JimCarver 0:6b753f761943 357 const M2MResourceList& M2MObjectInstance::resources() const
JimCarver 0:6b753f761943 358 {
JimCarver 0:6b753f761943 359 return _resource_list;
JimCarver 0:6b753f761943 360 }
JimCarver 0:6b753f761943 361
JimCarver 0:6b753f761943 362 uint16_t M2MObjectInstance::resource_count() const
JimCarver 0:6b753f761943 363 {
JimCarver 0:6b753f761943 364 uint16_t count = 0;
JimCarver 0:6b753f761943 365 if(!_resource_list.empty()) {
JimCarver 0:6b753f761943 366 M2MResourceList::const_iterator it;
JimCarver 0:6b753f761943 367 it = _resource_list.begin();
JimCarver 0:6b753f761943 368 for ( ; it != _resource_list.end(); it++ ) {
JimCarver 0:6b753f761943 369 if((*it)->supports_multiple_instances()) {
JimCarver 0:6b753f761943 370 count += (*it)->resource_instance_count();
JimCarver 0:6b753f761943 371 } else {
JimCarver 0:6b753f761943 372 count++;
JimCarver 0:6b753f761943 373 }
JimCarver 0:6b753f761943 374 }
JimCarver 0:6b753f761943 375 }
JimCarver 0:6b753f761943 376 return count;
JimCarver 0:6b753f761943 377 }
JimCarver 0:6b753f761943 378
JimCarver 0:6b753f761943 379 uint16_t M2MObjectInstance::resource_count(const String& resource) const
JimCarver 0:6b753f761943 380 {
JimCarver 0:6b753f761943 381
JimCarver 0:6b753f761943 382 return resource_count(resource.c_str());
JimCarver 0:6b753f761943 383 }
JimCarver 0:6b753f761943 384
JimCarver 0:6b753f761943 385 uint16_t M2MObjectInstance::resource_count(const char *resource) const
JimCarver 0:6b753f761943 386 {
JimCarver 0:6b753f761943 387 uint16_t count = 0;
JimCarver 0:6b753f761943 388 if(!_resource_list.empty()) {
JimCarver 0:6b753f761943 389 M2MResourceList::const_iterator it;
JimCarver 0:6b753f761943 390 it = _resource_list.begin();
JimCarver 0:6b753f761943 391 for ( ; it != _resource_list.end(); it++ ) {
JimCarver 0:6b753f761943 392 if(strcmp((*it)->name(), resource) == 0) {
JimCarver 0:6b753f761943 393 if((*it)->supports_multiple_instances()) {
JimCarver 0:6b753f761943 394 count += (*it)->resource_instance_count();
JimCarver 0:6b753f761943 395 } else {
JimCarver 0:6b753f761943 396 count++;
JimCarver 0:6b753f761943 397 }
JimCarver 0:6b753f761943 398 }
JimCarver 0:6b753f761943 399 }
JimCarver 0:6b753f761943 400 }
JimCarver 0:6b753f761943 401 return count;
JimCarver 0:6b753f761943 402 }
JimCarver 0:6b753f761943 403
JimCarver 0:6b753f761943 404 M2MObservationHandler* M2MObjectInstance::observation_handler() const
JimCarver 0:6b753f761943 405 {
JimCarver 0:6b753f761943 406 // XXX: need to check the flag too
JimCarver 0:6b753f761943 407 return _parent.observation_handler();
JimCarver 0:6b753f761943 408 }
JimCarver 0:6b753f761943 409
JimCarver 0:6b753f761943 410 void M2MObjectInstance::set_observation_handler(M2MObservationHandler *handler)
JimCarver 0:6b753f761943 411 {
JimCarver 0:6b753f761943 412 // XXX: need to set the flag too
JimCarver 0:6b753f761943 413 _parent.set_observation_handler(handler);
JimCarver 0:6b753f761943 414 }
JimCarver 0:6b753f761943 415
JimCarver 0:6b753f761943 416 void M2MObjectInstance::add_observation_level(M2MBase::Observation observation_level)
JimCarver 0:6b753f761943 417 {
JimCarver 0:6b753f761943 418 M2MBase::add_observation_level(observation_level);
JimCarver 0:6b753f761943 419 if(!_resource_list.empty()) {
JimCarver 0:6b753f761943 420 M2MResourceList::const_iterator it;
JimCarver 0:6b753f761943 421 it = _resource_list.begin();
JimCarver 0:6b753f761943 422 for ( ; it != _resource_list.end(); it++ ) {
JimCarver 0:6b753f761943 423 (*it)->add_observation_level(observation_level);
JimCarver 0:6b753f761943 424 }
JimCarver 0:6b753f761943 425 }
JimCarver 0:6b753f761943 426 }
JimCarver 0:6b753f761943 427
JimCarver 0:6b753f761943 428 void M2MObjectInstance::remove_observation_level(M2MBase::Observation observation_level)
JimCarver 0:6b753f761943 429 {
JimCarver 0:6b753f761943 430 M2MBase::remove_observation_level(observation_level);
JimCarver 0:6b753f761943 431 if(!_resource_list.empty()) {
JimCarver 0:6b753f761943 432 M2MResourceList::const_iterator it;
JimCarver 0:6b753f761943 433 it = _resource_list.begin();
JimCarver 0:6b753f761943 434 for ( ; it != _resource_list.end(); it++ ) {
JimCarver 0:6b753f761943 435 (*it)->remove_observation_level(observation_level);
JimCarver 0:6b753f761943 436 }
JimCarver 0:6b753f761943 437 }
JimCarver 0:6b753f761943 438 }
JimCarver 0:6b753f761943 439
JimCarver 0:6b753f761943 440 sn_coap_hdr_s* M2MObjectInstance::handle_get_request(nsdl_s *nsdl,
JimCarver 0:6b753f761943 441 sn_coap_hdr_s *received_coap_header,
JimCarver 0:6b753f761943 442 M2MObservationHandler *observation_handler)
JimCarver 0:6b753f761943 443 {
JimCarver 0:6b753f761943 444 tr_info("M2MObjectInstance::handle_get_request()");
JimCarver 0:6b753f761943 445 sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CONTENT;
JimCarver 0:6b753f761943 446 sn_coap_hdr_s * coap_response = sn_nsdl_build_response(nsdl,
JimCarver 0:6b753f761943 447 received_coap_header,
JimCarver 0:6b753f761943 448 msg_code);
JimCarver 0:6b753f761943 449 uint8_t * data = NULL;
JimCarver 0:6b753f761943 450 uint32_t data_length = 0;
JimCarver 0:6b753f761943 451
JimCarver 0:6b753f761943 452 if (received_coap_header) {
JimCarver 0:6b753f761943 453 // process the GET if we have registered a callback for it
JimCarver 0:6b753f761943 454 if ((operation() & SN_GRS_GET_ALLOWED) != 0) {
JimCarver 0:6b753f761943 455 if (coap_response) {
JimCarver 0:6b753f761943 456 bool content_type_present = false;
JimCarver 0:6b753f761943 457 bool is_content_type_supported = true;
JimCarver 0:6b753f761943 458
JimCarver 0:6b753f761943 459 if (received_coap_header->options_list_ptr &&
JimCarver 0:6b753f761943 460 received_coap_header->options_list_ptr->accept != COAP_CT_NONE) {
JimCarver 0:6b753f761943 461 content_type_present = true;
JimCarver 0:6b753f761943 462 coap_response->content_format = received_coap_header->options_list_ptr->accept;
JimCarver 0:6b753f761943 463
JimCarver 0:6b753f761943 464 }
JimCarver 0:6b753f761943 465
JimCarver 0:6b753f761943 466 // Check if preferred content type is supported
JimCarver 0:6b753f761943 467 if (content_type_present) {
JimCarver 0:6b753f761943 468 if (coap_response->content_format != COAP_CONTENT_OMA_TLV_TYPE_OLD &&
JimCarver 0:6b753f761943 469 coap_response->content_format != COAP_CONTENT_OMA_TLV_TYPE) {
JimCarver 0:6b753f761943 470 is_content_type_supported = false;
JimCarver 0:6b753f761943 471 }
JimCarver 0:6b753f761943 472 }
JimCarver 0:6b753f761943 473
JimCarver 0:6b753f761943 474 if (is_content_type_supported) {
JimCarver 0:6b753f761943 475 if (!content_type_present &&
JimCarver 0:6b753f761943 476 (M2MBase::coap_content_type() == COAP_CONTENT_OMA_TLV_TYPE ||
JimCarver 0:6b753f761943 477 M2MBase::coap_content_type() == COAP_CONTENT_OMA_TLV_TYPE_OLD)) {
JimCarver 0:6b753f761943 478 coap_response->content_format = sn_coap_content_format_e(M2MBase::coap_content_type());
JimCarver 0:6b753f761943 479 }
JimCarver 0:6b753f761943 480
JimCarver 0:6b753f761943 481 // fill in the CoAP response payload
JimCarver 0:6b753f761943 482 if (COAP_CONTENT_OMA_TLV_TYPE == coap_response->content_format ||
JimCarver 0:6b753f761943 483 COAP_CONTENT_OMA_TLV_TYPE_OLD == coap_response->content_format) {
JimCarver 0:6b753f761943 484 set_coap_content_type(coap_response->content_format);
JimCarver 0:6b753f761943 485 data = M2MTLVSerializer::serialize(_resource_list, data_length);
JimCarver 0:6b753f761943 486 }
JimCarver 0:6b753f761943 487
JimCarver 0:6b753f761943 488 coap_response->payload_len = data_length;
JimCarver 0:6b753f761943 489 coap_response->payload_ptr = data;
JimCarver 0:6b753f761943 490
JimCarver 0:6b753f761943 491 if (data) {
JimCarver 0:6b753f761943 492 coap_response->options_list_ptr = sn_nsdl_alloc_options_list(nsdl, coap_response);
JimCarver 0:6b753f761943 493 if (coap_response->options_list_ptr) {
JimCarver 0:6b753f761943 494 coap_response->options_list_ptr->max_age = max_age();
JimCarver 0:6b753f761943 495 }
JimCarver 0:6b753f761943 496
JimCarver 0:6b753f761943 497 if (received_coap_header->options_list_ptr) {
JimCarver 0:6b753f761943 498 if (received_coap_header->options_list_ptr->observe != -1) {
JimCarver 0:6b753f761943 499 if (is_observable()) {
JimCarver 0:6b753f761943 500 uint32_t number = 0;
JimCarver 0:6b753f761943 501 uint8_t observe_option = 0;
JimCarver 0:6b753f761943 502 observe_option = received_coap_header->options_list_ptr->observe;
JimCarver 0:6b753f761943 503 if (START_OBSERVATION == observe_option) {
JimCarver 0:6b753f761943 504 // If the observe length is 0 means register for observation.
JimCarver 0:6b753f761943 505 if (received_coap_header->options_list_ptr->observe != -1) {
JimCarver 0:6b753f761943 506 number = received_coap_header->options_list_ptr->observe;
JimCarver 0:6b753f761943 507 }
JimCarver 0:6b753f761943 508
JimCarver 0:6b753f761943 509 // If the observe value is 0 means register for observation.
JimCarver 0:6b753f761943 510 if (number == 0) {
JimCarver 0:6b753f761943 511 tr_info("M2MObjectInstance::handle_get_request - put resource under observation");
JimCarver 0:6b753f761943 512 set_under_observation(true,observation_handler);
JimCarver 0:6b753f761943 513 add_observation_level(M2MBase::OI_Attribute);
JimCarver 0:6b753f761943 514 send_notification_delivery_status(*this, NOTIFICATION_STATUS_SUBSCRIBED);
JimCarver 0:6b753f761943 515 if (coap_response->options_list_ptr) {
JimCarver 0:6b753f761943 516 coap_response->options_list_ptr->observe = observation_number();
JimCarver 0:6b753f761943 517 }
JimCarver 0:6b753f761943 518 }
JimCarver 0:6b753f761943 519
JimCarver 0:6b753f761943 520 if (received_coap_header->token_ptr) {
JimCarver 0:6b753f761943 521 set_observation_token(received_coap_header->token_ptr,
JimCarver 0:6b753f761943 522 received_coap_header->token_len);
JimCarver 0:6b753f761943 523 }
JimCarver 0:6b753f761943 524
JimCarver 0:6b753f761943 525 } else if (STOP_OBSERVATION == observe_option) {
JimCarver 0:6b753f761943 526 tr_info("M2MObjectInstance::handle_get_request - stops observation");
JimCarver 0:6b753f761943 527 set_under_observation(false,NULL);
JimCarver 0:6b753f761943 528 remove_observation_level(M2MBase::OI_Attribute);
JimCarver 0:6b753f761943 529 send_notification_delivery_status(*this, NOTIFICATION_STATUS_UNSUBSCRIBED);
JimCarver 0:6b753f761943 530 }
JimCarver 0:6b753f761943 531 msg_code = COAP_MSG_CODE_RESPONSE_CONTENT;
JimCarver 0:6b753f761943 532 }
JimCarver 0:6b753f761943 533 else {
JimCarver 0:6b753f761943 534 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
JimCarver 0:6b753f761943 535 }
JimCarver 0:6b753f761943 536 }
JimCarver 0:6b753f761943 537 }
JimCarver 0:6b753f761943 538 } else {
JimCarver 0:6b753f761943 539 msg_code = COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT; // Content format not supported
JimCarver 0:6b753f761943 540 }
JimCarver 0:6b753f761943 541 } else {
JimCarver 0:6b753f761943 542 tr_error("M2MObjectInstance::handle_get_request() - Content-type: %d not supported", coap_response->content_format);
JimCarver 0:6b753f761943 543 msg_code = COAP_MSG_CODE_RESPONSE_NOT_ACCEPTABLE;
JimCarver 0:6b753f761943 544 }
JimCarver 0:6b753f761943 545 }
JimCarver 0:6b753f761943 546 } else {
JimCarver 0:6b753f761943 547 tr_error("M2MObjectInstance::handle_get_request - Return COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED");
JimCarver 0:6b753f761943 548 // Operation is not allowed.
JimCarver 0:6b753f761943 549 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
JimCarver 0:6b753f761943 550 }
JimCarver 0:6b753f761943 551 } else {
JimCarver 0:6b753f761943 552 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
JimCarver 0:6b753f761943 553 }
JimCarver 0:6b753f761943 554 if(coap_response) {
JimCarver 0:6b753f761943 555 coap_response->msg_code = msg_code;
JimCarver 0:6b753f761943 556 }
JimCarver 0:6b753f761943 557 return coap_response;
JimCarver 0:6b753f761943 558 }
JimCarver 0:6b753f761943 559
JimCarver 0:6b753f761943 560 sn_coap_hdr_s* M2MObjectInstance::handle_put_request(nsdl_s *nsdl,
JimCarver 0:6b753f761943 561 sn_coap_hdr_s *received_coap_header,
JimCarver 0:6b753f761943 562 M2MObservationHandler *observation_handler,
JimCarver 0:6b753f761943 563 bool &/*execute_value_updated*/)
JimCarver 0:6b753f761943 564 {
JimCarver 0:6b753f761943 565 tr_info("M2MObjectInstance::handle_put_request()");
JimCarver 0:6b753f761943 566 sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; // 2.04
JimCarver 0:6b753f761943 567 sn_coap_hdr_s * coap_response = sn_nsdl_build_response(nsdl,
JimCarver 0:6b753f761943 568 received_coap_header,
JimCarver 0:6b753f761943 569 msg_code);;
JimCarver 0:6b753f761943 570 if(received_coap_header) {
JimCarver 0:6b753f761943 571 uint16_t coap_content_type = 0;
JimCarver 0:6b753f761943 572 bool content_type_present = false;
JimCarver 0:6b753f761943 573
JimCarver 0:6b753f761943 574 if(received_coap_header->content_format != COAP_CT_NONE) {
JimCarver 0:6b753f761943 575 content_type_present = true;
JimCarver 0:6b753f761943 576 set_coap_content_type(received_coap_header->content_format);
JimCarver 0:6b753f761943 577 if(coap_response) {
JimCarver 0:6b753f761943 578 coap_content_type = received_coap_header->content_format;
JimCarver 0:6b753f761943 579 }
JimCarver 0:6b753f761943 580 }
JimCarver 0:6b753f761943 581 if(received_coap_header->options_list_ptr &&
JimCarver 0:6b753f761943 582 received_coap_header->options_list_ptr->uri_query_ptr) {
JimCarver 0:6b753f761943 583 char *query = (char*)alloc_string_copy(received_coap_header->options_list_ptr->uri_query_ptr,
JimCarver 0:6b753f761943 584 received_coap_header->options_list_ptr->uri_query_len);
JimCarver 0:6b753f761943 585 if (query){
JimCarver 0:6b753f761943 586 tr_info("M2MObjectInstance::handle_put_request() - query %s", query);
JimCarver 0:6b753f761943 587 // if anything was updated, re-initialize the stored notification attributes
JimCarver 0:6b753f761943 588 if (!handle_observation_attribute(query)){
JimCarver 0:6b753f761943 589 tr_debug("M2MObjectInstance::handle_put_request() - Invalid query");
JimCarver 0:6b753f761943 590 msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; // 4.00
JimCarver 0:6b753f761943 591 } else {
JimCarver 0:6b753f761943 592 msg_code =COAP_MSG_CODE_RESPONSE_CHANGED;
JimCarver 0:6b753f761943 593 }
JimCarver 0:6b753f761943 594 free(query);
JimCarver 0:6b753f761943 595 }
JimCarver 0:6b753f761943 596 } else if ((operation() & SN_GRS_PUT_ALLOWED) != 0) {
JimCarver 0:6b753f761943 597 if(!content_type_present &&
JimCarver 0:6b753f761943 598 (M2MBase::coap_content_type() == COAP_CONTENT_OMA_TLV_TYPE ||
JimCarver 0:6b753f761943 599 M2MBase::coap_content_type() == COAP_CONTENT_OMA_TLV_TYPE_OLD)) {
JimCarver 0:6b753f761943 600 coap_content_type = M2MBase::coap_content_type();
JimCarver 0:6b753f761943 601 }
JimCarver 0:6b753f761943 602
JimCarver 0:6b753f761943 603 tr_debug("M2MObjectInstance::handle_put_request() - Request Content-type: %d", coap_content_type);
JimCarver 0:6b753f761943 604
JimCarver 0:6b753f761943 605 if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type ||
JimCarver 0:6b753f761943 606 COAP_CONTENT_OMA_TLV_TYPE_OLD == coap_content_type ) {
JimCarver 0:6b753f761943 607 set_coap_content_type(coap_content_type);
JimCarver 0:6b753f761943 608 M2MTLVDeserializer::Error error = M2MTLVDeserializer::None;
JimCarver 0:6b753f761943 609 if(received_coap_header->payload_ptr) {
JimCarver 0:6b753f761943 610 error = M2MTLVDeserializer::deserialize_resources(
JimCarver 0:6b753f761943 611 received_coap_header->payload_ptr,
JimCarver 0:6b753f761943 612 received_coap_header->payload_len, *this,
JimCarver 0:6b753f761943 613 M2MTLVDeserializer::Put);
JimCarver 0:6b753f761943 614 switch(error) {
JimCarver 0:6b753f761943 615 case M2MTLVDeserializer::None:
JimCarver 0:6b753f761943 616 if(observation_handler) {
JimCarver 0:6b753f761943 617 observation_handler->value_updated(this);
JimCarver 0:6b753f761943 618 }
JimCarver 0:6b753f761943 619 msg_code = COAP_MSG_CODE_RESPONSE_CHANGED;
JimCarver 0:6b753f761943 620 break;
JimCarver 0:6b753f761943 621 case M2MTLVDeserializer::NotFound:
JimCarver 0:6b753f761943 622 msg_code = COAP_MSG_CODE_RESPONSE_NOT_FOUND;
JimCarver 0:6b753f761943 623 break;
JimCarver 0:6b753f761943 624 case M2MTLVDeserializer::NotAllowed:
JimCarver 0:6b753f761943 625 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
JimCarver 0:6b753f761943 626 break;
JimCarver 0:6b753f761943 627 case M2MTLVDeserializer::NotValid:
JimCarver 0:6b753f761943 628 msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST;
JimCarver 0:6b753f761943 629 break;
JimCarver 0:6b753f761943 630 case M2MTLVDeserializer::OutOfMemory:
JimCarver 0:6b753f761943 631 msg_code = COAP_MSG_CODE_RESPONSE_REQUEST_ENTITY_TOO_LARGE;
JimCarver 0:6b753f761943 632 break;
JimCarver 0:6b753f761943 633 }
JimCarver 0:6b753f761943 634 }
JimCarver 0:6b753f761943 635 } else {
JimCarver 0:6b753f761943 636 msg_code =COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT;
JimCarver 0:6b753f761943 637 } // if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type)
JimCarver 0:6b753f761943 638 } else {
JimCarver 0:6b753f761943 639 // Operation is not allowed.
JimCarver 0:6b753f761943 640 tr_error("M2MObjectInstance::handle_put_request() - COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED");
JimCarver 0:6b753f761943 641 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
JimCarver 0:6b753f761943 642 }
JimCarver 0:6b753f761943 643 } else {
JimCarver 0:6b753f761943 644 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
JimCarver 0:6b753f761943 645 }
JimCarver 0:6b753f761943 646 if(coap_response) {
JimCarver 0:6b753f761943 647 coap_response->msg_code = msg_code;
JimCarver 0:6b753f761943 648 }
JimCarver 0:6b753f761943 649 return coap_response;
JimCarver 0:6b753f761943 650 }
JimCarver 0:6b753f761943 651
JimCarver 0:6b753f761943 652 sn_coap_hdr_s* M2MObjectInstance::handle_post_request(nsdl_s *nsdl,
JimCarver 0:6b753f761943 653 sn_coap_hdr_s *received_coap_header,
JimCarver 0:6b753f761943 654 M2MObservationHandler *observation_handler,
JimCarver 0:6b753f761943 655 bool &execute_value_updated,
JimCarver 0:6b753f761943 656 sn_nsdl_addr_s *)
JimCarver 0:6b753f761943 657 {
JimCarver 0:6b753f761943 658 tr_info("M2MObjectInstance::handle_post_request()");
JimCarver 0:6b753f761943 659 sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; // 2.04
JimCarver 0:6b753f761943 660 sn_coap_hdr_s * coap_response = sn_nsdl_build_response(nsdl,
JimCarver 0:6b753f761943 661 received_coap_header,
JimCarver 0:6b753f761943 662 msg_code);
JimCarver 0:6b753f761943 663 if(received_coap_header) {
JimCarver 0:6b753f761943 664 if ((operation() & SN_GRS_POST_ALLOWED) != 0) {
JimCarver 0:6b753f761943 665 uint16_t coap_content_type = 0;
JimCarver 0:6b753f761943 666 bool content_type_present = false;
JimCarver 0:6b753f761943 667 if(received_coap_header->content_format != COAP_CT_NONE) {
JimCarver 0:6b753f761943 668 set_coap_content_type(received_coap_header->content_format);
JimCarver 0:6b753f761943 669 content_type_present = true;
JimCarver 0:6b753f761943 670 if(coap_response) {
JimCarver 0:6b753f761943 671 coap_content_type = received_coap_header->content_format;
JimCarver 0:6b753f761943 672 }
JimCarver 0:6b753f761943 673 }
JimCarver 0:6b753f761943 674 if(!content_type_present &&
JimCarver 0:6b753f761943 675 (M2MBase::coap_content_type() == COAP_CONTENT_OMA_TLV_TYPE ||
JimCarver 0:6b753f761943 676 M2MBase::coap_content_type() == COAP_CONTENT_OMA_TLV_TYPE_OLD)) {
JimCarver 0:6b753f761943 677 coap_content_type = M2MBase::coap_content_type();
JimCarver 0:6b753f761943 678 }
JimCarver 0:6b753f761943 679
JimCarver 0:6b753f761943 680 tr_debug("M2MObjectInstance::handle_post_request() - Request Content-type: %d", coap_content_type);
JimCarver 0:6b753f761943 681
JimCarver 0:6b753f761943 682 if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type ||
JimCarver 0:6b753f761943 683 COAP_CONTENT_OMA_TLV_TYPE_OLD == coap_content_type) {
JimCarver 0:6b753f761943 684 set_coap_content_type(coap_content_type);
JimCarver 0:6b753f761943 685 M2MTLVDeserializer::Error error = M2MTLVDeserializer::None;
JimCarver 0:6b753f761943 686 error = M2MTLVDeserializer::deserialize_resources(
JimCarver 0:6b753f761943 687 received_coap_header->payload_ptr,
JimCarver 0:6b753f761943 688 received_coap_header->payload_len, *this,
JimCarver 0:6b753f761943 689 M2MTLVDeserializer::Post);
JimCarver 0:6b753f761943 690
JimCarver 0:6b753f761943 691 uint16_t instance_id = M2MTLVDeserializer::instance_id(received_coap_header->payload_ptr);
JimCarver 0:6b753f761943 692 switch(error) {
JimCarver 0:6b753f761943 693 case M2MTLVDeserializer::None:
JimCarver 0:6b753f761943 694 if(observation_handler) {
JimCarver 0:6b753f761943 695 execute_value_updated = true;
JimCarver 0:6b753f761943 696 }
JimCarver 0:6b753f761943 697 coap_response->options_list_ptr = sn_nsdl_alloc_options_list(nsdl, coap_response);
JimCarver 0:6b753f761943 698
JimCarver 0:6b753f761943 699 if (coap_response->options_list_ptr) {
JimCarver 0:6b753f761943 700
JimCarver 0:6b753f761943 701 StringBuffer<MAX_PATH_SIZE_3> obj_name;
JimCarver 0:6b753f761943 702 if(!build_path(obj_name, _parent.name(), M2MBase::instance_id(), instance_id)) {
JimCarver 0:6b753f761943 703 msg_code = COAP_MSG_CODE_RESPONSE_INTERNAL_SERVER_ERROR;
JimCarver 0:6b753f761943 704 break;
JimCarver 0:6b753f761943 705 }
JimCarver 0:6b753f761943 706
JimCarver 0:6b753f761943 707 coap_response->options_list_ptr->location_path_len = obj_name.get_size();
JimCarver 0:6b753f761943 708 coap_response->options_list_ptr->location_path_ptr =
JimCarver 0:6b753f761943 709 alloc_string_copy((uint8_t*)obj_name.c_str(),
JimCarver 0:6b753f761943 710 coap_response->options_list_ptr->location_path_len);
JimCarver 0:6b753f761943 711 // todo: handle allocation error
JimCarver 0:6b753f761943 712 }
JimCarver 0:6b753f761943 713 msg_code = COAP_MSG_CODE_RESPONSE_CREATED;
JimCarver 0:6b753f761943 714 break;
JimCarver 0:6b753f761943 715 case M2MTLVDeserializer::NotAllowed:
JimCarver 0:6b753f761943 716 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
JimCarver 0:6b753f761943 717 break;
JimCarver 0:6b753f761943 718 case M2MTLVDeserializer::NotValid:
JimCarver 0:6b753f761943 719 msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST;
JimCarver 0:6b753f761943 720 break;
JimCarver 0:6b753f761943 721 case M2MTLVDeserializer::NotFound:
JimCarver 0:6b753f761943 722 msg_code = COAP_MSG_CODE_RESPONSE_NOT_FOUND;
JimCarver 0:6b753f761943 723 break;
JimCarver 0:6b753f761943 724 case M2MTLVDeserializer::OutOfMemory:
JimCarver 0:6b753f761943 725 msg_code = COAP_MSG_CODE_RESPONSE_REQUEST_ENTITY_TOO_LARGE;
JimCarver 0:6b753f761943 726 break;
JimCarver 0:6b753f761943 727 default:
JimCarver 0:6b753f761943 728 break;
JimCarver 0:6b753f761943 729 }
JimCarver 0:6b753f761943 730 } else {
JimCarver 0:6b753f761943 731 msg_code =COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT;
JimCarver 0:6b753f761943 732 } // if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type)
JimCarver 0:6b753f761943 733 } else {
JimCarver 0:6b753f761943 734 // Operation is not allowed.
JimCarver 0:6b753f761943 735 tr_error("M2MObjectInstance::handle_post_request() - COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED");
JimCarver 0:6b753f761943 736 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
JimCarver 0:6b753f761943 737 }
JimCarver 0:6b753f761943 738 } else {
JimCarver 0:6b753f761943 739 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
JimCarver 0:6b753f761943 740 }
JimCarver 0:6b753f761943 741 if(coap_response) {
JimCarver 0:6b753f761943 742 coap_response->msg_code = msg_code;
JimCarver 0:6b753f761943 743 }
JimCarver 0:6b753f761943 744 return coap_response;
JimCarver 0:6b753f761943 745 }
JimCarver 0:6b753f761943 746
JimCarver 0:6b753f761943 747 void M2MObjectInstance::notification_update(M2MBase::Observation observation_level)
JimCarver 0:6b753f761943 748 {
JimCarver 0:6b753f761943 749 tr_debug("M2MObjectInstance::notification_update() - level(%d)", observation_level);
JimCarver 0:6b753f761943 750 if((M2MBase::O_Attribute & observation_level) == M2MBase::O_Attribute) {
JimCarver 0:6b753f761943 751 tr_debug("M2MObjectInstance::notification_update() - object callback");
JimCarver 0:6b753f761943 752 _parent.notification_update(instance_id());
JimCarver 0:6b753f761943 753 }
JimCarver 0:6b753f761943 754 if((M2MBase::OI_Attribute & observation_level) == M2MBase::OI_Attribute) {
JimCarver 0:6b753f761943 755 tr_debug("M2MObjectInstance::notification_update() - object instance callback");
JimCarver 0:6b753f761943 756 M2MReportHandler *report_handler = M2MBase::report_handler();
JimCarver 0:6b753f761943 757 if(report_handler && is_under_observation()) {
JimCarver 0:6b753f761943 758 report_handler->set_notification_trigger();
JimCarver 0:6b753f761943 759 }
JimCarver 0:6b753f761943 760
JimCarver 0:6b753f761943 761 }
JimCarver 0:6b753f761943 762 }
JimCarver 0:6b753f761943 763
JimCarver 0:6b753f761943 764 M2MBase *M2MObjectInstance::get_parent() const
JimCarver 0:6b753f761943 765 {
JimCarver 0:6b753f761943 766 return (M2MBase *) &get_parent_object();
JimCarver 0:6b753f761943 767 }
JimCarver 0:6b753f761943 768
JimCarver 0:6b753f761943 769 M2MBase::DataType M2MObjectInstance::convert_resource_type(M2MResourceInstance::ResourceType type)
JimCarver 0:6b753f761943 770 {
JimCarver 0:6b753f761943 771 M2MBase::DataType data_type = M2MBase::OBJLINK;
JimCarver 0:6b753f761943 772 switch(type) {
JimCarver 0:6b753f761943 773 case M2MResourceInstance::STRING:
JimCarver 0:6b753f761943 774 data_type = M2MBase::STRING;
JimCarver 0:6b753f761943 775 break;
JimCarver 0:6b753f761943 776 case M2MResourceInstance::INTEGER:
JimCarver 0:6b753f761943 777 data_type = M2MBase::INTEGER;
JimCarver 0:6b753f761943 778 break;
JimCarver 0:6b753f761943 779 case M2MResourceInstance::FLOAT:
JimCarver 0:6b753f761943 780 data_type = M2MBase::FLOAT;
JimCarver 0:6b753f761943 781 break;
JimCarver 0:6b753f761943 782 case M2MResourceInstance::OPAQUE:
JimCarver 0:6b753f761943 783 data_type = M2MBase::OPAQUE;
JimCarver 0:6b753f761943 784 break;
JimCarver 0:6b753f761943 785 case M2MResourceInstance::BOOLEAN:
JimCarver 0:6b753f761943 786 data_type = M2MBase::BOOLEAN;
JimCarver 0:6b753f761943 787 break;
JimCarver 0:6b753f761943 788 case M2MResourceInstance::TIME:
JimCarver 0:6b753f761943 789 data_type = M2MBase::TIME;
JimCarver 0:6b753f761943 790 break;
JimCarver 0:6b753f761943 791 case M2MResourceInstance::OBJLINK:
JimCarver 0:6b753f761943 792 data_type = M2MBase::OBJLINK;
JimCarver 0:6b753f761943 793 break;
JimCarver 0:6b753f761943 794 }
JimCarver 0:6b753f761943 795 return data_type;
JimCarver 0:6b753f761943 796 }