• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "stat_ani.h"
17 
18 #include "error_handler.h"
19 #include "filemgmt_libhilog.h"
20 #include "stat_core.h"
21 #include "stat_wrapper.h"
22 #include "type_converter.h"
23 
24 namespace OHOS {
25 namespace FileManagement {
26 namespace ModuleFileIO {
27 namespace ANI {
28 using namespace std;
29 using namespace OHOS::FileManagement::ModuleFileIO;
30 
StatSync(ani_env * env,ani_class clazz,ani_object file)31 ani_object StatAni::StatSync(ani_env *env, [[maybe_unused]] ani_class clazz, ani_object file)
32 {
33     auto [succPath, fileInfo] = TypeConverter::ToFileInfo(env, file);
34     if (!succPath) {
35         HILOGE("The first argument requires filepath/fd");
36         ErrorHandler::Throw(env, EINVAL);
37         return nullptr;
38     }
39 
40     auto ret = StatCore::DoStat(fileInfo);
41     if (!ret.IsSuccess()) {
42         HILOGE("DoStat failed!");
43         const FsError &err = ret.GetError();
44         ErrorHandler::Throw(env, err);
45         return nullptr;
46     }
47 
48     auto fsStat = ret.GetData().value();
49     auto statObject = StatWrapper::Wrap(env, fsStat);
50     if (statObject == nullptr) {
51         delete fsStat;
52         fsStat = nullptr;
53         HILOGE("Wrap stat object failed!");
54         ErrorHandler::Throw(env, UNKNOWN_ERR);
55         return nullptr;
56     }
57 
58     return statObject;
59 }
60 
IsBlockDevice(ani_env * env,ani_object object)61 ani_boolean StatAni::IsBlockDevice(ani_env *env, [[maybe_unused]] ani_object object)
62 {
63     auto fsStat = StatWrapper::Unwrap(env, object);
64     if (fsStat == nullptr) {
65         ErrorHandler::Throw(env, UNKNOWN_ERR);
66         return ANI_FALSE;
67     }
68 
69     auto ret = fsStat->IsBlockDevice();
70     return ani_boolean(ret);
71 }
72 
IsCharacterDevice(ani_env * env,ani_object object)73 ani_boolean StatAni::IsCharacterDevice(ani_env *env, [[maybe_unused]] ani_object object)
74 {
75     auto fsStat = StatWrapper::Unwrap(env, object);
76     if (fsStat == nullptr) {
77         ErrorHandler::Throw(env, UNKNOWN_ERR);
78         return ANI_FALSE;
79     }
80 
81     auto ret = fsStat->IsCharacterDevice();
82     return ani_boolean(ret);
83 }
84 
IsDirectory(ani_env * env,ani_object object)85 ani_boolean StatAni::IsDirectory(ani_env *env, [[maybe_unused]] ani_object object)
86 {
87     auto fsStat = StatWrapper::Unwrap(env, object);
88     if (fsStat == nullptr) {
89         ErrorHandler::Throw(env, UNKNOWN_ERR);
90         return ANI_FALSE;
91     }
92 
93     auto ret = fsStat->IsDirectory();
94     return ani_boolean(ret);
95 }
96 
IsFIFO(ani_env * env,ani_object object)97 ani_boolean StatAni::IsFIFO(ani_env *env, [[maybe_unused]] ani_object object)
98 {
99     auto fsStat = StatWrapper::Unwrap(env, object);
100     if (fsStat == nullptr) {
101         ErrorHandler::Throw(env, UNKNOWN_ERR);
102         return ANI_FALSE;
103     }
104 
105     auto ret = fsStat->IsFIFO();
106     return ani_boolean(ret);
107 }
108 
IsFile(ani_env * env,ani_object object)109 ani_boolean StatAni::IsFile(ani_env *env, [[maybe_unused]] ani_object object)
110 {
111     auto fsStat = StatWrapper::Unwrap(env, object);
112     if (fsStat == nullptr) {
113         ErrorHandler::Throw(env, UNKNOWN_ERR);
114         return ANI_FALSE;
115     }
116 
117     auto ret = fsStat->IsFile();
118     return ani_boolean(ret);
119 }
120 
IsSocket(ani_env * env,ani_object object)121 ani_boolean StatAni::IsSocket(ani_env *env, [[maybe_unused]] ani_object object)
122 {
123     auto fsStat = StatWrapper::Unwrap(env, object);
124     if (fsStat == nullptr) {
125         ErrorHandler::Throw(env, UNKNOWN_ERR);
126         return ANI_FALSE;
127     }
128 
129     auto ret = fsStat->IsSocket();
130     return ani_boolean(ret);
131 }
132 
IsSymbolicLink(ani_env * env,ani_object object)133 ani_boolean StatAni::IsSymbolicLink(ani_env *env, [[maybe_unused]] ani_object object)
134 {
135     auto fsStat = StatWrapper::Unwrap(env, object);
136     if (fsStat == nullptr) {
137         ErrorHandler::Throw(env, UNKNOWN_ERR);
138         return ANI_FALSE;
139     }
140 
141     auto ret = fsStat->IsSymbolicLink();
142     return ani_boolean(ret);
143 }
144 } // namespace ANI
145 } // namespace ModuleFileIO
146 } // namespace FileManagement
147 } // namespace OHOS
148