• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 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_ffi.h"
17 #include "pasteboard_hilog.h"
18 #include "pasteboard_log.h"
19 #include "system_pasteboard_impl.h"
20 
21 using namespace OHOS::FFI;
22 using namespace OHOS::Media;
23 using namespace OHOS::MiscServices;
24 using namespace OHOS::MiscServicesCj;
25 
26 namespace OHOS {
27 namespace CJSystemapi {
28 extern "C" {
FfiOHOSCreateStringPasteData(const char * mimeType,const char * value)29 RetDataI64 FfiOHOSCreateStringPasteData(const char *mimeType, const char *value)
30 {
31     LOGI("[PasteData] FfiOHOSCreateStringPasteData");
32     RetDataI64 ret;
33     std::string mmType = mimeType;
34     CJValueType valueType;
35     valueType.stringValue = value;
36 
37     ret.data = CreateCjPasteDataObject(mmType, valueType);
38     ret.code = SUCCESS_CODE;
39     LOGI("[PasteData] FfiOHOSCreateStringPasteData success");
40 
41     return ret;
42 }
43 
FfiOHOSCreatePixelMapPasteData(const char * mimeType,int64_t pixelMapId)44 RetDataI64 FfiOHOSCreatePixelMapPasteData(const char *mimeType, int64_t pixelMapId)
45 {
46     LOGI("[PasteData] FfiOHOSCreatePixelMapPasteData");
47     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
48     auto pixelMapImpl = FFIData::GetData<PixelMapImpl>(pixelMapId);
49     if (pixelMapImpl == nullptr) {
50         return ret;
51     }
52     std::string mmType = mimeType;
53     CJValueType valueType;
54     valueType.pixelMap = pixelMapImpl->GetRealPixelMap();
55 
56     ret.data = CreateCjPasteDataObject(mmType, valueType);
57     ret.code = SUCCESS_CODE;
58     LOGI("[PasteData] FfiOHOSCreatePixelMapPasteData success");
59 
60     return ret;
61 }
62 
FfiOHOSCreateArrayBufPasteData(const char * mimeType,uint8_t * buffPtr,int64_t bufferSize)63 RetDataI64 FfiOHOSCreateArrayBufPasteData(const char *mimeType, uint8_t *buffPtr, int64_t bufferSize)
64 {
65     LOGI("[PasteData] FfiOHOSCreateArrayBufPasteData");
66     RetDataI64 ret;
67     std::string mmType = mimeType;
68     CJValueType valueType;
69     valueType.arrayBufferData = buffPtr;
70     valueType.arrayBufferSize = bufferSize;
71 
72     ret.data = CreateCjPasteDataObject(mmType, valueType);
73     ret.code = SUCCESS_CODE;
74     LOGI("[PasteData] FfiOHOSCreateArrayBufPasteData success");
75 
76     return ret;
77 }
78 
PasteBoardMallocCString(const std::string & origin)79 char *PasteBoardMallocCString(const std::string &origin)
80 {
81     auto len = origin.length() + 1;
82     char *res = static_cast<char *>(malloc(sizeof(char) * len));
83     if (res == nullptr) {
84         return nullptr;
85     }
86     auto ret = strcpy_s(res, sizeof(char) * len, origin.c_str());
87     if (ret != EOK) {
88         LOGE("strcpy_s error");
89         free(res);
90         return nullptr;
91     }
92     return res;
93 }
94 
FillCPasteDataRecord(CPasteDataRecord * retPtr,std::shared_ptr<PasteDataRecord> record)95 void FillCPasteDataRecord(CPasteDataRecord *retPtr, std::shared_ptr<PasteDataRecord> record)
96 {
97     if (record == nullptr) {
98         return;
99     }
100     retPtr->htmlText = nullptr;
101     retPtr->mimeType = nullptr;
102     retPtr->plainText = nullptr;
103     retPtr->uri = nullptr;
104     retPtr->pixelMap = ERR_INVALID_INSTANCE_CODE;
105     if (record->GetHtmlText() != nullptr) {
106         std::string resHtmlText = *(record->GetHtmlText());
107         retPtr->htmlText = PasteBoardMallocCString(resHtmlText);
108     }
109     if (!record->GetMimeType().empty()) {
110         std::string resMimeType = record->GetMimeType();
111         retPtr->mimeType = PasteBoardMallocCString(resMimeType);
112     }
113     if (record->GetPlainText() != nullptr) {
114         std::string resPlainText = *(record->GetPlainText());
115         retPtr->plainText = PasteBoardMallocCString(resPlainText);
116     }
117     if (record->GetUri() != nullptr) {
118         std::string resUri = record->GetUri()->ToString();
119         retPtr->uri = PasteBoardMallocCString(resUri);
120     }
121     std::shared_ptr<PixelMap> pixelMap = record->GetPixelMap();
122     auto nativeImage = FFIData::Create<PixelMapImpl>(move(pixelMap));
123     if (!nativeImage) {
124         retPtr->pixelMap = 0;
125         return;
126     }
127     retPtr->pixelMap = nativeImage->GetID();
128 }
129 
FfiOHOSCreateStringPasteDataRecord(const char * mimeType,const char * value,CPasteDataRecord * retPtr)130 RetDataI64 FfiOHOSCreateStringPasteDataRecord(const char *mimeType, const char *value, CPasteDataRecord *retPtr)
131 {
132     LOGI("[PasteDataRecord] FfiOHOSCreateStringPasteDataRecord");
133     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
134     std::string mmType = mimeType;
135     CJValueType valueType;
136     valueType.stringValue = value;
137 
138     ret.data = CreateCjPasteDataRecordObject(mmType, valueType);
139     if (ret.data == 0) {
140         return ret;
141     }
142     auto recordInstance = FFIData::GetData<PasteDataRecordImpl>(ret.data);
143     if (!recordInstance) {
144         FFIData::Release(ret.data);
145         return ret;
146     }
147     std::shared_ptr<PasteDataRecord> record = recordInstance->GetRealPasteDataRecord();
148     FillCPasteDataRecord(retPtr, record);
149     ret.code = SUCCESS_CODE;
150     LOGI("[PasteDataRecord] FfiOHOSCreateStringPasteDataRecord success");
151 
152     return ret;
153 }
154 
FfiOHOSCreatePixelMapPasteDataRecord(const char * mimeType,int64_t pixelMapId,CPasteDataRecord * retPtr)155 RetDataI64 FfiOHOSCreatePixelMapPasteDataRecord(const char *mimeType, int64_t pixelMapId, CPasteDataRecord *retPtr)
156 {
157     LOGI("[PasteDataRecord] FfiOHOSCreatePixelMapPasteDataRecord");
158     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
159     std::string mmType = mimeType;
160     auto pixelMapImpl = FFIData::GetData<PixelMapImpl>(pixelMapId);
161     if (pixelMapImpl == nullptr) {
162         return ret;
163     }
164 
165     auto pixelMap = pixelMapImpl->GetRealPixelMap();
166     CJValueType valueType;
167     valueType.pixelMap = pixelMap;
168     ret.data = CreateCjPasteDataRecordObject(mmType, valueType);
169     if (ret.data == 0) {
170         return ret;
171     }
172     auto recordInstance = FFIData::GetData<PasteDataRecordImpl>(ret.data);
173     if (!recordInstance) {
174         FFIData::Release(ret.data);
175         return ret;
176     }
177     std::shared_ptr<PasteDataRecord> record = recordInstance->GetRealPasteDataRecord();
178     FillCPasteDataRecord(retPtr, record);
179     ret.code = SUCCESS_CODE;
180     LOGI("[PasteDataRecord] FfiOHOSCreatePixelMapPasteDataRecord success");
181 
182     return ret;
183 }
184 
FfiOHOSCreateArrayBufPasteDataRecord(const char * mimeType,uint8_t * buffPtr,int64_t bufferSize,CPasteDataRecord * retPtr)185 RetDataI64 FfiOHOSCreateArrayBufPasteDataRecord(
186     const char *mimeType, uint8_t *buffPtr, int64_t bufferSize, CPasteDataRecord *retPtr)
187 {
188     LOGI("[PasteDataRecord] FfiOHOSCreateArrayBufPasteDataRecord");
189     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
190     std::string mmType = mimeType;
191     CJValueType valueType;
192     valueType.arrayBufferData = buffPtr;
193     valueType.arrayBufferSize = bufferSize;
194 
195     ret.data = CreateCjPasteDataRecordObject(mmType, valueType);
196     if (ret.data == 0) {
197         return ret;
198     }
199     auto recordInstance = FFIData::GetData<PasteDataRecordImpl>(ret.data);
200     if (!recordInstance) {
201         FFIData::Release(ret.data);
202         return ret;
203     }
204     std::shared_ptr<PasteDataRecord> record = recordInstance->GetRealPasteDataRecord();
205     FillCPasteDataRecord(retPtr, record);
206     ret.code = SUCCESS_CODE;
207     LOGI("[PasteDataRecord] FfiOHOSCreateArrayBufPasteDataRecord success");
208 
209     return ret;
210 }
211 
FfiOHOSPasteDataGetPrimaryText(int64_t id)212 RetDataCString FfiOHOSPasteDataGetPrimaryText(int64_t id)
213 {
214     LOGI("[PasteData] FfiOHOSPasteDataGetPrimaryText start");
215     RetDataCString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = nullptr };
216     auto instance = FFIData::GetData<PasteDataImpl>(id);
217     if (!instance) {
218         LOGE("[PasteData] GetPrimaryText: instance not exist %{public}" PRId64, id);
219         return ret;
220     }
221 
222     auto pasteData = instance->GetRealPasteData();
223     if (pasteData == nullptr) {
224         LOGE("[PasteData] GetPrimaryText: pasteData not exist");
225         return ret;
226     }
227 
228     std::shared_ptr<std::string> p = pasteData->GetPrimaryText();
229     if (p != nullptr) {
230         ret.data = PasteBoardMallocCString(*p);
231         if (ret.data == nullptr) {
232             ret.code = ERR_CODE_PARAM_INVALID;
233             return ret;
234         }
235     }
236     ret.code = SUCCESS_CODE;
237     LOGI("[PasteData] FfiOHOSPasteDataGetPrimaryText success");
238 
239     return ret;
240 }
241 
FfiOHOSPasteDataRecordToPlainText(int64_t id)242 RetDataCString FfiOHOSPasteDataRecordToPlainText(int64_t id)
243 {
244     LOGI("[PasteData] FfiOHOSPasteDataRecordToPlainText start");
245     RetDataCString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = nullptr };
246     auto instance = FFIData::GetData<PasteDataRecordImpl>(id);
247     if (!instance) {
248         LOGE("[PasteRecord] ToPlainText: instance not exist %{public}" PRId64, id);
249         ret.code = ERR_INVALID_INSTANCE_CODE;
250         return ret;
251     }
252 
253     std::string res = instance->GetRealPasteDataRecord()->ConvertToText();
254     ret.data = PasteBoardMallocCString(res);
255     if (ret.data == nullptr) {
256         ret.code = ERR_CODE_PARAM_INVALID;
257         return ret;
258     }
259     ret.code = SUCCESS_CODE;
260     LOGI("[PasteRecord] FfiOHOSPasteDataRecordToPlainText success");
261 
262     return ret;
263 }
264 
FfiOHOSPasteDataGetPrimaryHtml(int64_t id)265 RetDataCString FfiOHOSPasteDataGetPrimaryHtml(int64_t id)
266 {
267     LOGI("[PasteData] FfiOHOSPasteDataGetPrimaryHtml start");
268     RetDataCString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = nullptr };
269     auto instance = FFIData::GetData<PasteDataImpl>(id);
270     if (!instance) {
271         LOGE("[PasteData] GetPrimaryHtml: instance not exist %{public}" PRId64, id);
272         return ret;
273     }
274 
275     auto pasteData = instance->GetRealPasteData();
276     if (pasteData == nullptr) {
277         LOGE("[PasteData] GetPrimaryHtml: pasteData not exist");
278         return ret;
279     }
280 
281     std::shared_ptr<std::string> p = pasteData->GetPrimaryHtml();
282     if (p != nullptr) {
283         ret.data = PasteBoardMallocCString(*p);
284         if (ret.data == nullptr) {
285             ret.code = ERR_CODE_PARAM_INVALID;
286             return ret;
287         }
288     }
289     ret.code = SUCCESS_CODE;
290     LOGI("[PasteData] FfiOHOSPasteDataGetPrimaryHtml success");
291 
292     return ret;
293 }
294 
FfiOHOSPasteDataGetPrimaryUri(int64_t id)295 RetDataCString FfiOHOSPasteDataGetPrimaryUri(int64_t id)
296 {
297     LOGI("[PasteData] FfiOHOSPasteDataGetPrimaryUri start");
298     RetDataCString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = nullptr };
299     auto instance = FFIData::GetData<PasteDataImpl>(id);
300     if (!instance) {
301         LOGE("[PasteData] GetPrimaryUri: instance not exist %{public}" PRId64, id);
302         return ret;
303     }
304 
305     auto pasteData = instance->GetRealPasteData();
306     if (pasteData == nullptr) {
307         LOGE("[PasteData] GetPrimaryUri: pasteData not exist");
308         return ret;
309     }
310 
311     std::shared_ptr<OHOS::Uri> p = pasteData->GetPrimaryUri();
312     if (p != nullptr) {
313         std::string uri = p->ToString();
314         ret.data = PasteBoardMallocCString(uri);
315         if (ret.data == nullptr) {
316             ret.code = ERR_CODE_PARAM_INVALID;
317             return ret;
318         }
319     }
320     ret.code = SUCCESS_CODE;
321     LOGI("[PasteData] FfiOHOSPasteDataGetPrimaryUri success");
322 
323     return ret;
324 }
325 
FfiOHOSPasteDataGetPrimaryPixelMap(int64_t id)326 RetDataI64 FfiOHOSPasteDataGetPrimaryPixelMap(int64_t id)
327 {
328     LOGI("[PasteData] FfiOHOSPasteDataGetPrimaryPixelMap start");
329     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
330     auto instance = FFIData::GetData<PasteDataImpl>(id);
331     if (!instance) {
332         LOGE("[PasteData] GetPrimaryPixelMap: instance not exist %{public}" PRId64, id);
333         return ret;
334     }
335 
336     auto pasteData = instance->GetRealPasteData();
337     if (pasteData == nullptr) {
338         LOGE("[PasteData] GetPrimaryPixelMap: pasteData not exist");
339         return ret;
340     }
341 
342     std::shared_ptr<PixelMap> pixelMap = pasteData->GetPrimaryPixelMap();
343     if (pixelMap != nullptr) {
344         auto nativeImage = FFIData::Create<PixelMapImpl>(move(pixelMap));
345         if (!nativeImage) {
346             return ret;
347         }
348         ret.data = nativeImage->GetID();
349         ret.code = SUCCESS_CODE;
350         LOGI("[PasteData] FfiOHOSPasteDataGetPrimaryPixelMap success");
351     } else {
352         LOGE("[PasteData] pixelMap not exist");
353     }
354 
355     return ret;
356 }
357 
FfiOHOSPasteDataGetPrimaryMimeType(int64_t id)358 RetDataCString FfiOHOSPasteDataGetPrimaryMimeType(int64_t id)
359 {
360     LOGI("[PasteData] FfiOHOSPasteDataGetPrimaryMimeType start");
361     RetDataCString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = nullptr };
362     auto instance = FFIData::GetData<PasteDataImpl>(id);
363     if (!instance) {
364         LOGE("[PasteData] GetPrimaryMimeType: instance not exist %{public}" PRId64, id);
365         return ret;
366     }
367 
368     auto pasteData = instance->GetRealPasteData();
369     if (pasteData == nullptr) {
370         LOGE("[PasteData] GetPrimaryMimeType: pasteData not exist");
371         return ret;
372     }
373 
374     std::shared_ptr<std::string> mimeType = pasteData->GetPrimaryMimeType();
375     if (mimeType != nullptr) {
376         ret.data = PasteBoardMallocCString(*mimeType);
377         if (ret.data == nullptr) {
378             ret.code = ERR_CODE_PARAM_INVALID;
379             return ret;
380         }
381     }
382     ret.code = SUCCESS_CODE;
383     LOGI("[PasteData] FfiOHOSPasteDataGetPrimaryMimeType success");
384 
385     return ret;
386 }
387 
VectorToCArrString(std::vector<std::string> & vec)388 static char **VectorToCArrString(std::vector<std::string> &vec)
389 {
390     char **result = new char *[vec.size()];
391     if (result == nullptr) {
392         return nullptr;
393     }
394     size_t temp = 0;
395     for (size_t i = 0; i < vec.size(); i++) {
396         result[i] = new char[vec[i].length() + 1];
397         if (result[i] == nullptr) {
398             break;
399         }
400         if (strcpy_s(result[i], vec[i].length() + 1, vec[i].c_str()) != 0) {
401             delete[] result[i];
402             result[i] = nullptr;
403             break;
404         }
405         temp++;
406     }
407     if (temp != vec.size()) {
408         for (size_t j = temp; j > 0; j--) {
409             delete[] result[j - 1];
410             result[j - 1] = nullptr;
411         }
412         delete[] result;
413         return nullptr;
414     }
415     return result;
416 }
417 
FfiOHOSPasteDataGetProperty(int64_t id,CPasteDataProperty * retPtr)418 int32_t FfiOHOSPasteDataGetProperty(int64_t id, CPasteDataProperty *retPtr)
419 {
420     LOGI("[PasteData] FfiOHOSPasteDataGetProperty start");
421     auto instance = FFIData::GetData<PasteDataImpl>(id);
422     if (!instance) {
423         LOGE("[PasteData] GetProperty: instance not exist %{public}" PRId64, id);
424         return ERR_INVALID_INSTANCE_CODE;
425     }
426 
427     auto pasteData = instance->GetRealPasteData();
428     if (pasteData == nullptr) {
429         LOGE("[PasteData] GetProperty: pasteData not exist");
430         return ERR_INVALID_INSTANCE_CODE;
431     }
432 
433     PasteDataProperty property = pasteData->GetProperty();
434     retPtr->tag = PasteBoardMallocCString(property.tag);
435     if (retPtr->tag == nullptr) {
436         return ERR_CODE_PARAM_INVALID;
437     }
438     retPtr->mimeTypes.head = VectorToCArrString(property.mimeTypes);
439     if (retPtr->mimeTypes.head == nullptr) {
440         free(retPtr->tag);
441         retPtr->tag = nullptr;
442         return ERR_CODE_PARAM_INVALID;
443     }
444     retPtr->mimeTypes.size = static_cast<int64_t>(property.mimeTypes.size());
445     retPtr->timestamp = property.timestamp;
446     retPtr->localOnly = property.localOnly;
447     retPtr->shareOption = property.shareOption;
448     LOGI("[PasteData] FfiOHOSPasteDataGetProperty success");
449 
450     return SUCCESS_CODE;
451 }
452 
CArrStringToVector(CArrString src)453 static std::vector<std::string> CArrStringToVector(CArrString src)
454 {
455     LOGI("CArrStringToVector start");
456     std::vector<std::string> res;
457     for (int64_t i = 0; i < src.size; i++) {
458         res.push_back(std::string(src.head[i]));
459     }
460     LOGI("CArrStringToVector end");
461     return res;
462 }
463 
FfiOHOSPasteDataSetProperty(int64_t id,CArrString mimeTypes,const char * tag,int64_t timestamp,bool localOnly,int32_t shareOption)464 int32_t FfiOHOSPasteDataSetProperty(
465     int64_t id, CArrString mimeTypes, const char *tag, int64_t timestamp, bool localOnly, int32_t shareOption)
466 {
467     LOGI("[PasteData] FfiOHOSPasteDataSetProperty start");
468     auto instance = FFIData::GetData<PasteDataImpl>(id);
469     if (!instance) {
470         LOGE("[PasteData] SetProperty: instance not exist %{public}" PRId64, id);
471         return ERR_INVALID_INSTANCE_CODE;
472     }
473     PasteDataProperty property;
474     property.mimeTypes = CArrStringToVector(mimeTypes);
475     property.tag = tag;
476     property.timestamp = timestamp;
477     property.localOnly = localOnly;
478     property.shareOption = static_cast<ShareOption>(shareOption);
479 
480     auto pasteData = instance->GetRealPasteData();
481     if (pasteData == nullptr) {
482         LOGE("[PasteData] SetProperty: pasteData not exist");
483         return ERR_INVALID_INSTANCE_CODE;
484     }
485 
486     pasteData->SetProperty(property);
487     LOGI("[PasteData] FfiOHOSPasteDataSetProperty success");
488 
489     return SUCCESS_CODE;
490 }
491 
FfiOHOSPasteDataGetTag(int64_t id)492 RetDataCString FfiOHOSPasteDataGetTag(int64_t id)
493 {
494     LOGI("[PasteData] FfiOHOSPasteDataGetTag start");
495     RetDataCString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = nullptr };
496     auto instance = FFIData::GetData<PasteDataImpl>(id);
497     if (!instance) {
498         LOGE("[PasteData] GetTag: instance not exist %{public}" PRId64, id);
499         return ret;
500     }
501 
502     auto pasteData = instance->GetRealPasteData();
503     if (pasteData == nullptr) {
504         LOGE("[PasteData] GetTag: pasteData not exist");
505         return ret;
506     }
507 
508     std::string tag = pasteData->GetTag();
509     if (!tag.empty()) {
510         ret.data = PasteBoardMallocCString(tag);
511         if (ret.data == nullptr) {
512             ret.code = ERR_CODE_PARAM_INVALID;
513             return ret;
514         }
515     }
516     ret.code = SUCCESS_CODE;
517     LOGI("[PasteData] FfiOHOSPasteDataGetTag success");
518 
519     return ret;
520 }
521 
FfiOHOSPasteDataHasType(int64_t id,const char * mimeTypes)522 RetDataBool FfiOHOSPasteDataHasType(int64_t id, const char *mimeTypes)
523 {
524     LOGI("[PasteData] FfiOHOSPasteDataHasType start");
525     RetDataBool ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = false };
526     auto instance = FFIData::GetData<PasteDataImpl>(id);
527     if (!instance) {
528         LOGE("[PasteData] HasType: instance not exist %{public}" PRId64, id);
529         return ret;
530     }
531 
532     std::string types = mimeTypes;
533 
534     auto pasteData = instance->GetRealPasteData();
535     if (pasteData == nullptr) {
536         LOGE("[PasteData] HasType: pasteData not exist");
537         return ret;
538     }
539 
540     ret.data = pasteData->HasMimeType(types);
541     ret.code = SUCCESS_CODE;
542     LOGI("[PasteData] FfiOHOSPasteDataHasType success");
543 
544     return ret;
545 }
546 
FfiOHOSPasteDataAddRecord(int64_t id,int64_t recordId)547 int32_t FfiOHOSPasteDataAddRecord(int64_t id, int64_t recordId)
548 {
549     LOGI("[PasteData] FfiOHOSPasteDataAddRecord start");
550     auto instance = FFIData::GetData<PasteDataImpl>(id);
551     if (!instance) {
552         LOGE("[PasteData] AddRecord: instance not exist %{public}" PRId64, id);
553         return ERR_INVALID_INSTANCE_CODE;
554     }
555 
556     PasteDataRecord rec;
557     auto recordInstance = FFIData::GetData<PasteDataRecordImpl>(recordId);
558     if (!recordInstance) {
559         LOGE("[PasteData] AddRecord: instance not exist %{public}" PRId64, recordId);
560         return ERR_INVALID_INSTANCE_CODE;
561     }
562 
563     auto pasteData = instance->GetRealPasteData();
564     if (pasteData == nullptr) {
565         LOGE("[PasteData] AddRecord: pasteData not exist");
566         return ERR_INVALID_INSTANCE_CODE;
567     }
568 
569     pasteData->AddRecord(recordInstance->GetRealPasteDataRecord());
570     LOGI("[PasteData] FfiOHOSPasteDataAddRecord success");
571 
572     return SUCCESS_CODE;
573 }
574 
FfiOHOSPasteDataAddMimeTypeRecord(int64_t id,const char * mimeType,const char * value)575 int32_t FfiOHOSPasteDataAddMimeTypeRecord(int64_t id, const char *mimeType, const char *value)
576 {
577     LOGI("[PasteData] FfiOHOSPasteDataAddMimeTypeRecord start");
578     auto instance = FFIData::GetData<PasteDataImpl>(id);
579     if (!instance) {
580         LOGE("[PasteData] AddMimeTypeRecord: instance not exist %{public}" PRId64, id);
581         return ERR_INVALID_INSTANCE_CODE;
582     }
583 
584     std::string types = mimeType;
585     std::string realValue = value;
586 
587     auto pasteData = instance->GetRealPasteData();
588     if (pasteData == nullptr) {
589         LOGE("[PasteData] AddMimeTypeRecord: pasteData not exist");
590         return ERR_INVALID_INSTANCE_CODE;
591     }
592 
593     if (types == MIMETYPE_TEXT_HTML) {
594         pasteData->AddHtmlRecord(realValue);
595     } else if (types == MIMETYPE_TEXT_PLAIN) {
596         pasteData->AddTextRecord(realValue);
597     } else {
598         pasteData->AddUriRecord(OHOS::Uri(realValue));
599     }
600     LOGI("[PasteData] FfiOHOSPasteDataAddMimeTypeRecord success");
601 
602     return SUCCESS_CODE;
603 }
604 
FfiOHOSPasteDataAddPixelMapRecord(int64_t id,const char * mimeType,int64_t pixelMapId)605 int32_t FfiOHOSPasteDataAddPixelMapRecord(int64_t id, const char *mimeType, int64_t pixelMapId)
606 {
607     LOGI("[PasteData] FfiOHOSPasteDataAddPixelMapRecord start");
608     auto instance = FFIData::GetData<PasteDataImpl>(id);
609     if (!instance) {
610         LOGE("[PasteData] AddPixelMapRecord: instance not exist %{public}" PRId64, id);
611         return ERR_INVALID_INSTANCE_CODE;
612     }
613     auto pixelMapImpl = FFIData::GetData<PixelMapImpl>(pixelMapId);
614     if (pixelMapImpl == nullptr) {
615         return ERR_INVALID_INSTANCE_CODE;
616     }
617 
618     auto pixelMap = pixelMapImpl->GetRealPixelMap();
619     if (pixelMap == nullptr) {
620         LOGE("[PasteData] AddPixelMapRecord: PixelMap not exist");
621         return ERR_INVALID_INSTANCE_CODE;
622     }
623 
624     auto pasteData = instance->GetRealPasteData();
625     if (pasteData == nullptr) {
626         LOGE("[PasteData] AddPixelMapRecord: pasteData not exist");
627         return ERR_INVALID_INSTANCE_CODE;
628     }
629 
630     pasteData->AddPixelMapRecord(pixelMap);
631     LOGI("[PasteData] FfiOHOSPasteDataAddPixelMapRecord success");
632 
633     return SUCCESS_CODE;
634 }
635 
FfiOHOSPasteDataAddArrayRecord(int64_t id,const char * mimeType,uint8_t * buffPtr,int64_t bufferSize)636 int32_t FfiOHOSPasteDataAddArrayRecord(int64_t id, const char *mimeType, uint8_t *buffPtr, int64_t bufferSize)
637 {
638     LOGI("[PasteData] FfiOHOSPasteDataAddArrayRecord start");
639     auto instance = FFIData::GetData<PasteDataImpl>(id);
640     if (!instance) {
641         LOGE("[PasteData] AddArrayRecord: instance not exist %{public}" PRId64, id);
642         return ERR_INVALID_INSTANCE_CODE;
643     }
644 
645     std::string types = mimeType;
646     void *data = buffPtr;
647     size_t dataLen = static_cast<size_t>(bufferSize);
648 
649     auto pasteData = instance->GetRealPasteData();
650     if (pasteData == nullptr) {
651         LOGE("[PasteData] AddArrayRecord: pasteData not exist");
652         return ERR_INVALID_INSTANCE_CODE;
653     }
654 
655     pasteData->AddKvRecord(
656         types, std::vector<uint8_t>(reinterpret_cast<uint8_t *>(data), reinterpret_cast<uint8_t *>(data) + dataLen));
657     LOGI("[PasteData] FfiOHOSPasteDataAddArrayRecord success");
658 
659     return SUCCESS_CODE;
660 }
661 
FfiOHOSPasteDataGetMimeTypes(int64_t id)662 RetDataCArrString FfiOHOSPasteDataGetMimeTypes(int64_t id)
663 {
664     LOGI("[PasteData] FfiOHOSPasteDataAddArrayRecord start");
665     RetDataCArrString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = { .head = nullptr, .size = 0 } };
666     auto instance = FFIData::GetData<PasteDataImpl>(id);
667     if (!instance) {
668         LOGE("[PasteData] GetMimeTypes: instance not exist %{public}" PRId64, id);
669         return ret;
670     }
671 
672     auto pasteData = instance->GetRealPasteData();
673     if (pasteData == nullptr) {
674         LOGE("[PasteData] GetMimeTypes: pasteData not exist");
675         return ret;
676     }
677 
678     std::vector<std::string> mimeTypes = pasteData->GetMimeTypes();
679     ret.data.head = VectorToCArrString(mimeTypes);
680     if (ret.data.head == nullptr) {
681         ret.code = ERR_CODE_PARAM_INVALID;
682         return ret;
683     }
684     ret.data.size = static_cast<int64_t>(mimeTypes.size());
685     ret.code = SUCCESS_CODE;
686     LOGI("[PasteData] FfiOHOSPasteDataGetMimeTypes success");
687 
688     return ret;
689 }
690 
FfiOHOSPasteDataGetRecord(int64_t id,int32_t index,CPasteDataRecord * retPtr)691 RetDataI64 FfiOHOSPasteDataGetRecord(int64_t id, int32_t index, CPasteDataRecord *retPtr)
692 {
693     LOGI("[PasteData] FfiOHOSPasteDataGetRecord start");
694     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
695     auto instance = FFIData::GetData<PasteDataImpl>(id);
696     if (!instance) {
697         LOGE("[PasteData] GetRecord: instance not exist %{public}" PRId64, id);
698         return ret;
699     }
700 
701     auto pasteData = instance->GetRealPasteData();
702     if (pasteData == nullptr) {
703         LOGE("[PasteData] GetRecord: pasteData not exist");
704         return ret;
705     }
706 
707     if ((std::size_t)index >= pasteData->GetRecordCount()) {
708         LOGI("[PasteData] FfiOHOSPasteDataRemoveRecord index out of range.");
709         ret.code = OUT_OF_RANGE;
710         return ret;
711     }
712     std::shared_ptr<PasteDataRecord> record = pasteData->GetRecordAt((std::size_t)index);
713     if (record == nullptr) {
714         LOGE("[PasteData] FfiOHOSPasteDataRemoveRecord index out of range.");
715         ret.code = OUT_OF_RANGE;
716         return ret;
717     }
718 
719     FillCPasteDataRecord(retPtr, record);
720     auto existedRecordImpl = getCjPasteDataRecordImpl(record);
721     if (existedRecordImpl != nullptr) {
722         ret.data = existedRecordImpl->GetID();
723     } else {
724         auto pasteDataRecordImpl = FFI::FFIData::Create<PasteDataRecordImpl>(record);
725         if (!pasteDataRecordImpl) {
726             return ret;
727         }
728         ret.data = pasteDataRecordImpl->GetID();
729     }
730     ret.code = SUCCESS_CODE;
731     LOGI("[PasteData] FfiOHOSPasteDataGetRecord success");
732 
733     return ret;
734 }
735 
FfiOHOSPasteDataGetRecordCount(int64_t id)736 RetDataUI FfiOHOSPasteDataGetRecordCount(int64_t id)
737 {
738     LOGI("[PasteData] FfiOHOSPasteDataGetRecordCount start");
739     RetDataUI ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
740     auto instance = FFIData::GetData<PasteDataImpl>(id);
741     if (!instance) {
742         LOGE("[PasteData] GetRecordCount: instance not exist %{public}" PRId64, id);
743         return ret;
744     }
745 
746     auto pasteData = instance->GetRealPasteData();
747     if (pasteData == nullptr) {
748         LOGE("[PasteData] GetRecordCount: pasteData not exist");
749         return ret;
750     }
751 
752     ret.data = pasteData->GetRecordCount();
753     ret.code = SUCCESS_CODE;
754     LOGI("[PasteData] FfiOHOSPasteDataGetRecordCount success");
755 
756     return ret;
757 }
758 
FfiOHOSPasteDataRemoveRecord(int64_t id,int32_t index)759 int32_t FfiOHOSPasteDataRemoveRecord(int64_t id, int32_t index)
760 {
761     LOGI("[PasteData] FfiOHOSPasteDataRemoveRecord start");
762     auto instance = FFIData::GetData<PasteDataImpl>(id);
763     if (!instance) {
764         LOGE("[PasteData] RemoveRecord: instance not exist %{public}" PRId64, id);
765         return ERR_INVALID_INSTANCE_CODE;
766     }
767 
768     auto pasteData = instance->GetRealPasteData();
769     if (pasteData == nullptr) {
770         LOGE("[PasteData] RemoveRecord: pasteData not exist");
771         return ERR_INVALID_INSTANCE_CODE;
772     }
773 
774     if ((std::size_t)index >= pasteData->GetRecordCount()) {
775         LOGI("[PasteData] FfiOHOSPasteDataRemoveRecord index out of range.");
776         return OUT_OF_RANGE;
777     }
778     std::shared_ptr<PasteDataRecord> recordImpl = pasteData->GetRecordAt((std::size_t)index);
779     if (recordImpl != nullptr) {
780         auto existedRecordImpl = getCjPasteDataRecordImpl(recordImpl);
781         if (existedRecordImpl != nullptr) {
782             FFIData::Release(existedRecordImpl->GetID());
783             removeCjPasteDataRecordImpl(recordImpl);
784         }
785         pasteData->RemoveRecordAt(index);
786     }
787 
788     LOGI("[PasteData] FfiOHOSPasteDataRemoveRecord success");
789 
790     return SUCCESS_CODE;
791 }
792 
FfiOHOSPasteDataReplaceRecord(int64_t id,int64_t recordId,int32_t index)793 int32_t FfiOHOSPasteDataReplaceRecord(int64_t id, int64_t recordId, int32_t index)
794 {
795     LOGI("[PasteData] FfiOHOSPasteDataReplaceRecord start");
796     auto instance = FFIData::GetData<PasteDataImpl>(id);
797     if (!instance) {
798         LOGE("[PasteData] ReplaceRecord: instance not exist %{public}" PRId64, id);
799         return ERR_INVALID_INSTANCE_CODE;
800     }
801 
802     auto recordInstance = FFIData::GetData<PasteDataRecordImpl>(recordId);
803     if (!recordInstance) {
804         LOGE("[PasteData] ReplaceRecord: instance not exist %{public}" PRId64, recordId);
805         return ERR_INVALID_INSTANCE_CODE;
806     }
807 
808     auto pasteData = instance->GetRealPasteData();
809     if (pasteData == nullptr) {
810         LOGE("[PasteData] ReplaceRecord: pasteData not exist");
811         return ERR_INVALID_INSTANCE_CODE;
812     }
813 
814     if ((std::size_t)index >= pasteData->GetRecordCount()) {
815         LOGI("[PasteData] FfiOHOSPasteDataReplaceRecord index out of range.");
816         return OUT_OF_RANGE;
817     }
818     std::shared_ptr<PasteDataRecord> oldRecord = pasteData->GetRecordAt((std::size_t)index);
819     if (oldRecord != nullptr) {
820         auto existedRecordImpl = getCjPasteDataRecordImpl(oldRecord);
821         if (existedRecordImpl != nullptr) {
822             FFIData::Release(existedRecordImpl->GetID());
823             removeCjPasteDataRecordImpl(oldRecord);
824         }
825     }
826 
827     std::shared_ptr<PasteDataRecord> newRecord = recordInstance->GetRealPasteDataRecord();
828     addCjPasteDataRecordImpl(newRecord, recordInstance);
829     pasteData->ReplaceRecordAt(index, newRecord);
830     LOGI("[PasteData] FfiOHOSPasteDataReplaceRecord success");
831 
832     return SUCCESS_CODE;
833 }
834 
FfiOHOSGetSystemPasteboard()835 RetDataI64 FfiOHOSGetSystemPasteboard()
836 {
837     RetDataI64 ret;
838     LOGI("[SystemPasteboard] FfiOHOSGetSystemPasteboard start");
839     ret.code = SystemPasteboardImpl::GetSystemPasteboardImpl(ret.data);
840     LOGI("[SystemPasteboard] FfiOHOSGetSystemPasteboard success");
841     return ret;
842 }
843 
FfiOHOSSystemPasteboardSetData(int64_t id,int64_t pasteDataId)844 int32_t FfiOHOSSystemPasteboardSetData(int64_t id, int64_t pasteDataId)
845 {
846     LOGI("[SystemPasteboard] FfiOHOSSystemPasteboardSetData start");
847     auto instance = FFIData::GetData<SystemPasteboardImpl>(id);
848     if (!instance) {
849         LOGE("[SystemPasteboard] SetData: instance not exist %{public}" PRId64, id);
850         return ERR_INVALID_INSTANCE_CODE;
851     }
852     auto pasteDataInstance = FFIData::GetData<PasteDataImpl>(pasteDataId);
853     if (!pasteDataInstance) {
854         LOGE("[SystemPasteboard] SetData: instance not exist %{public}" PRId64, pasteDataId);
855         return ERR_INVALID_INSTANCE_CODE;
856     }
857     auto ret = instance->SetData(pasteDataInstance, pasteDataInstance->GetRealPasteData());
858     if (ret == SUCCESS_CODE) {
859         LOGI("[PasteData] FfiOHOSSystemPasteboardSetData success");
860     }
861 
862     return SUCCESS_CODE;
863 }
864 
FfiOHOSSystemPasteboardGetData(int64_t id)865 RetDataI64 FfiOHOSSystemPasteboardGetData(int64_t id)
866 {
867     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
868     LOGI("[SystemPasteboard] FfiOHOSSystemPasteboardGetData start");
869     auto instance = FFIData::GetData<SystemPasteboardImpl>(id);
870     if (!instance) {
871         LOGE("[SystemPasteboard] GetData: instance not exist %{public}" PRId64, id);
872         return ret;
873     }
874     std::shared_ptr<MiscServices::PasteData> pasteData = std::make_shared<PasteData>();
875     int32_t res = instance->GetData(*pasteData);
876     if (res != static_cast<int32_t>(PasteboardError::E_OK)) {
877         ret.code = res;
878         return ret;
879     }
880     auto pasteDataImpl = FFIData::Create<PasteDataImpl>(pasteData);
881     if (!pasteDataImpl) {
882         return ret;
883     }
884     ret.data = pasteDataImpl->GetID();
885     ret.code = SUCCESS_CODE;
886     LOGI("[SystemPasteboard] FfiOHOSSystemPasteboardGetData success");
887     return ret;
888 }
889 
FfiOHOSSystemPasteboardHasData(int64_t id)890 RetDataBool FfiOHOSSystemPasteboardHasData(int64_t id)
891 {
892     RetDataBool ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = false };
893     LOGI("[SystemPasteboard] FfiOHOSSystemPasteboardHasData start");
894     auto instance = FFIData::GetData<SystemPasteboardImpl>(id);
895     if (!instance) {
896         LOGE("[SystemPasteboard] HasData: instance not exist %{public}" PRId64, id);
897         return ret;
898     }
899 
900     ret.data = instance->HasData();
901     ret.code = SUCCESS_CODE;
902     LOGI("[SystemPasteboard] FfiOHOSSystemPasteboardHasData success");
903     return ret;
904 }
905 
FfiOHOSSystemPasteboardClearData(int64_t id)906 FFI_EXPORT void FfiOHOSSystemPasteboardClearData(int64_t id)
907 {
908     LOGI("[SystemPasteboard] FfiOHOSSystemPasteboardClearData start");
909     auto instance = FFIData::GetData<SystemPasteboardImpl>(id);
910     if (!instance) {
911         LOGE("[SystemPasteboard] ClearData: instance not exist %{public}" PRId64, id);
912         return;
913     }
914     instance->ClearData();
915 
916     LOGI("[SystemPasteboard] FfiOHOSSystemPasteboardClearData success");
917 }
918 
FfiOHOSSystemPasteboardIsRemoteData(int64_t id)919 RetDataBool FfiOHOSSystemPasteboardIsRemoteData(int64_t id)
920 {
921     RetDataBool ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = false };
922     LOGI("[SystemPasteboard] FfiOHOSSystemPasteboardIsRemoteData start");
923     auto instance = FFIData::GetData<SystemPasteboardImpl>(id);
924     if (!instance) {
925         LOGE("[SystemPasteboard] IsRemoteData: instance not exist %{public}" PRId64, id);
926         return ret;
927     }
928 
929     ret.data = instance->IsRemoteData();
930     ret.code = SUCCESS_CODE;
931     LOGI("[SystemPasteboard] FfiOHOSSystemPasteboardIsRemoteData success");
932     return ret;
933 }
934 
FfiOHOSSystemPasteboardHasDataType(int64_t id,const char * mimeType)935 RetDataBool FfiOHOSSystemPasteboardHasDataType(int64_t id, const char *mimeType)
936 {
937     RetDataBool ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = false };
938     LOGI("[SystemPasteboard] FfiOHOSSystemPasteboardHasDataType start");
939     auto instance = FFIData::GetData<SystemPasteboardImpl>(id);
940     if (!instance) {
941         LOGE("[SystemPasteboard] HasDataType: instance not exist %{public}" PRId64, id);
942         return ret;
943     }
944 
945     std::string types = mimeType;
946     ret.data = instance->HasDataType(types);
947     ret.code = SUCCESS_CODE;
948     LOGI("[SystemPasteboard] FfiOHOSSystemPasteboardHasDataType success");
949     return ret;
950 }
951 
FfiOHOSSystemPasteboardGetDataSource(int64_t id)952 RetDataCString FfiOHOSSystemPasteboardGetDataSource(int64_t id)
953 {
954     LOGI("[PasteData] FfiOHOSSystemPasteboardGetDataSource start");
955     RetDataCString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = nullptr };
956     auto instance = FFIData::GetData<SystemPasteboardImpl>(id);
957     if (!instance) {
958         LOGE("[SystemPasteboard] GetDataSource: instance not exist %{public}" PRId64, id);
959         return ret;
960     }
961     std::string res = instance->GetDataSource();
962     ret.data = PasteBoardMallocCString(res);
963     if (ret.data == nullptr) {
964         ret.code = ERR_CODE_PARAM_INVALID;
965         return ret;
966     }
967     ret.code = SUCCESS_CODE;
968     LOGI("[PasteData] FfiOHOSSystemPasteboardGetDataSource success");
969 
970     return ret;
971 }
972 }
973 } // namespace CJSystemapi
974 } // namespace OHOS
975