• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 "frameworks/bridge/declarative_frontend/engine/quickjs/qjs_helpers.h"
17 
18 #include "base/log/log.h"
19 #include "frameworks/bridge/js_frontend/engine/quickjs/qjs_utils.h"
20 
21 namespace OHOS::Ace::Framework {
22 
23 enum class JsLogLevel : int32_t {
24     DEBUG = 0,
25     INFO,
26     WARNING,
27     ERROR,
28 };
29 
ParseLogContent(JSContext * ctx,int32_t argc,JSValueConst * argv)30 std::string ParseLogContent(JSContext* ctx, int32_t argc, JSValueConst* argv)
31 {
32     std::string formatStr = ScopedString(ctx, argv[0]).get();
33     if (argc == 1 || formatStr.empty()) {
34         return formatStr;
35     }
36     std::string ret;
37     int32_t len = static_cast<int32_t>(formatStr.size());
38     int32_t pos = 0;
39     int32_t count = 1;
40     for (; pos < len; ++pos) {
41         if (count >= argc) {
42             break;
43         }
44         if (formatStr[pos] == '%') {
45             if (pos + 1 >= len) {
46                 break;
47             }
48             switch (formatStr[pos + 1]) {
49                 case 's':
50                 case 'j':
51                 case 'd':
52                 case 'O':
53                 case 'o':
54                 case 'i':
55                 case 'f':
56                 case 'c':
57                     ret += ScopedString(ctx, argv[count++]).get();
58                     ++pos;
59                     break;
60                 case '%':
61                     ret += formatStr[pos];
62                     ++pos;
63                     break;
64                 default:
65                     ret += formatStr[pos];
66                     break;
67             }
68         } else {
69             ret += formatStr[pos];
70         }
71     }
72     if (pos < len) {
73         ret += formatStr.substr(pos, len - pos);
74     }
75     return ret;
76 }
77 
JsLogPrint(JSContext * ctx,JsLogLevel level,JSValueConst value,int32_t argc,JSValueConst * argv)78 JSValue JsLogPrint(JSContext* ctx, JsLogLevel level, JSValueConst value, int32_t argc, JSValueConst* argv)
79 {
80     // Should have 1 parameters.
81     if ((argv == nullptr) || (argc == 0)) {
82         LOGE("the arg is error");
83         return JS_EXCEPTION;
84     }
85     std::string printLog = ParseLogContent(ctx, argc, argv);
86     switch (level) {
87         case JsLogLevel::DEBUG:
88             LOGD("ace Log: %{public}s", printLog.c_str());
89             break;
90         case JsLogLevel::INFO:
91             LOGI("ace Log: %{public}s", printLog.c_str());
92             break;
93         case JsLogLevel::WARNING:
94             LOGW("ace Log: %{public}s", printLog.c_str());
95             break;
96         case JsLogLevel::ERROR:
97             LOGE("ace Log: %{public}s", printLog.c_str());
98             break;
99         default:
100             break;
101     }
102 
103     return JS_NULL;
104 }
105 
JsLogPrint(JSContext * ctx,JSValueConst value,int32_t argc,JSValueConst * argv)106 JSValue JsLogPrint(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv)
107 {
108     return JsLogPrint(ctx, JsLogLevel::INFO, value, argc, argv);
109 }
110 
JsDebugLogPrint(JSContext * ctx,JSValueConst value,int32_t argc,JSValueConst * argv)111 JSValue JsDebugLogPrint(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv)
112 {
113     return JsLogPrint(ctx, JsLogLevel::DEBUG, value, argc, argv);
114 }
115 
JsInfoLogPrint(JSContext * ctx,JSValueConst value,int32_t argc,JSValueConst * argv)116 JSValue JsInfoLogPrint(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv)
117 {
118     return JsLogPrint(ctx, JsLogLevel::INFO, value, argc, argv);
119 }
120 
JsWarnLogPrint(JSContext * ctx,JSValueConst value,int32_t argc,JSValueConst * argv)121 JSValue JsWarnLogPrint(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv)
122 {
123     return JsLogPrint(ctx, JsLogLevel::WARNING, value, argc, argv);
124 }
125 
JsErrorLogPrint(JSContext * ctx,JSValueConst value,int32_t argc,JSValueConst * argv)126 JSValue JsErrorLogPrint(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv)
127 {
128     return JsLogPrint(ctx, JsLogLevel::ERROR, value, argc, argv);
129 }
130 
AppLogPrint(JSContext * ctx,JsLogLevel level,JSValueConst value,int32_t argc,JSValueConst * argv)131 JSValue AppLogPrint(JSContext* ctx, JsLogLevel level, JSValueConst value, int32_t argc, JSValueConst* argv)
132 {
133     // Should have 1 parameters.
134     if ((argv == nullptr) || (argc == 0)) {
135         LOGE("the arg is error");
136         return JS_EXCEPTION;
137     }
138     std::string printLog = ParseLogContent(ctx, argc, argv);
139     switch (level) {
140         case JsLogLevel::DEBUG:
141             APP_LOGD("app Log: %{public}s", printLog.c_str());
142             break;
143         case JsLogLevel::INFO:
144             APP_LOGI("app Log: %{public}s", printLog.c_str());
145             break;
146         case JsLogLevel::WARNING:
147             APP_LOGW("app Log: %{public}s", printLog.c_str());
148             break;
149         case JsLogLevel::ERROR:
150             APP_LOGE("app Log: %{public}s", printLog.c_str());
151             break;
152         default:
153             break;
154     }
155 
156     return JS_NULL;
157 }
158 
AppLogPrint(JSContext * ctx,JSValueConst value,int32_t argc,JSValueConst * argv)159 JSValue AppLogPrint(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv)
160 {
161     return AppLogPrint(ctx, JsLogLevel::INFO, value, argc, argv);
162 }
163 
AppDebugLogPrint(JSContext * ctx,JSValueConst value,int32_t argc,JSValueConst * argv)164 JSValue AppDebugLogPrint(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv)
165 {
166     return AppLogPrint(ctx, JsLogLevel::DEBUG, value, argc, argv);
167 }
168 
AppInfoLogPrint(JSContext * ctx,JSValueConst value,int32_t argc,JSValueConst * argv)169 JSValue AppInfoLogPrint(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv)
170 {
171     return AppLogPrint(ctx, JsLogLevel::INFO, value, argc, argv);
172 }
173 
AppWarnLogPrint(JSContext * ctx,JSValueConst value,int32_t argc,JSValueConst * argv)174 JSValue AppWarnLogPrint(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv)
175 {
176     return AppLogPrint(ctx, JsLogLevel::WARNING, value, argc, argv);
177 }
178 
AppErrorLogPrint(JSContext * ctx,JSValueConst value,int32_t argc,JSValueConst * argv)179 JSValue AppErrorLogPrint(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv)
180 {
181     return AppLogPrint(ctx, JsLogLevel::ERROR, value, argc, argv);
182 }
183 
InitConsole(JSContext * ctx)184 void InitConsole(JSContext* ctx)
185 {
186     JSValue globalObj;
187     globalObj = JS_GetGlobalObject(ctx);
188     JSValue console = JS_NewObject(ctx);
189     JS_SetPropertyStr(ctx, console, "log", JS_NewCFunction(ctx, AppLogPrint, "log", 1));
190     JS_SetPropertyStr(ctx, console, "debug", JS_NewCFunction(ctx, AppDebugLogPrint, "debug", 1));
191     JS_SetPropertyStr(ctx, console, "info", JS_NewCFunction(ctx, AppInfoLogPrint, "info", 1));
192     JS_SetPropertyStr(ctx, console, "warn", JS_NewCFunction(ctx, AppWarnLogPrint, "warn", 1));
193     JS_SetPropertyStr(ctx, console, "error", JS_NewCFunction(ctx, AppErrorLogPrint, "error", 1));
194     JS_SetPropertyStr(ctx, globalObj, "console", console);
195 
196     // js framework log method
197     JSValue aceConsole = JS_NewObject(ctx);
198     JS_SetPropertyStr(ctx, aceConsole, "log", JS_NewCFunction(ctx, JsLogPrint, "log", 1));
199     JS_SetPropertyStr(ctx, aceConsole, "debug", JS_NewCFunction(ctx, JsDebugLogPrint, "debug", 1));
200     JS_SetPropertyStr(ctx, aceConsole, "info", JS_NewCFunction(ctx, JsInfoLogPrint, "info", 1));
201     JS_SetPropertyStr(ctx, aceConsole, "warn", JS_NewCFunction(ctx, JsWarnLogPrint, "warn", 1));
202     JS_SetPropertyStr(ctx, aceConsole, "error", JS_NewCFunction(ctx, JsErrorLogPrint, "error", 1));
203     JS_SetPropertyStr(ctx, globalObj, "aceConsole", aceConsole);
204     JS_FreeValue(ctx, globalObj);
205 }
206 
207 } // namespace OHOS::Ace::Framework
208