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