1049e185fSopenharmony_ci/* 2049e185fSopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd. 3049e185fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4049e185fSopenharmony_ci * you may not use this file except in compliance with the License. 5049e185fSopenharmony_ci * You may obtain a copy of the License at 6049e185fSopenharmony_ci * 7049e185fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8049e185fSopenharmony_ci * 9049e185fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10049e185fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11049e185fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12049e185fSopenharmony_ci * See the License for the specific language governing permissions and 13049e185fSopenharmony_ci * limitations under the License. 14049e185fSopenharmony_ci */ 15049e185fSopenharmony_ci 16049e185fSopenharmony_ci#include "xml_parse.h" 17049e185fSopenharmony_ci#include "media_errors.h" 18049e185fSopenharmony_ci#include "media_log.h" 19049e185fSopenharmony_ci#include "string_ex.h" 20049e185fSopenharmony_ci 21049e185fSopenharmony_cinamespace { 22049e185fSopenharmony_ci constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, LOG_DOMAIN_PLAYER, "XmlParser"}; 23049e185fSopenharmony_ci} 24049e185fSopenharmony_ci 25049e185fSopenharmony_cinamespace OHOS { 26049e185fSopenharmony_cinamespace Media { 27049e185fSopenharmony_ciXmlParser::~XmlParser() 28049e185fSopenharmony_ci{ 29049e185fSopenharmony_ci Destroy(); 30049e185fSopenharmony_ci MEDIA_LOGD("0x%{public}06" PRIXPTR " Instances destroy", FAKE_POINTER(this)); 31049e185fSopenharmony_ci} 32049e185fSopenharmony_ci 33049e185fSopenharmony_cibool XmlParser::LoadConfiguration(const char *xmlPath) 34049e185fSopenharmony_ci{ 35049e185fSopenharmony_ci mDoc_ = xmlReadFile(xmlPath, nullptr, 0); 36049e185fSopenharmony_ci CHECK_AND_RETURN_RET_LOG(mDoc_ != nullptr, false, "XmlParser xmlReadFile failed"); 37049e185fSopenharmony_ci return true; 38049e185fSopenharmony_ci} 39049e185fSopenharmony_ci 40049e185fSopenharmony_cibool XmlParser::Parse() 41049e185fSopenharmony_ci{ 42049e185fSopenharmony_ci xmlNode *root = xmlDocGetRootElement(mDoc_); 43049e185fSopenharmony_ci CHECK_AND_RETURN_RET_LOG(root != nullptr, false, "XmlParser xmlDocGetRootElement failed"); 44049e185fSopenharmony_ci return ParseInternal(root); 45049e185fSopenharmony_ci} 46049e185fSopenharmony_ci 47049e185fSopenharmony_civoid XmlParser::Destroy() 48049e185fSopenharmony_ci{ 49049e185fSopenharmony_ci if (mDoc_ != nullptr) { 50049e185fSopenharmony_ci xmlFreeDoc(mDoc_); 51049e185fSopenharmony_ci } 52049e185fSopenharmony_ci return; 53049e185fSopenharmony_ci} 54049e185fSopenharmony_ci 55049e185fSopenharmony_cibool XmlParser::IsNumberArray(const std::vector<std::string> &strArray) const 56049e185fSopenharmony_ci{ 57049e185fSopenharmony_ci for (auto iter = strArray.begin(); iter != strArray.end(); iter++) { 58049e185fSopenharmony_ci for (char const &c : *iter) { 59049e185fSopenharmony_ci if (std::isdigit(c) == 0) { 60049e185fSopenharmony_ci return false; 61049e185fSopenharmony_ci } 62049e185fSopenharmony_ci } 63049e185fSopenharmony_ci } 64049e185fSopenharmony_ci return true; 65049e185fSopenharmony_ci} 66049e185fSopenharmony_ci 67049e185fSopenharmony_cibool XmlParser::TransStrAsRange(const std::string &str, Range &range) const 68049e185fSopenharmony_ci{ 69049e185fSopenharmony_ci CHECK_AND_RETURN_RET_LOG(str != "null", false, "str is null"); 70049e185fSopenharmony_ci CHECK_AND_RETURN_RET_LOG(str != "", false, "str is empty"); 71049e185fSopenharmony_ci size_t pos = str.find("-"); 72049e185fSopenharmony_ci if (pos != str.npos && pos + 1 < str.size()) { 73049e185fSopenharmony_ci std::string head = str.substr(0, pos); 74049e185fSopenharmony_ci std::string tail = str.substr(pos + 1); 75049e185fSopenharmony_ci bool ret = StrToInt(head, range.minVal); 76049e185fSopenharmony_ci CHECK_AND_RETURN_RET_LOG(ret == true, false, 77049e185fSopenharmony_ci "call StrToInt func false, input head is: %{public}s", head.c_str()); 78049e185fSopenharmony_ci 79049e185fSopenharmony_ci ret = StrToInt(tail, range.maxVal); 80049e185fSopenharmony_ci CHECK_AND_RETURN_RET_LOG(ret == true, false, 81049e185fSopenharmony_ci "call StrToInt func false, input tail is: %{public}s", tail.c_str()); 82049e185fSopenharmony_ci } else { 83049e185fSopenharmony_ci MEDIA_LOGD("Can not find the delimiter of \"-\" in : %{public}s", str.c_str()); 84049e185fSopenharmony_ci return false; 85049e185fSopenharmony_ci } 86049e185fSopenharmony_ci return true; 87049e185fSopenharmony_ci} 88049e185fSopenharmony_ci 89049e185fSopenharmony_cistd::vector<int32_t> XmlParser::TransStrAsIntegerArray(const std::vector<std::string> &spilt) const 90049e185fSopenharmony_ci{ 91049e185fSopenharmony_ci std::vector<int32_t> array; 92049e185fSopenharmony_ci for (auto iter = spilt.begin(); iter != spilt.end(); iter++) { 93049e185fSopenharmony_ci int32_t num = -1; 94049e185fSopenharmony_ci bool ret = StrToInt(*iter, num); 95049e185fSopenharmony_ci CHECK_AND_RETURN_RET_LOG(ret == true, array, 96049e185fSopenharmony_ci "call StrToInt func false, input str is: %{public}s", iter->c_str()); 97049e185fSopenharmony_ci array.push_back(num); 98049e185fSopenharmony_ci } 99049e185fSopenharmony_ci return array; 100049e185fSopenharmony_ci} 101049e185fSopenharmony_ci 102049e185fSopenharmony_cibool XmlParser::SpiltKeyList(const std::string &str, const std::string &delim, 103049e185fSopenharmony_ci std::vector<std::string> &spilt) const 104049e185fSopenharmony_ci{ 105049e185fSopenharmony_ci CHECK_AND_RETURN_RET_LOG(str != "", false, "str is null"); 106049e185fSopenharmony_ci std::string strAddDelim = str; 107049e185fSopenharmony_ci if (str.back() != delim.back()) { 108049e185fSopenharmony_ci strAddDelim = str + delim; 109049e185fSopenharmony_ci } 110049e185fSopenharmony_ci size_t size = strAddDelim.size(); 111049e185fSopenharmony_ci for (size_t i = 0; i < size; ++i) { 112049e185fSopenharmony_ci size_t pos = strAddDelim.find(delim, i); 113049e185fSopenharmony_ci if (pos != strAddDelim.npos) { 114049e185fSopenharmony_ci std::string s = strAddDelim.substr(i, pos - i); 115049e185fSopenharmony_ci spilt.push_back(s); 116049e185fSopenharmony_ci i = pos + delim.size() - 1; 117049e185fSopenharmony_ci } 118049e185fSopenharmony_ci } 119049e185fSopenharmony_ci return true; 120049e185fSopenharmony_ci} 121049e185fSopenharmony_ci 122049e185fSopenharmony_cibool XmlParser::SetCapabilityStringData(std::unordered_map<std::string, std::string&> dataMap, 123049e185fSopenharmony_ci const std::string &capabilityKey, const std::string &capabilityValue) const 124049e185fSopenharmony_ci{ 125049e185fSopenharmony_ci dataMap.at(capabilityKey) = capabilityValue; 126049e185fSopenharmony_ci return true; 127049e185fSopenharmony_ci} 128049e185fSopenharmony_ci 129049e185fSopenharmony_cibool XmlParser::SetCapabilityRangeData(std::unordered_map<std::string, Range&> dataMap, 130049e185fSopenharmony_ci const std::string &capabilityKey, const std::string &capabilityValue) const 131049e185fSopenharmony_ci{ 132049e185fSopenharmony_ci Range range; 133049e185fSopenharmony_ci bool ret = TransStrAsRange(capabilityValue, range); 134049e185fSopenharmony_ci CHECK_AND_RETURN_RET_LOG(ret != false, false, "failed:can not trans %{public}s", capabilityValue.c_str()); 135049e185fSopenharmony_ci dataMap.at(capabilityKey) = range; 136049e185fSopenharmony_ci return true; 137049e185fSopenharmony_ci} 138049e185fSopenharmony_ci} // namespace Media 139049e185fSopenharmony_ci} // namespace OHOS