196279301Sopenharmony_ci/*
296279301Sopenharmony_ci * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
396279301Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
496279301Sopenharmony_ci * you may not use this file except in compliance with the License.
596279301Sopenharmony_ci * You may obtain a copy of the License at
696279301Sopenharmony_ci *
796279301Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
896279301Sopenharmony_ci *
996279301Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1096279301Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1196279301Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1296279301Sopenharmony_ci * See the License for the specific language governing permissions and
1396279301Sopenharmony_ci * limitations under the License.
1496279301Sopenharmony_ci */
1596279301Sopenharmony_ci
1696279301Sopenharmony_ci#include "shell_command.h"
1796279301Sopenharmony_ci
1896279301Sopenharmony_ci#include <getopt.h>
1996279301Sopenharmony_ci#include "ans_log_wrapper.h"
2096279301Sopenharmony_ci
2196279301Sopenharmony_cinamespace OHOS {
2296279301Sopenharmony_cinamespace Notification {
2396279301Sopenharmony_ciShellCommand::ShellCommand(int argc, char *argv[], std::string name)
2496279301Sopenharmony_ci{
2596279301Sopenharmony_ci    opterr = 0;
2696279301Sopenharmony_ci    argc_ = argc;
2796279301Sopenharmony_ci    argv_ = argv;
2896279301Sopenharmony_ci    name_ = name;
2996279301Sopenharmony_ci    if (argc < MIN_ARGUMENT_NUMBER || argc > MAX_ARGUMENT_NUMBER) {
3096279301Sopenharmony_ci        cmd_ = "help";
3196279301Sopenharmony_ci        return;
3296279301Sopenharmony_ci    }
3396279301Sopenharmony_ci    cmd_ = argv[1];
3496279301Sopenharmony_ci    for (int i = 2; i < argc; i++) {
3596279301Sopenharmony_ci        argList_.push_back(argv[i]);
3696279301Sopenharmony_ci    }
3796279301Sopenharmony_ci}
3896279301Sopenharmony_ci
3996279301Sopenharmony_ciShellCommand::~ShellCommand()
4096279301Sopenharmony_ci{}
4196279301Sopenharmony_ci
4296279301Sopenharmony_ciErrCode ShellCommand::OnCommand()
4396279301Sopenharmony_ci{
4496279301Sopenharmony_ci    int32_t result = OHOS::ERR_OK;
4596279301Sopenharmony_ci    auto respond = commandMap_[cmd_];
4696279301Sopenharmony_ci    if (respond == nullptr) {
4796279301Sopenharmony_ci        resultReceiver_.append(GetCommandErrorMsg());
4896279301Sopenharmony_ci        respond = commandMap_["help"];
4996279301Sopenharmony_ci    }
5096279301Sopenharmony_ci    if (Init() == OHOS::ERR_OK) {
5196279301Sopenharmony_ci        ANS_LOGD("Init is ERR_OK.");
5296279301Sopenharmony_ci        respond();
5396279301Sopenharmony_ci    } else {
5496279301Sopenharmony_ci        result = OHOS::ERR_INVALID_VALUE;
5596279301Sopenharmony_ci    }
5696279301Sopenharmony_ci    return result;
5796279301Sopenharmony_ci}
5896279301Sopenharmony_ci
5996279301Sopenharmony_cistd::string ShellCommand::ExecCommand()
6096279301Sopenharmony_ci{
6196279301Sopenharmony_ci    int32_t result = CreateCommandMap();
6296279301Sopenharmony_ci    if (result != OHOS::ERR_OK) {
6396279301Sopenharmony_ci        ANS_LOGE("failed to create command map.\n");
6496279301Sopenharmony_ci    }
6596279301Sopenharmony_ci    result = OnCommand();
6696279301Sopenharmony_ci    if (result != OHOS::ERR_OK) {
6796279301Sopenharmony_ci        ANS_LOGE("failed to execute your command.\n");
6896279301Sopenharmony_ci        resultReceiver_ = "error: failed to execute your command.\n";
6996279301Sopenharmony_ci    }
7096279301Sopenharmony_ci    return resultReceiver_;
7196279301Sopenharmony_ci}
7296279301Sopenharmony_ci
7396279301Sopenharmony_cistd::string ShellCommand::GetCommandErrorMsg() const
7496279301Sopenharmony_ci{
7596279301Sopenharmony_ci    ANS_LOGD("enter");
7696279301Sopenharmony_ci    std::string commandErrorMsg =
7796279301Sopenharmony_ci        name_ + ": '" + cmd_ + "' is not a valid " + name_ + " command. See '" + name_ + " help'.\n";
7896279301Sopenharmony_ci    return commandErrorMsg;
7996279301Sopenharmony_ci}
8096279301Sopenharmony_ci
8196279301Sopenharmony_cistd::string ShellCommand::GetUnknownOptionMsg(std::string &unknownOption) const
8296279301Sopenharmony_ci{
8396279301Sopenharmony_ci    std::string result = "";
8496279301Sopenharmony_ci    if (optind < 0 || optind > argc_) {
8596279301Sopenharmony_ci        return result;
8696279301Sopenharmony_ci    }
8796279301Sopenharmony_ci    result.append("error: unknown option");
8896279301Sopenharmony_ci    result.append(".\n");
8996279301Sopenharmony_ci    return result;
9096279301Sopenharmony_ci}
9196279301Sopenharmony_ci
9296279301Sopenharmony_cistd::string ShellCommand::GetMessageFromCode(const int32_t code) const
9396279301Sopenharmony_ci{
9496279301Sopenharmony_ci    ANS_LOGI("[%{public}s(%{public}s)] enter", __FILE__, __FUNCTION__);
9596279301Sopenharmony_ci    ANS_LOGI("code = %{public}d", code);
9696279301Sopenharmony_ci    std::string result = "";
9796279301Sopenharmony_ci    if (messageMap_.find(code) != messageMap_.end()) {
9896279301Sopenharmony_ci        std::string message = messageMap_.at(code);
9996279301Sopenharmony_ci        if (message.size() != 0) {
10096279301Sopenharmony_ci            result.append(message + "\n");
10196279301Sopenharmony_ci        }
10296279301Sopenharmony_ci    }
10396279301Sopenharmony_ci    ANS_LOGI("result = %{public}s", result.c_str());
10496279301Sopenharmony_ci    return result;
10596279301Sopenharmony_ci}
10696279301Sopenharmony_ci}  // namespace Notification
10796279301Sopenharmony_ci}  // namespace OHOS