Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: mbed-cloud-client/mbed-client/source/m2mblockmessage.cpp
- Revision:
- 0:276e7a263c35
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-cloud-client/mbed-client/source/m2mblockmessage.cpp Mon Jul 02 06:30:39 2018 +0000
@@ -0,0 +1,145 @@
+/*
+ * 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;
+}