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