Dependencies:   MMA7660 LM75B

Committer:
MACRUM
Date:
Sat Jun 30 01:40:30 2018 +0000
Revision:
0:119624335925
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MACRUM 0:119624335925 1 /*
MACRUM 0:119624335925 2 * Copyright (c) 2015 ARM Limited. All rights reserved.
MACRUM 0:119624335925 3 * SPDX-License-Identifier: Apache-2.0
MACRUM 0:119624335925 4 * Licensed under the Apache License, Version 2.0 (the License); you may
MACRUM 0:119624335925 5 * not use this file except in compliance with the License.
MACRUM 0:119624335925 6 * You may obtain a copy of the License at
MACRUM 0:119624335925 7 *
MACRUM 0:119624335925 8 * http://www.apache.org/licenses/LICENSE-2.0
MACRUM 0:119624335925 9 *
MACRUM 0:119624335925 10 * Unless required by applicable law or agreed to in writing, software
MACRUM 0:119624335925 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
MACRUM 0:119624335925 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
MACRUM 0:119624335925 13 * See the License for the specific language governing permissions and
MACRUM 0:119624335925 14 * limitations under the License.
MACRUM 0:119624335925 15 */
MACRUM 0:119624335925 16
MACRUM 0:119624335925 17 #include "mbed-client/m2mbase.h"
MACRUM 0:119624335925 18 #include "mbed-client/m2mobservationhandler.h"
MACRUM 0:119624335925 19 #include "mbed-client/m2mconstants.h"
MACRUM 0:119624335925 20 #include "mbed-client/m2mtimer.h"
MACRUM 0:119624335925 21
MACRUM 0:119624335925 22 #include "mbed-client/m2mobject.h"
MACRUM 0:119624335925 23 #include "mbed-client/m2mobjectinstance.h"
MACRUM 0:119624335925 24 #include "mbed-client/m2mresource.h"
MACRUM 0:119624335925 25
MACRUM 0:119624335925 26 #include "include/m2mreporthandler.h"
MACRUM 0:119624335925 27 #include "include/nsdlaccesshelper.h"
MACRUM 0:119624335925 28 #include "include/m2mcallbackstorage.h"
MACRUM 0:119624335925 29 #include "mbed-trace/mbed_trace.h"
MACRUM 0:119624335925 30
MACRUM 0:119624335925 31 #include "sn_nsdl_lib.h"
MACRUM 0:119624335925 32 #include <assert.h>
MACRUM 0:119624335925 33 #include <ctype.h>
MACRUM 0:119624335925 34 #include <string.h>
MACRUM 0:119624335925 35 #include <stdlib.h>
MACRUM 0:119624335925 36 #include "common_functions.h"
MACRUM 0:119624335925 37
MACRUM 0:119624335925 38 #define TRACE_GROUP "mClt"
MACRUM 0:119624335925 39
MACRUM 0:119624335925 40 M2MBase::M2MBase(const String& resource_name,
MACRUM 0:119624335925 41 M2MBase::Mode mode,
MACRUM 0:119624335925 42 #ifndef DISABLE_RESOURCE_TYPE
MACRUM 0:119624335925 43 const String &resource_type,
MACRUM 0:119624335925 44 #endif
MACRUM 0:119624335925 45 char *path,
MACRUM 0:119624335925 46 bool external_blockwise_store,
MACRUM 0:119624335925 47 bool multiple_instance,
MACRUM 0:119624335925 48 M2MBase::DataType type)
MACRUM 0:119624335925 49 :
MACRUM 0:119624335925 50 _sn_resource(NULL),
MACRUM 0:119624335925 51 _report_handler(NULL)
MACRUM 0:119624335925 52 {
MACRUM 0:119624335925 53 // Checking the name length properly, i.e returning error is impossible from constructor without exceptions
MACRUM 0:119624335925 54 assert(resource_name.length() <= MAX_ALLOWED_STRING_LENGTH);
MACRUM 0:119624335925 55
MACRUM 0:119624335925 56 _sn_resource = (lwm2m_parameters_s*)memory_alloc(sizeof(lwm2m_parameters_s));
MACRUM 0:119624335925 57 if(_sn_resource) {
MACRUM 0:119624335925 58 memset(_sn_resource, 0, sizeof(lwm2m_parameters_s));
MACRUM 0:119624335925 59 _sn_resource->free_on_delete = true;
MACRUM 0:119624335925 60 _sn_resource->multiple_instance = multiple_instance;
MACRUM 0:119624335925 61 _sn_resource->data_type = type;
MACRUM 0:119624335925 62 _sn_resource->dynamic_resource_params =
MACRUM 0:119624335925 63 (sn_nsdl_dynamic_resource_parameters_s*)memory_alloc(sizeof(sn_nsdl_dynamic_resource_parameters_s));
MACRUM 0:119624335925 64 if(_sn_resource->dynamic_resource_params) {
MACRUM 0:119624335925 65 memset(_sn_resource->dynamic_resource_params,
MACRUM 0:119624335925 66 0, sizeof(sn_nsdl_dynamic_resource_parameters_s));
MACRUM 0:119624335925 67 _sn_resource->dynamic_resource_params->static_resource_parameters =
MACRUM 0:119624335925 68 (sn_nsdl_static_resource_parameters_s*)memory_alloc(sizeof(sn_nsdl_static_resource_parameters_s));
MACRUM 0:119624335925 69
MACRUM 0:119624335925 70 // Set callback function in case of both dynamic and static resource
MACRUM 0:119624335925 71 _sn_resource->dynamic_resource_params->sn_grs_dyn_res_callback = __nsdl_c_callback;
MACRUM 0:119624335925 72
MACRUM 0:119624335925 73 if(_sn_resource->dynamic_resource_params->static_resource_parameters) {
MACRUM 0:119624335925 74 // Cast const away to able to compile using MEMORY_OPTIMIZED_API flag
MACRUM 0:119624335925 75 sn_nsdl_static_resource_parameters_s *params =
MACRUM 0:119624335925 76 const_cast<sn_nsdl_static_resource_parameters_s *>(_sn_resource->dynamic_resource_params->static_resource_parameters);
MACRUM 0:119624335925 77 memset(params, 0, sizeof(sn_nsdl_static_resource_parameters_s));
MACRUM 0:119624335925 78 const size_t len = strlen(resource_type.c_str());
MACRUM 0:119624335925 79 if (len > 0) {
MACRUM 0:119624335925 80 #ifndef RESOURCE_ATTRIBUTES_LIST
MACRUM 0:119624335925 81 #ifndef DISABLE_RESOURCE_TYPE
MACRUM 0:119624335925 82 params->resource_type_ptr = (char*)alloc_string_copy((uint8_t*) resource_type.c_str(), len);
MACRUM 0:119624335925 83 #endif
MACRUM 0:119624335925 84 #else
MACRUM 0:119624335925 85 sn_nsdl_attribute_item_s item;
MACRUM 0:119624335925 86 item.attribute_name = ATTR_RESOURCE_TYPE;
MACRUM 0:119624335925 87 item.value = (char*)alloc_string_copy((uint8_t*) resource_type.c_str(), len);
MACRUM 0:119624335925 88 sn_nsdl_set_resource_attribute(_sn_resource->dynamic_resource_params->static_resource_parameters, &item);
MACRUM 0:119624335925 89 #endif
MACRUM 0:119624335925 90 }
MACRUM 0:119624335925 91 params->path = path;
MACRUM 0:119624335925 92 params->mode = (unsigned)mode;
MACRUM 0:119624335925 93 params->free_on_delete = true;
MACRUM 0:119624335925 94 params->external_memory_block = external_blockwise_store;
MACRUM 0:119624335925 95 _sn_resource->dynamic_resource_params->static_resource_parameters = params;
MACRUM 0:119624335925 96 }
MACRUM 0:119624335925 97 }
MACRUM 0:119624335925 98
MACRUM 0:119624335925 99 if((!resource_name.empty())) {
MACRUM 0:119624335925 100 _sn_resource->identifier_int_type = false;
MACRUM 0:119624335925 101 _sn_resource->identifier.name = stringdup((char*)resource_name.c_str());
MACRUM 0:119624335925 102 } else {
MACRUM 0:119624335925 103 tr_debug("M2MBase::M2Mbase resource name is EMPTY ===========");
MACRUM 0:119624335925 104 _sn_resource->identifier_int_type = true;
MACRUM 0:119624335925 105 _sn_resource->identifier.instance_id = 0;
MACRUM 0:119624335925 106 }
MACRUM 0:119624335925 107 _sn_resource->dynamic_resource_params->publish_uri = true;
MACRUM 0:119624335925 108 _sn_resource->dynamic_resource_params->free_on_delete = true;
MACRUM 0:119624335925 109 _sn_resource->dynamic_resource_params->notification_status = NOTIFICATION_STATUS_INIT;
MACRUM 0:119624335925 110 _sn_resource->dynamic_resource_params->auto_observable = false;
MACRUM 0:119624335925 111 }
MACRUM 0:119624335925 112 }
MACRUM 0:119624335925 113
MACRUM 0:119624335925 114 M2MBase::M2MBase(const lwm2m_parameters_s *s):
MACRUM 0:119624335925 115 _sn_resource((lwm2m_parameters_s*) s),
MACRUM 0:119624335925 116 _report_handler(NULL)
MACRUM 0:119624335925 117 {
MACRUM 0:119624335925 118 tr_debug("M2MBase::M2MBase(const lwm2m_parameters_s *s)");
MACRUM 0:119624335925 119 // Set callback function in case of both dynamic and static resource
MACRUM 0:119624335925 120 _sn_resource->dynamic_resource_params->sn_grs_dyn_res_callback = __nsdl_c_callback;
MACRUM 0:119624335925 121 }
MACRUM 0:119624335925 122
MACRUM 0:119624335925 123 M2MBase::~M2MBase()
MACRUM 0:119624335925 124 {
MACRUM 0:119624335925 125 tr_debug("M2MBase::~M2MBase()");
MACRUM 0:119624335925 126 delete _report_handler;
MACRUM 0:119624335925 127
MACRUM 0:119624335925 128 value_updated_callback* callback = (value_updated_callback*)M2MCallbackStorage::remove_callback(*this, M2MCallbackAssociation::M2MBaseValueUpdatedCallback);
MACRUM 0:119624335925 129 delete callback;
MACRUM 0:119624335925 130
MACRUM 0:119624335925 131 M2MCallbackStorage::remove_callback(*this, M2MCallbackAssociation::M2MBaseValueUpdatedCallback2);
MACRUM 0:119624335925 132 M2MCallbackStorage::remove_callback(*this, M2MCallbackAssociation::M2MBaseNotificationDeliveryStatusCallback);
MACRUM 0:119624335925 133 }
MACRUM 0:119624335925 134
MACRUM 0:119624335925 135 char* M2MBase::create_path_base(const M2MBase &parent, const char *name)
MACRUM 0:119624335925 136 {
MACRUM 0:119624335925 137 char * result = NULL;
MACRUM 0:119624335925 138 // Expectation is that every element can be MAX_NAME_SZE, + 4 /'s + \0
MACRUM 0:119624335925 139 StringBuffer<(MAX_NAME_SIZE * 4 + (4 + 1))> path;
MACRUM 0:119624335925 140 path.append(parent.uri_path());
MACRUM 0:119624335925 141 path.append('/');
MACRUM 0:119624335925 142 path.append(name);
MACRUM 0:119624335925 143 result = stringdup(path.c_str());
MACRUM 0:119624335925 144
MACRUM 0:119624335925 145 return result;
MACRUM 0:119624335925 146 }
MACRUM 0:119624335925 147
MACRUM 0:119624335925 148 char* M2MBase::create_path(const M2MObject &parent, uint16_t object_instance)
MACRUM 0:119624335925 149 {
MACRUM 0:119624335925 150 StringBuffer<6> obj_inst_id;
MACRUM 0:119624335925 151 obj_inst_id.append_int(object_instance);
MACRUM 0:119624335925 152
MACRUM 0:119624335925 153 return create_path_base(parent, obj_inst_id.c_str());
MACRUM 0:119624335925 154 }
MACRUM 0:119624335925 155
MACRUM 0:119624335925 156 char* M2MBase::create_path(const M2MObject &parent, const char *name)
MACRUM 0:119624335925 157 {
MACRUM 0:119624335925 158 return create_path_base(parent, name);
MACRUM 0:119624335925 159 }
MACRUM 0:119624335925 160
MACRUM 0:119624335925 161 char* M2MBase::create_path(const M2MResource &parent, uint16_t resource_instance)
MACRUM 0:119624335925 162 {
MACRUM 0:119624335925 163 StringBuffer<6> res_inst;
MACRUM 0:119624335925 164 res_inst.append_int(resource_instance);
MACRUM 0:119624335925 165
MACRUM 0:119624335925 166 return create_path_base(parent, res_inst.c_str());
MACRUM 0:119624335925 167 }
MACRUM 0:119624335925 168
MACRUM 0:119624335925 169 char* M2MBase::create_path(const M2MResource &parent, const char *name)
MACRUM 0:119624335925 170 {
MACRUM 0:119624335925 171 return create_path_base(parent, name);
MACRUM 0:119624335925 172 }
MACRUM 0:119624335925 173
MACRUM 0:119624335925 174 char* M2MBase::create_path(const M2MObjectInstance &parent, const char *name)
MACRUM 0:119624335925 175 {
MACRUM 0:119624335925 176 return create_path_base(parent, name);
MACRUM 0:119624335925 177 }
MACRUM 0:119624335925 178
MACRUM 0:119624335925 179 void M2MBase::set_operation(M2MBase::Operation opr)
MACRUM 0:119624335925 180 {
MACRUM 0:119624335925 181 // If the mode is Static, there is only GET_ALLOWED supported.
MACRUM 0:119624335925 182 if(M2MBase::Static == mode()) {
MACRUM 0:119624335925 183 _sn_resource->dynamic_resource_params->access = M2MBase::GET_ALLOWED;
MACRUM 0:119624335925 184 } else {
MACRUM 0:119624335925 185 _sn_resource->dynamic_resource_params->access = opr;
MACRUM 0:119624335925 186 }
MACRUM 0:119624335925 187 }
MACRUM 0:119624335925 188
MACRUM 0:119624335925 189 #ifndef RESOURCE_ATTRIBUTES_LIST
MACRUM 0:119624335925 190 #ifndef MEMORY_OPTIMIZED_API
MACRUM 0:119624335925 191 #ifndef DISABLE_INTERFACE_DESCRIPTION
MACRUM 0:119624335925 192 void M2MBase::set_interface_description(const char *desc)
MACRUM 0:119624335925 193 {
MACRUM 0:119624335925 194 assert(_sn_resource->dynamic_resource_params->static_resource_parameters->free_on_delete);
MACRUM 0:119624335925 195 free(_sn_resource->dynamic_resource_params->static_resource_parameters->interface_description_ptr);
MACRUM 0:119624335925 196 _sn_resource->dynamic_resource_params->static_resource_parameters->interface_description_ptr = NULL;
MACRUM 0:119624335925 197 const size_t len = strlen(desc);
MACRUM 0:119624335925 198 if (len > 0 ) {
MACRUM 0:119624335925 199 _sn_resource->dynamic_resource_params->static_resource_parameters->interface_description_ptr =
MACRUM 0:119624335925 200 (char*)alloc_string_copy((uint8_t*) desc, len);
MACRUM 0:119624335925 201 }
MACRUM 0:119624335925 202 }
MACRUM 0:119624335925 203
MACRUM 0:119624335925 204 void M2MBase::set_interface_description(const String &desc)
MACRUM 0:119624335925 205 {
MACRUM 0:119624335925 206 assert(_sn_resource->dynamic_resource_params->static_resource_parameters->free_on_delete);
MACRUM 0:119624335925 207 set_interface_description(desc.c_str());
MACRUM 0:119624335925 208 }
MACRUM 0:119624335925 209 #endif // DISABLE_INTERFACE_DESCRIPTION
MACRUM 0:119624335925 210
MACRUM 0:119624335925 211 #ifndef DISABLE_RESOURCE_TYPE
MACRUM 0:119624335925 212 void M2MBase::set_resource_type(const String &res_type)
MACRUM 0:119624335925 213 {
MACRUM 0:119624335925 214 assert(_sn_resource->dynamic_resource_params->static_resource_parameters->free_on_delete);
MACRUM 0:119624335925 215 set_resource_type(res_type.c_str());
MACRUM 0:119624335925 216 }
MACRUM 0:119624335925 217
MACRUM 0:119624335925 218 void M2MBase::set_resource_type(const char *res_type)
MACRUM 0:119624335925 219 {
MACRUM 0:119624335925 220 assert(_sn_resource->dynamic_resource_params->static_resource_parameters->free_on_delete);
MACRUM 0:119624335925 221 free(_sn_resource->dynamic_resource_params->static_resource_parameters->resource_type_ptr);
MACRUM 0:119624335925 222 _sn_resource->dynamic_resource_params->static_resource_parameters->resource_type_ptr = NULL;
MACRUM 0:119624335925 223 const size_t len = strlen(res_type);
MACRUM 0:119624335925 224 if (len > 0) {
MACRUM 0:119624335925 225 _sn_resource->dynamic_resource_params->static_resource_parameters->resource_type_ptr = (char*)
MACRUM 0:119624335925 226 alloc_string_copy((uint8_t*) res_type, len);
MACRUM 0:119624335925 227 }
MACRUM 0:119624335925 228 }
MACRUM 0:119624335925 229 #endif // DISABLE_RESOURCE_TYPE
MACRUM 0:119624335925 230 #endif //MEMORY_OPTIMIZED_API
MACRUM 0:119624335925 231 #else // RESOURCE_ATTRIBUTES_LIST
MACRUM 0:119624335925 232 void M2MBase::set_interface_description(const char *desc)
MACRUM 0:119624335925 233 {
MACRUM 0:119624335925 234 assert(_sn_resource->dynamic_resource_params->static_resource_parameters->free_on_delete);
MACRUM 0:119624335925 235 const size_t len = strlen(desc);
MACRUM 0:119624335925 236 if (len > 0 ) {
MACRUM 0:119624335925 237 sn_nsdl_attribute_item_s item;
MACRUM 0:119624335925 238 item.attribute_name = ATTR_INTERFACE_DESCRIPTION;
MACRUM 0:119624335925 239 item.value = (char*)alloc_string_copy((uint8_t*) desc, len);
MACRUM 0:119624335925 240 sn_nsdl_set_resource_attribute(_sn_resource->dynamic_resource_params->static_resource_parameters, &item);
MACRUM 0:119624335925 241 }
MACRUM 0:119624335925 242 }
MACRUM 0:119624335925 243
MACRUM 0:119624335925 244 void M2MBase::set_interface_description(const String &desc)
MACRUM 0:119624335925 245 {
MACRUM 0:119624335925 246 assert(_sn_resource->dynamic_resource_params->static_resource_parameters->free_on_delete);
MACRUM 0:119624335925 247 set_interface_description(desc.c_str());
MACRUM 0:119624335925 248 }
MACRUM 0:119624335925 249
MACRUM 0:119624335925 250 void M2MBase::set_resource_type(const String &res_type)
MACRUM 0:119624335925 251 {
MACRUM 0:119624335925 252 assert(_sn_resource->dynamic_resource_params->static_resource_parameters->free_on_delete);
MACRUM 0:119624335925 253 set_resource_type(res_type.c_str());
MACRUM 0:119624335925 254 }
MACRUM 0:119624335925 255
MACRUM 0:119624335925 256 void M2MBase::set_resource_type(const char *res_type)
MACRUM 0:119624335925 257 {
MACRUM 0:119624335925 258 assert(_sn_resource->dynamic_resource_params->static_resource_parameters->free_on_delete);
MACRUM 0:119624335925 259 const size_t len = strlen(res_type);
MACRUM 0:119624335925 260 if (len > 0) {
MACRUM 0:119624335925 261 sn_nsdl_attribute_item_s item;
MACRUM 0:119624335925 262 item.attribute_name = ATTR_RESOURCE_TYPE;
MACRUM 0:119624335925 263 item.value = (char*)alloc_string_copy((uint8_t*) res_type, len);
MACRUM 0:119624335925 264 sn_nsdl_set_resource_attribute(_sn_resource->dynamic_resource_params->static_resource_parameters, &item);
MACRUM 0:119624335925 265 }
MACRUM 0:119624335925 266 }
MACRUM 0:119624335925 267 #endif // RESOURCE_ATTRIBUTES_LIST
MACRUM 0:119624335925 268
MACRUM 0:119624335925 269 void M2MBase::set_coap_content_type(const uint16_t con_type)
MACRUM 0:119624335925 270 {
MACRUM 0:119624335925 271 _sn_resource->dynamic_resource_params->coap_content_type = con_type;
MACRUM 0:119624335925 272 }
MACRUM 0:119624335925 273
MACRUM 0:119624335925 274 void M2MBase::set_observable(bool observable)
MACRUM 0:119624335925 275 {
MACRUM 0:119624335925 276 _sn_resource->dynamic_resource_params->observable = observable;
MACRUM 0:119624335925 277 }
MACRUM 0:119624335925 278
MACRUM 0:119624335925 279 void M2MBase::set_auto_observable(bool auto_observable)
MACRUM 0:119624335925 280 {
MACRUM 0:119624335925 281 _sn_resource->dynamic_resource_params->auto_observable = auto_observable;
MACRUM 0:119624335925 282 }
MACRUM 0:119624335925 283
MACRUM 0:119624335925 284 void M2MBase::add_observation_level(M2MBase::Observation obs_level)
MACRUM 0:119624335925 285 {
MACRUM 0:119624335925 286 if(_report_handler) {
MACRUM 0:119624335925 287 _report_handler->add_observation_level(obs_level);
MACRUM 0:119624335925 288 }
MACRUM 0:119624335925 289 }
MACRUM 0:119624335925 290
MACRUM 0:119624335925 291 void M2MBase::remove_observation_level(M2MBase::Observation obs_level)
MACRUM 0:119624335925 292 {
MACRUM 0:119624335925 293 if(_report_handler) {
MACRUM 0:119624335925 294 _report_handler->remove_observation_level(obs_level);
MACRUM 0:119624335925 295 }
MACRUM 0:119624335925 296 }
MACRUM 0:119624335925 297
MACRUM 0:119624335925 298
MACRUM 0:119624335925 299 void M2MBase::set_under_observation(bool observed,
MACRUM 0:119624335925 300 M2MObservationHandler *handler)
MACRUM 0:119624335925 301 {
MACRUM 0:119624335925 302 tr_debug("M2MBase::set_under_observation - observed: %d", observed);
MACRUM 0:119624335925 303 tr_debug("M2MBase::set_under_observation - base_type: %d", base_type());
MACRUM 0:119624335925 304 if(_report_handler) {
MACRUM 0:119624335925 305 _report_handler->set_under_observation(observed);
MACRUM 0:119624335925 306 }
MACRUM 0:119624335925 307
MACRUM 0:119624335925 308 set_observation_handler(handler);
MACRUM 0:119624335925 309
MACRUM 0:119624335925 310 if (handler) {
MACRUM 0:119624335925 311 if (base_type() != M2MBase::ResourceInstance) {
MACRUM 0:119624335925 312 // Create report handler only if it does not exist and one wants observation
MACRUM 0:119624335925 313 // This saves 76 bytes of memory on most usual case.
MACRUM 0:119624335925 314 if (observed) {
MACRUM 0:119624335925 315 if(!_report_handler) {
MACRUM 0:119624335925 316 _report_handler = new M2MReportHandler(*this);
MACRUM 0:119624335925 317 }
MACRUM 0:119624335925 318 }
MACRUM 0:119624335925 319 if (_report_handler) {
MACRUM 0:119624335925 320 _report_handler->set_under_observation(observed);
MACRUM 0:119624335925 321 }
MACRUM 0:119624335925 322 }
MACRUM 0:119624335925 323 } else {
MACRUM 0:119624335925 324 delete _report_handler;
MACRUM 0:119624335925 325 _report_handler = NULL;
MACRUM 0:119624335925 326 }
MACRUM 0:119624335925 327 }
MACRUM 0:119624335925 328
MACRUM 0:119624335925 329 void M2MBase::set_observation_token(const uint8_t *token, const uint8_t length)
MACRUM 0:119624335925 330 {
MACRUM 0:119624335925 331 if (_report_handler) {
MACRUM 0:119624335925 332 _report_handler->set_observation_token(token, length);
MACRUM 0:119624335925 333 }
MACRUM 0:119624335925 334 }
MACRUM 0:119624335925 335
MACRUM 0:119624335925 336 void M2MBase::set_instance_id(const uint16_t inst_id)
MACRUM 0:119624335925 337 {
MACRUM 0:119624335925 338 _sn_resource->identifier_int_type = true;
MACRUM 0:119624335925 339 _sn_resource->identifier.instance_id = inst_id;
MACRUM 0:119624335925 340 }
MACRUM 0:119624335925 341
MACRUM 0:119624335925 342 void M2MBase::set_max_age(const uint32_t max_age)
MACRUM 0:119624335925 343 {
MACRUM 0:119624335925 344 _sn_resource->max_age = max_age;
MACRUM 0:119624335925 345 }
MACRUM 0:119624335925 346
MACRUM 0:119624335925 347 M2MBase::BaseType M2MBase::base_type() const
MACRUM 0:119624335925 348 {
MACRUM 0:119624335925 349 return (M2MBase::BaseType)_sn_resource->base_type;
MACRUM 0:119624335925 350 }
MACRUM 0:119624335925 351
MACRUM 0:119624335925 352 M2MBase::Operation M2MBase::operation() const
MACRUM 0:119624335925 353 {
MACRUM 0:119624335925 354 return (M2MBase::Operation)_sn_resource->dynamic_resource_params->access;
MACRUM 0:119624335925 355 }
MACRUM 0:119624335925 356
MACRUM 0:119624335925 357 const char* M2MBase::name() const
MACRUM 0:119624335925 358 {
MACRUM 0:119624335925 359 assert(_sn_resource->identifier_int_type == false);
MACRUM 0:119624335925 360 return _sn_resource->identifier.name;
MACRUM 0:119624335925 361 }
MACRUM 0:119624335925 362
MACRUM 0:119624335925 363 int32_t M2MBase::name_id() const
MACRUM 0:119624335925 364 {
MACRUM 0:119624335925 365 int32_t name_id = -1;
MACRUM 0:119624335925 366 assert(_sn_resource->identifier_int_type == false);
MACRUM 0:119624335925 367 if(is_integer(_sn_resource->identifier.name) && strlen(_sn_resource->identifier.name) <= MAX_ALLOWED_STRING_LENGTH) {
MACRUM 0:119624335925 368 name_id = strtoul(_sn_resource->identifier.name, NULL, 10);
MACRUM 0:119624335925 369 if(name_id > 65535){
MACRUM 0:119624335925 370 name_id = -1;
MACRUM 0:119624335925 371 }
MACRUM 0:119624335925 372 }
MACRUM 0:119624335925 373 return name_id;
MACRUM 0:119624335925 374 }
MACRUM 0:119624335925 375
MACRUM 0:119624335925 376 uint16_t M2MBase::instance_id() const
MACRUM 0:119624335925 377 {
MACRUM 0:119624335925 378 assert(_sn_resource->identifier_int_type == true);
MACRUM 0:119624335925 379 return _sn_resource->identifier.instance_id;
MACRUM 0:119624335925 380 }
MACRUM 0:119624335925 381
MACRUM 0:119624335925 382 #ifndef RESOURCE_ATTRIBUTES_LIST
MACRUM 0:119624335925 383 #ifndef DISABLE_INTERFACE_DESCRIPTION
MACRUM 0:119624335925 384 const char* M2MBase::interface_description() const
MACRUM 0:119624335925 385 {
MACRUM 0:119624335925 386 return (reinterpret_cast<char*>(
MACRUM 0:119624335925 387 _sn_resource->dynamic_resource_params->static_resource_parameters->interface_description_ptr));
MACRUM 0:119624335925 388 }
MACRUM 0:119624335925 389 #endif
MACRUM 0:119624335925 390
MACRUM 0:119624335925 391 #ifndef DISABLE_RESOURCE_TYPE
MACRUM 0:119624335925 392 const char* M2MBase::resource_type() const
MACRUM 0:119624335925 393 {
MACRUM 0:119624335925 394 return (reinterpret_cast<char*>(
MACRUM 0:119624335925 395 _sn_resource->dynamic_resource_params->static_resource_parameters->resource_type_ptr));
MACRUM 0:119624335925 396 }
MACRUM 0:119624335925 397 #endif
MACRUM 0:119624335925 398 #else // RESOURCE_ATTRIBUTES_LIST
MACRUM 0:119624335925 399 #ifndef DISABLE_INTERFACE_DESCRIPTION
MACRUM 0:119624335925 400 const char* M2MBase::interface_description() const
MACRUM 0:119624335925 401 {
MACRUM 0:119624335925 402 return sn_nsdl_get_resource_attribute(_sn_resource->dynamic_resource_params->static_resource_parameters, ATTR_INTERFACE_DESCRIPTION);
MACRUM 0:119624335925 403 }
MACRUM 0:119624335925 404 #endif
MACRUM 0:119624335925 405
MACRUM 0:119624335925 406 #ifndef DISABLE_RESOURCE_TYPE
MACRUM 0:119624335925 407 const char* M2MBase::resource_type() const
MACRUM 0:119624335925 408 {
MACRUM 0:119624335925 409 return sn_nsdl_get_resource_attribute(_sn_resource->dynamic_resource_params->static_resource_parameters, ATTR_RESOURCE_TYPE);
MACRUM 0:119624335925 410 }
MACRUM 0:119624335925 411 #endif
MACRUM 0:119624335925 412 #endif // RESOURCE_ATTRIBUTES_LIST
MACRUM 0:119624335925 413 const char* M2MBase::uri_path() const
MACRUM 0:119624335925 414 {
MACRUM 0:119624335925 415 return (reinterpret_cast<char*>(
MACRUM 0:119624335925 416 _sn_resource->dynamic_resource_params->static_resource_parameters->path));
MACRUM 0:119624335925 417 }
MACRUM 0:119624335925 418
MACRUM 0:119624335925 419 uint16_t M2MBase::coap_content_type() const
MACRUM 0:119624335925 420 {
MACRUM 0:119624335925 421 return _sn_resource->dynamic_resource_params->coap_content_type;
MACRUM 0:119624335925 422 }
MACRUM 0:119624335925 423
MACRUM 0:119624335925 424 bool M2MBase::is_observable() const
MACRUM 0:119624335925 425 {
MACRUM 0:119624335925 426 if (_sn_resource->dynamic_resource_params->auto_observable) {
MACRUM 0:119624335925 427 return true;
MACRUM 0:119624335925 428 } else {
MACRUM 0:119624335925 429 return _sn_resource->dynamic_resource_params->observable;
MACRUM 0:119624335925 430 }
MACRUM 0:119624335925 431 }
MACRUM 0:119624335925 432
MACRUM 0:119624335925 433 M2MBase::Observation M2MBase::observation_level() const
MACRUM 0:119624335925 434 {
MACRUM 0:119624335925 435 M2MBase::Observation obs_level = M2MBase::None;
MACRUM 0:119624335925 436 if(_report_handler) {
MACRUM 0:119624335925 437 obs_level = _report_handler->observation_level();
MACRUM 0:119624335925 438 }
MACRUM 0:119624335925 439 return obs_level;
MACRUM 0:119624335925 440 }
MACRUM 0:119624335925 441
MACRUM 0:119624335925 442 void M2MBase::get_observation_token(uint8_t *token, uint8_t &token_length) const
MACRUM 0:119624335925 443 {
MACRUM 0:119624335925 444 if(_report_handler) {
MACRUM 0:119624335925 445 _report_handler->get_observation_token(token, token_length);
MACRUM 0:119624335925 446 }
MACRUM 0:119624335925 447 }
MACRUM 0:119624335925 448
MACRUM 0:119624335925 449 M2MBase::Mode M2MBase::mode() const
MACRUM 0:119624335925 450 {
MACRUM 0:119624335925 451 return (M2MBase::Mode)_sn_resource->dynamic_resource_params->static_resource_parameters->mode;
MACRUM 0:119624335925 452 }
MACRUM 0:119624335925 453
MACRUM 0:119624335925 454 uint16_t M2MBase::observation_number() const
MACRUM 0:119624335925 455 {
MACRUM 0:119624335925 456 uint16_t obs_number = 0;
MACRUM 0:119624335925 457 if(_report_handler) {
MACRUM 0:119624335925 458 obs_number = _report_handler->observation_number();
MACRUM 0:119624335925 459 }
MACRUM 0:119624335925 460 return obs_number;
MACRUM 0:119624335925 461 }
MACRUM 0:119624335925 462
MACRUM 0:119624335925 463 uint32_t M2MBase::max_age() const
MACRUM 0:119624335925 464 {
MACRUM 0:119624335925 465 return _sn_resource->max_age;
MACRUM 0:119624335925 466 }
MACRUM 0:119624335925 467
MACRUM 0:119624335925 468 bool M2MBase::handle_observation_attribute(const char *query)
MACRUM 0:119624335925 469 {
MACRUM 0:119624335925 470 tr_debug("M2MBase::handle_observation_attribute - under observation(%d)", is_under_observation());
MACRUM 0:119624335925 471 bool success = false;
MACRUM 0:119624335925 472 // Create handler if not already exists. Client must able to parse write attributes even when
MACRUM 0:119624335925 473 // observation is not yet set
MACRUM 0:119624335925 474 if (!_report_handler) {
MACRUM 0:119624335925 475 _report_handler = new M2MReportHandler(*this);
MACRUM 0:119624335925 476 }
MACRUM 0:119624335925 477
MACRUM 0:119624335925 478 success = _report_handler->parse_notification_attribute(query,base_type());
MACRUM 0:119624335925 479 if (success) {
MACRUM 0:119624335925 480 if (is_under_observation()) {
MACRUM 0:119624335925 481 _report_handler->set_under_observation(true);
MACRUM 0:119624335925 482 }
MACRUM 0:119624335925 483 } else {
MACRUM 0:119624335925 484 _report_handler->set_default_values();
MACRUM 0:119624335925 485 }
MACRUM 0:119624335925 486 return success;
MACRUM 0:119624335925 487 }
MACRUM 0:119624335925 488
MACRUM 0:119624335925 489 void M2MBase::observation_to_be_sent(const m2m::Vector<uint16_t> &changed_instance_ids,
MACRUM 0:119624335925 490 uint16_t obs_number,
MACRUM 0:119624335925 491 bool send_object)
MACRUM 0:119624335925 492 {
MACRUM 0:119624335925 493 //TODO: Move this to M2MResourceInstance
MACRUM 0:119624335925 494 M2MObservationHandler *obs_handler = observation_handler();
MACRUM 0:119624335925 495 if (obs_handler) {
MACRUM 0:119624335925 496 obs_handler->observation_to_be_sent(this,
MACRUM 0:119624335925 497 obs_number,
MACRUM 0:119624335925 498 changed_instance_ids,
MACRUM 0:119624335925 499 send_object);
MACRUM 0:119624335925 500 }
MACRUM 0:119624335925 501 }
MACRUM 0:119624335925 502
MACRUM 0:119624335925 503 void M2MBase::set_base_type(M2MBase::BaseType type)
MACRUM 0:119624335925 504 {
MACRUM 0:119624335925 505 assert(_sn_resource->free_on_delete);
MACRUM 0:119624335925 506 _sn_resource->base_type = type;
MACRUM 0:119624335925 507 }
MACRUM 0:119624335925 508
MACRUM 0:119624335925 509 sn_coap_hdr_s* M2MBase::handle_get_request(nsdl_s */*nsdl*/,
MACRUM 0:119624335925 510 sn_coap_hdr_s */*received_coap_header*/,
MACRUM 0:119624335925 511 M2MObservationHandler */*observation_handler*/)
MACRUM 0:119624335925 512 {
MACRUM 0:119624335925 513 //Handled in M2MResource, M2MObjectInstance and M2MObject classes
MACRUM 0:119624335925 514 return NULL;
MACRUM 0:119624335925 515 }
MACRUM 0:119624335925 516
MACRUM 0:119624335925 517 sn_coap_hdr_s* M2MBase::handle_put_request(nsdl_s */*nsdl*/,
MACRUM 0:119624335925 518 sn_coap_hdr_s */*received_coap_header*/,
MACRUM 0:119624335925 519 M2MObservationHandler */*observation_handler*/,
MACRUM 0:119624335925 520 bool &)
MACRUM 0:119624335925 521 {
MACRUM 0:119624335925 522 //Handled in M2MResource, M2MObjectInstance and M2MObject classes
MACRUM 0:119624335925 523 return NULL;
MACRUM 0:119624335925 524 }
MACRUM 0:119624335925 525
MACRUM 0:119624335925 526 sn_coap_hdr_s* M2MBase::handle_post_request(nsdl_s */*nsdl*/,
MACRUM 0:119624335925 527 sn_coap_hdr_s */*received_coap_header*/,
MACRUM 0:119624335925 528 M2MObservationHandler */*observation_handler*/,
MACRUM 0:119624335925 529 bool &,
MACRUM 0:119624335925 530 sn_nsdl_addr_s *)
MACRUM 0:119624335925 531 {
MACRUM 0:119624335925 532 //Handled in M2MResource, M2MObjectInstance and M2MObject classes
MACRUM 0:119624335925 533 return NULL;
MACRUM 0:119624335925 534 }
MACRUM 0:119624335925 535
MACRUM 0:119624335925 536 void *M2MBase::memory_alloc(uint32_t size)
MACRUM 0:119624335925 537 {
MACRUM 0:119624335925 538 if(size)
MACRUM 0:119624335925 539 return malloc(size);
MACRUM 0:119624335925 540 else
MACRUM 0:119624335925 541 return 0;
MACRUM 0:119624335925 542 }
MACRUM 0:119624335925 543
MACRUM 0:119624335925 544 void M2MBase::memory_free(void *ptr)
MACRUM 0:119624335925 545 {
MACRUM 0:119624335925 546 free(ptr);
MACRUM 0:119624335925 547 }
MACRUM 0:119624335925 548
MACRUM 0:119624335925 549 char* M2MBase::alloc_string_copy(const char* source)
MACRUM 0:119624335925 550 {
MACRUM 0:119624335925 551 assert(source != NULL);
MACRUM 0:119624335925 552
MACRUM 0:119624335925 553 // Note: the armcc's libc does not have strdup, so we need to implement it here
MACRUM 0:119624335925 554 const size_t len = strlen(source);
MACRUM 0:119624335925 555
MACRUM 0:119624335925 556 return (char*)alloc_string_copy((uint8_t*)source, len);
MACRUM 0:119624335925 557 }
MACRUM 0:119624335925 558
MACRUM 0:119624335925 559 uint8_t* M2MBase::alloc_string_copy(const uint8_t* source, uint32_t size)
MACRUM 0:119624335925 560 {
MACRUM 0:119624335925 561 assert(source != NULL);
MACRUM 0:119624335925 562
MACRUM 0:119624335925 563 uint8_t* result = (uint8_t*)memory_alloc(size + 1);
MACRUM 0:119624335925 564 if (result) {
MACRUM 0:119624335925 565 memcpy(result, source, size);
MACRUM 0:119624335925 566 result[size] = '\0';
MACRUM 0:119624335925 567 }
MACRUM 0:119624335925 568 return result;
MACRUM 0:119624335925 569 }
MACRUM 0:119624335925 570
MACRUM 0:119624335925 571 uint8_t* M2MBase::alloc_copy(const uint8_t* source, uint32_t size)
MACRUM 0:119624335925 572 {
MACRUM 0:119624335925 573 assert(source != NULL);
MACRUM 0:119624335925 574
MACRUM 0:119624335925 575 uint8_t* result = (uint8_t*)memory_alloc(size);
MACRUM 0:119624335925 576 if (result) {
MACRUM 0:119624335925 577 memcpy(result, source, size);
MACRUM 0:119624335925 578 }
MACRUM 0:119624335925 579 return result;
MACRUM 0:119624335925 580 }
MACRUM 0:119624335925 581
MACRUM 0:119624335925 582 bool M2MBase::validate_string_length(const String &string, size_t min_length, size_t max_length)
MACRUM 0:119624335925 583 {
MACRUM 0:119624335925 584 bool valid = false;
MACRUM 0:119624335925 585
MACRUM 0:119624335925 586 const size_t len = string.length();
MACRUM 0:119624335925 587 if ((len >= min_length) && (len <= max_length)) {
MACRUM 0:119624335925 588 valid = true;
MACRUM 0:119624335925 589 }
MACRUM 0:119624335925 590
MACRUM 0:119624335925 591 return valid;
MACRUM 0:119624335925 592 }
MACRUM 0:119624335925 593
MACRUM 0:119624335925 594 bool M2MBase::validate_string_length(const char* string, size_t min_length, size_t max_length)
MACRUM 0:119624335925 595 {
MACRUM 0:119624335925 596 bool valid = false;
MACRUM 0:119624335925 597
MACRUM 0:119624335925 598 if (string != NULL) {
MACRUM 0:119624335925 599 const size_t len = strlen(string);
MACRUM 0:119624335925 600 if ((len >= min_length) && (len <= max_length)) {
MACRUM 0:119624335925 601 valid = true;
MACRUM 0:119624335925 602 }
MACRUM 0:119624335925 603 }
MACRUM 0:119624335925 604 return valid;
MACRUM 0:119624335925 605 }
MACRUM 0:119624335925 606
MACRUM 0:119624335925 607 M2MReportHandler* M2MBase::create_report_handler()
MACRUM 0:119624335925 608 {
MACRUM 0:119624335925 609 if (!_report_handler) {
MACRUM 0:119624335925 610 _report_handler = new M2MReportHandler(*this);
MACRUM 0:119624335925 611 }
MACRUM 0:119624335925 612 return _report_handler;
MACRUM 0:119624335925 613 }
MACRUM 0:119624335925 614
MACRUM 0:119624335925 615 M2MReportHandler* M2MBase::report_handler() const
MACRUM 0:119624335925 616 {
MACRUM 0:119624335925 617 return _report_handler;
MACRUM 0:119624335925 618 }
MACRUM 0:119624335925 619
MACRUM 0:119624335925 620 void M2MBase::set_register_uri(bool register_uri)
MACRUM 0:119624335925 621 {
MACRUM 0:119624335925 622 _sn_resource->dynamic_resource_params->publish_uri = register_uri;
MACRUM 0:119624335925 623 }
MACRUM 0:119624335925 624
MACRUM 0:119624335925 625 bool M2MBase::register_uri()
MACRUM 0:119624335925 626 {
MACRUM 0:119624335925 627 return _sn_resource->dynamic_resource_params->publish_uri;
MACRUM 0:119624335925 628 }
MACRUM 0:119624335925 629
MACRUM 0:119624335925 630 bool M2MBase::is_integer(const String &value)
MACRUM 0:119624335925 631 {
MACRUM 0:119624335925 632 const char *s = value.c_str();
MACRUM 0:119624335925 633 if(value.empty() || ((!isdigit(s[0])) && (s[0] != '-') && (s[0] != '+'))) {
MACRUM 0:119624335925 634 return false;
MACRUM 0:119624335925 635 }
MACRUM 0:119624335925 636 char * p;
MACRUM 0:119624335925 637 strtol(value.c_str(), &p, 10);
MACRUM 0:119624335925 638 return (*p == 0);
MACRUM 0:119624335925 639 }
MACRUM 0:119624335925 640
MACRUM 0:119624335925 641 bool M2MBase::is_integer(const char *value)
MACRUM 0:119624335925 642 {
MACRUM 0:119624335925 643 assert(value != NULL);
MACRUM 0:119624335925 644
MACRUM 0:119624335925 645 if((strlen(value) < 1) || ((!isdigit(value[0])) && (value[0] != '-') && (value[0] != '+'))) {
MACRUM 0:119624335925 646 return false;
MACRUM 0:119624335925 647 }
MACRUM 0:119624335925 648 char * p;
MACRUM 0:119624335925 649 strtol(value, &p, 10);
MACRUM 0:119624335925 650 return (*p == 0);
MACRUM 0:119624335925 651 }
MACRUM 0:119624335925 652
MACRUM 0:119624335925 653 bool M2MBase::is_under_observation() const
MACRUM 0:119624335925 654 {
MACRUM 0:119624335925 655 bool under_observation = false;
MACRUM 0:119624335925 656 if(_report_handler) {
MACRUM 0:119624335925 657 under_observation = _report_handler->is_under_observation();
MACRUM 0:119624335925 658 }
MACRUM 0:119624335925 659 return under_observation;
MACRUM 0:119624335925 660 }
MACRUM 0:119624335925 661
MACRUM 0:119624335925 662 bool M2MBase::set_value_updated_function(value_updated_callback callback)
MACRUM 0:119624335925 663 {
MACRUM 0:119624335925 664 value_updated_callback* old_callback = (value_updated_callback*)M2MCallbackStorage::remove_callback(*this, M2MCallbackAssociation::M2MBaseValueUpdatedCallback);
MACRUM 0:119624335925 665 delete old_callback;
MACRUM 0:119624335925 666 // XXX: create a copy of the copy of callback object. Perhaps it would better to
MACRUM 0:119624335925 667 // give a reference as parameter and just store that, as it would save some memory.
MACRUM 0:119624335925 668 value_updated_callback* new_callback = new value_updated_callback(callback);
MACRUM 0:119624335925 669
MACRUM 0:119624335925 670 return M2MCallbackStorage::add_callback(*this, new_callback, M2MCallbackAssociation::M2MBaseValueUpdatedCallback);
MACRUM 0:119624335925 671 }
MACRUM 0:119624335925 672
MACRUM 0:119624335925 673 bool M2MBase::set_value_updated_function(value_updated_callback2 callback)
MACRUM 0:119624335925 674 {
MACRUM 0:119624335925 675 M2MCallbackStorage::remove_callback(*this, M2MCallbackAssociation::M2MBaseValueUpdatedCallback2);
MACRUM 0:119624335925 676
MACRUM 0:119624335925 677 return M2MCallbackStorage::add_callback(*this, (void*)callback, M2MCallbackAssociation::M2MBaseValueUpdatedCallback2);
MACRUM 0:119624335925 678 }
MACRUM 0:119624335925 679
MACRUM 0:119624335925 680 bool M2MBase::is_value_updated_function_set() const
MACRUM 0:119624335925 681 {
MACRUM 0:119624335925 682 bool func_set = false;
MACRUM 0:119624335925 683 if ((M2MCallbackStorage::does_callback_exist(*this, M2MCallbackAssociation::M2MBaseValueUpdatedCallback) == true) ||
MACRUM 0:119624335925 684 (M2MCallbackStorage::does_callback_exist(*this, M2MCallbackAssociation::M2MBaseValueUpdatedCallback2) == true)) {
MACRUM 0:119624335925 685
MACRUM 0:119624335925 686 func_set = true;
MACRUM 0:119624335925 687 }
MACRUM 0:119624335925 688 return func_set;
MACRUM 0:119624335925 689 }
MACRUM 0:119624335925 690
MACRUM 0:119624335925 691 void M2MBase::execute_value_updated(const String& name)
MACRUM 0:119624335925 692 {
MACRUM 0:119624335925 693 // Q: is there a point to call both callback types? Or should we call just one of them?
MACRUM 0:119624335925 694
MACRUM 0:119624335925 695 value_updated_callback* callback = (value_updated_callback*)M2MCallbackStorage::get_callback(*this,
MACRUM 0:119624335925 696 M2MCallbackAssociation::M2MBaseValueUpdatedCallback);
MACRUM 0:119624335925 697 if (callback) {
MACRUM 0:119624335925 698 (*callback)(name.c_str());
MACRUM 0:119624335925 699 }
MACRUM 0:119624335925 700
MACRUM 0:119624335925 701 value_updated_callback2 callback2 = (value_updated_callback2)M2MCallbackStorage::get_callback(*this, M2MCallbackAssociation::M2MBaseValueUpdatedCallback2);
MACRUM 0:119624335925 702 if (callback2) {
MACRUM 0:119624335925 703 (*callback2)(name.c_str());
MACRUM 0:119624335925 704 }
MACRUM 0:119624335925 705 }
MACRUM 0:119624335925 706
MACRUM 0:119624335925 707 bool M2MBase::build_path(StringBuffer<MAX_PATH_SIZE> &buffer, const char *s1, uint16_t i1, const char *s2, uint16_t i2)
MACRUM 0:119624335925 708 {
MACRUM 0:119624335925 709
MACRUM 0:119624335925 710 if(!buffer.ensure_space(strlen(s1) + strlen(s2) + (MAX_INSTANCE_SIZE * 2) + 3 + 1)){
MACRUM 0:119624335925 711 return false;
MACRUM 0:119624335925 712 }
MACRUM 0:119624335925 713
MACRUM 0:119624335925 714 buffer.append(s1);
MACRUM 0:119624335925 715 buffer.append('/');
MACRUM 0:119624335925 716 buffer.append_int(i1);
MACRUM 0:119624335925 717 buffer.append('/');
MACRUM 0:119624335925 718 buffer.append(s2);
MACRUM 0:119624335925 719 buffer.append('/');
MACRUM 0:119624335925 720 buffer.append_int(i2);
MACRUM 0:119624335925 721
MACRUM 0:119624335925 722 return true;
MACRUM 0:119624335925 723
MACRUM 0:119624335925 724 }
MACRUM 0:119624335925 725
MACRUM 0:119624335925 726 bool M2MBase::build_path(StringBuffer<MAX_PATH_SIZE_2> &buffer, const char *s1, uint16_t i1, const char *s2)
MACRUM 0:119624335925 727 {
MACRUM 0:119624335925 728 if(!buffer.ensure_space(strlen(s1) + strlen(s2) + MAX_INSTANCE_SIZE + 2 + 1)){
MACRUM 0:119624335925 729 return false;
MACRUM 0:119624335925 730 }
MACRUM 0:119624335925 731
MACRUM 0:119624335925 732 buffer.append(s1);
MACRUM 0:119624335925 733 buffer.append('/');
MACRUM 0:119624335925 734 buffer.append_int(i1);
MACRUM 0:119624335925 735 buffer.append('/');
MACRUM 0:119624335925 736 buffer.append(s2);
MACRUM 0:119624335925 737
MACRUM 0:119624335925 738 return true;
MACRUM 0:119624335925 739 }
MACRUM 0:119624335925 740
MACRUM 0:119624335925 741 bool M2MBase::build_path(StringBuffer<MAX_PATH_SIZE_3> &buffer, const char *s1, uint16_t i1, uint16_t i2)
MACRUM 0:119624335925 742 {
MACRUM 0:119624335925 743 if(!buffer.ensure_space(strlen(s1) + (MAX_INSTANCE_SIZE * 2) + 2 + 1)){
MACRUM 0:119624335925 744 return false;
MACRUM 0:119624335925 745 }
MACRUM 0:119624335925 746
MACRUM 0:119624335925 747 buffer.append(s1);
MACRUM 0:119624335925 748 buffer.append('/');
MACRUM 0:119624335925 749 buffer.append_int(i1);
MACRUM 0:119624335925 750 buffer.append('/');
MACRUM 0:119624335925 751 buffer.append_int(i2);
MACRUM 0:119624335925 752
MACRUM 0:119624335925 753 return true;
MACRUM 0:119624335925 754 }
MACRUM 0:119624335925 755
MACRUM 0:119624335925 756 bool M2MBase::build_path(StringBuffer<MAX_PATH_SIZE_4> &buffer, const char *s1, uint16_t i1)
MACRUM 0:119624335925 757 {
MACRUM 0:119624335925 758 if(!buffer.ensure_space(strlen(s1) + MAX_INSTANCE_SIZE + 1 + 1)){
MACRUM 0:119624335925 759 return false;
MACRUM 0:119624335925 760 }
MACRUM 0:119624335925 761
MACRUM 0:119624335925 762 buffer.append(s1);
MACRUM 0:119624335925 763 buffer.append('/');
MACRUM 0:119624335925 764 buffer.append_int(i1);
MACRUM 0:119624335925 765
MACRUM 0:119624335925 766 return true;
MACRUM 0:119624335925 767 }
MACRUM 0:119624335925 768
MACRUM 0:119624335925 769 char* M2MBase::stringdup(const char* src)
MACRUM 0:119624335925 770 {
MACRUM 0:119624335925 771 assert(src != NULL);
MACRUM 0:119624335925 772
MACRUM 0:119624335925 773 const size_t len = strlen(src) + 1;
MACRUM 0:119624335925 774
MACRUM 0:119624335925 775 char *dest = (char*)malloc(len);
MACRUM 0:119624335925 776
MACRUM 0:119624335925 777 if (dest) {
MACRUM 0:119624335925 778 memcpy(dest, src, len);
MACRUM 0:119624335925 779 }
MACRUM 0:119624335925 780 return dest;
MACRUM 0:119624335925 781 }
MACRUM 0:119624335925 782
MACRUM 0:119624335925 783 void M2MBase::free_resources()
MACRUM 0:119624335925 784 {
MACRUM 0:119624335925 785 // remove the nsdl structures from the nsdlinterface's lists.
MACRUM 0:119624335925 786 M2MObservationHandler *obs_handler = observation_handler();
MACRUM 0:119624335925 787 if (obs_handler) {
MACRUM 0:119624335925 788 tr_debug("M2MBase::free_resources()");
MACRUM 0:119624335925 789 obs_handler->resource_to_be_deleted(this);
MACRUM 0:119624335925 790 }
MACRUM 0:119624335925 791
MACRUM 0:119624335925 792 if (_sn_resource->dynamic_resource_params->static_resource_parameters->free_on_delete) {
MACRUM 0:119624335925 793 sn_nsdl_static_resource_parameters_s *params =
MACRUM 0:119624335925 794 const_cast<sn_nsdl_static_resource_parameters_s *>(_sn_resource->dynamic_resource_params->static_resource_parameters);
MACRUM 0:119624335925 795
MACRUM 0:119624335925 796 free(params->path);
MACRUM 0:119624335925 797 //free(params->resource);
MACRUM 0:119624335925 798 #ifndef RESOURCE_ATTRIBUTES_LIST
MACRUM 0:119624335925 799 #ifndef DISABLE_RESOURCE_TYPE
MACRUM 0:119624335925 800 free(params->resource_type_ptr);
MACRUM 0:119624335925 801 #endif
MACRUM 0:119624335925 802 #ifndef DISABLE_INTERFACE_DESCRIPTION
MACRUM 0:119624335925 803 free(params->interface_description_ptr);
MACRUM 0:119624335925 804 #endif
MACRUM 0:119624335925 805 #else
MACRUM 0:119624335925 806 sn_nsdl_free_resource_attributes_list(_sn_resource->dynamic_resource_params->static_resource_parameters);
MACRUM 0:119624335925 807 #endif
MACRUM 0:119624335925 808 free(params);
MACRUM 0:119624335925 809 }
MACRUM 0:119624335925 810 if (_sn_resource->dynamic_resource_params->free_on_delete) {
MACRUM 0:119624335925 811 free(_sn_resource->dynamic_resource_params->resource);
MACRUM 0:119624335925 812 free(_sn_resource->dynamic_resource_params);
MACRUM 0:119624335925 813 }
MACRUM 0:119624335925 814
MACRUM 0:119624335925 815 if(_sn_resource->free_on_delete && _sn_resource->identifier_int_type == false) {
MACRUM 0:119624335925 816 tr_debug("M2MBase::free_resources()");
MACRUM 0:119624335925 817 free(_sn_resource->identifier.name);
MACRUM 0:119624335925 818 }
MACRUM 0:119624335925 819 if(_sn_resource->free_on_delete) {
MACRUM 0:119624335925 820 free(_sn_resource);
MACRUM 0:119624335925 821 }
MACRUM 0:119624335925 822 }
MACRUM 0:119624335925 823
MACRUM 0:119624335925 824 size_t M2MBase::resource_name_length() const
MACRUM 0:119624335925 825 {
MACRUM 0:119624335925 826 assert(_sn_resource->identifier_int_type == false);
MACRUM 0:119624335925 827 return strlen(_sn_resource->identifier.name);
MACRUM 0:119624335925 828 }
MACRUM 0:119624335925 829
MACRUM 0:119624335925 830 sn_nsdl_dynamic_resource_parameters_s* M2MBase::get_nsdl_resource() const
MACRUM 0:119624335925 831 {
MACRUM 0:119624335925 832 return _sn_resource->dynamic_resource_params;
MACRUM 0:119624335925 833 }
MACRUM 0:119624335925 834
MACRUM 0:119624335925 835 M2MBase::lwm2m_parameters_s* M2MBase::get_lwm2m_parameters() const
MACRUM 0:119624335925 836 {
MACRUM 0:119624335925 837 return _sn_resource;
MACRUM 0:119624335925 838 }
MACRUM 0:119624335925 839
MACRUM 0:119624335925 840 uint16_t M2MBase::get_notification_msgid() const
MACRUM 0:119624335925 841 {
MACRUM 0:119624335925 842 return _sn_resource->dynamic_resource_params->msg_id;
MACRUM 0:119624335925 843 }
MACRUM 0:119624335925 844
MACRUM 0:119624335925 845 void M2MBase::set_notification_msgid(uint16_t msgid)
MACRUM 0:119624335925 846 {
MACRUM 0:119624335925 847 _sn_resource->dynamic_resource_params->msg_id = msgid;
MACRUM 0:119624335925 848 }
MACRUM 0:119624335925 849
MACRUM 0:119624335925 850 bool M2MBase::set_notification_delivery_status_cb(notification_delivery_status_cb callback, void *client_args)
MACRUM 0:119624335925 851 {
MACRUM 0:119624335925 852 M2MCallbackStorage::remove_callback(*this,
MACRUM 0:119624335925 853 M2MCallbackAssociation::M2MBaseNotificationDeliveryStatusCallback);
MACRUM 0:119624335925 854
MACRUM 0:119624335925 855 return M2MCallbackStorage::add_callback(*this,
MACRUM 0:119624335925 856 (void*)callback,
MACRUM 0:119624335925 857 M2MCallbackAssociation::M2MBaseNotificationDeliveryStatusCallback,
MACRUM 0:119624335925 858 client_args);
MACRUM 0:119624335925 859 }
MACRUM 0:119624335925 860
MACRUM 0:119624335925 861 void M2MBase::send_notification_delivery_status(const M2MBase& object, const NoticationDeliveryStatus status)
MACRUM 0:119624335925 862 {
MACRUM 0:119624335925 863 _sn_resource->dynamic_resource_params->notification_status = status;
MACRUM 0:119624335925 864 M2MCallbackAssociation* item = M2MCallbackStorage::get_association_item(object,
MACRUM 0:119624335925 865 M2MCallbackAssociation::M2MBaseNotificationDeliveryStatusCallback);
MACRUM 0:119624335925 866 if (item) {
MACRUM 0:119624335925 867 notification_delivery_status_cb callback = (notification_delivery_status_cb)item->_callback;
MACRUM 0:119624335925 868 if (callback) {
MACRUM 0:119624335925 869 (*callback)(object, status, item->_client_args);
MACRUM 0:119624335925 870 }
MACRUM 0:119624335925 871 }
MACRUM 0:119624335925 872 }
MACRUM 0:119624335925 873
MACRUM 0:119624335925 874 NoticationDeliveryStatus M2MBase::get_notification_delivery_status() const
MACRUM 0:119624335925 875 {
MACRUM 0:119624335925 876 return _sn_resource->dynamic_resource_params->notification_status;
MACRUM 0:119624335925 877 }
MACRUM 0:119624335925 878
MACRUM 0:119624335925 879 void M2MBase::clear_notification_delivery_status()
MACRUM 0:119624335925 880 {
MACRUM 0:119624335925 881 _sn_resource->dynamic_resource_params->notification_status = NOTIFICATION_STATUS_INIT;
MACRUM 0:119624335925 882 }