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 "display_dump_vdi.h"
17
18 #include <string>
19 #include <securec.h>
20 #include <cstdio>
21 #include <dlfcn.h>
22
23 #include "devhost_dump_reg.h"
24 #include "hdf_base.h"
25 #include "hdf_log.h"
26
27 #define HDF_LOG_TAG uhdf_composer_host
28
29 namespace OHOS {
30 namespace HDI {
31 namespace Display {
32 namespace Composer {
33 namespace V1_0 {
34
35 using namespace std;
36 using namespace OHOS::HDI::Display::Composer::V1_0;
37
38 const char *g_vdiComposerDumpHelp =
39 " Get Vdi Dump Info options:\n"
40 " -cmd [name]: operate vdi dump.\n"
41 " [name]\n"
42 " buffer: dump buffer\n"
43 " user: update user config\n";
44
SetDumpInfoFunc(GetDumpInfoFunc DumpInfoFunc_)45 void VdiDumper::SetDumpInfoFunc(GetDumpInfoFunc DumpInfoFunc_)
46 {
47 if (DumpInfoFunc_ == nullptr) {
48 HDF_LOGE("%{public}s: SetDumpInfoFunc failed, DumpInfoFunc_ null", __func__);
49 }
50
51 getDumpInfoFunc_ = DumpInfoFunc_;
52 }
53
SetConfigFunc(UpdateConfigFunc ConfigFunc_)54 void VdiDumper::SetConfigFunc(UpdateConfigFunc ConfigFunc_)
55 {
56 if (ConfigFunc_ == nullptr) {
57 HDF_LOGE("%{public}s: SetConfigFunc failed, ConfigFunc_ null", __func__);
58 }
59
60 updateConfigFunc_ = ConfigFunc_;
61 }
62
DumpBuffer(HdfSBuf * reply)63 int32_t VdiDumper::DumpBuffer(HdfSBuf *reply)
64 {
65 string result;
66 if (getDumpInfoFunc_ != nullptr) {
67 getDumpInfoFunc_(result);
68 } else {
69 result += "vdi -cmd buffer not support.\n";
70 }
71
72 if (!HdfSbufWriteString(reply, result.c_str())) {
73 HDF_LOGI("%{public}s: dump buffer failed", __func__);
74 return HDF_FAILURE;
75 }
76
77 return HDF_SUCCESS;
78 }
79
UpdateUserConfig(HdfSBuf * reply)80 int32_t VdiDumper::UpdateUserConfig(HdfSBuf *reply)
81 {
82 string result;
83 if (updateConfigFunc_ != nullptr) {
84 updateConfigFunc_(result);
85 } else {
86 result += "vdi -cmd user not support.\n";
87 }
88
89 if (!HdfSbufWriteString(reply, result.c_str())) {
90 HDF_LOGI("%{public}s: udpate failed", __func__);
91 return HDF_FAILURE;
92 }
93
94 return HDF_SUCCESS;
95 }
96
ShowDumpMenu(HdfSBuf * reply)97 int32_t VdiDumper::ShowDumpMenu(HdfSBuf *reply)
98 {
99 if (reply != nullptr) {
100 (void)HdfSbufWriteString(reply, g_vdiComposerDumpHelp);
101 return HDF_SUCCESS;
102 } else {
103 return HDF_FAILURE;
104 }
105 }
106
107 enum {
108 DUMP_VDI_EVENT_NONE,
109 DUMP_VDI_EVENT_USER,
110 DUMP_VDI_EVENT_BUFFER,
111 };
112
GetDumpVdiEvent(struct HdfSBuf * data)113 int32_t GetDumpVdiEvent(struct HdfSBuf *data)
114 {
115 const char *op1 = HdfSbufReadString(data);
116 if (op1 == nullptr || strcmp(op1, "-cmd") != 0) {
117 return DUMP_VDI_EVENT_NONE;
118 }
119 const char *op2 = HdfSbufReadString(data);
120 if (op2 == nullptr) {
121 return DUMP_VDI_EVENT_NONE;
122 }
123 if (strcmp(op2, "user") == 0) {
124 return DUMP_VDI_EVENT_USER;
125 }
126 if (strcmp(op2, "buffer") == 0) {
127 return DUMP_VDI_EVENT_BUFFER;
128 }
129 return DUMP_VDI_EVENT_NONE;
130 }
131
ComposerHostDumpProcess(struct HdfSBuf * data,struct HdfSBuf * reply,uint32_t argsNum)132 int32_t VdiDumper::ComposerHostDumpProcess(struct HdfSBuf *data, struct HdfSBuf *reply, uint32_t argsNum)
133 {
134 if (reply == nullptr || data == nullptr) {
135 return HDF_FAILURE;
136 }
137 int32_t ret;
138 int32_t event = GetDumpVdiEvent(data);
139 switch (event) {
140 case DUMP_VDI_EVENT_USER:
141 ret = UpdateUserConfig(reply);
142 break;
143 case DUMP_VDI_EVENT_BUFFER:
144 ret = DumpBuffer(reply);
145 break;
146 default:
147 ret = ShowDumpMenu(reply);
148 break;
149 }
150
151 if (ret != HDF_SUCCESS) {
152 HDF_LOGE("%{public}s: get composer vdi dump failed", __func__);
153 return HDF_FAILURE;
154 }
155
156 return HDF_SUCCESS;
157 }
158
159 } //namespace V1_0
160 } //namespace Composer
161 } //namespace Display
162 } //namespace HDI
163 } //namespace OHOS