Preliminary main mbed library for nexpaq development

Committer:
nexpaq
Date:
Fri Nov 04 20:54:50 2016 +0000
Revision:
1:d96dbedaebdb
Parent:
0:6c56fb4bc5f0
Removed extra directories for other platforms

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nexpaq 0:6c56fb4bc5f0 1 /*
nexpaq 0:6c56fb4bc5f0 2 * Copyright (c) 2015 ARM Limited. All rights reserved.
nexpaq 0:6c56fb4bc5f0 3 * SPDX-License-Identifier: Apache-2.0
nexpaq 0:6c56fb4bc5f0 4 * Licensed under the Apache License, Version 2.0 (the License); you may
nexpaq 0:6c56fb4bc5f0 5 * not use this file except in compliance with the License.
nexpaq 0:6c56fb4bc5f0 6 * You may obtain a copy of the License at
nexpaq 0:6c56fb4bc5f0 7 *
nexpaq 0:6c56fb4bc5f0 8 * http://www.apache.org/licenses/LICENSE-2.0
nexpaq 0:6c56fb4bc5f0 9 *
nexpaq 0:6c56fb4bc5f0 10 * Unless required by applicable law or agreed to in writing, software
nexpaq 0:6c56fb4bc5f0 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
nexpaq 0:6c56fb4bc5f0 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
nexpaq 0:6c56fb4bc5f0 13 * See the License for the specific language governing permissions and
nexpaq 0:6c56fb4bc5f0 14 * limitations under the License.
nexpaq 0:6c56fb4bc5f0 15 */
nexpaq 0:6c56fb4bc5f0 16 #include <stdlib.h>
nexpaq 0:6c56fb4bc5f0 17 #include "mbed-client/m2mresource.h"
nexpaq 0:6c56fb4bc5f0 18 #include "mbed-client/m2mconstants.h"
nexpaq 0:6c56fb4bc5f0 19 #include "mbed-client/m2mobservationhandler.h"
nexpaq 0:6c56fb4bc5f0 20 #include "mbed-client/m2mobjectinstance.h"
nexpaq 0:6c56fb4bc5f0 21 #include "include/m2mreporthandler.h"
nexpaq 0:6c56fb4bc5f0 22 #include "include/nsdllinker.h"
nexpaq 0:6c56fb4bc5f0 23 #include "mbed-trace/mbed_trace.h"
nexpaq 0:6c56fb4bc5f0 24
nexpaq 0:6c56fb4bc5f0 25 #define TRACE_GROUP "mClt"
nexpaq 0:6c56fb4bc5f0 26
nexpaq 0:6c56fb4bc5f0 27 M2MResourceInstance& M2MResourceInstance::operator=(const M2MResourceInstance& other)
nexpaq 0:6c56fb4bc5f0 28 {
nexpaq 0:6c56fb4bc5f0 29 if (this != &other) { // protect against invalid self-assignment
nexpaq 0:6c56fb4bc5f0 30
nexpaq 0:6c56fb4bc5f0 31 free(_value);
nexpaq 0:6c56fb4bc5f0 32 _value = NULL;
nexpaq 0:6c56fb4bc5f0 33
nexpaq 0:6c56fb4bc5f0 34 _value_length = other._value_length;
nexpaq 0:6c56fb4bc5f0 35 if(other._value) {
nexpaq 0:6c56fb4bc5f0 36 _value = (uint8_t *)alloc_string_copy(other._value, other._value_length);
nexpaq 0:6c56fb4bc5f0 37 }
nexpaq 0:6c56fb4bc5f0 38 }
nexpaq 0:6c56fb4bc5f0 39 return *this;
nexpaq 0:6c56fb4bc5f0 40 }
nexpaq 0:6c56fb4bc5f0 41
nexpaq 0:6c56fb4bc5f0 42 M2MResourceInstance::M2MResourceInstance(const M2MResourceInstance& other)
nexpaq 0:6c56fb4bc5f0 43 : M2MBase(other),
nexpaq 0:6c56fb4bc5f0 44 _object_instance_callback(other._object_instance_callback),
nexpaq 0:6c56fb4bc5f0 45 _execute_callback(NULL),
nexpaq 0:6c56fb4bc5f0 46 _value(NULL),
nexpaq 0:6c56fb4bc5f0 47 _value_length(0),
nexpaq 0:6c56fb4bc5f0 48 _resource_callback(NULL),
nexpaq 0:6c56fb4bc5f0 49 _object_name(other._object_name),
nexpaq 0:6c56fb4bc5f0 50 _function_pointer(NULL),
nexpaq 0:6c56fb4bc5f0 51 _object_instance_id(other._object_instance_id),
nexpaq 0:6c56fb4bc5f0 52 _resource_type(M2MResourceInstance::STRING)
nexpaq 0:6c56fb4bc5f0 53 {
nexpaq 0:6c56fb4bc5f0 54 this->operator=(other);
nexpaq 0:6c56fb4bc5f0 55 }
nexpaq 0:6c56fb4bc5f0 56
nexpaq 0:6c56fb4bc5f0 57 M2MResourceInstance::M2MResourceInstance(const String &res_name,
nexpaq 0:6c56fb4bc5f0 58 const String &resource_type,
nexpaq 0:6c56fb4bc5f0 59 M2MResourceInstance::ResourceType type,
nexpaq 0:6c56fb4bc5f0 60 M2MObjectInstanceCallback &object_instance_callback,
nexpaq 0:6c56fb4bc5f0 61 const uint16_t object_instance_id,
nexpaq 0:6c56fb4bc5f0 62 const String &object_name)
nexpaq 0:6c56fb4bc5f0 63 : M2MBase(res_name,
nexpaq 0:6c56fb4bc5f0 64 M2MBase::Dynamic),
nexpaq 0:6c56fb4bc5f0 65 _object_instance_callback(object_instance_callback),
nexpaq 0:6c56fb4bc5f0 66 _execute_callback(NULL),
nexpaq 0:6c56fb4bc5f0 67 _value(NULL),
nexpaq 0:6c56fb4bc5f0 68 _value_length(0),
nexpaq 0:6c56fb4bc5f0 69 _resource_callback(NULL),
nexpaq 0:6c56fb4bc5f0 70 _object_name(object_name),
nexpaq 0:6c56fb4bc5f0 71 _function_pointer(NULL),
nexpaq 0:6c56fb4bc5f0 72 _object_instance_id(object_instance_id),
nexpaq 0:6c56fb4bc5f0 73 _resource_type(type)
nexpaq 0:6c56fb4bc5f0 74 {
nexpaq 0:6c56fb4bc5f0 75 M2MBase::set_resource_type(resource_type);
nexpaq 0:6c56fb4bc5f0 76 M2MBase::set_base_type(M2MBase::ResourceInstance);
nexpaq 0:6c56fb4bc5f0 77 }
nexpaq 0:6c56fb4bc5f0 78
nexpaq 0:6c56fb4bc5f0 79 M2MResourceInstance::M2MResourceInstance(const String &res_name,
nexpaq 0:6c56fb4bc5f0 80 const String &resource_type,
nexpaq 0:6c56fb4bc5f0 81 M2MResourceInstance::ResourceType type,
nexpaq 0:6c56fb4bc5f0 82 const uint8_t *value,
nexpaq 0:6c56fb4bc5f0 83 const uint8_t value_length,
nexpaq 0:6c56fb4bc5f0 84 M2MObjectInstanceCallback &object_instance_callback,
nexpaq 0:6c56fb4bc5f0 85 const uint16_t object_instance_id,
nexpaq 0:6c56fb4bc5f0 86 const String &object_name)
nexpaq 0:6c56fb4bc5f0 87 : M2MBase(res_name,
nexpaq 0:6c56fb4bc5f0 88 M2MBase::Static),
nexpaq 0:6c56fb4bc5f0 89 _object_instance_callback(object_instance_callback),
nexpaq 0:6c56fb4bc5f0 90 _execute_callback(NULL),
nexpaq 0:6c56fb4bc5f0 91 _value(NULL),
nexpaq 0:6c56fb4bc5f0 92 _value_length(0),
nexpaq 0:6c56fb4bc5f0 93 _resource_callback(NULL),
nexpaq 0:6c56fb4bc5f0 94 _object_name(object_name),
nexpaq 0:6c56fb4bc5f0 95 _function_pointer(NULL),
nexpaq 0:6c56fb4bc5f0 96 _object_instance_id(object_instance_id),
nexpaq 0:6c56fb4bc5f0 97 _resource_type(type)
nexpaq 0:6c56fb4bc5f0 98 {
nexpaq 0:6c56fb4bc5f0 99 M2MBase::set_resource_type(resource_type);
nexpaq 0:6c56fb4bc5f0 100 M2MBase::set_base_type(M2MBase::Resource);
nexpaq 0:6c56fb4bc5f0 101 if( value != NULL && value_length > 0 ) {
nexpaq 0:6c56fb4bc5f0 102 _value = alloc_string_copy(value, value_length);
nexpaq 0:6c56fb4bc5f0 103 if(_value) {
nexpaq 0:6c56fb4bc5f0 104 _value_length = value_length;
nexpaq 0:6c56fb4bc5f0 105 }
nexpaq 0:6c56fb4bc5f0 106 }
nexpaq 0:6c56fb4bc5f0 107 }
nexpaq 0:6c56fb4bc5f0 108
nexpaq 0:6c56fb4bc5f0 109 M2MResourceInstance::~M2MResourceInstance()
nexpaq 0:6c56fb4bc5f0 110 {
nexpaq 0:6c56fb4bc5f0 111 free(_value);
nexpaq 0:6c56fb4bc5f0 112 delete _function_pointer;
nexpaq 0:6c56fb4bc5f0 113 }
nexpaq 0:6c56fb4bc5f0 114
nexpaq 0:6c56fb4bc5f0 115 M2MBase::BaseType M2MResourceInstance::base_type() const
nexpaq 0:6c56fb4bc5f0 116 {
nexpaq 0:6c56fb4bc5f0 117 return M2MBase::base_type();
nexpaq 0:6c56fb4bc5f0 118 }
nexpaq 0:6c56fb4bc5f0 119
nexpaq 0:6c56fb4bc5f0 120 M2MResourceInstance::ResourceType M2MResourceInstance::resource_instance_type() const
nexpaq 0:6c56fb4bc5f0 121 {
nexpaq 0:6c56fb4bc5f0 122 return _resource_type;
nexpaq 0:6c56fb4bc5f0 123 }
nexpaq 0:6c56fb4bc5f0 124
nexpaq 0:6c56fb4bc5f0 125 bool M2MResourceInstance::handle_observation_attribute(char *&query)
nexpaq 0:6c56fb4bc5f0 126 {
nexpaq 0:6c56fb4bc5f0 127 tr_debug("M2MResourceInstance::handle_observation_attribute - is_under_observation(%d)", is_under_observation());
nexpaq 0:6c56fb4bc5f0 128 bool success = false;
nexpaq 0:6c56fb4bc5f0 129 M2MReportHandler *handler = M2MBase::report_handler();
nexpaq 0:6c56fb4bc5f0 130 if (handler) {
nexpaq 0:6c56fb4bc5f0 131 success = handler->parse_notification_attribute(query,
nexpaq 0:6c56fb4bc5f0 132 M2MBase::base_type(), _resource_type);
nexpaq 0:6c56fb4bc5f0 133 if(success) {
nexpaq 0:6c56fb4bc5f0 134 if (is_under_observation()) {
nexpaq 0:6c56fb4bc5f0 135 handler->set_under_observation(true);
nexpaq 0:6c56fb4bc5f0 136 }
nexpaq 0:6c56fb4bc5f0 137 } else {
nexpaq 0:6c56fb4bc5f0 138 handler->set_default_values();
nexpaq 0:6c56fb4bc5f0 139 }
nexpaq 0:6c56fb4bc5f0 140 }
nexpaq 0:6c56fb4bc5f0 141 return success;
nexpaq 0:6c56fb4bc5f0 142 }
nexpaq 0:6c56fb4bc5f0 143
nexpaq 0:6c56fb4bc5f0 144 void M2MResourceInstance::set_execute_function(execute_callback callback)
nexpaq 0:6c56fb4bc5f0 145 {
nexpaq 0:6c56fb4bc5f0 146 _execute_callback = callback;
nexpaq 0:6c56fb4bc5f0 147 }
nexpaq 0:6c56fb4bc5f0 148
nexpaq 0:6c56fb4bc5f0 149 void M2MResourceInstance::set_execute_function(execute_callback_2 callback)
nexpaq 0:6c56fb4bc5f0 150 {
nexpaq 0:6c56fb4bc5f0 151 delete _function_pointer;
nexpaq 0:6c56fb4bc5f0 152
nexpaq 0:6c56fb4bc5f0 153 _function_pointer = new FP1<void, void*>(callback);
nexpaq 0:6c56fb4bc5f0 154 set_execute_function(execute_callback(_function_pointer, &FP1<void, void*>::call));
nexpaq 0:6c56fb4bc5f0 155 }
nexpaq 0:6c56fb4bc5f0 156
nexpaq 0:6c56fb4bc5f0 157 void M2MResourceInstance::clear_value()
nexpaq 0:6c56fb4bc5f0 158 {
nexpaq 0:6c56fb4bc5f0 159 tr_debug("M2MResourceInstance::clear_value");
nexpaq 0:6c56fb4bc5f0 160
nexpaq 0:6c56fb4bc5f0 161 free(_value);
nexpaq 0:6c56fb4bc5f0 162 _value = NULL;
nexpaq 0:6c56fb4bc5f0 163 _value_length = 0;
nexpaq 0:6c56fb4bc5f0 164
nexpaq 0:6c56fb4bc5f0 165 report();
nexpaq 0:6c56fb4bc5f0 166 }
nexpaq 0:6c56fb4bc5f0 167
nexpaq 0:6c56fb4bc5f0 168 bool M2MResourceInstance::set_value(int64_t value)
nexpaq 0:6c56fb4bc5f0 169 {
nexpaq 0:6c56fb4bc5f0 170 bool success;
nexpaq 0:6c56fb4bc5f0 171 // max len of "-9223372036854775808" plus zero termination
nexpaq 0:6c56fb4bc5f0 172 char buffer[20+1];
nexpaq 0:6c56fb4bc5f0 173 uint32_t size = m2m::itoa_c(value, buffer);
nexpaq 0:6c56fb4bc5f0 174
nexpaq 0:6c56fb4bc5f0 175 success = set_value((const uint8_t*)buffer, size);
nexpaq 0:6c56fb4bc5f0 176
nexpaq 0:6c56fb4bc5f0 177 return success;
nexpaq 0:6c56fb4bc5f0 178 }
nexpaq 0:6c56fb4bc5f0 179
nexpaq 0:6c56fb4bc5f0 180 bool M2MResourceInstance::set_value(const uint8_t *value,
nexpaq 0:6c56fb4bc5f0 181 const uint32_t value_length)
nexpaq 0:6c56fb4bc5f0 182 {
nexpaq 0:6c56fb4bc5f0 183 tr_debug("M2MResourceInstance::set_value()");
nexpaq 0:6c56fb4bc5f0 184 bool success = false;
nexpaq 0:6c56fb4bc5f0 185 bool value_changed = false;
nexpaq 0:6c56fb4bc5f0 186 if(is_value_changed(value,value_length)) {
nexpaq 0:6c56fb4bc5f0 187 value_changed = true;
nexpaq 0:6c56fb4bc5f0 188 }
nexpaq 0:6c56fb4bc5f0 189 if( value != NULL && value_length > 0 ) {
nexpaq 0:6c56fb4bc5f0 190 success = true;
nexpaq 0:6c56fb4bc5f0 191
nexpaq 0:6c56fb4bc5f0 192 free(_value);
nexpaq 0:6c56fb4bc5f0 193 _value_length = 0;
nexpaq 0:6c56fb4bc5f0 194
nexpaq 0:6c56fb4bc5f0 195 _value = alloc_string_copy(value, value_length);
nexpaq 0:6c56fb4bc5f0 196 if(_value) {
nexpaq 0:6c56fb4bc5f0 197 _value_length = value_length;
nexpaq 0:6c56fb4bc5f0 198 if( value_changed ) { //
nexpaq 0:6c56fb4bc5f0 199 if (_resource_type == M2MResourceInstance::STRING) {
nexpaq 0:6c56fb4bc5f0 200 M2MReportHandler *report_handler = M2MBase::report_handler();
nexpaq 0:6c56fb4bc5f0 201 if(report_handler && is_under_observation()) {
nexpaq 0:6c56fb4bc5f0 202 report_handler->set_notification_trigger();
nexpaq 0:6c56fb4bc5f0 203 }
nexpaq 0:6c56fb4bc5f0 204 }
nexpaq 0:6c56fb4bc5f0 205 else {
nexpaq 0:6c56fb4bc5f0 206 report();
nexpaq 0:6c56fb4bc5f0 207 }
nexpaq 0:6c56fb4bc5f0 208 }
nexpaq 0:6c56fb4bc5f0 209 }
nexpaq 0:6c56fb4bc5f0 210 }
nexpaq 0:6c56fb4bc5f0 211 return success;
nexpaq 0:6c56fb4bc5f0 212 }
nexpaq 0:6c56fb4bc5f0 213
nexpaq 0:6c56fb4bc5f0 214 void M2MResourceInstance::report()
nexpaq 0:6c56fb4bc5f0 215 {
nexpaq 0:6c56fb4bc5f0 216 tr_debug("M2MResourceInstance::report()");
nexpaq 0:6c56fb4bc5f0 217 M2MBase::Observation observation_level = M2MBase::observation_level();
nexpaq 0:6c56fb4bc5f0 218 if(M2MBase::R_Attribute != observation_level) {
nexpaq 0:6c56fb4bc5f0 219 tr_debug("M2MResourceInstance::report() -- object level");
nexpaq 0:6c56fb4bc5f0 220 _object_instance_callback.notification_update(observation_level);
nexpaq 0:6c56fb4bc5f0 221 }
nexpaq 0:6c56fb4bc5f0 222 if(M2MBase::Dynamic == mode() && M2MBase::R_Attribute == observation_level) {
nexpaq 0:6c56fb4bc5f0 223 tr_debug("M2MResourceInstance::report() - resource level");
nexpaq 0:6c56fb4bc5f0 224 if(!_resource_callback && _resource_type != M2MResourceInstance::STRING) {
nexpaq 0:6c56fb4bc5f0 225 M2MReportHandler *report_handler = M2MBase::report_handler();
nexpaq 0:6c56fb4bc5f0 226 if (report_handler && is_observable()) {
nexpaq 0:6c56fb4bc5f0 227 if(_value) {
nexpaq 0:6c56fb4bc5f0 228 report_handler->set_value(atof((const char*)_value));
nexpaq 0:6c56fb4bc5f0 229 } else {
nexpaq 0:6c56fb4bc5f0 230 report_handler->set_value(0);
nexpaq 0:6c56fb4bc5f0 231 }
nexpaq 0:6c56fb4bc5f0 232 }
nexpaq 0:6c56fb4bc5f0 233 }
nexpaq 0:6c56fb4bc5f0 234 else {
nexpaq 0:6c56fb4bc5f0 235 if (_resource_callback && base_type() == M2MBase::ResourceInstance) {
nexpaq 0:6c56fb4bc5f0 236 _resource_callback->notification_update();
nexpaq 0:6c56fb4bc5f0 237 }
nexpaq 0:6c56fb4bc5f0 238 }
nexpaq 0:6c56fb4bc5f0 239 } else if(M2MBase::Static == mode()) {
nexpaq 0:6c56fb4bc5f0 240 M2MObservationHandler *observation_handler = M2MBase::observation_handler();
nexpaq 0:6c56fb4bc5f0 241 if(observation_handler) {
nexpaq 0:6c56fb4bc5f0 242 observation_handler->value_updated(this);
nexpaq 0:6c56fb4bc5f0 243 }
nexpaq 0:6c56fb4bc5f0 244 } else {
nexpaq 0:6c56fb4bc5f0 245 tr_debug("M2MResourceInstance::report() - mode = %d, is_observable = %d", mode(), is_observable());
nexpaq 0:6c56fb4bc5f0 246 }
nexpaq 0:6c56fb4bc5f0 247 }
nexpaq 0:6c56fb4bc5f0 248
nexpaq 0:6c56fb4bc5f0 249 bool M2MResourceInstance::is_value_changed(const uint8_t* value, const uint32_t value_len)
nexpaq 0:6c56fb4bc5f0 250 {
nexpaq 0:6c56fb4bc5f0 251 bool changed = false;
nexpaq 0:6c56fb4bc5f0 252 if(value_len != _value_length) {
nexpaq 0:6c56fb4bc5f0 253 changed = true;
nexpaq 0:6c56fb4bc5f0 254 } else if(value && !_value) {
nexpaq 0:6c56fb4bc5f0 255 changed = true;
nexpaq 0:6c56fb4bc5f0 256 } else if(_value && !value) {
nexpaq 0:6c56fb4bc5f0 257 changed = true;
nexpaq 0:6c56fb4bc5f0 258 } else {
nexpaq 0:6c56fb4bc5f0 259 if (_value) {
nexpaq 0:6c56fb4bc5f0 260 if (strcmp((char*)value, (char*)_value) != 0) {
nexpaq 0:6c56fb4bc5f0 261 changed = true;
nexpaq 0:6c56fb4bc5f0 262 }
nexpaq 0:6c56fb4bc5f0 263 }
nexpaq 0:6c56fb4bc5f0 264 }
nexpaq 0:6c56fb4bc5f0 265 tr_debug("M2MResourceInstance::is_value_changed() -- %s", changed ? "true" : "false");
nexpaq 0:6c56fb4bc5f0 266 return changed;
nexpaq 0:6c56fb4bc5f0 267 }
nexpaq 0:6c56fb4bc5f0 268
nexpaq 0:6c56fb4bc5f0 269 void M2MResourceInstance::execute(void *arguments)
nexpaq 0:6c56fb4bc5f0 270 {
nexpaq 0:6c56fb4bc5f0 271 tr_debug("M2MResourceInstance::execute");
nexpaq 0:6c56fb4bc5f0 272 if(_execute_callback) {
nexpaq 0:6c56fb4bc5f0 273 _execute_callback(arguments);
nexpaq 0:6c56fb4bc5f0 274 }
nexpaq 0:6c56fb4bc5f0 275 }
nexpaq 0:6c56fb4bc5f0 276
nexpaq 0:6c56fb4bc5f0 277 void M2MResourceInstance::get_value(uint8_t *&value, uint32_t &value_length)
nexpaq 0:6c56fb4bc5f0 278 {
nexpaq 0:6c56fb4bc5f0 279 value_length = 0;
nexpaq 0:6c56fb4bc5f0 280 if(value) {
nexpaq 0:6c56fb4bc5f0 281 free(value);
nexpaq 0:6c56fb4bc5f0 282 value = NULL;
nexpaq 0:6c56fb4bc5f0 283 }
nexpaq 0:6c56fb4bc5f0 284 if(_value && _value_length > 0) {
nexpaq 0:6c56fb4bc5f0 285 value = alloc_string_copy(_value, _value_length);
nexpaq 0:6c56fb4bc5f0 286 if(value) {
nexpaq 0:6c56fb4bc5f0 287 value_length = _value_length;
nexpaq 0:6c56fb4bc5f0 288 }
nexpaq 0:6c56fb4bc5f0 289 }
nexpaq 0:6c56fb4bc5f0 290 }
nexpaq 0:6c56fb4bc5f0 291
nexpaq 0:6c56fb4bc5f0 292 int M2MResourceInstance::get_value_int()
nexpaq 0:6c56fb4bc5f0 293 {
nexpaq 0:6c56fb4bc5f0 294 int value_int = 0;
nexpaq 0:6c56fb4bc5f0 295 // Get the value and convert it into integer. This is not the most
nexpaq 0:6c56fb4bc5f0 296 // efficient way, as it takes pointless heap copy to get the zero termination.
nexpaq 0:6c56fb4bc5f0 297 uint8_t* buffer = NULL;
nexpaq 0:6c56fb4bc5f0 298 uint32_t length;
nexpaq 0:6c56fb4bc5f0 299 get_value(buffer,length);
nexpaq 0:6c56fb4bc5f0 300 if(buffer) {
nexpaq 0:6c56fb4bc5f0 301 value_int = atoi((const char*)buffer);
nexpaq 0:6c56fb4bc5f0 302 free(buffer);
nexpaq 0:6c56fb4bc5f0 303 }
nexpaq 0:6c56fb4bc5f0 304 return value_int;
nexpaq 0:6c56fb4bc5f0 305 }
nexpaq 0:6c56fb4bc5f0 306
nexpaq 0:6c56fb4bc5f0 307 String M2MResourceInstance::get_value_string() const
nexpaq 0:6c56fb4bc5f0 308 {
nexpaq 0:6c56fb4bc5f0 309 // XXX: do a better constructor to avoid pointless malloc
nexpaq 0:6c56fb4bc5f0 310 String value;
nexpaq 0:6c56fb4bc5f0 311 if (_value) {
nexpaq 0:6c56fb4bc5f0 312 value.append_raw((char*)_value, _value_length);
nexpaq 0:6c56fb4bc5f0 313 }
nexpaq 0:6c56fb4bc5f0 314
nexpaq 0:6c56fb4bc5f0 315 return value;
nexpaq 0:6c56fb4bc5f0 316 }
nexpaq 0:6c56fb4bc5f0 317
nexpaq 0:6c56fb4bc5f0 318 uint8_t* M2MResourceInstance::value() const
nexpaq 0:6c56fb4bc5f0 319 {
nexpaq 0:6c56fb4bc5f0 320 return _value;
nexpaq 0:6c56fb4bc5f0 321 }
nexpaq 0:6c56fb4bc5f0 322
nexpaq 0:6c56fb4bc5f0 323 uint32_t M2MResourceInstance::value_length() const
nexpaq 0:6c56fb4bc5f0 324 {
nexpaq 0:6c56fb4bc5f0 325 return _value_length;
nexpaq 0:6c56fb4bc5f0 326 }
nexpaq 0:6c56fb4bc5f0 327
nexpaq 0:6c56fb4bc5f0 328 sn_coap_hdr_s* M2MResourceInstance::handle_get_request(nsdl_s *nsdl,
nexpaq 0:6c56fb4bc5f0 329 sn_coap_hdr_s *received_coap_header,
nexpaq 0:6c56fb4bc5f0 330 M2MObservationHandler *observation_handler)
nexpaq 0:6c56fb4bc5f0 331 {
nexpaq 0:6c56fb4bc5f0 332 tr_debug("M2MResourceInstance::handle_get_request()");
nexpaq 0:6c56fb4bc5f0 333 sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CONTENT;
nexpaq 0:6c56fb4bc5f0 334 sn_coap_hdr_s *coap_response = sn_nsdl_build_response(nsdl,
nexpaq 0:6c56fb4bc5f0 335 received_coap_header,
nexpaq 0:6c56fb4bc5f0 336 msg_code);
nexpaq 0:6c56fb4bc5f0 337 if(received_coap_header) {
nexpaq 0:6c56fb4bc5f0 338 // process the GET if we have registered a callback for it
nexpaq 0:6c56fb4bc5f0 339 if ((operation() & SN_GRS_GET_ALLOWED) != 0) {
nexpaq 0:6c56fb4bc5f0 340 if(coap_response) {
nexpaq 0:6c56fb4bc5f0 341 if(_resource_type == M2MResourceInstance::OPAQUE) {
nexpaq 0:6c56fb4bc5f0 342 coap_response->content_type_ptr =
nexpaq 0:6c56fb4bc5f0 343 m2m::String::convert_integer_to_array(COAP_CONTENT_OMA_OPAQUE_TYPE,
nexpaq 0:6c56fb4bc5f0 344 coap_response->content_type_len);
nexpaq 0:6c56fb4bc5f0 345 } else {
nexpaq 0:6c56fb4bc5f0 346 coap_response->content_type_ptr =
nexpaq 0:6c56fb4bc5f0 347 m2m::String::convert_integer_to_array(0,
nexpaq 0:6c56fb4bc5f0 348 coap_response->content_type_len);
nexpaq 0:6c56fb4bc5f0 349 }
nexpaq 0:6c56fb4bc5f0 350
nexpaq 0:6c56fb4bc5f0 351 // fill in the CoAP response payload
nexpaq 0:6c56fb4bc5f0 352 coap_response->payload_ptr = NULL;
nexpaq 0:6c56fb4bc5f0 353 uint32_t payload_len = 0;
nexpaq 0:6c56fb4bc5f0 354 get_value(coap_response->payload_ptr,payload_len);
nexpaq 0:6c56fb4bc5f0 355 coap_response->payload_len = payload_len;
nexpaq 0:6c56fb4bc5f0 356
nexpaq 0:6c56fb4bc5f0 357 coap_response->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s));
nexpaq 0:6c56fb4bc5f0 358 memset(coap_response->options_list_ptr, 0, sizeof(sn_coap_options_list_s));
nexpaq 0:6c56fb4bc5f0 359
nexpaq 0:6c56fb4bc5f0 360 coap_response->options_list_ptr->max_age_ptr =
nexpaq 0:6c56fb4bc5f0 361 m2m::String::convert_integer_to_array(max_age(),
nexpaq 0:6c56fb4bc5f0 362 coap_response->options_list_ptr->max_age_len);
nexpaq 0:6c56fb4bc5f0 363
nexpaq 0:6c56fb4bc5f0 364 if(received_coap_header->options_list_ptr) {
nexpaq 0:6c56fb4bc5f0 365 if(received_coap_header->options_list_ptr->observe) {
nexpaq 0:6c56fb4bc5f0 366 if (is_observable()) {
nexpaq 0:6c56fb4bc5f0 367 uint32_t number = 0;
nexpaq 0:6c56fb4bc5f0 368 uint8_t observe_option = 0;
nexpaq 0:6c56fb4bc5f0 369 if(received_coap_header->options_list_ptr->observe_ptr) {
nexpaq 0:6c56fb4bc5f0 370 observe_option = *received_coap_header->options_list_ptr->observe_ptr;
nexpaq 0:6c56fb4bc5f0 371 }
nexpaq 0:6c56fb4bc5f0 372 if(START_OBSERVATION == observe_option) {
nexpaq 0:6c56fb4bc5f0 373 tr_debug("M2MResourceInstance::handle_get_request - Starts Observation");
nexpaq 0:6c56fb4bc5f0 374 // If the observe length is 0 means register for observation.
nexpaq 0:6c56fb4bc5f0 375 if(received_coap_header->options_list_ptr->observe_len != 0) {
nexpaq 0:6c56fb4bc5f0 376 for(int i=0;i < received_coap_header->options_list_ptr->observe_len; i++) {
nexpaq 0:6c56fb4bc5f0 377 number = (*(received_coap_header->options_list_ptr->observe_ptr + i) & 0xff) <<
nexpaq 0:6c56fb4bc5f0 378 8*(received_coap_header->options_list_ptr->observe_len- 1 - i);
nexpaq 0:6c56fb4bc5f0 379 }
nexpaq 0:6c56fb4bc5f0 380 }
nexpaq 0:6c56fb4bc5f0 381 if(received_coap_header->token_ptr) {
nexpaq 0:6c56fb4bc5f0 382 tr_debug("M2MResourceInstance::handle_get_request - Sets Observation Token to resource");
nexpaq 0:6c56fb4bc5f0 383 set_observation_token(received_coap_header->token_ptr,
nexpaq 0:6c56fb4bc5f0 384 received_coap_header->token_len);
nexpaq 0:6c56fb4bc5f0 385 }
nexpaq 0:6c56fb4bc5f0 386 // If the observe value is 0 means register for observation.
nexpaq 0:6c56fb4bc5f0 387 if(number == 0) {
nexpaq 0:6c56fb4bc5f0 388 tr_debug("M2MResourceInstance::handle_get_request - Put Resource under Observation");
nexpaq 0:6c56fb4bc5f0 389 set_under_observation(true,observation_handler);
nexpaq 0:6c56fb4bc5f0 390 M2MBase::add_observation_level(M2MBase::R_Attribute);
nexpaq 0:6c56fb4bc5f0 391 coap_response->options_list_ptr->observe_ptr =
nexpaq 0:6c56fb4bc5f0 392 m2m::String::convert_integer_to_array(observation_number(),
nexpaq 0:6c56fb4bc5f0 393 coap_response->options_list_ptr->observe_len);
nexpaq 0:6c56fb4bc5f0 394 }
nexpaq 0:6c56fb4bc5f0 395 } else if (STOP_OBSERVATION == observe_option) {
nexpaq 0:6c56fb4bc5f0 396 tr_debug("M2MResourceInstance::handle_get_request - Stops Observation");
nexpaq 0:6c56fb4bc5f0 397 set_under_observation(false,NULL);
nexpaq 0:6c56fb4bc5f0 398 M2MBase::remove_observation_level(M2MBase::R_Attribute);
nexpaq 0:6c56fb4bc5f0 399 }
nexpaq 0:6c56fb4bc5f0 400 } else {
nexpaq 0:6c56fb4bc5f0 401 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
nexpaq 0:6c56fb4bc5f0 402 }
nexpaq 0:6c56fb4bc5f0 403 }
nexpaq 0:6c56fb4bc5f0 404 }
nexpaq 0:6c56fb4bc5f0 405 }
nexpaq 0:6c56fb4bc5f0 406 }else {
nexpaq 0:6c56fb4bc5f0 407 tr_error("M2MResourceInstance::handle_get_request - Return COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED");
nexpaq 0:6c56fb4bc5f0 408 // Operation is not allowed.
nexpaq 0:6c56fb4bc5f0 409 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
nexpaq 0:6c56fb4bc5f0 410 }
nexpaq 0:6c56fb4bc5f0 411 } else {
nexpaq 0:6c56fb4bc5f0 412 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
nexpaq 0:6c56fb4bc5f0 413 }
nexpaq 0:6c56fb4bc5f0 414 if(coap_response) {
nexpaq 0:6c56fb4bc5f0 415 coap_response->msg_code = msg_code;
nexpaq 0:6c56fb4bc5f0 416 }
nexpaq 0:6c56fb4bc5f0 417 return coap_response;
nexpaq 0:6c56fb4bc5f0 418 }
nexpaq 0:6c56fb4bc5f0 419
nexpaq 0:6c56fb4bc5f0 420 sn_coap_hdr_s* M2MResourceInstance::handle_put_request(nsdl_s *nsdl,
nexpaq 0:6c56fb4bc5f0 421 sn_coap_hdr_s *received_coap_header,
nexpaq 0:6c56fb4bc5f0 422 M2MObservationHandler *observation_handler,
nexpaq 0:6c56fb4bc5f0 423 bool &execute_value_updated)
nexpaq 0:6c56fb4bc5f0 424 {
nexpaq 0:6c56fb4bc5f0 425 tr_debug("M2MResourceInstance::handle_put_request()");
nexpaq 0:6c56fb4bc5f0 426 sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; // 2.04
nexpaq 0:6c56fb4bc5f0 427 sn_coap_hdr_s * coap_response = sn_nsdl_build_response(nsdl,
nexpaq 0:6c56fb4bc5f0 428 received_coap_header,
nexpaq 0:6c56fb4bc5f0 429 msg_code);
nexpaq 0:6c56fb4bc5f0 430 // process the PUT if we have registered a callback for it
nexpaq 0:6c56fb4bc5f0 431 if(received_coap_header) {
nexpaq 0:6c56fb4bc5f0 432 uint16_t coap_content_type = 0;
nexpaq 0:6c56fb4bc5f0 433 if(received_coap_header->content_type_ptr) {
nexpaq 0:6c56fb4bc5f0 434 if(coap_response) {
nexpaq 0:6c56fb4bc5f0 435 coap_response->content_type_ptr = alloc_copy(received_coap_header->content_type_ptr,
nexpaq 0:6c56fb4bc5f0 436 received_coap_header->content_type_len);
nexpaq 0:6c56fb4bc5f0 437 if(coap_response->content_type_ptr) {
nexpaq 0:6c56fb4bc5f0 438 coap_response->content_type_len = received_coap_header->content_type_len;
nexpaq 0:6c56fb4bc5f0 439 for(uint8_t i = 0; i < coap_response->content_type_len; i++) {
nexpaq 0:6c56fb4bc5f0 440 coap_content_type = (coap_content_type << 8) +
nexpaq 0:6c56fb4bc5f0 441 (coap_response->content_type_ptr[i] & 0xFF);
nexpaq 0:6c56fb4bc5f0 442 }
nexpaq 0:6c56fb4bc5f0 443 }
nexpaq 0:6c56fb4bc5f0 444 }
nexpaq 0:6c56fb4bc5f0 445 }
nexpaq 0:6c56fb4bc5f0 446 if(received_coap_header->options_list_ptr &&
nexpaq 0:6c56fb4bc5f0 447 received_coap_header->options_list_ptr->uri_query_ptr) {
nexpaq 0:6c56fb4bc5f0 448 char *query = (char*)alloc_string_copy(received_coap_header->options_list_ptr->uri_query_ptr,
nexpaq 0:6c56fb4bc5f0 449 received_coap_header->options_list_ptr->uri_query_len);
nexpaq 0:6c56fb4bc5f0 450 if (query){
nexpaq 0:6c56fb4bc5f0 451 tr_debug("M2MResourceInstance::handle_put_request() - Query %s", query);
nexpaq 0:6c56fb4bc5f0 452
nexpaq 0:6c56fb4bc5f0 453 // if anything was updated, re-initialize the stored notification attributes
nexpaq 0:6c56fb4bc5f0 454 if (!handle_observation_attribute(query)){
nexpaq 0:6c56fb4bc5f0 455 tr_debug("M2MResourceInstance::handle_put_request() - Invalid query");
nexpaq 0:6c56fb4bc5f0 456 msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; // 4.00
nexpaq 0:6c56fb4bc5f0 457 }
nexpaq 0:6c56fb4bc5f0 458 free(query);
nexpaq 0:6c56fb4bc5f0 459 }
nexpaq 0:6c56fb4bc5f0 460 } else if ((operation() & SN_GRS_PUT_ALLOWED) != 0) {
nexpaq 0:6c56fb4bc5f0 461 tr_debug("M2MResourceInstance::handle_put_request() - Request Content-Type %d", coap_content_type);
nexpaq 0:6c56fb4bc5f0 462
nexpaq 0:6c56fb4bc5f0 463 if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type) {
nexpaq 0:6c56fb4bc5f0 464 msg_code = COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT;
nexpaq 0:6c56fb4bc5f0 465 } else {
nexpaq 0:6c56fb4bc5f0 466 set_value(received_coap_header->payload_ptr, received_coap_header->payload_len);
nexpaq 0:6c56fb4bc5f0 467 if(received_coap_header->payload_ptr) {
nexpaq 0:6c56fb4bc5f0 468 tr_debug("M2MResourceInstance::handle_put_request() - Update Resource with new values");
nexpaq 0:6c56fb4bc5f0 469 if(observation_handler) {
nexpaq 0:6c56fb4bc5f0 470 String value = "";
nexpaq 0:6c56fb4bc5f0 471 if (received_coap_header->uri_path_ptr != NULL &&
nexpaq 0:6c56fb4bc5f0 472 received_coap_header->uri_path_len > 0) {
nexpaq 0:6c56fb4bc5f0 473
nexpaq 0:6c56fb4bc5f0 474 value.append_raw((char*)received_coap_header->uri_path_ptr, received_coap_header->uri_path_len);
nexpaq 0:6c56fb4bc5f0 475 }
nexpaq 0:6c56fb4bc5f0 476 execute_value_updated = true;
nexpaq 0:6c56fb4bc5f0 477 }
nexpaq 0:6c56fb4bc5f0 478 }
nexpaq 0:6c56fb4bc5f0 479 }
nexpaq 0:6c56fb4bc5f0 480 } else {
nexpaq 0:6c56fb4bc5f0 481 // Operation is not allowed.
nexpaq 0:6c56fb4bc5f0 482 tr_error("M2MResourceInstance::handle_put_request() - COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED");
nexpaq 0:6c56fb4bc5f0 483 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
nexpaq 0:6c56fb4bc5f0 484 }
nexpaq 0:6c56fb4bc5f0 485 } else {
nexpaq 0:6c56fb4bc5f0 486 msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED;
nexpaq 0:6c56fb4bc5f0 487 }
nexpaq 0:6c56fb4bc5f0 488 if(coap_response) {
nexpaq 0:6c56fb4bc5f0 489 coap_response->msg_code = msg_code;
nexpaq 0:6c56fb4bc5f0 490 }
nexpaq 0:6c56fb4bc5f0 491 return coap_response;
nexpaq 0:6c56fb4bc5f0 492 }
nexpaq 0:6c56fb4bc5f0 493
nexpaq 0:6c56fb4bc5f0 494 void M2MResourceInstance::set_resource_observer(M2MResourceCallback *resource)
nexpaq 0:6c56fb4bc5f0 495 {
nexpaq 0:6c56fb4bc5f0 496 _resource_callback = resource;
nexpaq 0:6c56fb4bc5f0 497 }
nexpaq 0:6c56fb4bc5f0 498
nexpaq 0:6c56fb4bc5f0 499 const String& M2MResourceInstance::object_name() const
nexpaq 0:6c56fb4bc5f0 500 {
nexpaq 0:6c56fb4bc5f0 501 return _object_name;
nexpaq 0:6c56fb4bc5f0 502 }
nexpaq 0:6c56fb4bc5f0 503
nexpaq 0:6c56fb4bc5f0 504 uint16_t M2MResourceInstance::object_instance_id() const
nexpaq 0:6c56fb4bc5f0 505 {
nexpaq 0:6c56fb4bc5f0 506 return _object_instance_id;
nexpaq 0:6c56fb4bc5f0 507 }