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