1b8a72a62Sopenharmony_ci/* 2b8a72a62Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 3b8a72a62Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4b8a72a62Sopenharmony_ci * you may not use this file except in compliance with the License. 5b8a72a62Sopenharmony_ci * You may obtain a copy of the License at 6b8a72a62Sopenharmony_ci * 7b8a72a62Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8b8a72a62Sopenharmony_ci * 9b8a72a62Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10b8a72a62Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11b8a72a62Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12b8a72a62Sopenharmony_ci * See the License for the specific language governing permissions and 13b8a72a62Sopenharmony_ci * limitations under the License. 14b8a72a62Sopenharmony_ci */ 15b8a72a62Sopenharmony_ci 16b8a72a62Sopenharmony_cipackage ohos; 17b8a72a62Sopenharmony_ci 18b8a72a62Sopenharmony_ciimport java.io.IOException; 19b8a72a62Sopenharmony_ciimport java.io.InputStream; 20b8a72a62Sopenharmony_ciimport java.util.List; 21b8a72a62Sopenharmony_ci 22b8a72a62Sopenharmony_ciimport static ohos.Uncompress.getResourceFromHap; 23b8a72a62Sopenharmony_ci 24b8a72a62Sopenharmony_ci 25b8a72a62Sopenharmony_ci/** 26b8a72a62Sopenharmony_ci * bundle uncompress. 27b8a72a62Sopenharmony_ci * step1: parse arguments 28b8a72a62Sopenharmony_ci * step2: verity arguments 29b8a72a62Sopenharmony_ci * step3: uncompress arguments 30b8a72a62Sopenharmony_ci * 31b8a72a62Sopenharmony_ci */ 32b8a72a62Sopenharmony_cipublic class UncompressEntrance { 33b8a72a62Sopenharmony_ci /** 34b8a72a62Sopenharmony_ci * Parses and returns the hap list that supports the device type. 35b8a72a62Sopenharmony_ci */ 36b8a72a62Sopenharmony_ci public static final String PARSE_MODE_HAPLIST = "hap-list"; 37b8a72a62Sopenharmony_ci 38b8a72a62Sopenharmony_ci /** 39b8a72a62Sopenharmony_ci * Parses and returns the information about the hap. 40b8a72a62Sopenharmony_ci */ 41b8a72a62Sopenharmony_ci public static final String PARSE_MODE_HAPINFO = "hap-info"; 42b8a72a62Sopenharmony_ci 43b8a72a62Sopenharmony_ci /** 44b8a72a62Sopenharmony_ci * Parses and returns the informations about the hap list that supports the device type and the haps in the app. 45b8a72a62Sopenharmony_ci */ 46b8a72a62Sopenharmony_ci public static final String PARSE_MODE_ALL = "all"; 47b8a72a62Sopenharmony_ci 48b8a72a62Sopenharmony_ci /** 49b8a72a62Sopenharmony_ci * Device type of default. 50b8a72a62Sopenharmony_ci */ 51b8a72a62Sopenharmony_ci public static final String DEVICE_TYPE_DEFAULT = "default"; 52b8a72a62Sopenharmony_ci 53b8a72a62Sopenharmony_ci /** 54b8a72a62Sopenharmony_ci * Device type of phone. 55b8a72a62Sopenharmony_ci */ 56b8a72a62Sopenharmony_ci public static final String DEVICE_TYPE_PHONE = "phone"; 57b8a72a62Sopenharmony_ci 58b8a72a62Sopenharmony_ci /** 59b8a72a62Sopenharmony_ci * Device type of tablet. 60b8a72a62Sopenharmony_ci */ 61b8a72a62Sopenharmony_ci public static final String DEVICE_TYPE_TABLET = "tablet"; 62b8a72a62Sopenharmony_ci 63b8a72a62Sopenharmony_ci /** 64b8a72a62Sopenharmony_ci * Device type of tv. 65b8a72a62Sopenharmony_ci */ 66b8a72a62Sopenharmony_ci public static final String DEVICE_TYPE_TV = "tv"; 67b8a72a62Sopenharmony_ci 68b8a72a62Sopenharmony_ci /** 69b8a72a62Sopenharmony_ci * Device type of car. 70b8a72a62Sopenharmony_ci */ 71b8a72a62Sopenharmony_ci public static final String DEVICE_TYPE_CAR = "car"; 72b8a72a62Sopenharmony_ci 73b8a72a62Sopenharmony_ci /** 74b8a72a62Sopenharmony_ci * Device type of smartWatch. 75b8a72a62Sopenharmony_ci */ 76b8a72a62Sopenharmony_ci public static final String DEVICE_TYPE_SMARTWATCH = "smartWatch"; 77b8a72a62Sopenharmony_ci 78b8a72a62Sopenharmony_ci /** 79b8a72a62Sopenharmony_ci * Device type of fitnessWatch. 80b8a72a62Sopenharmony_ci */ 81b8a72a62Sopenharmony_ci public static final String DEVICE_TYPE_FITNESSWATCH = "fitnessWatch"; 82b8a72a62Sopenharmony_ci 83b8a72a62Sopenharmony_ci /** 84b8a72a62Sopenharmony_ci * Device type of fitnessBand. 85b8a72a62Sopenharmony_ci */ 86b8a72a62Sopenharmony_ci public static final String DEVICE_TYPE_FITNESSBAND = "fitnessBand"; 87b8a72a62Sopenharmony_ci 88b8a72a62Sopenharmony_ci private static final String APPQF_SUFFIX = ".appqf"; 89b8a72a62Sopenharmony_ci private static final String APP_SUFFIX = ".app"; 90b8a72a62Sopenharmony_ci private static final String HAP_SUFFIX = ".hap"; 91b8a72a62Sopenharmony_ci private static final String HSP_SUFFIX = ".hsp"; 92b8a72a62Sopenharmony_ci 93b8a72a62Sopenharmony_ci private static final int EXIT_STATUS_NORMAL = 0; 94b8a72a62Sopenharmony_ci private static final int EXIT_STATUS_EXCEPTION = 1; 95b8a72a62Sopenharmony_ci private static final Log LOG = new Log(UncompressEntrance.class.toString()); 96b8a72a62Sopenharmony_ci 97b8a72a62Sopenharmony_ci /** 98b8a72a62Sopenharmony_ci * Indicates the parseMode for parseApp interface. 99b8a72a62Sopenharmony_ci */ 100b8a72a62Sopenharmony_ci public enum ParseAppMode { 101b8a72a62Sopenharmony_ci ALL(0, "all"), 102b8a72a62Sopenharmony_ci HAP_LIST(1, "hap-list"), 103b8a72a62Sopenharmony_ci HAP_INFO(2, "hap-info"); 104b8a72a62Sopenharmony_ci 105b8a72a62Sopenharmony_ci ParseAppMode(int index, String type) { 106b8a72a62Sopenharmony_ci this.index = index; 107b8a72a62Sopenharmony_ci this.type = type; 108b8a72a62Sopenharmony_ci } 109b8a72a62Sopenharmony_ci 110b8a72a62Sopenharmony_ci public static String getType(int index) { 111b8a72a62Sopenharmony_ci for (UncompressEntrance.ParseAppMode resType : UncompressEntrance.ParseAppMode.values()) { 112b8a72a62Sopenharmony_ci if (resType.getIndex() == index) { 113b8a72a62Sopenharmony_ci return resType.type; 114b8a72a62Sopenharmony_ci } 115b8a72a62Sopenharmony_ci } 116b8a72a62Sopenharmony_ci return ""; 117b8a72a62Sopenharmony_ci } 118b8a72a62Sopenharmony_ci 119b8a72a62Sopenharmony_ci public int getIndex() { 120b8a72a62Sopenharmony_ci return index; 121b8a72a62Sopenharmony_ci } 122b8a72a62Sopenharmony_ci public String getType() { 123b8a72a62Sopenharmony_ci return type; 124b8a72a62Sopenharmony_ci } 125b8a72a62Sopenharmony_ci private final int index; 126b8a72a62Sopenharmony_ci private final String type; 127b8a72a62Sopenharmony_ci } 128b8a72a62Sopenharmony_ci 129b8a72a62Sopenharmony_ci /** 130b8a72a62Sopenharmony_ci * Unpack the app. 131b8a72a62Sopenharmony_ci * 132b8a72a62Sopenharmony_ci * @param appPath Indicates the app path. 133b8a72a62Sopenharmony_ci * @param outPath Indicates the out path. 134b8a72a62Sopenharmony_ci * @param deviceType Indicates the device type supported by the haps.If this parameter is null, all the haps will 135b8a72a62Sopenharmony_ci * be unpacked. 136b8a72a62Sopenharmony_ci * @param unpackApk Indicates whether to decompress the apk file in the hap.The default value is {@code false}, 137b8a72a62Sopenharmony_ci * not unpack the apk file. 138b8a72a62Sopenharmony_ci * @return Return the unpack result. 139b8a72a62Sopenharmony_ci */ 140b8a72a62Sopenharmony_ci public static boolean unpack(String appPath, String outPath, String deviceType, boolean unpackApk) { 141b8a72a62Sopenharmony_ci if (appPath == null || appPath.isEmpty()) { 142b8a72a62Sopenharmony_ci LOG.error("UncompressEntrance::unpack appPath is invalid!"); 143b8a72a62Sopenharmony_ci return false; 144b8a72a62Sopenharmony_ci } 145b8a72a62Sopenharmony_ci 146b8a72a62Sopenharmony_ci if (outPath == null || outPath.isEmpty()) { 147b8a72a62Sopenharmony_ci LOG.error("UncompressEntrance::unpack outPath is invalid!"); 148b8a72a62Sopenharmony_ci return false; 149b8a72a62Sopenharmony_ci } 150b8a72a62Sopenharmony_ci 151b8a72a62Sopenharmony_ci Utility utility = new Utility(); 152b8a72a62Sopenharmony_ci utility.setMode(Utility.MODE_APP); 153b8a72a62Sopenharmony_ci utility.setAppPath(appPath); 154b8a72a62Sopenharmony_ci utility.setDeviceType(deviceType == null ? "" : deviceType); 155b8a72a62Sopenharmony_ci utility.setOutPath(outPath); 156b8a72a62Sopenharmony_ci utility.setUnpackApk(String.valueOf(unpackApk)); 157b8a72a62Sopenharmony_ci utility.setForceRewrite("true"); 158b8a72a62Sopenharmony_ci 159b8a72a62Sopenharmony_ci if (!UncompressVerify.commandVerify(utility)) { 160b8a72a62Sopenharmony_ci LOG.error("CompressEntrance::unpack verity failed"); 161b8a72a62Sopenharmony_ci return false; 162b8a72a62Sopenharmony_ci } 163b8a72a62Sopenharmony_ci 164b8a72a62Sopenharmony_ci if (!Uncompress.unpackageProcess(utility)) { 165b8a72a62Sopenharmony_ci LOG.error("UncompressEntrance::unpackageProcess failed"); 166b8a72a62Sopenharmony_ci return false; 167b8a72a62Sopenharmony_ci } 168b8a72a62Sopenharmony_ci 169b8a72a62Sopenharmony_ci return true; 170b8a72a62Sopenharmony_ci } 171b8a72a62Sopenharmony_ci 172b8a72a62Sopenharmony_ci /** 173b8a72a62Sopenharmony_ci * Unpack the hap. 174b8a72a62Sopenharmony_ci * 175b8a72a62Sopenharmony_ci * @param hapPath Indicates the hap path. 176b8a72a62Sopenharmony_ci * @param outPath Indicates the out path. 177b8a72a62Sopenharmony_ci * @param unpackApk Indicates whether to decompress the apk file in the hap.The default value is {@code false}, 178b8a72a62Sopenharmony_ci * not unpack the apk file. 179b8a72a62Sopenharmony_ci * @return Return the unpack result. 180b8a72a62Sopenharmony_ci */ 181b8a72a62Sopenharmony_ci public static boolean unpackHap(String hapPath, String outPath, boolean unpackApk) { 182b8a72a62Sopenharmony_ci if (hapPath == null || hapPath.isEmpty()) { 183b8a72a62Sopenharmony_ci LOG.error("UncompressEntrance::unpackHap hapPath is invalid!"); 184b8a72a62Sopenharmony_ci return false; 185b8a72a62Sopenharmony_ci } 186b8a72a62Sopenharmony_ci 187b8a72a62Sopenharmony_ci if (outPath == null || outPath.isEmpty()) { 188b8a72a62Sopenharmony_ci LOG.error("UncompressEntrance::unpackHap outPath is invalid!"); 189b8a72a62Sopenharmony_ci return false; 190b8a72a62Sopenharmony_ci } 191b8a72a62Sopenharmony_ci 192b8a72a62Sopenharmony_ci Utility utility = new Utility(); 193b8a72a62Sopenharmony_ci utility.setMode(Utility.MODE_HAP); 194b8a72a62Sopenharmony_ci utility.setHapPath(hapPath); 195b8a72a62Sopenharmony_ci utility.setDeviceType(""); 196b8a72a62Sopenharmony_ci utility.setOutPath(outPath); 197b8a72a62Sopenharmony_ci utility.setUnpackApk(String.valueOf(unpackApk)); 198b8a72a62Sopenharmony_ci utility.setForceRewrite("true"); 199b8a72a62Sopenharmony_ci 200b8a72a62Sopenharmony_ci if (!UncompressVerify.commandVerify(utility)) { 201b8a72a62Sopenharmony_ci LOG.error("CompressEntrance::unpackHap verity failed"); 202b8a72a62Sopenharmony_ci return false; 203b8a72a62Sopenharmony_ci } 204b8a72a62Sopenharmony_ci 205b8a72a62Sopenharmony_ci if (!Uncompress.unpackageProcess(utility)) { 206b8a72a62Sopenharmony_ci LOG.error("UncompressEntrance::unpackageProcess failed"); 207b8a72a62Sopenharmony_ci return false; 208b8a72a62Sopenharmony_ci } 209b8a72a62Sopenharmony_ci 210b8a72a62Sopenharmony_ci return true; 211b8a72a62Sopenharmony_ci } 212b8a72a62Sopenharmony_ci 213b8a72a62Sopenharmony_ci 214b8a72a62Sopenharmony_ci /** 215b8a72a62Sopenharmony_ci * Parse the app. 216b8a72a62Sopenharmony_ci * 217b8a72a62Sopenharmony_ci * @param appPath Indicates the app path. 218b8a72a62Sopenharmony_ci * @param parseMode Indicates the parse mode, which can be {@link #PARSE_MODE_HAPLIST}, {@link #PARSE_MODE_HAPINFO}, 219b8a72a62Sopenharmony_ci * {@link #PARSE_MODE_ALL}. 220b8a72a62Sopenharmony_ci * @param deviceType Indicates the device type supported by the haps, This parameter is required 221b8a72a62Sopenharmony_ci * when {@code #parseMode} is {@link #PARSE_MODE_HAPLIST}. 222b8a72a62Sopenharmony_ci * @param hapName Indicates the hap name, This parameter is required when {@code #parseMode} 223b8a72a62Sopenharmony_ci * is {@link #PARSE_MODE_HAPINFO}. 224b8a72a62Sopenharmony_ci * @param outPath Indicates the out path to unpack the files. 225b8a72a62Sopenharmony_ci * @return Return the uncomperss result of parseApp 226b8a72a62Sopenharmony_ci * @deprecated 227b8a72a62Sopenharmony_ci */ 228b8a72a62Sopenharmony_ci public static UncompressResult parseApp(String appPath, String parseMode, String deviceType, String hapName, 229b8a72a62Sopenharmony_ci String outPath) { 230b8a72a62Sopenharmony_ci UncompressResult compressResult = new UncompressResult(); 231b8a72a62Sopenharmony_ci 232b8a72a62Sopenharmony_ci Utility utility = new Utility(); 233b8a72a62Sopenharmony_ci utility.setAppPath(appPath); 234b8a72a62Sopenharmony_ci utility.setParseMode(parseMode); 235b8a72a62Sopenharmony_ci utility.setDeviceType(deviceType == null ? "" : deviceType); 236b8a72a62Sopenharmony_ci utility.setHapName(hapName == null ? "" : hapName); 237b8a72a62Sopenharmony_ci 238b8a72a62Sopenharmony_ci if (!UncompressVerify.isPathValid(utility.getAppPath(), true, APP_SUFFIX)) { 239b8a72a62Sopenharmony_ci LOG.error("UncompressEntrance::parseApp must input a app file!"); 240b8a72a62Sopenharmony_ci compressResult.setResult(false); 241b8a72a62Sopenharmony_ci compressResult.setMessage("ParseApp verify failed"); 242b8a72a62Sopenharmony_ci return compressResult; 243b8a72a62Sopenharmony_ci } 244b8a72a62Sopenharmony_ci if (!UncompressVerify.isParseAppModeValid(utility.getParseMode(), utility.getHapName())) { 245b8a72a62Sopenharmony_ci compressResult.setResult(false); 246b8a72a62Sopenharmony_ci compressResult.setMessage("ParseApp verify failed"); 247b8a72a62Sopenharmony_ci return compressResult; 248b8a72a62Sopenharmony_ci } 249b8a72a62Sopenharmony_ci 250b8a72a62Sopenharmony_ci compressResult = Uncompress.uncompressAppByPath(utility); 251b8a72a62Sopenharmony_ci 252b8a72a62Sopenharmony_ci return compressResult; 253b8a72a62Sopenharmony_ci } 254b8a72a62Sopenharmony_ci 255b8a72a62Sopenharmony_ci /** 256b8a72a62Sopenharmony_ci * Parse the app. 257b8a72a62Sopenharmony_ci * 258b8a72a62Sopenharmony_ci * @param input Indicates the InputStream about the app package. 259b8a72a62Sopenharmony_ci * @param parseMode Indicates the parse mode, which can be {@link #PARSE_MODE_HAPLIST}, {@link #PARSE_MODE_HAPINFO}, 260b8a72a62Sopenharmony_ci * {@link #PARSE_MODE_ALL}. 261b8a72a62Sopenharmony_ci * @param deviceType Indicates the device type supported by the haps, This parameter is required 262b8a72a62Sopenharmony_ci * when {@code #parseMode} is {@link #PARSE_MODE_HAPLIST}. 263b8a72a62Sopenharmony_ci * @param hapName Indicates the hap name, This parameter is required when {@code #parseMode} 264b8a72a62Sopenharmony_ci * is {@link #PARSE_MODE_HAPINFO}. 265b8a72a62Sopenharmony_ci * @param outPath Indicates the out path to unzip temp files. 266b8a72a62Sopenharmony_ci * @return Return the uncomperss result of parseApp 267b8a72a62Sopenharmony_ci * @deprecated 268b8a72a62Sopenharmony_ci */ 269b8a72a62Sopenharmony_ci public static UncompressResult parseApp(InputStream input, String parseMode, String deviceType, String hapName, 270b8a72a62Sopenharmony_ci String outPath) { 271b8a72a62Sopenharmony_ci UncompressResult compressResult = new UncompressResult(); 272b8a72a62Sopenharmony_ci 273b8a72a62Sopenharmony_ci if (input == null) { 274b8a72a62Sopenharmony_ci LOG.error("UncompressEntrance::parseApp input is null!"); 275b8a72a62Sopenharmony_ci compressResult.setResult(false); 276b8a72a62Sopenharmony_ci compressResult.setMessage("ParseApp input is null"); 277b8a72a62Sopenharmony_ci return compressResult; 278b8a72a62Sopenharmony_ci } 279b8a72a62Sopenharmony_ci 280b8a72a62Sopenharmony_ci Utility utility = new Utility(); 281b8a72a62Sopenharmony_ci utility.setMode(Utility.MODE_APP); 282b8a72a62Sopenharmony_ci utility.setParseMode(parseMode); 283b8a72a62Sopenharmony_ci utility.setDeviceType(deviceType == null ? "" : deviceType); 284b8a72a62Sopenharmony_ci utility.setHapName(hapName == null ? "" : hapName); 285b8a72a62Sopenharmony_ci 286b8a72a62Sopenharmony_ci if (!UncompressVerify.isParseAppModeValid(utility.getParseMode(), utility.getHapName())) { 287b8a72a62Sopenharmony_ci compressResult.setResult(false); 288b8a72a62Sopenharmony_ci compressResult.setMessage("ParseApp verify failed"); 289b8a72a62Sopenharmony_ci return compressResult; 290b8a72a62Sopenharmony_ci } 291b8a72a62Sopenharmony_ci 292b8a72a62Sopenharmony_ci compressResult = Uncompress.uncompressAppByInput(utility, input); 293b8a72a62Sopenharmony_ci 294b8a72a62Sopenharmony_ci return compressResult; 295b8a72a62Sopenharmony_ci } 296b8a72a62Sopenharmony_ci 297b8a72a62Sopenharmony_ci /** 298b8a72a62Sopenharmony_ci * Parse the app. 299b8a72a62Sopenharmony_ci * 300b8a72a62Sopenharmony_ci * @param appPath Indicates the path about the app package. 301b8a72a62Sopenharmony_ci * @param parseAppMode Indicates the parse mode. 302b8a72a62Sopenharmony_ci * @param hapName Indicates the hap name, This parameter is required when {@code #parseMode} 303b8a72a62Sopenharmony_ci * is {@link #PARSE_MODE_HAPINFO}. 304b8a72a62Sopenharmony_ci * @return Return the uncomperss result of parseApp 305b8a72a62Sopenharmony_ci */ 306b8a72a62Sopenharmony_ci public static UncompressResult parseApp(String appPath, ParseAppMode parseAppMode, String hapName) { 307b8a72a62Sopenharmony_ci UncompressResult compressResult = new UncompressResult(); 308b8a72a62Sopenharmony_ci Utility utility = new Utility(); 309b8a72a62Sopenharmony_ci utility.setAppPath(appPath); 310b8a72a62Sopenharmony_ci utility.setParseMode(parseAppMode.getType()); 311b8a72a62Sopenharmony_ci utility.setDeviceType(""); 312b8a72a62Sopenharmony_ci utility.setHapName(hapName); 313b8a72a62Sopenharmony_ci if (!UncompressVerify.isPathValid(utility.getAppPath(), true, APP_SUFFIX)) { 314b8a72a62Sopenharmony_ci LOG.error("UncompressEntrance::parseApp must input a app file!"); 315b8a72a62Sopenharmony_ci compressResult.setResult(false); 316b8a72a62Sopenharmony_ci compressResult.setMessage("ParseApp verify failed"); 317b8a72a62Sopenharmony_ci return compressResult; 318b8a72a62Sopenharmony_ci } 319b8a72a62Sopenharmony_ci if (!UncompressVerify.isParseAppModeValid(utility.getParseMode(), utility.getHapName())) { 320b8a72a62Sopenharmony_ci compressResult.setResult(false); 321b8a72a62Sopenharmony_ci compressResult.setMessage("ParseApp verify failed"); 322b8a72a62Sopenharmony_ci return compressResult; 323b8a72a62Sopenharmony_ci } 324b8a72a62Sopenharmony_ci compressResult = Uncompress.uncompressAppByPath(utility); 325b8a72a62Sopenharmony_ci 326b8a72a62Sopenharmony_ci return compressResult; 327b8a72a62Sopenharmony_ci } 328b8a72a62Sopenharmony_ci 329b8a72a62Sopenharmony_ci /** 330b8a72a62Sopenharmony_ci * Parse the app. 331b8a72a62Sopenharmony_ci * 332b8a72a62Sopenharmony_ci * @param input Indicates the input stream about the app package. 333b8a72a62Sopenharmony_ci * @param parseAppMode Indicates the parse mode. 334b8a72a62Sopenharmony_ci * @param hapName Indicates the hap name, This parameter is required when {@code #parseMode} 335b8a72a62Sopenharmony_ci * is {@link #PARSE_MODE_HAPINFO}. 336b8a72a62Sopenharmony_ci * @return Return the uncomperss result of parseApp 337b8a72a62Sopenharmony_ci */ 338b8a72a62Sopenharmony_ci public static UncompressResult parseApp(InputStream input, ParseAppMode parseAppMode, String hapName) { 339b8a72a62Sopenharmony_ci UncompressResult compressResult = new UncompressResult(); 340b8a72a62Sopenharmony_ci if (input == null) { 341b8a72a62Sopenharmony_ci LOG.error("UncompressEntrance::parseApp input is null!"); 342b8a72a62Sopenharmony_ci compressResult.setResult(false); 343b8a72a62Sopenharmony_ci compressResult.setMessage("ParseApp input is null"); 344b8a72a62Sopenharmony_ci return compressResult; 345b8a72a62Sopenharmony_ci } 346b8a72a62Sopenharmony_ci Utility utility = new Utility(); 347b8a72a62Sopenharmony_ci utility.setParseMode(parseAppMode.getType()); 348b8a72a62Sopenharmony_ci utility.setDeviceType(""); 349b8a72a62Sopenharmony_ci utility.setHapName(hapName); 350b8a72a62Sopenharmony_ci if (!UncompressVerify.isParseAppModeValid(utility.getParseMode(), utility.getHapName())) { 351b8a72a62Sopenharmony_ci compressResult.setResult(false); 352b8a72a62Sopenharmony_ci compressResult.setMessage("ParseApp verify failed"); 353b8a72a62Sopenharmony_ci return compressResult; 354b8a72a62Sopenharmony_ci } 355b8a72a62Sopenharmony_ci compressResult = Uncompress.uncompressAppByInput(utility, input); 356b8a72a62Sopenharmony_ci return compressResult; 357b8a72a62Sopenharmony_ci } 358b8a72a62Sopenharmony_ci 359b8a72a62Sopenharmony_ci /** 360b8a72a62Sopenharmony_ci * Parse the hap. 361b8a72a62Sopenharmony_ci * 362b8a72a62Sopenharmony_ci * @param hapPath Indicates the hap path. 363b8a72a62Sopenharmony_ci * @return Return the uncomperss result of parseHap 364b8a72a62Sopenharmony_ci */ 365b8a72a62Sopenharmony_ci public static UncompressResult parseHap(String hapPath) { 366b8a72a62Sopenharmony_ci UncompressResult compressResult = new UncompressResult(); 367b8a72a62Sopenharmony_ci 368b8a72a62Sopenharmony_ci Utility utility = new Utility(); 369b8a72a62Sopenharmony_ci utility.setHapPath(hapPath); 370b8a72a62Sopenharmony_ci if (!UncompressVerify.isPathValid(utility.getHapPath(), true, HAP_SUFFIX) && 371b8a72a62Sopenharmony_ci !UncompressVerify.isPathValid(utility.getHapPath(), true, HSP_SUFFIX)) { 372b8a72a62Sopenharmony_ci LOG.error("UncompressEntrance::parseHap must input a hap file!"); 373b8a72a62Sopenharmony_ci compressResult.setResult(false); 374b8a72a62Sopenharmony_ci compressResult.setMessage("ParseHap hapPath is invalid"); 375b8a72a62Sopenharmony_ci } 376b8a72a62Sopenharmony_ci 377b8a72a62Sopenharmony_ci compressResult = Uncompress.uncompressHap(utility); 378b8a72a62Sopenharmony_ci 379b8a72a62Sopenharmony_ci return compressResult; 380b8a72a62Sopenharmony_ci } 381b8a72a62Sopenharmony_ci 382b8a72a62Sopenharmony_ci /** 383b8a72a62Sopenharmony_ci * Parse the hap. 384b8a72a62Sopenharmony_ci * 385b8a72a62Sopenharmony_ci * @param input Indicates the InputStream about the app package. 386b8a72a62Sopenharmony_ci * @return Return the uncomperss result of parseHap 387b8a72a62Sopenharmony_ci */ 388b8a72a62Sopenharmony_ci public static UncompressResult parseHap(InputStream input) { 389b8a72a62Sopenharmony_ci UncompressResult compressResult = new UncompressResult(); 390b8a72a62Sopenharmony_ci 391b8a72a62Sopenharmony_ci if (input == null) { 392b8a72a62Sopenharmony_ci LOG.error("UncompressEntrance::parseHap input is null!"); 393b8a72a62Sopenharmony_ci compressResult.setResult(false); 394b8a72a62Sopenharmony_ci compressResult.setMessage("ParseHap input is null"); 395b8a72a62Sopenharmony_ci return compressResult; 396b8a72a62Sopenharmony_ci } 397b8a72a62Sopenharmony_ci 398b8a72a62Sopenharmony_ci Utility utility = new Utility(); 399b8a72a62Sopenharmony_ci compressResult = Uncompress.uncompressHapByInput(utility, input); 400b8a72a62Sopenharmony_ci return compressResult; 401b8a72a62Sopenharmony_ci } 402b8a72a62Sopenharmony_ci 403b8a72a62Sopenharmony_ci /** 404b8a72a62Sopenharmony_ci * Parse the hap resource. 405b8a72a62Sopenharmony_ci * 406b8a72a62Sopenharmony_ci * @param hapPath Indicates the hap path. 407b8a72a62Sopenharmony_ci * @return Return the List<ResourceIndexResult> result of parseHap 408b8a72a62Sopenharmony_ci */ 409b8a72a62Sopenharmony_ci public static List<ResourceIndexResult> parseResource(String hapPath) throws BundleException, IOException { 410b8a72a62Sopenharmony_ci return getResourceFromHap(hapPath); 411b8a72a62Sopenharmony_ci } 412b8a72a62Sopenharmony_ci 413b8a72a62Sopenharmony_ci /** 414b8a72a62Sopenharmony_ci * Parse the appqf file. 415b8a72a62Sopenharmony_ci * 416b8a72a62Sopenharmony_ci * @param appqfPath Indicates the hap path. 417b8a72a62Sopenharmony_ci * @return Return the List<ResourceIndexResult> result of parseHap 418b8a72a62Sopenharmony_ci */ 419b8a72a62Sopenharmony_ci public static APPQFResult parseAPPQF(String appqfPath) { 420b8a72a62Sopenharmony_ci APPQFResult result = new APPQFResult(); 421b8a72a62Sopenharmony_ci if (!appqfPath.endsWith(APPQF_SUFFIX)) { 422b8a72a62Sopenharmony_ci LOG.error("UncompressEntrance::parseAPPQF Error, input wrong type APPQF file!"); 423b8a72a62Sopenharmony_ci result.setSuccess(false); 424b8a72a62Sopenharmony_ci } 425b8a72a62Sopenharmony_ci try { 426b8a72a62Sopenharmony_ci result.setHqfInfoList(Uncompress.parseAPPQFFile(appqfPath)); 427b8a72a62Sopenharmony_ci result.setSuccess(true); 428b8a72a62Sopenharmony_ci } catch (BundleException e) { 429b8a72a62Sopenharmony_ci LOG.error("UncompressEntrance::parseAPPQF failed, read patch.json in APPQF file failed!"); 430b8a72a62Sopenharmony_ci result.setSuccess(false); 431b8a72a62Sopenharmony_ci } 432b8a72a62Sopenharmony_ci return result; 433b8a72a62Sopenharmony_ci } 434b8a72a62Sopenharmony_ci 435b8a72a62Sopenharmony_ci /** 436b8a72a62Sopenharmony_ci * uncompress tool main function. 437b8a72a62Sopenharmony_ci * 438b8a72a62Sopenharmony_ci * @param args command line 439b8a72a62Sopenharmony_ci */ 440b8a72a62Sopenharmony_ci public static void main(String[] args) { 441b8a72a62Sopenharmony_ci Utility utility = new Utility(); 442b8a72a62Sopenharmony_ci 443b8a72a62Sopenharmony_ci if (!CommandParser.commandParser(utility, args)) { 444b8a72a62Sopenharmony_ci LOG.error("UncompressEntrance::main exit, parser failed"); 445b8a72a62Sopenharmony_ci ShowHelp.uncompressHelp(); 446b8a72a62Sopenharmony_ci System.exit(EXIT_STATUS_EXCEPTION); 447b8a72a62Sopenharmony_ci } 448b8a72a62Sopenharmony_ci 449b8a72a62Sopenharmony_ci if (!UncompressVerify.commandVerify(utility)) { 450b8a72a62Sopenharmony_ci LOG.error("UncompressEntrance::main exit, verify failed"); 451b8a72a62Sopenharmony_ci ShowHelp.uncompressHelp(); 452b8a72a62Sopenharmony_ci System.exit(EXIT_STATUS_EXCEPTION); 453b8a72a62Sopenharmony_ci } 454b8a72a62Sopenharmony_ci 455b8a72a62Sopenharmony_ci if (!Uncompress.unpackageProcess(utility)) { 456b8a72a62Sopenharmony_ci LOG.error("UncompressEntrance::main exit, uncompress failed"); 457b8a72a62Sopenharmony_ci ShowHelp.uncompressHelp(); 458b8a72a62Sopenharmony_ci System.exit(EXIT_STATUS_EXCEPTION); 459b8a72a62Sopenharmony_ci } 460b8a72a62Sopenharmony_ci 461b8a72a62Sopenharmony_ci System.exit(EXIT_STATUS_NORMAL); 462b8a72a62Sopenharmony_ci } 463b8a72a62Sopenharmony_ci}