• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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