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