154aa6d63Sopenharmony_ci/*
254aa6d63Sopenharmony_ci * Copyright (c) 2024-2024 Huawei Device Co., Ltd.
354aa6d63Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
454aa6d63Sopenharmony_ci * you may not use this file except in compliance with the License.
554aa6d63Sopenharmony_ci * You may obtain a copy of the License at
654aa6d63Sopenharmony_ci *
754aa6d63Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
854aa6d63Sopenharmony_ci *
954aa6d63Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1054aa6d63Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1154aa6d63Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1254aa6d63Sopenharmony_ci * See the License for the specific language governing permissions and
1354aa6d63Sopenharmony_ci * limitations under the License.
1454aa6d63Sopenharmony_ci */
1554aa6d63Sopenharmony_ci#include <iostream>
1654aa6d63Sopenharmony_ci#include <filesystem>
1754aa6d63Sopenharmony_ci#include <fstream>
1854aa6d63Sopenharmony_ci#include <climits>
1954aa6d63Sopenharmony_ci
2054aa6d63Sopenharmony_ci#include "string_utils.h"
2154aa6d63Sopenharmony_ci#include "signature_tools_errno.h"
2254aa6d63Sopenharmony_ci#include "file_utils.h"
2354aa6d63Sopenharmony_ci
2454aa6d63Sopenharmony_cinamespace OHOS {
2554aa6d63Sopenharmony_cinamespace SignatureTools {
2654aa6d63Sopenharmony_cinamespace fs = std::filesystem;
2754aa6d63Sopenharmony_ci
2854aa6d63Sopenharmony_ciconst int FileUtils::NUM_TWO = 2;
2954aa6d63Sopenharmony_ciconst int FileUtils::NUM_THREE = 3;
3054aa6d63Sopenharmony_ciconst int FileUtils::NUM_FOUR = 4;
3154aa6d63Sopenharmony_ciconst std::string FileUtils::LIBS_PATH_PREFIX = "libs/";
3254aa6d63Sopenharmony_cibool FileUtils::IsEmpty(std::string cs)
3354aa6d63Sopenharmony_ci{
3454aa6d63Sopenharmony_ci    if (cs.length() == 0) {
3554aa6d63Sopenharmony_ci        return true;
3654aa6d63Sopenharmony_ci    }
3754aa6d63Sopenharmony_ci    return false;
3854aa6d63Sopenharmony_ci}
3954aa6d63Sopenharmony_ci
4054aa6d63Sopenharmony_cibool FileUtils::IsSpaceEnough(const std::string& filePath, const int64_t requiredSpace)
4154aa6d63Sopenharmony_ci{
4254aa6d63Sopenharmony_ci    uint64_t freeSpace = 0;
4354aa6d63Sopenharmony_ci    struct statfs diskStatfs;
4454aa6d63Sopenharmony_ci    int ret = statfs(filePath.c_str(), &diskStatfs);
4554aa6d63Sopenharmony_ci    if (ret >= 0) {
4654aa6d63Sopenharmony_ci        freeSpace = (uint64_t)diskStatfs.f_bsize * (uint64_t)diskStatfs.f_bavail;
4754aa6d63Sopenharmony_ci    } else {
4854aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGE("statfs fail, error code = %d", ret);
4954aa6d63Sopenharmony_ci    }
5054aa6d63Sopenharmony_ci    return freeSpace >= static_cast<uint64_t>(requiredSpace);
5154aa6d63Sopenharmony_ci}
5254aa6d63Sopenharmony_ci
5354aa6d63Sopenharmony_cistd::string FileUtils::GetSuffix(std::string filePath)
5454aa6d63Sopenharmony_ci{
5554aa6d63Sopenharmony_ci    if (filePath.empty()) {
5654aa6d63Sopenharmony_ci        return "";
5754aa6d63Sopenharmony_ci    }
5854aa6d63Sopenharmony_ci    size_t lastDotPosition = filePath.rfind(".");
5954aa6d63Sopenharmony_ci    bool positionFlag = (lastDotPosition == std::string::npos) || (lastDotPosition == filePath.size() - 1);
6054aa6d63Sopenharmony_ci    if (positionFlag) {
6154aa6d63Sopenharmony_ci        return "";
6254aa6d63Sopenharmony_ci    }
6354aa6d63Sopenharmony_ci    return filePath.substr(lastDotPosition + 1);
6454aa6d63Sopenharmony_ci}
6554aa6d63Sopenharmony_ci
6654aa6d63Sopenharmony_cibool FileUtils::ValidFileType(const std::string& filePath, const std::initializer_list<std::string> types)
6754aa6d63Sopenharmony_ci{
6854aa6d63Sopenharmony_ci    std::string suffix = GetSuffix(filePath);
6954aa6d63Sopenharmony_ci    bool flag = suffix.empty() || (StringUtils::ContainsCase(types, suffix) == false);
7054aa6d63Sopenharmony_ci    if (flag) {
7154aa6d63Sopenharmony_ci        PrintErrorNumberMsg("NOT_SUPPORT_ERROR", NOT_SUPPORT_ERROR, "Not support file: " + filePath);
7254aa6d63Sopenharmony_ci        return false;
7354aa6d63Sopenharmony_ci    }
7454aa6d63Sopenharmony_ci    return true;
7554aa6d63Sopenharmony_ci}
7654aa6d63Sopenharmony_ci
7754aa6d63Sopenharmony_ciint FileUtils::Write(const std::string& content, const std::string& output)
7854aa6d63Sopenharmony_ci{
7954aa6d63Sopenharmony_ci    std::ofstream outFile(output, std::ios::binary);
8054aa6d63Sopenharmony_ci    bool flag = (outFile.rdstate() != 0);
8154aa6d63Sopenharmony_ci    if (flag) {
8254aa6d63Sopenharmony_ci        PrintErrorNumberMsg("IO_ERROR", IO_ERROR, "open output file: " + output + " failed");
8354aa6d63Sopenharmony_ci        return IO_ERROR;
8454aa6d63Sopenharmony_ci    }
8554aa6d63Sopenharmony_ci    outFile.write(&content[0], content.size());
8654aa6d63Sopenharmony_ci    if (outFile.rdstate() != 0) {
8754aa6d63Sopenharmony_ci        PrintErrorNumberMsg("IO_ERROR", IO_ERROR, "Failed to write data to output stream.");
8854aa6d63Sopenharmony_ci        return IO_ERROR;
8954aa6d63Sopenharmony_ci    }
9054aa6d63Sopenharmony_ci    return RET_OK;
9154aa6d63Sopenharmony_ci}
9254aa6d63Sopenharmony_ci
9354aa6d63Sopenharmony_ciint FileUtils::Read(std::ifstream& input, std::string& ret)
9454aa6d63Sopenharmony_ci{
9554aa6d63Sopenharmony_ci    ret.clear();
9654aa6d63Sopenharmony_ci    if (input.rdstate() != 0) {
9754aa6d63Sopenharmony_ci        PrintErrorNumberMsg("IO_ERROR", IO_ERROR, "invalid input stream");
9854aa6d63Sopenharmony_ci        return IO_ERROR;
9954aa6d63Sopenharmony_ci    }
10054aa6d63Sopenharmony_ci    ret.clear();
10154aa6d63Sopenharmony_ci    std::string buffer(FileUtils::FILE_BUFFER_BLOCK, 0);
10254aa6d63Sopenharmony_ci    while (input) {
10354aa6d63Sopenharmony_ci        input.read(&buffer[0], buffer.size());
10454aa6d63Sopenharmony_ci        ret.append(&buffer[0], input.gcount());
10554aa6d63Sopenharmony_ci    }
10654aa6d63Sopenharmony_ci    return RET_OK;
10754aa6d63Sopenharmony_ci}
10854aa6d63Sopenharmony_ci
10954aa6d63Sopenharmony_ciint FileUtils::ReadFile(const std::string& path, std::string& ret)
11054aa6d63Sopenharmony_ci{
11154aa6d63Sopenharmony_ci    std::ifstream file(path, std::ios::binary);
11254aa6d63Sopenharmony_ci    bool flag = (file.rdstate() != 0);
11354aa6d63Sopenharmony_ci    if (flag) {
11454aa6d63Sopenharmony_ci        PrintErrorNumberMsg("IO_ERROR", IO_ERROR, "open input file: " + path + " failed");
11554aa6d63Sopenharmony_ci        return IO_ERROR;
11654aa6d63Sopenharmony_ci    }
11754aa6d63Sopenharmony_ci    if (Read(file, ret) < 0) {
11854aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGE("read error!");
11954aa6d63Sopenharmony_ci        return IO_ERROR;
12054aa6d63Sopenharmony_ci    }
12154aa6d63Sopenharmony_ci    return RET_OK;
12254aa6d63Sopenharmony_ci}
12354aa6d63Sopenharmony_ci
12454aa6d63Sopenharmony_ciint FileUtils::ReadFileByOffsetAndLength(std::ifstream& file, size_t offset, size_t length, std::string& ret)
12554aa6d63Sopenharmony_ci{
12654aa6d63Sopenharmony_ci    if (length > INT_MAX) {
12754aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGE("Size cannot be greater than Integer max value: %zu", length);
12854aa6d63Sopenharmony_ci        return RET_FAILED;
12954aa6d63Sopenharmony_ci    }
13054aa6d63Sopenharmony_ci    if (ReadInputByOffsetAndLength(file, offset, length, ret) < 0) {
13154aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGE("Error readInputByOffsetAndLength");
13254aa6d63Sopenharmony_ci        return IO_ERROR;
13354aa6d63Sopenharmony_ci    }
13454aa6d63Sopenharmony_ci    return RET_OK;
13554aa6d63Sopenharmony_ci}
13654aa6d63Sopenharmony_ci
13754aa6d63Sopenharmony_ciint FileUtils::ReadInputByOffsetAndLength(std::ifstream& input, size_t offset, size_t length, std::string& ret)
13854aa6d63Sopenharmony_ci{
13954aa6d63Sopenharmony_ci    if (length > INT_MAX) {
14054aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGE("Size cannot be greater than Integer max value: %zu", length);
14154aa6d63Sopenharmony_ci        return -1;
14254aa6d63Sopenharmony_ci    }
14354aa6d63Sopenharmony_ci    input.seekg(offset);
14454aa6d63Sopenharmony_ci    if (ReadInputByLength(input, length, ret) < 0) {
14554aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGE("Error readInputByLength");
14654aa6d63Sopenharmony_ci        return -1;
14754aa6d63Sopenharmony_ci    }
14854aa6d63Sopenharmony_ci    return RET_OK;
14954aa6d63Sopenharmony_ci}
15054aa6d63Sopenharmony_ci
15154aa6d63Sopenharmony_ciint FileUtils::ReadInputByLength(std::ifstream& input, size_t length, std::string& ret)
15254aa6d63Sopenharmony_ci{
15354aa6d63Sopenharmony_ci    if (length > INT_MAX) {
15454aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGE("Size cannot be greater than Integer max value: %zu", length);
15554aa6d63Sopenharmony_ci        return -1;
15654aa6d63Sopenharmony_ci    }
15754aa6d63Sopenharmony_ci    if (input.rdstate() != 0) {
15854aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGE("Error input");
15954aa6d63Sopenharmony_ci        return -1;
16054aa6d63Sopenharmony_ci    }
16154aa6d63Sopenharmony_ci    ret.clear();
16254aa6d63Sopenharmony_ci    std::string buffer(FILE_BUFFER_BLOCK, 0);
16354aa6d63Sopenharmony_ci    size_t hasReadLen = 0;
16454aa6d63Sopenharmony_ci    while (hasReadLen < length && input) {
16554aa6d63Sopenharmony_ci        int readLen = static_cast<int>(std::min(length - hasReadLen, (size_t)FILE_BUFFER_BLOCK));
16654aa6d63Sopenharmony_ci        input.read(&buffer[0], readLen);
16754aa6d63Sopenharmony_ci        bool flag = (input.gcount() != readLen);
16854aa6d63Sopenharmony_ci        if (flag) {
16954aa6d63Sopenharmony_ci            SIGNATURE_TOOLS_LOGE("read %zu bytes data less than %zu", hasReadLen, length);
17054aa6d63Sopenharmony_ci            return -1;
17154aa6d63Sopenharmony_ci        }
17254aa6d63Sopenharmony_ci        ret.append(&buffer[0], readLen);
17354aa6d63Sopenharmony_ci        hasReadLen += input.gcount();
17454aa6d63Sopenharmony_ci    }
17554aa6d63Sopenharmony_ci    if (hasReadLen != length) {
17654aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGE("read %zu bytes data less than %zu", hasReadLen, length);
17754aa6d63Sopenharmony_ci        return -1;
17854aa6d63Sopenharmony_ci    }
17954aa6d63Sopenharmony_ci    return RET_OK;
18054aa6d63Sopenharmony_ci}
18154aa6d63Sopenharmony_ci
18254aa6d63Sopenharmony_cibool FileUtils::AppendWriteFileByOffsetToFile(std::ifstream& input, std::ofstream& out, size_t offset, size_t size)
18354aa6d63Sopenharmony_ci{
18454aa6d63Sopenharmony_ci    if (input.rdstate() != 0) {
18554aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGE("input failed.");
18654aa6d63Sopenharmony_ci        return false;
18754aa6d63Sopenharmony_ci    }
18854aa6d63Sopenharmony_ci    if (out.rdstate() != 0) {
18954aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGE("Failed get out stream");
19054aa6d63Sopenharmony_ci        return false;
19154aa6d63Sopenharmony_ci    }
19254aa6d63Sopenharmony_ci    input.seekg(offset);
19354aa6d63Sopenharmony_ci    if (WriteInputToOutPut(input, out, size) < 0) {
19454aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGE("Error: writeInputToOutPut");
19554aa6d63Sopenharmony_ci        return false;
19654aa6d63Sopenharmony_ci    }
19754aa6d63Sopenharmony_ci    return true;
19854aa6d63Sopenharmony_ci}
19954aa6d63Sopenharmony_ci
20054aa6d63Sopenharmony_cibool FileUtils::AppendWriteFileToFile(const std::string& inputFile, const std::string& outputFile)
20154aa6d63Sopenharmony_ci{
20254aa6d63Sopenharmony_ci    std::ifstream input(inputFile, std::ios::binary);
20354aa6d63Sopenharmony_ci    std::ofstream output(outputFile, std::ios::binary | std::ios::app);
20454aa6d63Sopenharmony_ci    bool flag = (0 != input.rdstate());
20554aa6d63Sopenharmony_ci    if (flag) {
20654aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGE("Failed to get input stream object!");
20754aa6d63Sopenharmony_ci        return false;
20854aa6d63Sopenharmony_ci    }
20954aa6d63Sopenharmony_ci    flag = (0 != output.rdstate());
21054aa6d63Sopenharmony_ci    if (flag) {
21154aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGE("Failed to get output stream object!");
21254aa6d63Sopenharmony_ci        return false;
21354aa6d63Sopenharmony_ci    }
21454aa6d63Sopenharmony_ci    char* buffer = new char[FILE_BUFFER_BLOCK];
21554aa6d63Sopenharmony_ci    while (!input.eof()) {
21654aa6d63Sopenharmony_ci        input.read(buffer, FILE_BUFFER_BLOCK);
21754aa6d63Sopenharmony_ci
21854aa6d63Sopenharmony_ci        if (input.fail() && !input.eof()) {
21954aa6d63Sopenharmony_ci            SIGNATURE_TOOLS_LOGE("error occurred while reading data");
22054aa6d63Sopenharmony_ci            delete[]buffer;
22154aa6d63Sopenharmony_ci            return false;
22254aa6d63Sopenharmony_ci        }
22354aa6d63Sopenharmony_ci        std::streamsize readLen = input.gcount();
22454aa6d63Sopenharmony_ci        if (readLen > 0) {
22554aa6d63Sopenharmony_ci            output.write(buffer, readLen);
22654aa6d63Sopenharmony_ci        }
22754aa6d63Sopenharmony_ci        if (!output) {
22854aa6d63Sopenharmony_ci            SIGNATURE_TOOLS_LOGE("error occurred while writing data");
22954aa6d63Sopenharmony_ci            delete[]buffer;
23054aa6d63Sopenharmony_ci            return false;
23154aa6d63Sopenharmony_ci        }
23254aa6d63Sopenharmony_ci    }
23354aa6d63Sopenharmony_ci    delete[]buffer;
23454aa6d63Sopenharmony_ci    return true;
23554aa6d63Sopenharmony_ci}
23654aa6d63Sopenharmony_ci
23754aa6d63Sopenharmony_cibool FileUtils::AppendWriteByteToFile(const std::string& bytes, const std::string& outputFile)
23854aa6d63Sopenharmony_ci{
23954aa6d63Sopenharmony_ci    std::ofstream output(outputFile, std::ios::binary | std::ios::app);
24054aa6d63Sopenharmony_ci    bool flag = (WriteByteToOutFile(bytes, output) == false);
24154aa6d63Sopenharmony_ci    if (flag) {
24254aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGE("Failed to write data to output stream, outfile: %s", outputFile.c_str());
24354aa6d63Sopenharmony_ci        return false;
24454aa6d63Sopenharmony_ci    }
24554aa6d63Sopenharmony_ci    return true;
24654aa6d63Sopenharmony_ci}
24754aa6d63Sopenharmony_ci
24854aa6d63Sopenharmony_ciint FileUtils::WriteInputToOutPut(std::ifstream& input, std::ofstream& output, size_t length)
24954aa6d63Sopenharmony_ci{
25054aa6d63Sopenharmony_ci    static Uscript::ThreadPool readPool(1);
25154aa6d63Sopenharmony_ci    static Uscript::ThreadPool writePool(1);
25254aa6d63Sopenharmony_ci    std::future<void> readTask;
25354aa6d63Sopenharmony_ci    std::vector<std::future<void>> writeTasks;
25454aa6d63Sopenharmony_ci    int result = RET_OK;
25554aa6d63Sopenharmony_ci    auto writeFunc = [&result] (std::ofstream& outStream, char* data, int dataSize) {
25654aa6d63Sopenharmony_ci        outStream.write(data, dataSize);
25754aa6d63Sopenharmony_ci        if (!outStream.good()) {
25854aa6d63Sopenharmony_ci            result = IO_ERROR;
25954aa6d63Sopenharmony_ci            delete[] data;
26054aa6d63Sopenharmony_ci            return;
26154aa6d63Sopenharmony_ci        }
26254aa6d63Sopenharmony_ci        delete[] data;
26354aa6d63Sopenharmony_ci        };
26454aa6d63Sopenharmony_ci    auto readFunc = [&output, &writeFunc, &writeTasks, &result] (std::ifstream& in, int dataSize) {
26554aa6d63Sopenharmony_ci        while (in) {
26654aa6d63Sopenharmony_ci            char* buf = new (std::nothrow)char[FILE_BUFFER_BLOCK];
26754aa6d63Sopenharmony_ci            if (buf == NULL) {
26854aa6d63Sopenharmony_ci                result = RET_FAILED;
26954aa6d63Sopenharmony_ci                return;
27054aa6d63Sopenharmony_ci            }
27154aa6d63Sopenharmony_ci            int min = std::min(dataSize, FILE_BUFFER_BLOCK);
27254aa6d63Sopenharmony_ci            in.read(buf, min);
27354aa6d63Sopenharmony_ci            dataSize -= in.gcount();
27454aa6d63Sopenharmony_ci            writeTasks.push_back(writePool.Enqueue(writeFunc, std::ref(output), buf, min));
27554aa6d63Sopenharmony_ci            if (dataSize <= 0) {
27654aa6d63Sopenharmony_ci                break;
27754aa6d63Sopenharmony_ci            }
27854aa6d63Sopenharmony_ci        }
27954aa6d63Sopenharmony_ci        // After the file is written, datasize must be 0, so the if condition will never hold
28054aa6d63Sopenharmony_ci        if (dataSize != 0) {
28154aa6d63Sopenharmony_ci            SIGNATURE_TOOLS_LOGE("write error!");
28254aa6d63Sopenharmony_ci            result = IO_ERROR;
28354aa6d63Sopenharmony_ci            return;
28454aa6d63Sopenharmony_ci        }
28554aa6d63Sopenharmony_ci        };
28654aa6d63Sopenharmony_ci    readTask = readPool.Enqueue(readFunc, std::ref(input), length);
28754aa6d63Sopenharmony_ci    readTask.wait();
28854aa6d63Sopenharmony_ci    for (std::future<void>& task : writeTasks) {
28954aa6d63Sopenharmony_ci        task.wait();
29054aa6d63Sopenharmony_ci    }
29154aa6d63Sopenharmony_ci    return result;
29254aa6d63Sopenharmony_ci}
29354aa6d63Sopenharmony_ci
29454aa6d63Sopenharmony_cibool FileUtils::WriteInputToOutPut(const std::string& input, const std::string& output)
29554aa6d63Sopenharmony_ci{
29654aa6d63Sopenharmony_ci    std::ifstream in(input, std::ios::binary);
29754aa6d63Sopenharmony_ci    std::ofstream out(output, std::ios::binary);
29854aa6d63Sopenharmony_ci    bool flag = (in.rdstate() != 0);
29954aa6d63Sopenharmony_ci    if (flag) {
30054aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGE("Failed to get input stream object!");
30154aa6d63Sopenharmony_ci        return false;
30254aa6d63Sopenharmony_ci    }
30354aa6d63Sopenharmony_ci    flag = (out.rdstate() != 0);
30454aa6d63Sopenharmony_ci    if (flag) {
30554aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGE("Failed to get output stream object!");
30654aa6d63Sopenharmony_ci        return false;
30754aa6d63Sopenharmony_ci    }
30854aa6d63Sopenharmony_ci    char* buffer = new char[FILE_BUFFER_BLOCK];
30954aa6d63Sopenharmony_ci    while (!in.eof()) {
31054aa6d63Sopenharmony_ci        in.read(buffer, FILE_BUFFER_BLOCK);
31154aa6d63Sopenharmony_ci
31254aa6d63Sopenharmony_ci        if (in.fail() && !in.eof()) {
31354aa6d63Sopenharmony_ci            SIGNATURE_TOOLS_LOGE("error occurred while reading data");
31454aa6d63Sopenharmony_ci            delete[]buffer;
31554aa6d63Sopenharmony_ci            return false;
31654aa6d63Sopenharmony_ci        }
31754aa6d63Sopenharmony_ci
31854aa6d63Sopenharmony_ci        std::streamsize readLen = in.gcount();
31954aa6d63Sopenharmony_ci        if (readLen > 0) {
32054aa6d63Sopenharmony_ci            out.write(buffer, readLen);
32154aa6d63Sopenharmony_ci        }
32254aa6d63Sopenharmony_ci
32354aa6d63Sopenharmony_ci        if (!out) {
32454aa6d63Sopenharmony_ci            SIGNATURE_TOOLS_LOGE("error occurred while writing data");
32554aa6d63Sopenharmony_ci            delete[]buffer;
32654aa6d63Sopenharmony_ci            return false;
32754aa6d63Sopenharmony_ci        }
32854aa6d63Sopenharmony_ci    }
32954aa6d63Sopenharmony_ci    delete[]buffer;
33054aa6d63Sopenharmony_ci    return true;
33154aa6d63Sopenharmony_ci}
33254aa6d63Sopenharmony_ci
33354aa6d63Sopenharmony_cibool FileUtils::WriteByteToOutFile(const std::string& bytes, const std::string& outFile)
33454aa6d63Sopenharmony_ci{
33554aa6d63Sopenharmony_ci    std::ofstream ops(outFile, std::ios::binary);
33654aa6d63Sopenharmony_ci    bool flag = (WriteByteToOutFile(bytes, ops) == false);
33754aa6d63Sopenharmony_ci    if (flag) {
33854aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGE("Failed to write data to ops, outfile: %s", outFile.c_str());
33954aa6d63Sopenharmony_ci        return false;
34054aa6d63Sopenharmony_ci    }
34154aa6d63Sopenharmony_ci    return true;
34254aa6d63Sopenharmony_ci}
34354aa6d63Sopenharmony_ci
34454aa6d63Sopenharmony_cibool FileUtils::WriteByteToOutFile(const std::string& bytes, std::ofstream& outFile)
34554aa6d63Sopenharmony_ci{
34654aa6d63Sopenharmony_ci    if (outFile.rdstate() != 0) {
34754aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGE("Failed to get output stream object, outfile");
34854aa6d63Sopenharmony_ci        return false;
34954aa6d63Sopenharmony_ci    }
35054aa6d63Sopenharmony_ci    outFile.write(&bytes[0], bytes.size());
35154aa6d63Sopenharmony_ci    if (outFile.rdstate() != 0) {
35254aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGE("Failed to write data to ops, outfile ");
35354aa6d63Sopenharmony_ci        return false;
35454aa6d63Sopenharmony_ci    }
35554aa6d63Sopenharmony_ci    outFile.flush();
35654aa6d63Sopenharmony_ci    if (outFile.rdstate() != 0) {
35754aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGE("Flush error");
35854aa6d63Sopenharmony_ci        return false;
35954aa6d63Sopenharmony_ci    }
36054aa6d63Sopenharmony_ci    return true;
36154aa6d63Sopenharmony_ci}
36254aa6d63Sopenharmony_ci
36354aa6d63Sopenharmony_cibool FileUtils::WriteByteToOutFile(const std::vector<int8_t>& bytes, std::ofstream& outFile)
36454aa6d63Sopenharmony_ci{
36554aa6d63Sopenharmony_ci    if (outFile.rdstate() != 0) {
36654aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGE("Failed to get output stream object, outfile");
36754aa6d63Sopenharmony_ci        return false;
36854aa6d63Sopenharmony_ci    }
36954aa6d63Sopenharmony_ci    outFile.write((char*)&bytes[0], bytes.size());
37054aa6d63Sopenharmony_ci    if (outFile.rdstate() != 0) {
37154aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGE("Failed to write data to ops, outfile ");
37254aa6d63Sopenharmony_ci        return false;
37354aa6d63Sopenharmony_ci    }
37454aa6d63Sopenharmony_ci    outFile.flush();
37554aa6d63Sopenharmony_ci    if (outFile.rdstate() != 0) {
37654aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGE("Flush error");
37754aa6d63Sopenharmony_ci        return false;
37854aa6d63Sopenharmony_ci    }
37954aa6d63Sopenharmony_ci    return true;
38054aa6d63Sopenharmony_ci}
38154aa6d63Sopenharmony_ci
38254aa6d63Sopenharmony_cibool FileUtils::IsRunnableFile(const std::string& name)
38354aa6d63Sopenharmony_ci{
38454aa6d63Sopenharmony_ci    if (name.empty()) {
38554aa6d63Sopenharmony_ci        return false;
38654aa6d63Sopenharmony_ci    }
38754aa6d63Sopenharmony_ci    size_t dotPos = name.rfind('.');
38854aa6d63Sopenharmony_ci    if (dotPos == std::string::npos) {
38954aa6d63Sopenharmony_ci        return false;
39054aa6d63Sopenharmony_ci    }
39154aa6d63Sopenharmony_ci    std::string suffix = name.substr(dotPos + 1);
39254aa6d63Sopenharmony_ci    if (suffix == "an" || suffix == "abc") {
39354aa6d63Sopenharmony_ci        return true;
39454aa6d63Sopenharmony_ci    }
39554aa6d63Sopenharmony_ci    std::string libDir = name.substr(0, LIBS_PATH_PREFIX.size());
39654aa6d63Sopenharmony_ci    if (LIBS_PATH_PREFIX.compare(libDir) == 0) {
39754aa6d63Sopenharmony_ci        return true;
39854aa6d63Sopenharmony_ci    }
39954aa6d63Sopenharmony_ci    return false;
40054aa6d63Sopenharmony_ci}
40154aa6d63Sopenharmony_ci
40254aa6d63Sopenharmony_cibool FileUtils::IsValidFile(std::string file)
40354aa6d63Sopenharmony_ci{
40454aa6d63Sopenharmony_ci    std::filesystem::path filePath = file;
40554aa6d63Sopenharmony_ci    bool flag = std::filesystem::exists(filePath);
40654aa6d63Sopenharmony_ci    if (!flag) {
40754aa6d63Sopenharmony_ci        PrintErrorNumberMsg("FILE_NOT_FOUND", FILE_NOT_FOUND, "'" + file + "' file is not exists");
40854aa6d63Sopenharmony_ci        return false;
40954aa6d63Sopenharmony_ci    }
41054aa6d63Sopenharmony_ci    flag = std::filesystem::is_directory(filePath);
41154aa6d63Sopenharmony_ci    if (flag) {
41254aa6d63Sopenharmony_ci        PrintErrorNumberMsg("FILE_NOT_FOUND", FILE_NOT_FOUND, "'" + file + "' file is a directory not file");
41354aa6d63Sopenharmony_ci        return false;
41454aa6d63Sopenharmony_ci    }
41554aa6d63Sopenharmony_ci    return true;
41654aa6d63Sopenharmony_ci}
41754aa6d63Sopenharmony_ci
41854aa6d63Sopenharmony_ciint64_t FileUtils::GetFileLen(const std::string& file)
41954aa6d63Sopenharmony_ci{
42054aa6d63Sopenharmony_ci    std::filesystem::path filePath = file;
42154aa6d63Sopenharmony_ci    bool flag = std::filesystem::exists(filePath) && std::filesystem::is_regular_file(filePath);
42254aa6d63Sopenharmony_ci    if (flag) {
42354aa6d63Sopenharmony_ci        return std::filesystem::file_size(filePath);
42454aa6d63Sopenharmony_ci    }
42554aa6d63Sopenharmony_ci    return -1;
42654aa6d63Sopenharmony_ci}
42754aa6d63Sopenharmony_ci
42854aa6d63Sopenharmony_civoid FileUtils::DelDir(const std::string& file)
42954aa6d63Sopenharmony_ci{
43054aa6d63Sopenharmony_ci    std::filesystem::path filePath = file;
43154aa6d63Sopenharmony_ci    bool flag = std::filesystem::is_directory(filePath);
43254aa6d63Sopenharmony_ci    if (flag) {
43354aa6d63Sopenharmony_ci        for (auto& p : std::filesystem::recursive_directory_iterator(filePath)) {
43454aa6d63Sopenharmony_ci            DelDir(p.path());
43554aa6d63Sopenharmony_ci        }
43654aa6d63Sopenharmony_ci    }
43754aa6d63Sopenharmony_ci    std::filesystem::remove(file);
43854aa6d63Sopenharmony_ci    return;
43954aa6d63Sopenharmony_ci}
44054aa6d63Sopenharmony_ci
44154aa6d63Sopenharmony_ci} // namespace SignatureTools
44254aa6d63Sopenharmony_ci} // namespace OHOS