1fb299fa2Sopenharmony_ci/*
2fb299fa2Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
3fb299fa2Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fb299fa2Sopenharmony_ci * you may not use this file except in compliance with the License.
5fb299fa2Sopenharmony_ci * You may obtain a copy of the License at
6fb299fa2Sopenharmony_ci *
7fb299fa2Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8fb299fa2Sopenharmony_ci *
9fb299fa2Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fb299fa2Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fb299fa2Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fb299fa2Sopenharmony_ci * See the License for the specific language governing permissions and
13fb299fa2Sopenharmony_ci * limitations under the License.
14fb299fa2Sopenharmony_ci */
15fb299fa2Sopenharmony_ci#include "package/package.h"
16fb299fa2Sopenharmony_ci#include <cstdio>
17fb299fa2Sopenharmony_ci#include <cstdlib>
18fb299fa2Sopenharmony_ci#include <iostream>
19fb299fa2Sopenharmony_ci#include <memory>
20fb299fa2Sopenharmony_ci#include "log/log.h"
21fb299fa2Sopenharmony_ci#include "package/pkg_manager.h"
22fb299fa2Sopenharmony_ci#include "securec.h"
23fb299fa2Sopenharmony_ci
24fb299fa2Sopenharmony_ciusing namespace Updater;
25fb299fa2Sopenharmony_ciusing namespace Hpackage;
26fb299fa2Sopenharmony_ciconstexpr uint32_t VERIFY_FINSH_PERCENT = 100;
27fb299fa2Sopenharmony_ciconstexpr uint32_t MAX_ENTRY_COUNT = 4096;
28fb299fa2Sopenharmony_ci
29fb299fa2Sopenharmony_cinamespace {
30fb299fa2Sopenharmony_ciint32_t GetUpgradePkgInfo(UpgradePkgInfo *upgradePackageInfo,
31fb299fa2Sopenharmony_ci    std::vector<std::pair<std::string, ComponentInfo>> &files,
32fb299fa2Sopenharmony_ci    const UpgradePkgInfoExt *pkgInfoExt,
33fb299fa2Sopenharmony_ci    std::vector<ComponentInfoExt> &compInfo)
34fb299fa2Sopenharmony_ci{
35fb299fa2Sopenharmony_ci    if (pkgInfoExt->entryCount > MAX_ENTRY_COUNT) {
36fb299fa2Sopenharmony_ci        LOG(ERROR) << "entry count oversized " << pkgInfoExt->entryCount << ", " << MAX_ENTRY_COUNT;
37fb299fa2Sopenharmony_ci        return PKG_INVALID_PARAM;
38fb299fa2Sopenharmony_ci    }
39fb299fa2Sopenharmony_ci
40fb299fa2Sopenharmony_ci    upgradePackageInfo->updateFileVersion = pkgInfoExt->updateFileVersion;
41fb299fa2Sopenharmony_ci    if (pkgInfoExt->softwareVersion != nullptr) {
42fb299fa2Sopenharmony_ci        upgradePackageInfo->softwareVersion = pkgInfoExt->softwareVersion;
43fb299fa2Sopenharmony_ci    }
44fb299fa2Sopenharmony_ci    if (pkgInfoExt->productUpdateId != nullptr) {
45fb299fa2Sopenharmony_ci        upgradePackageInfo->productUpdateId = pkgInfoExt->productUpdateId;
46fb299fa2Sopenharmony_ci    }
47fb299fa2Sopenharmony_ci    if (pkgInfoExt->descriptPackageId != nullptr) {
48fb299fa2Sopenharmony_ci        upgradePackageInfo->descriptPackageId = pkgInfoExt->descriptPackageId;
49fb299fa2Sopenharmony_ci    }
50fb299fa2Sopenharmony_ci    if (pkgInfoExt->time != nullptr) {
51fb299fa2Sopenharmony_ci        upgradePackageInfo->time = pkgInfoExt->time;
52fb299fa2Sopenharmony_ci    }
53fb299fa2Sopenharmony_ci    if (pkgInfoExt->date != nullptr) {
54fb299fa2Sopenharmony_ci        upgradePackageInfo->date = pkgInfoExt->date;
55fb299fa2Sopenharmony_ci    }
56fb299fa2Sopenharmony_ci    upgradePackageInfo->pkgInfo.digestMethod = pkgInfoExt->digestMethod;
57fb299fa2Sopenharmony_ci    upgradePackageInfo->pkgInfo.signMethod = pkgInfoExt->signMethod;
58fb299fa2Sopenharmony_ci    upgradePackageInfo->pkgInfo.entryCount = pkgInfoExt->entryCount;
59fb299fa2Sopenharmony_ci    upgradePackageInfo->pkgInfo.pkgType = PKG_PACK_TYPE_UPGRADE;
60fb299fa2Sopenharmony_ci    files.resize(pkgInfoExt->entryCount);
61fb299fa2Sopenharmony_ci    for (uint32_t i = 0; i < pkgInfoExt->entryCount; i++) {
62fb299fa2Sopenharmony_ci        files[i].first.assign(compInfo[i].filePath);
63fb299fa2Sopenharmony_ci        ComponentInfo* info = &files[i].second;
64fb299fa2Sopenharmony_ci        if (memcpy_s(info->digest, sizeof(info->digest), compInfo[i].digest, sizeof(info->digest)) != EOK) {
65fb299fa2Sopenharmony_ci            LOG(ERROR) << "GetUpgradePkgInfo memcpy failed";
66fb299fa2Sopenharmony_ci            return PKG_NONE_MEMORY;
67fb299fa2Sopenharmony_ci        }
68fb299fa2Sopenharmony_ci        info->fileInfo.identity.assign(compInfo[i].componentAddr);
69fb299fa2Sopenharmony_ci        info->fileInfo.unpackedSize = compInfo[i].size;
70fb299fa2Sopenharmony_ci        info->fileInfo.packedSize = compInfo[i].size;
71fb299fa2Sopenharmony_ci        info->fileInfo.packMethod = PKG_COMPRESS_METHOD_NONE;
72fb299fa2Sopenharmony_ci        info->fileInfo.digestMethod = pkgInfoExt->digestMethod;
73fb299fa2Sopenharmony_ci        info->version.assign(compInfo[i].version);
74fb299fa2Sopenharmony_ci        info->id = compInfo[i].id;
75fb299fa2Sopenharmony_ci        info->resType = compInfo[i].resType;
76fb299fa2Sopenharmony_ci        info->type = compInfo[i].type;
77fb299fa2Sopenharmony_ci        info->originalSize = compInfo[i].originalSize;
78fb299fa2Sopenharmony_ci        info->compFlags = compInfo[i].flags;
79fb299fa2Sopenharmony_ci    }
80fb299fa2Sopenharmony_ci    return PKG_SUCCESS;
81fb299fa2Sopenharmony_ci}
82fb299fa2Sopenharmony_ci
83fb299fa2Sopenharmony_ciint32_t GetZipPkgInfo(PkgManager::PkgInfoPtr pkgInfo,
84fb299fa2Sopenharmony_ci    std::vector<std::pair<std::string, ZipFileInfo>> &files,
85fb299fa2Sopenharmony_ci    const UpgradePkgInfoExt *pkgInfoExt,
86fb299fa2Sopenharmony_ci    std::vector<ComponentInfoExt> &compInfo)
87fb299fa2Sopenharmony_ci{
88fb299fa2Sopenharmony_ci    if (pkgInfoExt->entryCount > MAX_ENTRY_COUNT) {
89fb299fa2Sopenharmony_ci        LOG(ERROR) << "entry count oversized " << pkgInfoExt->entryCount << ", " << MAX_ENTRY_COUNT;
90fb299fa2Sopenharmony_ci        return PKG_INVALID_PARAM;
91fb299fa2Sopenharmony_ci    }
92fb299fa2Sopenharmony_ci
93fb299fa2Sopenharmony_ci    pkgInfo->signMethod = pkgInfoExt->signMethod;
94fb299fa2Sopenharmony_ci    pkgInfo->digestMethod  = pkgInfoExt->digestMethod;
95fb299fa2Sopenharmony_ci    pkgInfo->entryCount = pkgInfoExt->entryCount;
96fb299fa2Sopenharmony_ci    pkgInfo->pkgType = pkgInfoExt->pkgType;
97fb299fa2Sopenharmony_ci    files.resize(pkgInfoExt->entryCount);
98fb299fa2Sopenharmony_ci    for (uint32_t i = 0; i < pkgInfo->entryCount; i++) {
99fb299fa2Sopenharmony_ci        files[i].first.assign(compInfo[i].filePath);
100fb299fa2Sopenharmony_ci        ZipFileInfo* info = &files[i].second;
101fb299fa2Sopenharmony_ci        info->fileInfo.identity.assign(compInfo[i].componentAddr);
102fb299fa2Sopenharmony_ci        info->fileInfo.packMethod = PKG_COMPRESS_METHOD_ZIP;
103fb299fa2Sopenharmony_ci        info->fileInfo.digestMethod = PKG_DIGEST_TYPE_CRC;
104fb299fa2Sopenharmony_ci    }
105fb299fa2Sopenharmony_ci    return PKG_SUCCESS;
106fb299fa2Sopenharmony_ci}
107fb299fa2Sopenharmony_ci
108fb299fa2Sopenharmony_ciint32_t GetLz4PkgInfo(PkgManager::PkgInfoPtr pkgInfo,
109fb299fa2Sopenharmony_ci    std::vector<std::pair<std::string, Lz4FileInfo>> &files,
110fb299fa2Sopenharmony_ci    const UpgradePkgInfoExt *pkgInfoExt,
111fb299fa2Sopenharmony_ci    std::vector<ComponentInfoExt> &compInfo)
112fb299fa2Sopenharmony_ci{
113fb299fa2Sopenharmony_ci    if (pkgInfoExt->entryCount > MAX_ENTRY_COUNT) {
114fb299fa2Sopenharmony_ci        LOG(ERROR) << "entry count oversized " << pkgInfoExt->entryCount << ", " << MAX_ENTRY_COUNT;
115fb299fa2Sopenharmony_ci        return PKG_INVALID_PARAM;
116fb299fa2Sopenharmony_ci    }
117fb299fa2Sopenharmony_ci
118fb299fa2Sopenharmony_ci    pkgInfo->signMethod = pkgInfoExt->signMethod;
119fb299fa2Sopenharmony_ci    pkgInfo->digestMethod  = pkgInfoExt->digestMethod;
120fb299fa2Sopenharmony_ci    pkgInfo->entryCount = pkgInfoExt->entryCount;
121fb299fa2Sopenharmony_ci    pkgInfo->pkgType = PKG_PACK_TYPE_LZ4;
122fb299fa2Sopenharmony_ci    files.resize(pkgInfoExt->entryCount);
123fb299fa2Sopenharmony_ci    for (uint32_t i = 0; i < pkgInfoExt->entryCount; i++) {
124fb299fa2Sopenharmony_ci        files[i].first.assign(compInfo[i].filePath);
125fb299fa2Sopenharmony_ci        Lz4FileInfo* info = &files[i].second;
126fb299fa2Sopenharmony_ci        info->fileInfo.identity.assign(compInfo[i].componentAddr);
127fb299fa2Sopenharmony_ci        info->fileInfo.packMethod = PKG_COMPRESS_METHOD_LZ4;
128fb299fa2Sopenharmony_ci        info->fileInfo.digestMethod = PKG_DIGEST_TYPE_CRC;
129fb299fa2Sopenharmony_ci        info->compressionLevel = MID_COMPRESS_LEVEL;
130fb299fa2Sopenharmony_ci        info->blockSizeID = 0;
131fb299fa2Sopenharmony_ci        info->contentChecksumFlag = 0;
132fb299fa2Sopenharmony_ci        info->blockIndependence = 0;
133fb299fa2Sopenharmony_ci    }
134fb299fa2Sopenharmony_ci    return PKG_SUCCESS;
135fb299fa2Sopenharmony_ci}
136fb299fa2Sopenharmony_ci}
137fb299fa2Sopenharmony_ci
138fb299fa2Sopenharmony_ciint32_t CreatePackage(const UpgradePkgInfoExt *pkgInfoExt,
139fb299fa2Sopenharmony_ci    std::vector<ComponentInfoExt> &compInfo,
140fb299fa2Sopenharmony_ci    const char *path,
141fb299fa2Sopenharmony_ci    const char *keyPath)
142fb299fa2Sopenharmony_ci{
143fb299fa2Sopenharmony_ci    if (pkgInfoExt == nullptr || path == nullptr || keyPath == nullptr || pkgInfoExt->entryCount > compInfo.size()) {
144fb299fa2Sopenharmony_ci        LOG(ERROR) << "Check param fail ";
145fb299fa2Sopenharmony_ci        return PKG_INVALID_PARAM;
146fb299fa2Sopenharmony_ci    }
147fb299fa2Sopenharmony_ci    PkgManager::PkgManagerPtr manager = PkgManager::CreatePackageInstance();
148fb299fa2Sopenharmony_ci    if (manager == nullptr) {
149fb299fa2Sopenharmony_ci        LOG(ERROR) << "CreatePackageInstance fail ";
150fb299fa2Sopenharmony_ci        return PKG_INVALID_PARAM;
151fb299fa2Sopenharmony_ci    }
152fb299fa2Sopenharmony_ci
153fb299fa2Sopenharmony_ci    int32_t ret = PKG_SUCCESS;
154fb299fa2Sopenharmony_ci    switch (pkgInfoExt->pkgType) {
155fb299fa2Sopenharmony_ci        case PKG_PACK_TYPE_UPGRADE: {
156fb299fa2Sopenharmony_ci            UpgradePkgInfo upgradePackageInfo;
157fb299fa2Sopenharmony_ci            std::vector<std::pair<std::string, ComponentInfo>> files;
158fb299fa2Sopenharmony_ci            ret = GetUpgradePkgInfo(&upgradePackageInfo, files, pkgInfoExt, compInfo);
159fb299fa2Sopenharmony_ci            if (ret == PKG_SUCCESS) {
160fb299fa2Sopenharmony_ci                ret = manager->CreatePackage(path, keyPath, &upgradePackageInfo.pkgInfo, files);
161fb299fa2Sopenharmony_ci            }
162fb299fa2Sopenharmony_ci            break;
163fb299fa2Sopenharmony_ci        }
164fb299fa2Sopenharmony_ci        case PKG_PACK_TYPE_ZIP:
165fb299fa2Sopenharmony_ci        case PKG_PACK_TYPE_GZIP: {
166fb299fa2Sopenharmony_ci            PkgInfo info;
167fb299fa2Sopenharmony_ci            std::vector<std::pair<std::string, ZipFileInfo>> files;
168fb299fa2Sopenharmony_ci            ret = GetZipPkgInfo(&info, files, pkgInfoExt, compInfo);
169fb299fa2Sopenharmony_ci            if (ret == PKG_SUCCESS) {
170fb299fa2Sopenharmony_ci                ret = manager->CreatePackage(path, keyPath, &info, files);
171fb299fa2Sopenharmony_ci            }
172fb299fa2Sopenharmony_ci            break;
173fb299fa2Sopenharmony_ci        }
174fb299fa2Sopenharmony_ci        case PKG_PACK_TYPE_LZ4: {
175fb299fa2Sopenharmony_ci            PkgInfo info;
176fb299fa2Sopenharmony_ci            std::vector<std::pair<std::string, Lz4FileInfo>> files;
177fb299fa2Sopenharmony_ci            ret = GetLz4PkgInfo(&info, files, pkgInfoExt, compInfo);
178fb299fa2Sopenharmony_ci            if (ret == PKG_SUCCESS) {
179fb299fa2Sopenharmony_ci                ret = manager->CreatePackage(path, keyPath, &info, files);
180fb299fa2Sopenharmony_ci            }
181fb299fa2Sopenharmony_ci            break;
182fb299fa2Sopenharmony_ci        }
183fb299fa2Sopenharmony_ci        default:
184fb299fa2Sopenharmony_ci            ret = PKG_INVALID_PARAM;
185fb299fa2Sopenharmony_ci            break;
186fb299fa2Sopenharmony_ci    }
187fb299fa2Sopenharmony_ci    PkgManager::ReleasePackageInstance(manager);
188fb299fa2Sopenharmony_ci    return ret;
189fb299fa2Sopenharmony_ci}
190fb299fa2Sopenharmony_ci
191fb299fa2Sopenharmony_ciint32_t VerifyPackage(const char *packagePath,
192fb299fa2Sopenharmony_ci    const char *keyPath,
193fb299fa2Sopenharmony_ci    const char *version,
194fb299fa2Sopenharmony_ci    const uint8_t *digest,
195fb299fa2Sopenharmony_ci    size_t size)
196fb299fa2Sopenharmony_ci{
197fb299fa2Sopenharmony_ci    if (packagePath == nullptr || keyPath == nullptr || version == nullptr) {
198fb299fa2Sopenharmony_ci        LOG(ERROR) << "Check param fail";
199fb299fa2Sopenharmony_ci        return PKG_INVALID_PARAM;
200fb299fa2Sopenharmony_ci    }
201fb299fa2Sopenharmony_ci    PkgManager::PkgManagerPtr manager = PkgManager::CreatePackageInstance();
202fb299fa2Sopenharmony_ci    if (manager == nullptr) {
203fb299fa2Sopenharmony_ci        LOG(ERROR) << "CreatePackageInstance fail";
204fb299fa2Sopenharmony_ci        return PKG_INVALID_PARAM;
205fb299fa2Sopenharmony_ci    }
206fb299fa2Sopenharmony_ci
207fb299fa2Sopenharmony_ci    PkgBuffer digestBuffer(const_cast<uint8_t*>(digest), size);
208fb299fa2Sopenharmony_ci    int32_t ret = manager->VerifyPackage(packagePath, keyPath, version, digestBuffer,
209fb299fa2Sopenharmony_ci        [](int32_t result, uint32_t percent) {});
210fb299fa2Sopenharmony_ci    PkgManager::ReleasePackageInstance(manager);
211fb299fa2Sopenharmony_ci    return ret;
212fb299fa2Sopenharmony_ci}
213fb299fa2Sopenharmony_ci
214fb299fa2Sopenharmony_ciint32_t VerifyPackageWithCallback(const std::string &packagePath,
215fb299fa2Sopenharmony_ci    const std::string &keyPath, std::function<void(int32_t result, uint32_t percent)> cb)
216fb299fa2Sopenharmony_ci{
217fb299fa2Sopenharmony_ci    if (packagePath.empty() || keyPath.empty() || cb == nullptr) {
218fb299fa2Sopenharmony_ci        return PKG_INVALID_PARAM;
219fb299fa2Sopenharmony_ci    }
220fb299fa2Sopenharmony_ci
221fb299fa2Sopenharmony_ci    PkgManager *manager = PkgManager::CreatePackageInstance();
222fb299fa2Sopenharmony_ci    if (manager == nullptr) {
223fb299fa2Sopenharmony_ci        LOG(ERROR) << "CreatePackageInstance fail";
224fb299fa2Sopenharmony_ci        return PKG_INVALID_PARAM;
225fb299fa2Sopenharmony_ci    }
226fb299fa2Sopenharmony_ci    PkgBuffer digestBuffer {};
227fb299fa2Sopenharmony_ci    std::string version {};
228fb299fa2Sopenharmony_ci    int32_t ret = manager->VerifyPackage(packagePath, keyPath, version, digestBuffer, cb);
229fb299fa2Sopenharmony_ci    if (ret != 0) {
230fb299fa2Sopenharmony_ci        cb(ret, VERIFY_FINSH_PERCENT);
231fb299fa2Sopenharmony_ci    }
232fb299fa2Sopenharmony_ci    PkgManager::ReleasePackageInstance(manager);
233fb299fa2Sopenharmony_ci    return ret;
234fb299fa2Sopenharmony_ci}
235fb299fa2Sopenharmony_ci
236fb299fa2Sopenharmony_ciint32_t ExtraPackageDir(const char *packagePath, [[maybe_unused]] const char *keyPath, const char *dir,
237fb299fa2Sopenharmony_ci    const char *outPath)
238fb299fa2Sopenharmony_ci{
239fb299fa2Sopenharmony_ci    if (packagePath == nullptr || outPath == nullptr) {
240fb299fa2Sopenharmony_ci        LOG(ERROR) << "Check param fail ";
241fb299fa2Sopenharmony_ci        return PKG_INVALID_PARAM;
242fb299fa2Sopenharmony_ci    }
243fb299fa2Sopenharmony_ci    PkgManager::PkgManagerPtr manager = PkgManager::CreatePackageInstance();
244fb299fa2Sopenharmony_ci    if (manager == nullptr) {
245fb299fa2Sopenharmony_ci        LOG(ERROR) << "CreatePackageInstance fail ";
246fb299fa2Sopenharmony_ci        return PKG_INVALID_PARAM;
247fb299fa2Sopenharmony_ci    }
248fb299fa2Sopenharmony_ci
249fb299fa2Sopenharmony_ci    std::vector<std::string> components;
250fb299fa2Sopenharmony_ci    int32_t ret = manager->LoadPackageWithoutUnPack(std::string(packagePath), components);
251fb299fa2Sopenharmony_ci    if (ret != PKG_SUCCESS) {
252fb299fa2Sopenharmony_ci        LOG(ERROR) << "LoadPackageWithoutUnPack fail";
253fb299fa2Sopenharmony_ci        PkgManager::ReleasePackageInstance(manager);
254fb299fa2Sopenharmony_ci        return ret;
255fb299fa2Sopenharmony_ci    }
256fb299fa2Sopenharmony_ci
257fb299fa2Sopenharmony_ci    for (size_t i = 0; i < components.size(); i++) {
258fb299fa2Sopenharmony_ci        if (dir != nullptr && components[i].compare(0, strlen(dir), dir) != 0) {
259fb299fa2Sopenharmony_ci            continue;
260fb299fa2Sopenharmony_ci        }
261fb299fa2Sopenharmony_ci        PkgManager::StreamPtr outStream = nullptr;
262fb299fa2Sopenharmony_ci        manager->CreatePkgStream(outStream, std::string(outPath) + components[i], 0, PkgStream::PkgStreamType_Write);
263fb299fa2Sopenharmony_ci        if (outStream == nullptr) {
264fb299fa2Sopenharmony_ci            LOG(ERROR) << "CreatePkgStream fail";
265fb299fa2Sopenharmony_ci            PkgManager::ReleasePackageInstance(manager);
266fb299fa2Sopenharmony_ci            return PKG_INVALID_STREAM;
267fb299fa2Sopenharmony_ci        }
268fb299fa2Sopenharmony_ci        manager->ExtractFile(components[i], outStream);
269fb299fa2Sopenharmony_ci        manager->ClosePkgStream(outStream);
270fb299fa2Sopenharmony_ci    }
271fb299fa2Sopenharmony_ci    PkgManager::ReleasePackageInstance(manager);
272fb299fa2Sopenharmony_ci    return PKG_SUCCESS;
273fb299fa2Sopenharmony_ci}
274fb299fa2Sopenharmony_ci
275fb299fa2Sopenharmony_ciint32_t ExtraPackageFile(const char *packagePath, [[maybe_unused]] const char *keyPath, const char *file,
276fb299fa2Sopenharmony_ci    const char *outPath)
277fb299fa2Sopenharmony_ci{
278fb299fa2Sopenharmony_ci    if (packagePath == nullptr || outPath == nullptr || file == nullptr) {
279fb299fa2Sopenharmony_ci        LOG(ERROR) << "Check param fail ";
280fb299fa2Sopenharmony_ci        return PKG_INVALID_PARAM;
281fb299fa2Sopenharmony_ci    }
282fb299fa2Sopenharmony_ci
283fb299fa2Sopenharmony_ci    PkgManager::PkgManagerPtr manager = PkgManager::CreatePackageInstance();
284fb299fa2Sopenharmony_ci    if (manager == nullptr) {
285fb299fa2Sopenharmony_ci        LOG(ERROR) << "Check param fail ";
286fb299fa2Sopenharmony_ci        return PKG_INVALID_PARAM;
287fb299fa2Sopenharmony_ci    }
288fb299fa2Sopenharmony_ci
289fb299fa2Sopenharmony_ci    std::vector<std::string> components;
290fb299fa2Sopenharmony_ci    int32_t ret = manager->LoadPackageWithoutUnPack(std::string(packagePath), components);
291fb299fa2Sopenharmony_ci    if (ret != PKG_SUCCESS) {
292fb299fa2Sopenharmony_ci        LOG(ERROR) << "LoadPackageWithoutUnPack fail";
293fb299fa2Sopenharmony_ci        PkgManager::ReleasePackageInstance(manager);
294fb299fa2Sopenharmony_ci        return ret;
295fb299fa2Sopenharmony_ci    }
296fb299fa2Sopenharmony_ci
297fb299fa2Sopenharmony_ci    PkgManager::StreamPtr outStream = nullptr;
298fb299fa2Sopenharmony_ci    manager->CreatePkgStream(outStream, std::string(outPath) + file, 0, PkgStream::PkgStreamType_Write);
299fb299fa2Sopenharmony_ci    if (outStream == nullptr) {
300fb299fa2Sopenharmony_ci        LOG(ERROR) << "CreatePkgStream fail";
301fb299fa2Sopenharmony_ci        PkgManager::ReleasePackageInstance(manager);
302fb299fa2Sopenharmony_ci        return PKG_INVALID_STREAM;
303fb299fa2Sopenharmony_ci    }
304fb299fa2Sopenharmony_ci    manager->ExtractFile(file, outStream);
305fb299fa2Sopenharmony_ci
306fb299fa2Sopenharmony_ci    manager->ClosePkgStream(outStream);
307fb299fa2Sopenharmony_ci    PkgManager::ReleasePackageInstance(manager);
308fb299fa2Sopenharmony_ci    return PKG_SUCCESS;
309fb299fa2Sopenharmony_ci}
310