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 #include "datashare_stub.h"
17
18 #include "data_ability_observer_interface.h"
19 #include "datashare_log.h"
20 #include "ipc_types.h"
21 #include "ishared_result_set.h"
22 #include "itypes_utils.h"
23 #include "unistd.h"
24
25 namespace OHOS {
26 namespace DataShare {
27 constexpr int DEFAULT_NUMBER = -1;
28 constexpr int PERMISSION_ERROR_NUMBER = -2;
DataShareStub()29 DataShareStub::DataShareStub()
30 {
31 stubFuncMap_[CMD_GET_FILE_TYPES] = &DataShareStub::CmdGetFileTypes;
32 stubFuncMap_[CMD_OPEN_FILE] = &DataShareStub::CmdOpenFile;
33 stubFuncMap_[CMD_OPEN_RAW_FILE] = &DataShareStub::CmdOpenRawFile;
34 stubFuncMap_[CMD_INSERT] = &DataShareStub::CmdInsert;
35 stubFuncMap_[CMD_UPDATE] = &DataShareStub::CmdUpdate;
36 stubFuncMap_[CMD_DELETE] = &DataShareStub::CmdDelete;
37 stubFuncMap_[CMD_QUERY] = &DataShareStub::CmdQuery;
38 stubFuncMap_[CMD_GET_TYPE] = &DataShareStub::CmdGetType;
39 stubFuncMap_[CMD_BATCH_INSERT] = &DataShareStub::CmdBatchInsert;
40 stubFuncMap_[CMD_REGISTER_OBSERVER] = &DataShareStub::CmdRegisterObserver;
41 stubFuncMap_[CMD_UNREGISTER_OBSERVER] = &DataShareStub::CmdUnregisterObserver;
42 stubFuncMap_[CMD_NOTIFY_CHANGE] = &DataShareStub::CmdNotifyChange;
43 stubFuncMap_[CMD_NORMALIZE_URI] = &DataShareStub::CmdNormalizeUri;
44 stubFuncMap_[CMD_DENORMALIZE_URI] = &DataShareStub::CmdDenormalizeUri;
45 }
46
~DataShareStub()47 DataShareStub::~DataShareStub()
48 {
49 stubFuncMap_.clear();
50 }
51
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)52 int DataShareStub::OnRemoteRequest(uint32_t code, MessageParcel& data, MessageParcel& reply,
53 MessageOption& option)
54 {
55 std::u16string descriptor = DataShareStub::GetDescriptor();
56 std::u16string remoteDescriptor = data.ReadInterfaceToken();
57 if (descriptor != remoteDescriptor) {
58 LOG_INFO("local descriptor is not equal to remote");
59 return ERR_INVALID_STATE;
60 }
61
62 const auto &itFunc = stubFuncMap_.find(code);
63 if (itFunc != stubFuncMap_.end()) {
64 return (this->*(itFunc->second))(data, reply);
65 }
66
67 LOG_INFO("remote request unhandled: %{public}d", code);
68 return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
69 }
70
ReadUri(std::shared_ptr<Uri> & uri,MessageParcel & data)71 bool ReadUri(std::shared_ptr<Uri> &uri, MessageParcel &data)
72 {
73 uri = std::shared_ptr<Uri>(data.ReadParcelable<Uri>());
74 if (uri == nullptr) {
75 LOG_ERROR("uri is nullptr");
76 return false;
77 }
78 return true;
79 }
80
CmdGetFileTypes(MessageParcel & data,MessageParcel & reply)81 ErrCode DataShareStub::CmdGetFileTypes(MessageParcel &data, MessageParcel &reply)
82 {
83 std::shared_ptr<Uri> uri = nullptr;
84 if (!ReadUri(uri, data)) {
85 return ERR_INVALID_VALUE;
86 }
87 std::string mimeTypeFilter = data.ReadString();
88 if (mimeTypeFilter.empty()) {
89 LOG_ERROR("mimeTypeFilter is nullptr");
90 return ERR_INVALID_VALUE;
91 }
92 std::vector<std::string> types = GetFileTypes(*uri, mimeTypeFilter);
93 if (!reply.WriteStringVector(types)) {
94 LOG_ERROR("fail to WriteStringVector types");
95 return ERR_INVALID_VALUE;
96 }
97 return DATA_SHARE_NO_ERROR;
98 }
99
CmdOpenFile(MessageParcel & data,MessageParcel & reply)100 ErrCode DataShareStub::CmdOpenFile(MessageParcel &data, MessageParcel &reply)
101 {
102 std::shared_ptr<Uri> uri = nullptr;
103 if (!ReadUri(uri, data)) {
104 return ERR_INVALID_VALUE;
105 }
106 std::string mode = data.ReadString();
107 if (mode.empty()) {
108 LOG_ERROR("mode is nullptr");
109 return ERR_INVALID_VALUE;
110 }
111 int fd = OpenFile(*uri, mode);
112 if (fd < 0) {
113 LOG_ERROR("OpenFile fail, fd is %{pubilc}d", fd);
114 return ERR_INVALID_VALUE;
115 }
116 if (!reply.WriteFileDescriptor(fd)) {
117 LOG_ERROR("fail to WriteFileDescriptor fd");
118 close(fd);
119 return ERR_INVALID_VALUE;
120 }
121 close(fd);
122 return DATA_SHARE_NO_ERROR;
123 }
124
CmdOpenRawFile(MessageParcel & data,MessageParcel & reply)125 ErrCode DataShareStub::CmdOpenRawFile(MessageParcel &data, MessageParcel &reply)
126 {
127 std::shared_ptr<Uri> uri = nullptr;
128 if (!ReadUri(uri, data)) {
129 return ERR_INVALID_VALUE;
130 }
131 std::string mode = data.ReadString();
132 if (mode.empty()) {
133 LOG_ERROR("mode is nullptr");
134 return ERR_INVALID_VALUE;
135 }
136 int fd = OpenRawFile(*uri, mode);
137 if (!reply.WriteInt32(fd)) {
138 LOG_ERROR("fail to WriteInt32 fd");
139 return ERR_INVALID_VALUE;
140 }
141 return DATA_SHARE_NO_ERROR;
142 }
143
CmdInsert(MessageParcel & data,MessageParcel & reply)144 ErrCode DataShareStub::CmdInsert(MessageParcel &data, MessageParcel &reply)
145 {
146 std::shared_ptr<Uri> uri(data.ReadParcelable<Uri>());
147 if (uri == nullptr) {
148 LOG_ERROR("DataShareStub uri is nullptr");
149 return ERR_INVALID_VALUE;
150 }
151 DataShareValuesBucket value;
152 if (!ITypesUtils::Unmarshalling(data, value)) {
153 LOG_ERROR("Unmarshalling value is nullptr");
154 return ERR_INVALID_VALUE;
155 }
156 int index = Insert(*uri, value);
157 if (index == DEFAULT_NUMBER) {
158 LOG_ERROR("Insert inner error");
159 return ERR_INVALID_VALUE;
160 } else if (index == PERMISSION_ERROR_NUMBER) {
161 LOG_ERROR("Insert permission error");
162 return ERR_PERMISSION_DENIED;
163 }
164 if (!reply.WriteInt32(index)) {
165 LOG_ERROR("fail to WriteInt32 index");
166 return ERR_INVALID_VALUE;
167 }
168 LOG_INFO("DataShareStub::CmdInsertInner end");
169 return DATA_SHARE_NO_ERROR;
170 }
171
CmdUpdate(MessageParcel & data,MessageParcel & reply)172 ErrCode DataShareStub::CmdUpdate(MessageParcel &data, MessageParcel &reply)
173 {
174 std::shared_ptr<Uri> uri = nullptr;
175 if (!ReadUri(uri, data)) {
176 return ERR_INVALID_VALUE;
177 }
178 DataSharePredicates predicates;
179 if (!ITypesUtils::Unmarshalling(data, predicates)) {
180 LOG_ERROR("Unmarshalling predicates is nullptr");
181 return ERR_INVALID_VALUE;
182 }
183 DataShareValuesBucket value;
184 if (!ITypesUtils::Unmarshalling(data, value)) {
185 LOG_ERROR("Unmarshalling value is nullptr");
186 return ERR_INVALID_VALUE;
187 }
188 int index = Update(*uri, predicates, value);
189 if (index == DEFAULT_NUMBER) {
190 LOG_ERROR("Update inner error");
191 return ERR_INVALID_VALUE;
192 } else if (index == PERMISSION_ERROR_NUMBER) {
193 LOG_ERROR("Update permission error");
194 return ERR_PERMISSION_DENIED;
195 }
196 if (!reply.WriteInt32(index)) {
197 LOG_ERROR("fail to WriteInt32 index");
198 return ERR_INVALID_VALUE;
199 }
200 return DATA_SHARE_NO_ERROR;
201 }
202
CmdDelete(MessageParcel & data,MessageParcel & reply)203 ErrCode DataShareStub::CmdDelete(MessageParcel &data, MessageParcel &reply)
204 {
205 std::shared_ptr<Uri> uri = nullptr;
206 if (!ReadUri(uri, data)) {
207 return ERR_INVALID_VALUE;
208 }
209 DataSharePredicates predicates;
210 if (!ITypesUtils::Unmarshalling(data, predicates)) {
211 LOG_ERROR("Unmarshalling predicates is nullptr");
212 return ERR_INVALID_VALUE;
213 }
214 int index = Delete(*uri, predicates);
215 if (index == DEFAULT_NUMBER) {
216 LOG_ERROR("Delete inner error");
217 return ERR_INVALID_VALUE;
218 } else if (index == PERMISSION_ERROR_NUMBER) {
219 LOG_ERROR("Delete permission error");
220 return ERR_PERMISSION_DENIED;
221 }
222 if (!reply.WriteInt32(index)) {
223 LOG_ERROR("fail to WriteInt32 index");
224 return ERR_INVALID_VALUE;
225 }
226 return DATA_SHARE_NO_ERROR;
227 }
228
CmdQuery(MessageParcel & data,MessageParcel & reply)229 ErrCode DataShareStub::CmdQuery(MessageParcel &data, MessageParcel &reply)
230 {
231 std::shared_ptr<Uri> uri = nullptr;
232 if (!ReadUri(uri, data)) {
233 return ERR_INVALID_VALUE;
234 }
235 DataSharePredicates predicates;
236 if (!ITypesUtils::Unmarshalling(data, predicates)) {
237 LOG_ERROR("Unmarshalling predicates is nullptr");
238 return ERR_INVALID_VALUE;
239 }
240 std::vector<std::string> columns;
241 if (!data.ReadStringVector(&columns)) {
242 LOG_ERROR("fail to ReadStringVector columns");
243 return ERR_INVALID_VALUE;
244 }
245 auto resultSet = Query(*uri, predicates, columns);
246 if (resultSet == nullptr) {
247 LOG_ERROR("fail to WriteParcelable resultSet");
248 return ERR_INVALID_VALUE;
249 }
250 auto result = ISharedResultSet::WriteToParcel(std::move(resultSet), reply);
251 if (result == nullptr) {
252 LOG_ERROR("!resultSet->Marshalling(reply)");
253 return ERR_INVALID_VALUE;
254 }
255 return DATA_SHARE_NO_ERROR;
256 }
257
CmdGetType(MessageParcel & data,MessageParcel & reply)258 ErrCode DataShareStub::CmdGetType(MessageParcel &data, MessageParcel &reply)
259 {
260 std::shared_ptr<Uri> uri = nullptr;
261 if (!ReadUri(uri, data)) {
262 return ERR_INVALID_VALUE;
263 }
264 std::string type = GetType(*uri);
265 if (!reply.WriteString(type)) {
266 LOG_ERROR("fail to WriteString type");
267 return ERR_INVALID_VALUE;
268 }
269 return DATA_SHARE_NO_ERROR;
270 }
271
CmdBatchInsert(MessageParcel & data,MessageParcel & reply)272 ErrCode DataShareStub::CmdBatchInsert(MessageParcel &data, MessageParcel &reply)
273 {
274 std::shared_ptr<Uri> uri = nullptr;
275 if (!ReadUri(uri, data)) {
276 return ERR_INVALID_VALUE;
277 }
278
279 int count = 0;
280 if (!data.ReadInt32(count)) {
281 LOG_ERROR("fail to ReadInt32 index");
282 return ERR_INVALID_VALUE;
283 }
284 if (count > VALUEBUCKET_MAX_COUNT) {
285 return ERR_INVALID_VALUE;
286 }
287
288 std::vector<DataShareValuesBucket> values;
289 values.reserve(static_cast<int32_t>(count));
290 for (int i = 0; i < count; i++) {
291 DataShareValuesBucket value;
292 if (!ITypesUtils::Unmarshalling(data, value)) {
293 LOG_ERROR("Unmarshalling value is nullptr");
294 return ERR_INVALID_VALUE;
295 }
296 values.emplace_back(value);
297 }
298
299 int ret = BatchInsert(*uri, values);
300 if (ret == DEFAULT_NUMBER) {
301 LOG_ERROR("BatchInsert inner error");
302 return ERR_INVALID_VALUE;
303 } else if (ret == PERMISSION_ERROR_NUMBER) {
304 LOG_ERROR("BatchInsert permission error");
305 return ERR_PERMISSION_DENIED;
306 }
307 if (!reply.WriteInt32(ret)) {
308 LOG_ERROR("fail to WriteInt32 ret");
309 return ERR_INVALID_VALUE;
310 }
311 return DATA_SHARE_NO_ERROR;
312 }
313
314
CmdRegisterObserver(MessageParcel & data,MessageParcel & reply)315 ErrCode DataShareStub::CmdRegisterObserver(MessageParcel &data, MessageParcel &reply)
316 {
317 std::shared_ptr<Uri> uri = nullptr;
318 if (!ReadUri(uri, data)) {
319 return ERR_INVALID_VALUE;
320 }
321 auto obServer = iface_cast<AAFwk::IDataAbilityObserver>(data.ReadRemoteObject());
322 if (obServer == nullptr) {
323 LOG_ERROR("obServer is nullptr");
324 return ERR_INVALID_VALUE;
325 }
326
327 bool ret = RegisterObserver(*uri, obServer);
328 if (!reply.WriteInt32(ret)) {
329 LOG_ERROR("fail to WriteInt32 ret");
330 return ERR_INVALID_VALUE;
331 }
332 return DATA_SHARE_NO_ERROR;
333 }
334
CmdUnregisterObserver(MessageParcel & data,MessageParcel & reply)335 ErrCode DataShareStub::CmdUnregisterObserver(MessageParcel &data, MessageParcel &reply)
336 {
337 std::shared_ptr<Uri> uri = nullptr;
338 if (!ReadUri(uri, data)) {
339 return ERR_INVALID_VALUE;
340 }
341 auto obServer = iface_cast<AAFwk::IDataAbilityObserver>(data.ReadRemoteObject());
342 if (obServer == nullptr) {
343 LOG_ERROR("obServer is nullptr");
344 return ERR_INVALID_VALUE;
345 }
346
347 bool ret = UnregisterObserver(*uri, obServer);
348 if (!reply.WriteInt32(ret)) {
349 LOG_ERROR("fail to WriteInt32 ret");
350 return ERR_INVALID_VALUE;
351 }
352 return DATA_SHARE_NO_ERROR;
353 }
354
CmdNotifyChange(MessageParcel & data,MessageParcel & reply)355 ErrCode DataShareStub::CmdNotifyChange(MessageParcel &data, MessageParcel &reply)
356 {
357 std::shared_ptr<Uri> uri = nullptr;
358 if (!ReadUri(uri, data)) {
359 return ERR_INVALID_VALUE;
360 }
361
362 bool ret = NotifyChange(*uri);
363 if (!reply.WriteInt32(ret)) {
364 LOG_ERROR("fail to WriteInt32 ret");
365 return ERR_INVALID_VALUE;
366 }
367 return DATA_SHARE_NO_ERROR;
368 }
369
CmdNormalizeUri(MessageParcel & data,MessageParcel & reply)370 ErrCode DataShareStub::CmdNormalizeUri(MessageParcel &data, MessageParcel &reply)
371 {
372 std::shared_ptr<Uri> uri = nullptr;
373 if (!ReadUri(uri, data)) {
374 return ERR_INVALID_VALUE;
375 }
376
377 Uri ret("");
378 ret = NormalizeUri(*uri);
379 if (!reply.WriteParcelable(&ret)) {
380 LOG_ERROR("fail to WriteParcelable type");
381 return ERR_INVALID_VALUE;
382 }
383 return DATA_SHARE_NO_ERROR;
384 }
385
CmdDenormalizeUri(MessageParcel & data,MessageParcel & reply)386 ErrCode DataShareStub::CmdDenormalizeUri(MessageParcel &data, MessageParcel &reply)
387 {
388 std::shared_ptr<Uri> uri = nullptr;
389 if (!ReadUri(uri, data)) {
390 return ERR_INVALID_VALUE;
391 }
392
393 Uri ret("");
394 ret = DenormalizeUri(*uri);
395 if (!reply.WriteParcelable(&ret)) {
396 LOG_ERROR("fail to WriteParcelable type");
397 return ERR_INVALID_VALUE;
398 }
399 return DATA_SHARE_NO_ERROR;
400 }
401 } // namespace DataShare
402 } // namespace OHOS