FFernweherrcode fix
9e3ba8f7创建于 5月13日历史提交
/*
 * Copyright (c) Huawei Device Co., Ltd. 2026-2026. All rights reserved.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "utils.h"

namespace OHOS {
namespace ObjectEditor {
// LCOV_EXCL_START
bool IsValidOEid(const std::string &uuid)
{
    if (uuid.size() == LENGTH_HYPHEN) {
        if (uuid[DASH_FIRST] != '-' || uuid[DASH_SECOND] != '-' || uuid[DASH_THREE] != '-' || uuid[DASH_FOUR] != '-') {
            return false;
        }
        for (size_t i = 0; i < uuid.size(); i++) {
            const char c = uuid[i];
            if (c == '-') {
                continue;
            }
            if (HexToNibble(c) < 0) {
                return false;
            }
        }
        return true;
    } else if (uuid.size() == LENGTH) {
        for (size_t i = 0; i < uuid.size(); i++) {
            if (HexToNibble(uuid[i]) < 0) {
                return false;
            }
        }
        return true;
    }
    return false;
}

std::optional<CLSID> ParseOEidToClsid(const std::string &uuid)
{
    std::array<char, LENGTH> hex{};
    if (uuid.size() == LENGTH_HYPHEN) {
        if (uuid[DASH_FIRST] != '-' || uuid[DASH_SECOND] != '-' || uuid[DASH_THREE] != '-' || uuid[DASH_FOUR] != '-')
            return std::nullopt;
        size_t j = 0;
        for (size_t i = 0; i < uuid.size(); i++) {
            const char c = uuid[i];
            if (c == '-') {
                continue;
            }
            if (j >= hex.size())
                return std::nullopt;
            hex[j++] = c;
        }
        if (j != hex.size()) {
            return std::nullopt;
        }
    } else if (uuid.size() == LENGTH) {
        for (size_t i = 0; i < hex.size(); i++) {
            hex[i] = uuid[i];
        }
    } else {
        return std::nullopt;
    }
    CLSID canonical{};
    for (size_t i = 0; i < canonical.size(); i++) {
        const int hi = HexToNibble(hex[i * 2]);
        const int lo = HexToNibble(hex[i * 2 + 1]);
        if (hi < 0 || lo < 0) {
            return std::nullopt;
        }
        canonical[i] = static_cast<uint8_t>((static_cast<unsigned>(hi) <<
            FOUR_BYTE_SIZE) | static_cast<unsigned>(lo));
    }
    CLSID clsid{};
    clsid[INDEX_ZERO] = canonical[INDEX_THREE];
    clsid[INDEX_ONE] = canonical[INDEX_TWO];
    clsid[INDEX_TWO] = canonical[INDEX_ONE];
    clsid[INDEX_THREE] = canonical[INDEX_ZERO];
    clsid[INDEX_FOUR] = canonical[INDEX_FIVE];
    clsid[INDEX_FIVE] = canonical[INDEX_FOUR];
    clsid[INDEX_SIX] = canonical[INDEX_SEVEN];
    clsid[INDEX_SEVEN] = canonical[INDEX_SIX];
    for (size_t i = 0; i < OFFSET; i++) {
        clsid[OFFSET + i] = canonical[OFFSET + i];
    }
    return clsid;
}

std::string FormatClsidToOEid(const CLSID &clsid)
{
    CLSID canonical{};
    canonical[INDEX_ZERO] = clsid[INDEX_THREE];
    canonical[INDEX_ONE] = clsid[INDEX_TWO];
    canonical[INDEX_TWO] = clsid[INDEX_ONE];
    canonical[INDEX_THREE] = clsid[INDEX_ZERO];
    canonical[INDEX_FOUR] = clsid[INDEX_FIVE];
    canonical[INDEX_FIVE] = clsid[INDEX_FOUR];
    canonical[INDEX_SIX] = clsid[INDEX_SEVEN];
    canonical[INDEX_SEVEN] = clsid[INDEX_SIX];
    for (size_t i = 0; i < OFFSET; i++) {
        canonical[OFFSET + i] = clsid[OFFSET + i];
    }

    static constexpr char kHex[] = "0123456789ABCDEF";
    std::string out;
    out.reserve(LENGTH_HYPHEN);
    for (size_t i = 0; i < canonical.size(); i++) {
        if (i == DASH_FIRST_INSERT || i == DASH_SECOND_INSERT || i == DASH_THREE_INSERT || i == DASH_FOUR_INSERT) {
            out.push_back('-');
        }
        const uint8_t v = canonical[i];
        out.push_back(kHex[(v >> FOUR_BYTE_SIZE) & 0x0F]);
        out.push_back(kHex[v & 0x0F]);
    }
    return out;
}
// LCOV_EXCL_STOP
}  // namespace ObjectEditor
}  // namespace OHOS