1600cc4afSopenharmony_ci/* 2600cc4afSopenharmony_ci * Copyright (c) 2021-2024 Huawei Device Co., Ltd. 3600cc4afSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4600cc4afSopenharmony_ci * you may not use this file except in compliance with the License. 5600cc4afSopenharmony_ci * You may obtain a copy of the License at 6600cc4afSopenharmony_ci * 7600cc4afSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8600cc4afSopenharmony_ci * 9600cc4afSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10600cc4afSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11600cc4afSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12600cc4afSopenharmony_ci * See the License for the specific language governing permissions and 13600cc4afSopenharmony_ci * limitations under the License. 14600cc4afSopenharmony_ci */ 15600cc4afSopenharmony_ci 16600cc4afSopenharmony_ci#include "bundle_scanner.h" 17600cc4afSopenharmony_ci 18600cc4afSopenharmony_ci#include <dirent.h> 19600cc4afSopenharmony_ci 20600cc4afSopenharmony_ci#include "bundle_mgr_service.h" 21600cc4afSopenharmony_ci#include "hitrace_meter.h" 22600cc4afSopenharmony_ci#include "datetime_ex.h" 23600cc4afSopenharmony_ci#include "perf_profile.h" 24600cc4afSopenharmony_ci 25600cc4afSopenharmony_cinamespace OHOS { 26600cc4afSopenharmony_cinamespace AppExecFwk { 27600cc4afSopenharmony_ci 28600cc4afSopenharmony_ciBundleScanner::BundleScanner() 29600cc4afSopenharmony_ci{ 30600cc4afSopenharmony_ci APP_LOGI("BundleScanner instance is created"); 31600cc4afSopenharmony_ci} 32600cc4afSopenharmony_ci 33600cc4afSopenharmony_ciBundleScanner::~BundleScanner() 34600cc4afSopenharmony_ci{ 35600cc4afSopenharmony_ci APP_LOGI("BundleScanner instance is destroyed"); 36600cc4afSopenharmony_ci} 37600cc4afSopenharmony_ci 38600cc4afSopenharmony_ciconst std::list<std::string> &BundleScanner::Scan(const std::string &dirPath) 39600cc4afSopenharmony_ci{ 40600cc4afSopenharmony_ci HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__); 41600cc4afSopenharmony_ci PerfProfile::GetInstance().SetBundleScanStartTime(GetTickCount()); 42600cc4afSopenharmony_ci 43600cc4afSopenharmony_ci APP_LOGD("path:%{private}s", dirPath.c_str()); 44600cc4afSopenharmony_ci if (!dirPath.empty()) { 45600cc4afSopenharmony_ci if (!ScanImpl(dirPath)) { 46600cc4afSopenharmony_ci APP_LOGW("BundleScanner::Scan scan error"); 47600cc4afSopenharmony_ci } 48600cc4afSopenharmony_ci } 49600cc4afSopenharmony_ci 50600cc4afSopenharmony_ci APP_LOGD("scan result num:%{public}zu", entries_.size()); 51600cc4afSopenharmony_ci for (const auto &item : entries_) { 52600cc4afSopenharmony_ci APP_LOGD("app item:%{private}s", item.c_str()); 53600cc4afSopenharmony_ci } 54600cc4afSopenharmony_ci 55600cc4afSopenharmony_ci PerfProfile::GetInstance().SetBundleScanEndTime(GetTickCount()); 56600cc4afSopenharmony_ci return entries_; 57600cc4afSopenharmony_ci} 58600cc4afSopenharmony_ci 59600cc4afSopenharmony_cibool BundleScanner::ScanImpl(const std::string &dirPath) 60600cc4afSopenharmony_ci{ 61600cc4afSopenharmony_ci DIR *dirp = opendir(dirPath.c_str()); 62600cc4afSopenharmony_ci if (dirp == nullptr) { 63600cc4afSopenharmony_ci APP_LOGE("BundleScanner::ScanImpl open dir:%{private}s fail, errno:%{public}d", dirPath.c_str(), errno); 64600cc4afSopenharmony_ci return false; 65600cc4afSopenharmony_ci } 66600cc4afSopenharmony_ci 67600cc4afSopenharmony_ci struct dirent *dirent = nullptr; 68600cc4afSopenharmony_ci for (;;) { 69600cc4afSopenharmony_ci dirent = readdir(dirp); 70600cc4afSopenharmony_ci if (dirent == nullptr) { 71600cc4afSopenharmony_ci APP_LOGE("fail readdir err:%{public}d", errno); 72600cc4afSopenharmony_ci break; 73600cc4afSopenharmony_ci } 74600cc4afSopenharmony_ci 75600cc4afSopenharmony_ci std::string currentName(dirent->d_name); 76600cc4afSopenharmony_ci APP_LOGD("folder found:'%{private}s'", dirent->d_name); 77600cc4afSopenharmony_ci if (currentName.compare(".") == 0 || currentName.compare("..") == 0) { 78600cc4afSopenharmony_ci continue; 79600cc4afSopenharmony_ci } 80600cc4afSopenharmony_ci entries_.push_back(dirPath + ServiceConstants::PATH_SEPARATOR + currentName); 81600cc4afSopenharmony_ci } 82600cc4afSopenharmony_ci 83600cc4afSopenharmony_ci if (closedir(dirp) == -1) { 84600cc4afSopenharmony_ci APP_LOGW("close dir fail, errno:%{public}d", errno); 85600cc4afSopenharmony_ci } 86600cc4afSopenharmony_ci return true; 87600cc4afSopenharmony_ci} 88600cc4afSopenharmony_ci 89600cc4afSopenharmony_ci} // namespace AppExecFwk 90600cc4afSopenharmony_ci} // namespace OHOS 91