12dc7c57fSopenharmony_ci/*
22dc7c57fSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
32dc7c57fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
42dc7c57fSopenharmony_ci * you may not use this file except in compliance with the License.
52dc7c57fSopenharmony_ci * You may obtain a copy of the License at
62dc7c57fSopenharmony_ci *
72dc7c57fSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
82dc7c57fSopenharmony_ci *
92dc7c57fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
102dc7c57fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
112dc7c57fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
122dc7c57fSopenharmony_ci * See the License for the specific language governing permissions and
132dc7c57fSopenharmony_ci * limitations under the License.
142dc7c57fSopenharmony_ci */
152dc7c57fSopenharmony_ci
162dc7c57fSopenharmony_ci#include "shell_command.h"
172dc7c57fSopenharmony_ci
182dc7c57fSopenharmony_ci#include <getopt.h>
192dc7c57fSopenharmony_ci#include <utility>
202dc7c57fSopenharmony_ci
212dc7c57fSopenharmony_ci#include "event_log_wrapper.h"
222dc7c57fSopenharmony_ci
232dc7c57fSopenharmony_cinamespace OHOS {
242dc7c57fSopenharmony_cinamespace EventFwk {
252dc7c57fSopenharmony_ciShellCommand::ShellCommand(int argc, char *argv[], std::string name)
262dc7c57fSopenharmony_ci{
272dc7c57fSopenharmony_ci    opterr = 0;
282dc7c57fSopenharmony_ci    argc_ = argc;
292dc7c57fSopenharmony_ci    argv_ = argv;
302dc7c57fSopenharmony_ci    name_ = name;
312dc7c57fSopenharmony_ci
322dc7c57fSopenharmony_ci    if (argc < MIN_ARGUMENT_NUMBER) {
332dc7c57fSopenharmony_ci        cmd_ = "help";
342dc7c57fSopenharmony_ci        return;
352dc7c57fSopenharmony_ci    }
362dc7c57fSopenharmony_ci    cmd_ = argv[1];
372dc7c57fSopenharmony_ci    for (int i = 2; i < argc; i++) {
382dc7c57fSopenharmony_ci        argList_.emplace_back(argv[i]);
392dc7c57fSopenharmony_ci    }
402dc7c57fSopenharmony_ci}
412dc7c57fSopenharmony_ci
422dc7c57fSopenharmony_ciShellCommand::~ShellCommand() = default;
432dc7c57fSopenharmony_ci
442dc7c57fSopenharmony_ciErrCode ShellCommand::OnCommand()
452dc7c57fSopenharmony_ci{
462dc7c57fSopenharmony_ci    int result = OHOS::ERR_OK;
472dc7c57fSopenharmony_ci    auto respond = commandMap_[cmd_];
482dc7c57fSopenharmony_ci    if (respond == nullptr) {
492dc7c57fSopenharmony_ci        resultReceiver_.append(GetCommandErrorMsg());
502dc7c57fSopenharmony_ci        respond = commandMap_["help"];
512dc7c57fSopenharmony_ci    }
522dc7c57fSopenharmony_ci    respond();
532dc7c57fSopenharmony_ci    return result;
542dc7c57fSopenharmony_ci}
552dc7c57fSopenharmony_ci
562dc7c57fSopenharmony_cistd::string ShellCommand::ExecCommand()
572dc7c57fSopenharmony_ci{
582dc7c57fSopenharmony_ci    int result = CreateCommandMap();
592dc7c57fSopenharmony_ci    if (result != OHOS::ERR_OK) {
602dc7c57fSopenharmony_ci        EVENT_LOGE("failed to create command map.\n");
612dc7c57fSopenharmony_ci    }
622dc7c57fSopenharmony_ci    result = OnCommand();
632dc7c57fSopenharmony_ci    if (result != OHOS::ERR_OK) {
642dc7c57fSopenharmony_ci        EVENT_LOGE("failed to execute your command.\n");
652dc7c57fSopenharmony_ci        resultReceiver_ = "error: failed to execute your command.\n";
662dc7c57fSopenharmony_ci    }
672dc7c57fSopenharmony_ci    return resultReceiver_;
682dc7c57fSopenharmony_ci}
692dc7c57fSopenharmony_ci
702dc7c57fSopenharmony_cistd::string ShellCommand::GetCommandErrorMsg() const
712dc7c57fSopenharmony_ci{
722dc7c57fSopenharmony_ci    return name_ + ": '" + cmd_ + "' is not a valid " + name_ + " command. See '" + name_ + " help'.\n";
732dc7c57fSopenharmony_ci}
742dc7c57fSopenharmony_ci}  // namespace EventFwk
752dc7c57fSopenharmony_ci}  // namespace OHOS