Toyomasa Watarai / simple-mbed-cloud-client

Dependents:  

Committer:
MACRUM
Date:
Mon Jul 02 06:30:39 2018 +0000
Revision:
0:276e7a263c35
Initial commit

Who changed what in which revision?

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