• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021-2023 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 #include <cstddef>
16 
17 #include "napi_common_want.h"
18 #include "pasteboard_common.h"
19 #include "pasteboard_hilog.h"
20 #include "pasteboard_js_err.h"
21 #include "pasteboard_napi.h"
22 #include "pastedata_napi.h"
23 #include "pastedata_record_napi.h"
24 using namespace OHOS::MiscServices;
25 using namespace OHOS::Media;
26 
27 namespace OHOS {
28 namespace MiscServicesNapi {
29 namespace {
30 constexpr int ARGC_TYPE_SET0 = 0;
31 constexpr int ARGC_TYPE_SET1 = 1;
32 constexpr int ARGC_TYPE_SET2 = 2;
33 const int32_t STR_MAX_SIZE = 256;
34 constexpr int32_t MIMETYPE_MAX_SIZE = 1024;
35 constexpr int32_t MAX_TEXT_LEN = 20 * 1024 * 1024;
36 constexpr size_t STR_TAIL_LENGTH = 1;
37 } // namespace
38 static thread_local napi_ref g_pasteData = nullptr;
39 
PasteDataNapi()40 PasteDataNapi::PasteDataNapi() : env_(nullptr)
41 {
42     value_ = std::make_shared<PasteData>();
43 }
44 
~PasteDataNapi()45 PasteDataNapi::~PasteDataNapi()
46 {
47 }
48 
AddHtmlRecord(napi_env env,napi_callback_info info)49 napi_value PasteDataNapi::AddHtmlRecord(napi_env env, napi_callback_info info)
50 {
51     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "AddHtmlRecord is called!");
52     size_t argc = 1;
53     napi_value argv[1] = { 0 };
54     napi_value thisVar = nullptr;
55 
56     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
57     NAPI_ASSERT(env, argc > ARGC_TYPE_SET0, "Wrong number of arguments");
58 
59     std::string str;
60     bool ret = GetValue(env, argv[0], str);
61     if (!ret) {
62         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Failed to GetValue!");
63         return nullptr;
64     }
65 
66     PasteDataNapi *obj = nullptr;
67     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
68     if ((status != napi_ok) || (obj == nullptr)) {
69         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get AddHtmlRecord object failed");
70         return nullptr;
71     }
72     obj->value_->AddHtmlRecord(str);
73     return nullptr;
74 }
75 
AddPixelMapRecord(napi_env env,napi_callback_info info)76 napi_value PasteDataNapi::AddPixelMapRecord(napi_env env, napi_callback_info info)
77 {
78     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "AddPixelMapRecord is called begin!");
79     size_t argc = ARGC_TYPE_SET1;
80     napi_value argv[ARGC_TYPE_SET1] = { 0 };
81     napi_value thisVar = nullptr;
82 
83     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
84     NAPI_ASSERT(env, argc > ARGC_TYPE_SET0, "Wrong number of arguments");
85 
86     napi_valuetype valueType = napi_undefined;
87     NAPI_CALL(env, napi_typeof(env, argv[0], &valueType));
88     NAPI_ASSERT(env, valueType == napi_object, "Wrong argument type. Object expected.");
89 
90     std::shared_ptr<PixelMap> pixelMap = PixelMapNapi::GetPixelMap(env, argv[0]);
91     if (pixelMap == nullptr) {
92         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Failed to GetPixelMap!");
93         return nullptr;
94     }
95 
96     PasteDataNapi *obj = nullptr;
97     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
98     if ((status != napi_ok) || (obj == nullptr)) {
99         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "unwrap failed");
100         return nullptr;
101     }
102     obj->value_->AddPixelMapRecord(pixelMap);
103     return nullptr;
104 }
105 
AddTextRecord(napi_env env,napi_callback_info info)106 napi_value PasteDataNapi::AddTextRecord(napi_env env, napi_callback_info info)
107 {
108     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "AddTextRecord is called!");
109     size_t argc = 1;
110     napi_value argv[1] = { 0 };
111     napi_value thisVar = nullptr;
112 
113     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
114     NAPI_ASSERT(env, argc > ARGC_TYPE_SET0, "Wrong number of arguments");
115 
116     std::string str;
117     bool ret = GetValue(env, argv[0], str);
118     if (!ret) {
119         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Failed to GetValue!");
120         return nullptr;
121     }
122 
123     PasteDataNapi *obj = nullptr;
124     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
125     if ((status != napi_ok) || (obj == nullptr)) {
126         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get AddTextRecord object failed");
127         return nullptr;
128     }
129     obj->value_->AddTextRecord(str);
130     return nullptr;
131 }
132 
AddUriRecord(napi_env env,napi_callback_info info)133 napi_value PasteDataNapi::AddUriRecord(napi_env env, napi_callback_info info)
134 {
135     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "AddUriRecord is called!");
136     size_t argc = 1;
137     napi_value argv[1] = { 0 };
138     napi_value thisVar = nullptr;
139 
140     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
141     NAPI_ASSERT(env, argc > ARGC_TYPE_SET0, "Wrong number of arguments");
142 
143     std::string str;
144     bool ret = GetValue(env, argv[0], str);
145     if (!ret) {
146         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Failed to GetValue!");
147         return nullptr;
148     }
149 
150     PasteDataNapi *obj = nullptr;
151     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
152     if ((status != napi_ok) || (obj == nullptr)) {
153         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get AddUriRecord object failed");
154         return nullptr;
155     }
156     obj->value_->AddUriRecord(OHOS::Uri(str));
157     return nullptr;
158 }
159 
GetPrimaryHtml(napi_env env,napi_callback_info info)160 napi_value PasteDataNapi::GetPrimaryHtml(napi_env env, napi_callback_info info)
161 {
162     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "GetPrimaryHtml is called!");
163     size_t argc = 1;
164     napi_value argv[1] = { 0 };
165     napi_value thisVar = nullptr;
166 
167     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
168     NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
169 
170     PasteDataNapi *obj = nullptr;
171     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
172     if ((status != napi_ok) || (obj == nullptr)) {
173         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetPrimaryHtml object failed");
174         return nullptr;
175     }
176 
177     std::shared_ptr<std::string> p = obj->value_->GetPrimaryHtml();
178     if (p == nullptr) {
179         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetPrimaryHtml failed");
180         return nullptr;
181     }
182 
183     napi_value result = nullptr;
184     napi_create_string_utf8(env, p->c_str(), NAPI_AUTO_LENGTH, &result);
185     return result;
186 }
187 
GetPrimaryPixelMap(napi_env env,napi_callback_info info)188 napi_value PasteDataNapi::GetPrimaryPixelMap(napi_env env, napi_callback_info info)
189 {
190     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "GetPrimaryPixelMap is called!");
191     size_t argc = ARGC_TYPE_SET1;
192     napi_value argv[ARGC_TYPE_SET1] = { 0 };
193     napi_value thisVar = nullptr;
194 
195     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
196     NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
197 
198     PasteDataNapi *obj = nullptr;
199     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
200     if ((status != napi_ok) || (obj == nullptr)) {
201         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "unwrap failed");
202         return nullptr;
203     }
204 
205     std::shared_ptr<PixelMap> pixelMap = obj->value_->GetPrimaryPixelMap();
206     if (!pixelMap) {
207         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "pixelMap is nullptr");
208         return nullptr;
209     }
210 
211     napi_value jsPixelMap = PixelMapNapi::CreatePixelMap(env, pixelMap);
212     return jsPixelMap;
213 }
214 
GetPrimaryText(napi_env env,napi_callback_info info)215 napi_value PasteDataNapi::GetPrimaryText(napi_env env, napi_callback_info info)
216 {
217     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "GetPrimaryText is called!");
218     size_t argc = 1;
219     napi_value argv[1] = { 0 };
220     napi_value thisVar = nullptr;
221 
222     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
223     NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
224 
225     PasteDataNapi *obj = nullptr;
226     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
227     if ((status != napi_ok) || (obj == nullptr)) {
228         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetPrimaryText object failed");
229         return nullptr;
230     }
231 
232     std::shared_ptr<std::string> p = obj->value_->GetPrimaryText();
233     if (p == nullptr) {
234         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetPrimaryText failed");
235         return nullptr;
236     }
237 
238     napi_value result = nullptr;
239     napi_create_string_utf8(env, p->c_str(), NAPI_AUTO_LENGTH, &result);
240     return result;
241 }
242 
GetPrimaryUri(napi_env env,napi_callback_info info)243 napi_value PasteDataNapi::GetPrimaryUri(napi_env env, napi_callback_info info)
244 {
245     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "GetPrimaryUri is called!");
246     size_t argc = 1;
247     napi_value argv[1] = { 0 };
248     napi_value thisVar = nullptr;
249 
250     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
251     NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
252 
253     PasteDataNapi *obj = nullptr;
254     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
255     if ((status != napi_ok) || (obj == nullptr)) {
256         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetPrimaryUri object failed");
257         return nullptr;
258     }
259 
260     std::shared_ptr<OHOS::Uri> p = obj->value_->GetPrimaryUri();
261     if (p == nullptr) {
262         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetPrimaryUri failed");
263         return nullptr;
264     }
265 
266     std::string text = p->ToString();
267     napi_value result = nullptr;
268     napi_create_string_utf8(env, text.c_str(), NAPI_AUTO_LENGTH, &result);
269     return result;
270 }
271 
HasMimeType(napi_env env,napi_callback_info info)272 napi_value PasteDataNapi::HasMimeType(napi_env env, napi_callback_info info)
273 {
274     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "HasMimeType is called!");
275     size_t argc = 1;
276     napi_value argv[1] = { 0 };
277     napi_value thisVar = nullptr;
278 
279     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
280     if ((!CheckExpression(env, argc > ARGC_TYPE_SET0, JSErrorCode::INVALID_PARAMETERS,
281         "Parameter error. The number of arguments must be greater than zero.")) ||
282         (!CheckArgsType(env, argv[0], napi_string, "Parameter error. The type of mimeType must be string."))) {
283         return nullptr;
284     }
285 
286     std::string mimeType;
287     if (!GetValue(env, argv[0], mimeType)) {
288         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Failed to GetValue!");
289         return nullptr;
290     }
291 
292     PasteDataNapi *obj = nullptr;
293     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
294     if ((status != napi_ok) || (obj == nullptr)) {
295         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get AddHtmlRecord object failed");
296         return nullptr;
297     }
298 
299     bool ret = obj->value_->HasMimeType(mimeType);
300     napi_value result = nullptr;
301     napi_get_boolean(env, ret, &result);
302     return result;
303 }
304 
HasType(napi_env env,napi_callback_info info)305 napi_value PasteDataNapi::HasType(napi_env env, napi_callback_info info)
306 {
307     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "HasType is called!");
308     return HasMimeType(env, info);
309 }
310 
RemoveAndGetRecordCommon(napi_env env,napi_callback_info info,uint32_t & index)311 PasteDataNapi *PasteDataNapi::RemoveAndGetRecordCommon(napi_env env, napi_callback_info info, uint32_t &index)
312 {
313     size_t argc = 1;
314     napi_value argv[1] = { 0 };
315     napi_value thisVar = nullptr;
316     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
317 
318     if ((!CheckExpression(env, argc > ARGC_TYPE_SET0, JSErrorCode::INVALID_PARAMETERS,
319         "Parameter error. The number of arguments must be greater than zero.")) ||
320         (!CheckArgsType(env, argv[0], napi_number, "Parameter error. The type of mimeType must be number."))) {
321         return nullptr;
322     }
323     PasteDataNapi *obj = nullptr;
324     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
325     if ((status != napi_ok) || (obj == nullptr)) {
326         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get RemoveRecord object failed");
327         return nullptr;
328     }
329     NAPI_CALL(env, napi_get_value_uint32(env, argv[0], &index));
330     return obj;
331 }
332 
RemoveRecordAt(napi_env env,napi_callback_info info)333 napi_value PasteDataNapi::RemoveRecordAt(napi_env env, napi_callback_info info)
334 {
335     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "RemoveRecordAt is called!");
336     uint32_t index = 0;
337     PasteDataNapi *obj = RemoveAndGetRecordCommon(env, info, index);
338     if (obj == nullptr) {
339         return nullptr;
340     }
341     bool ret = obj->value_->RemoveRecordAt(index);
342     napi_value result = nullptr;
343     napi_get_boolean(env, ret, &result);
344     return result;
345 }
346 
RemoveRecord(napi_env env,napi_callback_info info)347 napi_value PasteDataNapi::RemoveRecord(napi_env env, napi_callback_info info)
348 {
349     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "RemoveRecord is called!");
350     uint32_t index = 0;
351     PasteDataNapi *obj = RemoveAndGetRecordCommon(env, info, index);
352     if (obj == nullptr || !CheckExpression(env, index < obj->value_->GetRecordCount(),
353         JSErrorCode::OUT_OF_RANGE, "index out of range.")) {
354         return nullptr;
355     }
356     obj->value_->RemoveRecordAt(index);
357     return nullptr;
358 }
359 
GetPrimaryMimeType(napi_env env,napi_callback_info info)360 napi_value PasteDataNapi::GetPrimaryMimeType(napi_env env, napi_callback_info info)
361 {
362     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "GetPrimaryMimeType is called!");
363     size_t argc = 1;
364     napi_value argv[1] = { 0 };
365     napi_value thisVar = nullptr;
366 
367     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
368     NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
369 
370     PasteDataNapi *obj = nullptr;
371     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
372     if ((status != napi_ok) || (obj == nullptr)) {
373         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetPrimaryMimeType object failed");
374         return nullptr;
375     }
376     std::shared_ptr<std::string> mimeType = obj->value_->GetPrimaryMimeType();
377     if (mimeType == nullptr) {
378         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetPrimaryMimeType failed");
379         return nullptr;
380     }
381     napi_value result = nullptr;
382     napi_create_string_utf8(env, mimeType->c_str(), NAPI_AUTO_LENGTH, &result);
383 
384     return result;
385 }
386 
GetRecordCount(napi_env env,napi_callback_info info)387 napi_value PasteDataNapi::GetRecordCount(napi_env env, napi_callback_info info)
388 {
389     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "GetRecordCount is called!");
390     size_t argc = 1;
391     napi_value argv[1] = { 0 };
392     napi_value thisVar = nullptr;
393 
394     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
395     NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
396 
397     PasteDataNapi *obj = nullptr;
398     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
399     if ((status != napi_ok) || (obj == nullptr)) {
400         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetRecordCount object failed");
401         return nullptr;
402     }
403 
404     size_t count = obj->value_->GetRecordCount();
405     napi_value result = nullptr;
406     napi_create_int64(env, count, &result);
407 
408     return result;
409 }
410 
GetTag(napi_env env,napi_callback_info info)411 napi_value PasteDataNapi::GetTag(napi_env env, napi_callback_info info)
412 {
413     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "GetTag is called!");
414     size_t argc = 1;
415     napi_value argv[1] = { 0 };
416     napi_value thisVar = nullptr;
417 
418     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
419     NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
420 
421     PasteDataNapi *obj = nullptr;
422     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
423     if ((status != napi_ok) || (obj == nullptr)) {
424         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetTag object failed");
425         return nullptr;
426     }
427     std::string tag = obj->value_->GetTag();
428     napi_value result = nullptr;
429     napi_create_string_utf8(env, tag.c_str(), NAPI_AUTO_LENGTH, &result);
430 
431     return result;
432 }
433 
GetMimeTypes(napi_env env,napi_callback_info info)434 napi_value PasteDataNapi::GetMimeTypes(napi_env env, napi_callback_info info)
435 {
436     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "GetMimeTypes is called!");
437     size_t argc = 1;
438     napi_value argv[1] = { 0 };
439     napi_value thisVar = nullptr;
440 
441     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
442     NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
443 
444     PasteDataNapi *obj = nullptr;
445     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
446     if ((status != napi_ok) || (obj == nullptr)) {
447         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetMimeTypes object failed");
448         return nullptr;
449     }
450     std::vector<std::string> mimeTypes = obj->value_->GetMimeTypes();
451     if (mimeTypes.size() == 0) {
452         return nullptr;
453     }
454 
455     napi_value nMimeTypes = nullptr;
456     if (napi_create_array(env, &nMimeTypes) != napi_ok) {
457         return nullptr;
458     }
459     size_t index = 0;
460     napi_value value = nullptr;
461     for (auto type : mimeTypes) {
462         napi_create_string_utf8(env, type.c_str(), NAPI_AUTO_LENGTH, &value);
463         napi_set_element(env, nMimeTypes, index, value);
464         index++;
465     }
466     return nMimeTypes;
467 }
468 
AddRecord(napi_env env,napi_value * argv,size_t argc,PasteDataNapi * obj)469 void PasteDataNapi::AddRecord(napi_env env, napi_value *argv, size_t argc, PasteDataNapi *obj)
470 {
471     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "AddRecordV9!");
472     std::string mimeType;
473     if (!CheckArgs(env, argv, argc, mimeType)) {
474         return;
475     }
476     bool isArrayBuffer = false;
477     NAPI_CALL_RETURN_VOID(env, napi_is_arraybuffer(env, argv[1], &isArrayBuffer));
478     if (isArrayBuffer) {
479         void *data = nullptr;
480         size_t dataLen = 0;
481         NAPI_CALL_RETURN_VOID(env, napi_get_arraybuffer_info(env, argv[1], &data, &dataLen));
482         obj->value_->AddKvRecord(mimeType,
483             std::vector<uint8_t>(reinterpret_cast<uint8_t *>(data), reinterpret_cast<uint8_t *>(data) + dataLen));
484         return;
485     }
486     if (mimeType == MIMETYPE_PIXELMAP) {
487         std::shared_ptr<PixelMap> pixelMap = PixelMapNapi::GetPixelMap(env, argv[1]);
488         obj->value_->AddPixelMapRecord(pixelMap);
489         return;
490     } else if (mimeType == MIMETYPE_TEXT_WANT) {
491         OHOS::AAFwk::Want want;
492         AppExecFwk::UnwrapWant(env, argv[1], want);
493         obj->value_->AddWantRecord(std::make_shared<OHOS::AAFwk::Want>(want));
494         return;
495     }
496 
497     std::string str;
498     bool ret = GetValue(env, argv[1], str);
499     if (!ret) {
500         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Failed to GetValue!");
501         return;
502     }
503     if (mimeType == MIMETYPE_TEXT_HTML) {
504         obj->value_->AddHtmlRecord(str);
505     } else if (mimeType == MIMETYPE_TEXT_PLAIN) {
506         obj->value_->AddTextRecord(str);
507     } else {
508         obj->value_->AddUriRecord(OHOS::Uri(str));
509     }
510 }
511 
SetStringProp(napi_env env,const std::string & propName,napi_value & propValueNapi,PasteDataRecord::Builder & builder)512 bool PasteDataNapi::SetStringProp(
513     napi_env env, const std::string &propName, napi_value &propValueNapi, PasteDataRecord::Builder &builder)
514 {
515     std::string propValue;
516     bool ret = GetValue(env, propValueNapi, propValue);
517     if (!ret) {
518         return false;
519     }
520     if ((propName == "mimeType") && (propValue.size() <= MIMETYPE_MAX_SIZE)) {
521         builder.SetMimeType(propValue);
522     } else if ((propName == "htmlText") && (propValue.size() <= MAX_TEXT_LEN)) {
523         builder.SetHtmlText(std::make_shared<std::string>(propValue));
524     } else if ((propName == "plainText") && (propValue.size() <= MAX_TEXT_LEN)) {
525         builder.SetPlainText(std::make_shared<std::string>(propValue));
526     } else if (propName == "uri") {
527         builder.SetUri(std::make_shared<OHOS::Uri>(Uri(propValue)));
528     } else {
529         return false;
530     }
531     return true;
532 }
533 
ParseRecord(napi_env env,napi_value & recordNapi)534 std::shared_ptr<MiscServices::PasteDataRecord> PasteDataNapi::ParseRecord(napi_env env, napi_value &recordNapi)
535 {
536     napi_value propNames = nullptr;
537     NAPI_CALL(env, napi_get_property_names(env, recordNapi, &propNames));
538     uint32_t propNameNums = 0;
539     NAPI_CALL(env, napi_get_array_length(env, propNames, &propNameNums));
540     PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "propNameNums = %{public}d", propNameNums);
541     PasteDataRecord::Builder builder("");
542     for (uint32_t i = 0; i < propNameNums; i++) {
543         napi_value propNameNapi = nullptr;
544         NAPI_CALL(env, napi_get_element(env, propNames, i, &propNameNapi));
545         size_t len = 0;
546         char str[STR_MAX_SIZE] = { 0 };
547         NAPI_CALL(env, napi_get_value_string_utf8(env, propNameNapi, str, STR_MAX_SIZE - STR_TAIL_LENGTH, &len));
548         napi_value propValueNapi = nullptr;
549         NAPI_CALL(env, napi_get_named_property(env, recordNapi, str, &propValueNapi));
550         std::string propName = str;
551         PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "propName = %{public}s,", propName.c_str());
552 
553         if (propName == "mimeType" || propName == "htmlText" || propName == "plainText" || propName == "uri") {
554             if (!SetStringProp(env, propName, propValueNapi, builder)) {
555                 return nullptr;
556             }
557         } else if (propName == "want") {
558             AAFwk::Want want;
559             if (OHOS::AppExecFwk::UnwrapWant(env, propValueNapi, want) != true) {
560                 return nullptr;
561             }
562             builder.SetWant(std::make_shared<AAFwk::Want>(want));
563         } else if (propName == "pixelMap") {
564             std::shared_ptr<PixelMap> pixelMap = PixelMapNapi::GetPixelMap(env, propValueNapi);
565             if (pixelMap == nullptr) {
566                 return nullptr;
567             }
568             builder.SetPixelMap(pixelMap);
569         } else if (propName == "data") {
570             std::shared_ptr<MineCustomData> customData = PasteDataRecordNapi::GetNativeKvData(env, propValueNapi);
571             if (customData == nullptr) {
572                 return nullptr;
573             }
574             builder.SetCustomData(customData);
575         }
576     }
577     return builder.Build();
578 }
579 
AddRecord(napi_env env,napi_value argv,PasteDataNapi * obj)580 void PasteDataNapi::AddRecord(napi_env env, napi_value argv, PasteDataNapi *obj)
581 {
582     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "AddPasteDataRecord!");
583 
584     napi_valuetype valueType = napi_undefined;
585     NAPI_CALL_RETURN_VOID(env, napi_typeof(env, argv, &valueType));
586     NAPI_ASSERT_RETURN_VOID(env, valueType == napi_object, "Wrong argument type. Object expected.");
587 
588     std::shared_ptr<PasteDataRecord> pasteDataRecord = ParseRecord(env, argv);
589     if (pasteDataRecord == nullptr) {
590         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "ParseRecord failed!");
591         return;
592     }
593     obj->value_->AddRecord(*pasteDataRecord);
594 }
595 
AddRecord(napi_env env,napi_callback_info info)596 napi_value PasteDataNapi::AddRecord(napi_env env, napi_callback_info info)
597 {
598     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "AddRecord is called!");
599     size_t argc = ARGC_TYPE_SET2;
600     napi_value argv[ARGC_TYPE_SET2] = { 0 };
601     napi_value thisVar = nullptr;
602     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
603     NAPI_ASSERT(env, argc > 0, "Wrong number of arguments");
604     PasteDataNapi *obj = nullptr;
605     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
606     if ((status != napi_ok) || (obj == nullptr)) {
607         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get AddRecord object failed");
608         return nullptr;
609     }
610 
611     if (argc == ARGC_TYPE_SET1) {
612         AddRecord(env, argv[0], obj);
613         return nullptr;
614     }
615     AddRecord(env, argv, argc, obj);
616     return nullptr;
617 }
618 
ReplaceRecordAt(napi_env env,napi_callback_info info)619 napi_value PasteDataNapi::ReplaceRecordAt(napi_env env, napi_callback_info info)
620 {
621     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "ReplaceRecordAt is called!");
622     size_t argc = ARGC_TYPE_SET2;
623     napi_value argv[ARGC_TYPE_SET2] = { 0 };
624     napi_value thisVar = nullptr;
625     napi_value result = nullptr;
626     napi_get_boolean(env, false, &result);
627 
628     NAPI_CALL_BASE(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL), result);
629     NAPI_ASSERT(env, argc > ARGC_TYPE_SET1, "Wrong number of arguments");
630     napi_valuetype valueType = napi_undefined;
631     NAPI_CALL_BASE(env, napi_typeof(env, argv[0], &valueType), result);
632     NAPI_ASSERT(env, valueType == napi_number, "Wrong argument type. number expected.");
633     NAPI_CALL_BASE(env, napi_typeof(env, argv[1], &valueType), result);
634     NAPI_ASSERT(env, valueType == napi_object, "Wrong argument type. Object expected.");
635 
636     PasteDataNapi *obj = nullptr;
637     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
638     if ((status != napi_ok) || (obj == nullptr)) {
639         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get ReplaceRecordAt object failed");
640         return result;
641     }
642 
643     std::shared_ptr<PasteDataRecord> pasteDataRecord = ParseRecord(env, argv[1]);
644     if (pasteDataRecord == nullptr) {
645         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "ParseRecord failed!");
646         return result;
647     }
648 
649     int64_t number = 0;
650     napi_get_value_int64(env, argv[0], &number);
651     bool ret = obj->value_->ReplaceRecordAt(number, pasteDataRecord);
652     napi_get_boolean(env, ret, &result);
653 
654     return result;
655 }
656 
ReplaceRecord(napi_env env,napi_callback_info info)657 napi_value PasteDataNapi::ReplaceRecord(napi_env env, napi_callback_info info)
658 {
659     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "ReplaceRecord is called!");
660     size_t argc = ARGC_TYPE_SET2;
661     napi_value argv[ARGC_TYPE_SET2] = { 0 };
662     napi_value thisVar = nullptr;
663     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
664     if (!CheckExpression(env, argc > ARGC_TYPE_SET1, JSErrorCode::INVALID_PARAMETERS,
665         "Parameter error. The number of arguments must be greater than one.") ||
666         !CheckArgsType(env, argv[0], napi_number, "The type of mimeType must be number.")) {
667         return nullptr;
668     }
669 
670     PasteDataNapi *obj = nullptr;
671     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
672     if ((status != napi_ok) || (obj == nullptr)) {
673         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get ReplaceRecord object failed");
674         return nullptr;
675     }
676     uint32_t index = 0;
677     NAPI_CALL(env, napi_get_value_uint32(env, argv[0], &index));
678     if (!CheckExpression(env, index < obj->value_->GetRecordCount(),
679         JSErrorCode::OUT_OF_RANGE, "index out of range.")) {
680         return nullptr;
681     }
682 
683     if (!CheckArgsType(env, argv[1], napi_object, "The type of record must be PasteDataRecord.")) {
684         return nullptr;
685     }
686     std::shared_ptr<PasteDataRecord> pasteDataRecord = ParseRecord(env, argv[1]);
687     if (!CheckExpression(env, pasteDataRecord != nullptr, JSErrorCode::INVALID_PARAMETERS,
688         "Parameter error. The type of PasteDataRecord cannot be nullptr.")) {
689         return nullptr;
690     }
691     obj->value_->ReplaceRecordAt(index, pasteDataRecord);
692     return nullptr;
693 }
694 
AddWantRecord(napi_env env,napi_callback_info info)695 napi_value PasteDataNapi::AddWantRecord(napi_env env, napi_callback_info info)
696 {
697     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "AddWantRecord is called!");
698     size_t argc = 1;
699     napi_value argv[1] = { 0 };
700     napi_value thisVar = nullptr;
701 
702     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
703     NAPI_ASSERT(env, argc > ARGC_TYPE_SET0, "Wrong number of arguments");
704 
705     napi_valuetype valueType = napi_undefined;
706     NAPI_CALL(env, napi_typeof(env, argv[0], &valueType));
707     NAPI_ASSERT(env, valueType == napi_object, "Wrong argument type. Object expected.");
708     OHOS::AAFwk::Want want;
709     if (!OHOS::AppExecFwk::UnwrapWant(env, argv[0], want)) {
710         return nullptr;
711     }
712 
713     PasteDataNapi *obj = nullptr;
714     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
715     if ((status != napi_ok) || (obj == nullptr)) {
716         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get AddWantRecord object failed");
717         return nullptr;
718     }
719 
720     obj->value_->AddWantRecord(std::make_shared<OHOS::AAFwk::Want>(want));
721     return nullptr;
722 }
723 
GetPrimaryWant(napi_env env,napi_callback_info info)724 napi_value PasteDataNapi::GetPrimaryWant(napi_env env, napi_callback_info info)
725 {
726     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "GetPrimaryWant is called!");
727     size_t argc = 1;
728     napi_value argv[1] = { 0 };
729     napi_value thisVar = nullptr;
730 
731     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
732     NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
733 
734     PasteDataNapi *obj = nullptr;
735     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
736     if ((status != napi_ok) || (obj == nullptr)) {
737         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetPrimaryWant object failed");
738         return nullptr;
739     }
740 
741     std::shared_ptr<OHOS::AAFwk::Want> want = obj->value_->GetPrimaryWant();
742     if (!want) {
743         return nullptr;
744     }
745     return OHOS::AppExecFwk::WrapWant(env, *want);
746 }
747 
SetNapiProperty(napi_env env,const PasteDataProperty & property,napi_value & nProperty)748 bool PasteDataNapi::SetNapiProperty(napi_env env, const PasteDataProperty &property, napi_value &nProperty)
749 {
750     napi_value value = nullptr;
751     napi_value arr = nullptr;
752     int count = 0;
753 
754     // additions : {[key: string]: object}
755     value = OHOS::AppExecFwk::WrapWantParams(env, property.additions);
756     napi_set_named_property(env, nProperty, "additions", value);
757 
758     // mimeTypes: Array<string>
759     napi_create_array(env, &arr);
760     for (auto vec : property.mimeTypes) {
761         napi_create_string_utf8(env, vec.c_str(), NAPI_AUTO_LENGTH, &value);
762         napi_set_element(env, arr, count, value);
763         count++;
764     }
765     napi_set_named_property(env, nProperty, "mimeTypes", arr);
766 
767     // tag: string
768     napi_create_string_utf8(env, property.tag.c_str(), NAPI_AUTO_LENGTH, &value);
769     napi_set_named_property(env, nProperty, "tag", value);
770 
771     // timestamp: number
772     napi_create_int64(env, property.timestamp, &value);
773     napi_set_named_property(env, nProperty, "timestamp", value);
774 
775     // localOnly: boolean
776     napi_get_boolean(env, property.localOnly, &value);
777     napi_set_named_property(env, nProperty, "localOnly", value);
778 
779     napi_create_int32(env, static_cast<int32_t>(property.shareOption), &value);
780     napi_set_named_property(env, nProperty, "shareOption", value);
781     return true;
782 }
783 
GetProperty(napi_env env,napi_callback_info info)784 napi_value PasteDataNapi::GetProperty(napi_env env, napi_callback_info info)
785 {
786     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "GetProperty is called!");
787     size_t argc = 1;
788     napi_value argv[1] = { 0 };
789     napi_value thisVar = nullptr;
790 
791     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
792     NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
793 
794     PasteDataNapi *obj = nullptr;
795     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
796     if ((status != napi_ok) || (obj == nullptr)) {
797         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetProperty object failed");
798         return nullptr;
799     }
800     PasteDataProperty property = obj->value_->GetProperty();
801     napi_value nProperty = nullptr;
802     napi_create_object(env, &nProperty);
803     if (!SetNapiProperty(env, property, nProperty)) {
804         return nullptr;
805     }
806     return nProperty;
807 }
808 
GetRecordAt(napi_env env,napi_callback_info info)809 napi_value PasteDataNapi::GetRecordAt(napi_env env, napi_callback_info info)
810 {
811     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "GetRecordAt is called!");
812     uint32_t index = 0;
813     PasteDataNapi *obj = RemoveAndGetRecordCommon(env, info, index);
814     if (obj == nullptr) {
815         return nullptr;
816     }
817 
818     std::shared_ptr<PasteDataRecord> record = obj->value_->GetRecordAt(index);
819     napi_value instance = nullptr;
820     PasteDataRecordNapi::NewInstanceByRecord(env, instance, record);
821     return instance;
822 }
823 
GetRecord(napi_env env,napi_callback_info info)824 napi_value PasteDataNapi::GetRecord(napi_env env, napi_callback_info info)
825 {
826     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "GetRecord is called!");
827     uint32_t index = 0;
828     PasteDataNapi *obj = RemoveAndGetRecordCommon(env, info, index);
829     if (obj == nullptr || !CheckExpression(env, index < obj->value_->GetRecordCount(),
830         JSErrorCode::OUT_OF_RANGE, "index out of range.")) {
831         return nullptr;
832     }
833 
834     std::shared_ptr<PasteDataRecord> record = obj->value_->GetRecordAt(index);
835     napi_value instance = nullptr;
836     PasteDataRecordNapi::NewInstanceByRecord(env, instance, record);
837     return instance;
838 }
839 
SetProperty(napi_env env,napi_value in,PasteDataNapi * obj)840 void PasteDataNapi::SetProperty(napi_env env, napi_value in, PasteDataNapi *obj)
841 {
842     napi_value propertyNames = nullptr;
843     NAPI_CALL_RETURN_VOID(env, napi_get_property_names(env, in, &propertyNames));
844     uint32_t propertyNamesNum = 0;
845     NAPI_CALL_RETURN_VOID(env, napi_get_array_length(env, propertyNames, &propertyNamesNum));
846     bool localOnlyValue = false;
847     int32_t shareOptionValue = ShareOption::CrossDevice;
848     for (uint32_t i = 0; i < propertyNamesNum; i++) {
849         napi_value propertyNameNapi = nullptr;
850         NAPI_CALL_RETURN_VOID(env, napi_get_element(env, propertyNames, i, &propertyNameNapi));
851         size_t len = 0;
852         char str[STR_MAX_SIZE] = { 0 };
853         NAPI_CALL_RETURN_VOID(env, napi_get_value_string_utf8(env, propertyNameNapi, str, STR_MAX_SIZE, &len));
854         std::string propertyName = str;
855         napi_value propertyNameValueNapi = nullptr;
856         NAPI_CALL_RETURN_VOID(env, napi_get_named_property(env, in, str, &propertyNameValueNapi));
857         if (propertyName == "localOnly") {
858             NAPI_CALL_RETURN_VOID(env, napi_get_value_bool(env, propertyNameValueNapi, &localOnlyValue));
859             PASTEBOARD_HILOGD(PASTEBOARD_MODULE_CLIENT, "localOnlyValue = %{public}d", localOnlyValue);
860         }
861         if (propertyName == "shareOption") {
862             NAPI_CALL_RETURN_VOID(env, napi_get_value_int32(env, propertyNameValueNapi, &shareOptionValue));
863             PASTEBOARD_HILOGD(PASTEBOARD_MODULE_CLIENT, "shareOptionValue = %{public}d", shareOptionValue);
864         }
865         if (propertyName == "tag") {
866             char tagValue[STR_MAX_SIZE] = { 0 };
867             size_t tagValueLen = 0;
868             NAPI_CALL_RETURN_VOID(env,
869                 napi_get_value_string_utf8(env, propertyNameValueNapi, tagValue, STR_MAX_SIZE, &tagValueLen));
870             PASTEBOARD_HILOGD(PASTEBOARD_MODULE_CLIENT, "tagValue = %{public}s", tagValue);
871             std::string tagValueStr = tagValue;
872             obj->value_->SetTag(tagValueStr);
873         }
874         if (propertyName == "additions") {
875             AAFwk::WantParams additions;
876             bool ret = OHOS::AppExecFwk::UnwrapWantParams(env, propertyNameValueNapi, additions);
877             PASTEBOARD_HILOGD(PASTEBOARD_MODULE_CLIENT, "additions ret = %{public}d", ret);
878             obj->value_->SetAdditions(additions);
879         }
880     }
881     localOnlyValue = shareOptionValue == ShareOption::CrossDevice ? false : true;
882     PASTEBOARD_HILOGI(PASTEBOARD_MODULE_CLIENT, "localOnly final Value = %{public}d", localOnlyValue);
883     obj->value_->SetLocalOnly(localOnlyValue);
884     obj->value_->SetShareOption(static_cast<ShareOption>(shareOptionValue));
885 }
886 
IsProperty(napi_env env,napi_value in)887 bool PasteDataNapi::IsProperty(napi_env env, napi_value in)
888 {
889     napi_valuetype valueType = napi_undefined;
890     NAPI_CALL_BASE(env, napi_typeof(env, in, &valueType), false);
891     if (valueType != napi_object) {
892         return false;
893     }
894     napi_value propertyNames = nullptr;
895     NAPI_CALL_BASE(env, napi_get_property_names(env, in, &propertyNames), false);
896     uint32_t propertyNamesNum = 0;
897     NAPI_CALL_BASE(env, napi_get_array_length(env, propertyNames, &propertyNamesNum), false);
898     bool hasProperty = false;
899     const char *key[] = { "additions", "mimeTypes", "tag", "timestamp", "localOnly", "shareOption" };
900     const napi_valuetype type[] = { napi_object, napi_object, napi_string, napi_number, napi_boolean, napi_number };
901     napi_value propertyValue = nullptr;
902     for (uint32_t i = 0; i < propertyNamesNum; i++) {
903         NAPI_CALL_BASE(env, napi_has_named_property(env, in, key[i], &hasProperty), false);
904         if (!hasProperty) {
905             return false;
906         }
907         NAPI_CALL_BASE(env, napi_get_named_property(env, in, key[i], &propertyValue), false);
908         if (i == ARGC_TYPE_SET1) {
909             bool isArray = false;
910             NAPI_CALL_BASE(env, napi_is_array(env, propertyValue, &isArray), false);
911             if (!isArray) {
912                 return false;
913             }
914             continue;
915         }
916         NAPI_CALL_BASE(env, napi_typeof(env, propertyValue, &valueType), false);
917         if (valueType != type[i]) {
918             return false;
919         }
920     }
921     return true;
922 }
923 
SetProperty(napi_env env,napi_callback_info info)924 napi_value PasteDataNapi::SetProperty(napi_env env, napi_callback_info info)
925 {
926     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "SetProperty is called!");
927     size_t argc = ARGC_TYPE_SET1;
928     napi_value argv[ARGC_TYPE_SET1] = { 0 };
929     napi_value thisVar = nullptr;
930 
931     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
932     if (!CheckExpression(env, argc > ARGC_TYPE_SET0, JSErrorCode::INVALID_PARAMETERS,
933         "Parameter error. The number of arguments must be greater than zero.") ||
934         !CheckExpression(env, IsProperty(env, argv[0]), JSErrorCode::INVALID_PARAMETERS,
935         "Parameter error. The type of property must be PasteDataProperty.")) {
936         return nullptr;
937     }
938 
939     PasteDataNapi *obj = nullptr;
940     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
941     if ((status != napi_ok) || (obj == nullptr)) {
942         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "napi_unwrap failed");
943         return nullptr;
944     }
945     SetProperty(env, argv[0], obj);
946     return nullptr;
947 }
948 
PasteDataInit(napi_env env,napi_value exports)949 napi_value PasteDataNapi::PasteDataInit(napi_env env, napi_value exports)
950 {
951     napi_status status = napi_ok;
952     napi_property_descriptor descriptors[] = { DECLARE_NAPI_FUNCTION("addHtmlRecord", AddHtmlRecord),
953         DECLARE_NAPI_FUNCTION("addWantRecord", AddWantRecord), DECLARE_NAPI_FUNCTION("addRecord", AddRecord),
954         DECLARE_NAPI_FUNCTION("addTextRecord", AddTextRecord), DECLARE_NAPI_FUNCTION("addUriRecord", AddUriRecord),
955         DECLARE_NAPI_FUNCTION("addPixelMapRecord", AddPixelMapRecord),
956         DECLARE_NAPI_FUNCTION("getMimeTypes", GetMimeTypes), DECLARE_NAPI_FUNCTION("getPrimaryHtml", GetPrimaryHtml),
957         DECLARE_NAPI_FUNCTION("getPrimaryWant", GetPrimaryWant),
958         DECLARE_NAPI_FUNCTION("getPrimaryMimeType", GetPrimaryMimeType),
959         DECLARE_NAPI_FUNCTION("getPrimaryText", GetPrimaryText), DECLARE_NAPI_FUNCTION("getPrimaryUri", GetPrimaryUri),
960         DECLARE_NAPI_FUNCTION("getPrimaryPixelMap", GetPrimaryPixelMap),
961         DECLARE_NAPI_FUNCTION("getProperty", GetProperty), DECLARE_NAPI_FUNCTION("getRecordAt", GetRecordAt),
962         DECLARE_NAPI_FUNCTION("getRecord", GetRecord), DECLARE_NAPI_FUNCTION("getRecordCount", GetRecordCount),
963         DECLARE_NAPI_FUNCTION("getTag", GetTag), DECLARE_NAPI_FUNCTION("hasMimeType", HasMimeType),
964         DECLARE_NAPI_FUNCTION("hasType", HasType), DECLARE_NAPI_FUNCTION("removeRecordAt", RemoveRecordAt),
965         DECLARE_NAPI_FUNCTION("removeRecord", RemoveRecord), DECLARE_NAPI_FUNCTION("replaceRecordAt", ReplaceRecordAt),
966         DECLARE_NAPI_FUNCTION("replaceRecord", ReplaceRecord), DECLARE_NAPI_FUNCTION("setProperty", SetProperty),
967         DECLARE_NAPI_FUNCTION("pasteStart", PasteStart), DECLARE_NAPI_FUNCTION("pasteComplete", PasteComplete)};
968 
969     napi_value constructor;
970     napi_define_class(env, "PasteData", NAPI_AUTO_LENGTH, New, nullptr,
971         sizeof(descriptors) / sizeof(napi_property_descriptor), descriptors, &constructor);
972     if (status != napi_ok) {
973         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Failed to define class at Init");
974         return nullptr;
975     }
976 
977     status = napi_create_reference(env, constructor, 1, &g_pasteData);
978     if (status != napi_ok) {
979         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "PasteDataNapi Init create reference failed");
980         return nullptr;
981     }
982     napi_set_named_property(env, exports, "PasteData", constructor);
983     return exports;
984 }
985 
Destructor(napi_env env,void * nativeObject,void * finalize_hint)986 void PasteDataNapi::Destructor(napi_env env, void *nativeObject, void *finalize_hint)
987 {
988     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "Destructor");
989     PasteDataNapi *obj = static_cast<PasteDataNapi *>(nativeObject);
990     delete obj;
991 }
992 
New(napi_env env,napi_callback_info info)993 napi_value PasteDataNapi::New(napi_env env, napi_callback_info info)
994 {
995     size_t argc = ARGC_TYPE_SET1;
996     napi_value argv[1] = { 0 };
997     napi_value thisVar = nullptr;
998     napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
999 
1000     // get native object
1001     PasteDataNapi *obj = new PasteDataNapi();
1002     obj->env_ = env;
1003     ASSERT_CALL(env, napi_wrap(env, thisVar, obj, PasteDataNapi::Destructor,
1004                        nullptr, // finalize_hint
1005                        nullptr), obj);
1006     return thisVar;
1007 }
1008 
NewInstance(napi_env env,napi_value & instance)1009 napi_status PasteDataNapi::NewInstance(napi_env env, napi_value &instance)
1010 {
1011     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "enter");
1012     napi_status status;
1013     napi_value constructor;
1014     status = napi_get_reference_value(env, g_pasteData, &constructor);
1015     if (status != napi_ok) {
1016         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "get reference failed");
1017         return status;
1018     }
1019 
1020     status = napi_new_instance(env, constructor, 0, nullptr, &instance);
1021     if (status != napi_ok) {
1022         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "new instance failed");
1023         return status;
1024     }
1025     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "new instance ok");
1026     return napi_ok;
1027 }
1028 
IsPasteData(napi_env env,napi_value in)1029 bool PasteDataNapi::IsPasteData(napi_env env, napi_value in)
1030 {
1031     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "enter");
1032     napi_valuetype type = napi_undefined;
1033     NAPI_CALL_BASE(env, napi_typeof(env, in, &type), false);
1034     if (type != napi_object) {
1035         return false;
1036     }
1037     napi_value constructor;
1038     bool isPasteData = false;
1039     NAPI_CALL_BASE(env, napi_get_reference_value(env, g_pasteData, &constructor), false);
1040     NAPI_CALL_BASE(env, napi_instanceof(env, in, constructor, &isPasteData), false);
1041     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "isPasteData is [%{public}d]", isPasteData);
1042     return isPasteData;
1043 }
1044 
PasteStart(napi_env env,napi_callback_info info)1045 napi_value PasteDataNapi::PasteStart(napi_env env, napi_callback_info info)
1046 {
1047     napi_value thisVar = nullptr;
1048     PasteDataNapi *obj = nullptr;
1049     size_t argc = 1;
1050     napi_value argv[1] = { 0 };
1051     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
1052     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
1053     if ((status != napi_ok) || (obj == nullptr) || (obj->value_ == nullptr)) {
1054         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "napi_unwrap failed");
1055         return nullptr;
1056     }
1057     std::string pasteId = obj->value_->GetPasteId();
1058     PasteboardClient::GetInstance()->PasteStart(pasteId);
1059     return nullptr;
1060 }
1061 
PasteComplete(napi_env env,napi_callback_info info)1062 napi_value PasteDataNapi::PasteComplete(napi_env env, napi_callback_info info)
1063 {
1064     napi_value thisVar = nullptr;
1065     PasteDataNapi *obj = nullptr;
1066     size_t argc = 1;
1067     napi_value argv[1] = { 0 };
1068     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
1069     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
1070     if ((status != napi_ok) || (obj == nullptr) || (obj->value_ == nullptr)) {
1071         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "napi_unwrap failed");
1072         return nullptr;
1073     }
1074     std::string deviceId = obj->value_->GetDeviceId();
1075     std::string pasteId = obj->value_->GetPasteId();
1076     PasteboardClient::GetInstance()->PasteComplete(deviceId, pasteId);
1077     return nullptr;
1078 }
1079 } // namespace MiscServicesNapi
1080 } // namespace OHOS
1081