• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 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 #include "pastedata_napi.h"
17 #include "pastedata_record_napi.h"
18 #include "pasteboard_common.h"
19 #include "pasteboard_hilog.h"
20 #include "napi_common.h"
21 #include "pasteboard_js_err.h"
22 using namespace OHOS::MiscServices;
23 using namespace OHOS::Media;
24 
25 namespace OHOS {
26 namespace MiscServicesNapi {
27 namespace {
28 constexpr int ARGC_TYPE_SET0 = 0;
29 constexpr int ARGC_TYPE_SET1 = 1;
30 constexpr int ARGC_TYPE_SET2 = 2;
31 const int32_t STR_MAX_SIZE = 256;
32 constexpr int32_t MIMETYPE_MAX_SIZE = 1024;
33 constexpr int32_t MAX_TEXT_LEN = 20 * 1024 * 1024;
34 constexpr size_t STR_TAIL_LENGTH = 1;
35 constexpr size_t MAX_RECORD_NUM = 512;
36 }  // namespace
37 static thread_local napi_ref g_pasteData = nullptr;
38 
PasteDataNapi()39 PasteDataNapi::PasteDataNapi() : env_(nullptr), wrapper_(nullptr)
40 {
41     value_ = std::make_shared<PasteData>();
42 }
43 
~PasteDataNapi()44 PasteDataNapi::~PasteDataNapi()
45 {
46     napi_delete_reference(env_, wrapper_);
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_HILOGI(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_HILOGI(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_HILOGI(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_HILOGI(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_HILOGI(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_HILOGI(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_HILOGI(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_HILOGI(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_HILOGI(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. Wrong number of arguments."))
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_HILOGI(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. Wrong number of arguments."))
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_HILOGI(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_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "RemoveRecord is called!");
350     uint32_t index = 0;
351     PasteDataNapi *obj = RemoveAndGetRecordCommon(env, info, index);
352     if (obj == nullptr
353         || !CheckExpression(env, index < obj->value_->GetRecordCount(),
354             JSErrorCode::OUT_OF_RANGE, "index out of range.")) {
355         return nullptr;
356     }
357     obj->value_->RemoveRecordAt(index);
358     return nullptr;
359 }
360 
GetPrimaryMimeType(napi_env env,napi_callback_info info)361 napi_value PasteDataNapi::GetPrimaryMimeType(napi_env env, napi_callback_info info)
362 {
363     PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "GetPrimaryMimeType is called!");
364     size_t argc = 1;
365     napi_value argv[1] = {0};
366     napi_value thisVar = nullptr;
367 
368     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
369     NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
370 
371     PasteDataNapi *obj = nullptr;
372     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
373     if ((status != napi_ok) || (obj == nullptr)) {
374         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetPrimaryMimeType object failed");
375         return nullptr;
376     }
377     std::shared_ptr<std::string> mimeType = obj->value_->GetPrimaryMimeType();
378     if (mimeType == nullptr) {
379         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetPrimaryMimeType failed");
380         return nullptr;
381     }
382     napi_value result = nullptr;
383     napi_create_string_utf8(env, mimeType->c_str(), NAPI_AUTO_LENGTH, &result);
384 
385     return result;
386 }
387 
GetRecordCount(napi_env env,napi_callback_info info)388 napi_value PasteDataNapi::GetRecordCount(napi_env env, napi_callback_info info)
389 {
390     PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "GetRecordCount is called!");
391     size_t argc = 1;
392     napi_value argv[1] = {0};
393     napi_value thisVar = nullptr;
394 
395     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
396     NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
397 
398     PasteDataNapi *obj = nullptr;
399     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
400     if ((status != napi_ok) || (obj == nullptr)) {
401         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetRecordCount object failed");
402         return nullptr;
403     }
404 
405     size_t count = obj->value_->GetRecordCount();
406     napi_value result = nullptr;
407     napi_create_int64(env, count, &result);
408 
409     return result;
410 }
411 
GetTag(napi_env env,napi_callback_info info)412 napi_value PasteDataNapi::GetTag(napi_env env, napi_callback_info info)
413 {
414     PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "GetTag is called!");
415     size_t argc = 1;
416     napi_value argv[1] = {0};
417     napi_value thisVar = nullptr;
418 
419     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
420     NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
421 
422     PasteDataNapi *obj = nullptr;
423     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
424     if ((status != napi_ok) || (obj == nullptr)) {
425         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetTag object failed");
426         return nullptr;
427     }
428     std::string tag = obj->value_->GetTag();
429     napi_value result = nullptr;
430     napi_create_string_utf8(env, tag.c_str(), NAPI_AUTO_LENGTH, &result);
431 
432     return result;
433 }
434 
GetMimeTypes(napi_env env,napi_callback_info info)435 napi_value PasteDataNapi::GetMimeTypes(napi_env env, napi_callback_info info)
436 {
437     PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "GetMimeTypes is called!");
438     size_t argc = 1;
439     napi_value argv[1] = {0};
440     napi_value thisVar = nullptr;
441 
442     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
443     NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
444 
445     PasteDataNapi *obj = nullptr;
446     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
447     if ((status != napi_ok) || (obj == nullptr)) {
448         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetMimeTypes object failed");
449         return nullptr;
450     }
451     std::vector<std::string> mimeTypes = obj->value_->GetMimeTypes();
452     if (mimeTypes.size() == 0) {
453         return nullptr;
454     }
455 
456     napi_value nMimeTypes = nullptr;
457     if (napi_create_array(env, &nMimeTypes) != napi_ok) {
458         return nullptr;
459     }
460     size_t index = 0;
461     napi_value value = nullptr;
462     for (auto type : mimeTypes) {
463         napi_create_string_utf8(env, type.c_str(), NAPI_AUTO_LENGTH, &value);
464         napi_set_element(env, nMimeTypes, index, value);
465         index++;
466     }
467     return nMimeTypes;
468 }
469 
AddRecord(napi_env env,napi_value * argv,size_t argc,PasteDataNapi * obj)470 void PasteDataNapi::AddRecord(napi_env env, napi_value *argv, size_t argc, PasteDataNapi *obj)
471 {
472     PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "AddRecordV9!");
473     if (!CheckExpression(env, obj->value_->GetRecordCount() < MAX_RECORD_NUM, JSErrorCode::RECORD_EXCEEDS_LIMIT,
474         "The count of records in PasteData exceeds MAX_RECORD_NUM.")) {
475         return;
476     }
477     std::string mimeType;
478     if (!CheckArgs(env, argv, argc, mimeType)) {
479         return;
480     }
481     bool isArrayBuffer = false;
482     NAPI_CALL_RETURN_VOID(env, napi_is_arraybuffer(env, argv[1], &isArrayBuffer));
483     if (isArrayBuffer) {
484         void *data = nullptr;
485         size_t dataLen = 0;
486         NAPI_CALL_RETURN_VOID(env, napi_get_arraybuffer_info(env, argv[1], &data, &dataLen));
487         obj->value_->AddKvRecord(mimeType,
488             std::vector<uint8_t>(reinterpret_cast<uint8_t *>(data), reinterpret_cast<uint8_t *>(data) + dataLen));
489         return;
490     }
491     if (mimeType == MIMETYPE_PIXELMAP) {
492         std::shared_ptr<PixelMap> pixelMap = PixelMapNapi::GetPixelMap(env, argv[1]);
493         obj->value_->AddPixelMapRecord(pixelMap);
494         return;
495     } else if (mimeType == MIMETYPE_TEXT_WANT) {
496         OHOS::AAFwk::Want want;
497         AppExecFwk::UnwrapWant(env, argv[1], want);
498         obj->value_->AddWantRecord(std::make_shared<OHOS::AAFwk::Want>(want));
499         return;
500     }
501 
502     std::string str;
503     bool ret = GetValue(env, argv[1], str);
504     if (!ret) {
505         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Failed to GetValue!");
506         return;
507     }
508     if (mimeType == MIMETYPE_TEXT_HTML) {
509         obj->value_->AddHtmlRecord(str);
510     } else if (mimeType == MIMETYPE_TEXT_PLAIN) {
511         obj->value_->AddTextRecord(str);
512     } else {
513         obj->value_->AddUriRecord(OHOS::Uri(str));
514     }
515 }
516 
SetStringProp(napi_env env,const std::string & propName,napi_value & propValueNapi,PasteDataRecord::Builder & builder)517 bool PasteDataNapi::SetStringProp(
518     napi_env env, const std::string &propName, napi_value &propValueNapi, PasteDataRecord::Builder &builder)
519 {
520     std::string propValue;
521     bool ret = GetValue(env, propValueNapi, propValue);
522     if (!ret) {
523         return false;
524     }
525     if ((propName == "mimeType") && (propValue.size() <= MIMETYPE_MAX_SIZE)) {
526         builder.SetMimeType(propValue);
527     } else if ((propName == "htmlText") && (propValue.size() <= MAX_TEXT_LEN)) {
528         builder.SetHtmlText(std::make_shared<std::string>(propValue));
529     } else if ((propName == "plainText") && (propValue.size() <= MAX_TEXT_LEN)) {
530         builder.SetPlainText(std::make_shared<std::string>(propValue));
531     } else if (propName == "uri") {
532         builder.SetUri(std::make_shared<OHOS::Uri>(Uri(propValue)));
533     } else {
534         return false;
535     }
536     return true;
537 }
538 
ParseRecord(napi_env env,napi_value & recordNapi)539 std::shared_ptr<MiscServices::PasteDataRecord> PasteDataNapi::ParseRecord(napi_env env, napi_value &recordNapi)
540 {
541     napi_value propNames = nullptr;
542     NAPI_CALL(env, napi_get_property_names(env, recordNapi, &propNames));
543     uint32_t propNameNums = 0;
544     NAPI_CALL(env, napi_get_array_length(env, propNames, &propNameNums));
545     PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "propNameNums = %{public}d", propNameNums);
546     PasteDataRecord::Builder builder("");
547     for (uint32_t i = 0; i < propNameNums; i++) {
548         napi_value propNameNapi = nullptr;
549         NAPI_CALL(env, napi_get_element(env, propNames, i, &propNameNapi));
550         size_t len = 0;
551         char str[STR_MAX_SIZE] = { 0 };
552         NAPI_CALL(env, napi_get_value_string_utf8(env, propNameNapi, str, STR_MAX_SIZE - STR_TAIL_LENGTH, &len));
553         napi_value propValueNapi = nullptr;
554         NAPI_CALL(env, napi_get_named_property(env, recordNapi, str, &propValueNapi));
555         std::string propName = str;
556         PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "propName = %{public}s,", propName.c_str());
557 
558         if (propName == "mimeType" || propName == "htmlText" || propName == "plainText" || propName == "uri") {
559             if (!SetStringProp(env, propName, propValueNapi, builder)) {
560                 return nullptr;
561             }
562         } else if (propName == "want") {
563             AAFwk::Want want;
564             if (OHOS::AppExecFwk::UnwrapWant(env, propValueNapi, want) != true) {
565                 return nullptr;
566             }
567             builder.SetWant(std::make_shared<AAFwk::Want>(want));
568         } else if (propName == "pixelMap") {
569             std::shared_ptr<PixelMap> pixelMap = PixelMapNapi::GetPixelMap(env, propValueNapi);
570             if (pixelMap == nullptr) {
571                 return nullptr;
572             }
573             builder.SetPixelMap(pixelMap);
574         } else if (propName == "data") {
575             std::shared_ptr<MineCustomData> customData = PasteDataRecordNapi::GetNativeKvData(env, propValueNapi);
576             if (customData == nullptr) {
577                 return nullptr;
578             }
579             builder.SetCustomData(customData);
580         }
581     }
582     return builder.Build();
583 }
584 
AddRecord(napi_env env,napi_value argv,PasteDataNapi * obj)585 void PasteDataNapi::AddRecord(napi_env env, napi_value argv, PasteDataNapi *obj)
586 {
587     PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "AddPasteDataRecord!");
588 
589     napi_valuetype valueType = napi_undefined;
590     NAPI_CALL_RETURN_VOID(env, napi_typeof(env, argv, &valueType));
591     NAPI_ASSERT_RETURN_VOID(env, valueType == napi_object, "Wrong argument type. Object expected.");
592 
593     std::shared_ptr<PasteDataRecord> pasteDataRecord = ParseRecord(env, argv);
594     if (pasteDataRecord == nullptr) {
595         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "ParseRecord failed!");
596         return;
597     }
598     obj->value_->AddRecord(*pasteDataRecord);
599 }
600 
AddRecord(napi_env env,napi_callback_info info)601 napi_value PasteDataNapi::AddRecord(napi_env env, napi_callback_info info)
602 {
603     PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "AddRecord is called!");
604     size_t argc = ARGC_TYPE_SET2;
605     napi_value argv[ARGC_TYPE_SET2] = { 0 };
606     napi_value thisVar = nullptr;
607     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
608     NAPI_ASSERT(env, argc > 0, "Wrong number of arguments");
609     PasteDataNapi *obj = nullptr;
610     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
611     if ((status != napi_ok) || (obj == nullptr)) {
612         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get AddRecord object failed");
613         return nullptr;
614     }
615 
616     if (argc == ARGC_TYPE_SET1) {
617         AddRecord(env, argv[0], obj);
618         return nullptr;
619     }
620     AddRecord(env, argv, argc, obj);
621     return nullptr;
622 }
623 
ReplaceRecordAt(napi_env env,napi_callback_info info)624 napi_value PasteDataNapi::ReplaceRecordAt(napi_env env, napi_callback_info info)
625 {
626     PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "ReplaceRecordAt is called!");
627     size_t argc = ARGC_TYPE_SET2;
628     napi_value argv[ARGC_TYPE_SET2] = { 0 };
629     napi_value thisVar = nullptr;
630     napi_value result = nullptr;
631     napi_get_boolean(env, false, &result);
632 
633     NAPI_CALL_BASE(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL), result);
634     NAPI_ASSERT(env, argc > ARGC_TYPE_SET1, "Wrong number of arguments");
635     napi_valuetype valueType = napi_undefined;
636     NAPI_CALL_BASE(env, napi_typeof(env, argv[0], &valueType), result);
637     NAPI_ASSERT(env, valueType == napi_number, "Wrong argument type. number expected.");
638     NAPI_CALL_BASE(env, napi_typeof(env, argv[1], &valueType), result);
639     NAPI_ASSERT(env, valueType == napi_object, "Wrong argument type. Object expected.");
640 
641     PasteDataNapi *obj = nullptr;
642     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
643     if ((status != napi_ok) || (obj == nullptr)) {
644         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get ReplaceRecordAt object failed");
645         return result;
646     }
647 
648     std::shared_ptr<PasteDataRecord> pasteDataRecord = ParseRecord(env, argv[1]);
649     if (pasteDataRecord == nullptr) {
650         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "ParseRecord failed!");
651         return result;
652     }
653 
654     int64_t number = 0;
655     napi_get_value_int64(env, argv[0], &number);
656     bool ret = obj->value_->ReplaceRecordAt(number, pasteDataRecord);
657     napi_get_boolean(env, ret, &result);
658 
659     return result;
660 }
661 
ReplaceRecord(napi_env env,napi_callback_info info)662 napi_value PasteDataNapi::ReplaceRecord(napi_env env, napi_callback_info info)
663 {
664     PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "ReplaceRecord is called!");
665     size_t argc = ARGC_TYPE_SET2;
666     napi_value argv[ARGC_TYPE_SET2] = { 0 };
667     napi_value thisVar = nullptr;
668     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
669     if (!CheckExpression(env, argc > ARGC_TYPE_SET1, JSErrorCode::INVALID_PARAMETERS, "Wrong number of arguments.")
670         || !CheckArgsType(env, argv[0], napi_number, "The type of mimeType must be number.")) {
671         return nullptr;
672     }
673 
674     PasteDataNapi *obj = nullptr;
675     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
676     if ((status != napi_ok) || (obj == nullptr)) {
677         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get ReplaceRecord object failed");
678         return nullptr;
679     }
680     uint32_t index = 0;
681     NAPI_CALL(env, napi_get_value_uint32(env, argv[0], &index));
682     if (!CheckExpression(env, index < obj->value_->GetRecordCount(),
683         JSErrorCode::OUT_OF_RANGE, "index out of range.")) {
684         return nullptr;
685     }
686 
687     if (!CheckArgsType(env, argv[1], napi_object, "The type of record must be PasteDataRecord.")) {
688         return nullptr;
689     }
690     std::shared_ptr<PasteDataRecord> pasteDataRecord = ParseRecord(env, argv[1]);
691     if (!CheckExpression(env, pasteDataRecord != nullptr, JSErrorCode::INVALID_PARAMETERS,
692         "The type of record must be PasteDataRecord.")) {
693         return nullptr;
694     }
695     obj->value_->ReplaceRecordAt(index, pasteDataRecord);
696     return nullptr;
697 }
698 
AddWantRecord(napi_env env,napi_callback_info info)699 napi_value PasteDataNapi::AddWantRecord(napi_env env, napi_callback_info info)
700 {
701     PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "AddWantRecord is called!");
702     size_t argc = 1;
703     napi_value argv[1] = {0};
704     napi_value thisVar = nullptr;
705 
706     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
707     NAPI_ASSERT(env, argc > ARGC_TYPE_SET0, "Wrong number of arguments");
708 
709     napi_valuetype valueType = napi_undefined;
710     NAPI_CALL(env, napi_typeof(env, argv[0], &valueType));
711     NAPI_ASSERT(env, valueType == napi_object, "Wrong argument type. Object expected.");
712     OHOS::AAFwk::Want want;
713     if (!OHOS::AppExecFwk::UnwrapWant(env, argv[0], want)) {
714         return nullptr;
715     }
716 
717     PasteDataNapi *obj = nullptr;
718     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
719     if ((status != napi_ok) || (obj == nullptr)) {
720         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get AddWantRecord object failed");
721         return nullptr;
722     }
723 
724     obj->value_->AddWantRecord(std::make_shared<OHOS::AAFwk::Want>(want));
725     return nullptr;
726 }
727 
GetPrimaryWant(napi_env env,napi_callback_info info)728 napi_value PasteDataNapi::GetPrimaryWant(napi_env env, napi_callback_info info)
729 {
730     PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "GetPrimaryWant is called!");
731     size_t argc = 1;
732     napi_value argv[1] = {0};
733     napi_value thisVar = nullptr;
734 
735     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
736     NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
737 
738     PasteDataNapi *obj = nullptr;
739     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
740     if ((status != napi_ok) || (obj == nullptr)) {
741         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetPrimaryWant object failed");
742         return nullptr;
743     }
744 
745     std::shared_ptr<OHOS::AAFwk::Want> want = obj->value_->GetPrimaryWant();
746     if (!want) {
747         return nullptr;
748     }
749     return OHOS::AppExecFwk::WrapWant(env, *want);
750 }
751 
SetNapiProperty(napi_env env,const PasteDataProperty & property,napi_value & nProperty)752 bool PasteDataNapi::SetNapiProperty(napi_env env, const PasteDataProperty &property, napi_value &nProperty)
753 {
754     napi_value value = nullptr;
755     napi_value arr = nullptr;
756     int count = 0;
757 
758     // additions : {[key: string]: object}
759     value = OHOS::AppExecFwk::WrapWantParams(env, property.additions);
760     napi_set_named_property(env, nProperty, "additions", value);
761 
762     // mimeTypes: Array<string>
763     napi_create_array(env, &arr);
764     for (auto vec : property.mimeTypes) {
765         napi_create_string_utf8(env, vec.c_str(), NAPI_AUTO_LENGTH, &value);
766         napi_set_element(env, arr, count, value);
767         count++;
768     }
769     napi_set_named_property(env, nProperty, "mimeTypes", arr);
770 
771     // tag: string
772     napi_create_string_utf8(env, property.tag.c_str(), NAPI_AUTO_LENGTH, &value);
773     napi_set_named_property(env, nProperty, "tag", value);
774 
775     // timestamp: number
776     napi_create_int64(env, property.timestamp, &value);
777     napi_set_named_property(env, nProperty, "timestamp", value);
778 
779     // localOnly: boolean
780     napi_get_boolean(env, property.localOnly, &value);
781     napi_set_named_property(env, nProperty, "localOnly", value);
782 
783     napi_create_int32(env, static_cast<int32_t>(property.shareOption), &value);
784     napi_set_named_property(env, nProperty, "shareOption", value);
785     return true;
786 }
787 
GetProperty(napi_env env,napi_callback_info info)788 napi_value PasteDataNapi::GetProperty(napi_env env, napi_callback_info info)
789 {
790     PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "GetProperty is called!");
791     size_t argc = 1;
792     napi_value argv[1] = {0};
793     napi_value thisVar = nullptr;
794 
795     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
796     NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
797 
798     PasteDataNapi *obj = nullptr;
799     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
800     if ((status != napi_ok) || (obj == nullptr)) {
801         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetProperty object failed");
802         return nullptr;
803     }
804     PasteDataProperty property = obj->value_->GetProperty();
805     napi_value nProperty = nullptr;
806     napi_create_object(env, &nProperty);
807     if (!SetNapiProperty(env, property, nProperty)) {
808         return nullptr;
809     }
810     return nProperty;
811 }
812 
GetRecordAt(napi_env env,napi_callback_info info)813 napi_value PasteDataNapi::GetRecordAt(napi_env env, napi_callback_info info)
814 {
815     PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "GetRecordAt is called!");
816     uint32_t index = 0;
817     PasteDataNapi *obj = RemoveAndGetRecordCommon(env, info, index);
818     if (obj == nullptr) {
819         return nullptr;
820     }
821 
822     std::shared_ptr<PasteDataRecord> record = obj->value_->GetRecordAt(index);
823     napi_value instance = nullptr;
824     PasteDataRecordNapi::NewInstanceByRecord(env, instance, record);
825     return instance;
826 }
827 
GetRecord(napi_env env,napi_callback_info info)828 napi_value PasteDataNapi::GetRecord(napi_env env, napi_callback_info info)
829 {
830     PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "GetRecord is called!");
831     uint32_t index = 0;
832     PasteDataNapi *obj = RemoveAndGetRecordCommon(env, info, index);
833     if (obj == nullptr
834         || !CheckExpression(env, index < obj->value_->GetRecordCount(),
835             JSErrorCode::OUT_OF_RANGE, "index out of range.")) {
836         return nullptr;
837     }
838 
839     std::shared_ptr<PasteDataRecord> record = obj->value_->GetRecordAt(index);
840     napi_value instance = nullptr;
841     PasteDataRecordNapi::NewInstanceByRecord(env, instance, record);
842     return instance;
843 }
844 
SetProperty(napi_env env,napi_value in,PasteDataNapi * obj)845 void PasteDataNapi::SetProperty(napi_env env, napi_value in, PasteDataNapi *obj)
846 {
847     napi_value propertyNames = nullptr;
848     NAPI_CALL_RETURN_VOID(env, napi_get_property_names(env, in, &propertyNames));
849     uint32_t propertyNamesNum = 0;
850     NAPI_CALL_RETURN_VOID(env, napi_get_array_length(env, propertyNames, &propertyNamesNum));
851     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "propertyNamesNum = %{public}d", propertyNamesNum);
852 
853     for (uint32_t i = 0; i < propertyNamesNum; i++) {
854         napi_value propertyNameNapi = nullptr;
855         NAPI_CALL_RETURN_VOID(env, napi_get_element(env, propertyNames, i, &propertyNameNapi));
856         size_t len = 0;
857         char str[STR_MAX_SIZE] = { 0 };
858         NAPI_CALL_RETURN_VOID(env, napi_get_value_string_utf8(env, propertyNameNapi, str, STR_MAX_SIZE, &len));
859         std::string propertyName = str;
860         PASTEBOARD_HILOGI(PASTEBOARD_MODULE_CLIENT, "propertyName = %{public}s,", propertyName.c_str());
861         napi_value propertyNameValueNapi = nullptr;
862         NAPI_CALL_RETURN_VOID(env, napi_get_named_property(env, in, str, &propertyNameValueNapi));
863         if (propertyName == "shareOption") {
864             int32_t shareOptionValue = 0;
865             NAPI_CALL_RETURN_VOID(env, napi_get_value_int32(env, propertyNameValueNapi, &shareOptionValue));
866             PASTEBOARD_HILOGI(PASTEBOARD_MODULE_CLIENT, "shareOptionValue = %{public}d,", shareOptionValue);
867             obj->value_->SetShareOption(static_cast<ShareOption>(shareOptionValue));
868         }
869         if (propertyName == "tag") {
870             char tagValue[STR_MAX_SIZE] = { 0 };
871             size_t tagValueLen = 0;
872             NAPI_CALL_RETURN_VOID(env,
873                 napi_get_value_string_utf8(env, propertyNameValueNapi, tagValue, STR_MAX_SIZE, &tagValueLen));
874             PASTEBOARD_HILOGI(PASTEBOARD_MODULE_CLIENT, "tagValue = %{public}s,", tagValue);
875             std::string tagValueStr = tagValue;
876             obj->value_->SetTag(tagValueStr);
877         }
878         if (propertyName == "additions") {
879             AAFwk::WantParams additions;
880             bool ret = OHOS::AppExecFwk::UnwrapWantParams(env, propertyNameValueNapi, additions);
881             PASTEBOARD_HILOGI(PASTEBOARD_MODULE_CLIENT, "additions ret = %{public}d,", ret);
882             obj->value_->SetAdditions(additions);
883         }
884     }
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_HILOGI(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 > 0, JSErrorCode::INVALID_PARAMETERS, "Parameter error. Wrong number of arguments.")
933         || !CheckExpression(env, IsProperty(env, argv[0]), JSErrorCode::INVALID_PARAMETERS,
934             "Parameter error. The type of property must be PasteDataProperty.")) {
935         return nullptr;
936     }
937 
938     PasteDataNapi *obj = nullptr;
939     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
940     if ((status != napi_ok) || (obj == nullptr)) {
941         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "napi_unwrap failed");
942         return nullptr;
943     }
944     SetProperty(env, argv[0], obj);
945     return nullptr;
946 }
947 
PasteDataInit(napi_env env,napi_value exports)948 napi_value PasteDataNapi::PasteDataInit(napi_env env, napi_value exports)
949 {
950     napi_status status = napi_ok;
951     napi_property_descriptor descriptors[] = {
952         DECLARE_NAPI_FUNCTION("addHtmlRecord", AddHtmlRecord),
953         DECLARE_NAPI_FUNCTION("addWantRecord", AddWantRecord),
954         DECLARE_NAPI_FUNCTION("addRecord", AddRecord),
955         DECLARE_NAPI_FUNCTION("addTextRecord", AddTextRecord),
956         DECLARE_NAPI_FUNCTION("addUriRecord", AddUriRecord),
957         DECLARE_NAPI_FUNCTION("addPixelMapRecord", AddPixelMapRecord),
958         DECLARE_NAPI_FUNCTION("getMimeTypes", GetMimeTypes),
959         DECLARE_NAPI_FUNCTION("getPrimaryHtml", GetPrimaryHtml),
960         DECLARE_NAPI_FUNCTION("getPrimaryWant", GetPrimaryWant),
961         DECLARE_NAPI_FUNCTION("getPrimaryMimeType", GetPrimaryMimeType),
962         DECLARE_NAPI_FUNCTION("getPrimaryText", GetPrimaryText),
963         DECLARE_NAPI_FUNCTION("getPrimaryUri", GetPrimaryUri),
964         DECLARE_NAPI_FUNCTION("getPrimaryPixelMap", GetPrimaryPixelMap),
965         DECLARE_NAPI_FUNCTION("getProperty", GetProperty),
966         DECLARE_NAPI_FUNCTION("getRecordAt", GetRecordAt),
967         DECLARE_NAPI_FUNCTION("getRecord", GetRecord),
968         DECLARE_NAPI_FUNCTION("getRecordCount", GetRecordCount),
969         DECLARE_NAPI_FUNCTION("getTag", GetTag),
970         DECLARE_NAPI_FUNCTION("hasMimeType", HasMimeType),
971         DECLARE_NAPI_FUNCTION("hasType", HasType),
972         DECLARE_NAPI_FUNCTION("removeRecordAt", RemoveRecordAt),
973         DECLARE_NAPI_FUNCTION("removeRecord", RemoveRecord),
974         DECLARE_NAPI_FUNCTION("replaceRecordAt", ReplaceRecordAt),
975         DECLARE_NAPI_FUNCTION("replaceRecord", ReplaceRecord),
976         DECLARE_NAPI_FUNCTION("setProperty", SetProperty)
977     };
978 
979     napi_value constructor;
980     napi_define_class(env, "PasteData", NAPI_AUTO_LENGTH, New, nullptr,
981         sizeof(descriptors) / sizeof(napi_property_descriptor), descriptors, &constructor);
982     if (status != napi_ok) {
983         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Failed to define class at Init");
984         return nullptr;
985     }
986 
987     status = napi_create_reference(env, constructor, 1, &g_pasteData);
988     if (status != napi_ok) {
989         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "PasteDataNapi Init create reference failed");
990         return nullptr;
991     }
992     napi_set_named_property(env, exports, "PasteData", constructor);
993     return exports;
994 }
995 
Destructor(napi_env env,void * nativeObject,void * finalize_hint)996 void PasteDataNapi::Destructor(napi_env env, void *nativeObject, void *finalize_hint)
997 {
998     PasteDataNapi *obj = static_cast<PasteDataNapi *>(nativeObject);
999     delete obj;
1000 }
1001 
New(napi_env env,napi_callback_info info)1002 napi_value PasteDataNapi::New(napi_env env, napi_callback_info info)
1003 {
1004     size_t argc = ARGC_TYPE_SET1;
1005     napi_value argv[1] = {0};
1006     napi_value thisVar = nullptr;
1007     napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
1008 
1009     // get native object
1010     PasteDataNapi *obj = new PasteDataNapi();
1011     obj->env_ = env;
1012     NAPI_CALL(env, napi_wrap(env, thisVar, obj, PasteDataNapi::Destructor,
1013         nullptr, // finalize_hint
1014         &obj->wrapper_));
1015     return thisVar;
1016 }
1017 
NewInstance(napi_env env,napi_value & instance)1018 napi_status PasteDataNapi::NewInstance(napi_env env, napi_value &instance)
1019 {
1020     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "enter");
1021     napi_status status;
1022     napi_value constructor;
1023     status = napi_get_reference_value(env, g_pasteData, &constructor);
1024     if (status != napi_ok) {
1025         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "get reference failed");
1026         return status;
1027     }
1028 
1029     status = napi_new_instance(env, constructor, 0, nullptr, &instance);
1030     if (status != napi_ok) {
1031         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "new instance failed");
1032         return status;
1033     }
1034     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "new instance ok");
1035     return napi_ok;
1036 }
1037 
IsPasteData(napi_env env,napi_value in)1038 bool PasteDataNapi::IsPasteData(napi_env env, napi_value in)
1039 {
1040     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "enter");
1041     napi_valuetype type = napi_undefined;
1042     NAPI_CALL_BASE(env, napi_typeof(env, in, &type), false);
1043     if (type != napi_object) {
1044         return false;
1045     }
1046     napi_value constructor;
1047     bool isPasteData = false;
1048     NAPI_CALL_BASE(env, napi_get_reference_value(env, g_pasteData, &constructor), false);
1049     NAPI_CALL_BASE(env, napi_instanceof(env, in, constructor, &isPasteData), false);
1050     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "isPasteData is [%{public}d]", isPasteData);
1051     return isPasteData;
1052 }
1053 } // namespace MiscServicesNapi
1054 } // namespace OHOS
1055