sandbox / mbed-client

Fork of mbed-client by Christopher Haster

Committer:
Yogesh Pande
Date:
Sat Apr 02 00:31:13 2016 +0300
Revision:
4:ae5178938864
Parent:
1:79b6cc67d8b4
Latest updated sources from Github and some trace group refactor.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Christopher Haster 1:79b6cc67d8b4 1 /*
Christopher Haster 1:79b6cc67d8b4 2 * Copyright (c) 2015 ARM Limited. All rights reserved.
Christopher Haster 1:79b6cc67d8b4 3 * SPDX-License-Identifier: Apache-2.0
Christopher Haster 1:79b6cc67d8b4 4 * Licensed under the Apache License, Version 2.0 (the License); you may
Christopher Haster 1:79b6cc67d8b4 5 * not use this file except in compliance with the License.
Christopher Haster 1:79b6cc67d8b4 6 * You may obtain a copy of the License at
Christopher Haster 1:79b6cc67d8b4 7 *
Christopher Haster 1:79b6cc67d8b4 8 * http://www.apache.org/licenses/LICENSE-2.0
Christopher Haster 1:79b6cc67d8b4 9 *
Christopher Haster 1:79b6cc67d8b4 10 * Unless required by applicable law or agreed to in writing, software
Christopher Haster 1:79b6cc67d8b4 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
Christopher Haster 1:79b6cc67d8b4 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Christopher Haster 1:79b6cc67d8b4 13 * See the License for the specific language governing permissions and
Christopher Haster 1:79b6cc67d8b4 14 * limitations under the License.
Christopher Haster 1:79b6cc67d8b4 15 */
Yogesh Pande 4:ae5178938864 16
Christopher Haster 1:79b6cc67d8b4 17 #include "mbed-client/m2mdevice.h"
Christopher Haster 1:79b6cc67d8b4 18 #include "mbed-client/m2mconstants.h"
Christopher Haster 1:79b6cc67d8b4 19 #include "mbed-client/m2mobject.h"
Christopher Haster 1:79b6cc67d8b4 20 #include "mbed-client/m2mobjectinstance.h"
Christopher Haster 1:79b6cc67d8b4 21 #include "mbed-client/m2mresource.h"
Yogesh Pande 4:ae5178938864 22 #include "mbed-trace/mbed_trace.h"
Yogesh Pande 4:ae5178938864 23
Yogesh Pande 4:ae5178938864 24 #define BUFFER_SIZE 21
Yogesh Pande 4:ae5178938864 25 #define TRACE_GROUP "mClt"
Christopher Haster 1:79b6cc67d8b4 26
Christopher Haster 1:79b6cc67d8b4 27 M2MDevice* M2MDevice::_instance = NULL;
Christopher Haster 1:79b6cc67d8b4 28
Christopher Haster 1:79b6cc67d8b4 29 M2MDevice* M2MDevice::get_instance()
Christopher Haster 1:79b6cc67d8b4 30 {
Christopher Haster 1:79b6cc67d8b4 31 if(_instance == NULL) {
Christopher Haster 1:79b6cc67d8b4 32 _instance = new M2MDevice();
Christopher Haster 1:79b6cc67d8b4 33 }
Christopher Haster 1:79b6cc67d8b4 34 return _instance;
Christopher Haster 1:79b6cc67d8b4 35 }
Christopher Haster 1:79b6cc67d8b4 36
Christopher Haster 1:79b6cc67d8b4 37 void M2MDevice::delete_instance()
Christopher Haster 1:79b6cc67d8b4 38 {
Christopher Haster 1:79b6cc67d8b4 39 if(_instance) {
Christopher Haster 1:79b6cc67d8b4 40 delete _instance;
Christopher Haster 1:79b6cc67d8b4 41 _instance = NULL;
Christopher Haster 1:79b6cc67d8b4 42 }
Christopher Haster 1:79b6cc67d8b4 43 }
Christopher Haster 1:79b6cc67d8b4 44
Christopher Haster 1:79b6cc67d8b4 45 M2MDevice::M2MDevice()
Christopher Haster 1:79b6cc67d8b4 46 : M2MObject(M2M_DEVICE_ID)
Christopher Haster 1:79b6cc67d8b4 47 {
Yogesh Pande 4:ae5178938864 48 M2MBase::set_register_uri(false);
Yogesh Pande 4:ae5178938864 49 M2MBase::set_operation(M2MBase::GET_ALLOWED);
Yogesh Pande 4:ae5178938864 50
Christopher Haster 1:79b6cc67d8b4 51 _device_instance = M2MObject::create_object_instance();
Yogesh Pande 4:ae5178938864 52 _device_instance->set_operation(M2MBase::GET_ALLOWED);
Yogesh Pande 4:ae5178938864 53 _device_instance->set_register_uri(true);
Christopher Haster 1:79b6cc67d8b4 54 if(_device_instance) {
Yogesh Pande 4:ae5178938864 55 _device_instance->set_coap_content_type(COAP_CONTENT_OMA_TLV_TYPE);
Christopher Haster 1:79b6cc67d8b4 56 M2MResource* res = _device_instance->create_dynamic_resource(DEVICE_REBOOT,
Christopher Haster 1:79b6cc67d8b4 57 OMA_RESOURCE_TYPE,
Christopher Haster 1:79b6cc67d8b4 58 M2MResourceInstance::OPAQUE,
Christopher Haster 1:79b6cc67d8b4 59 false);
Christopher Haster 1:79b6cc67d8b4 60 if(res) {
Christopher Haster 1:79b6cc67d8b4 61 res->set_operation(M2MBase::POST_ALLOWED);
Yogesh Pande 4:ae5178938864 62 res->set_register_uri(false);
Christopher Haster 1:79b6cc67d8b4 63 }
Christopher Haster 1:79b6cc67d8b4 64
Christopher Haster 1:79b6cc67d8b4 65 M2MResourceInstance* instance = _device_instance->create_dynamic_resource_instance(DEVICE_ERROR_CODE,
Christopher Haster 1:79b6cc67d8b4 66 OMA_RESOURCE_TYPE,
Christopher Haster 1:79b6cc67d8b4 67 M2MResourceInstance::INTEGER,
Yogesh Pande 4:ae5178938864 68 true,0);
Christopher Haster 1:79b6cc67d8b4 69 if(instance) {
Yogesh Pande 4:ae5178938864 70 M2MResource * dev_res = _device_instance->resource(DEVICE_ERROR_CODE);
Yogesh Pande 4:ae5178938864 71 dev_res->set_register_uri(false);
Christopher Haster 1:79b6cc67d8b4 72 instance->set_operation(M2MBase::GET_ALLOWED);
Yogesh Pande 4:ae5178938864 73 uint32_t size = 0;
Yogesh Pande 4:ae5178938864 74 char *buffer = (char*)malloc(BUFFER_SIZE);
Yogesh Pande 4:ae5178938864 75 if(buffer) {
Yogesh Pande 4:ae5178938864 76 size = m2m::itoa_c(0, buffer);
Yogesh Pande 4:ae5178938864 77 if (size <= BUFFER_SIZE)
Yogesh Pande 4:ae5178938864 78 instance->set_value((const uint8_t*)buffer, size);
Yogesh Pande 4:ae5178938864 79
Yogesh Pande 4:ae5178938864 80 free(buffer);
Yogesh Pande 4:ae5178938864 81 }
Yogesh Pande 4:ae5178938864 82 instance->set_register_uri(false);
Christopher Haster 1:79b6cc67d8b4 83 }
Christopher Haster 1:79b6cc67d8b4 84 res = _device_instance->create_dynamic_resource(DEVICE_SUPPORTED_BINDING_MODE,
Christopher Haster 1:79b6cc67d8b4 85 OMA_RESOURCE_TYPE,
Christopher Haster 1:79b6cc67d8b4 86 M2MResourceInstance::STRING,
Yogesh Pande 4:ae5178938864 87 true);
Christopher Haster 1:79b6cc67d8b4 88 if(res) {
Christopher Haster 1:79b6cc67d8b4 89 res->set_operation(M2MBase::GET_ALLOWED);
Christopher Haster 1:79b6cc67d8b4 90 res->set_value((const uint8_t*)BINDING_MODE_UDP.c_str(),
Christopher Haster 1:79b6cc67d8b4 91 (uint32_t)BINDING_MODE_UDP.length());
Yogesh Pande 4:ae5178938864 92 res->set_register_uri(false);
Christopher Haster 1:79b6cc67d8b4 93 }
Christopher Haster 1:79b6cc67d8b4 94 }
Christopher Haster 1:79b6cc67d8b4 95 }
Christopher Haster 1:79b6cc67d8b4 96
Christopher Haster 1:79b6cc67d8b4 97 M2MDevice::~M2MDevice()
Christopher Haster 1:79b6cc67d8b4 98 {
Christopher Haster 1:79b6cc67d8b4 99 }
Christopher Haster 1:79b6cc67d8b4 100
Christopher Haster 1:79b6cc67d8b4 101 M2MResource* M2MDevice::create_resource(DeviceResource resource, const String &value)
Christopher Haster 1:79b6cc67d8b4 102 {
Christopher Haster 1:79b6cc67d8b4 103 M2MResource* res = NULL;
Christopher Haster 1:79b6cc67d8b4 104 String device_id = "";
Christopher Haster 1:79b6cc67d8b4 105 M2MBase::Operation operation = M2MBase::GET_ALLOWED;
Christopher Haster 1:79b6cc67d8b4 106 if(!is_resource_present(resource) && value.size() <= MAX_ALLOWED_STRING_LENGTH) {
Christopher Haster 1:79b6cc67d8b4 107 switch(resource) {
Christopher Haster 1:79b6cc67d8b4 108 case Manufacturer:
Christopher Haster 1:79b6cc67d8b4 109 device_id = DEVICE_MANUFACTURER;
Christopher Haster 1:79b6cc67d8b4 110 break;
Christopher Haster 1:79b6cc67d8b4 111 case DeviceType:
Christopher Haster 1:79b6cc67d8b4 112 device_id = DEVICE_DEVICE_TYPE;
Christopher Haster 1:79b6cc67d8b4 113 break;
Christopher Haster 1:79b6cc67d8b4 114 case ModelNumber:
Christopher Haster 1:79b6cc67d8b4 115 device_id = DEVICE_MODEL_NUMBER;
Christopher Haster 1:79b6cc67d8b4 116 break;
Christopher Haster 1:79b6cc67d8b4 117 case SerialNumber:
Christopher Haster 1:79b6cc67d8b4 118 device_id = DEVICE_SERIAL_NUMBER;
Christopher Haster 1:79b6cc67d8b4 119 break;
Christopher Haster 1:79b6cc67d8b4 120 case HardwareVersion:
Christopher Haster 1:79b6cc67d8b4 121 device_id = DEVICE_HARDWARE_VERSION;
Christopher Haster 1:79b6cc67d8b4 122 break;
Christopher Haster 1:79b6cc67d8b4 123 case FirmwareVersion:
Christopher Haster 1:79b6cc67d8b4 124 device_id = DEVICE_FIRMWARE_VERSION;
Christopher Haster 1:79b6cc67d8b4 125 break;
Christopher Haster 1:79b6cc67d8b4 126 case SoftwareVersion:
Christopher Haster 1:79b6cc67d8b4 127 device_id = DEVICE_SOFTWARE_VERSION;
Christopher Haster 1:79b6cc67d8b4 128 break;
Christopher Haster 1:79b6cc67d8b4 129 case UTCOffset:
Christopher Haster 1:79b6cc67d8b4 130 device_id = DEVICE_UTC_OFFSET;
Christopher Haster 1:79b6cc67d8b4 131 operation = M2MBase::GET_PUT_ALLOWED;
Christopher Haster 1:79b6cc67d8b4 132 break;
Christopher Haster 1:79b6cc67d8b4 133 case Timezone:
Christopher Haster 1:79b6cc67d8b4 134 device_id = DEVICE_TIMEZONE;
Christopher Haster 1:79b6cc67d8b4 135 operation = M2MBase::GET_PUT_ALLOWED;
Christopher Haster 1:79b6cc67d8b4 136 break;
Christopher Haster 1:79b6cc67d8b4 137 default:
Christopher Haster 1:79b6cc67d8b4 138 break;
Christopher Haster 1:79b6cc67d8b4 139 }
Christopher Haster 1:79b6cc67d8b4 140 }
Christopher Haster 1:79b6cc67d8b4 141 if(!device_id.empty()) {
Christopher Haster 1:79b6cc67d8b4 142 if(_device_instance) {
Christopher Haster 1:79b6cc67d8b4 143 res = _device_instance->create_dynamic_resource(device_id,
Christopher Haster 1:79b6cc67d8b4 144 OMA_RESOURCE_TYPE,
Christopher Haster 1:79b6cc67d8b4 145 M2MResourceInstance::STRING,
Yogesh Pande 4:ae5178938864 146 true);
Christopher Haster 1:79b6cc67d8b4 147
Christopher Haster 1:79b6cc67d8b4 148 if(res ) {
Christopher Haster 1:79b6cc67d8b4 149 res->set_operation(operation);
Christopher Haster 1:79b6cc67d8b4 150 if (value.empty()) {
Christopher Haster 1:79b6cc67d8b4 151 res->clear_value();
Christopher Haster 1:79b6cc67d8b4 152 } else {
Christopher Haster 1:79b6cc67d8b4 153 res->set_value((const uint8_t*)value.c_str(),
Christopher Haster 1:79b6cc67d8b4 154 (uint32_t)value.length());
Christopher Haster 1:79b6cc67d8b4 155 }
Yogesh Pande 4:ae5178938864 156 res->set_register_uri(false);
Christopher Haster 1:79b6cc67d8b4 157 }
Christopher Haster 1:79b6cc67d8b4 158 }
Christopher Haster 1:79b6cc67d8b4 159 }
Christopher Haster 1:79b6cc67d8b4 160 return res;
Christopher Haster 1:79b6cc67d8b4 161 }
Christopher Haster 1:79b6cc67d8b4 162
Christopher Haster 1:79b6cc67d8b4 163 M2MResource* M2MDevice::create_resource(DeviceResource resource, int64_t value)
Christopher Haster 1:79b6cc67d8b4 164 {
Christopher Haster 1:79b6cc67d8b4 165 M2MResource* res = NULL;
Christopher Haster 1:79b6cc67d8b4 166 String device_id = "";
Christopher Haster 1:79b6cc67d8b4 167 M2MBase::Operation operation = M2MBase::GET_ALLOWED;
Christopher Haster 1:79b6cc67d8b4 168 if(!is_resource_present(resource)) {
Christopher Haster 1:79b6cc67d8b4 169 switch(resource) {
Christopher Haster 1:79b6cc67d8b4 170 case BatteryLevel:
Christopher Haster 1:79b6cc67d8b4 171 if(check_value_range(resource, value)) {
Christopher Haster 1:79b6cc67d8b4 172 device_id = DEVICE_BATTERY_LEVEL;
Christopher Haster 1:79b6cc67d8b4 173 }
Christopher Haster 1:79b6cc67d8b4 174 break;
Christopher Haster 1:79b6cc67d8b4 175 case BatteryStatus:
Christopher Haster 1:79b6cc67d8b4 176 if(check_value_range(resource, value)) {
Christopher Haster 1:79b6cc67d8b4 177 device_id = DEVICE_BATTERY_STATUS;
Christopher Haster 1:79b6cc67d8b4 178 }
Christopher Haster 1:79b6cc67d8b4 179 break;
Christopher Haster 1:79b6cc67d8b4 180 case MemoryFree:
Christopher Haster 1:79b6cc67d8b4 181 device_id = DEVICE_MEMORY_FREE;
Christopher Haster 1:79b6cc67d8b4 182 break;
Christopher Haster 1:79b6cc67d8b4 183 case MemoryTotal:
Christopher Haster 1:79b6cc67d8b4 184 device_id = DEVICE_MEMORY_TOTAL;
Christopher Haster 1:79b6cc67d8b4 185 break;
Christopher Haster 1:79b6cc67d8b4 186 case CurrentTime:
Christopher Haster 1:79b6cc67d8b4 187 device_id = DEVICE_CURRENT_TIME;
Christopher Haster 1:79b6cc67d8b4 188 operation = M2MBase::GET_PUT_ALLOWED;
Christopher Haster 1:79b6cc67d8b4 189 break;
Christopher Haster 1:79b6cc67d8b4 190 default:
Christopher Haster 1:79b6cc67d8b4 191 break;
Christopher Haster 1:79b6cc67d8b4 192 }
Christopher Haster 1:79b6cc67d8b4 193 }
Christopher Haster 1:79b6cc67d8b4 194 if(!device_id.empty()) {
Christopher Haster 1:79b6cc67d8b4 195 if(_device_instance) {
Christopher Haster 1:79b6cc67d8b4 196 res = _device_instance->create_dynamic_resource(device_id,
Christopher Haster 1:79b6cc67d8b4 197 OMA_RESOURCE_TYPE,
Christopher Haster 1:79b6cc67d8b4 198 M2MResourceInstance::INTEGER,
Yogesh Pande 4:ae5178938864 199 true);
Christopher Haster 1:79b6cc67d8b4 200
Christopher Haster 1:79b6cc67d8b4 201 if(res) {
Yogesh Pande 4:ae5178938864 202 char *buffer = (char*)malloc(BUFFER_SIZE);
Christopher Haster 1:79b6cc67d8b4 203 if(buffer) {
Yogesh Pande 4:ae5178938864 204 uint32_t size = m2m::itoa_c(value, buffer);
Yogesh Pande 4:ae5178938864 205 if (size <= BUFFER_SIZE) {
Yogesh Pande 4:ae5178938864 206 res->set_operation(operation);
Yogesh Pande 4:ae5178938864 207 res->set_value((const uint8_t*)buffer, size);
Yogesh Pande 4:ae5178938864 208 }
Yogesh Pande 4:ae5178938864 209 free(buffer);
Christopher Haster 1:79b6cc67d8b4 210 }
Yogesh Pande 4:ae5178938864 211 res->set_register_uri(false);
Christopher Haster 1:79b6cc67d8b4 212 }
Christopher Haster 1:79b6cc67d8b4 213 }
Christopher Haster 1:79b6cc67d8b4 214 }
Christopher Haster 1:79b6cc67d8b4 215 return res;
Christopher Haster 1:79b6cc67d8b4 216 }
Christopher Haster 1:79b6cc67d8b4 217
Christopher Haster 1:79b6cc67d8b4 218 M2MResourceInstance* M2MDevice::create_resource_instance(DeviceResource resource, int64_t value,
Christopher Haster 1:79b6cc67d8b4 219 uint16_t instance_id)
Christopher Haster 1:79b6cc67d8b4 220 {
Christopher Haster 1:79b6cc67d8b4 221 M2MResourceInstance* res = NULL;
Christopher Haster 1:79b6cc67d8b4 222 String device_id = "";
Christopher Haster 1:79b6cc67d8b4 223 // For these resources multiple instance can exist
Christopher Haster 1:79b6cc67d8b4 224 if(AvailablePowerSources == resource) {
Christopher Haster 1:79b6cc67d8b4 225 if(check_value_range(resource, value)) {
Christopher Haster 1:79b6cc67d8b4 226 device_id = DEVICE_AVAILABLE_POWER_SOURCES;
Christopher Haster 1:79b6cc67d8b4 227 }
Christopher Haster 1:79b6cc67d8b4 228 } else if(PowerSourceVoltage == resource) {
Christopher Haster 1:79b6cc67d8b4 229 device_id = DEVICE_POWER_SOURCE_VOLTAGE;
Christopher Haster 1:79b6cc67d8b4 230 } else if(PowerSourceCurrent == resource) {
Christopher Haster 1:79b6cc67d8b4 231 device_id = DEVICE_POWER_SOURCE_CURRENT;
Christopher Haster 1:79b6cc67d8b4 232 } else if(ErrorCode == resource) {
Christopher Haster 1:79b6cc67d8b4 233 if(check_value_range(resource, value)) {
Christopher Haster 1:79b6cc67d8b4 234 device_id = DEVICE_ERROR_CODE;
Christopher Haster 1:79b6cc67d8b4 235 }
Christopher Haster 1:79b6cc67d8b4 236 }
Christopher Haster 1:79b6cc67d8b4 237
Christopher Haster 1:79b6cc67d8b4 238 if(!device_id.empty()) {
Christopher Haster 1:79b6cc67d8b4 239 if(_device_instance) {
Christopher Haster 1:79b6cc67d8b4 240 res = _device_instance->create_dynamic_resource_instance(device_id,OMA_RESOURCE_TYPE,
Christopher Haster 1:79b6cc67d8b4 241 M2MResourceInstance::INTEGER,
Yogesh Pande 4:ae5178938864 242 true, instance_id);
Christopher Haster 1:79b6cc67d8b4 243
Yogesh Pande 4:ae5178938864 244 M2MResource *resource = _device_instance->resource(device_id);
Yogesh Pande 4:ae5178938864 245 if(resource) {
Yogesh Pande 4:ae5178938864 246 resource->set_register_uri(false);
Yogesh Pande 4:ae5178938864 247 }
Christopher Haster 1:79b6cc67d8b4 248 if(res) {
Yogesh Pande 4:ae5178938864 249 char *buffer = (char*)malloc(BUFFER_SIZE);
Christopher Haster 1:79b6cc67d8b4 250 if(buffer) {
Yogesh Pande 4:ae5178938864 251 uint32_t size = m2m::itoa_c(value, buffer);
Yogesh Pande 4:ae5178938864 252 if (size <= BUFFER_SIZE) {
Yogesh Pande 4:ae5178938864 253 res->set_value((const uint8_t*)buffer, size);
Yogesh Pande 4:ae5178938864 254 // Only read operation is allowed for above resources
Yogesh Pande 4:ae5178938864 255 res->set_operation(M2MBase::GET_ALLOWED);
Yogesh Pande 4:ae5178938864 256 }
Yogesh Pande 4:ae5178938864 257 free(buffer);
Christopher Haster 1:79b6cc67d8b4 258 }
Yogesh Pande 4:ae5178938864 259 res->set_register_uri(false);
Christopher Haster 1:79b6cc67d8b4 260 }
Christopher Haster 1:79b6cc67d8b4 261 }
Christopher Haster 1:79b6cc67d8b4 262 }
Christopher Haster 1:79b6cc67d8b4 263 return res;
Christopher Haster 1:79b6cc67d8b4 264 }
Christopher Haster 1:79b6cc67d8b4 265 M2MResource* M2MDevice::create_resource(DeviceResource resource)
Christopher Haster 1:79b6cc67d8b4 266 {
Christopher Haster 1:79b6cc67d8b4 267 M2MResource* res = NULL;
Christopher Haster 1:79b6cc67d8b4 268 if(!is_resource_present(resource)) {
Christopher Haster 1:79b6cc67d8b4 269 String device_Id;
Christopher Haster 1:79b6cc67d8b4 270 if(FactoryReset == resource) {
Christopher Haster 1:79b6cc67d8b4 271 device_Id = DEVICE_FACTORY_RESET;
Christopher Haster 1:79b6cc67d8b4 272 } else if(ResetErrorCode == resource) {
Christopher Haster 1:79b6cc67d8b4 273 device_Id = DEVICE_RESET_ERROR_CODE;
Christopher Haster 1:79b6cc67d8b4 274 }
Christopher Haster 1:79b6cc67d8b4 275 if(_device_instance && !device_Id.empty()) {
Christopher Haster 1:79b6cc67d8b4 276 res = _device_instance->create_dynamic_resource(device_Id,
Christopher Haster 1:79b6cc67d8b4 277 OMA_RESOURCE_TYPE,
Christopher Haster 1:79b6cc67d8b4 278 M2MResourceInstance::OPAQUE,
Yogesh Pande 4:ae5178938864 279 true);
Yogesh Pande 4:ae5178938864 280 M2MResource *resource = _device_instance->resource(device_Id);
Yogesh Pande 4:ae5178938864 281 if(resource) {
Yogesh Pande 4:ae5178938864 282 resource->set_register_uri(false);
Yogesh Pande 4:ae5178938864 283 }
Christopher Haster 1:79b6cc67d8b4 284 if(res) {
Christopher Haster 1:79b6cc67d8b4 285 res->set_operation(M2MBase::POST_ALLOWED);
Yogesh Pande 4:ae5178938864 286 res->set_register_uri(false);
Christopher Haster 1:79b6cc67d8b4 287 }
Christopher Haster 1:79b6cc67d8b4 288 }
Christopher Haster 1:79b6cc67d8b4 289 }
Christopher Haster 1:79b6cc67d8b4 290 return res;
Christopher Haster 1:79b6cc67d8b4 291 }
Christopher Haster 1:79b6cc67d8b4 292
Christopher Haster 1:79b6cc67d8b4 293 bool M2MDevice::delete_resource(DeviceResource resource)
Christopher Haster 1:79b6cc67d8b4 294 {
Christopher Haster 1:79b6cc67d8b4 295 bool success = false;
Christopher Haster 1:79b6cc67d8b4 296 if(M2MDevice::Reboot != resource &&
Christopher Haster 1:79b6cc67d8b4 297 M2MDevice::ErrorCode != resource &&
Christopher Haster 1:79b6cc67d8b4 298 M2MDevice::SupportedBindingMode != resource) {
Christopher Haster 1:79b6cc67d8b4 299 if(_device_instance) {
Christopher Haster 1:79b6cc67d8b4 300 success = _device_instance->remove_resource(resource_name(resource));
Christopher Haster 1:79b6cc67d8b4 301 }
Christopher Haster 1:79b6cc67d8b4 302 }
Christopher Haster 1:79b6cc67d8b4 303 return success;
Christopher Haster 1:79b6cc67d8b4 304 }
Christopher Haster 1:79b6cc67d8b4 305
Christopher Haster 1:79b6cc67d8b4 306 bool M2MDevice::delete_resource_instance(DeviceResource resource,
Christopher Haster 1:79b6cc67d8b4 307 uint16_t instance_id)
Christopher Haster 1:79b6cc67d8b4 308 {
Christopher Haster 1:79b6cc67d8b4 309 bool success = false;
Christopher Haster 1:79b6cc67d8b4 310 if(M2MDevice::Reboot != resource &&
Christopher Haster 1:79b6cc67d8b4 311 M2MDevice::ErrorCode != resource &&
Christopher Haster 1:79b6cc67d8b4 312 M2MDevice::SupportedBindingMode != resource) {
Christopher Haster 1:79b6cc67d8b4 313 if(_device_instance) {
Christopher Haster 1:79b6cc67d8b4 314 success = _device_instance->remove_resource_instance(resource_name(resource),instance_id);
Christopher Haster 1:79b6cc67d8b4 315 }
Christopher Haster 1:79b6cc67d8b4 316 }
Christopher Haster 1:79b6cc67d8b4 317 return success;
Christopher Haster 1:79b6cc67d8b4 318 }
Christopher Haster 1:79b6cc67d8b4 319
Christopher Haster 1:79b6cc67d8b4 320 bool M2MDevice::set_resource_value(DeviceResource resource,
Christopher Haster 1:79b6cc67d8b4 321 const String &value,
Christopher Haster 1:79b6cc67d8b4 322 uint16_t instance_id)
Christopher Haster 1:79b6cc67d8b4 323 {
Christopher Haster 1:79b6cc67d8b4 324 bool success = false;
Christopher Haster 1:79b6cc67d8b4 325 M2MResourceInstance* res = get_resource_instance(resource,instance_id);
Christopher Haster 1:79b6cc67d8b4 326 if(res && value.size() <= MAX_ALLOWED_STRING_LENGTH) {
Christopher Haster 1:79b6cc67d8b4 327 if(M2MDevice::Manufacturer == resource ||
Christopher Haster 1:79b6cc67d8b4 328 M2MDevice::ModelNumber == resource ||
Christopher Haster 1:79b6cc67d8b4 329 M2MDevice::DeviceType == resource ||
Christopher Haster 1:79b6cc67d8b4 330 M2MDevice::SerialNumber == resource ||
Christopher Haster 1:79b6cc67d8b4 331 M2MDevice::HardwareVersion == resource ||
Christopher Haster 1:79b6cc67d8b4 332 M2MDevice::FirmwareVersion == resource ||
Christopher Haster 1:79b6cc67d8b4 333 M2MDevice::SoftwareVersion == resource ||
Christopher Haster 1:79b6cc67d8b4 334 M2MDevice::UTCOffset == resource ||
Christopher Haster 1:79b6cc67d8b4 335 M2MDevice::Timezone == resource) {
Christopher Haster 1:79b6cc67d8b4 336 if (value.empty()) {
Christopher Haster 1:79b6cc67d8b4 337 res->clear_value();
Christopher Haster 1:79b6cc67d8b4 338 success = true;
Christopher Haster 1:79b6cc67d8b4 339 } else {
Christopher Haster 1:79b6cc67d8b4 340 success = res->set_value((const uint8_t*)value.c_str(),(uint32_t)value.length());
Christopher Haster 1:79b6cc67d8b4 341 }
Christopher Haster 1:79b6cc67d8b4 342 }
Christopher Haster 1:79b6cc67d8b4 343 }
Christopher Haster 1:79b6cc67d8b4 344 return success;
Christopher Haster 1:79b6cc67d8b4 345 }
Christopher Haster 1:79b6cc67d8b4 346
Christopher Haster 1:79b6cc67d8b4 347 bool M2MDevice::set_resource_value(DeviceResource resource,
Christopher Haster 1:79b6cc67d8b4 348 int64_t value,
Christopher Haster 1:79b6cc67d8b4 349 uint16_t instance_id)
Christopher Haster 1:79b6cc67d8b4 350 {
Christopher Haster 1:79b6cc67d8b4 351 bool success = false;
Christopher Haster 1:79b6cc67d8b4 352 M2MResourceInstance* res = get_resource_instance(resource,instance_id);
Christopher Haster 1:79b6cc67d8b4 353 if(res) {
Christopher Haster 1:79b6cc67d8b4 354 if(M2MDevice::BatteryLevel == resource ||
Christopher Haster 1:79b6cc67d8b4 355 M2MDevice::BatteryStatus == resource ||
Christopher Haster 1:79b6cc67d8b4 356 M2MDevice::MemoryFree == resource ||
Christopher Haster 1:79b6cc67d8b4 357 M2MDevice::MemoryTotal == resource ||
Christopher Haster 1:79b6cc67d8b4 358 M2MDevice::ErrorCode == resource ||
Christopher Haster 1:79b6cc67d8b4 359 M2MDevice::CurrentTime == resource ||
Christopher Haster 1:79b6cc67d8b4 360 M2MDevice::AvailablePowerSources == resource ||
Christopher Haster 1:79b6cc67d8b4 361 M2MDevice::PowerSourceVoltage == resource ||
Christopher Haster 1:79b6cc67d8b4 362 M2MDevice::PowerSourceCurrent == resource) {
Christopher Haster 1:79b6cc67d8b4 363 // If it is any of the above resource
Christopher Haster 1:79b6cc67d8b4 364 // set the value of the resource.
Christopher Haster 1:79b6cc67d8b4 365 if (check_value_range(resource, value)) {
Yogesh Pande 4:ae5178938864 366 char *buffer = (char*)malloc(BUFFER_SIZE);
Christopher Haster 1:79b6cc67d8b4 367 if(buffer) {
Yogesh Pande 4:ae5178938864 368 uint32_t size = m2m::itoa_c(value, buffer);
Yogesh Pande 4:ae5178938864 369 if (size <= BUFFER_SIZE)
Yogesh Pande 4:ae5178938864 370 success = res->set_value((const uint8_t*)buffer, size);
Yogesh Pande 4:ae5178938864 371
Yogesh Pande 4:ae5178938864 372 free(buffer);
Christopher Haster 1:79b6cc67d8b4 373 }
Christopher Haster 1:79b6cc67d8b4 374 }
Christopher Haster 1:79b6cc67d8b4 375 }
Christopher Haster 1:79b6cc67d8b4 376 }
Christopher Haster 1:79b6cc67d8b4 377 return success;
Christopher Haster 1:79b6cc67d8b4 378 }
Christopher Haster 1:79b6cc67d8b4 379
Christopher Haster 1:79b6cc67d8b4 380 String M2MDevice::resource_value_string(DeviceResource resource,
Christopher Haster 1:79b6cc67d8b4 381 uint16_t instance_id) const
Christopher Haster 1:79b6cc67d8b4 382 {
Christopher Haster 1:79b6cc67d8b4 383 String value = "";
Christopher Haster 1:79b6cc67d8b4 384 M2MResourceInstance* res = get_resource_instance(resource,instance_id);
Christopher Haster 1:79b6cc67d8b4 385 if(res) {
Christopher Haster 1:79b6cc67d8b4 386 if(M2MDevice::Manufacturer == resource ||
Christopher Haster 1:79b6cc67d8b4 387 M2MDevice::ModelNumber == resource ||
Christopher Haster 1:79b6cc67d8b4 388 M2MDevice::DeviceType == resource ||
Christopher Haster 1:79b6cc67d8b4 389 M2MDevice::SerialNumber == resource ||
Christopher Haster 1:79b6cc67d8b4 390 M2MDevice::HardwareVersion == resource ||
Christopher Haster 1:79b6cc67d8b4 391 M2MDevice::FirmwareVersion == resource ||
Christopher Haster 1:79b6cc67d8b4 392 M2MDevice::SoftwareVersion == resource ||
Christopher Haster 1:79b6cc67d8b4 393 M2MDevice::UTCOffset == resource ||
Christopher Haster 1:79b6cc67d8b4 394 M2MDevice::Timezone == resource) {
Christopher Haster 1:79b6cc67d8b4 395
Christopher Haster 1:79b6cc67d8b4 396 uint8_t* buffer = NULL;
Christopher Haster 1:79b6cc67d8b4 397 uint32_t length = 0;
Christopher Haster 1:79b6cc67d8b4 398 res->get_value(buffer,length);
Christopher Haster 1:79b6cc67d8b4 399
Christopher Haster 1:79b6cc67d8b4 400 char *char_buffer = (char*)malloc(length+1);
Christopher Haster 1:79b6cc67d8b4 401 if(char_buffer) {
Christopher Haster 1:79b6cc67d8b4 402 memset(char_buffer,0,length+1);
Christopher Haster 1:79b6cc67d8b4 403 memcpy(char_buffer,(char*)buffer,length);
Christopher Haster 1:79b6cc67d8b4 404
Christopher Haster 1:79b6cc67d8b4 405 String s_name(char_buffer);
Christopher Haster 1:79b6cc67d8b4 406 value = s_name;
Christopher Haster 1:79b6cc67d8b4 407 if(char_buffer) {
Christopher Haster 1:79b6cc67d8b4 408 free(char_buffer);
Christopher Haster 1:79b6cc67d8b4 409 }
Christopher Haster 1:79b6cc67d8b4 410 }
Christopher Haster 1:79b6cc67d8b4 411 if(buffer) {
Christopher Haster 1:79b6cc67d8b4 412 free(buffer);
Christopher Haster 1:79b6cc67d8b4 413 }
Christopher Haster 1:79b6cc67d8b4 414 }
Christopher Haster 1:79b6cc67d8b4 415 }
Christopher Haster 1:79b6cc67d8b4 416 return value;
Christopher Haster 1:79b6cc67d8b4 417 }
Christopher Haster 1:79b6cc67d8b4 418
Christopher Haster 1:79b6cc67d8b4 419 int64_t M2MDevice::resource_value_int(DeviceResource resource,
Christopher Haster 1:79b6cc67d8b4 420 uint16_t instance_id) const
Christopher Haster 1:79b6cc67d8b4 421 {
Christopher Haster 1:79b6cc67d8b4 422 int64_t value = -1;
Christopher Haster 1:79b6cc67d8b4 423 M2MResourceInstance* res = get_resource_instance(resource,instance_id);
Christopher Haster 1:79b6cc67d8b4 424 if(res) {
Christopher Haster 1:79b6cc67d8b4 425 if(M2MDevice::BatteryLevel == resource ||
Christopher Haster 1:79b6cc67d8b4 426 M2MDevice::BatteryStatus == resource ||
Christopher Haster 1:79b6cc67d8b4 427 M2MDevice::MemoryFree == resource ||
Christopher Haster 1:79b6cc67d8b4 428 M2MDevice::MemoryTotal == resource ||
Christopher Haster 1:79b6cc67d8b4 429 M2MDevice::ErrorCode == resource ||
Christopher Haster 1:79b6cc67d8b4 430 M2MDevice::CurrentTime == resource ||
Christopher Haster 1:79b6cc67d8b4 431 M2MDevice::AvailablePowerSources == resource ||
Christopher Haster 1:79b6cc67d8b4 432 M2MDevice::PowerSourceVoltage == resource ||
Christopher Haster 1:79b6cc67d8b4 433 M2MDevice::PowerSourceCurrent == resource) {
Christopher Haster 1:79b6cc67d8b4 434 // Get the value and convert it into integer
Christopher Haster 1:79b6cc67d8b4 435 uint8_t* buffer = NULL;
Christopher Haster 1:79b6cc67d8b4 436 uint32_t length = 0;
Christopher Haster 1:79b6cc67d8b4 437 res->get_value(buffer,length);
Christopher Haster 1:79b6cc67d8b4 438 if(buffer) {
Christopher Haster 1:79b6cc67d8b4 439 value = atoi((const char*)buffer);
Christopher Haster 1:79b6cc67d8b4 440 free(buffer);
Christopher Haster 1:79b6cc67d8b4 441 }
Christopher Haster 1:79b6cc67d8b4 442 }
Christopher Haster 1:79b6cc67d8b4 443 }
Christopher Haster 1:79b6cc67d8b4 444 return value;
Christopher Haster 1:79b6cc67d8b4 445 }
Christopher Haster 1:79b6cc67d8b4 446
Christopher Haster 1:79b6cc67d8b4 447 bool M2MDevice::is_resource_present(DeviceResource resource) const
Christopher Haster 1:79b6cc67d8b4 448 {
Christopher Haster 1:79b6cc67d8b4 449 bool success = false;
Christopher Haster 1:79b6cc67d8b4 450 M2MResourceInstance* res = get_resource_instance(resource,0);
Christopher Haster 1:79b6cc67d8b4 451 if(res) {
Christopher Haster 1:79b6cc67d8b4 452 success = true;
Christopher Haster 1:79b6cc67d8b4 453 }
Christopher Haster 1:79b6cc67d8b4 454 return success;
Christopher Haster 1:79b6cc67d8b4 455 }
Christopher Haster 1:79b6cc67d8b4 456
Christopher Haster 1:79b6cc67d8b4 457 uint16_t M2MDevice::per_resource_count(DeviceResource res) const
Christopher Haster 1:79b6cc67d8b4 458 {
Christopher Haster 1:79b6cc67d8b4 459 uint16_t count = 0;
Christopher Haster 1:79b6cc67d8b4 460 if(_device_instance) {
Christopher Haster 1:79b6cc67d8b4 461 count = _device_instance->resource_count(resource_name(res));
Christopher Haster 1:79b6cc67d8b4 462 }
Christopher Haster 1:79b6cc67d8b4 463 return count;
Christopher Haster 1:79b6cc67d8b4 464 }
Christopher Haster 1:79b6cc67d8b4 465
Christopher Haster 1:79b6cc67d8b4 466 uint16_t M2MDevice::total_resource_count() const
Christopher Haster 1:79b6cc67d8b4 467 {
Christopher Haster 1:79b6cc67d8b4 468 uint16_t count = 0;
Christopher Haster 1:79b6cc67d8b4 469 if(_device_instance) {
Christopher Haster 1:79b6cc67d8b4 470 count = _device_instance->resources().size();
Christopher Haster 1:79b6cc67d8b4 471 }
Christopher Haster 1:79b6cc67d8b4 472 return count;
Christopher Haster 1:79b6cc67d8b4 473 }
Christopher Haster 1:79b6cc67d8b4 474
Christopher Haster 1:79b6cc67d8b4 475 M2MResourceInstance* M2MDevice::get_resource_instance(DeviceResource dev_res,
Christopher Haster 1:79b6cc67d8b4 476 uint16_t instance_id) const
Christopher Haster 1:79b6cc67d8b4 477 {
Christopher Haster 1:79b6cc67d8b4 478 M2MResource* res = NULL;
Christopher Haster 1:79b6cc67d8b4 479 M2MResourceInstance* inst = NULL;
Christopher Haster 1:79b6cc67d8b4 480 if(_device_instance) {
Christopher Haster 1:79b6cc67d8b4 481 res = _device_instance->resource(resource_name(dev_res));
Christopher Haster 1:79b6cc67d8b4 482 if(res) {
Christopher Haster 1:79b6cc67d8b4 483 if(res->supports_multiple_instances()) {
Christopher Haster 1:79b6cc67d8b4 484 inst = res->resource_instance(instance_id);
Christopher Haster 1:79b6cc67d8b4 485 } else {
Christopher Haster 1:79b6cc67d8b4 486 inst = res;
Christopher Haster 1:79b6cc67d8b4 487 }
Christopher Haster 1:79b6cc67d8b4 488 }
Christopher Haster 1:79b6cc67d8b4 489 }
Christopher Haster 1:79b6cc67d8b4 490 return inst;
Christopher Haster 1:79b6cc67d8b4 491 }
Christopher Haster 1:79b6cc67d8b4 492
Christopher Haster 1:79b6cc67d8b4 493 String M2MDevice::resource_name(DeviceResource resource) const
Christopher Haster 1:79b6cc67d8b4 494 {
Christopher Haster 1:79b6cc67d8b4 495 String res_name = "";
Christopher Haster 1:79b6cc67d8b4 496 switch(resource) {
Christopher Haster 1:79b6cc67d8b4 497 case Manufacturer:
Christopher Haster 1:79b6cc67d8b4 498 res_name = DEVICE_MANUFACTURER;
Christopher Haster 1:79b6cc67d8b4 499 break;
Christopher Haster 1:79b6cc67d8b4 500 case DeviceType:
Christopher Haster 1:79b6cc67d8b4 501 res_name = DEVICE_DEVICE_TYPE;
Christopher Haster 1:79b6cc67d8b4 502 break;
Christopher Haster 1:79b6cc67d8b4 503 case ModelNumber:
Christopher Haster 1:79b6cc67d8b4 504 res_name = DEVICE_MODEL_NUMBER;
Christopher Haster 1:79b6cc67d8b4 505 break;
Christopher Haster 1:79b6cc67d8b4 506 case SerialNumber:
Christopher Haster 1:79b6cc67d8b4 507 res_name = DEVICE_SERIAL_NUMBER;
Christopher Haster 1:79b6cc67d8b4 508 break;
Christopher Haster 1:79b6cc67d8b4 509 case HardwareVersion:
Christopher Haster 1:79b6cc67d8b4 510 res_name = DEVICE_HARDWARE_VERSION;
Christopher Haster 1:79b6cc67d8b4 511 break;
Christopher Haster 1:79b6cc67d8b4 512 case FirmwareVersion:
Christopher Haster 1:79b6cc67d8b4 513 res_name = DEVICE_FIRMWARE_VERSION;
Christopher Haster 1:79b6cc67d8b4 514 break;
Christopher Haster 1:79b6cc67d8b4 515 case SoftwareVersion:
Christopher Haster 1:79b6cc67d8b4 516 res_name = DEVICE_SOFTWARE_VERSION;
Christopher Haster 1:79b6cc67d8b4 517 break;
Christopher Haster 1:79b6cc67d8b4 518 case Reboot:
Christopher Haster 1:79b6cc67d8b4 519 res_name = DEVICE_REBOOT;
Christopher Haster 1:79b6cc67d8b4 520 break;
Christopher Haster 1:79b6cc67d8b4 521 case FactoryReset:
Christopher Haster 1:79b6cc67d8b4 522 res_name = DEVICE_FACTORY_RESET;
Christopher Haster 1:79b6cc67d8b4 523 break;
Christopher Haster 1:79b6cc67d8b4 524 case AvailablePowerSources:
Christopher Haster 1:79b6cc67d8b4 525 res_name = DEVICE_AVAILABLE_POWER_SOURCES;
Christopher Haster 1:79b6cc67d8b4 526 break;
Christopher Haster 1:79b6cc67d8b4 527 case PowerSourceVoltage:
Christopher Haster 1:79b6cc67d8b4 528 res_name = DEVICE_POWER_SOURCE_VOLTAGE;
Christopher Haster 1:79b6cc67d8b4 529 break;
Christopher Haster 1:79b6cc67d8b4 530 case PowerSourceCurrent:
Christopher Haster 1:79b6cc67d8b4 531 res_name = DEVICE_POWER_SOURCE_CURRENT;
Christopher Haster 1:79b6cc67d8b4 532 break;
Christopher Haster 1:79b6cc67d8b4 533 case BatteryLevel:
Christopher Haster 1:79b6cc67d8b4 534 res_name = DEVICE_BATTERY_LEVEL;
Christopher Haster 1:79b6cc67d8b4 535 break;
Christopher Haster 1:79b6cc67d8b4 536 case BatteryStatus:
Christopher Haster 1:79b6cc67d8b4 537 res_name = DEVICE_BATTERY_STATUS;
Christopher Haster 1:79b6cc67d8b4 538 break;
Christopher Haster 1:79b6cc67d8b4 539 case MemoryFree:
Christopher Haster 1:79b6cc67d8b4 540 res_name = DEVICE_MEMORY_FREE;
Christopher Haster 1:79b6cc67d8b4 541 break;
Christopher Haster 1:79b6cc67d8b4 542 case MemoryTotal:
Christopher Haster 1:79b6cc67d8b4 543 res_name = DEVICE_MEMORY_TOTAL;
Christopher Haster 1:79b6cc67d8b4 544 break;
Christopher Haster 1:79b6cc67d8b4 545 case ErrorCode:
Christopher Haster 1:79b6cc67d8b4 546 res_name = DEVICE_ERROR_CODE;
Christopher Haster 1:79b6cc67d8b4 547 break;
Christopher Haster 1:79b6cc67d8b4 548 case ResetErrorCode:
Christopher Haster 1:79b6cc67d8b4 549 res_name = DEVICE_RESET_ERROR_CODE;
Christopher Haster 1:79b6cc67d8b4 550 break;
Christopher Haster 1:79b6cc67d8b4 551 case CurrentTime:
Christopher Haster 1:79b6cc67d8b4 552 res_name = DEVICE_CURRENT_TIME;
Christopher Haster 1:79b6cc67d8b4 553 break;
Christopher Haster 1:79b6cc67d8b4 554 case UTCOffset:
Christopher Haster 1:79b6cc67d8b4 555 res_name = DEVICE_UTC_OFFSET;
Christopher Haster 1:79b6cc67d8b4 556 break;
Christopher Haster 1:79b6cc67d8b4 557 case Timezone:
Christopher Haster 1:79b6cc67d8b4 558 res_name = DEVICE_TIMEZONE;
Christopher Haster 1:79b6cc67d8b4 559 break;
Christopher Haster 1:79b6cc67d8b4 560 case SupportedBindingMode:
Christopher Haster 1:79b6cc67d8b4 561 res_name = DEVICE_SUPPORTED_BINDING_MODE;
Christopher Haster 1:79b6cc67d8b4 562 break;
Christopher Haster 1:79b6cc67d8b4 563 }
Christopher Haster 1:79b6cc67d8b4 564 return res_name;
Christopher Haster 1:79b6cc67d8b4 565 }
Christopher Haster 1:79b6cc67d8b4 566
Christopher Haster 1:79b6cc67d8b4 567 bool M2MDevice::check_value_range(DeviceResource resource, int64_t value) const
Christopher Haster 1:79b6cc67d8b4 568 {
Christopher Haster 1:79b6cc67d8b4 569 bool success = false;
Christopher Haster 1:79b6cc67d8b4 570 switch (resource) {
Christopher Haster 1:79b6cc67d8b4 571 case AvailablePowerSources:
Christopher Haster 1:79b6cc67d8b4 572 if(value >= 0 && value <= 7) {
Christopher Haster 1:79b6cc67d8b4 573 success = true;
Christopher Haster 1:79b6cc67d8b4 574 }
Christopher Haster 1:79b6cc67d8b4 575 break;
Christopher Haster 1:79b6cc67d8b4 576 case BatteryLevel:
Christopher Haster 1:79b6cc67d8b4 577 if (value >= 0 && value <= 100) {
Christopher Haster 1:79b6cc67d8b4 578 success = true;
Christopher Haster 1:79b6cc67d8b4 579 }
Christopher Haster 1:79b6cc67d8b4 580 break;
Christopher Haster 1:79b6cc67d8b4 581 case BatteryStatus:
Christopher Haster 1:79b6cc67d8b4 582 if (value >= 0 && value <= 6) {
Christopher Haster 1:79b6cc67d8b4 583 success = true;
Christopher Haster 1:79b6cc67d8b4 584 }
Christopher Haster 1:79b6cc67d8b4 585 break;
Christopher Haster 1:79b6cc67d8b4 586 case ErrorCode:
Christopher Haster 1:79b6cc67d8b4 587 if (value >= 0 && value <= 8) {
Christopher Haster 1:79b6cc67d8b4 588 success = true;
Christopher Haster 1:79b6cc67d8b4 589 }
Christopher Haster 1:79b6cc67d8b4 590 break;
Christopher Haster 1:79b6cc67d8b4 591 default:
Christopher Haster 1:79b6cc67d8b4 592 success = true;
Christopher Haster 1:79b6cc67d8b4 593 break;
Christopher Haster 1:79b6cc67d8b4 594 }
Christopher Haster 1:79b6cc67d8b4 595 return success;
Christopher Haster 1:79b6cc67d8b4 596 }
Yogesh Pande 4:ae5178938864 597