Jim Carver / Mbed OS mbed-cloud-workshop-connect-PIR

Dependencies:   HTS221

Fork of mbed-cloud-workshop-connect-HTS221 by Jim Carver

Committer:
JimCarver
Date:
Fri Oct 12 21:22:49 2018 +0000
Revision:
0:6b753f761943
Initial commit

Who changed what in which revision?

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