17c804472Sopenharmony_ci/*
27c804472Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
37c804472Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
47c804472Sopenharmony_ci * you may not use this file except in compliance with the License.
57c804472Sopenharmony_ci * You may obtain a copy of the License at
67c804472Sopenharmony_ci *
77c804472Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
87c804472Sopenharmony_ci *
97c804472Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
107c804472Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
117c804472Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
127c804472Sopenharmony_ci * See the License for the specific language governing permissions and
137c804472Sopenharmony_ci * limitations under the License.
147c804472Sopenharmony_ci */
157c804472Sopenharmony_ci
167c804472Sopenharmony_ci#include "FileSystem.h"
177c804472Sopenharmony_ci
187c804472Sopenharmony_ci#include <sys/stat.h>
197c804472Sopenharmony_ci#include <unistd.h>
207c804472Sopenharmony_ci
217c804472Sopenharmony_ci#include "PreviewerEngineLog.h"
227c804472Sopenharmony_ci#include "NativeFileSystem.h"
237c804472Sopenharmony_ci
247c804472Sopenharmony_cistd::vector<std::string> FileSystem::pathList = {"file_system", "app", "ace", "data"};
257c804472Sopenharmony_cistd::string FileSystem::bundleName = "";
267c804472Sopenharmony_cistd::string FileSystem::fileSystemPath = "";
277c804472Sopenharmony_ci
287c804472Sopenharmony_ci#ifdef _WIN32
297c804472Sopenharmony_cistd::string FileSystem::separator = "\\";
307c804472Sopenharmony_ci#else
317c804472Sopenharmony_cistd::string FileSystem::separator = "/";
327c804472Sopenharmony_ci#endif
337c804472Sopenharmony_ci
347c804472Sopenharmony_cibool FileSystem::IsFileExists(std::string path)
357c804472Sopenharmony_ci{
367c804472Sopenharmony_ci    return S_ISREG(GetFileMode(path));
377c804472Sopenharmony_ci}
387c804472Sopenharmony_ci
397c804472Sopenharmony_cibool FileSystem::IsDirectoryExists(std::string path)
407c804472Sopenharmony_ci{
417c804472Sopenharmony_ci    return S_ISDIR(GetFileMode(path));
427c804472Sopenharmony_ci}
437c804472Sopenharmony_ci
447c804472Sopenharmony_cistd::string FileSystem::GetApplicationPath()
457c804472Sopenharmony_ci{
467c804472Sopenharmony_ci    char appPath[MAX_PATH_LEN];
477c804472Sopenharmony_ci    if (getcwd(appPath, MAX_PATH_LEN) == nullptr) {
487c804472Sopenharmony_ci        ELOG("Get current path failed.");
497c804472Sopenharmony_ci        return std::string();
507c804472Sopenharmony_ci    }
517c804472Sopenharmony_ci    std::string path(appPath);
527c804472Sopenharmony_ci    return path;
537c804472Sopenharmony_ci}
547c804472Sopenharmony_ci
557c804472Sopenharmony_ciconst std::string& FileSystem::GetVirtualFileSystemPath()
567c804472Sopenharmony_ci{
577c804472Sopenharmony_ci    return fileSystemPath;
587c804472Sopenharmony_ci}
597c804472Sopenharmony_ci
607c804472Sopenharmony_civoid FileSystem::MakeVirtualFileSystemPath()
617c804472Sopenharmony_ci{
627c804472Sopenharmony_ci    std::string dirToMake = GetApplicationPath();
637c804472Sopenharmony_ci    if (!IsDirectoryExists(dirToMake)) {
647c804472Sopenharmony_ci        ELOG("Application path is not exists.");
657c804472Sopenharmony_ci        return;
667c804472Sopenharmony_ci    }
677c804472Sopenharmony_ci    for (std::string path : pathList) {
687c804472Sopenharmony_ci        dirToMake += separator;
697c804472Sopenharmony_ci        dirToMake += path;
707c804472Sopenharmony_ci        MakeDir(dirToMake.data());
717c804472Sopenharmony_ci    }
727c804472Sopenharmony_ci    dirToMake += separator;
737c804472Sopenharmony_ci    dirToMake += bundleName;
747c804472Sopenharmony_ci    MakeDir(dirToMake);
757c804472Sopenharmony_ci    fileSystemPath = dirToMake;
767c804472Sopenharmony_ci}
777c804472Sopenharmony_ci
787c804472Sopenharmony_ciint FileSystem::MakeDir(std::string path)
797c804472Sopenharmony_ci{
807c804472Sopenharmony_ci    int result = 0;
817c804472Sopenharmony_ci#ifdef _WIN32
827c804472Sopenharmony_ci    result = mkdir(path.data());
837c804472Sopenharmony_ci#else
847c804472Sopenharmony_ci    result = mkdir(path.data(), S_IRUSR | S_IWUSR | S_IXUSR);
857c804472Sopenharmony_ci#endif
867c804472Sopenharmony_ci    return result;
877c804472Sopenharmony_ci}
887c804472Sopenharmony_ci
897c804472Sopenharmony_civoid FileSystem::SetBundleName(std::string name)
907c804472Sopenharmony_ci{
917c804472Sopenharmony_ci    bundleName = name;
927c804472Sopenharmony_ci}
937c804472Sopenharmony_ci
947c804472Sopenharmony_ciunsigned short FileSystem::GetFileMode(std::string path)
957c804472Sopenharmony_ci{
967c804472Sopenharmony_ci    struct stat info {};
977c804472Sopenharmony_ci    if (stat(path.data(), &info) != 0) {
987c804472Sopenharmony_ci        return 0;
997c804472Sopenharmony_ci    }
1007c804472Sopenharmony_ci    return info.st_mode;
1017c804472Sopenharmony_ci}
1027c804472Sopenharmony_ci
1037c804472Sopenharmony_cistd::string FileSystem::GetSeparator()
1047c804472Sopenharmony_ci{
1057c804472Sopenharmony_ci    return separator;
1067c804472Sopenharmony_ci}
1077c804472Sopenharmony_ci
1087c804472Sopenharmony_cistd::string FileSystem::FindSubfolderByName(const std::string& parentFolderPath, const std::string& subfolderName)
1097c804472Sopenharmony_ci{
1107c804472Sopenharmony_ci    return OHOS::Ide::NativeFileSystem::FindSubfolderByName(parentFolderPath, subfolderName);
1117c804472Sopenharmony_ci}
1127c804472Sopenharmony_ci
1137c804472Sopenharmony_cistd::string FileSystem::NormalizePath(const std::string& path)
1147c804472Sopenharmony_ci{
1157c804472Sopenharmony_ci    std::string normalizedPath = path;
1167c804472Sopenharmony_ci    char separatorChar = FileSystem::separator[0]; // 0 is get fist char of string
1177c804472Sopenharmony_ci    for (char& c : normalizedPath) {
1187c804472Sopenharmony_ci        if (c == '/' || c == '\\') {
1197c804472Sopenharmony_ci            c = separatorChar;
1207c804472Sopenharmony_ci        }
1217c804472Sopenharmony_ci    }
1227c804472Sopenharmony_ci    return normalizedPath;
1237c804472Sopenharmony_ci}