1 /*
2  * Copyright (c) 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 #define LOG_TAG "RdbResultSetStub"
17 
18 #include <ipc_skeleton.h>
19 #include "itypes_util.h"
20 #include "log_print.h"
21 #include "rdb_result_set_stub.h"
22 
23 namespace OHOS::DistributedRdb {
RdbResultSetStub(std::shared_ptr<NativeRdb::ResultSet> resultSet)24 RdbResultSetStub::RdbResultSetStub(std::shared_ptr<NativeRdb::ResultSet> resultSet) : resultSet_(std::move(resultSet))
25 {
26 }
27 
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)28 int RdbResultSetStub::OnRemoteRequest(uint32_t code, MessageParcel& data, MessageParcel& reply, MessageOption& option)
29 {
30     ZLOGD("code:%{public}u, callingPid:%{public}d", code, IPCSkeleton::GetCallingPid());
31     if (!CheckInterfaceToken(data) || resultSet_ == nullptr) {
32         return -1;
33     }
34     if (code >= 0 && code < Code::CMD_MAX) {
35         return (this->*HANDLERS[code])(data, reply);
36     }
37     return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
38 }
39 
CheckInterfaceToken(MessageParcel & data)40 bool RdbResultSetStub::CheckInterfaceToken(MessageParcel& data)
41 {
42     auto localDescriptor = RdbResultSetStub::GetDescriptor();
43     auto remoteDescriptor = data.ReadInterfaceToken();
44     if (remoteDescriptor != localDescriptor) {
45         ZLOGE("interface token is not equal");
46         return false;
47     }
48     return true;
49 }
50 
OnGetAllColumnNames(MessageParcel & data,MessageParcel & reply)51 int32_t RdbResultSetStub::OnGetAllColumnNames(MessageParcel &data, MessageParcel &reply)
52 {
53     std::vector<std::string> columnNames;
54     int status = resultSet_->GetAllColumnNames(columnNames);
55     if (!ITypesUtil::Marshal(reply, status, columnNames)) {
56         ZLOGE("Write status or columnNames failed, status:%{public}d, columnNames size:%{public}zu.", status,
57             columnNames.size());
58         return -1;
59     }
60     return 0;
61 }
62 
OnGetColumnCount(MessageParcel & data,MessageParcel & reply)63 int32_t RdbResultSetStub::OnGetColumnCount(MessageParcel &data, MessageParcel &reply)
64 {
65     int columnCount = 0;
66     int status = resultSet_->GetColumnCount(columnCount);
67     if (!ITypesUtil::Marshal(reply, status, columnCount)) {
68         ZLOGE("Write status or columnCount failed, status:%{public}d, columnCount:%{public}d.", status, columnCount);
69         return -1;
70     }
71     return 0;
72 }
73 
OnGetColumnType(MessageParcel & data,MessageParcel & reply)74 int32_t RdbResultSetStub::OnGetColumnType(MessageParcel &data, MessageParcel &reply)
75 {
76     int columnIndex;
77     ITypesUtil::Unmarshal(data, columnIndex);
78     NativeRdb::ColumnType columnType;
79     int status = resultSet_->GetColumnType(columnIndex, columnType);
80     if (!ITypesUtil::Marshal(reply, status, static_cast<int32_t>(columnType))) {
81         ZLOGE("Write status or columnType failed, status:%{public}d, columnIndex:%{public}d, columnType:%{public}d.",
82             status, columnIndex, static_cast<int32_t>(columnType));
83         return -1;
84     }
85     return 0;
86 }
87 
OnGetRowCount(MessageParcel & data,MessageParcel & reply)88 int32_t RdbResultSetStub::OnGetRowCount(MessageParcel &data, MessageParcel &reply)
89 {
90     int rowCount = 0;
91     int status = resultSet_->GetRowCount(rowCount);
92     if (!ITypesUtil::Marshal(reply, status, rowCount)) {
93         ZLOGE("Write status or rowCount failed, status:%{public}d, rowCount:%{public}d.", status, rowCount);
94         return -1;
95     }
96     return 0;
97 }
98 
OnGetRowIndex(MessageParcel & data,MessageParcel & reply)99 int32_t RdbResultSetStub::OnGetRowIndex(MessageParcel &data, MessageParcel &reply)
100 {
101     int rowIndex = 0;
102     int status = resultSet_->GetRowIndex(rowIndex);
103     if (!ITypesUtil::Marshal(reply, status, rowIndex)) {
104         ZLOGE("Write status or rowIndex failed, status:%{public}d, rowIndex:%{public}d.", status, rowIndex);
105         return -1;
106     }
107     return 0;
108 }
109 
OnGoTo(MessageParcel & data,MessageParcel & reply)110 int32_t RdbResultSetStub::OnGoTo(MessageParcel &data, MessageParcel &reply)
111 {
112     int offSet;
113     ITypesUtil::Unmarshal(data, offSet);
114     int status = resultSet_->GoTo(offSet);
115     if (!ITypesUtil::Marshal(reply, status)) {
116         ZLOGE("Write status failed, status:%{public}d, offSet:%{public}d.", status, offSet);
117         return -1;
118     }
119     return 0;
120 }
121 
OnGoToRow(MessageParcel & data,MessageParcel & reply)122 int32_t RdbResultSetStub::OnGoToRow(MessageParcel &data, MessageParcel &reply)
123 {
124     int position;
125     ITypesUtil::Unmarshal(data, position);
126     int status = resultSet_->GoToRow(position);
127     if (!ITypesUtil::Marshal(reply, status)) {
128         ZLOGE("Write status failed, status:%{public}d, position:%{public}d.", status, position);
129         return -1;
130     }
131     return 0;
132 }
133 
OnGoToFirstRow(MessageParcel & data,MessageParcel & reply)134 int32_t RdbResultSetStub::OnGoToFirstRow(MessageParcel &data, MessageParcel &reply)
135 {
136     int status = resultSet_->GoToFirstRow();
137     if (!ITypesUtil::Marshal(reply, status)) {
138         ZLOGE("Write status failed, status:%{public}d.", status);
139         return -1;
140     }
141     return 0;
142 }
143 
OnGoToLastRow(MessageParcel & data,MessageParcel & reply)144 int32_t RdbResultSetStub::OnGoToLastRow(MessageParcel &data, MessageParcel &reply)
145 {
146     int status = resultSet_->GoToLastRow();
147     if (!ITypesUtil::Marshal(reply, status)) {
148         ZLOGE("Write status failed, status:%{public}d.", status);
149         return -1;
150     }
151     return 0;
152 }
153 
OnGoToNextRow(MessageParcel & data,MessageParcel & reply)154 int32_t RdbResultSetStub::OnGoToNextRow(MessageParcel &data, MessageParcel &reply)
155 {
156     int status = resultSet_->GoToNextRow();
157     if (!ITypesUtil::Marshal(reply, status)) {
158         ZLOGE("Write status failed, status:%{public}d.", status);
159         return -1;
160     }
161     return 0;
162 }
163 
OnGoToPreviousRow(MessageParcel & data,MessageParcel & reply)164 int32_t RdbResultSetStub::OnGoToPreviousRow(MessageParcel &data, MessageParcel &reply)
165 {
166     int status = resultSet_->GoToPreviousRow();
167     if (!ITypesUtil::Marshal(reply, status)) {
168         ZLOGE("Write status failed, status:%{public}d.", status);
169         return -1;
170     }
171     return 0;
172 }
173 
OnIsEnded(MessageParcel & data,MessageParcel & reply)174 int32_t RdbResultSetStub::OnIsEnded(MessageParcel &data, MessageParcel &reply)
175 {
176     bool isEnded = false;
177     int status = resultSet_->IsEnded(isEnded);
178     if (!ITypesUtil::Marshal(reply, status, isEnded)) {
179         ZLOGE("Write status or isEnded failed, status:%{public}d, isEnded:%{public}d.", status, isEnded);
180         return -1;
181     }
182     return 0;
183 }
184 
OnIsStarted(MessageParcel & data,MessageParcel & reply)185 int32_t RdbResultSetStub::OnIsStarted(MessageParcel &data, MessageParcel &reply)
186 {
187     bool isStarted = false;
188     int status = resultSet_->IsStarted(isStarted);
189     if (!ITypesUtil::Marshal(reply, status, isStarted)) {
190         ZLOGE("Write status or isStarted failed, status:%{public}d, isStarted:%{public}d.", status, isStarted);
191         return -1;
192     }
193     return 0;
194 }
195 
OnIsAtFirstRow(MessageParcel & data,MessageParcel & reply)196 int32_t RdbResultSetStub::OnIsAtFirstRow(MessageParcel &data, MessageParcel &reply)
197 {
198     bool isAtFirstRow = false;
199     int status = resultSet_->IsAtFirstRow(isAtFirstRow);
200     if (!ITypesUtil::Marshal(reply, status, isAtFirstRow)) {
201         ZLOGE("Write status or isAtFirstRow failed, status:%{public}d, isAtFirstRow:%{public}d", status, isAtFirstRow);
202         return -1;
203     }
204     return 0;
205 }
206 
OnIsAtLastRow(MessageParcel & data,MessageParcel & reply)207 int32_t RdbResultSetStub::OnIsAtLastRow(MessageParcel &data, MessageParcel &reply)
208 {
209     bool isAtLastRow = false;
210     int status = resultSet_->IsAtLastRow(isAtLastRow);
211     if (!ITypesUtil::Marshal(reply, status, isAtLastRow)) {
212         ZLOGE("Write status or isAtLastRow failed, status:%{public}d, isAtLastRow:%{public}d.", status, isAtLastRow);
213         return -1;
214     }
215     return 0;
216 }
217 
OnGet(MessageParcel & data,MessageParcel & reply)218 int32_t RdbResultSetStub::OnGet(MessageParcel &data, MessageParcel &reply)
219 {
220     int columnIndex;
221     ITypesUtil::Unmarshal(data, columnIndex);
222     NativeRdb::ValueObject value;
223     int status = resultSet_->Get(columnIndex, value);
224     if (!ITypesUtil::Marshal(reply, status, value)) {
225         ZLOGE("status:%{public}d, columnIndex:%{public}d", status, columnIndex);
226         return -1;
227     }
228     return 0;
229 }
230 
OnGetSize(MessageParcel & data,MessageParcel & reply)231 int32_t RdbResultSetStub::OnGetSize(MessageParcel &data, MessageParcel &reply)
232 {
233     int col;
234     ITypesUtil::Unmarshal(data, col);
235     size_t value = 0;
236     int status = resultSet_->GetSize(col, value);
237     if (!ITypesUtil::Marshal(reply, status, value)) {
238         ZLOGE("failed, status:%{public}d, col:%{public}d, size:%{public}zu", status, col, value);
239         return -1;
240     }
241     return 0;
242 }
243 
OnClose(MessageParcel & data,MessageParcel & reply)244 int32_t RdbResultSetStub::OnClose(MessageParcel &data, MessageParcel &reply)
245 {
246     int status = resultSet_->Close();
247     if (!ITypesUtil::Marshal(reply, status)) {
248         ZLOGE("Write status failed, status:%{public}d.", status);
249         return -1;
250     }
251     return 0;
252 }
253 } // namespace OHOS::DistributedRdb