1ca0551cfSopenharmony_ci/* 2ca0551cfSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 3ca0551cfSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4ca0551cfSopenharmony_ci * you may not use this file except in compliance with the License. 5ca0551cfSopenharmony_ci * You may obtain a copy of the License at 6ca0551cfSopenharmony_ci * 7ca0551cfSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8ca0551cfSopenharmony_ci * 9ca0551cfSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10ca0551cfSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11ca0551cfSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12ca0551cfSopenharmony_ci * See the License for the specific language governing permissions and 13ca0551cfSopenharmony_ci * limitations under the License. 14ca0551cfSopenharmony_ci */ 15ca0551cfSopenharmony_ci 16ca0551cfSopenharmony_ci#include "util/options.h" 17ca0551cfSopenharmony_ci 18ca0551cfSopenharmony_ci#include <cstdio> 19ca0551cfSopenharmony_ci#include <cstring> 20ca0551cfSopenharmony_ci#include <dirent.h> 21ca0551cfSopenharmony_ci#include <getopt.h> 22ca0551cfSopenharmony_ci#include <sys/stat.h> 23ca0551cfSopenharmony_ci#include <unistd.h> 24ca0551cfSopenharmony_ci 25ca0551cfSopenharmony_ci#include <map> 26ca0551cfSopenharmony_ci 27ca0551cfSopenharmony_ci#include "util/common.h" 28ca0551cfSopenharmony_ci#include "util/file.h" 29ca0551cfSopenharmony_ci#include "util/logger.h" 30ca0551cfSopenharmony_ci#include "util/string_helper.h" 31ca0551cfSopenharmony_ci#include "util/string_builder.h" 32ca0551cfSopenharmony_ci 33ca0551cfSopenharmony_cinamespace OHOS { 34ca0551cfSopenharmony_cinamespace Idl { 35ca0551cfSopenharmony_ciconst char *Options::optSupportArgs = "hvcs:m:p:d:r:o:D:t:"; 36ca0551cfSopenharmony_cistatic struct option g_longOpts[] = { 37ca0551cfSopenharmony_ci {"help", no_argument, nullptr, 'h'}, 38ca0551cfSopenharmony_ci {"version", no_argument, nullptr, 'v'}, 39ca0551cfSopenharmony_ci {"system", required_argument, nullptr, 'S'}, 40ca0551cfSopenharmony_ci {"mode", required_argument, nullptr, 'm'}, 41ca0551cfSopenharmony_ci {"gen-c", no_argument, nullptr, '1'}, 42ca0551cfSopenharmony_ci {"gen-cpp", no_argument, nullptr, '2'}, 43ca0551cfSopenharmony_ci {"gen-java", no_argument, nullptr, '3'}, 44ca0551cfSopenharmony_ci {"gen-rust", no_argument, nullptr, '4'}, 45ca0551cfSopenharmony_ci {"gen-ts", no_argument, nullptr, '5'}, 46ca0551cfSopenharmony_ci {"package", required_argument, nullptr, 'p'}, 47ca0551cfSopenharmony_ci {"dump-ast", no_argument, nullptr, 'a'}, 48ca0551cfSopenharmony_ci {"dump-metadata", no_argument, nullptr, 'e'}, 49ca0551cfSopenharmony_ci {"hash", no_argument, nullptr, 'H'}, 50ca0551cfSopenharmony_ci {"log-domainid", required_argument, nullptr, 'i'}, 51ca0551cfSopenharmony_ci {"log-tag", required_argument, nullptr, 'g'}, 52ca0551cfSopenharmony_ci {"intf-type", required_argument, nullptr, 'T'}, 53ca0551cfSopenharmony_ci {nullptr, 0, nullptr, 0 } 54ca0551cfSopenharmony_ci}; 55ca0551cfSopenharmony_ci 56ca0551cfSopenharmony_ciOptions &Options::GetInstance() 57ca0551cfSopenharmony_ci{ 58ca0551cfSopenharmony_ci static Options option; 59ca0551cfSopenharmony_ci return option; 60ca0551cfSopenharmony_ci} 61ca0551cfSopenharmony_ci 62ca0551cfSopenharmony_cibool Options::Parse(int argc, char *argv[]) 63ca0551cfSopenharmony_ci{ 64ca0551cfSopenharmony_ci int ret = true; 65ca0551cfSopenharmony_ci program = argv[0]; 66ca0551cfSopenharmony_ci opterr = 0; 67ca0551cfSopenharmony_ci int op = 0; 68ca0551cfSopenharmony_ci int optIndex = 0; 69ca0551cfSopenharmony_ci 70ca0551cfSopenharmony_ci while ((op = getopt_long_only(argc, argv, optSupportArgs, g_longOpts, &optIndex)) != -1) { 71ca0551cfSopenharmony_ci if (optind > 0 && optind <= argc) { 72ca0551cfSopenharmony_ci ret = ParseSingle(op, std::string(argv[optind - 1])); 73ca0551cfSopenharmony_ci } 74ca0551cfSopenharmony_ci } 75ca0551cfSopenharmony_ci 76ca0551cfSopenharmony_ci if (doCompile) { 77ca0551cfSopenharmony_ci int i = 0; 78ca0551cfSopenharmony_ci while (++i < argc) { 79ca0551cfSopenharmony_ci if (argv[i][0] != '-' && StringHelper::EndWith(argv[i], ".idl")) { 80ca0551cfSopenharmony_ci AddSources(argv[i]); 81ca0551cfSopenharmony_ci } 82ca0551cfSopenharmony_ci } 83ca0551cfSopenharmony_ci } 84ca0551cfSopenharmony_ci 85ca0551cfSopenharmony_ci return ret ? CheckOptions() : ret; 86ca0551cfSopenharmony_ci} 87ca0551cfSopenharmony_ci 88ca0551cfSopenharmony_cibool Options::ParseSingle(int option, std::string optVal) 89ca0551cfSopenharmony_ci{ 90ca0551cfSopenharmony_ci bool ret = true; 91ca0551cfSopenharmony_ci switch (option) { 92ca0551cfSopenharmony_ci case 'h': 93ca0551cfSopenharmony_ci doShowUsage = true; 94ca0551cfSopenharmony_ci break; 95ca0551cfSopenharmony_ci case 'v': 96ca0551cfSopenharmony_ci doShowVersion = true; 97ca0551cfSopenharmony_ci break; 98ca0551cfSopenharmony_ci case 'a': 99ca0551cfSopenharmony_ci doDumpAST = true; 100ca0551cfSopenharmony_ci break; 101ca0551cfSopenharmony_ci case 'e': 102ca0551cfSopenharmony_ci doDumpMetadata = true; 103ca0551cfSopenharmony_ci break; 104ca0551cfSopenharmony_ci case 'H': 105ca0551cfSopenharmony_ci doHashKey = true; 106ca0551cfSopenharmony_ci break; 107ca0551cfSopenharmony_ci case 'c': 108ca0551cfSopenharmony_ci doCompile = true; 109ca0551cfSopenharmony_ci break; 110ca0551cfSopenharmony_ci case '1': 111ca0551cfSopenharmony_ci SetLanguage("c"); 112ca0551cfSopenharmony_ci break; 113ca0551cfSopenharmony_ci case '2': 114ca0551cfSopenharmony_ci SetLanguage("cpp"); 115ca0551cfSopenharmony_ci break; 116ca0551cfSopenharmony_ci case '3': 117ca0551cfSopenharmony_ci SetLanguage("java"); 118ca0551cfSopenharmony_ci break; 119ca0551cfSopenharmony_ci case '4': 120ca0551cfSopenharmony_ci SetLanguage("rust"); 121ca0551cfSopenharmony_ci break; 122ca0551cfSopenharmony_ci case '5': 123ca0551cfSopenharmony_ci SetLanguage("ts"); 124ca0551cfSopenharmony_ci break; 125ca0551cfSopenharmony_ci default: 126ca0551cfSopenharmony_ci ret = ParseOptionWithValue(option, optVal); 127ca0551cfSopenharmony_ci break; 128ca0551cfSopenharmony_ci } 129ca0551cfSopenharmony_ci return ret; 130ca0551cfSopenharmony_ci} 131ca0551cfSopenharmony_ci 132ca0551cfSopenharmony_cibool Options::ParseOptionWithValue(int option, std::string optVal) 133ca0551cfSopenharmony_ci{ 134ca0551cfSopenharmony_ci bool ret = true; 135ca0551cfSopenharmony_ci StringBuilder errors; 136ca0551cfSopenharmony_ci 137ca0551cfSopenharmony_ci switch (option) { 138ca0551cfSopenharmony_ci case 'o': 139ca0551cfSopenharmony_ci outPutFile = optarg; 140ca0551cfSopenharmony_ci break; 141ca0551cfSopenharmony_ci case 'S': 142ca0551cfSopenharmony_ci ret = SetSystemLevel(optarg); 143ca0551cfSopenharmony_ci break; 144ca0551cfSopenharmony_ci case 'm': 145ca0551cfSopenharmony_ci ret = SetGenerateMode(optarg); 146ca0551cfSopenharmony_ci break; 147ca0551cfSopenharmony_ci case 's': 148ca0551cfSopenharmony_ci SetMetadataFile(optarg); 149ca0551cfSopenharmony_ci break; 150ca0551cfSopenharmony_ci case 'p': 151ca0551cfSopenharmony_ci SetPackage(optarg); 152ca0551cfSopenharmony_ci break; 153ca0551cfSopenharmony_ci case 'D': 154ca0551cfSopenharmony_ci AddSourcesByDir(optarg); 155ca0551cfSopenharmony_ci break; 156ca0551cfSopenharmony_ci case 'd': 157ca0551cfSopenharmony_ci SetOutDir(optarg); 158ca0551cfSopenharmony_ci break; 159ca0551cfSopenharmony_ci case 'r': 160ca0551cfSopenharmony_ci ret = AddPackagePath(optarg); 161ca0551cfSopenharmony_ci break; 162ca0551cfSopenharmony_ci case 't': 163ca0551cfSopenharmony_ci ret = SetHiTrace(optarg); 164ca0551cfSopenharmony_ci break; 165ca0551cfSopenharmony_ci case 'i': 166ca0551cfSopenharmony_ci ret = SetLogDomainId(optarg); 167ca0551cfSopenharmony_ci break; 168ca0551cfSopenharmony_ci case 'g': 169ca0551cfSopenharmony_ci ret = SetLogTag(optarg); 170ca0551cfSopenharmony_ci break; 171ca0551cfSopenharmony_ci case 'T': 172ca0551cfSopenharmony_ci ret = SetInterfaceType(optarg); 173ca0551cfSopenharmony_ci break; 174ca0551cfSopenharmony_ci default: 175ca0551cfSopenharmony_ci errors.Append(optVal.c_str()); 176ca0551cfSopenharmony_ci break; 177ca0551cfSopenharmony_ci } 178ca0551cfSopenharmony_ci illegalOptions = errors.ToString(); 179ca0551cfSopenharmony_ci return ret; 180ca0551cfSopenharmony_ci} 181ca0551cfSopenharmony_ci 182ca0551cfSopenharmony_cibool Options::SetSystemLevel(const std::string &system) 183ca0551cfSopenharmony_ci{ 184ca0551cfSopenharmony_ci static std::map<std::string, SystemLevel> systemLevelMap = { 185ca0551cfSopenharmony_ci {"mini", SystemLevel::MINI}, 186ca0551cfSopenharmony_ci {"lite", SystemLevel::LITE}, 187ca0551cfSopenharmony_ci {"full", SystemLevel::FULL}, 188ca0551cfSopenharmony_ci }; 189ca0551cfSopenharmony_ci 190ca0551cfSopenharmony_ci auto levelIter = systemLevelMap.find(system); 191ca0551cfSopenharmony_ci if (levelIter == systemLevelMap.end()) { 192ca0551cfSopenharmony_ci Logger::E(TAG, "invalid system level set: '%s', please input mini/lite/full", system.c_str()); 193ca0551cfSopenharmony_ci return false; 194ca0551cfSopenharmony_ci } 195ca0551cfSopenharmony_ci systemLevel = levelIter->second; 196ca0551cfSopenharmony_ci return true; 197ca0551cfSopenharmony_ci} 198ca0551cfSopenharmony_ci 199ca0551cfSopenharmony_cibool Options::SetGenerateMode(const std::string &mode) 200ca0551cfSopenharmony_ci{ 201ca0551cfSopenharmony_ci static std::map<std::string, GenMode> codeGenMap = { 202ca0551cfSopenharmony_ci {"low", GenMode::LOW}, 203ca0551cfSopenharmony_ci {"passthrough", GenMode::PASSTHROUGH}, 204ca0551cfSopenharmony_ci {"ipc", GenMode::IPC}, 205ca0551cfSopenharmony_ci {"kernel", GenMode::KERNEL}, 206ca0551cfSopenharmony_ci }; 207ca0551cfSopenharmony_ci 208ca0551cfSopenharmony_ci auto codeGenIter = codeGenMap.find(mode); 209ca0551cfSopenharmony_ci if (codeGenIter == codeGenMap.end()) { 210ca0551cfSopenharmony_ci Logger::E(TAG, "invalid generate mode set: '%s', please input low/passthrough/ipc/kernel/sa.", mode.c_str()); 211ca0551cfSopenharmony_ci return false; 212ca0551cfSopenharmony_ci } 213ca0551cfSopenharmony_ci genMode = codeGenIter->second; 214ca0551cfSopenharmony_ci return true; 215ca0551cfSopenharmony_ci} 216ca0551cfSopenharmony_ci 217ca0551cfSopenharmony_cibool Options::SetLanguage(const std::string &language) 218ca0551cfSopenharmony_ci{ 219ca0551cfSopenharmony_ci static const std::map<std::string, Language> languageMap = { 220ca0551cfSopenharmony_ci {"c", Language::C}, 221ca0551cfSopenharmony_ci {"cpp", Language::CPP}, 222ca0551cfSopenharmony_ci {"java", Language::JAVA}, 223ca0551cfSopenharmony_ci {"rust", Language::RUST}, 224ca0551cfSopenharmony_ci {"ts", Language::TS}, 225ca0551cfSopenharmony_ci }; 226ca0551cfSopenharmony_ci 227ca0551cfSopenharmony_ci const auto kindIter = languageMap.find(language); 228ca0551cfSopenharmony_ci if (kindIter == languageMap.end()) { 229ca0551cfSopenharmony_ci Logger::E(TAG, "invalid language '%s', please input c, cpp, java, rust or ts", language.c_str()); 230ca0551cfSopenharmony_ci return false; 231ca0551cfSopenharmony_ci } 232ca0551cfSopenharmony_ci 233ca0551cfSopenharmony_ci doGenerateCode = true; 234ca0551cfSopenharmony_ci genLanguage = kindIter->second; 235ca0551cfSopenharmony_ci return true; 236ca0551cfSopenharmony_ci} 237ca0551cfSopenharmony_ci 238ca0551cfSopenharmony_cibool Options::SetMetadataFile(const std::string &file) 239ca0551cfSopenharmony_ci{ 240ca0551cfSopenharmony_ci doSaveMetadata = true; 241ca0551cfSopenharmony_ci metadataFile = file; 242ca0551cfSopenharmony_ci return true; 243ca0551cfSopenharmony_ci} 244ca0551cfSopenharmony_ci 245ca0551cfSopenharmony_civoid Options::SetPackage(const std::string &infPackage) 246ca0551cfSopenharmony_ci{ 247ca0551cfSopenharmony_ci idlPackage = infPackage; 248ca0551cfSopenharmony_ci} 249ca0551cfSopenharmony_ci 250ca0551cfSopenharmony_civoid Options::AddSources(const std::string &sourceFile) 251ca0551cfSopenharmony_ci{ 252ca0551cfSopenharmony_ci std::string realPath = File::AdapterRealPath(sourceFile); 253ca0551cfSopenharmony_ci if (realPath.empty()) { 254ca0551cfSopenharmony_ci Logger::E(TAG, "invalid idl file path:%s", sourceFile.c_str()); 255ca0551cfSopenharmony_ci return; 256ca0551cfSopenharmony_ci } 257ca0551cfSopenharmony_ci 258ca0551cfSopenharmony_ci if (sourceFiles.insert(realPath).second == false) { 259ca0551cfSopenharmony_ci Logger::E(TAG, "this idl file has been add:%s", sourceFile.c_str()); 260ca0551cfSopenharmony_ci return; 261ca0551cfSopenharmony_ci } 262ca0551cfSopenharmony_ci} 263ca0551cfSopenharmony_ci 264ca0551cfSopenharmony_civoid Options::AddSourcesByDir(const std::string &dir) 265ca0551cfSopenharmony_ci{ 266ca0551cfSopenharmony_ci sourceDir = dir; 267ca0551cfSopenharmony_ci std::set<std::string> files = File::FindFiles(sourceDir); 268ca0551cfSopenharmony_ci if (!files.empty()) { 269ca0551cfSopenharmony_ci doCompile = true; 270ca0551cfSopenharmony_ci sourceFiles.insert(files.begin(), files.end()); 271ca0551cfSopenharmony_ci } 272ca0551cfSopenharmony_ci} 273ca0551cfSopenharmony_ci 274ca0551cfSopenharmony_cibool Options::AddPackagePath(const std::string &packagePath) 275ca0551cfSopenharmony_ci{ 276ca0551cfSopenharmony_ci size_t index = packagePath.find(":"); 277ca0551cfSopenharmony_ci if (index == std::string::npos || index == packagePath.size() - 1) { 278ca0551cfSopenharmony_ci Logger::E(TAG, "invalid option parameters '%s'.", packagePath.c_str()); 279ca0551cfSopenharmony_ci return false; 280ca0551cfSopenharmony_ci } 281ca0551cfSopenharmony_ci 282ca0551cfSopenharmony_ci std::string package = packagePath.substr(0, index); 283ca0551cfSopenharmony_ci std::string path = File::AdapterRealPath(packagePath.substr(index + 1)); 284ca0551cfSopenharmony_ci if (path.empty()) { 285ca0551cfSopenharmony_ci Logger::E(TAG, "invalid path '%s'.", packagePath.substr(index + 1).c_str()); 286ca0551cfSopenharmony_ci return false; 287ca0551cfSopenharmony_ci } 288ca0551cfSopenharmony_ci 289ca0551cfSopenharmony_ci auto it = packagePathMap.find(package); 290ca0551cfSopenharmony_ci if (it != packagePathMap.end()) { 291ca0551cfSopenharmony_ci Logger::E(TAG, "The '%s:%s' has been set.", package.c_str(), path.c_str()); 292ca0551cfSopenharmony_ci return false; 293ca0551cfSopenharmony_ci } 294ca0551cfSopenharmony_ci 295ca0551cfSopenharmony_ci packagePathMap[package] = path; 296ca0551cfSopenharmony_ci return true; 297ca0551cfSopenharmony_ci} 298ca0551cfSopenharmony_ci 299ca0551cfSopenharmony_civoid Options::SetOutDir(const std::string &dir) 300ca0551cfSopenharmony_ci{ 301ca0551cfSopenharmony_ci doOutDir = true; 302ca0551cfSopenharmony_ci genDir = dir; 303ca0551cfSopenharmony_ci} 304ca0551cfSopenharmony_ci 305ca0551cfSopenharmony_cibool Options::CheckOptions() 306ca0551cfSopenharmony_ci{ 307ca0551cfSopenharmony_ci if (doShowUsage || doShowVersion) { 308ca0551cfSopenharmony_ci return true; 309ca0551cfSopenharmony_ci } 310ca0551cfSopenharmony_ci if (HasErrors()) { 311ca0551cfSopenharmony_ci ShowErrors(); 312ca0551cfSopenharmony_ci return false; 313ca0551cfSopenharmony_ci } 314ca0551cfSopenharmony_ci if (interfaceType == InterfaceType::SA) { 315ca0551cfSopenharmony_ci return CheckSaOptions(); 316ca0551cfSopenharmony_ci } else if (interfaceType == InterfaceType::HDI) { 317ca0551cfSopenharmony_ci return CheckHdiOptions(); 318ca0551cfSopenharmony_ci } else if (interfaceType == InterfaceType::SM || 319ca0551cfSopenharmony_ci interfaceType == InterfaceType::SAM || 320ca0551cfSopenharmony_ci interfaceType == InterfaceType::SAM_SM || 321ca0551cfSopenharmony_ci interfaceType == InterfaceType::SAM_UDS || 322ca0551cfSopenharmony_ci interfaceType == InterfaceType::SM_UDS) { 323ca0551cfSopenharmony_ci return CheckSmOptions(); 324ca0551cfSopenharmony_ci } else { 325ca0551cfSopenharmony_ci Logger::E(TAG, "Interface type 'intf-type' value '%d' invalid, please input 'hdi' or 'sa'.", interfaceType); 326ca0551cfSopenharmony_ci return false; 327ca0551cfSopenharmony_ci } 328ca0551cfSopenharmony_ci} 329ca0551cfSopenharmony_ci 330ca0551cfSopenharmony_cibool Options::CheckSaOptions() 331ca0551cfSopenharmony_ci{ 332ca0551cfSopenharmony_ci if (!DoSupportSaType()) { 333ca0551cfSopenharmony_ci return false; 334ca0551cfSopenharmony_ci } 335ca0551cfSopenharmony_ci 336ca0551cfSopenharmony_ci if (sourceFiles.empty() && !DoSaveMetadata()) { 337ca0551cfSopenharmony_ci Logger::E(TAG, "Option 'intf-type sa' must set idl file."); 338ca0551cfSopenharmony_ci return false; 339ca0551cfSopenharmony_ci } 340ca0551cfSopenharmony_ci 341ca0551cfSopenharmony_ci if (!DoLegalLog()) { 342ca0551cfSopenharmony_ci Logger::E(TAG, "Option 'log-domainid' and 'log-tag' must be used together."); 343ca0551cfSopenharmony_ci return false; 344ca0551cfSopenharmony_ci } 345ca0551cfSopenharmony_ci 346ca0551cfSopenharmony_ci attribute.doHitrace = doHitrace; 347ca0551cfSopenharmony_ci attribute.hitraceTag = hitraceTag; 348ca0551cfSopenharmony_ci attribute.logTag = logTag; 349ca0551cfSopenharmony_ci attribute.domainId = domainId; 350ca0551cfSopenharmony_ci attribute.doLog = DoLogOn(); 351ca0551cfSopenharmony_ci 352ca0551cfSopenharmony_ci return true; 353ca0551cfSopenharmony_ci} 354ca0551cfSopenharmony_ci 355ca0551cfSopenharmony_cibool Options::DoSupportSaType() 356ca0551cfSopenharmony_ci{ 357ca0551cfSopenharmony_ci bool ret = true; 358ca0551cfSopenharmony_ci if (genLanguage != Language::CPP && genLanguage != Language::RUST && genLanguage != Language::TS) { 359ca0551cfSopenharmony_ci Logger::E(TAG, "Option 'intf-type sa' only support language option 'gen-cpp', 'gen-rust' or 'gen-ts'."); 360ca0551cfSopenharmony_ci ret = false; 361ca0551cfSopenharmony_ci } 362ca0551cfSopenharmony_ci 363ca0551cfSopenharmony_ci if (systemLevel != SystemLevel::INIT) { 364ca0551cfSopenharmony_ci Logger::E(TAG, "Option 'intf-type sa' not support option 'system'."); 365ca0551cfSopenharmony_ci ret = false; 366ca0551cfSopenharmony_ci } 367ca0551cfSopenharmony_ci 368ca0551cfSopenharmony_ci if (genMode != GenMode::INIT) { 369ca0551cfSopenharmony_ci Logger::E(TAG, "Option 'intf-type sa' not support option 'm' or 'mode'."); 370ca0551cfSopenharmony_ci ret = false; 371ca0551cfSopenharmony_ci } 372ca0551cfSopenharmony_ci 373ca0551cfSopenharmony_ci if (!idlPackage.empty()) { 374ca0551cfSopenharmony_ci Logger::E(TAG, "Option 'intf-type sa' not support option 'p' or 'package'."); 375ca0551cfSopenharmony_ci ret = false; 376ca0551cfSopenharmony_ci } 377ca0551cfSopenharmony_ci 378ca0551cfSopenharmony_ci if (doHashKey) { 379ca0551cfSopenharmony_ci Logger::E(TAG, "Option 'intf-type sa' not support option 'hash'."); 380ca0551cfSopenharmony_ci ret = false; 381ca0551cfSopenharmony_ci } 382ca0551cfSopenharmony_ci 383ca0551cfSopenharmony_ci if (!packagePathMap.empty()) { 384ca0551cfSopenharmony_ci Logger::E(TAG, "Option 'intf-type sa' not support option 'r'."); 385ca0551cfSopenharmony_ci ret = false; 386ca0551cfSopenharmony_ci } 387ca0551cfSopenharmony_ci 388ca0551cfSopenharmony_ci if (!sourceDir.empty()) { 389ca0551cfSopenharmony_ci Logger::E(TAG, "Option 'intf-type sa' not support option 'D'."); 390ca0551cfSopenharmony_ci ret = false; 391ca0551cfSopenharmony_ci } 392ca0551cfSopenharmony_ci 393ca0551cfSopenharmony_ci if (!outPutFile.empty()) { 394ca0551cfSopenharmony_ci Logger::E(TAG, "Option 'intf-type sa' not support option 'o'."); 395ca0551cfSopenharmony_ci ret = false; 396ca0551cfSopenharmony_ci } 397ca0551cfSopenharmony_ci 398ca0551cfSopenharmony_ci if (!ret) { 399ca0551cfSopenharmony_ci printf("Use \"-h, --help\" to show usage.\n"); 400ca0551cfSopenharmony_ci } 401ca0551cfSopenharmony_ci return ret; 402ca0551cfSopenharmony_ci} 403ca0551cfSopenharmony_ci 404ca0551cfSopenharmony_cibool Options::CheckHdiOptions() 405ca0551cfSopenharmony_ci{ 406ca0551cfSopenharmony_ci SetHdiDefaultOption(); 407ca0551cfSopenharmony_ci if (!DoSupportHdiType()) { 408ca0551cfSopenharmony_ci return false; 409ca0551cfSopenharmony_ci } 410ca0551cfSopenharmony_ci 411ca0551cfSopenharmony_ci if (doCompile) { 412ca0551cfSopenharmony_ci if (!DoGetHashKey() && !doDumpAST && !doGenerateCode && !doOutDir) { 413ca0551cfSopenharmony_ci Logger::E(TAG, "nothing to do."); 414ca0551cfSopenharmony_ci return false; 415ca0551cfSopenharmony_ci } 416ca0551cfSopenharmony_ci 417ca0551cfSopenharmony_ci if (!doGenerateCode && doOutDir) { 418ca0551cfSopenharmony_ci Logger::E(TAG, "no target language."); 419ca0551cfSopenharmony_ci return false; 420ca0551cfSopenharmony_ci } 421ca0551cfSopenharmony_ci 422ca0551cfSopenharmony_ci if (doGenerateCode && !doOutDir) { 423ca0551cfSopenharmony_ci Logger::E(TAG, "no out directory."); 424ca0551cfSopenharmony_ci return false; 425ca0551cfSopenharmony_ci } 426ca0551cfSopenharmony_ci } else { 427ca0551cfSopenharmony_ci if (DoGetHashKey() || doDumpAST || doGenerateCode || doOutDir) { 428ca0551cfSopenharmony_ci Logger::E(TAG, "no idl files."); 429ca0551cfSopenharmony_ci return false; 430ca0551cfSopenharmony_ci } 431ca0551cfSopenharmony_ci } 432ca0551cfSopenharmony_ci 433ca0551cfSopenharmony_ci return true; 434ca0551cfSopenharmony_ci} 435ca0551cfSopenharmony_ci 436ca0551cfSopenharmony_civoid Options::SetHdiDefaultOption() 437ca0551cfSopenharmony_ci{ 438ca0551cfSopenharmony_ci if (systemLevel == SystemLevel::INIT) { 439ca0551cfSopenharmony_ci systemLevel = SystemLevel::FULL; 440ca0551cfSopenharmony_ci } 441ca0551cfSopenharmony_ci if (genMode == GenMode::INIT) { 442ca0551cfSopenharmony_ci genMode = GenMode::IPC; 443ca0551cfSopenharmony_ci } 444ca0551cfSopenharmony_ci return; 445ca0551cfSopenharmony_ci} 446ca0551cfSopenharmony_ci 447ca0551cfSopenharmony_cibool Options::DoSupportHdiType() 448ca0551cfSopenharmony_ci{ 449ca0551cfSopenharmony_ci bool ret = true; 450ca0551cfSopenharmony_ci 451ca0551cfSopenharmony_ci if (genLanguage != Language::C && genLanguage != Language::CPP && genLanguage != Language::JAVA) { 452ca0551cfSopenharmony_ci Logger::E(TAG, "Option 'intf-type hdi' only support language option 'gen-c', 'gen-cpp' or 'gen-java'."); 453ca0551cfSopenharmony_ci ret = false; 454ca0551cfSopenharmony_ci } 455ca0551cfSopenharmony_ci 456ca0551cfSopenharmony_ci if (doDumpMetadata) { 457ca0551cfSopenharmony_ci Logger::E(TAG, "Option 'intf-type hdi' not support option 'dump-metadata'."); 458ca0551cfSopenharmony_ci ret = false; 459ca0551cfSopenharmony_ci } 460ca0551cfSopenharmony_ci 461ca0551cfSopenharmony_ci if (doKeywords) { 462ca0551cfSopenharmony_ci Logger::E(TAG, "Option 'intf-type hdi' not support option '-t', '-log-domainid' or '-log-tag'."); 463ca0551cfSopenharmony_ci ret = false; 464ca0551cfSopenharmony_ci } 465ca0551cfSopenharmony_ci 466ca0551cfSopenharmony_ci if (doSaveMetadata) { 467ca0551cfSopenharmony_ci Logger::E(TAG, "Option 'intf-type hdi' not support option '-s'."); 468ca0551cfSopenharmony_ci ret = false; 469ca0551cfSopenharmony_ci } 470ca0551cfSopenharmony_ci 471ca0551cfSopenharmony_ci if (!ret) { 472ca0551cfSopenharmony_ci printf("Use \"-h, --help\" to show usage.\n"); 473ca0551cfSopenharmony_ci } 474ca0551cfSopenharmony_ci return ret; 475ca0551cfSopenharmony_ci} 476ca0551cfSopenharmony_ci 477ca0551cfSopenharmony_cibool Options::DoSupportSmType() 478ca0551cfSopenharmony_ci{ 479ca0551cfSopenharmony_ci bool ret = true; 480ca0551cfSopenharmony_ci 481ca0551cfSopenharmony_ci if (genLanguage != Language::CPP && genLanguage != Language::JAVA) { 482ca0551cfSopenharmony_ci Logger::E(TAG, "Option 'intf-type sm' only support language option 'gen-cpp' or 'gen-java'."); 483ca0551cfSopenharmony_ci ret = false; 484ca0551cfSopenharmony_ci } 485ca0551cfSopenharmony_ci 486ca0551cfSopenharmony_ci if (doDumpMetadata) { 487ca0551cfSopenharmony_ci Logger::E(TAG, "Option 'intf-type sm' not support option 'dump-metadata'."); 488ca0551cfSopenharmony_ci ret = false; 489ca0551cfSopenharmony_ci } 490ca0551cfSopenharmony_ci 491ca0551cfSopenharmony_ci if (doKeywords) { 492ca0551cfSopenharmony_ci Logger::E(TAG, "Option 'intf-type sm' not support option '-t', '-log-domainid' or '-log-tag'."); 493ca0551cfSopenharmony_ci ret = false; 494ca0551cfSopenharmony_ci } 495ca0551cfSopenharmony_ci 496ca0551cfSopenharmony_ci if (doSaveMetadata) { 497ca0551cfSopenharmony_ci Logger::E(TAG, "Option 'intf-type sm' not support option '-s'."); 498ca0551cfSopenharmony_ci ret = false; 499ca0551cfSopenharmony_ci } 500ca0551cfSopenharmony_ci 501ca0551cfSopenharmony_ci if (!ret) { 502ca0551cfSopenharmony_ci printf("Use \"-h, --help\" to show usage.\n"); 503ca0551cfSopenharmony_ci } 504ca0551cfSopenharmony_ci return ret; 505ca0551cfSopenharmony_ci} 506ca0551cfSopenharmony_ci 507ca0551cfSopenharmony_civoid Options::SetSmDefaultOption() 508ca0551cfSopenharmony_ci{ 509ca0551cfSopenharmony_ci systemLevel = SystemLevel::INIT; 510ca0551cfSopenharmony_ci genMode = GenMode::INIT; 511ca0551cfSopenharmony_ci return; 512ca0551cfSopenharmony_ci} 513ca0551cfSopenharmony_ci 514ca0551cfSopenharmony_cibool Options::CheckSmOptions() 515ca0551cfSopenharmony_ci{ 516ca0551cfSopenharmony_ci SetSmDefaultOption(); 517ca0551cfSopenharmony_ci if (!DoSupportSmType()) { 518ca0551cfSopenharmony_ci return false; 519ca0551cfSopenharmony_ci } 520ca0551cfSopenharmony_ci 521ca0551cfSopenharmony_ci if (doCompile) { 522ca0551cfSopenharmony_ci if (!DoGetHashKey() && !doDumpAST && !doGenerateCode && !doOutDir) { 523ca0551cfSopenharmony_ci Logger::E(TAG, "nothing to do."); 524ca0551cfSopenharmony_ci return false; 525ca0551cfSopenharmony_ci } 526ca0551cfSopenharmony_ci 527ca0551cfSopenharmony_ci if (!doGenerateCode && doOutDir) { 528ca0551cfSopenharmony_ci Logger::E(TAG, "no target language."); 529ca0551cfSopenharmony_ci return false; 530ca0551cfSopenharmony_ci } 531ca0551cfSopenharmony_ci 532ca0551cfSopenharmony_ci if (doGenerateCode && !doOutDir) { 533ca0551cfSopenharmony_ci Logger::E(TAG, "no out directory."); 534ca0551cfSopenharmony_ci return false; 535ca0551cfSopenharmony_ci } 536ca0551cfSopenharmony_ci } else { 537ca0551cfSopenharmony_ci if (DoGetHashKey() || doDumpAST || doGenerateCode || doOutDir) { 538ca0551cfSopenharmony_ci Logger::E(TAG, "no idl files."); 539ca0551cfSopenharmony_ci return false; 540ca0551cfSopenharmony_ci } 541ca0551cfSopenharmony_ci } 542ca0551cfSopenharmony_ci 543ca0551cfSopenharmony_ci return true; 544ca0551cfSopenharmony_ci} 545ca0551cfSopenharmony_ci 546ca0551cfSopenharmony_cibool Options::SetHiTrace(const std::string &tag) 547ca0551cfSopenharmony_ci{ 548ca0551cfSopenharmony_ci doKeywords = true; 549ca0551cfSopenharmony_ci hitraceTag = tag; 550ca0551cfSopenharmony_ci doHitrace = true; 551ca0551cfSopenharmony_ci return true; 552ca0551cfSopenharmony_ci} 553ca0551cfSopenharmony_ci 554ca0551cfSopenharmony_cibool Options::SetLogDomainId(const std::string &id) 555ca0551cfSopenharmony_ci{ 556ca0551cfSopenharmony_ci doKeywords = true; 557ca0551cfSopenharmony_ci domainId = id; 558ca0551cfSopenharmony_ci return true; 559ca0551cfSopenharmony_ci} 560ca0551cfSopenharmony_ci 561ca0551cfSopenharmony_cibool Options::SetLogTag(const std::string &tag) 562ca0551cfSopenharmony_ci{ 563ca0551cfSopenharmony_ci doKeywords = true; 564ca0551cfSopenharmony_ci logTag = tag; 565ca0551cfSopenharmony_ci return true; 566ca0551cfSopenharmony_ci} 567ca0551cfSopenharmony_ci 568ca0551cfSopenharmony_cibool Options::SetInterfaceType(const std::string &type) 569ca0551cfSopenharmony_ci{ 570ca0551cfSopenharmony_ci static std::map<std::string, InterfaceType> Type = { 571ca0551cfSopenharmony_ci {"hdi", InterfaceType::HDI}, 572ca0551cfSopenharmony_ci {"sa", InterfaceType::SA}, 573ca0551cfSopenharmony_ci {"sm", InterfaceType::SM}, 574ca0551cfSopenharmony_ci {"sam", InterfaceType::SAM}, 575ca0551cfSopenharmony_ci {"sam_sm", InterfaceType::SAM_SM}, 576ca0551cfSopenharmony_ci {"sam_uds", InterfaceType::SAM_UDS}, 577ca0551cfSopenharmony_ci {"sm_uds", InterfaceType::SM_UDS}, 578ca0551cfSopenharmony_ci }; 579ca0551cfSopenharmony_ci 580ca0551cfSopenharmony_ci auto codeGenIter = Type.find(type); 581ca0551cfSopenharmony_ci if (codeGenIter == Type.end()) { 582ca0551cfSopenharmony_ci Logger::E(TAG, "invalid interface type set: '%s', please input hdi/sa.", type.c_str()); 583ca0551cfSopenharmony_ci return false; 584ca0551cfSopenharmony_ci } 585ca0551cfSopenharmony_ci interfaceType = codeGenIter->second; 586ca0551cfSopenharmony_ci return true; 587ca0551cfSopenharmony_ci} 588ca0551cfSopenharmony_ci 589ca0551cfSopenharmony_cibool Options::DoLogOn() const 590ca0551cfSopenharmony_ci{ 591ca0551cfSopenharmony_ci if (!domainId.empty() && !logTag.empty()) { 592ca0551cfSopenharmony_ci return true; 593ca0551cfSopenharmony_ci } 594ca0551cfSopenharmony_ci return false; 595ca0551cfSopenharmony_ci} 596ca0551cfSopenharmony_ci 597ca0551cfSopenharmony_cibool Options::DoLegalLog() const 598ca0551cfSopenharmony_ci{ 599ca0551cfSopenharmony_ci if (genLanguage == Language::CPP) { 600ca0551cfSopenharmony_ci if (!domainId.empty() && !logTag.empty()) { 601ca0551cfSopenharmony_ci return true; 602ca0551cfSopenharmony_ci } else if (domainId.empty() && logTag.empty()) { 603ca0551cfSopenharmony_ci return true; 604ca0551cfSopenharmony_ci } else { 605ca0551cfSopenharmony_ci return false; 606ca0551cfSopenharmony_ci } 607ca0551cfSopenharmony_ci } 608ca0551cfSopenharmony_ci return true; 609ca0551cfSopenharmony_ci} 610ca0551cfSopenharmony_ci 611ca0551cfSopenharmony_cibool Options::HasErrors() const 612ca0551cfSopenharmony_ci{ 613ca0551cfSopenharmony_ci return !illegalOptions.empty(); 614ca0551cfSopenharmony_ci} 615ca0551cfSopenharmony_ci 616ca0551cfSopenharmony_civoid Options::ShowErrors() const 617ca0551cfSopenharmony_ci{ 618ca0551cfSopenharmony_ci std::vector<std::string> illegalOptionsVec = StringHelper::Split(illegalOptions, " "); 619ca0551cfSopenharmony_ci for (size_t i = 0; i < illegalOptionsVec.size(); i++) { 620ca0551cfSopenharmony_ci Logger::E(TAG, "The Option \"%s\" is illegal.", illegalOptionsVec[i].c_str()); 621ca0551cfSopenharmony_ci } 622ca0551cfSopenharmony_ci printf("Use \"-h, --help\" to show usage.\n"); 623ca0551cfSopenharmony_ci return; 624ca0551cfSopenharmony_ci} 625ca0551cfSopenharmony_ci 626ca0551cfSopenharmony_cibool Options::HasWarning() const 627ca0551cfSopenharmony_ci{ 628ca0551cfSopenharmony_ci if (interfaceType == InterfaceType::SA) { 629ca0551cfSopenharmony_ci if (genLanguage == Language::RUST || genLanguage == Language::TS) { 630ca0551cfSopenharmony_ci if (DoSearchKeywords()) { 631ca0551cfSopenharmony_ci return true; 632ca0551cfSopenharmony_ci } 633ca0551cfSopenharmony_ci } 634ca0551cfSopenharmony_ci } 635ca0551cfSopenharmony_ci return false; 636ca0551cfSopenharmony_ci} 637ca0551cfSopenharmony_ci 638ca0551cfSopenharmony_civoid Options::ShowWarning() const 639ca0551cfSopenharmony_ci{ 640ca0551cfSopenharmony_ci printf("Warning : Executed successfully, but contains invalid commands !\n"); 641ca0551cfSopenharmony_ci} 642ca0551cfSopenharmony_ci 643ca0551cfSopenharmony_civoid Options::ShowVersion() const 644ca0551cfSopenharmony_ci{ 645ca0551cfSopenharmony_ci printf("idl %d.%d\n" 646ca0551cfSopenharmony_ci "Copyright (c) Huawei Technologies Co., Ltd. 2024. All rights reserved.\n\n", 647ca0551cfSopenharmony_ci VERSION_MAJOR, VERSION_MINOR); 648ca0551cfSopenharmony_ci} 649ca0551cfSopenharmony_ci 650ca0551cfSopenharmony_civoid Options::ShowUsage() const 651ca0551cfSopenharmony_ci{ 652ca0551cfSopenharmony_ci printf("Compile a .idl file and generate C/C++/Ts/Rust and Java codes.\n" 653ca0551cfSopenharmony_ci "Usage: idl [options] file\n" 654ca0551cfSopenharmony_ci "Options:\n" 655ca0551cfSopenharmony_ci " -h, --help Display command line options\n" 656ca0551cfSopenharmony_ci " -v, --version Display toolchain version information\n" 657ca0551cfSopenharmony_ci " --system <value> Set system level 'mini','lite' or 'full', the default value is 'full', " 658ca0551cfSopenharmony_ci "only support 'intf-type hdi'\n" 659ca0551cfSopenharmony_ci " -m, --mode <value> Set generate code mode 'low', 'passthrough', 'ipc' or 'kernel'," 660ca0551cfSopenharmony_ci " the default value is 'ipc', only support 'intf-type hdi'\n" 661ca0551cfSopenharmony_ci " -p, --package <package name> Set package of idl files, only support 'intf-type hdi'\n" 662ca0551cfSopenharmony_ci " --dump-ast Display the AST of the compiled file\n" 663ca0551cfSopenharmony_ci " --dump-metadata Display the metadata generated from the compiled file, " 664ca0551cfSopenharmony_ci "only support 'intf-type sa'\n" 665ca0551cfSopenharmony_ci " --hash Generate hash info of idl files, only support 'intf-type hdi'\n" 666ca0551cfSopenharmony_ci " -r <rootPackage>:<rootPath> Set root path of root package, only support 'intf-type hdi'\n" 667ca0551cfSopenharmony_ci " -c Compile the .idl file\n" 668ca0551cfSopenharmony_ci " -D <directory> Directory of the idl file, only support 'intf-type hdi'\n" 669ca0551cfSopenharmony_ci " -d <directory> Place generated codes into <directory>\n" 670ca0551cfSopenharmony_ci " -o <file> Place the output into <file>, only support 'intf-type hdi'\n" 671ca0551cfSopenharmony_ci " -s <file> Place the metadata into <file>, only support 'intf-type sa'\n" 672ca0551cfSopenharmony_ci " --gen-c Generate C codes, only support 'intf-type hdi'\n" 673ca0551cfSopenharmony_ci " --gen-cpp Generate C++ codes\n" 674ca0551cfSopenharmony_ci " --gen-java Generate Java codes, only support 'intf-type hdi'\n" 675ca0551cfSopenharmony_ci " --gen-rust Generate Rust codes, only support 'intf-type sa'\n" 676ca0551cfSopenharmony_ci " --gen-ts Generate Ts codes, only support 'intf-type sa'\n" 677ca0551cfSopenharmony_ci " --log-domainid <domainid> Place the service domain in <domainid>, Enable log(Pair with -log-tag), " 678ca0551cfSopenharmony_ci "only support 'intf-type sa'\n" 679ca0551cfSopenharmony_ci " --log-tag <tag> Place the subsystem name in <tag>, Enable log(Pair with -log-domainid), " 680ca0551cfSopenharmony_ci "only support 'intf-type sa'\n" 681ca0551cfSopenharmony_ci " -t <hitrace tag> Place the constant name from hitrace_meter.h file in <hitrace tag>, " 682ca0551cfSopenharmony_ci "only support 'intf-type sa'\n" 683ca0551cfSopenharmony_ci " --intf-type <tag> Set type of generated codes 'sa' or 'hdi', default type is 'sa'\n"); 684ca0551cfSopenharmony_ci} 685ca0551cfSopenharmony_ci 686ca0551cfSopenharmony_ci/* 687ca0551cfSopenharmony_ci * -r option: -r ohos.hdi:./drivers/interface 688ca0551cfSopenharmony_ci * package:ohos.hdi.foo.v1_0 689ca0551cfSopenharmony_ci * rootPackage:ohos.hdi 690ca0551cfSopenharmony_ci */ 691ca0551cfSopenharmony_cistd::string Options::GetRootPackage(const std::string &package) const 692ca0551cfSopenharmony_ci{ 693ca0551cfSopenharmony_ci const auto &packagePaths = GetPackagePathMap(); 694ca0551cfSopenharmony_ci for (const auto &packageRoot : packagePaths) { 695ca0551cfSopenharmony_ci if (StringHelper::StartWith(package, packageRoot.first)) { 696ca0551cfSopenharmony_ci return packageRoot.first; 697ca0551cfSopenharmony_ci } 698ca0551cfSopenharmony_ci } 699ca0551cfSopenharmony_ci 700ca0551cfSopenharmony_ci return ""; 701ca0551cfSopenharmony_ci} 702ca0551cfSopenharmony_ci 703ca0551cfSopenharmony_ci/* 704ca0551cfSopenharmony_ci * -r option: -r ohos.hdi:./drivers/interface 705ca0551cfSopenharmony_ci * package:ohos.hdi.foo.v1_0 706ca0551cfSopenharmony_ci * rootPath:./drivers/interface 707ca0551cfSopenharmony_ci */ 708ca0551cfSopenharmony_cistd::string Options::GetRootPath(const std::string &package) const 709ca0551cfSopenharmony_ci{ 710ca0551cfSopenharmony_ci const auto &packagePaths = GetPackagePathMap(); 711ca0551cfSopenharmony_ci for (const auto &packageRoot : packagePaths) { 712ca0551cfSopenharmony_ci if (StringHelper::StartWith(package, packageRoot.first)) { 713ca0551cfSopenharmony_ci return packageRoot.second; 714ca0551cfSopenharmony_ci } 715ca0551cfSopenharmony_ci } 716ca0551cfSopenharmony_ci 717ca0551cfSopenharmony_ci return ""; 718ca0551cfSopenharmony_ci} 719ca0551cfSopenharmony_ci 720ca0551cfSopenharmony_ci/* 721ca0551cfSopenharmony_ci * -r option: -r ohos.hdi:./drivers/interface 722ca0551cfSopenharmony_ci * package:ohos.hdi.foo.v1_0 723ca0551cfSopenharmony_ci * subPackage:foo.v1_0 724ca0551cfSopenharmony_ci */ 725ca0551cfSopenharmony_cistd::string Options::GetSubPackage(const std::string &package) const 726ca0551cfSopenharmony_ci{ 727ca0551cfSopenharmony_ci if (interfaceType == InterfaceType::SM || 728ca0551cfSopenharmony_ci interfaceType == InterfaceType::SM_UDS) { 729ca0551cfSopenharmony_ci return package; 730ca0551cfSopenharmony_ci } 731ca0551cfSopenharmony_ci std::string rootPackage = GetRootPackage(package); 732ca0551cfSopenharmony_ci if (rootPackage.empty()) { 733ca0551cfSopenharmony_ci return package; 734ca0551cfSopenharmony_ci } 735ca0551cfSopenharmony_ci 736ca0551cfSopenharmony_ci return package.substr(rootPackage.size() + 1); 737ca0551cfSopenharmony_ci} 738ca0551cfSopenharmony_ci 739ca0551cfSopenharmony_ci/* 740ca0551cfSopenharmony_ci * -r option: -r ohos.hdi:./drivers/interface 741ca0551cfSopenharmony_ci * package:ohos.hdi.foo.v1_0 742ca0551cfSopenharmony_ci * packagePath:./drivers/interface/foo/v1_0 743ca0551cfSopenharmony_ci */ 744ca0551cfSopenharmony_cistd::string Options::GetPackagePath(const std::string &package) const 745ca0551cfSopenharmony_ci{ 746ca0551cfSopenharmony_ci std::string rootPackage = ""; 747ca0551cfSopenharmony_ci std::string rootPath = ""; 748ca0551cfSopenharmony_ci const auto &packagePaths = GetPackagePathMap(); 749ca0551cfSopenharmony_ci for (const auto &packageRoot : packagePaths) { 750ca0551cfSopenharmony_ci if (StringHelper::StartWith(package, packageRoot.first)) { 751ca0551cfSopenharmony_ci rootPackage = packageRoot.first; 752ca0551cfSopenharmony_ci rootPath = packageRoot.second; 753ca0551cfSopenharmony_ci } 754ca0551cfSopenharmony_ci } 755ca0551cfSopenharmony_ci 756ca0551cfSopenharmony_ci if (rootPackage.empty()) { 757ca0551cfSopenharmony_ci // The current path is the root path 758ca0551cfSopenharmony_ci std::string curPath = File::AdapterPath(StringHelper::Replace(package, '.', SEPARATOR)); 759ca0551cfSopenharmony_ci return File::AdapterRealPath(curPath); 760ca0551cfSopenharmony_ci } 761ca0551cfSopenharmony_ci 762ca0551cfSopenharmony_ci if (StringHelper::EndWith(rootPath, SEPARATOR)) { 763ca0551cfSopenharmony_ci rootPath.pop_back(); 764ca0551cfSopenharmony_ci } 765ca0551cfSopenharmony_ci 766ca0551cfSopenharmony_ci std::string subPath = StringHelper::Replace(package.substr(rootPackage.size() + 1), '.', SEPARATOR); 767ca0551cfSopenharmony_ci return File::AdapterPath(rootPath + "/" + subPath); 768ca0551cfSopenharmony_ci} 769ca0551cfSopenharmony_ci 770ca0551cfSopenharmony_ci/* 771ca0551cfSopenharmony_ci * -r option: -r ohos.hdi:./drivers/interface 772ca0551cfSopenharmony_ci * import: ohos.hdi.foo.v1_0.MyTypes 773ca0551cfSopenharmony_ci * packagePath:./drivers/interface/foo/v1_0/MyTypes.idl 774ca0551cfSopenharmony_ci */ 775ca0551cfSopenharmony_cistd::string Options::GetImportFilePath(const std::string &import) const 776ca0551cfSopenharmony_ci{ 777ca0551cfSopenharmony_ci size_t index = import.rfind('.'); 778ca0551cfSopenharmony_ci if (index == std::string::npos) { 779ca0551cfSopenharmony_ci return import; 780ca0551cfSopenharmony_ci } 781ca0551cfSopenharmony_ci 782ca0551cfSopenharmony_ci std::string dir = GetPackagePath(StringHelper::SubStr(import, 0, index)); 783ca0551cfSopenharmony_ci std::string className = import.substr(index + 1); 784ca0551cfSopenharmony_ci return StringHelper::Format("%s%c%s.idl", dir.c_str(), SEPARATOR, className.c_str()); 785ca0551cfSopenharmony_ci} 786ca0551cfSopenharmony_ci} // namespace Idl 787ca0551cfSopenharmony_ci} // namespace OHOS