1094332d3Sopenharmony_ci/*
2094332d3Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License.
5094332d3Sopenharmony_ci * You may obtain a copy of the License at
6094332d3Sopenharmony_ci *
7094332d3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8094332d3Sopenharmony_ci *
9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and
13094332d3Sopenharmony_ci * limitations under the License.
14094332d3Sopenharmony_ci */
15094332d3Sopenharmony_ci
16094332d3Sopenharmony_ci#include "display_dump_service.h"
17094332d3Sopenharmony_ci
18094332d3Sopenharmony_ci#include <string>
19094332d3Sopenharmony_ci#include <securec.h>
20094332d3Sopenharmony_ci#include <cstdio>
21094332d3Sopenharmony_ci#include <dlfcn.h>
22094332d3Sopenharmony_ci
23094332d3Sopenharmony_ci#include "devhost_dump_reg.h"
24094332d3Sopenharmony_ci#include "hdf_base.h"
25094332d3Sopenharmony_ci#include "hdf_log.h"
26094332d3Sopenharmony_ci
27094332d3Sopenharmony_ci#define HDF_LOG_TAG uhdf_composer_host
28094332d3Sopenharmony_ci
29094332d3Sopenharmony_cinamespace OHOS {
30094332d3Sopenharmony_cinamespace HDI {
31094332d3Sopenharmony_cinamespace Display {
32094332d3Sopenharmony_cinamespace Composer {
33094332d3Sopenharmony_cinamespace V1_0 {
34094332d3Sopenharmony_ci
35094332d3Sopenharmony_ciusing namespace std;
36094332d3Sopenharmony_ciusing namespace OHOS::HDI::Display::Composer::V1_0;
37094332d3Sopenharmony_ci
38094332d3Sopenharmony_ciconst char *g_composerDumpHelp =
39094332d3Sopenharmony_ci    " Composer Host dump options:\n"
40094332d3Sopenharmony_ci    "     -module [name]: get dump info.\n"
41094332d3Sopenharmony_ci    "          [name]\n"
42094332d3Sopenharmony_ci    "             vdi: get vdi dump info\n"
43094332d3Sopenharmony_ci    "             display: get display dump info";
44094332d3Sopenharmony_ci
45094332d3Sopenharmony_cistatic int32_t ShowDumpMenu(struct HdfSBuf *reply)
46094332d3Sopenharmony_ci{
47094332d3Sopenharmony_ci    (void)HdfSbufWriteString(reply, g_composerDumpHelp);
48094332d3Sopenharmony_ci    return HDF_SUCCESS;
49094332d3Sopenharmony_ci}
50094332d3Sopenharmony_ci
51094332d3Sopenharmony_cienum {
52094332d3Sopenharmony_ci    DUMP_EVENT_NONE,
53094332d3Sopenharmony_ci    DUMP_EVENT_VDI,
54094332d3Sopenharmony_ci    DUMP_EVENT_DISPLAY,
55094332d3Sopenharmony_ci};
56094332d3Sopenharmony_ci
57094332d3Sopenharmony_cistatic int32_t GetDumpEvent(struct HdfSBuf *data, uint32_t *argsNum)
58094332d3Sopenharmony_ci{
59094332d3Sopenharmony_ci    if (!HdfSbufReadUint32(data, argsNum)) {
60094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: read argsNum failed!", __func__);
61094332d3Sopenharmony_ci        return DUMP_EVENT_NONE;
62094332d3Sopenharmony_ci    }
63094332d3Sopenharmony_ci    const char *op1 = HdfSbufReadString(data);
64094332d3Sopenharmony_ci    if (op1 == nullptr || strcmp(op1, "-module") != 0) {
65094332d3Sopenharmony_ci        return DUMP_EVENT_NONE;
66094332d3Sopenharmony_ci    }
67094332d3Sopenharmony_ci    const char *op2 = HdfSbufReadString(data);
68094332d3Sopenharmony_ci    if (op2 == nullptr) {
69094332d3Sopenharmony_ci        return DUMP_EVENT_NONE;
70094332d3Sopenharmony_ci    }
71094332d3Sopenharmony_ci    if (strcmp(op2, "vdi") == 0) {
72094332d3Sopenharmony_ci        return DUMP_EVENT_VDI;
73094332d3Sopenharmony_ci    }
74094332d3Sopenharmony_ci    if (strcmp(op2, "display") == 0) {
75094332d3Sopenharmony_ci        return DUMP_EVENT_DISPLAY;
76094332d3Sopenharmony_ci    }
77094332d3Sopenharmony_ci    return DUMP_EVENT_NONE;
78094332d3Sopenharmony_ci}
79094332d3Sopenharmony_ci
80094332d3Sopenharmony_ciint32_t ComposerDumpEvent(struct HdfSBuf *data, struct HdfSBuf *reply)
81094332d3Sopenharmony_ci{
82094332d3Sopenharmony_ci    if (data == nullptr || reply == nullptr) {
83094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: %{public}s is nullptr", __func__, (data == nullptr) ? "data" : "reply");
84094332d3Sopenharmony_ci        return HDF_FAILURE;
85094332d3Sopenharmony_ci    }
86094332d3Sopenharmony_ci
87094332d3Sopenharmony_ci    int32_t ret;
88094332d3Sopenharmony_ci    uint32_t argsNum = 0;
89094332d3Sopenharmony_ci    int32_t event = GetDumpEvent(data, &argsNum);
90094332d3Sopenharmony_ci    VdiDumper &vdiDumper = VdiDumper::GetInstance();
91094332d3Sopenharmony_ci    DisplayDumper &dispDumper = DisplayDumper::GetInstance();
92094332d3Sopenharmony_ci    switch (event) {
93094332d3Sopenharmony_ci        case DUMP_EVENT_VDI:
94094332d3Sopenharmony_ci            ret = vdiDumper.ComposerHostDumpProcess(data, reply, argsNum);
95094332d3Sopenharmony_ci            break;
96094332d3Sopenharmony_ci        case DUMP_EVENT_DISPLAY:
97094332d3Sopenharmony_ci            ret = dispDumper.ComposerHostDumpProcess(data, reply, argsNum);
98094332d3Sopenharmony_ci            break;
99094332d3Sopenharmony_ci        default:
100094332d3Sopenharmony_ci            ret = ShowDumpMenu(reply);
101094332d3Sopenharmony_ci            break;
102094332d3Sopenharmony_ci    }
103094332d3Sopenharmony_ci
104094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
105094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get composer dump failed, ret=%{public}d", __func__, ret);
106094332d3Sopenharmony_ci        return HDF_FAILURE;
107094332d3Sopenharmony_ci    }
108094332d3Sopenharmony_ci
109094332d3Sopenharmony_ci    return HDF_SUCCESS;
110094332d3Sopenharmony_ci}
111094332d3Sopenharmony_ci
112094332d3Sopenharmony_ci} //namespace V1_0
113094332d3Sopenharmony_ci} //namespace Composer
114094332d3Sopenharmony_ci} //namespace Display
115094332d3Sopenharmony_ci} //namespace HDI
116094332d3Sopenharmony_ci} //namespace OHOS