1 /*
2  * Copyright (c) 2021-2022 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 "platform/common/rs_log.h"
17 
18 #include <cstdarg>
19 #include <cstdio>
20 #include <securec.h>
21 #include <hilog/log.h>
22 #ifdef NOT_BUILD_FOR_OHOS_SDK
23 #include <parameters.h>
24 #endif
25 
26 namespace OHOS {
27 namespace Rosen {
28 namespace {
GenerateLabel(RSLog::Tag tag)29 inline const OHOS::HiviewDFX::HiLogLabel& GenerateLabel(RSLog::Tag tag)
30 {
31     return (tag == RSLog::Tag::RS) ? LABEL_RS : LABEL_ROSEN;
32 }
33 }
34 
RSLogOutput(RSLog::Tag tag,RSLog::Level level,const char * format,...)35 void RSLogOutput(RSLog::Tag tag, RSLog::Level level, const char* format, ...)
36 {
37     va_list args;
38     va_start(args, format);
39     switch (level) {
40         case RSLog::LEVEL_INFO:
41             OHOS::HiviewDFX::HiLog::Info(GenerateLabel(tag), format, args);
42             break;
43 #ifndef ROSEN_DISABLE_DEBUGLOG
44         case RSLog::LEVEL_DEBUG:
45             OHOS::HiviewDFX::HiLog::Debug(GenerateLabel(tag), format, args);
46             break;
47 #endif
48         case RSLog::LEVEL_WARN:
49             OHOS::HiviewDFX::HiLog::Warn(GenerateLabel(tag), format, args);
50             break;
51         case RSLog::LEVEL_ERROR:
52             OHOS::HiviewDFX::HiLog::Error(GenerateLabel(tag), format, args);
53             break;
54         case RSLog::LEVEL_FATAL:
55             OHOS::HiviewDFX::HiLog::Fatal(GenerateLabel(tag), format, args);
56             break;
57         default:
58             break;
59     }
60     va_end(args);
61 }
62 
RSLogManager()63 RSLogManager::RSLogManager()
64 {
65 #ifdef NOT_BUILD_FOR_OHOS_SDK
66     std::string flag = OHOS::system::GetParameter(DEBUG_GRAPHIC_LOG_FLAG, "0X0");
67     if (IsFlagValid(flag)) {
68         logFlag_ = static_cast<uint32_t>(std::stoul(flag.substr(INPUT_FLAG_MIN_LENGTH), nullptr, NUMERICAL_BASE));
69         RS_LOGI("RSLogManager init log flag: 0x%{public}X(%{public}u)", logFlag_, logFlag_);
70     }
71 #endif
72 }
73 
GetInstance()74 RSLogManager& RSLogManager::GetInstance()
75 {
76     static RSLogManager rsLogManager;
77     return rsLogManager;
78 }
79 
SetRSLogFlag(std::string & flag)80 bool RSLogManager::SetRSLogFlag(std::string& flag)
81 {
82     if (IsFlagValid(flag)) {
83 #ifdef NOT_BUILD_FOR_OHOS_SDK
84         OHOS::system::SetParameter(DEBUG_GRAPHIC_LOG_FLAG, flag);
85 #endif
86         logFlag_ = static_cast<uint32_t>(std::stoul(flag.substr(INPUT_FLAG_MIN_LENGTH), nullptr, NUMERICAL_BASE));
87         RS_LOGI("RSLogManager set log flag: 0x%{public}X(%{public}u)", logFlag_, logFlag_);
88         return true;
89     }
90     return false;
91 }
92 
IsFlagValid(std::string & flag)93 bool RSLogManager::IsFlagValid(std::string& flag)
94 {
95     if ((flag.length() > INPUT_FLAG_MIN_LENGTH) && (flag.length() <= INPUT_FLAG_MAX_LENGTH)
96         && (flag.substr(0, INPUT_FLAG_MIN_LENGTH) == "0x" || flag.substr(0, INPUT_FLAG_MIN_LENGTH) == "0X")) {
97         return true;
98     }
99     return false;
100 }
101 
102 } // namespace Rosen
103 } // namespace OHOS
104