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