1/* 2 * Copyright (c) 2021 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#ifndef OHOS_RESTOOL_CMD_PARSER_H 17#define OHOS_RESTOOL_CMD_PARSER_H 18 19#include <getopt.h> 20#include <iostream> 21#include <functional> 22#include <vector> 23#include "singleton.h" 24#include "resource_data.h" 25#include "restool_errors.h" 26 27namespace OHOS { 28namespace Global { 29namespace Restool { 30class ICmdParser { 31public: 32 virtual uint32_t Parse(int argc, char *argv[]) = 0; 33}; 34 35class PackageParser : public ICmdParser { 36public: 37 PackageParser() {}; 38 virtual ~PackageParser() = default; 39 uint32_t Parse(int argc, char *argv[]) override; 40 const std::vector<std::string> &GetInputs() const; 41 const std::string &GetPackageName() const; 42 const std::string &GetOutput() const; 43 const std::vector<std::string> &GetResourceHeaders() const; 44 bool GetForceWrite() const; 45 const std::vector<std::string> &GetModuleNames() const; 46 const std::string &GetConfig() const; 47 const std::string &GetRestoolPath() const; 48 uint32_t GetStartId() const; 49 bool IsFileList() const; 50 const std::vector<std::string> &GetAppend() const; 51 bool GetCombine() const; 52 const std::string &GetDependEntry() const; 53 const std::string &GetIdDefinedOutput() const; 54 const std::string &GetIdDefinedInputPath() const; 55 bool GetIconCheck() const; 56 const TargetConfig &GetTargetConfigValues() const; 57 bool IsTargetConfig() const; 58 const std::vector<std::string> &GetSysIdDefinedPaths() const; 59 const std::string &GetCompressionPath() const; 60 61private: 62 void InitCommand(); 63 uint32_t ParseCommand(int argc, char *argv[]); 64 uint32_t CheckError(int argc, char *argv[], int c, int optIndex); 65 uint32_t AddInput(const std::string& argValue); 66 uint32_t AddPackageName(const std::string& argValue); 67 uint32_t AddOutput(const std::string& argValue); 68 uint32_t AddResourceHeader(const std::string& argValue); 69 uint32_t ForceWrite(); 70 uint32_t PrintVersion(); 71 uint32_t AddMoudleNames(const std::string& argValue); 72 uint32_t AddConfig(const std::string& argValue); 73 uint32_t AddStartId(const std::string& argValue); 74 void AdaptResourcesDirForInput(); 75 uint32_t CheckParam() const; 76 uint32_t HandleProcess(int c, const std::string& argValue); 77 uint32_t ParseFileList(const std::string& fileListPath); 78 uint32_t AddAppend(const std::string& argValue); 79 uint32_t SetCombine(); 80 uint32_t AddDependEntry(const std::string& argValue); 81 uint32_t ShowHelp() const; 82 uint32_t SetIdDefinedOutput(const std::string& argValue); 83 uint32_t SetIdDefinedInputPath(const std::string& argValue); 84 uint32_t AddSysIdDefined(const std::string& argValue); 85 bool IsAscii(const std::string& argValue) const; 86 bool IsLongOpt(int argc, char *argv[]) const; 87 uint32_t IconCheck(); 88 uint32_t ParseTargetConfig(const std::string& argValue); 89 uint32_t AddCompressionPath(const std::string& argValue); 90 91 static const struct option CMD_OPTS[]; 92 static const std::string CMD_PARAMS; 93 using HandleArgValue = std::function<uint32_t(const std::string&)>; 94 std::map<int32_t, HandleArgValue> handles_; 95 std::vector<std::string> inputs_; 96 std::string packageName_; 97 std::string output_; 98 std::vector<std::string> resourceHeaderPaths_; 99 bool forceWrite_ = false; 100 std::vector<std::string> moduleNames_; 101 std::string configPath_; 102 std::string restoolPath_; 103 uint32_t startId_ = 0; 104 bool isFileList_ = false; 105 std::vector<std::string> append_; 106 bool combine_ = false; 107 std::string dependEntry_; 108 std::string idDefinedOutput_; 109 std::string idDefinedInputPath_; 110 bool isIconCheck_ = false; 111 TargetConfig targetConfig_; 112 bool isTtargetConfig_; 113 std::vector<std::string> sysIdDefinedPaths_; 114 std::string compressionPath_; 115}; 116 117template<class T> 118class CmdParser : public Singleton<CmdParser<T>> { 119public: 120 T &GetCmdParser(); 121 uint32_t Parse(int argc, char *argv[]); 122 static void ShowUseage(); 123 124private: 125 T cmdParser_; 126}; 127 128template<class T> 129void CmdParser<T>::ShowUseage() 130{ 131 std::cout << "This is an OHOS Packaging Tool.\n"; 132 std::cout << "Usage:\n"; 133 std::cout << TOOL_NAME << " [arguments] Package the OHOS resources.\n"; 134 std::cout << "[arguments]:\n"; 135 std::cout << " -i/--inputPath input resource path, can add more.\n"; 136 std::cout << " -p/--packageName package name.\n"; 137 std::cout << " -o/--outputPath output path.\n"; 138 std::cout << " -r/--resHeader resource header file path(like ./ResourceTable.js, ./ResrouceTable.h).\n"; 139 std::cout << " -f/--forceWrite if output path exists,force delete it.\n"; 140 std::cout << " -v/--version print tool version.\n"; 141 std::cout << " -m/--modules module name, can add more, split by ','(like entry1,entry2,...).\n"; 142 std::cout << " -j/--json config.json path.\n"; 143 std::cout << " -e/--startId start id mask, e.g 0x01000000,"; 144 std::cout << " in [0x01000000, 0x06FFFFFF),[0x08000000, 0xFFFFFFFF)\n"; 145 std::cout << " -x/--append resources folder path\n"; 146 std::cout << " -z/--combine flag for incremental compilation\n"; 147 std::cout << " -h/--help Displays this help menu\n"; 148 std::cout << " -l/--fileList input json file of the option set, e.g resConfig.json."; 149 std::cout << " For details, see the developer documentation.\n"; 150 std::cout << " --ids save id_defined.json direcory\n"; 151 std::cout << " --defined-ids input id_defined.json path\n"; 152 std::cout << " --dependEntry Build result directory of the specified entry module when the feature"; 153 std::cout << " module resources are independently built in the FA model.\n"; 154 std::cout << " --icon-check Enable the PNG image verification function for icons and startwindows.\n"; 155 std::cout << " --target-config When used with '-i', selective compilation is supported.\n"; 156 std::cout << " --compressed-config opt-compression.json path.\n"; 157} 158 159template<class T> 160T &CmdParser<T>::GetCmdParser() 161{ 162 return cmdParser_; 163} 164 165template<class T> 166uint32_t CmdParser<T>::Parse(int argc, char *argv[]) 167{ 168 if (cmdParser_.Parse(argc, argv) != RESTOOL_SUCCESS) { 169 return RESTOOL_ERROR; 170 } 171 return RESTOOL_SUCCESS; 172} 173} 174} 175} 176#endif 177