1 /*
2  * Copyright 2016 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #include "include/core/SkData.h"
9 #include "include/core/SkStream.h"
10 
11 #ifndef FakeStreams_DEFINED
12 #define FakeStreams_DEFINED
13 
14 // Stream that is not an asset stream (!hasPosition() or !hasLength())
15 class NotAssetMemStream : public SkStream {
16 public:
NotAssetMemStream(sk_sp<SkData> data)17     NotAssetMemStream(sk_sp<SkData> data) : fStream(std::move(data)) {}
18 
hasPosition()19     bool hasPosition() const override {
20         return false;
21     }
22 
hasLength()23     bool hasLength() const override {
24         return false;
25     }
26 
peek(void * buf,size_t bytes)27     size_t peek(void* buf, size_t bytes) const override {
28         return fStream.peek(buf, bytes);
29     }
read(void * buf,size_t bytes)30     size_t read(void* buf, size_t bytes) override {
31         return fStream.read(buf, bytes);
32     }
rewind()33     bool rewind() override {
34         return fStream.rewind();
35     }
isAtEnd()36     bool isAtEnd() const override {
37         return fStream.isAtEnd();
38     }
39 private:
40     SkMemoryStream fStream;
41 };
42 
43 /*
44  *  Represents a stream without all of its data.
45  */
46 class HaltingStream : public SkStream {
47 public:
HaltingStream(sk_sp<SkData> data,size_t initialLimit)48     HaltingStream(sk_sp<SkData> data, size_t initialLimit)
49         : fTotalSize(data->size())
50         , fLimit(initialLimit)
51         , fStream(std::move(data))
52     {}
53 
addNewData(size_t extra)54     void addNewData(size_t extra) {
55         fLimit = std::min(fTotalSize, fLimit + extra);
56     }
57 
read(void * buffer,size_t size)58     size_t read(void* buffer, size_t size) override {
59         if (fStream.getPosition() + size > fLimit) {
60             size = fLimit - fStream.getPosition();
61         }
62 
63         return fStream.read(buffer, size);
64     }
65 
isAtEnd()66     bool isAtEnd() const override {
67         return fStream.isAtEnd();
68     }
69 
hasLength()70     bool hasLength() const override { return true; }
getLength()71     size_t getLength() const override { return fLimit; }
72 
hasPosition()73     bool hasPosition() const override { return true; }
getPosition()74     size_t getPosition() const override { return fStream.getPosition(); }
rewind()75     bool rewind() override { return fStream.rewind(); }
move(long offset)76     bool move(long offset) override { return fStream.move(offset); }
seek(size_t position)77     bool seek(size_t position) override { return fStream.seek(position); }
78 
isAllDataReceived()79     bool isAllDataReceived() const { return fLimit == fTotalSize; }
80 
81 private:
82     const size_t    fTotalSize;
83     size_t          fLimit;
84     SkMemoryStream  fStream;
85 };
86 #endif // FakeStreams_DEFINED
87