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