summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/qtserialbluetooth.cpp25
1 files changed, 20 insertions, 5 deletions
diff --git a/core/qtserialbluetooth.cpp b/core/qtserialbluetooth.cpp
index 8b5779ce5..3a031e1ae 100644
--- a/core/qtserialbluetooth.cpp
+++ b/core/qtserialbluetooth.cpp
@@ -126,19 +126,34 @@ static dc_status_t ble_serial_read(dc_custom_io_t *io, void* data, size_t size,
{
Q_UNUSED(io)
size_t len;
+ size_t received = 0;
if (buffer.in_pos >= buffer.in_bytes) {
+ ble_serial_flush_write();
+ }
+
+ /* There is still unused/unread data in the input steam.
+ * So preseve it at the start of a new read.
+ */
+ if (buffer.in_pos > 0) {
+ len = buffer.in_bytes - buffer.in_pos;
+ memcpy(buffer.in, buffer.in + buffer.in_pos, len);
+ buffer.in_pos = 0;
+ buffer.in_bytes = len;
+ }
+
+ /* Read a long as requested in the size parameter */
+ while ((buffer.in_bytes - buffer.in_pos) < size) {
dc_status_t rc;
- size_t received;
- ble_serial_flush_write();
- rc = ble_serial_ops.packet_read(&ble_serial_ops, buffer.in, sizeof(buffer.in), &received);
+ rc = ble_serial_ops.packet_read(&ble_serial_ops, buffer.in + buffer.in_bytes,
+ sizeof(buffer.in) - buffer.in_bytes, &received);
if (rc != DC_STATUS_SUCCESS)
return rc;
if (!received)
return DC_STATUS_IO;
- buffer.in_pos = 0;
- buffer.in_bytes = received;
+
+ buffer.in_bytes += received;
}
len = buffer.in_bytes - buffer.in_pos;