Donald Meyers / Mbed OS evan
Committer:
djmeyers
Date:
Sat Mar 18 22:37:16 2017 +0000
Revision:
0:06ee5f8a484a
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
djmeyers 0:06ee5f8a484a 1 /*
djmeyers 0:06ee5f8a484a 2 * Copyright (c) 2015 ARM Limited. All rights reserved.
djmeyers 0:06ee5f8a484a 3 * SPDX-License-Identifier: Apache-2.0
djmeyers 0:06ee5f8a484a 4 * Licensed under the Apache License, Version 2.0 (the License); you may
djmeyers 0:06ee5f8a484a 5 * not use this file except in compliance with the License.
djmeyers 0:06ee5f8a484a 6 * You may obtain a copy of the License at
djmeyers 0:06ee5f8a484a 7 *
djmeyers 0:06ee5f8a484a 8 * http://www.apache.org/licenses/LICENSE-2.0
djmeyers 0:06ee5f8a484a 9 *
djmeyers 0:06ee5f8a484a 10 * Unless required by applicable law or agreed to in writing, software
djmeyers 0:06ee5f8a484a 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
djmeyers 0:06ee5f8a484a 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
djmeyers 0:06ee5f8a484a 13 * See the License for the specific language governing permissions and
djmeyers 0:06ee5f8a484a 14 * limitations under the License.
djmeyers 0:06ee5f8a484a 15 */
djmeyers 0:06ee5f8a484a 16 #include "mbed-client/m2mblockmessage.h"
djmeyers 0:06ee5f8a484a 17 #include "mbed-client/m2mconfig.h"
djmeyers 0:06ee5f8a484a 18 #include <stdlib.h>
djmeyers 0:06ee5f8a484a 19 #include <string.h>
djmeyers 0:06ee5f8a484a 20
djmeyers 0:06ee5f8a484a 21 M2MBlockMessage::M2MBlockMessage() :
djmeyers 0:06ee5f8a484a 22 _block_data_ptr(NULL),
djmeyers 0:06ee5f8a484a 23 _total_message_size(0),
djmeyers 0:06ee5f8a484a 24 _block_data_len(0),
djmeyers 0:06ee5f8a484a 25 _block_number(0),
djmeyers 0:06ee5f8a484a 26 _error_code(M2MBlockMessage::ErrorNone),
djmeyers 0:06ee5f8a484a 27 _is_last_block(false),
djmeyers 0:06ee5f8a484a 28 _is_block_message(false)
djmeyers 0:06ee5f8a484a 29 {
djmeyers 0:06ee5f8a484a 30 }
djmeyers 0:06ee5f8a484a 31
djmeyers 0:06ee5f8a484a 32 M2MBlockMessage::~M2MBlockMessage()
djmeyers 0:06ee5f8a484a 33 {
djmeyers 0:06ee5f8a484a 34 free(_block_data_ptr);
djmeyers 0:06ee5f8a484a 35 _block_data_ptr = NULL;
djmeyers 0:06ee5f8a484a 36 }
djmeyers 0:06ee5f8a484a 37
djmeyers 0:06ee5f8a484a 38 void M2MBlockMessage::set_message_info(sn_coap_hdr_s *coap_header)
djmeyers 0:06ee5f8a484a 39 {
djmeyers 0:06ee5f8a484a 40 _is_block_message = (coap_header &&
djmeyers 0:06ee5f8a484a 41 coap_header->options_list_ptr &&
djmeyers 0:06ee5f8a484a 42 coap_header->options_list_ptr->block1 != -1) ? true : false;
djmeyers 0:06ee5f8a484a 43
djmeyers 0:06ee5f8a484a 44 if (coap_header && coap_header->options_list_ptr) {
djmeyers 0:06ee5f8a484a 45 // Check total size
djmeyers 0:06ee5f8a484a 46 if (coap_header->options_list_ptr->use_size1) {
djmeyers 0:06ee5f8a484a 47 _total_message_size = coap_header->options_list_ptr->size1;
djmeyers 0:06ee5f8a484a 48 }
djmeyers 0:06ee5f8a484a 49
djmeyers 0:06ee5f8a484a 50 // Default value in coap library is 65kb
djmeyers 0:06ee5f8a484a 51 uint32_t max_size = SN_COAP_MAX_INCOMING_MESSAGE_SIZE;
djmeyers 0:06ee5f8a484a 52 if (_total_message_size > max_size) {
djmeyers 0:06ee5f8a484a 53 _error_code = M2MBlockMessage::EntityTooLarge;
djmeyers 0:06ee5f8a484a 54 } else {
djmeyers 0:06ee5f8a484a 55 _error_code = M2MBlockMessage::ErrorNone;
djmeyers 0:06ee5f8a484a 56 }
djmeyers 0:06ee5f8a484a 57 if (M2MBlockMessage::ErrorNone == _error_code) {
djmeyers 0:06ee5f8a484a 58 // Is last block
djmeyers 0:06ee5f8a484a 59 if (coap_header->options_list_ptr->block1 != -1) {
djmeyers 0:06ee5f8a484a 60 // if (!(*(coap_header->options_list_ptr->block1_ptr + (coap_header->options_list_ptr->block1_len - 1)) & 0x08)) {
djmeyers 0:06ee5f8a484a 61 if (!((coap_header->options_list_ptr->block1) & 0x08)) {
djmeyers 0:06ee5f8a484a 62 _is_last_block = true;
djmeyers 0:06ee5f8a484a 63 } else {
djmeyers 0:06ee5f8a484a 64 _is_last_block = false;
djmeyers 0:06ee5f8a484a 65 }
djmeyers 0:06ee5f8a484a 66 }
djmeyers 0:06ee5f8a484a 67
djmeyers 0:06ee5f8a484a 68 _block_number = coap_header->options_list_ptr->block1 >> 4;
djmeyers 0:06ee5f8a484a 69 // Block number
djmeyers 0:06ee5f8a484a 70 // if (coap_header->options_list_ptr->block1_len == 3) {
djmeyers 0:06ee5f8a484a 71 // _block_number = *(coap_header->options_list_ptr->block1_ptr) << 12;
djmeyers 0:06ee5f8a484a 72 // _block_number |= *(coap_header->options_list_ptr->block1_ptr + 1) << 4;
djmeyers 0:06ee5f8a484a 73 // _block_number |= (*(coap_header->options_list_ptr->block1_ptr + 2)) >> 4;
djmeyers 0:06ee5f8a484a 74 // }
djmeyers 0:06ee5f8a484a 75
djmeyers 0:06ee5f8a484a 76 // else if (coap_header->options_list_ptr->block1_len == 2) {
djmeyers 0:06ee5f8a484a 77 // _block_number = *(coap_header->options_list_ptr->block1_ptr) << 4;
djmeyers 0:06ee5f8a484a 78 // _block_number |= (*(coap_header->options_list_ptr->block1_ptr + 1)) >> 4;
djmeyers 0:06ee5f8a484a 79 // }
djmeyers 0:06ee5f8a484a 80 // else if (coap_header->options_list_ptr->block1_len == 1) {
djmeyers 0:06ee5f8a484a 81 // _block_number = (*coap_header->options_list_ptr->block1_ptr) >> 4;
djmeyers 0:06ee5f8a484a 82 // }
djmeyers 0:06ee5f8a484a 83 // else {
djmeyers 0:06ee5f8a484a 84 // _block_number = 0;
djmeyers 0:06ee5f8a484a 85 // }
djmeyers 0:06ee5f8a484a 86
djmeyers 0:06ee5f8a484a 87 // Payload
djmeyers 0:06ee5f8a484a 88 free(_block_data_ptr);
djmeyers 0:06ee5f8a484a 89 _block_data_ptr = NULL;
djmeyers 0:06ee5f8a484a 90 _block_data_len = coap_header->payload_len;
djmeyers 0:06ee5f8a484a 91 if(_block_data_len > 0) {
djmeyers 0:06ee5f8a484a 92 _block_data_ptr = (uint8_t *)malloc(_block_data_len);
djmeyers 0:06ee5f8a484a 93 if (_block_data_ptr) {
djmeyers 0:06ee5f8a484a 94 memcpy(_block_data_ptr, coap_header->payload_ptr, _block_data_len);
djmeyers 0:06ee5f8a484a 95 }
djmeyers 0:06ee5f8a484a 96 }
djmeyers 0:06ee5f8a484a 97 }
djmeyers 0:06ee5f8a484a 98 }
djmeyers 0:06ee5f8a484a 99 }
djmeyers 0:06ee5f8a484a 100
djmeyers 0:06ee5f8a484a 101 void M2MBlockMessage::clear_values()
djmeyers 0:06ee5f8a484a 102 {
djmeyers 0:06ee5f8a484a 103 free(_block_data_ptr);
djmeyers 0:06ee5f8a484a 104 _block_data_ptr = NULL;
djmeyers 0:06ee5f8a484a 105 _block_data_len = 0;
djmeyers 0:06ee5f8a484a 106 _block_number = 0;
djmeyers 0:06ee5f8a484a 107 _total_message_size = 0;
djmeyers 0:06ee5f8a484a 108 _is_last_block = false;
djmeyers 0:06ee5f8a484a 109 _error_code = M2MBlockMessage::ErrorNone;
djmeyers 0:06ee5f8a484a 110 }
djmeyers 0:06ee5f8a484a 111
djmeyers 0:06ee5f8a484a 112 bool M2MBlockMessage::is_block_message() const
djmeyers 0:06ee5f8a484a 113 {
djmeyers 0:06ee5f8a484a 114 return _is_block_message;
djmeyers 0:06ee5f8a484a 115 }
djmeyers 0:06ee5f8a484a 116
djmeyers 0:06ee5f8a484a 117 uint16_t M2MBlockMessage::block_number() const
djmeyers 0:06ee5f8a484a 118 {
djmeyers 0:06ee5f8a484a 119 return _block_number;
djmeyers 0:06ee5f8a484a 120 }
djmeyers 0:06ee5f8a484a 121
djmeyers 0:06ee5f8a484a 122 uint32_t M2MBlockMessage::total_message_size() const
djmeyers 0:06ee5f8a484a 123 {
djmeyers 0:06ee5f8a484a 124 return _total_message_size;
djmeyers 0:06ee5f8a484a 125 }
djmeyers 0:06ee5f8a484a 126
djmeyers 0:06ee5f8a484a 127 bool M2MBlockMessage::is_last_block() const
djmeyers 0:06ee5f8a484a 128 {
djmeyers 0:06ee5f8a484a 129 return _is_last_block;
djmeyers 0:06ee5f8a484a 130 }
djmeyers 0:06ee5f8a484a 131
djmeyers 0:06ee5f8a484a 132 uint8_t* M2MBlockMessage::block_data() const
djmeyers 0:06ee5f8a484a 133 {
djmeyers 0:06ee5f8a484a 134 return _block_data_ptr;
djmeyers 0:06ee5f8a484a 135 }
djmeyers 0:06ee5f8a484a 136
djmeyers 0:06ee5f8a484a 137 uint32_t M2MBlockMessage::block_data_len() const
djmeyers 0:06ee5f8a484a 138 {
djmeyers 0:06ee5f8a484a 139 return _block_data_len;
djmeyers 0:06ee5f8a484a 140 }
djmeyers 0:06ee5f8a484a 141
djmeyers 0:06ee5f8a484a 142 M2MBlockMessage::Error M2MBlockMessage::error_code() const
djmeyers 0:06ee5f8a484a 143 {
djmeyers 0:06ee5f8a484a 144 return _error_code;
djmeyers 0:06ee5f8a484a 145 }