14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License.
54514f5e3Sopenharmony_ci * You may obtain a copy of the License at
64514f5e3Sopenharmony_ci *
74514f5e3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
84514f5e3Sopenharmony_ci *
94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and
134514f5e3Sopenharmony_ci * limitations under the License.
144514f5e3Sopenharmony_ci */
154514f5e3Sopenharmony_ci
164514f5e3Sopenharmony_ci#ifndef OHOS_ABILITY_BASE_EXTRACTOR_H
174514f5e3Sopenharmony_ci#define OHOS_ABILITY_BASE_EXTRACTOR_H
184514f5e3Sopenharmony_ci
194514f5e3Sopenharmony_ci#include <memory>
204514f5e3Sopenharmony_ci#include <mutex>
214514f5e3Sopenharmony_ci#include <optional>
224514f5e3Sopenharmony_ci#include <set>
234514f5e3Sopenharmony_ci#include <string>
244514f5e3Sopenharmony_ci#include <unordered_map>
254514f5e3Sopenharmony_ci#include <vector>
264514f5e3Sopenharmony_ci
274514f5e3Sopenharmony_ci#include "file_mapper.h"
284514f5e3Sopenharmony_ci#include "zip_file.h"
294514f5e3Sopenharmony_ci
304514f5e3Sopenharmony_cinamespace panda {
314514f5e3Sopenharmony_cinamespace ecmascript {
324514f5e3Sopenharmony_cistruct FileInfo {
334514f5e3Sopenharmony_ci    std::string fileName;
344514f5e3Sopenharmony_ci    uint32_t offset = 0;
354514f5e3Sopenharmony_ci    uint32_t length = 0;
364514f5e3Sopenharmony_ci    uint16_t lastModTime = 0;
374514f5e3Sopenharmony_ci    uint16_t lastModDate = 0;
384514f5e3Sopenharmony_ci};
394514f5e3Sopenharmony_ci
404514f5e3Sopenharmony_ciclass Extractor {
414514f5e3Sopenharmony_cipublic:
424514f5e3Sopenharmony_ci    explicit Extractor(const std::string &source);
434514f5e3Sopenharmony_ci    virtual ~Extractor();
444514f5e3Sopenharmony_ci
454514f5e3Sopenharmony_ci    /**
464514f5e3Sopenharmony_ci     * @brief Open compressed file.
474514f5e3Sopenharmony_ci     * @return Returns true if the file is successfully opened; returns false otherwise.
484514f5e3Sopenharmony_ci     */
494514f5e3Sopenharmony_ci    virtual bool Init();
504514f5e3Sopenharmony_ci
514514f5e3Sopenharmony_ci    /**
524514f5e3Sopenharmony_ci     * @brief Extract to dest stream by file name.
534514f5e3Sopenharmony_ci     * @param fileName Indicates the file name.
544514f5e3Sopenharmony_ci     * @param dest Indicates the obtained std::ostream object.
554514f5e3Sopenharmony_ci     * @return Returns true if the file extracted successfully; returns false otherwise.
564514f5e3Sopenharmony_ci     */
574514f5e3Sopenharmony_ci    bool ExtractByName(const std::string &fileName, std::ostream &dest) const;
584514f5e3Sopenharmony_ci    /**
594514f5e3Sopenharmony_ci     * @brief Extract to dest path on filesystem.
604514f5e3Sopenharmony_ci     * @param fileName Indicates the file name.
614514f5e3Sopenharmony_ci     * @param targetPath Indicates the target Path.
624514f5e3Sopenharmony_ci     * @return Returns true if the file extracted to filesystem successfully; returns false otherwise.
634514f5e3Sopenharmony_ci     */
644514f5e3Sopenharmony_ci    bool ExtractFile(const std::string &fileName, const std::string &targetPath) const;
654514f5e3Sopenharmony_ci    /**
664514f5e3Sopenharmony_ci     * @brief Get specified type names in a zip file.
674514f5e3Sopenharmony_ci     * @param fileNames Indicates the obtained file names in zip.
684514f5e3Sopenharmony_ci     * @param suffix Indicates the suffix of file.
694514f5e3Sopenharmony_ci     */
704514f5e3Sopenharmony_ci    bool HasEntry(const std::string &fileName) const;
714514f5e3Sopenharmony_ci    bool IsDirExist(const std::string &dir) const;
724514f5e3Sopenharmony_ci    bool GetFileBuffer(const std::string& srcPath, std::ostringstream& dest);
734514f5e3Sopenharmony_ci    bool GetFileList(const std::string& srcPath, std::vector<std::string>& assetList);
744514f5e3Sopenharmony_ci    bool GetFileList(const std::string &srcPath, std::set<std::string> &fileSet);
754514f5e3Sopenharmony_ci    bool IsSameHap(const std::string& hapPath) const;
764514f5e3Sopenharmony_ci
774514f5e3Sopenharmony_ci    std::unique_ptr<FileMapper> GetData(const std::string &fileName, bool safeRegion = false) const;
784514f5e3Sopenharmony_ci    /**
794514f5e3Sopenharmony_ci     * Do not use this method unless you exactly know what you are doing.
804514f5e3Sopenharmony_ci     * For file item that user will handle errors, to mmap to safe region.
814514f5e3Sopenharmony_ci     * User should make sure the extractor's release goes after the data's.
824514f5e3Sopenharmony_ci     */
834514f5e3Sopenharmony_ci    std::unique_ptr<FileMapper> GetMmapData(const std::string &fileName);
844514f5e3Sopenharmony_ci
854514f5e3Sopenharmony_ci    bool UnzipData(std::unique_ptr<FileMapper> fileMapper, std::unique_ptr<uint8_t[]> &dataPtr, size_t &len) const;
864514f5e3Sopenharmony_ci    bool IsStageModel();
874514f5e3Sopenharmony_ci
884514f5e3Sopenharmony_ci    bool GetFileInfo(const std::string &fileName, FileInfo &fileInfo) const;
894514f5e3Sopenharmony_ci
904514f5e3Sopenharmony_ci    bool IsHapCompress(const std::string &fileName) const;
914514f5e3Sopenharmony_ci
924514f5e3Sopenharmony_ci    bool ExtractToBufByName(const std::string &fileName, std::unique_ptr<uint8_t[]> &dataPtr, size_t &len);
934514f5e3Sopenharmony_ci    /**
944514f5e3Sopenharmony_ci     * For abc file only, to mmap to safe region.
954514f5e3Sopenharmony_ci     */
964514f5e3Sopenharmony_ci    std::shared_ptr<FileMapper> GetSafeData(const std::string &fileName);
974514f5e3Sopenharmony_ci    friend class ExtractorFriend;
984514f5e3Sopenharmony_ciprivate:
994514f5e3Sopenharmony_ci    ZipFile zipFile_;
1004514f5e3Sopenharmony_ci    bool initial_ = false;
1014514f5e3Sopenharmony_ci    std::string hapPath_;
1024514f5e3Sopenharmony_ci    std::optional<bool> isStageModel_;
1034514f5e3Sopenharmony_ci};
1044514f5e3Sopenharmony_ci
1054514f5e3Sopenharmony_ciclass ExtractorUtil {
1064514f5e3Sopenharmony_cipublic:
1074514f5e3Sopenharmony_ci    static std::string GetLoadFilePath(const std::string &hapPath);
1084514f5e3Sopenharmony_ci    static std::shared_ptr<Extractor> GetExtractor(const std::string &hapPath, bool &newCreate, bool cache = false);
1094514f5e3Sopenharmony_ci    static void DeleteExtractor(const std::string &hapPath);
1104514f5e3Sopenharmony_ci    friend class ExtractorUtilFriend;
1114514f5e3Sopenharmony_ciprivate:
1124514f5e3Sopenharmony_ci    static std::mutex mapMutex_;
1134514f5e3Sopenharmony_ci    static std::unordered_map<std::string, std::shared_ptr<Extractor>> extractorMap_;
1144514f5e3Sopenharmony_ci};
1154514f5e3Sopenharmony_ci}  // namespace AbilityBase
1164514f5e3Sopenharmony_ci}  // namespace OHOS
1174514f5e3Sopenharmony_ci#endif  // OHOS_ABILITY_BASE_EXTRACTOR_H
118