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