13920e296Sopenharmony_ci/*
23920e296Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
33920e296Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
43920e296Sopenharmony_ci * you may not use this file except in compliance with the License.
53920e296Sopenharmony_ci * You may obtain a copy of the License at
63920e296Sopenharmony_ci *
73920e296Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
83920e296Sopenharmony_ci *
93920e296Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
103920e296Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
113920e296Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123920e296Sopenharmony_ci * See the License for the specific language governing permissions and
133920e296Sopenharmony_ci * limitations under the License.
143920e296Sopenharmony_ci */
153920e296Sopenharmony_ci
163920e296Sopenharmony_ci#ifndef OHOS_RESTOOL_COMPRESSION_PARSER_H
173920e296Sopenharmony_ci#define OHOS_RESTOOL_COMPRESSION_PARSER_H
183920e296Sopenharmony_ci
193920e296Sopenharmony_ci#include <chrono>
203920e296Sopenharmony_ci#include <cJSON.h>
213920e296Sopenharmony_ci#ifdef __WIN32
223920e296Sopenharmony_ci#include <windows.h>
233920e296Sopenharmony_ci#else
243920e296Sopenharmony_ci#include <dlfcn.h>
253920e296Sopenharmony_ci#endif
263920e296Sopenharmony_ci#include "resource_util.h"
273920e296Sopenharmony_ci
283920e296Sopenharmony_cinamespace OHOS {
293920e296Sopenharmony_cinamespace Global {
303920e296Sopenharmony_cinamespace Restool {
313920e296Sopenharmony_ci
323920e296Sopenharmony_cienum class TranscodeError {
333920e296Sopenharmony_ci    SUCCESS = 0,
343920e296Sopenharmony_ci    INVALID_PARAMETERS,
353920e296Sopenharmony_ci    IMAGE_ERROR,
363920e296Sopenharmony_ci    ANIMATED_IMAGE_SKIP,
373920e296Sopenharmony_ci    MALLOC_FAILED,
383920e296Sopenharmony_ci    ENCODE_ASTC_FAILED,
393920e296Sopenharmony_ci    SUPER_COMPRESS_FAILED,
403920e296Sopenharmony_ci    NOT_MATCH_BASE = 100,
413920e296Sopenharmony_ci    IMAGE_SIZE_NOT_MATCH = 100,
423920e296Sopenharmony_ci    IMAGE_RESOLUTION_NOT_MATCH,
433920e296Sopenharmony_ci    EXCLUDE_MATCH,
443920e296Sopenharmony_ci    NOT_MATCH_BUTT = 199,
453920e296Sopenharmony_ci    LOAD_COMPRESS_FAILED
463920e296Sopenharmony_ci};
473920e296Sopenharmony_ci
483920e296Sopenharmony_cistruct TranscodeResult {
493920e296Sopenharmony_ci    size_t originSize;
503920e296Sopenharmony_ci    int32_t size;
513920e296Sopenharmony_ci    int32_t width;
523920e296Sopenharmony_ci    int32_t height;
533920e296Sopenharmony_ci};
543920e296Sopenharmony_ci
553920e296Sopenharmony_cistruct ImageSize {
563920e296Sopenharmony_ci    size_t width;
573920e296Sopenharmony_ci    size_t height;
583920e296Sopenharmony_ci};
593920e296Sopenharmony_ci
603920e296Sopenharmony_citypedef TranscodeError (*ITranscodeImages) (const std::string &imagePath, const bool extAppend,
613920e296Sopenharmony_ci    std::string &outputPath, TranscodeResult &result);
623920e296Sopenharmony_citypedef bool (*ISetTranscodeOptions) (const std::string &optionJson, const std::string &optionJsonExclude);
633920e296Sopenharmony_citypedef TranscodeError (*IScaleImage) (const std::string &imagePath, std::string &outputPath, ImageSize size);
643920e296Sopenharmony_ci
653920e296Sopenharmony_ciclass CompressionParser {
663920e296Sopenharmony_cipublic:
673920e296Sopenharmony_ci    static std::shared_ptr<CompressionParser> GetCompressionParser(const std::string &filePath);
683920e296Sopenharmony_ci    static std::shared_ptr<CompressionParser> GetCompressionParser();
693920e296Sopenharmony_ci    CompressionParser();
703920e296Sopenharmony_ci    explicit CompressionParser(const std::string &filePath);
713920e296Sopenharmony_ci    virtual ~CompressionParser();
723920e296Sopenharmony_ci    uint32_t Init();
733920e296Sopenharmony_ci    bool CopyAndTranscode(const std::string &src, std::string &dst, const bool extAppend = false);
743920e296Sopenharmony_ci    bool GetMediaSwitch();
753920e296Sopenharmony_ci    std::string PrintTransMessage();
763920e296Sopenharmony_ci    bool GetDefaultCompress();
773920e296Sopenharmony_ci    void SetOutPath(const std::string &path);
783920e296Sopenharmony_ci    bool ScaleIconEnable();
793920e296Sopenharmony_ci    bool CheckAndScaleIcon(const std::string &src, const std::string &originDst, std::string &scaleDst);
803920e296Sopenharmony_ciprivate:
813920e296Sopenharmony_ci    bool ParseContext(const cJSON *contextNode);
823920e296Sopenharmony_ci    bool ParseCompression(const cJSON *compressionNode);
833920e296Sopenharmony_ci    bool ParseFilters(const cJSON *filtersNode);
843920e296Sopenharmony_ci    bool LoadImageTranscoder();
853920e296Sopenharmony_ci    bool SetTranscodeOptions(const std::string &optionJson, const std::string &optionJsonExclude);
863920e296Sopenharmony_ci    TranscodeError TranscodeImages(const std::string &imagePath, const bool extAppend,
873920e296Sopenharmony_ci        std::string &outputPath, TranscodeResult &result);
883920e296Sopenharmony_ci    TranscodeError ScaleImage(const std::string &imagePath, std::string &outputPath);
893920e296Sopenharmony_ci    std::vector<std::string> ParsePath(const cJSON *pathNode);
903920e296Sopenharmony_ci    std::string ParseRules(const cJSON *rulesNode);
913920e296Sopenharmony_ci    std::string ParseJsonStr(const cJSON *node);
923920e296Sopenharmony_ci    bool CheckPath(const std::string &src, const std::vector<std::string> &paths);
933920e296Sopenharmony_ci    bool IsInPath(const std::string &src, const std::shared_ptr<CompressFilter> &compressFilter);
943920e296Sopenharmony_ci    bool IsInExcludePath(const std::string &src, const std::shared_ptr<CompressFilter> &compressFilter);
953920e296Sopenharmony_ci    void CollectTime(uint32_t &count, unsigned long long &time,
963920e296Sopenharmony_ci        std::chrono::time_point<std::chrono::steady_clock> &start);
973920e296Sopenharmony_ci    void CollectTimeAndSize(TranscodeError res, std::chrono::time_point<std::chrono::steady_clock> &start,
983920e296Sopenharmony_ci        TranscodeResult &result);
993920e296Sopenharmony_ci    std::string GetMethod(const std::shared_ptr<CompressFilter> &compressFilter);
1003920e296Sopenharmony_ci    std::string GetRules(const std::shared_ptr<CompressFilter> &compressFilter);
1013920e296Sopenharmony_ci    std::string GetExcludeRules(const std::shared_ptr<CompressFilter> &compressFilter);
1023920e296Sopenharmony_ci    std::string GetFileRules(const std::string &rules, const std::string &method);
1033920e296Sopenharmony_ci    bool CheckAndTranscode(const std::string &src, std::string &dst, std::string &output,
1043920e296Sopenharmony_ci        const std::shared_ptr<CompressFilter> &compressFilter, const bool extAppend);
1053920e296Sopenharmony_ci    bool CopyForTrans(const std::string &src, const std::string &originDst, const std::string &dst);
1063920e296Sopenharmony_ci    bool IsDefaultCompress();
1073920e296Sopenharmony_ci    std::string filePath_;
1083920e296Sopenharmony_ci    std::string extensionPath_;
1093920e296Sopenharmony_ci    std::vector<std::shared_ptr<CompressFilter>> compressFilters_;
1103920e296Sopenharmony_ci    bool mediaSwitch_;
1113920e296Sopenharmony_ci    cJSON *root_;
1123920e296Sopenharmony_ci    bool defaultCompress_;
1133920e296Sopenharmony_ci    std::string outPath_;
1143920e296Sopenharmony_ci    unsigned long long totalTime_ = 0;
1153920e296Sopenharmony_ci    uint32_t totalCounts_ = 0;
1163920e296Sopenharmony_ci    unsigned long long compressTime_ = 0;
1173920e296Sopenharmony_ci    uint32_t compressCounts_ = 0;
1183920e296Sopenharmony_ci    unsigned long long successTime_ = 0;
1193920e296Sopenharmony_ci    uint32_t successCounts_ = 0;
1203920e296Sopenharmony_ci    unsigned long long originalSize_ = 0;
1213920e296Sopenharmony_ci    unsigned long long successSize_ = 0;
1223920e296Sopenharmony_ci#ifdef __WIN32
1233920e296Sopenharmony_ci    HMODULE handle_ = nullptr;
1243920e296Sopenharmony_ci#else
1253920e296Sopenharmony_ci    void *handle_ = nullptr;
1263920e296Sopenharmony_ci#endif
1273920e296Sopenharmony_ci};
1283920e296Sopenharmony_ci}
1293920e296Sopenharmony_ci}
1303920e296Sopenharmony_ci}
1313920e296Sopenharmony_ci#endif