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