1/*
2 * Copyright (c) 2021 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 "thermal_srv_stub.h"
17
18#include "message_parcel.h"
19#include "string_ex.h"
20
21#include "ithermal_action_callback.h"
22#include "ithermal_temp_callback.h"
23#include "ithermal_level_callback.h"
24#include "thermal_common.h"
25#include "thermal_srv_ipc_interface_code.h"
26#include "thermal_srv_sensor_info.h"
27#include "xcollie/xcollie.h"
28
29namespace OHOS {
30namespace PowerMgr {
31namespace {
32constexpr int PARAM_MAX_NUM = 10;
33}
34int ThermalSrvStub::OnRemoteRequest(uint32_t code, MessageParcel& data, MessageParcel& reply, MessageOption& option)
35{
36    THERMAL_HILOGD(COMP_SVC,
37        "ThermalSrvStub::OnRemoteRequest, cmd = %{public}d, flags = %{public}d",
38        code, option.GetFlags());
39    std::u16string descriptor = ThermalSrvStub::GetDescriptor();
40    std::u16string remoteDescriptor = data.ReadInterfaceToken();
41    if (descriptor != remoteDescriptor) {
42        THERMAL_HILOGE(COMP_SVC, "ThermalSrvStub::OnRemoteRequest failed, descriptor is not matched!");
43        return E_GET_THERMAL_SERVICE_FAILED;
44    }
45    const int DFX_DELAY_S = 60;
46    int id = HiviewDFX::XCollie::GetInstance().SetTimer("ThermalSrvStub", DFX_DELAY_S, nullptr, nullptr,
47        HiviewDFX::XCOLLIE_FLAG_LOG);
48    int32_t ret = CheckRequestCode(code, data, reply, option);
49    HiviewDFX::XCollie::GetInstance().CancelTimer(id);
50    return ret;
51}
52
53int32_t ThermalSrvStub::CheckRequestCode(const uint32_t code, MessageParcel& data, MessageParcel& reply,
54    MessageOption& option)
55{
56    switch (code) {
57        case static_cast<int>(PowerMgr::ThermalMgrInterfaceCode::REG_THERMAL_TEMP_CALLBACK): {
58            return SubscribeThermalTempCallbackStub(data);
59        }
60        case static_cast<int>(PowerMgr::ThermalMgrInterfaceCode::UNREG_THERMAL_TEMP_CALLBACK): {
61            return UnSubscribeThermalTempCallbackStub(data);
62        }
63        case static_cast<int>(PowerMgr::ThermalMgrInterfaceCode::REG_THERMAL_LEVEL_CALLBACK): {
64            return SubscribeThermalLevelCallbackStub(data);
65        }
66        case static_cast<int>(PowerMgr::ThermalMgrInterfaceCode::UNREG_THERMAL_LEVEL_CALLBACK): {
67            return UnSubscribeThermalLevelCallbackStub(data);
68        }
69        case static_cast<int>(PowerMgr::ThermalMgrInterfaceCode::REG_THERMAL_ACTION_CALLBACK): {
70            return SubscribeThermalActionCallbackStub(data);
71        }
72        case static_cast<int>(PowerMgr::ThermalMgrInterfaceCode::UNREG_THERMAL_ACTION_CALLBACK): {
73            return UnSubscribeThermalActionCallbackStub(data);
74        }
75        case static_cast<int>(PowerMgr::ThermalMgrInterfaceCode::GET_SENSOR_INFO): {
76            return GetThermalSrvSensorInfoStub(data, reply);
77        }
78        case static_cast<int>(PowerMgr::ThermalMgrInterfaceCode::GET_TEMP_LEVEL): {
79            return GetThermalevelStub(reply);
80        }
81        case static_cast<int>(PowerMgr::ThermalMgrInterfaceCode::GET_THERMAL_INFO): {
82            return GetThermalInfoStub(reply);
83        }
84        case static_cast<int>(PowerMgr::ThermalMgrInterfaceCode::SET_SCENE): {
85            return SetSceneStub(data);
86        }
87        case static_cast<int>(PowerMgr::ThermalMgrInterfaceCode::UPDATE_THERMAL_STATE): {
88            return UpdateThermalStateStub(data);
89        }
90        case static_cast<int>(PowerMgr::ThermalMgrInterfaceCode::SHELL_DUMP): {
91            return ShellDumpStub(data, reply);
92        }
93        default: {
94            return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
95        }
96    }
97}
98
99int32_t ThermalSrvStub::SubscribeThermalTempCallbackStub(MessageParcel& data)
100{
101    THERMAL_HILOGD(COMP_SVC, "Enter");
102    sptr<IRemoteObject> obj = data.ReadRemoteObject();
103    THERMAL_RETURN_IF_WITH_RET((obj == nullptr), E_READ_PARCEL_ERROR_THERMAL);
104    sptr<IThermalTempCallback> callback = iface_cast<IThermalTempCallback>(obj);
105    THERMAL_RETURN_IF_WITH_RET((callback == nullptr), E_READ_PARCEL_ERROR_THERMAL);
106    std::vector<std::string> typeList;
107    if (!data.ReadStringVector(&typeList)) {
108        THERMAL_HILOGI(COMP_SVC, "failed to read type list");
109        return ERR_INVALID_VALUE;
110    }
111    SubscribeThermalTempCallback(typeList, callback);
112    return ERR_OK;
113}
114
115int32_t ThermalSrvStub::UnSubscribeThermalTempCallbackStub(MessageParcel& data)
116{
117    THERMAL_HILOGD(COMP_SVC, "Enter");
118    sptr<IRemoteObject> obj = data.ReadRemoteObject();
119    THERMAL_RETURN_IF_WITH_RET((obj == nullptr), E_READ_PARCEL_ERROR_THERMAL);
120    sptr<IThermalTempCallback> callback = iface_cast<IThermalTempCallback>(obj);
121    THERMAL_RETURN_IF_WITH_RET((callback == nullptr), E_READ_PARCEL_ERROR_THERMAL);
122    UnSubscribeThermalTempCallback(callback);
123    return ERR_OK;
124}
125
126int32_t ThermalSrvStub::SubscribeThermalLevelCallbackStub(MessageParcel& data)
127{
128    THERMAL_HILOGD(COMP_SVC, "SubscribeThermalLevelCallbackStub Enter");
129    sptr<IRemoteObject> obj = data.ReadRemoteObject();
130    THERMAL_RETURN_IF_WITH_RET((obj == nullptr), E_READ_PARCEL_ERROR_THERMAL);
131    sptr<IThermalLevelCallback> callback = iface_cast<IThermalLevelCallback>(obj);
132    THERMAL_RETURN_IF_WITH_RET((callback == nullptr), E_READ_PARCEL_ERROR_THERMAL);
133    SubscribeThermalLevelCallback(callback);
134    return ERR_OK;
135}
136
137int32_t ThermalSrvStub::UnSubscribeThermalLevelCallbackStub(MessageParcel& data)
138{
139    THERMAL_HILOGD(COMP_SVC, "Enter");
140    sptr<IRemoteObject> obj = data.ReadRemoteObject();
141    THERMAL_RETURN_IF_WITH_RET((obj == nullptr), E_READ_PARCEL_ERROR_THERMAL);
142    sptr<IThermalLevelCallback> callback = iface_cast<IThermalLevelCallback>(obj);
143    THERMAL_RETURN_IF_WITH_RET((callback == nullptr), E_READ_PARCEL_ERROR_THERMAL);
144    UnSubscribeThermalLevelCallback(callback);
145    return ERR_OK;
146}
147
148int32_t ThermalSrvStub::SubscribeThermalActionCallbackStub(MessageParcel& data)
149{
150    THERMAL_HILOGD(COMP_SVC, "Enter");
151    sptr<IRemoteObject> obj = data.ReadRemoteObject();
152    THERMAL_RETURN_IF_WITH_RET((obj == nullptr), E_READ_PARCEL_ERROR_THERMAL);
153    sptr<IThermalActionCallback> callback = iface_cast<IThermalActionCallback>(obj);
154    THERMAL_RETURN_IF_WITH_RET((callback == nullptr), E_READ_PARCEL_ERROR_THERMAL);
155
156    std::vector<std::string> actionList;
157    if (!data.ReadStringVector(&actionList)) {
158        THERMAL_HILOGI(COMP_SVC, "failed to read action list");
159        return ERR_INVALID_VALUE;
160    }
161
162    std::string desc;
163    THERMAL_READ_PARCEL_WITH_RET(data, String, desc, E_READ_PARCEL_ERROR_THERMAL);
164
165    SubscribeThermalActionCallback(actionList, desc, callback);
166    return ERR_OK;
167}
168
169int32_t ThermalSrvStub::UnSubscribeThermalActionCallbackStub(MessageParcel& data)
170{
171    THERMAL_HILOGD(COMP_SVC, "Enter");
172    sptr<IRemoteObject> obj = data.ReadRemoteObject();
173    THERMAL_RETURN_IF_WITH_RET((obj == nullptr), E_READ_PARCEL_ERROR_THERMAL);
174    sptr<IThermalActionCallback> callback = iface_cast<IThermalActionCallback>(obj);
175    THERMAL_RETURN_IF_WITH_RET((callback == nullptr), E_READ_PARCEL_ERROR_THERMAL);
176    UnSubscribeThermalActionCallback(callback);
177    return ERR_OK;
178}
179
180int32_t ThermalSrvStub::GetThermalSrvSensorInfoStub(MessageParcel& data, MessageParcel& reply)
181{
182    ThermalSrvSensorInfo sensorInfo;
183    uint32_t type = 0;
184
185    THERMAL_READ_PARCEL_WITH_RET(data, Uint32, type, E_READ_PARCEL_ERROR_THERMAL);
186    THERMAL_HILOGD(COMP_SVC, "type is %{public}d", type);
187    bool ret = GetThermalSrvSensorInfo(static_cast<SensorType>(type), sensorInfo);
188    if (ret) {
189        if (!reply.WriteParcelable(&sensorInfo)) {
190            THERMAL_HILOGE(COMP_SVC, "write failed");
191            return -1;
192        }
193    }
194    return ERR_OK;
195}
196
197int32_t ThermalSrvStub::GetThermalevelStub(MessageParcel& reply)
198{
199    THERMAL_HILOGD(COMP_SVC, "Enter");
200    ThermalLevel level;
201    GetThermalLevel(level);
202    THERMAL_WRITE_PARCEL_WITH_RET(reply, Uint32, static_cast<uint32_t>(level), ERR_OK);
203    return ERR_OK;
204}
205
206int32_t ThermalSrvStub::GetThermalInfoStub(MessageParcel& reply)
207{
208    THERMAL_HILOGD(COMP_SVC, "Enter");
209    bool ret = false;
210    ret = GetThermalInfo();
211    if (!reply.WriteBool(ret)) {
212        THERMAL_HILOGE(COMP_FWK, "WriteBool fail");
213        return E_READ_PARCEL_ERROR_THERMAL;
214    }
215    return ERR_OK;
216}
217
218int32_t ThermalSrvStub::SetSceneStub(MessageParcel& data)
219{
220    THERMAL_HILOGD(COMP_SVC, "Enter");
221    std::string scene;
222
223    THERMAL_READ_PARCEL_WITH_RET(data, String, scene, E_READ_PARCEL_ERROR_THERMAL);
224    SetScene(scene);
225    return ERR_OK;
226}
227
228int32_t ThermalSrvStub::UpdateThermalStateStub(MessageParcel& data)
229{
230    THERMAL_HILOGD(COMP_SVC, "Enter");
231    std::string tag;
232    std::string val;
233    bool isImmed = false;
234    THERMAL_READ_PARCEL_WITH_RET(data, String, tag, E_READ_PARCEL_ERROR_THERMAL);
235    THERMAL_READ_PARCEL_WITH_RET(data, String, val, E_READ_PARCEL_ERROR_THERMAL);
236    THERMAL_READ_PARCEL_WITH_RET(data, Bool, isImmed, E_READ_PARCEL_ERROR_THERMAL);
237    UpdateThermalState(tag, val, isImmed);
238    return ERR_OK;
239}
240
241int32_t ThermalSrvStub::ShellDumpStub(MessageParcel& data, MessageParcel& reply)
242{
243    uint32_t argc;
244    std::vector<std::string> args;
245
246    if (!data.ReadUint32(argc)) {
247        THERMAL_HILOGE(COMP_SVC, "Readback fail!");
248        return E_READ_PARCEL_ERROR_THERMAL;
249    }
250
251    if (argc >= PARAM_MAX_NUM) {
252        THERMAL_HILOGE(COMP_SVC, "params exceed limit");
253        return E_EXCEED_PARAM_LIMIT;
254    }
255
256    for (uint32_t i = 0; i < argc; i++) {
257        std::string arg = data.ReadString();
258        if (arg.empty()) {
259            THERMAL_HILOGE(COMP_SVC, "read value fail:%{public}d", i);
260            return E_READ_PARCEL_ERROR_THERMAL;
261        }
262        args.push_back(arg);
263    }
264
265    std::string ret = ShellDump(args, argc);
266    if (!reply.WriteString(ret)) {
267        THERMAL_HILOGE(COMP_SVC, "PowerMgrStub:: Dump Writeback Fail!");
268        return E_READ_PARCEL_ERROR_THERMAL;
269    }
270    return ERR_OK;
271}
272} // namespace PowerMgr
273} // namespace OHOS
274