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