Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/flipperzero-firmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/toolbox/stream/stream_cache.c')
-rw-r--r--lib/toolbox/stream/stream_cache.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/lib/toolbox/stream/stream_cache.c b/lib/toolbox/stream/stream_cache.c
index 164ac466..f5e147df 100644
--- a/lib/toolbox/stream/stream_cache.c
+++ b/lib/toolbox/stream/stream_cache.c
@@ -46,6 +46,14 @@ size_t stream_cache_fill(StreamCache* cache, Stream* stream) {
return size_read;
}
+bool stream_cache_flush(StreamCache* cache, Stream* stream) {
+ const size_t size_written = stream_write(stream, cache->data, cache->data_size);
+ const bool success = (size_written == cache->data_size);
+ cache->data_size = 0;
+ cache->position = 0;
+ return success;
+}
+
size_t stream_cache_read(StreamCache* cache, uint8_t* data, size_t size) {
furi_assert(cache->data_size >= cache->position);
const size_t size_read = MIN(size, cache->data_size - cache->position);
@@ -56,6 +64,19 @@ size_t stream_cache_read(StreamCache* cache, uint8_t* data, size_t size) {
return size_read;
}
+size_t stream_cache_write(StreamCache* cache, const uint8_t* data, size_t size) {
+ furi_assert(cache->data_size >= cache->position);
+ const size_t size_written = MIN(size, STREAM_CACHE_MAX_SIZE - cache->position);
+ if(size_written > 0) {
+ memcpy(cache->data + cache->position, data, size_written);
+ cache->position += size_written;
+ if(cache->position > cache->data_size) {
+ cache->data_size = cache->position;
+ }
+ }
+ return size_written;
+}
+
int32_t stream_cache_seek(StreamCache* cache, int32_t offset) {
furi_assert(cache->data_size >= cache->position);
int32_t actual_offset = 0;
@@ -63,7 +84,7 @@ int32_t stream_cache_seek(StreamCache* cache, int32_t offset) {
if(offset > 0) {
actual_offset = MIN(cache->data_size - cache->position, (size_t)offset);
} else if(offset < 0) {
- actual_offset = -MIN(cache->position, (size_t)abs(offset));
+ actual_offset = MAX(-((int32_t)cache->position), offset);
}
cache->position += actual_offset;