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