• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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(0xD002D10, "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, &paramNum, 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     constexpr size_t maxParamNum = 4;
68     constexpr size_t paramNumWithoutCallback = 3;
69     size_t paramNum = maxParamNum;
70     napi_value params[maxParamNum] = { 0 };
71     NAPI_CALL(env, napi_get_cb_info(env, info, &paramNum, params, nullptr, nullptr));
72     napi_value result = nullptr;
73     napi_get_undefined(env, &result);
74     if (paramNum < paramNumWithoutCallback) {
75         HIVIEW_LOGE("num of params is invalid %{public}zu.", paramNum);
76         return result;
77     }
78     std::string logType;
79     std::string logName;
80     std::string destDir;
81     if (!HiviewNapiUtil::ParseStringValue(env, "logType", params[LOG_TYPE_INDEX], logType)
82         || !HiviewNapiUtil::ParseStringValue(env, "logName", params[LOG_NAME_INDEX], logName)
83         || !HiviewNapiUtil::ParseStringValue(env, "dest", params[DEST_DIR_INDEX], destDir)) {
84         HIVIEW_LOGW("failed to parse params");
85         return result;
86     }
87     HIVIEW_LOGD("isMove:%{public}d, type:%{public}s, name:%{public}s, dir: %{public}s",
88         isMove, logType.c_str(), StringUtil::HideSnInfo(logName).c_str(), destDir.c_str());
89     if (!HiviewNapiUtil::CheckDirPath(destDir)) {
90         HIVIEW_LOGE("dest param is invalid: %{public}s", destDir.c_str());
91         HiviewNapiUtil::ThrowParamContentError(env, "dest");
92         return result;
93     }
94     HiviewFileParams* hiviewFileParams = new(std::nothrow) HiviewFileParams(logType, logName, destDir);
95     if (hiviewFileParams == nullptr) {
96         HIVIEW_LOGE("failed to allocate memory");
97         return result;
98     } else if (paramNum == maxParamNum) {
99         if (!HiviewNapiUtil::IsMatchType(env, params[paramNumWithoutCallback], napi_function)) {
100             HIVIEW_LOGE("no valid function param");
101             HiviewNapiUtil::ThrowParamTypeError(env, "callback", "function");
102             delete hiviewFileParams;
103             return result;
104         }
105         napi_create_reference(env, params[paramNumWithoutCallback], 1, &hiviewFileParams->callback);
106     } else {
107         napi_create_promise(env, &hiviewFileParams->deferred, &result);
108     }
109     isMove ? HiviewNapiAdapter::Move(env, hiviewFileParams) : HiviewNapiAdapter::Copy(env, hiviewFileParams);
110     return result;
111 }
112 
Copy(napi_env env,napi_callback_info info)113 static napi_value Copy(napi_env env, napi_callback_info info)
114 {
115     if (!HiviewNapiUtil::IsSystemAppCall()) {
116         HiviewNapiUtil::ThrowSystemAppPermissionError(env);
117         return nullptr;
118     }
119     return CopyOrMoveFile(env, info, false);
120 }
121 
Move(napi_env env,napi_callback_info info)122 static napi_value Move(napi_env env, napi_callback_info info)
123 {
124     if (!HiviewNapiUtil::IsSystemAppCall()) {
125         HiviewNapiUtil::ThrowSystemAppPermissionError(env);
126         return nullptr;
127     }
128     return CopyOrMoveFile(env, info, true);
129 }
130 
Remove(napi_env env,napi_callback_info info)131 static napi_value Remove(napi_env env, napi_callback_info info)
132 {
133     if (!HiviewNapiUtil::IsSystemAppCall()) {
134         HiviewNapiUtil::ThrowSystemAppPermissionError(env);
135         return nullptr;
136     }
137     constexpr size_t removeParamNum = 2;
138     size_t paramNum = removeParamNum;
139     napi_value params[removeParamNum] = { 0 };
140     napi_value result = nullptr;
141     napi_get_undefined(env, &result);
142     NAPI_CALL(env, napi_get_cb_info(env, info, &paramNum, params, nullptr, nullptr));
143     if (paramNum < removeParamNum) {
144         HIVIEW_LOGE("num of params is invalid: %{public}zu", paramNum);
145         return result;
146     }
147     std::string logType;
148     std::string logName;
149     if (!HiviewNapiUtil::ParseStringValue(env, "logType", params[LOG_TYPE_INDEX], logType)
150         || !HiviewNapiUtil::ParseStringValue(env, "logName", params[LOG_NAME_INDEX], logName)) {
151         return result;
152     }
153     HIVIEW_LOGI("type: %{public}s, name: %{public}s", logType.c_str(), StringUtil::HideSnInfo(logName).c_str());
154     int32_t retCode = HiviewServiceAgent::GetInstance().Remove(logType, logName);
155     if (retCode != 0) {
156         HIVIEW_LOGI("retCode: %{public}u.", retCode);
157         HiviewNapiUtil::ThrowErrorByCode(env, retCode);
158     }
159     return result;
160 }
161 
162 EXTERN_C_START
Init(napi_env env,napi_value exports)163 static napi_value Init(napi_env env, napi_value exports)
164 {
165     napi_property_descriptor desc[] = {
166         DECLARE_NAPI_FUNCTION("list", List),
167         DECLARE_NAPI_FUNCTION("copy", Copy),
168         DECLARE_NAPI_FUNCTION("move", Move),
169         DECLARE_NAPI_FUNCTION("remove", Remove)
170     };
171     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(napi_property_descriptor), desc));
172     return exports;
173 }
174 EXTERN_C_END
175 
176 static napi_module _module = {
177     .nm_version = 1,
178     .nm_flags = 0,
179     .nm_filename = nullptr,
180     .nm_register_func = Init,
181     .nm_modname = "logLibrary",
182     .nm_priv = ((void *) 0),
183     .reserved = {0}
184 };
185 
RegisterModule(void)186 extern "C" __attribute__((constructor)) void RegisterModule(void)
187 {
188     napi_module_register(&_module);
189 }
190 } // namespace HiviewDFX
191 } // namespace OHOS