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