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 "zidl/screen_session_manager_client_stub.h"
17
18 #include "window_manager_hilog.h"
19
20 namespace OHOS::Rosen {
21 namespace {
22 constexpr HiviewDFX::HiLogLabel LABEL = { LOG_CORE, HILOG_DOMAIN_DISPLAY, "ScreenSessionManagerClientStub" };
23 } // namespace
24
25 const std::map<uint32_t, ScreenSessionManagerClientStub::StubFunc> ScreenSessionManagerClientStub::stubFuncMap_ {
26 { static_cast<uint32_t>(ScreenSessionManagerClientMessage::TRANS_ID_ON_SCREEN_CONNECTION_CHANGED),
27 &ScreenSessionManagerClientStub::HandleOnScreenConnectionChanged },
28 { static_cast<uint32_t>(ScreenSessionManagerClientMessage::TRANS_ID_ON_PROPERTY_CHANGED),
29 &ScreenSessionManagerClientStub::HandleOnPropertyChanged },
30 { static_cast<uint32_t>(ScreenSessionManagerClientMessage::TRANS_ID_ON_POWER_STATUS_CHANGED),
31 &ScreenSessionManagerClientStub::HandleOnPowerStatusChanged },
32 { static_cast<uint32_t>(ScreenSessionManagerClientMessage::TRANS_ID_ON_SENSOR_ROTATION_CHANGED),
33 &ScreenSessionManagerClientStub::HandleOnSensorRotationChanged },
34 { static_cast<uint32_t>(ScreenSessionManagerClientMessage::TRANS_ID_ON_SCREEN_ORIENTATION_CHANGED),
35 &ScreenSessionManagerClientStub::HandleOnScreenOrientationChanged },
36 { static_cast<uint32_t>(ScreenSessionManagerClientMessage::TRANS_ID_ON_SCREEN_ROTATION_LOCKED_CHANGED),
37 &ScreenSessionManagerClientStub::HandleOnScreenRotationLockedChanged },
38 { static_cast<uint32_t>(ScreenSessionManagerClientMessage::TRANS_ID_ON_DISPLAY_STATE_CHANGED),
39 &ScreenSessionManagerClientStub::HandleOnDisplayStateChanged },
40 { static_cast<uint32_t>(ScreenSessionManagerClientMessage::TRANS_ID_ON_SCREEN_SHOT),
41 &ScreenSessionManagerClientStub::HandleOnScreenshot },
42 { static_cast<uint32_t>(ScreenSessionManagerClientMessage::TRANS_ID_ON_IMMERSIVE_STATE_CHANGED),
43 &ScreenSessionManagerClientStub::HandleOnImmersiveStateChanged },
44 { static_cast<uint32_t>(ScreenSessionManagerClientMessage::TRANS_ID_SET_DISPLAY_NODE_SCREEN_ID),
45 &ScreenSessionManagerClientStub::HandleOnSetDisplayNodeScreenId },
46 { static_cast<uint32_t>(ScreenSessionManagerClientMessage::TRANS_ID_GET_SURFACENODEID_FROM_MISSIONID),
47 &ScreenSessionManagerClientStub::HandleOnGetSurfaceNodeIdsFromMissionIdsChanged },
48 };
49
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)50 int ScreenSessionManagerClientStub::OnRemoteRequest(uint32_t code, MessageParcel& data, MessageParcel& reply,
51 MessageOption& option)
52 {
53 if (data.ReadInterfaceToken() != GetDescriptor()) {
54 WLOGFE("Failed to check interface token!");
55 return ERR_INVALID_STATE;
56 }
57
58 auto iter = stubFuncMap_.find(code);
59 if (iter == stubFuncMap_.end()) {
60 WLOGFE("Failed to find function handler!");
61 return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
62 }
63
64 return (this->*(iter->second))(data, reply);
65 }
66
HandleOnScreenConnectionChanged(MessageParcel & data,MessageParcel & reply)67 int ScreenSessionManagerClientStub::HandleOnScreenConnectionChanged(MessageParcel& data, MessageParcel& reply)
68 {
69 WLOGD("HandleOnScreenConnectionChanged");
70 auto screenId = static_cast<ScreenId>(data.ReadUint64());
71 auto screenEvent = static_cast<ScreenEvent>(data.ReadUint8());
72 auto rsId = static_cast<ScreenId>(data.ReadUint64());
73 auto name = data.ReadString();
74 OnScreenConnectionChanged(screenId, screenEvent, rsId, name);
75 return ERR_NONE;
76 }
77
HandleOnPropertyChanged(MessageParcel & data,MessageParcel & reply)78 int ScreenSessionManagerClientStub::HandleOnPropertyChanged(MessageParcel& data, MessageParcel& reply)
79 {
80 WLOGD("HandleOnPropertyChanged");
81 auto screenId = static_cast<ScreenId>(data.ReadUint64());
82 ScreenProperty property;
83 if (!RSMarshallingHelper::Unmarshalling(data, property)) {
84 WLOGFE("Read property failed");
85 return ERR_INVALID_DATA;
86 }
87 auto reason = static_cast<ScreenPropertyChangeReason>(data.ReadUint32());
88 OnPropertyChanged(screenId, property, reason);
89 return ERR_NONE;
90 }
91
HandleOnPowerStatusChanged(MessageParcel & data,MessageParcel & reply)92 int ScreenSessionManagerClientStub::HandleOnPowerStatusChanged(MessageParcel& data, MessageParcel& reply)
93 {
94 WLOGD("HandleOnPowerStatusChanged");
95 auto event = static_cast<DisplayPowerEvent>(data.ReadUint32());
96 auto status = static_cast<EventStatus>(data.ReadUint32());
97 auto reason = static_cast<PowerStateChangeReason>(data.ReadUint32());
98 OnPowerStatusChanged(event, status, reason);
99 return ERR_NONE;
100 }
101
HandleOnSensorRotationChanged(MessageParcel & data,MessageParcel & reply)102 int ScreenSessionManagerClientStub::HandleOnSensorRotationChanged(MessageParcel& data, MessageParcel& reply)
103 {
104 WLOGD("HandleOnSensorRotationChanged");
105 auto screenId = static_cast<ScreenId>(data.ReadUint64());
106 auto sensorRotation = data.ReadFloat();
107 OnSensorRotationChanged(screenId, sensorRotation);
108 return ERR_NONE;
109 }
110
HandleOnScreenOrientationChanged(MessageParcel & data,MessageParcel & reply)111 int ScreenSessionManagerClientStub::HandleOnScreenOrientationChanged(MessageParcel& data, MessageParcel& reply)
112 {
113 WLOGD("HandleOnScreenOrientationChanged");
114 auto screenId = static_cast<ScreenId>(data.ReadUint64());
115 auto screenOrientation = data.ReadFloat();
116 OnScreenOrientationChanged(screenId, screenOrientation);
117 return ERR_NONE;
118 }
119
HandleOnScreenRotationLockedChanged(MessageParcel & data,MessageParcel & reply)120 int ScreenSessionManagerClientStub::HandleOnScreenRotationLockedChanged(MessageParcel& data, MessageParcel& reply)
121 {
122 WLOGD("HandleOnScreenRotationLockedChanged");
123 auto screenId = static_cast<ScreenId>(data.ReadUint64());
124 auto isLocked = data.ReadBool();
125 OnScreenRotationLockedChanged(screenId, isLocked);
126 return ERR_NONE;
127 }
128
HandleOnDisplayStateChanged(MessageParcel & data,MessageParcel & reply)129 int ScreenSessionManagerClientStub::HandleOnDisplayStateChanged(MessageParcel& data, MessageParcel& reply)
130 {
131 WLOGD("HandleOnDisplayStateChanged");
132 auto defaultDisplayId = static_cast<DisplayId>(data.ReadUint64());
133 auto displayInfo = data.ReadStrongParcelable<DisplayInfo>();
134 auto mapSize = data.ReadUint32();
135 std::map<DisplayId, sptr<DisplayInfo>> displayInfoMap;
136 while (mapSize--) {
137 auto displayId = data.ReadUint64();
138 auto displayInfoValue = data.ReadStrongParcelable<DisplayInfo>();
139 displayInfoMap.emplace(displayId, displayInfoValue);
140 }
141 auto type = static_cast<DisplayStateChangeType>(data.ReadUint32());
142 OnDisplayStateChanged(defaultDisplayId, displayInfo, displayInfoMap, type);
143 return ERR_NONE;
144 }
145
HandleOnGetSurfaceNodeIdsFromMissionIdsChanged(MessageParcel & data,MessageParcel & reply)146 int ScreenSessionManagerClientStub::HandleOnGetSurfaceNodeIdsFromMissionIdsChanged(MessageParcel& data,
147 MessageParcel& reply)
148 {
149 std::vector<uint64_t> missionIds;
150 data.ReadUInt64Vector(&missionIds);
151 std::vector<uint64_t> surfaceNodeIds;
152 data.ReadUInt64Vector(&surfaceNodeIds);
153 OnGetSurfaceNodeIdsFromMissionIdsChanged(missionIds, surfaceNodeIds);
154 if (!reply.WriteUInt64Vector(surfaceNodeIds)) {
155 WLOGFE("Write surfaceNodeIds failed");
156 return ERR_TRANSACTION_FAILED;
157 }
158 return ERR_NONE;
159 }
160
HandleOnScreenshot(MessageParcel & data,MessageParcel & reply)161 int ScreenSessionManagerClientStub::HandleOnScreenshot(MessageParcel& data, MessageParcel& reply)
162 {
163 WLOGD("HandleOnScreenshot");
164 auto displayId = static_cast<DisplayId>(data.ReadUint64());
165 OnScreenshot(displayId);
166 return ERR_NONE;
167 }
168
HandleOnImmersiveStateChanged(MessageParcel & data,MessageParcel & reply)169 int ScreenSessionManagerClientStub::HandleOnImmersiveStateChanged(MessageParcel& data, MessageParcel& reply)
170 {
171 WLOGD("HandleOnImmersiveStateChanged");
172 bool immersive = false;
173 OnImmersiveStateChanged(immersive);
174 if (!reply.WriteBool(immersive)) {
175 WLOGFE("Write immersive failed");
176 return ERR_TRANSACTION_FAILED;
177 }
178 return ERR_NONE;
179 }
180
HandleOnSetDisplayNodeScreenId(MessageParcel & data,MessageParcel & reply)181 int ScreenSessionManagerClientStub::HandleOnSetDisplayNodeScreenId(MessageParcel& data, MessageParcel& reply)
182 {
183 WLOGD("HandleOnSetDisplayNodeScreenId");
184 auto screenId = static_cast<ScreenId>(data.ReadUint64());
185 auto displayNodeScreenId = static_cast<ScreenId>(data.ReadUint64());
186 SetDisplayNodeScreenId(screenId, displayNodeScreenId);
187 return ERR_NONE;
188 }
189 } // namespace OHOS::Rosen
190