1fb299fa2Sopenharmony_ci/*
2fb299fa2Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
3fb299fa2Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fb299fa2Sopenharmony_ci * you may not use this file except in compliance with the License.
5fb299fa2Sopenharmony_ci * You may obtain a copy of the License at
6fb299fa2Sopenharmony_ci *
7fb299fa2Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8fb299fa2Sopenharmony_ci *
9fb299fa2Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fb299fa2Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fb299fa2Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fb299fa2Sopenharmony_ci * See the License for the specific language governing permissions and
13fb299fa2Sopenharmony_ci * limitations under the License.
14fb299fa2Sopenharmony_ci */
15fb299fa2Sopenharmony_ci#ifndef PKG_STREAM_H
16fb299fa2Sopenharmony_ci#define PKG_STREAM_H
17fb299fa2Sopenharmony_ci#ifndef __WIN32
18fb299fa2Sopenharmony_ci#include <sys/mman.h>
19fb299fa2Sopenharmony_ci#endif
20fb299fa2Sopenharmony_ci#include <atomic>
21fb299fa2Sopenharmony_ci#include "pkg_manager.h"
22fb299fa2Sopenharmony_ci#include "pkg_utils.h"
23fb299fa2Sopenharmony_ci#include "ring_buffer/ring_buffer.h"
24fb299fa2Sopenharmony_ci
25fb299fa2Sopenharmony_cinamespace Hpackage {
26fb299fa2Sopenharmony_ciclass PkgStreamImpl : public PkgStream {
27fb299fa2Sopenharmony_cipublic:
28fb299fa2Sopenharmony_ci    explicit PkgStreamImpl(PkgManager::PkgManagerPtr pkgManager, const std::string fileName)
29fb299fa2Sopenharmony_ci        : fileName_(fileName), refCount_(0), pkgManager_(pkgManager) {}
30fb299fa2Sopenharmony_ci
31fb299fa2Sopenharmony_ci    virtual ~PkgStreamImpl() {}
32fb299fa2Sopenharmony_ci
33fb299fa2Sopenharmony_ci    int32_t Read(PkgBuffer &data, size_t start, size_t needRead, size_t &readLen) override
34fb299fa2Sopenharmony_ci    {
35fb299fa2Sopenharmony_ci        UNUSED(data);
36fb299fa2Sopenharmony_ci        UNUSED(start);
37fb299fa2Sopenharmony_ci        UNUSED(readLen);
38fb299fa2Sopenharmony_ci        UNUSED(needRead);
39fb299fa2Sopenharmony_ci        return PKG_SUCCESS;
40fb299fa2Sopenharmony_ci    }
41fb299fa2Sopenharmony_ci
42fb299fa2Sopenharmony_ci    int32_t GetBuffer(PkgBuffer &buffer) const override
43fb299fa2Sopenharmony_ci    {
44fb299fa2Sopenharmony_ci        buffer.length = 0;
45fb299fa2Sopenharmony_ci        buffer.buffer = nullptr;
46fb299fa2Sopenharmony_ci        return PKG_SUCCESS;
47fb299fa2Sopenharmony_ci    }
48fb299fa2Sopenharmony_ci
49fb299fa2Sopenharmony_ci    int32_t Write(const PkgBuffer &data, size_t size, size_t start) override
50fb299fa2Sopenharmony_ci    {
51fb299fa2Sopenharmony_ci        UNUSED(data);
52fb299fa2Sopenharmony_ci        UNUSED(size);
53fb299fa2Sopenharmony_ci        UNUSED(start);
54fb299fa2Sopenharmony_ci        return PKG_SUCCESS;
55fb299fa2Sopenharmony_ci    }
56fb299fa2Sopenharmony_ci
57fb299fa2Sopenharmony_ci    virtual int32_t Seek(long int offset, int whence) = 0;
58fb299fa2Sopenharmony_ci
59fb299fa2Sopenharmony_ci    int32_t Flush(size_t size) override
60fb299fa2Sopenharmony_ci    {
61fb299fa2Sopenharmony_ci        UNUSED(size);
62fb299fa2Sopenharmony_ci        return PKG_SUCCESS;
63fb299fa2Sopenharmony_ci    }
64fb299fa2Sopenharmony_ci
65fb299fa2Sopenharmony_ci    const std::string GetFileName() const override;
66fb299fa2Sopenharmony_ci
67fb299fa2Sopenharmony_ci    int32_t GetStreamType() const override
68fb299fa2Sopenharmony_ci    {
69fb299fa2Sopenharmony_ci        return PkgStreamType_Read;
70fb299fa2Sopenharmony_ci    };
71fb299fa2Sopenharmony_ci
72fb299fa2Sopenharmony_ci    void AddRef() override;
73fb299fa2Sopenharmony_ci
74fb299fa2Sopenharmony_ci    void DelRef() override;
75fb299fa2Sopenharmony_ci
76fb299fa2Sopenharmony_ci    bool IsRef() const override;
77fb299fa2Sopenharmony_ci
78fb299fa2Sopenharmony_ci    static PkgStreamPtr ConvertPkgStream(PkgManager::StreamPtr stream);
79fb299fa2Sopenharmony_ci
80fb299fa2Sopenharmony_ciprotected:
81fb299fa2Sopenharmony_ci    void PostDecodeProgress(int type, size_t writeDataLen, const void *context) const;
82fb299fa2Sopenharmony_ci    std::string fileName_;
83fb299fa2Sopenharmony_ci
84fb299fa2Sopenharmony_ciprivate:
85fb299fa2Sopenharmony_ci    std::atomic_int refCount_;
86fb299fa2Sopenharmony_ci    PkgManager::PkgManagerPtr pkgManager_ = nullptr;
87fb299fa2Sopenharmony_ci};
88fb299fa2Sopenharmony_ci
89fb299fa2Sopenharmony_ciclass FileStream : public PkgStreamImpl {
90fb299fa2Sopenharmony_cipublic:
91fb299fa2Sopenharmony_ci    FileStream(PkgManager::PkgManagerPtr pkgManager, const std::string fileName, FILE *stream, int32_t streamType)
92fb299fa2Sopenharmony_ci        : PkgStreamImpl(pkgManager, fileName), stream_(stream), fileLength_(0), streamType_(streamType) {}
93fb299fa2Sopenharmony_ci
94fb299fa2Sopenharmony_ci    ~FileStream() override;
95fb299fa2Sopenharmony_ci
96fb299fa2Sopenharmony_ci    int32_t Read(PkgBuffer &data, size_t start, size_t needRead, size_t &readLen) override;
97fb299fa2Sopenharmony_ci
98fb299fa2Sopenharmony_ci    int32_t Write(const PkgBuffer &data, size_t size, size_t start) override;
99fb299fa2Sopenharmony_ci
100fb299fa2Sopenharmony_ci    int32_t Seek(long int offset, int whence) override;
101fb299fa2Sopenharmony_ci
102fb299fa2Sopenharmony_ci    int32_t Flush(size_t size) override;
103fb299fa2Sopenharmony_ci
104fb299fa2Sopenharmony_ci    size_t GetFileLength() override;
105fb299fa2Sopenharmony_ci
106fb299fa2Sopenharmony_ci    int32_t GetStreamType() const override
107fb299fa2Sopenharmony_ci    {
108fb299fa2Sopenharmony_ci        return streamType_;
109fb299fa2Sopenharmony_ci    }
110fb299fa2Sopenharmony_ci
111fb299fa2Sopenharmony_ciprivate:
112fb299fa2Sopenharmony_ci    FILE *stream_;
113fb299fa2Sopenharmony_ci    size_t fileLength_;
114fb299fa2Sopenharmony_ci    int32_t streamType_;
115fb299fa2Sopenharmony_ci};
116fb299fa2Sopenharmony_ci
117fb299fa2Sopenharmony_ciclass MemoryMapStream : public PkgStreamImpl {
118fb299fa2Sopenharmony_cipublic:
119fb299fa2Sopenharmony_ci    MemoryMapStream(PkgManager::PkgManagerPtr pkgManager, const std::string fileName, const PkgBuffer &buffer,
120fb299fa2Sopenharmony_ci        int32_t streamType = PkgStreamType_MemoryMap) : PkgStreamImpl(pkgManager, fileName), memMap_(buffer.buffer),
121fb299fa2Sopenharmony_ci        memSize_(buffer.length), currOffset_(0), streamType_(streamType) {}
122fb299fa2Sopenharmony_ci    ~MemoryMapStream() override;
123fb299fa2Sopenharmony_ci
124fb299fa2Sopenharmony_ci    int32_t Read(PkgBuffer &data, size_t start, size_t needRead, size_t &readLen) override;
125fb299fa2Sopenharmony_ci
126fb299fa2Sopenharmony_ci    int32_t Write(const PkgBuffer &data, size_t size, size_t start) override;
127fb299fa2Sopenharmony_ci
128fb299fa2Sopenharmony_ci    int32_t Seek(long int offset, int whence) override;
129fb299fa2Sopenharmony_ci
130fb299fa2Sopenharmony_ci    int32_t GetStreamType() const override
131fb299fa2Sopenharmony_ci    {
132fb299fa2Sopenharmony_ci        return streamType_;
133fb299fa2Sopenharmony_ci    }
134fb299fa2Sopenharmony_ci
135fb299fa2Sopenharmony_ci    size_t GetFileLength() override
136fb299fa2Sopenharmony_ci    {
137fb299fa2Sopenharmony_ci        return memSize_;
138fb299fa2Sopenharmony_ci    }
139fb299fa2Sopenharmony_ci
140fb299fa2Sopenharmony_ci    int32_t Flush(size_t size) override
141fb299fa2Sopenharmony_ci    {
142fb299fa2Sopenharmony_ci        if (size != memSize_) {
143fb299fa2Sopenharmony_ci            PKG_LOGE("Flush size %zu local size:%zu", size, memSize_);
144fb299fa2Sopenharmony_ci        }
145fb299fa2Sopenharmony_ci        if (streamType_ == PkgStreamType_MemoryMap) {
146fb299fa2Sopenharmony_ci            msync(static_cast<void *>(memMap_), memSize_, MS_ASYNC);
147fb299fa2Sopenharmony_ci        }
148fb299fa2Sopenharmony_ci        currOffset_ = size;
149fb299fa2Sopenharmony_ci        return PKG_SUCCESS;
150fb299fa2Sopenharmony_ci    }
151fb299fa2Sopenharmony_ci
152fb299fa2Sopenharmony_ci    int32_t GetBuffer(PkgBuffer &buffer) const override
153fb299fa2Sopenharmony_ci    {
154fb299fa2Sopenharmony_ci        buffer.buffer = memMap_;
155fb299fa2Sopenharmony_ci        buffer.length = memSize_;
156fb299fa2Sopenharmony_ci        return PKG_SUCCESS;
157fb299fa2Sopenharmony_ci    }
158fb299fa2Sopenharmony_ci
159fb299fa2Sopenharmony_ciprivate:
160fb299fa2Sopenharmony_ci    uint8_t *memMap_;
161fb299fa2Sopenharmony_ci    size_t memSize_;
162fb299fa2Sopenharmony_ci    size_t currOffset_;
163fb299fa2Sopenharmony_ci    int32_t streamType_;
164fb299fa2Sopenharmony_ci};
165fb299fa2Sopenharmony_ci
166fb299fa2Sopenharmony_ciclass ProcessorStream : public PkgStreamImpl {
167fb299fa2Sopenharmony_cipublic:
168fb299fa2Sopenharmony_ci    ProcessorStream(PkgManager::PkgManagerPtr pkgManager, const std::string fileName,
169fb299fa2Sopenharmony_ci        ExtractFileProcessor processor, const void *context)
170fb299fa2Sopenharmony_ci        : PkgStreamImpl(pkgManager, fileName), processor_(processor), context_(context) {}
171fb299fa2Sopenharmony_ci
172fb299fa2Sopenharmony_ci    ~ProcessorStream() override {}
173fb299fa2Sopenharmony_ci
174fb299fa2Sopenharmony_ci    int32_t Read(PkgBuffer &data, size_t start, size_t needRead, size_t &readLen) override
175fb299fa2Sopenharmony_ci    {
176fb299fa2Sopenharmony_ci        UNUSED(data);
177fb299fa2Sopenharmony_ci        UNUSED(start);
178fb299fa2Sopenharmony_ci        UNUSED(readLen);
179fb299fa2Sopenharmony_ci        UNUSED(needRead);
180fb299fa2Sopenharmony_ci        return PKG_INVALID_STREAM;
181fb299fa2Sopenharmony_ci    }
182fb299fa2Sopenharmony_ci
183fb299fa2Sopenharmony_ci    int32_t Write(const PkgBuffer &data, size_t size, size_t start) override
184fb299fa2Sopenharmony_ci    {
185fb299fa2Sopenharmony_ci        if (processor_ == nullptr) {
186fb299fa2Sopenharmony_ci            PKG_LOGE("processor not exist");
187fb299fa2Sopenharmony_ci            return PKG_INVALID_STREAM;
188fb299fa2Sopenharmony_ci        }
189fb299fa2Sopenharmony_ci        int ret = processor_(data, size, start, false, context_);
190fb299fa2Sopenharmony_ci        PostDecodeProgress(POST_TYPE_DECODE_PKG, size, nullptr);
191fb299fa2Sopenharmony_ci        return ret;
192fb299fa2Sopenharmony_ci    }
193fb299fa2Sopenharmony_ci
194fb299fa2Sopenharmony_ci    int32_t Seek(long int size, int whence) override
195fb299fa2Sopenharmony_ci    {
196fb299fa2Sopenharmony_ci        UNUSED(size);
197fb299fa2Sopenharmony_ci        UNUSED(whence);
198fb299fa2Sopenharmony_ci        return PKG_SUCCESS;
199fb299fa2Sopenharmony_ci    }
200fb299fa2Sopenharmony_ci
201fb299fa2Sopenharmony_ci    int32_t GetStreamType() const override
202fb299fa2Sopenharmony_ci    {
203fb299fa2Sopenharmony_ci        return PkgStreamType_Process;
204fb299fa2Sopenharmony_ci    }
205fb299fa2Sopenharmony_ci
206fb299fa2Sopenharmony_ci    size_t GetFileLength() override
207fb299fa2Sopenharmony_ci    {
208fb299fa2Sopenharmony_ci        return 0;
209fb299fa2Sopenharmony_ci    }
210fb299fa2Sopenharmony_ci
211fb299fa2Sopenharmony_ci    int32_t Flush(size_t size) override
212fb299fa2Sopenharmony_ci    {
213fb299fa2Sopenharmony_ci        UNUSED(size);
214fb299fa2Sopenharmony_ci        if (processor_ == nullptr) {
215fb299fa2Sopenharmony_ci            PKG_LOGE("processor not exist");
216fb299fa2Sopenharmony_ci            return PKG_INVALID_STREAM;
217fb299fa2Sopenharmony_ci        }
218fb299fa2Sopenharmony_ci        PkgBuffer data = {};
219fb299fa2Sopenharmony_ci        return processor_(data, 0, 0, true, context_);
220fb299fa2Sopenharmony_ci    }
221fb299fa2Sopenharmony_ci
222fb299fa2Sopenharmony_ciprivate:
223fb299fa2Sopenharmony_ci    ExtractFileProcessor processor_ = nullptr;
224fb299fa2Sopenharmony_ci    const void *context_;
225fb299fa2Sopenharmony_ci};
226fb299fa2Sopenharmony_ci
227fb299fa2Sopenharmony_ciconstexpr uint32_t MAX_FLOW_BUFFER_SIZE = 4 * 1024 * 1024;
228fb299fa2Sopenharmony_ci
229fb299fa2Sopenharmony_ciclass FlowDataStream : public Hpackage::PkgStreamImpl {
230fb299fa2Sopenharmony_cipublic:
231fb299fa2Sopenharmony_ci    FlowDataStream(Hpackage::PkgManager::PkgManagerPtr pkgManager, const std::string fileName,
232fb299fa2Sopenharmony_ci        const size_t fileSize, Updater::RingBuffer *buffer, int32_t streamType =
233fb299fa2Sopenharmony_ci        PkgStreamType_FlowData) : PkgStreamImpl(pkgManager, fileName), fileLength_(fileSize),
234fb299fa2Sopenharmony_ci        ringBuf_(buffer), streamType_(streamType) {}
235fb299fa2Sopenharmony_ci    ~FlowDataStream() override {}
236fb299fa2Sopenharmony_ci
237fb299fa2Sopenharmony_ci    int32_t Read(Hpackage::PkgBuffer &data, size_t start, size_t needRead, size_t &readLen) override;
238fb299fa2Sopenharmony_ci
239fb299fa2Sopenharmony_ci    int32_t Write(const Hpackage::PkgBuffer &data, size_t size, size_t start) override;
240fb299fa2Sopenharmony_ci
241fb299fa2Sopenharmony_ci    int32_t Seek(long int offset, int whence) override
242fb299fa2Sopenharmony_ci    {
243fb299fa2Sopenharmony_ci        UNUSED(offset);
244fb299fa2Sopenharmony_ci        UNUSED(whence);
245fb299fa2Sopenharmony_ci        return Hpackage::PKG_INVALID_STREAM;
246fb299fa2Sopenharmony_ci    }
247fb299fa2Sopenharmony_ci
248fb299fa2Sopenharmony_ci    int32_t GetStreamType() const override
249fb299fa2Sopenharmony_ci    {
250fb299fa2Sopenharmony_ci        return streamType_;
251fb299fa2Sopenharmony_ci    }
252fb299fa2Sopenharmony_ci
253fb299fa2Sopenharmony_ci    size_t GetFileLength() override
254fb299fa2Sopenharmony_ci    {
255fb299fa2Sopenharmony_ci        return fileLength_;
256fb299fa2Sopenharmony_ci    }
257fb299fa2Sopenharmony_ci
258fb299fa2Sopenharmony_ci    int32_t Flush(size_t size) override
259fb299fa2Sopenharmony_ci    {
260fb299fa2Sopenharmony_ci        UNUSED(size);
261fb299fa2Sopenharmony_ci        return Hpackage::PKG_INVALID_STREAM;
262fb299fa2Sopenharmony_ci    }
263fb299fa2Sopenharmony_ci
264fb299fa2Sopenharmony_ci    size_t GetReadOffset() const override
265fb299fa2Sopenharmony_ci    {
266fb299fa2Sopenharmony_ci        return readOffset_;
267fb299fa2Sopenharmony_ci    }
268fb299fa2Sopenharmony_ci
269fb299fa2Sopenharmony_ci    void Stop() override;
270fb299fa2Sopenharmony_ci
271fb299fa2Sopenharmony_ciprivate:
272fb299fa2Sopenharmony_ci    int32_t ReadFromRingBuf(uint8_t *&buff, const uint32_t needLen, uint32_t &readLen);
273fb299fa2Sopenharmony_ci
274fb299fa2Sopenharmony_ci    size_t fileLength_ {};
275fb299fa2Sopenharmony_ci    Updater::RingBuffer *ringBuf_ {};
276fb299fa2Sopenharmony_ci    int32_t streamType_;
277fb299fa2Sopenharmony_ci    uint8_t buff_[MAX_FLOW_BUFFER_SIZE] = {0};
278fb299fa2Sopenharmony_ci    uint32_t avail_ {};
279fb299fa2Sopenharmony_ci    uint32_t bufOffset_ {};
280fb299fa2Sopenharmony_ci    size_t readOffset_ {};
281fb299fa2Sopenharmony_ci    size_t writeOffset_ {};
282fb299fa2Sopenharmony_ci};
283fb299fa2Sopenharmony_ci} // namespace Hpackage
284fb299fa2Sopenharmony_ci#endif // PKG_STREAM_H
285