14514f5e3Sopenharmony_ci/* 24514f5e3Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License. 54514f5e3Sopenharmony_ci * You may obtain a copy of the License at 64514f5e3Sopenharmony_ci * 74514f5e3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 84514f5e3Sopenharmony_ci * 94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and 134514f5e3Sopenharmony_ci * limitations under the License. 144514f5e3Sopenharmony_ci */ 154514f5e3Sopenharmony_ci 164514f5e3Sopenharmony_ci#include "zip_file_reader.h" 174514f5e3Sopenharmony_ci 184514f5e3Sopenharmony_ci#include <atomic> 194514f5e3Sopenharmony_ci#include <chrono> 204514f5e3Sopenharmony_ci#include <climits> 214514f5e3Sopenharmony_ci#include <memory> 224514f5e3Sopenharmony_ci#include <sys/stat.h> 234514f5e3Sopenharmony_ci 244514f5e3Sopenharmony_ci#include "zip_file_reader_io.h" 254514f5e3Sopenharmony_ci#include "zip_file_reader_mem.h" 264514f5e3Sopenharmony_ci 274514f5e3Sopenharmony_cinamespace panda { 284514f5e3Sopenharmony_cinamespace ecmascript { 294514f5e3Sopenharmony_ciconstexpr size_t MEM_MAX_FILE_SIZE = 1u; 304514f5e3Sopenharmony_ci 314514f5e3Sopenharmony_cistd::shared_ptr<ZipFileReader> ZipFileReader::CreateZipFileReader(const std::string &filePath) 324514f5e3Sopenharmony_ci{ 334514f5e3Sopenharmony_ci size_t fileSize = GetFileLen(filePath); 344514f5e3Sopenharmony_ci if (fileSize == 0) { 354514f5e3Sopenharmony_ci return nullptr; 364514f5e3Sopenharmony_ci } 374514f5e3Sopenharmony_ci 384514f5e3Sopenharmony_ci std::shared_ptr<ZipFileReader> result; 394514f5e3Sopenharmony_ci if (fileSize <= MEM_MAX_FILE_SIZE) { 404514f5e3Sopenharmony_ci result = std::make_shared<ZipFileReaderMem>(filePath); 414514f5e3Sopenharmony_ci } else { 424514f5e3Sopenharmony_ci result = std::make_shared<ZipFileReaderIo>(filePath); 434514f5e3Sopenharmony_ci } 444514f5e3Sopenharmony_ci 454514f5e3Sopenharmony_ci result->fileLen_ = fileSize; 464514f5e3Sopenharmony_ci if (result->init()) { 474514f5e3Sopenharmony_ci return result; 484514f5e3Sopenharmony_ci } 494514f5e3Sopenharmony_ci return nullptr; 504514f5e3Sopenharmony_ci} 514514f5e3Sopenharmony_ci 524514f5e3Sopenharmony_ciZipFileReader::~ZipFileReader() 534514f5e3Sopenharmony_ci{ 544514f5e3Sopenharmony_ci if (fd_ >= 0 && closable_) { 554514f5e3Sopenharmony_ci close(fd_); 564514f5e3Sopenharmony_ci fd_ = -1; 574514f5e3Sopenharmony_ci } 584514f5e3Sopenharmony_ci} 594514f5e3Sopenharmony_ci 604514f5e3Sopenharmony_cisize_t ZipFileReader::GetFileLen(const std::string &filePath) 614514f5e3Sopenharmony_ci{ 624514f5e3Sopenharmony_ci if (filePath.empty()) { 634514f5e3Sopenharmony_ci return 0; 644514f5e3Sopenharmony_ci } 654514f5e3Sopenharmony_ci 664514f5e3Sopenharmony_ci struct stat fileStat{}; 674514f5e3Sopenharmony_ci if (stat(filePath.c_str(), &fileStat) == 0) { 684514f5e3Sopenharmony_ci return fileStat.st_size; 694514f5e3Sopenharmony_ci } 704514f5e3Sopenharmony_ci 714514f5e3Sopenharmony_ci return 0; 724514f5e3Sopenharmony_ci} 734514f5e3Sopenharmony_ci 744514f5e3Sopenharmony_cibool ZipFileReader::init() 754514f5e3Sopenharmony_ci{ 764514f5e3Sopenharmony_ci if (filePath_.empty()) { 774514f5e3Sopenharmony_ci return false; 784514f5e3Sopenharmony_ci } 794514f5e3Sopenharmony_ci fd_ = open(filePath_.c_str(), O_RDONLY); 804514f5e3Sopenharmony_ci if (fd_ < 0) { 814514f5e3Sopenharmony_ci return false; 824514f5e3Sopenharmony_ci } 834514f5e3Sopenharmony_ci 844514f5e3Sopenharmony_ci return true; 854514f5e3Sopenharmony_ci} 864514f5e3Sopenharmony_ci} 874514f5e3Sopenharmony_ci}