Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: FXAS21002 FXOS8700Q
m2mresource.cpp
00001 /* 00002 * Copyright (c) 2015 ARM Limited. All rights reserved. 00003 * SPDX-License-Identifier: Apache-2.0 00004 * Licensed under the Apache License, Version 2.0 (the License); you may 00005 * not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http://www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an AS IS BASIS, WITHOUT 00012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 #include "mbed-client/m2mconstants.h" 00017 #include "mbed-client/m2mresource.h" 00018 #include "mbed-client/m2mobservationhandler.h" 00019 #include "include/m2mreporthandler.h" 00020 #include "include/m2mtlvserializer.h" 00021 #include "include/m2mtlvdeserializer.h" 00022 #include "mbed-trace/mbed_trace.h" 00023 00024 #include <stdlib.h> 00025 00026 #define TRACE_GROUP "mClt" 00027 00028 M2MResource::M2MResource(M2MObjectInstance &parent, 00029 const String &resource_name, 00030 M2MBase::Mode resource_mode, 00031 const String &resource_type, 00032 M2MBase::DataType type, 00033 const uint8_t *value, 00034 const uint8_t value_length, 00035 char *path, 00036 bool multiple_instance, 00037 bool external_blockwise_store) 00038 : M2MResourceBase(resource_name, resource_mode, resource_type, type, value, value_length, 00039 path, external_blockwise_store, multiple_instance), 00040 _parent(parent) 00041 #ifndef DISABLE_DELAYED_RESPONSE 00042 ,_delayed_token(NULL), 00043 _delayed_token_len(0), 00044 _delayed_response(false) 00045 #endif 00046 { 00047 M2MBase::set_base_type(M2MBase::Resource); 00048 M2MBase::set_operation(M2MBase::GET_ALLOWED); 00049 M2MBase::set_observable(false); 00050 if (multiple_instance) { 00051 M2MBase::set_coap_content_type(COAP_CONTENT_OMA_TLV_TYPE_OLD); 00052 } 00053 00054 } 00055 00056 M2MResource::M2MResource(M2MObjectInstance &parent, 00057 const lwm2m_parameters_s* s, 00058 M2MBase::DataType type) 00059 : M2MResourceBase(s, type), 00060 _parent(parent) 00061 #ifndef DISABLE_DELAYED_RESPONSE 00062 ,_delayed_token(NULL), 00063 _delayed_token_len(0), 00064 _delayed_response(false) 00065 #endif 00066 { 00067 // verify, that the client has hardcoded proper type to the structure 00068 assert(base_type() == M2MBase::Resource); 00069 } 00070 00071 M2MResource::M2MResource(M2MObjectInstance &parent, 00072 const String &resource_name, 00073 M2MBase::Mode resource_mode, 00074 const String &resource_type, 00075 M2MBase::DataType type, 00076 bool observable, 00077 char *path, 00078 bool multiple_instance, 00079 bool external_blockwise_store) 00080 : M2MResourceBase(resource_name, resource_mode, resource_type, type, 00081 path, 00082 external_blockwise_store,multiple_instance), 00083 _parent(parent) 00084 #ifndef DISABLE_DELAYED_RESPONSE 00085 ,_delayed_token(NULL), 00086 _delayed_token_len(0), 00087 _delayed_response(false) 00088 #endif 00089 { 00090 M2MBase::set_base_type(M2MBase::Resource); 00091 M2MBase::set_operation(M2MBase::GET_PUT_ALLOWED); 00092 M2MBase::set_observable(observable); 00093 if (multiple_instance) { 00094 M2MBase::set_coap_content_type(COAP_CONTENT_OMA_TLV_TYPE_OLD); 00095 } 00096 } 00097 00098 00099 M2MResource::~M2MResource() 00100 { 00101 if(!_resource_instance_list.empty()) { 00102 M2MResourceInstance* res = NULL; 00103 M2MResourceInstanceList::const_iterator it; 00104 it = _resource_instance_list.begin(); 00105 for (; it!=_resource_instance_list.end(); it++ ) { 00106 //Free allocated memory for resources. 00107 res = *it; 00108 delete res; 00109 } 00110 _resource_instance_list.clear(); 00111 } 00112 #ifndef DISABLE_DELAYED_RESPONSE 00113 free(_delayed_token); 00114 #endif 00115 00116 free_resources(); 00117 } 00118 00119 bool M2MResource::supports_multiple_instances() const 00120 { 00121 M2MBase::lwm2m_parameters_s* param = M2MBase::get_lwm2m_parameters(); 00122 return param->multiple_instance; 00123 } 00124 00125 #ifndef DISABLE_DELAYED_RESPONSE 00126 void M2MResource::set_delayed_response(bool delayed_response) 00127 { 00128 _delayed_response = delayed_response; 00129 } 00130 00131 bool M2MResource::send_delayed_post_response() 00132 { 00133 bool success = false; 00134 if(_delayed_response) { 00135 success = true; 00136 // At least on some unit tests the resource object is not fully constructed, which would 00137 // cause issues if the observation_handler is NULL. So do the check before dereferencing pointer. 00138 M2MObservationHandler* obs = observation_handler(); 00139 if (obs) { 00140 obs->send_delayed_response(this); 00141 } 00142 } 00143 return success; 00144 } 00145 00146 void M2MResource::get_delayed_token(uint8_t *&token, uint8_t &token_length) 00147 { 00148 token_length = 0; 00149 if(token) { 00150 free(token); 00151 token = NULL; 00152 } 00153 if(_delayed_token && _delayed_token_len > 0) { 00154 token = alloc_copy(_delayed_token, _delayed_token_len); 00155 if(token) { 00156 token_length = _delayed_token_len; 00157 } 00158 } 00159 } 00160 #endif 00161 00162 bool M2MResource::remove_resource_instance(uint16_t inst_id) 00163 { 00164 tr_debug("M2MResource::remove_resource(inst_id %d)", inst_id); 00165 bool success = false; 00166 if(!_resource_instance_list.empty()) { 00167 M2MResourceInstance* res = NULL; 00168 M2MResourceInstanceList::const_iterator it; 00169 it = _resource_instance_list.begin(); 00170 int pos = 0; 00171 for ( ; it != _resource_instance_list.end(); it++, pos++ ) { 00172 if(((*it)->instance_id() == inst_id)) { 00173 // Resource found and deleted. 00174 res = *it; 00175 delete res; 00176 _resource_instance_list.erase(pos); 00177 set_changed(); 00178 success = true; 00179 break; 00180 } 00181 } 00182 } 00183 return success; 00184 } 00185 00186 M2MResourceInstance* M2MResource::resource_instance(uint16_t inst_id) const 00187 { 00188 tr_debug("M2MResource::resource(resource_name inst_id %d)", inst_id); 00189 M2MResourceInstance *res = NULL; 00190 if(!_resource_instance_list.empty()) { 00191 M2MResourceInstanceList::const_iterator it; 00192 it = _resource_instance_list.begin(); 00193 for ( ; it != _resource_instance_list.end(); it++ ) { 00194 if(((*it)->instance_id() == inst_id)) { 00195 // Resource found. 00196 res = *it; 00197 break; 00198 } 00199 } 00200 } 00201 return res; 00202 } 00203 00204 const M2MResourceInstanceList& M2MResource::resource_instances() const 00205 { 00206 return _resource_instance_list; 00207 } 00208 00209 uint16_t M2MResource::resource_instance_count() const 00210 { 00211 return (uint16_t)_resource_instance_list.size(); 00212 } 00213 00214 #ifndef DISABLE_DELAYED_RESPONSE 00215 bool M2MResource::delayed_response() const 00216 { 00217 return _delayed_response; 00218 } 00219 #endif 00220 00221 M2MObservationHandler* M2MResource::observation_handler() const 00222 { 00223 const M2MObjectInstance& parent_object_instance = get_parent_object_instance(); 00224 00225 // XXX: need to check the flag too 00226 return parent_object_instance.observation_handler(); 00227 } 00228 00229 void M2MResource::set_observation_handler(M2MObservationHandler *handler) 00230 { 00231 M2MObjectInstance& parent_object_instance = get_parent_object_instance(); 00232 00233 // XXX: need to set the flag too 00234 parent_object_instance.set_observation_handler(handler); 00235 } 00236 00237 bool M2MResource::handle_observation_attribute(const char *query) 00238 { 00239 tr_debug("M2MResource::handle_observation_attribute - is_under_observation(%d)", is_under_observation()); 00240 bool success = false; 00241 M2MReportHandler *handler = M2MBase::report_handler(); 00242 if (!handler) { 00243 handler = M2MBase::create_report_handler(); 00244 } 00245 00246 if (handler) { 00247 success = handler->parse_notification_attribute(query, 00248 M2MBase::base_type(), resource_instance_type()); 00249 if (success) { 00250 if (is_under_observation()) { 00251 handler->set_under_observation(true); 00252 } 00253 } 00254 else { 00255 handler->set_default_values(); 00256 } 00257 00258 if (success) { 00259 if(!_resource_instance_list.empty()) { 00260 M2MResourceInstanceList::const_iterator it; 00261 it = _resource_instance_list.begin(); 00262 for ( ; it != _resource_instance_list.end(); it++ ) { 00263 M2MReportHandler *report_handler = (*it)->report_handler(); 00264 if(report_handler && is_under_observation()) { 00265 report_handler->set_notification_trigger(); 00266 } 00267 } 00268 } 00269 } 00270 } 00271 return success; 00272 } 00273 00274 void M2MResource::add_observation_level(M2MBase::Observation observation_level) 00275 { 00276 M2MBase::add_observation_level(observation_level); 00277 if(!_resource_instance_list.empty()) { 00278 M2MResourceInstanceList::const_iterator inst; 00279 inst = _resource_instance_list.begin(); 00280 for ( ; inst != _resource_instance_list.end(); inst++ ) { 00281 (*inst)->add_observation_level(observation_level); 00282 } 00283 } 00284 } 00285 00286 void M2MResource::remove_observation_level(M2MBase::Observation observation_level) 00287 { 00288 M2MBase::remove_observation_level(observation_level); 00289 if(!_resource_instance_list.empty()) { 00290 M2MResourceInstanceList::const_iterator inst; 00291 inst = _resource_instance_list.begin(); 00292 for ( ; inst != _resource_instance_list.end(); inst++ ) { 00293 (*inst)->remove_observation_level(observation_level); 00294 } 00295 } 00296 } 00297 00298 void M2MResource::add_resource_instance(M2MResourceInstance *res) 00299 { 00300 tr_debug("M2MResource::add_resource_instance()"); 00301 if(res) { 00302 _resource_instance_list.push_back(res); 00303 set_changed(); 00304 } 00305 } 00306 00307 sn_coap_hdr_s* M2MResource::handle_get_request(nsdl_s *nsdl, 00308 sn_coap_hdr_s *received_coap_header, 00309 M2MObservationHandler *observation_handler) 00310 { 00311 tr_info("M2MResource::handle_get_request()"); 00312 sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CONTENT; 00313 sn_coap_hdr_s * coap_response = NULL; 00314 if(supports_multiple_instances()) { 00315 coap_response = sn_nsdl_build_response(nsdl, 00316 received_coap_header, 00317 msg_code); 00318 if(received_coap_header) { 00319 // process the GET if we have registered a callback for it 00320 if ((operation() & M2MBase::GET_ALLOWED) != 0) { 00321 if(coap_response) { 00322 bool content_type_present = false; 00323 bool is_content_type_supported = true; 00324 00325 if (received_coap_header->options_list_ptr && 00326 received_coap_header->options_list_ptr->accept != COAP_CT_NONE) { 00327 content_type_present = true; 00328 coap_response->content_format = received_coap_header->options_list_ptr->accept; 00329 } 00330 00331 // Check if preferred content type is supported 00332 if (content_type_present) { 00333 if (coap_response->content_format != COAP_CONTENT_OMA_TLV_TYPE_OLD && 00334 coap_response->content_format != COAP_CONTENT_OMA_TLV_TYPE) { 00335 is_content_type_supported = false; 00336 } 00337 } 00338 00339 if (is_content_type_supported) { 00340 if(!content_type_present && 00341 (M2MBase::coap_content_type() == COAP_CONTENT_OMA_TLV_TYPE || 00342 M2MBase::coap_content_type() == COAP_CONTENT_OMA_TLV_TYPE_OLD)) { 00343 coap_response->content_format = sn_coap_content_format_e(M2MBase::coap_content_type()); 00344 } 00345 00346 tr_debug("M2MResource::handle_get_request() - Request Content-type: %d", coap_response->content_format); 00347 00348 uint8_t *data = NULL; 00349 uint32_t data_length = 0; 00350 // fill in the CoAP response payload 00351 if(COAP_CONTENT_OMA_TLV_TYPE == coap_response->content_format || 00352 COAP_CONTENT_OMA_TLV_TYPE_OLD == coap_response->content_format) { 00353 set_coap_content_type(coap_response->content_format); 00354 data = M2MTLVSerializer::serialize(this, data_length); 00355 } 00356 00357 coap_response->payload_len = data_length; 00358 coap_response->payload_ptr = data; 00359 00360 coap_response->options_list_ptr = sn_nsdl_alloc_options_list(nsdl, coap_response); 00361 if (coap_response->options_list_ptr) { 00362 coap_response->options_list_ptr->max_age = max_age(); 00363 } 00364 00365 if(received_coap_header->options_list_ptr) { 00366 if(received_coap_header->options_list_ptr->observe != -1) { 00367 handle_observation(nsdl, *received_coap_header, *coap_response, observation_handler, msg_code); 00368 } 00369 } 00370 } else { 00371 tr_error("M2MResource::handle_get_request() - Content-Type %d not supported", coap_response->content_format); 00372 msg_code = COAP_MSG_CODE_RESPONSE_NOT_ACCEPTABLE; 00373 } 00374 } 00375 } else { 00376 tr_error("M2MResource::handle_get_request - Return COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED"); 00377 // Operation is not allowed. 00378 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; 00379 } 00380 } 00381 if(coap_response) { 00382 coap_response->msg_code = msg_code; 00383 } 00384 } else { 00385 coap_response = M2MResourceBase::handle_get_request(nsdl, 00386 received_coap_header, 00387 observation_handler); 00388 } 00389 return coap_response; 00390 } 00391 00392 sn_coap_hdr_s* M2MResource::handle_put_request(nsdl_s *nsdl, 00393 sn_coap_hdr_s *received_coap_header, 00394 M2MObservationHandler *observation_handler, 00395 bool &execute_value_updated) 00396 { 00397 tr_info("M2MResource::handle_put_request()"); 00398 sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; // 2.04 00399 sn_coap_hdr_s * coap_response = NULL; 00400 if(supports_multiple_instances()) { 00401 coap_response = sn_nsdl_build_response(nsdl, 00402 received_coap_header, 00403 msg_code); 00404 // process the PUT if we have registered a callback for it 00405 if(received_coap_header) { 00406 uint16_t coap_content_type = 0; 00407 bool content_type_present = false; 00408 if(received_coap_header->content_format != COAP_CT_NONE && coap_response) { 00409 content_type_present = true; 00410 coap_content_type = received_coap_header->content_format; 00411 } 00412 if(received_coap_header->options_list_ptr && 00413 received_coap_header->options_list_ptr->uri_query_ptr) { 00414 char *query = (char*)alloc_string_copy(received_coap_header->options_list_ptr->uri_query_ptr, 00415 received_coap_header->options_list_ptr->uri_query_len); 00416 if (query){ 00417 msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; 00418 tr_info("M2MResource::handle_put_request() - query %s", query); 00419 // if anything was updated, re-initialize the stored notification attributes 00420 if (!handle_observation_attribute(query)){ 00421 tr_debug("M2MResource::handle_put_request() - Invalid query"); 00422 msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; // 4.00 00423 } 00424 free(query); 00425 } 00426 } else if ((operation() & M2MBase::PUT_ALLOWED) != 0) { 00427 if(!content_type_present && 00428 (M2MBase::coap_content_type() == COAP_CONTENT_OMA_TLV_TYPE || 00429 M2MBase::coap_content_type() == COAP_CONTENT_OMA_TLV_TYPE_OLD)) { 00430 coap_content_type = COAP_CONTENT_OMA_TLV_TYPE; 00431 } 00432 00433 tr_debug("M2MResource::handle_put_request() - Request Content-type: %d", coap_content_type); 00434 00435 if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type || 00436 COAP_CONTENT_OMA_TLV_TYPE_OLD == coap_content_type) { 00437 set_coap_content_type(coap_content_type); 00438 M2MTLVDeserializer::Error error = M2MTLVDeserializer::None; 00439 error = M2MTLVDeserializer::deserialize_resource_instances(received_coap_header->payload_ptr, 00440 received_coap_header->payload_len, 00441 *this, 00442 M2MTLVDeserializer::Put); 00443 switch(error) { 00444 case M2MTLVDeserializer::None: 00445 if(observation_handler) { 00446 String value = ""; 00447 if (received_coap_header->uri_path_ptr != NULL && 00448 received_coap_header->uri_path_len > 0) { 00449 00450 value.append_raw((char*)received_coap_header->uri_path_ptr,received_coap_header->uri_path_len); 00451 } 00452 execute_value_updated = true; 00453 } 00454 msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; 00455 break; 00456 case M2MTLVDeserializer::NotFound: 00457 msg_code = COAP_MSG_CODE_RESPONSE_NOT_FOUND; 00458 break; 00459 case M2MTLVDeserializer::NotAllowed: 00460 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; 00461 break; 00462 case M2MTLVDeserializer::NotValid: 00463 msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; 00464 break; 00465 case M2MTLVDeserializer::OutOfMemory: 00466 msg_code = COAP_MSG_CODE_RESPONSE_REQUEST_ENTITY_TOO_LARGE; 00467 break; 00468 } 00469 } else { 00470 msg_code =COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT; 00471 } // if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type) 00472 } else { 00473 // Operation is not allowed. 00474 tr_error("M2MResource::handle_put_request() - COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED"); 00475 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; 00476 } 00477 } else { 00478 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; 00479 } 00480 if(coap_response) { 00481 coap_response->msg_code = msg_code; 00482 } 00483 } else { 00484 coap_response = M2MResourceBase::handle_put_request(nsdl, 00485 received_coap_header, 00486 observation_handler, 00487 execute_value_updated); 00488 } 00489 return coap_response; 00490 } 00491 00492 00493 sn_coap_hdr_s* M2MResource::handle_post_request(nsdl_s *nsdl, 00494 sn_coap_hdr_s *received_coap_header, 00495 M2MObservationHandler */*observation_handler*/, 00496 bool &/*execute_value_updated*/, 00497 sn_nsdl_addr_s *address) 00498 { 00499 tr_info("M2MResource::handle_post_request()"); 00500 sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; // 2.04 00501 sn_coap_hdr_s * coap_response = sn_nsdl_build_response(nsdl, 00502 received_coap_header, 00503 msg_code); 00504 00505 // process the POST if we have registered a callback for it 00506 if(received_coap_header) { 00507 if ((operation() & M2MBase::POST_ALLOWED) != 0) { 00508 #ifndef MEMORY_OPTIMIZED_API 00509 const String &obj_name = object_name(); 00510 const String &res_name = name(); 00511 M2MResource::M2MExecuteParameter exec_params(obj_name, res_name, object_instance_id()); 00512 #else 00513 M2MResource::M2MExecuteParameter exec_params(object_name(), name(), object_instance_id()); 00514 #endif 00515 00516 00517 00518 uint16_t coap_content_type = 0; 00519 if(received_coap_header->payload_ptr) { 00520 if(received_coap_header->content_format != COAP_CT_NONE) { 00521 coap_content_type = received_coap_header->content_format; 00522 } 00523 00524 if(coap_content_type == COAP_CT_TEXT_PLAIN) { 00525 exec_params._value = received_coap_header->payload_ptr; 00526 if (exec_params._value) { 00527 exec_params._value_length = received_coap_header->payload_len; 00528 } 00529 } else { 00530 msg_code = COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT; 00531 } 00532 } 00533 if(COAP_MSG_CODE_RESPONSE_CHANGED == msg_code) { 00534 tr_debug("M2MResource::handle_post_request - Execute resource function"); 00535 #ifndef DISABLE_DELAYED_RESPONSE 00536 if (coap_response) { 00537 if(_delayed_response) { 00538 if(received_coap_header->token_len) { 00539 free(_delayed_token); 00540 _delayed_token = NULL; 00541 _delayed_token_len = 0; 00542 _delayed_token = alloc_copy(received_coap_header->token_ptr, received_coap_header->token_len); 00543 if(_delayed_token) { 00544 _delayed_token_len = received_coap_header->token_len; 00545 } 00546 } 00547 } else { 00548 #endif 00549 uint32_t length = 0; 00550 get_value(coap_response->payload_ptr, length); 00551 coap_response->payload_len = length; 00552 #ifndef DISABLE_DELAYED_RESPONSE 00553 } 00554 } 00555 #endif 00556 execute(&exec_params); 00557 } 00558 00559 } else { // if ((object->operation() & SN_GRS_POST_ALLOWED) != 0) 00560 tr_error("M2MResource::handle_post_request - COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED"); 00561 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; // 4.05 00562 } 00563 } else { //if(object && received_coap_header) 00564 tr_error("M2MResource::handle_post_request - COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED"); 00565 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; // 4.01 00566 } 00567 if(coap_response) { 00568 coap_response->msg_code = msg_code; 00569 } 00570 return coap_response; 00571 } 00572 00573 M2MBase *M2MResource::get_parent() const 00574 { 00575 return (M2MBase *) &get_parent_object_instance(); 00576 } 00577 00578 M2MObjectInstance& M2MResource::get_parent_object_instance() const 00579 { 00580 return _parent; 00581 } 00582 00583 uint16_t M2MResource::object_instance_id() const 00584 { 00585 const M2MObjectInstance& parent_object_instance = get_parent_object_instance(); 00586 return parent_object_instance.instance_id(); 00587 } 00588 00589 M2MResource& M2MResource::get_parent_resource() const 00590 { 00591 return (M2MResource&)*this; 00592 } 00593 00594 const char* M2MResource::object_name() const 00595 { 00596 const M2MObjectInstance& parent_object_instance = _parent; 00597 const M2MObject& parent_object = parent_object_instance.get_parent_object(); 00598 00599 return parent_object.name(); 00600 } 00601 00602 #ifdef MEMORY_OPTIMIZED_API 00603 M2MResource::M2MExecuteParameter::M2MExecuteParameter(const char *object_name, const char *resource_name, 00604 uint16_t object_instance_id) : 00605 _object_name(object_name), 00606 _resource_name(resource_name), 00607 _value(NULL), 00608 _value_length(0), 00609 _object_instance_id(object_instance_id) 00610 { 00611 } 00612 #else 00613 M2MResource::M2MExecuteParameter::M2MExecuteParameter(const String &object_name, 00614 const String &resource_name, 00615 uint16_t object_instance_id) : 00616 _object_name(object_name), 00617 _resource_name(resource_name), 00618 _value(NULL), 00619 _value_length(0), 00620 _object_instance_id(object_instance_id) 00621 { 00622 } 00623 #endif 00624 00625 // These could be actually changed to be inline ones, as it would likely generate 00626 // smaller code at application side. 00627 00628 const uint8_t *M2MResource::M2MExecuteParameter::get_argument_value() const 00629 { 00630 return _value; 00631 } 00632 00633 uint16_t M2MResource::M2MExecuteParameter::get_argument_value_length() const 00634 { 00635 return _value_length; 00636 } 00637 00638 #ifdef MEMORY_OPTIMIZED_API 00639 const char* M2MResource::M2MExecuteParameter::get_argument_object_name() const 00640 { 00641 return _object_name; 00642 } 00643 00644 const char* M2MResource::M2MExecuteParameter::get_argument_resource_name() const 00645 { 00646 return _resource_name; 00647 } 00648 #else 00649 const String& M2MResource::M2MExecuteParameter::get_argument_object_name() const 00650 { 00651 return _object_name; 00652 } 00653 00654 const String& M2MResource::M2MExecuteParameter::get_argument_resource_name() const 00655 { 00656 return _resource_name; 00657 } 00658 #endif 00659 00660 uint16_t M2MResource::M2MExecuteParameter::get_argument_object_instance_id() const 00661 { 00662 return _object_instance_id; 00663 }
Generated on Tue Jul 12 2022 20:21:00 by
