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_service.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_composerDumpHelp =
39 " Composer Host dump options:\n"
40 " -module [name]: get dump info.\n"
41 " [name]\n"
42 " vdi: get vdi dump info\n"
43 " display: get display dump info";
44
ShowDumpMenu(struct HdfSBuf * reply)45 static int32_t ShowDumpMenu(struct HdfSBuf *reply)
46 {
47 (void)HdfSbufWriteString(reply, g_composerDumpHelp);
48 return HDF_SUCCESS;
49 }
50
51 enum {
52 DUMP_EVENT_NONE,
53 DUMP_EVENT_VDI,
54 DUMP_EVENT_DISPLAY,
55 };
56
GetDumpEvent(struct HdfSBuf * data,uint32_t * argsNum)57 static int32_t GetDumpEvent(struct HdfSBuf *data, uint32_t *argsNum)
58 {
59 if (!HdfSbufReadUint32(data, argsNum)) {
60 HDF_LOGE("%{public}s: read argsNum failed!", __func__);
61 return DUMP_EVENT_NONE;
62 }
63 const char *op1 = HdfSbufReadString(data);
64 if (op1 == nullptr || strcmp(op1, "-module") != 0) {
65 return DUMP_EVENT_NONE;
66 }
67 const char *op2 = HdfSbufReadString(data);
68 if (op2 == nullptr) {
69 return DUMP_EVENT_NONE;
70 }
71 if (strcmp(op2, "vdi") == 0) {
72 return DUMP_EVENT_VDI;
73 }
74 if (strcmp(op2, "display") == 0) {
75 return DUMP_EVENT_DISPLAY;
76 }
77 return DUMP_EVENT_NONE;
78 }
79
ComposerDumpEvent(struct HdfSBuf * data,struct HdfSBuf * reply)80 int32_t ComposerDumpEvent(struct HdfSBuf *data, struct HdfSBuf *reply)
81 {
82 if (data == nullptr || reply == nullptr) {
83 HDF_LOGE("%{public}s: %{public}s is nullptr", __func__, (data == nullptr) ? "data" : "reply");
84 return HDF_FAILURE;
85 }
86
87 int32_t ret;
88 uint32_t argsNum = 0;
89 int32_t event = GetDumpEvent(data, &argsNum);
90 VdiDumper &vdiDumper = VdiDumper::GetInstance();
91 DisplayDumper &dispDumper = DisplayDumper::GetInstance();
92 switch (event) {
93 case DUMP_EVENT_VDI:
94 ret = vdiDumper.ComposerHostDumpProcess(data, reply, argsNum);
95 break;
96 case DUMP_EVENT_DISPLAY:
97 ret = dispDumper.ComposerHostDumpProcess(data, reply, argsNum);
98 break;
99 default:
100 ret = ShowDumpMenu(reply);
101 break;
102 }
103
104 if (ret != HDF_SUCCESS) {
105 HDF_LOGE("%{public}s: get composer dump failed, ret=%{public}d", __func__, ret);
106 return HDF_FAILURE;
107 }
108
109 return HDF_SUCCESS;
110 }
111
112 } //namespace V1_0
113 } //namespace Composer
114 } //namespace Display
115 } //namespace HDI
116 } //namespace OHOS