1 /*
2 * Copyright (C) 2023 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 "pasteboard_service_stub.h"
17
18 #include "copy_uri_handler.h"
19 #include "errors.h"
20 #include "hiview_adapter.h"
21 #include "paste_data.h"
22 #include "paste_uri_handler.h"
23 #include "pasteboard_error.h"
24 #include "pasteboard_hilog.h"
25 #include "pasteboard_observer_proxy.h"
26 #include "pasteboard_serv_ipc_interface_code.h"
27
28 using namespace OHOS::Security::PasteboardServ;
29 namespace OHOS {
30 namespace MiscServices {
PasteboardServiceStub()31 PasteboardServiceStub::PasteboardServiceStub()
32 {
33 memberFuncMap_[static_cast<uint32_t>(PasteboardServiceInterfaceCode::GET_PASTE_DATA)] =
34 &PasteboardServiceStub::OnGetPasteData;
35 memberFuncMap_[static_cast<uint32_t>(PasteboardServiceInterfaceCode::HAS_PASTE_DATA)] =
36 &PasteboardServiceStub::OnHasPasteData;
37 memberFuncMap_[static_cast<uint32_t>(PasteboardServiceInterfaceCode::SET_PASTE_DATA)] =
38 &PasteboardServiceStub::OnSetPasteData;
39 memberFuncMap_[static_cast<uint32_t>(PasteboardServiceInterfaceCode::CLEAR_ALL)] = &PasteboardServiceStub::OnClear;
40 memberFuncMap_[static_cast<uint32_t>(PasteboardServiceInterfaceCode::SUBSCRIBE_OBSERVER)] =
41 &PasteboardServiceStub::OnSubscribeObserver;
42 memberFuncMap_[static_cast<uint32_t>(PasteboardServiceInterfaceCode::UNSUBSCRIBE_OBSERVER)] =
43 &PasteboardServiceStub::OnUnsubscribeObserver;
44 memberFuncMap_[static_cast<uint32_t>(PasteboardServiceInterfaceCode::UNSUBSCRIBE_ALL_OBSERVER)] =
45 &PasteboardServiceStub::OnUnsubscribeAllObserver;
46 memberFuncMap_[static_cast<uint32_t>(PasteboardServiceInterfaceCode::IS_REMOTE_DATA)] =
47 &PasteboardServiceStub::OnIsRemoteData;
48 memberFuncMap_[static_cast<uint32_t>(PasteboardServiceInterfaceCode::GET_DATA_SOURCE)] =
49 &PasteboardServiceStub::OnGetDataSource;
50 memberFuncMap_[static_cast<uint32_t>(PasteboardServiceInterfaceCode::HAS_DATA_TYPE)] =
51 &PasteboardServiceStub::OnHasDataType;
52 memberFuncMap_[static_cast<uint32_t>(PasteboardServiceInterfaceCode::DETECT_PATTERNS)] =
53 &PasteboardServiceStub::OnDetectPatterns;
54 memberFuncMap_[static_cast<uint32_t>(PasteboardServiceInterfaceCode::SET_GLOBAL_SHARE_OPTION)] =
55 &PasteboardServiceStub::OnSetGlobalShareOption;
56 memberFuncMap_[static_cast<uint32_t>(PasteboardServiceInterfaceCode::REMOVE_GLOBAL_SHARE_OPTION)] =
57 &PasteboardServiceStub::OnRemoveGlobalShareOption;
58 memberFuncMap_[static_cast<uint32_t>(PasteboardServiceInterfaceCode::GET_GLOBAL_SHARE_OPTION)] =
59 &PasteboardServiceStub::OnGetGlobalShareOption;
60 memberFuncMap_[static_cast<uint32_t>(PasteboardServiceInterfaceCode::SET_APP_SHARE_OPTIONS)] =
61 &PasteboardServiceStub::OnSetAppShareOptions;
62 memberFuncMap_[static_cast<uint32_t>(PasteboardServiceInterfaceCode::REMOVE_APP_SHARE_OPTIONS)] =
63 &PasteboardServiceStub::OnRemoveAppShareOptions;
64 memberFuncMap_[static_cast<uint32_t>(PasteboardServiceInterfaceCode::PASTE_START)] =
65 &PasteboardServiceStub::OnPasteStart;
66 memberFuncMap_[static_cast<uint32_t>(PasteboardServiceInterfaceCode::PASTE_COMPLETE)] =
67 &PasteboardServiceStub::OnPasteComplete;
68 memberFuncMap_[static_cast<uint32_t>(PasteboardServiceInterfaceCode::REGISTER_CLIENT_DEATH_OBSERVER)] =
69 &PasteboardServiceStub::OnRegisterClientDeathObserver;
70 memberFuncMap_[static_cast<uint32_t>(PasteboardServiceInterfaceCode::GET_RECORD_VALUE)] =
71 &PasteboardServiceStub::OnGetRecordValueByType;
72 memberFuncMap_[static_cast<uint32_t>(PasteboardServiceInterfaceCode::GET_MIME_TYPES)] =
73 &PasteboardServiceStub::OnGetMimeTypes;
74 }
75
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)76 int32_t PasteboardServiceStub::OnRemoteRequest(
77 uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
78 {
79 std::u16string myDescripter = PasteboardServiceStub::GetDescriptor();
80 std::u16string remoteDescripter = data.ReadInterfaceToken();
81 if (myDescripter != remoteDescripter) {
82 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "end##descriptor checked fail");
83 return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
84 }
85 pid_t p = IPCSkeleton::GetCallingPid();
86 pid_t p1 = IPCSkeleton::GetCallingUid();
87 if (code != static_cast<uint32_t>(PasteboardServiceInterfaceCode::HAS_PASTE_DATA)) {
88 PASTEBOARD_HILOGI(
89 PASTEBOARD_MODULE_SERVICE, "pid:%{public}d, uid:%{public}d, cmd:%{public}u", p, p1, code);
90 }
91 auto itFunc = memberFuncMap_.find(code);
92 if (itFunc != memberFuncMap_.end()) {
93 auto memberFunc = itFunc->second;
94 if (memberFunc != nullptr) {
95 return (this->*memberFunc)(data, reply);
96 }
97 }
98 int ret = IPCObjectStub::OnRemoteRequest(code, data, reply, option);
99 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_SERVICE, "end##ret = %{public}d", ret);
100 return ret;
101 }
OnClear(MessageParcel & data,MessageParcel & reply)102 int32_t PasteboardServiceStub::OnClear(MessageParcel &data, MessageParcel &reply)
103 {
104 Clear();
105 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_SERVICE, "end.");
106 return ERR_OK;
107 }
108
OnGetRecordValueByType(MessageParcel & data,MessageParcel & reply)109 int32_t PasteboardServiceStub::OnGetRecordValueByType(MessageParcel &data, MessageParcel &reply)
110 {
111 uint32_t dataId = data.ReadUint32();
112 uint32_t recordId = data.ReadUint32();
113 PasteDataEntry entryValue;
114 int32_t rawDataSize = data.ReadInt32();
115 if (rawDataSize <= 0) {
116 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "fail to get raw data size");
117 return ERR_INVALID_VALUE;
118 }
119 const uint8_t *rawData = reinterpret_cast<const uint8_t *>(data.ReadRawData(rawDataSize));
120 if (rawData == nullptr) {
121 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "fail to get raw data");
122 return ERR_INVALID_VALUE;
123 }
124 std::vector<uint8_t> receiveTlv(rawData, rawData + rawDataSize);
125 bool ret = entryValue.Unmarshalling(receiveTlv);
126 if (!ret) {
127 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "fail to decode paste data entry");
128 return ERR_INVALID_VALUE;
129 }
130 auto result = GetRecordValueByType(dataId, recordId, entryValue);
131 if (!reply.WriteInt32(result)) {
132 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Failed to write result:%{public}d", result);
133 return ERR_INVALID_VALUE;
134 }
135 std::vector<uint8_t> entryValueTLV(0);
136 ret = entryValue.Marshalling(entryValueTLV);
137 if (!ret) {
138 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "fail encode entry value");
139 return ERR_INVALID_VALUE;
140 }
141 if (!reply.WriteInt32(entryValueTLV.size())) {
142 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "fail write data size");
143 return ERR_INVALID_VALUE;
144 }
145 if (!reply.WriteRawData(entryValueTLV.data(), entryValueTLV.size())) {
146 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "fail write raw data");
147 return ERR_INVALID_VALUE;
148 }
149 return ERR_OK;
150 }
151
OnGetPasteData(MessageParcel & data,MessageParcel & reply)152 int32_t PasteboardServiceStub::OnGetPasteData(MessageParcel &data, MessageParcel &reply)
153 {
154 std::string pasteId = data.ReadString();
155 PasteData pasteData{};
156 pasteData.SetPasteId(pasteId);
157 int32_t syncTime = 0;
158 auto result = GetPasteData(pasteData, syncTime);
159 HiViewAdapter::ReportUseBehaviour(pasteData, HiViewAdapter::PASTE_STATE, result);
160 std::vector<uint8_t> pasteDataTlv(0);
161 bool ret = pasteData.Encode(pasteDataTlv);
162 if (!ret) {
163 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Failed to encode pastedata in TLV");
164 return ERR_INVALID_VALUE;
165 }
166 if (!reply.WriteInt32(pasteDataTlv.size())) {
167 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Failed to write raw size");
168 return ERR_INVALID_VALUE;
169 }
170 if (!reply.WriteRawData(pasteDataTlv.data(), pasteDataTlv.size())) {
171 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Failed to write raw data");
172 return ERR_INVALID_VALUE;
173 }
174 PasteUriHandler pasteUriHandler;
175 if (!pasteData.WriteUriFd(reply, pasteUriHandler, false)) {
176 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Failed to write uri fd");
177 return ERR_INVALID_VALUE;
178 }
179 if (!reply.WriteInt32(syncTime)) {
180 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Failed to GetPasteData syncTime");
181 return ERR_INVALID_VALUE;
182 }
183 if (!reply.WriteInt32(result)) {
184 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Failed to GetPasteData result");
185 return ERR_INVALID_VALUE;
186 }
187 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_SERVICE, " end.");
188 return ERR_OK;
189 }
OnHasPasteData(MessageParcel & data,MessageParcel & reply)190 int32_t PasteboardServiceStub::OnHasPasteData(MessageParcel &data, MessageParcel &reply)
191 {
192 auto result = HasPasteData();
193 reply.WriteBool(result);
194 return ERR_OK;
195 }
196
UnmarshalPasteData(MessageParcel & data,MessageParcel & reply)197 std::shared_ptr<PasteData> PasteboardServiceStub::UnmarshalPasteData(MessageParcel &data, MessageParcel &reply)
198 {
199 int32_t rawDataSize = data.ReadInt32();
200 if (rawDataSize <= 0) {
201 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Failed to read raw size");
202 return nullptr;
203 }
204 auto *rawData = (uint8_t *)data.ReadRawData(rawDataSize);
205 if (rawData == nullptr) {
206 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Failed to get raw data");
207 return nullptr;
208 }
209 std::vector<uint8_t> pasteDataTlv(rawData, rawData + rawDataSize);
210 auto pasteData = std::make_shared<PasteData>();
211 bool ret = pasteData->Decode(pasteDataTlv);
212 if (!ret) {
213 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Failed to decode pastedata in TLV");
214 return nullptr;
215 }
216 return pasteData;
217 }
218
OnSetPasteData(MessageParcel & data,MessageParcel & reply)219 int32_t PasteboardServiceStub::OnSetPasteData(MessageParcel &data, MessageParcel &reply)
220 {
221 auto pasteData = UnmarshalPasteData(data, reply);
222 if (pasteData == nullptr) {
223 return ERR_INVALID_VALUE;
224 }
225 CopyUriHandler copyUriHandler;
226 if (!pasteData->ReadUriFd(data, copyUriHandler)) {
227 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Failed to read uri fd");
228 return ERR_INVALID_VALUE;
229 }
230 sptr<IPasteboardDelayGetter> delayGetter = nullptr;
231 if (pasteData->IsDelayData()) {
232 sptr<IRemoteObject> obj = data.ReadRemoteObject();
233 if (obj == nullptr) {
234 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "delay getter is nullptr");
235 return ERR_INVALID_VALUE;
236 }
237 delayGetter = iface_cast<IPasteboardDelayGetter>(obj);
238 if (delayGetter == nullptr) {
239 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "delay getter is nullptr");
240 return ERR_INVALID_VALUE;
241 }
242 }
243 sptr<IPasteboardEntryGetter> entryGetter = nullptr;
244 if (pasteData->IsDelayRecord()) {
245 sptr<IRemoteObject> obj = data.ReadRemoteObject();
246 if (obj == nullptr) {
247 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "entry getter is nullptr");
248 return ERR_INVALID_VALUE;
249 }
250 entryGetter = iface_cast<IPasteboardEntryGetter>(obj);
251 if (entryGetter == nullptr) {
252 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "entry getter is nullptr");
253 return ERR_INVALID_VALUE;
254 }
255 }
256 auto result = SavePasteData(pasteData, delayGetter, entryGetter);
257 HiViewAdapter::ReportUseBehaviour(*pasteData, HiViewAdapter::COPY_STATE, result);
258 if (!reply.WriteInt32(result)) {
259 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Failed to write SetPasteData result");
260 return ERR_INVALID_VALUE;
261 }
262 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_SERVICE, " end, ret is %{public}d.", result);
263 return ERR_OK;
264 }
265
OnSubscribeObserver(MessageParcel & data,MessageParcel & reply)266 int32_t PasteboardServiceStub::OnSubscribeObserver(MessageParcel &data, MessageParcel &reply)
267 {
268 uint32_t type = 0;
269 sptr<IPasteboardChangedObserver> callback;
270 if (!IsObserverValid(data, type, callback)) {
271 return ERR_INVALID_VALUE;
272 }
273
274 SubscribeObserver(static_cast<PasteboardObserverType>(type), callback);
275 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_SERVICE, "end.");
276 return ERR_OK;
277 }
OnUnsubscribeObserver(MessageParcel & data,MessageParcel & reply)278 int32_t PasteboardServiceStub::OnUnsubscribeObserver(MessageParcel &data, MessageParcel &reply)
279 {
280 uint32_t type = 0;
281 sptr<IPasteboardChangedObserver> callback;
282 if (!IsObserverValid(data, type, callback)) {
283 return ERR_INVALID_VALUE;
284 }
285 UnsubscribeObserver(static_cast<PasteboardObserverType>(type), callback);
286 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_SERVICE, "end.");
287 return ERR_OK;
288 }
289
OnUnsubscribeAllObserver(MessageParcel & data,MessageParcel & reply)290 int32_t PasteboardServiceStub::OnUnsubscribeAllObserver(MessageParcel &data, MessageParcel &reply)
291 {
292 uint32_t type = 0;
293 if (!data.ReadUint32(type)) {
294 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Read type failed.");
295 return ERR_INVALID_VALUE;
296 }
297 UnsubscribeAllObserver(static_cast<PasteboardObserverType>(type));
298 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_SERVICE, "end.");
299 return ERR_OK;
300 }
301
IsObserverValid(MessageParcel & data,uint32_t & type,sptr<IPasteboardChangedObserver> & callback)302 bool PasteboardServiceStub::IsObserverValid(MessageParcel &data, uint32_t &type,
303 sptr<IPasteboardChangedObserver> &callback)
304 {
305 if (!data.ReadUint32(type)) {
306 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Read type failed.");
307 return false;
308 }
309 sptr<IRemoteObject> obj = data.ReadRemoteObject();
310 if (obj == nullptr) {
311 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_SERVICE, "obj nullptr");
312 return false;
313 }
314 callback = iface_cast<IPasteboardChangedObserver>(obj);
315 if (callback == nullptr) {
316 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_SERVICE, "callback nullptr");
317 return false;
318 }
319 return true;
320 }
321
OnIsRemoteData(MessageParcel & data,MessageParcel & reply)322 int32_t PasteboardServiceStub::OnIsRemoteData(MessageParcel &data, MessageParcel &reply)
323 {
324 auto result = IsRemoteData();
325 reply.WriteBool(result);
326 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_SERVICE, "end.");
327 return ERR_OK;
328 }
329
OnGetDataSource(MessageParcel & data,MessageParcel & reply)330 int32_t PasteboardServiceStub::OnGetDataSource(MessageParcel &data, MessageParcel &reply)
331 {
332 std::string bundleName;
333 auto ret = GetDataSource(bundleName);
334 if (bundleName.empty() || bundleName.length() > MAX_BUNDLE_NAME_LENGTH) {
335 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_CLIENT, "Failed to get bundleName");
336 return ERR_INVALID_VALUE;
337 }
338 if (!reply.WriteString(bundleName)) {
339 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Failed to writeName result");
340 return ERR_INVALID_VALUE;
341 }
342 if (!reply.WriteInt32(ret)) {
343 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Failed to OnGetResourceApp result");
344 return ERR_INVALID_VALUE;
345 }
346 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_SERVICE, "end, ret is %{public}d.", ret);
347 return ERR_OK;
348 }
349
OnGetMimeTypes(MessageParcel & data,MessageParcel & reply)350 int32_t PasteboardServiceStub::OnGetMimeTypes(MessageParcel &data, MessageParcel &reply)
351 {
352 std::vector<std::string> mimeTypes = GetMimeTypes();
353 if (!reply.WriteUint32(static_cast<uint32_t>(mimeTypes.size()))) {
354 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Write size failed.");
355 return ERR_INVALID_VALUE;
356 }
357 for (const std::string &type : mimeTypes) {
358 if (!reply.WriteString(type)) {
359 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Write mime type failed.");
360 return ERR_INVALID_VALUE;
361 }
362 }
363 return ERR_OK;
364 }
365
OnHasDataType(MessageParcel & data,MessageParcel & reply)366 int32_t PasteboardServiceStub::OnHasDataType(MessageParcel &data, MessageParcel &reply)
367 {
368 std::string mimeType = data.ReadString();
369 auto ret = HasDataType(mimeType);
370 reply.WriteBool(ret);
371 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_SERVICE, "end.");
372 return ERR_OK;
373 }
374
OnDetectPatterns(MessageParcel & data,MessageParcel & reply)375 int32_t PasteboardServiceStub::OnDetectPatterns(MessageParcel &data, MessageParcel &reply)
376 {
377 uint32_t size = 0;
378 if (!data.ReadUint32(size)) {
379 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Read size failed.");
380 return ERR_INVALID_VALUE;
381 }
382 size_t readAbleSize = data.GetReadableBytes();
383 if (size > readAbleSize || size > static_cast<uint32_t>(Pattern::PatternCount)) {
384 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Read oversize failed.");
385 return ERR_INVALID_VALUE;
386 }
387 std::set<Pattern> patternsToCheck;
388 for (uint32_t i = 0; i < size; i++) {
389 uint32_t pattern;
390 if (!data.ReadUint32(pattern)) {
391 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Read pattern failed.");
392 return ERR_INVALID_VALUE;
393 }
394 patternsToCheck.insert(static_cast<Pattern>(pattern));
395 }
396 std::set<Pattern> existedPatterns = DetectPatterns(patternsToCheck);
397 if (!reply.WriteUint32(static_cast<uint32_t>(existedPatterns.size()))) {
398 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Write size failed.");
399 return ERR_INVALID_VALUE;
400 }
401 for (const auto &pattern : existedPatterns) {
402 if (!reply.WriteUint32(static_cast<uint32_t>(pattern))) {
403 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Write pattern failed.");
404 return ERR_INVALID_VALUE;
405 }
406 }
407 return ERR_OK;
408 }
409
OnSetGlobalShareOption(MessageParcel & data,MessageParcel & reply)410 int32_t PasteboardServiceStub::OnSetGlobalShareOption(MessageParcel &data, MessageParcel &reply)
411 {
412 uint32_t size = 0;
413 if (!data.ReadUint32(size)) {
414 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Read size failed.");
415 return ERR_INVALID_VALUE;
416 }
417 size_t readAbleSize = data.GetReadableBytes();
418 if (size > readAbleSize || size > MAX_SET_GLOBAL_SHARE_OPTION_SIZE) {
419 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Read oversize failed.");
420 return ERR_INVALID_VALUE;
421 }
422 std::map<uint32_t, ShareOption> globalShareOptions;
423 for (uint32_t i = 0; i < size; i++) {
424 uint32_t tokenId;
425 if (!data.ReadUint32(tokenId)) {
426 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Read tokenId failed.");
427 return ERR_INVALID_VALUE;
428 }
429 int32_t shareOption;
430 if (!data.ReadInt32(shareOption)) {
431 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Read shareOption failed.");
432 return ERR_INVALID_VALUE;
433 }
434 globalShareOptions[tokenId] = static_cast<ShareOption>(shareOption);
435 }
436 int32_t result = SetGlobalShareOption(globalShareOptions);
437 if (!reply.WriteInt32(result)) {
438 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Write result failed.");
439 return ERR_INVALID_VALUE;
440 }
441 return ERR_OK;
442 }
443
OnRemoveGlobalShareOption(MessageParcel & data,MessageParcel & reply)444 int32_t PasteboardServiceStub::OnRemoveGlobalShareOption(MessageParcel &data, MessageParcel &reply)
445 {
446 std::vector<uint32_t> tokenIds;
447 if (!data.ReadUInt32Vector(&tokenIds)) {
448 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Read tokenIds failed.");
449 return ERR_INVALID_VALUE;
450 }
451 int32_t result = RemoveGlobalShareOption(tokenIds);
452 if (!reply.WriteInt32(result)) {
453 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Write result failed.");
454 return ERR_INVALID_VALUE;
455 }
456 return ERR_OK;
457 }
458
OnGetGlobalShareOption(MessageParcel & data,MessageParcel & reply)459 int32_t PasteboardServiceStub::OnGetGlobalShareOption(MessageParcel &data, MessageParcel &reply)
460 {
461 std::vector<uint32_t> tokenIds;
462 if (!data.ReadUInt32Vector(&tokenIds)) {
463 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Read tokenIds failed.");
464 return ERR_INVALID_VALUE;
465 }
466 std::map<uint32_t, ShareOption> globalShareOptions = GetGlobalShareOption(tokenIds);
467 if (!reply.WriteUint32(static_cast<uint32_t>(globalShareOptions.size()))) {
468 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Write size failed.");
469 return ERR_INVALID_VALUE;
470 }
471 for (const auto &[tokenId, shareOption] : globalShareOptions) {
472 if (!reply.WriteUint32(tokenId)) {
473 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Write tokenId failed.");
474 return ERR_INVALID_VALUE;
475 }
476 if (!reply.WriteInt32(static_cast<int32_t>(shareOption))) {
477 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Write shareOption failed.");
478 return ERR_INVALID_VALUE;
479 }
480 }
481 return ERR_OK;
482 }
483
OnSetAppShareOptions(MessageParcel & data,MessageParcel & reply)484 int32_t PasteboardServiceStub::OnSetAppShareOptions(MessageParcel &data, MessageParcel &reply)
485 {
486 int32_t shareOptions;
487 if (!data.ReadInt32(shareOptions)) {
488 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Read share options failed.");
489 return static_cast<int32_t>(PasteboardError::DESERIALIZATION_ERROR);
490 }
491 auto result = SetAppShareOptions(static_cast<ShareOption>(shareOptions));
492 if (!reply.WriteInt32(result)) {
493 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Write result failed.");
494 return static_cast<int32_t>(PasteboardError::SERIALIZATION_ERROR);
495 }
496 return ERR_OK;
497 }
498
OnRemoveAppShareOptions(MessageParcel & data,MessageParcel & reply)499 int32_t PasteboardServiceStub::OnRemoveAppShareOptions(MessageParcel &data, MessageParcel &reply)
500 {
501 auto result = RemoveAppShareOptions();
502 if (!reply.WriteInt32(result)) {
503 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Write result failed.");
504 return static_cast<int32_t>(PasteboardError::SERIALIZATION_ERROR);
505 }
506 return ERR_OK;
507 }
508
~PasteboardServiceStub()509 PasteboardServiceStub::~PasteboardServiceStub()
510 {
511 memberFuncMap_.clear();
512 }
513
OnPasteStart(MessageParcel & data,MessageParcel & reply)514 int32_t PasteboardServiceStub::OnPasteStart(MessageParcel &data, MessageParcel &reply)
515 {
516 std::string pasteId = data.ReadString();
517 PasteStart(pasteId);
518 return ERR_OK;
519 }
520
OnPasteComplete(MessageParcel & data,MessageParcel & reply)521 int32_t PasteboardServiceStub::OnPasteComplete(MessageParcel &data, MessageParcel &reply)
522 {
523 std::string deviceId = data.ReadString();
524 std::string pasteId = data.ReadString();
525 PasteComplete(deviceId, pasteId);
526 return ERR_OK;
527 }
528
OnRegisterClientDeathObserver(MessageParcel & data,MessageParcel & reply)529 int32_t PasteboardServiceStub::OnRegisterClientDeathObserver(MessageParcel &data, MessageParcel &reply)
530 {
531 sptr<IRemoteObject> pasteboardClientDeathObserverProxy = data.ReadRemoteObject();
532 if (pasteboardClientDeathObserverProxy == nullptr) {
533 return ERR_INVALID_VALUE;
534 }
535 int32_t status = RegisterClientDeathObserver(std::move(pasteboardClientDeathObserverProxy));
536 if (!reply.WriteInt32(static_cast<int32_t>(status))) {
537 return ERR_INVALID_VALUE;
538 }
539 return ERR_OK;
540 }
541 } // namespace MiscServices
542 } // namespace OHOS