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