Dependencies:   MMA7660 LM75B

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

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MACRUM 0:119624335925 1 /*
MACRUM 0:119624335925 2 * Copyright (c) 2015 ARM Limited. All rights reserved.
MACRUM 0:119624335925 3 * SPDX-License-Identifier: Apache-2.0
MACRUM 0:119624335925 4 * Licensed under the Apache License, Version 2.0 (the License); you may
MACRUM 0:119624335925 5 * not use this file except in compliance with the License.
MACRUM 0:119624335925 6 * You may obtain a copy of the License at
MACRUM 0:119624335925 7 *
MACRUM 0:119624335925 8 * http://www.apache.org/licenses/LICENSE-2.0
MACRUM 0:119624335925 9 *
MACRUM 0:119624335925 10 * Unless required by applicable law or agreed to in writing, software
MACRUM 0:119624335925 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
MACRUM 0:119624335925 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
MACRUM 0:119624335925 13 * See the License for the specific language governing permissions and
MACRUM 0:119624335925 14 * limitations under the License.
MACRUM 0:119624335925 15 */
MACRUM 0:119624335925 16
MACRUM 0:119624335925 17 // Needed for PRIu64 on FreeRTOS
MACRUM 0:119624335925 18 #include <stdio.h>
MACRUM 0:119624335925 19 // Note: this macro is needed on armcc to get the the limit macros like UINT16_MAX
MACRUM 0:119624335925 20 #ifndef __STDC_LIMIT_MACROS
MACRUM 0:119624335925 21 #define __STDC_LIMIT_MACROS
MACRUM 0:119624335925 22 #endif
MACRUM 0:119624335925 23
MACRUM 0:119624335925 24 // Note: this macro is needed on armcc to get the the PRI*32 macros
MACRUM 0:119624335925 25 // from inttypes.h in a C++ code.
MACRUM 0:119624335925 26 #ifndef __STDC_FORMAT_MACROS
MACRUM 0:119624335925 27 #define __STDC_FORMAT_MACROS
MACRUM 0:119624335925 28 #endif
MACRUM 0:119624335925 29
MACRUM 0:119624335925 30 #include <stdlib.h>
MACRUM 0:119624335925 31 #include "mbed-client/m2mresourcebase.h"
MACRUM 0:119624335925 32 #include "mbed-client/m2mconstants.h"
MACRUM 0:119624335925 33 #include "mbed-client/m2mobservationhandler.h"
MACRUM 0:119624335925 34 #include "mbed-client/m2mobject.h"
MACRUM 0:119624335925 35 #include "mbed-client/m2mobjectinstance.h"
MACRUM 0:119624335925 36 #include "include/m2mcallbackstorage.h"
MACRUM 0:119624335925 37 #include "include/m2mreporthandler.h"
MACRUM 0:119624335925 38 #include "include/nsdllinker.h"
MACRUM 0:119624335925 39 #include "include/m2mtlvserializer.h"
MACRUM 0:119624335925 40 #include "mbed-client/m2mblockmessage.h"
MACRUM 0:119624335925 41 #include "mbed-trace/mbed_trace.h"
MACRUM 0:119624335925 42
MACRUM 0:119624335925 43 #define TRACE_GROUP "mClt"
MACRUM 0:119624335925 44
MACRUM 0:119624335925 45 M2MResourceBase::M2MResourceBase(
MACRUM 0:119624335925 46 const String &res_name,
MACRUM 0:119624335925 47 M2MBase::Mode resource_mode,
MACRUM 0:119624335925 48 const String &resource_type,
MACRUM 0:119624335925 49 M2MBase::DataType type,
MACRUM 0:119624335925 50 char* path,
MACRUM 0:119624335925 51 bool external_blockwise_store,
MACRUM 0:119624335925 52 bool multiple_instance)
MACRUM 0:119624335925 53 : M2MBase(res_name,
MACRUM 0:119624335925 54 resource_mode,
MACRUM 0:119624335925 55 #ifndef DISABLE_RESOURCE_TYPE
MACRUM 0:119624335925 56 resource_type,
MACRUM 0:119624335925 57 #endif
MACRUM 0:119624335925 58 path,
MACRUM 0:119624335925 59 external_blockwise_store,
MACRUM 0:119624335925 60 multiple_instance,
MACRUM 0:119624335925 61 type)
MACRUM 0:119624335925 62 #ifndef DISABLE_BLOCK_MESSAGE
MACRUM 0:119624335925 63 ,_block_message_data(NULL),
MACRUM 0:119624335925 64 #endif
MACRUM 0:119624335925 65 _notification_status(M2MResourceBase::INIT)
MACRUM 0:119624335925 66 {
MACRUM 0:119624335925 67 }
MACRUM 0:119624335925 68
MACRUM 0:119624335925 69 M2MResourceBase::M2MResourceBase(
MACRUM 0:119624335925 70 const String &res_name,
MACRUM 0:119624335925 71 M2MBase::Mode resource_mode,
MACRUM 0:119624335925 72 const String &resource_type,
MACRUM 0:119624335925 73 M2MBase::DataType type,
MACRUM 0:119624335925 74 const uint8_t *value,
MACRUM 0:119624335925 75 const uint8_t value_length,
MACRUM 0:119624335925 76 char* path,
MACRUM 0:119624335925 77 bool external_blockwise_store,
MACRUM 0:119624335925 78 bool multiple_instance)
MACRUM 0:119624335925 79 : M2MBase(res_name,
MACRUM 0:119624335925 80 resource_mode,
MACRUM 0:119624335925 81 #ifndef DISABLE_RESOURCE_TYPE
MACRUM 0:119624335925 82 resource_type,
MACRUM 0:119624335925 83 #endif
MACRUM 0:119624335925 84 path,
MACRUM 0:119624335925 85 external_blockwise_store,
MACRUM 0:119624335925 86 multiple_instance,
MACRUM 0:119624335925 87 type)
MACRUM 0:119624335925 88 #ifndef DISABLE_BLOCK_MESSAGE
MACRUM 0:119624335925 89 ,_block_message_data(NULL),
MACRUM 0:119624335925 90 #endif
MACRUM 0:119624335925 91 _notification_status(M2MResourceBase::INIT)
MACRUM 0:119624335925 92 {
MACRUM 0:119624335925 93 M2MBase::set_base_type(M2MBase::ResourceInstance);
MACRUM 0:119624335925 94 if( value != NULL && value_length > 0 ) {
MACRUM 0:119624335925 95 sn_nsdl_dynamic_resource_parameters_s* res = get_nsdl_resource();
MACRUM 0:119624335925 96 res->resource = alloc_string_copy(value, value_length);
MACRUM 0:119624335925 97 res->resourcelen = value_length;
MACRUM 0:119624335925 98 }
MACRUM 0:119624335925 99 }
MACRUM 0:119624335925 100
MACRUM 0:119624335925 101 M2MResourceBase::M2MResourceBase(
MACRUM 0:119624335925 102 const lwm2m_parameters_s* s,
MACRUM 0:119624335925 103 M2MBase::DataType /*type*/)
MACRUM 0:119624335925 104 : M2MBase(s)
MACRUM 0:119624335925 105 #ifndef DISABLE_BLOCK_MESSAGE
MACRUM 0:119624335925 106 ,_block_message_data(NULL),
MACRUM 0:119624335925 107 #endif
MACRUM 0:119624335925 108 _notification_status(M2MResourceBase::INIT)
MACRUM 0:119624335925 109 {
MACRUM 0:119624335925 110 // we are not there yet for this check as this is called from M2MResource(): assert(base_type() == M2MBase::ResourceInstance);
MACRUM 0:119624335925 111 }
MACRUM 0:119624335925 112
MACRUM 0:119624335925 113 M2MResourceBase::~M2MResourceBase()
MACRUM 0:119624335925 114 {
MACRUM 0:119624335925 115 execute_callback* callback = (execute_callback*)M2MCallbackStorage::remove_callback(*this,
MACRUM 0:119624335925 116 M2MCallbackAssociation::M2MResourceInstanceExecuteCallback);
MACRUM 0:119624335925 117 delete callback;
MACRUM 0:119624335925 118
MACRUM 0:119624335925 119 M2MCallbackStorage::remove_callback(*this, M2MCallbackAssociation::M2MResourceInstanceExecuteCallback2);
MACRUM 0:119624335925 120 #ifndef DISABLE_BLOCK_MESSAGE
MACRUM 0:119624335925 121 incoming_block_message_callback *in_callback = (incoming_block_message_callback*)M2MCallbackStorage::remove_callback(*this,
MACRUM 0:119624335925 122 M2MCallbackAssociation::M2MResourceInstanceIncomingBlockMessageCallback);
MACRUM 0:119624335925 123 delete in_callback;
MACRUM 0:119624335925 124
MACRUM 0:119624335925 125 outgoing_block_message_callback *out_callback = (outgoing_block_message_callback*)M2MCallbackStorage::remove_callback(*this,
MACRUM 0:119624335925 126 M2MCallbackAssociation::M2MResourceInstanceOutgoingBlockMessageCallback);
MACRUM 0:119624335925 127 delete out_callback;
MACRUM 0:119624335925 128 #endif
MACRUM 0:119624335925 129
MACRUM 0:119624335925 130 notification_sent_callback *notif_callback = (notification_sent_callback*)M2MCallbackStorage::remove_callback(*this,
MACRUM 0:119624335925 131 M2MCallbackAssociation::M2MResourceInstanceNotificationSentCallback);
MACRUM 0:119624335925 132 delete notif_callback;
MACRUM 0:119624335925 133
MACRUM 0:119624335925 134 M2MCallbackStorage::remove_callback(*this, M2MCallbackAssociation::M2MResourceInstanceNotificationSentCallback2);
MACRUM 0:119624335925 135
MACRUM 0:119624335925 136 notification_status_callback *notif_status_callback = (notification_status_callback*)M2MCallbackStorage::remove_callback(*this,
MACRUM 0:119624335925 137 M2MCallbackAssociation::M2MResourceInstanceNotificationStatusCallback);
MACRUM 0:119624335925 138 delete notif_status_callback;
MACRUM 0:119624335925 139
MACRUM 0:119624335925 140 M2MCallbackStorage::remove_callback(*this, M2MCallbackAssociation::M2MResourceInstanceNotificationStatusCallback2);
MACRUM 0:119624335925 141
MACRUM 0:119624335925 142 #ifndef DISABLE_BLOCK_MESSAGE
MACRUM 0:119624335925 143 delete _block_message_data;
MACRUM 0:119624335925 144 #endif
MACRUM 0:119624335925 145 }
MACRUM 0:119624335925 146
MACRUM 0:119624335925 147 M2MResourceBase::ResourceType M2MResourceBase::resource_instance_type() const
MACRUM 0:119624335925 148 {
MACRUM 0:119624335925 149 M2MBase::lwm2m_parameters_s* param = M2MBase::get_lwm2m_parameters();
MACRUM 0:119624335925 150 M2MBase::DataType type = param->data_type;
MACRUM 0:119624335925 151 return convert_data_type(type);
MACRUM 0:119624335925 152 }
MACRUM 0:119624335925 153
MACRUM 0:119624335925 154
MACRUM 0:119624335925 155 bool M2MResourceBase::set_execute_function(execute_callback callback)
MACRUM 0:119624335925 156 {
MACRUM 0:119624335925 157 execute_callback* old_callback = (execute_callback*)M2MCallbackStorage::remove_callback(*this, M2MCallbackAssociation::M2MResourceInstanceExecuteCallback);
MACRUM 0:119624335925 158 delete old_callback;
MACRUM 0:119624335925 159 // XXX: create a copy of the copy of callback object. Perhaps it would better to
MACRUM 0:119624335925 160 // give a reference as parameter and just store that, as it would save some memory.
MACRUM 0:119624335925 161 execute_callback* new_callback = new execute_callback(callback);
MACRUM 0:119624335925 162
MACRUM 0:119624335925 163 return M2MCallbackStorage::add_callback(*this, new_callback, M2MCallbackAssociation::M2MResourceInstanceExecuteCallback);
MACRUM 0:119624335925 164 }
MACRUM 0:119624335925 165
MACRUM 0:119624335925 166 bool M2MResourceBase::set_execute_function(execute_callback_2 callback)
MACRUM 0:119624335925 167 {
MACRUM 0:119624335925 168 M2MCallbackStorage::remove_callback(*this, M2MCallbackAssociation::M2MResourceInstanceExecuteCallback2);
MACRUM 0:119624335925 169
MACRUM 0:119624335925 170 return M2MCallbackStorage::add_callback(*this, (void*)callback, M2MCallbackAssociation::M2MResourceInstanceExecuteCallback2);
MACRUM 0:119624335925 171 }
MACRUM 0:119624335925 172
MACRUM 0:119624335925 173 void M2MResourceBase::clear_value()
MACRUM 0:119624335925 174 {
MACRUM 0:119624335925 175 tr_debug("M2MResourceBase::clear_value");
MACRUM 0:119624335925 176 sn_nsdl_dynamic_resource_parameters_s* res = get_nsdl_resource();
MACRUM 0:119624335925 177 free(res->resource);
MACRUM 0:119624335925 178 res->resource = NULL;
MACRUM 0:119624335925 179 res->resourcelen = 0;
MACRUM 0:119624335925 180
MACRUM 0:119624335925 181 report();
MACRUM 0:119624335925 182 }
MACRUM 0:119624335925 183
MACRUM 0:119624335925 184 bool M2MResourceBase::set_value(int64_t value)
MACRUM 0:119624335925 185 {
MACRUM 0:119624335925 186 bool success;
MACRUM 0:119624335925 187 // max len of "-9223372036854775808" plus zero termination
MACRUM 0:119624335925 188 char buffer[20+1];
MACRUM 0:119624335925 189 uint32_t size = m2m::itoa_c(value, buffer);
MACRUM 0:119624335925 190
MACRUM 0:119624335925 191 success = set_value((const uint8_t*)buffer, size);
MACRUM 0:119624335925 192
MACRUM 0:119624335925 193 return success;
MACRUM 0:119624335925 194 }
MACRUM 0:119624335925 195
MACRUM 0:119624335925 196 bool M2MResourceBase::set_value(const uint8_t *value,
MACRUM 0:119624335925 197 const uint32_t value_length)
MACRUM 0:119624335925 198 {
MACRUM 0:119624335925 199 tr_debug("M2MResourceBase::set_value()");
MACRUM 0:119624335925 200 bool success = false;
MACRUM 0:119624335925 201 bool changed = has_value_changed(value,value_length);
MACRUM 0:119624335925 202 if( value != NULL && value_length > 0 ) {
MACRUM 0:119624335925 203 sn_nsdl_dynamic_resource_parameters_s* res = get_nsdl_resource();
MACRUM 0:119624335925 204 free(res->resource);
MACRUM 0:119624335925 205 res->resource = NULL;
MACRUM 0:119624335925 206 res->resourcelen = 0;
MACRUM 0:119624335925 207 res->resource = alloc_string_copy(value, value_length);
MACRUM 0:119624335925 208 if(res->resource) {
MACRUM 0:119624335925 209 success = true;
MACRUM 0:119624335925 210 res->resourcelen = value_length;
MACRUM 0:119624335925 211 if (changed) {
MACRUM 0:119624335925 212 report_value_change();
MACRUM 0:119624335925 213 }
MACRUM 0:119624335925 214 }
MACRUM 0:119624335925 215 }
MACRUM 0:119624335925 216 return success;
MACRUM 0:119624335925 217 }
MACRUM 0:119624335925 218
MACRUM 0:119624335925 219 bool M2MResourceBase::set_value_raw(uint8_t *value,
MACRUM 0:119624335925 220 const uint32_t value_length)
MACRUM 0:119624335925 221
MACRUM 0:119624335925 222 {
MACRUM 0:119624335925 223 tr_debug("M2MResourceBase::set_value_raw()");
MACRUM 0:119624335925 224 bool success = false;
MACRUM 0:119624335925 225 bool changed = has_value_changed(value,value_length);
MACRUM 0:119624335925 226 if( value != NULL && value_length > 0 ) {
MACRUM 0:119624335925 227 success = true;
MACRUM 0:119624335925 228 sn_nsdl_dynamic_resource_parameters_s* res = get_nsdl_resource();
MACRUM 0:119624335925 229 free(res->resource);
MACRUM 0:119624335925 230 res->resource = value;
MACRUM 0:119624335925 231 res->resourcelen = value_length;
MACRUM 0:119624335925 232 if (changed) {
MACRUM 0:119624335925 233 report_value_change();
MACRUM 0:119624335925 234 }
MACRUM 0:119624335925 235 }
MACRUM 0:119624335925 236 return success;
MACRUM 0:119624335925 237 }
MACRUM 0:119624335925 238
MACRUM 0:119624335925 239 void M2MResourceBase::report()
MACRUM 0:119624335925 240 {
MACRUM 0:119624335925 241 M2MBase::Observation observation_level = M2MBase::observation_level();
MACRUM 0:119624335925 242 tr_debug("M2MResourceBase::report() - level %d", observation_level);
MACRUM 0:119624335925 243
MACRUM 0:119624335925 244 // We must combine the parent object/objectinstance/resource observation information
MACRUM 0:119624335925 245 // when determining if there is observation set or not.
MACRUM 0:119624335925 246 M2MObjectInstance& object_instance = get_parent_resource().get_parent_object_instance();
MACRUM 0:119624335925 247 int parent_observation_level = (int)object_instance.observation_level();
MACRUM 0:119624335925 248
MACRUM 0:119624335925 249 parent_observation_level |= (int)object_instance.get_parent_object().observation_level();
MACRUM 0:119624335925 250 parent_observation_level |= (int)get_parent_resource().observation_level();
MACRUM 0:119624335925 251 parent_observation_level |= (int)observation_level;
MACRUM 0:119624335925 252
MACRUM 0:119624335925 253 tr_debug("M2MResourceBase::report() - combined level %d", parent_observation_level);
MACRUM 0:119624335925 254
MACRUM 0:119624335925 255 if((M2MBase::O_Attribute & parent_observation_level) == M2MBase::O_Attribute ||
MACRUM 0:119624335925 256 (M2MBase::OI_Attribute & parent_observation_level) == M2MBase::OI_Attribute) {
MACRUM 0:119624335925 257 tr_debug("M2MResourceBase::report() -- object/instance level");
MACRUM 0:119624335925 258 M2MObjectInstance& object_instance = get_parent_resource().get_parent_object_instance();
MACRUM 0:119624335925 259 object_instance.notification_update((M2MBase::Observation)parent_observation_level);
MACRUM 0:119624335925 260 }
MACRUM 0:119624335925 261
MACRUM 0:119624335925 262 if(M2MBase::Dynamic == mode() &&
MACRUM 0:119624335925 263 (M2MBase::R_Attribute & parent_observation_level) == M2MBase::R_Attribute) {
MACRUM 0:119624335925 264 tr_debug("M2MResourceBase::report() - resource level");
MACRUM 0:119624335925 265
MACRUM 0:119624335925 266 if (((resource_instance_type() != M2MResourceBase::STRING) &&
MACRUM 0:119624335925 267 (resource_instance_type() != M2MResourceBase::OPAQUE)) &&
MACRUM 0:119624335925 268 (observation_level != M2MBase::None)) {
MACRUM 0:119624335925 269 M2MReportHandler *report_handler = M2MBase::report_handler();
MACRUM 0:119624335925 270 if (report_handler && is_observable()) {
MACRUM 0:119624335925 271 sn_nsdl_dynamic_resource_parameters_s* res = get_nsdl_resource();
MACRUM 0:119624335925 272 if(res->resource) {
MACRUM 0:119624335925 273 report_handler->set_value(atof((const char*)res->resource));
MACRUM 0:119624335925 274 } else {
MACRUM 0:119624335925 275 report_handler->set_value(0);
MACRUM 0:119624335925 276 }
MACRUM 0:119624335925 277 }
MACRUM 0:119624335925 278 }
MACRUM 0:119624335925 279 else {
MACRUM 0:119624335925 280 if (base_type() == M2MBase::ResourceInstance) {
MACRUM 0:119624335925 281 const M2MResource& parent_resource = get_parent_resource();
MACRUM 0:119624335925 282 M2MReportHandler *report_handler = parent_resource.report_handler();
MACRUM 0:119624335925 283 if(report_handler && parent_resource.is_observable()) {
MACRUM 0:119624335925 284 report_handler->set_notification_trigger(parent_resource.get_parent_object_instance().instance_id());
MACRUM 0:119624335925 285 }
MACRUM 0:119624335925 286 }
MACRUM 0:119624335925 287 }
MACRUM 0:119624335925 288 } else if(M2MBase::Static == mode()) {
MACRUM 0:119624335925 289 M2MObservationHandler *obs_handler = observation_handler();
MACRUM 0:119624335925 290 if(obs_handler) {
MACRUM 0:119624335925 291 obs_handler->value_updated(this);
MACRUM 0:119624335925 292 }
MACRUM 0:119624335925 293 } else {
MACRUM 0:119624335925 294 if (is_observable()) {
MACRUM 0:119624335925 295 tr_warn("M2MResourceBase::report() - resource %s is observable but not yet subscribed!", uri_path());
MACRUM 0:119624335925 296 }
MACRUM 0:119624335925 297 tr_debug("M2MResourceBase::report() - mode = %d, is_observable = %d", mode(), is_observable());
MACRUM 0:119624335925 298 }
MACRUM 0:119624335925 299 }
MACRUM 0:119624335925 300
MACRUM 0:119624335925 301 bool M2MResourceBase::has_value_changed(const uint8_t* value, const uint32_t value_len)
MACRUM 0:119624335925 302 {
MACRUM 0:119624335925 303 bool changed = false;
MACRUM 0:119624335925 304 sn_nsdl_dynamic_resource_parameters_s* res = get_nsdl_resource();
MACRUM 0:119624335925 305
MACRUM 0:119624335925 306 if(value_len != res->resourcelen) {
MACRUM 0:119624335925 307 changed = true;
MACRUM 0:119624335925 308 } else if(value && !res->resource) {
MACRUM 0:119624335925 309 changed = true;
MACRUM 0:119624335925 310 } else if(res->resource && !value) {
MACRUM 0:119624335925 311 changed = true;
MACRUM 0:119624335925 312 } else {
MACRUM 0:119624335925 313 if (res->resource) {
MACRUM 0:119624335925 314 if (memcmp(value, res->resource, res->resourcelen) != 0) {
MACRUM 0:119624335925 315 changed = true;
MACRUM 0:119624335925 316 }
MACRUM 0:119624335925 317 }
MACRUM 0:119624335925 318 }
MACRUM 0:119624335925 319 return changed;
MACRUM 0:119624335925 320 }
MACRUM 0:119624335925 321
MACRUM 0:119624335925 322 void M2MResourceBase::report_value_change()
MACRUM 0:119624335925 323 {
MACRUM 0:119624335925 324 if (resource_instance_type() == M2MResourceBase::STRING ||
MACRUM 0:119624335925 325 resource_instance_type() == M2MResourceBase::OPAQUE) {
MACRUM 0:119624335925 326 M2MReportHandler *report_handler = M2MBase::report_handler();
MACRUM 0:119624335925 327 if(report_handler && is_under_observation()) {
MACRUM 0:119624335925 328 report_handler->set_notification_trigger();
MACRUM 0:119624335925 329 }
MACRUM 0:119624335925 330 }
MACRUM 0:119624335925 331 report();
MACRUM 0:119624335925 332 }
MACRUM 0:119624335925 333
MACRUM 0:119624335925 334 void M2MResourceBase::execute(void *arguments)
MACRUM 0:119624335925 335 {
MACRUM 0:119624335925 336 // XXX: this line is expected by seven testcases and until this code hits master branch
MACRUM 0:119624335925 337 // the testcases can not be modified and we need to print the false information too.
MACRUM 0:119624335925 338 tr_debug("M2MResourceBase::execute");
MACRUM 0:119624335925 339
MACRUM 0:119624335925 340 execute_callback* callback = (execute_callback*)M2MCallbackStorage::get_callback(*this, M2MCallbackAssociation::M2MResourceInstanceExecuteCallback);
MACRUM 0:119624335925 341
MACRUM 0:119624335925 342 if (callback) {
MACRUM 0:119624335925 343 (*callback)(arguments);
MACRUM 0:119624335925 344 }
MACRUM 0:119624335925 345
MACRUM 0:119624335925 346 execute_callback_2 callback2 = (execute_callback_2)M2MCallbackStorage::get_callback(*this, M2MCallbackAssociation::M2MResourceInstanceExecuteCallback2);
MACRUM 0:119624335925 347 if (callback2) {
MACRUM 0:119624335925 348 (*callback2)(arguments);
MACRUM 0:119624335925 349 }
MACRUM 0:119624335925 350 }
MACRUM 0:119624335925 351
MACRUM 0:119624335925 352 void M2MResourceBase::get_value(uint8_t *&value, uint32_t &value_length)
MACRUM 0:119624335925 353 {
MACRUM 0:119624335925 354 value_length = 0;
MACRUM 0:119624335925 355 if(value) {
MACRUM 0:119624335925 356 free(value);
MACRUM 0:119624335925 357 value = NULL;
MACRUM 0:119624335925 358 }
MACRUM 0:119624335925 359 sn_nsdl_dynamic_resource_parameters_s* res = get_nsdl_resource();
MACRUM 0:119624335925 360 if(res->resource && res->resourcelen > 0) {
MACRUM 0:119624335925 361 value = alloc_string_copy(res->resource, res->resourcelen);
MACRUM 0:119624335925 362 if(value) {
MACRUM 0:119624335925 363 value_length = res->resourcelen;
MACRUM 0:119624335925 364 }
MACRUM 0:119624335925 365 }
MACRUM 0:119624335925 366 }
MACRUM 0:119624335925 367
MACRUM 0:119624335925 368 int64_t M2MResourceBase::get_value_int() const
MACRUM 0:119624335925 369 {
MACRUM 0:119624335925 370 int64_t value_int = 0;
MACRUM 0:119624335925 371
MACRUM 0:119624335925 372 // XXX: this relies on having a zero terminated value?!
MACRUM 0:119624335925 373 const char *value_string = (char *)value();
MACRUM 0:119624335925 374 if (value_string) {
MACRUM 0:119624335925 375 value_int = atoll(value_string);
MACRUM 0:119624335925 376 }
MACRUM 0:119624335925 377 return value_int;
MACRUM 0:119624335925 378 }
MACRUM 0:119624335925 379
MACRUM 0:119624335925 380 String M2MResourceBase::get_value_string() const
MACRUM 0:119624335925 381 {
MACRUM 0:119624335925 382 // XXX: do a better constructor to avoid pointless malloc
MACRUM 0:119624335925 383 String value;
MACRUM 0:119624335925 384 if (get_nsdl_resource()->resource) {
MACRUM 0:119624335925 385 value.append_raw((char*)get_nsdl_resource()->resource, get_nsdl_resource()->resourcelen);
MACRUM 0:119624335925 386 }
MACRUM 0:119624335925 387 return value;
MACRUM 0:119624335925 388 }
MACRUM 0:119624335925 389
MACRUM 0:119624335925 390 uint8_t* M2MResourceBase::value() const
MACRUM 0:119624335925 391 {
MACRUM 0:119624335925 392 return get_nsdl_resource()->resource;
MACRUM 0:119624335925 393 }
MACRUM 0:119624335925 394
MACRUM 0:119624335925 395 uint32_t M2MResourceBase::value_length() const
MACRUM 0:119624335925 396 {
MACRUM 0:119624335925 397 return get_nsdl_resource()->resourcelen;
MACRUM 0:119624335925 398 }
MACRUM 0:119624335925 399
MACRUM 0:119624335925 400 sn_coap_hdr_s* M2MResourceBase::handle_get_request(nsdl_s *nsdl,
MACRUM 0:119624335925 401 sn_coap_hdr_s *received_coap_header,
MACRUM 0:119624335925 402 M2MObservationHandler *observation_handler)
MACRUM 0:119624335925 403 {
MACRUM 0:119624335925 404 tr_info("M2MResourceBase::handle_get_request()");
MACRUM 0:119624335925 405 sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CONTENT;
MACRUM 0:119624335925 406 sn_coap_hdr_s *coap_response = sn_nsdl_build_response(nsdl,
MACRUM 0:119624335925 407 received_coap_header,
MACRUM 0:119624335925 408 msg_code);
MACRUM 0:119624335925 409 if(received_coap_header) {
MACRUM 0:119624335925 410 // process the GET if we have registered a callback for it
MACRUM 0:119624335925 411 if ((operation() & SN_GRS_GET_ALLOWED) != 0) {
MACRUM 0:119624335925 412 if(coap_response) {
MACRUM 0:119624335925 413 bool content_type_present = false;
MACRUM 0:119624335925 414 if(received_coap_header->options_list_ptr &&
MACRUM 0:119624335925 415 received_coap_header->options_list_ptr->accept != COAP_CT_NONE) {
MACRUM 0:119624335925 416 content_type_present = true;
MACRUM 0:119624335925 417 coap_response->content_format = received_coap_header->options_list_ptr->accept;
MACRUM 0:119624335925 418 }
MACRUM 0:119624335925 419 if(!content_type_present) {
MACRUM 0:119624335925 420 if(resource_instance_type() == M2MResourceInstance::OPAQUE) {
MACRUM 0:119624335925 421 coap_response->content_format = sn_coap_content_format_e(COAP_CONTENT_OMA_OPAQUE_TYPE);
MACRUM 0:119624335925 422 } else {
MACRUM 0:119624335925 423 coap_response->content_format = sn_coap_content_format_e(COAP_CONTENT_OMA_PLAIN_TEXT_TYPE);
MACRUM 0:119624335925 424 }
MACRUM 0:119624335925 425 }
MACRUM 0:119624335925 426 // fill in the CoAP response payload
MACRUM 0:119624335925 427 coap_response->payload_ptr = NULL;
MACRUM 0:119624335925 428 uint32_t payload_len = 0;
MACRUM 0:119624335925 429 #ifndef DISABLE_BLOCK_MESSAGE
MACRUM 0:119624335925 430 //If handler exists it means that resource value is stored in application side
MACRUM 0:119624335925 431 if (block_message() && block_message()->is_block_message()) {
MACRUM 0:119624335925 432 outgoing_block_message_callback* outgoing_block_message_cb = (outgoing_block_message_callback*)M2MCallbackStorage::get_callback(*this,
MACRUM 0:119624335925 433 M2MCallbackAssociation::M2MResourceInstanceOutgoingBlockMessageCallback);
MACRUM 0:119624335925 434 if (outgoing_block_message_cb) {
MACRUM 0:119624335925 435 String name = "";
MACRUM 0:119624335925 436 if (received_coap_header->uri_path_ptr != NULL &&
MACRUM 0:119624335925 437 received_coap_header->uri_path_len > 0) {
MACRUM 0:119624335925 438 name.append_raw((char *)received_coap_header->uri_path_ptr,
MACRUM 0:119624335925 439 received_coap_header->uri_path_len);
MACRUM 0:119624335925 440 }
MACRUM 0:119624335925 441 (*outgoing_block_message_cb)(name, coap_response->payload_ptr, payload_len);
MACRUM 0:119624335925 442 }
MACRUM 0:119624335925 443 } else {
MACRUM 0:119624335925 444 #endif
MACRUM 0:119624335925 445 if (coap_response->content_format == COAP_CONTENT_OMA_TLV_TYPE ||
MACRUM 0:119624335925 446 coap_response->content_format == COAP_CONTENT_OMA_TLV_TYPE_OLD) {
MACRUM 0:119624335925 447 set_coap_content_type(coap_response->content_format);
MACRUM 0:119624335925 448 coap_response->payload_ptr = M2MTLVSerializer::serialize(&get_parent_resource(), payload_len);
MACRUM 0:119624335925 449 } else {
MACRUM 0:119624335925 450 get_value(coap_response->payload_ptr,payload_len);
MACRUM 0:119624335925 451 }
MACRUM 0:119624335925 452 #ifndef DISABLE_BLOCK_MESSAGE
MACRUM 0:119624335925 453 }
MACRUM 0:119624335925 454 #endif
MACRUM 0:119624335925 455 tr_debug("M2MResourceBase::handle_get_request() - Request Content-type: %d", coap_response->content_format);
MACRUM 0:119624335925 456 coap_response->payload_len = payload_len;
MACRUM 0:119624335925 457 coap_response->options_list_ptr = sn_nsdl_alloc_options_list(nsdl, coap_response);
MACRUM 0:119624335925 458 if (coap_response->options_list_ptr) {
MACRUM 0:119624335925 459 coap_response->options_list_ptr->max_age = max_age();
MACRUM 0:119624335925 460 }
MACRUM 0:119624335925 461
MACRUM 0:119624335925 462 if(received_coap_header->options_list_ptr) {
MACRUM 0:119624335925 463 if(received_coap_header->options_list_ptr->observe != -1) {
MACRUM 0:119624335925 464 if (is_observable()) {
MACRUM 0:119624335925 465 uint32_t number = 0;
MACRUM 0:119624335925 466 uint8_t observe_option = 0;
MACRUM 0:119624335925 467 observe_option = received_coap_header->options_list_ptr->observe;
MACRUM 0:119624335925 468
MACRUM 0:119624335925 469 if(START_OBSERVATION == observe_option) {
MACRUM 0:119624335925 470 // If the observe length is 0 means register for observation.
MACRUM 0:119624335925 471 if(received_coap_header->options_list_ptr->observe != -1) {
MACRUM 0:119624335925 472 number = received_coap_header->options_list_ptr->observe;
MACRUM 0:119624335925 473 }
MACRUM 0:119624335925 474
MACRUM 0:119624335925 475 // If the observe value is 0 means register for observation.
MACRUM 0:119624335925 476 if(number == 0) {
MACRUM 0:119624335925 477 tr_info("M2MResourceBase::handle_get_request - put resource under observation");
MACRUM 0:119624335925 478 set_under_observation(true,observation_handler);
MACRUM 0:119624335925 479 send_notification_delivery_status(*this, NOTIFICATION_STATUS_SUBSCRIBED);
MACRUM 0:119624335925 480 M2MBase::add_observation_level(M2MBase::R_Attribute);
MACRUM 0:119624335925 481 if (coap_response->options_list_ptr) {
MACRUM 0:119624335925 482 coap_response->options_list_ptr->observe = observation_number();
MACRUM 0:119624335925 483 }
MACRUM 0:119624335925 484 }
MACRUM 0:119624335925 485
MACRUM 0:119624335925 486 if(received_coap_header->token_ptr) {
MACRUM 0:119624335925 487 set_observation_token(received_coap_header->token_ptr,
MACRUM 0:119624335925 488 received_coap_header->token_len);
MACRUM 0:119624335925 489 }
MACRUM 0:119624335925 490
MACRUM 0:119624335925 491 } else if (STOP_OBSERVATION == observe_option) {
MACRUM 0:119624335925 492 tr_info("M2MResourceBase::handle_get_request - stops observation");
MACRUM 0:119624335925 493 set_under_observation(false,NULL);
MACRUM 0:119624335925 494 M2MBase::remove_observation_level(M2MBase::R_Attribute);
MACRUM 0:119624335925 495 send_notification_delivery_status(*this, NOTIFICATION_STATUS_UNSUBSCRIBED);
MACRUM 0:119624335925 496 }
MACRUM 0:119624335925 497 } else {
MACRUM 0:119624335925 498 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
MACRUM 0:119624335925 499 }
MACRUM 0:119624335925 500 }
MACRUM 0:119624335925 501 }
MACRUM 0:119624335925 502 }
MACRUM 0:119624335925 503 }else {
MACRUM 0:119624335925 504 tr_error("M2MResourceBase::handle_get_request - Return COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED");
MACRUM 0:119624335925 505 // Operation is not allowed.
MACRUM 0:119624335925 506 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
MACRUM 0:119624335925 507 }
MACRUM 0:119624335925 508 } else {
MACRUM 0:119624335925 509 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
MACRUM 0:119624335925 510 }
MACRUM 0:119624335925 511 if(coap_response) {
MACRUM 0:119624335925 512 coap_response->msg_code = msg_code;
MACRUM 0:119624335925 513 }
MACRUM 0:119624335925 514 return coap_response;
MACRUM 0:119624335925 515 }
MACRUM 0:119624335925 516
MACRUM 0:119624335925 517 sn_coap_hdr_s* M2MResourceBase::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 &execute_value_updated)
MACRUM 0:119624335925 521 {
MACRUM 0:119624335925 522 tr_info("M2MResourceBase::handle_put_request()");
MACRUM 0:119624335925 523
MACRUM 0:119624335925 524 sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; // 2.04
MACRUM 0:119624335925 525 sn_coap_hdr_s *coap_response = sn_nsdl_build_response(nsdl,
MACRUM 0:119624335925 526 received_coap_header,
MACRUM 0:119624335925 527 msg_code);
MACRUM 0:119624335925 528 // process the PUT if we have registered a callback for it
MACRUM 0:119624335925 529 if(received_coap_header && coap_response) {
MACRUM 0:119624335925 530 uint16_t coap_content_type = 0;
MACRUM 0:119624335925 531 if(received_coap_header->content_format != COAP_CT_NONE) {
MACRUM 0:119624335925 532 coap_content_type = received_coap_header->content_format;
MACRUM 0:119624335925 533 }
MACRUM 0:119624335925 534 if(received_coap_header->options_list_ptr &&
MACRUM 0:119624335925 535 received_coap_header->options_list_ptr->uri_query_ptr) {
MACRUM 0:119624335925 536 char *query = (char*)alloc_string_copy(received_coap_header->options_list_ptr->uri_query_ptr,
MACRUM 0:119624335925 537 received_coap_header->options_list_ptr->uri_query_len);
MACRUM 0:119624335925 538 if (query){
MACRUM 0:119624335925 539 tr_info("M2MResourceBase::handle_put_request() - query %s", query);
MACRUM 0:119624335925 540
MACRUM 0:119624335925 541 // if anything was updated, re-initialize the stored notification attributes
MACRUM 0:119624335925 542 if (!handle_observation_attribute(query)){
MACRUM 0:119624335925 543 tr_error("M2MResourceBase::handle_put_request() - Invalid query");
MACRUM 0:119624335925 544 msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST;
MACRUM 0:119624335925 545 }
MACRUM 0:119624335925 546 free(query);
MACRUM 0:119624335925 547 }
MACRUM 0:119624335925 548 else {
MACRUM 0:119624335925 549 // memory allocation for query fails
MACRUM 0:119624335925 550 tr_error("M2MResourceBase::handle_put_request() - Out of memory !!!");
MACRUM 0:119624335925 551 msg_code = COAP_MSG_CODE_RESPONSE_INTERNAL_SERVER_ERROR; // 4.00
MACRUM 0:119624335925 552 }
MACRUM 0:119624335925 553 } else if ((operation() & SN_GRS_PUT_ALLOWED) != 0) {
MACRUM 0:119624335925 554 tr_debug("M2MResourceBase::handle_put_request() - Request Content-type: %d", coap_content_type);
MACRUM 0:119624335925 555
MACRUM 0:119624335925 556 if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type ||
MACRUM 0:119624335925 557 COAP_CONTENT_OMA_TLV_TYPE_OLD == coap_content_type) {
MACRUM 0:119624335925 558 msg_code = COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT;
MACRUM 0:119624335925 559 } else {
MACRUM 0:119624335925 560 #ifndef DISABLE_BLOCK_MESSAGE
MACRUM 0:119624335925 561 if (block_message()) {
MACRUM 0:119624335925 562 block_message()->set_message_info(received_coap_header);
MACRUM 0:119624335925 563 if (block_message()->is_block_message()) {
MACRUM 0:119624335925 564 incoming_block_message_callback* incoming_block_message_cb = (incoming_block_message_callback*)M2MCallbackStorage::get_callback(*this,
MACRUM 0:119624335925 565 M2MCallbackAssociation::M2MResourceInstanceIncomingBlockMessageCallback);
MACRUM 0:119624335925 566 if (incoming_block_message_cb) {
MACRUM 0:119624335925 567 (*incoming_block_message_cb)(_block_message_data);
MACRUM 0:119624335925 568 }
MACRUM 0:119624335925 569 if (block_message()->is_last_block()) {
MACRUM 0:119624335925 570 block_message()->clear_values();
MACRUM 0:119624335925 571 coap_response->coap_status = COAP_STATUS_PARSER_BLOCKWISE_MSG_RECEIVED;
MACRUM 0:119624335925 572 } else {
MACRUM 0:119624335925 573 coap_response->coap_status = COAP_STATUS_PARSER_BLOCKWISE_MSG_RECEIVING;
MACRUM 0:119624335925 574 }
MACRUM 0:119624335925 575 if (block_message()->error_code() != M2MBlockMessage::ErrorNone) {
MACRUM 0:119624335925 576 block_message()->clear_values();
MACRUM 0:119624335925 577 }
MACRUM 0:119624335925 578 }
MACRUM 0:119624335925 579 }
MACRUM 0:119624335925 580 #endif
MACRUM 0:119624335925 581 // Firmware object uri path is limited to be max 255 bytes
MACRUM 0:119624335925 582 if ((strcmp(uri_path(), FIRMAWARE_PACKAGE_URI_PATH) == 0) &&
MACRUM 0:119624335925 583 received_coap_header->payload_len > 255) {
MACRUM 0:119624335925 584 msg_code = COAP_MSG_CODE_RESPONSE_NOT_ACCEPTABLE;
MACRUM 0:119624335925 585 } else if ((strcmp(uri_path(), SERVER_LIFETIME_PATH) == 0)) {
MACRUM 0:119624335925 586 // Check that lifetime can't go below 60s
MACRUM 0:119624335925 587 char *query = (char*)alloc_string_copy(received_coap_header->payload_ptr,
MACRUM 0:119624335925 588 received_coap_header->payload_len);
MACRUM 0:119624335925 589
MACRUM 0:119624335925 590 if (query) {
MACRUM 0:119624335925 591 int32_t lifetime = atol(query);
MACRUM 0:119624335925 592 if (lifetime < MINIMUM_REGISTRATION_TIME) {
MACRUM 0:119624335925 593 tr_error("M2MResourceBase::handle_put_request() - lifetime value % " PRId32 " not acceptable", lifetime);
MACRUM 0:119624335925 594 msg_code = COAP_MSG_CODE_RESPONSE_NOT_ACCEPTABLE;
MACRUM 0:119624335925 595 }
MACRUM 0:119624335925 596 free(query);
MACRUM 0:119624335925 597 }
MACRUM 0:119624335925 598 else {
MACRUM 0:119624335925 599 // memory allocation for query fails
MACRUM 0:119624335925 600 tr_error("M2MResourceBase::handle_put_request() - Out of memory !!!");
MACRUM 0:119624335925 601 msg_code = COAP_MSG_CODE_RESPONSE_INTERNAL_SERVER_ERROR;
MACRUM 0:119624335925 602 }
MACRUM 0:119624335925 603 }
MACRUM 0:119624335925 604
MACRUM 0:119624335925 605 // Do not update resource value in error case.
MACRUM 0:119624335925 606 if ((received_coap_header->payload_ptr) && (msg_code == COAP_MSG_CODE_RESPONSE_CHANGED)) {
MACRUM 0:119624335925 607 execute_value_updated = true;
MACRUM 0:119624335925 608 }
MACRUM 0:119624335925 609 }
MACRUM 0:119624335925 610 } else {
MACRUM 0:119624335925 611 // Operation is not allowed.
MACRUM 0:119624335925 612 tr_error("M2MResourceBase::handle_put_request() - COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED");
MACRUM 0:119624335925 613 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
MACRUM 0:119624335925 614 }
MACRUM 0:119624335925 615 } else {
MACRUM 0:119624335925 616 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
MACRUM 0:119624335925 617 }
MACRUM 0:119624335925 618 if(coap_response) {
MACRUM 0:119624335925 619 coap_response->msg_code = msg_code;
MACRUM 0:119624335925 620 }
MACRUM 0:119624335925 621
MACRUM 0:119624335925 622 return coap_response;
MACRUM 0:119624335925 623 }
MACRUM 0:119624335925 624
MACRUM 0:119624335925 625
MACRUM 0:119624335925 626 #ifndef DISABLE_BLOCK_MESSAGE
MACRUM 0:119624335925 627
MACRUM 0:119624335925 628 M2MBlockMessage* M2MResourceBase::block_message() const
MACRUM 0:119624335925 629 {
MACRUM 0:119624335925 630 return _block_message_data;
MACRUM 0:119624335925 631 }
MACRUM 0:119624335925 632
MACRUM 0:119624335925 633 bool M2MResourceBase::set_incoming_block_message_callback(incoming_block_message_callback callback)
MACRUM 0:119624335925 634 {
MACRUM 0:119624335925 635 incoming_block_message_callback* old_callback = (incoming_block_message_callback*)M2MCallbackStorage::remove_callback(*this,
MACRUM 0:119624335925 636 M2MCallbackAssociation::M2MResourceInstanceIncomingBlockMessageCallback);
MACRUM 0:119624335925 637 delete old_callback;
MACRUM 0:119624335925 638
MACRUM 0:119624335925 639 // copy the callback object. This will change on next version to be a direct pointer to a interface class,
MACRUM 0:119624335925 640 // this FPn<> is just too heavy for this usage.
MACRUM 0:119624335925 641 incoming_block_message_callback* new_callback = new incoming_block_message_callback(callback);
MACRUM 0:119624335925 642
MACRUM 0:119624335925 643 delete _block_message_data;
MACRUM 0:119624335925 644 _block_message_data = NULL;
MACRUM 0:119624335925 645 _block_message_data = new M2MBlockMessage();
MACRUM 0:119624335925 646
MACRUM 0:119624335925 647 return M2MCallbackStorage::add_callback(*this,
MACRUM 0:119624335925 648 new_callback,
MACRUM 0:119624335925 649 M2MCallbackAssociation::M2MResourceInstanceIncomingBlockMessageCallback);
MACRUM 0:119624335925 650 }
MACRUM 0:119624335925 651
MACRUM 0:119624335925 652 bool M2MResourceBase::set_outgoing_block_message_callback(outgoing_block_message_callback callback)
MACRUM 0:119624335925 653 {
MACRUM 0:119624335925 654 outgoing_block_message_callback *old_callback = (outgoing_block_message_callback*)M2MCallbackStorage::remove_callback(*this,
MACRUM 0:119624335925 655 M2MCallbackAssociation::M2MResourceInstanceOutgoingBlockMessageCallback);
MACRUM 0:119624335925 656 delete old_callback;
MACRUM 0:119624335925 657
MACRUM 0:119624335925 658 outgoing_block_message_callback *new_callback = new outgoing_block_message_callback(callback);
MACRUM 0:119624335925 659 return M2MCallbackStorage::add_callback(*this,
MACRUM 0:119624335925 660 new_callback,
MACRUM 0:119624335925 661 M2MCallbackAssociation::M2MResourceInstanceOutgoingBlockMessageCallback);
MACRUM 0:119624335925 662 }
MACRUM 0:119624335925 663 #endif
MACRUM 0:119624335925 664
MACRUM 0:119624335925 665 bool M2MResourceBase::set_notification_sent_callback(notification_sent_callback callback)
MACRUM 0:119624335925 666 {
MACRUM 0:119624335925 667 notification_sent_callback *old_callback = (notification_sent_callback*)M2MCallbackStorage::remove_callback(*this,
MACRUM 0:119624335925 668 M2MCallbackAssociation::M2MResourceInstanceNotificationSentCallback);
MACRUM 0:119624335925 669 delete old_callback;
MACRUM 0:119624335925 670
MACRUM 0:119624335925 671 notification_sent_callback *new_callback = new notification_sent_callback(callback);
MACRUM 0:119624335925 672 return M2MCallbackStorage::add_callback(*this,
MACRUM 0:119624335925 673 new_callback,
MACRUM 0:119624335925 674 M2MCallbackAssociation::M2MResourceInstanceNotificationSentCallback);
MACRUM 0:119624335925 675 }
MACRUM 0:119624335925 676
MACRUM 0:119624335925 677 bool M2MResourceBase::set_notification_sent_callback(notification_sent_callback_2 callback)
MACRUM 0:119624335925 678 {
MACRUM 0:119624335925 679 M2MCallbackStorage::remove_callback(*this, M2MCallbackAssociation::M2MResourceInstanceNotificationSentCallback2);
MACRUM 0:119624335925 680
MACRUM 0:119624335925 681 return M2MCallbackStorage::add_callback(*this,
MACRUM 0:119624335925 682 (void*)callback,
MACRUM 0:119624335925 683 M2MCallbackAssociation::M2MResourceInstanceNotificationSentCallback2);
MACRUM 0:119624335925 684 }
MACRUM 0:119624335925 685
MACRUM 0:119624335925 686 bool M2MResourceBase::set_notification_status_callback(notification_status_callback callback)
MACRUM 0:119624335925 687 {
MACRUM 0:119624335925 688 notification_status_callback *old_callback = (notification_status_callback*)M2MCallbackStorage::remove_callback(*this,
MACRUM 0:119624335925 689 M2MCallbackAssociation::M2MResourceInstanceNotificationStatusCallback);
MACRUM 0:119624335925 690 delete old_callback;
MACRUM 0:119624335925 691
MACRUM 0:119624335925 692 notification_status_callback *new_callback = new notification_status_callback(callback);
MACRUM 0:119624335925 693 return M2MCallbackStorage::add_callback(*this,
MACRUM 0:119624335925 694 new_callback,
MACRUM 0:119624335925 695 M2MCallbackAssociation::M2MResourceInstanceNotificationStatusCallback);
MACRUM 0:119624335925 696 }
MACRUM 0:119624335925 697
MACRUM 0:119624335925 698 bool M2MResourceBase::set_notification_status_callback(notification_status_callback_2 callback)
MACRUM 0:119624335925 699 {
MACRUM 0:119624335925 700 M2MCallbackStorage::remove_callback(*this, M2MCallbackAssociation::M2MResourceInstanceNotificationStatusCallback2);
MACRUM 0:119624335925 701
MACRUM 0:119624335925 702 return M2MCallbackStorage::add_callback(*this,
MACRUM 0:119624335925 703 (void*)callback,
MACRUM 0:119624335925 704 M2MCallbackAssociation::M2MResourceInstanceNotificationStatusCallback2);
MACRUM 0:119624335925 705 }
MACRUM 0:119624335925 706
MACRUM 0:119624335925 707 void M2MResourceBase::notification_sent()
MACRUM 0:119624335925 708 {
MACRUM 0:119624335925 709 // Now we will call both callbacks, if they are set. This is different from original behavior.
MACRUM 0:119624335925 710 notification_sent_callback* callback =
MACRUM 0:119624335925 711 (notification_sent_callback*)M2MCallbackStorage::get_callback(*this,
MACRUM 0:119624335925 712 M2MCallbackAssociation::M2MResourceInstanceNotificationSentCallback);
MACRUM 0:119624335925 713 if (callback) {
MACRUM 0:119624335925 714 (*callback)();
MACRUM 0:119624335925 715 }
MACRUM 0:119624335925 716
MACRUM 0:119624335925 717 notification_sent_callback_2 callback2 =
MACRUM 0:119624335925 718 (notification_sent_callback_2)M2MCallbackStorage::get_callback(*this,
MACRUM 0:119624335925 719 M2MCallbackAssociation::M2MResourceInstanceNotificationSentCallback2);
MACRUM 0:119624335925 720 if (callback2) {
MACRUM 0:119624335925 721 (*callback2)();
MACRUM 0:119624335925 722 }
MACRUM 0:119624335925 723 }
MACRUM 0:119624335925 724
MACRUM 0:119624335925 725 void M2MResourceBase::notification_status(const uint16_t msg_id, const NoticationStatus status)
MACRUM 0:119624335925 726 {
MACRUM 0:119624335925 727 if (_notification_status != status) {
MACRUM 0:119624335925 728 _notification_status = status;
MACRUM 0:119624335925 729 // Now we will call both callbacks, if they are set. This is different from original behavior.
MACRUM 0:119624335925 730 notification_status_callback* callback =
MACRUM 0:119624335925 731 (notification_status_callback*)M2MCallbackStorage::get_callback(*this,
MACRUM 0:119624335925 732 M2MCallbackAssociation::M2MResourceInstanceNotificationStatusCallback);
MACRUM 0:119624335925 733 if (callback) {
MACRUM 0:119624335925 734 (*callback)(msg_id, status);
MACRUM 0:119624335925 735 }
MACRUM 0:119624335925 736
MACRUM 0:119624335925 737 notification_status_callback_2 callback2 =
MACRUM 0:119624335925 738 (notification_status_callback_2)M2MCallbackStorage::get_callback(*this,
MACRUM 0:119624335925 739 M2MCallbackAssociation::M2MResourceInstanceNotificationStatusCallback2);
MACRUM 0:119624335925 740 if (callback2) {
MACRUM 0:119624335925 741 (*callback2)(msg_id, status);
MACRUM 0:119624335925 742 }
MACRUM 0:119624335925 743 }
MACRUM 0:119624335925 744 }
MACRUM 0:119624335925 745
MACRUM 0:119624335925 746 M2MResourceBase::ResourceType M2MResourceBase::convert_data_type(M2MBase::DataType type) const
MACRUM 0:119624335925 747 {
MACRUM 0:119624335925 748 M2MResourceBase::ResourceType res_type = M2MResourceBase::OBJLINK;
MACRUM 0:119624335925 749 switch(type) {
MACRUM 0:119624335925 750 case M2MBase::STRING:
MACRUM 0:119624335925 751 res_type = M2MResourceBase::STRING;
MACRUM 0:119624335925 752 break;
MACRUM 0:119624335925 753 case M2MBase::INTEGER:
MACRUM 0:119624335925 754 res_type = M2MResourceBase::INTEGER;
MACRUM 0:119624335925 755 break;
MACRUM 0:119624335925 756 case M2MBase::FLOAT:
MACRUM 0:119624335925 757 res_type = M2MResourceBase::FLOAT;
MACRUM 0:119624335925 758 break;
MACRUM 0:119624335925 759 case M2MBase::OPAQUE:
MACRUM 0:119624335925 760 res_type = M2MResourceBase::OPAQUE;
MACRUM 0:119624335925 761 break;
MACRUM 0:119624335925 762 case M2MBase::BOOLEAN:
MACRUM 0:119624335925 763 res_type = M2MResourceBase::BOOLEAN;
MACRUM 0:119624335925 764 break;
MACRUM 0:119624335925 765 case M2MBase::TIME:
MACRUM 0:119624335925 766 res_type = M2MResourceBase::TIME;
MACRUM 0:119624335925 767 break;
MACRUM 0:119624335925 768 case M2MBase::OBJLINK:
MACRUM 0:119624335925 769 res_type = M2MResourceBase::OBJLINK;
MACRUM 0:119624335925 770 break;
MACRUM 0:119624335925 771 }
MACRUM 0:119624335925 772 return res_type;
MACRUM 0:119624335925 773 }
MACRUM 0:119624335925 774
MACRUM 0:119624335925 775 M2MResourceBase::NoticationStatus M2MResourceBase::notification_status() const
MACRUM 0:119624335925 776 {
MACRUM 0:119624335925 777 return _notification_status;
MACRUM 0:119624335925 778 }
MACRUM 0:119624335925 779
MACRUM 0:119624335925 780 void M2MResourceBase::clear_notification_status()
MACRUM 0:119624335925 781 {
MACRUM 0:119624335925 782 _notification_status = M2MResourceBase::INIT;
MACRUM 0:119624335925 783 }