1 /*
2 * Copyright (c) 2021-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 "sys_event_service_stub.h"
17
18 #include "errors.h"
19 #include "hiview_logger.h"
20 #include "memory_util.h"
21 #include "parcelable_vector_rw.h"
22 #include "query_argument.h"
23
24 namespace OHOS {
25 namespace HiviewDFX {
26 DEFINE_LOG_TAG("HiView-SysEventServiceStub");
HandleAddSysEventListener(MessageParcel & data,MessageParcel & reply,MessageOption & option)27 int32_t SysEventServiceStub::HandleAddSysEventListener(MessageParcel& data,
28 MessageParcel& reply, MessageOption& option)
29 {
30 std::vector<SysEventRule> rules;
31 bool ret = ReadVectorFromParcel(data, rules);
32 if (!ret) {
33 HIVIEW_LOGE("parcel read rules failed.");
34 return ERR_FLATTEN_OBJECT;
35 }
36 sptr<IRemoteObject> remoteObject = data.ReadRemoteObject();
37 if (remoteObject == nullptr) {
38 return ERR_FLATTEN_OBJECT;
39 }
40 sptr<ISysEventCallback> callback = iface_cast<ISysEventCallback>(remoteObject);
41 ret = reply.WriteInt32(AddListener(rules, callback));
42 if (!ret) {
43 HIVIEW_LOGE("parcel write return-value of AddListener failed.");
44 return ERR_FLATTEN_OBJECT;
45 }
46 return ERR_OK;
47 }
48
HandleRemoveSysEventListener(MessageParcel & data,MessageParcel & reply,MessageOption & option)49 int32_t SysEventServiceStub::HandleRemoveSysEventListener(MessageParcel& data,
50 MessageParcel& reply, MessageOption& option)
51 {
52 sptr<IRemoteObject> remoteObject = data.ReadRemoteObject();
53 if (remoteObject == nullptr) {
54 return ERR_FLATTEN_OBJECT;
55 }
56 sptr<ISysEventCallback> callback = iface_cast<ISysEventCallback>(remoteObject);
57 if (callback == nullptr) {
58 HIVIEW_LOGE("parcel read callback failed.");
59 return ERR_FLATTEN_OBJECT;
60 }
61 bool ret = reply.WriteInt32(RemoveListener(callback));
62 if (!ret) {
63 HIVIEW_LOGE("parcel write return-value of RemoveListener failed.");
64 return ERR_FLATTEN_OBJECT;
65 }
66 return ERR_OK;
67 }
68
HandleQueryEvent(MessageParcel & data,MessageParcel & reply,MessageOption & option)69 int32_t SysEventServiceStub::HandleQueryEvent(MessageParcel& data,
70 MessageParcel& reply, MessageOption& option)
71 {
72 std::unique_ptr<QueryArgument> queryArgument(data.ReadParcelable<QueryArgument>());
73 if (queryArgument == nullptr) {
74 HIVIEW_LOGE("parcel read query arguments failed.");
75 return ERR_FLATTEN_OBJECT;
76 }
77 std::vector<SysEventQueryRule> queryRules;
78 auto ret = ReadVectorFromParcel(data, queryRules);
79 if (!ret) {
80 HIVIEW_LOGE("parcel read query rules failed.");
81 return ERR_FLATTEN_OBJECT;
82 }
83 sptr<IRemoteObject> remoteObject = data.ReadRemoteObject();
84 if (remoteObject == nullptr) {
85 HIVIEW_LOGE("parcel read query callback failed.");
86 return ERR_FLATTEN_OBJECT;
87 }
88 sptr<IQuerySysEventCallback> callback = iface_cast<IQuerySysEventCallback>(remoteObject);
89 ret = reply.WriteInt32(Query(*queryArgument, queryRules, callback));
90 if (!ret) {
91 HIVIEW_LOGE("parcel write return-value of QuerySysEvent failed.");
92 return ERR_FLATTEN_OBJECT;
93 }
94 return ERR_OK;
95 }
96
HandleSetDebugMode(MessageParcel & data,MessageParcel & reply,MessageOption & option)97 int32_t SysEventServiceStub::HandleSetDebugMode(MessageParcel& data,
98 MessageParcel& reply, MessageOption& option)
99 {
100 sptr<IRemoteObject> remoteObject = data.ReadRemoteObject();
101 if (remoteObject == nullptr) {
102 return ERR_FLATTEN_OBJECT;
103 }
104 sptr<ISysEventCallback> callback = iface_cast<ISysEventCallback>(remoteObject);
105 bool mode = false;
106 bool ret = data.ReadBool(mode);
107 if (!ret) {
108 HIVIEW_LOGE("parcel read mode failed.");
109 return ERR_FLATTEN_OBJECT;
110 }
111 ret = reply.WriteInt32(SetDebugMode(callback, mode));
112 if (!ret) {
113 HIVIEW_LOGE("parcel write return-value of SetDebugMode failed.");
114 return ERR_FLATTEN_OBJECT;
115 }
116 return ERR_OK;
117 }
118
HandleAddSubscriber(MessageParcel & data,MessageParcel & reply,MessageOption & option)119 int32_t SysEventServiceStub::HandleAddSubscriber(MessageParcel &data,
120 MessageParcel &reply, MessageOption &option)
121 {
122 std::vector<SysEventQueryRule> queryRules;
123 auto ret = ReadVectorFromParcel(data, queryRules);
124 if (!ret) {
125 HIVIEW_LOGE("parcel read export rules failed.");
126 return ERR_FLATTEN_OBJECT;
127 }
128 ret = reply.WriteInt64(AddSubscriber(queryRules));
129 if (!ret) {
130 HIVIEW_LOGE("write return-value of AddSubscriber failed.");
131 return ERR_FLATTEN_OBJECT;
132 }
133 return ERR_OK;
134 }
135
HandleRemoveSubscriber(MessageParcel & data,MessageParcel & reply,MessageOption & option)136 int32_t SysEventServiceStub::HandleRemoveSubscriber(
137 MessageParcel &data, MessageParcel &reply, MessageOption &option)
138 {
139 auto ret = reply.WriteInt32(RemoveSubscriber());
140 if (!ret) {
141 HIVIEW_LOGE("write return-value of RemoveSubscriber failed.");
142 return ERR_FLATTEN_OBJECT;
143 }
144 return ERR_OK;
145 }
146
HandleExportEvent(MessageParcel & data,MessageParcel & reply,MessageOption & option)147 int32_t SysEventServiceStub::HandleExportEvent(MessageParcel& data,
148 MessageParcel& reply, MessageOption& option)
149 {
150 std::unique_ptr<QueryArgument> queryArgument(data.ReadParcelable<QueryArgument>());
151 if (queryArgument == nullptr) {
152 HIVIEW_LOGE("parcel read export arguments failed.");
153 return ERR_FLATTEN_OBJECT;
154 }
155 std::vector<SysEventQueryRule> queryRules;
156 auto ret = ReadVectorFromParcel(data, queryRules);
157 if (!ret) {
158 HIVIEW_LOGE("parcel read export rules failed.");
159 return ERR_FLATTEN_OBJECT;
160 }
161 ret = reply.WriteInt64(Export(*queryArgument, queryRules));
162 if (!ret) {
163 HIVIEW_LOGE("parcel write return-value of ExportSysEvent failed.");
164 return ERR_FLATTEN_OBJECT;
165 }
166 return ERR_OK;
167 }
168
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)169 int32_t SysEventServiceStub::OnRemoteRequest(uint32_t code, MessageParcel& data,
170 MessageParcel& reply, MessageOption& option)
171 {
172 if (MemoryUtil::DisableThreadCache() != 0 || MemoryUtil::DisableDelayFree() != 0) {
173 HIVIEW_LOGW("Failed to optimize memory for current thread");
174 }
175 std::u16string descripter = SysEventServiceStub::GetDescriptor();
176 std::u16string remoteDescripter = data.ReadInterfaceToken();
177 if (descripter != remoteDescripter) {
178 HIVIEW_LOGE("read descriptor failed.");
179 return ERR_INVALID_VALUE;
180 }
181 switch (code) {
182 case static_cast<uint32_t>(SysEventServiceInterfaceCode::ADD_SYS_EVENT_LISTENER): {
183 return HandleAddSysEventListener(data, reply, option);
184 }
185 case static_cast<uint32_t>(SysEventServiceInterfaceCode::REMOVE_SYS_EVENT_LISTENER): {
186 return HandleRemoveSysEventListener(data, reply, option);
187 }
188 case static_cast<uint32_t>(SysEventServiceInterfaceCode::QUERY_SYS_EVENT): {
189 return HandleQueryEvent(data, reply, option);
190 }
191 case static_cast<uint32_t>(SysEventServiceInterfaceCode::SET_DEBUG_MODE): {
192 return HandleSetDebugMode(data, reply, option);
193 }
194 case static_cast<uint32_t>(SysEventServiceInterfaceCode::ADD_SYS_EVENT_SUBSCRIBER): {
195 return HandleAddSubscriber(data, reply, option);
196 }
197 case static_cast<uint32_t>(SysEventServiceInterfaceCode::REMOVE_SYS_EVENT_SUBSCRIBER): {
198 return HandleRemoveSubscriber(data, reply, option);
199 }
200 case static_cast<uint32_t>(SysEventServiceInterfaceCode::EXPORT_SYS_EVENT): {
201 return HandleExportEvent(data, reply, option);
202 }
203 default:
204 return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
205 }
206 }
207 } // namespace HiviewDFX
208 } // namespace OHOS
209