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 */
15
16 #include "hiview_file_info.h"
17 #include "hiview_napi_adapter.h"
18 #include "hiview_napi_util.h"
19 #include "hiview_service_agent.h"
20 #include "hiview_logger.h"
21 #include "napi/native_api.h"
22 #include "napi/native_node_api.h"
23 #include "string_util.h"
24
25 namespace OHOS {
26 namespace HiviewDFX {
27 DEFINE_LOG_LABEL(0xD002D03, "NAPI_HIVIEW_JS");
28 namespace {
29 constexpr size_t LOG_TYPE_INDEX = 0;
30 constexpr size_t LOG_NAME_INDEX = 1;
31 constexpr size_t DEST_DIR_INDEX = 2;
32 }
33
List(napi_env env,napi_callback_info info)34 static napi_value List(napi_env env, napi_callback_info info)
35 {
36 if (!HiviewNapiUtil::IsSystemAppCall()) {
37 HiviewNapiUtil::ThrowSystemAppPermissionError(env);
38 return nullptr;
39 }
40 constexpr size_t listParamNum = 1;
41 size_t paramNum = listParamNum;
42 napi_value params[listParamNum] = { 0 };
43 napi_value result = nullptr;
44 napi_get_undefined(env, &result);
45 NAPI_CALL(env, napi_get_cb_info(env, info, ¶mNum, params, nullptr, nullptr));
46 if (paramNum < listParamNum) {
47 HIVIEW_LOGE("num of params is invalid: %{public}zu", paramNum);
48 return result;
49 }
50 std::string logType;
51 if (!HiviewNapiUtil::ParseStringValue(env, "logType", params[LOG_TYPE_INDEX], logType)) {
52 return result;
53 }
54 std::vector<HiviewFileInfo> fileInfos;
55 int32_t retCode = HiviewServiceAgent::GetInstance().List(logType, fileInfos);
56 HIVIEW_LOGI("retCode: %{public}u.", retCode);
57 if (retCode == 0) {
58 return HiviewNapiUtil::GenerateFileInfoResult(env, fileInfos);
59 } else {
60 HiviewNapiUtil::ThrowErrorByCode(env, retCode);
61 return result;
62 }
63 }
64
CopyOrMoveFile(napi_env env,napi_callback_info info,bool isMove)65 static napi_value CopyOrMoveFile(napi_env env, napi_callback_info info, bool isMove)
66 {
67 if (isMove) {
68 HIVIEW_LOGI("call move");
69 } else {
70 HIVIEW_LOGI("call copy");
71 }
72 constexpr size_t maxParamNum = 4;
73 constexpr size_t paramNumWithoutCallback = 3;
74 size_t paramNum = maxParamNum;
75 napi_value params[maxParamNum] = { 0 };
76 NAPI_CALL(env, napi_get_cb_info(env, info, ¶mNum, params, nullptr, nullptr));
77 napi_value result = nullptr;
78 napi_get_undefined(env, &result);
79 if (paramNum < paramNumWithoutCallback) {
80 HIVIEW_LOGE("num of params is invalid %{public}zu.", paramNum);
81 return result;
82 }
83 std::string logType;
84 std::string logName;
85 std::string destDir;
86 if (!HiviewNapiUtil::ParseStringValue(env, "logType", params[LOG_TYPE_INDEX], logType)
87 || !HiviewNapiUtil::ParseStringValue(env, "logName", params[LOG_NAME_INDEX], logName)
88 || !HiviewNapiUtil::ParseStringValue(env, "dest", params[DEST_DIR_INDEX], destDir)) {
89 return result;
90 }
91 HIVIEW_LOGI("type:%{public}s, name:%{public}s, dir: %{public}s",
92 logType.c_str(), StringUtil::HideSnInfo(logName).c_str(), destDir.c_str());
93 if (!HiviewNapiUtil::CheckDirPath(destDir)) {
94 HIVIEW_LOGE("dest param is invalid: %{public}s", destDir.c_str());
95 HiviewNapiUtil::ThrowParamContentError(env, "dest");
96 return result;
97 }
98 HiviewFileParams* hiviewFileParams = new(std::nothrow) HiviewFileParams(logType, logName, destDir);
99 if (hiviewFileParams == nullptr) {
100 HIVIEW_LOGE("failed to allocate memory");
101 return result;
102 } else if (paramNum == maxParamNum) {
103 if (!HiviewNapiUtil::IsMatchType(env, params[paramNumWithoutCallback], napi_function)) {
104 HIVIEW_LOGE("no valid function param");
105 HiviewNapiUtil::ThrowParamTypeError(env, "callback", "function");
106 delete hiviewFileParams;
107 return result;
108 }
109 napi_create_reference(env, params[paramNumWithoutCallback], 1, &hiviewFileParams->callback);
110 } else {
111 napi_create_promise(env, &hiviewFileParams->deferred, &result);
112 }
113 isMove ? HiviewNapiAdapter::Move(env, hiviewFileParams) : HiviewNapiAdapter::Copy(env, hiviewFileParams);
114 return result;
115 }
116
Copy(napi_env env,napi_callback_info info)117 static napi_value Copy(napi_env env, napi_callback_info info)
118 {
119 if (!HiviewNapiUtil::IsSystemAppCall()) {
120 HiviewNapiUtil::ThrowSystemAppPermissionError(env);
121 return nullptr;
122 }
123 return CopyOrMoveFile(env, info, false);
124 }
125
Move(napi_env env,napi_callback_info info)126 static napi_value Move(napi_env env, napi_callback_info info)
127 {
128 if (!HiviewNapiUtil::IsSystemAppCall()) {
129 HiviewNapiUtil::ThrowSystemAppPermissionError(env);
130 return nullptr;
131 }
132 return CopyOrMoveFile(env, info, true);
133 }
134
Remove(napi_env env,napi_callback_info info)135 static napi_value Remove(napi_env env, napi_callback_info info)
136 {
137 if (!HiviewNapiUtil::IsSystemAppCall()) {
138 HiviewNapiUtil::ThrowSystemAppPermissionError(env);
139 return nullptr;
140 }
141 constexpr size_t removeParamNum = 2;
142 size_t paramNum = removeParamNum;
143 napi_value params[removeParamNum] = { 0 };
144 napi_value result = nullptr;
145 napi_get_undefined(env, &result);
146 NAPI_CALL(env, napi_get_cb_info(env, info, ¶mNum, params, nullptr, nullptr));
147 if (paramNum < removeParamNum) {
148 HIVIEW_LOGE("num of params is invalid: %{public}zu", paramNum);
149 return result;
150 }
151 std::string logType;
152 std::string logName;
153 if (!HiviewNapiUtil::ParseStringValue(env, "logType", params[LOG_TYPE_INDEX], logType)
154 || !HiviewNapiUtil::ParseStringValue(env, "logName", params[LOG_NAME_INDEX], logName)) {
155 return result;
156 }
157 HIVIEW_LOGI("type: %{public}s, name: %{public}s", logType.c_str(), StringUtil::HideSnInfo(logName).c_str());
158 int32_t retCode = HiviewServiceAgent::GetInstance().Remove(logType, logName);
159 if (retCode != 0) {
160 HIVIEW_LOGI("retCode: %{public}u.", retCode);
161 HiviewNapiUtil::ThrowErrorByCode(env, retCode);
162 }
163 return result;
164 }
165
166 EXTERN_C_START
Init(napi_env env,napi_value exports)167 static napi_value Init(napi_env env, napi_value exports)
168 {
169 napi_property_descriptor desc[] = {
170 DECLARE_NAPI_FUNCTION("list", List),
171 DECLARE_NAPI_FUNCTION("copy", Copy),
172 DECLARE_NAPI_FUNCTION("move", Move),
173 DECLARE_NAPI_FUNCTION("remove", Remove)
174 };
175 NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(napi_property_descriptor), desc));
176 return exports;
177 }
178 EXTERN_C_END
179
180 static napi_module _module = {
181 .nm_version = 1,
182 .nm_flags = 0,
183 .nm_filename = nullptr,
184 .nm_register_func = Init,
185 .nm_modname = "logLibrary",
186 .nm_priv = ((void *) 0),
187 .reserved = {0}
188 };
189
RegisterModule(void)190 extern "C" __attribute__((constructor)) void RegisterModule(void)
191 {
192 napi_module_register(&_module);
193 }
194 } // namespace HiviewDFX
195 } // namespace OHOS