1/*
2 * Copyright (c) 2023 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 */
15use std::fs::{create_dir_all, remove_dir_all, File};
16use std::io::{Read, Write};
17use std::path::Path;
18use cxx::let_cxx_string;
19use utils_rust::directory_ex;
20// rw-r--r--
21const PROFILE_FILE_MODE: u32 = 0o644;
22// rw-r-xr-x
23const PROFILE_PATH_MODE: u32 = 0o655;
24/// code sign file error
25pub enum CodeSignFileError {
26        /// change file mode error
27        ChangeFileModError,
28        /// change path mode error
29        ChangePathModError,
30    }
31/// change default mode of file
32pub fn change_default_mode_file(path_file: &str) -> Result<(), CodeSignFileError> {
33    let_cxx_string!(dirpath = path_file);
34    let mode = PROFILE_FILE_MODE;
35    let ret = directory_ex::ffi::ChangeModeFile(&dirpath, &mode);
36    if !ret {
37        return Err(CodeSignFileError::ChangeFileModError);
38    }
39    Ok(())
40}
41/// change default mode of directory
42pub fn change_default_mode_directory(path_file: &str) -> Result<(), CodeSignFileError> {
43    let_cxx_string!(dirpath = path_file);
44    let mode = PROFILE_PATH_MODE;
45    let ret = directory_ex::ffi::ChangeModeDirectory(&dirpath, &mode);
46    if !ret {
47        return Err(CodeSignFileError::ChangePathModError);
48    }
49    Ok(())
50}
51/// format storage file path
52pub fn fmt_store_path(prefix: &str, tail: &str) -> String {
53    format!("{}/{}", prefix, tail)
54}
55/// create file path with path name
56pub fn create_file_path(path_name: &str) -> Result<(), std::io::Error> {
57    let path = Path::new(path_name);
58    create_dir_all(path)?;
59    Ok(())
60}
61/// write file buffer to disk
62pub fn write_bytes_to_file(filename: &str, data: &[u8]) -> Result<(), std::io::Error> {
63    let mut file = File::create(filename)?;
64    file.write_all(data)?;
65    Ok(())
66}
67/// loads file buffer from disk
68pub fn load_bytes_from_file(filename: &str, buffer: &mut Vec<u8>) -> Result<(), std::io::Error> {
69    let mut file = File::open(filename)?;
70    file.read_to_end(buffer)?;
71    Ok(())
72}
73/// find file
74pub fn file_exists(file_path: &str) -> bool {
75    Path::new(file_path).exists()
76}
77/// delete file path
78pub fn delete_file_path(file_path: &str) -> Result<(), std::io::Error> {
79    remove_dir_all(file_path)?;
80    Ok(())
81}
82