1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "shell_command.h"
17 
18 #include <getopt.h>
19 #include "app_log_wrapper.h"
20 
21 namespace OHOS {
22 namespace AppExecFwk {
23 
ShellCommand(int argc,char * argv[],std::string name)24 ShellCommand::ShellCommand(int argc, char *argv[], std::string name)
25 {
26     opterr = 0;
27     argc_ = argc;
28     argv_ = argv;
29     name_ = name;
30 
31     if (argc < MIN_ARGUMENT_NUMBER) {
32         cmd_ = "help";
33         return;
34     }
35     cmd_ = argv[1];
36     for (int i = 2; i < argc; i++) {
37         argList_.push_back(argv[i]);
38     }
39 }
40 
~ShellCommand()41 ShellCommand::~ShellCommand()
42 {}
43 
OnCommand()44 ErrCode ShellCommand::OnCommand()
45 {
46     int result = OHOS::ERR_OK;
47 
48     auto respond = commandMap_[cmd_];
49     if (respond == nullptr) {
50         resultReceiver_.append(GetCommandErrorMsg());
51         respond = commandMap_["help"];
52     }
53 
54     if (Init() == OHOS::ERR_OK) {
55         respond();
56     } else {
57         result = OHOS::ERR_INVALID_VALUE;
58     }
59 
60     return result;
61 }
62 
ExecCommand()63 std::string ShellCommand::ExecCommand()
64 {
65     int result = CreateCommandMap();
66     if (result != OHOS::ERR_OK) {
67         APP_LOGE("failed to create command map.\n");
68     }
69 
70     result = CreateMessageMap();
71     if (result != OHOS::ERR_OK) {
72         APP_LOGE("failed to create message map.\n");
73     }
74 
75     result = OnCommand();
76     if (result != OHOS::ERR_OK) {
77         APP_LOGE("failed to execute your command.\n");
78 
79         resultReceiver_ = "error: failed to execute your command.\n";
80     }
81 
82     return resultReceiver_;
83 }
84 
GetCommandErrorMsg() const85 std::string ShellCommand::GetCommandErrorMsg() const
86 {
87     std::string commandErrorMsg =
88         name_ + ": '" + cmd_ + "' is not a valid " + name_ + " command. See '" + name_ + " help'.\n";
89 
90     return commandErrorMsg;
91 }
92 
GetUnknownOptionMsg(std::string & unknownOption) const93 std::string ShellCommand::GetUnknownOptionMsg(std::string &unknownOption) const
94 {
95     std::string result = "";
96 
97     if (optind < 0 || optind > argc_) {
98         return result;
99     }
100 
101     result.append("error: unknown option");
102     result.append(".\n");
103 
104     return result;
105 }
106 
GetMessageFromCode(const int32_t code) const107 std::string ShellCommand::GetMessageFromCode(const int32_t code) const
108 {
109     APP_LOGI("[%{public}s(%{public}s)] enter", __FILE__, __FUNCTION__);
110     APP_LOGI("code = %{public}d", code);
111 
112     std::string result = "";
113     if (messageMap_.find(code) != messageMap_.end()) {
114         std::string message = messageMap_.at(code);
115         if (message.size() != 0) {
116             result.append(STRING_CODE + std::to_string(code) + "\n");
117             result.append(message + "\n");
118         }
119     }
120 
121     APP_LOGI("result = %{public}s", result.c_str());
122 
123     return result;
124 }
125 
126 }  // namespace AppExecFwk
127 }  // namespace OHOS