diff --git a/interfaces/kits/cj/src/zip_ffi.cpp b/interfaces/kits/cj/src/zip_ffi.cpp index a8c6cd43a478f048ce1df93d0c0eddac592831b4..7627c0359fb70446a15d39ea540255ea9fbe93f6 100644 --- a/interfaces/kits/cj/src/zip_ffi.cpp +++ b/interfaces/kits/cj/src/zip_ffi.cpp @@ -328,7 +328,76 @@ ErrCode GetOriginalSize(const std::string& srcFile, int64_t& originalSize) } extern "C" { -FFI_EXPORT int32_t FfiBundleManagerCompressFile(const char* inFile, const char* outFile, RetOptions options) +int32_t FfiBundleManagerCompressFile(CArrUI8 inFile, CArrUI8 outFile, RetOptions options) +{ + std::vector inBytesVec; + for (int i = 0; i < inFile.len; i++) { + inBytesVec.push_back(inFile.data[i]); + } + std::string strInFile(inBytesVec.begin(), inBytesVec.end()); + std::vector outBytesVec; + for (int i = 0; i < outFile.len; i++) { + outBytesVec.push_back(outFile.data[i]); + } + std::string strOutFile(outBytesVec.begin(), outBytesVec.end()); + int32_t code = ERROR_CODE_ERRNO; + OPTIONS cOptions; + cOptions.level = static_cast(options.level); + cOptions.memLevel = static_cast(options.memLevel); + cOptions.strategy = static_cast(options.strategy); + + code = Zip(strInFile, strOutFile, cOptions); + int32_t err = CommonFunc::ConvertErrCode(code); + + return err; +} + +int32_t FfiBundleManagerDeCompressFileOptions(CArrUI8 inFile, CArrUI8 outFile, RetOptions options) +{ + std::vector inBytesVec; + for (int i = 0; i < inFile.len; i++) { + inBytesVec.push_back(inFile.data[i]); + } + std::string strInFile(inBytesVec.begin(), inBytesVec.end()); + std::vector outBytesVec; + for (int i = 0; i < outFile.len; i++) { + outBytesVec.push_back(outFile.data[i]); + } + std::string strOutFile(outBytesVec.begin(), outBytesVec.end()); + int32_t code = ERROR_CODE_ERRNO; + OPTIONS cOptions; + cOptions.level = static_cast(options.level); + cOptions.memLevel = static_cast(options.memLevel); + cOptions.strategy = static_cast(options.strategy); + + code = UnZip(strInFile, strOutFile, cOptions); + int32_t err = CommonFunc::ConvertErrCode(code); + + return err; +} + +int32_t FfiBundleManagerDeCompressFile(CArrUI8 inFile, CArrUI8 outFile) +{ + std::vector inBytesVec; + for (int i = 0; i < inFile.len; i++) { + inBytesVec.push_back(inFile.data[i]); + } + std::string strInFile(inBytesVec.begin(), inBytesVec.end()); + std::vector outBytesVec; + for (int i = 0; i < outFile.len; i++) { + outBytesVec.push_back(outFile.data[i]); + } + std::string strOutFile(outBytesVec.begin(), outBytesVec.end()); + int32_t code = ERROR_CODE_ERRNO; + OPTIONS cOptions; + + code = UnZip(strInFile, strOutFile, cOptions); + int32_t err = CommonFunc::ConvertErrCode(code); + + return err; +} + +FFI_EXPORT int32_t FfiBundleManagerCompressFileV2(const char* inFile, const char* outFile, RetOptions options) { std::string strInFile(inFile); std::string strOutFile(outFile); @@ -344,7 +413,7 @@ FFI_EXPORT int32_t FfiBundleManagerCompressFile(const char* inFile, const char* return err; } -FFI_EXPORT int32_t FfiBundleManagerDeCompressFileOptions(const char* inFile, const char* outFile, RetOptions options) +FFI_EXPORT int32_t FfiBundleManagerDeCompressFileOptionsV2(const char* inFile, const char* outFile, RetOptions options) { std::string strInFile(inFile); std::string strOutFile(outFile); @@ -360,7 +429,7 @@ FFI_EXPORT int32_t FfiBundleManagerDeCompressFileOptions(const char* inFile, con return err; } -FFI_EXPORT int32_t FfiBundleManagerDeCompressFile(const char* inFile, const char* outFile) +FFI_EXPORT int32_t FfiBundleManagerDeCompressFileV2(const char* inFile, const char* outFile) { std::string strInFile(inFile); std::string strOutFile(outFile); diff --git a/interfaces/kits/cj/src/zip_ffi.h b/interfaces/kits/cj/src/zip_ffi.h index 4123f8e5f0525abf34ec099243ca231c35ff1301..a0a77a6fffcd68728a7a11833da7d3c3ff4f09a5 100644 --- a/interfaces/kits/cj/src/zip_ffi.h +++ b/interfaces/kits/cj/src/zip_ffi.h @@ -68,6 +68,17 @@ struct DeflateInit2Param { int32_t strategy; }; +struct CArrUI8 { + uint8_t *data; + int32_t len; +}; + +extern "C" { + FFI_EXPORT int32_t FfiBundleManagerCompressFile(CArrUI8 inFile, CArrUI8 outFile, RetOptions options); + FFI_EXPORT int32_t FfiBundleManagerDeCompressFileOptions(CArrUI8 inFile, CArrUI8 outFile, RetOptions options); + FFI_EXPORT int32_t FfiBundleManagerDeCompressFile(CArrUI8 inFile, CArrUI8 outFile); +} + } // LIBZIP } // AppExecFwk } // OHOS diff --git a/services/bundlemgr/test/unittest/bms_cj_test/bms_bundle_manager_ffi_test.cpp b/services/bundlemgr/test/unittest/bms_cj_test/bms_bundle_manager_ffi_test.cpp index 8848898e749db087e3fd85826603f3643fb7f8dd..21a08d56dd2957173f27021e1d1e1dc0d75e7028 100644 --- a/services/bundlemgr/test/unittest/bms_cj_test/bms_bundle_manager_ffi_test.cpp +++ b/services/bundlemgr/test/unittest/bms_cj_test/bms_bundle_manager_ffi_test.cpp @@ -18,6 +18,7 @@ #include "bundle_error.h" #include "bundle_manager_ffi.h" #include "bundle_manager_utils.h" +#include "zip_ffi.h" using namespace testing::ext; @@ -102,5 +103,46 @@ HWTEST_F(BundleManagerFfiTest, FfiBundleManagerCanOpenLink_0001, Function | Smal bool canOpen = CJSystemapi::BundleManager::FfiBundleManagerCanOpenLink(&link, code); EXPECT_FALSE(canOpen); } + +/** + * @tc.number: FfiBundleManagerCompressFile_0001 + * @tc.name: FfiBundleManagerCompressFile + * @tc.desc: FfiBundleManagerCompressFile + */ +HWTEST_F(BundleManagerFfiTest, FfiBundleManagerCompressFile_0001, Function | SmallTest | Level0) +{ + LIBZIP::CArrUI8 inFile = LIBZIP::CArrUI8{nullptr, 0}; + LIBZIP::CArrUI8 outFile = LIBZIP::CArrUI8{nullptr, 0}; + LIBZIP::RetOptions options = LIBZIP::RetOptions{0, 1, 0}; + int code = FfiBundleManagerCompressFile(inFile, outFile, options); + EXPECT_EQ(code, CJSystemapi::BundleManager::ERR_ZLIB_SRC_FILE_INVALID); +} + +/** + * @tc.number: FfiBundleManagerDeCompressFileOptions_0001 + * @tc.name: FfiBundleManagerDeCompressFileOptions + * @tc.desc: FfiBundleManagerDeCompressFileOptions + */ +HWTEST_F(BundleManagerFfiTest, FfiBundleManagerDeCompressFileOptions_0001, Function | SmallTest | Level0) +{ + LIBZIP::CArrUI8 inFile = LIBZIP::CArrUI8{nullptr, 0}; + LIBZIP::CArrUI8 outFile = LIBZIP::CArrUI8{nullptr, 0}; + LIBZIP::RetOptions options = LIBZIP::RetOptions{0, 1, 0}; + int code = FfiBundleManagerDeCompressFileOptions(inFile, outFile, options); + EXPECT_EQ(code, CJSystemapi::BundleManager::ERR_ZLIB_DEST_FILE_INVALID); +} + +/** + * @tc.number: FfiBundleManagerDeCompressFile_0001 + * @tc.name: FfiBundleManagerDeCompressFile + * @tc.desc: FfiBundleManagerDeCompressFile + */ +HWTEST_F(BundleManagerFfiTest, FfiBundleManagerDeCompressFile_0001, Function | SmallTest | Level0) +{ + LIBZIP::CArrUI8 inFile = LIBZIP::CArrUI8{nullptr, 0}; + LIBZIP::CArrUI8 outFile = LIBZIP::CArrUI8{nullptr, 0}; + int code = FfiBundleManagerDeCompressFile(inFile, outFile); + EXPECT_EQ(code, CJSystemapi::BundleManager::ERR_ZLIB_DEST_FILE_INVALID); +} } // namespace AppExecFwk } // namespace OHOS \ No newline at end of file