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