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