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
djmeyers 0:06ee5f8a484a 17 #include "mbed-client/m2mbase.h"
djmeyers 0:06ee5f8a484a 18 #include "mbed-client/m2mobservationhandler.h"
djmeyers 0:06ee5f8a484a 19 #include "mbed-client/m2mconstants.h"
djmeyers 0:06ee5f8a484a 20 #include "mbed-client/m2mtimer.h"
djmeyers 0:06ee5f8a484a 21
djmeyers 0:06ee5f8a484a 22 #include "mbed-client/m2mobject.h"
djmeyers 0:06ee5f8a484a 23 #include "mbed-client/m2mobjectinstance.h"
djmeyers 0:06ee5f8a484a 24 #include "mbed-client/m2mresource.h"
djmeyers 0:06ee5f8a484a 25
djmeyers 0:06ee5f8a484a 26 #include "include/m2mreporthandler.h"
djmeyers 0:06ee5f8a484a 27 #include "include/nsdlaccesshelper.h"
djmeyers 0:06ee5f8a484a 28 #include "mbed-trace/mbed_trace.h"
djmeyers 0:06ee5f8a484a 29 #include <assert.h>
djmeyers 0:06ee5f8a484a 30 #include <ctype.h>
djmeyers 0:06ee5f8a484a 31 #include <string.h>
djmeyers 0:06ee5f8a484a 32 #include <stdlib.h>
djmeyers 0:06ee5f8a484a 33
djmeyers 0:06ee5f8a484a 34 #define TRACE_GROUP "mClt"
djmeyers 0:06ee5f8a484a 35
djmeyers 0:06ee5f8a484a 36 M2MBase::M2MBase(const String& resource_name,
djmeyers 0:06ee5f8a484a 37 M2MBase::Mode mode,
djmeyers 0:06ee5f8a484a 38 const String &resource_type,
djmeyers 0:06ee5f8a484a 39 char *path,
djmeyers 0:06ee5f8a484a 40 bool external_blockwise_store)
djmeyers 0:06ee5f8a484a 41 :
djmeyers 0:06ee5f8a484a 42 _sn_resource(NULL),
djmeyers 0:06ee5f8a484a 43 _report_handler(NULL),
djmeyers 0:06ee5f8a484a 44 _observation_handler(NULL),
djmeyers 0:06ee5f8a484a 45 _token(NULL),
djmeyers 0:06ee5f8a484a 46 _function_pointer(NULL),
djmeyers 0:06ee5f8a484a 47 _value_updated_callback(NULL),
djmeyers 0:06ee5f8a484a 48 _observation_number(0),
djmeyers 0:06ee5f8a484a 49 _token_length(0),
djmeyers 0:06ee5f8a484a 50 _observation_level(M2MBase::None),
djmeyers 0:06ee5f8a484a 51 _is_under_observation(false)
djmeyers 0:06ee5f8a484a 52 {
djmeyers 0:06ee5f8a484a 53 // Checking the name length properly, i.e returning error is impossible from constructor without exceptions
djmeyers 0:06ee5f8a484a 54 assert(resource_name.length() <= MAX_ALLOWED_STRING_LENGTH);
djmeyers 0:06ee5f8a484a 55
djmeyers 0:06ee5f8a484a 56 _sn_resource = (lwm2m_parameters_s*)memory_alloc(sizeof(lwm2m_parameters_s));
djmeyers 0:06ee5f8a484a 57 if(_sn_resource) {
djmeyers 0:06ee5f8a484a 58 memset(_sn_resource, 0, sizeof(lwm2m_parameters_s));
djmeyers 0:06ee5f8a484a 59 _sn_resource->free_on_delete = true;
djmeyers 0:06ee5f8a484a 60 _sn_resource->dynamic_resource_params =
djmeyers 0:06ee5f8a484a 61 (sn_nsdl_dynamic_resource_parameters_s*)memory_alloc(sizeof(sn_nsdl_dynamic_resource_parameters_s));
djmeyers 0:06ee5f8a484a 62 if(_sn_resource->dynamic_resource_params) {
djmeyers 0:06ee5f8a484a 63 memset(_sn_resource->dynamic_resource_params,
djmeyers 0:06ee5f8a484a 64 0, sizeof(sn_nsdl_dynamic_resource_parameters_s));
djmeyers 0:06ee5f8a484a 65 _sn_resource->dynamic_resource_params->static_resource_parameters =
djmeyers 0:06ee5f8a484a 66 (sn_nsdl_static_resource_parameters_s*)memory_alloc(sizeof(sn_nsdl_static_resource_parameters_s));
djmeyers 0:06ee5f8a484a 67
djmeyers 0:06ee5f8a484a 68 // Set callback function in case of dynamic resource
djmeyers 0:06ee5f8a484a 69 if (M2MBase::Dynamic == mode) {
djmeyers 0:06ee5f8a484a 70 _sn_resource->dynamic_resource_params->sn_grs_dyn_res_callback = __nsdl_c_callback;
djmeyers 0:06ee5f8a484a 71 }
djmeyers 0:06ee5f8a484a 72
djmeyers 0:06ee5f8a484a 73 if(_sn_resource->dynamic_resource_params->static_resource_parameters) {
djmeyers 0:06ee5f8a484a 74 // Cast const away to able to compile using MEMORY_OPTIMIZED_API flag
djmeyers 0:06ee5f8a484a 75 sn_nsdl_static_resource_parameters_s *params =
djmeyers 0:06ee5f8a484a 76 const_cast<sn_nsdl_static_resource_parameters_s *>(_sn_resource->dynamic_resource_params->static_resource_parameters);
djmeyers 0:06ee5f8a484a 77 memset(params, 0, sizeof(sn_nsdl_static_resource_parameters_s));
djmeyers 0:06ee5f8a484a 78 const size_t len = strlen(resource_type.c_str());
djmeyers 0:06ee5f8a484a 79 if (len > 0) {
djmeyers 0:06ee5f8a484a 80 params->resource_type_ptr = (char*)
djmeyers 0:06ee5f8a484a 81 alloc_string_copy((uint8_t*) resource_type.c_str(), len);
djmeyers 0:06ee5f8a484a 82 }
djmeyers 0:06ee5f8a484a 83 params->path = (uint8_t*)path;
djmeyers 0:06ee5f8a484a 84 params->pathlen = strlen(path);
djmeyers 0:06ee5f8a484a 85
djmeyers 0:06ee5f8a484a 86
djmeyers 0:06ee5f8a484a 87 params->mode = (const uint8_t)mode;
djmeyers 0:06ee5f8a484a 88 params->free_on_delete = true;
djmeyers 0:06ee5f8a484a 89 params->external_memory_block = external_blockwise_store;
djmeyers 0:06ee5f8a484a 90 _sn_resource->dynamic_resource_params->static_resource_parameters = params;
djmeyers 0:06ee5f8a484a 91 }
djmeyers 0:06ee5f8a484a 92 }
djmeyers 0:06ee5f8a484a 93
djmeyers 0:06ee5f8a484a 94 _sn_resource->name = stringdup((char*)resource_name.c_str());
djmeyers 0:06ee5f8a484a 95 _sn_resource->dynamic_resource_params->publish_uri = true;
djmeyers 0:06ee5f8a484a 96 _sn_resource->dynamic_resource_params->free_on_delete = true;
djmeyers 0:06ee5f8a484a 97
djmeyers 0:06ee5f8a484a 98 if(is_integer(resource_name) && resource_name.size() <= MAX_ALLOWED_STRING_LENGTH) {
djmeyers 0:06ee5f8a484a 99 _sn_resource->name_id = strtoul(resource_name.c_str(), NULL, 10);
djmeyers 0:06ee5f8a484a 100 if(_sn_resource->name_id > 65535){
djmeyers 0:06ee5f8a484a 101 _sn_resource->name_id = -1;
djmeyers 0:06ee5f8a484a 102 }
djmeyers 0:06ee5f8a484a 103 } else {
djmeyers 0:06ee5f8a484a 104 _sn_resource->name_id = -1;
djmeyers 0:06ee5f8a484a 105 }
djmeyers 0:06ee5f8a484a 106 }
djmeyers 0:06ee5f8a484a 107 }
djmeyers 0:06ee5f8a484a 108
djmeyers 0:06ee5f8a484a 109 M2MBase::M2MBase(const lwm2m_parameters_s *s):
djmeyers 0:06ee5f8a484a 110 _sn_resource((lwm2m_parameters_s*) s),
djmeyers 0:06ee5f8a484a 111 _report_handler(NULL),
djmeyers 0:06ee5f8a484a 112 _observation_handler(NULL),
djmeyers 0:06ee5f8a484a 113 _token(NULL),
djmeyers 0:06ee5f8a484a 114 _function_pointer(NULL),
djmeyers 0:06ee5f8a484a 115 _value_updated_callback(NULL),
djmeyers 0:06ee5f8a484a 116 _observation_number(0),
djmeyers 0:06ee5f8a484a 117 _token_length(0),
djmeyers 0:06ee5f8a484a 118 _observation_level(M2MBase::None),
djmeyers 0:06ee5f8a484a 119 _is_under_observation(false)
djmeyers 0:06ee5f8a484a 120 {
djmeyers 0:06ee5f8a484a 121 // Set callback function in case of dynamic resource
djmeyers 0:06ee5f8a484a 122 if (M2MBase::Dynamic == _sn_resource->dynamic_resource_params->static_resource_parameters->mode) {
djmeyers 0:06ee5f8a484a 123 _sn_resource->dynamic_resource_params->sn_grs_dyn_res_callback = __nsdl_c_callback;
djmeyers 0:06ee5f8a484a 124 }
djmeyers 0:06ee5f8a484a 125 }
djmeyers 0:06ee5f8a484a 126
djmeyers 0:06ee5f8a484a 127 M2MBase::~M2MBase()
djmeyers 0:06ee5f8a484a 128 {
djmeyers 0:06ee5f8a484a 129 delete _report_handler;
djmeyers 0:06ee5f8a484a 130 free_resources();
djmeyers 0:06ee5f8a484a 131 free(_token);
djmeyers 0:06ee5f8a484a 132 delete _function_pointer;
djmeyers 0:06ee5f8a484a 133 delete _value_updated_callback;
djmeyers 0:06ee5f8a484a 134 }
djmeyers 0:06ee5f8a484a 135
djmeyers 0:06ee5f8a484a 136 char* M2MBase::create_path(const M2MObject &parent, uint16_t object_instance)
djmeyers 0:06ee5f8a484a 137 {
djmeyers 0:06ee5f8a484a 138 StringBuffer<5> obj_inst_id;
djmeyers 0:06ee5f8a484a 139 obj_inst_id.append_int(object_instance);
djmeyers 0:06ee5f8a484a 140
djmeyers 0:06ee5f8a484a 141 return create_path(parent, obj_inst_id.c_str());
djmeyers 0:06ee5f8a484a 142 }
djmeyers 0:06ee5f8a484a 143
djmeyers 0:06ee5f8a484a 144 char* M2MBase::create_path(const M2MObject &parent, const char *name)
djmeyers 0:06ee5f8a484a 145 {
djmeyers 0:06ee5f8a484a 146 char * result = NULL;
djmeyers 0:06ee5f8a484a 147 StringBuffer<(MAX_NAME_SIZE * 2 + (2 + 1))> path;
djmeyers 0:06ee5f8a484a 148
djmeyers 0:06ee5f8a484a 149 const char* obj_name = parent.name();
djmeyers 0:06ee5f8a484a 150
djmeyers 0:06ee5f8a484a 151 // XXX: ensure space
djmeyers 0:06ee5f8a484a 152 path.append(obj_name);
djmeyers 0:06ee5f8a484a 153 path.append('/');
djmeyers 0:06ee5f8a484a 154 path.append(name);
djmeyers 0:06ee5f8a484a 155
djmeyers 0:06ee5f8a484a 156 result = stringdup(path.c_str());
djmeyers 0:06ee5f8a484a 157 return result;
djmeyers 0:06ee5f8a484a 158 }
djmeyers 0:06ee5f8a484a 159
djmeyers 0:06ee5f8a484a 160 char* M2MBase::create_path(const M2MResource &parent, uint16_t resource_instance)
djmeyers 0:06ee5f8a484a 161 {
djmeyers 0:06ee5f8a484a 162 StringBuffer<5> res_inst;
djmeyers 0:06ee5f8a484a 163 res_inst.append_int(resource_instance);
djmeyers 0:06ee5f8a484a 164
djmeyers 0:06ee5f8a484a 165 return create_path(parent, res_inst.c_str());
djmeyers 0:06ee5f8a484a 166 }
djmeyers 0:06ee5f8a484a 167
djmeyers 0:06ee5f8a484a 168 char* M2MBase::create_path(const M2MResource &parent, const char *name)
djmeyers 0:06ee5f8a484a 169 {
djmeyers 0:06ee5f8a484a 170 char * result = NULL;
djmeyers 0:06ee5f8a484a 171 StringBuffer<(MAX_NAME_SIZE * 4 + (3 + 1))> path;
djmeyers 0:06ee5f8a484a 172 M2MObjectInstance& parent_object_instance = parent.get_parent_object_instance();
djmeyers 0:06ee5f8a484a 173 M2MObject& parent_object = parent_object_instance.get_parent_object();
djmeyers 0:06ee5f8a484a 174
djmeyers 0:06ee5f8a484a 175 const char* obj_name = parent_object.name();
djmeyers 0:06ee5f8a484a 176
djmeyers 0:06ee5f8a484a 177 // Note: the parent_object_instance.name() contains name of its parent object, not the name of instance,
djmeyers 0:06ee5f8a484a 178 // so we need to skip that here
djmeyers 0:06ee5f8a484a 179 const uint16_t obj_inst_id = parent_object_instance.instance_id();
djmeyers 0:06ee5f8a484a 180
djmeyers 0:06ee5f8a484a 181 const char* resource_name = parent.name();
djmeyers 0:06ee5f8a484a 182
djmeyers 0:06ee5f8a484a 183 // XXX: ensure space
djmeyers 0:06ee5f8a484a 184 path.append(obj_name);
djmeyers 0:06ee5f8a484a 185 path.append('/');
djmeyers 0:06ee5f8a484a 186 path.append_int(obj_inst_id);
djmeyers 0:06ee5f8a484a 187 path.append('/');
djmeyers 0:06ee5f8a484a 188 path.append(resource_name);
djmeyers 0:06ee5f8a484a 189 path.append('/');
djmeyers 0:06ee5f8a484a 190 path.append(name);
djmeyers 0:06ee5f8a484a 191
djmeyers 0:06ee5f8a484a 192 result = stringdup(path.c_str());
djmeyers 0:06ee5f8a484a 193 return result;
djmeyers 0:06ee5f8a484a 194 }
djmeyers 0:06ee5f8a484a 195
djmeyers 0:06ee5f8a484a 196 char* M2MBase::create_path(const M2MObjectInstance &parent, const char *name)
djmeyers 0:06ee5f8a484a 197 {
djmeyers 0:06ee5f8a484a 198 char * result = NULL;
djmeyers 0:06ee5f8a484a 199 StringBuffer<(MAX_NAME_SIZE * 3 + (2 + 1))> path;
djmeyers 0:06ee5f8a484a 200 M2MObject& parent_object = parent.get_parent_object();
djmeyers 0:06ee5f8a484a 201
djmeyers 0:06ee5f8a484a 202 const char* obj_name = parent_object.name();
djmeyers 0:06ee5f8a484a 203 // Note: the parent_object_instance.name() contains name of its parent object, not the name of instance,
djmeyers 0:06ee5f8a484a 204 // so we need to skip that here
djmeyers 0:06ee5f8a484a 205 const uint16_t obj_inst_id = parent.instance_id();
djmeyers 0:06ee5f8a484a 206
djmeyers 0:06ee5f8a484a 207 // XXX: ensure space
djmeyers 0:06ee5f8a484a 208 path.append(obj_name);
djmeyers 0:06ee5f8a484a 209 path.append('/');
djmeyers 0:06ee5f8a484a 210 path.append_int(obj_inst_id);
djmeyers 0:06ee5f8a484a 211 path.append('/');
djmeyers 0:06ee5f8a484a 212 path.append(name);
djmeyers 0:06ee5f8a484a 213
djmeyers 0:06ee5f8a484a 214 result = stringdup(path.c_str());
djmeyers 0:06ee5f8a484a 215 return result;
djmeyers 0:06ee5f8a484a 216 }
djmeyers 0:06ee5f8a484a 217
djmeyers 0:06ee5f8a484a 218
djmeyers 0:06ee5f8a484a 219 void M2MBase::set_operation(M2MBase::Operation opr)
djmeyers 0:06ee5f8a484a 220 {
djmeyers 0:06ee5f8a484a 221 // If the mode is Static, there is only GET_ALLOWED supported.
djmeyers 0:06ee5f8a484a 222 if(M2MBase::Static == mode()) {
djmeyers 0:06ee5f8a484a 223 _sn_resource->dynamic_resource_params->access = M2MBase::GET_ALLOWED;
djmeyers 0:06ee5f8a484a 224 } else {
djmeyers 0:06ee5f8a484a 225 _sn_resource->dynamic_resource_params->access = opr;
djmeyers 0:06ee5f8a484a 226 }
djmeyers 0:06ee5f8a484a 227 }
djmeyers 0:06ee5f8a484a 228
djmeyers 0:06ee5f8a484a 229 #ifndef MEMORY_OPTIMIZED_API
djmeyers 0:06ee5f8a484a 230 void M2MBase::set_interface_description(const char *desc)
djmeyers 0:06ee5f8a484a 231 {
djmeyers 0:06ee5f8a484a 232 assert(_sn_resource->dynamic_resource_params->static_resource_parameters->free_on_delete);
djmeyers 0:06ee5f8a484a 233 free(_sn_resource->dynamic_resource_params->static_resource_parameters->interface_description_ptr);
djmeyers 0:06ee5f8a484a 234 _sn_resource->dynamic_resource_params->static_resource_parameters->interface_description_ptr = NULL;
djmeyers 0:06ee5f8a484a 235 const size_t len = strlen(desc);
djmeyers 0:06ee5f8a484a 236 if (len > 0 ) {
djmeyers 0:06ee5f8a484a 237 _sn_resource->dynamic_resource_params->static_resource_parameters->interface_description_ptr =
djmeyers 0:06ee5f8a484a 238 (char*)alloc_string_copy((uint8_t*) desc, len);
djmeyers 0:06ee5f8a484a 239 }
djmeyers 0:06ee5f8a484a 240 }
djmeyers 0:06ee5f8a484a 241
djmeyers 0:06ee5f8a484a 242 void M2MBase::set_interface_description(const String &desc)
djmeyers 0:06ee5f8a484a 243 {
djmeyers 0:06ee5f8a484a 244 assert(_sn_resource->dynamic_resource_params->static_resource_parameters->free_on_delete);
djmeyers 0:06ee5f8a484a 245 set_interface_description(desc.c_str());
djmeyers 0:06ee5f8a484a 246 }
djmeyers 0:06ee5f8a484a 247
djmeyers 0:06ee5f8a484a 248 void M2MBase::set_resource_type(const String &res_type)
djmeyers 0:06ee5f8a484a 249 {
djmeyers 0:06ee5f8a484a 250 assert(_sn_resource->dynamic_resource_params->static_resource_parameters->free_on_delete);
djmeyers 0:06ee5f8a484a 251 set_resource_type(res_type.c_str());
djmeyers 0:06ee5f8a484a 252 }
djmeyers 0:06ee5f8a484a 253
djmeyers 0:06ee5f8a484a 254 void M2MBase::set_resource_type(const char *res_type)
djmeyers 0:06ee5f8a484a 255 {
djmeyers 0:06ee5f8a484a 256 assert(_sn_resource->dynamic_resource_params->static_resource_parameters->free_on_delete);
djmeyers 0:06ee5f8a484a 257 free(_sn_resource->dynamic_resource_params->static_resource_parameters->resource_type_ptr);
djmeyers 0:06ee5f8a484a 258 _sn_resource->dynamic_resource_params->static_resource_parameters->resource_type_ptr = NULL;
djmeyers 0:06ee5f8a484a 259 const size_t len = strlen(res_type);
djmeyers 0:06ee5f8a484a 260 if (len > 0) {
djmeyers 0:06ee5f8a484a 261 _sn_resource->dynamic_resource_params->static_resource_parameters->resource_type_ptr = (char*)
djmeyers 0:06ee5f8a484a 262 alloc_string_copy((uint8_t*) res_type, len);
djmeyers 0:06ee5f8a484a 263 }
djmeyers 0:06ee5f8a484a 264 }
djmeyers 0:06ee5f8a484a 265 #endif
djmeyers 0:06ee5f8a484a 266
djmeyers 0:06ee5f8a484a 267 void M2MBase::set_coap_content_type(const uint8_t con_type)
djmeyers 0:06ee5f8a484a 268 {
djmeyers 0:06ee5f8a484a 269 _sn_resource->dynamic_resource_params->coap_content_type = con_type;
djmeyers 0:06ee5f8a484a 270 }
djmeyers 0:06ee5f8a484a 271
djmeyers 0:06ee5f8a484a 272 void M2MBase::set_observable(bool observable)
djmeyers 0:06ee5f8a484a 273 {
djmeyers 0:06ee5f8a484a 274 _sn_resource->dynamic_resource_params->observable = observable;
djmeyers 0:06ee5f8a484a 275 }
djmeyers 0:06ee5f8a484a 276
djmeyers 0:06ee5f8a484a 277 void M2MBase::add_observation_level(M2MBase::Observation obs_level)
djmeyers 0:06ee5f8a484a 278 {
djmeyers 0:06ee5f8a484a 279 _observation_level = (M2MBase::Observation)(_observation_level | obs_level);
djmeyers 0:06ee5f8a484a 280 }
djmeyers 0:06ee5f8a484a 281
djmeyers 0:06ee5f8a484a 282 void M2MBase::remove_observation_level(M2MBase::Observation obs_level)
djmeyers 0:06ee5f8a484a 283 {
djmeyers 0:06ee5f8a484a 284 _observation_level = (M2MBase::Observation)(_observation_level & ~obs_level);
djmeyers 0:06ee5f8a484a 285 }
djmeyers 0:06ee5f8a484a 286
djmeyers 0:06ee5f8a484a 287 void M2MBase::set_observation_handler(M2MObservationHandler *handler)
djmeyers 0:06ee5f8a484a 288 {
djmeyers 0:06ee5f8a484a 289 tr_debug("M2MBase::set_observation_handler - handler: 0x%x", handler);
djmeyers 0:06ee5f8a484a 290 _observation_handler = handler;
djmeyers 0:06ee5f8a484a 291 }
djmeyers 0:06ee5f8a484a 292
djmeyers 0:06ee5f8a484a 293
djmeyers 0:06ee5f8a484a 294 void M2MBase::set_under_observation(bool observed,
djmeyers 0:06ee5f8a484a 295 M2MObservationHandler *handler)
djmeyers 0:06ee5f8a484a 296 {
djmeyers 0:06ee5f8a484a 297 tr_debug("M2MBase::set_under_observation - observed: %d", observed);
djmeyers 0:06ee5f8a484a 298 tr_debug("M2MBase::set_under_observation - base_type: %d", base_type());
djmeyers 0:06ee5f8a484a 299 _is_under_observation = observed;
djmeyers 0:06ee5f8a484a 300 _observation_handler = handler;
djmeyers 0:06ee5f8a484a 301 if (handler) {
djmeyers 0:06ee5f8a484a 302 if (base_type() != M2MBase::ResourceInstance) {
djmeyers 0:06ee5f8a484a 303 // Create report handler only if it does not exist and one wants observation
djmeyers 0:06ee5f8a484a 304 // This saves 76 bytes of memory on most usual case.
djmeyers 0:06ee5f8a484a 305 if (observed) {
djmeyers 0:06ee5f8a484a 306 if(!_report_handler) {
djmeyers 0:06ee5f8a484a 307 _report_handler = new M2MReportHandler(*this);
djmeyers 0:06ee5f8a484a 308 }
djmeyers 0:06ee5f8a484a 309 }
djmeyers 0:06ee5f8a484a 310 if (_report_handler) {
djmeyers 0:06ee5f8a484a 311 _report_handler->set_under_observation(observed);
djmeyers 0:06ee5f8a484a 312 }
djmeyers 0:06ee5f8a484a 313 }
djmeyers 0:06ee5f8a484a 314 } else {
djmeyers 0:06ee5f8a484a 315 delete _report_handler;
djmeyers 0:06ee5f8a484a 316 _report_handler = NULL;
djmeyers 0:06ee5f8a484a 317 }
djmeyers 0:06ee5f8a484a 318 }
djmeyers 0:06ee5f8a484a 319
djmeyers 0:06ee5f8a484a 320 void M2MBase::set_observation_token(const uint8_t *token, const uint8_t length)
djmeyers 0:06ee5f8a484a 321 {
djmeyers 0:06ee5f8a484a 322 free(_token);
djmeyers 0:06ee5f8a484a 323 _token = NULL;
djmeyers 0:06ee5f8a484a 324 _token_length = 0;
djmeyers 0:06ee5f8a484a 325
djmeyers 0:06ee5f8a484a 326 if( token != NULL && length > 0 ) {
djmeyers 0:06ee5f8a484a 327 _token = alloc_string_copy((uint8_t *)token, length);
djmeyers 0:06ee5f8a484a 328 if(_token) {
djmeyers 0:06ee5f8a484a 329 _token_length = length;
djmeyers 0:06ee5f8a484a 330 }
djmeyers 0:06ee5f8a484a 331 }
djmeyers 0:06ee5f8a484a 332 }
djmeyers 0:06ee5f8a484a 333
djmeyers 0:06ee5f8a484a 334 void M2MBase::set_instance_id(const uint16_t inst_id)
djmeyers 0:06ee5f8a484a 335 {
djmeyers 0:06ee5f8a484a 336 _sn_resource->instance_id = inst_id;
djmeyers 0:06ee5f8a484a 337 }
djmeyers 0:06ee5f8a484a 338
djmeyers 0:06ee5f8a484a 339 void M2MBase::set_observation_number(const uint16_t /*observation_number*/)
djmeyers 0:06ee5f8a484a 340 {
djmeyers 0:06ee5f8a484a 341 }
djmeyers 0:06ee5f8a484a 342
djmeyers 0:06ee5f8a484a 343 void M2MBase::set_max_age(const uint32_t max_age)
djmeyers 0:06ee5f8a484a 344 {
djmeyers 0:06ee5f8a484a 345 _sn_resource->max_age = max_age;
djmeyers 0:06ee5f8a484a 346 }
djmeyers 0:06ee5f8a484a 347
djmeyers 0:06ee5f8a484a 348 M2MBase::BaseType M2MBase::base_type() const
djmeyers 0:06ee5f8a484a 349 {
djmeyers 0:06ee5f8a484a 350 return (M2MBase::BaseType)_sn_resource->base_type;
djmeyers 0:06ee5f8a484a 351 }
djmeyers 0:06ee5f8a484a 352
djmeyers 0:06ee5f8a484a 353 M2MBase::Operation M2MBase::operation() const
djmeyers 0:06ee5f8a484a 354 {
djmeyers 0:06ee5f8a484a 355 return (M2MBase::Operation)_sn_resource->dynamic_resource_params->access;
djmeyers 0:06ee5f8a484a 356 }
djmeyers 0:06ee5f8a484a 357
djmeyers 0:06ee5f8a484a 358 const char* M2MBase::name() const
djmeyers 0:06ee5f8a484a 359 {
djmeyers 0:06ee5f8a484a 360 return _sn_resource->name;
djmeyers 0:06ee5f8a484a 361 }
djmeyers 0:06ee5f8a484a 362
djmeyers 0:06ee5f8a484a 363 int32_t M2MBase::name_id() const
djmeyers 0:06ee5f8a484a 364 {
djmeyers 0:06ee5f8a484a 365 return _sn_resource->name_id;
djmeyers 0:06ee5f8a484a 366 }
djmeyers 0:06ee5f8a484a 367
djmeyers 0:06ee5f8a484a 368 uint16_t M2MBase::instance_id() const
djmeyers 0:06ee5f8a484a 369 {
djmeyers 0:06ee5f8a484a 370 return _sn_resource->instance_id;
djmeyers 0:06ee5f8a484a 371 }
djmeyers 0:06ee5f8a484a 372
djmeyers 0:06ee5f8a484a 373 const char* M2MBase::interface_description() const
djmeyers 0:06ee5f8a484a 374 {
djmeyers 0:06ee5f8a484a 375 return (reinterpret_cast<char*>(
djmeyers 0:06ee5f8a484a 376 _sn_resource->dynamic_resource_params->static_resource_parameters->interface_description_ptr));
djmeyers 0:06ee5f8a484a 377 }
djmeyers 0:06ee5f8a484a 378
djmeyers 0:06ee5f8a484a 379 const char* M2MBase::resource_type() const
djmeyers 0:06ee5f8a484a 380 {
djmeyers 0:06ee5f8a484a 381 return (reinterpret_cast<char*>(
djmeyers 0:06ee5f8a484a 382 _sn_resource->dynamic_resource_params->static_resource_parameters->resource_type_ptr));
djmeyers 0:06ee5f8a484a 383 }
djmeyers 0:06ee5f8a484a 384
djmeyers 0:06ee5f8a484a 385 const char* M2MBase::uri_path() const
djmeyers 0:06ee5f8a484a 386 {
djmeyers 0:06ee5f8a484a 387 return (reinterpret_cast<char*>(
djmeyers 0:06ee5f8a484a 388 _sn_resource->dynamic_resource_params->static_resource_parameters->path));
djmeyers 0:06ee5f8a484a 389 }
djmeyers 0:06ee5f8a484a 390
djmeyers 0:06ee5f8a484a 391 uint8_t M2MBase::coap_content_type() const
djmeyers 0:06ee5f8a484a 392 {
djmeyers 0:06ee5f8a484a 393 return _sn_resource->dynamic_resource_params->coap_content_type;
djmeyers 0:06ee5f8a484a 394 }
djmeyers 0:06ee5f8a484a 395
djmeyers 0:06ee5f8a484a 396 bool M2MBase::is_observable() const
djmeyers 0:06ee5f8a484a 397 {
djmeyers 0:06ee5f8a484a 398 return _sn_resource->dynamic_resource_params->observable;
djmeyers 0:06ee5f8a484a 399 }
djmeyers 0:06ee5f8a484a 400
djmeyers 0:06ee5f8a484a 401 M2MBase::Observation M2MBase::observation_level() const
djmeyers 0:06ee5f8a484a 402 {
djmeyers 0:06ee5f8a484a 403 return _observation_level;
djmeyers 0:06ee5f8a484a 404 }
djmeyers 0:06ee5f8a484a 405
djmeyers 0:06ee5f8a484a 406 void M2MBase::get_observation_token(uint8_t *&token, uint32_t &token_length)
djmeyers 0:06ee5f8a484a 407 {
djmeyers 0:06ee5f8a484a 408 token_length = 0;
djmeyers 0:06ee5f8a484a 409 free(token);
djmeyers 0:06ee5f8a484a 410 if (_token) {
djmeyers 0:06ee5f8a484a 411 token = alloc_string_copy((uint8_t *)_token, _token_length);
djmeyers 0:06ee5f8a484a 412 if(token) {
djmeyers 0:06ee5f8a484a 413 token_length = _token_length;
djmeyers 0:06ee5f8a484a 414 }
djmeyers 0:06ee5f8a484a 415 }
djmeyers 0:06ee5f8a484a 416 }
djmeyers 0:06ee5f8a484a 417
djmeyers 0:06ee5f8a484a 418 M2MBase::Mode M2MBase::mode() const
djmeyers 0:06ee5f8a484a 419 {
djmeyers 0:06ee5f8a484a 420 return (M2MBase::Mode)_sn_resource->dynamic_resource_params->static_resource_parameters->mode;
djmeyers 0:06ee5f8a484a 421 }
djmeyers 0:06ee5f8a484a 422
djmeyers 0:06ee5f8a484a 423 uint16_t M2MBase::observation_number() const
djmeyers 0:06ee5f8a484a 424 {
djmeyers 0:06ee5f8a484a 425 return _observation_number;
djmeyers 0:06ee5f8a484a 426 }
djmeyers 0:06ee5f8a484a 427
djmeyers 0:06ee5f8a484a 428 uint32_t M2MBase::max_age() const
djmeyers 0:06ee5f8a484a 429 {
djmeyers 0:06ee5f8a484a 430 return _sn_resource->max_age;
djmeyers 0:06ee5f8a484a 431 }
djmeyers 0:06ee5f8a484a 432
djmeyers 0:06ee5f8a484a 433 bool M2MBase::handle_observation_attribute(const char *query)
djmeyers 0:06ee5f8a484a 434 {
djmeyers 0:06ee5f8a484a 435 tr_debug("M2MBase::handle_observation_attribute - under observation(%d)", is_under_observation());
djmeyers 0:06ee5f8a484a 436 bool success = false;
djmeyers 0:06ee5f8a484a 437 // Create handler if not already exists. Client must able to parse write attributes even when
djmeyers 0:06ee5f8a484a 438 // observation is not yet set
djmeyers 0:06ee5f8a484a 439 if (!_report_handler) {
djmeyers 0:06ee5f8a484a 440 _report_handler = new M2MReportHandler(*this);
djmeyers 0:06ee5f8a484a 441 }
djmeyers 0:06ee5f8a484a 442
djmeyers 0:06ee5f8a484a 443 success = _report_handler->parse_notification_attribute(query,base_type());
djmeyers 0:06ee5f8a484a 444 if (success) {
djmeyers 0:06ee5f8a484a 445 if (is_under_observation()) {
djmeyers 0:06ee5f8a484a 446 _report_handler->set_under_observation(true);
djmeyers 0:06ee5f8a484a 447 }
djmeyers 0:06ee5f8a484a 448 } else {
djmeyers 0:06ee5f8a484a 449 _report_handler->set_default_values();
djmeyers 0:06ee5f8a484a 450 }
djmeyers 0:06ee5f8a484a 451 return success;
djmeyers 0:06ee5f8a484a 452 }
djmeyers 0:06ee5f8a484a 453
djmeyers 0:06ee5f8a484a 454 void M2MBase::observation_to_be_sent(m2m::Vector<uint16_t> changed_instance_ids, bool send_object)
djmeyers 0:06ee5f8a484a 455 {
djmeyers 0:06ee5f8a484a 456 //TODO: Move this to M2MResourceInstance
djmeyers 0:06ee5f8a484a 457 if(_observation_handler) {
djmeyers 0:06ee5f8a484a 458 _observation_number++;
djmeyers 0:06ee5f8a484a 459 _observation_handler->observation_to_be_sent(this,
djmeyers 0:06ee5f8a484a 460 _observation_number,
djmeyers 0:06ee5f8a484a 461 changed_instance_ids,
djmeyers 0:06ee5f8a484a 462 send_object);
djmeyers 0:06ee5f8a484a 463 }
djmeyers 0:06ee5f8a484a 464 }
djmeyers 0:06ee5f8a484a 465
djmeyers 0:06ee5f8a484a 466 void M2MBase::set_base_type(M2MBase::BaseType type)
djmeyers 0:06ee5f8a484a 467 {
djmeyers 0:06ee5f8a484a 468 assert(_sn_resource->free_on_delete);
djmeyers 0:06ee5f8a484a 469 _sn_resource->base_type = type;
djmeyers 0:06ee5f8a484a 470 }
djmeyers 0:06ee5f8a484a 471
djmeyers 0:06ee5f8a484a 472 sn_coap_hdr_s* M2MBase::handle_get_request(nsdl_s */*nsdl*/,
djmeyers 0:06ee5f8a484a 473 sn_coap_hdr_s */*received_coap_header*/,
djmeyers 0:06ee5f8a484a 474 M2MObservationHandler */*observation_handler*/)
djmeyers 0:06ee5f8a484a 475 {
djmeyers 0:06ee5f8a484a 476 //Handled in M2MResource, M2MObjectInstance and M2MObject classes
djmeyers 0:06ee5f8a484a 477 return NULL;
djmeyers 0:06ee5f8a484a 478 }
djmeyers 0:06ee5f8a484a 479
djmeyers 0:06ee5f8a484a 480 sn_coap_hdr_s* M2MBase::handle_put_request(nsdl_s */*nsdl*/,
djmeyers 0:06ee5f8a484a 481 sn_coap_hdr_s */*received_coap_header*/,
djmeyers 0:06ee5f8a484a 482 M2MObservationHandler */*observation_handler*/,
djmeyers 0:06ee5f8a484a 483 bool &)
djmeyers 0:06ee5f8a484a 484 {
djmeyers 0:06ee5f8a484a 485 //Handled in M2MResource, M2MObjectInstance and M2MObject classes
djmeyers 0:06ee5f8a484a 486 return NULL;
djmeyers 0:06ee5f8a484a 487 }
djmeyers 0:06ee5f8a484a 488
djmeyers 0:06ee5f8a484a 489 sn_coap_hdr_s* M2MBase::handle_post_request(nsdl_s */*nsdl*/,
djmeyers 0:06ee5f8a484a 490 sn_coap_hdr_s */*received_coap_header*/,
djmeyers 0:06ee5f8a484a 491 M2MObservationHandler */*observation_handler*/,
djmeyers 0:06ee5f8a484a 492 bool &,
djmeyers 0:06ee5f8a484a 493 sn_nsdl_addr_s *)
djmeyers 0:06ee5f8a484a 494 {
djmeyers 0:06ee5f8a484a 495 //Handled in M2MResource, M2MObjectInstance and M2MObject classes
djmeyers 0:06ee5f8a484a 496 return NULL;
djmeyers 0:06ee5f8a484a 497 }
djmeyers 0:06ee5f8a484a 498
djmeyers 0:06ee5f8a484a 499 void *M2MBase::memory_alloc(uint32_t size)
djmeyers 0:06ee5f8a484a 500 {
djmeyers 0:06ee5f8a484a 501 if(size)
djmeyers 0:06ee5f8a484a 502 return malloc(size);
djmeyers 0:06ee5f8a484a 503 else
djmeyers 0:06ee5f8a484a 504 return 0;
djmeyers 0:06ee5f8a484a 505 }
djmeyers 0:06ee5f8a484a 506
djmeyers 0:06ee5f8a484a 507 void M2MBase::memory_free(void *ptr)
djmeyers 0:06ee5f8a484a 508 {
djmeyers 0:06ee5f8a484a 509 free(ptr);
djmeyers 0:06ee5f8a484a 510 }
djmeyers 0:06ee5f8a484a 511
djmeyers 0:06ee5f8a484a 512 char* M2MBase::alloc_string_copy(const char* source)
djmeyers 0:06ee5f8a484a 513 {
djmeyers 0:06ee5f8a484a 514 assert(source != NULL);
djmeyers 0:06ee5f8a484a 515
djmeyers 0:06ee5f8a484a 516 // Note: the armcc's libc does not have strdup, so we need to implement it here
djmeyers 0:06ee5f8a484a 517 const size_t len = strlen(source);
djmeyers 0:06ee5f8a484a 518
djmeyers 0:06ee5f8a484a 519 return (char*)alloc_string_copy((uint8_t*)source, len);
djmeyers 0:06ee5f8a484a 520 }
djmeyers 0:06ee5f8a484a 521
djmeyers 0:06ee5f8a484a 522 uint8_t* M2MBase::alloc_string_copy(const uint8_t* source, uint32_t size)
djmeyers 0:06ee5f8a484a 523 {
djmeyers 0:06ee5f8a484a 524 assert(source != NULL);
djmeyers 0:06ee5f8a484a 525
djmeyers 0:06ee5f8a484a 526 uint8_t* result = (uint8_t*)memory_alloc(size + 1);
djmeyers 0:06ee5f8a484a 527 if (result) {
djmeyers 0:06ee5f8a484a 528 memcpy(result, source, size);
djmeyers 0:06ee5f8a484a 529 result[size] = '\0';
djmeyers 0:06ee5f8a484a 530 }
djmeyers 0:06ee5f8a484a 531 return result;
djmeyers 0:06ee5f8a484a 532 }
djmeyers 0:06ee5f8a484a 533
djmeyers 0:06ee5f8a484a 534 uint8_t* M2MBase::alloc_copy(const uint8_t* source, uint32_t size)
djmeyers 0:06ee5f8a484a 535 {
djmeyers 0:06ee5f8a484a 536 assert(source != NULL);
djmeyers 0:06ee5f8a484a 537
djmeyers 0:06ee5f8a484a 538 uint8_t* result = (uint8_t*)memory_alloc(size);
djmeyers 0:06ee5f8a484a 539 if (result) {
djmeyers 0:06ee5f8a484a 540 memcpy(result, source, size);
djmeyers 0:06ee5f8a484a 541 }
djmeyers 0:06ee5f8a484a 542 return result;
djmeyers 0:06ee5f8a484a 543 }
djmeyers 0:06ee5f8a484a 544
djmeyers 0:06ee5f8a484a 545 bool M2MBase::validate_string_length(const String &string, size_t min_length, size_t max_length)
djmeyers 0:06ee5f8a484a 546 {
djmeyers 0:06ee5f8a484a 547 bool valid = false;
djmeyers 0:06ee5f8a484a 548
djmeyers 0:06ee5f8a484a 549 const size_t len = string.length();
djmeyers 0:06ee5f8a484a 550 if ((len >= min_length) && (len <= max_length)) {
djmeyers 0:06ee5f8a484a 551 valid = true;
djmeyers 0:06ee5f8a484a 552 }
djmeyers 0:06ee5f8a484a 553
djmeyers 0:06ee5f8a484a 554 return valid;
djmeyers 0:06ee5f8a484a 555 }
djmeyers 0:06ee5f8a484a 556
djmeyers 0:06ee5f8a484a 557 bool M2MBase::validate_string_length(const char* string, size_t min_length, size_t max_length)
djmeyers 0:06ee5f8a484a 558 {
djmeyers 0:06ee5f8a484a 559 bool valid = false;
djmeyers 0:06ee5f8a484a 560
djmeyers 0:06ee5f8a484a 561 if (string != NULL) {
djmeyers 0:06ee5f8a484a 562 const size_t len = strlen(string);
djmeyers 0:06ee5f8a484a 563 if ((len >= min_length) && (len <= max_length)) {
djmeyers 0:06ee5f8a484a 564 valid = true;
djmeyers 0:06ee5f8a484a 565 }
djmeyers 0:06ee5f8a484a 566 }
djmeyers 0:06ee5f8a484a 567
djmeyers 0:06ee5f8a484a 568 return valid;
djmeyers 0:06ee5f8a484a 569 }
djmeyers 0:06ee5f8a484a 570
djmeyers 0:06ee5f8a484a 571 M2MReportHandler* M2MBase::create_report_handler()
djmeyers 0:06ee5f8a484a 572 {
djmeyers 0:06ee5f8a484a 573 if (!_report_handler) {
djmeyers 0:06ee5f8a484a 574 _report_handler = new M2MReportHandler(*this);
djmeyers 0:06ee5f8a484a 575 }
djmeyers 0:06ee5f8a484a 576 return _report_handler;
djmeyers 0:06ee5f8a484a 577 }
djmeyers 0:06ee5f8a484a 578
djmeyers 0:06ee5f8a484a 579 M2MReportHandler* M2MBase::report_handler()
djmeyers 0:06ee5f8a484a 580 {
djmeyers 0:06ee5f8a484a 581 return _report_handler;
djmeyers 0:06ee5f8a484a 582 }
djmeyers 0:06ee5f8a484a 583
djmeyers 0:06ee5f8a484a 584 M2MObservationHandler* M2MBase::observation_handler()
djmeyers 0:06ee5f8a484a 585 {
djmeyers 0:06ee5f8a484a 586 return _observation_handler;
djmeyers 0:06ee5f8a484a 587 }
djmeyers 0:06ee5f8a484a 588
djmeyers 0:06ee5f8a484a 589 void M2MBase::set_register_uri(bool register_uri)
djmeyers 0:06ee5f8a484a 590 {
djmeyers 0:06ee5f8a484a 591 _sn_resource->dynamic_resource_params->publish_uri = register_uri;
djmeyers 0:06ee5f8a484a 592 }
djmeyers 0:06ee5f8a484a 593
djmeyers 0:06ee5f8a484a 594 bool M2MBase::register_uri()
djmeyers 0:06ee5f8a484a 595 {
djmeyers 0:06ee5f8a484a 596 return _sn_resource->dynamic_resource_params->publish_uri;
djmeyers 0:06ee5f8a484a 597 }
djmeyers 0:06ee5f8a484a 598
djmeyers 0:06ee5f8a484a 599 bool M2MBase::is_integer(const String &value)
djmeyers 0:06ee5f8a484a 600 {
djmeyers 0:06ee5f8a484a 601 const char *s = value.c_str();
djmeyers 0:06ee5f8a484a 602 if(value.empty() || ((!isdigit(s[0])) && (s[0] != '-') && (s[0] != '+'))) {
djmeyers 0:06ee5f8a484a 603 return false;
djmeyers 0:06ee5f8a484a 604 }
djmeyers 0:06ee5f8a484a 605 char * p;
djmeyers 0:06ee5f8a484a 606 strtol(value.c_str(), &p, 10);
djmeyers 0:06ee5f8a484a 607 return (*p == 0);
djmeyers 0:06ee5f8a484a 608 }
djmeyers 0:06ee5f8a484a 609
djmeyers 0:06ee5f8a484a 610 bool M2MBase::is_integer(const char *value)
djmeyers 0:06ee5f8a484a 611 {
djmeyers 0:06ee5f8a484a 612 assert(value != NULL);
djmeyers 0:06ee5f8a484a 613
djmeyers 0:06ee5f8a484a 614 if((strlen(value) < 1) || ((!isdigit(value[0])) && (value[0] != '-') && (value[0] != '+'))) {
djmeyers 0:06ee5f8a484a 615 return false;
djmeyers 0:06ee5f8a484a 616 }
djmeyers 0:06ee5f8a484a 617 char * p;
djmeyers 0:06ee5f8a484a 618 strtol(value, &p, 10);
djmeyers 0:06ee5f8a484a 619 return (*p == 0);
djmeyers 0:06ee5f8a484a 620 }
djmeyers 0:06ee5f8a484a 621
djmeyers 0:06ee5f8a484a 622 bool M2MBase::is_under_observation() const
djmeyers 0:06ee5f8a484a 623 {
djmeyers 0:06ee5f8a484a 624 return _is_under_observation;
djmeyers 0:06ee5f8a484a 625 }
djmeyers 0:06ee5f8a484a 626
djmeyers 0:06ee5f8a484a 627 void M2MBase::set_value_updated_function(value_updated_callback callback)
djmeyers 0:06ee5f8a484a 628 {
djmeyers 0:06ee5f8a484a 629 delete _value_updated_callback;
djmeyers 0:06ee5f8a484a 630 // XXX: create a copy of the copy of callback object. Perhaps it would better to
djmeyers 0:06ee5f8a484a 631 // give a reference as parameter and just store that, as it would save some memory.
djmeyers 0:06ee5f8a484a 632 _value_updated_callback = new value_updated_callback(callback);
djmeyers 0:06ee5f8a484a 633 }
djmeyers 0:06ee5f8a484a 634
djmeyers 0:06ee5f8a484a 635 void M2MBase::set_value_updated_function(value_updated_callback2 callback)
djmeyers 0:06ee5f8a484a 636 {
djmeyers 0:06ee5f8a484a 637 delete _function_pointer;
djmeyers 0:06ee5f8a484a 638 _function_pointer = new FP1<void, const char*>(callback);
djmeyers 0:06ee5f8a484a 639 set_value_updated_function(value_updated_callback(_function_pointer,
djmeyers 0:06ee5f8a484a 640 &FP1<void, const char*>::call));
djmeyers 0:06ee5f8a484a 641 }
djmeyers 0:06ee5f8a484a 642
djmeyers 0:06ee5f8a484a 643 bool M2MBase::is_value_updated_function_set()
djmeyers 0:06ee5f8a484a 644 {
djmeyers 0:06ee5f8a484a 645 return (_value_updated_callback) ? true : false;
djmeyers 0:06ee5f8a484a 646 }
djmeyers 0:06ee5f8a484a 647
djmeyers 0:06ee5f8a484a 648 void M2MBase::execute_value_updated(const String& name)
djmeyers 0:06ee5f8a484a 649 {
djmeyers 0:06ee5f8a484a 650 if(_value_updated_callback) {
djmeyers 0:06ee5f8a484a 651 (*_value_updated_callback)(name.c_str());
djmeyers 0:06ee5f8a484a 652 }
djmeyers 0:06ee5f8a484a 653 }
djmeyers 0:06ee5f8a484a 654
djmeyers 0:06ee5f8a484a 655 bool M2MBase::build_path(StringBuffer<MAX_PATH_SIZE> &buffer, const char *s1, uint16_t i1, const char *s2, uint16_t i2)
djmeyers 0:06ee5f8a484a 656 {
djmeyers 0:06ee5f8a484a 657
djmeyers 0:06ee5f8a484a 658 if(!buffer.ensure_space(strlen(s1) + strlen(s2) + (MAX_INSTANCE_SIZE * 2) + 3 + 1)){
djmeyers 0:06ee5f8a484a 659 return false;
djmeyers 0:06ee5f8a484a 660 }
djmeyers 0:06ee5f8a484a 661
djmeyers 0:06ee5f8a484a 662 buffer.append(s1);
djmeyers 0:06ee5f8a484a 663 buffer.append('/');
djmeyers 0:06ee5f8a484a 664 buffer.append_int(i1);
djmeyers 0:06ee5f8a484a 665 buffer.append('/');
djmeyers 0:06ee5f8a484a 666 buffer.append(s2);
djmeyers 0:06ee5f8a484a 667 buffer.append('/');
djmeyers 0:06ee5f8a484a 668 buffer.append_int(i2);
djmeyers 0:06ee5f8a484a 669
djmeyers 0:06ee5f8a484a 670 return true;
djmeyers 0:06ee5f8a484a 671
djmeyers 0:06ee5f8a484a 672 }
djmeyers 0:06ee5f8a484a 673
djmeyers 0:06ee5f8a484a 674 bool M2MBase::build_path(StringBuffer<MAX_PATH_SIZE_2> &buffer, const char *s1, uint16_t i1, const char *s2)
djmeyers 0:06ee5f8a484a 675 {
djmeyers 0:06ee5f8a484a 676 if(!buffer.ensure_space(strlen(s1) + strlen(s2) + MAX_INSTANCE_SIZE + 2 + 1)){
djmeyers 0:06ee5f8a484a 677 return false;
djmeyers 0:06ee5f8a484a 678 }
djmeyers 0:06ee5f8a484a 679
djmeyers 0:06ee5f8a484a 680 buffer.append(s1);
djmeyers 0:06ee5f8a484a 681 buffer.append('/');
djmeyers 0:06ee5f8a484a 682 buffer.append_int(i1);
djmeyers 0:06ee5f8a484a 683 buffer.append('/');
djmeyers 0:06ee5f8a484a 684 buffer.append(s2);
djmeyers 0:06ee5f8a484a 685
djmeyers 0:06ee5f8a484a 686 return true;
djmeyers 0:06ee5f8a484a 687 }
djmeyers 0:06ee5f8a484a 688
djmeyers 0:06ee5f8a484a 689 bool M2MBase::build_path(StringBuffer<MAX_PATH_SIZE_3> &buffer, const char *s1, uint16_t i1, uint16_t i2)
djmeyers 0:06ee5f8a484a 690 {
djmeyers 0:06ee5f8a484a 691 if(!buffer.ensure_space(strlen(s1) + (MAX_INSTANCE_SIZE * 2) + 2 + 1)){
djmeyers 0:06ee5f8a484a 692 return false;
djmeyers 0:06ee5f8a484a 693 }
djmeyers 0:06ee5f8a484a 694
djmeyers 0:06ee5f8a484a 695 buffer.append(s1);
djmeyers 0:06ee5f8a484a 696 buffer.append('/');
djmeyers 0:06ee5f8a484a 697 buffer.append_int(i1);
djmeyers 0:06ee5f8a484a 698 buffer.append('/');
djmeyers 0:06ee5f8a484a 699 buffer.append_int(i2);
djmeyers 0:06ee5f8a484a 700
djmeyers 0:06ee5f8a484a 701 return true;
djmeyers 0:06ee5f8a484a 702 }
djmeyers 0:06ee5f8a484a 703
djmeyers 0:06ee5f8a484a 704 bool M2MBase::build_path(StringBuffer<MAX_PATH_SIZE_4> &buffer, const char *s1, uint16_t i1)
djmeyers 0:06ee5f8a484a 705 {
djmeyers 0:06ee5f8a484a 706 if(!buffer.ensure_space(strlen(s1) + MAX_INSTANCE_SIZE + 1 + 1)){
djmeyers 0:06ee5f8a484a 707 return false;
djmeyers 0:06ee5f8a484a 708 }
djmeyers 0:06ee5f8a484a 709
djmeyers 0:06ee5f8a484a 710 buffer.append(s1);
djmeyers 0:06ee5f8a484a 711 buffer.append('/');
djmeyers 0:06ee5f8a484a 712 buffer.append_int(i1);
djmeyers 0:06ee5f8a484a 713
djmeyers 0:06ee5f8a484a 714 return true;
djmeyers 0:06ee5f8a484a 715 }
djmeyers 0:06ee5f8a484a 716
djmeyers 0:06ee5f8a484a 717 char* M2MBase::stringdup(const char* src)
djmeyers 0:06ee5f8a484a 718 {
djmeyers 0:06ee5f8a484a 719 assert(src != NULL);
djmeyers 0:06ee5f8a484a 720
djmeyers 0:06ee5f8a484a 721 const size_t len = strlen(src) + 1;
djmeyers 0:06ee5f8a484a 722
djmeyers 0:06ee5f8a484a 723 char *dest = (char*)malloc(len);
djmeyers 0:06ee5f8a484a 724
djmeyers 0:06ee5f8a484a 725 if (dest) {
djmeyers 0:06ee5f8a484a 726 memcpy(dest, src, len);
djmeyers 0:06ee5f8a484a 727 }
djmeyers 0:06ee5f8a484a 728 return dest;
djmeyers 0:06ee5f8a484a 729 }
djmeyers 0:06ee5f8a484a 730
djmeyers 0:06ee5f8a484a 731 void M2MBase::free_resources()
djmeyers 0:06ee5f8a484a 732 {
djmeyers 0:06ee5f8a484a 733 // remove the nsdl structures from the nsdlinterface's lists.
djmeyers 0:06ee5f8a484a 734 if (_observation_handler) {
djmeyers 0:06ee5f8a484a 735 _observation_handler->resource_to_be_deleted(this);
djmeyers 0:06ee5f8a484a 736 }
djmeyers 0:06ee5f8a484a 737
djmeyers 0:06ee5f8a484a 738 if (_sn_resource->dynamic_resource_params->static_resource_parameters->free_on_delete) {
djmeyers 0:06ee5f8a484a 739 sn_nsdl_static_resource_parameters_s *params =
djmeyers 0:06ee5f8a484a 740 const_cast<sn_nsdl_static_resource_parameters_s *>(_sn_resource->dynamic_resource_params->static_resource_parameters);
djmeyers 0:06ee5f8a484a 741
djmeyers 0:06ee5f8a484a 742 free(params->path);
djmeyers 0:06ee5f8a484a 743 free(params->resource);
djmeyers 0:06ee5f8a484a 744 free(params->resource_type_ptr);
djmeyers 0:06ee5f8a484a 745 free(params->interface_description_ptr);
djmeyers 0:06ee5f8a484a 746 free(params);
djmeyers 0:06ee5f8a484a 747 }
djmeyers 0:06ee5f8a484a 748 if (_sn_resource->dynamic_resource_params->free_on_delete) {
djmeyers 0:06ee5f8a484a 749 free(_sn_resource->dynamic_resource_params);
djmeyers 0:06ee5f8a484a 750 }
djmeyers 0:06ee5f8a484a 751
djmeyers 0:06ee5f8a484a 752 if (_sn_resource->free_on_delete) {
djmeyers 0:06ee5f8a484a 753 free(_sn_resource->name);
djmeyers 0:06ee5f8a484a 754 free(_sn_resource);
djmeyers 0:06ee5f8a484a 755 }
djmeyers 0:06ee5f8a484a 756 }
djmeyers 0:06ee5f8a484a 757
djmeyers 0:06ee5f8a484a 758 size_t M2MBase::resource_name_length() const
djmeyers 0:06ee5f8a484a 759 {
djmeyers 0:06ee5f8a484a 760 return strlen(_sn_resource->name);
djmeyers 0:06ee5f8a484a 761 }
djmeyers 0:06ee5f8a484a 762
djmeyers 0:06ee5f8a484a 763 sn_nsdl_dynamic_resource_parameters_s* M2MBase::get_nsdl_resource()
djmeyers 0:06ee5f8a484a 764 {
djmeyers 0:06ee5f8a484a 765 return _sn_resource->dynamic_resource_params;
djmeyers 0:06ee5f8a484a 766 }