• 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 (retPtr == nullptr || 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->GetHtmlTextV0() != nullptr) {
106         std::string resHtmlText = *(record->GetHtmlTextV0());
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->GetPlainTextV0() != nullptr) {
114         std::string resPlainText = *(record->GetPlainTextV0());
115         retPtr->plainText = PasteBoardMallocCString(resPlainText);
116     }
117     if (record->GetUriV0() != nullptr) {
118         std::string resUri = record->GetUriV0()->ToString();
119         retPtr->uri = PasteBoardMallocCString(resUri);
120     }
121     std::shared_ptr<PixelMap> pixelMap = record->GetPixelMapV0();
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     auto realRecord = instance->GetRealPasteDataRecord();
254     PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(realRecord != nullptr, ret, PASTEBOARD_MODULE_SERVICE, "realRecord is null");
255     std::string res = realRecord->ConvertToText();
256     ret.data = PasteBoardMallocCString(res);
257     if (ret.data == nullptr) {
258         ret.code = ERR_CODE_PARAM_INVALID;
259         return ret;
260     }
261     ret.code = SUCCESS_CODE;
262     LOGI("[PasteRecord] FfiOHOSPasteDataRecordToPlainText success");
263 
264     return ret;
265 }
266 
FfiOHOSPasteDataGetPrimaryHtml(int64_t id)267 RetDataCString FfiOHOSPasteDataGetPrimaryHtml(int64_t id)
268 {
269     LOGI("[PasteData] FfiOHOSPasteDataGetPrimaryHtml start");
270     RetDataCString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = nullptr };
271     auto instance = FFIData::GetData<PasteDataImpl>(id);
272     if (!instance) {
273         LOGE("[PasteData] GetPrimaryHtml: instance not exist %{public}" PRId64, id);
274         return ret;
275     }
276 
277     auto pasteData = instance->GetRealPasteData();
278     if (pasteData == nullptr) {
279         LOGE("[PasteData] GetPrimaryHtml: pasteData not exist");
280         return ret;
281     }
282 
283     std::shared_ptr<std::string> p = pasteData->GetPrimaryHtml();
284     if (p != nullptr) {
285         ret.data = PasteBoardMallocCString(*p);
286         if (ret.data == nullptr) {
287             ret.code = ERR_CODE_PARAM_INVALID;
288             return ret;
289         }
290     }
291     ret.code = SUCCESS_CODE;
292     LOGI("[PasteData] FfiOHOSPasteDataGetPrimaryHtml success");
293 
294     return ret;
295 }
296 
FfiOHOSPasteDataGetPrimaryUri(int64_t id)297 RetDataCString FfiOHOSPasteDataGetPrimaryUri(int64_t id)
298 {
299     LOGI("[PasteData] FfiOHOSPasteDataGetPrimaryUri start");
300     RetDataCString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = nullptr };
301     auto instance = FFIData::GetData<PasteDataImpl>(id);
302     if (!instance) {
303         LOGE("[PasteData] GetPrimaryUri: instance not exist %{public}" PRId64, id);
304         return ret;
305     }
306 
307     auto pasteData = instance->GetRealPasteData();
308     if (pasteData == nullptr) {
309         LOGE("[PasteData] GetPrimaryUri: pasteData not exist");
310         return ret;
311     }
312 
313     std::shared_ptr<OHOS::Uri> p = pasteData->GetPrimaryUri();
314     if (p != nullptr) {
315         std::string uri = p->ToString();
316         ret.data = PasteBoardMallocCString(uri);
317         if (ret.data == nullptr) {
318             ret.code = ERR_CODE_PARAM_INVALID;
319             return ret;
320         }
321     }
322     ret.code = SUCCESS_CODE;
323     LOGI("[PasteData] FfiOHOSPasteDataGetPrimaryUri success");
324 
325     return ret;
326 }
327 
FfiOHOSPasteDataGetPrimaryPixelMap(int64_t id)328 RetDataI64 FfiOHOSPasteDataGetPrimaryPixelMap(int64_t id)
329 {
330     LOGI("[PasteData] FfiOHOSPasteDataGetPrimaryPixelMap start");
331     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
332     auto instance = FFIData::GetData<PasteDataImpl>(id);
333     if (!instance) {
334         LOGE("[PasteData] GetPrimaryPixelMap: instance not exist %{public}" PRId64, id);
335         return ret;
336     }
337 
338     auto pasteData = instance->GetRealPasteData();
339     if (pasteData == nullptr) {
340         LOGE("[PasteData] GetPrimaryPixelMap: pasteData not exist");
341         return ret;
342     }
343 
344     std::shared_ptr<PixelMap> pixelMap = pasteData->GetPrimaryPixelMap();
345     if (pixelMap != nullptr) {
346         auto nativeImage = FFIData::Create<PixelMapImpl>(move(pixelMap));
347         if (!nativeImage) {
348             return ret;
349         }
350         ret.data = nativeImage->GetID();
351         ret.code = SUCCESS_CODE;
352         LOGI("[PasteData] FfiOHOSPasteDataGetPrimaryPixelMap success");
353     } else {
354         LOGE("[PasteData] pixelMap not exist");
355     }
356 
357     return ret;
358 }
359 
FfiOHOSPasteDataGetPrimaryMimeType(int64_t id)360 RetDataCString FfiOHOSPasteDataGetPrimaryMimeType(int64_t id)
361 {
362     LOGI("[PasteData] FfiOHOSPasteDataGetPrimaryMimeType start");
363     RetDataCString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = nullptr };
364     auto instance = FFIData::GetData<PasteDataImpl>(id);
365     if (!instance) {
366         LOGE("[PasteData] GetPrimaryMimeType: instance not exist %{public}" PRId64, id);
367         return ret;
368     }
369 
370     auto pasteData = instance->GetRealPasteData();
371     if (pasteData == nullptr) {
372         LOGE("[PasteData] GetPrimaryMimeType: pasteData not exist");
373         return ret;
374     }
375 
376     std::shared_ptr<std::string> mimeType = pasteData->GetPrimaryMimeType();
377     if (mimeType != nullptr) {
378         ret.data = PasteBoardMallocCString(*mimeType);
379         if (ret.data == nullptr) {
380             ret.code = ERR_CODE_PARAM_INVALID;
381             return ret;
382         }
383     }
384     ret.code = SUCCESS_CODE;
385     LOGI("[PasteData] FfiOHOSPasteDataGetPrimaryMimeType success");
386 
387     return ret;
388 }
389 
VectorToCArrString(std::vector<std::string> & vec)390 static char **VectorToCArrString(std::vector<std::string> &vec)
391 {
392     char **result = new char *[vec.size()];
393     if (result == nullptr) {
394         return nullptr;
395     }
396     size_t temp = 0;
397     for (size_t i = 0; i < vec.size(); i++) {
398         result[i] = new char[vec[i].length() + 1];
399         if (result[i] == nullptr) {
400             break;
401         }
402         if (strcpy_s(result[i], vec[i].length() + 1, vec[i].c_str()) != 0) {
403             delete[] result[i];
404             result[i] = nullptr;
405             break;
406         }
407         temp++;
408     }
409     if (temp != vec.size()) {
410         for (size_t j = temp; j > 0; j--) {
411             delete[] result[j - 1];
412             result[j - 1] = nullptr;
413         }
414         delete[] result;
415         return nullptr;
416     }
417     return result;
418 }
419 
FfiOHOSPasteDataGetProperty(int64_t id,CPasteDataProperty * retPtr)420 int32_t FfiOHOSPasteDataGetProperty(int64_t id, CPasteDataProperty *retPtr)
421 {
422     LOGI("[PasteData] FfiOHOSPasteDataGetProperty start");
423     auto instance = FFIData::GetData<PasteDataImpl>(id);
424     if (!instance) {
425         LOGE("[PasteData] GetProperty: instance not exist %{public}" PRId64, id);
426         return ERR_INVALID_INSTANCE_CODE;
427     }
428 
429     auto pasteData = instance->GetRealPasteData();
430     if (pasteData == nullptr) {
431         LOGE("[PasteData] GetProperty: pasteData not exist");
432         return ERR_INVALID_INSTANCE_CODE;
433     }
434     PasteDataProperty property = pasteData->GetProperty();
435     PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(retPtr != nullptr, ERR_CODE_PARAM_INVALID,
436         PASTEBOARD_MODULE_SERVICE, "retPtr is null");
437     retPtr->tag = PasteBoardMallocCString(property.tag);
438     if (retPtr->tag == nullptr) {
439         return ERR_CODE_PARAM_INVALID;
440     }
441     retPtr->mimeTypes.head = VectorToCArrString(property.mimeTypes);
442     if (retPtr->mimeTypes.head == nullptr) {
443         free(retPtr->tag);
444         retPtr->tag = nullptr;
445         return ERR_CODE_PARAM_INVALID;
446     }
447     retPtr->mimeTypes.size = static_cast<int64_t>(property.mimeTypes.size());
448     retPtr->timestamp = property.timestamp;
449     retPtr->localOnly = property.localOnly;
450     retPtr->shareOption = property.shareOption;
451     LOGI("[PasteData] FfiOHOSPasteDataGetProperty success");
452 
453     return SUCCESS_CODE;
454 }
455 
CArrStringToVector(CArrString src)456 static std::vector<std::string> CArrStringToVector(CArrString src)
457 {
458     LOGI("CArrStringToVector start");
459     std::vector<std::string> res;
460     for (int64_t i = 0; i < src.size; i++) {
461         res.push_back(std::string(src.head[i]));
462     }
463     LOGI("CArrStringToVector end");
464     return res;
465 }
466 
FfiOHOSPasteDataSetProperty(int64_t id,CArrString mimeTypes,const char * tag,int64_t timestamp,bool localOnly,int32_t shareOption)467 int32_t FfiOHOSPasteDataSetProperty(
468     int64_t id, CArrString mimeTypes, const char *tag, int64_t timestamp, bool localOnly, int32_t shareOption)
469 {
470     LOGI("[PasteData] FfiOHOSPasteDataSetProperty start");
471     auto instance = FFIData::GetData<PasteDataImpl>(id);
472     if (!instance) {
473         LOGE("[PasteData] SetProperty: instance not exist %{public}" PRId64, id);
474         return ERR_INVALID_INSTANCE_CODE;
475     }
476     PasteDataProperty property;
477     property.mimeTypes = CArrStringToVector(mimeTypes);
478     property.tag = tag;
479     property.timestamp = timestamp;
480     property.localOnly = localOnly;
481     property.shareOption = static_cast<ShareOption>(shareOption);
482 
483     auto pasteData = instance->GetRealPasteData();
484     if (pasteData == nullptr) {
485         LOGE("[PasteData] SetProperty: pasteData not exist");
486         return ERR_INVALID_INSTANCE_CODE;
487     }
488 
489     pasteData->SetProperty(property);
490     LOGI("[PasteData] FfiOHOSPasteDataSetProperty success");
491 
492     return SUCCESS_CODE;
493 }
494 
FfiOHOSPasteDataGetTag(int64_t id)495 RetDataCString FfiOHOSPasteDataGetTag(int64_t id)
496 {
497     LOGI("[PasteData] FfiOHOSPasteDataGetTag start");
498     RetDataCString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = nullptr };
499     auto instance = FFIData::GetData<PasteDataImpl>(id);
500     if (!instance) {
501         LOGE("[PasteData] GetTag: instance not exist %{public}" PRId64, id);
502         return ret;
503     }
504 
505     auto pasteData = instance->GetRealPasteData();
506     if (pasteData == nullptr) {
507         LOGE("[PasteData] GetTag: pasteData not exist");
508         return ret;
509     }
510 
511     std::string tag = pasteData->GetTag();
512     if (!tag.empty()) {
513         ret.data = PasteBoardMallocCString(tag);
514         if (ret.data == nullptr) {
515             ret.code = ERR_CODE_PARAM_INVALID;
516             return ret;
517         }
518     }
519     ret.code = SUCCESS_CODE;
520     LOGI("[PasteData] FfiOHOSPasteDataGetTag success");
521 
522     return ret;
523 }
524 
FfiOHOSPasteDataHasType(int64_t id,const char * mimeTypes)525 RetDataBool FfiOHOSPasteDataHasType(int64_t id, const char *mimeTypes)
526 {
527     LOGI("[PasteData] FfiOHOSPasteDataHasType start");
528     RetDataBool ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = false };
529     auto instance = FFIData::GetData<PasteDataImpl>(id);
530     if (!instance) {
531         LOGE("[PasteData] HasType: instance not exist %{public}" PRId64, id);
532         return ret;
533     }
534 
535     std::string types = mimeTypes;
536 
537     auto pasteData = instance->GetRealPasteData();
538     if (pasteData == nullptr) {
539         LOGE("[PasteData] HasType: pasteData not exist");
540         return ret;
541     }
542 
543     ret.data = pasteData->HasMimeType(types);
544     ret.code = SUCCESS_CODE;
545     LOGI("[PasteData] FfiOHOSPasteDataHasType success");
546 
547     return ret;
548 }
549 
FfiOHOSPasteDataAddRecord(int64_t id,int64_t recordId)550 int32_t FfiOHOSPasteDataAddRecord(int64_t id, int64_t recordId)
551 {
552     LOGI("[PasteData] FfiOHOSPasteDataAddRecord start");
553     auto instance = FFIData::GetData<PasteDataImpl>(id);
554     if (!instance) {
555         LOGE("[PasteData] AddRecord: instance not exist %{public}" PRId64, id);
556         return ERR_INVALID_INSTANCE_CODE;
557     }
558 
559     PasteDataRecord rec;
560     auto recordInstance = FFIData::GetData<PasteDataRecordImpl>(recordId);
561     if (!recordInstance) {
562         LOGE("[PasteData] AddRecord: instance not exist %{public}" PRId64, recordId);
563         return ERR_INVALID_INSTANCE_CODE;
564     }
565 
566     auto pasteData = instance->GetRealPasteData();
567     if (pasteData == nullptr) {
568         LOGE("[PasteData] AddRecord: pasteData not exist");
569         return ERR_INVALID_INSTANCE_CODE;
570     }
571 
572     pasteData->AddRecord(recordInstance->GetRealPasteDataRecord());
573     LOGI("[PasteData] FfiOHOSPasteDataAddRecord success");
574 
575     return SUCCESS_CODE;
576 }
577 
FfiOHOSPasteDataAddMimeTypeRecord(int64_t id,const char * mimeType,const char * value)578 int32_t FfiOHOSPasteDataAddMimeTypeRecord(int64_t id, const char *mimeType, const char *value)
579 {
580     LOGI("[PasteData] FfiOHOSPasteDataAddMimeTypeRecord start");
581     auto instance = FFIData::GetData<PasteDataImpl>(id);
582     if (!instance) {
583         LOGE("[PasteData] AddMimeTypeRecord: instance not exist %{public}" PRId64, id);
584         return ERR_INVALID_INSTANCE_CODE;
585     }
586 
587     std::string types = mimeType;
588     std::string realValue = value;
589 
590     auto pasteData = instance->GetRealPasteData();
591     if (pasteData == nullptr) {
592         LOGE("[PasteData] AddMimeTypeRecord: pasteData not exist");
593         return ERR_INVALID_INSTANCE_CODE;
594     }
595 
596     if (types == MIMETYPE_TEXT_HTML) {
597         pasteData->AddHtmlRecord(realValue);
598     } else if (types == MIMETYPE_TEXT_PLAIN) {
599         pasteData->AddTextRecord(realValue);
600     } else {
601         pasteData->AddUriRecord(OHOS::Uri(realValue));
602     }
603     LOGI("[PasteData] FfiOHOSPasteDataAddMimeTypeRecord success");
604 
605     return SUCCESS_CODE;
606 }
607 
FfiOHOSPasteDataAddPixelMapRecord(int64_t id,const char * mimeType,int64_t pixelMapId)608 int32_t FfiOHOSPasteDataAddPixelMapRecord(int64_t id, const char *mimeType, int64_t pixelMapId)
609 {
610     LOGI("[PasteData] FfiOHOSPasteDataAddPixelMapRecord start");
611     auto instance = FFIData::GetData<PasteDataImpl>(id);
612     if (!instance) {
613         LOGE("[PasteData] AddPixelMapRecord: instance not exist %{public}" PRId64, id);
614         return ERR_INVALID_INSTANCE_CODE;
615     }
616     auto pixelMapImpl = FFIData::GetData<PixelMapImpl>(pixelMapId);
617     if (pixelMapImpl == nullptr) {
618         return ERR_INVALID_INSTANCE_CODE;
619     }
620 
621     auto pixelMap = pixelMapImpl->GetRealPixelMap();
622     if (pixelMap == nullptr) {
623         LOGE("[PasteData] AddPixelMapRecord: PixelMap not exist");
624         return ERR_INVALID_INSTANCE_CODE;
625     }
626 
627     auto pasteData = instance->GetRealPasteData();
628     if (pasteData == nullptr) {
629         LOGE("[PasteData] AddPixelMapRecord: pasteData not exist");
630         return ERR_INVALID_INSTANCE_CODE;
631     }
632 
633     pasteData->AddPixelMapRecord(pixelMap);
634     LOGI("[PasteData] FfiOHOSPasteDataAddPixelMapRecord success");
635 
636     return SUCCESS_CODE;
637 }
638 
FfiOHOSPasteDataAddArrayRecord(int64_t id,const char * mimeType,uint8_t * buffPtr,int64_t bufferSize)639 int32_t FfiOHOSPasteDataAddArrayRecord(int64_t id, const char *mimeType, uint8_t *buffPtr, int64_t bufferSize)
640 {
641     LOGI("[PasteData] FfiOHOSPasteDataAddArrayRecord start");
642     auto instance = FFIData::GetData<PasteDataImpl>(id);
643     if (!instance) {
644         LOGE("[PasteData] AddArrayRecord: instance not exist %{public}" PRId64, id);
645         return ERR_INVALID_INSTANCE_CODE;
646     }
647 
648     std::string types = mimeType;
649     void *data = buffPtr;
650     size_t dataLen = static_cast<size_t>(bufferSize);
651 
652     auto pasteData = instance->GetRealPasteData();
653     if (pasteData == nullptr) {
654         LOGE("[PasteData] AddArrayRecord: pasteData not exist");
655         return ERR_INVALID_INSTANCE_CODE;
656     }
657 
658     pasteData->AddKvRecord(
659         types, std::vector<uint8_t>(reinterpret_cast<uint8_t *>(data), reinterpret_cast<uint8_t *>(data) + dataLen));
660     LOGI("[PasteData] FfiOHOSPasteDataAddArrayRecord success");
661 
662     return SUCCESS_CODE;
663 }
664 
FfiOHOSPasteDataGetMimeTypes(int64_t id)665 RetDataCArrString FfiOHOSPasteDataGetMimeTypes(int64_t id)
666 {
667     LOGI("[PasteData] FfiOHOSPasteDataAddArrayRecord start");
668     RetDataCArrString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = { .head = nullptr, .size = 0 } };
669     auto instance = FFIData::GetData<PasteDataImpl>(id);
670     if (!instance) {
671         LOGE("[PasteData] GetMimeTypes: instance not exist %{public}" PRId64, id);
672         return ret;
673     }
674 
675     auto pasteData = instance->GetRealPasteData();
676     if (pasteData == nullptr) {
677         LOGE("[PasteData] GetMimeTypes: pasteData not exist");
678         return ret;
679     }
680 
681     std::vector<std::string> mimeTypes = pasteData->GetMimeTypes();
682     ret.data.head = VectorToCArrString(mimeTypes);
683     if (ret.data.head == nullptr) {
684         ret.code = ERR_CODE_PARAM_INVALID;
685         return ret;
686     }
687     ret.data.size = static_cast<int64_t>(mimeTypes.size());
688     ret.code = SUCCESS_CODE;
689     LOGI("[PasteData] FfiOHOSPasteDataGetMimeTypes success");
690 
691     return ret;
692 }
693 
FfiOHOSPasteDataGetRecord(int64_t id,int32_t index,CPasteDataRecord * retPtr)694 RetDataI64 FfiOHOSPasteDataGetRecord(int64_t id, int32_t index, CPasteDataRecord *retPtr)
695 {
696     LOGI("[PasteData] FfiOHOSPasteDataGetRecord start");
697     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
698     auto instance = FFIData::GetData<PasteDataImpl>(id);
699     if (!instance) {
700         LOGE("[PasteData] GetRecord: instance not exist %{public}" PRId64, id);
701         return ret;
702     }
703 
704     auto pasteData = instance->GetRealPasteData();
705     if (pasteData == nullptr) {
706         LOGE("[PasteData] GetRecord: pasteData not exist");
707         return ret;
708     }
709 
710     if ((std::size_t)index >= pasteData->GetRecordCount()) {
711         LOGI("[PasteData] FfiOHOSPasteDataRemoveRecord index out of range.");
712         ret.code = OUT_OF_RANGE;
713         return ret;
714     }
715     std::shared_ptr<PasteDataRecord> record = pasteData->GetRecordAt((std::size_t)index);
716     if (record == nullptr) {
717         LOGE("[PasteData] FfiOHOSPasteDataRemoveRecord index out of range.");
718         ret.code = OUT_OF_RANGE;
719         return ret;
720     }
721 
722     FillCPasteDataRecord(retPtr, record);
723     auto existedRecordImpl = getCjPasteDataRecordImpl(record);
724     if (existedRecordImpl != nullptr) {
725         ret.data = existedRecordImpl->GetID();
726     } else {
727         auto pasteDataRecordImpl = FFI::FFIData::Create<PasteDataRecordImpl>(record);
728         if (!pasteDataRecordImpl) {
729             return ret;
730         }
731         ret.data = pasteDataRecordImpl->GetID();
732     }
733     ret.code = SUCCESS_CODE;
734     LOGI("[PasteData] FfiOHOSPasteDataGetRecord success");
735 
736     return ret;
737 }
738 
FfiOHOSPasteDataGetRecordCount(int64_t id)739 RetDataUI FfiOHOSPasteDataGetRecordCount(int64_t id)
740 {
741     LOGI("[PasteData] FfiOHOSPasteDataGetRecordCount start");
742     RetDataUI ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
743     auto instance = FFIData::GetData<PasteDataImpl>(id);
744     if (!instance) {
745         LOGE("[PasteData] GetRecordCount: instance not exist %{public}" PRId64, id);
746         return ret;
747     }
748 
749     auto pasteData = instance->GetRealPasteData();
750     if (pasteData == nullptr) {
751         LOGE("[PasteData] GetRecordCount: pasteData not exist");
752         return ret;
753     }
754 
755     ret.data = pasteData->GetRecordCount();
756     ret.code = SUCCESS_CODE;
757     LOGI("[PasteData] FfiOHOSPasteDataGetRecordCount success");
758 
759     return ret;
760 }
761 
FfiOHOSPasteDataRemoveRecord(int64_t id,int32_t index)762 int32_t FfiOHOSPasteDataRemoveRecord(int64_t id, int32_t index)
763 {
764     LOGI("[PasteData] FfiOHOSPasteDataRemoveRecord start");
765     auto instance = FFIData::GetData<PasteDataImpl>(id);
766     if (!instance) {
767         LOGE("[PasteData] RemoveRecord: instance not exist %{public}" PRId64, id);
768         return ERR_INVALID_INSTANCE_CODE;
769     }
770 
771     auto pasteData = instance->GetRealPasteData();
772     if (pasteData == nullptr) {
773         LOGE("[PasteData] RemoveRecord: pasteData not exist");
774         return ERR_INVALID_INSTANCE_CODE;
775     }
776 
777     if ((std::size_t)index >= pasteData->GetRecordCount()) {
778         LOGI("[PasteData] FfiOHOSPasteDataRemoveRecord index out of range.");
779         return OUT_OF_RANGE;
780     }
781     std::shared_ptr<PasteDataRecord> recordImpl = pasteData->GetRecordAt((std::size_t)index);
782     if (recordImpl != nullptr) {
783         auto existedRecordImpl = getCjPasteDataRecordImpl(recordImpl);
784         if (existedRecordImpl != nullptr) {
785             FFIData::Release(existedRecordImpl->GetID());
786             removeCjPasteDataRecordImpl(recordImpl);
787         }
788         pasteData->RemoveRecordAt(index);
789     }
790 
791     LOGI("[PasteData] FfiOHOSPasteDataRemoveRecord success");
792 
793     return SUCCESS_CODE;
794 }
795 
FfiOHOSPasteDataReplaceRecord(int64_t id,int64_t recordId,int32_t index)796 int32_t FfiOHOSPasteDataReplaceRecord(int64_t id, int64_t recordId, int32_t index)
797 {
798     LOGI("[PasteData] FfiOHOSPasteDataReplaceRecord start");
799     auto instance = FFIData::GetData<PasteDataImpl>(id);
800     if (!instance) {
801         LOGE("[PasteData] ReplaceRecord: instance not exist %{public}" PRId64, id);
802         return ERR_INVALID_INSTANCE_CODE;
803     }
804 
805     auto recordInstance = FFIData::GetData<PasteDataRecordImpl>(recordId);
806     if (!recordInstance) {
807         LOGE("[PasteData] ReplaceRecord: instance not exist %{public}" PRId64, recordId);
808         return ERR_INVALID_INSTANCE_CODE;
809     }
810 
811     auto pasteData = instance->GetRealPasteData();
812     if (pasteData == nullptr) {
813         LOGE("[PasteData] ReplaceRecord: pasteData not exist");
814         return ERR_INVALID_INSTANCE_CODE;
815     }
816 
817     if ((std::size_t)index >= pasteData->GetRecordCount()) {
818         LOGI("[PasteData] FfiOHOSPasteDataReplaceRecord index out of range.");
819         return OUT_OF_RANGE;
820     }
821     std::shared_ptr<PasteDataRecord> oldRecord = pasteData->GetRecordAt((std::size_t)index);
822     if (oldRecord != nullptr) {
823         auto existedRecordImpl = getCjPasteDataRecordImpl(oldRecord);
824         if (existedRecordImpl != nullptr) {
825             FFIData::Release(existedRecordImpl->GetID());
826             removeCjPasteDataRecordImpl(oldRecord);
827         }
828     }
829 
830     std::shared_ptr<PasteDataRecord> newRecord = recordInstance->GetRealPasteDataRecord();
831     addCjPasteDataRecordImpl(newRecord, recordInstance);
832     pasteData->ReplaceRecordAt(index, newRecord);
833     LOGI("[PasteData] FfiOHOSPasteDataReplaceRecord success");
834 
835     return SUCCESS_CODE;
836 }
837 
FfiOHOSGetSystemPasteboard()838 RetDataI64 FfiOHOSGetSystemPasteboard()
839 {
840     RetDataI64 ret;
841     LOGI("[SystemPasteboard] FfiOHOSGetSystemPasteboard start");
842     ret.code = SystemPasteboardImpl::GetSystemPasteboardImpl(ret.data);
843     LOGI("[SystemPasteboard] FfiOHOSGetSystemPasteboard success");
844     return ret;
845 }
846 
FfiOHOSSystemPasteboardSetData(int64_t id,int64_t pasteDataId)847 int32_t FfiOHOSSystemPasteboardSetData(int64_t id, int64_t pasteDataId)
848 {
849     LOGI("[SystemPasteboard] FfiOHOSSystemPasteboardSetData start");
850     auto instance = FFIData::GetData<SystemPasteboardImpl>(id);
851     if (!instance) {
852         LOGE("[SystemPasteboard] SetData: instance not exist %{public}" PRId64, id);
853         return ERR_INVALID_INSTANCE_CODE;
854     }
855     auto pasteDataInstance = FFIData::GetData<PasteDataImpl>(pasteDataId);
856     if (!pasteDataInstance) {
857         LOGE("[SystemPasteboard] SetData: instance not exist %{public}" PRId64, pasteDataId);
858         return ERR_INVALID_INSTANCE_CODE;
859     }
860     auto ret = instance->SetData(pasteDataInstance, pasteDataInstance->GetRealPasteData());
861     if (ret == SUCCESS_CODE) {
862         LOGI("[PasteData] FfiOHOSSystemPasteboardSetData success");
863     }
864 
865     return SUCCESS_CODE;
866 }
867 
FfiOHOSSystemPasteboardGetData(int64_t id)868 RetDataI64 FfiOHOSSystemPasteboardGetData(int64_t id)
869 {
870     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
871     LOGI("[SystemPasteboard] FfiOHOSSystemPasteboardGetData start");
872     auto instance = FFIData::GetData<SystemPasteboardImpl>(id);
873     if (!instance) {
874         LOGE("[SystemPasteboard] GetData: instance not exist %{public}" PRId64, id);
875         return ret;
876     }
877     std::shared_ptr<MiscServices::PasteData> pasteData = std::make_shared<PasteData>();
878     int32_t res = instance->GetData(*pasteData);
879     if (res != static_cast<int32_t>(PasteboardError::E_OK)) {
880         ret.code = res;
881         return ret;
882     }
883     auto pasteDataImpl = FFIData::Create<PasteDataImpl>(pasteData);
884     if (!pasteDataImpl) {
885         return ret;
886     }
887     ret.data = pasteDataImpl->GetID();
888     ret.code = SUCCESS_CODE;
889     LOGI("[SystemPasteboard] FfiOHOSSystemPasteboardGetData success");
890     return ret;
891 }
892 
FfiOHOSSystemPasteboardHasData(int64_t id)893 RetDataBool FfiOHOSSystemPasteboardHasData(int64_t id)
894 {
895     RetDataBool ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = false };
896     LOGI("[SystemPasteboard] FfiOHOSSystemPasteboardHasData start");
897     auto instance = FFIData::GetData<SystemPasteboardImpl>(id);
898     if (!instance) {
899         LOGE("[SystemPasteboard] HasData: instance not exist %{public}" PRId64, id);
900         return ret;
901     }
902 
903     ret.data = instance->HasData();
904     ret.code = SUCCESS_CODE;
905     LOGI("[SystemPasteboard] FfiOHOSSystemPasteboardHasData success");
906     return ret;
907 }
908 
FfiOHOSSystemPasteboardClearData(int64_t id)909 FFI_EXPORT void FfiOHOSSystemPasteboardClearData(int64_t id)
910 {
911     LOGI("[SystemPasteboard] FfiOHOSSystemPasteboardClearData start");
912     auto instance = FFIData::GetData<SystemPasteboardImpl>(id);
913     if (!instance) {
914         LOGE("[SystemPasteboard] ClearData: instance not exist %{public}" PRId64, id);
915         return;
916     }
917     instance->ClearData();
918 
919     LOGI("[SystemPasteboard] FfiOHOSSystemPasteboardClearData success");
920 }
921 
FfiOHOSSystemPasteboardIsRemoteData(int64_t id)922 RetDataBool FfiOHOSSystemPasteboardIsRemoteData(int64_t id)
923 {
924     RetDataBool ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = false };
925     LOGI("[SystemPasteboard] FfiOHOSSystemPasteboardIsRemoteData start");
926     auto instance = FFIData::GetData<SystemPasteboardImpl>(id);
927     if (!instance) {
928         LOGE("[SystemPasteboard] IsRemoteData: instance not exist %{public}" PRId64, id);
929         return ret;
930     }
931 
932     ret.data = instance->IsRemoteData();
933     ret.code = SUCCESS_CODE;
934     LOGI("[SystemPasteboard] FfiOHOSSystemPasteboardIsRemoteData success");
935     return ret;
936 }
937 
FfiOHOSSystemPasteboardHasDataType(int64_t id,const char * mimeType)938 RetDataBool FfiOHOSSystemPasteboardHasDataType(int64_t id, const char *mimeType)
939 {
940     RetDataBool ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = false };
941     LOGI("[SystemPasteboard] FfiOHOSSystemPasteboardHasDataType start");
942     auto instance = FFIData::GetData<SystemPasteboardImpl>(id);
943     if (!instance) {
944         LOGE("[SystemPasteboard] HasDataType: instance not exist %{public}" PRId64, id);
945         return ret;
946     }
947 
948     std::string types = mimeType;
949     ret.data = instance->HasDataType(types);
950     ret.code = SUCCESS_CODE;
951     LOGI("[SystemPasteboard] FfiOHOSSystemPasteboardHasDataType success");
952     return ret;
953 }
954 
FfiOHOSSystemPasteboardGetDataSource(int64_t id)955 RetDataCString FfiOHOSSystemPasteboardGetDataSource(int64_t id)
956 {
957     LOGI("[PasteData] FfiOHOSSystemPasteboardGetDataSource start");
958     RetDataCString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = nullptr };
959     auto instance = FFIData::GetData<SystemPasteboardImpl>(id);
960     if (!instance) {
961         LOGE("[SystemPasteboard] GetDataSource: instance not exist %{public}" PRId64, id);
962         return ret;
963     }
964     std::string res = instance->GetDataSource();
965     ret.data = PasteBoardMallocCString(res);
966     if (ret.data == nullptr) {
967         ret.code = ERR_CODE_PARAM_INVALID;
968         return ret;
969     }
970     ret.code = SUCCESS_CODE;
971     LOGI("[PasteData] FfiOHOSSystemPasteboardGetDataSource success");
972 
973     return ret;
974 }
975 }
976 } // namespace CJSystemapi
977 } // namespace OHOS
978