Donald Meyers / Mbed OS evan
Committer:
djmeyers
Date:
Sat Mar 18 22:37:16 2017 +0000
Revision:
0:06ee5f8a484a
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
djmeyers 0:06ee5f8a484a 1 /*
djmeyers 0:06ee5f8a484a 2 * Copyright (c) 2015 ARM Limited. All rights reserved.
djmeyers 0:06ee5f8a484a 3 * SPDX-License-Identifier: Apache-2.0
djmeyers 0:06ee5f8a484a 4 * Licensed under the Apache License, Version 2.0 (the License); you may
djmeyers 0:06ee5f8a484a 5 * not use this file except in compliance with the License.
djmeyers 0:06ee5f8a484a 6 * You may obtain a copy of the License at
djmeyers 0:06ee5f8a484a 7 *
djmeyers 0:06ee5f8a484a 8 * http://www.apache.org/licenses/LICENSE-2.0
djmeyers 0:06ee5f8a484a 9 *
djmeyers 0:06ee5f8a484a 10 * Unless required by applicable law or agreed to in writing, software
djmeyers 0:06ee5f8a484a 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
djmeyers 0:06ee5f8a484a 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
djmeyers 0:06ee5f8a484a 13 * See the License for the specific language governing permissions and
djmeyers 0:06ee5f8a484a 14 * limitations under the License.
djmeyers 0:06ee5f8a484a 15 */
djmeyers 0:06ee5f8a484a 16 #include "mbed-client/m2mconstants.h"
djmeyers 0:06ee5f8a484a 17 #include "mbed-client/m2mresource.h"
djmeyers 0:06ee5f8a484a 18 #include "mbed-client/m2mobservationhandler.h"
djmeyers 0:06ee5f8a484a 19 #include "include/m2mreporthandler.h"
djmeyers 0:06ee5f8a484a 20 #include "include/m2mtlvserializer.h"
djmeyers 0:06ee5f8a484a 21 #include "include/m2mtlvdeserializer.h"
djmeyers 0:06ee5f8a484a 22 #include "mbed-trace/mbed_trace.h"
djmeyers 0:06ee5f8a484a 23
djmeyers 0:06ee5f8a484a 24 #include <stdlib.h>
djmeyers 0:06ee5f8a484a 25
djmeyers 0:06ee5f8a484a 26 #define TRACE_GROUP "mClt"
djmeyers 0:06ee5f8a484a 27
djmeyers 0:06ee5f8a484a 28 M2MResource::M2MResource(M2MObjectInstance &parent,
djmeyers 0:06ee5f8a484a 29 const String &resource_name,
djmeyers 0:06ee5f8a484a 30 const String &resource_type,
djmeyers 0:06ee5f8a484a 31 M2MResourceInstance::ResourceType type,
djmeyers 0:06ee5f8a484a 32 const uint8_t *value,
djmeyers 0:06ee5f8a484a 33 const uint8_t value_length,
djmeyers 0:06ee5f8a484a 34 char *path,
djmeyers 0:06ee5f8a484a 35 const uint16_t object_instance_id,
djmeyers 0:06ee5f8a484a 36 bool multiple_instance,
djmeyers 0:06ee5f8a484a 37 bool external_blockwise_store)
djmeyers 0:06ee5f8a484a 38 : M2MResourceInstance(*this, resource_name, resource_type, type, value, value_length,
djmeyers 0:06ee5f8a484a 39 object_instance_id,
djmeyers 0:06ee5f8a484a 40 path, external_blockwise_store),
djmeyers 0:06ee5f8a484a 41 _parent(parent),
djmeyers 0:06ee5f8a484a 42 _delayed_token(NULL),
djmeyers 0:06ee5f8a484a 43 _delayed_token_len(0),
djmeyers 0:06ee5f8a484a 44 _has_multiple_instances(multiple_instance),
djmeyers 0:06ee5f8a484a 45 _delayed_response(false)
djmeyers 0:06ee5f8a484a 46 {
djmeyers 0:06ee5f8a484a 47 M2MBase::set_base_type(M2MBase::Resource);
djmeyers 0:06ee5f8a484a 48 M2MBase::set_operation(M2MBase::GET_ALLOWED);
djmeyers 0:06ee5f8a484a 49 M2MBase::set_observable(false);
djmeyers 0:06ee5f8a484a 50
djmeyers 0:06ee5f8a484a 51 }
djmeyers 0:06ee5f8a484a 52
djmeyers 0:06ee5f8a484a 53 M2MResource::M2MResource(M2MObjectInstance &parent,
djmeyers 0:06ee5f8a484a 54 const lwm2m_parameters_s* s,
djmeyers 0:06ee5f8a484a 55 M2MResourceInstance::ResourceType type,
djmeyers 0:06ee5f8a484a 56 const uint16_t object_instance_id)
djmeyers 0:06ee5f8a484a 57 : M2MResourceInstance(*this, s, type, object_instance_id),
djmeyers 0:06ee5f8a484a 58 _parent(parent),
djmeyers 0:06ee5f8a484a 59 _delayed_token(NULL),
djmeyers 0:06ee5f8a484a 60 _delayed_token_len(0),
djmeyers 0:06ee5f8a484a 61 _has_multiple_instances(false),
djmeyers 0:06ee5f8a484a 62 _delayed_response(false)
djmeyers 0:06ee5f8a484a 63 {
djmeyers 0:06ee5f8a484a 64 // tbd: _has_multiple_instances could be in flash, but no real benefit, because of current alignment.
djmeyers 0:06ee5f8a484a 65 }
djmeyers 0:06ee5f8a484a 66
djmeyers 0:06ee5f8a484a 67 M2MResource::M2MResource(M2MObjectInstance &parent,
djmeyers 0:06ee5f8a484a 68 const String &resource_name,
djmeyers 0:06ee5f8a484a 69 const String &resource_type,
djmeyers 0:06ee5f8a484a 70 M2MResourceInstance::ResourceType type,
djmeyers 0:06ee5f8a484a 71 bool observable,
djmeyers 0:06ee5f8a484a 72 char *path,
djmeyers 0:06ee5f8a484a 73 const uint16_t object_instance_id,
djmeyers 0:06ee5f8a484a 74 bool multiple_instance,
djmeyers 0:06ee5f8a484a 75 bool external_blockwise_store)
djmeyers 0:06ee5f8a484a 76 : M2MResourceInstance(*this, resource_name, resource_type, type,
djmeyers 0:06ee5f8a484a 77 object_instance_id,
djmeyers 0:06ee5f8a484a 78 path,
djmeyers 0:06ee5f8a484a 79 external_blockwise_store),
djmeyers 0:06ee5f8a484a 80 _parent(parent),
djmeyers 0:06ee5f8a484a 81 _delayed_token(NULL),
djmeyers 0:06ee5f8a484a 82 _delayed_token_len(0),
djmeyers 0:06ee5f8a484a 83 _has_multiple_instances(multiple_instance),
djmeyers 0:06ee5f8a484a 84 _delayed_response(false)
djmeyers 0:06ee5f8a484a 85 {
djmeyers 0:06ee5f8a484a 86 M2MBase::set_base_type(M2MBase::Resource);
djmeyers 0:06ee5f8a484a 87 M2MBase::set_operation(M2MBase::GET_PUT_ALLOWED);
djmeyers 0:06ee5f8a484a 88 M2MBase::set_observable(observable);
djmeyers 0:06ee5f8a484a 89 }
djmeyers 0:06ee5f8a484a 90
djmeyers 0:06ee5f8a484a 91
djmeyers 0:06ee5f8a484a 92 M2MResource::~M2MResource()
djmeyers 0:06ee5f8a484a 93 {
djmeyers 0:06ee5f8a484a 94 if(!_resource_instance_list.empty()) {
djmeyers 0:06ee5f8a484a 95 M2MResourceInstance* res = NULL;
djmeyers 0:06ee5f8a484a 96 M2MResourceInstanceList::const_iterator it;
djmeyers 0:06ee5f8a484a 97 it = _resource_instance_list.begin();
djmeyers 0:06ee5f8a484a 98 for (; it!=_resource_instance_list.end(); it++ ) {
djmeyers 0:06ee5f8a484a 99 //Free allocated memory for resources.
djmeyers 0:06ee5f8a484a 100 res = *it;
djmeyers 0:06ee5f8a484a 101 delete res;
djmeyers 0:06ee5f8a484a 102 }
djmeyers 0:06ee5f8a484a 103 _resource_instance_list.clear();
djmeyers 0:06ee5f8a484a 104 }
djmeyers 0:06ee5f8a484a 105 free(_delayed_token);
djmeyers 0:06ee5f8a484a 106 }
djmeyers 0:06ee5f8a484a 107
djmeyers 0:06ee5f8a484a 108 bool M2MResource::supports_multiple_instances() const
djmeyers 0:06ee5f8a484a 109 {
djmeyers 0:06ee5f8a484a 110 return _has_multiple_instances;
djmeyers 0:06ee5f8a484a 111 }
djmeyers 0:06ee5f8a484a 112
djmeyers 0:06ee5f8a484a 113 void M2MResource::set_delayed_response(bool delayed_response)
djmeyers 0:06ee5f8a484a 114 {
djmeyers 0:06ee5f8a484a 115 _delayed_response = delayed_response;
djmeyers 0:06ee5f8a484a 116 }
djmeyers 0:06ee5f8a484a 117
djmeyers 0:06ee5f8a484a 118 bool M2MResource::send_delayed_post_response()
djmeyers 0:06ee5f8a484a 119 {
djmeyers 0:06ee5f8a484a 120 bool success = false;
djmeyers 0:06ee5f8a484a 121 if(_delayed_response) {
djmeyers 0:06ee5f8a484a 122 success = true;
djmeyers 0:06ee5f8a484a 123 observation_handler()->send_delayed_response(this);
djmeyers 0:06ee5f8a484a 124 }
djmeyers 0:06ee5f8a484a 125 return success;
djmeyers 0:06ee5f8a484a 126 }
djmeyers 0:06ee5f8a484a 127
djmeyers 0:06ee5f8a484a 128 void M2MResource::get_delayed_token(uint8_t *&token, uint8_t &token_length)
djmeyers 0:06ee5f8a484a 129 {
djmeyers 0:06ee5f8a484a 130 token_length = 0;
djmeyers 0:06ee5f8a484a 131 if(token) {
djmeyers 0:06ee5f8a484a 132 free(token);
djmeyers 0:06ee5f8a484a 133 token = NULL;
djmeyers 0:06ee5f8a484a 134 }
djmeyers 0:06ee5f8a484a 135 if(_delayed_token && _delayed_token_len > 0) {
djmeyers 0:06ee5f8a484a 136 token = alloc_copy(_delayed_token, _delayed_token_len);
djmeyers 0:06ee5f8a484a 137 if(token) {
djmeyers 0:06ee5f8a484a 138 token_length = _delayed_token_len;
djmeyers 0:06ee5f8a484a 139 }
djmeyers 0:06ee5f8a484a 140 }
djmeyers 0:06ee5f8a484a 141 }
djmeyers 0:06ee5f8a484a 142
djmeyers 0:06ee5f8a484a 143 bool M2MResource::remove_resource_instance(uint16_t inst_id)
djmeyers 0:06ee5f8a484a 144 {
djmeyers 0:06ee5f8a484a 145 tr_debug("M2MResource::remove_resource(inst_id %d)", inst_id);
djmeyers 0:06ee5f8a484a 146 bool success = false;
djmeyers 0:06ee5f8a484a 147 if(!_resource_instance_list.empty()) {
djmeyers 0:06ee5f8a484a 148 M2MResourceInstance* res = NULL;
djmeyers 0:06ee5f8a484a 149 M2MResourceInstanceList::const_iterator it;
djmeyers 0:06ee5f8a484a 150 it = _resource_instance_list.begin();
djmeyers 0:06ee5f8a484a 151 int pos = 0;
djmeyers 0:06ee5f8a484a 152 for ( ; it != _resource_instance_list.end(); it++, pos++ ) {
djmeyers 0:06ee5f8a484a 153 if(((*it)->instance_id() == inst_id)) {
djmeyers 0:06ee5f8a484a 154 // Resource found and deleted.
djmeyers 0:06ee5f8a484a 155 res = *it;
djmeyers 0:06ee5f8a484a 156 delete res;
djmeyers 0:06ee5f8a484a 157 _resource_instance_list.erase(pos);
djmeyers 0:06ee5f8a484a 158 success = true;
djmeyers 0:06ee5f8a484a 159 break;
djmeyers 0:06ee5f8a484a 160 }
djmeyers 0:06ee5f8a484a 161 }
djmeyers 0:06ee5f8a484a 162 }
djmeyers 0:06ee5f8a484a 163 return success;
djmeyers 0:06ee5f8a484a 164 }
djmeyers 0:06ee5f8a484a 165
djmeyers 0:06ee5f8a484a 166 M2MResourceInstance* M2MResource::resource_instance(uint16_t inst_id) const
djmeyers 0:06ee5f8a484a 167 {
djmeyers 0:06ee5f8a484a 168 tr_debug("M2MResource::resource(resource_name inst_id %d)", inst_id);
djmeyers 0:06ee5f8a484a 169 M2MResourceInstance *res = NULL;
djmeyers 0:06ee5f8a484a 170 if(!_resource_instance_list.empty()) {
djmeyers 0:06ee5f8a484a 171 M2MResourceInstanceList::const_iterator it;
djmeyers 0:06ee5f8a484a 172 it = _resource_instance_list.begin();
djmeyers 0:06ee5f8a484a 173 for ( ; it != _resource_instance_list.end(); it++ ) {
djmeyers 0:06ee5f8a484a 174 if(((*it)->instance_id() == inst_id)) {
djmeyers 0:06ee5f8a484a 175 // Resource found.
djmeyers 0:06ee5f8a484a 176 res = *it;
djmeyers 0:06ee5f8a484a 177 break;
djmeyers 0:06ee5f8a484a 178 }
djmeyers 0:06ee5f8a484a 179 }
djmeyers 0:06ee5f8a484a 180 }
djmeyers 0:06ee5f8a484a 181 return res;
djmeyers 0:06ee5f8a484a 182 }
djmeyers 0:06ee5f8a484a 183
djmeyers 0:06ee5f8a484a 184 const M2MResourceInstanceList& M2MResource::resource_instances() const
djmeyers 0:06ee5f8a484a 185 {
djmeyers 0:06ee5f8a484a 186 return _resource_instance_list;
djmeyers 0:06ee5f8a484a 187 }
djmeyers 0:06ee5f8a484a 188
djmeyers 0:06ee5f8a484a 189 uint16_t M2MResource::resource_instance_count() const
djmeyers 0:06ee5f8a484a 190 {
djmeyers 0:06ee5f8a484a 191 return (uint16_t)_resource_instance_list.size();
djmeyers 0:06ee5f8a484a 192 }
djmeyers 0:06ee5f8a484a 193
djmeyers 0:06ee5f8a484a 194 bool M2MResource::delayed_response() const
djmeyers 0:06ee5f8a484a 195 {
djmeyers 0:06ee5f8a484a 196 return _delayed_response;
djmeyers 0:06ee5f8a484a 197 }
djmeyers 0:06ee5f8a484a 198
djmeyers 0:06ee5f8a484a 199 bool M2MResource::handle_observation_attribute(const char *query)
djmeyers 0:06ee5f8a484a 200 {
djmeyers 0:06ee5f8a484a 201 tr_debug("M2MResource::handle_observation_attribute - is_under_observation(%d)", is_under_observation());
djmeyers 0:06ee5f8a484a 202 bool success = false;
djmeyers 0:06ee5f8a484a 203 M2MReportHandler *handler = M2MBase::report_handler();
djmeyers 0:06ee5f8a484a 204 if (!handler) {
djmeyers 0:06ee5f8a484a 205 handler = M2MBase::create_report_handler();
djmeyers 0:06ee5f8a484a 206 }
djmeyers 0:06ee5f8a484a 207
djmeyers 0:06ee5f8a484a 208 if (handler) {
djmeyers 0:06ee5f8a484a 209 success = handler->parse_notification_attribute(query,
djmeyers 0:06ee5f8a484a 210 M2MBase::base_type(), _resource_type);
djmeyers 0:06ee5f8a484a 211 if (success) {
djmeyers 0:06ee5f8a484a 212 if (is_under_observation()) {
djmeyers 0:06ee5f8a484a 213 handler->set_under_observation(true);
djmeyers 0:06ee5f8a484a 214 }
djmeyers 0:06ee5f8a484a 215 }
djmeyers 0:06ee5f8a484a 216 else {
djmeyers 0:06ee5f8a484a 217 handler->set_default_values();
djmeyers 0:06ee5f8a484a 218 }
djmeyers 0:06ee5f8a484a 219
djmeyers 0:06ee5f8a484a 220 if (success) {
djmeyers 0:06ee5f8a484a 221 if(!_resource_instance_list.empty()) {
djmeyers 0:06ee5f8a484a 222 M2MResourceInstanceList::const_iterator it;
djmeyers 0:06ee5f8a484a 223 it = _resource_instance_list.begin();
djmeyers 0:06ee5f8a484a 224 for ( ; it != _resource_instance_list.end(); it++ ) {
djmeyers 0:06ee5f8a484a 225 M2MReportHandler *report_handler = (*it)->report_handler();
djmeyers 0:06ee5f8a484a 226 if(report_handler && is_under_observation()) {
djmeyers 0:06ee5f8a484a 227 report_handler->set_notification_trigger();
djmeyers 0:06ee5f8a484a 228 }
djmeyers 0:06ee5f8a484a 229 }
djmeyers 0:06ee5f8a484a 230 }
djmeyers 0:06ee5f8a484a 231 }
djmeyers 0:06ee5f8a484a 232 }
djmeyers 0:06ee5f8a484a 233 return success;
djmeyers 0:06ee5f8a484a 234 }
djmeyers 0:06ee5f8a484a 235
djmeyers 0:06ee5f8a484a 236 void M2MResource::add_observation_level(M2MBase::Observation observation_level)
djmeyers 0:06ee5f8a484a 237 {
djmeyers 0:06ee5f8a484a 238 M2MBase::add_observation_level(observation_level);
djmeyers 0:06ee5f8a484a 239 if(!_resource_instance_list.empty()) {
djmeyers 0:06ee5f8a484a 240 M2MResourceInstanceList::const_iterator inst;
djmeyers 0:06ee5f8a484a 241 inst = _resource_instance_list.begin();
djmeyers 0:06ee5f8a484a 242 for ( ; inst != _resource_instance_list.end(); inst++ ) {
djmeyers 0:06ee5f8a484a 243 (*inst)->add_observation_level(observation_level);
djmeyers 0:06ee5f8a484a 244 }
djmeyers 0:06ee5f8a484a 245 }
djmeyers 0:06ee5f8a484a 246 }
djmeyers 0:06ee5f8a484a 247
djmeyers 0:06ee5f8a484a 248 void M2MResource::remove_observation_level(M2MBase::Observation observation_level)
djmeyers 0:06ee5f8a484a 249 {
djmeyers 0:06ee5f8a484a 250 M2MBase::remove_observation_level(observation_level);
djmeyers 0:06ee5f8a484a 251 if(!_resource_instance_list.empty()) {
djmeyers 0:06ee5f8a484a 252 M2MResourceInstanceList::const_iterator inst;
djmeyers 0:06ee5f8a484a 253 inst = _resource_instance_list.begin();
djmeyers 0:06ee5f8a484a 254 for ( ; inst != _resource_instance_list.end(); inst++ ) {
djmeyers 0:06ee5f8a484a 255 (*inst)->remove_observation_level(observation_level);
djmeyers 0:06ee5f8a484a 256 }
djmeyers 0:06ee5f8a484a 257 }
djmeyers 0:06ee5f8a484a 258 }
djmeyers 0:06ee5f8a484a 259
djmeyers 0:06ee5f8a484a 260 void M2MResource::add_resource_instance(M2MResourceInstance *res)
djmeyers 0:06ee5f8a484a 261 {
djmeyers 0:06ee5f8a484a 262 tr_debug("M2MResource::add_resource_instance()");
djmeyers 0:06ee5f8a484a 263 if(res) {
djmeyers 0:06ee5f8a484a 264 _resource_instance_list.push_back(res);
djmeyers 0:06ee5f8a484a 265 }
djmeyers 0:06ee5f8a484a 266 }
djmeyers 0:06ee5f8a484a 267
djmeyers 0:06ee5f8a484a 268 sn_coap_hdr_s* M2MResource::handle_get_request(nsdl_s *nsdl,
djmeyers 0:06ee5f8a484a 269 sn_coap_hdr_s *received_coap_header,
djmeyers 0:06ee5f8a484a 270 M2MObservationHandler *observation_handler)
djmeyers 0:06ee5f8a484a 271 {
djmeyers 0:06ee5f8a484a 272 tr_debug("M2MResource::handle_get_request()");
djmeyers 0:06ee5f8a484a 273 sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CONTENT;
djmeyers 0:06ee5f8a484a 274 sn_coap_hdr_s * coap_response = NULL;
djmeyers 0:06ee5f8a484a 275 if(_has_multiple_instances) {
djmeyers 0:06ee5f8a484a 276 coap_response = sn_nsdl_build_response(nsdl,
djmeyers 0:06ee5f8a484a 277 received_coap_header,
djmeyers 0:06ee5f8a484a 278 msg_code);
djmeyers 0:06ee5f8a484a 279 if(received_coap_header) {
djmeyers 0:06ee5f8a484a 280 // process the GET if we have registered a callback for it
djmeyers 0:06ee5f8a484a 281 if ((operation() & SN_GRS_GET_ALLOWED) != 0) {
djmeyers 0:06ee5f8a484a 282 if(coap_response) {
djmeyers 0:06ee5f8a484a 283 uint16_t coap_content_type = 0;
djmeyers 0:06ee5f8a484a 284 bool content_type_present = false;
djmeyers 0:06ee5f8a484a 285 if(received_coap_header->content_format != COAP_CT_NONE){
djmeyers 0:06ee5f8a484a 286 content_type_present = true;
djmeyers 0:06ee5f8a484a 287 coap_content_type = received_coap_header->content_format;
djmeyers 0:06ee5f8a484a 288 }
djmeyers 0:06ee5f8a484a 289
djmeyers 0:06ee5f8a484a 290 if(!content_type_present &&
djmeyers 0:06ee5f8a484a 291 M2MBase::coap_content_type() == COAP_CONTENT_OMA_TLV_TYPE) {
djmeyers 0:06ee5f8a484a 292 coap_content_type = COAP_CONTENT_OMA_TLV_TYPE;
djmeyers 0:06ee5f8a484a 293 }
djmeyers 0:06ee5f8a484a 294
djmeyers 0:06ee5f8a484a 295 tr_debug("M2MResource::handle_get_request() - Request Content-Type %d", coap_content_type);
djmeyers 0:06ee5f8a484a 296 if (coap_response->content_format == COAP_CT_NONE) {
djmeyers 0:06ee5f8a484a 297 coap_response->content_format = sn_coap_content_format_e(coap_content_type);
djmeyers 0:06ee5f8a484a 298 if (coap_response->content_format != COAP_CT_NONE) {
djmeyers 0:06ee5f8a484a 299 set_coap_content_type(coap_content_type);
djmeyers 0:06ee5f8a484a 300 }
djmeyers 0:06ee5f8a484a 301 }
djmeyers 0:06ee5f8a484a 302 uint8_t *data = NULL;
djmeyers 0:06ee5f8a484a 303 uint32_t data_length = 0;
djmeyers 0:06ee5f8a484a 304 // fill in the CoAP response payload
djmeyers 0:06ee5f8a484a 305 if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type) {
djmeyers 0:06ee5f8a484a 306 M2MTLVSerializer serializer;
djmeyers 0:06ee5f8a484a 307 data = serializer.serialize(this, data_length);
djmeyers 0:06ee5f8a484a 308 } else {
djmeyers 0:06ee5f8a484a 309 msg_code = COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT; // Content format not supported
djmeyers 0:06ee5f8a484a 310 }
djmeyers 0:06ee5f8a484a 311
djmeyers 0:06ee5f8a484a 312 coap_response->payload_len = data_length;
djmeyers 0:06ee5f8a484a 313 coap_response->payload_ptr = data;
djmeyers 0:06ee5f8a484a 314
djmeyers 0:06ee5f8a484a 315 coap_response->options_list_ptr = sn_nsdl_alloc_options_list(nsdl, coap_response);
djmeyers 0:06ee5f8a484a 316
djmeyers 0:06ee5f8a484a 317 coap_response->options_list_ptr->max_age = max_age();
djmeyers 0:06ee5f8a484a 318
djmeyers 0:06ee5f8a484a 319 if(received_coap_header->options_list_ptr) {
djmeyers 0:06ee5f8a484a 320 if(received_coap_header->options_list_ptr->observe != -1) {
djmeyers 0:06ee5f8a484a 321 if (is_observable()) {
djmeyers 0:06ee5f8a484a 322 uint32_t number = 0;
djmeyers 0:06ee5f8a484a 323 uint8_t observe_option = 0;
djmeyers 0:06ee5f8a484a 324 observe_option = received_coap_header->options_list_ptr->observe;
djmeyers 0:06ee5f8a484a 325 if(START_OBSERVATION == observe_option) {
djmeyers 0:06ee5f8a484a 326 tr_debug("M2MResource::handle_get_request - Starts Observation");
djmeyers 0:06ee5f8a484a 327 // If the observe length is 0 means register for observation.
djmeyers 0:06ee5f8a484a 328 if(received_coap_header->options_list_ptr->observe != -1) {
djmeyers 0:06ee5f8a484a 329 number = received_coap_header->options_list_ptr->observe;
djmeyers 0:06ee5f8a484a 330 }
djmeyers 0:06ee5f8a484a 331 if(received_coap_header->token_ptr) {
djmeyers 0:06ee5f8a484a 332 tr_debug("M2MResource::handle_get_request - Sets Observation Token to resource");
djmeyers 0:06ee5f8a484a 333 set_observation_token(received_coap_header->token_ptr,
djmeyers 0:06ee5f8a484a 334 received_coap_header->token_len);
djmeyers 0:06ee5f8a484a 335 }
djmeyers 0:06ee5f8a484a 336
djmeyers 0:06ee5f8a484a 337 // If the observe value is 0 means register for observation.
djmeyers 0:06ee5f8a484a 338 if(number == 0) {
djmeyers 0:06ee5f8a484a 339 tr_debug("M2MResource::handle_get_request - Put Resource under Observation");
djmeyers 0:06ee5f8a484a 340 M2MResourceInstanceList::const_iterator it;
djmeyers 0:06ee5f8a484a 341 it = _resource_instance_list.begin();
djmeyers 0:06ee5f8a484a 342 for (; it!=_resource_instance_list.end(); it++ ) {
djmeyers 0:06ee5f8a484a 343 tr_debug("M2MResource::handle_get_request - set_resource_observer");
djmeyers 0:06ee5f8a484a 344 (*it)->set_resource_observer(this);
djmeyers 0:06ee5f8a484a 345 (*it)->add_observation_level(M2MBase::R_Attribute);
djmeyers 0:06ee5f8a484a 346 }
djmeyers 0:06ee5f8a484a 347 set_under_observation(true,observation_handler);
djmeyers 0:06ee5f8a484a 348 M2MBase::add_observation_level(M2MBase::R_Attribute);
djmeyers 0:06ee5f8a484a 349 coap_response->options_list_ptr->observe = observation_number();
djmeyers 0:06ee5f8a484a 350 }
djmeyers 0:06ee5f8a484a 351 } else if (STOP_OBSERVATION == observe_option) {
djmeyers 0:06ee5f8a484a 352 tr_debug("M2MResource::handle_get_request - Stops Observation");
djmeyers 0:06ee5f8a484a 353 set_under_observation(false,NULL);
djmeyers 0:06ee5f8a484a 354 M2MBase::remove_observation_level(M2MBase::R_Attribute);
djmeyers 0:06ee5f8a484a 355 M2MResourceInstanceList::const_iterator it;
djmeyers 0:06ee5f8a484a 356 it = _resource_instance_list.begin();
djmeyers 0:06ee5f8a484a 357 for (; it!=_resource_instance_list.end(); it++ ) {
djmeyers 0:06ee5f8a484a 358 (*it)->set_resource_observer(NULL);
djmeyers 0:06ee5f8a484a 359 }
djmeyers 0:06ee5f8a484a 360 }
djmeyers 0:06ee5f8a484a 361 msg_code = COAP_MSG_CODE_RESPONSE_CONTENT;
djmeyers 0:06ee5f8a484a 362 }
djmeyers 0:06ee5f8a484a 363 else {
djmeyers 0:06ee5f8a484a 364 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
djmeyers 0:06ee5f8a484a 365 }
djmeyers 0:06ee5f8a484a 366 }
djmeyers 0:06ee5f8a484a 367 }
djmeyers 0:06ee5f8a484a 368 }
djmeyers 0:06ee5f8a484a 369 } else {
djmeyers 0:06ee5f8a484a 370 tr_error("M2MResource::handle_get_request - Return COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED");
djmeyers 0:06ee5f8a484a 371 // Operation is not allowed.
djmeyers 0:06ee5f8a484a 372 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
djmeyers 0:06ee5f8a484a 373 }
djmeyers 0:06ee5f8a484a 374 }
djmeyers 0:06ee5f8a484a 375 if(coap_response) {
djmeyers 0:06ee5f8a484a 376 coap_response->msg_code = msg_code;
djmeyers 0:06ee5f8a484a 377 }
djmeyers 0:06ee5f8a484a 378 } else {
djmeyers 0:06ee5f8a484a 379 coap_response = M2MResourceInstance::handle_get_request(nsdl,
djmeyers 0:06ee5f8a484a 380 received_coap_header,
djmeyers 0:06ee5f8a484a 381 observation_handler);
djmeyers 0:06ee5f8a484a 382 }
djmeyers 0:06ee5f8a484a 383 return coap_response;
djmeyers 0:06ee5f8a484a 384 }
djmeyers 0:06ee5f8a484a 385
djmeyers 0:06ee5f8a484a 386 sn_coap_hdr_s* M2MResource::handle_put_request(nsdl_s *nsdl,
djmeyers 0:06ee5f8a484a 387 sn_coap_hdr_s *received_coap_header,
djmeyers 0:06ee5f8a484a 388 M2MObservationHandler *observation_handler,
djmeyers 0:06ee5f8a484a 389 bool &execute_value_updated)
djmeyers 0:06ee5f8a484a 390 {
djmeyers 0:06ee5f8a484a 391 tr_debug("M2MResource::handle_put_request()");
djmeyers 0:06ee5f8a484a 392 sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; // 2.04
djmeyers 0:06ee5f8a484a 393 sn_coap_hdr_s * coap_response = NULL;
djmeyers 0:06ee5f8a484a 394 if(_has_multiple_instances) {
djmeyers 0:06ee5f8a484a 395 coap_response = sn_nsdl_build_response(nsdl,
djmeyers 0:06ee5f8a484a 396 received_coap_header,
djmeyers 0:06ee5f8a484a 397 msg_code);
djmeyers 0:06ee5f8a484a 398 // process the PUT if we have registered a callback for it
djmeyers 0:06ee5f8a484a 399 if(received_coap_header) {
djmeyers 0:06ee5f8a484a 400 uint16_t coap_content_type = 0;
djmeyers 0:06ee5f8a484a 401 bool content_type_present = false;
djmeyers 0:06ee5f8a484a 402 if(received_coap_header->content_format != COAP_CT_NONE && coap_response) {
djmeyers 0:06ee5f8a484a 403 content_type_present = true;
djmeyers 0:06ee5f8a484a 404 coap_content_type = received_coap_header->content_format;
djmeyers 0:06ee5f8a484a 405 }
djmeyers 0:06ee5f8a484a 406 if(received_coap_header->options_list_ptr &&
djmeyers 0:06ee5f8a484a 407 received_coap_header->options_list_ptr->uri_query_ptr) {
djmeyers 0:06ee5f8a484a 408 char *query = (char*)alloc_string_copy(received_coap_header->options_list_ptr->uri_query_ptr,
djmeyers 0:06ee5f8a484a 409 received_coap_header->options_list_ptr->uri_query_len);
djmeyers 0:06ee5f8a484a 410 if (query){
djmeyers 0:06ee5f8a484a 411 msg_code = COAP_MSG_CODE_RESPONSE_CHANGED;
djmeyers 0:06ee5f8a484a 412 tr_debug("M2MResource::handle_put_request() - Query %s", query);
djmeyers 0:06ee5f8a484a 413 // if anything was updated, re-initialize the stored notification attributes
djmeyers 0:06ee5f8a484a 414 if (!handle_observation_attribute(query)){
djmeyers 0:06ee5f8a484a 415 tr_debug("M2MResource::handle_put_request() - Invalid query");
djmeyers 0:06ee5f8a484a 416 msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; // 4.00
djmeyers 0:06ee5f8a484a 417 }
djmeyers 0:06ee5f8a484a 418 free(query);
djmeyers 0:06ee5f8a484a 419 }
djmeyers 0:06ee5f8a484a 420 } else if ((operation() & SN_GRS_PUT_ALLOWED) != 0) {
djmeyers 0:06ee5f8a484a 421 if(!content_type_present &&
djmeyers 0:06ee5f8a484a 422 M2MBase::coap_content_type() == COAP_CONTENT_OMA_TLV_TYPE) {
djmeyers 0:06ee5f8a484a 423 coap_content_type = COAP_CONTENT_OMA_TLV_TYPE;
djmeyers 0:06ee5f8a484a 424 }
djmeyers 0:06ee5f8a484a 425
djmeyers 0:06ee5f8a484a 426 tr_debug("M2MResource::handle_put_request() - Request Content-Type %d", coap_content_type);
djmeyers 0:06ee5f8a484a 427
djmeyers 0:06ee5f8a484a 428 if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type) {
djmeyers 0:06ee5f8a484a 429 M2MTLVDeserializer deserializer;
djmeyers 0:06ee5f8a484a 430 M2MTLVDeserializer::Error error = M2MTLVDeserializer::None;
djmeyers 0:06ee5f8a484a 431 error = deserializer.deserialize_resource_instances(received_coap_header->payload_ptr,
djmeyers 0:06ee5f8a484a 432 received_coap_header->payload_len,
djmeyers 0:06ee5f8a484a 433 *this,
djmeyers 0:06ee5f8a484a 434 M2MTLVDeserializer::Put);
djmeyers 0:06ee5f8a484a 435 switch(error) {
djmeyers 0:06ee5f8a484a 436 case M2MTLVDeserializer::None:
djmeyers 0:06ee5f8a484a 437 if(observation_handler) {
djmeyers 0:06ee5f8a484a 438 String value = "";
djmeyers 0:06ee5f8a484a 439 if (received_coap_header->uri_path_ptr != NULL &&
djmeyers 0:06ee5f8a484a 440 received_coap_header->uri_path_len > 0) {
djmeyers 0:06ee5f8a484a 441
djmeyers 0:06ee5f8a484a 442 value.append_raw((char*)received_coap_header->uri_path_ptr,received_coap_header->uri_path_len);
djmeyers 0:06ee5f8a484a 443 }
djmeyers 0:06ee5f8a484a 444 execute_value_updated = true;
djmeyers 0:06ee5f8a484a 445 }
djmeyers 0:06ee5f8a484a 446 msg_code = COAP_MSG_CODE_RESPONSE_CHANGED;
djmeyers 0:06ee5f8a484a 447 break;
djmeyers 0:06ee5f8a484a 448 case M2MTLVDeserializer::NotFound:
djmeyers 0:06ee5f8a484a 449 msg_code = COAP_MSG_CODE_RESPONSE_NOT_FOUND;
djmeyers 0:06ee5f8a484a 450 break;
djmeyers 0:06ee5f8a484a 451 case M2MTLVDeserializer::NotAllowed:
djmeyers 0:06ee5f8a484a 452 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
djmeyers 0:06ee5f8a484a 453 break;
djmeyers 0:06ee5f8a484a 454 case M2MTLVDeserializer::NotValid:
djmeyers 0:06ee5f8a484a 455 msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST;
djmeyers 0:06ee5f8a484a 456 break;
djmeyers 0:06ee5f8a484a 457 }
djmeyers 0:06ee5f8a484a 458 } else {
djmeyers 0:06ee5f8a484a 459 msg_code =COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT;
djmeyers 0:06ee5f8a484a 460 } // if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type)
djmeyers 0:06ee5f8a484a 461 } else {
djmeyers 0:06ee5f8a484a 462 // Operation is not allowed.
djmeyers 0:06ee5f8a484a 463 tr_error("M2MResource::handle_put_request() - COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED");
djmeyers 0:06ee5f8a484a 464 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
djmeyers 0:06ee5f8a484a 465 }
djmeyers 0:06ee5f8a484a 466 } else {
djmeyers 0:06ee5f8a484a 467 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
djmeyers 0:06ee5f8a484a 468 }
djmeyers 0:06ee5f8a484a 469 if(coap_response) {
djmeyers 0:06ee5f8a484a 470 coap_response->msg_code = msg_code;
djmeyers 0:06ee5f8a484a 471 }
djmeyers 0:06ee5f8a484a 472 } else {
djmeyers 0:06ee5f8a484a 473 coap_response = M2MResourceInstance::handle_put_request(nsdl,
djmeyers 0:06ee5f8a484a 474 received_coap_header,
djmeyers 0:06ee5f8a484a 475 observation_handler,
djmeyers 0:06ee5f8a484a 476 execute_value_updated);
djmeyers 0:06ee5f8a484a 477 }
djmeyers 0:06ee5f8a484a 478 return coap_response;
djmeyers 0:06ee5f8a484a 479 }
djmeyers 0:06ee5f8a484a 480
djmeyers 0:06ee5f8a484a 481 sn_coap_hdr_s* M2MResource::handle_post_request(nsdl_s *nsdl,
djmeyers 0:06ee5f8a484a 482 sn_coap_hdr_s *received_coap_header,
djmeyers 0:06ee5f8a484a 483 M2MObservationHandler */*observation_handler*/,
djmeyers 0:06ee5f8a484a 484 bool &/*execute_value_updated*/,
djmeyers 0:06ee5f8a484a 485 sn_nsdl_addr_s *address)
djmeyers 0:06ee5f8a484a 486 {
djmeyers 0:06ee5f8a484a 487 tr_debug("M2MResource::handle_post_request()");
djmeyers 0:06ee5f8a484a 488 sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; // 2.04
djmeyers 0:06ee5f8a484a 489 sn_coap_hdr_s * coap_response = sn_nsdl_build_response(nsdl,
djmeyers 0:06ee5f8a484a 490 received_coap_header,
djmeyers 0:06ee5f8a484a 491 msg_code);
djmeyers 0:06ee5f8a484a 492 // process the POST if we have registered a callback for it
djmeyers 0:06ee5f8a484a 493 if(received_coap_header) {
djmeyers 0:06ee5f8a484a 494 if ((operation() & SN_GRS_POST_ALLOWED) != 0) {
djmeyers 0:06ee5f8a484a 495 M2MResource::M2MExecuteParameter *exec_params = new M2MResource::M2MExecuteParameter();
djmeyers 0:06ee5f8a484a 496 if (exec_params) {
djmeyers 0:06ee5f8a484a 497 exec_params->_object_name = object_name();
djmeyers 0:06ee5f8a484a 498 exec_params->_resource_name = name();
djmeyers 0:06ee5f8a484a 499 exec_params->_object_instance_id = object_instance_id();
djmeyers 0:06ee5f8a484a 500 }
djmeyers 0:06ee5f8a484a 501 uint16_t coap_content_type = 0;
djmeyers 0:06ee5f8a484a 502 if(received_coap_header->payload_ptr) {
djmeyers 0:06ee5f8a484a 503 if(received_coap_header->content_format != COAP_CT_NONE) {
djmeyers 0:06ee5f8a484a 504 coap_content_type = received_coap_header->content_format;
djmeyers 0:06ee5f8a484a 505 }
djmeyers 0:06ee5f8a484a 506 if(coap_content_type == 0) {
djmeyers 0:06ee5f8a484a 507 if (exec_params){
djmeyers 0:06ee5f8a484a 508 exec_params->_value = alloc_string_copy(received_coap_header->payload_ptr,
djmeyers 0:06ee5f8a484a 509 received_coap_header->payload_len);
djmeyers 0:06ee5f8a484a 510 if (exec_params->_value) {
djmeyers 0:06ee5f8a484a 511 exec_params->_value_length = received_coap_header->payload_len;
djmeyers 0:06ee5f8a484a 512 }
djmeyers 0:06ee5f8a484a 513 }
djmeyers 0:06ee5f8a484a 514 } else {
djmeyers 0:06ee5f8a484a 515 msg_code = COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT;
djmeyers 0:06ee5f8a484a 516 }
djmeyers 0:06ee5f8a484a 517 }
djmeyers 0:06ee5f8a484a 518 if(COAP_MSG_CODE_RESPONSE_CHANGED == msg_code) {
djmeyers 0:06ee5f8a484a 519 tr_debug("M2MResource::handle_post_request - Execute resource function");
djmeyers 0:06ee5f8a484a 520 if(_delayed_response) {
djmeyers 0:06ee5f8a484a 521 msg_code = COAP_MSG_CODE_EMPTY;
djmeyers 0:06ee5f8a484a 522 coap_response->msg_type = COAP_MSG_TYPE_ACKNOWLEDGEMENT;
djmeyers 0:06ee5f8a484a 523 coap_response->msg_code = msg_code;
djmeyers 0:06ee5f8a484a 524 coap_response->msg_id = received_coap_header->msg_id;
djmeyers 0:06ee5f8a484a 525 if(received_coap_header->token_len) {
djmeyers 0:06ee5f8a484a 526 free(_delayed_token);
djmeyers 0:06ee5f8a484a 527 _delayed_token = NULL;
djmeyers 0:06ee5f8a484a 528 _delayed_token_len = 0;
djmeyers 0:06ee5f8a484a 529 _delayed_token = alloc_copy(received_coap_header->token_ptr, received_coap_header->token_len);
djmeyers 0:06ee5f8a484a 530 if(_delayed_token) {
djmeyers 0:06ee5f8a484a 531 _delayed_token_len = received_coap_header->token_len;
djmeyers 0:06ee5f8a484a 532 }
djmeyers 0:06ee5f8a484a 533 sn_nsdl_send_coap_message(nsdl, address, coap_response);
djmeyers 0:06ee5f8a484a 534 }
djmeyers 0:06ee5f8a484a 535 } else {
djmeyers 0:06ee5f8a484a 536 uint32_t length = 0;
djmeyers 0:06ee5f8a484a 537 get_value(coap_response->payload_ptr, length);
djmeyers 0:06ee5f8a484a 538 coap_response->payload_len = length;
djmeyers 0:06ee5f8a484a 539 }
djmeyers 0:06ee5f8a484a 540 execute(exec_params);
djmeyers 0:06ee5f8a484a 541 }
djmeyers 0:06ee5f8a484a 542 delete exec_params;
djmeyers 0:06ee5f8a484a 543 } else { // if ((object->operation() & SN_GRS_POST_ALLOWED) != 0)
djmeyers 0:06ee5f8a484a 544 tr_error("M2MResource::handle_post_request - COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED");
djmeyers 0:06ee5f8a484a 545 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; // 4.05
djmeyers 0:06ee5f8a484a 546 }
djmeyers 0:06ee5f8a484a 547 } else { //if(object && received_coap_header)
djmeyers 0:06ee5f8a484a 548 tr_error("M2MResource::handle_post_request - COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED");
djmeyers 0:06ee5f8a484a 549 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; // 4.01
djmeyers 0:06ee5f8a484a 550 }
djmeyers 0:06ee5f8a484a 551 if(coap_response) {
djmeyers 0:06ee5f8a484a 552 coap_response->msg_code = msg_code;
djmeyers 0:06ee5f8a484a 553 }
djmeyers 0:06ee5f8a484a 554 return coap_response;
djmeyers 0:06ee5f8a484a 555 }
djmeyers 0:06ee5f8a484a 556
djmeyers 0:06ee5f8a484a 557 void M2MResource::notification_update()
djmeyers 0:06ee5f8a484a 558 {
djmeyers 0:06ee5f8a484a 559 tr_debug("M2MResource::notification_update()");
djmeyers 0:06ee5f8a484a 560 M2MReportHandler *report_handler = M2MBase::report_handler();
djmeyers 0:06ee5f8a484a 561 if(report_handler && is_observable()) {
djmeyers 0:06ee5f8a484a 562 report_handler->set_notification_trigger();
djmeyers 0:06ee5f8a484a 563 }
djmeyers 0:06ee5f8a484a 564 }
djmeyers 0:06ee5f8a484a 565
djmeyers 0:06ee5f8a484a 566 M2MObjectInstance& M2MResource::get_parent_object_instance() const
djmeyers 0:06ee5f8a484a 567 {
djmeyers 0:06ee5f8a484a 568 return _parent;
djmeyers 0:06ee5f8a484a 569 }
djmeyers 0:06ee5f8a484a 570
djmeyers 0:06ee5f8a484a 571 const char* M2MResource::object_name() const
djmeyers 0:06ee5f8a484a 572 {
djmeyers 0:06ee5f8a484a 573 const M2MObjectInstance& parent_object_instance = _parent;
djmeyers 0:06ee5f8a484a 574 const M2MObject& parent_object = parent_object_instance.get_parent_object();
djmeyers 0:06ee5f8a484a 575
djmeyers 0:06ee5f8a484a 576 return parent_object.name();
djmeyers 0:06ee5f8a484a 577 }
djmeyers 0:06ee5f8a484a 578
djmeyers 0:06ee5f8a484a 579
djmeyers 0:06ee5f8a484a 580 M2MResource::M2MExecuteParameter::M2MExecuteParameter()
djmeyers 0:06ee5f8a484a 581 {
djmeyers 0:06ee5f8a484a 582 _value = NULL;
djmeyers 0:06ee5f8a484a 583 _value_length = 0;
djmeyers 0:06ee5f8a484a 584 _object_name = "";
djmeyers 0:06ee5f8a484a 585 _resource_name = "";
djmeyers 0:06ee5f8a484a 586 _object_instance_id = 0;
djmeyers 0:06ee5f8a484a 587 }
djmeyers 0:06ee5f8a484a 588
djmeyers 0:06ee5f8a484a 589 M2MResource::M2MExecuteParameter::~M2MExecuteParameter()
djmeyers 0:06ee5f8a484a 590 {
djmeyers 0:06ee5f8a484a 591 free(_value);
djmeyers 0:06ee5f8a484a 592 }
djmeyers 0:06ee5f8a484a 593
djmeyers 0:06ee5f8a484a 594 uint8_t *M2MResource::M2MExecuteParameter::get_argument_value() const
djmeyers 0:06ee5f8a484a 595 {
djmeyers 0:06ee5f8a484a 596 return _value;
djmeyers 0:06ee5f8a484a 597 }
djmeyers 0:06ee5f8a484a 598
djmeyers 0:06ee5f8a484a 599 uint16_t M2MResource::M2MExecuteParameter::get_argument_value_length() const
djmeyers 0:06ee5f8a484a 600 {
djmeyers 0:06ee5f8a484a 601 return _value_length;
djmeyers 0:06ee5f8a484a 602 }
djmeyers 0:06ee5f8a484a 603
djmeyers 0:06ee5f8a484a 604 const String& M2MResource::M2MExecuteParameter::get_argument_object_name() const
djmeyers 0:06ee5f8a484a 605 {
djmeyers 0:06ee5f8a484a 606 return _object_name;
djmeyers 0:06ee5f8a484a 607 }
djmeyers 0:06ee5f8a484a 608
djmeyers 0:06ee5f8a484a 609 const String& M2MResource::M2MExecuteParameter::get_argument_resource_name() const
djmeyers 0:06ee5f8a484a 610 {
djmeyers 0:06ee5f8a484a 611 return _resource_name;
djmeyers 0:06ee5f8a484a 612 }
djmeyers 0:06ee5f8a484a 613
djmeyers 0:06ee5f8a484a 614 uint16_t M2MResource::M2MExecuteParameter::get_argument_object_instance_id() const
djmeyers 0:06ee5f8a484a 615 {
djmeyers 0:06ee5f8a484a 616 return _object_instance_id;
djmeyers 0:06ee5f8a484a 617 }
djmeyers 0:06ee5f8a484a 618
djmeyers 0:06ee5f8a484a 619