Ram Gandikota
/
metronome
FRDM K64F Metronome
mbed-client/source/m2mblockmessage.cpp
- Committer:
- ram54288
- Date:
- 2017-05-14
- Revision:
- 0:a2cb7295a1f7
File content as of revision 0:a2cb7295a1f7:
/* * Copyright (c) 2015 ARM Limited. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * Licensed under the Apache License, Version 2.0 (the License); you may * not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an AS IS BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mbed-client/m2mblockmessage.h" #include "mbed-client/m2mconfig.h" #include <stdlib.h> #include <string.h> M2MBlockMessage::M2MBlockMessage() : _block_data_ptr(NULL), _total_message_size(0), _block_data_len(0), _block_number(0), _error_code(M2MBlockMessage::ErrorNone), _is_last_block(false), _is_block_message(false) { } M2MBlockMessage::~M2MBlockMessage() { free(_block_data_ptr); _block_data_ptr = NULL; } void M2MBlockMessage::set_message_info(sn_coap_hdr_s *coap_header) { _is_block_message = (coap_header && coap_header->options_list_ptr && coap_header->options_list_ptr->block1 != -1) ? true : false; if (coap_header && coap_header->options_list_ptr) { // Check total size if (coap_header->options_list_ptr->use_size1) { _total_message_size = coap_header->options_list_ptr->size1; } // Default value in coap library is 65kb uint32_t max_size = SN_COAP_MAX_INCOMING_MESSAGE_SIZE; if (_total_message_size > max_size) { _error_code = M2MBlockMessage::EntityTooLarge; } else { _error_code = M2MBlockMessage::ErrorNone; } if (M2MBlockMessage::ErrorNone == _error_code) { // Is last block if (coap_header->options_list_ptr->block1 != -1) { // if (!(*(coap_header->options_list_ptr->block1_ptr + (coap_header->options_list_ptr->block1_len - 1)) & 0x08)) { if (!((coap_header->options_list_ptr->block1) & 0x08)) { _is_last_block = true; } else { _is_last_block = false; } } _block_number = coap_header->options_list_ptr->block1 >> 4; // Block number // if (coap_header->options_list_ptr->block1_len == 3) { // _block_number = *(coap_header->options_list_ptr->block1_ptr) << 12; // _block_number |= *(coap_header->options_list_ptr->block1_ptr + 1) << 4; // _block_number |= (*(coap_header->options_list_ptr->block1_ptr + 2)) >> 4; // } // else if (coap_header->options_list_ptr->block1_len == 2) { // _block_number = *(coap_header->options_list_ptr->block1_ptr) << 4; // _block_number |= (*(coap_header->options_list_ptr->block1_ptr + 1)) >> 4; // } // else if (coap_header->options_list_ptr->block1_len == 1) { // _block_number = (*coap_header->options_list_ptr->block1_ptr) >> 4; // } // else { // _block_number = 0; // } // Payload free(_block_data_ptr); _block_data_ptr = NULL; _block_data_len = coap_header->payload_len; if(_block_data_len > 0) { _block_data_ptr = (uint8_t *)malloc(_block_data_len); if (_block_data_ptr) { memcpy(_block_data_ptr, coap_header->payload_ptr, _block_data_len); } } } } } void M2MBlockMessage::clear_values() { free(_block_data_ptr); _block_data_ptr = NULL; _block_data_len = 0; _block_number = 0; _total_message_size = 0; _is_last_block = false; _error_code = M2MBlockMessage::ErrorNone; } bool M2MBlockMessage::is_block_message() const { return _is_block_message; } uint16_t M2MBlockMessage::block_number() const { return _block_number; } uint32_t M2MBlockMessage::total_message_size() const { return _total_message_size; } bool M2MBlockMessage::is_last_block() const { return _is_last_block; } uint8_t* M2MBlockMessage::block_data() const { return _block_data_ptr; } uint32_t M2MBlockMessage::block_data_len() const { return _block_data_len; } M2MBlockMessage::Error M2MBlockMessage::error_code() const { return _error_code; }