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