1 /*
2 * Copyright (c) 2021-2022 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 "hilog/log.h"
20 #include "parcelable_vector_rw.h"
21 #include "query_argument.h"
22
23 namespace OHOS {
24 namespace HiviewDFX {
25 static constexpr HiLogLabel LABEL = { LOG_CORE, 0xD002D08, "HiView-SysEventServiceStub" };
HandleAddSysEventListener(MessageParcel & data,MessageParcel & reply,MessageOption & option)26 int32_t SysEventServiceStub::HandleAddSysEventListener(MessageParcel& data,
27 MessageParcel& reply, MessageOption& option)
28 {
29 std::vector<SysEventRule> rules;
30 bool ret = ReadVectorFromParcel(data, rules);
31 if (!ret) {
32 HiLog::Error(LABEL, "parcel read rules failed.");
33 return ERR_FLATTEN_OBJECT;
34 }
35 sptr<IRemoteObject> remoteObject = data.ReadRemoteObject();
36 if (remoteObject == nullptr) {
37 return ERR_FLATTEN_OBJECT;
38 }
39 sptr<ISysEventCallback> callback = iface_cast<ISysEventCallback>(remoteObject);
40 ret = reply.WriteInt32(AddListener(rules, callback));
41 if (!ret) {
42 HiLog::Error(LABEL, "parcel write return-value of AddListener failed.");
43 return ERR_FLATTEN_OBJECT;
44 }
45 return ERR_OK;
46 }
47
HandleRemoveSysEventListener(MessageParcel & data,MessageParcel & reply,MessageOption & option)48 int32_t SysEventServiceStub::HandleRemoveSysEventListener(MessageParcel& data,
49 MessageParcel& reply, MessageOption& option)
50 {
51 sptr<IRemoteObject> remoteObject = data.ReadRemoteObject();
52 if (remoteObject == nullptr) {
53 return ERR_FLATTEN_OBJECT;
54 }
55 sptr<ISysEventCallback> callback = iface_cast<ISysEventCallback>(remoteObject);
56 if (callback == nullptr) {
57 HiLog::Error(LABEL, "parcel read callback failed.");
58 return ERR_FLATTEN_OBJECT;
59 }
60 bool ret = reply.WriteInt32(RemoveListener(callback));
61 if (!ret) {
62 HiLog::Error(LABEL, "parcel write return-value of RemoveListener failed.");
63 return ERR_FLATTEN_OBJECT;
64 }
65 return ERR_OK;
66 }
67
HandleQueryEvent(MessageParcel & data,MessageParcel & reply,MessageOption & option)68 int32_t SysEventServiceStub::HandleQueryEvent(MessageParcel& data,
69 MessageParcel& reply, MessageOption& option)
70 {
71 std::unique_ptr<QueryArgument> queryArgument(data.ReadParcelable<QueryArgument>());
72 if (queryArgument == nullptr) {
73 HiLog::Error(LABEL, "parcel read query arguments failed.");
74 return ERR_FLATTEN_OBJECT;
75 }
76 std::vector<SysEventQueryRule> queryRules;
77 auto ret = ReadVectorFromParcel(data, queryRules);
78 if (!ret) {
79 HiLog::Error(LABEL, "parcel read query rules failed.");
80 return ERR_FLATTEN_OBJECT;
81 }
82 sptr<IRemoteObject> remoteObject = data.ReadRemoteObject();
83 if (remoteObject == nullptr) {
84 HiLog::Error(LABEL, "parcel read query callback failed.");
85 return ERR_FLATTEN_OBJECT;
86 }
87 sptr<IQuerySysEventCallback> callback = iface_cast<IQuerySysEventCallback>(remoteObject);
88 ret = reply.WriteInt32(Query(*queryArgument, queryRules, callback));
89 if (!ret) {
90 HiLog::Error(LABEL, "parcel write return-value of QuerySysEvent failed.");
91 return ERR_FLATTEN_OBJECT;
92 }
93 return ERR_OK;
94 }
95
HandleSetDebugMode(MessageParcel & data,MessageParcel & reply,MessageOption & option)96 int32_t SysEventServiceStub::HandleSetDebugMode(MessageParcel& data,
97 MessageParcel& reply, MessageOption& option)
98 {
99 sptr<IRemoteObject> remoteObject = data.ReadRemoteObject();
100 if (remoteObject == nullptr) {
101 return ERR_FLATTEN_OBJECT;
102 }
103 sptr<ISysEventCallback> callback = iface_cast<ISysEventCallback>(remoteObject);
104 bool mode = false;
105 bool ret = data.ReadBool(mode);
106 if (!ret) {
107 HiLog::Error(LABEL, "parcel read mode failed.");
108 return ERR_FLATTEN_OBJECT;
109 }
110 ret = reply.WriteInt32(SetDebugMode(callback, mode));
111 if (!ret) {
112 HiLog::Error(LABEL, "parcel write return-value of SetDebugMode failed.");
113 return ERR_FLATTEN_OBJECT;
114 }
115 return ERR_OK;
116 }
117
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)118 int32_t SysEventServiceStub::OnRemoteRequest(uint32_t code, MessageParcel& data,
119 MessageParcel& reply, MessageOption& option)
120 {
121 std::u16string descripter = SysEventServiceStub::GetDescriptor();
122 std::u16string remoteDescripter = data.ReadInterfaceToken();
123 if (descripter != remoteDescripter) {
124 HiLog::Error(LABEL, "read descriptor failed.");
125 return ERR_INVALID_VALUE;
126 }
127 switch (code) {
128 case ADD_SYS_EVENT_LISTENER: {
129 return HandleAddSysEventListener(data, reply, option);
130 }
131 case REMOVE_SYS_EVENT_LISTENER: {
132 return HandleRemoveSysEventListener(data, reply, option);
133 }
134 case QUERY_SYS_EVENT: {
135 return HandleQueryEvent(data, reply, option);
136 }
137 case SET_DEBUG_MODE: {
138 return HandleSetDebugMode(data, reply, option);
139 }
140 default:
141 return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
142 }
143 }
144 } // namespace HiviewDFX
145 } // namespace OHOS
146