Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed-cloud-workshop-connect-HTS221 by
simple-mbed-cloud-client/mbed-cloud-client/mbed-client/source/m2mbase.cpp@0:6b753f761943, 2018-10-12 (annotated)
- Committer:
- JimCarver
- Date:
- Fri Oct 12 21:22:49 2018 +0000
- Revision:
- 0:6b753f761943
Initial commit
Who changed what in which revision?
User | Revision | Line number | New 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 |