Toyomasa Watarai / simple-mbed-cloud-client

Dependents:  

Committer:
MACRUM
Date:
Mon Jul 02 06:30:39 2018 +0000
Revision:
0:276e7a263c35
Initial commit

Who changed what in which revision?

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