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