1/* 2 * Copyright (c) 2025 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/** 17 * @file 18 * @kit BasicServicesKit 19 */ 20 21import { AsyncCallback, BusinessError } from '@ohos.base'; 22 23export default namespace zlib { 24 25 loadLibrary("ani_zlib.z"); 26 27 export enum CompressLevel { 28 COMPRESS_LEVEL_NO_COMPRESSION = 0, 29 COMPRESS_LEVEL_BEST_SPEED = 1, 30 COMPRESS_LEVEL_BEST_COMPRESSION = 9, 31 COMPRESS_LEVEL_DEFAULT_COMPRESSION = -1 32 } 33 34 export enum CompressStrategy { 35 COMPRESS_STRATEGY_DEFAULT_STRATEGY = 0, 36 COMPRESS_STRATEGY_FILTERED = 1, 37 COMPRESS_STRATEGY_HUFFMAN_ONLY = 2, 38 COMPRESS_STRATEGY_RLE = 3, 39 COMPRESS_STRATEGY_FIXED = 4 40 } 41 42 export enum ParallelStrategy { 43 PARALLEL_STRATEGY_SEQUENTIAL = 0, 44 PARALLEL_STRATEGY_PARALLEL_DECOMPRESSION = 1 45 } 46 47 export enum MemLevel { 48 MEM_LEVEL_MIN = 1, 49 MEM_LEVEL_MAX = 9, 50 MEM_LEVEL_DEFAULT = 8 51 } 52 53 export interface Options { 54 level?: CompressLevel; 55 memLevel?: MemLevel; 56 strategy?: CompressStrategy; 57 parallel?: ParallelStrategy; 58 } 59 60 class OptionsInner implements Options { 61 level?: CompressLevel | undefined; 62 memLevel?: MemLevel | undefined; 63 strategy?: CompressStrategy | undefined; 64 parallel?: ParallelStrategy | undefined; 65 } 66 67 export function compressFile(inFile: string, outFile: string, options: Options, callback: AsyncCallback<void>): void { 68 let execFun = (): void => { 69 zlib.CompressFile(inFile, outFile, options); 70 }; 71 let p1 = taskpool.execute(execFun); 72 p1.then(() => { 73 callback(null, undefined); 74 }).catch((err: Error): void => { 75 callback(err as BusinessError, undefined); 76 }); 77 } 78 79 export function compressFile(inFile: string, outFile: string, options: Options): Promise<void> { 80 let p: Promise<void> = new Promise<void>((resolve: (v:undefined) => void, reject: (error: Error) => void) : void => { 81 let execFun = (): void => { 82 zlib.CompressFile(inFile, outFile, options); 83 }; 84 let p1 = taskpool.execute(execFun); 85 p1.then((): void => { 86 resolve(undefined); 87 }, (err: Error): void => { 88 reject(err as BusinessError); 89 }); 90 }); 91 return p; 92 } 93 94 export native function CompressFile(inFile: string, outFile: string, options: Options): void; 95 96 export function decompressFile(inFile: string, outFile: string, options: Options, callback: AsyncCallback<void>): void { 97 let execFun = (): void => { 98 zlib.DecompressFile(inFile, outFile, options); 99 }; 100 let p1 = taskpool.execute(execFun); 101 p1.then(() => { 102 callback(null, undefined); 103 }).catch((err: Error): void => { 104 callback(err as BusinessError, undefined); 105 }); 106 } 107 108 export function decompressFile(inFile: string, outFile: string, callback: AsyncCallback<void>): void { 109 let execFun = (): void => { 110 zlib.DecompressFile(inFile, outFile, new OptionsInner()); 111 }; 112 let p1 = taskpool.execute(execFun); 113 p1.then(() => { 114 callback(null, undefined); 115 }).catch((err: Error): void => { 116 callback(err as BusinessError, undefined); 117 }); 118 } 119 120 export function decompressFile(inFile: string, outFile: string, options?: Options): Promise<void> { 121 let optionsParam = options ?? new OptionsInner(); 122 let p: Promise<void> = new Promise<void>((resolve: (v:undefined) => void, reject: (error: Error) => void) : void => { 123 let execFun = (): void => { 124 zlib.DecompressFile(inFile, outFile, optionsParam); 125 }; 126 let p1 = taskpool.execute(execFun); 127 p1.then((): void => { 128 resolve(undefined); 129 }, (err: Error): void => { 130 reject(err as BusinessError); 131 }); 132 }); 133 return p; 134 } 135 136 export native function DecompressFile(inFile: string, outFile: string, options?: Options): void; 137 138 export interface Checksum { 139 adler32(adler: number, buf: ArrayBuffer): Promise<number>; 140 adler32Combine(adler1: number, adler2: number, len2: number): Promise<number>; 141 crc32(crc: number, buf: ArrayBuffer): Promise<number>; 142 crc32Combine(crc1: number, crc2: number, len2: number): Promise<number>; 143 crc64(crc: number, buf: ArrayBuffer): Promise<number>; 144 getCrcTable(): Promise<Array<number>>; 145 getCrc64Table(): Promise<Array<number>>; 146 } 147 148 export class ChecksumInternal implements Checksum { 149 public native Adler32(adler: number, buf: ArrayBuffer): number; 150 public native Adler32Combine(adler1: number, adler2: number, len2: number): number; 151 public native Crc32(crc: number, buf: ArrayBuffer): number; 152 public native Crc32Combine(crc1: number, crc2: number, len2: number): number; 153 public native Crc64(crc: number, buf: ArrayBuffer): number; 154 public native GetCrcTable(): Array<number>; 155 public native GetCrc64Table(): Array<number>; 156 157 public adler32(adler: number, buf: ArrayBuffer): Promise<number> { 158 let p: Promise<number> = new Promise<number>((resolve: (v:number) => void, reject: (error: BusinessError) => void) : void => { 159 let execFun = (): number => { 160 return this.Adler32(adler, buf); 161 }; 162 let p1 = taskpool.execute(execFun); 163 p1.then((e: NullishType) => { 164 let result: number = e as number; 165 resolve(result); 166 }, (err: Error): void => { 167 reject(err as BusinessError); 168 }); 169 }); 170 return p; 171 } 172 173 public adler32Combine(adler1: number, adler2: number, len2: number): Promise<number> { 174 let p: Promise<number> = new Promise<number>((resolve: (v:number) => void, reject: (error: BusinessError) => void) : void => { 175 let execFun = (): number => { 176 return this.Adler32Combine(adler1, adler2, len2); 177 }; 178 let p1 = taskpool.execute(execFun); 179 p1.then((e: NullishType) => { 180 let result: number = e as number; 181 resolve(result); 182 }, (err: Error): void => { 183 reject(err as BusinessError); 184 }); 185 }); 186 return p; 187 } 188 189 public crc32(crc: number, buf: ArrayBuffer): Promise<number> { 190 let p: Promise<number> = new Promise<number>((resolve: (v:number) => void, reject: (error: BusinessError) => void) : void => { 191 let execFun = (): number => { 192 return this.Crc32(crc, buf); 193 }; 194 let p1 = taskpool.execute(execFun); 195 p1.then((e: NullishType) => { 196 let result: number = e as number; 197 resolve(result); 198 }, (err: Error): void => { 199 reject(err as BusinessError); 200 }); 201 }); 202 return p; 203 } 204 205 public crc32Combine(crc1: number, crc2: number, len2: number): Promise<number> { 206 let p: Promise<number> = new Promise<number>((resolve: (v:number) => void, reject: (error: BusinessError) => void) : void => { 207 let execFun = (): number => { 208 return this.Crc32Combine(crc1, crc2, len2); 209 }; 210 let p1 = taskpool.execute(execFun); 211 p1.then((e: NullishType) => { 212 let result: number = e as number; 213 resolve(result); 214 }, (err: Error): void => { 215 reject(err as BusinessError); 216 }); 217 }); 218 return p; 219 } 220 221 public crc64(crc: number, buf: ArrayBuffer): Promise<number> { 222 let p: Promise<number> = new Promise<number>((resolve: (v:number) => void, reject: (error: BusinessError) => void) : void => { 223 let execFun = (): number => { 224 return this.Crc64(crc, buf); 225 }; 226 let p1 = taskpool.execute(execFun); 227 p1.then((e: NullishType) => { 228 let result: number = e as number; 229 resolve(result); 230 }, (err: Error): void => { 231 reject(err as BusinessError); 232 }); 233 }); 234 return p; 235 } 236 237 public getCrcTable(): Promise<Array<number>> { 238 let p: Promise<Array<number>> = new Promise<Array<number>>((resolve: (v:Array<number>) => void, reject: (error: BusinessError) => void) : void => { 239 let execFun = (): Array<number> => { 240 return this.GetCrcTable(); 241 }; 242 let p1 = taskpool.execute(execFun); 243 p1.then((e: NullishType) => { 244 let resultArray: Array<number> = e as Array<number>; 245 resolve(resultArray); 246 }, (err: Error): void => { 247 reject(err as BusinessError); 248 }); 249 }); 250 return p; 251 } 252 253 public getCrc64Table(): Promise<Array<number>> { 254 let p: Promise<Array<number>> = new Promise<Array<number>>((resolve: (v:Array<number>) => void, reject: (error: BusinessError) => void) : void => { 255 let execFun = (): Array<number> => { 256 return this.GetCrc64Table(); 257 }; 258 let p1 = taskpool.execute(execFun); 259 p1.then((e: NullishType) => { 260 let resultArray: Array<number> = e as Array<number>; 261 resolve(resultArray); 262 }, (err: Error): void => { 263 reject(err as BusinessError); 264 }); 265 }); 266 return p; 267 } 268 } 269 270 export native function CompressFiles(inFiles: Array<string>, outFile: string, options: Options): void; 271 272 export function compressFiles(inFiles: Array<string>, outFile: string, options: Options): Promise<void> { 273 let p: Promise<void> = new Promise<void>((resolve: (v:PromiseLike<void>) => void, reject: (error: Error) => void) : void => { 274 let execFun = (): void => { 275 zlib.CompressFiles(inFiles, outFile, options); 276 }; 277 let p1 = taskpool.execute(execFun); 278 p1.then((): void => { 279 resolve(Promise.resolve()); 280 }, (err: Error): void => { 281 reject(err as BusinessError); 282 }); 283 }); 284 return p; 285 } 286 287 export native function GetOriginalSize(compressedFile: string): number; 288 289 export function getOriginalSize(compressedFile: string): Promise<number> { 290 let p: Promise<number> = new Promise<number>((resolve: (v:number) => void, reject: (error: BusinessError) => void) : void => { 291 let execFun = (): number => { 292 return zlib.GetOriginalSize(compressedFile); 293 }; 294 let p1 = taskpool.execute(execFun); 295 p1.then((e: NullishType) => { 296 let result: number = e as number; 297 resolve(result); 298 }, (err: Error): void => { 299 reject(err as BusinessError); 300 }); 301 }); 302 return p; 303 } 304 305 export native function createChecksumSync(): Checksum; 306 307 export function createChecksum(): Promise<Checksum> { 308 let p: Promise<Checksum> = new Promise<Checksum>((resolve: (v:Checksum) => void, reject: (error: BusinessError) => void) : void => { 309 let execFun = (): Checksum => { 310 return zlib.createChecksumSync(); 311 }; 312 let p1 = taskpool.execute(execFun); 313 p1.then((e: NullishType) => { 314 let result: Checksum = e as Checksum; 315 resolve(result); 316 }, (err: Error): void => { 317 reject(err as BusinessError); 318 }); 319 }); 320 return p; 321 } 322}