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}