Jim Carver / Mbed OS mbed-cloud-workshop-connect
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/m2mconstants.h"
JimCarver 0:6b753f761943 17 #include "mbed-client/m2mresource.h"
JimCarver 0:6b753f761943 18 #include "mbed-client/m2mobservationhandler.h"
JimCarver 0:6b753f761943 19 #include "include/m2mreporthandler.h"
JimCarver 0:6b753f761943 20 #include "include/m2mtlvserializer.h"
JimCarver 0:6b753f761943 21 #include "include/m2mtlvdeserializer.h"
JimCarver 0:6b753f761943 22 #include "mbed-trace/mbed_trace.h"
JimCarver 0:6b753f761943 23
JimCarver 0:6b753f761943 24 #include <stdlib.h>
JimCarver 0:6b753f761943 25
JimCarver 0:6b753f761943 26 #define TRACE_GROUP "mClt"
JimCarver 0:6b753f761943 27
JimCarver 0:6b753f761943 28 M2MResource::M2MResource(M2MObjectInstance &parent,
JimCarver 0:6b753f761943 29 const String &resource_name,
JimCarver 0:6b753f761943 30 M2MBase::Mode resource_mode,
JimCarver 0:6b753f761943 31 const String &resource_type,
JimCarver 0:6b753f761943 32 M2MBase::DataType type,
JimCarver 0:6b753f761943 33 const uint8_t *value,
JimCarver 0:6b753f761943 34 const uint8_t value_length,
JimCarver 0:6b753f761943 35 char *path,
JimCarver 0:6b753f761943 36 bool multiple_instance,
JimCarver 0:6b753f761943 37 bool external_blockwise_store)
JimCarver 0:6b753f761943 38 : M2MResourceBase(resource_name, resource_mode, resource_type, type, value, value_length,
JimCarver 0:6b753f761943 39 path, external_blockwise_store, multiple_instance),
JimCarver 0:6b753f761943 40 _parent(parent)
JimCarver 0:6b753f761943 41 #ifndef DISABLE_DELAYED_RESPONSE
JimCarver 0:6b753f761943 42 ,_delayed_token(NULL),
JimCarver 0:6b753f761943 43 _delayed_token_len(0),
JimCarver 0:6b753f761943 44 _delayed_response(false)
JimCarver 0:6b753f761943 45 #endif
JimCarver 0:6b753f761943 46 {
JimCarver 0:6b753f761943 47 M2MBase::set_base_type(M2MBase::Resource);
JimCarver 0:6b753f761943 48 M2MBase::set_operation(M2MBase::GET_ALLOWED);
JimCarver 0:6b753f761943 49 M2MBase::set_observable(false);
JimCarver 0:6b753f761943 50 if (multiple_instance) {
JimCarver 0:6b753f761943 51 M2MBase::set_coap_content_type(COAP_CONTENT_OMA_TLV_TYPE_OLD);
JimCarver 0:6b753f761943 52 }
JimCarver 0:6b753f761943 53
JimCarver 0:6b753f761943 54 }
JimCarver 0:6b753f761943 55
JimCarver 0:6b753f761943 56 M2MResource::M2MResource(M2MObjectInstance &parent,
JimCarver 0:6b753f761943 57 const lwm2m_parameters_s* s,
JimCarver 0:6b753f761943 58 M2MBase::DataType type)
JimCarver 0:6b753f761943 59 : M2MResourceBase(s, type),
JimCarver 0:6b753f761943 60 _parent(parent)
JimCarver 0:6b753f761943 61 #ifndef DISABLE_DELAYED_RESPONSE
JimCarver 0:6b753f761943 62 ,_delayed_token(NULL),
JimCarver 0:6b753f761943 63 _delayed_token_len(0),
JimCarver 0:6b753f761943 64 _delayed_response(false)
JimCarver 0:6b753f761943 65 #endif
JimCarver 0:6b753f761943 66 {
JimCarver 0:6b753f761943 67 // verify, that the client has hardcoded proper type to the structure
JimCarver 0:6b753f761943 68 assert(base_type() == M2MBase::Resource);
JimCarver 0:6b753f761943 69 }
JimCarver 0:6b753f761943 70
JimCarver 0:6b753f761943 71 M2MResource::M2MResource(M2MObjectInstance &parent,
JimCarver 0:6b753f761943 72 const String &resource_name,
JimCarver 0:6b753f761943 73 M2MBase::Mode resource_mode,
JimCarver 0:6b753f761943 74 const String &resource_type,
JimCarver 0:6b753f761943 75 M2MBase::DataType type,
JimCarver 0:6b753f761943 76 bool observable,
JimCarver 0:6b753f761943 77 char *path,
JimCarver 0:6b753f761943 78 bool multiple_instance,
JimCarver 0:6b753f761943 79 bool external_blockwise_store)
JimCarver 0:6b753f761943 80 : M2MResourceBase(resource_name, resource_mode, resource_type, type,
JimCarver 0:6b753f761943 81 path,
JimCarver 0:6b753f761943 82 external_blockwise_store,multiple_instance),
JimCarver 0:6b753f761943 83 _parent(parent)
JimCarver 0:6b753f761943 84 #ifndef DISABLE_DELAYED_RESPONSE
JimCarver 0:6b753f761943 85 ,_delayed_token(NULL),
JimCarver 0:6b753f761943 86 _delayed_token_len(0),
JimCarver 0:6b753f761943 87 _delayed_response(false)
JimCarver 0:6b753f761943 88 #endif
JimCarver 0:6b753f761943 89 {
JimCarver 0:6b753f761943 90 M2MBase::set_base_type(M2MBase::Resource);
JimCarver 0:6b753f761943 91 M2MBase::set_operation(M2MBase::GET_PUT_ALLOWED);
JimCarver 0:6b753f761943 92 M2MBase::set_observable(observable);
JimCarver 0:6b753f761943 93 if (multiple_instance) {
JimCarver 0:6b753f761943 94 M2MBase::set_coap_content_type(COAP_CONTENT_OMA_TLV_TYPE_OLD);
JimCarver 0:6b753f761943 95 }
JimCarver 0:6b753f761943 96 }
JimCarver 0:6b753f761943 97
JimCarver 0:6b753f761943 98
JimCarver 0:6b753f761943 99 M2MResource::~M2MResource()
JimCarver 0:6b753f761943 100 {
JimCarver 0:6b753f761943 101 if(!_resource_instance_list.empty()) {
JimCarver 0:6b753f761943 102 M2MResourceInstance* res = NULL;
JimCarver 0:6b753f761943 103 M2MResourceInstanceList::const_iterator it;
JimCarver 0:6b753f761943 104 it = _resource_instance_list.begin();
JimCarver 0:6b753f761943 105 for (; it!=_resource_instance_list.end(); it++ ) {
JimCarver 0:6b753f761943 106 //Free allocated memory for resources.
JimCarver 0:6b753f761943 107 res = *it;
JimCarver 0:6b753f761943 108 delete res;
JimCarver 0:6b753f761943 109 }
JimCarver 0:6b753f761943 110 _resource_instance_list.clear();
JimCarver 0:6b753f761943 111 }
JimCarver 0:6b753f761943 112 #ifndef DISABLE_DELAYED_RESPONSE
JimCarver 0:6b753f761943 113 free(_delayed_token);
JimCarver 0:6b753f761943 114 #endif
JimCarver 0:6b753f761943 115
JimCarver 0:6b753f761943 116 free_resources();
JimCarver 0:6b753f761943 117 }
JimCarver 0:6b753f761943 118
JimCarver 0:6b753f761943 119 bool M2MResource::supports_multiple_instances() const
JimCarver 0:6b753f761943 120 {
JimCarver 0:6b753f761943 121 M2MBase::lwm2m_parameters_s* param = M2MBase::get_lwm2m_parameters();
JimCarver 0:6b753f761943 122 return param->multiple_instance;
JimCarver 0:6b753f761943 123 }
JimCarver 0:6b753f761943 124
JimCarver 0:6b753f761943 125 #ifndef DISABLE_DELAYED_RESPONSE
JimCarver 0:6b753f761943 126 void M2MResource::set_delayed_response(bool delayed_response)
JimCarver 0:6b753f761943 127 {
JimCarver 0:6b753f761943 128 _delayed_response = delayed_response;
JimCarver 0:6b753f761943 129 }
JimCarver 0:6b753f761943 130
JimCarver 0:6b753f761943 131 bool M2MResource::send_delayed_post_response()
JimCarver 0:6b753f761943 132 {
JimCarver 0:6b753f761943 133 bool success = false;
JimCarver 0:6b753f761943 134 if(_delayed_response) {
JimCarver 0:6b753f761943 135 success = true;
JimCarver 0:6b753f761943 136 // At least on some unit tests the resource object is not fully constructed, which would
JimCarver 0:6b753f761943 137 // cause issues if the observation_handler is NULL. So do the check before dereferencing pointer.
JimCarver 0:6b753f761943 138 M2MObservationHandler* obs = observation_handler();
JimCarver 0:6b753f761943 139 if (obs) {
JimCarver 0:6b753f761943 140 obs->send_delayed_response(this);
JimCarver 0:6b753f761943 141 }
JimCarver 0:6b753f761943 142 }
JimCarver 0:6b753f761943 143 return success;
JimCarver 0:6b753f761943 144 }
JimCarver 0:6b753f761943 145
JimCarver 0:6b753f761943 146 void M2MResource::get_delayed_token(uint8_t *&token, uint8_t &token_length)
JimCarver 0:6b753f761943 147 {
JimCarver 0:6b753f761943 148 token_length = 0;
JimCarver 0:6b753f761943 149 if(token) {
JimCarver 0:6b753f761943 150 free(token);
JimCarver 0:6b753f761943 151 token = NULL;
JimCarver 0:6b753f761943 152 }
JimCarver 0:6b753f761943 153 if(_delayed_token && _delayed_token_len > 0) {
JimCarver 0:6b753f761943 154 token = alloc_copy(_delayed_token, _delayed_token_len);
JimCarver 0:6b753f761943 155 if(token) {
JimCarver 0:6b753f761943 156 token_length = _delayed_token_len;
JimCarver 0:6b753f761943 157 }
JimCarver 0:6b753f761943 158 }
JimCarver 0:6b753f761943 159 }
JimCarver 0:6b753f761943 160 #endif
JimCarver 0:6b753f761943 161
JimCarver 0:6b753f761943 162 bool M2MResource::remove_resource_instance(uint16_t inst_id)
JimCarver 0:6b753f761943 163 {
JimCarver 0:6b753f761943 164 tr_debug("M2MResource::remove_resource(inst_id %d)", inst_id);
JimCarver 0:6b753f761943 165 bool success = false;
JimCarver 0:6b753f761943 166 if(!_resource_instance_list.empty()) {
JimCarver 0:6b753f761943 167 M2MResourceInstance* res = NULL;
JimCarver 0:6b753f761943 168 M2MResourceInstanceList::const_iterator it;
JimCarver 0:6b753f761943 169 it = _resource_instance_list.begin();
JimCarver 0:6b753f761943 170 int pos = 0;
JimCarver 0:6b753f761943 171 for ( ; it != _resource_instance_list.end(); it++, pos++ ) {
JimCarver 0:6b753f761943 172 if(((*it)->instance_id() == inst_id)) {
JimCarver 0:6b753f761943 173 // Resource found and deleted.
JimCarver 0:6b753f761943 174 res = *it;
JimCarver 0:6b753f761943 175 delete res;
JimCarver 0:6b753f761943 176 _resource_instance_list.erase(pos);
JimCarver 0:6b753f761943 177 set_changed();
JimCarver 0:6b753f761943 178 success = true;
JimCarver 0:6b753f761943 179 break;
JimCarver 0:6b753f761943 180 }
JimCarver 0:6b753f761943 181 }
JimCarver 0:6b753f761943 182 }
JimCarver 0:6b753f761943 183 return success;
JimCarver 0:6b753f761943 184 }
JimCarver 0:6b753f761943 185
JimCarver 0:6b753f761943 186 M2MResourceInstance* M2MResource::resource_instance(uint16_t inst_id) const
JimCarver 0:6b753f761943 187 {
JimCarver 0:6b753f761943 188 tr_debug("M2MResource::resource(resource_name inst_id %d)", inst_id);
JimCarver 0:6b753f761943 189 M2MResourceInstance *res = NULL;
JimCarver 0:6b753f761943 190 if(!_resource_instance_list.empty()) {
JimCarver 0:6b753f761943 191 M2MResourceInstanceList::const_iterator it;
JimCarver 0:6b753f761943 192 it = _resource_instance_list.begin();
JimCarver 0:6b753f761943 193 for ( ; it != _resource_instance_list.end(); it++ ) {
JimCarver 0:6b753f761943 194 if(((*it)->instance_id() == inst_id)) {
JimCarver 0:6b753f761943 195 // Resource found.
JimCarver 0:6b753f761943 196 res = *it;
JimCarver 0:6b753f761943 197 break;
JimCarver 0:6b753f761943 198 }
JimCarver 0:6b753f761943 199 }
JimCarver 0:6b753f761943 200 }
JimCarver 0:6b753f761943 201 return res;
JimCarver 0:6b753f761943 202 }
JimCarver 0:6b753f761943 203
JimCarver 0:6b753f761943 204 const M2MResourceInstanceList& M2MResource::resource_instances() const
JimCarver 0:6b753f761943 205 {
JimCarver 0:6b753f761943 206 return _resource_instance_list;
JimCarver 0:6b753f761943 207 }
JimCarver 0:6b753f761943 208
JimCarver 0:6b753f761943 209 uint16_t M2MResource::resource_instance_count() const
JimCarver 0:6b753f761943 210 {
JimCarver 0:6b753f761943 211 return (uint16_t)_resource_instance_list.size();
JimCarver 0:6b753f761943 212 }
JimCarver 0:6b753f761943 213
JimCarver 0:6b753f761943 214 #ifndef DISABLE_DELAYED_RESPONSE
JimCarver 0:6b753f761943 215 bool M2MResource::delayed_response() const
JimCarver 0:6b753f761943 216 {
JimCarver 0:6b753f761943 217 return _delayed_response;
JimCarver 0:6b753f761943 218 }
JimCarver 0:6b753f761943 219 #endif
JimCarver 0:6b753f761943 220
JimCarver 0:6b753f761943 221 M2MObservationHandler* M2MResource::observation_handler() const
JimCarver 0:6b753f761943 222 {
JimCarver 0:6b753f761943 223 const M2MObjectInstance& parent_object_instance = get_parent_object_instance();
JimCarver 0:6b753f761943 224
JimCarver 0:6b753f761943 225 // XXX: need to check the flag too
JimCarver 0:6b753f761943 226 return parent_object_instance.observation_handler();
JimCarver 0:6b753f761943 227 }
JimCarver 0:6b753f761943 228
JimCarver 0:6b753f761943 229 void M2MResource::set_observation_handler(M2MObservationHandler *handler)
JimCarver 0:6b753f761943 230 {
JimCarver 0:6b753f761943 231 M2MObjectInstance& parent_object_instance = get_parent_object_instance();
JimCarver 0:6b753f761943 232
JimCarver 0:6b753f761943 233 // XXX: need to set the flag too
JimCarver 0:6b753f761943 234 parent_object_instance.set_observation_handler(handler);
JimCarver 0:6b753f761943 235 }
JimCarver 0:6b753f761943 236
JimCarver 0:6b753f761943 237 bool M2MResource::handle_observation_attribute(const char *query)
JimCarver 0:6b753f761943 238 {
JimCarver 0:6b753f761943 239 tr_debug("M2MResource::handle_observation_attribute - is_under_observation(%d)", is_under_observation());
JimCarver 0:6b753f761943 240 bool success = false;
JimCarver 0:6b753f761943 241 M2MReportHandler *handler = M2MBase::report_handler();
JimCarver 0:6b753f761943 242 if (!handler) {
JimCarver 0:6b753f761943 243 handler = M2MBase::create_report_handler();
JimCarver 0:6b753f761943 244 }
JimCarver 0:6b753f761943 245
JimCarver 0:6b753f761943 246 if (handler) {
JimCarver 0:6b753f761943 247 success = handler->parse_notification_attribute(query,
JimCarver 0:6b753f761943 248 M2MBase::base_type(), resource_instance_type());
JimCarver 0:6b753f761943 249 if (success) {
JimCarver 0:6b753f761943 250 if (is_under_observation()) {
JimCarver 0:6b753f761943 251 handler->set_under_observation(true);
JimCarver 0:6b753f761943 252 }
JimCarver 0:6b753f761943 253 }
JimCarver 0:6b753f761943 254 else {
JimCarver 0:6b753f761943 255 handler->set_default_values();
JimCarver 0:6b753f761943 256 }
JimCarver 0:6b753f761943 257
JimCarver 0:6b753f761943 258 if (success) {
JimCarver 0:6b753f761943 259 if(!_resource_instance_list.empty()) {
JimCarver 0:6b753f761943 260 M2MResourceInstanceList::const_iterator it;
JimCarver 0:6b753f761943 261 it = _resource_instance_list.begin();
JimCarver 0:6b753f761943 262 for ( ; it != _resource_instance_list.end(); it++ ) {
JimCarver 0:6b753f761943 263 M2MReportHandler *report_handler = (*it)->report_handler();
JimCarver 0:6b753f761943 264 if(report_handler && is_under_observation()) {
JimCarver 0:6b753f761943 265 report_handler->set_notification_trigger();
JimCarver 0:6b753f761943 266 }
JimCarver 0:6b753f761943 267 }
JimCarver 0:6b753f761943 268 }
JimCarver 0:6b753f761943 269 }
JimCarver 0:6b753f761943 270 }
JimCarver 0:6b753f761943 271 return success;
JimCarver 0:6b753f761943 272 }
JimCarver 0:6b753f761943 273
JimCarver 0:6b753f761943 274 void M2MResource::add_observation_level(M2MBase::Observation observation_level)
JimCarver 0:6b753f761943 275 {
JimCarver 0:6b753f761943 276 M2MBase::add_observation_level(observation_level);
JimCarver 0:6b753f761943 277 if(!_resource_instance_list.empty()) {
JimCarver 0:6b753f761943 278 M2MResourceInstanceList::const_iterator inst;
JimCarver 0:6b753f761943 279 inst = _resource_instance_list.begin();
JimCarver 0:6b753f761943 280 for ( ; inst != _resource_instance_list.end(); inst++ ) {
JimCarver 0:6b753f761943 281 (*inst)->add_observation_level(observation_level);
JimCarver 0:6b753f761943 282 }
JimCarver 0:6b753f761943 283 }
JimCarver 0:6b753f761943 284 }
JimCarver 0:6b753f761943 285
JimCarver 0:6b753f761943 286 void M2MResource::remove_observation_level(M2MBase::Observation observation_level)
JimCarver 0:6b753f761943 287 {
JimCarver 0:6b753f761943 288 M2MBase::remove_observation_level(observation_level);
JimCarver 0:6b753f761943 289 if(!_resource_instance_list.empty()) {
JimCarver 0:6b753f761943 290 M2MResourceInstanceList::const_iterator inst;
JimCarver 0:6b753f761943 291 inst = _resource_instance_list.begin();
JimCarver 0:6b753f761943 292 for ( ; inst != _resource_instance_list.end(); inst++ ) {
JimCarver 0:6b753f761943 293 (*inst)->remove_observation_level(observation_level);
JimCarver 0:6b753f761943 294 }
JimCarver 0:6b753f761943 295 }
JimCarver 0:6b753f761943 296 }
JimCarver 0:6b753f761943 297
JimCarver 0:6b753f761943 298 void M2MResource::add_resource_instance(M2MResourceInstance *res)
JimCarver 0:6b753f761943 299 {
JimCarver 0:6b753f761943 300 tr_debug("M2MResource::add_resource_instance()");
JimCarver 0:6b753f761943 301 if(res) {
JimCarver 0:6b753f761943 302 _resource_instance_list.push_back(res);
JimCarver 0:6b753f761943 303 set_changed();
JimCarver 0:6b753f761943 304 }
JimCarver 0:6b753f761943 305 }
JimCarver 0:6b753f761943 306
JimCarver 0:6b753f761943 307 sn_coap_hdr_s* M2MResource::handle_get_request(nsdl_s *nsdl,
JimCarver 0:6b753f761943 308 sn_coap_hdr_s *received_coap_header,
JimCarver 0:6b753f761943 309 M2MObservationHandler *observation_handler)
JimCarver 0:6b753f761943 310 {
JimCarver 0:6b753f761943 311 tr_info("M2MResource::handle_get_request()");
JimCarver 0:6b753f761943 312 sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CONTENT;
JimCarver 0:6b753f761943 313 sn_coap_hdr_s * coap_response = NULL;
JimCarver 0:6b753f761943 314 if(supports_multiple_instances()) {
JimCarver 0:6b753f761943 315 coap_response = sn_nsdl_build_response(nsdl,
JimCarver 0:6b753f761943 316 received_coap_header,
JimCarver 0:6b753f761943 317 msg_code);
JimCarver 0:6b753f761943 318 if(received_coap_header) {
JimCarver 0:6b753f761943 319 // process the GET if we have registered a callback for it
JimCarver 0:6b753f761943 320 if ((operation() & SN_GRS_GET_ALLOWED) != 0) {
JimCarver 0:6b753f761943 321 if(coap_response) {
JimCarver 0:6b753f761943 322 bool content_type_present = false;
JimCarver 0:6b753f761943 323 bool is_content_type_supported = true;
JimCarver 0:6b753f761943 324
JimCarver 0:6b753f761943 325 if (received_coap_header->options_list_ptr &&
JimCarver 0:6b753f761943 326 received_coap_header->options_list_ptr->accept != COAP_CT_NONE) {
JimCarver 0:6b753f761943 327 content_type_present = true;
JimCarver 0:6b753f761943 328 coap_response->content_format = received_coap_header->options_list_ptr->accept;
JimCarver 0:6b753f761943 329 }
JimCarver 0:6b753f761943 330
JimCarver 0:6b753f761943 331 // Check if preferred content type is supported
JimCarver 0:6b753f761943 332 if (content_type_present) {
JimCarver 0:6b753f761943 333 if (coap_response->content_format != COAP_CONTENT_OMA_TLV_TYPE_OLD &&
JimCarver 0:6b753f761943 334 coap_response->content_format != COAP_CONTENT_OMA_TLV_TYPE) {
JimCarver 0:6b753f761943 335 is_content_type_supported = false;
JimCarver 0:6b753f761943 336 }
JimCarver 0:6b753f761943 337 }
JimCarver 0:6b753f761943 338
JimCarver 0:6b753f761943 339 if (is_content_type_supported) {
JimCarver 0:6b753f761943 340 if(!content_type_present &&
JimCarver 0:6b753f761943 341 (M2MBase::coap_content_type() == COAP_CONTENT_OMA_TLV_TYPE ||
JimCarver 0:6b753f761943 342 M2MBase::coap_content_type() == COAP_CONTENT_OMA_TLV_TYPE_OLD)) {
JimCarver 0:6b753f761943 343 coap_response->content_format = sn_coap_content_format_e(M2MBase::coap_content_type());
JimCarver 0:6b753f761943 344 }
JimCarver 0:6b753f761943 345
JimCarver 0:6b753f761943 346 tr_debug("M2MResource::handle_get_request() - Request Content-type: %d", coap_response->content_format);
JimCarver 0:6b753f761943 347
JimCarver 0:6b753f761943 348 uint8_t *data = NULL;
JimCarver 0:6b753f761943 349 uint32_t data_length = 0;
JimCarver 0:6b753f761943 350 // fill in the CoAP response payload
JimCarver 0:6b753f761943 351 if(COAP_CONTENT_OMA_TLV_TYPE == coap_response->content_format ||
JimCarver 0:6b753f761943 352 COAP_CONTENT_OMA_TLV_TYPE_OLD == coap_response->content_format) {
JimCarver 0:6b753f761943 353 set_coap_content_type(coap_response->content_format);
JimCarver 0:6b753f761943 354 data = M2MTLVSerializer::serialize(this, data_length);
JimCarver 0:6b753f761943 355 }
JimCarver 0:6b753f761943 356
JimCarver 0:6b753f761943 357 coap_response->payload_len = data_length;
JimCarver 0:6b753f761943 358 coap_response->payload_ptr = data;
JimCarver 0:6b753f761943 359
JimCarver 0:6b753f761943 360 coap_response->options_list_ptr = sn_nsdl_alloc_options_list(nsdl, coap_response);
JimCarver 0:6b753f761943 361 if (coap_response->options_list_ptr) {
JimCarver 0:6b753f761943 362 coap_response->options_list_ptr->max_age = max_age();
JimCarver 0:6b753f761943 363 }
JimCarver 0:6b753f761943 364
JimCarver 0:6b753f761943 365 if(received_coap_header->options_list_ptr) {
JimCarver 0:6b753f761943 366 if(received_coap_header->options_list_ptr->observe != -1) {
JimCarver 0:6b753f761943 367 if (is_observable()) {
JimCarver 0:6b753f761943 368 uint32_t number = 0;
JimCarver 0:6b753f761943 369 uint8_t observe_option = 0;
JimCarver 0:6b753f761943 370 observe_option = received_coap_header->options_list_ptr->observe;
JimCarver 0:6b753f761943 371 if(START_OBSERVATION == observe_option) {
JimCarver 0:6b753f761943 372 // If the observe length is 0 means register for observation.
JimCarver 0:6b753f761943 373 if(received_coap_header->options_list_ptr->observe != -1) {
JimCarver 0:6b753f761943 374 number = received_coap_header->options_list_ptr->observe;
JimCarver 0:6b753f761943 375 }
JimCarver 0:6b753f761943 376
JimCarver 0:6b753f761943 377 // If the observe value is 0 means register for observation.
JimCarver 0:6b753f761943 378 if(number == 0) {
JimCarver 0:6b753f761943 379 tr_info("M2MResource::handle_get_request - put resource under observation");
JimCarver 0:6b753f761943 380 M2MResourceInstanceList::const_iterator it;
JimCarver 0:6b753f761943 381 it = _resource_instance_list.begin();
JimCarver 0:6b753f761943 382 for (; it!=_resource_instance_list.end(); it++ ) {
JimCarver 0:6b753f761943 383 (*it)->add_observation_level(M2MBase::R_Attribute);
JimCarver 0:6b753f761943 384 }
JimCarver 0:6b753f761943 385 set_under_observation(true,observation_handler);
JimCarver 0:6b753f761943 386 M2MBase::add_observation_level(M2MBase::R_Attribute);
JimCarver 0:6b753f761943 387 send_notification_delivery_status(*this, NOTIFICATION_STATUS_SUBSCRIBED);
JimCarver 0:6b753f761943 388 if (coap_response->options_list_ptr) {
JimCarver 0:6b753f761943 389 coap_response->options_list_ptr->observe = observation_number();
JimCarver 0:6b753f761943 390 }
JimCarver 0:6b753f761943 391 }
JimCarver 0:6b753f761943 392
JimCarver 0:6b753f761943 393 if(received_coap_header->token_ptr) {
JimCarver 0:6b753f761943 394 set_observation_token(received_coap_header->token_ptr,
JimCarver 0:6b753f761943 395 received_coap_header->token_len);
JimCarver 0:6b753f761943 396 }
JimCarver 0:6b753f761943 397
JimCarver 0:6b753f761943 398 } else if (STOP_OBSERVATION == observe_option) {
JimCarver 0:6b753f761943 399 tr_info("M2MResource::handle_get_request - stops observation");
JimCarver 0:6b753f761943 400 set_under_observation(false,NULL);
JimCarver 0:6b753f761943 401 M2MBase::remove_observation_level(M2MBase::R_Attribute);
JimCarver 0:6b753f761943 402 send_notification_delivery_status(*this,NOTIFICATION_STATUS_UNSUBSCRIBED);
JimCarver 0:6b753f761943 403 M2MResourceInstanceList::const_iterator it;
JimCarver 0:6b753f761943 404 it = _resource_instance_list.begin();
JimCarver 0:6b753f761943 405 for (; it!=_resource_instance_list.end(); it++ ) {
JimCarver 0:6b753f761943 406 (*it)->remove_observation_level(M2MBase::R_Attribute);
JimCarver 0:6b753f761943 407 }
JimCarver 0:6b753f761943 408 }
JimCarver 0:6b753f761943 409 msg_code = COAP_MSG_CODE_RESPONSE_CONTENT;
JimCarver 0:6b753f761943 410 } else {
JimCarver 0:6b753f761943 411 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
JimCarver 0:6b753f761943 412 }
JimCarver 0:6b753f761943 413 }
JimCarver 0:6b753f761943 414 }
JimCarver 0:6b753f761943 415 } else {
JimCarver 0:6b753f761943 416 tr_error("M2MResource::handle_get_request() - Content-Type %d not supported", coap_response->content_format);
JimCarver 0:6b753f761943 417 msg_code = COAP_MSG_CODE_RESPONSE_NOT_ACCEPTABLE;
JimCarver 0:6b753f761943 418 }
JimCarver 0:6b753f761943 419 }
JimCarver 0:6b753f761943 420 } else {
JimCarver 0:6b753f761943 421 tr_error("M2MResource::handle_get_request - Return COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED");
JimCarver 0:6b753f761943 422 // Operation is not allowed.
JimCarver 0:6b753f761943 423 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
JimCarver 0:6b753f761943 424 }
JimCarver 0:6b753f761943 425 }
JimCarver 0:6b753f761943 426 if(coap_response) {
JimCarver 0:6b753f761943 427 coap_response->msg_code = msg_code;
JimCarver 0:6b753f761943 428 }
JimCarver 0:6b753f761943 429 } else {
JimCarver 0:6b753f761943 430 coap_response = M2MResourceBase::handle_get_request(nsdl,
JimCarver 0:6b753f761943 431 received_coap_header,
JimCarver 0:6b753f761943 432 observation_handler);
JimCarver 0:6b753f761943 433 }
JimCarver 0:6b753f761943 434 return coap_response;
JimCarver 0:6b753f761943 435 }
JimCarver 0:6b753f761943 436
JimCarver 0:6b753f761943 437 sn_coap_hdr_s* M2MResource::handle_put_request(nsdl_s *nsdl,
JimCarver 0:6b753f761943 438 sn_coap_hdr_s *received_coap_header,
JimCarver 0:6b753f761943 439 M2MObservationHandler *observation_handler,
JimCarver 0:6b753f761943 440 bool &execute_value_updated)
JimCarver 0:6b753f761943 441 {
JimCarver 0:6b753f761943 442 tr_info("M2MResource::handle_put_request()");
JimCarver 0:6b753f761943 443 sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; // 2.04
JimCarver 0:6b753f761943 444 sn_coap_hdr_s * coap_response = NULL;
JimCarver 0:6b753f761943 445 if(supports_multiple_instances()) {
JimCarver 0:6b753f761943 446 coap_response = sn_nsdl_build_response(nsdl,
JimCarver 0:6b753f761943 447 received_coap_header,
JimCarver 0:6b753f761943 448 msg_code);
JimCarver 0:6b753f761943 449 // process the PUT if we have registered a callback for it
JimCarver 0:6b753f761943 450 if(received_coap_header) {
JimCarver 0:6b753f761943 451 uint16_t coap_content_type = 0;
JimCarver 0:6b753f761943 452 bool content_type_present = false;
JimCarver 0:6b753f761943 453 if(received_coap_header->content_format != COAP_CT_NONE && coap_response) {
JimCarver 0:6b753f761943 454 content_type_present = true;
JimCarver 0:6b753f761943 455 coap_content_type = received_coap_header->content_format;
JimCarver 0:6b753f761943 456 }
JimCarver 0:6b753f761943 457 if(received_coap_header->options_list_ptr &&
JimCarver 0:6b753f761943 458 received_coap_header->options_list_ptr->uri_query_ptr) {
JimCarver 0:6b753f761943 459 char *query = (char*)alloc_string_copy(received_coap_header->options_list_ptr->uri_query_ptr,
JimCarver 0:6b753f761943 460 received_coap_header->options_list_ptr->uri_query_len);
JimCarver 0:6b753f761943 461 if (query){
JimCarver 0:6b753f761943 462 msg_code = COAP_MSG_CODE_RESPONSE_CHANGED;
JimCarver 0:6b753f761943 463 tr_info("M2MResource::handle_put_request() - query %s", query);
JimCarver 0:6b753f761943 464 // if anything was updated, re-initialize the stored notification attributes
JimCarver 0:6b753f761943 465 if (!handle_observation_attribute(query)){
JimCarver 0:6b753f761943 466 tr_debug("M2MResource::handle_put_request() - Invalid query");
JimCarver 0:6b753f761943 467 msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; // 4.00
JimCarver 0:6b753f761943 468 }
JimCarver 0:6b753f761943 469 free(query);
JimCarver 0:6b753f761943 470 }
JimCarver 0:6b753f761943 471 } else if ((operation() & SN_GRS_PUT_ALLOWED) != 0) {
JimCarver 0:6b753f761943 472 if(!content_type_present &&
JimCarver 0:6b753f761943 473 (M2MBase::coap_content_type() == COAP_CONTENT_OMA_TLV_TYPE ||
JimCarver 0:6b753f761943 474 M2MBase::coap_content_type() == COAP_CONTENT_OMA_TLV_TYPE_OLD)) {
JimCarver 0:6b753f761943 475 coap_content_type = COAP_CONTENT_OMA_TLV_TYPE;
JimCarver 0:6b753f761943 476 }
JimCarver 0:6b753f761943 477
JimCarver 0:6b753f761943 478 tr_debug("M2MResource::handle_put_request() - Request Content-type: %d", coap_content_type);
JimCarver 0:6b753f761943 479
JimCarver 0:6b753f761943 480 if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type ||
JimCarver 0:6b753f761943 481 COAP_CONTENT_OMA_TLV_TYPE_OLD == coap_content_type) {
JimCarver 0:6b753f761943 482 set_coap_content_type(coap_content_type);
JimCarver 0:6b753f761943 483 M2MTLVDeserializer::Error error = M2MTLVDeserializer::None;
JimCarver 0:6b753f761943 484 error = M2MTLVDeserializer::deserialize_resource_instances(received_coap_header->payload_ptr,
JimCarver 0:6b753f761943 485 received_coap_header->payload_len,
JimCarver 0:6b753f761943 486 *this,
JimCarver 0:6b753f761943 487 M2MTLVDeserializer::Put);
JimCarver 0:6b753f761943 488 switch(error) {
JimCarver 0:6b753f761943 489 case M2MTLVDeserializer::None:
JimCarver 0:6b753f761943 490 if(observation_handler) {
JimCarver 0:6b753f761943 491 String value = "";
JimCarver 0:6b753f761943 492 if (received_coap_header->uri_path_ptr != NULL &&
JimCarver 0:6b753f761943 493 received_coap_header->uri_path_len > 0) {
JimCarver 0:6b753f761943 494
JimCarver 0:6b753f761943 495 value.append_raw((char*)received_coap_header->uri_path_ptr,received_coap_header->uri_path_len);
JimCarver 0:6b753f761943 496 }
JimCarver 0:6b753f761943 497 execute_value_updated = true;
JimCarver 0:6b753f761943 498 }
JimCarver 0:6b753f761943 499 msg_code = COAP_MSG_CODE_RESPONSE_CHANGED;
JimCarver 0:6b753f761943 500 break;
JimCarver 0:6b753f761943 501 case M2MTLVDeserializer::NotFound:
JimCarver 0:6b753f761943 502 msg_code = COAP_MSG_CODE_RESPONSE_NOT_FOUND;
JimCarver 0:6b753f761943 503 break;
JimCarver 0:6b753f761943 504 case M2MTLVDeserializer::NotAllowed:
JimCarver 0:6b753f761943 505 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
JimCarver 0:6b753f761943 506 break;
JimCarver 0:6b753f761943 507 case M2MTLVDeserializer::NotValid:
JimCarver 0:6b753f761943 508 msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST;
JimCarver 0:6b753f761943 509 break;
JimCarver 0:6b753f761943 510 case M2MTLVDeserializer::OutOfMemory:
JimCarver 0:6b753f761943 511 msg_code = COAP_MSG_CODE_RESPONSE_REQUEST_ENTITY_TOO_LARGE;
JimCarver 0:6b753f761943 512 break;
JimCarver 0:6b753f761943 513 }
JimCarver 0:6b753f761943 514 } else {
JimCarver 0:6b753f761943 515 msg_code =COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT;
JimCarver 0:6b753f761943 516 } // if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type)
JimCarver 0:6b753f761943 517 } else {
JimCarver 0:6b753f761943 518 // Operation is not allowed.
JimCarver 0:6b753f761943 519 tr_error("M2MResource::handle_put_request() - COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED");
JimCarver 0:6b753f761943 520 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
JimCarver 0:6b753f761943 521 }
JimCarver 0:6b753f761943 522 } else {
JimCarver 0:6b753f761943 523 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
JimCarver 0:6b753f761943 524 }
JimCarver 0:6b753f761943 525 if(coap_response) {
JimCarver 0:6b753f761943 526 coap_response->msg_code = msg_code;
JimCarver 0:6b753f761943 527 }
JimCarver 0:6b753f761943 528 } else {
JimCarver 0:6b753f761943 529 coap_response = M2MResourceBase::handle_put_request(nsdl,
JimCarver 0:6b753f761943 530 received_coap_header,
JimCarver 0:6b753f761943 531 observation_handler,
JimCarver 0:6b753f761943 532 execute_value_updated);
JimCarver 0:6b753f761943 533 }
JimCarver 0:6b753f761943 534 return coap_response;
JimCarver 0:6b753f761943 535 }
JimCarver 0:6b753f761943 536
JimCarver 0:6b753f761943 537
JimCarver 0:6b753f761943 538 sn_coap_hdr_s* M2MResource::handle_post_request(nsdl_s *nsdl,
JimCarver 0:6b753f761943 539 sn_coap_hdr_s *received_coap_header,
JimCarver 0:6b753f761943 540 M2MObservationHandler */*observation_handler*/,
JimCarver 0:6b753f761943 541 bool &/*execute_value_updated*/,
JimCarver 0:6b753f761943 542 sn_nsdl_addr_s *address)
JimCarver 0:6b753f761943 543 {
JimCarver 0:6b753f761943 544 tr_info("M2MResource::handle_post_request()");
JimCarver 0:6b753f761943 545 sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; // 2.04
JimCarver 0:6b753f761943 546 sn_coap_hdr_s * coap_response = sn_nsdl_build_response(nsdl,
JimCarver 0:6b753f761943 547 received_coap_header,
JimCarver 0:6b753f761943 548 msg_code);
JimCarver 0:6b753f761943 549
JimCarver 0:6b753f761943 550 // process the POST if we have registered a callback for it
JimCarver 0:6b753f761943 551 if(received_coap_header) {
JimCarver 0:6b753f761943 552 if ((operation() & SN_GRS_POST_ALLOWED) != 0) {
JimCarver 0:6b753f761943 553 M2MResource::M2MExecuteParameter exec_params(object_name(), name(), object_instance_id());
JimCarver 0:6b753f761943 554
JimCarver 0:6b753f761943 555 uint16_t coap_content_type = 0;
JimCarver 0:6b753f761943 556 if(received_coap_header->payload_ptr) {
JimCarver 0:6b753f761943 557 if(received_coap_header->content_format != COAP_CT_NONE) {
JimCarver 0:6b753f761943 558 coap_content_type = received_coap_header->content_format;
JimCarver 0:6b753f761943 559 }
JimCarver 0:6b753f761943 560
JimCarver 0:6b753f761943 561 if(coap_content_type == COAP_CT_TEXT_PLAIN) {
JimCarver 0:6b753f761943 562 exec_params._value = received_coap_header->payload_ptr;
JimCarver 0:6b753f761943 563 if (exec_params._value) {
JimCarver 0:6b753f761943 564 exec_params._value_length = received_coap_header->payload_len;
JimCarver 0:6b753f761943 565 }
JimCarver 0:6b753f761943 566 } else {
JimCarver 0:6b753f761943 567 msg_code = COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT;
JimCarver 0:6b753f761943 568 }
JimCarver 0:6b753f761943 569 }
JimCarver 0:6b753f761943 570 if(COAP_MSG_CODE_RESPONSE_CHANGED == msg_code) {
JimCarver 0:6b753f761943 571 tr_debug("M2MResource::handle_post_request - Execute resource function");
JimCarver 0:6b753f761943 572 #ifndef DISABLE_DELAYED_RESPONSE
JimCarver 0:6b753f761943 573 if (coap_response) {
JimCarver 0:6b753f761943 574 if(_delayed_response) {
JimCarver 0:6b753f761943 575 if(received_coap_header->token_len) {
JimCarver 0:6b753f761943 576 free(_delayed_token);
JimCarver 0:6b753f761943 577 _delayed_token = NULL;
JimCarver 0:6b753f761943 578 _delayed_token_len = 0;
JimCarver 0:6b753f761943 579 _delayed_token = alloc_copy(received_coap_header->token_ptr, received_coap_header->token_len);
JimCarver 0:6b753f761943 580 if(_delayed_token) {
JimCarver 0:6b753f761943 581 _delayed_token_len = received_coap_header->token_len;
JimCarver 0:6b753f761943 582 }
JimCarver 0:6b753f761943 583 }
JimCarver 0:6b753f761943 584 } else {
JimCarver 0:6b753f761943 585 #endif
JimCarver 0:6b753f761943 586 uint32_t length = 0;
JimCarver 0:6b753f761943 587 get_value(coap_response->payload_ptr, length);
JimCarver 0:6b753f761943 588 coap_response->payload_len = length;
JimCarver 0:6b753f761943 589 #ifndef DISABLE_DELAYED_RESPONSE
JimCarver 0:6b753f761943 590 }
JimCarver 0:6b753f761943 591 }
JimCarver 0:6b753f761943 592 #endif
JimCarver 0:6b753f761943 593 execute(&exec_params);
JimCarver 0:6b753f761943 594 }
JimCarver 0:6b753f761943 595
JimCarver 0:6b753f761943 596 } else { // if ((object->operation() & SN_GRS_POST_ALLOWED) != 0)
JimCarver 0:6b753f761943 597 tr_error("M2MResource::handle_post_request - COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED");
JimCarver 0:6b753f761943 598 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; // 4.05
JimCarver 0:6b753f761943 599 }
JimCarver 0:6b753f761943 600 } else { //if(object && received_coap_header)
JimCarver 0:6b753f761943 601 tr_error("M2MResource::handle_post_request - COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED");
JimCarver 0:6b753f761943 602 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; // 4.01
JimCarver 0:6b753f761943 603 }
JimCarver 0:6b753f761943 604 if(coap_response) {
JimCarver 0:6b753f761943 605 coap_response->msg_code = msg_code;
JimCarver 0:6b753f761943 606 }
JimCarver 0:6b753f761943 607 return coap_response;
JimCarver 0:6b753f761943 608 }
JimCarver 0:6b753f761943 609
JimCarver 0:6b753f761943 610 M2MBase *M2MResource::get_parent() const
JimCarver 0:6b753f761943 611 {
JimCarver 0:6b753f761943 612 return (M2MBase *) &get_parent_object_instance();
JimCarver 0:6b753f761943 613 }
JimCarver 0:6b753f761943 614
JimCarver 0:6b753f761943 615 M2MObjectInstance& M2MResource::get_parent_object_instance() const
JimCarver 0:6b753f761943 616 {
JimCarver 0:6b753f761943 617 return _parent;
JimCarver 0:6b753f761943 618 }
JimCarver 0:6b753f761943 619
JimCarver 0:6b753f761943 620 uint16_t M2MResource::object_instance_id() const
JimCarver 0:6b753f761943 621 {
JimCarver 0:6b753f761943 622 const M2MObjectInstance& parent_object_instance = get_parent_object_instance();
JimCarver 0:6b753f761943 623 return parent_object_instance.instance_id();
JimCarver 0:6b753f761943 624 }
JimCarver 0:6b753f761943 625
JimCarver 0:6b753f761943 626 M2MResource& M2MResource::get_parent_resource() const
JimCarver 0:6b753f761943 627 {
JimCarver 0:6b753f761943 628 return (M2MResource&)*this;
JimCarver 0:6b753f761943 629 }
JimCarver 0:6b753f761943 630
JimCarver 0:6b753f761943 631 const char* M2MResource::object_name() const
JimCarver 0:6b753f761943 632 {
JimCarver 0:6b753f761943 633 const M2MObjectInstance& parent_object_instance = _parent;
JimCarver 0:6b753f761943 634 const M2MObject& parent_object = parent_object_instance.get_parent_object();
JimCarver 0:6b753f761943 635
JimCarver 0:6b753f761943 636 return parent_object.name();
JimCarver 0:6b753f761943 637 }
JimCarver 0:6b753f761943 638
JimCarver 0:6b753f761943 639 #ifdef MEMORY_OPTIMIZED_API
JimCarver 0:6b753f761943 640 M2MResource::M2MExecuteParameter::M2MExecuteParameter(const char *object_name, const char *resource_name,
JimCarver 0:6b753f761943 641 uint16_t object_instance_id) :
JimCarver 0:6b753f761943 642 _object_name(object_name),
JimCarver 0:6b753f761943 643 _resource_name(resource_name),
JimCarver 0:6b753f761943 644 _value(NULL),
JimCarver 0:6b753f761943 645 _value_length(0),
JimCarver 0:6b753f761943 646 _object_instance_id(object_instance_id)
JimCarver 0:6b753f761943 647 {
JimCarver 0:6b753f761943 648 }
JimCarver 0:6b753f761943 649 #else
JimCarver 0:6b753f761943 650 M2MResource::M2MExecuteParameter::M2MExecuteParameter(const String &object_name, const String &resource_name,
JimCarver 0:6b753f761943 651 uint16_t object_instance_id) :
JimCarver 0:6b753f761943 652 _object_name(object_name),
JimCarver 0:6b753f761943 653 _resource_name(resource_name),
JimCarver 0:6b753f761943 654 _value(NULL),
JimCarver 0:6b753f761943 655 _value_length(0),
JimCarver 0:6b753f761943 656 _object_instance_id(object_instance_id)
JimCarver 0:6b753f761943 657 {
JimCarver 0:6b753f761943 658 }
JimCarver 0:6b753f761943 659 #endif
JimCarver 0:6b753f761943 660
JimCarver 0:6b753f761943 661 // These could be actually changed to be inline ones, as it would likely generate
JimCarver 0:6b753f761943 662 // smaller code at application side.
JimCarver 0:6b753f761943 663
JimCarver 0:6b753f761943 664 const uint8_t *M2MResource::M2MExecuteParameter::get_argument_value() const
JimCarver 0:6b753f761943 665 {
JimCarver 0:6b753f761943 666 return _value;
JimCarver 0:6b753f761943 667 }
JimCarver 0:6b753f761943 668
JimCarver 0:6b753f761943 669 uint16_t M2MResource::M2MExecuteParameter::get_argument_value_length() const
JimCarver 0:6b753f761943 670 {
JimCarver 0:6b753f761943 671 return _value_length;
JimCarver 0:6b753f761943 672 }
JimCarver 0:6b753f761943 673
JimCarver 0:6b753f761943 674 #ifdef MEMORY_OPTIMIZED_API
JimCarver 0:6b753f761943 675 const char* M2MResource::M2MExecuteParameter::get_argument_object_name() const
JimCarver 0:6b753f761943 676 {
JimCarver 0:6b753f761943 677 return _object_name;
JimCarver 0:6b753f761943 678 }
JimCarver 0:6b753f761943 679
JimCarver 0:6b753f761943 680 const char* M2MResource::M2MExecuteParameter::get_argument_resource_name() const
JimCarver 0:6b753f761943 681 {
JimCarver 0:6b753f761943 682 return _resource_name;
JimCarver 0:6b753f761943 683 }
JimCarver 0:6b753f761943 684 #else
JimCarver 0:6b753f761943 685 const String& M2MResource::M2MExecuteParameter::get_argument_object_name() const
JimCarver 0:6b753f761943 686 {
JimCarver 0:6b753f761943 687 return _object_name;
JimCarver 0:6b753f761943 688 }
JimCarver 0:6b753f761943 689
JimCarver 0:6b753f761943 690 const String& M2MResource::M2MExecuteParameter::get_argument_resource_name() const
JimCarver 0:6b753f761943 691 {
JimCarver 0:6b753f761943 692 return _resource_name;
JimCarver 0:6b753f761943 693 }
JimCarver 0:6b753f761943 694 #endif
JimCarver 0:6b753f761943 695
JimCarver 0:6b753f761943 696 uint16_t M2MResource::M2MExecuteParameter::get_argument_object_instance_id() const
JimCarver 0:6b753f761943 697 {
JimCarver 0:6b753f761943 698 return _object_instance_id;
JimCarver 0:6b753f761943 699 }